Innehållsförteckning:

Ljudlokaliserande skyltdockahuvud med Kinect: 9 steg (med bilder)
Ljudlokaliserande skyltdockahuvud med Kinect: 9 steg (med bilder)

Video: Ljudlokaliserande skyltdockahuvud med Kinect: 9 steg (med bilder)

Video: Ljudlokaliserande skyltdockahuvud med Kinect: 9 steg (med bilder)
Video: ВСЕ ЧАСТИ Обитель ведьмы: Хижина мертвых тел 2024, Juli
Anonim
Ljud lokaliserande skyltdockahuvud med Kinect
Ljud lokaliserande skyltdockahuvud med Kinect

Möt Margaret, en testdocka för ett övervakningssystem för förare. Hon gick nyligen tillbaka från sina arbetsuppgifter och hittade sin väg till vårt kontorsutrymme och har sedan uppmärksammats dem som tycker att hon är "läskig". Av rättvisans intresse har jag gett henne möjligheten att möta sina anklagare direkt; istället för att till synes följa dig med sin själlösa blick, nu gör hon det faktiskt. Systemet använder mikrofonuppsättningen för en Microsoft Kinect och en servo för att styra henne i riktning mot människor som pratar nära henne.

Steg 1: Teori

Teori
Teori

Beräkna vinkeln

När vi hör något, såvida det inte är direkt framför oss når det ena örat före det andra. Våra hjärnor uppfattar den ankomstfördröjningen och omvandlar den till en allmän riktning som buller kommer från, så att vi kan hitta källan. Vi kan uppnå exakt samma typ av lokalisering med ett par mikrofoner. Tänk på det visade diagrammet, som innehåller ett mikrofonpar och en ljudkälla. Om vi tittar uppifrån och ner är ljudvågorna cirkulära, men om avståndet till källan är stort i förhållande till avståndet mellan mikrofonerna, så är vågens ungefärliga plan från våra sensors synvinkel. Detta är känt som långt-fält antagandet och förenklar geometrin i vårt problem.

Antag därför att vågfronten är en rak linje. Om ljudet kommer från höger träffar det mikrofon #2 vid tidpunkten t2 och mikrofon #1 vid tiden t1. Avståndet d som ljudet reste mellan träffande mikrofon #2 och mikrofon #1 är tidsskillnaden för att detektera ljudet multiplicerat med ljudets hastighet v s:

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

Vi kan relatera detta avstånd till avståndet d 12 mellan mikrofonparet och vinkeln θ från paret till ljudkällan med relationen:

cos (θ) = d /d 12 = vs*At /d12

Eftersom vi bara har två mikrofoner kommer det att finnas oklarheter i vår beräkning om ljudkällan är framför eller bakom oss. I detta system antar vi att ljudkällan är framför paret och klämmer in vinkeln mellan 0 grader (helt till höger om paret) till 180 grader (helt till vänster).

Slutligen kan vi lösa för theta genom att ta invers cosinus:

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

För att göra vinkeln lite mer naturlig kan vi subtrahera 90 grader från theta, så att 0 grader är direkt framför paret och +/- 90 grader är hela vänster eller helt höger. Detta vänder vårt uttryck från invers cosinus till invers sinus.

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

Hitta försening

Som du kan se från ekvationen ovan är allt vi behöver lösa för vinkeln fördröjningen i ljudvågen som kommer till mikrofon ett jämfört med mikrofon två; ljudets hastighet och avståndet mellan mikrofonerna är både fasta och kända. För att uppnå detta samplar vi först ljudsignalerna vid frekvensen fs, konverterar dem från analog till digital och lagrar data för senare användning. Vi samplar under en tid som kallas samplingsfönster, som har tillräckligt lång tid för att fånga utmärkta egenskaper hos vår ljudvåg. Till exempel kan vårt fönster vara den sista halva sekundens värde av ljuddata.

Efter att ha fått de fönstrade ljudsignalerna hittar vi fördröjningen mellan de två genom att beräkna deras korskorrelation. För att beräkna korskorrelationen håller vi fönstersignalen från en mikrofon fast och skjuter den andra signalen längs tidsaxeln från hela vägen bakom den första till hela vägen före den första. Vid varje steg längs vår bild multiplicerar vi varje punkt i vår fasta signal med motsvarande punkt i vår glidande signal och summerar sedan alla resultat för att beräkna vår korrelationskoefficient för det steget. Efter att vi har slutfört vår bild motsvarar steget som har den högsta korrelationskoefficienten den punkt där de två signalerna är mest lika, och vilket steg vi är på berättar hur många sampel n signal två är förskjutna från signal 1. Om n är negativ, då ligger signalen två efter signalen en, om den är positiv är signalen två framåt, och om den är noll är de två redan inriktade. Vi konverterar denna provförskjutning till en tidsfördröjning med hjälp av vår samplingsfrekvens med relationen Δt = n/fs, alltså:

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

Steg 2: Komponenter

Delar

  • Microsoft Kinect för Xbox 360, modell 1414 eller 1473. Kinect har fyra mikrofoner arrangerade i en linjär array som vi kommer att använda.
  • Adapter för att konvertera Kinects egenutvecklade kontakt till USB + nätström som den här.
  • Raspberry Pi 2 eller 3 som kör Raspbian Stretch. Jag försökte ursprungligen använda en Pi 1 Model B+, men den var inte tillräckligt kraftfull. Jag fortsatte att ha problem med att koppla bort från Kinect.
  • Det läskigaste skyltdockhuvudet du kan hitta
  • En analog servo som är tillräckligt stark för att vända skyltdockans huvud
  • En 5V USB -väggladdare med tillräcklig strömstyrka för att driva både Pi och servo och minst två portar. (Jag använde en 5A 3-portskontakt som liknade denna
  • En förlängningssladd med två uttag (en för USB -väggladdaren och den andra för Kinect -nätadaptern.
  • Två USB-kablar: en typ-A till mikro-USB-kabel för att driva Pi och en annan för att driva servon som du inte har något emot att klippa upp
  • En plattform för allt att sitta på och en annan mindre plattform för skyltdockans huvud. Jag använde en serveringsbricka av plast som bas och en plastplatta som huvudplattform. Båda var från Walmart och kostade bara några dollar
  • 4x #8-32 1/2 "bultar och muttrar för att fästa din servo på den större plattformen
  • 2x M3 8 mm bult med brickor (eller vilken storlek du behöver för att fästa ditt servohorn på den mindre plattformen)
  • Två bygelkablar från man till man, en röd och en svart, och en hona-till-han-bygel
  • Självhäftande kardborreband
  • Eltejp
  • Gaffatejp för kabelhantering

Verktyg

  • Dremel med skärhjul
  • Borra
  • 7/64 ", 11/16" och 5/16 "borr
  • M3 -kran (valfritt, beroende på servohornet)
  • Skruvmejsel
  • Lödkolv med löd
  • Hjälpande händer (valfritt)
  • Markör
  • Kompass
  • Wire strippers
  • Multimeter (tillval)

PPE

  • Säkerhetsglasögon

  • Ansiktsmask (för dremmel-ed plastbitar).

Steg 3: Nedre plattformsenheten

Nedre plattformsenhet
Nedre plattformsenhet
Nedre plattformsenhet
Nedre plattformsenhet
Nedre plattformsenhet
Nedre plattformsenhet

Den första delen vi kommer att göra är den nedre plattformen, som kommer att hålla vår Kinect, servo och all vår elektronik. För att göra plattformen behöver du:

  • Serveringsbricka i plast
  • Servo
  • 4x #8-32 1/2 "bultar med muttrar
  • Dremel med skärhjul
  • Skruvmejsel
  • Borra
  • 11/16 "borr
  • Markör

Hur man gör

  1. Vänd din bricka upp och ner.
  2. Placera din servo i sidled nära baksidan av facket, se till att utmatningen på servon ligger längs fackets mittlinje och markera sedan runt servobasen.
  3. Använd din dremel och skärhjul, skär ut det område du markerade och skjut sedan in din servo i dess fack.
  4. Markera mitten av servohusets monteringshål på brickan, ta sedan bort servon och borra ut hålen med din 11/16 "borr. Det är väldigt lätt att knäcka tunn plast så här när du borrar hål, så jag tycker att det är mycket säkrare att köra borren bakåt och sakta slita bort materialet. Det är mycket långsammare än att borra hålen ordentligt men det säkerställer att det inte finns några sprickor.
  5. Sätt tillbaka din servo i facket och montera den sedan på brickan med #8-32 bultar och muttrar.

Steg 4: Montering av huvudplattform

Huvudplattformsenhet
Huvudplattformsenhet
Huvudplattformsenhet
Huvudplattformsenhet
Huvudplattformsenhet
Huvudplattformsenhet
Huvudplattformsenhet
Huvudplattformsenhet

Nästa del vi kommer att göra blir en plattform för att ansluta skyltdockans huvud till servon. För att göra huvudplattformen behöver du:

  • Plast talrik
  • Servo horn
  • 2x M3 8 mm bult med brickor
  • Skruvmejsel
  • Borra
  • 7/64 "och 5/16" borr
  • Kompass
  • Dremel med skärhjul

Hur man gör

  1. Ställ in din kompass till radien för basen på ditt skyltdockhuvud.
  2. Använd din kompass för att markera en cirkel centrerad på plattans mitt. Detta kommer att vara den verkliga storleken på vår huvudplattform.
  3. Använd din dremel och skärhjulet för att skära ut den mindre plattformen ur plattan.
  4. Borra ut mitten av din nya plattform med en 5/16 "borrkrona. Detta ger oss tillgång till skruven som monterar vårt servohorn på vår servo. För att ge plattformen stabilitet när jag borrade hålet satte jag en spole med tråd under den och borrade genom spolens mitt.
  5. Rikta upp ditt servohorn med plattformens mitt och markera två hål för att fästa hornet på plattformen. Se till att dessa monteringshål är tillräckligt långt ifrån varandra så att det finns plats för dina M3 bulthuvuden och brickor.
  6. Borra ut dessa markerade hål med en 7/64 "borr.
  7. Det nedre hålet på mitt servohorn var slätt, det vill säga att det inte hade trådarna för M3 -bulten. Således använde jag min borrmaskin och en M3 -kran för att göra trådarna.
  8. Använd bultarna och brickorna för att fästa servohornet på huvudplattformen.

Steg 5: Servokabel

Servokabel
Servokabel
Servokabel
Servokabel
Servokabel
Servokabel
Servokabel
Servokabel

Analoga servon drivs vanligtvis med 4,8-6V. Eftersom Raspberry Pi redan kommer att drivas av 5V från USB, kommer vi att förenkla vårt system genom att också driva servon från USB. För att göra det måste vi ändra en USB -kabel. För att göra servokabeln behöver du:

  • Extra USB-kabel med typ A-typ (den typ som ansluts till din dator)
  • En röd och en svart bygeltråd
  • Lödkolv
  • Löda
  • Wire strippers
  • Eltejp
  • Hjälpande händer (valfritt)
  • Multimeter (tillval)

Hur man gör

  1. Klipp bort den icke-USB typ A-kontakten från kabeln och ta sedan bort lite av isoleringen för att avslöja de fyra inre trådarna. Skär av skärmen som omger de exponerade trådarna.
  2. Vanligtvis har USB -kabeln fyra ledningar: två för dataöverföring och mottagning och två för ström och jord. Vi är intresserade av kraft och mark, som vanligtvis är röda respektive svarta. Ta bort en del av isoleringen från de röda och svarta trådarna och klipp av de gröna och vita trådarna. Om du är orolig för att du inte har rätt ström- och jordkablar kan du ansluta din kabel till din USB -strömadapter och kontrollera utspänningen med en multimeter.
  3. Klipp sedan av ena änden av dina röda och svarta bygelkablar och ta bort en del av isoleringen.
  4. Vrid nu ihop de exponerade svarta trådarna på din bygel och USB -kablar. Korsa över de exponerade trådarnas centrum och vrid dem runt varandra. Applicera sedan lödning på de parade trådarna för att hålla ihop dem. Hjälpande händer kommer att underlätta detta genom att hålla dina kablar på plats.
  5. Upprepa steg 4 för de röda trådarna.
  6. Täck de exponerade ledningarna med eltejp eller värmekrympslang om du känner dig snygg. Dessa leder kommer att vara ömtåliga eftersom trådarna är så små, så lägg till ett andra lager tejp som håller bygelkablarna i USB -kabelns yttre isolering. Detta kommer att göra enheten mer stel och därmed mindre sannolik att bryta från att bli böjd.

Steg 6: Elektronikmontering

Elektronikmontering
Elektronikmontering
Elektronikmontering
Elektronikmontering
Elektronikmontering
Elektronikmontering

Slutligen kommer vi att samla allt, montera vår elektronik och allt annat till den nedre plattformen. Du kommer behöva:

  • Nedre plattform
  • Huvudplattform
  • Skyltdocka
  • Kinect med USB+nätadapter
  • USB -strömadapter
  • Förlängningssladd
  • Micro USB -kabel
  • Servokabel
  • Raspberry Pi
  • Man-till-hona bygelkabel
  • Självhäftande kardborreband
  • Sax

Hur man gör

  1. Montera Pi på botten av brickan med kardborreband.
  2. Anslut USB -strömadaptern med kardborreband.
  3. Anslut servo och Pi till USB -strömadaptern.
  4. Anslut stift 12 (GPIO18) på Pi till signalkabeln på servon. Det är den sjätte stiftet till höger.
  5. Dra din förlängningssladd genom fackets bakre handtag och anslut USB -nätadaptern till ena sidan.
  6. Ta Kinect USB+nätadapter och anslut nätadaptern till den andra sidan av förlängningssladden och USB till Pi.
  7. Dra kabeln på Kinect genom det främre handtaget på brickan och anslut den till Kinect -adaptern.
  8. Jag använde tejp för att hålla kablarna på plattformens undersida. Det här ser inte det mest eleganta ut, men lyckligtvis är allt detta dolt.
  9. Vänd plattformen med höger sida uppåt och använd kardborreband för att montera Kinect på plattformens framsida.
  10. Använd kardborreband för att montera skyltdockans huvud på huvudplattformen. När allt är upprätt, separera dock de två bitarna så att vi kan komma åt servohornsmonteringsskruven. Skruva inte fast hornet på servon än, eftersom vi måste se till att servon är i sitt mittläge först så att vi kan ställa upp allt. Vi gör detta i ett senare steg.

Steg 7: Programvara och algoritm

Programvara och algoritm
Programvara och algoritm

Översikt

Programvaran för detta projekt är skriven i C ++ och är integrerad med Robot Operating System (ROS), en ram för att skriva robotprogramvara. I ROS delas programvaran för ett system upp i en samling program som kallas noder, där varje nod implementerar en specifik undersektion av systemets funktionalitet. Data överförs mellan noder med en publicerings-/prenumerationsmetod, där noder som producerar data publicerar den och noder som förbrukar data prenumererar på den. Genom att koppla bort koden på detta sätt kan systemfunktionaliteten enkelt utökas och noder kan delas mellan system för snabbare utveckling.

I detta system används ROS främst för att separera koden som beräknar ankomstkällan (DOA) för ljudkällan från koden som styr servon, så att andra projekt kan inkludera Kinect DOA -uppskattningen utan att inkludera servokod som de kanske inte behöver eller vill ha. Om du vill titta på själva koden kan du hitta den på GitHub:

github.com/raikaDial/kinect_doa

Kinect DOA -nod

Kinect_doa -noden är köttet och benen i detta system och gör i princip allt intressant. Vid start initierar den ROS -noden, vilket gör all ROS -magi möjlig och laddar sedan upp firmware till Kinect så att ljudströmmarna blir tillgängliga. Det ger sedan en ny tråd som öppnar ljudströmmen och börjar läsa i mikrofondata. Kinect samplar sina fyra mikrofoner med en frekvens på 16 kHz vardera, så det är bra att ha korskorrelationen och datainsamlingen i separata trådar för att undvika att data saknas på grund av beräkningsbelastning. Gränssnitt med Kinect uppnås med libfreenect, en populär open-source-drivrutin.

Samlingstråden utför en återuppringningsfunktion närhelst ny data tas emot, och både lagrar data och bestämmer när DOA ska uppskattas. Data från varje mikrofon lagras i rullande buffertar lika långa som vårt samplingsfönster, som här är 8192 samplingar. Detta innebär att beräkna korskorrelationen med ungefär den senaste halvsekundens värde av data, vad jag fann genom att experimentera som en bra balans mellan prestanda och beräkningsbelastning. DOA-uppskattningen utlöses för varje 4096 prover genom att signalera huvudtråden, så att på varandra följande tvärkorrelationer överlappar med 50%. Tänk på ett fall där det inte finns någon överlappning, och du gör ett mycket snabbt ljud som skärs till hälften av provtagningsfönstret. Före och efter kommer ditt distinkta ljud troligen att vara vitt brus, vilket kan vara svårt att anpassa sig till korskorrelationen. Överlappande fönster ger oss ett mer komplett exempel på ljudet, vilket ökar tillförlitligheten för vår korskorrelation genom att ge oss mer distinkta funktioner att ställa upp.

Huvudtråden väntar på signalen från insamlingstråden och beräknar sedan DOA -uppskattningen. Först kontrollerar den dock om de fångade vågformerna skiljer sig väsentligt från vitt brus. Utan denna kontroll skulle vi beräkna vår uppskattning fyra gånger i sekunden oavsett om det fanns intressanta ljud eller inte, och vårt skyltdockhuvud skulle vara en spastisk röra. Den vita brusdetekteringsalgoritmen som används i detta system är den första av de två som listas här. Vi beräknar förhållandet mellan den absoluta integralen av derivatet av vår vågform till dess absoluta integral; För signaler med högt brusinnehåll är detta förhållande högre än för mindre bullriga signaler. Genom att ställa in en tröskel för detta förhållande som separerar brus från icke-brus kan vi utlösa korskorrelationen endast när det är lämpligt. Naturligtvis är detta förhållande något som måste justeras varje gång systemet flyttas till en ny miljö.

Efter att ha bestämt att vågformerna innehåller betydande icke-brusinnehåll fortsätter programmet med korskorrelationerna. Det finns dock tre viktiga optimeringar inbyggda i dessa beräkningar:

  1. Det finns fyra mikrofoner på Kinect, vilket betyder att det finns totalt sex par vågformer vi kan korskorrelera. Men om du tittar på mikrofonarrangemangets rumsliga arrangemang kan du se att mikrofonerna 2, 3 och 4 ligger väldigt nära varandra. Faktum är att de är så nära att på grund av ljudets hastighet och vår samplingsfrekvens kommer vågformerna som tas emot vid 2, 3 och 4 att separeras med högst ett sampel framåt eller bakom, vilket vi kan verifiera med beräkningen maxlag = Δd *fs/vs, där Δd är separationen av mikrofonparet, fs är samplingsfrekvensen och vs är ljudets hastighet. Således är korrelationspar mellan dessa tre värdelösa, och vi behöver bara korskorrelera mikrofon 1 med 2, 3 och 4.
  2. Standardkors-korrelation av ljudsignaler är känd för att fungera dåligt i närvaro av efterklang (ekon). Ett robust alternativ är känt som den generaliserade korskorrelationen med fasomvandling (GCC-PHAT). Denna metod går ut på att tillämpa en viktningsfunktion som förstärker toppar i korskorrelationen, vilket gör det lättare att skilja den ursprungliga signalen från ekon. Jag jämförde prestanda för GCC-PHAT med den enkla korskorrelationen i en efterklangskammare (läs: badrum i betong som ombyggdes) och fann att GCC-PHAT var 7 gånger effektivare för att uppskatta rätt vinkel.
  3. När vi utför korskorrelationen tar vi de två signalerna, glider en längs varandra och multiplicerar vid varje steg varje punkt i vår fasta signal med varje punkt i vår glidande signal. För två signaler med längden n resulterar detta i n^2 -beräkningar. Vi kan förbättra detta genom att istället utföra korskorrelationen i frekvensdomänen, vilket innebär en snabb fouriertransformation (nlogn-beräkningar), multiplicera varje punkt i en transformerad signal med motsvarande punkt i den andra (n-beräkningarna) och sedan utföra en invers fourier -transform för att gå tillbaka till tidsdomänen (nlogn -beräkningar), vilket resulterar i n+2*nlogn -beräkningar, mindre än n^2. Detta är dock det naiva tillvägagångssättet. Mikrofonerna i vårt sortiment är så nära varandra och ljudets hastighet är så relativt långsam att ljudvågformerna redan i stort sett kommer att justeras. Således kan vi fönstra vår korskorrelation till att endast överväga förskjutningar som ligger något framåt eller bakom. För mikrofonerna 1 och 4 måste fördröjningen falla mellan +/- 12 samplingar, vilket betyder att för varje korskorrelation behöver vi bara utföra 24*n-beräkningar, vilket resulterar i beräkningsbesparingar när våra vågformer är längre än 2900 samplingar.

Detta system utnyttjar minidsp-biblioteket, som implementerar GCC-PHAT-algoritmen med optimering 3.

När man väl hittat fördröjningen i signalerna från varje mikrofonpar väljer programmet medianvärdet för fördröjning, använder det för att beräkna den uppskattade vinkeln och publicerar resultatet så att det kan användas för att styra servon.

Servokontrollnod

Jämfört med kinect_doa -noden är servonoden relativt enkel. Dess uppgift är att enbart ta den beräknade DOA och flytta servon till den vinkeln. Den använder wiringPi -biblioteket för att komma åt maskinvaru -PWM -modulen på Raspberry Pi och använda den för att ställa in servovinkeln. De flesta analoga servon styrs av en PWM -signal med en pulsbredd som sträcker sig från 1000 µs till 2000 µs, motsvarande en vinkel på 0 ° till 180 °, men den servo jag använde styrdes med 500 µs till 2500 µs, motsvarande en vinkel från 0 ° till 270 °. Således är noden konfigurerbar för olika servomaskinvaror genom att ställa in parametrar för minsta pulsbredd, maximala pulsbredd och skillnaden mellan maximala och minsta vinklar. Dessutom rör sig servon inte omedelbart till målvinkeln, utan rör sig snarare mot vinkeln med en konfigurerbar hastighet, vilket ger Margaret en mer gradvis, läskig atmosfär (plus att ljudet av en servo som rör sig snabbt fram och tillbaka blir riktigt irriterande riktigt snabbt).

Steg 8: Bygg och installation

Installera beroenden:

Installera först libfreenect. Vi måste bygga det från källan eftersom versionen du kan få med pakethanteraren inte innehåller stöd för ljud. Detta beror på att vi måste ladda upp firmware till Kinect för att aktivera ljud, och omfördelning av denna firmware är inte lagligt i vissa jurisdiktioner. Dessutom kan vi undvika att bygga de exempel som kräver OpenGL och glut, onödigt för huvudlösa Raspbian -installationer.

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

cd git clone https://github.com/OpenKinect/libfreenect cd libfreenect mkdir build cd build cmake.. -DCMAKE_BUILD_REDIST_PACKAGE = OFF -DCMAKE_BUILD_EXAMPLES = AV gör sudo make install sudo cp ~/libfreenect/platform/linux/udev/51 -kinv.rules /etc/udev/rules.d udevadm kontroll-reload-rules && udevadm trigger

Därefter måste vi installera wiringPi -paketet, vilket gör att vi kan styra GPIO -stiften på Pi:

CD

git -klon git: //git.drogon.net/wiringPi cd ~/wiringPi./build

Fäst skyltdockahuvud:

Med wiringPi installerat kan vi nu ta en snabb omväg tillbaka till hårdvaruland för att fästa skyltdockan på den nedre plattformen. För att centrera servon via kommandoraden, ange följande kommandon:

gpio pwm-ms

gpio pwmc 192 gpio pwmr 2000 gpio -g pwm 18150

Om det inte finns någon rörelse är din servo troligen redan centrerad. För att vara säker kan du dock ställa in servon till ett värde som inte är centralt, t.ex. gpio -g pwm 18 200 och ställ sedan tillbaka till 150.

När du är säker på att servon är centrerad, fäst servohornet på huvudplattformen till servon så att ditt skyltdockahuvud kommer att se rakt fram. Skruva sedan på hornet på servon och fäst huvudet med kardborrebitarna.

Installera ROS:

Installera sedan ROS på din Pi. En bra installationsguide hittar du här; för vårt system behöver vi inte OpenCV, så du kan hoppa över steg 3. Det tar flera timmar att bygga. När du är klar med att följa installationsguiden lägger du till installationen av din bashrc så att vi kan använda våra nyinstallerade ROS -paket:

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

Bygg Kinect DOA -paket:

När allt är gjort gör du en catkin -arbetsyta för vårt projekt och anger src -katalogen:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

Koden för detta projekt finns i kinect_doa -paketet, så klona den i src -katalogen för din nya arbetsyta:

git -klon

Paketet robot_upstart ger ett lättanvänt verktyg för att installera startfiler så att de körs vid start, så klona också in detta i din arbetsyta:

git -klon

Nu kan vi bygga projektkoden genom att ringa catkin_make från den översta nivåkatalogen i vår arbetsyta och sedan källa till vår byggnad så att våra paket är tillgängliga:

cd ~/kinect_doa_ws

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

Löpning och stämning:

Förutsatt att allt är inkopplat och påslagen bör du nu kunna starta systemet och få Kinect -spåret att rösta! Men om du har en Kinect 1473, öppna först filen ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch i en textredigerare och ställ in parametern using_kinect_1473 till true. Dessutom, om du använde en annan servo än jag gjorde är det förmodligen en vanlig analog servo, så medan du är i startfilen ändrar du parametern min_us till 1000, max_us till 2000 och max_deg till 180.

roslaunch kinect_doa kinect_doa.launch

Lek med det ett tag. Om du tycker att systemet är för känsligt (tittar i slumpmässiga riktningar som inte motsvarar röster eller distinkta ljud), försök ändra parametern white_noise_ratio i startfilen och starta om systemet tills responsiviteten är på en nivå du är bekväm med. Att höja förhållandet kommer att göra systemet mindre lyhörd och vice versa. Du kommer sannolikt att behöva utföra denna inställning när du flyttar systemet till en annan plats för att få den prestanda du vill ha.

För att starta programmet när vi slår på Pi använder vi paketet robot_upstart för att installera vår startfil. Om ROS inte körs för närvarande, starta det med kommandot roscore. Öppna sedan en ny terminal och installera lanseringen med:

rosrun robot_upstart installera kinect_doa/launch/kinect_doa.launch -användarrot --symlink

Vi skapar en symlänk till startfilen istället för att kopiera den så att vi kan ändra parametrar genom att redigera ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch.

Steg 9: Dölja det på kontoret

Döljer det på kontoret
Döljer det på kontoret

Nu till det roliga. Gå in på jobbet efter timmar och ställ upp din skyltdocka i hemlighet. Sedan är det bara att luta sig tillbaka och se hur lång tid det tar för dina arbetskamrater att komma igång! Din nya skapelse kommer garanterat att vända några huvuden …

Rekommenderad: