Projekt 15: Gestenerkennung der Kinect zur Ansteuerung von LED, Servos u.s.w.

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Kinect V2

→ zurück zur Übersicht: WS 17/18: Fachpraktikum Elektrotechnik (MTR)


In Bearbeitung

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 Beweungen dazu
  • Realisierung des Aufbaus mit Arduino Uni und prototypischem "shield"
  • Einlesender 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

Typischer weise befindet sich eine Kinect Kamera im Wohnzimmer des entsprechenden Besitzers. Auf dieser Vorraussetzung ist die Idee der Home Automation sehr naheliegend. Vorstellbar sind hier beispielsweise die Helligkeitssteuerung der Lampen, die Lautstärkeregelung des Hifi-Systems, eine Temeraturregelung der Heizungen und eine automatisierte Steuerung der Jalousien. Für dieses Projekt wurde eine Lichtsteuerung und eine Lautstärkeregelung ausgewählt, da diese Konzepte leicht zu modellieren sind.

Für die Lichtsteuerung wurden zwei verschiedene Anwendungsfälle ausgearbeitet. Der erste ist die Farbsteuerung einer RGB-LED und der zweite eine Helligkeitssteuerung zusammen mit einer Farbtemperatureinstellung an zwei weißen LEDs. Die Lautstärkeregelung wurde durch eine Transistorschaltung zur Verstärkung eines eingehenden Audiosignals realisiert. Somit gliedert sich die Schaltung in drei verschiedene Module. Nach genauerer Ausarbeitung dieser Schaltung wurden folgende Teile verwendet.

BOM:

Artikelname Anzahl Anbieter Bestellnummer
Artikelname Anzahl Anbieter Bestellnummer
Artikelname Anzahl Anbieter Bestellnummer
Artikelname Anzahl Anbieter Bestellnummer
Artikelname Anzahl Anbieter Bestellnummer
Artikelname Anzahl Anbieter Bestellnummer
Artikelname Anzahl Anbieter Bestellnummer
Artikelname Anzahl Anbieter Bestellnummer
Artikelname Anzahl Anbieter Bestellnummer
Artikelname Anzahl Anbieter Bestellnummer
Artikelname Anzahl Anbieter Bestellnummer
Artikelname Anzahl Anbieter Bestellnummer
Artikelname Anzahl Anbieter Bestellnummer
Artikelname Anzahl Anbieter Bestellnummer
Artikelname Anzahl Anbieter Bestellnummer
Artikelname Anzahl Anbieter Bestellnummer


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 einzenlen 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 vertiakler Bewegungsrichtung eine Regelung der Helligkeit und in horizonatler Richtung eine Steuerung der Farbtemperatur möglich

Hardware

Die geplanten Schaltung sollte auf ein Arduino shield aufgebracht werden und wurde dazu vorher in Fritzing entworfen. Die einzelnen Module wurden mit jeweils verschiedenen PWM Pins des Ardunio angesteuert. Dies resultiert in folgende Schaltung:


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, das diese eine 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. Dieses 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.

Bearbeiten der Path Variable

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 Initlisierungsbereich 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 verlasen. 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 1080,1920 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, wo 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 und das Kinect Objekt gelöscht und danach das Programm beendet.


Dummyref [5]


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. Abgesehen davon lassen sich noch einige Punkte an diesem Projekt verbessern.

  • Die Umsetzung eines echten Lautsprechers
  • Eine bessere Framerate des Videostream
  • Implementierung weiterer Hardware wie zum Beispiel Servos

Diese Projekt ist aus der Veranstaltung GET Fachpraktikum Projektübersicht.

Literaturverzeichnis


Korrektur/Rückmeldungen