Inhoudsopgave:

Geluid lokaliseren etalagepop hoofd met Kinect - Ajarnpa
Geluid lokaliseren etalagepop hoofd met Kinect - Ajarnpa

Video: Geluid lokaliseren etalagepop hoofd met Kinect - Ajarnpa

Video: Geluid lokaliseren etalagepop hoofd met Kinect - Ajarnpa
Video: Verstopping - Toren C 2024, Juli-
Anonim
Geluid lokaliserende etalagepop met Kinect
Geluid lokaliserende etalagepop met Kinect

Maak kennis met Margaret, een testpop voor een vermoeidheidsbewakingssysteem voor chauffeurs. Ze is onlangs gestopt met haar taken en vond haar weg naar onze kantoorruimte, en heeft sindsdien de aandacht getrokken van degenen die haar 'griezelig' vinden. In het belang van gerechtigheid heb ik haar de mogelijkheid gegeven om haar aanklagers rechtstreeks onder ogen te zien; in plaats van je schijnbaar te volgen met haar zielloze blik, doet ze dat nu echt. Het systeem gebruikt de microfoonarray van een Microsoft Kinect en een servo om haar te sturen in de richting van mensen die bij haar in de buurt praten.

Stap 1: Theorie

Theorie
Theorie

Hoek berekenen

Als we iets horen, bereikt het ene oor voor het andere, tenzij dat geluid recht voor ons is. Onze hersenen nemen die aankomstvertraging waar en zetten dat om in een algemene richting waar het geluid vandaan komt, waardoor we de bron kunnen vinden. We kunnen exact dezelfde soort lokalisatie bereiken met behulp van een paar microfoons. Beschouw het getoonde diagram, dat een microfoonpaar en een geluidsbron bevat. Als we van boven naar beneden kijken, zijn geluidsgolven cirkelvormig, maar als de afstand tot de bron groot is ten opzichte van de afstand tussen de microfoons, dan is de golf vanuit het gezichtspunt van onze sensoren ongeveer vlak. Dit staat bekend als de far-field-aanname en vereenvoudigt de geometrie van ons probleem.

Dus neem aan dat het golffront een rechte lijn is. Als het geluid van rechts komt, zal het microfoon #2 raken op tijdstip t2 en microfoon #1 op tijdstip t1. De afstand d die het geluid heeft afgelegd tussen het raken van microfoon #2 en microfoon #1 is het tijdsverschil bij het detecteren van het geluid vermenigvuldigd met de geluidssnelheid vs:

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

We kunnen deze afstand relateren aan de afstand d 12 tussen het microfoonpaar en de hoek θ van het paar tot de geluidsbron met de relatie:

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

Omdat we maar twee microfoons hebben, zal er onduidelijkheid zijn in onze berekening of de geluidsbron voor of achter ons is. In dit systeem gaan we ervan uit dat de geluidsbron voor het paar staat en klemmen de hoek tussen 0 graden (helemaal rechts van het paar) tot 180 graden (helemaal naar links).

Ten slotte kunnen we theta oplossen door de inverse cosinus te nemen:

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

Om de hoek wat natuurlijker te maken, kunnen we 90 graden van theta aftrekken, zodat 0 graden direct voor het paar staat en +/- 90 graden volledig links of volledig rechts is. Dit verandert onze uitdrukking van de inverse cosinus in de inverse sinus.

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

De vertraging vinden

Zoals je kunt zien aan de hand van de bovenstaande vergelijking, hoeven we alleen maar de vertraging op te lossen in de geluidsgolf die bij microfoon één aankomt in vergelijking met microfoon twee; de geluidssnelheid en de afstand tussen de microfoons zijn zowel vast als bekend. Om dit te bereiken, samplen we eerst de audiosignalen op de frequentie fs, converteren we ze van analoog naar digitaal en slaan we de gegevens op voor later gebruik. We samplen gedurende een periode die bekend staat als het bemonsteringsvenster, dat lang genoeg is om onderscheidbare kenmerken van onze geluidsgolf vast te leggen. Ons venster kan bijvoorbeeld de audiogegevens van de laatste halve seconde zijn.

Na het verkrijgen van de audiosignalen met vensters, vinden we de vertraging tussen de twee door hun kruiscorrelatie te berekenen. Om de kruiscorrelatie te berekenen, houden we het venstersignaal van de ene microfoon vast en schuiven het tweede signaal langs de tijdas van helemaal achter de eerste naar helemaal voor de eerste. Bij elke stap langs onze dia vermenigvuldigen we elk punt in ons vaste signaal met het overeenkomstige punt in ons glijdende signaal, en tellen vervolgens alle resultaten bij elkaar op om onze correlatiecoëfficiënt voor die stap te berekenen. Na het voltooien van onze dia, komt de stap met de hoogste correlatiecoëfficiënt overeen met het punt waar de twee signalen het meest op elkaar lijken, en in welke stap we ons bevinden, vertelt ons hoeveel monsters n signaal twee is verschoven van signaal 1. Als n negatief is, dan loopt signaal twee achter op signaal één, als het positief is, dan is signaal twee vooruit, en als het nul is, zijn de twee al uitgelijnd. We converteren deze sample-offset naar een tijdvertraging met behulp van onze samplefrequentie met de relatie Δt = n/fs, dus:

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

Stap 2: Componenten

Onderdelen

  • Microsoft Kinect voor Xbox 360, model 1414 of 1473. De Kinect heeft vier microfoons gerangschikt in een lineaire array die we zullen gebruiken.
  • Adapter om de eigen connector van de Kinect om te zetten naar USB + AC-stroom zoals deze.
  • Raspberry Pi 2 of 3 met Raspbian Stretch. Ik probeerde oorspronkelijk een Pi 1 Model B+ te gebruiken, maar het was niet krachtig genoeg. Ik had steeds problemen met het loskoppelen van de Kinect.
  • Het engste mannequinhoofd dat je kunt vinden
  • Een analoge servo die sterk genoeg is om het hoofd van je mannequin te draaien
  • Een 5V USB-wandoplader met voldoende stroomsterkte om zowel de Pi als de servo en ten minste twee poorten van stroom te voorzien. (Ik gebruikte een 5A 3-poorts stekker vergelijkbaar met deze)
  • Een verlengsnoer met twee uitgangen (een voor de USB-wandoplader en de andere voor de Kinect AC-adapter.
  • Twee USB-kabels: een type-A naar micro-USB-kabel om de Pi van stroom te voorzien en een andere om de servo van stroom te voorzien die je niet erg vindt om te snijden
  • Een platform voor alles om op te zitten en nog een kleiner platform voor het hoofd van de mannequin. Ik gebruikte een plastic dienblad als basis en een plastic bord als het hoofdplatform. Beiden waren van Walmart en kosten maar een paar dollar
  • 4x #8-32 1/2" bouten en moeren om uw servo aan het grotere platform te bevestigen
  • 2x M3 8 mm bout met ringen (of welke maat je ook nodig hebt om je servohoorn aan het kleinere platform te bevestigen)
  • Twee man-naar-mannelijke doorverbindingsdraden, een rode en een zwarte, en een vrouw-naar-mannelijke doorverbindingsdraad
  • Klittenbandstrips met zelfklevende achterkant
  • Elektrische tape
  • Ducttape voor kabelbeheer

Gereedschap

  • Dremel met snijwiel
  • Oefening
  • 7/64", 11/16" en 5/16" boren
  • M3 tap (optioneel, afhankelijk van je servohoorn)
  • Schroevendraaier
  • Soldeerbout met soldeer
  • Helpende handen (optioneel)
  • Markeerstift
  • Kompas
  • Draadstrippers
  • Multimeter (optioneel)

PBM

  • Veiligheidsbril

  • Gezichtsmasker (voor dremmel-ed plastic bits).

Stap 3: Lagere platformmontage

Lagere platformmontage
Lagere platformmontage
Lagere platformmontage
Lagere platformmontage
Lagere platformmontage
Lagere platformmontage

Het eerste deel dat we zullen maken is het onderste platform, dat onze Kinect, servo en al onze elektronica zal bevatten. Om het platform te maken heb je nodig:

  • Kunststof dienblad
  • Servo
  • 4x #8-32 1/2" bouten met moeren
  • Dremel met snijwiel
  • Schroevendraaier
  • Oefening
  • 11/16 "boor
  • Markeerstift

Hoe te maken

  1. Draai je dienblad ondersteboven.
  2. Plaats uw servo zijwaarts in de buurt van de achterkant van de lade, zorg ervoor dat de uitvoerversnelling van de servo langs de middellijn van de lade ligt en markeer vervolgens rond de basis van de servo.
  3. Gebruik je dremel en snijwiel om het gemarkeerde gebied uit te snijden en schuif vervolgens je servo in de gleuf.
  4. Markeer de middelpunten van de montagegaten van de servobehuizing op de lade, verwijder vervolgens de servo en boor die gaten uit met uw 11/16 "boor. Het is heel gemakkelijk om dun plastic op deze manier te kraken bij het boren van gaten, dus ik vind het veel veiliger om de boor achteruit te laten lopen en het materiaal langzaam weg te snijden. Het is veel langzamer dan het boren van de gaten, maar het zorgt ervoor dat er geen scheuren zijn.
  5. Plaats uw servo terug in de sleuf en monteer deze vervolgens op de lade met de # 8-32 bouten en moeren.

Stap 4: Hoofdplatformmontage

Hoofdplatformassemblage
Hoofdplatformassemblage
Hoofdplatformassemblage
Hoofdplatformassemblage
Hoofdplatformassemblage
Hoofdplatformassemblage
Hoofdplatformassemblage
Hoofdplatformassemblage

Het volgende deel dat we zullen maken, is een platform om de kop van de mannequin met de servo te verbinden. Om het hoofdplatform te maken, heb je nodig:

  • Plastic bord
  • Servohoorn
  • 2x M3 8mm bout met ringen
  • Schroevendraaier
  • Oefening
  • 7/64" en 5/16" boren
  • Kompas
  • Dremel met snijwiel

Hoe te maken

  1. Stel uw kompas in op de straal van de basis van het hoofd van uw mannequin.
  2. Gebruik je kompas om een cirkel in het midden van de plaat te markeren. Dit is de werkelijke grootte van ons hoofdplatform.
  3. Gebruik je dremel en snijwiel om het kleinere platform uit de plaat te snijden.
  4. Boor het midden van je nieuwe platform uit met een boor van 5/16 ". Dit geeft ons toegang tot de schroef waarmee onze servohoorn aan onze servo wordt bevestigd. Om het platform stabiliteit te geven terwijl ik het gat boorde, heb ik een spoel met draad eronder en door het midden van de spoel geboord.
  5. Lijn uw servohoorn uit met het midden van het platform en markeer twee gaten om de hoorn aan het platform te bevestigen. Zorg ervoor dat deze montagegaten ver genoeg uit elkaar staan, zodat er ruimte is voor uw M3-boutkoppen en -ringen.
  6. Boor deze gemarkeerde gaten uit met een boor van 7/64".
  7. Het onderste gat van mijn servohoorn was glad, d.w.z. het had geen schroefdraad voor de M3-bout. Dus gebruikte ik mijn boormachine en een M3-tap om de schroefdraad te maken.
  8. Gebruik de bouten en ringen om de servohoorn aan het hoofdplatform te bevestigen.

Stap 5: Servo-voedingskabel

Servo-voedingskabel
Servo-voedingskabel
Servo-voedingskabel
Servo-voedingskabel
Servo-voedingskabel
Servo-voedingskabel
Servo-voedingskabel
Servo-voedingskabel

Analoge servo's worden meestal gevoed met 4,8-6V. Aangezien de Raspberry Pi al gevoed gaat worden met 5V via USB, zullen we ons systeem vereenvoudigen door ook de servo van stroom te voorzien via USB. Om dit te doen, moeten we een USB-kabel aanpassen. Om de servo-voedingskabel te maken, hebt u nodig:

  • Reserve USB-kabel met een type A-uiteinde (het soort dat op uw computer wordt aangesloten)
  • Een rode en een zwarte jumper draad
  • Soldeerbout
  • Soldeer
  • Draadstrippers
  • Elektrische tape
  • Helpende handen (optioneel)
  • Multimeter (optioneel)

Hoe te maken

  1. Knip de niet-USB type-A-connector van uw kabel af en verwijder vervolgens een beetje van de isolatie om de vier binnenste draden te onthullen. Knip de afscherming rond de blootliggende draden af.
  2. Meestal heeft de USB-kabel vier draden: twee voor gegevensoverdracht en -ontvangst en twee voor stroom en aarde. We zijn geïnteresseerd in stroom en aarde, die respectievelijk rood en zwart zijn. Strip een deel van de isolatie van de rode en zwarte draden en knip de groene en witte draden af. Als je bang bent dat je niet de juiste stroom- en aardingskabels hebt, kun je je kabel in je USB-lichtnetadapter steken en de uitgangsspanning controleren met een multimeter.
  3. Knip vervolgens het ene uiteinde van uw rode en zwarte startkabels af en verwijder een deel van de isolatie.
  4. Draai nu de blootliggende zwarte draden van uw jumper- en USB-kabels samen. Steek de middelpunten van de blootliggende draden over en draai ze om elkaar heen. Breng vervolgens soldeer aan op de gekoppelde draden om ze bij elkaar te houden. Helpende handen maken dit gemakkelijker door uw kabels op hun plaats te houden.
  5. Herhaal stap 4 voor de rode draden.
  6. Bedek de blootliggende bedrading met elektrische tape of krimpkous als je zin hebt. Deze verbindingen zullen kwetsbaar zijn omdat de draden zo klein zijn, dus voeg een tweede laag tape toe die de startkabels vasthoudt aan de buitenste isolatie van de USB-kabel. Dit maakt het geheel stijver en zal dus minder snel breken door verbuigen.

Stap 6: Montage van elektronica

Elektronica Montage
Elektronica Montage
Elektronica Montage
Elektronica Montage
Elektronica Montage
Elektronica Montage

Ten slotte zullen we alles samenbrengen, onze elektronica en al het andere op het lagere platform monteren. Je zal nodig hebben:

  • Lager platform
  • Hoofdplatform
  • Mannequin hoofd
  • Kinect met USB+AC-adapter
  • USB-stroomadapter
  • Verlengsnoer
  • Micro-USB-kabel
  • Servo-voedingskabel
  • Raspberry Pi
  • Man-naar-vrouw startkabel
  • Zelfklevend klittenband
  • Schaar

Hoe te maken

  1. Monteer de Pi aan de onderkant van de lade met klittenband.
  2. Bevestig de USB-stroomadapter met klittenband.
  3. Steek servo en Pi in de USB-stroomadapter.
  4. Sluit pin 12 (GPIO18) van de Pi aan op de signaalkabel van de servo. Het is de 6e pin naar beneden aan de rechterkant.
  5. Steek uw verlengsnoer door de achterste handgreep van de lade en steek de USB-stroomadapter in één kant.
  6. Neem de Kinect USB+AC-adapter en steek de voedingsadapter in de andere kant van het verlengsnoer en de USB in de Pi.
  7. Steek het snoer van de Kinect door de voorste handgreep van de lade en steek de stekker in de Kinect-adapter.
  8. Ik gebruikte ducttape om de kabels aan de onderkant van het platform te houden. Dit ziet er niet het meest elegant uit, maar gelukkig is dit allemaal verborgen.
  9. Klap het platform met de goede kant naar boven en gebruik klittenband om de Kinect aan de voorkant van het platform te monteren.
  10. Gebruik klittenband om het hoofd van de mannequin op het hoofdplatform te monteren. Zodra alles is uitgelijnd, scheidt u de twee stukken zodat we toegang hebben tot de bevestigingsschroef van de servohoorn. Schroef de hoorn echter nog niet op de servo, want we moeten ervoor zorgen dat de servo eerst in de middenpositie staat, zodat we alles kunnen uitlijnen. We doen dit in een latere stap.

Stap 7: Software en algoritme

Software en algoritme
Software en algoritme

Overzicht

De software voor dit project is geschreven in C++ en is geïntegreerd met Robot Operating System (ROS), een raamwerk voor het schrijven van roboticasoftware. In ROS wordt de software voor een systeem opgedeeld in een verzameling programma's die knooppunten worden genoemd, waarbij elk knooppunt een specifieke subsectie van de systeemfunctionaliteit implementeert. Gegevens worden tussen knooppunten doorgegeven met behulp van een publish/subscribe-methode, waarbij knooppunten die de gegevens produceren deze publiceren en knooppunten die de gegevens verbruiken zich erop abonneren. Door de code op deze manier te ontkoppelen, kan de systeemfunctionaliteit eenvoudig worden uitgebreid en kunnen knooppunten worden gedeeld tussen systemen voor snellere ontwikkeling.

In dit systeem wordt ROS voornamelijk gebruikt om de code die de aankomstrichting (DOA) van de geluidsbron berekent te scheiden van de code die de servo bestuurt, waardoor andere projecten de Kinect DOA-schatting kunnen opnemen zonder servocode op te nemen die ze misschien niet nodig hebben of willen. Als je de code zelf wilt bekijken, is deze te vinden op GitHub:

github.com/raikaDial/kinect_doa

Kinect DOA-knooppunt

Het kinect_doa-knooppunt is het vlees en de botten van dit systeem en doet eigenlijk alles wat interessant is. Bij het opstarten initialiseert het de ROS-node, waardoor alle ROS-magie mogelijk wordt, en uploadt vervolgens de firmware naar de Kinect zodat de audiostreams beschikbaar komen. Het brengt dan een nieuwe thread voort die de audiostreams opent en begint met het inlezen van microfoongegevens. De Kinect bemonstert zijn vier microfoons met een frequentie van elk 16 kHz, dus het is goed om de kruiscorrelatie en de gegevensverzameling in afzonderlijke threads te hebben om te voorkomen dat er gegevens ontbreken vanwege de rekenbelasting. Interfacing met de Kinect wordt bereikt met behulp van libfreenect, een populaire open-source driver.

De verzamelthread voert een callback-functie uit wanneer nieuwe gegevens worden ontvangen, en slaat de gegevens op en bepaalt wanneer de DOA moet worden geschat. De gegevens van elke microfoon worden opgeslagen in rollende buffers die even lang zijn als ons bemonsteringsvenster, dat hier 8192 samples is. Dit vertaalt zich in het berekenen van de kruiscorrelatie met de gegevens van de afgelopen halve seconde, wat ik door experimenteren ontdekte als een goede balans tussen prestaties en rekenbelasting. De DOA-schatting wordt geactiveerd voor elke 4096 monsters door de hoofdthread te signaleren, zodat opeenvolgende kruiscorrelaties elkaar met 50% overlappen. Overweeg een geval waarin er geen overlap is en u een zeer snel geluid maakt dat door het bemonsteringsvenster wordt gehalveerd. Voor en na uw kenmerkende geluid zal waarschijnlijk witte ruis zijn, wat moeilijk kan worden uitgelijnd met de kruiscorrelatie. Overlappende vensters bieden ons een completer voorbeeld van het geluid, waardoor de betrouwbaarheid van onze kruiscorrelatie wordt vergroot door ons meer onderscheidende kenmerken te geven om op een rij te zetten.

De hoofdthread wacht op het signaal van de verzamelthread en berekent vervolgens de DOA-schatting. Eerst wordt echter gecontroleerd of de vastgelegde golfvormen al dan niet significant verschillen van witte ruis. Zonder deze controle zouden we onze schatting vier keer per seconde berekenen, ongeacht of er interessante geluiden waren of niet, en ons hoofd van de mannequin zou een spastische puinhoop zijn. Het algoritme voor detectie van witte ruis dat in dit systeem wordt gebruikt, is het eerste van de twee die hier worden vermeld. We berekenen de verhouding van de absolute integraal van de afgeleide van onze golfvorm tot zijn absolute integraal; voor signalen met een hoog gehalte aan witte ruis is deze verhouding hoger dan voor signalen met minder ruis. Door een drempel in te stellen voor deze verhouding die ruis en niet-ruis scheidt, kunnen we de kruiscorrelatie alleen activeren wanneer dat van toepassing is. Deze verhouding is natuurlijk iets dat elke keer dat het systeem naar een nieuwe omgeving wordt verplaatst, opnieuw moet worden afgesteld.

Nadat is vastgesteld dat de golfvormen significante niet-ruisinhoud bevatten, gaat het programma verder met de kruiscorrelaties. Er zijn echter drie belangrijke optimalisaties ingebouwd in deze berekeningen:

  1. Er zijn vier microfoons op de Kinect, wat betekent dat er in totaal zes paren golfvormen zijn die we kunnen kruiscorreleren. Als je echter naar de ruimtelijke opstelling van de microfoonarray kijkt, kun je zien dat microfoons 2, 3 en 4 heel dicht bij elkaar staan. In feite zijn ze zo dichtbij dat vanwege de snelheid van het geluid en onze bemonsteringsfrequentie de golfvormen die worden ontvangen op 2, 3 en 4 zullen worden gescheiden door maximaal één sample voor of achter, wat we kunnen verifiëren met de berekening maxlag = Δd *fs/vs, waarbij Δd de scheiding is van het microfoonpaar, fs de bemonsteringsfrequentie is en vs de geluidssnelheid is. Het correleren van paren tussen deze drie is dus nutteloos, en we hoeven alleen microfoon 1 te kruiscorreleren met 2, 3 en 4.
  2. Het is bekend dat standaard kruiscorrelatie van audiosignalen slecht presteert in aanwezigheid van nagalm (echo's). Een robuust alternatief staat bekend als de gegeneraliseerde kruiscorrelatie met fasetransformatie (GCC-PHAT). Deze methode komt neer op het toepassen van een weegfunctie die pieken in de kruiscorrelatie versterkt, waardoor het gemakkelijker wordt om het oorspronkelijke signaal van echo's te onderscheiden. Ik vergeleek de prestaties van GCC-PHAT met de eenvoudige kruiscorrelatie in een galmkamer (lees: betonnen badkamer die wordt verbouwd), en ontdekte dat GCC-PHAT 7 keer effectiever was in het schatten van de juiste hoek.
  3. Bij het uitvoeren van de kruiscorrelatie nemen we de twee signalen, schuiven we langs elkaar, en bij elke stap vermenigvuldigen we elk punt in ons vaste signaal met elk punt in ons glijdende signaal. Voor twee signalen met lengte n resulteert dit in n^2 berekeningen. We zouden dit kunnen verbeteren door in plaats daarvan de kruiscorrelatie in het frequentiedomein uit te voeren, wat een snelle Fourier-transformatie (nlogn-berekeningen) inhoudt, waarbij elk punt in het ene getransformeerde signaal wordt vermenigvuldigd met het corresponderende punt in het andere (n-berekeningen), en vervolgens een inverse fourier-transformatie om terug te gaan naar het tijdsdomein (nlogn-berekeningen), wat resulteert in n+2*nlogn-berekeningen, kleiner dan n^2. Dit is echter de naïeve benadering. De microfoons in onze array staan zo dicht bij elkaar en de geluidssnelheid is zo relatief langzaam dat de audiogolfvormen al grotendeels op elkaar zijn afgestemd. Zo kunnen we onze kruiscorrelatie ramen om alleen rekening te houden met offsets die iets voor of achter liggen. Voor microfoons 1 en 4 moet de lag tussen +/-12 samples liggen, wat betekent dat we voor elke kruiscorrelatie slechts 24*n berekeningen hoeven uit te voeren, wat resulteert in rekenbesparingen wanneer onze golfvormen langer zijn dan 2900 samples.

Dit systeem maakt gebruik van de minidsp-bibliotheek, die het GCC-PHAT-algoritme implementeert met optimalisatie 3.

Nadat de vertraging in de signalen van elk microfoonpaar is gevonden, kiest het programma de mediaanwaarde voor vertraging, gebruikt deze om de geschatte hoek te berekenen en publiceert het resultaat zodat het kan worden gebruikt om de servo te besturen.

Servobesturingsknooppunt

Vergeleken met het kinect_doa-knooppunt is het servo-knooppunt relatief eenvoudig. Het is zijn taak om alleen de geschatte DOA te nemen en de servo naar die hoek te verplaatsen. Het gebruikt de bedradingPi-bibliotheek om toegang te krijgen tot de hardware PWM-module van de Raspberry Pi, en gebruikt het om de hoek van de servo in te stellen. De meeste analoge servo's worden bestuurd door een PWM-signaal met een pulsbreedte van 1000 µs tot 2000 µs, wat overeenkomt met een hoek van 0° tot 180°, maar de servo die ik gebruikte werd bestuurd met 500 µs tot 2500 µs, wat overeenkomt met een hoek van 0° tot 270°. Het knooppunt is dus configureerbaar voor verschillende servohardware door parameters in te stellen voor de minimale pulsbreedte, maximale pulsbreedte en het verschil tussen de maximale en minimale hoeken. Bovendien beweegt de servo niet onmiddellijk naar de doelhoek, maar beweegt hij eerder naar de hoek met een configureerbare snelheid, waardoor Margaret een meer geleidelijke, griezelige sfeer krijgt (plus, het geluid van een servo die snel heen en weer beweegt, wordt heel snel vervelend).

Stap 8: bouwen en installeren

Afhankelijkheden installeren:

Installeer eerst libfreenect. We moeten het vanaf de broncode bouwen omdat de versie die u kunt krijgen met de pakketbeheerder geen ondersteuning voor audio bevat. Dit komt omdat we firmware naar de Kinect moeten uploaden om audio in te schakelen, en het opnieuw distribueren van deze firmware is in bepaalde rechtsgebieden niet legaal. Bovendien kunnen we voorkomen dat we voorbeelden bouwen die OpenGL en glut vereisen, wat niet nodig is voor headless Raspbian-installaties.

sudo apt-get install git cmake build-essentiële 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=OFF make sudo make install sudo cp ~/libfreenect/platform/linuxkinectev/51-.rules /etc/udev/rules.d udevadm control --reload-rules && udevadm trigger

Vervolgens moeten we het bedradingPi-pakket installeren, waarmee we de GPIO-pinnen van de Pi kunnen besturen:

CD

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

Bevestig Mannequin Hoofd:

Met wirePi geïnstalleerd kunnen we nu een snelle omweg maken terug naar hardware-land om de mannequin-kop op het lagere platform te bevestigen. Om de servo via de opdrachtregel te centreren, voert u de volgende opdrachten in:

gpio pwm-ms

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

Als er geen beweging is, is je servo waarschijnlijk al gecentreerd. Om zeker te zijn, zou je de servo echter op een niet-middenwaarde kunnen instellen, b.v. gpio -g pwm 18 200 en zet het dan terug op 150.

Zodra u zeker weet dat de servo gecentreerd is, bevestigt u de servohoorn van het hoofdplatform op de servo zodat uw mannequin-hoofd recht naar voren kijkt. Schroef vervolgens de hoorn op de servo en bevestig je hoofd via de klittenband.

ROS installeren:

Installeer vervolgens ROS op je Pi. Een geweldige installatiegids is hier te vinden; voor ons systeem hebben we OpenCV niet nodig, dus je kunt stap 3 overslaan. Deze build zal enkele uren in beslag nemen. Wanneer u klaar bent met het volgen van de installatiehandleiding, voegt u de installatie toe aan uw bashrc zodat we onze nieuw geïnstalleerde ROS-pakketten kunnen gebruiken:

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

Bouw een Kinect DOA-pakket:

Nadat dat allemaal is gedaan, maak je een catkin-werkruimte voor ons project en ga je naar de src-directory:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

De code voor dit project bevindt zich in het kinect_doa-pakket, dus kloon het naar de src-directory van uw nieuwe werkruimte:

git clone

Het robot_upstart-pakket biedt een eenvoudig te gebruiken hulpmiddel voor het installeren van startbestanden zodat ze bij het opstarten worden uitgevoerd, dus kloon dit ook naar uw werkruimte:

git clone

Nu kunnen we de projectcode bouwen door catkin_make aan te roepen vanuit de directory op het hoogste niveau van onze werkruimte en vervolgens onze build te sourcen zodat onze pakketten beschikbaar zijn:

cd ~/kinect_doa_ws

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

Lopen en afstemmen:

Ervan uitgaande dat alles is aangesloten en ingeschakeld, zou je nu in staat moeten zijn om het systeem te starten en de Kinect je stem te laten volgen! Als je echter een Kinect 1473 hebt, open dan eerst het bestand ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch in een teksteditor en stel de parameter using_kinect_1473 in op true. Bovendien, als je een andere servo hebt gebruikt dan ik, is het waarschijnlijk een standaard analoge servo, dus verander in het startbestand de parameter min_us in 1000, max_us in 2000 en max_deg in 180.

roslaunch kinect_doa kinect_doa.launch

Speel er even mee. Als u vindt dat het systeem te gevoelig is (kijken in willekeurige richtingen die niet overeenkomen met stemmen of kenmerkende geluiden), probeer dan de parameter white_noise_ratio in het startbestand te wijzigen en het systeem opnieuw te starten totdat het reactievermogen op een niveau is waar u zich prettig bij voelt. Het verhogen van de ratio zal het systeem minder responsief maken en vice versa. U zult deze afstemming waarschijnlijk moeten uitvoeren wanneer u het systeem naar een andere locatie verplaatst om de gewenste prestaties te krijgen.

Om het programma te starten wanneer we de Pi inschakelen, gebruiken we het robot_upstart-pakket om ons startbestand te installeren. Als ROS momenteel niet actief is, start u het met het commando roscore. Open vervolgens een nieuwe terminal en installeer de lancering met:

rosrun robot_upstart installeer kinect_doa/launch/kinect_doa.launch --user root --symlink

We maken een symbolische link naar het opstartbestand in plaats van het te kopiëren, zodat we parameters kunnen wijzigen door ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch te bewerken.

Stap 9: Verbergen op kantoor

Het verbergen op kantoor
Het verbergen op kantoor

Nu voor het leuke gedeelte. Ga na de werkuren aan het werk en zet je mannequin in het geheim met het hoofd omhoog. Leun dan achterover en kijk hoe lang het duurt voordat uw collega's het doorhebben! Je nieuwe creatie zal gegarandeerd een paar hoofden doen draaien…

Aanbevolen: