Objekterkennung mit Kinect Tiefenkamera mit Matlab/Simulinkmit und EV3

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

Autor: Lars Naujocks

Betreuer: Prof. Schneider

→ zurück zum Hauptartikel: Signalverarbeitende Systeme SoSe2017

Aufgabe

Die Aufgabe des Projektes für die Vorlesung „Signalverarbeitende Systeme“ besteht darin, ein LEGO Mindstorm Auto (EV3 Brick) mittels eines Sensors zu einer Notbremsung zu bringen, sobald ein Objekt (in diesem Fall ein Kopierpapierkarton) weniger oder gleich 5 cm entfernt ist. Der Sensor ist in diesem Falle eine Kinect Sensorleiste in der Version V2. Die entsprechende Software/Anwendung ist in Matlab und/oder Simulink zu implementieren. Ferner ist ein Video zu erstellen, das die Funktionalität zeigt.

Einleitung

Die Sensorleiste Kinect (abgeleitet vom englischen kinetic connect, deutsch Kinetische Verbindung) der Firma Microsoft wurde ursprünglich für die Spielekonsolen der Xbox-Reihe entwickelt. Sie soll dazu dienen, Videospiele nur durch Körperbewegungen und Sprache zu steuern. Microsoft bietet die Kinect in zwei Versionen an, Kinect V1 (Xbox360 und PC) und Kinect V2 (Xbox One und PC). Die Version V2 besitzt ein 3D-Mikrofon, eine RGB-Kamera, sowie einen Tiefensensor, der nach dem Time-of-Flight Prinzip arbeitet (s. weiter unten). Die Kombination von RGB-Kamera und Tiefensensor wird auch als RGB-D Kamera bezeichnet. Microsoft hat die Entwicklung vom Kinectspielen nahezu eingestellt, dennoch erfreut sich die Kinect in der Informatik und den Ingenieurswissenschaften großer Beliebtheit, da sie einen günstigen Einstieg in die Disziplinen Digitale Bildverarbeitung, Objekterkennung und Robotik bietet. Außerdem existieren mit z.B. OpenCV, OpenNi und Add-Ons für Matlab diverse Softwarepakete, die die Entwicklung eigener Programme unterstützen [1].

Abbildung 1: Kinect Version V2 [2]
Abbildung 1: Kinect Version V2 [2]

Verwendete Hard- und Software

Die folgende Auflistung zeigt die für die Entwicklung verwendete Hard- und Software.

Hardware

  • Lego Mindstorms EV3 Brick
  • Kinect V2
  • Laptop Acer Aspire E15 (8GB RAM, Intel Core i5-6267U @ 2.9Ghz bis zu 3.3 GHz (Turbo Speed))

Software

  • MS Windows 10 Version 1607
  • Matlab R2016b
  • QUT toolkit: https://wiki.qut.edu.au/display/cyphy/QUT+EV3+MATLAB+toolkit
  • Image Acquisition Toolbox version 5.1
  • Image Acquisition Toolbox Support Package for Kinect for Windows Sensor version 16.2.0
  • MATLAB Support Package for LEGO MINDSTORMS EV3 Hardware version 16.2.0
  • Computer Vision System Toolbox version 7.2
  • Kinect for Windows Runtime v1.6
  • KEV3 version 1.15 by Liviu Ivanescu

Technische Details zum Kinect System

Der folgende Abschnitt zeigt kurz die technischen Details der Kinect.

Technische Daten

Die u.a. Tabelle zeigt einen Auszug der technischen Daten der Kinect.

Tabelle 1: Technische Daten der Kinect(Auszug) [3]

Auflösung Farbkamera 1920x1080
Bildrate Farbkamera 30 fps
Auflösung Tiefenkamera 512x424
Bildrate Tiefenkamera 30 fps
Tiefensensor ToF-Sensor
Sichtfeld (FoV) horizontal 70°
Sichtfeld (FoV) vertikal 60°
Unterstütztes Betriebssystem Ab Windows 8
Minimale Distanz des ToF Sensors ~0.5 m
Maximale Distanz des ToF Sensors ~4.5 m
USB Standard 3.0

Koordinatensystem der Kinect

Wie bereits erwähnt verfügt die Kinect über einen RGB Sensor und einen IR-Tiefensensor nach dem ToF-Prinzip. Der Kameraraum bezieht sich auf das 3D Koordinatensystem, das von der Kinect benutzt wird. Das Koordinatensystem ist wie folgt definiert [4]:

  • Ursprung (x=0, y=0, z=0) liegt in der Mitte des IR-Sensors
  • rechtshändiges Koordinatensystem
  • X wird größer zur linken Seite des Sensors
  • Y wird nach oben größer (abhängig von der Neigung der Kinect)
  • Z wird in die Richtung größer, in die der Sensor zeigt
Abbildung 2: Kinect Koordinatensystem [4]
Abbildung 2: Kinect Koordinatensystem [4]


Die RGB Kamera ist zum Tiefensensor etwas versetzt, so dass beide eine leicht unterschiedliche "Weltsicht" haben. Möchte man eine kombinierte Farb- und Tiefeninformation haben, ist dieser Unterschied anzupassen, die sogenannte Registration. Dies wird automatisch von der Software (SDK,point cloud library) erledigt, so dass man sich nicht weiter darum kümmern muss.

Blockschaltbild und Signalverarbeitung der Kinect

ToF Sensor

Die Kinect V2 enthält eine Time-of-Flight (ToF) Kamera, die die Tiefe bestimmt, indem die Zeit gemessen wird von der Lichtemission der IR-Emitter bis zum Objekt und zurück zum IR-Sensor. Hierzu wird konstant IR-Licht mit modulierten Wellen emittiert und die Phasenverschiebung des reflektierten Lichts am IR-Sensor detektiert.

Um die Genauigkeit der Messungen selbst einschätzen zu können, wurde ein kleiner Messplatz aufgebaut. Auf einer Länge von 6 m wurde Kreppband befestigt und alle 10 cm eine Markierung aufgetragen. Die Kinect wurde am Nullpunkt befestigt und anschließend Tiefenbilder für verschiedene Entfernungen eines Kartons aufgenommen. Die Bilder wurden in Matlab gespeichert, damit sie später nachprozessiert werden konnten. Da die Präzision, immer den selben Punkt (z.B. Mittelpunkt des Kartons) zu messen, nicht gegeben ist, wurde ein anderer Ansatz zur Bestimmung verwendet: Von jedem Tiefenbild wurde ein Rechteck innerhalb des Kartons gewählt. Diese Koordinaten wurden ausgewertet. Alle Punkte außerhalb des Rechteckes wurden zu null gesetzt. Mittels der mean Funktion von Matlab wurde der Mittelwert der z-Werte (Entfernung) gebildet, der dann als gemessene Entfernung dient.

Der Matlab Code dafür, sieht beispielhaft folgendermaßen aus:

depth = aktuellesTiefenbild;

% Alles außer Kartonkoordinaten % auf null setzen % Beispiel: Die ersten zehn Zeilen null y0 = 1; y1 = 10; x0 = 1; x1 = 512;

for i=y0:y1

   for j=x0:x1
       depth(i,j) = 0;
   end

end

pos = nonzeros(depth); averdist = mean(pos);


Die nachprozessierten Daten wurden später gegen die tatsächliche Entfernung aufgetragen. Die folgende Abbildung zeigt das Ergebnis. Die Messungen beginnen bei 0.7 m und enden bei 6 m. Es ist eine sehr gute Linearität zu erkennen.


Abbildung 3: Gemessene Werte vs Ideal Werte
Abbildung 3: Gemessene Werte vs Ideal Werte

Die absoluten und relativen Fehler für die Messungen sind in der folgenden Tabelle einzusehen.

Tabelle 2: Absolute und relative Fehler der Kinectmessungen

Entfernung [m] Absoluter Fehler [mm] Relativer Fehler [%]
0.7 15.5905 2.2272
0.8 13.7665 1.7208
0.9 9.8011 1.089
1.0 14.9199 1.492
1.1 21.2209 1.9292
1.2 16.2427 1.3536
1.3 15.2618 1.174
1.5 17.789 1.1859
1.7 29.8047 1.7532
2.0 29.0092 1.4505
2.5 27.9668 1.1187
2.7 32.5772 1.2066
3.0 24.3166 0.81055
3.5 36.3986 1.04
4.0 34.1725 0.85431
4.5 0.053763 0.0011947
5.0 58.4529 1.1691
5.5 84.0955 1.529
6.0 94.3592 1.5727

Kritisch anzumerken ist, dass die Messungen schnell durchgeführt wurden und die Objekte (Kinect - Karton) nicht zueinander ausgerichtet werden konnten. Daher ist die Genauigkeit der Kinect wesentlich höher einzuordnen.



>> fehler(averclos07,700) Absolut: 15.5905 Relativ: 2.2272

>> fehler(averclos08,800) Absolut: 13.7665 Relativ: 1.7208

>> fehler(averclos09,900) Absolut: 9.8011 Relativ: 1.089


>> fehler(averclos10,1000) Absolut: 14.9199 Relativ: 1.492


>> fehler(averclos11,1100) Absolut: 21.2209 Relativ: 1.9292


> fehler(averclos12,1200) Absolut: 16.2427 Relativ: 1.3536

>> fehler(averclos13,1300) Absolut: 15.2618 Relativ: 1.174


>> fehler(averclos15,1500) Absolut: 17.789 Relativ: 1.1859

>> fehler(averclos17,1700) Absolut: 29.8047 Relativ: 1.7532

>> fehler(averclos25,2500) Absolut: 27.9668 Relativ: 1.1187


>> fehler(averclos27,2700) Absolut: 32.5772 Relativ: 1.2066

>> fehler(averclos30,3000) Absolut: 24.3166 Relativ: 0.81055


>> fehler(averclos35,3500) Absolut: 36.3986 Relativ: 1.04

> fehler(averclos40,4000) Absolut: 34.1725 Relativ: 0.85431


>> fehler(averclos45,4500) Absolut: -0.053763 Relativ: -0.0011947


>> fehler(averclos50,5000) Absolut: 58.4529 Relativ: 1.1691


>> fehler(averclos55,5500) Absolut: 84.0955 Relativ: 1.529


>> fehler(averclos60,6000) Absolut: 94.3592 Relativ: 1.5727

Realisierung

Hardware

Software

Die folgende Abbildung zeigt den Programmablaufplan: Er beginnt mit dem Aufräumen des Workspaces und dem Initialisieren der Variablen. Es folgt die Erstellung eines Brick Objektes und der Aufbau der Bluetooth Verbindung zwischen PC und Brick. Danach werden die Kinect Kameras initialisiert und entsprechende Videoobjekte erstellt. Der Brick wird gestartet und danach in einer While-Schleife permanent der Abstand zum Hindernis ermittelt. Sobald eine definierte Distanz erreicht wird, wird der Brick zur Notbremsung veranlasst und die While-Schleife verlassen. Im Detail passiert in der Schleife Folgendes: Zuerst werden jeweils ein Farb- und ein Tiefenbild erstellt. Danach kommt der erste Filteralgorithmus, der ähnlich wie ein Bandpass arbeitet, d.h. es werden nur Signale eines bestimmten Frequenzbandes, in diesem Fall Bildbereich, durchgelassen. Da der Sensor nur von 0.5 m bis 4.5 m zuverlässig arbeitet, werden alle z-Werte größer 4.5m und kleiner 0.5m gefiltert, d.h. auf null gesetzt. Danach wird das Sichtfeld (FoV) in x- und y-Richtung eingeengt, um irrelevante Daten zu entfernen. Als nächstes wird mit dem Befehl „pcfromkinect“ eine Punktwolke vom Tiefen- und Farbbild erstellt. Zuletzt wird das Objekt (Hindernis) mittels „pcfitplane“ Befehl aus der Punktwolke isoliert. Von dem isolierten Objekt kann die aktuelle Distanz in z-Richtung ermittelt werden und dann mit der Referenzdistanz für die Notbremsung verglichen werden. Ist der Wert kleiner oder gleich dem Referenzwert, wird eine Notbremsung durchgeführt, sämtliche Objektinstanzen gelöscht und die While-Schleife beendet. Ist der Wert größer als der Referenzwert, geht die Schleife in die nächste Iteration.

Abbildung 1: Programmablaufplan für die Notbremsung

Ergebnisse

Das Ergebnis des Projektes wurde ferner in einem Video festgehalten, das unter folgendem Link zu erreichen ist:

LinkieMcLink

Projektplan

Um die Übersicht über das Projekt zu behalten, wurde ein Projektplan mit MS Project 2016 erstellt. Dieser ist in [x] einzusehen. Das folgende Bild zeigt den Plan in Form einer Zeitachse.


Abbildung 3: Projektplan in Zeitachsenform
Abbildung 3: Projektplan in Zeitachsenform

Verzeichnisstruktur des Projektes

Sämtliche Daten sind unter Versionskontrolle mit SVN (Zugriffsrechte erforderlich). Das folgende Bild zeigt einen Überblick über die Verzeichnisse und Dateien.

Lessons Learned

  • Es ist besser Matlab nach jedem Run zu beenden und neuzustarten. Anderenfalls kann es sein, dass ein Objekt, das vorher erkannt wurde, im neuen Lauf nicht mehr erkannt wird und demzufolge eine Kollision stattfindet. Eventuell werden einige Objekte, die erzeugt wurden trotz "Zerstörung" nicht beendet und werden nicht richtig initialisiert.
  • Es konnte selbst nach stundenlangen Versuchen keine Bluetooth Verbindung zwischen Brick und Laptop hergestellt werden. Die Lösung lag hier daran, im Brick den iPhone/iPad Support zu deaktivieren!

Things to do

Quellen/Referenzen

!!!Für SVN Ordner sind die entsprechenden Zugriffsrechte erforderlich!!!

[1] https://de.wikipedia.org/wiki/Kinect, Abgerufen am 09.05.2017

[2] Von Evan-Amos - Eigenes Werk, Gemeinfrei, https://commons.wikimedia.org/w/index.php?curid=33217678, Abgerufen am 09.05.2017

[3] Cai, Ziyun; Han, Jungong; Liu, Li; Shao, Ling (2017): RGB-D datasets using microsoft kinect or similar sensors. A survey. In: Multimed Tools Appl 76 (3), S. 4313–4355. DOI: 10.1007/s11042-016-3374-6.

[4] https://msdn.microsoft.com/de-de/library/dn785530.aspx, Abgerufen am 27.05.2017

[5] Bamji, Cyrus S.; O'Connor, Patrick; Elkhatib, Tamer; Mehta, Swati; Thompson, Barry; Prather, Lawrence A. et al. (2015): A 0.13 μm CMOS System-on-Chip for a 512 × 424 Time-of-Flight Image Sensor With Multi-Frequency Photo-Demodulation up to 130 MHz and 2 GS/s ADC. In: IEEE J. Solid-State Circuits 50 (1), S. 303–319. DOI: 10.1109/JSSC.2014.2364270.

→ zurück zum Hauptartikel: Signalverarbeitende Systeme SoSe2017