Tartalomjegyzék:

Hang lokalizáló manökenfej Kinect -el: 9 lépés (képekkel)
Hang lokalizáló manökenfej Kinect -el: 9 lépés (képekkel)

Videó: Hang lokalizáló manökenfej Kinect -el: 9 lépés (képekkel)

Videó: Hang lokalizáló manökenfej Kinect -el: 9 lépés (képekkel)
Videó: Hang Massive - Once Again - 2011 ( hang drum duo ) ( HD ) 2024, November
Anonim
Hang lokalizáló manökenfej Kinect -el
Hang lokalizáló manökenfej Kinect -el

Ismerje meg Margaretet, a vezető fáradtságfigyelő rendszer tesztelő próbabábuját. Nemrég visszavonult feladataitól, és megtalálta az irodánkhoz vezető utat, és azóta felhívta azok figyelmét, akik szerint „hátborzongató”. Az igazságosság érdekében megadtam neki a képességet, hogy szembenézzen vádlóival; ahelyett, hogy látszólag követné őt lelketlen tekintetével, most valóban ezt teszi. A rendszer egy Microsoft Kinect és egy szervó mikrofon tömbjét használja, hogy a közelében beszélő emberek irányába terelje.

1. lépés: Elmélet

Elmélet
Elmélet

A szög kiszámítása

Ha hallunk valamit, hacsak nem ez a zaj közvetlenül előttünk van, az egyik fülét eléri a másik előtt. Agyunk észleli ezt a késleltetést, és azt általános irányba alakítja át, amelyből a zaj érkezik, lehetővé téve a forrás megtalálását. Pontosan hasonló típusú lokalizációt érhetünk el egy mikrofonpár segítségével. Tekintsük az ábrát, amely mikrofonpárt és hangforrást tartalmaz. Ha felülről lefelé nézünk, a hanghullámok kör alakúak, de ha a mikrofontól való távolsághoz képest nagy a távolság a forrástól, akkor érzékelőink szempontjából a hullám megközelítőleg sík. Ezt távoli mező feltételezésnek nevezzük, és leegyszerűsíti problémánk geometriáját.

Tehát tegyük fel, hogy a hullámfront egyenes. Ha a hang jobbról érkezik, akkor a t2 időpontban a 2. számú mikrofont és a t1 időpontban az 1. számú mikrofont fogja elérni. Az a távolság, amelyet a hang a 2. ütő mikrofon és az 1. mikrofon között megtett, az időkülönbség a hang észlelésében megszorozva a v s hangsebességgel:

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

Ezt a távolságot a mikrofonpár és a páros és a hangforrás közötti θ szög közötti d 12 távolsághoz kapcsolhatjuk a következő összefüggéssel:

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

Mivel csak két mikrofonunk van, a számításunkban nem lesz egyértelmű, hogy a hangforrás előttünk vagy mögöttünk van -e. Ebben a rendszerben feltételezzük, hogy a hangforrás a pár előtt van, és rögzítjük a 0 fok (teljesen a párostól jobbra) és a 180 fok (teljesen balra) közötti szöget.

Végül a théta számára megoldhatjuk az inverz koszinusz felvételével:

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

Ahhoz, hogy a szög egy kicsit természetesebb legyen, kivonhatunk 90 fokot a thétából, úgy, hogy 0 fok közvetlenül a pár előtt van, és +/- 90 fok teljes balra vagy teljesen jobbra. Ez fordítja kifejezésünket az inverz koszinuszról az inverz szinuszra.

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

A késés megtalálása

Amint a fenti egyenletből látható, a szög szempontjából csak annyit kell megoldanunk, hogy az első mikrofonhoz érkező hanghullám késése a második mikrofonhoz képest; a hangsebesség és a mikrofonok közötti távolság rögzített és ismert. Ennek érdekében először mintát veszünk az audio jelekből az fs frekvencián, átalakítjuk őket analógról digitálisra, és tároljuk az adatokat későbbi használatra. Mintavételi ablakként ismert időtartamra mintavételezünk, amely elég hosszú ideig tart ahhoz, hogy rögzítse hanghullámunk megkülönböztethető tulajdonságait. Például ablakunk lehet az utolsó fél másodperc audioadata.

Az ablakos audiojelek beszerzése után a kettő közötti késleltetést keresztkorrelációjuk kiszámításával találjuk meg. A keresztkorreláció kiszámításához rögzítjük az egyik mikrofon ablakos jelét, és a második jelet az időtengely mentén csúsztatjuk az első mögül egészen az első előtt. A dián lévő minden lépésnél megszorozzuk a rögzített jel minden pontját a csúszójel megfelelő pontjával, majd összesítjük az összes eredményt, hogy kiszámítsuk az adott lépésre vonatkozó korrelációs együtthatónkat. Miután befejeztük a diánkat, a legmagasabb korrelációs együtthatóval rendelkező lépés megfelel annak a pontnak, ahol a két jel a leginkább hasonlít egymásra, és hogy melyik lépésben haladunk, az megmondja, hogy hány n minta közül kettő van eltolva az 1 -es jeltől. Ha n negatív, akkor a kettes jel elmarad az első jelzéstől, ha pozitív, akkor a kettes jel előtt van, és ha nulla, akkor a kettő már igazodik. Ezt a mintaeltolást időkésleltetéssé alakítjuk a mintavételi gyakoriságunk segítségével, a Δt = n/fs relációval, így:

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

2. lépés: Alkatrészek

Alkatrészek

  • Microsoft Kinect Xbox 360 -hoz, 1414 vagy 1473 -as modell. A Kinect négy mikrofont tartalmaz lineáris tömbben, amelyeket használni fogunk.
  • Adapter a Kinect szabadalmaztatott csatlakozójának USB + hálózati tápellátássá alakításához, mint ez.
  • Raspberry Pi 2 vagy 3 fut Raspbian Stretch. Eredetileg egy Pi 1 B+modellt próbáltam használni, de nem volt elég erős. Folyamatosan problémáim voltak a Kinectről való leválasztással.
  • A legborzasztóbb manökenfej, amit talál
  • Analóg szervó, amely elég erős ahhoz, hogy elfordítsa a próbabábu fejét
  • Egy 5 V -os USB fali töltő elegendő áramerősséggel a Pi és a szervo és legalább két port tápellátásához. (Ehhez hasonló 5A 3 portos csatlakozót használtam
  • Hosszabbító kábel két kimenettel (az egyik az USB fali töltőhöz, a másik a Kinect hálózati adapterhez.
  • Két USB-kábel: egy A típusú mikro-USB kábel a Pi tápellátásához, egy másik pedig a szervó áramellátásához, amelyet nem bánja
  • Egy platform mindenre, amire leülhet, és egy másik kisebb platform a próbababának. Alapként műanyag tálalótálcát használtam, fejlapként pedig műanyag tányért. Mindkettő a Walmarttól származott, és csak néhány dollárba került
  • 4x #8-32 1/2 "-os csavarok és anyák a szervó rögzítéséhez a nagyobb platformhoz
  • 2x M3 8 mm -es csavar alátétekkel (vagy bármilyen méretű, amellyel a szervókürtöt a kisebb platformhoz kell rögzíteni)
  • Két férfi-férfi áthidaló vezeték, egy piros és egy fekete, valamint egy női-férfi áthidaló vezeték
  • Ragasztós tépőzáras csíkok
  • Elektromos szalag
  • Ragasztószalag a kábelkezeléshez

Eszközök

  • Dremel vágókoronggal
  • Fúró
  • 7/64 ", 11/16" és 5/16 "-os fúrók
  • M3 csap (opcionális, a szervókürttől függően)
  • Csavarhúzó
  • Forrasztópáka forrasztóval
  • Segítő kezek (opcionális)
  • Jelző
  • Iránytű
  • Huzalhúzók
  • Multiméter (opcionális)

PPE

  • Biztonsági szemüveg

  • Arcmaszk (dremmel-ed műanyag darabokhoz).

3. lépés: Alsó platform szerelése

Alsó platform szerelvény
Alsó platform szerelvény
Alsó platform szerelvény
Alsó platform szerelvény
Alsó platform szerelvény
Alsó platform szerelvény

Az első rész, amelyet elkészítünk, az alsó platform, amely a Kinectet, a szervót és az összes elektronikánkat fogja tartani. A platform elkészítéséhez szüksége lesz:

  • Műanyag tálalótálca
  • Szervo
  • 4x #8-32 1/2 "-os csavar anyákkal
  • Dremel vágókoronggal
  • Csavarhúzó
  • Fúró
  • 11/16 "fúrószár
  • Jelző

Hogyan készítsünk

  1. Fordítsa fejjel lefelé a tálcát.
  2. Helyezze szervóját oldalra a tálca hátsó részéhez, győződjön meg arról, hogy a szervo kimeneti fogaskereke a tálca középvonala mentén fekszik, majd jelölje be a szervó alja körül.
  3. A dremel és a vágókorong használatával vágja ki a kijelölt területet, majd csúsztassa a szervót a nyílásába.
  4. Jelölje be a tálcán a szervóház rögzítőfuratainak középpontjait, majd távolítsa el a szervót, és fúrja ki ezeket a lyukakat a 11/16 "-os fúrófejével. Nagyon könnyű ilyen vékony műanyagot feltörni lyukak fúrása során, ezért sokkal biztonságosabbnak találom a fúró hátramenetben történő futtatása és az anyag lassú elporlása.
  5. Helyezze vissza szervóját a nyílásba, majd szerelje fel a tálcára a #8-32 csavarokkal és anyákkal.

4. lépés: Fejállvány szerelése

Fej -platform szerelvény
Fej -platform szerelvény
Fej -platform szerelvény
Fej -platform szerelvény
Fej -platform szerelvény
Fej -platform szerelvény
Fej -platform szerelvény
Fej -platform szerelvény

A következő rész egy platform lesz, amely a manöken fejét a szervóhoz csatlakoztatja. A fejplatform elkészítéséhez szüksége lesz:

  • Műanyag tányér
  • Szervó kürt
  • 2x M3 8 mm -es csavar alátétekkel
  • Csavarhúzó
  • Fúró
  • 7/64 "és 5/16" -os fúrók
  • Iránytű
  • Dremel vágókoronggal

Hogyan készítsünk

  1. Állítsa az iránytűt a manökenfej aljának sugarára.
  2. Az iránytű segítségével jelöljön ki egy kört a lemez közepén. Ez lesz a fejplatformunk tényleges mérete.
  3. A dremel és a vágókorong segítségével vágja ki a kisebb platformot a lemezből.
  4. Fúrja ki az új platform közepét egy 5/16 "-os fúrószárral. Így hozzáférhetünk a csavarhoz, amely szervo kürtünket a szervónkhoz rögzíti. Annak érdekében, hogy a platform stabilitást nyújtson a lyuk fúrásakor, drótot alatta, és átfúrta az orsó közepét.
  5. Igazítsa a szervókürtöt a platform közepéhez, és jelöljön ki két lyukat a kürt rögzítéséhez a platformhoz. Győződjön meg arról, hogy ezek a rögzítőlyukak elég távol vannak egymástól, így van hely az M3 csavarfejeknek és alátéteknek.
  6. Fúrja ki ezeket a jelzett lyukakat 7/64 "-os fúróval.
  7. A szervókürtöm alsó furata sima volt, vagyis nem voltak menetei az M3 csavarnak. Így a fúróm és egy M3 csap segítségével készítettem a szálakat.
  8. A csavarokkal és alátétekkel rögzítse a szervókürtöt a fejállványhoz.

5. lépés: Szervo tápkábel

Szervo tápkábel
Szervo tápkábel
Szervo tápkábel
Szervo tápkábel
Szervo tápkábel
Szervo tápkábel
Szervo tápkábel
Szervo tápkábel

Az analóg szervók általában 4,8-6 V feszültséggel működnek. Mivel a Raspberry Pi már 5 V -os tápellátást kap USB -ről, leegyszerűsítjük a rendszert azzal, hogy a szervót USB -ről is tápláljuk. Ehhez módosítanunk kell egy USB -kábelt. A szervo tápkábel elkészítéséhez szüksége lesz:

  • Tartalék USB-kábel A típusú véggel (olyan, amely a számítógéphez csatlakozik)
  • Egy piros és egy fekete áthidaló vezeték
  • Forrasztópáka
  • Forrasztó
  • Huzalhúzók
  • Elektromos szalag
  • Segítő kezek (opcionális)
  • Multiméter (opcionális)

Hogyan készítsünk

  1. Vágja le a nem USB A típusú csatlakozót a kábelről, majd távolítsa el a szigetelést, hogy feltárja a négy belső vezetéket. Vágja le a fedetlen vezetékeket körülvevő árnyékolást.
  2. Az USB -kábel általában négy vezetékből áll: kettő az adatátvitelhez és a vételhez, kettő pedig a tápellátáshoz és a földeléshez. Érdekel minket az erő és a föld, amelyek általában vörösek, illetve feketék. Távolítsa el a szigetelés egy részét a piros és fekete vezetékekről, és vágja le a zöld és a fehér vezetékeket. Ha attól tart, hogy nincs megfelelő táp- és földelővezetéke, csatlakoztassa a kábelt az USB hálózati adapterhez, és multiméterrel ellenőrizze a kimeneti feszültséget.
  3. Ezután vágja le a piros és fekete áthidaló kábelek egyik végét, és távolítsa el a szigetelés egy részét.
  4. Most csavarja össze a jumper és az USB -kábelek szabad fekete kábeleit. Húzza át a szabadon lévő vezetékek középpontjait, és csavarja őket egymás körül. Ezután vigyen forrasztást a párosított huzalokra, hogy összetartsa őket. Segítő kezek megkönnyítik ezt a kábelek helyben tartásával.
  5. Ismételje meg a 4. lépést a piros vezetékeknél.
  6. Fedje le a szabad vezetékeket elektromos szalaggal, vagy zsugorodó csövekkel, ha kedvére van. Ezek az illesztések törékenyek lesznek, mivel a vezetékek olyan kicsik, ezért tegyen egy második réteg szalagot az áthidaló kábelekhez az USB -kábel külső szigeteléséhez. Ez merevebbé teszi a szerelvényt, és így kevésbé valószínű, hogy eltörik a hajlítástól.

6. lépés: Elektronikai szerelés

Elektronikai szerelés
Elektronikai szerelés
Elektronikai szerelés
Elektronikai szerelés
Elektronikai szerelés
Elektronikai szerelés

Végül mindent összehozunk, elektronikánkat és minden mást az alsó platformra szerelünk. Szükséged lesz:

  • Alsó platform
  • Fej platform
  • Manöken fej
  • Kinect USB+hálózati adapterrel
  • USB hálózati adapter
  • Hosszabbító
  • Micro USB kábel
  • Szervo tápkábel
  • Raspberry Pi
  • Férfi-nő áthidaló kábel
  • Ragasztó tépőzár
  • Olló

Hogyan készítsünk

  1. Szerelje fel a Pi -t a tálca aljára tépőzárral.
  2. Csatlakoztassa az USB hálózati adaptert tépőzárral.
  3. Csatlakoztassa a szervót és a Pi -t az USB hálózati adapterhez.
  4. Csatlakoztassa a Pi 12. tűjét (GPIO18) a szervo jelkábeléhez. Ez a 6. csap a jobb oldalon.
  5. Kígyózza be a hosszabbítót a tálca hátsó fogantyújába, és csatlakoztassa az USB hálózati adaptert az egyik oldalához.
  6. Fogja a Kinect USB+hálózati adaptert, és csatlakoztassa a hálózati adaptert a hosszabbító kábel másik oldalához, az USB -t pedig a Pi -hez.
  7. Kígyózza át a Kinect zsinórját a tálca elülső fogantyúján, és csatlakoztassa a Kinect adapterhez.
  8. Ragasztószalaggal tartottam a kábeleket az emelvény alsó részéhez. Ez nem tűnik a legelegánsabbnak, de szerencsére mindez rejtve van.
  9. Fordítsa fel a platformot jobb oldalával felfelé, és tépőzárral rögzítse a Kinect-et a platform elejére.
  10. A tépőzár segítségével rögzítse a manökenfejet a fejplatformhoz. Ha azonban minden összeállt, válassza szét a két darabot, hogy hozzáférhessünk a szervókürt rögzítőcsavarjához. Azonban még ne csavarja a kürtöt a szervóhoz, mivel először meg kell győződnünk arról, hogy a szervó középső helyzetben van, hogy mindent beállíthassunk. Ezt egy későbbi lépésben megtesszük.

7. lépés: Szoftver és algoritmus

Szoftver és algoritmus
Szoftver és algoritmus

Áttekintés

A projekt szoftvere C ++ nyelven íródott, és integrálva van a Robot Operating System (ROS) rendszerrel, amely a robotikai szoftverek írásának keretrendszere. Az ROS -ban a rendszer szoftverei csomópontoknak nevezett programok gyűjteményére vannak felosztva, ahol minden csomópont a rendszer funkcionalitásának egy meghatározott alszakaszát valósítja meg. Az adatok továbbítása a csomópontok között közzétételi/előfizetési módszerrel történik, ahol az adatokat előállító csomópontok közzéteszik azokat, és az adatokat fogyasztó csomópontok előfizetnek rá. A kód ilyen módon történő leválasztása lehetővé teszi a rendszer funkcionalitásának egyszerű bővítését, és lehetővé teszi a csomópontok megosztását a rendszerek között a gyorsabb fejlesztés érdekében.

Ebben a rendszerben az ROS -t elsősorban a hangforrás érkezési irányát (DOA) kiszámító kód és a szervót vezérlő kód elkülönítésére használják, lehetővé téve más projektek számára, hogy tartalmazzák a Kinect DOA becslést, anélkül, hogy szükség esetén vagy szükségük lenne a szervókódra.. Ha meg szeretné nézni magát a kódot, megtalálható a GitHub -on:

github.com/raikaDial/kinect_doa

Kinect DOA csomópont

A kinect_doa csomópont ennek a rendszernek a húsa és csontja, alapvetően mindent érdekeset csinál. Indításkor inicializálja az ROS csomópontot, lehetővé téve az összes ROS varázslatot, majd feltölti a firmware -t a Kinect -be, hogy az audio streamek elérhetővé váljanak. Ezután új szálat hoz létre, amely megnyitja az audiofolyamokat, és elkezdi olvasni a mikrofonadatokat. A Kinect négy mikrofonját egyenként 16 kHz frekvencián mintavételezi, ezért jó, ha a keresztkorrelációt és az adatgyűjtést külön szálakban végezzük el, hogy elkerüljük a számítási terhelés miatti adatok hiányát. Az interfész a Kinect-el a libfreenect, egy népszerű nyílt forráskódú illesztőprogram használatával érhető el.

A gyűjtési szál visszahívási funkciót hajt végre, amikor új adatok érkeznek, és mindkettő tárolja az adatokat, és meghatározza, hogy mikor kell becsülni a DOA -t. Az egyes mikrofonok adatait gördülő pufferekben tároljuk, mint a mintavételi ablakunk, amely itt 8192 minta. Ez azt jelenti, hogy kiszámítjuk a keresztkorrelációt az elmúlt fél másodperc adataival, amit a kísérletezés során jó egyensúlynak találtam a teljesítmény és a számítási terhelés között. A DOA becslést minden 4096 minta esetében a fő szál jelzésével aktiválják, így az egymást követő keresztkorrelációk 50%-ban átfedik egymást. Tekintsünk egy esetet, amikor nincs átfedés, és nagyon gyors zajt adunk, amelyet a mintavételi ablak felére vág. A megkülönböztető hang előtt és után valószínűleg fehér zaj lesz, amelyet nehéz összehangolni a keresztkorrelációval. Az egymást átfedő ablakok teljesebb hangmintát biztosítanak számunkra, növelve keresztkorrelációnk megbízhatóságát azáltal, hogy határozottabb vonásokat kínálunk.

A fő szál várja a gyűjtőszál jelét, majd kiszámítja a DOA becslést. Először azonban azt ellenőrzi, hogy a rögzített hullámformák jelentősen eltérnek -e a fehér zajtól. Ezen ellenőrzés nélkül másodpercenként négyszer számolnánk a becslésünket, függetlenül attól, hogy érdekes zajok hallatszanak -e, vagy sem, és a manökenfejünk görcsös rendetlenség lenne. A rendszerben használt fehér zaj észlelési algoritmus az első az itt felsorolt kettő közül. Kiszámítjuk a hullámformánk deriváltjának abszolút integráljának és abszolút integráljának az arányát; a magas fehérzajtartalmú jeleknél ez az arány magasabb, mint a kevésbé zajos jeleknél. Ha ennek az aránynak küszöbértéket állítunk el, amely elválasztja a zajt a zajtól, akkor csak megfelelő esetben indíthatjuk el a keresztkorrelációt. Természetesen ezt az arányt újra kell hangolni minden alkalommal, amikor a rendszert új környezetbe helyezik.

Miután a program megállapította, hogy a hullámformák jelentős nem zajtartalmat tartalmaznak, a program folytatja a keresztkorrelációkat. Három fontos optimalizálás van azonban ezekben a számításokban:

  1. A Kinect-en négy mikrofon található, vagyis összesen hat hullámforma pár van, amelyeket keresztkorrelálhatunk. Ha azonban megnézzük a mikrofon tömb térbeli elrendezését, láthatjuk, hogy a 2, 3 és 4 mikrofonok nagyon közel vannak egymáshoz. Valójában olyan közel vannak, hogy a hangsebesség és a mintavételi frekvenciánk miatt a 2, 3 és 4 -nél kapott hullámformákat legfeljebb egy minta választja el előre vagy mögé, amit a maxlag = Δd számítással ellenőrizhetünk *fs/vs, ahol Δd a mikrofonpár elválasztása, fs a mintavételi frekvencia, és vs a hangsebesség. Így a párok korrelálása e három között haszontalan, és csak az 1. mikrofont kell korrelálnunk a 2., 3. és 4. gombbal.
  2. Ismeretes, hogy az audio jelek standard keresztkorrelációja gyengén teljesít visszhangok (echos) jelenlétében. Egy robusztus alternatíva a fázisátalakítással (GCC-PHAT) általánosított keresztkorreláció. Ez a módszer olyan súlyozási függvény alkalmazását jelenti, amely felerősíti a keresztkorreláció csúcsait, megkönnyítve az eredeti jel megkülönböztetését az echos-tól. Összehasonlítottam a GCC-PHAT teljesítményét az egyszerű keresztkorrelációval egy visszhangos kamrában (olvassuk: a beton fürdőszobát átalakítják), és azt találtam, hogy a GCC-PHAT 7-szer hatékonyabb a helyes szög becslésében.
  3. A keresztkorreláció végrehajtásakor a két jelet vesszük, csúsztatjuk egymás mellett, és minden lépésben megszorozzuk a rögzített jelzésünk minden pontját a csúszójelünk minden pontjával. Két n hosszú jel esetén ez n^2 számítást eredményez. Ezt javíthatnánk, ha a keresztkorrelációt a frekvenciatartományban végeznénk el, amely egy gyors Fourier-transzformációt (nlogn-számításokat) foglal magában, az egyik transzformált jel minden pontját megszorozva a másik megfelelő pontjával (n számítás), majd inverzt hajtva végre Fourier transzformáció, hogy visszatérjen az időtartományba (nlogn számítások), ami n+2*nlogn számításokat eredményez, kevesebb, mint n^2. Ez azonban a naiv megközelítés. A mi mikrofonjaink olyan közel vannak egymáshoz, és a hangsebesség olyan viszonylag lassú, hogy az audio hullámformák már többnyire igazodnak. Így keresztkorrelációnkat csak abból a szempontból tehetjük, ha kissé előre vagy hátra vagyunk. Az 1. és 4. mikrofon esetében a késleltetésnek +/- 12 minta közé kell esnie, ami azt jelenti, hogy minden keresztkorrelációhoz csak 24*n számítást kell elvégeznünk, ami számítási megtakarítást eredményez, ha a hullámformánk 2900 mintánál hosszabb.

Ez a rendszer kihasználja a minidsp könyvtárat, amely a GCC-PHAT algoritmust optimalizálással valósítja meg 3.

Miután megtalálta a késést az egyes mikrofonpáros jelekben, a program kiválasztja a késleltetés medián értékét, felhasználja a becsült szög kiszámításához, és közzéteszi az eredményt, így felhasználható a szervó vezérlésére.

Szervo vezérlő csomópont

A kinect_doa csomóponthoz képest a szervo csomópont viszonylag egyszerű. Feladata, hogy kizárólag a becsült DOA -t vegye, és a szervót ebbe a szögbe mozgassa. A wiringPi könyvtárat használja a Raspberry Pi hardver PWM moduljának eléréséhez, és ezzel beállítja a szervó szögét. A legtöbb analóg szervót egy PWM jel vezérli, amelynek impulzusszélessége 1000 µs és 2000 µs között van, ami 0 ° és 180 ° közötti szögnek felel meg, de az általam használt szervót 500 µs és 2500 µs között szabályozták, ami egy szögnek felel meg 0 ° és 270 ° között. Így a csomópont konfigurálható a különböző szervo hardverekhez a minimális impulzusszélesség, a maximális impulzusszélesség, valamint a maximális és a minimális szög közötti különbség beállításával. Ezenkívül a szervó nem halad azonnal a célszög felé, hanem konfigurálható sebességgel mozog a szög felé, fokozatosabb, hátborzongató hangulatot kölcsönözve Margaretnek (ráadásul a gyorsan előre -hátra mozgó szervó hangja nagyon gyorsan bosszantóvá válik)).

8. lépés: Építés és telepítés

Telepítési függőségek:

Először telepítse a libfreenect programot. Forrásból kell építenünk, mert a csomagkezelővel elérhető verzió nem tartalmazza az audio támogatását. Ennek oka, hogy fel kell töltenünk a firmware -t a Kinect -be, hogy engedélyezzük a hangot, és ennek a firmware -nek az újraelosztása nem törvényszerű bizonyos joghatóságokban. Ezenkívül elkerülhetjük az OpenGL -t és glut -ot igénylő példák építését, amelyek feleslegesek a fej nélküli Raspbian telepítésekhez.

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

cd git klón 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.rules /etc/udev/rules.d udevadm control-reload-rules && udevadm trigger

Ezután telepítenünk kell a wiringPi csomagot, amely lehetővé teszi a Pi GPIO csapjainak vezérlését:

CD

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

Csatlakoztassa a próbabábu fejét:

A wiringPi telepítésével most egy gyors kitérőt tehetünk vissza a hardver-landra, hogy a manökenfejet az alsó platformra rögzítsük. Ha a szervót a parancssoron keresztül középre szeretné helyezni, írja be a következő parancsokat:

gpio pwm-ms

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

Ha nincs mozgás, akkor a szervó valószínűleg már középre van állítva. Az biztos azonban, hogy beállíthatja a szervót egy nem középértékre, pl. gpio -g pwm 18 200, majd állítsa vissza 150 -re.

Miután megbizonyosodott arról, hogy a szervó középre van állítva, rögzítse a fejplatform szervókürtjét a szervóhoz úgy, hogy a próbabábu feje egyenesen előre nézzen. Ezután csavarja a kürtöt a szervóra, és rögzítse a fejét a tépőzárral.

ROS telepítése:

Ezután telepítse az ROS -t a Pi -re. Nagyszerű telepítési útmutató található itt; rendszerünk esetében nincs szükségünk OpenCV -re, így kihagyhatja a 3. lépést. Ez az összeállítás több órát vesz igénybe. Ha befejezte a telepítési útmutató követését, adja hozzá a telepítést a bashrc -hez, hogy használhassuk az újonnan telepített ROS csomagjainkat:

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

Kinect DOA csomag készítése:

Miután elkészült, hozzon létre egy catkin munkaterületet a projektünkhöz, és lépjen be az src könyvtárba:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

A projekt kódja a kinect_doa csomagban található, ezért klónozza azt az új munkaterület src könyvtárába:

git klón

A robot_upstart csomag egy könnyen használható eszközt kínál az indítófájlok telepítéséhez, hogy azok indításkor fussanak, ezért ezt is klónozza a munkaterületre:

git klón

Most felépíthetjük a projektkódot a catkin_make hívásával a munkaterületünk legfelső szintű könyvtárából, majd forrást szerezhetünk a buildhez, hogy a csomagjaink elérhetőek legyenek:

cd ~/kinect_doa_ws

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

Futás és hangolás:

Feltételezve, hogy minden csatlakoztatva van és be van kapcsolva, most már képesnek kell lennie arra, hogy elindítsa a rendszert, és rendelkezzen a Kinect sávjával, amelyet Ön mond! Ha azonban rendelkezik Kinect 1473 készülékkel, először nyissa meg a ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch fájlt egy szövegszerkesztőben, és állítsa a paramétert true_kinect_1473 értékre. Ezenkívül, ha más szervót használt, mint én, valószínűleg egy szabványos analóg szervó, így amíg az indító fájlban van, módosítsa a min_us paramétert 1000 -re, max_us értéket 2000 -re és max_deg értéket 180 -ra.

roslaunch kinect_doa kinect_doa.launch

Játsszon vele egy darabig. Ha úgy érzi, hogy a rendszer túl érzékeny (véletlenszerű irányba néz, amelyek nem felelnek meg a hangoknak vagy a megkülönböztető zajoknak), próbálja meg megváltoztatni a white_noise_ratio paramétert az indítófájlban, és indítsa újra a rendszert, amíg a válaszkészség el nem éri a megfelelő szintet.. Az arány növelésével a rendszer kevésbé reagál, és fordítva. Valószínűleg ezt a hangolást kell elvégeznie, amikor a rendszert egy másik helyre helyezi át, hogy elérje a kívánt teljesítményt.

A program elindításához a Pi bekapcsolásakor a robot_upstart csomagot használjuk az indítófájl telepítéséhez. Ha az ROS jelenleg nem fut, indítsa el a roscore paranccsal. Ezután nyisson meg egy új terminált, és telepítse az indítást a következővel:

rosrun robot_upstart telepítés kinect_doa/launch/kinect_doa.launch -felhasználó root --symlink

A másolás helyett létrehozunk egy szimbólumot az indítófájlhoz, hogy a ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch szerkesztésével módosíthassuk a paramétereket.

9. lépés: Rejtés az irodában

Rejtés az irodában
Rejtés az irodában

Most a szórakoztató részhez. Induljon munkába munkaidő után, és titokban állítsa fel a próbababáját. Akkor csak dőljön hátra, és nézze meg, mennyi időbe telik, amíg munkatársai ráérnek! Garantáltan új fejet fog fordítani az új alkotás…

Ajánlott: