Სარჩევი:

ხმის ლოკალიზების მანეკენის თავი Kinect– ით: 9 ნაბიჯი (სურათებით)
ხმის ლოკალიზების მანეკენის თავი Kinect– ით: 9 ნაბიჯი (სურათებით)

ვიდეო: ხმის ლოკალიზების მანეკენის თავი Kinect– ით: 9 ნაბიჯი (სურათებით)

ვიდეო: ხმის ლოკალიზების მანეკენის თავი Kinect– ით: 9 ნაბიჯი (სურათებით)
ვიდეო: საგანგებო სიტუაციების სამსახური ხაშურში ტყის ხანძრის დრონით გადაღებულ კადრებს ავრცელებს 2024, ივლისი
Anonim
ხმის ლოკალიზების მანეკენის თავი Kinect– ით
ხმის ლოკალიზების მანეკენის თავი Kinect– ით

გაიცანით მარგარეტი, მძღოლის დაღლილობის მონიტორინგის სისტემის ტესტირება. მან ცოტა ხნის წინ გადადგა თავისი მოვალეობებიდან და იპოვა გზა ჩვენს ოფისში და მას შემდეგ მიიქცია იმ ადამიანების ყურადღება, რომლებიც თვლიან, რომ ის "შემზარავია". სამართლიანობის ინტერესებიდან გამომდინარე, მე მას მივეცი შესაძლებლობა შეექმნა ბრალმდებლები პირისპირ; იმის ნაცვლად, რომ ერთი შეხედვით მოგყვეს მისი სულელი მზერით, ახლა ის რეალურად ასე იქცევა. სისტემა იყენებს Microsoft Kinect– ის მიკროფონის მასივსა და სერვოს, რათა მიჰყვეს მას იმ ადამიანების მიმართულებით, რომლებიც მის მახლობლად საუბრობენ.

ნაბიჯი 1: თეორია

თეორია
თეორია

კუთხის გამოთვლა

როდესაც რაღაცას გვესმის, თუ ეს ხმაური პირდაპირ ჩვენს თვალწინ არ არის, ის ერთ ყურამდე მიდის მეორეზე ადრე. ჩვენი ტვინი აღიქვამს ჩამოსვლის დაგვიანებას და გარდაქმნის მას ზოგად მიმართულებაზე, საიდანაც ხმაური მოდის, რაც საშუალებას გვაძლევს ვიპოვოთ წყარო. ჩვენ შეგვიძლია მივაღწიოთ ზუსტად იმავე ლოკალიზაციას წყვილი მიკროფონების გამოყენებით. განვიხილოთ ნაჩვენები დიაგრამა, რომელიც შეიცავს მიკროფონის წყვილს და ხმის წყაროს. თუ ჩვენ ვუყურებთ ზემოდან ქვემოდან, ხმის ტალღები წრიულია, მაგრამ თუ მანძილი წყაროსთან შედარებით დიდია მიკროფონებს შორის მანძილთან შედარებით, მაშინ ჩვენი სენსორების თვალსაზრისით ტალღა დაახლოებით ბრტყელია. ეს ცნობილია როგორც შორეული სფეროს ვარაუდი და ამარტივებს ჩვენი პრობლემის გეომეტრიას.

ასე რომ დავუშვათ ტალღის ფრონტი სწორი ხაზია. თუ ხმა მოდის მარჯვნიდან, ის მოხვდება მიკროფონ #2 დროს t2 და მიკროფონ #1 დროს t1. მიკროფონის #2 და მიკროფონის #1 დარტყმას შორის გავლილი მანძილი არის დროის განსხვავება ხმის სიჩქარეზე გამრავლებული ხმის v s- ზე:

d = v s *(t1-t2) = vs *Δt

ჩვენ შეგვიძლია ეს მანძილი მივაკავშიროთ მიკროფონის წყვილს შორის d 12 და წყვილიდან კუთხე θ წყვილის ხმის წყაროსთან მიმართებით:

cos (θ) = d /d 12 = vs*Δt /d12

რადგან ჩვენ გვაქვს მხოლოდ ორი მიკროფონი, გაურკვევლობა იქნება ჩვენს გაანგარიშებაში იმის შესახებ, არის თუ არა ხმის წყარო წინ ან უკან. ამ სისტემაში ჩვენ ვივარაუდებთ, რომ ხმის წყარო წყვილის წინ არის და დავაჭერთ კუთხეს 0 გრადუსს შორის (მთლიანად წყვილის მარჯვნივ) 180 გრადუსამდე (სრულად მარცხნივ).

დაბოლოს, ჩვენ შეგვიძლია გადავწყვიტოთ თეტა ინვერსიული კოსინუსის აღებით:

θ = acos (vs*Δt/d12), 0 <= θ <= π

კუთხე ცოტა უფრო ბუნებრივი რომ იყოს, ჩვენ შეგვიძლია გამოვაკლოთ 90 გრადუსი თეტადან, ისე რომ 0 გრადუსი პირდაპირ წყვილის წინ იყოს და +/- 90 გრადუსი სრული მარცხნივ ან სრული მარჯვნივ. ეს გარდაქმნის ჩვენს გამოთქმას ინვერსიული კოსინუსიდან შებრუნებულ სინუსზე.

  • cos (θ-π/2) = ცოდვა (θ) = d/d12 = vs*Δt/d12
  • θ = ასინი (vs*Δt/d12), -π/2 <= θ <= π/2

დაგვიანების პოვნა

როგორც ხედავთ ზემოთ განტოლებიდან, ჩვენ მხოლოდ კუთხის გადასაწყვეტად გვჭირდება ხმის ტალღის დაგვიანება მიკროფონზე ერთი მიკროფონთან შედარებით, მეორე მიკროფონთან შედარებით; ხმის სიჩქარე და მანძილი მიკროფონებს შორის არის ფიქსირებული და ცნობილი. ამის მისაღწევად, ჩვენ ჯერ ვამოწმებთ აუდიო სიგნალებს სიხშირის fs– ით, ვაკეთებთ მათ ანალოგურ ციფრულზე და ვინახავთ მონაცემებს შემდგომი გამოყენებისთვის. ჩვენ ვატარებთ ნიმუშს გარკვეული პერიოდის განმავლობაში, რომელიც ცნობილია როგორც შერჩევის ფანჯარა, რომელსაც აქვს საკმაოდ დიდი ხანგრძლივობა ჩვენი ხმის ტალღის გამორჩეული თვისებების დასაფიქსირებლად. მაგალითად, ჩვენი ფანჯარა შეიძლება იყოს ბოლო ნახევარი წამის აუდიო მონაცემები.

ფანჯრის აუდიო სიგნალების მიღების შემდეგ, ჩვენ ვპოულობთ ამ ორს შორის დაგვიანებას მათი ჯვარედინი კორელაციის გამოთვლით. ჯვარედინი კორელაციის გამოსათვლელად, ჩვენ ვიღებთ ფანჯარას მიღებულ სიგნალს ერთი მიკროფონიდან და ვზიარებთ მეორე სიგნალს დროის ღერძის გასწვრივ პირველიდან უკნიდან პირველამდე წინ. ჩვენი სლაიდის გასწვრივ თითოეულ საფეხურზე ჩვენ ვამრავლებთ ფიქსირებული სიგნალის თითოეულ პუნქტს მისი მოცურების სიგნალის შესაბამის პუნქტზე, შემდეგ ვაჯამებთ ყველა შედეგს, რომ გამოვთვალოთ ჩვენი კორელაციის კოეფიციენტი ამ საფეხურზე. ჩვენი სლაიდის დასრულების შემდეგ, ნაბიჯი, რომელსაც აქვს უმაღლესი კორელაციის კოეფიციენტი, შეესაბამება იმ წერტილს, სადაც ორი სიგნალი ყველაზე მსგავსია და რომელ საფეხურზე ვდგავართ, გვეუბნება რამდენი ნიმუში n სიგნალი ორი გადატანილია სიგნალიდან 1. თუ n არის უარყოფითი, მაშინ სიგნალი ორი ჩამორჩება სიგნალს ერთს, თუ ის დადებითია მაშინ სიგნალი ორი წინ არის, ხოლო თუ ის ნულია მაშინ ორი უკვე გასწორებულია. ჩვენ ვაქცევთ ამ ნიმუშის ოფსეტს დროის დაგვიანებით ჩვენი შერჩევის სიხშირის გამოყენებით Δt = n/fs მიმართებით, ამგვარად:

θ = ასინი (vs*n/(d12*fs)), -π/2 <= θ <= π/2

ნაბიჯი 2: კომპონენტები

ნაწილები

  • Microsoft Kinect for Xbox 360, მოდელი 1414 ან 1473. Kinect– ს აქვს ოთხი მიკროფონი, რომლებიც განლაგებულია ხაზოვან მასივში, რომელსაც ჩვენ გამოვიყენებთ.
  • ადაპტერი Kinect– ის საკუთრივ კონექტორის USB + AC ენერგიაზე გადასაყვანად, როგორც ეს.
  • Raspberry Pi 2 ან 3 გაშვებული Raspbian Stretch. თავდაპირველად ვცდილობდი გამომეყენებინა Pi 1 მოდელი B+, მაგრამ ის არ იყო საკმარისად ძლიერი. მე კვლავ მქონდა პრობლემები Kinect– თან გათიშვისთანავე.
  • ყველაზე საშინელი მანეკენის თავი შეგიძლიათ იპოვოთ
  • ანალოგური სერვო საკმარისად ძლიერი, რომ გადააქციოს თქვენი მანეკენის თავი
  • 5V USB კედლის დამტენი საკმარისი ამპერატივით, რათა უზრუნველყოს Pi და servo და სულ მცირე ორი პორტი. (მე გამოვიყენე ამის მსგავსი 5A 3-პორტიანი დანამატი
  • გაფართოების კაბელი ორი გასასვლელით (ერთი USB კედლის დამტენისთვის და მეორე Kinect AC ადაპტერისთვის.
  • ორი USB კაბელი: ტიპი A მიკრო USB კაბელი Pi- ს გასაძლიერებლად და მეორე სერვერის გასაძლიერებლად, რომლის გაწყვეტაც არ გაწუხებთ
  • პლატფორმა ყველაფრის დასაჯდომად და კიდევ ერთი პატარა პლატფორმა მანეკენის თავისთვის. მე გამოვიყენე პლასტიკური უჯრა, როგორც საფუძველი და პლასტიკური ფირფიტა, როგორც თავების პლატფორმა. ორივე Walmart– დან იყო და მხოლოდ რამდენიმე დოლარი ღირდა
  • 4x #8-32 1/2 "ჭანჭიკები და კაკლები თქვენი სერვო უფრო დიდ პლატფორმაზე მიმაგრებისთვის
  • 2x M3 8 მმ ჭანჭიკი საყელურებით (ან რა ზომისაც გჭირდებათ თქვენი სერვო რქა უფრო პატარა პლატფორმაზე მიამაგრეთ)
  • ორი მამაკაცი-მამაკაცი მხტუნავი მავთული, ერთი წითელი და ერთი შავი და ერთი ქალი-მამაკაცი მხტუნავი მავთული
  • წებოვანი საყრდენი Velcro ზოლები
  • ელექტრო ფირზე
  • ფირის კაბელი საკაბელო მართვისთვის

ინსტრუმენტები

  • დრემელი საჭრელი ბორბლით
  • საბურღი
  • 7/64 ", 11/16" და 5/16 "საბურღი ბიტი
  • M3 ჩამოსასხმელი (სურვილისამებრ, თქვენი სერვო რქის მიხედვით)
  • Screwdriver
  • Soldering რკინის ერთად solder
  • დამხმარე ხელები (სურვილისამებრ)
  • მარკერი
  • Კომპასი
  • მავთულის სტრიპტიზატორები
  • მულტიმეტრი (სურვილისამებრ)

PPE

  • Დამცავი სათვალეები

  • სახის ნიღაბი (dremmel-ed პლასტიკური ნაჭრებისთვის).

ნაბიჯი 3: ქვედა პლატფორმის შეკრება

ქვედა პლატფორმის ასამბლეა
ქვედა პლატფორმის ასამბლეა
ქვედა პლატფორმის ასამბლეა
ქვედა პლატფორმის ასამბლეა
ქვედა პლატფორმის ასამბლეა
ქვედა პლატფორმის ასამბლეა

პირველი ნაწილი, რომელსაც ჩვენ გავაკეთებთ არის ქვედა პლატფორმა, რომელიც დაიტევს ჩვენს Kinect- ს, სერვოსა და მთელ ჩვენს ელექტრონიკას. პლატფორმის შესაქმნელად დაგჭირდებათ:

  • პლასტიკური მომსახურე უჯრა
  • სერვო
  • 4x #8-32 1/2 "ჭანჭიკები თხილით
  • დრემელი საჭე ბორბლით
  • Screwdriver
  • საბურღი
  • საბურღი 11/16"
  • მარკერი

Როგორ გააკეთო

  1. გადააბრუნეთ უჯრა თავდაყირა.
  2. მოათავსეთ თქვენი სერვო გვერდით უჯრის უკანა ნაწილთან, დარწმუნდით, რომ სერვოს გამომავალი გადაცემათა კოლოფი მდებარეობს უჯრის ცენტრალური ხაზის გასწვრივ, შემდეგ მონიშნეთ სერვოს ძირის გარშემო.
  3. თქვენი დრემელისა და საჭე ბორბლის გამოყენებით, ამოჭერით მონიშნული ადგილი და შემდეგ გადაიტანეთ თქვენი სერვო მის სლოტში.
  4. მონიშნეთ სერვო საცხოვრებლის ცენტრები უჯრაზე, შემდეგ ამოიღეთ სერვო და გააღეთ ეს ხვრელები თქვენი 11/16 "ბურღვით. ძალიან ადვილია თხელი პლასტმასის გატეხვა ასე, ხვრელების ბურღვისას, ამიტომ მე მას ბევრად უფრო უსაფრთხოდ ვთვლი. გაატარეთ საბურღი საპირისპიროდ და ნელ -ნელა ამოიღეთ მასალა. ეს გაცილებით ნელია ვიდრე ხვრელების სწორად გაბურღვა, მაგრამ ეს უზრუნველყოფს ბზარების არარსებობას.
  5. განათავსეთ თქვენი სერვო ისევ სლოტში, შემდეგ დააინსტალირეთ უჯრაზე #8-32 ჭანჭიკითა და თხილით.

ნაბიჯი 4: ხელმძღვანელი პლატფორმის შეკრება

უფროსი პლატფორმის ასამბლეა
უფროსი პლატფორმის ასამბლეა
უფროსი პლატფორმის ასამბლეა
უფროსი პლატფორმის ასამბლეა
უფროსი პლატფორმის ასამბლეა
უფროსი პლატფორმის ასამბლეა
უფროსი პლატფორმის ასამბლეა
უფროსი პლატფორმის ასამბლეა

მომდევნო ნაწილი, რომელსაც ჩვენ გავაკეთებთ, იქნება პლატფორმა, რომლითაც მანეკენის თავი უნდა დავუკავშიროთ სერვოს. სათავე პლატფორმის შესაქმნელად დაგჭირდებათ:

  • პლასტიკური ფირფიტა
  • სერვო რქა
  • 2x M3 8 მმ ჭანჭიკი საყელურებით
  • Screwdriver
  • საბურღი
  • საბურღი 7/64 "და 5/16"
  • Კომპასი
  • დრემელი საჭე ბორბლით

Როგორ გააკეთო

  1. დააყენეთ თქვენი კომპასი თქვენი მანეკენის თავის ფუძის რადიუსზე.
  2. გამოიყენეთ თქვენი კომპასი, რომ მონიშნოთ წრე, რომელიც ორიენტირებულია ფირფიტის ცენტრში. ეს იქნება ჩვენი თავის პლატფორმის რეალური ზომა.
  3. გამოიყენეთ თქვენი დრემელი და საჭე საჭე, რომ მოაჭრათ პატარა პლატფორმა ფირფიტიდან.
  4. გაბურღეთ თქვენი ახალი პლატფორმის ცენტრი 5/16 "ბურღვით. ეს მოგვცემს წვდომას იმ ხრახნზე, რომელიც ამყარებს ჩვენს სერვო რქას ჩვენს სერვოზე. იმისათვის, რომ პლატფორმის სტაბილურობა მივაღწიოთ ხვრელს, მე დავდე კოჭა მავთული მის ქვეშ და გაბურღულია კოჭის ცენტრში.
  5. გააფორმეთ თქვენი სერვო რქა პლატფორმის ცენტრით და მონიშნეთ ორი ხვრელი, რომ რქა მიამაგროთ პლატფორმაზე. დარწმუნდით, რომ ეს სამონტაჟო ხვრელები ერთმანეთისგან საკმაოდ შორს არის, ასე რომ ადგილი გაქვთ თქვენი M3 ჭანჭიკის თავებისთვის და საყელურებისთვის.
  6. გააღეთ ეს მონიშნული ხვრელები 7/64 დიუმიანი საბურღით.
  7. ჩემი სერვო რქის ქვედა ხვრელი იყო გლუვი, ანუ მას არ ჰქონდა ძაფები M3 ჭანჭიკისთვის. ამრიგად, მე გამოვიყენე ჩემი საბურღი და M3 ონკანი ძაფების გასაკეთებლად.
  8. გამოიყენეთ ჭანჭიკები და საყელურები, რომ მიამაგროთ სერვო რქა სათავე პლატფორმაზე.

ნაბიჯი 5: სერვო დენის კაბელი

სერვო დენის კაბელი
სერვო დენის კაბელი
სერვო დენის კაბელი
სერვო დენის კაბელი
სერვო დენის კაბელი
სერვო დენის კაბელი
სერვო დენის კაბელი
სერვო დენის კაბელი

ანალოგური სერვისები, როგორც წესი, იკვებება 4.8-6 ვ. მას შემდეგ, რაც Raspberry Pi უკვე იკვებება USB– დან 5V– ით, ჩვენ გავამარტივებთ ჩვენს სისტემას ასევე USB– დან სერვოს ჩართვით. ამისათვის ჩვენ გვჭირდება USB კაბელის შეცვლა. სერვო დენის კაბელის დასამზადებლად დაგჭირდებათ:

  • სათადარიგო USB კაბელი ტიპის A ბოლოთი (ისეთი, რომელიც თქვენს კომპიუტერს უერთდება)
  • ერთი წითელი და ერთი შავი ჯუმბერის მავთული
  • გასაყიდი რკინა
  • Solder
  • მავთულის სტრიპტიზატორები
  • ელექტრო ფირზე
  • დამხმარე ხელები (სურვილისამებრ)
  • მულტიმეტრი (სურვილისამებრ)

Როგორ გააკეთო

  1. გათიშეთ თქვენი კაბელიდან არა USB ტიპის A კონექტორი, შემდეგ ამოიღეთ იზოლაცია, რომ გამოავლინოთ ოთხი შიდა მავთული. გათიშეთ დამცავი მავთულის მიმდებარე საფარი.
  2. როგორც წესი, USB კაბელს ექნება ოთხი მავთული: ორი მონაცემთა გადაცემისა და მიღებისათვის და ორი დენისა და დასაკავშირებლად. ჩვენ დაინტერესებულნი ვართ სიმძლავრით და მიწით, რომლებიც ჩვეულებრივ წითელი და შავია. ამოიღეთ იზოლაციის ნაწილი წითელი და შავი მავთულიდან და შეწყვიტეთ მწვანე და თეთრი მავთულები. თუ გაწუხებთ, რომ თქვენ არ გაქვთ სწორი დენის და დასაკავშირებელი მავთულები, შეგიძლიათ შეაერთოთ თქვენი კაბელი USB დენის ადაპტერში და შეამოწმოთ გამომავალი ძაბვა მულტიმეტრით.
  3. შემდეგი, გათიშეთ წითელი და შავი ჯუმბერის კაბელების ერთი ბოლო და ამოიღეთ იზოლაციის ნაწილი.
  4. ახლა გადააბრუნეთ თქვენი ჯუმპერის შავი USB მავთულები და USB კაბელები. გადაკვეთეთ დაუცველი მავთულის ცენტრები და გადააბრუნეთ ისინი ერთმანეთის გარშემო. შემდეგ, შედუღების მავთულხლართებს მიამაგრეთ ისინი ერთმანეთთან დასაკავშირებლად. დამხმარე ხელები ამას გაადვილებს თქვენი კაბელების ადგილზე დაჭერით.
  5. გაიმეორეთ ნაბიჯი 4 წითელი ხაზებისთვის.
  6. დაფარეთ ელექტრული გაყვანილობა ელექტრული ლენტით, ან გაათბეთ მილები, თუ თქვენ თავს ფანტასტიურად გრძნობთ. ეს სახსრები მყიფე იქნება, ვინაიდან მავთულები ძალიან მცირეა, ასე რომ დაამატეთ მეორე ფენა ფირზე, რომელიც იკავებს ჯუმბერის კაბელებს USB კაბელის გარე იზოლაციას. ეს გახდის შეკრებას უფრო ხისტი და ამით ნაკლებად სავარაუდოა, რომ დაარღვიოს მოხრა.

ნაბიჯი 6: ელექტრონიკის დამონტაჟება

ელექტრონიკის მონტაჟი
ელექტრონიკის მონტაჟი
ელექტრონიკის სამონტაჟო
ელექტრონიკის სამონტაჟო
ელექტრონიკის სამონტაჟო
ელექტრონიკის სამონტაჟო

დაბოლოს, ჩვენ ყველაფერს გავაერთიანებთ, დავამონტაჟებთ ჩვენს ელექტრონიკას და ყველაფერს დანარჩენს ქვედა პლატფორმაზე. თქვენ დაგჭირდებათ:

  • ქვედა პლატფორმა
  • სათავე პლატფორმა
  • მანეკენის თავი
  • Kinect USB+AC ადაპტერით
  • USB დენის ადაპტერი
  • გაფართოების კაბელი
  • მიკრო USB კაბელი
  • სერვო დენის კაბელი
  • ჟოლო პი
  • მამაკაცი ქალი მდედრის ჯუმბერის კაბელი
  • წებოვანი Velcro
  • Მაკრატელი

Როგორ გააკეთო

  1. დააინსტალირეთ Pi უჯრის ბოლოში Velcro– ით.
  2. მიამაგრეთ USB დენის ადაპტერი Velcro– ით.
  3. ჩართეთ servo და Pi USB დენის ადაპტერში.
  4. შეაერთეთ Pi- ს პინი 12 (GPIO18) სერვოს სიგნალის კაბელთან. ეს არის მეექვსე პინი ქვემოთ მარჯვნივ.
  5. ამოიღეთ გაფართოების კაბელი უჯრის უკანა სახელურზე და შეაერთეთ USB დენის ადაპტერი ერთ მხარეს.
  6. აიღეთ Kinect USB+AC ადაპტერი და შეაერთეთ დენის ადაპტერი გაფართოების კაბელის მეორე მხარეს და USB Pi- ში.
  7. დაახურეთ კინექტის ტვინი უჯრის წინა სახელურიდან და შეაერთეთ Kinect ადაპტერში.
  8. მე გამოვიყენე წებოვანი ლენტი, რომ კაბელები მეჭირა პლატფორმის ქვედა მხარეს. ეს არ გამოიყურება ყველაზე ელეგანტური, მაგრამ საბედნიეროდ ეს ყველაფერი იმალება.
  9. გადაატრიალეთ პლატფორმა მარჯვნივ და გამოიყენეთ Velcro, რომ დააინსტალიროთ Kinect პლატფორმის წინა მხარეს.
  10. გამოიყენეთ Velcro, რომ დაამონტაჟოთ მანეკენის თავი სათავე პლატფორმაზე. მას შემდეგ რაც ყველაფერი გაფორმდება, გამოყავით ეს ორი ნაჭერი, რათა ჩვენ შევძლოთ წვდომა სერვო რქის სამონტაჟო ხრახნზე. ჯერ არ მიაქციოთ რქა სერვოზე, თუმცა ჩვენ უნდა დავრწმუნდეთ, რომ სერვო ჯერ ცენტრალურ პოზიციაშია, ასე რომ ჩვენ შეგვიძლია ყველაფერი დავალაგოთ. ჩვენ ამას გავაკეთებთ შემდეგ ეტაპზე.

ნაბიჯი 7: პროგრამული უზრუნველყოფა და ალგორითმი

პროგრამული უზრუნველყოფა და ალგორითმი
პროგრამული უზრუნველყოფა და ალგორითმი

მიმოხილვა

ამ პროექტის პროგრამული უზრუნველყოფა დაწერილია C ++ - ით და ინტეგრირებულია Robot Operating System (ROS) - თან, რობოტული პროგრამული უზრუნველყოფის წერის ჩარჩო. ROS– ში სისტემის პროგრამული უზრუნველყოფა დაყოფილია პროგრამების ერთობლიობაში, რომელსაც ეწოდება კვანძები, სადაც თითოეული კვანძი ახორციელებს სისტემის ფუნქციონირების კონკრეტულ ქვეგანყოფილებას. მონაცემები გადადის კვანძებს შორის გამოქვეყნების/გამოწერის მეთოდის გამოყენებით, სადაც კვანძები, რომლებიც აწარმოებენ მონაცემებს, აქვეყნებენ მას და კვანძები, რომლებიც მოიხმარენ მონაცემებს, იწერენ მას. კოდის გათიშვა ამ გზით საშუალებას იძლევა სისტემის ფუნქციონირება ადვილად გაფართოვდეს და კვანძების გაზიარება სისტემებს შორის უფრო სწრაფი განვითარებისათვის.

ამ სისტემაში ROS პირველ რიგში გამოიყენება კოდის გამოსათვლელად, რომელიც ითვლის ხმის ჩამოსვლის მიმართულებას (DOA) სერვოის მაკონტროლებელი კოდისგან, რაც საშუალებას აძლევს სხვა პროექტებს შეიცავდეს Kinect DOA შეფასებას სერვო კოდის ჩათვლით, რომელიც მათ არ სჭირდებათ ან სურთ რა თუ გსურთ გადახედოთ კოდს, ის შეგიძლიათ ნახოთ GitHub– ზე:

github.com/raikaDial/kinect_doa

Kinect DOA კვანძი

Kinect_doa კვანძი არის ამ სისტემის ხორცი და ძვლები, აკეთებს ძირითადად ყველაფერს საინტერესოს. გაშვებისთანავე ის იწყებს ROS კვანძს, რაც შესაძლებელს ხდის ყველა ROS მაგიას, შემდეგ ატვირთავს firmware Kinect– ში ისე, რომ აუდიო ნაკადები ხელმისაწვდომი გახდეს. შემდეგ ის ქმნის ახალ ძაფს, რომელიც ხსნის აუდიო ნაკადებს და იწყებს კითხვას მიკროფონის მონაცემებში. Kinect აიღებს თავის ოთხ მიკროფონს თითოეული 16 kHz სიხშირით, ამიტომ კარგია ჯვარედინი კორელაცია და მონაცემების შეგროვება ცალკეულ ძაფებში, რათა გამოტოვებული მონაცემების გამოტოვება თავიდან ავიცილოთ. Kinect– თან დაკავშირება ხდება libfreenect– ის, პოპულარული ღია კოდის დრაივერის გამოყენებით.

შეგროვების თემა ასრულებს გამოძახების ფუნქციას, როდესაც ახალი მონაცემები მიიღება და ორივე ინახავს მონაცემებს და განსაზღვრავს როდის უნდა შეაფასოს DOA. თითოეული მიკროფონის მონაცემები ინახება მოძრავი ბუფერებში, სიგრძის ტოლი ჩვენი შერჩევის ფანჯრის, რომელიც აქ არის 8192 ნიმუში. ეს ითარგმნება როგორც ჯვარედინი კორელაცია დაახლოებით ნახევარი წამის მონაცემებთან, რაც მე ექსპერიმენტის შედეგად აღმოვაჩინე, რომ იყო კარგი ბალანსი შესრულებასა და გამოთვლილ დატვირთვას შორის. DOA- ს შეფასება ხდება ყოველ 4096 ნიმუშზე ძირითადი ძაფის სიგნალით, ისე რომ თანმიმდევრული კორელაციები გადაფარავს 50%-ით. განვიხილოთ შემთხვევა, როდესაც გადაფარვა არ ხდება და თქვენ აკეთებთ ძალიან სწრაფ ხმაურს, რომელიც შერჩევის ფანჯრიდან შუაზე იჭრება. თქვენი გამორჩეული ხმის დაწყებამდე და მის შემდეგ, სავარაუდოდ, იქნება თეთრი ხმაური, რომლის შეჯამება ძნელია ჯვარედინი კორელაციისთვის. გადაფარებული ფანჯრები გვაწვდის ხმის უფრო სრულ ნიმუშს, ზრდის ჩვენი ჯვარედინი კორელაციის საიმედოობას, რაც გვაძლევს უფრო მკაფიო მახასიათებლებს, რომ განვსაზღვროთ.

მთავარი ძაფი ელოდება სიგნალს კოლექციის ძაფიდან, შემდეგ ითვლის DOA შეფასებას. ჯერ ერთი, ის ამოწმებს არის თუ არა განსხვავებული ტალღის ფორმები მნიშვნელოვნად განსხვავებული თეთრი ხმაურისგან. ამ შემოწმების გარეშე, ჩვენ ვიანგარიშებდით ჩვენს შეფასებას წამში ოთხჯერ იმისდა მიუხედავად, იყო თუ არა საინტერესო ხმები, და ჩვენი მანეკენის თავი სპასტიური არეულობა იქნებოდა. ამ სისტემაში გამოყენებული თეთრი ხმაურის გამოვლენის ალგორითმი პირველია ჩამოთვლილი ორიდან. ჩვენ ვიანგარიშებთ ჩვენი ტალღის წარმოებულის აბსოლუტური ინტეგრალის თანაფარდობას მის აბსოლუტურ ინტეგრალთან; სიგნალებისთვის თეთრი ხმაურის მაღალი შემცველობით ეს თანაფარდობა უფრო მაღალია ვიდრე ნაკლებად ხმაურიანი სიგნალებისთვის. ამ თანაფარდობის ბარიერის დადგენით, რომელიც გამოყოფს ხმაურს უხმაუროდან, ჩვენ შეგვიძლია შევქმნათ კორელაცია მხოლოდ საჭიროების შემთხვევაში. რასაკვირველია, ეს თანაფარდობა არის ის, რაც ხელახლა უნდა იყოს მორგებული ყოველ ჯერზე, როდესაც სისტემა გადადის ახალ გარემოში.

მას შემდეგ რაც დადგინდება, რომ ტალღების ფორმები შეიცავს არა ხმაურის მნიშვნელოვან შემცველობას, პროგრამა აგრძელებს ჯვარედინი კორელაციებს. ამასთან, არსებობს სამი მნიშვნელოვანი ოპტიმიზაცია ამ გათვლებში:

  1. Kinect– ზე არის ოთხი მიკროფონი, რაც ნიშნავს რომ არის ექვსი წყვილი ტალღის ფორმა, რომელთა ერთმანეთთან დაკავშირება შეგვიძლია. თუმცა, თუ დააკვირდებით მიკროფონის მასივის სივრცით მოწყობას, ხედავთ, რომ მიკროფონები 2, 3 და 4 ძალიან ახლოს არიან ერთმანეთთან. სინამდვილეში, ისინი იმდენად ახლოსაა, რომ ხმის სიჩქარისა და შერჩევის სიხშირის გამო 2, 3 და 4 -ზე მიღებული ტალღების ფორმები გამოყოფილია მაქსიმუმ ერთი ნიმუშით წინ ან უკან, რაც ჩვენ შეგვიძლია გადამოწმდეს maxlag = Δd *fs/vs, სადაც Δd არის მიკროფონის წყვილის გამიჯვნა, fs არის შერჩევის სიხშირე და vs არის ბგერის სიჩქარე. ამრიგად, წყვილი ამ სამს შორის უსარგებლოა და ჩვენ გვჭირდება მხოლოდ მიკროფონის 1 ერთმანეთთან დაკავშირება 2, 3 და 4.
  2. ცნობილია, რომ აუდიო სიგნალების სტანდარტული ჯვარედინი კორელაცია ცუდად მუშაობს რევერბერაციების (ექოს) თანდასწრებით. ძლიერი ალტერნატივა ცნობილია როგორც ფაზის გარდაქმნასთან განზოგადებული კორელაცია (GCC-PHAT). ეს მეთოდი ემყარება შეწონილი ფუნქციის გამოყენებას, რომელიც აძლიერებს მწვერვალებს ჯვარედინი კორელაციისას, რაც გაადვილებს ორიგინალური სიგნალის ექოსგან გარჩევას. მე შევადარე GCC-PHAT- ის შესრულება რევერბერაციის კამერაში არსებულ უბრალო კორელაციასთან (წაიკითხეთ: ბეტონის აბაზანა გადაკეთებულია) და აღმოვაჩინე, რომ GCC-PHAT 7-ჯერ უფრო ეფექტურია სწორი კუთხის შესაფასებლად.
  3. ჯვარედინი კორელაციის შესრულებისას ჩვენ ვიღებთ ორ სიგნალს, ვცურავთ ერთი მეორეს გასწვრივ და თითოეულ საფეხურზე ვამრავლებთ ჩვენი ფიქსირებული სიგნალის თითოეულ წერტილს ჩვენი მოცურების სიგნალის თითოეულ წერტილზე. სიგრძის n ორი სიგნალისთვის, ეს იწვევს n^2 გამოთვლებს. ჩვენ შეგვიძლია გავაუმჯობესოთ ის სიხშირის დომენში ჯვარედინი კორელაციის განხორციელებით, რაც გულისხმობს სწრაფ ფორურით გარდაქმნას (nlogn გათვლები), თითოეული წერტილის გამრავლებას ერთ გარდაქმნილ სიგნალში მეორეში შესაბამისი წერტილით (n გათვლები), შემდეგ კი შებრუნებული შესრულებით ფურერის გარდაქმნა დროის დომენში დასაბრუნებლად (nlogn გამოთვლები), რის შედეგადაც n+2*nlogn გამოთვლები, n^2 -ზე ნაკლები. თუმცა, ეს არის გულუბრყვილო მიდგომა. ჩვენი მასივის მიკროფონები იმდენად ახლოსაა ერთმანეთთან და ხმის სიჩქარე იმდენად ნელია, რომ აუდიოტალღების ფორმები უკვე უმეტესწილად გასწორდება.ამრიგად, ჩვენ შეგვიძლია გამოვხატოთ ჩვენი ჯვარედინი კორელაცია, რათა განვიხილოთ მხოლოდ ოფსეტები, რომლებიც ოდნავ წინ ან უკან არიან. მიკროფონებისთვის 1 და 4, ჩამორჩენა უნდა იყოს +/- 12 ნიმუშს შორის, რაც ნიშნავს რომ თითოეული ჯვარედინი კორელაციისთვის ჩვენ გვჭირდება მხოლოდ 24*n გამოთვლების გაკეთება, რის შედეგადაც გამოითვლება დანაზოგი, როდესაც ჩვენი ტალღის ფორმა 2900-ზე მეტი ნიმუშისაა.

ეს სისტემა იყენებს მინიდისპ ბიბლიოთეკას, რომელიც ახორციელებს GCC-PHAT ალგორითმს ოპტიმიზაციით 3.

თითოეული მიკროფონის წყვილის სიგნალებში ჩამორჩენის შემდეგ, პროგრამა ირჩევს შუალედურ მნიშვნელობას ჩამორჩენისთვის, იყენებს მას სავარაუდო კუთხის გამოსათვლელად და აქვეყნებს შედეგს, რათა ის გამოიყენოს სერვოს გასაკონტროლებლად.

სერვო კონტროლის კვანძი

Kinect_doa კვანძთან შედარებით, სერვო კვანძი შედარებით მარტივია. მისი ამოცანაა მხოლოდ მიიღოს სავარაუდო DOA და სერვო გადაიტანოს ამ კუთხით. ის იყენებს wiringPi ბიბლიოთეკას Raspberry Pi- ს აპარატურული PWM მოდულის შესასვლელად, მისი გამოყენებით სერვო კუთხის დასაყენებლად. ანალოგური სერვისების უმეტესობა კონტროლდება PWM სიგნალით, რომლის პულსის სიგანეა 1000 μs– დან 2000 μs– მდე, რაც შეესაბამება 0 ° –დან 180 ° –მდე კუთხეს, მაგრამ მე გამოყენებული სერვერი კონტროლდება 500 μs– დან 2500 μs– მდე, რაც შეესაბამება კუთხეს 0 ° -დან 270 ° –მდე. ამრიგად, კვანძის კონფიგურაცია შესაძლებელია სხვადასხვა სერვო აპარატურისთვის, მინიმალური პულსის სიგანის, მაქსიმალური პულსის სიგანისა და მაქსიმალური და მინიმალური კუთხეების სხვაობის პარამეტრების დაყენებით. გარდა ამისა, სერვო არ გადადის დაუყოვნებლივ სამიზნე კუთხეზე, არამედ მოძრაობს კუთხისკენ კონფიგურირებადი სიჩქარით, რაც მარგარეტს აძლევს უფრო თანდათანობით, შემზარავ განწყობას (გარდა ამისა, სერვოს ხმა, რომელიც სწრაფად და წინ მოძრაობს, ძალიან სწრაფად მაღიზიანებს)).

ნაბიჯი 8: აშენება და ინსტალაცია

დააინსტალირეთ დამოკიდებულებები:

პირველი, დააინსტალირეთ libfreenect. ჩვენ უნდა ავაშენოთ ის წყაროდან, რადგან ვერსია, რომელიც შეგიძლიათ მიიღოთ პაკეტის მენეჯერთან, არ შეიცავს აუდიოს მხარდაჭერას. ეს იმიტომ ხდება, რომ ჩვენ უნდა ჩავტვირთოთ firmware Kinect– ში, რათა მოხდეს აუდიო და ამ firmware– ის გადანაწილება არ არის ლეგალური გარკვეულ იურისდიქციებში. გარდა ამისა, ჩვენ შეგვიძლია თავიდან ავიცილოთ ისეთი მაგალითების აგება, რომლებიც საჭიროებენ OpenGL- ს და ზედმეტს, რაც არასაჭიროა Raspbian– ის უთავო ინსტალაციებისთვის.

sudo apt-get დააინსტალირეთ git cmake build-essential libusb-1.0-0-dev

cd git clone https://github.com/OpenKinect/libfreenect cd libfreenect mkdir build cd build cmake.. -DCMAKE_BUILD_REDIST_PACKAGE = OFF -DCMAKE_BUILD_EXAMPLES = OFF make sudo make/su/c/c.rules /etc/udev/rules.d udevadm კონტროლი-გადატვირთვა-წესები && udevadm გამომწვევი

შემდეგი, ჩვენ უნდა დავაინსტალიროთ wiringPi პაკეტი, რომელიც საშუალებას გვაძლევს გავაკონტროლოთ Pi- ს GPIO ქინძისთავები:

cd

git კლონი git: //git.drogon.net/wiringPi cd ~/wiringPi./ build

მიამაგრეთ მანეკენის თავი:

დაინსტალირებული გაყვანილობით, ჩვენ შეგვიძლია სწრაფად გადავიდეთ ტექნიკურ მიწაზე, რათა მანეკენის თავი ქვედა პლატფორმაზე დავამატოთ. სერვოს ცენტრალიზაციისთვის ბრძანების ხაზის საშუალებით, შეიყვანეთ შემდეგი ბრძანებები:

gpio pwm-ms

gpio pwmc 192 gpio pwmr 2000 gpio -g pwm 18 150

თუ მოძრაობა არ არის, მაშინ თქვენი სერვო უკვე ცენტრშია. რა თქმა უნდა, დარწმუნებული უნდა იყოს, რომ თქვენ შეგიძლიათ დააყენოთ სერვო არა ცენტრის მნიშვნელობად, მაგ. gpio -g pwm 18 200, შემდეგ ისევ დააბრუნეთ 150 -ზე.

მას შემდეგ რაც დარწმუნდებით, რომ სერვო არის ორიენტირებული, მიამაგრეთ თავის პლატფორმის სერვო რქა სერვოზე ისე, რომ თქვენი მანეკენის თავი პირდაპირ წინ იყურებოდეს. შემდეგ, მიამაგრეთ რქა სერვოზე და მიამაგრეთ თქვენი თავი Velcro ბიტების საშუალებით.

დააინსტალირეთ ROS:

შემდეგი, დააინსტალირეთ ROS თქვენს Pi- ზე. შესანიშნავი ინსტალაციის სახელმძღვანელო შეგიძლიათ იხილოთ აქ; ჩვენი სისტემისთვის ჩვენ არ გვჭირდება OpenCV, ასე რომ თქვენ შეგიძლიათ გამოტოვოთ ნაბიჯი 3. ამ მშენებლობის დასრულებას რამდენიმე საათი დასჭირდება. როდესაც დაასრულებთ ინსტალაციის სახელმძღვანელოს, დაამატეთ ინსტალაციის წყარო თქვენს bashrc– ში, რათა ჩვენ გამოვიყენოთ ჩვენი ახლად დაინსტალირებული ROS პაკეტები:

ექო "წყარო /opt/ros/kinetic/setup.bash" >> ~/.bashrc

შექმენით Kinect DOA პაკეტი:

ყოველივე ამის შემდეგ, შექმენით სამუშაო ადგილი ჩვენი პროექტისთვის და შეიყვანეთ src დირექტორია:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

ამ პროექტის კოდი შეიცავს kinect_doa პაკეტს, ასე რომ კლონირება მოახდინეთ თქვენი ახალი სამუშაო სივრცის src დირექტორიაში:

git კლონი

Robot_upstart პაკეტი იძლევა ადვილად გამოსაყენებელ ინსტრუმენტს გაშვების ფაილების დაყენებისათვის, რათა გაშვებული იყოს გაშვებისას, ასევე კლონირება მოახდინეთ თქვენს სამუშაო სივრცეში:

git კლონი

ახლა ჩვენ შეგვიძლია ავაშენოთ პროექტის კოდი catkin_make– ით დარეკვით ჩვენი სამუშაო სივრცის ზედა დონის დირექტორიიდან, შემდეგ მოვახდინოთ წყარო ჩვენი მშენებლობისთვის, რათა ჩვენი პაკეტები ხელმისაწვდომი იყოს:

cd ~/kinect_doa_ws

catkin_make echo "source /home/pi/kinect_doa_ws/devel/setup.bash" >> ~/.bashrc

სირბილი და მორგება:

ვივარაუდოთ, რომ ყველაფერი არის ჩართული და ჩართული, თქვენ ახლა უნდა შეგეძლოთ სისტემის გაშვება და Kinect გქონდეთ თქვენი ხმა! თუმცა, თუ თქვენ გაქვთ Kinect 1473, ჯერ გახსენით ფაილი ~/kinect_doa_ws/src/kinect_doa/launcher/kinect_doa. გაუშვით ტექსტურ რედაქტორში და დააყენეთ პარამეტრი_inect_1473 ჭეშმარიტად. გარდა ამისა, თუ თქვენ იყენებთ სხვა სერვისს, ვიდრე მე, ეს არის სტანდარტული ანალოგური სერვო, ასე რომ გაშვების ფაილში შეცვალეთ პარამეტრი min_us 1000 -მდე, max_us 2000 -მდე და max_deg 180 -მდე.

roslaunch kinect_doa kinect_doa. გაშვება

ითამაშე ცოტა ხნით. თუ ფიქრობთ, რომ სისტემა ძალიან მგრძნობიარეა (ეძებთ შემთხვევით მიმართულებებს, რომლებიც არ შეესაბამება ხმებს ან გამორჩეულ ხმებს), სცადეთ შეცვალოთ white_noise_ratio პარამეტრი გაშვების ფაილში და ხელახლა გაუშვათ სისტემა, სანამ რეაგირება არ მოხდება თქვენთვის სასურველ დონეზე. რა თანაფარდობის ამაღლება სისტემას ნაკლებად რეაგირებას უკეთებს და პირიქით. თქვენ სავარაუდოდ მოგიწევთ ამ რეგულირების შესრულება, როდესაც სისტემა სხვა ადგილას გადაიტანთ, რომ მიიღოთ სასურველი შესრულება.

პროგრამის გასაშვებად Pi- ს ჩართვისას, ჩვენ ვიყენებთ robot_upstart პაკეტს, რომ დავაინსტალიროთ ჩვენი გაშვების ფაილი. თუ ROS ამჟამად არ მუშაობს, დაიწყეთ იგი ბრძანებით roscore. შემდეგ გახსენით ახალი ტერმინალი და დააინსტალირეთ გაშვება შემდეგით:

rosrun robot_upstart დააინსტალირეთ kinect_doa/start/kinect_doa. Launch -მომხმარებლის root --symlink

ჩვენ ვქმნით გაშვების ფაილს, მისი კოპირების ნაცვლად, რათა შევცვალოთ პარამეტრები ed/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch.

ნაბიჯი 9: დამალვა ოფისში

იმალება ოფისში
იმალება ოფისში

ახლა რაც შეეხება სახალისო ნაწილს. შეუდექი საქმეს საათების შემდეგ და დაიმალე შენი მანეკენი ფარულად. შემდეგ უბრალოდ დაჯექი და ნახე რამდენი ხანი სჭირდება შენს თანამშრომლებს, რომ დაიჭირონ! შენი ახალი ქმნილება გარანტირებულია გადააქციოს რამდენიმე თავი…

გირჩევთ: