Talaan ng mga Nilalaman:

Sound Localizing Mannequin Head Na May Kinect: 9 Mga Hakbang (na may Mga Larawan)
Sound Localizing Mannequin Head Na May Kinect: 9 Mga Hakbang (na may Mga Larawan)

Video: Sound Localizing Mannequin Head Na May Kinect: 9 Mga Hakbang (na may Mga Larawan)

Video: Sound Localizing Mannequin Head Na May Kinect: 9 Mga Hakbang (na may Mga Larawan)
Video: Minecraft Herobrine in Trouble #Shorts 2024, Hulyo
Anonim
Sound Localizing Mannequin Head Na May Kinect
Sound Localizing Mannequin Head Na May Kinect

Kilalanin si Margaret, isang pagsubok na dummy para sa isang sistema ng pagsubaybay sa pagkapagod ng driver. Kamakailan ay nagretiro siya mula sa kanyang mga tungkulin at nahanap ang daan patungo sa aming puwang sa tanggapan, at mula noon ay nakuha ang pansin ng mga nag-aakalang siya ay 'katakut-takot.' Sa interes ng hustisya, binigyan ko siya ng kakayahang harapin nang harapan ang mga nagsusumbong sa kanya; sa halip na tila sundin ka ng kanyang walang kalingaang tingin, ngayon ay talagang ginagawa niya ito. Gumagamit ang system ng microphone array ng isang Microsoft Kinect at isang servo upang patnubayan siya sa direksyon ng mga taong nagsasalita malapit sa kanya.

Hakbang 1: Teorya

Teorya
Teorya

Kinakalkula ang Angle

Kapag may naririnig tayo, maliban kung ang ingay na iyon ay direkta sa harap natin umabot ito sa isang tainga bago ang isa pa. Napansin ng aming talino ang pagkaantala ng pagdating at i-convert iyon sa isang pangkalahatang direksyon na nagmumula ang ingay, na pinapayagan kaming mahanap ang mapagkukunan. Maaari nating makamit ang eksaktong parehong uri ng lokalisasyon gamit ang isang pares ng mga mikropono. Isaalang-alang ang ipinakitang diagram, na naglalaman ng isang pares ng mikropono at isang mapagkukunan ng tunog. Kung naghahanap kami mula sa itaas pababa, ang mga sound wave ay pabilog, ngunit kung ang distansya sa mapagkukunan ay malaki na may kaugnayan sa spacing sa pagitan ng mga microphones, pagkatapos ay mula sa point-of-view ng aming mga sensor ang alon ay humigit-kumulang na planar. Ito ay kilala bilang malayuang palagay at pinapasimple ang geometry ng aming problema.

Kaya ipalagay na ang wavefront ay isang tuwid na linya. Kung ang tunog ay nagmumula sa kanan, maaabot nito ang mikropono # 2 sa oras na t2 at mikropono # 1 sa oras na t1. Ang distansya d ang tunog ay naglakbay sa pagitan ng pagpindot sa mikropono # 2 at mikropono # 1 ay ang pagkakaiba sa oras sa pagtuklas ng tunog na pinarami ng bilis ng tunog v s:

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

Maaari nating maiugnay ang distansya na ito sa distansya d 12 sa pagitan ng pares ng mikropono at ang anggulo θ mula sa pares sa pinagmulan ng tunog na may kaugnayan:

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

Dahil mayroon lamang kaming dalawang mga mikropono, magkakaroon ng kalabuan sa aming pagkalkula kung ang pinagmulan ng tunog ay nasa harap o sa likuran namin. Sa sistemang ito, ipalagay namin na ang pinagmulan ng tunog ay nasa harap ng pares at i-clamp ang anggulo sa pagitan ng 0 degree (ganap sa kanan ng pares) hanggang 180 degree (ganap sa kaliwa).

Sa wakas, maaari naming malutas ang theta sa pamamagitan ng pagkuha ng kabaligtaran cosine:

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

Upang gawing mas natural ang anggulo, maaari naming ibawas ang 90 degree mula sa theta, upang ang 0 degree ay direkta sa harap ng pares at +/- 90 degree ay buong kaliwa o buong kanan. Ginagawang ito ng aming ekspresyon mula sa kabaligtaran cosine patungo sa inverse sine.

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

Paghahanap ng Pagkaantala

Tulad ng nakikita mo mula sa equation sa itaas, ang kailangan lang namin upang malutas ang anggulo ay ang pagkaantala ng tunog ng alon na narating sa isang mikropono kumpara sa dalawang mikropono; ang bilis ng tunog at ang distansya sa pagitan ng mga mikropono ay parehong naayos at kilala. Upang magawa ito, unang natikman namin ang mga signal ng audio sa frequency fs, kino-convert ang mga ito mula sa analog patungo sa digital at itinatago ang data para magamit sa paglaon. Nag-sample kami para sa isang tagal ng panahon na kilala bilang window ng pag-sample, na kung saan ay may sapat na haba ng tagal upang makuha ang mga kilalang tampok ng aming sound wave. Halimbawa, ang aming window ay maaaring maging halagang kalahating segundo ng audio data.

Matapos makuha ang mga naka-window na audio signal, mahahanap namin ang pagkaantala sa pagitan ng dalawa sa pamamagitan ng pag-compute ng kanilang cross-correlation. Upang makalkula ang cross-correlation, hawak namin ang naka-window na signal mula sa isang mikropono naayos, at i-slide ang pangalawang signal kasama ang axis ng oras mula sa lahat hanggang sa likod ng una hanggang sa lahat ng paraan bago ang una. Sa bawat hakbang sa kahabaan ng aming slide pinarami namin ang bawat punto sa aming nakapirming signal sa pamamagitan ng naaangkop na punto sa aming sliding signal, pagkatapos ay buuin ang lahat ng mga resulta upang makalkula ang aming koepisyent ng ugnayan para sa hakbang na iyon. Matapos makumpleto ang aming slide, ang hakbang na kung saan ay may pinakamataas na coefficient ng ugnayan ay tumutugma sa punto kung saan ang dalawang signal ay magkatulad, at kung anong hakbang ang sinusundan namin ay sinasabi sa amin kung gaano karaming mga sample n signal dalawa ang na-offset mula sa signal 1. Kung negatibo ang n, pagkatapos ang signal two ay nahuhuli sa likod ng signal isa, kung positibo ito pagkatapos ang signal two ay nasa unahan, at kung zero ito pagkatapos ay nakahanay na ang dalawa. Ino-convert namin ang sample na ito na offset sa isang pagkaantala ng oras gamit ang aming dalas ng pag-sample na may kaugnayan na Δt = n / fs, sa gayon:

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

Hakbang 2: Mga Bahagi

Mga Bahagi

  • Ang Microsoft Kinect para sa Xbox 360, modelo ng 1414 o 1473. Ang Kinect ay may apat na mga mikropono na nakaayos sa isang linear na array na gagamitin namin.
  • Adapter upang baguhin ang pagmamay-ari na konektor ng Kinect sa USB + AC na kapangyarihan tulad ng isang ito.
  • Raspberry Pi 2 o 3 tumatakbo na Raspbian Stretch. Orihinal na sinubukan kong gumamit ng isang Pi 1 Model B +, ngunit hindi ito sapat na malakas. Patuloy akong nagkakaroon ng mga isyu sa pagdidiskonekta mula sa Kinect.
  • Ang creepiest mannequin head na maaari mong makita
  • Ang isang analog servo sapat na malakas upang i-on ang iyong mannequin head
  • Isang 5V USB wall charger na may sapat na amperage upang mapagana ang parehong Pi at servo at hindi bababa sa dalawang port. (Gumamit ako ng isang 5A 3-port plug na katulad nito
  • Isang extension cord na may dalawang outlet (Isa para sa USB wall charger at isa pa para sa Kinect AC adapter.
  • Dalawang USB cable: isang uri-A hanggang micro-USB cable upang mapagana ang Pi at isa pa upang mapagana ang servo na hindi mo naisip na gupitin
  • Isang platform para sa lahat upang makaupo at isa pang mas maliit na platform para sa mannequin head. Gumamit ako ng isang plastik na tray ng paghahatid bilang base at isang plastic plate bilang head platform. Parehong nagmula sa Walmart at nagkakahalaga lamang ng ilang dolyar
  • 4x # 8-32 1/2 "bolts at nut upang ikabit ang iyong servo sa mas malaking platform
  • 2x M3 8mm bolt na may mga washer (o anumang laki na kailangan mo upang ilakip ang iyong servo sungay sa mas maliit na platform)
  • Dalawang male-to-male jumper wires, isang pula at isang itim, at isang female-to-male jumper wire
  • Malagkit na naka-back na Velcro strips
  • Electrical tape
  • Duct tape para sa pamamahala ng cable

Mga kasangkapan

  • Dremel na may cutting wheel
  • Drill
  • 7/64 ", 11/16", at 5/16 "drill bits
  • M3 tap (Opsyonal, depende sa iyong servo sungay)
  • Screwdriver
  • Panghinang na may panghinang
  • Pagtulong sa mga kamay (opsyonal)
  • Pananda
  • Compass
  • Mga striper ng wire
  • Multimeter (Opsyonal)

PPE

  • Mga Salamin sa Kaligtasan
  • Face Mask (para sa dremmel-ed plastic bits).

Hakbang 3: Mas mababang Platform Assembly

Mas mababang Platform Assembly
Mas mababang Platform Assembly
Mas mababang Platform Assembly
Mas mababang Platform Assembly
Mas mababang Platform Assembly
Mas mababang Platform Assembly

Ang unang bahagi na gagawin namin ay ang mas mababang platform, na hahawak sa aming Kinect, servo, at lahat ng aming electronics. Upang gawin ang platform na kakailanganin mo:

  • Tray ng Paghahatid ng Plastik
  • Servo
  • 4x # 8-32 1/2 "bolts na may mga mani
  • Dremel na may Cutting Wheel
  • Screwdriver
  • Drill
  • 11/16 "Drill Bit
  • Pananda

Paano gumawa

  1. I-flip ang iyong tray nang baligtad.
  2. Ilagay ang iyong servo patagilid malapit sa likod ng tray, tiyakin na ang output gear ng servo ay nakalagay sa kahabaan ng gitnang linya ng tray, pagkatapos markahan ang paligid ng base ng servo.
  3. Gamit ang iyong dremel at cutting wheel, gupitin ang lugar na iyong minarkahan, pagkatapos ay i-slide ang iyong servo sa puwang nito.
  4. Markahan ang mga sentro ng servo na mga mounting hole sa tray, pagkatapos alisin ang servo at i-drill ang mga butas gamit ang iyong 11/16 "drill bit. Napakadali na i-crack ang manipis na plastik na tulad nito kapag nag-drill ng mga butas, kaya't mas ligtas ito. upang patakbuhin ang drill sa baligtad at dahan-dahang palayasin ang materyal. Mas mabagal kaysa sa drilling ng butas nang maayos ngunit tinitiyak nito na walang mga bitak.
  5. Ibalik ang iyong servo sa puwang, pagkatapos ay i-mount ito sa tray na may mga # 8-32 bolts at nut.

Hakbang 4: Head Platform Assembly

Head Platform Assembly
Head Platform Assembly
Head Platform Assembly
Head Platform Assembly
Head Platform Assembly
Head Platform Assembly
Head Platform Assembly
Head Platform Assembly

Ang susunod na bahagi na gagawin namin ay magiging isang platform upang ikonekta ang mannequin head sa servo. Upang gawin ang platform ng ulo kakailanganin mo:

  • Plato ng plastik
  • Servo sungay
  • 2x M3 8mm bolt na may washers
  • Screwdriver
  • Drill
  • 7/64 "at 5/16" mga drill bit
  • Compass
  • Dremel na may cutting wheel

Paano gumawa

  1. Itakda ang iyong compass sa radius ng base ng iyong mannequin head.
  2. Gamitin ang iyong kumpas upang markahan ang isang bilog na nakasentro sa gitna ng plato. Ito ang magiging aktwal na laki ng aming platform sa ulo.
  3. Gamitin ang iyong dremel at cutting wheel upang maputol ang mas maliit na platform mula sa plato.
  4. I-drill ang gitna ng iyong bagong platform gamit ang isang 5/16 "drill bit. Bibigyan kami nito ng pag-access sa tornilyo na na-mount ang aming servo sungay sa aming servo. Upang mabigyan ang katatagan ng platform habang binubutas ko ang butas, naglagay ako ng isang spool ng kawad sa ilalim nito at nag-drill sa gitna ng spool.
  5. I-line up ang iyong servo sungay sa gitna ng platform at markahan ang dalawang butas upang ilakip ang sungay sa platform. Siguraduhin na ang mga mounting hole na ito ay sapat na magkakalayo upang may lugar para sa iyong M3 bolt head at washers.
  6. I-drill ang mga minarkahang butas na ito gamit ang isang 7/64 "drill bit.
  7. Ang ibabang butas ng aking servo sungay ay makinis, ibig sabihin wala itong mga thread para sa M3 bolt. Kaya, ginamit ko ang aking drill at isang M3 tap upang gawin ang mga thread.
  8. Gamitin ang bolts at washers upang ikabit ang servo sungay sa head platform.

Hakbang 5: Servo Power Cable

Servo Power Cable
Servo Power Cable
Servo Power Cable
Servo Power Cable
Servo Power Cable
Servo Power Cable
Servo Power Cable
Servo Power Cable

Ang mga analog servo ay karaniwang pinalakas ng 4.8-6V. Dahil ang Raspberry Pi ay papalakas na ng 5V mula sa USB, pasimplehin namin ang aming system sa pamamagitan din ng pag-power ng servo mula sa USB. Upang magawa ito kailangan naming baguhin ang isang USB cable. Upang makagawa ng servo power cable kakailanganin mo:

  • Spare USB cable na may isang uri-A na dulo (ang uri na naka-plug sa iyong computer)
  • Isang pula at isang itim na wire ng lumulukso
  • Panghinang
  • Panghinang
  • Mga striper ng wire
  • Electrical tape
  • Pagtulong sa mga kamay (opsyonal)
  • Multimeter (opsyonal)

Paano gumawa

  1. Gupitin ang hindi USB type-A na konektor mula sa iyong cable, pagkatapos ay alisin ang kaunting pagkakabukod upang ipakita ang apat na panloob na mga wire. Putulin ang kalasag na nakapalibot sa mga nakalantad na mga wire.
  2. Kadalasan ang USB cable ay magkakaroon ng apat na wires: dalawa para sa paghahatid ng data at pagtanggap at dalawa para sa lakas at lupa. Interesado kami sa lakas at lupa, na karaniwang pula at itim, ayon sa pagkakabanggit. Huhubad ang ilan sa pagkakabukod ng pula at itim na mga wire at putulin ang berde at puting mga wire. Kung nag-aalala ka na wala kang tamang power at ground wires, maaari mong mai-plug ang iyong cable sa iyong USB power adapter at suriin ang output voltage gamit ang isang multimeter.
  3. Susunod, putulin ang isang dulo ng iyong pula at itim na jumper cables at hubarin ang ilan sa pagkakabukod.
  4. Ngayon, paikutin ang nakalantad na mga itim na wires ng iyong jumper at USB cables. Tumawid sa mga sentro ng nakalantad na mga wire at iikot ang mga ito sa bawat isa. Pagkatapos, maglagay ng panghinang sa mga wire na naka-asawa upang mapagsama ang mga ito. Ang pagtulong sa mga kamay ay magpapadali sa pamamagitan ng pagpigil sa iyong mga kable sa lugar.
  5. Ulitin ang hakbang 4 para sa mga pulang wires.
  6. Takpan ang nakahantad na mga kable gamit ang electrical tape, o pag-init ng tubong pag-urong kung nararamdaman mong magarbong. Ang mga kasukasuan na ito ay marupok dahil ang mga wire ay napakaliit, kaya magdagdag ng isang pangalawang layer ng tape na humahawak sa mga jumper cables sa panlabas na pagkakabukod ng USB cable. Gagawin nitong mas matibay ang pagpupulong at sa gayon ay malamang na hindi masira mula sa baluktot.

Hakbang 6: Pag-mount ng Elektronika

Pag-mount ng Elektronika
Pag-mount ng Elektronika
Pag-mount ng Elektronika
Pag-mount ng Elektronika
Pag-mount ng Elektronika
Pag-mount ng Elektronika

Sa wakas, isasama namin ang lahat, pinapataas ang aming electronics at lahat ng iba pa sa mas mababang platform. Kakailanganin mong:

  • Mas mababang platform
  • Platform ng ulo
  • Mannequin ulo
  • Kinect na may USB + AC adapter
  • USB power adapter
  • Extension cord
  • Micro USB cable
  • Servo power cable
  • Raspberry Pi
  • Kable ng jumper ng Lalake-hanggang-Babae
  • Malagkit na Velcro
  • Gunting

Paano gumawa

  1. I-mount ang Pi sa ilalim ng tray na may Velcro.
  2. Ikabit ang USB power adapter gamit ang Velcro.
  3. I-plug ang servo at Pi sa USB power adapter.
  4. Ikonekta ang pin 12 (GPIO18) ng Pi sa signal cable ng servo. Ito ang ika-6 na pin pababa sa kanan.
  5. Ahas ang iyong extension cord sa likod ng hawakan ng tray at isaksak ang USB power adapter sa isang gilid.
  6. Dalhin ang Kinect USB + AC adapter at isaksak ang power adapter sa kabilang panig ng extension cord at ang USB sa Pi.
  7. Ahas ang kurdon ng Kinect sa pamamagitan ng harap na hawakan ng tray at isaksak sa adapter ng Kinect.
  8. Gumamit ako ng duct tape upang hawakan ang mga cable sa ilalim ng platform. Hindi ito ang hitsura ng pinaka-matikas, ngunit sa kabutihang palad lahat ng ito ay nakatago.
  9. I-flip ang platform sa kanang bahagi at gamitin ang Velcro upang mai-mount ang Kinect sa harap ng platform.
  10. Gumamit ng Velcro upang mai-mount ang mannequin head sa platform ng ulo. Gayunpaman, kapag ang lahat ay nakahanay, gayunpaman, paghiwalayin ang dalawang piraso upang ma-access namin ang servo sungay ng mounting screw. Gayunpaman, huwag i-tornilyo ang sungay sa servo, dahil kailangan naming tiyakin na ang servo ay nasa posisyon na ito sa gitna upang maiayos namin ang lahat. Gagawin namin ito sa susunod na hakbang.

Hakbang 7: Software at Algorithm

Software at Algorithm
Software at Algorithm

Pangkalahatang-ideya

Ang software para sa proyektong ito ay nakasulat sa C ++ at isinama sa Robot Operating System (ROS), isang balangkas para sa pagsusulat ng robotics software. Sa ROS, ang software para sa isang system ay pinaghiwalay sa isang koleksyon ng mga program na tinatawag na node, kung saan ang bawat node ay nagpapatupad ng isang tukoy na subseksyon ng pagpapaandar ng system. Ang data ay naipasa sa pagitan ng mga node gamit ang isang i-publish / mag-subscribe na pamamaraan, kung saan ang mga node na gumagawa ng data ay nai-publish ito at mga node na kumakain ng data na nag-subscribe dito. Ang pag-decouplate ng code sa ganitong paraan ay nagbibigay-daan sa pagpapaandar ng system na madaling mapalawak, at pinapayagan ang mga node na maibahagi sa pagitan ng mga system para sa mas mabilis na pag-unlad.

Sa sistemang ito, pangunahing ginagamit ang ROS upang paghiwalayin ang code na kinakalkula ang direksyon ng pagdating (DOA) ng tunog na mapagkukunan mula sa code na pagkontrol sa servo, na pinapayagan ang iba pang mga proyekto na isama ang pagtatantya ng Kinect DOA nang hindi kasama ang servo code na maaaring hindi nila kailangan o gusto.. Kung nais mong tingnan ang code mismo, mahahanap ito sa GitHub:

github.com/raikaDial/kinect_doa

Kinect DOA Node

Ang kinect_doa node ay ang karne at buto ng sistemang ito, ginagawa ang lahat ng nakakainteres. Sa pagsisimula, pinasimulan nito ang node ng ROS, na ginagawang posible ang lahat ng mahiwagang ROS, pagkatapos ay ina-upload ang firmware sa Kinect upang maging magagamit ang mga audio stream. Pagkatapos ay nagpapalabas ito ng isang bagong thread na magbubukas ng mga audio stream at magsimulang magbasa sa data ng mikropono. Ang sample ng Kinect ay ang apat na mikropono nito sa dalas na 16 kHz bawat isa, kaya mabuti na magkaroon ng cross-correlation at koleksyon ng data sa magkakahiwalay na mga thread upang maiwasan ang nawawalang data dahil sa computational load. Ang pakikipag-interfacing sa Kinect ay nagagawa gamit ang libfreenect, isang tanyag na driver ng open-source.

Ang thread ng koleksyon ay nagpapatupad ng isang function ng callback tuwing may natanggap na bagong data, at kapwa iniimbak ang data at tinutukoy kung kailan tantiyahin ang DOA. Ang data mula sa bawat mikropono ay nakaimbak sa mga lumiligid na buffer na pantay ang haba sa aming sampling window, na narito ang 8192 na mga sample. Ito ay isinasalin sa pagkalkula ng cross-correlation na may halos kalahating segundo na halaga ng data, kung ano ang nahanap ko sa pamamagitan ng pag-eksperimento na maging isang mahusay na balanse sa pagitan ng pagganap at pagkalkula ng pagkarga. Ang pagtatantya ng DOA ay na-trigger para sa bawat 4096 na mga sample sa pamamagitan ng pagbibigay ng senyas sa pangunahing thread, upang ang magkakasunod na mga cross-correlation ay magkakapatong ng 50%. Isaalang-alang ang isang kaso kung saan walang overlap, at gumawa ka ng isang napakabilis na ingay na naputol sa kalahati ng window ng pag-sample. Bago at pagkatapos ng iyong natatanging tunog ay maaaring puting ingay, na maaaring mahirap na linya kasama ang cross-correlation. Nagbibigay sa amin ang mga magkakapatong na bintana ng isang mas kumpletong sample ng tunog, na nagdaragdag ng pagiging maaasahan ng aming cross-correlation sa pamamagitan ng pagbibigay sa amin ng higit pang mga natatanging tampok upang pumila.

Ang pangunahing thread ay naghihintay para sa signal mula sa thread ng koleksyon, pagkatapos ay kalkulahin ang pagtantiya ng DOA. Gayunpaman, una, sinusuri nito kung ang mga nakunan ng mga form ng alon ay makabuluhang naiiba mula sa puting ingay. Kung wala ang tseke na ito, kinukwenta namin ang aming pagtatantya ng apat na beses sa isang segundo hindi alintana kung may mga kagiliw-giliw na ingay o hindi, at ang aming ulo ng manekin ay magiging isang spastic na gulo. Ang algorithm ng puting ingay sa pagtukoy na ginamit sa sistemang ito ang una sa dalawang nakalista dito. Kinukuwenta namin ang ratio ng ganap na pagsasama ng hango ng aming form ng alon sa ganap na pagsasama nito; para sa mga signal na may mataas na nilalaman na puting-ingay ang ratio na ito ay mas mataas kaysa sa hindi gaanong maingay na mga signal. Sa pamamagitan ng pagtatakda ng isang threshold para sa ratio na paghihiwalay ng ingay mula sa hindi ingay, maaari lamang naming ma-trigger ang cross-correlation kapag naaangkop. Siyempre, ang ratio na ito ay isang bagay na kailangang i-re-tuned sa tuwing inililipat ang system sa isang bagong kapaligiran.

Kapag natukoy na ang mga waveform ay naglalaman ng makabuluhang nilalaman na hindi ingay, nagpapatuloy ang programa sa mga cross-correlation. Gayunpaman may tatlong mahahalagang pag-optimize na binuo sa mga kalkulasyong ito:

  1. Mayroong apat na mikropono sa Kinect, nangangahulugang mayroong anim na kabuuang pares ng mga form ng alon na maaari nating i-cross-correlate. Gayunpaman, kung titingnan mo ang spatial na pag-aayos ng array ng mikropono, maaari mong makita na ang mga mikropono 2, 3, at 4 ay napakalapit sa bawat isa. Sa katunayan, napakalapit ng mga ito na dahil sa bilis ng tunog at sa dalas ng aming pag-sample ang mga waveform na natanggap sa 2, 3, at 4 ay paghihiwalayin ng halos isang sample sa unahan o likuran, na maaari naming mapatunayan sa pagkalkula maxlag = Δd * fs / vs, kung saan ang Δd ay ang paghihiwalay ng pares ng mikropono, ang fs ay ang dalas ng sampling, at ang vs ang bilis ng tunog. Samakatuwid, ang pag-uugnay ng mga pares sa pagitan ng tatlong ito ay walang silbi, at kailangan lamang naming i-cross-correlate ang mikropono 1 na may 2, 3, at 4.
  2. Ang pamantayang cross-correlation ng mga audio signal ay kilalang gumanap nang hindi maganda sa pagkakaroon ng mga pagbago (echos). Ang isang matatag na alternatibo ay kilala bilang pangkalahatang cross-ugnayan sa phase transform (GCC-PHAT). Ang pamamaraang ito ay kumukulo sa paglalapat ng isang function ng pagtimbang na nagpapalaki ng mga tuktok sa cross-correlation, na ginagawang mas madali makilala ang orihinal na signal mula sa echos. Inihambing ko ang pagganap ng GCC-PHAT sa simpleng cross-correlation sa isang reverberation room (basahin: ang kongkretong banyo na binabago), at nakita kong ang GCC-PHAT ay 7 beses na mas epektibo sa pagtantya ng tamang anggulo.
  3. Kapag ginaganap ang cross-correlation, kumukuha kami ng dalawang signal, dumudulas ng isa sa isa't isa, at sa bawat hakbang na pinaparami ang bawat punto sa aming nakapirming signal ng bawat punto sa aming sliding signal. Para sa dalawang signal ng haba n, nagreresulta ito sa n ^ 2 na pagkalkula. Maaari naming pagbutihin ito sa pamamagitan ng pagsasagawa ng cross-ugnayan sa dalas ng domain sa halip, na nagsasangkot ng isang mabilis na pang-apat na pagbabago (mga kalkulasyon ng nlogn), pinaparami ang bawat punto sa isang binago na signal ng katumbas na punto sa iba pang (n kalkulasyon), pagkatapos ay gumaganap ng isang kabaligtaran Fourier transform upang bumalik sa domain ng oras (mga kalkulasyon nlogn), na nagreresulta sa mga kalkulasyon n + 2 * nlogn, mas mababa sa n ^ 2. Gayunpaman, ito ang walang muwang na diskarte. Ang mga mikropono sa aming array ay malapit na magkasama at ang bilis ng tunog ay napakabagal na ang mga audio form ng tunog ay halos nakahanay. Kaya, maaari nating mai-window ang aming cross-correlation upang isaalang-alang lamang ang mga offset na bahagyang maaga o sa likuran. Para sa mga mikropono 1 at 4, ang lag ay dapat na mahulog sa pagitan ng +/- 12 mga sample, ibig sabihin para sa bawat cross-correlation kailangan lang namin upang maisagawa ang 24 * n na mga kalkulasyon, na nagreresulta sa pagtitipid sa computational kapag ang aming mga form ng alon ay mas mahaba kaysa sa 2900 na mga sample.

Ang sistemang ito ay gumagamit ng library ng minidsp, na nagpapatupad ng GCC-PHAT algorithm na may pag-optimize ng 3.

Kapag nahanap ang lag sa mga signal mula sa bawat pares ng mikropono, pipiliin ng programa ang halagang panggitna para sa lag, ginagamit ito upang makalkula ang tinantyang anggulo, at inilalathala ang resulta upang magamit ito upang makontrol ang servo.

Servo Control Node

Kung ikukumpara sa kinect_doa node, ang servo node ay medyo simple. Ang trabaho nito ay ang kunin lamang ang tinatayang DOA at ilipat ang servo sa anggulo na iyon. Gumagamit ito ng library ng wiringPi upang ma-access ang module ng hardware PWM ng Raspberry Pi, gamit ito upang maitakda ang anggulo ng servo. Karamihan sa mga analog servos ay kinokontrol ng isang signal ng PWM na may lapad na pulso mula 1000 hanggang 2000 µs, na tumutugma sa isang anggulo na 0 ° hanggang 180 °, ngunit ang ginamit kong servo ay kinokontrol ng 500 tos hanggang 2500 µs, na naaayon sa isang anggulo ng 0 ° hanggang 270 °. Kaya, ang node ay mai-configure para sa iba't ibang mga servo hardware sa pamamagitan ng pagtatakda ng mga parameter para sa minimum na lapad ng pulso, maximum na lapad ng pulso, at ang pagkakaiba sa pagitan ng maximum at minimum na mga anggulo. Bilang karagdagan, ang servo ay hindi kaagad lumilipat sa target na anggulo, ngunit sa halip ay gumagalaw patungo sa anggulo sa isang i-configure na bilis, na nagbibigay kay Margaret ng isang mas mabagal, katakut-takot na vibe (plus, ang tunog ng isang servo na mabilis na gumagalaw pabalik-balik ay nakakainis talaga.).

Hakbang 8: Bumuo at Mag-install

I-install ang Mga Depende:

Una, i-install ang libfreenect. Kailangan naming buuin ito mula sa mapagkukunan dahil ang bersyon na maaari mong makuha sa manager ng package ay hindi kasama ang suporta para sa audio. Ito ay dahil kailangan naming mag-upload ng firmware sa Kinect upang paganahin ang audio, at ang muling pamamahagi ng firmware na ito ay hindi ligal sa ilang mga hurisdiksyon. Bilang karagdagan, maiiwasan natin ang pagbuo ng mga halimbawa na nangangailangan ng OpenGL at glut, hindi kinakailangan para sa mga walang ulo na pag-install ng Raspbian.

sudo apt-get install 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 install sudo cp ~ / libfreenect / platform / linux / udev / 51-kinect.rules /etc/udev/rules.d udevadm control --reload-rules && udevadm trigger

Susunod, kailangan naming i-install ang mga pakete ng wiringPi, na nagbibigay-daan sa amin upang makontrol ang mga GPIO pin ng Pi:

cd

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

Ikabit ang Mannequin Head:

Sa naka-install na mga kablePi maaari na nating kumuha ng mabilis na pagliko pabalik sa hardware-land upang ikabit ang ulo ng manekin sa mas mababang platform. Upang maisentro ang servo sa pamamagitan ng linya ng utos, ipasok ang mga sumusunod na utos:

gpio pwm-ms

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

Kung walang paggalaw, malamang na nakasentro na ang iyong servo. Gayunpaman, upang matiyak, maitatakda mo ang servo sa isang hindi sentro na halaga, hal. gpio -g pwm 18 200, pagkatapos ay itakda itong pabalik sa 150.

Kapag nakatiyak ka na nakasentro ang servo, ikabit ang servo sungay ng platform ng ulo sa servo na ang iyong ulo ng manekin ay makatingin nang diretso. Pagkatapos, i-tornilyo ang sungay sa servo at ilakip ang iyong ulo sa pamamagitan ng mga Velcro bits.

I-install ang ROS:

Susunod, i-install ang ROS sa iyong Pi. Ang isang mahusay na gabay sa pag-install ay matatagpuan dito; para sa aming system hindi namin kailangan ang OpenCV, kaya maaari mong laktawan ang hakbang 3. Aabutin ng ilang oras ang build na ito upang makumpleto. Kapag natapos na sundin ang gabay sa pag-install, idagdag ang pagkuha ng pag-install sa iyong bashrc upang magamit namin ang aming bagong naka-install na mga pakete ng ROS:

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

Bumuo ng Kinect DOA Package:

Matapos ang lahat ng tapos na, gumawa ng isang workspace ng catkin para sa aming proyekto at ipasok ang direktoryo ng src:

mkdir -p ~ / kinect_doa_ws / src

cd ~ / kinect_doa_ws / src

Ang code para sa proyektong ito ay nakapaloob sa pakete ng kinect_doa, kaya't i-clone ito sa direktoryo ng src ng iyong bagong workspace:

git clone

Ang robot_upstart package ay nagbibigay ng isang madaling gamitin na tool para sa pag-install ng mga file ng paglulunsad upang tumakbo sila sa pagsisimula, kaya't i-clone din ito sa iyong workspace:

git clone

Ngayon, maitatayo namin ang code ng proyekto sa pamamagitan ng pagtawag sa catkin_make mula sa tuktok na direktoryo ng antas ng aming workspace, pagkatapos ay mapagkukunan ang aming build kaya magagamit ang aming mga package:

cd ~ / kinect_doa_ws

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

Tumatakbo at Pag-tune:

Ipagpalagay na ang lahat ay naka-plug in at pinapagana, dapat mo na ngayong mailunsad ang system at magkaroon ng track ng Kinect na iyong boses! Gayunpaman, kung mayroon kang isang Kinect 1473, buksan muna ang file ~ / kinect_doa_ws / src / kinect_doa / launch / kinect_doa.launch sa isang text editor at itakda ang parameter gamit ang_kinect_1473 sa totoo. Bilang karagdagan, kung gumamit ka ng ibang servo kaysa sa ginawa ko marahil ito ay isang karaniwang analog servo, Kaya't habang nasa launch file, palitan ang parameter na min_us sa 1000, max_us hanggang 2000, at max_deg sa 180.

roslaunch kinect_doa kinect_doa.launch

Maglaro kasama nito sandali. Kung sa tingin mo ay masyadong sensitibo ang system (pagtingin sa mga random na direksyon na hindi tumutugma sa mga tinig o natatanging ingay), subukang baguhin ang parameter na white_noise_ratio sa paglulunsad ng file at ilunsad muli ang system hanggang sa ang kakayahang tumugon ay nasa antas na komportable ka sa. Ang pagtaas ng ratio ay gagawing mas madaling tumugon ang system at kabaligtaran. Malamang na isasagawa mo ang pag-aayos na ito tuwing inililipat mo ang system sa ibang lokasyon upang makuha ang nais mong pagganap.

Upang ilunsad ang programa kapag pinapagana namin ang Pi, ginagamit namin ang robot_upstart na pakete upang mai-install ang aming file ng paglunsad. Kung ang ROS ay kasalukuyang hindi tumatakbo, simulan ito sa command roscore. Pagkatapos, buksan ang isang bagong terminal at i-install ang paglunsad gamit ang:

rosrun robot_upstart install kinect_doa / launch / kinect_doa.launch --user root --symlink

Lumilikha kami ng isang symlink sa file ng paglunsad sa halip na kopyahin ito upang mabago namin ang mga parameter sa pamamagitan ng pag-edit ng ~ / kinect_doa_ws / src / kinect_doa / launch / kinect_doa.launch.

Hakbang 9: Itinatago Ito sa Opisina

Itago ito sa Opisina
Itago ito sa Opisina

Ngayon para sa kasiya-siyang bahagi. Pumunta sa trabaho pagkatapos ng oras at itakda ang iyong manekin sa ulo nang lihim. Pagkatapos ay umupo ka lamang at tingnan kung gaano katagal bago mahuli ng iyong mga katrabaho! Ikaw ay bagong paglikha ay garantisadong upang buksan ang ilang mga ulo …

Inirerekumendang: