Satura rādītājs:

Skaņas lokalizējoša manekena galva ar Kinect: 9 soļi (ar attēliem)
Skaņas lokalizējoša manekena galva ar Kinect: 9 soļi (ar attēliem)

Video: Skaņas lokalizējoša manekena galva ar Kinect: 9 soļi (ar attēliem)

Video: Skaņas lokalizējoša manekena galva ar Kinect: 9 soļi (ar attēliem)
Video: Я работаю в Страшном музее для Богатых и Знаменитых. Страшные истории. Ужасы. 2024, Jūlijs
Anonim
Skaņu lokalizējoša manekena galva ar Kinect
Skaņu lokalizējoša manekena galva ar Kinect

Iepazīstieties ar Margaretu, manekenu vadītāja noguruma kontroles sistēmai. Viņa nesen atvaļinājās no saviem pienākumiem un atrada ceļu uz mūsu biroja telpām, un kopš tā laika ir pievērsusi uzmanību tiem, kuri uzskata, ka viņa ir “rāpojoša”. Taisnīguma labad esmu devis viņai iespēju stāties pretī saviem apsūdzētājiem; tā vietā, lai šķietami sekotu tev ar savu dvēseles skatienu, tagad viņa to dara. Sistēma izmanto Microsoft Kinect mikrofonu un servo, lai vadītu viņu virzienā, kurā cilvēki runā viņas tuvumā.

1. solis: teorija

Teorija
Teorija

Leņķa aprēķināšana

Kad mēs kaut ko dzirdam, ja vien šis troksnis nav tieši mūsu priekšā, tas sasniedz vienu ausi pirms otras. Mūsu smadzenes uztver šo ierašanās kavēšanos un pārvērš to vispārējā virzienā, no kura nāk troksnis, ļaujot mums atrast avotu. Mēs varam sasniegt tieši tādu pašu lokalizācijas veidu, izmantojot mikrofonu pāri. Apsveriet parādīto diagrammu, kurā ir mikrofonu pāris un skaņas avots. Ja skatāmies no augšas uz leju, skaņas viļņi ir apļveida, bet, ja attālums līdz avotam ir liels attiecībā pret atstarpi starp mikrofoniem, tad no mūsu sensoru viedokļa vilnis ir aptuveni plakans. Tas ir pazīstams kā tālo lauku pieņēmums un vienkāršo mūsu problēmas ģeometriju.

Tātad pieņemsim, ka viļņu fronte ir taisna līnija. Ja skaņa nāk no labās puses, tā skars mikrofonu #2 laikā t2 un mikrofonu #1 laikā t1. Attālums d, kurā skaņa tiek pārsniegta starp sitienu ar mikrofonu Nr. 2 un mikrofonu #1, ir laika atšķirība skaņas noteikšanā, kas reizināta ar skaņas ātrumu v s:

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

Šo attālumu mēs varam saistīt ar attālumu d 12 starp mikrofonu pāri un leņķi θ no pāra līdz skaņas avotam ar attiecību:

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

Tā kā mums ir tikai divi mikrofoni, mūsu aprēķinos būs neskaidrības par to, vai skaņas avots ir priekšā vai aiz mums. Šajā sistēmā mēs pieņemsim, ka skaņas avots atrodas pāra priekšā, un fiksēsim leņķi starp 0 grādiem (pilnībā pa labi no pāra) līdz 180 grādiem (pilnībā pa kreisi).

Visbeidzot, mēs varam atrisināt tētu, izmantojot apgriezto kosinusu:

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

Lai padarītu leņķi mazliet dabiskāku, mēs varam atņemt 90 grādus no teta, lai 0 grādi būtu tieši pāra priekšā un +/- 90 grādi būtu pilnīgi pa kreisi vai pilnīgi pa labi. Tas pārvērš mūsu izteiksmi no apgrieztā kosinusa uz apgriezto sinusu.

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

Kavējuma atrašana

Kā redzat no iepriekš minētā vienādojuma, leņķim ir jāatrisina tikai skaņas viļņa kavēšanās, kas nāk pie pirmā mikrofona, salīdzinot ar otro mikrofonu; skaņas ātrums un attālums starp mikrofoniem ir gan fiksēts, gan zināms. Lai to paveiktu, mēs vispirms paraugām audio signālus frekvencē fs, pārvēršot tos no analogā uz ciparu un saglabājot datus vēlākai lietošanai. Mēs ņemam paraugus laika periodā, kas pazīstams kā paraugu ņemšanas logs, kas ir pietiekami ilgs laiks, lai uztvertu mūsu skaņas viļņa atšķirīgās iezīmes. Piemēram, mūsu logs varētu būt audio datu pēdējās sekundes sekundes vērtība.

Pēc loga audio signālu iegūšanas mēs atrodam kavēšanos starp abiem, aprēķinot to savstarpējo korelāciju. Lai aprēķinātu savstarpējo korelāciju, mēs noturējam fiksētu signālu no viena mikrofona un pabīdām otro signālu pa laika asi no visas aizmugures līdz pirmajai līdz pirmajai. Katrā solī pa slaidu mēs reizinām katru fiksētā signāla punktu ar atbilstošo bīdāmā signāla punktu, pēc tam apkopojam visus rezultātus, lai aprēķinātu mūsu korelācijas koeficientu šim solim. Pēc mūsu slaida pabeigšanas solis, kuram ir visaugstākais korelācijas koeficients, atbilst punktam, kurā abi signāli ir visvairāk līdzīgi, un solis, kurā mēs veicam, norāda, cik paraugu n divi signāli ir nobīdīti no 1. signāla. Ja n ir negatīvs, tad otrais signāls atpaliek no pirmā signāla, ja tas ir pozitīvs, tad signāls divi ir priekšā, un, ja tas ir nulle, tad abi jau ir izlīdzināti. Mēs pārveidojam šo parauga nobīdi uz laika aizkavi, izmantojot mūsu paraugu ņemšanas biežumu ar attiecību Δt = n/fs, tādējādi:

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

2. darbība: sastāvdaļas

Daļas

  • Microsoft Kinect Xbox 360, modelis 1414 vai 1473. Kinect ir četri mikrofoni, kas izvietoti lineārā masīvā, ko mēs izmantosim.
  • Adapteris, lai pārveidotu Kinect patentēto savienotāju par USB + maiņstrāvu, kā šis.
  • Raspberry Pi 2 vai 3 darbojas Raspbian Stretch. Sākotnēji es mēģināju izmantot Pi 1 modeli B+, taču tas nebija pietiekami spēcīgs. Man pastāvīgi radās problēmas, atvienojoties no Kinect.
  • Rāpojošākā manekena galva, kādu jūs varat atrast
  • Analogais servo, kas ir pietiekami spēcīgs, lai pagrieztu manekena galvu
  • 5V USB sienas lādētājs ar pietiekamu strāvas stiprumu, lai darbinātu gan Pi, gan servo, un vismaz divus portus. (Es izmantoju līdzīgu 5A 3 portu spraudni
  • Pagarinātājs ar divām kontaktligzdām (vienu USB sienas lādētājam un otru Kinect maiņstrāvas adapterim.
  • Divi USB kabeļi: A tipa-mikro-USB kabelis, lai darbinātu Pi, un otrs, lai darbinātu servo, kuru jūs nevēlaties sagriezt
  • Platforma, uz kuras var sēdēt, un vēl viena mazāka platforma manekena galvai. Es izmantoju plastmasas servēšanas paplāti kā pamatu un plastmasas plāksni kā galvas platformu. Abi bija no Walmart un maksāja tikai dažus dolārus
  • 4x #8-32 1/2 collu skrūves un uzgriežņi, lai piestiprinātu servo pie lielākās platformas
  • 2x M3 8 mm skrūve ar paplāksnēm (vai jebkura izmēra, kas nepieciešams, lai piestiprinātu servo ragu mazākai platformai)
  • Divi džempera vadi no vīrieša līdz vīrietim, viens sarkans un viens melns, un viens džemperis no sievietes līdz vīrietim
  • Velcro sloksnes ar līmi
  • Elektriskā lente
  • Līmlente kabeļu vadīšanai

Rīki

  • Dremel ar griešanas riteni
  • Urbis
  • 7/64 ", 11/16" un 5/16 "urbji
  • M3 pieskāriens (pēc izvēles, atkarībā no jūsu servo signāltaures)
  • Skrūvgriezis
  • Lodāmurs ar lodmetālu
  • Palīdzīgas rokas (pēc izvēles)
  • Marķieris
  • Kompass
  • Stiepļu noņēmēji
  • Multimetrs (pēc izvēles)

IAL

  • Drošības brilles

  • Sejas maska (dremel-ed plastmasas uzgaļiem).

3. darbība: platformas apakšējā montāža

Apakšējās platformas montāža
Apakšējās platformas montāža
Apakšējās platformas montāža
Apakšējās platformas montāža
Apakšējās platformas montāža
Apakšējās platformas montāža

Pirmā daļa, ko mēs izgatavosim, ir apakšējā platforma, kurā atradīsies mūsu Kinect, servo un visa mūsu elektronika. Lai izveidotu platformu, jums būs nepieciešams:

  • Plastmasas servēšanas paplāte
  • Servo
  • 4x #8-32 1/2 "skrūves ar uzgriežņiem
  • Dremel ar griešanas riteni
  • Skrūvgriezis
  • Urbis
  • 11/16 "urbis
  • Marķieris

Kā pagatavot

  1. Apgrieziet paplāti otrādi.
  2. Novietojiet servo uz sāniem netālu no paplātes aizmugures, pārliecinieties, ka servo izejas pārnesums atrodas gar teknes viduslīniju, pēc tam atzīmējiet ap servo pamatni.
  3. Izmantojot dremel un griešanas riteni, izgrieziet atzīmēto laukumu un pēc tam iebīdiet servo tā slotā.
  4. Uz paplātes atzīmējiet servo korpusa montāžas caurumu centrus, pēc tam noņemiet servo un izurbiet šos caurumus ar savu 11/16 collu urbi. Urbjot caurumus, ir ļoti viegli saplaisāt plānu plastmasu, tāpēc es uzskatu, ka tā ir daudz drošāka palaist urbi pretējā virzienā un lēnām izskalot materiālu. Tas ir daudz lēnāk nekā pareizi urbt urbumus, bet tas nodrošina, ka nav plaisu.
  5. Ievietojiet servo atpakaļ slotā, pēc tam piestipriniet to pie teknes ar skrūvēm #8-32 un uzgriežņiem.

4. solis: Galvas platformas montāža

Galvas platformas montāža
Galvas platformas montāža
Galvas platformas montāža
Galvas platformas montāža
Galvas platformas montāža
Galvas platformas montāža
Galvas platformas montāža
Galvas platformas montāža

Nākamā daļa, ko mēs izgatavosim, būs platforma, lai savienotu manekena galvu ar servo. Lai izveidotu galvas platformu, jums būs nepieciešams:

  • Plastmasas plāksne
  • Servo rags
  • 2x M3 8 mm skrūve ar paplāksnēm
  • Skrūvgriezis
  • Urbis
  • 7/64 "un 5/16" urbji
  • Kompass
  • Dremel ar griešanas riteni

Kā pagatavot

  1. Iestatiet kompasu manekena galvas pamatnes rādiusā.
  2. Izmantojiet kompasu, lai atzīmētu apli, kura centrā ir plāksnes centrs. Tas būs mūsu galvas platformas faktiskais izmērs.
  3. Izmantojiet savu dremel un griešanas riteni, lai no plāksnes izgrieztu mazāko platformu.
  4. Izurbiet jaunās platformas centru ar 5/16 collu urbi. Tādējādi mēs varēsim piekļūt skrūvei, kas piestiprina mūsu servo ragu pie mūsu servo. Lai platformai nodrošinātu stabilitāti, urbjot caurumu, es ievietoju spoli. vadu zem tā un izurbtu caur spoles centru.
  5. Izlīdziniet servo ragu ar platformas centru un atzīmējiet divus caurumus, lai piestiprinātu ragu pie platformas. Pārliecinieties, vai šie montāžas caurumi ir pietiekami tālu viens no otra, lai būtu vieta jūsu M3 skrūvju galviņām un paplāksnēm.
  6. Izurbiet šos marķētos caurumus ar 7/64 collu urbi.
  7. Mana servo raga apakšējais caurums bija gluds, t.i., tam nebija M3 skrūves vītņu. Tādējādi es izmantoju savu urbi un M3 krānu, lai izveidotu pavedienus.
  8. Izmantojiet skrūves un paplāksnes, lai piestiprinātu servo ragu pie galvas platformas.

5. solis: Servo barošanas kabelis

Servo barošanas kabelis
Servo barošanas kabelis
Servo barošanas kabelis
Servo barošanas kabelis
Servo barošanas kabelis
Servo barošanas kabelis
Servo barošanas kabelis
Servo barošanas kabelis

Analogajiem servos parasti tiek darbināts spriegums 4,8-6 V. Tā kā Raspberry Pi jau tiks darbināts ar 5 V spriegumu no USB, mēs vienkāršosim savu sistēmu, arī darbinot servo no USB. Lai to izdarītu, mums būs jāmaina USB kabelis. Lai izveidotu servo barošanas kabeli, jums būs nepieciešams:

  • Rezerves USB kabelis ar A tipa galu (tāds, kas pievienojams datoram)
  • Viens sarkans un viens melns džemperis
  • Lodāmurs
  • Lodēt
  • Stiepļu noņēmēji
  • Elektriskā lente
  • Palīdzīgas rokas (pēc izvēles)
  • Multimetrs (pēc izvēles)

Kā pagatavot

  1. Izgrieziet kabeli no A tipa USB savienotāja, kas nav USB, un pēc tam noņemiet nedaudz izolācijas, lai atklātu četrus iekšējos vadus. Nogrieziet ekranējumu, kas ieskauj atklātos vadus.
  2. Parasti USB kabelim būs četri vadi: divi datu pārraidei un uztveršanai un divi barošanai un zemei. Mūs interesē jauda un zeme, kas parasti ir attiecīgi sarkana un melna. Noņemiet sarkano un melno vadu daļu izolācijas un nogrieziet zaļo un balto vadu. Ja jūs uztraucaties, ka jums nav pareizie strāvas un zemējuma vadi, varat pievienot kabeli USB strāvas adapterim un pārbaudīt izejas spriegumu ar multimetru.
  3. Pēc tam nogrieziet sarkano un melno džemperu kabeļu vienu galu un noņemiet daļu izolācijas.
  4. Tagad savelciet kopā džempera atklātos melnos vadus un USB kabeļus. Šķērsojiet atklāto vadu centrus un pagrieziet tos viens pret otru. Pēc tam uz savienotajiem vadiem uzlieciet lodmetālu, lai tie turētos kopā. Palīdzīgas rokas to atvieglos, turot kabeļus vietā.
  5. Atkārtojiet 4. darbību sarkanajiem vadiem.
  6. Pārklājiet atklāto elektroinstalāciju ar elektrisko lenti vai termiski saraušanās cauruli, ja jūtaties izdomāti. Šie savienojumi būs trausli, jo vadi ir tik mazi, tāpēc USB kabeļa ārējai izolācijai pievienojiet otru lentes kārtu, kas satur džemperu kabeļus. Tas padarīs mezglu stingrāku un tādējādi mazāk salūzīs, jo saliekts.

6. solis: Elektronikas montāža

Elektronikas montāža
Elektronikas montāža
Elektronikas montāža
Elektronikas montāža
Elektronikas montāža
Elektronikas montāža

Visbeidzot, mēs visu apvienosim, uzstādot mūsu elektroniku un visu pārējo uz apakšējās platformas. Jums būs nepieciešams:

  • Apakšējā platforma
  • Galvas platforma
  • Manekena galva
  • Kinect ar USB+maiņstrāvas adapteri
  • USB strāvas adapteris
  • Pagarinātājs
  • Mikro USB kabelis
  • Servo barošanas kabelis
  • Raspberry Pi
  • Džemperis no vīrieša līdz sievietei
  • Līmējošā Velcro
  • Šķēres

Kā pagatavot

  1. Piestipriniet Pi pie paplātes apakšas ar Velcro.
  2. Pievienojiet USB strāvas adapteri ar Velcro.
  3. Pievienojiet servo un Pi USB strāvas adapterim.
  4. Pievienojiet Pi 12. tapu (GPIO18) pie servo signāla kabeļa. Tā ir sestā tapa uz leju labajā pusē.
  5. Izvelciet pagarinātāju caur paplātes aizmugurējo rokturi un pievienojiet USB strāvas adapteri vienā pusē.
  6. Paņemiet Kinect USB+maiņstrāvas adapteri un pievienojiet strāvas adapteri pagarinātāja otrā pusē un USB - Pi.
  7. Izvelciet Kinect vadu caur paplātes priekšējo rokturi un pievienojiet Kinect adapterim.
  8. Es izmantoju līmlenti, lai turētu kabeļus platformas apakšpusē. Tas neizskatās no elegantākajiem, bet par laimi tas viss ir paslēpts.
  9. Pagrieziet platformu ar labo pusi uz augšu un izmantojiet Velcro, lai Kinect uzstādītu platformas priekšpusē.
  10. Izmantojiet Velcro, lai piestiprinātu manekena galvu pie galvas platformas. Tomēr, kad viss ir sakārtots, atdaliet abus gabalus, lai mēs varētu piekļūt servo ragu stiprinājuma skrūvei. Tomēr vēl nepieskrūvējiet ragu pie servo, jo mums vispirms jāpārliecinās, ka servo ir tā centrālajā pozīcijā, lai mēs varētu visu sakārtot. Mēs to darīsim vēlāk.

7. solis: programmatūra un algoritms

Programmatūra un algoritms
Programmatūra un algoritms

Pārskats

Šī projekta programmatūra ir rakstīta C ++ valodā un ir integrēta ar robotu operētājsistēmu (ROS), kas ir sistēma robotikas programmatūras rakstīšanai. ROS sistēmā programmatūra ir sadalīta programmu kolekcijā, ko sauc par mezgliem, kur katrs mezgls ievieš noteiktu sistēmas funkcionalitātes apakšiedaļu. Dati tiek nodoti starp mezgliem, izmantojot publicēšanas/abonēšanas metodi, kur mezgli, kas ražo datus, tos publicē un mezgli, kas patērē datus, to abonē. Šādā veidā atdalot kodu, var viegli paplašināt sistēmas funkcionalitāti un ļaut koplietot mezglus starp sistēmām ātrākai attīstībai.

Šajā sistēmā ROS galvenokārt tiek izmantots, lai nošķirtu kodu, kas aprēķina skaņas avota ierašanās virzienu (DOA), no koda, kas kontrolē servo, ļaujot citiem projektiem iekļaut Kinect DOA novērtējumu, neiekļaujot servo kodu, kas viņiem, iespējams, nav vajadzīgs vai nav vajadzīgs. Ja vēlaties apskatīt pašu kodu, to var atrast vietnē GitHub:

github.com/raikaDial/kinect_doa

Kinect DOA mezgls

Kinect_doa mezgls ir šīs sistēmas gaļa un kauli, darot būtībā visu interesanto. Pēc palaišanas tas inicializē ROS mezglu, padarot iespējamu visu ROS burvību, pēc tam augšupielādē programmaparatūru Kinect, lai audio straumes kļūtu pieejamas. Pēc tam tas rada jaunu pavedienu, kas atver audio straumes un sāk lasīt mikrofona datus. Kinect paraugina savus četrus mikrofonus ar frekvenci 16 kHz katram, tāpēc ir labi, ja savstarpējā korelācija un datu vākšana notiek atsevišķos pavedienos, lai izvairītos no trūkstošiem datiem skaitļošanas slodzes dēļ. Saskarne ar Kinect tiek veikta, izmantojot populāro atvērtā koda draiveri libfreenect.

Savākšanas pavediens izpilda atzvanīšanas funkciju ikreiz, kad tiek saņemti jauni dati, un vienlaikus saglabā datus un nosaka, kad jānovērtē DOA. Katra mikrofona dati tiek glabāti ritošajos buferos, kuru garums ir vienāds ar mūsu paraugu ņemšanas logu, kas šeit ir 8192 paraugi. Tas nozīmē savstarpējās korelācijas aprēķināšanu ar aptuveni pēdējās pussekundes datiem, ko es atklāju, eksperimentējot, lai būtu labs līdzsvars starp veiktspēju un skaitļošanas slodzi. DOA novērtējums tiek aktivizēts katram 4096 paraugam, signalizējot par galveno pavedienu, lai secīgās savstarpējās korelācijas pārklājas par 50%. Apsveriet gadījumu, kad nav pārklāšanās, un jūs radāt ļoti ātru troksni, ko paraugu ņemšanas logs samazina uz pusi. Pirms un pēc jūsu raksturīgās skaņas, iespējams, būs balts troksnis, ko var būt grūti saskaņot ar savstarpējo korelāciju. Logi, kas pārklājas, sniedz mums pilnīgāku skaņas paraugu, palielinot savstarpējās korelācijas uzticamību, piešķirot mums atšķirīgākas iezīmes.

Galvenais pavediens gaida signālu no savākšanas pavediena, pēc tam aprēķina DOA novērtējumu. Pirmkārt, tā pārbauda, vai uzņemtās viļņu formas būtiski atšķiras no baltā trokšņa. Bez šīs pārbaudes mēs aprēķinātu savu aprēķinu četras reizes sekundē neatkarīgi no tā, vai bija interesanti trokšņi vai nē, un mūsu manekena galva būtu spastisks haoss. Šajā sistēmā izmantotais baltā trokšņa noteikšanas algoritms ir pirmais no diviem šeit uzskaitītajiem. Mēs aprēķinām mūsu viļņu formas atvasinājuma absolūtā integrāļa attiecību pret tā absolūto integrāli; signāliem ar augstu baltā trokšņa saturu šī attiecība ir augstāka nekā mazāk trokšņainiem signāliem. Nosakot slieksni šai attiecībai, atdalot troksni no trokšņa, mēs varam izraisīt savstarpēju korelāciju tikai tad, kad tas ir piemērots. Protams, šī attiecība ir jāpielāgo katru reizi, kad sistēma tiek pārvietota uz jaunu vidi.

Kad programma ir noteikusi, ka viļņu formas satur būtisku bez trokšņa saturu, programma turpina savstarpējās korelācijas. Tomēr šajos aprēķinos ir iekļautas trīs svarīgas optimizācijas:

  1. Kinect ir četri mikrofoni, kas nozīmē, ka kopā ir seši viļņu formu pāri, kurus mēs varam savstarpēji korelēt. Tomēr, ja paskatās uz mikrofonu masīva telpisko izvietojumu, var redzēt, ka 2., 3. un 4. mikrofons ir ļoti tuvu viens otram. Faktiski tie ir tik tuvu, ka skaņas ātruma un mūsu paraugu ņemšanas frekvences dēļ viļņu formas, kas saņemtas pie 2, 3 un 4, tiks atdalītas ne vairāk kā ar vienu paraugu priekšā vai aizmugurē, ko mēs varam pārbaudīt, aprēķinot maxlag = Δd *fs/vs, kur Δd ir mikrofonu pāra atdalīšana, fs ir paraugu ņemšanas biežums un vs ir skaņas ātrums. Tādējādi pāru korelācija starp šiem trim ir bezjēdzīga, un mums ir nepieciešams tikai savstarpēji korelēt mikrofonu 1 ar 2, 3 un 4.
  2. Ir zināms, ka audio signālu standarta savstarpējā korelācija slikti darbojas reverberāciju (atbalss) klātbūtnē. Spēcīga alternatīva ir pazīstama kā vispārināta savstarpēja korelācija ar fāzes transformāciju (GCC-PHAT). Šī metode ir tāda, ka tiek izmantota svēršanas funkcija, kas pastiprina krusteniskās korelācijas maksimumus, tādējādi atvieglojot sākotnējā signāla nošķiršanu no atbalss. Es salīdzināju GCC-PHAT veiktspēju ar vienkāršu savstarpēju korelāciju reverberācijas kamerā (lasiet: betona vannas istaba tiek pārveidota) un atklāju, ka GCC-PHAT ir 7 reizes efektīvāks, novērtējot pareizo leņķi.
  3. Veicot savstarpējo korelāciju, mēs ņemam abus signālus, slīdot pa otru un katrā solī katru fiksētā signāla punktu reizinot ar katru mūsu bīdāmā signāla punktu. Diviem signāliem, kuru garums ir n, tiek iegūti n^2 aprēķini. Mēs to varētu uzlabot, veicot krustenisko korelāciju frekvenču jomā, kas ietver ātru Furjē transformāciju (nlogn aprēķini), reizinot katru viena transformētā signāla punktu ar atbilstošo punktu otrā (n aprēķini), pēc tam veicot apgriezto Furjē transformācija, lai atgrieztos laika domēnā (nlogn aprēķini), kā rezultātā n+2*nlogn aprēķini ir mazāki par n^2. Tomēr šī ir naivā pieeja. Mūsu masīvā esošie mikrofoni ir tik tuvu viens otram, un skaņas ātrums ir tik salīdzinoši lēns, ka audio viļņu formas jau būs lielākoties izlīdzinātas. Tādējādi mēs varam veikt savstarpēju korelāciju, lai ņemtu vērā tikai kompensācijas, kas ir nedaudz priekšā vai aiz muguras. Mikrofoniem 1 un 4 kavējumam jābūt starp +/- 12 paraugiem, kas nozīmē, ka katrai savstarpējai korelācijai mums ir jāveic tikai 24*n aprēķini, kā rezultātā tiek ietaupīti skaitļi, ja mūsu viļņu formas ir garākas par 2900 paraugiem.

Šī sistēma izmanto minidsp bibliotēku, kas ar optimizāciju ievieš GCC-PHAT algoritmu 3.

Atrodot nobīdi signālos no katra mikrofona pāra, programma izvēlas kavēšanās vidējo vērtību, izmanto to aprēķinātā leņķa aprēķināšanai un publicē rezultātu, lai to varētu izmantot servo vadīšanai.

Servo vadības mezgls

Salīdzinot ar kinect_doa mezglu, servo mezgls ir salīdzinoši vienkāršs. Tās uzdevums ir tikai aprēķināt DOA un pārvietot servo šajā leņķī. Tā izmanto bibliotēku wiringPi, lai piekļūtu Raspberry Pi aparatūras PWM modulim, izmantojot to, lai iestatītu servo leņķi. Lielāko daļu analogo servo kontrolē PWM signāls ar impulsa platumu no 1000 µs līdz 2000 µs, kas atbilst leņķim no 0 ° līdz 180 °, bet manis izmantotais servo tika kontrolēts ar 500 µs līdz 2500 µs, kas atbilst leņķim no 0 ° līdz 270 °. Tādējādi mezgls ir konfigurējams dažādām servo aparatūrām, nosakot parametrus minimālajam impulsa platumam, maksimālajam impulsa platumam un atšķirībai starp maksimālo un minimālo leņķi. Turklāt servo nepārvietojas uzreiz uz mērķa leņķi, bet drīzāk virzās uz leņķi ar konfigurējamu ātrumu, dodot Margaretai pakāpeniskāku, rāpojošāku noskaņu (turklāt servo, kas ātri pārvietojas uz priekšu un atpakaļ, skaņa kļūst ļoti kaitinoša)).

8. darbība: izveidošana un uzstādīšana

Instalēt atkarības:

Vispirms instalējiet libfreenect. Mums tas ir jāveido no avota, jo versijā, ko varat iegūt ar pakotņu pārvaldnieku, nav iekļauts audio atbalsts. Tas ir tāpēc, ka mums ir jāaugšupielādē programmaparatūra Kinect, lai iespējotu audio, un šīs programmaparatūras pārdale dažās jurisdikcijās nav likumīga. Turklāt mēs varam izvairīties no tādu piemēru veidošanas, kuriem nepieciešama OpenGL un pārpilnība, kas nav nepieciešama Raspbian instalācijām bez galvas.

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

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

Tālāk mums jāinstalē pakete wiringPi, kas ļauj mums kontrolēt Pi GPIO tapas:

cd

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

Pievienojiet manekena galvu:

Kad ir instalēts wiringPi, mēs tagad varam ātri apbraukt aparatūru, lai piestiprinātu manekena galvu apakšējai platformai. Lai centrētu servo, izmantojot komandrindu, ievadiet šādas komandas:

gpio pwm-ms

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

Ja nav kustības, tad jūsu servo, iespējams, jau ir centrēts. Tomēr, lai pārliecinātos, jūs varat iestatīt servo vērtību, kas nav centrā, piem. gpio -g pwm 18 200, pēc tam iestatiet to atpakaļ uz 150.

Kad esat pārliecināts, ka servo ir centrēts, piestipriniet galvas platformas servo ragu pie servo tā, lai jūsu manekena galva skatītos taisni uz priekšu. Pēc tam pieskrūvējiet ragu pie servo un piestipriniet galvu caur Velcro uzgaļiem.

Instalējiet ROS:

Pēc tam instalējiet ROS savā Pi. Lielisku instalēšanas rokasgrāmatu var atrast šeit; mūsu sistēmai mums nav vajadzīgs OpenCV, tāpēc varat izlaist 3. darbību. Šīs būvēšanas pabeigšana prasīs vairākas stundas. Kad esat pabeidzis instalēšanas rokasgrāmatas ievērošanu, pievienojiet instalāciju savam bashrc, lai mēs varētu izmantot mūsu nesen instalētās ROS paketes:

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

Izveidojiet Kinect DOA paketi:

Kad viss ir paveikts, izveidojiet mūsu projektam darba vietu un ievadiet src direktoriju:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

Šī projekta kods ir ietverts pakotnē kinect_doa, tāpēc klonējiet to jaunās darbvietas src direktorijā:

git klons

Pakete robot_upstart nodrošina viegli lietojamu rīku palaišanas failu instalēšanai, lai tie darbotos startēšanas laikā, tāpēc arī klonējiet to savā darbvietā:

git klons

Tagad mēs varam izveidot projekta kodu, zvanot catkin_make no mūsu darbvietas augšējā līmeņa direktorija, pēc tam iegūstiet mūsu būvējumu, lai mūsu paketes būtu pieejamas:

cd ~/kinect_doa_ws

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

Skriešana un regulēšana:

Pieņemot, ka viss ir pievienots un ieslēgts, tagad jums vajadzētu būt iespējai palaist sistēmu un izmantot Kinect dziesmu, kuru jūs izrunājat! Tomēr, ja jums ir Kinect 1473, vispirms teksta redaktorā atveriet failu ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch un iestatiet parametru, izmantojot_kinect_1473 uz true. Turklāt, ja jūs izmantojāt citu servo, nekā es, iespējams, tas ir standarta analogs servo, tāpēc, atrodoties palaišanas failā, mainiet parametru min_us uz 1000, max_us uz 2000 un max_deg uz 180.

roslaunch kinect_doa kinect_doa.launch

Kādu laiku spēlējiet ar to. Ja uzskatāt, ka sistēma ir pārāk jutīga (skatoties nejaušos virzienos, kas neatbilst balsīm vai atšķirīgiem trokšņiem), mēģiniet palaišanas failā mainīt parametru white_noise_ratio un restartēt sistēmu, līdz reaģētspēja ir tādā līmenī, kāds jums patīk.. Palielinot koeficientu, sistēma reaģēs mazāk un otrādi. Jums, visticamāk, būs jāveic šī regulēšana ikreiz, kad pārvietojat sistēmu uz citu vietu, lai iegūtu vēlamo veiktspēju.

Lai palaistu programmu, ieslēdzot Pi, mēs izmantojam pakotni robot_upstart, lai instalētu palaišanas failu. Ja ROS pašlaik nedarbojas, sāciet to ar komandu roscore. Pēc tam atveriet jaunu termināli un instalējiet palaišanu, izmantojot:

rosrun robot_upstart instalēt kinect_doa/launch/kinect_doa.launch --lietotāja sakne --symlink

Mēs izveidojam simbolu uz palaišanas failu, nevis to kopējam, lai mēs varētu mainīt parametrus, rediģējot ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch.

9. darbība: paslēpiet to birojā

Slēpjot to birojā
Slēpjot to birojā

Tagad par jautro daļu. Dodies darbā pēc stundām un slepeni noliec manekenu. Tad vienkārši apsēdieties un paskatieties, cik ilgs laiks nepieciešams, lai jūsu kolēģi to panāktu! Jūs esat jauns radījums, kas garantēti pagriezīs dažas galvas…

Ieteicams: