Projekt 15: Gestenerkennung der Kinect zur Ansteuerung von LED, Servos u.s.w.
→ zurück zur Übersicht: WS 17/18: Fachpraktikum Elektrotechnik (MTR)
Autoren: Torben Müller,Jerome Wolf
Professor: Prof. Dr. Mirek Göbel
Einleitung
Dieser Wiki Artikel behandelt das Projekt 15 Gestensteuerung der Kinect der Studenten Torben Müller und Jerome Wolf im Rahmen des WS 17/18: Fachpraktikum Elektrotechnik (MTR) aus dem 5. Semester Mechatronik und stellt eine nachhaltige Dokumentation über Vorgehensweise der Bearbeitung und Inhalt des Projektes dar. Die Aufgabe besteht darin, den Kinect V2 Sensor mit Hilfe von Matlab zur Ansteuerung verschiedener Aktuatoren zu verwenden und somit Bewegungen in echte Reaktionen zu transformieren.
Erwartungen an die Projektlösung:
- Einarbeitung mittels Kinect Toolbox für Matlab
- Konzeption eines Aufbaus und der passenden Bewegungen dazu
- Realisierung des Aufbaus mit Arduino Uno und prototypischem "shield"
- Einlesen der Skelett-Punkte über die Kinect-Kamera
- Umrechnen/Verarbeiten/Ansteuern der Aktoren
- Machen Sie ein tolles Video, welches die Funktionen visualisiert.
- Test und wissenschaftliche Dokumentation
- Live Vorführung während der Abschlusspräsentation
Schwierigkeit
- Mechanik: -
- Elektronik: *
- Informatik: ***
Projekt
Planung
Da sich die Kinect Kamera üblicherweise im Wohnzimmer des Besitzers befindet, war die Idee "Home Automation" sehr naheliegend. Vorstellbar sind hier beispielsweise die Helligkeitssteuerung der Lampen, die Lautstärkeregelung des Hifi-Systems, eine Temperaturregelung der Heizungen und eine automatisierte Steuerung der Jalousien. Dank des berührungslosen Konzepts wäre jedoch beispielsweise auch ein Einsatz in OP-Sälen oder anderen Umgebungen, in denen Berührungen problematisch sind, denkbar.
Aufgrund des begrenzten Budgets wurde für dieses Projekt eine Lichtsteuerung und eine Lautstärkeregelung ausgewählt, da diese Konzepte recht einfach und günstig zu modellieren sind. Für die Lichtsteuerung wurden zwei verschiedene Anwendungsfälle ausgearbeitet. Der erste besteht in der Farbsteuerung einer RGB-LED, der zweite hingegen aus einer Helligkeits- und Farbtemperatur-Steuerung mithilfe zweier weißer LEDs. Die Lautstärkeregelung sollte durch eine Transistorschaltung zur Verstärkung eines eingehenden Audiosignals realisiert werden, wurde jedoch aus mehreren Gründen später nicht benutzt und ist daher im Folgenden nicht weiter aufgelistet. Stattdessen sollte letztendlich je nach Lautstärkepegel eine LED Leiste angesteuert werden, um das gewählte Level zu symbolisieren. Somit gliedert sich die Schaltung in drei verschiedene Module.
Zum Nachbau der Schaltung können z.B. die folgenden Teile verwendet werden:
Artikelname | Anzahl | Anbieter | Bestellnummer |
---|---|---|---|
50pol. Stiftleiste, gerade, RM 2,54 | 1 | Reichelt | SL 1X50G 2,54 |
Lochrasterplatine, Hartpapier, 50x100mm | 1 | Reichelt | H25PR050 |
LED, 5 mm, bedrahtet, kaltweiß, 7150 mcd, 50° | 1 | Reichelt | LED EL 5-7150KW |
LED, 5 mm, bedrahtet, warmweiß, 7150 mcd, 50° | 1 | Reichelt | LED EL 5-7150WW |
RGB-LED, 5 mm, bedrahtet, 6-Pin, rt/bl/gn/bl, 30 mcd, 60° | 1 | Reichelt | LED RGB-5 DIFFUS |
Bargraph-Anzeige, 10 Elemente, 3x rot, 7x grün | 1 | Reichelt | RGBG 1000 |
Widerstand, Metallschicht, 150 Ohm, 0207, 0,6 W, 1% | 2 | Reichelt | METALL 150 |
Widerstand, Metallschicht, 47,0 Ohm, 0207, 0,6 W, 1% | 1 | Reichelt | METALL 47,0 |
Widerstand, Metallschicht, 100 Ohm, 0207, 0,6 W, 1% | 7 | Reichelt | METALL 100 |
Sollte die Verstärkerschaltung in Zukunft nochmals aufgegriffen werden, werden zudem noch die folgenden Teile benötigt:
Artikelname | Anzahl | Anbieter | Bestellnummer |
---|---|---|---|
Kleinlautsprecher LSF-57F, 0,3W, 8Ohm | 1 | Reichelt | BL 57 |
Transistor NPN TO-92 45V 0,8A 0,625W | 1 | Reichelt | BC 337-40 |
Transistor PNP TO-92 45V 0,8A 0,625W | 1 | Reichelt | BC 327-40 |
Elektrolytkondensator, 105°C, RM 2,5mm | 1 | Reichelt | RAD 105 220/16 |
Vielschicht-Keramikkondensator 100N, 20% | 1 | Reichelt | Z5U-5 100N |
Klinkenbuchse, 3,5mm, Print, ohne Gewinde | 2 | Reichelt | EBSF 35 |
Audio Kabel, 3,5 mm Stereo Klinkenstecker, 1,5 m | 1 | Reichelt | AVK 119Q-15 |
Widerstand, Metallschicht, 10,0 kOhm, 0207, 0,6 W, 1% | 2 | Reichelt | METALL 10,0K |
Nun musste ein Gestenkonzept entwickelt werden, das diese drei Module steuern kann. Die Grundidee dabei ist, drei verschiedene Steuersignale zu unterschieden, die einen Wechsel in die Steuerung der einzelnen Module bewirken. Befindet man sich nun in der Steuerung eines Moduls, lassen sich über andere Gesten die einzelnen Funktionen in diesem Modul steuern. Um die Funktionen der beiden Lichtmodule zu regeln, wurde das Konzept eines Steuerkreuzes eingesetzt. Für die RGB-LED wird eine Triade simuliert, in welcher der Benutzer durch Bewegen seiner Hand dynamisch jede Farbe einstellen kann. Die Lichtsteuerung des zweiten Moduls wird durch ein Steuerkreuz auf der anderen Hand geregelt. Hier ist in vertikaler Bewegungsrichtung eine Regelung der Helligkeit und in horizontaler Richtung eine Steuerung der Farbtemperatur möglich.
Hardware
Für die tatsächliche Ansteuerung der einzelnen Elemente, die über die Gesten beeinflusst werden sollten, wurde ein Arduino verwendet. Hierfür wurde zunächst ein Schaltungskonzept in Fritzing entworfen und nach dem Überprüfen der Funktionalität auf ein selbstgebautes Shield übertragen. Hierbei gilt zu beachten, dass sich dieser Prozess aufgrund der ungleichmäßigen Pinabstände auf dem Arduino mit einem vorgefertigten Prototyping Shield bedeutend einfacher gestaltet hätte.
Die nicht verwendete Verstärkerschaltung ist an dieser Stelle nicht Dokumentiert, bei Interesse können die entsprechenden Details dem zugrundeliegenden Youtube Video und den darin verlinkten Quellen entnommen werden.
Für die Ansteuerung der warmweißen und kaltweißen LED, sowie der RGB-LED wurden jeweils die PWM Ports des Arduino verwendet. Die kaltweiße LED ist an Pin 3, die warmweiße hingegen an Pin 6 angeschlossen. Die PWM Pins 9, 10 und 11 werden hingegen zur Ansteuerung der RGB LED verwendet. Die übrigen einfachen Digitalen Ports 2,4,7,8, und 12 wurden für die Lautstärkeanzeige verwendet. Bei dieser wurden die LEDs in Zweier-Blöcke zusammengefasst, da ansonsten nicht mehr genügend Pins vorhanden gewesen wären. Der übrige PWM-Pin 5 war für ursprünglich für die Verstärkerschaltung eingeplant gewesen. Die jeweilige Pinbelegung und weitere Verschaltung ist auch gut in den Skizzen zu erkennen.
Nachdem die Schaltung zusammengelötet war, wurde mit einem einfachen Arduino Sketch nochmals die Funktion getestet. Nachdem sichergestellt war, dass die einzelnen LEDs alle leuchteten und sich bei unterschiedlichen PWM Signalen wie erwartet verhielten, konnte auch schon zum Softwareteil des Projektes übergegangen werden.
Software
Zum Erkennen der Gesten und zum ansteuern des Arduino sollte die Software Matlab verwendet werden. Für diese Bearbeitung wurde die Version 2016a von Matlab verwendet. Die ursprüngliche Idee bestand darin, die Matlab Image Acquisition Toolbox zu verwenden, um die Daten des Kinect Sensors auszuwerten. Es stellte sich jedoch heraus, dass diese Toolbox eine sehr schlechte Framerate erzeugte und somit eine Echtzeitverarbeitung nicht möglich war. Darum wurde für dieses Projekt eine alternative Lösung verwendet, die im folgenden näher beschrieben wird.
Installation
Zuerst müssen in Matlab die nötigen Ressourcen eingerichtet werden. Um eine serielle Schnittstelle zu dem Arduino aufzubauen und Steuersignale an diesen zu senden, wird die Matlab Arduino Toolbox [1] benötigt. Diese lässt sich leicht über Matlab's internen Add-On Manager installieren. Die Informationen von dem Kinect Sensor wurden über das Kinect V2 Interface for Matlab ausgelesen [2]. Dieser Toolbox liegt eine Installationsanleitung bei, jedoch ist diese nicht sonderlich deutlich. Darum hier nochmal eine klare Anleitung zur Installationsweise. Zuerst muss neben der Toolbox auch noch das Microsoft eigene Entwicklungskit installiert werden [3]. Außerdem wird neben Matlab noch Visual Studio 2012 oder neuer benötigt. Sind nun alle Komponenten vorhanden, so muss zu erst in Matlab der Compiler gesetzt werden. Dazu in dem Command Window folgenden Befehl ausführen:
mex -setup C++
Als nächstes muss die Datei "compile_cpp_files.m" bearbeitet werden. Hier gilt es die Pfade für IncludePath und LibPath zu überprüfen. Ersteres muss auf den Ordner "inc" in der Installation der Kinect SDK verweisen und zweiteres auf den "x64" Ordner in "Lib":
IncludePath = 'C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\inc';
LibPath = 'C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\Lib\x64';
Als nächstes muss in dem Kinect V2 SDK von Microsoft der Ordner gefunden werden, welcher die Dateien "Kinect20.Fusion.dll" und "Kinect20.Face.dll" enthält. Bei der aktuellen Version des Entwicklungskits ist dies der Ordner "C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\bin". Dieser muss nun der Systemumgebungsvariable Path hinzugefügt werden. Dazu können folgende Schritte befolgt werden.
Zuletzt ist es erforderlich, Matlab neu zu starten und danach die bereits verwendete "compile_cpp_files.m" auszuführen. Konnte diese fehlerfrei ausgeführt werden, kann die Toolbox nun verwendet werden.
Programmablauf
Das Matlab Programm stellt die Schnittstelle zwischen den Daten des Kinect Sensors und der Hardware des Arduinos dar. Es geht somit darum, auf Sensordaten mit Hardwaresteuerbefehlen zu reagieren. Wie aus dem nebenstehenden Programmablaufdiagramm zu erkennen, gliedert sich das Programm in einen Initialisierungsbereich und eine übergreifende Endlosschleife, die die drei Gesten mit jeweils eigenem Initialisierungsbereich und einer Endlosschleife beherbergt.
Nach dem Start des Programmes initialisiert dieses die Kinect und den Arduino und läuft dann durch die äußere Schleife. Dort wird jede Runde abgefragt ob eine der drei Gesten erkannt wurde. Dazu bietet die Toolbox pro Hand eine Variable, die über den Zustand dieser Hand Auskunft gibt. Mögliche Zustände sind unbekannt, nicht verfolgt, offen, geschlossen und lasso. Daraus wurden drei verschiedene und gut unterscheidbare Gesten entworfen. Die Geste für die RGB LED wird gestartet, sobald die linke Hand offen und die rechte geschlossen ist. Die Steuerung der Helligkeit und Farbtemperatur wird über das Gegenteil, also rechts auf und links zu gestartet. Die Lautstärkeregelung wird über ein lasso in der linken Hand und eine geschlossene rechte Hand angezeigt. Für alle drei Gesten gilt dabei: Um die Geste wieder zu verlassen, muss die Hand im Zustand offen oder lasso geschlossen werden. Sobald diese Hand für eine bestimmte Anzahl an Frames geschlossen war, wird die Geste verlassen. Zusätzlich gilt: Die Hand, die bei der Startbedingung geschlossen war, wird in der Geste verwendet um das jeweilige Element zu steuern. Dafür ist es jedoch erforderlich, die Position der entsprechenden Hand zu errechnen.
Die Kinect ist in der Lage, mit Hilfe einer normalen Full HD Kamera und einem Tiefensensor die Positionen von 25 verschiedenen Elementen eines Körpers für bis zu sechs verschiedene Körper zu ermitteln [4]. Diese Positionen werden von der Toolbox eingelesen, jedoch befinden sich die Koordinaten der Elemente in dem internen Koordinatensystem der Kinect. Mit Hilfe eines Befehls lassen sich diese Koordinaten auf das normale Kamerabild transformieren. Somit steht ein Array aus 25 Zeilen mit je einer x und y Spalte zur Verfügung, mit Koordinaten von 0,0 oben links des Bildes bis 1920,1080 unten rechts. Dieser Array wird für jeden Frame erstellt. Folgende Tabelle gibt an, welche Zeile des Arrays welches Element des Körpers repräsentiert:
Nr. | Körperelement |
---|---|
1 | Wirbelsäule unten |
2 | Wirbelsäule mitte |
3 | Hals |
4 | Kopf |
5 | Schulter links |
6 | Ellbogen links |
7 | Handgelenk links |
8 | Hand links |
9 | Schulter rechts |
10 | Elbogen rechts |
11 | Handgelenk rechts |
12 | Hand rechts |
13 | Hüfte links |
14 | Knie links |
15 | Knöchel links |
16 | Fuß links |
17 | Hüfte rechts |
18 | Knie rechts |
19 | Knöchel rechts |
20 | Fuß rechts |
21 | Wirbelsäule Oben |
22 | Handspitze links |
23 | Daumen links |
24 | Handspitze rechts |
25 | Daumen rechts |
Aus dem Array lässt sich nun die Position der Hände ablesen, die innerhalb der Gesten verwendet werden, um die Hardwareelemente zu steuern. Da alle drei Gesten entweder auf linker oder rechter Hand basieren, sind aus dem Array nur die Positionen an Zeile 8 und 12 interessant. Wird nun zum Beispiel die Geste RGB LED erkannt durch eine offene linke und eine geschlossene rechte Hand, so wird zuerst die aktuelle Position der rechten Hand abgespeichert und dieser Stelle ein Steuerelement eingeblendet. Nun wird pro Frame der Abstand der rechten Hand im Vergleich zu den Steuerpositionen R, G und B berechnet und daraus eine PWM ansteuerung der RGB LED ermittelt. Je näher man somit einer der drei Steuerpositionen kommt, desto stärker leuchtet die LED in dieser Farbe. In der Mitte des Steuerkreises leuchten alle Farben mit 50%.
Nach dem gleichen Prinzip agieren die anderen Gesten. Bei der Helligkeit und Farbtemperatur Geste regelt die linke Hand eben genannte Größen auch über die Abstände zu den Steuerpositionen dieses Steuerkreises. Kalte und warme Temperatur wird hierbei durch einen dynamischen Wechsel zwischen der kalten und warmen LED erreicht. Auch hier gilt für eine zentrale Position eine Kalt-Warm Verteilung von 50% sowie eine Helligkeit von 50% also gesammt ein PWM Signal von 25% pro LED.
Die Regelung der Lautstärke wird über eine Linie erzeugt, auf der die rechte Hand rauf und runter bewegt werden kann, um lauter und leiser zu symbolisieren. Zusätzlich speichert diese Geste beim Verlassen den letzten Zustand und stellt diesen beim nächsten betreten der Geste wieder her. Wird somit die Lautstärke auf 20% geregelt und die Geste verlassen, so befindet sich beim nächsten Betreten der Geste die 20% Marke des Steuerelements genau auf der Position der rechten Hand.
Zuletzt testet das Programm die Bedingung zum Verlassen der Endlosschleife. Dies wird durch Drücken von "Q" erreicht. Wurde die Schleife verlassen, so wird die Verbindung zum Arduino abgebrochen, das Kinect Objekt gelöscht und danach das Programm beendet.
Zusammenfassung
Die vorgenommenen Aufgaben funktionieren gut, alle Elemente auf dem Arduino lassen sich gut steuern und werden unterstützt von den Grafikelementen in dem Videostream.
Dennoch lassen sich noch einige Punkte an diesem Projekt verbessern:
- Die Umsetzung eines echten Lautsprechers
- Eine bessere Framerate des Videostreams
- Implementierung weiterer Hardware wie zum Beispiel Servos oder Stepper-Motoren
- Implementierung komplexerer Gestenkonzepte
- Eine Erweiterung auf mehrere Personen im Bild
- Skalierung der Steuerelemente anhand des Abstandes
- Optimierung von start und beenden der Gesten
Diese Projekt ist aus der Veranstaltung GET Fachpraktikum Projektübersicht.
Weblinks
- Youtube Video zum Projekt
- Datei:Kinect Gestenerkennung Software.zip
- Datei:Kinect schaltplan.fzz
- Youtube Video zur Verstärkerschaltung