Inhaltsverzeichnis:

Klanglokalisierender Schaufensterpuppenkopf mit Kinect - Gunook
Klanglokalisierender Schaufensterpuppenkopf mit Kinect - Gunook

Video: Klanglokalisierender Schaufensterpuppenkopf mit Kinect - Gunook

Video: Klanglokalisierender Schaufensterpuppenkopf mit Kinect - Gunook
Video: Как спрятать данные в ячейках Excel? 2024, Juli
Anonim
Klanglokalisierender Schaufensterpuppenkopf mit Kinect
Klanglokalisierender Schaufensterpuppenkopf mit Kinect

Lernen Sie Margaret kennen, eine Testpuppe für ein Überwachungssystem für die Fahrerermüdung. Sie hat sich vor kurzem von ihren Aufgaben zurückgezogen und hat den Weg in unsere Büroräume gefunden und hat seitdem die Aufmerksamkeit derer auf sich gezogen, die sie für "gruselig" halten. Im Interesse der Gerechtigkeit habe ich ihr die Möglichkeit gegeben, sich ihren Anklägern direkt zu stellen; anstatt dir scheinbar mit ihrem seelenlosen Blick zu folgen, tut sie es jetzt tatsächlich. Das System verwendet das Mikrofonarray einer Microsoft Kinect und ein Servo, um sie in die Richtung von Personen zu lenken, die in ihrer Nähe sprechen.

Schritt 1: Theorie

Theorie
Theorie

Berechnung des Winkels

Wenn wir etwas hören, erreicht es ein Ohr vor dem anderen, es sei denn, dieses Geräusch ist direkt vor uns. Unser Gehirn nimmt diese Ankunftsverzögerung wahr und wandelt sie in eine allgemeine Richtung um, aus der das Rauschen kommt, sodass wir die Quelle finden können. Genau die gleiche Art der Lokalisierung können wir mit einem Mikrofonpaar erreichen. Betrachten Sie das gezeigte Diagramm, das ein Mikrofonpaar und eine Schallquelle enthält. Wenn wir von oben nach unten schauen, sind Schallwellen kreisförmig, aber wenn der Abstand zur Quelle im Verhältnis zum Abstand zwischen den Mikrofonen groß ist, dann ist die Welle aus der Sicht unserer Sensoren ungefähr eben. Dies ist als Fernfeldannahme bekannt und vereinfacht die Geometrie unseres Problems.

Nehmen wir also an, die Wellenfront ist eine gerade Linie. Wenn der Ton von rechts kommt, trifft er zum Zeitpunkt t2 auf Mikrofon #2 und zum Zeitpunkt t1 auf Mikrofon #1. Die Distanz d, die der Schall zwischen dem Auftreffen auf Mikrofon Nr. 2 und Mikrofon Nr. 1 zurückgelegt hat, ist die Zeitdifferenz bei der Erfassung des Schalls multipliziert mit der Schallgeschwindigkeit v s:

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

Diesen Abstand können wir mit dem Abstand d 12 zwischen dem Mikrofonpaar und dem Winkel θ des Paares zur Schallquelle mit folgender Beziehung in Beziehung setzen:

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

Da wir nur zwei Mikrofone haben, wird es bei unserer Berechnung Unklarheiten geben, ob sich die Schallquelle vor oder hinter uns befindet. In diesem System gehen wir davon aus, dass sich die Schallquelle vor dem Paar befindet und spannen den Winkel zwischen 0 Grad (ganz rechts vom Paar) bis 180 Grad (ganz links) ein.

Schließlich können wir nach Theta auflösen, indem wir den inversen Kosinus nehmen:

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

Um den Winkel etwas natürlicher zu gestalten, können wir 90 Grad von Theta abziehen, sodass 0 Grad direkt vor dem Paar liegt und +/- 90 Grad ganz links oder ganz rechts sind. Dadurch wird unser Ausdruck vom inversen Kosinus zum inversen Sinus.

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

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

Die Verzögerung finden

Wie Sie aus der obigen Gleichung sehen können, müssen wir nur den Winkel auflösen, und zwar die Verzögerung der Schallwelle, die an Mikrofon eins im Vergleich zu Mikrofon zwei ankommt; die Schallgeschwindigkeit und der Abstand zwischen den Mikrofonen sind fest und bekannt. Dazu tasten wir zunächst die Audiosignale mit der Frequenz fs ab, wandeln sie von analog in digital um und speichern die Daten für die spätere Verwendung. Wir tasten für einen Zeitraum ab, der als Sampling-Fenster bekannt ist und lang genug ist, um unterscheidbare Merkmale unserer Schallwelle zu erfassen. Unser Fenster könnte beispielsweise die Audiodaten der letzten halben Sekunde sein.

Nachdem wir die gefensterten Audiosignale erhalten haben, finden wir die Verzögerung zwischen den beiden durch Berechnen ihrer Kreuzkorrelation. Um die Kreuzkorrelation zu berechnen, halten wir das gefensterte Signal von einem Mikrofon fest und schieben das zweite Signal entlang der Zeitachse von ganz hinter dem ersten bis ganz vor dem ersten. Bei jedem Schritt entlang unserer Folie multiplizieren wir jeden Punkt in unserem festen Signal mit seinem entsprechenden Punkt in unserem Gleitsignal und summieren dann alle Ergebnisse, um unseren Korrelationskoeffizienten für diesen Schritt zu berechnen. Nach Abschluss unserer Folie entspricht der Schritt mit dem höchsten Korrelationskoeffizienten dem Punkt, an dem die beiden Signale am ähnlichsten sind, und in welchem Schritt wir uns befinden, sagt uns, wie viele Samples n Signal zwei von Signal 1 versetzt. Wenn n negativ ist, dann liegt Signal zwei hinter Signal eins zurück, wenn es positiv ist, dann liegt Signal zwei vor und wenn es null ist, sind die beiden bereits ausgerichtet. Wir wandeln diesen Abtastoffset in eine Zeitverzögerung um, indem wir unsere Abtastfrequenz mit der Beziehung Δt = n/fs verwenden, also:

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

Schritt 2: Komponenten

Teile

  • Microsoft Kinect für Xbox 360, Modell 1414 oder 1473. Die Kinect verfügt über vier Mikrofone, die in einem linearen Array angeordnet sind.
  • Adapter zum Konvertieren des proprietären Anschlusses der Kinect in USB + Wechselstrom wie diesen.
  • Raspberry Pi 2 oder 3 mit Raspbian Stretch. Ich habe ursprünglich versucht, ein Pi 1 Model B+ zu verwenden, aber es war nicht leistungsstark genug. Ich hatte immer wieder Probleme beim Trennen der Kinect.
  • Der gruseligste Schaufensterpuppenkopf, den Sie finden können
  • Ein analoges Servo, das stark genug ist, um Ihren Schaufensterpuppenkopf zu drehen
  • Ein 5V USB-Wandladegerät mit ausreichender Stromstärke, um sowohl den Pi als auch das Servo und mindestens zwei Anschlüsse mit Strom zu versorgen. (Ich habe einen 5A 3-Port-Stecker ähnlich diesem verwendet
  • Ein Verlängerungskabel mit zwei Steckdosen (eine für das USB-Wandladegerät und die andere für das Kinect-Netzteil.
  • Zwei USB-Kabel: ein Typ-A-zu-Micro-USB-Kabel zur Stromversorgung des Pi und ein weiteres zur Stromversorgung des Servos, das Sie gerne zerschneiden
  • Eine Plattform für alles zum Sitzen und eine weitere kleinere Plattform für den Schaufensterpuppenkopf. Ich habe ein Serviertablett aus Kunststoff als Basis und eine Kunststoffplatte als Kopfplattform verwendet. Beide waren von Walmart und kosteten nur ein paar Dollar
  • 4x #8-32 1/2 "Schrauben und Muttern, um Ihr Servo an der größeren Plattform zu befestigen
  • 2x M3 8mm Schraube mit Unterlegscheiben (oder welche Größe Sie auch immer benötigen, um Ihr Servohorn an der kleineren Plattform zu befestigen)
  • Zwei Stecker-zu-Stecker-Überbrückungskabel, ein rotes und ein schwarzes und ein Buchse-zu-Stecker-Überbrückungskabel
  • Klettstreifen mit selbstklebender Rückseite
  • Isolierband
  • Klebeband für Kabelmanagement

Werkzeuge

  • Dremel mit Schneidrad
  • Bohren
  • 7/64", 11/16" und 5/16" Bohrer
  • M3-Tap (Optional, abhängig von Ihrem Servohorn)
  • Schraubenzieher
  • Lötkolben mit Lot
  • Helfende Hände (optional)
  • Marker
  • Kompass
  • Abisolierzangen
  • Multimeter (optional)

PSA

  • Schutzbrille

  • Gesichtsmaske (für Dremmel-ed-Plastik-Bits).

Schritt 3: Untere Plattformbaugruppe

Untere Plattformbaugruppe
Untere Plattformbaugruppe
Untere Plattformbaugruppe
Untere Plattformbaugruppe
Untere Plattformbaugruppe
Untere Plattformbaugruppe

Der erste Teil, den wir machen werden, ist die untere Plattform, die unsere Kinect, das Servo und unsere gesamte Elektronik hält. Um die Plattform zu erstellen, benötigen Sie:

  • Serviertablett aus Kunststoff
  • Servo
  • 4x #8-32 1/2" Schrauben mit Muttern
  • Dremel mit Schneidrad
  • Schraubenzieher
  • Bohren
  • 11/16" Bohrer
  • Marker

Wie man … macht

  1. Drehen Sie Ihr Tablett auf den Kopf.
  2. Platzieren Sie Ihr Servo seitlich in der Nähe der Rückseite des Tabletts, stellen Sie sicher, dass das Ausgangszahnrad des Servos entlang der Mittellinie des Tabletts liegt, und markieren Sie dann die Basis des Servos.
  3. Schneiden Sie mit Ihrem Dremel und dem Schneidrad den markierten Bereich aus und schieben Sie dann Ihr Servo in seinen Schlitz.
  4. Markieren Sie die Mitten der Servogehäuse-Befestigungslöcher auf dem Tablett, entfernen Sie dann das Servo und bohren Sie diese Löcher mit Ihrem 11/16 "Bohrer. Es ist sehr einfach, dünnes Plastik wie dieses beim Bohren von Löchern zu knacken, daher finde ich es viel sicherer den Bohrer rückwärts laufen zu lassen und das Material langsam abzuschleifen. Es ist viel langsamer als das richtige Bohren, aber es stellt sicher, dass keine Risse entstehen.
  5. Setzen Sie Ihr Servo wieder in den Schlitz ein und befestigen Sie es dann mit den # 8-32 Schrauben und Muttern an der Ablage.

Schritt 4: Kopfplattformmontage

Montage der Kopfplattform
Montage der Kopfplattform
Montage der Kopfplattform
Montage der Kopfplattform
Montage der Kopfplattform
Montage der Kopfplattform
Montage der Kopfplattform
Montage der Kopfplattform

Der nächste Teil, den wir machen werden, wird eine Plattform sein, um den Mannequinkopf mit dem Servo zu verbinden. Um die Kopfplattform herzustellen, benötigen Sie:

  • Plastikteller
  • Servohorn
  • 2x M3 8mm Schraube mit Unterlegscheiben
  • Schraubenzieher
  • Bohren
  • 7/64" und 5/16" Bohrer
  • Kompass
  • Dremel mit Schneidrad

Wie man … macht

  1. Stellen Sie Ihren Kompass auf den Radius der Basis Ihres Schaufensterpuppenkopfes ein.
  2. Verwenden Sie Ihren Kompass, um einen Kreis in der Mitte der Platte zu markieren. Dies wird die tatsächliche Größe unserer Kopfplattform sein.
  3. Verwenden Sie Ihren Dremel und das Schneidrad, um die kleinere Plattform aus der Platte zu schneiden.
  4. Bohren Sie die Mitte Ihrer neuen Plattform mit einem 5/16 "Bohrer aus. Dies gibt uns Zugang zu der Schraube, die unser Servohorn an unserem Servo befestigt. Um der Plattform Stabilität zu geben, während ich das Loch bohrte, lege ich eine Spule von Draht darunter und durch die Mitte der Spule gebohrt.
  5. Richten Sie Ihr Servohorn mit der Mitte der Plattform aus und markieren Sie zwei Löcher, um das Horn an der Plattform zu befestigen. Stellen Sie sicher, dass diese Befestigungslöcher weit genug voneinander entfernt sind, damit Platz für Ihre M3-Schraubenköpfe und Unterlegscheiben ist.
  6. Bohren Sie diese markierten Löcher mit einem 7/64" Bohrer aus.
  7. Das untere Loch meines Servohorns war glatt, d.h. es hatte nicht das Gewinde für die M3-Schraube. Daher habe ich meinen Bohrer und einen M3-Gewindebohrer verwendet, um die Gewinde herzustellen.
  8. Verwenden Sie die Schrauben und Unterlegscheiben, um das Servohorn an der Kopfplattform zu befestigen.

Schritt 5: Servo-Stromkabel

Servo-Stromkabel
Servo-Stromkabel
Servo-Stromkabel
Servo-Stromkabel
Servostromkabel
Servostromkabel
Servostromkabel
Servostromkabel

Analoge Servos werden typischerweise mit 4,8-6V versorgt. Da der Raspberry Pi bereits mit 5V von USB versorgt wird, vereinfachen wir unser System, indem wir auch das Servo über USB mit Strom versorgen. Dazu müssen wir ein USB-Kabel ändern. Um das Servo-Stromkabel herzustellen, benötigen Sie:

  • Ersatz-USB-Kabel mit Typ-A-Ende (die Art, die an Ihren Computer angeschlossen wird)
  • Ein rotes und ein schwarzes Überbrückungskabel
  • Lötkolben
  • Lot
  • Abisolierzangen
  • Isolierband
  • Helfende Hände (optional)
  • Multimeter (optional)

Wie man … macht

  1. Schneiden Sie den Nicht-USB-Typ-A-Stecker von Ihrem Kabel ab und ziehen Sie dann ein wenig von der Isolierung ab, um die vier inneren Drähte freizulegen. Schneiden Sie die Abschirmung um die freiliegenden Drähte ab.
  2. Normalerweise hat das USB-Kabel vier Drähte: zwei für die Datenübertragung und den Empfang und zwei für Strom und Masse. Wir interessieren uns für Strom und Masse, die üblicherweise rot bzw. schwarz sind. Entfernen Sie einen Teil der Isolierung von den roten und schwarzen Drähten und schneiden Sie die grünen und weißen Drähte ab. Wenn Sie befürchten, dass Sie nicht über die richtigen Strom- und Massekabel verfügen, können Sie Ihr Kabel an Ihr USB-Netzteil anschließen und die Ausgangsspannung mit einem Multimeter überprüfen.
  3. Als nächstes schneiden Sie ein Ende Ihres roten und schwarzen Überbrückungskabels ab und entfernen Sie etwas von der Isolierung.
  4. Verdrehen Sie nun die freiliegenden schwarzen Drähte Ihres Jumper- und USB-Kabels. Überqueren Sie die Mitten der freiliegenden Drähte und drehen Sie sie umeinander. Tragen Sie dann Lötzinn auf die zusammengesteckten Drähte auf, um sie zusammenzuhalten. Helfende Hände erleichtern dies, indem Sie Ihre Kabel an Ort und Stelle halten.
  5. Wiederholen Sie Schritt 4 für die roten Drähte.
  6. Decken Sie die freiliegenden Kabel mit Isolierband oder Schrumpfschlauch ab, wenn Sie Lust dazu haben. Diese Verbindungen werden brüchig sein, da die Drähte so klein sind. Fügen Sie daher eine zweite Schicht Klebeband hinzu, die die Überbrückungskabel an der äußeren Isolierung des USB-Kabels hält. Dadurch wird die Baugruppe steifer und es ist weniger wahrscheinlich, dass sie durch Verbiegen bricht.

Schritt 6: Elektronikmontage

Elektronikmontage
Elektronikmontage
Elektronikmontage
Elektronikmontage
Elektronikmontage
Elektronikmontage

Schließlich bringen wir alles zusammen, montieren unsere Elektronik und alles andere auf der unteren Plattform. Du wirst brauchen:

  • Untere Plattform
  • Kopfplattform
  • Schaufensterpuppe Kopf
  • Kinect mit USB+Netzteil
  • USB-Netzteil
  • Verlängerungskabel
  • Micro-USB-Kabel
  • Servostromkabel
  • Himbeer-Pi
  • Stecker-zu-Buchse Überbrückungskabel
  • Klettverschluss
  • Schere

Wie man … macht

  1. Montieren Sie den Pi mit Klettverschluss am Boden des Tabletts.
  2. Befestigen Sie das USB-Netzteil mit Klettverschluss.
  3. Stecken Sie Servo und Pi in das USB-Netzteil.
  4. Verbinden Sie Pin 12 (GPIO18) des Pi mit dem Signalkabel des Servos. Es ist der 6. Pin unten rechts.
  5. Führen Sie Ihr Verlängerungskabel durch den hinteren Griff des Fachs und stecken Sie das USB-Netzteil in eine Seite.
  6. Nehmen Sie den Kinect USB+AC-Adapter und stecken Sie das Netzteil in die andere Seite des Verlängerungskabels und den USB in den Pi.
  7. Führen Sie das Kabel des Kinect durch den vorderen Griff des Tabletts und stecken Sie es in den Kinect-Adapter.
  8. Ich benutzte Klebeband, um die Kabel an der Unterseite der Plattform zu halten. Das sieht nicht gerade elegant aus, aber zum Glück ist das alles versteckt.
  9. Klappen Sie die Plattform mit der rechten Seite nach oben und befestigen Sie die Kinect mit Klettverschluss an der Vorderseite der Plattform.
  10. Verwenden Sie Klettverschluss, um den Kopf der Schaufensterpuppe an der Kopfplattform zu befestigen. Sobald alles aufgereiht ist, trennen Sie die beiden Teile, damit wir auf die Befestigungsschraube des Servohorns zugreifen können. Schrauben Sie das Horn jedoch noch nicht an das Servo, da wir sicherstellen müssen, dass sich das Servo zuerst in seiner Mittelposition befindet, damit wir alles ausrichten können. Wir werden dies in einem späteren Schritt tun.

Schritt 7: Software und Algorithmus

Software und Algorithmus
Software und Algorithmus

Überblick

Die Software für dieses Projekt ist in C++ geschrieben und in das Robot Operating System (ROS) integriert, ein Framework zum Schreiben von Robotik-Software. In ROS ist die Software für ein System in eine Sammlung von Programmen unterteilt, die als Knoten bezeichnet werden, wobei jeder Knoten einen bestimmten Unterabschnitt der Systemfunktionalität implementiert. Daten werden zwischen Knoten mithilfe einer Publish/Subscribe-Methode übertragen, wobei Knoten, die die Daten produzieren, sie veröffentlichen und Knoten, die die Daten konsumieren, diese abonnieren. Das Entkoppeln des Codes auf diese Weise ermöglicht eine einfache Erweiterung der Systemfunktionalität und ermöglicht die gemeinsame Nutzung von Knoten zwischen Systemen für eine schnellere Entwicklung.

In diesem System wird ROS hauptsächlich verwendet, um den Code, der die Ankunftsrichtung (DOA) der Schallquelle berechnet, vom Code zur Steuerung des Servos zu trennen. Wenn Sie sich den Code selbst ansehen möchten, finden Sie ihn auf GitHub:

github.com/raikaDial/kinect_doa

Kinect DOA-Knoten

Der Knoten kinect_doa ist das Herzstück dieses Systems und macht im Grunde alles Interessante. Beim Start initialisiert es den ROS-Knoten, wodurch die gesamte ROS-Magie möglich wird, und lädt dann die Firmware auf die Kinect hoch, damit die Audiostreams verfügbar werden. Es erzeugt dann einen neuen Thread, der die Audiostreams öffnet und mit dem Einlesen der Mikrofondaten beginnt. Die Kinect tastet ihre vier Mikrofone mit einer Frequenz von jeweils 16 kHz ab, daher ist es gut, die Kreuzkorrelation und die Datenerfassung in separaten Threads zu haben, um fehlende Daten aufgrund von Rechenlast zu vermeiden. Die Anbindung an Kinect erfolgt über libfreenect, einen beliebten Open-Source-Treiber.

Der Sammelthread führt immer dann eine Rückruffunktion aus, wenn neue Daten empfangen werden, und speichert sowohl die Daten als auch bestimmt, wann die DOA geschätzt werden soll. Die Daten von jedem Mikrofon werden in rollenden Puffern gespeichert, die der Länge unseres Sampling-Fensters entsprechen, das hier 8192 Samples beträgt. Dies führt dazu, dass die Kreuzkorrelation mit den Daten der letzten halben Sekunde berechnet wird, was ich durch Experimente als gutes Gleichgewicht zwischen Leistung und Rechenlast herausgefunden habe. Die DOA-Schätzung wird für alle 4096 Abtastwerte durch Signalisieren des Haupt-Threads ausgelöst, so dass sich aufeinanderfolgende Kreuzkorrelationen um 50% überlappen. Stellen Sie sich einen Fall vor, in dem es keine Überlappung gibt und Sie ein sehr schnelles Rauschen erzeugen, das durch das Sampling-Fenster halbiert wird. Vor und nach Ihrem unverwechselbaren Klang ist wahrscheinlich weißes Rauschen, das mit der Kreuzkorrelation schwer in Einklang zu bringen sein kann. Überlappende Fenster bieten uns ein vollständigeres Sample des Sounds und erhöhen die Zuverlässigkeit unserer Kreuzkorrelation, indem sie uns mehr verschiedene Funktionen zur Verfügung stellen.

Der Hauptthread wartet auf das Signal vom Sammelthread und berechnet dann die DOA-Schätzung. Zunächst wird jedoch überprüft, ob sich die erfassten Wellenformen signifikant von weißem Rauschen unterscheiden. Ohne diese Überprüfung würden wir unsere Schätzung viermal pro Sekunde berechnen, unabhängig davon, ob es interessante Geräusche gab oder nicht, und unser Schaufensterpuppenkopf wäre ein spastisches Durcheinander. Der in diesem System verwendete Algorithmus zur Erkennung von weißem Rauschen ist der erste der beiden hier aufgeführten. Wir berechnen das Verhältnis des absoluten Integrals der Ableitung unserer Wellenform zu ihrem absoluten Integral; bei Signalen mit hohem Weißrauschanteil ist dieses Verhältnis höher als bei weniger verrauschten Signalen. Durch Festlegen eines Schwellenwerts für dieses Verhältnis, das Rauschen von Nichtrauschen trennt, können wir die Kreuzkorrelation nur dann auslösen, wenn es angemessen ist. Dieses Verhältnis muss natürlich jedes Mal neu abgestimmt werden, wenn das System in eine neue Umgebung verschoben wird.

Sobald festgestellt wurde, dass die Wellenformen einen signifikanten Nicht-Rausch-Inhalt enthalten, fährt das Programm mit den Kreuzkorrelationen fort. In diese Berechnungen sind jedoch drei wichtige Optimierungen integriert:

  1. Die Kinect verfügt über vier Mikrofone, was bedeutet, dass wir insgesamt sechs Wellenformenpaare kreuzkorrelieren können. Betrachtet man jedoch die räumliche Anordnung des Mikrofon-Arrays, sieht man, dass die Mikrofone 2, 3 und 4 sehr nahe beieinander liegen. Tatsächlich liegen sie so nah beieinander, dass aufgrund der Schallgeschwindigkeit und unserer Abtastfrequenz die bei 2, 3 und 4 empfangenen Wellenformen um höchstens einen Abtastwert nach vorne oder hinten getrennt sind, was wir mit der Berechnung maxlag = Δd. überprüfen können *fs/vs, wobei Δd der Abstand des Mikrofonpaares, fs die Abtastfrequenz und vs die Schallgeschwindigkeit ist. Daher ist es nutzlos, Paare zwischen diesen drei zu korrelieren, und wir müssen nur Mikrofon 1 mit 2, 3 und 4 kreuzkorrelieren.
  2. Es ist bekannt, dass die Standardkreuzkorrelation von Audiosignalen bei Vorhandensein von Nachhall (Echos) schlecht funktioniert. Eine robuste Alternative ist die generalisierte Kreuzkorrelation mit Phasentransformation (GCC-PHAT). Dieses Verfahren läuft darauf hinaus, eine Gewichtungsfunktion anzuwenden, die Spitzen in der Kreuzkorrelation verstärkt, wodurch es einfacher wird, das Originalsignal von Echos zu unterscheiden. Ich verglich die Leistung von GCC-PHAT mit der einfachen Kreuzkorrelation in einer Hallkammer (sprich: Betonbad wird umgebaut) und stellte fest, dass GCC-PHAT bei der Schätzung des richtigen Winkels 7-mal effektiver ist.
  3. Bei der Kreuzkorrelation nehmen wir die beiden Signale, gleiten aneinander entlang und multiplizieren bei jedem Schritt jeden Punkt in unserem festen Signal mit jedem Punkt in unserem Gleitsignal. Für zwei Signale der Länge n ergibt dies n^2 Berechnungen. Wir könnten dies verbessern, indem wir stattdessen die Kreuzkorrelation im Frequenzbereich durchführen, die eine schnelle Fourier-Transformation (nlogn-Berechnungen) beinhaltet, jeden Punkt in einem transformierten Signal mit dem entsprechenden Punkt in dem anderen multipliziert (n Berechnungen) und dann eine Umkehrung durchführt Fourier-Transformation, um in den Zeitbereich zurückzukehren (nlogn-Berechnungen), was zu n+2*nlogn-Berechnungen führt, weniger als n^2. Dies ist jedoch der naive Ansatz. Die Mikrofone in unserem Array sind so nah beieinander und die Schallgeschwindigkeit ist so relativ langsam, dass die Audiowellenformen bereits größtenteils ausgerichtet sind. Daher können wir unsere Kreuzkorrelation so einstellen, dass nur Offsets berücksichtigt werden, die leicht vor oder zurück liegen. Für Mikrofone 1 und 4 muss die Verzögerung zwischen +/-12 Samples liegen, d. h. für jede Kreuzkorrelation müssen wir nur 24*n Berechnungen durchführen, was zu Einsparungen bei der Berechnung führt, wenn unsere Wellenformen länger als 2900 Samples sind.

Dieses System nutzt die minidsp-Bibliothek, die den GCC-PHAT-Algorithmus mit Optimierung 3 implementiert.

Sobald die Verzögerung in den Signalen von jedem Mikrofonpaar gefunden wurde, wählt das Programm den Medianwert für die Verzögerung, berechnet daraus den geschätzten Winkel und veröffentlicht das Ergebnis, damit es zur Steuerung des Servos verwendet werden kann.

Servosteuerknoten

Im Vergleich zum kinect_doa-Knoten ist der Servo-Knoten relativ einfach. Seine Aufgabe besteht darin, nur den geschätzten DOA zu nehmen und das Servo in diesen Winkel zu bewegen. Es verwendet die wiringPi-Bibliothek, um auf das Hardware-PWM-Modul des Raspberry Pi zuzugreifen und damit den Winkel des Servos einzustellen. Die meisten analogen Servos werden mit einem PWM-Signal mit einer Pulsbreite von 1000 µs bis 2000 µs, entsprechend einem Winkel von 0° bis 180°, angesteuert, aber das von mir verwendete Servo wurde mit 500 µs bis 2500 µs angesteuert, was einem Winkel entspricht von 0° bis 270°. Somit ist der Knoten für unterschiedliche Servo-Hardware konfigurierbar, indem Parameter für die minimale Pulsbreite, die maximale Pulsbreite und die Differenz zwischen den maximalen und minimalen Winkeln eingestellt werden. Darüber hinaus bewegt sich das Servo nicht sofort zum Zielwinkel, sondern bewegt sich mit einer konfigurierbaren Geschwindigkeit in Richtung des Winkels, was Margaret eine allmählichere, gruseligere Atmosphäre verleiht (und das Geräusch eines schnell hin- und herbewegenden Servos wird sehr schnell nervig).

Schritt 8: Build und Installation

Installationsabhängigkeiten:

Installieren Sie zunächst libfreenect. Wir müssen es aus dem Quellcode erstellen, da die Version, die Sie mit dem Paketmanager erhalten können, keine Unterstützung für Audio enthält. Dies liegt daran, dass wir Firmware auf Kinect hochladen müssen, um Audio zu aktivieren, und die Weitergabe dieser Firmware in bestimmten Gerichtsbarkeiten nicht legal ist. Darüber hinaus können wir vermeiden, die Beispiele zu erstellen, die OpenGL und glut erfordern, die für Headless-Raspbian-Installationen unnötig sind.

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

Als nächstes müssen wir das wiringPi-Paket installieren, mit dem wir die GPIO-Pins des Pi steuern können:

CD

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

Schaufensterpuppenkopf anbringen:

Wenn wiringPi installiert ist, können wir jetzt einen kurzen Abstecher zurück ins Hardware-Land machen, um den Mannequin-Kopf auf der unteren Plattform zu befestigen. Um das Servo über die Kommandozeile zu zentrieren, geben Sie folgende Befehle ein:

gpio pwm-ms

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

Wenn es keine Bewegung gibt, ist Ihr Servo wahrscheinlich bereits zentriert. Zur Sicherheit können Sie das Servo aber auch auf einen nicht mittigen Wert einstellen, z. B. gpio -g pwm 18 200, und setzen Sie ihn dann auf 150 zurück.

Sobald Sie sicher sind, dass das Servo zentriert ist, befestigen Sie das Servohorn der Kopfplattform so am Servo, dass Ihr Mannequinkopf gerade nach vorne schaut. Schrauben Sie dann das Horn auf das Servo und befestigen Sie Ihren Kopf über die Klettbits.

ROS installieren:

Als nächstes installieren Sie ROS auf Ihrem Pi. Eine großartige Installationsanleitung finden Sie hier; für unser System benötigen wir kein OpenCV, daher können Sie Schritt 3 überspringen. Dieser Build dauert mehrere Stunden. Wenn Sie mit der Installationsanleitung fertig sind, fügen Sie Ihrer bashrc das Sourcing der Installation hinzu, damit wir unsere neu installierten ROS-Pakete verwenden können:

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

Kinect DOA-Paket erstellen:

Nachdem alles erledigt ist, erstellen Sie einen Catkin-Workspace für unser Projekt und geben Sie das src-Verzeichnis ein:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

Der Code für dieses Projekt ist im Paket kinect_doa enthalten, also klonen Sie ihn in das src-Verzeichnis Ihres neuen Arbeitsbereichs:

git-Klon

Das Paket robot_upstart bietet ein einfach zu verwendendes Tool zum Installieren von Startdateien, damit sie beim Start ausgeführt werden. Klonen Sie dies also auch in Ihren Arbeitsbereich:

git-Klon

Jetzt können wir den Projektcode erstellen, indem wir catkin_make aus dem Verzeichnis der obersten Ebene unseres Arbeitsbereichs aufrufen, und dann unseren Build beziehen, damit unsere Pakete verfügbar sind:

cd ~/kinect_doa_ws

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

Laufen und Tuning:

Vorausgesetzt, dass alles angeschlossen und eingeschaltet ist, sollten Sie jetzt in der Lage sein, das System zu starten und Ihre Stimme von Kinect verfolgen zu lassen! Wenn Sie jedoch eine Kinect 1473 haben, öffnen Sie zuerst die Datei ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch in einem Texteditor und setzen Sie den Parameter using_kinect_1473 auf true. Wenn Sie ein anderes Servo als ich verwendet haben, handelt es sich wahrscheinlich um ein analoges Standardservo. Ändern Sie also in der Startdatei den Parameter min_us auf 1000, max_us auf 2000 und max_deg auf 180.

roslaunch kinect_doa kinect_doa.launch

Spielen Sie eine Weile damit herum. Wenn Sie das Gefühl haben, dass das System zu empfindlich ist (in zufällige Richtungen schauen, die nicht mit Stimmen oder markanten Geräuschen übereinstimmen), versuchen Sie, den Parameter white_noise_ratio in der Startdatei zu ändern und das System neu zu starten, bis die Reaktionsfähigkeit auf einem für Sie angenehmen Niveau ist. Wenn Sie das Verhältnis erhöhen, reagiert das System weniger und umgekehrt. Sie müssen diese Abstimmung wahrscheinlich jedes Mal durchführen, wenn Sie das System an einen anderen Ort verlegen, um die gewünschte Leistung zu erzielen.

Um das Programm beim Einschalten des Pi zu starten, verwenden wir das robot_upstart-Paket, um unsere Startdatei zu installieren. Wenn ROS gerade nicht läuft, starten Sie es mit dem Befehl roscore. Öffnen Sie dann ein neues Terminal und installieren Sie den Start mit:

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

Wir erstellen einen Symlink zur Startdatei, anstatt sie zu kopieren, damit wir Parameter ändern können, indem wir ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch bearbeiten.

Schritt 9: Verstecken im Büro

Im Büro verstecken
Im Büro verstecken

Nun zum spaßigen Teil. Gehen Sie nach Feierabend zur Arbeit und stellen Sie Ihren Mannequin-Kopf heimlich auf. Dann lehnen Sie sich einfach zurück und sehen Sie, wie lange es dauert, bis Ihre Kollegen sich durchsetzen! Deine neue Kreation wird garantiert ein paar Köpfe verdrehen…

Empfohlen: