Cuprins:

Cap de manechin localizator sunet cu Kinect: 9 pași (cu imagini)
Cap de manechin localizator sunet cu Kinect: 9 pași (cu imagini)

Video: Cap de manechin localizator sunet cu Kinect: 9 pași (cu imagini)

Video: Cap de manechin localizator sunet cu Kinect: 9 pași (cu imagini)
Video: 27. Convolutional Neural Networks 2024, Iulie
Anonim
Cap de manechin localizator sunet cu Kinect
Cap de manechin localizator sunet cu Kinect

Faceți cunoștință cu Margaret, un manechin de testare pentru un sistem de monitorizare a oboselii șoferului. Recent s-a retras din atribuțiile sale și și-a găsit drumul spre spațiul nostru de birouri și de atunci a atras atenția celor care cred că este „înfiorătoare”. În interesul justiției, i-am dat capacitatea de a-i înfrunta pe acuzatorii ei direct; în loc să te urmărească aparent cu privirea ei fără suflet, acum o face de fapt. Sistemul utilizează matricea de microfoane a unui Microsoft Kinect și un servo pentru a o orienta în direcția oamenilor care vorbesc în apropierea ei.

Pasul 1: Teorie

Teorie
Teorie

Calculul unghiului

Când auzim ceva, cu excepția cazului în care acel zgomot este direct în fața noastră, ajunge la o ureche înaintea celeilalte. Creierele noastre percep acea întârziere de sosire și o transformă într-o direcție generală din care provine zgomotul, permițându-ne să găsim sursa. Putem realiza exact același tip de localizare folosind o pereche de microfoane. Luați în considerare diagrama prezentată, care conține o pereche de microfoane și o sursă de sunet. Dacă privim de sus în jos, undele sonore sunt circulare, dar dacă distanța până la sursă este mare în raport cu distanța dintre microfoane, atunci din punctul de vedere al senzorilor noștri, unda este aproximativ plană. Aceasta este cunoscută sub numele de ipoteza câmpului îndepărtat și simplifică geometria problemei noastre.

Deci, presupuneți că frontul de undă este o linie dreaptă. Dacă sunetul vine din dreapta, va atinge microfonul # 2 la ora t2 și microfonul # 1 la ora t1. Distanța d sunetul parcurs între microfonul # 2 și microfonul # 1 este diferența de timp în detectarea sunetului înmulțit cu viteza sunetului v s:

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

Putem relaționa această distanță cu distanța d 12 dintre perechea de microfon și unghiul θ de la pereche la sursa de sunet cu relația:

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

Deoarece avem doar două microfoane, va exista ambiguitate în calculul nostru dacă sursa de sunet este în față sau în spatele nostru. În acest sistem, vom presupune că sursa de sunet este în fața perechii și fixăm unghiul între 0 grade (complet în dreapta perechii) la 180 de grade (complet în stânga).

În cele din urmă, putem rezolva pentru theta luând cosinusul invers:

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

Pentru a face unghiul puțin mai natural, putem scădea 90 de grade din theta, astfel încât 0 grade să fie direct în fața perechii și +/- 90 de grade să fie complet stânga sau complet dreapta. Aceasta transformă expresia noastră din cosinusul invers în sinusul invers.

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

Găsirea întârzierii

După cum puteți vedea din ecuația de mai sus, tot ceea ce trebuie să rezolvăm pentru unghiul este întârzierea undei sonore care ajunge la microfonul unu comparativ cu microfonul doi; viteza sunetului și distanța dintre microfoane sunt atât fixe, cât și cunoscute. Pentru a realiza acest lucru, mai întâi eșantionăm semnalele audio la frecvența fs, transformându-le din analog în digital și stocând datele pentru utilizare ulterioară. Eșantionăm pentru o perioadă de timp cunoscută sub numele de fereastră de eșantionare, care are o durată suficient de lungă pentru a capta trăsături distincte ale undei noastre sonore. De exemplu, fereastra noastră ar putea reprezenta valoarea audio din ultima jumătate de secundă.

După obținerea semnalelor audio cu ferestre, găsim întârzierea dintre cele două calculând corelația lor încrucișată. Pentru a calcula corelația încrucișată, menținem semnalul cu fereastră de la un microfon fix și alunecăm al doilea semnal de-a lungul axei timpului de la tot drumul în spatele primului la tot drumul înainte de primul. La fiecare pas de-a lungul diapozitivului, înmulțim fiecare punct al semnalului nostru fix cu punctul corespunzător din semnalul nostru de alunecare, apoi însumăm toate rezultatele pentru a calcula coeficientul de corelație pentru acel pas. După finalizarea diapozitivului nostru, pasul care are cel mai mare coeficient de corelație corespunde punctului în care cele două semnale sunt cele mai asemănătoare și la ce pas ne aflăm câte eșantioane n semnalul doi este compensat de semnalul 1. Dacă n este negativ, atunci semnalul doi rămâne în urma semnalului unu, dacă este pozitiv, semnalul doi este în față, iar dacă este zero, atunci cele două sunt deja aliniate. Convertim acest offset de eșantion la o întârziere de timp folosind frecvența noastră de eșantionare cu relația Δt = n / fs, astfel:

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

Pasul 2: Componente

Părți

  • Microsoft Kinect pentru Xbox 360, modelul 1414 sau 1473. Kinect are patru microfoane dispuse într-o matrice liniară pe care o vom folosi.
  • Adaptor pentru a converti conectorul proprietar al Kinect la USB + alimentare CA ca acesta.
  • Raspberry Pi 2 sau 3 rulează Raspbian Stretch. Am încercat inițial să folosesc un Pi 1 Model B +, dar nu a fost suficient de puternic. Am tot avut probleme la deconectarea de la Kinect.
  • Cel mai înfiorător cap de manechin pe care îl poți găsi
  • Un servo analogic suficient de puternic pentru a vă întoarce capul de manechin
  • Un încărcător de perete USB de 5V cu suficientă intensitate pentru a alimenta atât Pi, cât și servo și cel puțin două porturi. (Am folosit o mufă 5A cu 3 porturi similară cu aceasta
  • Un cablu prelungitor cu două prize (una pentru încărcătorul de perete USB și cealaltă pentru adaptorul de curent alternativ Kinect.
  • Două cabluri USB: un cablu de tip A la micro-USB pentru a alimenta Pi și altul pentru a alimenta servo-ul pe care nu vă deranjează să îl tăiați
  • O platformă pe care să stea totul și o altă platformă mai mică pentru capul de manechin. Am folosit o tavă de servire din plastic ca bază și o placă de plastic ca platformă pentru cap. Ambii erau de la Walmart și costau doar câțiva dolari
  • 4x # 8-32 șuruburi și piulițe de 1/2 "pentru a atașa servo-ul la platforma mai mare
  • 2x șurub M3 8mm cu șaibe (sau de orice dimensiune aveți nevoie pentru a atașa claxonul servo la platforma mai mică)
  • Două fire jumper de la bărbat la bărbat, unul roșu și unul negru și un fir de jumper de la femeie la mascul
  • Benzi cu velcro adeziv
  • Bandă electrică
  • Bandă pentru conducte pentru gestionarea cablurilor

Instrumente

  • Dremel cu roată de tăiere
  • Burghiu
  • Burghie de 7/64 ", 11/16" și 5/16"
  • M3 robinet (Opțional, în funcție de servo corn)
  • Şurubelniţă
  • Fier de lipit cu lipit
  • Mâinile în ajutor (opțional)
  • Marker
  • Busolă
  • Decapanti de sârmă
  • Multimetru (opțional)

EIP

  • Ochelari de protectie

  • Mască de față (pentru biți din plastic dremmel).

Pasul 3: Ansamblul platformei inferioare

Ansamblul platformei inferioare
Ansamblul platformei inferioare
Ansamblul platformei inferioare
Ansamblul platformei inferioare
Ansamblul platformei inferioare
Ansamblul platformei inferioare

Prima parte pe care o vom face este platforma inferioară, care va deține Kinect, servo și toată electronica noastră. Pentru a crea platforma veți avea nevoie de:

  • Tava de servire din plastic
  • Servo
  • 4x șuruburi # 8-32 1/2 "cu piulițe
  • Dremel cu roată de tăiere
  • Şurubelniţă
  • Burghiu
  • Burghiu de 11/16"
  • Marker

Modul de a face

  1. Întoarceți tava cu capul în jos.
  2. Așezați servo-ul lateral în spatele tăvii, asigurați-vă că angrenajul de ieșire al servo-ului se află de-a lungul liniei centrale a tăvii, apoi marcați în jurul bazei servo-ului.
  3. Folosind dremelul și roata tăietoare, decupați zona pe care ați marcat-o, apoi glisați servo-ul în slotul său.
  4. Marcați centrele găurilor de montare a carcasei servo de pe tavă, apoi scoateți servo-ul și găuriți aceste găuri cu burghiul dvs. de 11/16 ". Este foarte ușor să spargeți plastic subțire așa când găuriți găuri, așa că mi se pare mult mai sigur pentru a rula burghiul în sens invers și a micșora încet materialul. Este mult mai lent decât găurirea corectă a găurilor, dar asigură că nu există fisuri.
  5. Așezați servo-ul înapoi în slot, apoi montați-l pe tavă cu șuruburile și piulițele # 8-32.

Pasul 4: Asamblarea platformei capului

Ansamblul platformei capului
Ansamblul platformei capului
Ansamblul platformei capului
Ansamblul platformei capului
Ansamblul platformei capului
Ansamblul platformei capului
Ansamblul platformei capului
Ansamblul platformei capului

Următoarea parte pe care o vom face va fi o platformă pentru conectarea capului manechinului la servo. Pentru a realiza platforma capului veți avea nevoie de:

  • Farfurie de plastic
  • Servo corn
  • 2x șurub M3 8mm cu șaibe
  • Şurubelniţă
  • Burghiu
  • Burghie de 7/64 "și 5/16"
  • Busolă
  • Dremel cu roată de tăiere

Modul de a face

  1. Puneți busola pe raza bazei capului de manechin.
  2. Folosiți busola pentru a marca un cerc centrat pe centrul plăcii. Aceasta va fi dimensiunea reală a platformei noastre principale.
  3. Utilizați dremel și roata tăietoare pentru a tăia platforma mai mică din placă.
  4. Găuriți centrul noii dvs. platforme cu un burghiu de 5/16 ". Acest lucru ne va oferi acces la șurubul care montează servo claxonul nostru la servo. Pentru a oferi stabilității platformei în timp ce am forat gaura, am pus o bobină de sârmă sub el și găurită prin centrul bobinei.
  5. Aliniați claxonul servo cu centrul platformei și marcați două găuri pentru a atașa claxonul la platformă. Asigurați-vă că aceste găuri de montare sunt suficient de îndepărtate, astfel încât să existe loc pentru șuruburile și șaibele M3.
  6. Forează aceste găuri marcate cu un burghiu de 7/64 ".
  7. Gaura inferioară a claxonului meu servo a fost netedă, adică nu avea filetele pentru șurubul M3. Astfel, mi-am folosit burghiul și un robinet M3 pentru a face firele.
  8. Folosiți șuruburile și șaibele pentru a atașa claxonul servo la platforma capului.

Pasul 5: Cablu de alimentare servo

Cablu de alimentare servo
Cablu de alimentare servo
Cablu de alimentare servo
Cablu de alimentare servo
Cablu de alimentare servo
Cablu de alimentare servo
Cablu de alimentare servo
Cablu de alimentare servo

Servo-urile analogice sunt de obicei alimentate cu 4,8-6V. Deoarece Raspberry Pi va fi deja alimentat de 5V de pe USB, ne vom simplifica sistemul prin alimentarea servo-ului de pe USB. Pentru a face acest lucru, va trebui să modificăm un cablu USB. Pentru a realiza cablul de alimentare servo, veți avea nevoie de:

  • Cablu USB de rezervă cu un capăt de tip A (genul care se conectează la computer)
  • Un fir roșu și unul negru
  • Ciocan de lipit
  • Solder
  • Decapanti de sârmă
  • Bandă electrică
  • Mâinile în ajutor (opțional)
  • Multimetru (opțional)

Modul de a face

  1. Tăiați conectorul non USB de tip A de pe cablu, apoi scoateți o parte din izolație pentru a dezvălui cele patru fire interioare. Tăiați ecranul care înconjoară firele expuse.
  2. De obicei, cablul USB va avea patru fire: două pentru transmiterea și recepția datelor și două pentru alimentare și împământare. Ne interesează puterea și solul, care sunt de obicei roșu și respectiv negru. Îndepărtați o parte din izolația firelor roșii și negre și tăiați firele verzi și albe. Dacă vă faceți griji că nu aveți cablurile de alimentare și de împământare corecte, vă puteți conecta cablul la adaptorul de alimentare USB și puteți verifica tensiunea de ieșire cu un multimetru.
  3. Apoi, tăiați un capăt al cablurilor jumper roșu și negru și îndepărtați o parte din izolație.
  4. Acum, răsuciți împreună firele negre expuse ale jumperului și cablurilor USB. Treceți peste firele expuse și răsuciți-le unul în jurul celuilalt. Apoi, aplicați lipirea pe firele împerecheate pentru a le menține împreună. Ajutarea mâinilor va face acest lucru mai ușor ținându-vă cablurile în poziție.
  5. Repetați pasul 4 pentru firele roșii.
  6. Acoperiți cablurile expuse cu bandă electrică sau tuburi termocontractabile dacă vă simțiți fantezie. Aceste îmbinări vor fi fragile, deoarece firele sunt atât de mici, așa că adăugați un al doilea strat de bandă care ține cablurile jumper la izolația exterioară a cablului USB. Acest lucru va face ansamblul mai rigid și, prin urmare, este mai puțin probabil să se rupă de la îndoire.

Pasul 6: Montare electronică

Montare electronică
Montare electronică
Montare electronică
Montare electronică
Montare electronică
Montare electronică

În cele din urmă, vom aduce totul împreună, montând electronicele noastre și orice altceva pe platforma inferioară. Vei avea nevoie:

  • Platforma inferioară
  • Platforma capului
  • Cap de manechin
  • Kinect cu adaptor USB + AC
  • Adaptor de alimentare USB
  • Prelungitor
  • Cablu micro USB
  • Cablu de alimentare servo
  • Raspberry Pi
  • Cablu jumper de la bărbat la femeie
  • Velcro adeziv
  • Foarfece

Modul de a face

  1. Montați Pi în partea inferioară a tăvii cu Velcro.
  2. Atașați adaptorul de alimentare USB cu Velcro.
  3. Conectați servo și Pi la adaptorul de alimentare USB.
  4. Conectați pinul 12 (GPIO18) al Pi la cablul de semnal al servo-ului. Este al șaselea pin în dreapta.
  5. Trageți cablul prelungitor prin mânerul din spate al tăvii și conectați adaptorul de alimentare USB într-o parte.
  6. Luați adaptorul Kinect USB + AC și conectați adaptorul de alimentare în cealaltă parte a cablului prelungitor și USB în Pi.
  7. Trageți cablul Kinect prin mânerul frontal al tăvii și conectați-l la adaptorul Kinect.
  8. Am folosit bandă adezivă pentru a ține cablurile pe partea inferioară a platformei. Acest lucru nu arată cel mai elegant, dar din fericire toate acestea sunt ascunse.
  9. Răsuciți platforma în partea dreaptă în sus și folosiți Velcro pentru a monta Kinect în partea din față a platformei.
  10. Folosiți Velcro pentru a monta capul manechinului pe platforma capului. Odată ce totul este aliniat, separați cele două piese, astfel încât să putem accesa șurubul de montare a claxonului servo. Totuși, nu înșurubați claxonul la servo, deoarece trebuie să ne asigurăm că servo este în poziția centrală mai întâi, astfel încât să putem alinia totul. Vom face acest lucru într-un pas ulterior.

Pasul 7: Software și algoritm

Software și algoritm
Software și algoritm

Prezentare generală

Software-ul pentru acest proiect este scris în C ++ și este integrat cu Robot Operating System (ROS), un cadru pentru scrierea software-ului de robotică. În ROS, software-ul pentru un sistem este împărțit într-o colecție de programe numite noduri, în care fiecare nod implementează o subsecțiune specifică a funcționalității sistemului. Datele sunt transmise între noduri utilizând o metodă de publicare / abonare, unde nodurile care produc datele le publică și nodurile care consumă datele se abonează la aceasta. Decuplarea codului în acest mod permite extinderea cu ușurință a funcționalității sistemului și permite partajarea nodurilor între sisteme pentru o dezvoltare mai rapidă.

În acest sistem, ROS este utilizat în primul rând pentru a separa codul care calculează direcția de sosire (DOA) a sursei de sunet de codul care controlează servo, permițând altor proiecte să includă estimarea Kinect DOA fără a include codul servo de care s-ar putea să nu aibă nevoie sau doresc. Dacă doriți să priviți codul în sine, acesta poate fi găsit pe GitHub:

github.com/raikaDial/kinect_doa

Nodul Kinect DOA

Nodul kinect_doa este carnea și oasele acestui sistem, făcând practic tot ceea ce este interesant. La pornire, inițializează nodul ROS, făcând posibilă toată magia ROS, apoi încarcă firmware-ul pe Kinect, astfel încât fluxurile audio să devină disponibile. Apoi creează un fir nou care deschide fluxurile audio și începe să citească datele microfonului. Kinect își eșantionează cele patru microfoane la o frecvență de 16 kHz fiecare, deci este bine să aveți corelația încrucișată și colectarea datelor în fire separate pentru a evita lipsa datelor din cauza sarcinii de calcul. Interfața cu Kinect se realizează folosind libfreenect, un popular driver open-source.

Firul de colectare execută o funcție de apel invers ori de câte ori sunt primite date noi și ambele stochează datele și determină când se estimează DOA. Datele de la fiecare microfon sunt stocate în tampoane de rulare egale în lungime cu fereastra noastră de eșantionare, care este aici 8192 de eșantioane. Acest lucru se traduce prin calcularea corelației încrucișate cu valoarea aproximativă a datelor din ultima jumătate de secundă, ceea ce am constatat prin experimentare a fi un bun echilibru între performanță și sarcina de calcul. Estimarea DOA este declanșată pentru fiecare 4096 de probe prin semnalizarea firului principal, astfel încât corelațiile încrucișate consecutive se suprapun cu 50%. Luați în considerare un caz în care nu există suprapuneri și faceți un zgomot foarte rapid care se reduce la jumătate de fereastra de eșantionare. Înainte și după sunetul dvs. distinctiv, probabil va fi zgomot alb, care poate fi greu de aliniat cu corelația încrucișată. Ferestrele suprapuse ne oferă un eșantion mai complet al sunetului, sporind fiabilitatea corelației noastre încrucișate oferindu-ne mai multe caracteristici distincte de aliniat.

Firul principal așteaptă semnalul din firul de colectare, apoi calculează estimarea DOA. În primul rând, verifică însă dacă formele de undă capturate sunt semnificativ diferite de zgomotul alb. Fără această verificare, ne-am calcula estimarea de patru ori pe secundă, indiferent dacă au existat sau nu zgomote interesante, iar capul nostru de manechin ar fi o mizerie spastică. Algoritmul de detectare a zgomotului alb utilizat în acest sistem este primul dintre cele două enumerate aici. Calculăm raportul dintre integralul absolut al derivatei formei noastre de undă și integrala sa absolută; pentru semnale cu conținut ridicat de zgomot alb acest raport este mai mare decât pentru semnale mai puțin zgomotoase. Prin stabilirea unui prag pentru acest raport care separă zgomotul de non-zgomot, putem declanșa corelația încrucișată numai atunci când este cazul. Desigur, acest raport este ceva ce trebuie reglat de fiecare dată când sistemul este mutat într-un mediu nou.

Odată ce a stabilit că formele de undă conțin un conținut semnificativ non-zgomot, programul continuă cu corelațiile încrucișate. Cu toate acestea, există trei optimizări importante încorporate în aceste calcule:

  1. Există patru microfoane pe Kinect, ceea ce înseamnă că există șase perechi totale de forme de undă pe care le putem corela. Cu toate acestea, dacă vă uitați la dispunerea spațială a matricei de microfoane, puteți vedea că microfoanele 2, 3 și 4 sunt foarte apropiate unele de altele. De fapt, sunt atât de apropiate încât, datorită vitezei sunetului și a frecvenței noastre de eșantionare, formele de undă primite la 2, 3 și 4 vor fi separate de cel mult un eșantion înainte sau în spate, pe care îl putem verifica cu calculul maxlag = Δd * fs / vs, unde Δd este separarea perechii de microfoane, fs este frecvența de eșantionare și vs este viteza sunetului. Astfel, corelarea perechilor dintre aceste trei este inutilă și trebuie doar să corelăm microfonul 1 cu 2, 3 și 4.
  2. Se știe că corelația standard a semnalelor audio funcționează slab în prezența reverberațiilor (ecouri). O alternativă robustă este cunoscută sub numele de corelație încrucișată generalizată cu transformarea fazei (GCC-PHAT). Această metodă se reduce la aplicarea unei funcții de ponderare care amplifică vârfurile în corelație încrucișată, făcând mai ușoară distincția semnalului original de ecouri. Am comparat performanța GCC-PHAT cu simpla corelație încrucișată într-o cameră de reverberație (citiți: baia de beton fiind remodelată) și am constatat că GCC-PHAT este de 7 ori mai eficient în estimarea unghiului corect.
  3. Când efectuăm corelația încrucișată, luăm cele două semnale, alunecând unul de-a lungul celuilalt și, la fiecare pas, înmulțind fiecare punct din semnalul nostru fix cu fiecare punct din semnalul nostru de alunecare. Pentru două semnale de lungime n, rezultă n ^ 2 calcule. Am putea îmbunătăți acest lucru efectuând în schimb corelația încrucișată în domeniul frecvenței, ceea ce implică o transformare fourier rapidă (calcule nlogn), înmulțind fiecare punct dintr-un semnal transformat cu punctul corespunzător din celălalt (n calcule), apoi efectuând o inversă transformată fourier pentru a reveni la domeniul timpului (calcule nlogn), rezultând n + 2 * calcule nlogn, mai mici decât n ^ 2. Cu toate acestea, aceasta este abordarea naivă. Microfoanele din matricea noastră sunt atât de apropiate și viteza sunetului este atât de lentă încât formele de undă audio vor fi deja în mare parte aliniate. Astfel, putem deschide corelația noastră încrucișată pentru a lua în considerare doar compensările care sunt ușor înainte sau în spate. Pentru microfoanele 1 și 4, întârzierea trebuie să se încadreze între +/- 12 eșantioane, ceea ce înseamnă că pentru fiecare corelație încrucișată trebuie să efectuăm numai calcule de 24 * n, rezultând economii computaționale atunci când formele noastre de undă depășesc 2900 de eșantioane.

Acest sistem utilizează biblioteca minidsp, care implementează algoritmul GCC-PHAT cu optimizare 3.

Odată găsit decalajul în semnalele de la fiecare pereche de microfoane, programul alege valoarea mediană pentru decalaj, îl folosește pentru a calcula unghiul estimat și publică rezultatul, astfel încât să poată fi folosit pentru a controla servo-ul.

Nod de control servo

În comparație cu nodul kinect_doa, nodul servo este relativ simplu. Sarcina sa este de a lua DOA estimat și de a muta servo în acel unghi. Folosește biblioteca wiringPi pentru a accesa modulul hardware PWM al Raspberry Pi, folosindu-l pentru a seta unghiul servo. Majoritatea servo-urilor analogice sunt controlate de un semnal PWM cu o lățime a impulsului variind de la 1000 µs la 2000 µs, corespunzând unui unghi de la 0 ° la 180 °, dar servo-ul folosit de mine a fost controlat cu 500 µs la 2500 µs, corespunzând unui unghi de la 0 ° la 270 °. Astfel, nodul este configurabil pentru diferite servo hardware prin setarea parametrilor pentru lățimea minimă a impulsului, lățimea maximă a impulsului și diferența dintre unghiurile maxime și minime. În plus, servo nu se deplasează imediat la unghiul țintă, ci se deplasează mai degrabă spre unghi la o viteză configurabilă, oferindu-i lui Margaret o atmosferă mai treptată și mai înfiorătoare (în plus, sunetul unui servo care se mișcă repede înainte și înapoi devine enervant foarte repede).

Pasul 8: Construire și instalare

Instalați dependențe:

Mai întâi, instalați libfreenect. Trebuie să-l construim din sursă, deoarece versiunea pe care o puteți obține cu managerul de pachete nu include suport pentru audio. Acest lucru se datorează faptului că trebuie să încărcăm firmware-ul pe Kinect pentru a activa sunetul, iar redistribuirea acestui firmware nu este legală în anumite jurisdicții. În plus, putem evita crearea de exemple care necesită OpenGL și glut, inutile pentru instalațiile Raspbian fără cap.

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 = OFF make sudo make install sudo cp ~ / libfreenect / platform / lin / cd.rules /etc/udev/rules.d udevadm control --reload-rules && udevadm trigger

Apoi, trebuie să instalăm pachetul wiringPi, care ne permite să controlăm pinii GPIO ai Pi:

CD

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

Atașați capul manechinului:

Cu wiringPi instalat, putem face acum o ocolire rapidă înapoi la hardware-land pentru a atașa capul manechinului pe platforma inferioară. Pentru a centra servo-ul prin linia de comandă, introduceți următoarele comenzi:

gpio pwm-ms

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

Dacă nu există mișcare, atunci servo-ul dvs. este probabil deja centrat. Pentru a fi sigur, totuși, puteți seta servo-ul la o valoare non-centrală, de ex. gpio -g pwm 18 200, apoi setați-l la 150.

Odată ce sunteți sigur că servo-ul este centrat, atașați claxonul servo al platformei capului la servo, astfel încât capul dvs. de manechin să privească drept înainte. Apoi, înșurubați claxonul pe servo și atașați-vă capul prin bițele Velcro.

Instalați ROS:

Apoi, instalați ROS pe Pi. Un ghid excelent de instalare poate fi găsit aici; pentru sistemul nostru nu avem nevoie de OpenCV, deci puteți sări peste pasul 3. Această versiune va dura câteva ore pentru a fi finalizată. După ce ați terminat de urmat ghidul de instalare, adăugați sursa de instalare la bashrc, astfel încât să putem folosi pachetele ROS nou instalate:

ecou "sursă /opt/ros/kinetic/setup.bash" >> ~ /.bashrc

Construiți pachetul Kinect DOA:

După toate cele făcute, creați un spațiu de lucru pentru proiectul nostru și introduceți directorul src:

mkdir -p ~ / kinect_doa_ws / src

cd ~ / kinect_doa_ws / src

Codul pentru acest proiect este conținut în pachetul kinect_doa, deci clonați-l în directorul src al noului dvs. spațiu de lucru:

git clone

Pachetul robot_upstart oferă un instrument ușor de utilizat pentru instalarea fișierelor de lansare, astfel încât acestea să ruleze la pornire, deci clonați-l și în spațiul de lucru:

git clone

Acum, putem construi codul proiectului apelând catkin_make din directorul de nivel superior al spațiului nostru de lucru, apoi sursa noastră de construcție, astfel încât pachetele noastre să fie disponibile:

cd ~ / kinect_doa_ws

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

Rularea și reglarea:

Presupunând că totul este conectat și pornit, ar trebui să puteți lansa sistemul și să vă urmăriți Kinect! Cu toate acestea, dacă aveți un Kinect 1473, deschideți mai întâi fișierul ~ / kinect_doa_ws / src / kinect_doa / launch / kinect_doa.launch într-un editor de text și setați parametrul folosind_kinect_1473 la true. În plus, dacă ați folosit un servo diferit de mine, probabil că este un servo analogic standard. Deci, în fișierul de lansare, schimbați parametrul min_us la 1000, max_us la 2000 și max_deg la 180.

roslaunch kinect_doa kinect_doa.launch

Joacă-te cu el o vreme. Dacă simțiți că sistemul este prea sensibil (căutați în direcții aleatorii care nu corespund vocilor sau zgomotelor distinctive), încercați să modificați parametrul white_noise_ratio din fișierul de lansare și să relansați sistemul până când reacția este la un nivel cu care vă simțiți confortabil. Creșterea raportului va face sistemul mai puțin receptiv și invers. Probabil va trebui să efectuați această reglare ori de câte ori mutați sistemul într-o altă locație pentru a obține performanța dorită.

Pentru a lansa programul când pornim Pi, folosim pachetul robot_upstart pentru a instala fișierul de lansare. Dacă ROS nu rulează în prezent, porniți-l cu comanda roscore. Apoi, deschideți un terminal nou și instalați lansarea cu:

rosrun robot_upstart instalare kinect_doa / launch / kinect_doa.launch --utilizator rădăcină --symlink

Creăm un link simbolic către fișierul de lansare în loc să îl copiem, astfel încât să putem modifica parametrii editând ~ / kinect_doa_ws / src / kinect_doa / launch / kinect_doa.launch.

Pasul 9: Ascunderea la birou

Ascunderea la birou
Ascunderea la birou

Acum, pentru partea distractivă. Mergeți la lucru după ore și setați-vă manechinul în secret. Apoi, stai pe spate și vezi cât durează colegii tăi să prindă! Ești nouă creație este garantat să întoarcă câteva capete …

Recomandat: