Turinys:

Garsą lokalizuojanti manekeno galva su „Kinect“: 9 žingsniai (su nuotraukomis)
Garsą lokalizuojanti manekeno galva su „Kinect“: 9 žingsniai (su nuotraukomis)

Video: Garsą lokalizuojanti manekeno galva su „Kinect“: 9 žingsniai (su nuotraukomis)

Video: Garsą lokalizuojanti manekeno galva su „Kinect“: 9 žingsniai (su nuotraukomis)
Video: ВСЕ ЧАСТИ Обитель ведьмы: Хижина мертвых тел 2024, Liepa
Anonim
Garsą lokalizuojanti manekeno galvutė su „Kinect“
Garsą lokalizuojanti manekeno galvutė su „Kinect“

Susipažinkite su Margaret, bandančiu manekeną vairuotojo nuovargio stebėjimo sistemai. Neseniai ji pasitraukė iš savo pareigų ir atsidūrė mūsų biuro patalpose, o nuo to laiko atkreipė dėmesį tų, kurie mano, kad ji „šiurpi“. Siekdamas teisingumo, aš suteikiau jai galimybę akis į akį susidurti su savo kaltintojais; vietoj to, kad iš pažiūros sektų tave savo sielos neturinčiu žvilgsniu, dabar ji iš tikrųjų tai daro. Sistema naudoja „Microsoft Kinect“mikrofoną ir servo sistemą, kad nukreiptų ją link žmonių, kalbančių šalia jos.

1 žingsnis: teorija

Teorija
Teorija

Kampų skaičiavimas

Kai ką nors girdime, nebent tas triukšmas yra tiesiai priešais mus, jis pasiekia vieną ausį prieš kitą. Mūsų smegenys suvokia tą atvykimo vėlavimą ir paverčia tai bendra kryptimi, iš kurios sklinda triukšmas, ir leidžia mums rasti šaltinį. Tą pačią lokalizaciją galime pasiekti naudodami porą mikrofonų. Apsvarstykite pateiktą schemą, kurioje yra mikrofonų pora ir garso šaltinis. Jei žiūrime iš viršaus į apačią, garso bangos yra apskritos, tačiau jei atstumas iki šaltinio yra didelis, palyginti su atstumu tarp mikrofonų, tada mūsų jutiklių požiūriu banga yra maždaug plokščia. Tai vadinama tolimojo lauko prielaida ir supaprastina mūsų problemos geometriją.

Taigi tarkime, kad bangos frontas yra tiesi linija. Jei garsas sklinda iš dešinės, jis pataikys į mikrofoną Nr. 2, esant t2, ir į mikrofoną Nr. 1, esant t1. Atstumas d, sklindantis garsas tarp smūgio mikrofono Nr. 2 ir mikrofono Nr. 1, yra laiko skirtumas nustatant garsą, padaugintas iš garso greičio v s:

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

Šį atstumą galime susieti su atstumu d 12 tarp mikrofonų poros ir kampu θ nuo poros iki garso šaltinio, turėdami ryšį:

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

Kadangi turime tik du mikrofonus, skaičiuojant bus neaiškumų, ar garso šaltinis yra priešais, ar už mūsų. Šioje sistemoje mes manysime, kad garso šaltinis yra priešais porą, ir įtvirtinsime kampą nuo 0 laipsnių (visiškai į dešinę nuo poros) iki 180 laipsnių (visiškai į kairę).

Galiausiai, mes galime išspręsti teta, imdami atvirkštinį kosinusą:

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

Kad kampas būtų šiek tiek natūralesnis, iš teta galime atimti 90 laipsnių, kad 0 laipsnių būtų tiesiai prieš porą, o +/- 90 laipsnių- visa kairė arba dešinė. Tai paverčia mūsų išraišką iš atvirkštinio kosinuso į atvirkštinį sinusą.

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

Surasti vėlavimą

Kaip matote iš aukščiau pateiktos lygties, viskas, ką turime išspręsti dėl kampo, yra garso bangos, pasiekiančios mikrofoną vienas, vėlavimas, palyginti su antruoju mikrofonu; garso greitis ir atstumas tarp mikrofonų yra fiksuoti ir žinomi. Norėdami tai padaryti, pirmiausia imame garso signalų dažnį fs, konvertuojame juos iš analoginių į skaitmeninius ir saugome duomenis vėlesniam naudojimui. Mes imame mėginius tam tikrą laiką, vadinamą atrankos langu, kuris yra pakankamai ilgas, kad užfiksuotų išskirtines mūsų garso bangos savybes. Pavyzdžiui, mūsų langas gali būti paskutinės pusės sekundės vertės garso duomenų.

Gavę lango garso signalus, mes randame vėlavimą tarp dviejų, apskaičiuodami jų kryžminę koreliaciją. Norėdami apskaičiuoti kryžminę koreliaciją, fiksuotą vieno mikrofono signalą laikome fiksuotą, o antrąjį signalą išilgai laiko ašies stumiame nuo galo iki pirmojo iki pirmojo. Kiekviename žingsnyje iš skaidrės kiekvieną fiksuoto signalo tašką padauginame iš atitinkamo slankiojo signalo taško, tada susumuojame visus rezultatus, kad apskaičiuotume to žingsnio koreliacijos koeficientą. Baigę skaidrę, žingsnis, turintis didžiausią koreliacijos koeficientą, atitinka tašką, kuriame du signalai yra labiausiai panašūs, ir kokiame žingsnyje mes nurodome, kiek pavyzdžių n signalas du yra nukrypęs nuo 1 signalo. Jei n yra neigiamas, tada signalas du atsilieka nuo pirmojo signalo, jei jis teigiamas, tada signalas du yra priekyje, o jei jis yra nulis, abu jau yra suderinti. Mes konvertuojame šį mėginio poslinkį į laiko uždelsimą, naudodami mūsų atrankos dažnį su santykiu Δt = n/fs, taigi:

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

2 žingsnis: komponentai

Dalys

  • „Microsoft Kinect“, skirta „Xbox 360“, 1414 arba 1473. modelis. „Kinect“turi keturis mikrofonus, išdėstytus linijiniame masyve, kurį naudosime.
  • Adapteris, skirtas konvertuoti „Kinect“nuosavą jungtį į USB + kintamosios srovės maitinimą, kaip šis.
  • „Raspberry Pi 2“ar „3“veikia „Raspbian Stretch“. Iš pradžių bandžiau naudoti „Pi 1 Model B+“, bet jis nebuvo pakankamai galingas. Aš nuolat turėjau problemų atsijungdamas nuo „Kinect“.
  • Baisiausia manekeno galva, kokią tik galite rasti
  • Pakankamai stiprus analoginis servo mechanizmas, galintis pasukti manekeno galvą
  • 5 V USB sieninis įkroviklis, kurio srovė yra pakankama tiek „Pi“, tiek „servo“maitinimui ir mažiausiai dviem prievadams. (Aš naudojau 5A 3 prievadų kištuką, panašų į šį
  • Prailginimo laidas su dviem lizdais (vienas skirtas USB sieniniam įkrovikliui, kitas - „Kinect“kintamosios srovės adapteriui.
  • Du USB kabeliai: A tipo-mikro-USB kabelis, skirtas maitinti „Pi“, o kitas-maitinti servo, kurio nesiruošiate pjaustyti
  • Platforma, kurioje galima sėdėti, ir kita mažesnė platforma manekeno galvai. Kaip pagrindą naudojau plastikinį serviravimo padėklą ir plastikinę lėkštę. Abu buvo iš „Walmart“ir kainavo tik kelis dolerius
  • 4x #8-32 1/2 colio varžtai ir veržlės, skirtos jūsų servo tvirtinimui prie didesnės platformos
  • 2x M3 8 mm varžtas su poveržlėmis (arba bet kokio dydžio, kurio reikia norint pritvirtinti servo ragą prie mažesnės platformos)
  • Du jungiamieji laidai iš vieno vyro į kitą, vienas raudonas ir vienas juodas, ir vienas jungiamasis laidas iš moterų į vyrą
  • Lipnios Velcro juostelės
  • Izoliacinė juosta
  • Lipni juosta kabeliui valdyti

Įrankiai

  • Dremel su pjovimo ratuku
  • Grąžtas
  • 7/64 ", 11/16" ir 5/16 "grąžtai
  • M3 bakstelėjimas (pasirinktinai, priklausomai nuo jūsų servo signalo)
  • Atsuktuvas
  • Lituoklis su lituokliu
  • Pagalbinės rankos (neprivaloma)
  • Žymeklis
  • Kompasas
  • Vielos nuėmikliai
  • Multimetras (pasirinktinai)

AAP

  • Apsauginiai akiniai

  • Veido kaukė (skirta plastikiniams gabalėliams).

3 žingsnis: apatinės platformos surinkimas

Apatinės platformos surinkimas
Apatinės platformos surinkimas
Apatinės platformos surinkimas
Apatinės platformos surinkimas
Apatinės platformos surinkimas
Apatinės platformos surinkimas

Pirmoji dalis, kurią pagaminsime, yra apatinė platforma, kurioje tilps mūsų „Kinect“, servo ir visa mūsų elektronika. Norėdami sukurti platformą, jums reikės:

  • Plastikinis serviravimo padėklas
  • Servo
  • 4x #8-32 1/2 "varžtai su veržlėmis
  • „Dremel“su pjovimo ratuku
  • Atsuktuvas
  • Grąžtas
  • 11/16 "grąžtas
  • Žymeklis

Kaip padaryti

  1. Apverskite dėklą aukštyn kojom.
  2. Padėkite savo servo šoną šalia dėklo galo, įsitikinkite, kad servo išvesties pavara yra išilgai dėklo vidurinės linijos, tada pažymėkite aplink servo pagrindą.
  3. Naudodami „dremel“ir pjovimo ratą, iškirpkite pažymėtą sritį, tada įstumkite servo į lizdą.
  4. Ant dėklo pažymėkite servo korpuso tvirtinimo skylių centrus, tada nuimkite servo servetėlę ir išgręžkite tas skyles savo 11/16 colių grąžtu. Gręžiant skyles labai lengva nulaužti tokį ploną plastiką, todėl manau, kad tai yra daug saugiau paleisti grąžtą atbuline eiga ir lėtai nuplėšti medžiagą. Tai daug lėčiau nei tinkamai gręžti skyles, tačiau tai užtikrina, kad nėra įtrūkimų.
  5. Įdėkite savo servo atgal į angą, tada pritvirtinkite prie dėklo #8-32 varžtais ir veržlėmis.

4 žingsnis: Galvos platformos surinkimas

Galvos platformos surinkimas
Galvos platformos surinkimas
Galvos platformos surinkimas
Galvos platformos surinkimas
Galvos platformos surinkimas
Galvos platformos surinkimas
Galvos platformos surinkimas
Galvos platformos surinkimas

Kita mūsų pagaminta dalis bus platforma, skirta manekeno galvutei prijungti prie servo. Norėdami pagaminti galvos platformą, jums reikės:

  • Plastikinė plokštė
  • Servo ragas
  • 2x M3 8 mm varžtas su poveržlėmis
  • Atsuktuvas
  • Grąžtas
  • 7/64 "ir 5/16" grąžtai
  • Kompasas
  • Dremel su pjovimo ratuku

Kaip padaryti

  1. Nustatykite kompasą pagal manekeno galvos pagrindo spindulį.
  2. Naudokite kompasą, kad pažymėtumėte apskritimą, kurio centre yra plokštelės centras. Tai bus tikrasis mūsų galvos platformos dydis.
  3. Naudokite „dremel“ir pjovimo ratą, kad iš plokštės išpjautumėte mažesnę platformą.
  4. Išgręžkite savo naujos platformos centrą 5/16 colių grąžtu. Taip galėsime prieiti prie varžto, kuriuo mūsų servo ragas tvirtinamas prie mūsų servo. Siekdamas suteikti platformai stabilumo, kai gręžiau skylę, uždėjau ritę po juo viela ir gręžta per ritės centrą.
  5. Sureguliuokite servo ragą su platformos centru ir pažymėkite dvi skyles, kad ragas būtų pritvirtintas prie platformos. Įsitikinkite, kad šios tvirtinimo angos yra pakankamai toli viena nuo kitos, kad būtų vietos jūsų M3 varžtų galvutėms ir poveržlėms.
  6. Išgręžkite šias pažymėtas skyles 7/64 colių grąžtu.
  7. Apatinė mano servo rago skylė buvo lygi, t. Y. Joje nebuvo sriegių M3 varžtui. Taigi, siūlams gaminti naudoju savo grąžtą ir M3 čiaupą.
  8. Naudodami varžtus ir poveržles, servo ragą pritvirtinkite prie galvos platformos.

5 žingsnis: Servo maitinimo kabelis

Servo maitinimo kabelis
Servo maitinimo kabelis
Servo maitinimo kabelis
Servo maitinimo kabelis
Servo maitinimo kabelis
Servo maitinimo kabelis
Servo maitinimo kabelis
Servo maitinimo kabelis

Analoginiai servai paprastai maitinami 4,8–6 V įtampa. Kadangi „Raspberry Pi“jau bus maitinamas 5 V iš USB, mes supaprastinsime savo sistemą, taip pat maitindami servo maitinimą iš USB. Norėdami tai padaryti, turime pakeisti USB kabelį. Norėdami pagaminti servo maitinimo kabelį, jums reikės:

  • Atsarginis USB kabelis su A tipo galu (toks, kuris jungiamas prie kompiuterio)
  • Vienas raudonas ir vienas juodas trumpiklis
  • Lituoklis
  • Lituoklis
  • Vielos nuėmikliai
  • Izoliacinė juosta
  • Pagalbinės rankos (neprivaloma)
  • Multimetras (neprivaloma)

Kaip padaryti

  1. Atjunkite kabelį nuo USB tipo A tipo jungties, tada nuimkite dalį izoliacijos, kad būtų atskleisti keturi vidiniai laidai. Nupjaukite ekraną aplink atvirus laidus.
  2. Paprastai USB kabelis turi keturis laidus: du - duomenų perdavimui ir priėmimui, du - maitinimui ir įžeminimui. Mus domina galia ir žemė, kurios paprastai yra atitinkamai raudonos ir juodos. Nulupkite dalį izoliacijos nuo raudonų ir juodų laidų ir nupjaukite žalią ir baltą laidus. Jei nerimaujate, kad neturite tinkamų maitinimo ir įžeminimo laidų, galite prijungti kabelį prie USB maitinimo adapterio ir patikrinti išėjimo įtampą naudodami multimetrą.
  3. Tada nupjaukite raudonų ir juodų jungiamųjų kabelių vieną galą ir nuimkite dalį izoliacijos.
  4. Dabar susukite atvirus juodus trumpiklio laidus ir USB kabelius. Kryžkite atvirų laidų centrus ir pasukite juos vienas ant kito. Tada ant sujungtų laidų uždėkite lydmetalį, kad jie laikytųsi kartu. Padedančios rankos tai palengvins laikydamos kabelius.
  5. Pakartokite 4 veiksmą raudoniems laidams.
  6. Uždenkite atvirus laidus elektros juosta arba termiškai susitraukiančiais vamzdeliais, jei jaučiatės išgalvoti. Šios jungtys bus trapios, nes laidai yra tokie maži, todėl prie išorinės USB kabelio izoliacijos pridėkite antrą juostos sluoksnį, laikantį trumpiklius. Dėl to agregatas taps standesnis ir mažiau linkęs sulūžti.

6 žingsnis: Elektronikos montavimas

Elektronikos montavimas
Elektronikos montavimas
Elektronikos montavimas
Elektronikos montavimas
Elektronikos montavimas
Elektronikos montavimas

Galiausiai viską sujungsime, sumontuosime savo elektroniką ir visa kita ant apatinės platformos. Jums reikės:

  • Apatinė platforma
  • Galvos platforma
  • Manekeno galva
  • „Kinect“su USB+kintamosios srovės adapteriu
  • USB maitinimo adapteris
  • Prailginimo laidas
  • Mikro USB kabelis
  • Servo maitinimo kabelis
  • Raspberry Pi
  • Kištukinis kabelis nuo vyrų iki moterų
  • Lipnus Velcro
  • Žirklės

Kaip padaryti

  1. Pritvirtinkite Pi prie dėklo apačios su Velcro.
  2. Prijunkite USB maitinimo adapterį su Velcro.
  3. Prijunkite „Servo“ir „Pi“prie USB maitinimo adapterio.
  4. Prijunkite Pi 12 kaištį (GPIO18) prie servo signalo kabelio. Tai yra 6 -asis kaištis dešinėje.
  5. Sukite savo ilginamąjį laidą per galinę dėklo rankeną ir prijunkite USB maitinimo adapterį prie vienos pusės.
  6. Paimkite „Kinect“USB+kintamosios srovės adapterį ir prijunkite maitinimo adapterį prie kitos ilginimo laido pusės, o USB - prie „Pi“.
  7. Įkiškite „Kinect“laidą per priekinę dėklo rankeną ir prijunkite prie „Kinect“adapterio.
  8. Aš naudoju lipnią juostą, kad galėčiau pritvirtinti kabelius prie platformos apačios. Tai neatrodo elegantiškiausiai, bet, laimei, visa tai yra paslėpta.
  9. Apverskite platformą dešine puse aukštyn ir naudokite Velcro, kad pritvirtintumėte „Kinect“prie platformos priekio.
  10. Naudokite Velcro, kad pritvirtintumėte manekeno galvutę prie galvos platformos. Vis dėlto, kai viskas bus išdėstyta, atskirkite dvi dalis, kad galėtume pasiekti servo rago tvirtinimo varžtą. Vis dėlto dar nesukite rago prie servo, nes pirmiausia turime įsitikinti, kad servo yra centrinėje padėtyje, kad galėtume viską išdėstyti. Tai padarysime vėliau.

7 žingsnis: programinė įranga ir algoritmas

Programinė įranga ir algoritmas
Programinė įranga ir algoritmas

Apžvalga

Šio projekto programinė įranga yra parašyta C ++ ir yra integruota su robotų operacine sistema (ROS), kuri yra robotikos programinės įrangos rašymo sistema. ROS sistemoje programinė įranga yra suskaidyta į programų rinkinį, vadinamą mazgais, kur kiekvienas mazgas įgyvendina tam tikrą sistemos funkcionalumo poskyrį. Duomenys perduodami tarp mazgų naudojant paskelbimo/prenumeratos metodą, kai duomenis gaminantys mazgai juos paskelbia, o mazgai, kurie naudoja duomenis, juos užsisako. Tokiu būdu atsiejus kodą, galima lengvai išplėsti sistemos funkcijas ir leisti sistemoms dalytis mazgais, kad jie greičiau vystytųsi.

Šioje sistemoje ROS pirmiausia naudojamas atskirti garso šaltinio atvykimo kryptį (DOA) apskaičiuojantį kodą nuo kodo, valdančio servo sistemą, leidžiantį kitiems projektams įtraukti „Kinect DOA“įvertinimą neįtraukiant servo kodo, kurio jiems gali prireikti ar nenorėti.. Jei norite pažvelgti į patį kodą, jį galite rasti „GitHub“:

github.com/raikaDial/kinect_doa

„Kinect DOA Node“

Kinect_doa mazgas yra šios sistemos mėsa ir kaulai, darantys iš esmės viską, kas įdomu. Paleidus, jis inicijuoja ROS mazgą, kad būtų galima visa ROS magija, tada įkelia programinę -aparatinę įrangą į „Kinect“, kad būtų pasiekiami garso srautai. Tada ji sukuria naują giją, kuri atveria garso srautus ir pradeda skaityti mikrofono duomenis. „Kinect“ima mėginius iš savo keturių mikrofonų, kurių dažnis yra 16 kHz, todėl verta turėti kryžminę koreliaciją ir surinkti duomenis atskirose gijose, kad būtų išvengta duomenų praradimo dėl skaičiavimo apkrovos. Sąsaja su „Kinect“atliekama naudojant populiarią atvirojo kodo tvarkyklę „libfreenect“.

Surinkimo gija atlieka atgalinio ryšio funkciją, kai gaunami nauji duomenys, ir saugo duomenis, ir nustato, kada reikia įvertinti DOA. Duomenys iš kiekvieno mikrofono yra saugomi besisukančiuose buferiuose, kurių ilgis lygus mūsų mėginių ėmimo langui, čia yra 8192 mėginiai. Tai reiškia kryžminės koreliacijos apskaičiavimą su maždaug paskutinės pusės sekundės vertės duomenimis, kuriuos eksperimentų metu radau kaip gerą našumo ir skaičiavimo apkrovos pusiausvyrą. DOA įvertinimas suaktyvinamas kiekvienam 4096 mėginiui, signalizuojant apie pagrindinį siūlą, kad nuoseklios kryžminės koreliacijos sutaptų 50%. Apsvarstykite atvejį, kai nėra persidengimo, ir jūs sukuriate labai greitą triukšmą, kurį per pusę sumažina mėginių ėmimo langas. Prieš ir po jūsų išskirtinio garso greičiausiai bus baltas triukšmas, kurį gali būti sunku suderinti su kryžmine koreliacija. Persidengiantys langai suteikia mums išsamesnį garso pavyzdį, padidindami kryžminės koreliacijos patikimumą, suteikdami mums daugiau skirtingų bruožų.

Pagrindinis siūlas laukia signalo iš surinkimo gijos, tada apskaičiuoja DOA įvertinimą. Tačiau pirmiausia patikrinama, ar užfiksuotos bangos formos labai skiriasi nuo baltojo triukšmo. Be šio patikrinimo mes apskaičiuotume savo įvertinimą keturis kartus per sekundę, neatsižvelgiant į tai, ar buvo įdomių garsų, ar ne, ir mūsų manekeno galva būtų spazminė netvarka. Šioje sistemoje naudojamas balto triukšmo aptikimo algoritmas yra pirmasis iš dviejų čia išvardytų. Mes apskaičiuojame mūsų bangos formos išvestinės absoliučio integralo santykį su jo absoliučiu integralu; signalų, kuriuose yra daug baltojo triukšmo, šis santykis yra didesnis nei mažiau triukšmingų signalų. Nustačius šio santykio slenkstį, atskiriantį triukšmą nuo netriukšmo, kryžminę koreliaciją galime suaktyvinti tik esant reikalui. Žinoma, šis santykis turi būti sureguliuotas kiekvieną kartą, kai sistema perkeliama į naują aplinką.

Nustačiusi, kad bangų formose yra daug triukšmo neturinčio turinio, programa tęsia kryžmines koreliacijas. Tačiau į šiuos skaičiavimus įtrauktos trys svarbios optimizacijos:

  1. „Kinect“yra keturi mikrofonai, tai reiškia, kad iš viso yra šešios bangų formų poros, kurias galime tarpusavyje koreliuoti. Tačiau jei pažvelgsite į erdvinį mikrofonų masyvo išdėstymą, pamatysite, kad 2, 3 ir 4 mikrofonai yra labai arti vienas kito. Tiesą sakant, jie yra taip arti, kad dėl garso greičio ir mūsų mėginių ėmimo dažnio bangos formos, gautos esant 2, 3 ir 4, bus atskirtos ne daugiau kaip vienu pavyzdžiu priekyje arba gale, kurį galime patikrinti apskaičiuodami maxlag = Δd *fs/vs, kur Δd yra mikrofonų poros atskyrimas, fs - mėginių ėmimo dažnis, o vs - garso greitis. Taigi porų koreliacija tarp šių trijų yra nenaudinga, ir mums reikia tik susieti 1 mikrofoną su 2, 3 ir 4.
  2. Yra žinoma, kad standartinė garso signalų kryžminė koreliacija veikia prastai, kai yra aidas (echos). Tvirta alternatyva yra žinoma kaip apibendrinta kryžminė koreliacija su fazės transformacija (GCC-PHAT). Šis metodas taikomas svertinei funkcijai, kuri sustiprina kryžminės koreliacijos viršūnes, todėl lengviau atskirti pradinį signalą nuo echos. Aš palyginau GCC-PHAT našumą su paprasta kryžminė koreliacija atgarsio kameroje (skaitykite: pertvarkomas betoninis vonios kambarys) ir nustatiau, kad GCC-PHAT yra 7 kartus efektyvesnis įvertinant teisingą kampą.
  3. Atlikdami kryžminę koreliaciją, mes imame du signalus, slenkame vienas šalia kito ir kiekviename žingsnyje padauginame kiekvieną fiksuoto signalo tašką iš kiekvieno mūsų slankiojo signalo taško. Dėl dviejų ilgio n signalų gaunami n^2 skaičiavimai. Tai galėtume pagerinti atlikdami kryžminę koreliaciją dažnio srityje, kuri apima greitą Furjė transformaciją (nlogn skaičiavimai), padauginus kiekvieną vieno transformuoto signalo tašką iš atitinkamo taško kitame (n skaičiavimai), tada atliekant atvirkštinį Furjė transformacija grįžti į laiko sritį (nlogn skaičiavimai), todėl n+2*nlogn skaičiavimai yra mažesni nei n^2. Tačiau tai yra naivus požiūris. Mūsų masyvo mikrofonai yra taip arti vienas kito, o garso greitis yra toks lėtas, kad garso bangos formos jau bus daugiausia suderintos. Taigi, galime nustatyti kryžminę koreliaciją, kad apsvarstytume tik tuos poslinkius, kurie yra šiek tiek priekyje arba atsilieka. 1 ir 4 mikrofonų atveju atsilikimas turi nukristi tarp +/- 12 mėginių, o tai reiškia, kad kiekvienai kryžminiai koreliacijai turime atlikti tik 24*n skaičiavimus, todėl sutaupoma skaičiavimo, kai mūsų bangos formos yra ilgesnės nei 2900 mėginių.

Ši sistema naudoja minidsp biblioteką, kuri optimizuodama įgyvendina GCC-PHAT algoritmą 3.

Radusi kiekvienos mikrofono poros signalų atsilikimą, programa pasirenka vidutinę atsilikimo vertę, naudoja ją apskaičiuotam kampui apskaičiuoti ir paskelbia rezultatą, kad galėtų būti naudojama servo valdymui.

Servo valdymo mazgas

Palyginti su mazgu kinect_doa, servo mazgas yra gana paprastas. Jos darbas yra tik paimti apskaičiuotą DOA ir perkelti servo į tą kampą. Ji naudoja „wiringPi“biblioteką, kad pasiektų „Raspberry Pi“aparatinės įrangos PWM modulį, naudodama ją servo kampui nustatyti. Daugumą analoginių servo valdo PWM signalas, kurio impulsų plotis svyruoja nuo 1000 µs iki 2000 µs, atitinkantis kampą nuo 0 ° iki 180 °, tačiau mano naudojamas servo valdymas buvo valdomas nuo 500 µs iki 2500 µs, atitinkančio kampą nuo 0 ° iki 270 °. Taigi mazgas yra sukonfigūruojamas skirtingai servo aparatinei įrangai, nustatant minimalaus impulsų pločio, maksimalaus impulsų pločio parametrus ir skirtumą tarp didžiausio ir mažiausio kampų. Be to, servo sistema ne iš karto pasislenka į tikslinį kampą, o juda link kampo sukonfigūruojamu greičiu, suteikdama Margaret laipsniškesnę, šiurpą keliančią atmosferą (be to, greitai judantis pirmyn ir atgal servo garsas labai erzina).

8 žingsnis: Sukurkite ir įdiekite

Įdiegti priklausomybes:

Pirmiausia įdiekite „libfreenect“. Turime jį sukurti iš šaltinio, nes versija, kurią galite gauti naudodami paketų tvarkyklę, nepalaiko garso. Taip yra todėl, kad turime įkelti programinę -aparatinę įrangą į „Kinect“, kad įgalintume garsą, o šios programinės įrangos platinimas tam tikrose jurisdikcijose nėra teisėtas. Be to, galime vengti kurti pavyzdžius, kuriems reikalingas „OpenGL“ir „glut“, nereikalingas „Raspbian“diegimui be galvos.

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

cd git klonas https://github.com/OpenKinect/libfreenect cd libfreenect mkdir build cd build cmake.. -DCMAKE_BUILD_REDIST_PACKAGE = OFF -DCMAKE_BUILD_EXAMPLES = OFF padaryti sudo make install sudo cp ~/libfreenekt/platform/.rules /etc/udev/rules.d udevadm control-reload-rules && udevadm trigger

Toliau turime įdiegti „wiringPi“paketą, kuris leidžia mums valdyti „Pi“GPIO kaiščius:

cd

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

Pritvirtinkite manekeno galvą:

Įdiegę „wiringPi“, dabar galime greitai nuvažiuoti atgal į aparatūros žemę ir pritvirtinti manekeno galvutę ant apatinės platformos. Norėdami centruoti servo per komandų eilutę, įveskite šias komandas:

gpio pwm-ms

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

Jei nėra judesio, jūsų servo greičiausiai jau yra centre. Tačiau, norėdami būti tikri, galite nustatyti servo necentrinę vertę, pvz. gpio -g pwm 18 200, tada nustatykite jį atgal į 150.

Kai būsite tikri, kad servo centras yra centre, pritvirtinkite galvos platformos servo ragą prie servo taip, kad manekeno galva būtų nukreipta tiesiai į priekį. Tada prisukite ragą ant servo ir pritvirtinkite galvą per Velcro antgalius.

Įdiekite ROS:

Tada įdiekite ROS į savo „Pi“. Puikų diegimo vadovą rasite čia; mūsų sistemai mums nereikia „OpenCV“, todėl galite praleisti 3 veiksmą. Šis kūrimas užtruks kelias valandas. Baigę laikytis diegimo vadovo, pridėkite diegimo šaltinį prie savo „bashrc“, kad galėtume naudoti naujai įdiegtus ROS paketus:

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

Sukurkite „Kinect DOA“paketą:

Kai viskas bus padaryta, sukurkite mūsų projekto „catkin“darbo vietą ir įveskite src katalogą:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

Šio projekto kodas yra pakete „kinect_doa“, todėl klonuokite jį į savo naujos darbo src katalogą:

git klonas

Pakete „robot_upstart“yra lengvai naudojamas įrankis, skirtas įdiegti paleidimo failus, kad jie būtų paleidžiami paleidžiant, todėl taip pat klonuokite juos į savo darbo vietą:

git klonas

Dabar mes galime sukurti projekto kodą paskambinę „catkin_make“iš aukščiausio lygio darbo vietos katalogo, tada gauti versiją, kad mūsų paketai būtų prieinami:

cd ~/kinect_doa_ws

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

Bėgimas ir derinimas:

Darant prielaidą, kad viskas yra įjungta ir įjungta, dabar turėtumėte turėti galimybę paleisti sistemą ir turėti „Kinect“takelį, kuriuo balsuojate! Tačiau, jei turite „Kinect 1473“, pirmiausia teksto rengyklėje atidarykite failą ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch ir nustatykite parametrą naudojant „kinect_1473“į „true“. Be to, jei naudojote kitą servo, nei aš, tai tikriausiai yra standartinis analoginis servo, taigi, paleidimo faile pakeiskite parametrą min_us į 1000, max_us į 2000 ir max_deg į 180.

roslaunch kinect_doa kinect_doa.paleisti

Kurį laiką pažaisk su juo. Jei manote, kad sistema yra per jautri (žiūrite atsitiktinėmis kryptimis, neatitinkančiomis balsų ar skiriamųjų garsų), pabandykite paleidimo faile pakeisti parametrą white_noise_ratio ir iš naujo paleiskite sistemą, kol reagavimo lygis bus jums priimtinas.. Padidinus koeficientą, sistema mažiau reaguoja ir atvirkščiai. Tikriausiai turėsite atlikti šį derinimą, kai perkelsite sistemą į kitą vietą, kad gautumėte norimą našumą.

Norėdami paleisti programą, kai įjungiame „Pi“, mes naudojame paketą „robot_upstart“, kad įdiegtume paleidimo failą. Jei ROS šiuo metu neveikia, paleiskite jį naudodami komandą „roscore“. Tada atidarykite naują terminalą ir įdiekite paleidimą naudodami:

rosrun robot_upstart įdiegti kinect_doa/launch/kinect_doa.launch -vartotojo šaknis -symlink

Mes sukuriame nuorodą į paleidimo failą, o ne nukopijuojame jį, kad galėtume pakeisti parametrus redaguodami ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch.

9 veiksmas: paslėpkite jį biure

Paslėpė jį biure
Paslėpė jį biure

Dabar apie linksmąją dalį. Eikite į darbą po valandų ir paslėpkite manekeną. Tada tiesiog atsisėskite ir pažiūrėkite, kiek laiko užtrunka jūsų bendradarbiai! Jūsų naujasis kūrinys garantuotai apsuks kelias galvas …

Rekomenduojamas: