Mündəricat:

Kinect ilə Səs Yerləşdirən Manken Başı: 9 Addım (Şəkillərlə)
Kinect ilə Səs Yerləşdirən Manken Başı: 9 Addım (Şəkillərlə)

Video: Kinect ilə Səs Yerləşdirən Manken Başı: 9 Addım (Şəkillərlə)

Video: Kinect ilə Səs Yerləşdirən Manken Başı: 9 Addım (Şəkillərlə)
Video: Записали ГОЛОСА ПРИЗРАКОВ † ночью НА КЛАДБИЩЕ † Охота на Призраков † ЭГФ Часть 2 2024, Iyul
Anonim
Kinect ilə Səs Yerləşdirən Manken Başı
Kinect ilə Səs Yerləşdirən Manken Başı

Sürücü yorğunluğunu izləmə sistemi üçün test kuklası Margaret ilə tanış olun. Bu yaxınlarda vəzifələrindən təqaüdə çıxdı və ofis sahəmizə yol tapdı və o vaxtdan "ürkütücü" olduğunu düşünənlərin diqqətini çəkdi. Ədalət naminə ona ittihamçıları ilə üz-üzə gəlmə qabiliyyəti verdim; ruhsuz baxışları ilə səni izləmək əvəzinə, indi əslində belə edir. Sistem, Microsoft Kinect -in mikrofon sistemindən və servodan istifadə edərək onu yaxınlıqdakı insanların danışdığı istiqamətə yönəldir.

Addım 1: nəzəriyyə

Nəzəriyyə
Nəzəriyyə

Bucağın hesablanması

Bir şey eşitdiyimiz zaman, bu səs birbaşa qarşımızda deyilsə, bir qulağımızdan digərinə çatır. Beynimiz bu gəlişi gecikdirir və bunu səs -küyün gəldiyi ümumi bir istiqamətə çevirərək mənbəyi tapmağa imkan verir. Bir cüt mikrofondan istifadə edərək eyni növ lokalizasiyaya nail ola bilərik. Mikrofon cütü və səs mənbəyi olan göstərilən diaqramı nəzərdən keçirin. Yuxarıdan aşağıya baxırıqsa, səs dalğaları dairəvi olur, amma mənbəyə olan məsafə mikrofonlar arasındakı məsafəyə nisbətən böyükdürsə, o zaman sensorlarımızın nöqteyi-nəzərindən dalğa təxminən düzdür. Bu, uzaq sahə fərziyyəsi olaraq bilinir və problemimizin həndəsəsini asanlaşdırır.

Beləliklə, dalğa cəbhəsinin düz bir xətt olduğunu düşünün. Səs sağdan gəlirsə, t2 vaxtında 2 nömrəli mikrofonu və t1 vaxtında 1 nömrəli mikrofonu vuracaq. 2 nömrəli mikrofonla 1 nömrəli mikrofon arasındakı səsin keçdiyi məsafə, səsin s s sürəti ilə vurulması zamanı fərqidir:

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

Bu məsafəni mikrofon cütü ilə 12 bucağı arasındakı səs mənbəyinə olan d 12 məsafə ilə əlaqələndirə bilərik:

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

Yalnız iki mikrofonumuz olduğuna görə, səs mənbəyinin önümüzdə və ya arxamızda olması ilə bağlı hesablamalarımızda qeyri -müəyyənlik olacaq. Bu sistemdə səs mənbəyinin cütlüyün önündə olduğunu qəbul edəcəyik və 0 dərəcə ilə (tam olaraq sağda) 180 dərəcə (tamamilə sola) olan bucağı sıxacaq.

Nəhayət, teta kosinüsünü alaraq həll edə bilərik:

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

Bucağı bir az daha təbii etmək üçün tetadan 90 dərəcə çıxara bilərik ki, 0 dərəcə birbaşa cütlüyün önündə olsun və +/- 90 dərəcə sola və ya tam sağa olsun. Bu, ifadəmizi tərs kosinusdan tərs sinüsə çevirir.

  • cos (θ-π/2) = sin (θ) = d/d12 = vs*Δt/d12
  • θ = asin (vs*Δt/d12), -π/2 <= θ <= π/2

Gecikməni tapmaq

Yuxarıdakı tənlikdən də göründüyü kimi, bucaq üçün həll etməmiz lazım olan şey, mikrofonun ikisinə nisbətən mikrofonun birinə gələn səs dalğasının gecikməsidir; səsin sürəti və mikrofonlar arasındakı məsafə həm sabit, həm də məlumdur. Bunu həyata keçirmək üçün əvvəlcə fs tezliyində səs siqnallarını nümunə götürürük, onları analoqdan rəqəmliyə çeviririk və məlumatları sonrakı istifadə üçün saxlayırıq. Səs dalğamızın fərqli xüsusiyyətlərini ələ keçirmək üçün kifayət qədər uzun olan nümunə pəncərəsi olaraq bilinən bir müddət üçün nümunə götürürük. Məsələn, pəncərəmiz son yarım saniyəlik audio məlumat ola bilər.

Pəncərəli səs siqnallarını əldə etdikdən sonra, aralarındakı əlaqəni hesablayaraq aralarındakı gecikməni tapırıq. Çapraz korrelyasiyanı hesablamaq üçün pəncərəli siqnalı bir mikrofondan sabit saxlayırıq və ikinci siqnalı vaxt oxu boyunca birincinin arxasından birincisindən əvvələ qədər sürüşdürürük. Slaydımızın hər bir addımında sabit siqnalımızdakı hər nöqtəni sürüşmə siqnalımızın müvafiq nöqtəsi ilə vururuq, sonra bütün addımları toplayaraq həmin addım üçün korrelyasiya əmsalımızı hesablayırıq. Slaydımızı tamamladıqdan sonra ən yüksək korrelyasiya əmsalına malik olan addım iki siqnalın ən çox oxşar olduğu nöqtəyə uyğundur və hansı addımda olduğumuz bizə n siqnalın iki siqnalın 1 siqnalından kənarlaşdırıldığını bildirir., sonra iki siqnal bir siqnaldan geridə qalır, əgər müsbətdirsə, iki siqnal irəlidədir və sıfırdırsa, ikisi artıq hizalanmışdır. Bu nümunə ofsetini lingt = n/fs əlaqəsi ilə seçmə tezliyimizdən istifadə edərək vaxt gecikməsinə çeviririk:

  • θ = asin (vs*n/(d12*fs)), -π/2 <= θ <= π/2

Addım 2: Komponentlər

Hissələri

  • Xbox 360, model 1414 və ya 1473 üçün Microsoft Kinect. Kinect -in istifadə edəcəyimiz xətti cərgədə düzülmüş dörd mikrofonu var.
  • Kinect -in xüsusi konnektorunu USB + AC gücünə çevirmək üçün adapter.
  • Raspberry Pi 2 və ya 3 çalışan Raspbian Stretch. Əvvəlcə Pi 1 Model B+istifadə etməyə çalışdım, amma kifayət qədər güclü deyildi. Kinect -dən ayrılmaqla bağlı problemlərim davam etdi.
  • Tapa biləcəyiniz ən dəhşətli maneken başı
  • Maneken başınızı çevirə biləcək qədər güclü bir analoq servo
  • Həm Pi, həm də servoya və ən azı iki porta güc vermək üçün kifayət qədər amperə malik 5V USB divar şarj cihazı. (Buna bənzər 5A 3 portlu bir fiş istifadə etdim
  • İki çıxışı olan uzatma kabeli (biri USB divar şarj cihazı üçün, digəri Kinect AC adapteri üçün.
  • İki USB kabeli: Pi-ni gücləndirmək üçün A tipli mikro-USB kabel və digərini kəsməkdən çəkinmədiyiniz servoya güc vermək üçün
  • Hər şeyin oturacağı bir platforma və maneken başı üçün daha kiçik bir platforma. Əsas olaraq plastik bir xidmət tepsisi və baş platforması olaraq plastik bir boşqab istifadə etdim. Hər ikisi Walmartdan idi və cəmi bir neçə dollara başa gəlirdi
  • 4x #8-32 1/2 "bolt və qoz-fındıq, servonuzu daha böyük platformaya bağlamaq üçün
  • Yuyuculu 2x M3 8mm bolt (və ya servo buynuzu daha kiçik platformaya bağlamaq üçün nə lazımdırsa)
  • Biri qırmızı, biri qara, biri də dişi-kişiyə tullanan iki telli kişidən kişiyə keçid teli
  • Yapışqan dəstəkli cırtdan zolaqlar
  • Elektrik lenti
  • Kabel idarə etmək üçün yapışan bant

Alətlər

  • Dremel kəsici təkər ilə
  • Qazma
  • 7/64 ", 11/16" və 5/16 "matkap ucları
  • M3 vurun (Servo buynuzdan asılı olaraq isteğe bağlıdır)
  • Tornavida
  • Lehim ilə lehimləmə dəmiri
  • Köməkçi əllər (isteğe bağlı)
  • Marker
  • Kompas
  • Tel çıxarıcılar
  • Multimetr (İsteğe bağlı)

PPE

  • Təhlükəsizlik eynəyi

  • Üz maskası (plastikdən hazırlanmış uclar üçün).

Addım 3: Aşağı Platforma Montajı

Aşağı Platforma Məclisi
Aşağı Platforma Məclisi
Aşağı Platforma Məclisi
Aşağı Platforma Məclisi
Aşağı Platforma Məclisi
Aşağı Platforma Məclisi

Edəcəyimiz ilk hissə, Kinect, servo və bütün elektronikalarımızı tutacaq alt platformadır. Platforma yaratmaq üçün sizə lazım olacaq:

  • Plastik Xidmət Tepsisi
  • Servo
  • 4x #8-32 1/2 "qoz-fındıqlı boltlar
  • Kəsmə Təkərli Dremel
  • Tornavida
  • Qazma
  • 11/16 "Matkap Ucu
  • Marker

Necə etmək

  1. Tepsinizi tərs çevirin.
  2. Servolarınızı tepsinin arxasına yaxın bir tərəfə qoyun, servonun çıxış dişlisinin tepsinin orta xətti boyunca uzandığından əmin olun, sonra servonun əsasını işarələyin.
  3. Dremel və kəsici təkərdən istifadə edərək qeyd etdiyiniz sahəni kəsin, sonra servoyu yuvasına sürüşdürün.
  4. Tepsidə servo gövdə montaj deliklərinin mərkəzlərini qeyd edin, sonra servoyu çıxarın və 11/16 "matkapla bu delikləri qazın. Çuxur qazarkən bu cür nazik plastik çatlamaq çox asandır, buna görə daha təhlükəsiz hesab edirəm matkabı tərs istiqamətdə hərəkət etdirmək və materialı yavaş -yavaş çırpmaq. Çuxurları düzgün şəkildə qazmaqdan daha yavaşdır, lakin çatların olmamasını təmin edir.
  5. Servisinizi yuvaya yerləşdirin, sonra #8-32 bolt və qoz-fındıq ilə tepsiyə quraşdırın.

Addım 4: Baş Platforması Montajı

Baş Platforması Məclisi
Baş Platforması Məclisi
Baş Platforması Məclisi
Baş Platforması Məclisi
Baş Platforması Məclisi
Baş Platforması Məclisi
Baş Platforması Məclisi
Baş Platforması Məclisi

Hazırlayacağımız növbəti hissə maneken başını servoya bağlamaq üçün bir platform olacaq. Baş platforma etmək üçün sizə lazım olacaq:

  • Plastik lövhə
  • Servo buynuzu
  • Yuyuculu 2x M3 8mm bolt
  • Tornavida
  • Qazma
  • 7/64 "və 5/16" qazma bitləri
  • Kompas
  • Dremel kəsici təkər ilə

Necə etmək

  1. Kompasınızı manken başınızın əsasının radiusuna qoyun.
  2. Lövhənin ortasında ortalanmış bir dairəni qeyd etmək üçün pusulanızdan istifadə edin. Bu, baş platformamızın həqiqi ölçüsü olacaq.
  3. Kiçik platformanı boşqabdan kəsmək üçün dremel və kəsici təkərdən istifadə edin.
  4. Yeni platformanızın mərkəzini 5/16 "qazma ucu ilə qazın. Bu bizə servo buynuzumuzu servomuza bağlayan vidaya daxil olmağımıza imkan verəcək. Deliyi qazarkən platformaya sabitlik vermək üçün bir rulon qoydum. altına tel çəkin və makaranın ortasından qazın.
  5. Platformanın ortasına servo buynuzu düzün və buynuzu platformaya bağlamaq üçün iki deşik işarələyin. Bu montaj deliklərinin bir -birindən kifayət qədər uzaq olduğundan əmin olun, beləliklə M3 bolt başları və yuyucular üçün yer var.
  6. Bu işarələnmiş delikləri 7/64 düymlük bir matkapla qazın.
  7. Servo buynuzumun alt çuxuru hamar idi, yəni M3 boltunun ipləri yox idi. Beləliklə, ipləri düzəltmək üçün matkapımdan və M3 kranından istifadə etdim.
  8. Başlıq platformasına servo buynuzu bağlamaq üçün bolt və yuyuculardan istifadə edin.

Addım 5: Servo Güc Kabeli

Servo Güc Kabeli
Servo Güc Kabeli
Servo Güc Kabeli
Servo Güc Kabeli
Servo Güc Kabeli
Servo Güc Kabeli
Servo Güc Kabeli
Servo Güc Kabeli

Analog servolar ümumiyyətlə 4.8-6V ilə təchiz edilmişdir. Raspberry Pi artıq USB -dən 5V ilə işləyəcəyi üçün servoyu USB -dən də gücləndirərək sistemimizi sadələşdirəcəyik. Bunu etmək üçün bir USB kabelini dəyişdirməliyik. Servo elektrik kabelini hazırlamaq üçün sizə lazım olacaq:

  • A tipli uclu ehtiyat USB kabeli (kompüterinizə qoşulan növ)
  • Bir qırmızı və bir qara keçid teli
  • Lehimleme dəmir
  • Lehim
  • Tel çıxarıcılar
  • Elektrik lenti
  • Köməkçi əllər (isteğe bağlı)
  • Multimetr (isteğe bağlı)

Necə etmək

  1. Kabelinizi USB tip A olmayan bir konnektordan kəsin, sonra dörd daxili teli açmaq üçün izolyasiyanı bir qədər soyun. Açıq telləri əhatə edən qoruyucuları kəsin.
  2. Tipik olaraq, USB kabeli dörd teldən ibarət olacaq: ikisi məlumat ötürülməsi və qəbulu üçün, ikisi isə güc və torpaq üçün. Ümumiyyətlə qırmızı və qara olan güc və torpaqla maraqlanırıq. İzolyasiyanın bir hissəsini qırmızı və qara tellərdən ayırın və yaşıl və ağ telləri kəsin. Doğru güc və torpaq tellərinə sahib olmadığınızdan narahat olsanız, kabelinizi USB güc adapterinizə qoşa və multimetrlə çıxış gərginliyini yoxlaya bilərsiniz.
  3. Sonra qırmızı və qara keçid kabellərinizin bir ucunu kəsin və izolyasiyanın bir hissəsini çıxarın.
  4. İndi tullanan və USB kabellərinizin açıq olan qara tellərini bir -birinə bükün. Açıq tellərin mərkəzlərindən keçin və bir -birinə bükün. Sonra, birləşdirilmiş tellərə bir yerdə tutmaq üçün lehim tətbiq edin. Köməkçi əllər kabellərinizi yerində tutaraq bunu asanlaşdıracaq.
  5. Qırmızı tellər üçün 4 -cü addımı təkrarlayın.
  6. Açıq telləri elektrik lenti ilə örtün və ya özünüzü xoş hiss edirsinizsə, istilik büzücü borularla örtün. Tellər çox kiçik olduğu üçün bu birləşmələr kövrək olacaq, buna görə USB kabelinin xarici izolyasiyasına tullanan kabelləri tutan ikinci bir lent qatını əlavə edin. Bu, montajı daha sərt hala gətirəcək və beləliklə əyilmədən qırılma ehtimalını azaldır.

Addım 6: Elektronikanın quraşdırılması

Elektronika Quraşdırılması
Elektronika Quraşdırılması
Elektronika Quraşdırılması
Elektronika Quraşdırılması
Elektronika Quraşdırılması
Elektronika Quraşdırılması

Nəhayət, hər şeyi bir araya gətirəcəyik, elektronikamızı və başqa hər şeyi alt platformaya yerləşdirəcəyik. Sizə lazım olacaq:

  • Aşağı platforma
  • Baş platforması
  • Maneken başı
  • USB+AC adapteri ilə əlaqə qurun
  • USB güc adapteri
  • Uzatma kabeli
  • Mikro USB kabeli
  • Servo elektrik kabeli
  • Moruq Pi
  • Kişi-Dişi tullanan kabel
  • Yapışqan Velcro
  • Qayçı

Necə etmək

  1. Pi -ni Velcro ilə tepsinin altına quraşdırın.
  2. USB güc adapterini Velcro ilə bağlayın.
  3. USB güc adapterinə servo və Pi qoşun.
  4. Pi'nin 12 pinini (GPIO18) servonun siqnal kabelinə qoşun. Sağdakı altıncı pimdir.
  5. Uzatma kabelini tepsinin arxa qolundan keçirin və USB güc adapterini bir tərəfə qoşun.
  6. Kinect USB+AC adapterini götürün və güc adapterini uzatma kabelinin digər tərəfinə və USB -ni Pi -yə qoşun.
  7. Kinectin şnurunu tepsinin ön sapından keçirin və Kinect adapterinə qoşun.
  8. Kabelləri platformanın altına tutmaq üçün yapışqan lentdən istifadə etdim. Bu ən zərif görünmür, amma xoşbəxtlikdən bütün bunlar gizlidir.
  9. Platformanı sağa çevirin və Kinecti platformanın önünə bağlamaq üçün Velcro istifadə edin.
  10. Mankenin başını baş platformasına montaj etmək üçün Velcro istifadə edin. Hər şey düzəldildikdən sonra, servo buynuz montaj vidasına daxil olmaq üçün iki hissəni ayırın. Buynuzu hələ servoya bükməyin, baxmayaraq ki, hər şeyi sıraya düzmək üçün əvvəlcə servonun mərkəzi mövqedə olduğundan əmin olmalıyıq. Bunu sonrakı mərhələdə edəcəyik.

Addım 7: Proqram və Alqoritm

Proqram və Alqoritm
Proqram və Alqoritm

Baxış

Bu layihə üçün proqram təminatı C ++ dilində yazılmışdır və Robot Əməliyyat Sistemi (ROS) ilə birləşdirilmişdir. ROS -da, bir sistemin proqramı, hər bir düyünün sistemin funksionallığının müəyyən bir alt hissəsini tətbiq etdiyi qovşaqlar adlanan proqramlar toplusuna bölünür. Məlumat, nəşr/abunə üsulu ilə qovşaqlar arasında ötürülür, burada məlumatları istehsal edən qovluqlar və məlumatları istehlak edən qovşaqlar ona abunə olur. Kodun bu şəkildə ayrılması sistem funksionallığının asanlıqla genişlənməsinə və daha sürətli inkişaf üçün qovşaqların sistemlər arasında paylaşılmasına imkan verir.

Bu sistemdə ROS, ilk növbədə, ehtiyac duymadıqları və ya istəmədikləri servo kodunu daxil etmədən digər layihələrin Kinect DOA qiymətləndirməsini daxil etməsinə imkan verən səs mənbəyinin gəliş istiqamətini (DOA) hesablayan kodu servo idarə edən koddan ayırmaq üçün istifadə olunur.. Kodun özünə baxmaq istəyirsinizsə, onu GitHub -da tapa bilərsiniz:

github.com/raikaDial/kinect_doa

Kinect DOA Node

Kinect_doa qovşağı, bu sistemin əti və sümükləridir, əsasən maraqlı olan hər şeyi edir. Başladıqdan sonra bütün ROS sehrlərini mümkün edən ROS qovşağını işə salır, sonra Kinect -ə firmware yükləyir ki, səs axınları əlçatan olsun. Daha sonra səs axınlarını açan və mikrofon məlumatlarında oxumağa başlayan yeni bir mövzu yaradır. Kinect, hər biri 16 kHz tezliyində dörd mikrofonunu nümunə götürür, buna görə də hesablama yükü səbəbindən məlumatların itməməsi üçün ayrı-ayrı mövzularda çarpaz əlaqənin olması və məlumatların toplanması yaxşıdır. Kinect ilə ünsiyyət, məşhur bir açıq mənbə sürücüsü olan libfreenect istifadə edərək həyata keçirilir.

Toplama mövzusu, yeni məlumatlar alındıqda geri çağırma funksiyasını yerinə yetirir və həm məlumatları saxlayır, həm də DOA -nın nə vaxt qiymətləndiriləcəyini təyin edir. Hər bir mikrofondan alınan məlumatlar, nümunə götürmə pəncərəmizə bərabər uzunluqdakı tamponlarda saxlanılır, burada 8192 nümunə var. Bu, performans və hesablama yükü arasında yaxşı bir tarazlıq olduğunu sınayaraq tapdığım təxminən yarım saniyəlik məlumat dəyəri ilə qarşılıqlı əlaqəni hesablamaq deməkdir. DOA qiymətləndirməsi, hər 4096 nümunə üçün əsas mövzuya siqnal verməklə tetiklenir ki, ardıcıl çarpaz əlaqələr 50%üst-üstə düşsün. Heç bir üst -üstə düşməyən bir vəziyyəti nəzərdən keçirin və nümunə götürmə pəncərəsi ilə yarıya bölünən çox tez bir səs çıxarırsınız. Fərqli səsinizdən əvvəl və sonra, ehtimal ki, ağ səs-küy olacaq, bu da qarşılıqlı əlaqəyə uyğun gəlmək çətin ola bilər. Üst-üstə düşən pəncərələr, bizə sıralamaq üçün daha fərqli xüsusiyyətlər verərək, qarşılıqlı əlaqəmizin etibarlılığını artıraraq daha mükəmməl bir səs nümunəsi təqdim edir.

Əsas iplik toplama ipindən gələn siqnalı gözləyir, sonra DOA təxminini hesablayır. Birincisi, tutulan dalğa formalarının ağ səsdən əhəmiyyətli dərəcədə fərqləndiyini yoxlayır. Bu çek olmasaydı, maraqlı səslərin olub -olmamasından asılı olmayaraq saniyəmizdə dörd dəfə hesablama aparardıq və maneken başımız spastik bir qarışıqlıq olardı. Bu sistemdə istifadə olunan ağ səs -küy alqoritmi burada sadalanan ikisindən birincisidir. Dalğa formamızın törəməsinin mütləq inteqralının mütləq inteqralına nisbətini hesablayırıq; yüksək səs-küylü siqnallar üçün bu nisbət daha az səs-küylü siqnallara nisbətən daha yüksəkdir. Səs-küyü səs-küydən ayıran bu nisbət üçün bir eşik təyin edərək, yalnız uyğun olduqda çarpaz korrelyasiyanı işə sala bilərik. Əlbəttə ki, bu nisbət sistem hər dəfə yeni bir mühitə köçürüldükdə yenidən tənzimlənməli olan bir şeydir.

Dalğa formalarının əhəmiyyətli səs-küy olmayan məzmun ehtiva etdiyini təyin etdikdən sonra proqram çarpaz əlaqələrə davam edir. Bununla birlikdə bu hesablamalarda üç vacib optimallaşdırma var:

  1. Kinect-də dörd mikrofon var, yəni əlaqələndirə biləcəyimiz altı ümumi dalğa forması var. Ancaq mikrofon dizisinin məkan tənzimləməsinə baxsanız, 2, 3 və 4 mikrofonların bir -birinə çox yaxın olduğunu görə bilərsiniz. Əslində, o qədər yaxındırlar ki, səs sürətinə və nümunə götürmə tezliyimizə görə 2, 3 və 4 -də alınan dalğa formaları maxlag = Δd hesablaması ilə yoxlaya biləcəyimiz ən çox bir nümunə ilə qabaqda və ya arxada ayrılacaq. *fs/vs, burada Δd mikrofon cütünün ayrılmasıdır, fs nümunə götürmə tezliyidir və vs səsin sürətidir. Beləliklə, bu üçlük arasındakı cütləri əlaqələndirmək faydasızdır və yalnız 1, 2, 3 və 4 mikrofonlarını əlaqələndirməliyik.
  2. Səs siqnallarının standart çarpaz korrelyasiyasının əks-səda (yankı) varlığında zəif işlədiyi məlumdur. Güclü bir alternativ, faza çevrilməsi (GCC-PHAT) ilə ümumiləşdirilmiş çapraz korrelyasiya kimi tanınır. Bu üsul, orijinal siqnalın əks-sədadan fərqləndirilməsini asanlaşdıran, qarşılıqlı əlaqədə zirvələri gücləndirən bir ağırlıq funksiyasını tətbiq etməkdən qaynaqlanır. GCC-PHAT-ın performansını yankı kamerasındakı sadə çarpaz korrelyasiya ilə müqayisə etdim (oxuyun: beton vanna otağı yenidən qurulur) və GCC-PHAT-ın düzgün bucağı hesablamaqda 7 qat daha təsirli olduğunu gördüm.
  3. Çarpaz korrelyasiya həyata keçirərkən, iki siqnalı götürürük, bir-birimizə sürüşürük və hər addımda sabit siqnalımızdakı hər nöqtəni sürüşmə siqnalımızdakı hər bir nöqtəyə vururuq. N uzunluğunun iki siqnalı üçün n^2 hesablama ilə nəticələnir. Bunun əvəzinə, tez bir Fourier çevrilməsini (nlogn hesablamaları) əhatə edən tezlik sahəsindəki çarpaz korrelyasiyanı yerinə yetirərək, bir çevrilmiş siqnaldakı hər bir nöqtəni digərinin müvafiq nöqtəsi ilə vuraraq (n hesablamalar), sonra tərsini yerinə yetirərək inkişaf etdirə bilərik. zaman sahəsinə (nlogn hesablamaları) qayıtmaq üçün Fourier çevrilməsi, n+2*nlogn hesablamaları ilə nəticələnir, n^2 -dən azdır. Ancaq bu sadəlövh yanaşmadır. Seriyamızdakı mikrofonlar bir -birinə o qədər yaxındır və səs sürəti o qədər nisbətən yavaşdır ki, səs dalğa formaları artıq əsasən uyğunlaşdırılacaq. Beləliklə, bir az irəlidə və ya geridə olan əvəzləri nəzərə almaq üçün qarşılıqlı əlaqəmizi aça bilərik. 1 və 4 mikrofonlar üçün, gecikmə +/- 12 nümunə arasında olmalıdır, yəni hər bir çapraz korrelyasiya üçün yalnız 24*n hesablamalar aparmalıyıq və dalğa formalarımız 2900 nümunədən artıq olduqda hesablama qənaətinə səbəb olur.

Bu sistem, optimallaşdırma 3 ilə GCC-PHAT alqoritmini tətbiq edən minidsp kitabxanasından istifadə edir.

Hər mikrofon cütündən gələn siqnallarda gecikmə tapıldıqdan sonra, proqram gecikmənin orta dəyərini seçir, təxmin edilən bucağı hesablamaq üçün istifadə edir və nəticəni servoya nəzarət etmək üçün istifadə edilə bilər.

Servo İdarəetmə Nodu

Kinect_doa node ilə müqayisədə servo düyün nisbətən sadədir. Onun vəzifəsi yalnız təxmin edilən DOA -nı götürmək və servonu bu bucağa daşımaqdır. Raspberry Pi -nin aparat PWM moduluna daxil olmaq üçün servo açısını təyin etmək üçün wiringPi kitabxanasından istifadə edir. Bir çox analoq servo, 0 ° ilə 180 ° bir açıya uyğun olaraq 1000 µs -dən 2000 µs -ə qədər olan bir nəbz genişliyi olan bir PWM siqnalı ilə idarə olunur, amma istifadə etdiyim servo bucağa uyğun olaraq 500 µs -dən 2500 µs -ə qədər idarə olunur. 0 ° -dən 270 ° -ə qədər. Beləliklə, düyün, minimum nəbz genişliyi, maksimum nəbz genişliyi və maksimum və minimum açılar arasındakı fərqləri təyin edərək fərqli servo qurğular üçün konfiqurasiya edilə bilər. Əlavə olaraq, servo dərhal hədəf bucağına keçmir, əksinə konfiqurasiya edilə bilən bir sürətlə bucağa doğru irəliləyir və Margaretə daha tədricən, ürkütücü bir atmosfer verir (üstəgəl, sürətlə irəli və irəli hərəkət edən bir servonun səsi həqiqətən də əsəbi olur).

Addım 8: Quraşdırma və Quraşdırma

Asılılıqları quraşdırın:

Əvvəlcə libfreenect qurun. Qaynaqdan qurmalıyıq, çünki paket meneceri ilə əldə edə biləcəyiniz versiyada səs dəstəyi yoxdur. Bunun səbəbi, audio təmin etmək üçün Kinect -ə firmware yükləməliyik və bu proqram təminatının yenidən yayılması müəyyən yurisdiksiyalarda qanuni deyil. Əlavə olaraq, başsız Raspbian qurğuları üçün lazımsız olan OpenGL və glut tələb edən nümunələri qurmaqdan çəkinə bilərik.

sudo apt-get install git cmake build-essential libusb-1.0-0-dev

cd git clone https://github.com/OpenKinect/libfreenect cd libfreenect mkdir cd build cmake qurun.. -DCMAKE_BUILD_REDIST_PACKAGE = OFF -DCMAKE_BUILD_EXAMPLES = OFF -u sudo cp ~/linb -kin -sude cd qurmağa məcbur edin..rules /etc/udev/rules.d udevadm nəzarət-yenidən yükləmə qaydaları && udevadm tetikleyici

Sonra, Pi -nin GPIO sancaqlarını idarə etməyə imkan verən wiringPi paketini quraşdırmalıyıq:

cd

git klon git: //git.drogon.net/wiringPi cd ~/wiringPi./build

Maneken başını bağlayın:

WiringPi quraşdırıldıqdan sonra maneken başını aşağı platformaya bağlamaq üçün aparat-quruya tez bir şəkildə geri dönə bilərik. Komanda xətti ilə servonun mərkəzləşdirilməsi üçün aşağıdakı əmrləri daxil edin:

gpio pwm-ms

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

Heç bir hərəkət yoxdursa, servo yəqin ki, artıq mərkəzdədir. Əmin olmaq üçün servonu mərkəz olmayan bir dəyərə təyin edə bilərsiniz, məsələn. gpio -g pwm 18 200, sonra onu 150 -yə qaytarın.

Servonun mərkəzdə olduğundan əmin olduqdan sonra, baş platformasının servo buynuzunu servoya bağlayın ki, maneken başınız düz irəli baxsın. Sonra buynuzu servoya vidalayın və başınızı Velcro ucları ilə bağlayın.

ROS quraşdırın:

Sonra Pi -yə ROS quraşdırın. Böyük bir quraşdırma bələdçisini burada tapa bilərsiniz; sistemimiz üçün OpenCV -ə ehtiyacımız yoxdur, buna görə 3 -cü addımı atlaya bilərsiniz. Bu quruluşun tamamlanması bir neçə saat çəkəcək. Quraşdırma təlimatına əməl etməyi bitirdikdən sonra bashrc -ə mənbəyi əlavə edin ki, yeni quraşdırılmış ROS paketlərimizdən istifadə edə bilək:

echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc

Kinect DOA Paketi yaradın:

Bütün bunları etdikdən sonra, layihəmiz üçün bir iş yeri yaradın və src qovluğuna daxil olun:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

Bu layihənin kodu kinect_doa paketindədir, buna görə onu yeni iş sahənizin src qovluğuna kopyalayın:

git klonu

Robot_upstart paketi, başlanğıcda işə salınması üçün başlatma fayllarını quraşdırmaq üçün istifadəsi asan bir vasitə təmin edir, buna görə də bunu iş sahənizə kopyalayın:

git klonu

İndi, iş sahəmizin ən yüksək səviyyəli kataloqundan catkin_make -ə zəng edərək layihə kodunu qura bilərik, sonra paketlərimizin mövcud olması üçün quruluşumuza mənbə verə bilərik:

cd ~/kinect_doa_ws

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

Qaçış və Ayarlama:

Hər şeyin qoşulduğunu və açıldığını düşünsək, indi sistemi işə salmalı və səsləndirdiyiniz Kinect parçasına sahib olmalısınız! Ancaq Kinect 1473 varsa, əvvəl ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch faylını mətn redaktorunda açın və using_kinect_1473 parametrini doğru olaraq təyin edin. Əlavə olaraq, məndən fərqli bir servo istifadə etsəniz, bu, ehtimal ki, standart bir analog servodur, buna görə də başlanğıc sənədində min_us parametrini 1000, max_us 2000 -ə və max_deg 180 -ə dəyişin.

roslaunch kinect_doa kinect_doa.launch

Bir müddət onunla oynayın. Sistemin çox həssas olduğunu düşünürsünüzsə (səslərə və ya fərqli səslərə uyğun gəlməyən təsadüfi istiqamətlərə baxırsınızsa), başlanğıc sənədindəki white_noise_ratio parametrini dəyişməyi və cavab vermə qabiliyyəti sizin istədiyiniz səviyyəyə çatana qədər sistemi yenidən işə salın.. Oranı artırmaq sistemi daha az həssas edəcək və əksinə. İstədiyiniz performansı əldə etmək üçün sistemi fərqli bir yerə köçürdüyünüz zaman bu tənzimləməni yerinə yetirməli olacaqsınız.

Pi -ni işə saldığımız zaman proqramı işə salmaq üçün başlatma faylımızı quraşdırmaq üçün robot_upstart paketindən istifadə edirik. ROS hazırda işləmirsə, roscore əmri ilə başlayın. Sonra yeni bir terminal açın və işə salın:

rosrun robot_upstart qurun kinect_doa/launch/kinect_doa.launch -istifadəçi kökü --symlink

~/Kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch redaktə etməklə parametrləri dəyişə biləcəyimiz üçün başlanğıc faylını kopyalamaq yerinə simvol bağlantısı yaradırıq.

Addım 9: Ofisdə gizlət

Ofisdə gizlətmək
Ofisdə gizlətmək

İndi əyləncəli hissəyə. Saatlardan sonra işə başlayın və manekeninizi gizlədin. Sonra arxaya oturun və iş yoldaşlarınızın nə qədər davam etməli olduğunu görün! Yeni yaradıcılığınıza bir neçə baş çevirmək zəmanət verilir …

Tövsiyə: