Sisällysluettelo:

Äänen paikallistava mannekiinipää Kinectillä: 9 vaihetta (kuvilla)
Äänen paikallistava mannekiinipää Kinectillä: 9 vaihetta (kuvilla)

Video: Äänen paikallistava mannekiinipää Kinectillä: 9 vaihetta (kuvilla)

Video: Äänen paikallistava mannekiinipää Kinectillä: 9 vaihetta (kuvilla)
Video: Eksoten Ikäakatemia -webinaarin tallenne 2024, Heinäkuu
Anonim
Äänen paikallistava mannekiinipää Kinectin kanssa
Äänen paikallistava mannekiinipää Kinectin kanssa

Tapaa Margaret, testinukke kuljettajan väsymyksen seurantajärjestelmää varten. Hän jäi äskettäin eläkkeelle tehtävistään ja löysi tiensä toimistoomme, ja on sittemmin kiinnittänyt niiden huomion, jotka pitävät häntä "kammottavana". Oikeuden vuoksi olen antanut hänelle mahdollisuuden kohdata syyttäjänsä suoraan; sen sijaan, että näennäisesti seuraisi sinua sieluttomalla katseellaan, nyt hän todella tekee niin. Järjestelmä käyttää Microsoft Kinectin ja servon mikrofoniryhmää ohjaamaan häntä kohti ihmisiä, jotka puhuvat hänen lähellä.

Vaihe 1: Teoria

Teoria
Teoria

Kulman laskeminen

Kun kuulemme jotain, ellei tuo melu ole suoraan edessämme, se saavuttaa toisen korvansa ennen toista. Aivomme havaitsevat saapumisviiveen ja muuttavat sen yleiseksi suuntaan, josta melu tulee, jolloin voimme löytää lähteen. Voimme saavuttaa täsmälleen samanlaisen lokalisoinnin käyttämällä mikrofoniparia. Harkitse esitettyä kaaviota, joka sisältää mikrofoniparin ja äänilähteen. Jos katsomme ylhäältä alaspäin, ääni-aallot ovat pyöreitä, mutta jos etäisyys lähteeseen on suuri suhteessa mikrofonien väliseen etäisyyteen, niin anturimme näkökulmasta aalto on suunnilleen tasomainen. Tämä tunnetaan kaukokentän oletuksena ja yksinkertaistaa ongelmamme geometriaa.

Oletetaan siis, että aaltorintama on suora. Jos ääni tulee oikealta, se osuu mikrofoniin 2 hetkellä t2 ja mikrofoniin #1 aikaan t1. Mikrofonin #2 ja mikrofonin #1 välillä kulkeva ääni d on aikaero äänen havaitsemisessa kerrottuna äänen nopeudella v s:

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

Voimme yhdistää tämän etäisyyden etäisyyteen d 12 mikrofoniparin ja parin ja äänilähteen välisen kulman between välillä suhteella:

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

Koska meillä on vain kaksi mikrofonia, laskelmissamme on epäselvyyttä siitä, onko äänilähde edessämme vai takana. Tässä järjestelmässä oletamme, että äänilähde on parin edessä ja kiinnitä kulma 0 asteen välillä (täysin parin oikealla puolella) 180 asteeseen (täysin vasemmalle).

Lopuksi voimme ratkaista teetan ottamalla käänteisen kosinin:

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

Jotta kulmasta saataisiin hieman luonnollisempi, voimme vähentää teetasta 90 astetta niin, että 0 astetta on suoraan parin edessä ja +/- 90 astetta täysin vasemmalla tai oikealla. Tämä muuttaa ilmaisumme käänteisestä kosinista käänteiseksi siniksi.

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

Viiveen löytäminen

Kuten yllä olevasta yhtälöstä näet, kulmaan meidän on ratkaistava vain mikrofoniin 1 saapuvan ääniaallon viive verrattuna mikrofoniin kaksi; äänen nopeus ja mikrofonien välinen etäisyys ovat sekä kiinteitä että tunnettuja. Tätä varten otamme ensin näytteitä audiosignaaleista taajuudella fs, muuntamalla ne analogisista digitaalisiin ja tallentamalla tiedot myöhempää käyttöä varten. Otamme näytteitä ajanjaksona, joka tunnetaan nimellä näytteenottoikkuna, joka on riittävän pitkä ääniaaltojemme erottuvien piirteiden kuvaamiseen. Ikkunamme voi esimerkiksi olla viimeisen puolen sekunnin arvoinen äänidata.

Kun olemme saaneet ikkunatut audiosignaalit, löydämme näiden kahden välisen viiveen laskemalla niiden ristikorrelaation. Ristikorrelaation laskemiseksi pidämme yhden mikrofonin ikkunattua signaalia kiinteänä ja liu'utamme toisen signaalin aika-akselia pitkin aina ensimmäisen taakse asti aina ensimmäisen eteen. Jokaisessa vaiheessa diaa kerrotaan jokainen piste kiinteässä signaalissamme sen vastaavalla pisteellä liukumissignaalissamme ja lasketaan sitten yhteen kaikki tulokset, jotta lasketaan korrelaatiokerroin kyseistä vaihetta varten. Kun dia on valmis, vaihe, jolla on korkein korrelaatiokerroin, vastaa pistettä, jossa kaksi signaalia ovat eniten samankaltaisia, ja missä vaiheessa olemme, kertoo kuinka monta näytettä n signaali kaksi on siirtynyt signaalista 1. Jos n on negatiivinen, sitten signaali kaksi on jäljessä signaalista yksi, jos se on positiivinen, signaali kaksi on edessä, ja jos se on nolla, kaksi on jo kohdistettu. Muunnamme tämän näytteen siirtymän aikaviiveeksi käyttämällä näytteenottotaajuuttamme suhteella Δt = n/fs, joten:

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

Vaihe 2: Komponentit

Osat

  • Microsoft Kinect Xbox 360: lle, malli 1414 tai 1473. Kinectissä on neljä mikrofonia, jotka on järjestetty lineaariseen taulukkoon.
  • Sovitin, jolla Kinectin oma liitin voidaan muuntaa tämän kaltaiseksi USB + verkkovirtaksi.
  • Raspberry Pi 2 tai 3 käynnissä Raspbian Stretch. Yritin alun perin käyttää Pi 1 -mallia B+, mutta se ei ollut tarpeeksi tehokas. Minulla oli jatkuvasti ongelmia yhteyden katkaisemisessa Kinectistä.
  • Kammottavin mallinuken pää, jonka löydät
  • Analoginen servo, joka on riittävän vahva kääntämään nuken päätä
  • 5 V: n USB -seinälaturi, jolla on riittävästi virtaa sekä Pi: lle että servolle ja vähintään kahdelle portille. (Käytin samanlaista 5A 3-porttista pistoketta
  • Jatkojohto, jossa on kaksi pistorasiaa (toinen USB -seinälaturille ja toinen Kinect -verkkolaitteelle.
  • Kaksi USB-kaapelia: A-tyypin mikro-USB-kaapeli Pi-virtalähteelle ja toinen servolle, jota ei haittaa katkaista
  • Taso kaikelle istua ja toinen pienempi taso mallinuken päähän. Käytin pohjana muovista tarjoilualustaa ja päälavalla muovilevyä. Molemmat olivat Walmartilta ja maksoivat vain muutaman dollarin
  • 4x #8-32 1/2 "pultit ja mutterit servosi kiinnittämiseksi suuremmalle alustalle
  • 2x 8 mm: n M3 -pultti aluslevyineen (tai minkä kokoisia tahansa tarvitset servosarven kiinnittämiseen pienempään alustaan)
  • Kaksi uros-uros-hyppyjohtoa, yksi punainen ja yksi musta, ja yksi naaras-uros-hyppyjohdin
  • Tarrakiinnitteiset tarraliuskat
  • Sähköteippi
  • Kanavanauha kaapelinhallintaan

Työkalut

  • Dremel leikkuupyörällä
  • Porata
  • 7/64 ", 11/16" ja 5/16 "poranterät
  • M3 -napautus (valinnainen, servosarvesta riippuen)
  • Ruuvimeisseli
  • Juotosrauta juotoksella
  • Avustavat kädet (valinnainen)
  • Merkki
  • Kompassi
  • Langanpoistimet
  • Yleismittari (valinnainen)

Henkilönsuojaimet

  • Suojalasit

  • Kasvonaamio (dremmel-ed muovipalloille).

Vaihe 3: Laske työkori

Alalavan kokoonpano
Alalavan kokoonpano
Alalavan kokoonpano
Alalavan kokoonpano
Alalavan kokoonpano
Alalavan kokoonpano

Ensimmäinen osa, jonka teemme, on alempi alusta, joka pitää Kinectin, servomme ja kaiken elektroniikkamme. Alustan tekemiseen tarvitset:

  • Muovinen tarjoilualusta
  • Servo
  • 4x #8-32 1/2 "pulttia muttereilla
  • Dremel leikkuupyörällä
  • Ruuvimeisseli
  • Porata
  • 11/16 "poranterä
  • Merkki

Kuinka tehdään

  1. Käännä lokero ylösalaisin.
  2. Aseta servosi sivulle lähelle lokeron takaosaa, varmista, että servon lähtövaihde on lokeron keskiviivaa pitkin, ja merkitse sitten servon pohjan ympärille.
  3. Leikkaa merkitsemäsi alue dremelillä ja leikkuupyörällä ja liu'uta sitten servo paikalleen.
  4. Merkitse servokotelon kiinnitysreikien keskikohdat lokeroon, poista sitten servo ja poraa nämä reiät 11/16 "poranterälläsi. Tällaista ohutta muovia on erittäin helppo murtaa porattaessa reikiä, joten minusta se on paljon turvallisempaa ajaa poraa taaksepäin ja hioa materiaali hitaasti pois.
  5. Aseta servosi takaisin paikkaan ja kiinnitä se sitten lokeroon ruuveilla #8-32.

Vaihe 4: Päälavan kokoonpano

Päälavan kokoonpano
Päälavan kokoonpano
Päälavan kokoonpano
Päälavan kokoonpano
Päälavan kokoonpano
Päälavan kokoonpano
Päälavan kokoonpano
Päälavan kokoonpano

Seuraava osa, jonka teemme, on alusta, jolla mannekeenipää voidaan yhdistää servoon. Päälavan valmistamiseen tarvitset:

  • Muovilevy
  • Servosarvi
  • 2x M3 8 mm pultti aluslevyineen
  • Ruuvimeisseli
  • Porata
  • 7/64 "ja 5/16" poranterät
  • Kompassi
  • Dremel leikkuupyörällä

Kuinka tehdään

  1. Aseta kompassi mannekeenipään pohjan säteelle.
  2. Merkitse kompassin avulla ympyrä, joka on keskitetty levyn keskelle. Tämä on päälavan todellinen koko.
  3. Käytä dremeliäsi ja leikkuupyörääsi pienemmän tason leikkaamiseen levystä.
  4. Poraa uuden alustasi keskikohta 5/16 "poranterällä. Näin pääsemme käsiksi ruuviin, joka kiinnittää servosarven servollemme. Antaaksemme korin vakauden poraaessani reikää, laitoin puolan lanka sen alle ja porattu kelan keskikohdan läpi.
  5. Kohdista servosarvi korin keskikohtaan ja merkitse kaksi reikää torven kiinnittämiseksi koriin. Varmista, että nämä kiinnitysreiät ovat riittävän kaukana toisistaan, joten M3 -pulttipäille ja aluslevyille on tilaa.
  6. Poraa nämä merkityt reiät 7/64 "poranterällä.
  7. Servosarven alareikä oli sileä, eli siinä ei ollut M3 -pultin kierteitä. Niinpä käytin poraa ja M3 -hanaa lankojen tekemiseen.
  8. Kiinnitä servosarvi ruuveilla ja aluslevyillä päälavalle.

Vaihe 5: Servovirtakaapeli

Servo virtajohto
Servo virtajohto
Servo virtajohto
Servo virtajohto
Servo virtajohto
Servo virtajohto
Servo virtajohto
Servo virtajohto

Analogiset servot saavat tyypillisesti 4.8-6V jännitteen. Koska Raspberry Pi saa jo 5 V: n virran USB: stä, yksinkertaistamme järjestelmäämme myös syöttämällä servon USB: stä. Tätä varten meidän on muutettava USB -kaapelia. Servovirtakaapelin valmistamiseen tarvitset:

  • Vara-USB-kaapeli, jossa on A-tyypin pää (sellainen, joka kytketään tietokoneeseen)
  • Yksi punainen ja yksi musta hyppyjohdin
  • Juotin
  • Juottaa
  • Langanpoistimet
  • Sähköteippi
  • Avustavat kädet (valinnainen)
  • Yleismittari (valinnainen)

Kuinka tehdään

  1. Katkaise A-tyypin muu kuin USB-liitin kaapelista ja irrota sitten eriste, jotta näet neljä sisäjohtoa. Katkaise paljaita johtoja ympäröivä suoja.
  2. Tyypillisesti USB -kaapelissa on neljä johtoa: kaksi tiedonsiirtoa ja vastaanottoa varten ja kaksi virtaa ja maadoitusta varten. Olemme kiinnostuneita tehosta ja maasta, jotka ovat yleensä punaisia ja mustia. Irrota eriste punaisista ja mustista johtimista ja katkaise vihreä ja valkoinen johto. Jos olet huolissasi siitä, että sinulla ei ole oikeita virta- ja maadoitusjohtoja, voit liittää kaapelin USB -virtalähteeseesi ja tarkistaa lähtöjännitteen yleismittarilla.
  3. Katkaise sitten toinen pää punaisista ja mustista hyppyjohdoista ja irrota osa eristyksestä.
  4. Kierrä nyt yhteen hyppääjän ja USB -kaapelien paljaat mustat johdot. Ylitä paljaiden johtimien keskikohdat ja kierrä ne toistensa ympärille. Levitä sitten juotosta liitettyihin lankoihin pitämään ne yhdessä. Helpottavat kädet helpottavat tätä pitämällä kaapelit paikallaan.
  5. Toista vaihe 4 punaisille johtimille.
  6. Peitä paljaat johdot sähköteipillä tai kutisteputkella, jos sinusta tuntuu hienolta. Nämä liitokset ovat hauraita, koska johdot ovat niin pieniä, joten lisää toinen kerros teippiä, joka pitää hyppyjohdot USB -kaapelin ulkoeristykseen. Tämä tekee kokoonpanosta jäykemmän ja siten vähemmän todennäköisesti rikkoutuvan taipumasta.

Vaihe 6: Elektroniikan asennus

Elektroniikan asennus
Elektroniikan asennus
Elektroniikan asennus
Elektroniikan asennus
Elektroniikan asennus
Elektroniikan asennus

Lopuksi kokoamme kaiken yhteen, asennamme elektroniikkamme ja kaiken muun alemmalle alustalle. Tarvitset:

  • Alempi lava
  • Päälava
  • Nuken pää
  • Kinect USB+verkkolaitteella
  • USB -virtalähde
  • Jatkojohto
  • Micro -USB -kaapeli
  • Servo virtajohto
  • Raspberry Pi
  • Uros-naarasliitinkaapeli
  • Liima Velcro
  • Sakset

Kuinka tehdään

  1. Kiinnitä Pi tarjotimen avulla lokeron pohjaan.
  2. Kiinnitä USB -virtalähde tarranauhalla.
  3. Liitä servo ja Pi USB -virtalähteeseen.
  4. Liitä Pi: n nasta 12 (GPIO18) servon signaalikaapeliin. Se on kuudes nasta oikealla.
  5. Kääri jatkojohto lokeron takakahvan läpi ja kytke USB -virtalähde toiselle puolelle.
  6. Ota Kinect USB+-virtasovitin ja kytke verkkolaite jatkojohdon toiselle puolelle ja USB Pi: lle.
  7. Kääri Kinectin johto lokeron etukahvan läpi ja kytke Kinect -sovitin.
  8. Käytin teippiä pitämään kaapelit korin alapuolelle. Tämä ei näytä tyylikkäimmältä, mutta onneksi kaikki tämä on piilotettu.
  9. Käännä taso oikealle ylöspäin ja kiinnitä Kinect tarranauhalla korin etuosaan.
  10. Kiinnitä mannekeenipää päälavalle tarranauhalla. Kun kaikki on kuitenkin järjestetty, erota kaksi osaa, jotta voimme käyttää servosarven kiinnitysruuvia. Älä kuitenkaan ruuvaa sarvea servoon vielä, koska meidän on varmistettava, että servo on ensin keskiasennossaan, jotta voimme järjestää kaiken. Teemme tämän myöhemmin.

Vaihe 7: Ohjelmisto ja algoritmi

Ohjelmisto ja algoritmi
Ohjelmisto ja algoritmi

Yleiskatsaus

Tämän projektin ohjelmisto on kirjoitettu C ++ - kielellä ja se on integroitu robottikäyttöjärjestelmään (ROS), joka on kehys robotiikkaohjelmistojen kirjoittamiseen. ROS -järjestelmässä järjestelmän ohjelmisto on jaettu solmukohtaiseksi ohjelmakokoelmaksi, jossa jokainen solmu toteuttaa järjestelmän toiminnallisuuden tietyn alajakson. Tiedot välitetään solmujen välillä julkaisu/tilaus -menetelmällä, jossa dataa tuottavat solmut julkaisevat sen ja tietoja kuluttavat solmut tilaavat sen. Koodin irrottaminen tällä tavalla mahdollistaa järjestelmän toimintojen helpon laajentamisen ja solmujen jakamisen järjestelmien välillä nopeamman kehityksen vuoksi.

Tässä järjestelmässä ROS: ää käytetään ensisijaisesti erottamaan äänilähteen saapumissuunnan (DOA) laskeva koodi servoa ohjaavasta koodista, jolloin muut projektit voivat sisällyttää Kinect DOA -arvioinnin ilman servokoodia, jota he eivät ehkä tarvitse tai tarvitse. Jos haluat tarkastella itse koodia, se löytyy GitHubista:

github.com/raikaDial/kinect_doa

Kinect DOA -solmu

Kinect_doa -solmu on tämän järjestelmän liha ja luut, ja se tekee periaatteessa kaiken mielenkiintoisen. Käynnistyksen yhteydessä se alustaa ROS -solmun, jolloin kaikki ROS -taikuudet ovat mahdollisia, ja lataa sitten laiteohjelmiston Kinectiin niin, että äänivirrat tulevat saataville. Sen jälkeen syntyy uusi säie, joka avaa äänivirrat ja alkaa lukea mikrofonitietoja. Kinect ottaa näytteitä neljästä mikrofonistaan kumpikin 16 kHz: n taajuudella, joten on hyvä, että ristikorrelaatio ja tiedonkeruu on erillisissä säikeissä, jotta vältetään laskennallisen kuormituksen aiheuttamat tiedot. Liitäntä Kinectiin tapahtuu käyttämällä libfreenectia, suosittua avoimen lähdekoodin ohjainta.

Keräyslanka suorittaa takaisinsoittotoiminnon aina, kun uutta dataa vastaanotetaan, ja molemmat tallentaa tiedot ja määrittää, milloin DOA arvioidaan. Kunkin mikrofonin tiedot tallennetaan vierintäpuskureihin, jotka ovat yhtä pitkiä kuin näytteenottoikkunamme, joka on 8192 näytettä. Tämä tarkoittaa ristikorrelaation laskemista noin viimeisen puolen sekunnin datan kanssa, minkä löysin kokeilemalla hyväksi tasapainoksi suorituskyvyn ja laskennallisen kuormituksen välillä. DOA-arvio laukaistaan jokaisesta 4096 näytteestä signaloimalla päälanka, joten peräkkäiset ristikorrelaatiot ovat 50%päällekkäisiä. Harkitse tapausta, jossa ei ole päällekkäisyyttä ja saat erittäin nopean melun, joka puolittuu näytteenottoikkunan kautta. Ennen ja jälkeen erottuva ääni on todennäköisesti valkoista kohinaa, jota voi olla vaikea yhdistää ristikorrelaatioon. Päällekkäiset ikkunat tarjoavat meille täydellisemmän näytteen äänestä, mikä lisää ristikorrelaation luotettavuutta antamalla meille selkeämpiä ominaisuuksia riviin.

Päälanka odottaa signaalia keräyslangasta ja laskee sitten DOA -estimaatin. Ensin se kuitenkin tarkistaa, eroavatko kaapatut aaltomuodot merkittävästi valkoisesta kohinasta vai eivät. Ilman tätä tarkistusta laskettaisiin arviomme neljä kertaa sekunnissa riippumatta siitä, kuului mielenkiintoisia ääniä vai ei, ja mallinuken pää olisi spastinen sotku. Tässä järjestelmässä käytetty valkoisen kohinan tunnistusalgoritmi on ensimmäinen kahdesta tässä luetellusta. Laskemme aaltomuodomme derivaatan absoluuttisen integraalin ja sen absoluuttisen integraalin suhteen; signaaleissa, joissa on korkea valkoista kohinaa, tämä suhde on suurempi kuin vähemmän meluisissa signaaleissa. Asettamalla kynnys tälle suhteelle erottaakseen melun ei-kohinasta voimme käynnistää ristikorrelaation vain tarvittaessa. Tämä suhde on tietysti jotain, joka on säädettävä uudelleen aina, kun järjestelmä siirretään uuteen ympäristöön.

Kun ohjelma on määrittänyt, että aaltomuodot sisältävät merkittävää kohinaa sisältämätöntä sisältöä, se jatkaa ristikorrelaatioita. Näihin laskelmiin on kuitenkin sisällytetty kolme tärkeää optimointia:

  1. Kinectissä on neljä mikrofonia, mikä tarkoittaa, että aaltomuotoja on yhteensä kuusi paria, jotka voimme ristikorreloida. Kuitenkin, jos tarkastelet mikrofoniryhmän tilajärjestelyä, huomaat, että mikrofonit 2, 3 ja 4 ovat hyvin lähellä toisiaan. Itse asiassa ne ovat niin lähellä, että äänen nopeuden ja näytteenottotaajuutemme vuoksi kohdissa 2, 3 ja 4 vastaanotetut aaltomuodot erotetaan enintään yhdellä näytteellä edessä tai takana, minkä voimme tarkistaa laskennalla maxlag = Δd *fs/vs, jossa Δd on mikrofoniparin erotus, fs on näytteenottotaajuus ja vs on äänen nopeus. Näin ollen parien korrelaatio näiden kolmen välillä on hyödytöntä, ja meidän on vain korreloitava mikrofoni 1 ja 2, 3 ja 4.
  2. Äänisignaalien tavanomaisen ristikorrelaation tiedetään toimivan huonosti jälkikaiun (echos) läsnä ollessa. Vankka vaihtoehto tunnetaan yleisenä ristikorrelaationa vaihemuunnoksen kanssa (GCC-PHAT). Tämä menetelmä perustuu painotusfunktion käyttöön, joka vahvistaa ristikorrelaation huippuja, mikä helpottaa alkuperäisen signaalin erottamista kaikuista. Vertasin GCC-PHAT: n suorituskykyä yksinkertaiseen ristikorrelaatioon jälkikaiuntakammiossa (lue: betoninen kylpyhuone uusitaan) ja huomasin, että GCC-PHAT on 7 kertaa tehokkaampi oikean kulman arvioinnissa.
  3. Kun suoritamme ristikorrelaatiota, otamme kaksi signaalia liukumalla toisiaan pitkin ja kussakin vaiheessa kertomalla kiinteän signaalimme jokaisen pisteen liukusignaalimme jokaisella pisteellä. Kahdelle signaalille, joiden pituus on n, tämä johtaa n^2 laskutoimitukseen. Voisimme parantaa tätä suorittamalla ristikorrelaation sen sijaan taajuusalueella, johon liittyy nopea Fourier-muunnos (nlogn-laskelmat), kertomalla jokaisen muunnetun signaalin piste toisen vastaavalla pisteellä (n laskentaa) ja suorittamalla sitten käänteinen Fourier -muunnos palatakseen aika -alueeseen (nlogn -laskelmat), jolloin tuloksena on n+2*nlogn -laskelmia, alle n^2. Tämä on kuitenkin naiivi lähestymistapa. Järjestelmämme mikrofonit ovat niin lähellä toisiaan ja äänen nopeus on niin suhteellisen hidas, että äänen aaltomuodot ovat jo enimmäkseen linjassa. Näin ollen voimme korrelaatiomme ottaa huomioon vain hieman eteenpäin tai taakse jäävät siirtymät. Mikrofonien 1 ja 4 osalta viiveen on oltava +/- 12 näytettä, mikä tarkoittaa, että jokaiselle ristikorrelaatiolle meidän on suoritettava vain 24*n laskutoimitus, mikä johtaa laskennallisiin säästöihin, kun aaltomuotomme ovat pidempiä kuin 2900 näytettä.

Tämä järjestelmä hyödyntää minidsp-kirjastoa, joka toteuttaa GCC-PHAT-algoritmin optimoinnilla 3.

Kun jokaisen mikrofoniparin signaalien viive on löydetty, ohjelma valitsee viiveen mediaani -arvon, laskee sen arvioidun kulman ja julkaisee tuloksen, jotta sitä voidaan käyttää servon ohjaamiseen.

Servon ohjaussolmu

Verrattuna kinect_doa -solmuun servosolmu on suhteellisen yksinkertainen. Sen tehtävänä on ottaa vain arvioitu DOA ja siirtää servo tähän kulmaan. Se käyttää wiringPi -kirjastoa päästäkseen Raspberry Pi -laitteiston PWM -moduuliin ja säätää sen avulla servon kulman. Useimpia analogisia servoja ohjataan PWM -signaalilla, jonka pulssin leveys vaihtelee 1000 µs - 2000 µs, mikä vastaa 0 ° - 180 ° kulmaa, mutta käyttämääni servoa hallittiin 500 µs - 2500 µs, mikä vastaa kulmaa 0 ° - 270 °. Siten solmu voidaan konfiguroida eri servo -laitteistoille asettamalla parametrit pienimmälle pulssileveydelle, maksimipulssileveydelle ja suurimman ja pienimmän kulman erotukselle. Lisäksi servo ei siirry heti kohdekulmaan, vaan pikemminkin kulmaa kohti määritettävissä olevalla nopeudella, mikä antaa Margaretille asteittaisen, kammottavan tunnelman (ja lisäksi edestakaisin nopeasti liikkuvan servon ääni ärsyttää todella nopeasti).

Vaihe 8: Rakenna ja asenna

Asenna riippuvuudet:

Asenna ensin libfreenect. Meidän on rakennettava se lähteestä, koska paketinhallinnan kanssa saatavana oleva versio ei tue ääntä. Tämä johtuu siitä, että meidän on ladattava laiteohjelmisto Kinectiin äänen ottamiseksi käyttöön, eikä tämän laiteohjelmiston uudelleenjakelu ole laillista tietyillä lainkäyttöalueilla. Lisäksi voimme välttää sellaisten esimerkkien rakentamisen, jotka vaativat OpenGL: ää ja glutia, jotka ovat tarpeettomia päätön Raspbian -asennuksissa.

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

cd git klooni 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 ~/libfreenekt ct/platform/.rules /etc/udev/rules.d udevadm control-lataussäännöt && udevadm trigger

Seuraavaksi meidän on asennettava wiringPi -paketti, jonka avulla voimme hallita Pi: n GPIO -nastoja:

CD

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

Kiinnitä mannekiinin pää:

Kun wiringPi on asennettu, voimme nyt ottaa nopean kiertotien takaisin laitteistoalueelle kiinnittääksesi mannekeenin pään alemmalle tasolle. Jos haluat keskittää servon komentorivin kautta, anna seuraavat komennot:

gpio pwm-ms

gpio pwmc 192 gpio pwmr 2000 gpio -g pwm 18150

Jos liikettä ei tapahdu, servosi on todennäköisesti jo keskitetty. Varmuuden vuoksi voit kuitenkin asettaa servon keskipisteen ulkopuolelle, esim. gpio -g pwm 18200, aseta se sitten takaisin 150: een.

Kun olet varma, että servo on keskitetty, kiinnitä päälavan servosarvi servoon niin, että nuken pääsi katsoo suoraan eteenpäin. Kierrä sitten torvi servoon ja kiinnitä pääsi tarranauhoilla.

Asenna ROS:

Asenna seuraavaksi ROS Pi -laitteeseesi. Loistava asennusopas löytyy täältä; järjestelmässämme emme tarvitse OpenCV: tä, joten voit ohittaa vaiheen 3. Tämän koonti kestää useita tunteja. Kun olet lopettanut asennusoppaan noudattamisen, lisää sen hankinta bashrcisi, jotta voimme käyttää juuri asennettuja ROS -paketteja:

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

Rakenna Kinect DOA -paketti:

Kun kaikki on tehty, tee projektillemme catkin -työtila ja kirjoita src -hakemisto:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

Tämän projektin koodi on kinect_doa -paketissa, joten kloonaa se uuden työtilan src -hakemistoon:

git -klooni

Robot_upstart -paketti tarjoaa helppokäyttöisen työkalun käynnistystiedostojen asentamiseen niin, että ne toimivat käynnistyksen yhteydessä, joten myös kloonaa tämä työtilaasi:

git -klooni

Nyt voimme rakentaa projektikoodin soittamalla catkin_make työtilamme ylätason hakemistosta ja sitten hankkia rakenteen, jotta paketit ovat saatavilla:

cd ~/kinect_doa_ws

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

Juoksu ja viritys:

Olettaen, että kaikki on kytketty ja kytketty päälle, sinun pitäisi nyt pystyä käynnistämään järjestelmä ja saamaan äänesi Kinect -radalle! Jos sinulla on kuitenkin Kinect 1473, avaa ensin tiedosto ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch tekstieditorissa ja aseta parametrin_kinect_1473 arvoksi true. Lisäksi jos käytit erilaista servoa kuin minä, se on luultavasti tavallinen analoginen servo, joten vaihda käynnistystiedostossa parametri min_us arvoon 1000, max_us arvoon 2000 ja max_deg arvoon 180.

roslaunch kinect_doa kinect_doa.launch

Pelaa sen kanssa jonkin aikaa. Jos sinusta tuntuu, että järjestelmä on liian herkkä (etsitään satunnaisiin suuntiin, jotka eivät vastaa ääniä tai erityisiä ääniä), kokeile muuttaa käynnistystiedoston white_noise_ratio -parametria ja käynnistää järjestelmä uudelleen, kunnes reagointitaso on sinulle sopivalla tasolla. Suhteen nostaminen heikentää järjestelmän reagointikykyä ja päinvastoin. Sinun on todennäköisesti suoritettava tämä viritys aina, kun siirrät järjestelmän toiseen paikkaan saadaksesi haluamasi suorituskyvyn.

Käynnistääksemme ohjelman, kun käynnistämme Pi: n, asennamme käynnistystiedoston robot_upstart -paketin avulla. Jos ROS ei ole käynnissä, aloita se komennolla roscore. Avaa sitten uusi terminaali ja asenna lanseeraus:

rosrun robot_upstart install kinect_doa/launch/kinect_doa.launch --käyttäjän juuri --symlink

Luomme symbolin linkin käynnistystiedostoon sen kopioinnin sijaan, jotta voimme muuttaa parametreja muokkaamalla ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch.

Vaihe 9: Piilottaminen toimistolla

Piilottaminen toimistolla
Piilottaminen toimistolla

Nyt hauska osa. Mene töihin tuntien jälkeen ja aseta nukke pääsi salaa. Sitten vain istu alas ja katso kuinka kauan kestää, että työtoverisi saavat kiinni! Uusi luomuksesi kääntää varmasti muutaman pään…

Suositeltava: