Indholdsfortegnelse:

Sound Localizing Mannequin Head With Kinect: 9 trin (med billeder)
Sound Localizing Mannequin Head With Kinect: 9 trin (med billeder)

Video: Sound Localizing Mannequin Head With Kinect: 9 trin (med billeder)

Video: Sound Localizing Mannequin Head With Kinect: 9 trin (med billeder)
Video: SCP 093 Red Sea Object - The Red Disc When Used On Mirrors Takes You To Another World! 2024, Juli
Anonim
Lyd Lokaliserende Mannequinhoved Med Kinect
Lyd Lokaliserende Mannequinhoved Med Kinect

Mød Margaret, en testdummy til et førertræthedsovervågningssystem. Hun trak sig for nylig tilbage fra sine pligter og fandt vej til vores kontorlokaler og har siden tiltrukket opmærksomheden hos dem, der synes, hun er 'uhyggelig'. I retfærdighedens interesse har jeg givet hende muligheden for at møde sine anklagere direkte; i stedet for tilsyneladende at følge dig med sit sjælløse blik, nu gør hun det faktisk. Systemet bruger mikrofonarrayet af en Microsoft Kinect og en servo til at styre hende i retning af, at folk taler i nærheden af hende.

Trin 1: Teori

Teori
Teori

Beregning af vinklen

Når vi hører noget, når det ikke er støj direkte foran os, når det det ene øre før det andet. Vores hjerner opfatter den ankomstforsinkelse og konverterer den til en generel retning, støj kommer fra, så vi kan finde kilden. Vi kan opnå præcis den samme lokalisering ved hjælp af et par mikrofoner. Overvej det viste diagram, der indeholder et mikrofonpar og en lydkilde. Hvis vi kigger ovenfra og ned, er lydbølger cirkulære, men hvis afstanden til kilden er stor i forhold til afstanden mellem mikrofonerne, er bølgen fra synspunktet på vores sensorer omtrent plan. Dette er kendt som fjernfeltantagelsen og forenkler geometrien i vores problem.

Så antag, at bølgefronten er en lige linje. Hvis lyden kommer fra højre, rammer den mikrofon #2 på tidspunktet t2 og mikrofon #1 på tidspunktet t1. Afstanden d lyden tilbagelagt mellem at ramme mikrofon #2 og mikrofon #1 er tidsforskellen i at detektere lyden ganget med lydens hastighed v s:

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

Vi kan relatere denne afstand til afstanden d 12 mellem mikrofonparret og vinklen θ fra parret til lydkilden med forholdet:

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

Fordi vi kun har to mikrofoner, vil der være uklarhed i vores beregning af, om lydkilden er foran eller bag os. I dette system antager vi, at lydkilden er foran parret og klemmer vinklen mellem 0 grader (helt til højre for parret) til 180 grader (helt til venstre).

Endelig kan vi løse theta ved at tage den inverse cosinus:

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

For at gøre vinklen lidt mere naturlig kan vi trække 90 grader fra theta, så 0 grader er direkte foran parret og +/- 90 grader er fuldt til venstre eller fuldt til højre. Dette vender vores udtryk fra den inverse cosinus til den inverse sinus.

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

Find forsinkelsen

Som du kan se fra ligningen ovenfor, er alt, hvad vi skal løse for vinklen, forsinkelsen i lydbølgen, der ankommer til mikrofon en sammenlignet med mikrofon to; lydens hastighed og afstanden mellem mikrofonerne er både faste og kendte. For at opnå dette prøver vi først lydsignalerne ved frekvensen fs, konverterer dem fra analog til digital og lagrer dataene til senere brug. Vi sampler i en periode kendt som prøveudtagningsvindue, som har en tilstrækkelig lang varighed til at fange karakteristiske træk ved vores lydbølge. For eksempel kan vores vindue være lyddata for det sidste halve sekund.

Efter at have opnået de vindueslydende lydsignaler finder vi forsinkelsen mellem de to ved at beregne deres krydskorrelation. For at beregne krydskorrelationen holder vi det vinduesignal fra en mikrofon fast og skubber det andet signal langs tidsaksen fra hele vejen bag den første til hele vejen foran den første. Ved hvert trin langs vores dias multiplicerer vi hvert punkt i vores faste signal med det tilsvarende punkt i vores glidesignal og summerer derefter alle resultaterne for at beregne vores korrelationskoefficient for det trin. Efter at have afsluttet vores dias, svarer det trin, der har den højeste korrelationskoefficient, til det punkt, hvor de to signaler er mest ens, og hvilket trin vi er på fortæller os, hvor mange prøver n signal to er forskudt fra signal 1. Hvis n er negativ, så halter signal to bag signal et, hvis det er positivt, så er signal to foran, og hvis det er nul, er de to allerede justeret. Vi konverterer denne prøveoffset til en tidsforsinkelse ved hjælp af vores samplingsfrekvens med forholdet Δt = n/fs, således:

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

Trin 2: Komponenter

Dele

  • Microsoft Kinect til Xbox 360, model 1414 eller 1473. Kinect har fire mikrofoner arrangeret i et lineært array, vi vil bruge.
  • Adapter til konvertering af Kinect's proprietære stik til USB + vekselstrøm som denne.
  • Raspberry Pi 2 eller 3 kører Raspbian Stretch. Jeg forsøgte oprindeligt at bruge en Pi 1 Model B+, men den var ikke kraftig nok. Jeg blev ved med at have problemer med at afbryde forbindelsen til Kinect.
  • Det mest uhyggelige mannequinhoved, du kan finde
  • En analog servo stærk nok til at dreje dit mannequinhoved
  • En 5V USB -vægoplader med nok strømstyrke til at drive både Pi og servoen og mindst to porte. (Jeg brugte et 5A 3-port stik der ligner dette
  • En forlængerledning med to stikkontakter (den ene til USB -vægopladeren og den anden til Kinect -vekselstrømsadapteren.
  • To USB-kabler: et type-A til mikro-USB-kabel til at drive Pi og et andet til at drive servoen, som du ikke har noget imod at skære op
  • En platform for alt at sidde på og en anden mindre platform til mannequinhovedet. Jeg brugte en serveringsbakke af plast som bund og en plastikplade som hovedplatform. Begge var fra Walmart og kostede kun få dollars
  • 4x #8-32 1/2 "bolte og møtrikker til at fastgøre din servo til den større platform
  • 2x M3 8 mm bolt med skiver (eller hvilken størrelse du end har brug for at fastgøre dit servohorn til den mindre platform)
  • To tromler fra mand til mand, en rød og en sort, og en hun-til-mand jumpertråd
  • Selvklæbende velcrobånd med ryg
  • Elektrisk tape
  • Gaffatape til kabelhåndtering

Værktøjer

  • Dremel med skærehjul
  • Bore
  • 7/64 ", 11/16" og 5/16 "bor
  • M3 -hane (valgfri, afhængigt af dit servohorn)
  • Skruetrækker
  • Loddejern med lodning
  • Hjælpende hænder (valgfrit)
  • Markør
  • Kompas
  • Wire strippere
  • Multimeter (valgfrit)

PPE

  • Sikkerhedsbriller

  • Ansigtsmaske (til dremmel-ed plastik bits).

Trin 3: Nedre platformsamling

Nedre platform forsamling
Nedre platform forsamling
Nedre platform forsamling
Nedre platform forsamling
Nedre platform forsamling
Nedre platform forsamling

Den første del, vi vil lave, er den nederste platform, som vil indeholde vores Kinect, servo og al vores elektronik. For at lave platformen skal du bruge:

  • Serveringsbakke i plast
  • Servo
  • 4x #8-32 1/2 "bolte med møtrikker
  • Dremel med skærehjul
  • Skruetrækker
  • Bore
  • 11/16 "bor
  • Markør

Hvordan laver man

  1. Vend din bakke på hovedet.
  2. Placer din servo sidelæns nær bagsiden af bakken, sørg for, at servoens outputgear ligger langs bakkens midterlinje, og markér derefter rundt om bunden af servoen.
  3. Brug dit dremel og skærehjul til at skære det område, du markerede ud, og skub derefter din servo ind i dens slot.
  4. Marker midten af servohusets monteringshuller på bakken, fjern derefter servoen og bor hullerne ud med dit 11/16 "bor. Det er meget let at revne tynd plast på denne måde, når du borer huller, så jeg finder det meget sikrere at køre boremaskinen baglæns og langsomt sive materialet væk. Det er meget langsommere end at bore hullerne ordentligt, men det sikrer, at der ikke er revner.
  5. Læg din servo tilbage i åbningen, og monter den derefter på bakken med #8-32 bolte og møtrikker.

Trin 4: Hovedplatformssamling

Hovedplatformssamling
Hovedplatformssamling
Hovedplatformssamling
Hovedplatformssamling
Hovedplatformssamling
Hovedplatformssamling
Hovedplatformssamling
Hovedplatformssamling

Den næste del, vi vil lave, vil være en platform til at forbinde mannequinhovedet til servoen. For at lave hovedplatformen skal du bruge:

  • Plastplade
  • Servo horn
  • 2x M3 8 mm bolt med skiver
  • Skruetrækker
  • Bore
  • 7/64 "og 5/16" bor
  • Kompas
  • Dremel med skærehjul

Hvordan laver man

  1. Indstil dit kompas til radius af bunden af dit mannequinhoved.
  2. Brug dit kompas til at markere en cirkel centreret på midten af pladen. Dette vil være den faktiske størrelse på vores hovedplatform.
  3. Brug dit dremel og skærehjul til at skære den mindre platform ud af pladen.
  4. Bor midten af din nye platform ud med et 5/16 "bor. Dette giver os adgang til skruen, der monterer vores servohorn til vores servo. For at give platformen stabilitet, mens jeg borede hullet, satte jeg en spole med tråd under den og boret gennem midten af spolen.
  5. Stil dit servohorn op med midten af platformen, og marker to huller for at fastgøre hornet til platformen. Sørg for, at disse monteringshuller er langt nok fra hinanden, så der er plads til dine M3 bolthoveder og skiver.
  6. Bor disse markerede huller ud med et 7/64 "bor.
  7. Det nederste hul på mit servohorn var glat, det vil sige, at det ikke havde gevindene til M3 -bolten. Således brugte jeg min boremaskine og en M3 -hane til at lave trådene.
  8. Brug boltene og skiverne til at fastgøre servohornet til hovedplatformen.

Trin 5: Servokabel

Servo strømkabel
Servo strømkabel
Servo strømkabel
Servo strømkabel
Servo strømkabel
Servo strømkabel
Servo strømkabel
Servo strømkabel

Analoge servoer drives typisk med 4,8-6V. Da Raspberry Pi allerede kommer til at blive drevet af 5V fra USB, vil vi forenkle vores system ved også at drive servoen fra USB. For at gøre dette skal vi ændre et USB -kabel. For at lave servokablet skal du bruge:

  • Reserve USB-kabel med en type A-ende (den type, der tilsluttes din computer)
  • En rød og en sort jumper wire
  • Loddekolbe
  • Lodde
  • Wire strippere
  • Elektrisk tape
  • Hjælpende hænder (valgfrit)
  • Multimeter (valgfrit)

Hvordan laver man

  1. Skær det ikke-USB type-A-stik af dit kabel, og fjern derefter lidt af isoleringen for at afsløre de fire indvendige ledninger. Afskærmningen, der omgiver de udsatte ledninger.
  2. Typisk vil USB -kablet have fire ledninger: to til dataoverførsel og modtagelse og to til strøm og jord. Vi er interesseret i strøm og jord, som normalt er henholdsvis røde og sorte. Fjern noget af isoleringen af de røde og sorte ledninger, og afskær de grønne og hvide ledninger. Hvis du er bekymret for, at du ikke har de korrekte strøm- og jordledninger, kan du tilslutte dit kabel til din USB -strømadapter og kontrollere udgangsspændingen med et multimeter.
  3. Skær derefter den ene ende af dine røde og sorte jumperkabler og fjern noget af isoleringen.
  4. Nu skal du sno de synlige sorte ledninger på din jumper og USB -kabler sammen. Kryds over midten af de udsatte ledninger og vrid dem om hinanden. Påfør derefter loddetin på de parrede tråde for at holde dem sammen. Hjælpende hænder vil gøre dette lettere ved at holde dine kabler på plads.
  5. Gentag trin 4 for de røde tråde.
  6. Dæk de eksponerede ledninger med elektrisk tape eller krympeslange, hvis du har lyst. Disse led vil være skrøbelige, da ledningerne er så små, så tilføj et andet lag tape, der holder jumperkablerne til den ydre isolering af USB -kablet. Dette vil gøre samlingen mere stiv og dermed mindre tilbøjelig til at bryde fra at blive bøjet.

Trin 6: Elektronikmontering

Elektronikmontering
Elektronikmontering
Elektronikmontering
Elektronikmontering
Elektronikmontering
Elektronikmontering

Endelig vil vi bringe alt sammen og montere vores elektronik og alt andet til den lavere platform. Du får brug for:

  • Nedre platform
  • Hovedplatform
  • Mannequin hoved
  • Kinect med USB+AC -adapter
  • USB strømadapter
  • Forlængerledning
  • Micro USB kabel
  • Servo strømkabel
  • Hindbær Pi
  • Jumperkabel fra mand til kvinde
  • Selvklæbende velcro
  • Saks

Hvordan laver man

  1. Monter Pi'en i bunden af bakken med velcro.
  2. Tilslut USB -strømadapteren med velcro.
  3. Tilslut servo og Pi til USB -strømadapteren.
  4. Tilslut pin 12 (GPIO18) på Pi til signalkablet på servoen. Det er den 6. pin nede til højre.
  5. Slange din forlængerledning gennem baghåndtaget på bakken, og tilslut USB -strømadapteren til den ene side.
  6. Tag Kinect USB+AC -adapteren, og sæt strømadapteren i den anden side af forlængerledningen og USB'en i Pi.
  7. Slang ledningen til Kinect gennem det forreste håndtag på bakken, og sæt den i Kinect -adapteren.
  8. Jeg brugte tape til at holde kablerne på undersiden af platformen. Dette ser ikke det mest elegante ud, men alt dette er heldigvis skjult.
  9. Vip platformen med højre side opad, og brug velcro til at montere Kinect foran på platformen.
  10. Brug velcro til at montere mannequinhovedet på hovedplatformen. Når alt er opstillet, adskiller du dog de to stykker, så vi kan få adgang til servohornets monteringsskrue. Skru dog ikke hornet til servoen endnu, da vi skal sikre os, at servoen først er i midterposition, så vi kan stille alt op. Vi gør dette i et senere trin.

Trin 7: Software og algoritme

Software og algoritme
Software og algoritme

Oversigt

Softwaren til dette projekt er skrevet i C ++ og er integreret med Robot Operating System (ROS), en ramme for skrivning af robotsoftware. I ROS er softwaren til et system opdelt i en samling af programmer kaldet noder, hvor hver node implementerer en bestemt undersektion af systemets funktionalitet. Data videregives mellem noder ved hjælp af en publish/subscribe -metode, hvor nodes, der producerer dataene, publicerer dem og nodes, der forbruger dataene, abonnerer på det. Afkobling af koden på denne måde gør det muligt let at udvide systemfunktionaliteten og tillade noder at blive delt mellem systemer for hurtigere udvikling.

I dette system bruges ROS primært til at adskille koden, der beregner ankomstkirken (DOA) for lydkilden, fra koden, der styrer servoen, så andre projekter kan inkludere Kinect DOA -estimatet uden at inkludere servokode, de muligvis ikke har brug for eller ønsker. Hvis du vil se på selve koden, kan den findes på GitHub:

github.com/raikaDial/kinect_doa

Kinect DOA Node

Kinect_doa -noden er kød og knogler i dette system og gør stort set alt interessant. Ved opstart initialiserer den ROS -noden, hvilket gør al ROS -magien mulig og uploader derefter firmware til Kinect, så lydstrømmene bliver tilgængelige. Det skaber derefter en ny tråd, der åbner lydstrømmene og begynder at læse i mikrofondata. Kinect prøver sine fire mikrofoner med en frekvens på 16 kHz hver, så det er godt at have krydskorrelationen og dataindsamlingen i separate tråde for at undgå manglende data på grund af beregningsmæssig belastning. Interfacing med Kinect opnås ved hjælp af libfreenect, en populær open source-driver.

Samlingstråden udfører en tilbagekaldsfunktion, når der modtages nye data, og både gemmer dataene og bestemmer, hvornår DOA skal estimeres. Dataene fra hver mikrofon gemmes i rullende buffere, der er lige lange som vores prøveudtagningsvindue, som her er 8192 prøver. Dette oversætter til beregning af krydskorrelationen med omkring det sidste halve sekunds data, hvad jeg fandt ved at eksperimentere var en god balance mellem ydelse og beregningsbelastning. DOA-estimeringen udløses for hver 4096 prøver ved at signalere hovedtråden, således at på hinanden følgende krydskorrelationer overlapper med 50%. Overvej et tilfælde, hvor der ikke er nogen overlapning, og du laver en meget hurtig støj, der bliver skåret i halve af prøveudtagningsvinduet. Før og efter vil din karakteristiske lyd sandsynligvis være hvid støj, hvilket kan være svært at stille op med krydskorrelationen. Overlappende vinduer giver os et mere komplet eksempel på lyden, hvilket øger pålideligheden af vores krydskorrelation ved at give os mere forskellige funktioner til at stille op.

Hovedtråden venter på signalet fra indsamlingstråden og beregner derefter DOA -estimatet. Først kontrollerer den dog, om de fangede bølgeformer er væsentligt forskellige fra hvid støj. Uden denne kontrol ville vi beregne vores estimat fire gange i sekundet, uanset om der var interessante lyde eller ej, og vores mannequinhoved ville være et spastisk rod. Den hvide støjdetekteringsalgoritme, der bruges i dette system, er den første af de to, der er angivet her. Vi beregner forholdet mellem det absolutte integral af derivatet af vores bølgeform til dets absolutte integral; for signaler med højt indhold af hvid støj er dette forhold højere end for mindre støjende signaler. Ved at indstille en tærskel for dette forhold, der adskiller støj fra ikke-støj, kan vi kun udløse krydskorrelationen, når det er relevant. Selvfølgelig er dette forhold noget, der skal justeres hver gang systemet flyttes til et nyt miljø.

Når først det er fastslået, at bølgeformerne indeholder betydeligt ikke-støjindhold, fortsætter programmet med krydskorrelationerne. Der er dog tre vigtige optimeringer indbygget i disse beregninger:

  1. Der er fire mikrofoner på Kinect, hvilket betyder, at der er seks samlede par bølgeformer, vi kan krydskorrelere. Men hvis du ser på det rumlige arrangement af mikrofonarrayet, kan du se, at mikrofoner 2, 3 og 4 er meget tæt på hinanden. Faktisk er de så tæt på, at på grund af lydens hastighed og vores samplingsfrekvens vil de bølgeformer, der modtages ved 2, 3 og 4, adskilles med højst en prøve foran eller bagved, som vi kan verificere med beregningen maxlag = Δd *fs/vs, hvor Δd er adskillelsen af mikrofonparret, fs er samplingsfrekvensen og vs er lydens hastighed. Således er det ubrugeligt at korrelere par mellem disse tre, og vi behøver kun at krydskorrelere mikrofon 1 med 2, 3 og 4.
  2. Standard krydskorrelation af lydsignaler vides at fungere dårligt i nærvær af efterklang (ekkoer). Et robust alternativ er kendt som den generaliserede krydskorrelation med fasetransform (GCC-PHAT). Denne metode går ud på at anvende en vægtningsfunktion, der forstærker toppe i krydskorrelationen, hvilket gør det lettere at skelne det originale signal fra ekkoer. Jeg sammenlignede udførelsen af GCC-PHAT med den simple krydskorrelation i et efterklangskammer (læs: betonbadeværelse, der blev ombygget), og fandt GCC-PHAT at være 7 gange mere effektiv til at estimere den korrekte vinkel.
  3. Når vi udfører krydskorrelationen, tager vi de to signaler, glider det ene langs det andet og multiplicerer hvert punkt i vores faste signal med hvert punkt i vores glidesignal. For to signaler med længden n resulterer dette i n^2 beregninger. Vi kunne forbedre dette ved i stedet at udføre krydskorrelationen i frekvensdomænet, hvilket involverer en hurtig fouriertransformation (nlogn-beregninger), multiplicere hvert punkt i et transformeret signal med det tilsvarende punkt i det andet (n-beregninger) og derefter udføre en invers fourier transform for at gå tilbage til tidsdomænet (nlogn -beregninger), hvilket resulterer i n+2*nlogn -beregninger, mindre end n^2. Dette er imidlertid den naive tilgang. Mikrofonerne i vores array er så tæt på hinanden, og lydhastigheden er så relativt langsom, at lydbølgeformerne allerede for det meste vil blive justeret. Således kan vi vindue vores krydskorrelation til kun at overveje forskydninger, der er lidt foran eller bagud. For mikrofoner 1 og 4 skal forsinkelsen falde mellem +/- 12 prøver, hvilket betyder, at vi for hver krydskorrelation kun skal udføre 24*n beregninger, hvilket resulterer i beregningsbesparelser, når vores bølgeformer er længere end 2900 prøver.

Dette system udnytter minidsp-biblioteket, som implementerer GCC-PHAT-algoritmen med optimering 3.

Når programmet har fundet forsinkelsen i signalerne fra hvert mikrofonpar, vælger programmet medianværdien for forsinkelse, bruger det til at beregne den estimerede vinkel og offentliggør resultatet, så det kan bruges til at styre servoen.

Servokontrolknude

Sammenlignet med kinect_doa -noden er servo -noden relativt enkel. Dens opgave er udelukkende at tage den estimerede DOA og flytte servoen til den vinkel. Det bruger wiringPi -biblioteket til at få adgang til hardware PWM -modulet på Raspberry Pi og bruge det til at indstille vinklen på servoen. De fleste analoge servoer styres af et PWM -signal med en pulsbredde fra 1000 µs til 2000 µs, svarende til en vinkel på 0 ° til 180 °, men den servo, jeg brugte, blev styret med 500 µs til 2500 µs, svarende til en vinkel 0 til 270 °. Således kan noden konfigureres til forskellige servohardware ved at indstille parametre for minimumspulsbredden, maksimal pulsbredde og forskellen mellem maksimal- og minimumsvinkler. Derudover bevæger servoen sig ikke umiddelbart til målvinklen, men bevæger sig snarere mod vinklen med en konfigurerbar hastighed, hvilket giver Margaret en mere gradvis, uhyggelig stemning (plus lyden af en servo, der bevæger sig hurtigt frem og tilbage, bliver irriterende virkelig hurtigt).

Trin 8: Byg og installation

Installer afhængigheder:

Installer først libfreenect. Vi skal bygge det fra kilden, fordi den version, du kan få med pakkehåndteringen, ikke inkluderer understøttelse af lyd. Dette er fordi vi skal uploade firmware til Kinect for at aktivere lyd, og omfordeling af denne firmware er ikke lovligt i visse jurisdiktioner. Derudover kan vi undgå at bygge eksemplerne, som kræver OpenGL og glut, unødvendigt for hovedløse Raspbian -installationer.

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

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

Dernæst skal vi installere wiringPi -pakken, som giver os mulighed for at styre GPIO -benene på Pi:

cd

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

Monter hovedmand:

Med wiringPi installeret kan vi nu tage en hurtig omvej tilbage til hardware-land for at fastgøre mannequinhovedet på den nederste platform. For at centrere servoen via kommandolinjen skal du indtaste følgende kommandoer:

gpio pwm-ms

gpio pwmc 192 gpio pwmr 2000 gpio -g pwm 18150

Hvis der ikke er nogen bevægelse, er din servo sandsynligvis allerede centreret. For at være sikker kan du dog indstille servoen til en ikke-centerværdi, f.eks. gpio -g pwm 18 200, og sæt den derefter tilbage til 150.

Når du er sikker på, at servoen er centreret, skal du fastgøre servohornet på hovedplatformen til servoen, så dit mannequinhoved ser lige frem. Skru derefter hornet på servoen og fastgør dit hoved via velcrobitsene.

Installer ROS:

Installer derefter ROS på din Pi. En god installationsguide kan findes her; til vores system har vi ikke brug for OpenCV, så du kan springe trin 3. over. Denne build vil tage flere timer at fuldføre. Når du er færdig med at følge installationsvejledningen, skal du tilføje installationen til din bashrc, så vi kan bruge vores nyinstallerede ROS -pakker:

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

Byg Kinect DOA -pakke:

Efter alt det der er gjort, skal du lave et catkin -arbejdsområde til vores projekt og indtaste src -biblioteket:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

Koden til dette projekt er indeholdt i kinect_doa -pakken, så klon den ind i src -biblioteket i dit nye arbejdsområde:

git -klon

Pakken robot_upstart giver et brugervenligt værktøj til installation af startfiler, så de kører ved opstart, så klon også dette ind i dit arbejdsområde:

git -klon

Nu kan vi bygge projektkoden ved at ringe til catkin_make fra biblioteket på øverste niveau i vores arbejdsområde og derefter kilde vores build, så vores pakker er tilgængelige:

cd ~/kinect_doa_ws

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

Løb og tuning:

Forudsat at alt er tilsluttet og tændt, skal du nu kunne starte systemet og få Kinect -sporet til at stemme! Men hvis du har en Kinect 1473, skal du først åbne filen ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch i et teksteditor og indstille parameteren using_kinect_1473 til true. Derudover, hvis du brugte en anden servo end jeg gjorde, er det sandsynligvis en standard analog servo, så mens du er i startfilen, skal du ændre parameteren min_us til 1000, max_us til 2000 og max_deg til 180.

roslaunch kinect_doa kinect_doa.lancering

Leg med det et stykke tid. Hvis du føler, at systemet er for følsomt (ser i tilfældige retninger, der ikke svarer til stemmer eller markante lyde), kan du prøve at ændre parameteren white_noise_ratio i startfilen og genstarte systemet, indtil lydhørheden er på et niveau, du er tryg ved. Højere forhold vil gøre systemet mindre lydhørt og omvendt. Du bliver sandsynligvis nødt til at udføre denne tuning, når du flytter systemet til et andet sted for at få den ønskede ydelse.

For at starte programmet, når vi tænder for Pi, bruger vi pakken robot_upstart til at installere vores startfil. Hvis ROS ikke kører i øjeblikket, skal du starte det med kommandoen roscore. Åbn derefter en ny terminal og installer lanceringen med:

rosrun robot_upstart installer kinect_doa/launch/kinect_doa.launch --brugerrot --symlink

Vi opretter et symlink til startfilen i stedet for at kopiere den, så vi kan ændre parametre ved at redigere ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch.

Trin 9: Skjul det på kontoret

Skjuler det på kontoret
Skjuler det på kontoret

Nu til den sjove del. Gå på arbejde efter timer og sæt dit mannequinhoved op i hemmelighed. Læn dig derefter tilbage og se, hvor lang tid det tager for dine medarbejdere at fange! Din nye skabelse vil med garanti vende et par hoveder …

Anbefalede: