Sommario:

Testa di manichino con localizzazione del suono con Kinect: 9 passaggi (con immagini)
Testa di manichino con localizzazione del suono con Kinect: 9 passaggi (con immagini)

Video: Testa di manichino con localizzazione del suono con Kinect: 9 passaggi (con immagini)

Video: Testa di manichino con localizzazione del suono con Kinect: 9 passaggi (con immagini)
Video: TRUCCO INCREDIBILE CHE DEVI SAPERE! 2024, Luglio
Anonim
Testa di manichino con localizzazione del suono con Kinect
Testa di manichino con localizzazione del suono con Kinect

Incontra Margaret, un manichino di prova per un sistema di monitoraggio della fatica del conducente. Di recente si è ritirata dai suoi doveri e ha trovato la sua strada per il nostro ufficio, e da allora ha attirato l'attenzione di coloro che pensano che sia "inquietante". Nell'interesse della giustizia, le ho dato la possibilità di affrontare i suoi accusatori a testa alta; invece di seguirti apparentemente con il suo sguardo senz'anima, ora lo fa davvero. Il sistema utilizza l'array di microfoni di un Microsoft Kinect e un servo per guidarla nella direzione delle persone che parlano vicino a lei.

Fase 1: Teoria

Teoria
Teoria

Calcolo dell'angolo

Quando sentiamo qualcosa, a meno che quel rumore non sia direttamente di fronte a noi, raggiunge un orecchio prima dell'altro. Il nostro cervello percepisce quel ritardo di arrivo e lo converte in una direzione generale da cui proviene il rumore, permettendoci di trovare la fonte. Possiamo ottenere lo stesso identico tipo di localizzazione utilizzando un paio di microfoni. Considera il diagramma mostrato, che contiene una coppia di microfoni e una sorgente sonora. Se guardiamo dall'alto verso il basso, le onde sonore sono circolari, ma se la distanza dalla sorgente è grande rispetto alla distanza tra i microfoni, allora dal punto di vista dei nostri sensori l'onda è approssimativamente planare. Questa è nota come ipotesi di campo lontano e semplifica la geometria del nostro problema.

Quindi supponiamo che il fronte d'onda sia una linea retta. Se il suono proviene da destra, colpirà il microfono n. 2 all'istante t2 e il microfono n. 1 all'istante t1. La distanza d il suono percorsa tra il microfono #2 e il microfono #1 è la differenza di tempo nella rilevazione del suono moltiplicata per la velocità del suono v s:

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

Possiamo mettere in relazione questa distanza con la distanza d 12 tra la coppia di microfoni e l'angolo θ dalla coppia alla sorgente sonora con la relazione:

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

Poiché abbiamo solo due microfoni, ci sarà ambiguità nel nostro calcolo sul fatto che la sorgente sonora sia davanti o dietro di noi. In questo sistema, supporremo che la sorgente sonora sia davanti alla coppia e bloccheremo l'angolo tra 0 gradi (completamente a destra della coppia) e 180 gradi (completamente a sinistra).

Infine, possiamo risolvere per theta prendendo il coseno inverso:

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

Per rendere l'angolo un po' più naturale, possiamo sottrarre 90 gradi da theta, in modo che 0 gradi sia direttamente davanti alla coppia e +/- 90 gradi sia completamente a sinistra o completamente a destra. Questo trasforma la nostra espressione dal coseno inverso al seno inverso.

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

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

Trovare il ritardo

Come puoi vedere dall'equazione sopra, tutto ciò che dobbiamo risolvere per l'angolo è il ritardo nell'onda sonora che arriva al microfono uno rispetto al microfono due; la velocità del suono e la distanza tra i microfoni sono fisse e note. Per fare ciò, prima campioniamo i segnali audio alla frequenza fs, convertendoli da analogico a digitale e archiviando i dati per un uso successivo. Campioniamo per un periodo di tempo noto come finestra di campionamento, che è di durata sufficientemente lunga da catturare le caratteristiche distinguibili della nostra onda sonora. Ad esempio, la nostra finestra potrebbe essere l'ultimo mezzo secondo di dati audio.

Dopo aver ottenuto i segnali audio finestrati, troviamo il ritardo tra i due calcolando la loro correlazione incrociata. Per calcolare la correlazione incrociata, manteniamo fisso il segnale finestrato da un microfono e facciamo scorrere il secondo segnale lungo l'asse del tempo da tutto dietro il primo a tutto davanti al primo. Ad ogni passo lungo la nostra diapositiva moltiplichiamo ogni punto nel nostro segnale fisso per il punto corrispondente nel nostro segnale scorrevole, quindi sommiamo tutti i risultati per calcolare il nostro coefficiente di correlazione per quel passo. Dopo aver completato la nostra diapositiva, il passo che ha il coefficiente di correlazione più alto corrisponde al punto in cui i due segnali sono più simili, e in quale passo ci troviamo ci dice quanti campioni n segnale due è sfalsato dal segnale 1. Se n è negativo, allora il segnale due è in ritardo rispetto al segnale uno, se è positivo il segnale due è in vantaggio e se è zero i due sono già allineati. Convertiamo questo offset campione in un ritardo temporale usando la nostra frequenza di campionamento con la relazione Δt = n/fs, quindi:

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

Passaggio 2: componenti

Parti

  • Microsoft Kinect per Xbox 360, modello 1414 o 1473. Il Kinect ha quattro microfoni disposti in un array lineare che utilizzeremo.
  • Adattatore per convertire il connettore proprietario di Kinect in USB + alimentazione CA come questo.
  • Raspberry Pi 2 o 3 con Raspbian Stretch. Inizialmente ho provato a utilizzare un Pi 1 Model B+, ma non era abbastanza potente. Continuavo ad avere problemi di disconnessione dal Kinect.
  • La testa di manichino più inquietante che puoi trovare
  • Un servo analogico abbastanza forte da far girare la testa del tuo manichino
  • Un caricatore da muro USB da 5 V con amperaggio sufficiente per alimentare sia il Pi che il servo e almeno due porte. (Ho usato una spina a 3 porte 5A simile a questa
  • Una prolunga con due prese (una per il caricatore a muro USB e l'altra per l'adattatore CA Kinect.
  • Due cavi USB: un cavo da tipo A a micro-USB per alimentare il Pi e un altro per alimentare il servo che non ti dispiace tagliare
  • Una piattaforma per tutto su cui sedersi e un'altra piattaforma più piccola per la testa del manichino. Ho usato un vassoio di plastica come base e un piatto di plastica come piattaforma per la testa. Entrambi provenivano da Walmart e costavano solo pochi dollari
  • 4x #8-32 1/2" bulloni e dadi per collegare il servo alla piattaforma più grande
  • 2x bulloni M3 da 8 mm con rondelle (o qualsiasi dimensione necessaria per collegare la squadretta del servo alla piattaforma più piccola)
  • Due ponticelli maschio-maschio, uno rosso e uno nero, e un ponticello femmina-maschio
  • Strisce in velcro con retro adesivo
  • Nastro elettrico
  • Nastro adesivo per la gestione dei cavi

Utensili

  • Dremel con rotella da taglio
  • Trapano
  • Punte da 7/64", 11/16" e 5/16"
  • Rubinetto M3 (opzionale, a seconda della squadretta del servo)
  • Cacciavite
  • Saldatore con saldatura
  • Aiutare le mani (opzionale)
  • marcatore
  • Bussola
  • Spelafili
  • Multimetro (opzionale)

DPI

  • Occhiali di sicurezza

  • Maschera facciale (per pezzi di plastica dremmel).

Passaggio 3: montaggio della piattaforma inferiore

Assemblaggio della piattaforma inferiore
Assemblaggio della piattaforma inferiore
Assemblaggio della piattaforma inferiore
Assemblaggio della piattaforma inferiore
Assemblaggio della piattaforma inferiore
Assemblaggio della piattaforma inferiore

La prima parte che realizzeremo è la piattaforma inferiore, che conterrà il nostro Kinect, il servo e tutta la nostra elettronica. Per realizzare la piattaforma avrai bisogno di:

  • Vassoio da portata in plastica
  • Servo
  • 4x #8-32 bulloni da 1/2" con dadi
  • Dremel con disco da taglio
  • Cacciavite
  • Trapano
  • Punta da trapano da 11/16"
  • marcatore

Come fare

  1. Capovolgi il vassoio.
  2. Posiziona il tuo servo lateralmente vicino al retro del vassoio, assicurati che l'ingranaggio di uscita del servo si trovi lungo la linea centrale del vassoio, quindi segna intorno alla base del servo.
  3. Usando il tuo dremel e la rotella da taglio, ritaglia l'area che hai segnato, quindi fai scorrere il tuo servo nella sua fessura.
  4. Segna i centri dei fori di montaggio dell'alloggiamento del servo sul vassoio, quindi rimuovi il servo e pratica quei fori con la punta del trapano da 11/16 ". È molto facile rompere la plastica sottile come questa quando si praticano i fori, quindi lo trovo molto più sicuro per eseguire il trapano al contrario e asportare lentamente il materiale. È molto più lento rispetto alla perforazione corretta dei fori, ma assicura che non ci siano crepe.
  5. Riposizionare il servo nello slot, quindi montarlo sul vassoio con i bulloni e i dadi #8-32.

Passaggio 4: assemblaggio della piattaforma di testa

Assemblaggio della piattaforma di testa
Assemblaggio della piattaforma di testa
Assemblaggio della piattaforma di testa
Assemblaggio della piattaforma di testa
Assemblaggio della piattaforma di testa
Assemblaggio della piattaforma di testa
Assemblaggio della piattaforma di testa
Assemblaggio della piattaforma di testa

La prossima parte che realizzeremo sarà una piattaforma per collegare la testa del manichino al servo. Per realizzare la piattaforma della testa avrai bisogno di:

  • Piatto di plastica
  • Servo clacson
  • 2x bulloni M3 da 8 mm con rondelle
  • Cacciavite
  • Trapano
  • Punte da 7/64" e 5/16"
  • Bussola
  • Dremel con rotella da taglio

Come fare

  1. Imposta la bussola sul raggio della base della testa del manichino.
  2. Usa il compasso per segnare un cerchio centrato al centro del piatto. Questa sarà la dimensione effettiva della nostra piattaforma principale.
  3. Usa il tuo dremel e la rotella da taglio per tagliare la piattaforma più piccola dal piatto.
  4. Perfora il centro della tua nuova piattaforma con una punta da trapano da 5/16". Questo ci darà accesso alla vite che monta la nostra squadretta del servo sul nostro servo. Per dare stabilità alla piattaforma mentre ho praticato il foro, ho messo una bobina di filo sotto di esso e forato attraverso il centro della bobina.
  5. Allinea la squadretta del servo con il centro della piattaforma e segna due fori per fissare la squadretta alla piattaforma. Assicurati che questi fori di montaggio siano abbastanza distanti tra loro in modo che ci sia spazio per le teste e le rondelle dei bulloni M3.
  6. Praticare questi fori contrassegnati con una punta da trapano da 7/64".
  7. Il foro inferiore della mia squadretta del servo era liscio, cioè non aveva le filettature per il bullone M3. Quindi, ho usato il mio trapano e un maschio M3 per fare i fili.
  8. Utilizzare i bulloni e le rondelle per fissare la squadretta del servo alla piattaforma della testa.

Passaggio 5: cavo di alimentazione servo

Cavo di alimentazione servo
Cavo di alimentazione servo
Cavo di alimentazione servo
Cavo di alimentazione servo
Cavo di alimentazione servo
Cavo di alimentazione servo
Cavo di alimentazione servo
Cavo di alimentazione servo

I servi analogici sono in genere alimentati con 4.8-6V. Poiché il Raspberry Pi sarà già alimentato da 5V da USB, semplificheremo il nostro sistema alimentando anche il servo da USB. Per fare ciò dovremo modificare un cavo USB. Per realizzare il cavo di alimentazione del servo avrai bisogno di:

  • Cavo USB di riserva con estremità di tipo A (del tipo che si collega al computer)
  • Un ponticello rosso e uno nero
  • Saldatore
  • Saldare
  • Spelafili
  • Nastro elettrico
  • Aiutare le mani (opzionale)
  • Multimetro (opzionale)

Come fare

  1. Taglia il connettore non USB di tipo A dal cavo, quindi rimuovi un po' dell'isolamento per rivelare i quattro fili interni. Tagliare la schermatura che circonda i fili scoperti.
  2. Tipicamente il cavo USB avrà quattro fili: due per trasmissione e ricezione dati e due per alimentazione e massa. Siamo interessati alla potenza e alla massa, che comunemente sono rispettivamente rossa e nera. Rimuovere parte dell'isolamento dai fili rosso e nero e tagliare i fili verde e bianco. Se sei preoccupato di non avere i cavi di alimentazione e di terra corretti, puoi collegare il cavo all'adattatore di alimentazione USB e controllare la tensione di uscita con un multimetro.
  3. Quindi, tagliare un'estremità dei cavi jumper rosso e nero e rimuovere parte dell'isolamento.
  4. Ora intreccia insieme i fili neri esposti del ponticello e i cavi USB. Incrocia i centri dei fili scoperti e attorcigliali l'uno intorno all'altro. Quindi, applica la saldatura ai fili accoppiati per tenerli insieme. Aiutare le mani renderà questo più facile tenendo i cavi in posizione.
  5. Ripetere il passaggio 4 per i fili rossi.
  6. Copri il cablaggio esposto con del nastro isolante o con un tubo termoretraibile se ti senti fantasioso. Queste giunture saranno fragili poiché i fili sono così piccoli, quindi aggiungi un secondo strato di nastro che trattiene i cavi di avviamento all'isolamento esterno del cavo USB. Ciò renderà l'assieme più rigido e quindi meno probabile che si rompa se si piega.

Passaggio 6: montaggio dell'elettronica

Montaggio dell'elettronica
Montaggio dell'elettronica
Montaggio dell'elettronica
Montaggio dell'elettronica
Montaggio dell'elettronica
Montaggio dell'elettronica

Infine, riuniremo tutto, montando la nostra elettronica e tutto il resto sulla piattaforma inferiore. Avrai bisogno:

  • Piattaforma inferiore
  • Piattaforma di testa
  • Testa di manichino
  • Kinect con adattatore USB+AC
  • Adattatore di alimentazione USB
  • Prolunga
  • Cavo micro USB
  • Cavo di alimentazione servo
  • Lampone Pi
  • Cavo jumper maschio-femmina
  • Velcro adesivo
  • Forbici

Come fare

  1. Montare il Pi sul fondo del vassoio con il velcro.
  2. Fissare l'adattatore di alimentazione USB con velcro.
  3. Collega servo e Pi all'alimentatore USB.
  4. Collegare il pin 12 (GPIO18) del Pi al cavo di segnale del servo. È il sesto pin in basso a destra.
  5. Fai passare la tua prolunga attraverso la maniglia posteriore del vassoio e collega l'adattatore di alimentazione USB a un lato.
  6. Prendi l'adattatore Kinect USB+AC e collega l'adattatore di alimentazione all'altro lato della prolunga e l'USB al Pi.
  7. Infilare il cavo del Kinect attraverso la maniglia anteriore del vassoio e collegarlo all'adattatore Kinect.
  8. Ho usato del nastro adesivo per tenere i cavi sul lato inferiore della piattaforma. Questo non sembra il più elegante, ma fortunatamente tutto questo è nascosto.
  9. Capovolgi la piattaforma verso l'alto e usa il velcro per montare il Kinect sulla parte anteriore della piattaforma.
  10. Usa il velcro per montare la testa del manichino sulla piattaforma della testa. Una volta che tutto è allineato, però, separa i due pezzi in modo da poter accedere alla vite di montaggio della squadretta del servo. Tuttavia, non avvitare ancora la squadretta al servo, poiché dobbiamo assicurarci che il servo sia prima nella sua posizione centrale in modo da poter allineare tutto. Lo faremo in un passaggio successivo.

Passaggio 7: software e algoritmo

Software e algoritmo
Software e algoritmo

Panoramica

Il software per questo progetto è scritto in C++ ed è integrato con Robot Operating System (ROS), un framework per la scrittura di software di robotica. In ROS, il software per un sistema è suddiviso in una raccolta di programmi chiamati nodi, in cui ogni nodo implementa una specifica sottosezione della funzionalità del sistema. I dati vengono passati tra i nodi utilizzando un metodo di pubblicazione/sottoscrizione, in cui i nodi che producono i dati li pubblicano e i nodi che consumano i dati li sottoscrivono. Il disaccoppiamento del codice in questo modo consente di espandere facilmente le funzionalità del sistema e di condividere i nodi tra i sistemi per uno sviluppo più rapido.

In questo sistema, ROS viene utilizzato principalmente per separare il codice che calcola la direzione di arrivo (DOA) della sorgente sonora dal codice che controlla il servo, consentendo ad altri progetti di includere la stima Kinect DOA senza includere il codice servo che potrebbero non essere necessari o desiderati. Se desideri esaminare il codice stesso, puoi trovarlo su GitHub:

github.com/raikaDial/kinect_doa

Nodo DOA Kinect

Il nodo kinect_doa è la carne e le ossa di questo sistema, che fa praticamente tutto ciò che è interessante. All'avvio, inizializza il nodo ROS, rendendo possibile tutta la magia ROS, quindi carica il firmware su Kinect in modo che i flussi audio diventino disponibili. Quindi genera un nuovo thread che apre i flussi audio e inizia a leggere i dati del microfono. Il Kinect campiona i suoi quattro microfoni a una frequenza di 16 kHz ciascuno, quindi è bene avere la correlazione incrociata e la raccolta dei dati in thread separati per evitare la perdita di dati a causa del carico computazionale. L'interfaccia con Kinect viene realizzata utilizzando libfreenect, un popolare driver open source.

Il thread di raccolta esegue una funzione di callback ogni volta che vengono ricevuti nuovi dati, archivia i dati e determina quando stimare il DOA. I dati di ciascun microfono sono memorizzati in buffer mobili di lunghezza uguale alla nostra finestra di campionamento, che qui è di 8192 campioni. Questo si traduce nel calcolo della correlazione incrociata con circa l'ultimo mezzo secondo di dati, quello che ho scoperto attraverso la sperimentazione essere un buon equilibrio tra prestazioni e carico computazionale. La stima DOA viene attivata per ogni 4096 campioni segnalando il thread principale, in modo che le correlazioni incrociate consecutive si sovrappongano del 50%. Considera un caso in cui non c'è sovrapposizione e fai un rumore molto veloce che viene tagliato a metà dalla finestra di campionamento. Prima e dopo il tuo suono distintivo sarà probabilmente un rumore bianco, che può essere difficile da allineare con la correlazione incrociata. Le finestre sovrapposte ci forniscono un campione più completo del suono, aumentando l'affidabilità della nostra correlazione incrociata dandoci caratteristiche più distinte da allineare.

Il thread principale attende il segnale dal thread di raccolta, quindi calcola la stima DOA. Innanzitutto, tuttavia, controlla se le forme d'onda catturate sono significativamente diverse dal rumore bianco. Senza questo controllo, calcoleremmo la nostra stima quattro volte al secondo indipendentemente dal fatto che ci fossero o meno rumori interessanti e la nostra testa di manichino sarebbe un disastro spastico. L'algoritmo di rilevamento del rumore bianco utilizzato in questo sistema è il primo dei due elencati qui. Calcoliamo il rapporto tra l'integrale assoluto della derivata della nostra forma d'onda e il suo integrale assoluto; per segnali con elevato contenuto di rumore bianco questo rapporto è maggiore rispetto a segnali meno rumorosi. Impostando una soglia per questo rapporto che separa il rumore dal non rumore, possiamo attivare la correlazione incrociata solo quando appropriato. Naturalmente, questo rapporto deve essere ricalibrato ogni volta che il sistema viene spostato in un nuovo ambiente.

Una volta determinato che le forme d'onda contengono un contenuto non rumoroso significativo, il programma procede con le correlazioni incrociate. Ci sono tuttavia tre importanti ottimizzazioni incorporate in questi calcoli:

  1. Ci sono quattro microfoni sul Kinect, il che significa che ci sono sei coppie totali di forme d'onda che possiamo incrociare. Tuttavia, se osservi la disposizione spaziale dell'array di microfoni, puoi vedere che i microfoni 2, 3 e 4 sono molto vicini l'uno all'altro. Infatti sono così vicine che a causa della velocità del suono e della nostra frequenza di campionamento le forme d'onda ricevute a 2, 3 e 4 saranno separate al massimo da un campione avanti o indietro, cosa che possiamo verificare con il calcolo maxlag = Δd *fs/vs, dove Δd è la separazione della coppia di microfoni, fs è la frequenza di campionamento e vs è la velocità del suono. Pertanto, correlare le coppie tra questi tre è inutile e abbiamo solo bisogno di correlare il microfono 1 con 2, 3 e 4.
  2. È noto che la correlazione incrociata standard dei segnali audio ha prestazioni scadenti in presenza di riverberi (echi). Un'alternativa robusta è nota come correlazione incrociata generalizzata con trasformata di fase (GCC-PHAT). Questo metodo si riduce all'applicazione di una funzione di ponderazione che amplifica i picchi nella correlazione incrociata, rendendo più facile distinguere il segnale originale dagli echi. Ho confrontato le prestazioni di GCC-PHAT con la semplice correlazione incrociata in una camera riverberante (leggi: bagno in cemento in fase di ristrutturazione) e ho riscontrato che GCC-PHAT è 7 volte più efficace nella stima dell'angolo corretto.
  3. Quando eseguiamo la correlazione incrociata, prendiamo i due segnali, scorrendo l'uno sull'altro e ad ogni passo moltiplichiamo ogni punto nel nostro segnale fisso per ogni punto nel nostro segnale scorrevole. Per due segnali di lunghezza n, questo risulta in n^2 calcoli. Potremmo migliorarlo eseguendo invece la correlazione incrociata nel dominio della frequenza, che comporta una trasformata di Fourier veloce (calcoli nlogn), moltiplicando ogni punto in un segnale trasformato per il punto corrispondente nell'altro (n calcoli), quindi eseguendo un inverso trasformata di Fourier per tornare al dominio del tempo (calcoli nlogn), risultando in n+2*calcoli nlogn, inferiori a n^2. Tuttavia, questo è l'approccio ingenuo. I microfoni del nostro array sono così vicini tra loro e la velocità del suono è così relativamente lenta che le forme d'onda audio saranno già per lo più allineate. Pertanto, possiamo finestrare la nostra correlazione incrociata per considerare solo gli offset leggermente avanti o indietro. Per i microfoni 1 e 4, il ritardo deve essere compreso tra +/-12 campioni, il che significa che per ogni correlazione incrociata dobbiamo solo eseguire calcoli 24*n, con conseguente risparmio computazionale quando le nostre forme d'onda sono più lunghe di 2900 campioni.

Questo sistema sfrutta la libreria minidsp, che implementa l'algoritmo GCC-PHAT con ottimizzazione 3.

Una volta trovato il ritardo nei segnali di ciascuna coppia di microfoni, il programma sceglie il valore mediano per il ritardo, lo utilizza per calcolare l'angolo stimato e pubblica il risultato in modo che possa essere utilizzato per controllare il servo.

Nodo di controllo del servo

Rispetto al nodo kinect_doa, il nodo servo è relativamente semplice. Il suo compito è quello di prendere esclusivamente il DOA stimato e spostare il servo a quell'angolo. Utilizza la libreria cablaggioPi per accedere al modulo hardware PWM del Raspberry Pi, utilizzandolo per impostare l'angolo del servo. La maggior parte dei servi analogici è controllata da un segnale PWM con una larghezza di impulso che va da 1000 µs a 2000 µs, corrispondente ad un angolo da 0° a 180°, ma il servo che ho usato era controllato da 500 µs a 2500 µs, corrispondente ad un angolo da 0° a 270°. Pertanto, il nodo è configurabile per diversi servo hardware impostando i parametri per la larghezza minima dell'impulso, la larghezza massima dell'impulso e la differenza tra gli angoli massimo e minimo. Inoltre, il servo non si sposta immediatamente all'angolo target, ma piuttosto si sposta verso l'angolo a una velocità configurabile, dando a Margaret un'atmosfera più graduale e inquietante (in più, il suono di un servo che si muove rapidamente avanti e indietro diventa fastidioso molto velocemente).

Passaggio 8: compilazione e installazione

Dipendenze di installazione:

Innanzitutto, installa libfreenect. Dobbiamo compilarlo dal sorgente perché la versione che puoi ottenere con il gestore di pacchetti non include il supporto per l'audio. Questo perché dobbiamo caricare il firmware su Kinect per abilitare l'audio e la ridistribuzione di questo firmware non è legale in alcune giurisdizioni. Inoltre, possiamo evitare di creare esempi che richiedono OpenGL e glut, non necessari per le installazioni Raspbian headless.

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/linux/udev/51.rules /etc/udev/rules.d udevadm control --reload-rules && udevadm trigger

Successivamente, dobbiamo installare il pacchetto cablaggioPi, che ci consente di controllare i pin GPIO del Pi:

cd

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

Attacca la testa del manichino:

Con il cablaggioPi installato, ora possiamo fare una rapida deviazione per tornare all'area hardware per fissare la testa del manichino sulla piattaforma inferiore. Per centrare il servo tramite la riga di comando, inserire i seguenti comandi:

gpio pwm-ms

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

Se non c'è movimento, probabilmente il tuo servo è già centrato. Per essere sicuri, però, potresti impostare il servo su un valore non centrale, ad es. gpio -g pwm 18 200, quindi reimpostalo su 150.

Una volta che sei sicuro che il servo sia centrato, collega la squadretta del servo della piattaforma della testa al servo in modo che la testa del tuo manichino guardi dritto in avanti. Quindi, avvitare la squadretta sul servo e fissare la testa tramite le punte in velcro.

Installa ROS:

Quindi, installa ROS sul tuo Pi. Un'ottima guida all'installazione può essere trovata qui; per il nostro sistema non abbiamo bisogno di OpenCV, quindi puoi saltare il passaggio 3. Questa build richiederà diverse ore per essere completata. Quando hai finito di seguire la guida all'installazione, aggiungi il sourcing dell'installazione al tuo bashrc in modo che possiamo usare i nostri pacchetti ROS appena installati:

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

Crea il pacchetto DOA di Kinect:

Dopo tutto ciò che è stato fatto, crea uno spazio di lavoro catkin per il nostro progetto e inserisci la directory src:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

Il codice per questo progetto è contenuto nel pacchetto kinect_doa, quindi clonalo nella directory src del tuo nuovo spazio di lavoro:

git clone

Il pacchetto robot_upstart fornisce uno strumento facile da usare per installare i file di avvio in modo che vengano eseguiti all'avvio, quindi clona anche questo nel tuo spazio di lavoro:

git clone

Ora, possiamo creare il codice del progetto chiamando catkin_make dalla directory di primo livello del nostro spazio di lavoro, quindi creare la nostra build in modo che i nostri pacchetti siano disponibili:

cd ~/kinect_doa_ws

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

Corsa e messa a punto:

Supponendo che tutto sia collegato e acceso, ora dovresti essere in grado di avviare il sistema e fare in modo che Kinect tenga traccia della tua voce! Tuttavia, se hai un Kinect 1473, apri prima il file ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch in un editor di testo e imposta il parametro using_kinect_1473 su true. Inoltre, se hai usato un servo diverso da quello che ho usato, probabilmente è un servo analogico standard, quindi mentre sei nel file di avvio, cambia il parametro min_us su 1000, max_us su 2000 e max_deg su 180.

roslaunch kinect_doa kinect_doa.launch

Giocaci un po'. Se ritieni che il sistema sia troppo sensibile (guardando in direzioni casuali che non corrispondono a voci o rumori distintivi), prova a modificare il parametro white_noise_ratio nel file di avvio e a riavviare il sistema finché la reattività non è a un livello con cui ti senti a tuo agio. Aumentare il rapporto renderà il sistema meno reattivo e viceversa. Probabilmente dovrai eseguire questa regolazione ogni volta che sposti il sistema in una posizione diversa per ottenere le prestazioni desiderate.

Per avviare il programma quando accendiamo il Pi, utilizziamo il pacchetto robot_upstart per installare il nostro file di avvio. Se ROS non è attualmente in esecuzione, avvialo con il comando roscore. Quindi, apri un nuovo terminale e installa il lancio con:

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

Creiamo un collegamento simbolico al file di avvio invece di copiarlo in modo da poter modificare i parametri modificando ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch.

Passaggio 9: nasconderlo in ufficio

Nasconderlo in ufficio
Nasconderlo in ufficio

Adesso per la parte divertente. Vai al lavoro dopo l'orario di lavoro e alza la testa del manichino in segreto. Quindi siediti e guarda quanto tempo impiegano i tuoi colleghi a capire! La tua nuova creazione farà sicuramente girare alcune teste…

Consigliato: