Schallbasierte Ortung

Allgemeine Beschreibung

Die Kenntnis der eigenen Position, bzw. der Position eines Kommunikationspartners, spielt im Umfeld cyberphysischer Systeme (CPS), speziell zur Navigation, eine wesentliche Rolle bei der Entscheidungsfindung. Positionsdaten sind Grundlage der Berechnung, auf welche Art und Weise neu gesetzte Ziele am effizientesten erreicht werden können. Da industrielle Produktionsanlagen zumeist in Hallen bzw. Räumen verbaut sind, besteht erhöhter Bedarf an zuverlässigen und kostengünstigen Innenraum-Ortungsmechanismen, die zudem möglichst leicht und kostengünstig zu realisieren sein sollten. Da die meisten bisherigen Methoden eine Vielzahl an Sensoren und Aktoren benötigen, deren Stückpreise zudem häufig hoch sind, stellt die Schallortung durch Auswertung der Raumimpulsantwort (RIA) eine vielversprechende Alternative dar.

Dieser Versuch demonstriert, dass eine Positionsbestimmung in einem Raum durch Maschinelles Lernen prinzipiell möglich ist. Durch die Aufzeichnung verschiedener Raumimpulsantworten an bekannten Positionen lässt sich durch Vergleich mit einer Aufzeichnung unbekannten Ursprungs auf deren Position schliessen. Die in diesem Versuch gewählte Kombination aus Lernalgorithmen wurde im Hinblick auf die Daten, die Laufzeit der Algorithmen und der Anzahl zu unterscheidender Fälle gewählt, in anderen Anwendungsfällen können durchaus andere Algorithmen sinnvoller sein. Die Verteilung der Anwendung in eine mobile und eine stationäre Einheit zur Zentralisierung rechenintensiver Aufgaben auf der Cloud-Plattformen wurde hier über den IoT-Kommunikationskanal MQTT realisiert.

Der Versuch wurde im Rahmen der Eusipco 2018 veröffentlicht

Fotos von Joseph Adandogou & Anuar Benyameen
Versuchsaufbau

Kernaufgabe ist die Ermittlung der Position eines Mikrophons mithilfe maschineller Lernalgorithmen. Hierzu wird ein Lautsprecher in einem Raum ortsfest auf dem Versuchstisch platziert. Zur Ortung wird die Eigenschaft der Schallreflexion genutzt, die das ausgesendete Schallsignal von den Wänden eines Raumes bzw. den Objekten die sich im Raum befinden reflektiert.

Die linke Abbildung zeigt schematisch den Zusammenhang zwischen der Raumimpulsantwort und der Position des aufzeichnenden Gerätes. Mit der Entfernung des Mikrophons zum Lautsprecher erhöht sich die benötigte Zeit des Signales zum Erreichen des Mikrophons, zeitgleich nimmt die gemessene Intensität ab. Der Direktschall (roter Impuls) erreicht das Mikrophon zuerst, die Ersten Reflexionen (grüner und blauer Impuls) werden aufgrund der größeren zurückgelegten Distanz später und schwächer empfangen. Anhand der unterschiedlichen RIA s1(t) und s2(t) lassen sich die Standorte der Mikrophone 1 und 2 unterscheiden. Das Mikrophon nimmt, in einer Trainingsphase, ein immer gleiches Signal des Lautsprechers an verschiedenen Positionen auf dem Tisch auf. Die Aufnahmen, dieses sogenannten Fingerprinting Prozesses, werden zusammen mit den jeweiligen Positionen des Mikrophons an einen Algorithmus übergeben. Der Algorithmus ist so konzipiert, dass er in der Lage ist zu lernen welche Aufnahmen welcher Position zugehörig sind. Nach Abschluss der Trainingsphase wird die Funktionsweise des Algorithmus in einer Testphase überprüft, indem weitere Aufnahmen ohne die zugehörigen Positionen übergeben werden. Die Aufgabe des Algorithmus ist es, anhand des Vergleichs der neuen Aufnahmen mit den zuvor erlernten, die unbekannte Position richtig zu bestimmen.

Versuchsaufbau mit den benötigten Geräten.

Hier wird eine Unterscheidung von 16 verschiedenen quadratischen Bereichen mit einer Kantenlänge von 15 cm gezeigt, zur Vereinfachung kann der Versuch auch auf 2 zu unterscheidende Bereiche (vordere/hintere Tischhälfte) begrenzt werden.

Die Datenerfassung wird mithilfe des IoT-Kit Octopus realisiert. Das eingebettete System wurde zusammen mit der Expertengruppe „Internet of Things“ auf dem Digital Gipfel entwickelt und bietet zahlreiche nützliche Funktionen zum schnellen Entwurf von IoT-Anwendungen. Der Octopus basiert auf einem ESP8266-12F mit WLAN Unterstützung und liefert zusätzliche Sensoren und Aktoren, darunter zwei LED’s und einen Bosch Umweltsensor. Über den ADC des Octopus werden die Eingangssignale des MAX4466 Elektret-Mikrophons digitalisiert und zur Auswertung per MQTT über WLAN an einen Peripherierechner gesendet.

Anschluß MAX4466 an IoT-Kit

MAX4466                  IoT-Kit
OUT               =          A0 (Gelb)
GND               =          GND (Schwarz)
VCC               =          VCC (Rot)

Das weisse Kabel des ADC wird nicht benötigt.

Datenverarbeitung

Zur Generierung der Trainings- und Testdaten wird der in Bild 3 gezeigte Vorgang für verschiedene Positionen des Mikrophons auf dem Tisch wiederholt durchgeführt, wobei die Position des Mikrophons bei den einzelnen Aufnahmen gesondert erfasst wird. Nach dem Senden des Startkommandos per MQTT durch den Anwender beginnt der Prozess der Datenerfassung. Das IoT-Kit sendet zunächst eine MQTT-Nachricht zum Peripherierechner, die das Abspielen der Audio-Datei auslöst. Da dies eine gewisse Sende- und Verarbeitungszeit in Anspruch nimmt, wartet das IoT-Kit eine heuristisch ermittelte Wartezeit bis zum Start der Aufnahme. Durch diese Wartezeit wird die Synchronisation zwischen Aufzeichnung und Abspielen des Signals gewährleistet. Nach der Aufzeichnung werden die Daten zur Speicherung und Weiterverarbeitung über MQTT in die Cloud gesendet. Ist die Datenübertragung beendet, sendet das IoT-Kit ein Kommando zur Formatierung der empfangenen Daten in ein geeignetes Format zur Weiterverarbeitung. Das Python-Skript prepare_data_format.py verarbeitet die eingehenden Daten zu einer .csv-Datei.

Die Abbildung zeigt innerhalb des linken Bereiches die Vorgänge auf dem IoT-Kit, in der Mitte werden die Anteile aus Node-RED beschrieben, rechts sind die Aufgaben der Peripheriegeräte bzw. Cloud-Rechner visualisiert.

Die so generierten Daten werden danach in Trainings- und Testmenge aufgeteilt. Aus den Trainingsdaten erstellt das Python-Skript ein Modell, das zur späteren Klassifizierung (Ortung) der Testdaten dient. 

Abläufe im IoT-Kit

Das Programm beginnt mit der Einbindung von Bibliotheken für die WLAN- und MQTT-Kommunikation sowie der Empfehlung, Zugangsdaten zu Beginn des Programms in Variablen abzulegen, um die Bearbeitung zu vereinfachen.

Es legt verschiedene Parameter fest, die für die Aufzeichnung von Geräuschen und die Datenübertragung benötigt werden. Zum Beispiel wird definiert, dass für eine Sekunde Aufzeichnung bei einer Abtastrate von 10 kHz 10000 Messwerte (SAMPLES) benötigt werden. Da der Analog-Digital-Wandler (ADC) Werte bis zu einer Größe von 1024 zurückgibt, werden diese in einem Byte-Array der Größe 20000 (dataCollection[SAMPLES*2]) zwischengespeichert. Ein Takt dauert dabei 100 µs (MICRODELAY). Zur Vereinfachung der MQTT-Datenübertragung wird die Größe der einzelnen Pakete (mqttpack[MQTTPACSIZE]) festgelegt. Es wird auch darauf hingewiesen, dass möglicherweise eine Anpassung in der Datei "PubSubClient.h" vorgenommen werden muss, um die maximale Paketgröße zu erhöhen.

Eine Variable namens controlByte wird eingeführt, um einen stabilen Ablauf des Programms sicherzustellen und mehrfache Ausführungen zu verhindern. Die Variable currSample wird genutzt, um den jeweils bearbeiteten Bereich des Datenspeichers zu kontrollieren.

Anschließend wird die MQTT-Kommunikation über WLAN eingerichtet, wobei das IoT-Kit das Topic "start" abonniert. Wenn ein Signal im Topic "start" empfangen wird, ruft die entsprechende Callback-Funktion das Programm "start()" auf, um den Messvorgang zu starten. Funktionen zur Sendung von Ablaufkommandos und erfassten Daten werden ebenfalls eingerichtet.

Um konstante Messzyklen zu gewährleisten, wird eine Timerfunktion im Rahmen der Funktion zur Aufnahme (record()) eingerichtet. Diese Timerfunktion sorgt dafür, dass die Erfassung im zeitlichen Abstand des oben festgelegten MICRODELAY durchgeführt wird. Eine weitere Funktion, setZero(), wird eingeführt, um alle Werte des Arrays dataCollection zurückzusetzen und Fehler zu vermeiden.

Die Funktion "start()" steuert den Gesamtablauf nach Anstoß über das MQTT-Topic "start" oder nach Betätigung des Buttons am Octopus. Im Setup-Bereich werden verschiedene Dienste wie WLAN oder MQTT initialisiert. Dieser Programmteil wird zu Beginn des Programms einmal ausgeführt.

Der Loop-Bereich wird über die gesamte Laufzeit des Programms immer wieder durchlaufen. Er prüft lediglich, ob der Button am Octopus gedrückt wurde und keine Aufnahme stattfindet.

Node-Red

Der abgebildete Fluss kann über das Menu /import/clipboard und Auswahl der bereitgestellten Datei (node-RED.txt) generiert werden, jedoch müssen die Pfade in den einzelnen Knoten auf Ihren Rechner angepasst werden. Falls dies noch nicht geschehen ist, bittet Node-RED um die Installation des Pakets node-red-contrib-mqtt-broker, das einen MQTT Broker einrichtet. Damit die Kommunikation zwischen IoT-Kit und Node-RED per MQTT funktioniert, muss das IoT-Kit dem Netz beitreten, indem der MQTT-Broker betrieben wird. Der Einfachheit halber haben wir mit unserem Rechner einen Hotspot geöffnet, zu dem sich das IoT-Kit anmeldet und haben die IP dieses Hotspots als MQTT Server eingetragen. Über den blauen inject-Knoten kann nun im Topic start das Kommando zu dem IoT-Kit gesendet werden, um eine Aufnahme einzuleiten. Das IoT-Kit bestätigt den Empfang und gibt das Kommando zum Abspielen der Sounddatei über das Topic play. Wir öffnen den Windows Media Player um eine Datei mit einem 1 ms dauernden 100 Hz Geräusch abzuspielen. Über das Topic transmit erreichen die Messwerte den Cloud-Rechner in Form von Bytes und werden durch die JavaScript Funktion convert_byte_to_int wieder zu Integer Werten zusammengesetzt, bevor sie in einer Datei zwischengespeichert werden. Ist die Datenübertragung abgeschlossen, wird die erstellte Datei zur vereinfachten nachfolgenden Bearbeitung über das Python-Skript prepare_data_format.py in eine .csv Datei umgewandelt.

Um die beschrieben Vorgänge zu gewährleisten wird folgende Ordnerstruktur empfohlen:

Ordner v1:
Ordner data (leer) – hier werden die .csv Dateien vom Python-Skript abgelegt
Datei data.csv – leere .csv Datei die eingehende Daten bevorratet
Datei output100hz1ms.wav – .wav-Datei mit Geräusch für Lautsprecher
Datei prepare_data_format.py – formatiert unsaubere data.csv zu valider .csv-Datei im ordner data und benennt diese mit dem aktuellen Datum-Zeit Stempel.
Datei soundGenerator.m – erstellt .wav-Datei mithilfe von Matlab.
Datei v1.ino – Arduino Pogramm 
Datei v1_node-red.txt – Beinhaltet Flussdiagramm zum Import in Node-RED.

Alle benötigten Dateien finden Sie im unteren Bereich der Seite.

Anwendung

Nachdem Bereiche definiert wurden, zwischen denen unterschieden werden soll, können die Messungen aus diesen Bereichen genutzt werden, um neue Messungen mit Ihnen zu vergleichen. Hierzu dient ein Supervised Learning (Überwachtes Lernen) Algorithmus, bei dem der Nutzer dem Algorithmus zusätzliche Daten, häufig sogenannte Labels zuführt. Der wesentliche Baustein hierzu ist der k-nächste Nachbarn (k-nearest neigbor kNN) Algorithmus, der Datenvektoren anhand eines gewählten Kriteriums vergleicht, und die ähnlichsten Messungen ermittelt. Mithilfe von kNN können die erfassten Daten dazu genutzt werden, um den Ursprung der Signale zwischen 2 Tischhälften zu unterscheiden. 

Der Versuch lässt sich auf mehrere Bereiche erweitern. Der Instanz-basierte kNN Algorithmus eignet sich sehr gut, um zwischen einer Vielzahl von Klassen zu unterscheiden. Hierzu kann es jedoch hilfreich sein, die Menge der Messungen zu begrenzen. Dazu eignet sich der k-Means Algorithmus, der eine gewünschte Anzahl Schwerpunkte aus einer Anzahl Messungen errechnen kann. k-Means gehört zu den Unsupervised Learning (Nicht Überwachtes Lernen) Algorithmen, bei dem der Algorithmus ohne zusätzliche Nutzerinformationen versucht, Muster in Daten zu erkennen. 

Weitere Materialien zum Thema Supervised und Unsupervised Learning als auch zu den Algorithmen KNN und K-Means finden Sie hier

back-to-top nach oben