Objekterkennung mit Kinect Tiefenkamera mit Matlab/Simulinkmit und EV3
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. Da die Kinect erst ab 0.5 m Tiefenbilder liefert (vgl. Tabelle 1), wurde mit Prof. Schneider vereinbart, einen anderen beliebigen Wert zu nehmen. Für diesen Aufbau wird ein Wert von 0.7 m verwendet.
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].
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
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.
ToF Sensor
Der ToF Sensor ist das Herzstück der Tiefenmessung. Funktionsweise und technische Daten werden im Folgenden erläutert.
Funktionsweise des ToF Sensors
Die Kinect V2 enthält eine Time-of-Flight (ToF) Kamera, die die Tiefe bzw. Entfernung 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, siehe auch folgende Abbildung:
Die Berechnung der Distanz erfolgt dann wie folgt [5]:
Bekannte Parameter
c: Lichtgeschwindigkeit (3*10^8 m/s)
f: Frequenz des emittierten Lichts
Gemessen:
: Phasenverschiebung
Gesucht:
d: Distanz
Es gilt:
Daraus folgt (Hin- und Rückweg!)
Ein typisches Problem von ToF Sensoren ist der sogenannte "Phase Wrap-Around"-Fehler. Bei einer Phasenverschiebung gilt für die Periode k*2*pi für jedes beliebige ganzzahlige k. Das bedeutet, dass wenn ein Phase von 2pi 8 m entspricht, dann werden zwei Punkten 0,2 m und 8,2 m die gleichen Messwerte zugeordnet [6]. Die Kinect arbeitet deshalb zur Umgehung dieses Problems bei ihrem ToF-Sensor mit drei Emittern (es gibt anscheinend auch eine Version mit 2 Emittern) mit verschiedenen Frequenzen, um Mehrdeutigkeiten in der Distanzmessung zu reduzieren (niedrigere Frequenzen) und um Unsicherheiten in der Distanzmessung zu reduzieren (höhere Frequenzen) [7]. Die folgende Abbildung verdeutlicht das Vorgehen. Bei einer niedrigen Frequenz wird nur ein Objekt detektiert mit einer relativ hohen Unsicherheit. Bei höheren Frequenzen ist die Unsicherheit kleiner, aber dafür gibt es Mehrdeutigkeiten. Die Kombination von allen erlaubt eine sehr genaue und eindeutige Messung.
Genauigkeit und Präzision des ToF Sensors
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 werden 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 der Kennlinie mit hinreichender Genauigkeit zu erkennen, so dass eine Linearisierung oder Kalibrierung für diesen Anwendungsfall nicht nötig ist.
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. Studien [8] zeigen, dass präzise Messungen (alt: Wiederholgenauigkeit) erst nach einer halben Stunde Vorheizzeit erreicht werden. Nach der halben Stunde liegen bei wiederholten Messungen konstante Werte innerhalb des Variationsintervalls von ± 1 mm vor.
Tiefenauflösung des ToF Sensors
Mit der Auflösung ist in diesem Fall nicht die Anzahl der Pixel des Sensors gemeint, sondern die minimal detektierbare Differenz des Sensors zwischen zwei (oder mehr) Punkten in der Tiefenmessung. Je kleiner die detektierbare Differenz desto höher ist die Auflösung. Hierfür [9] wurden Versuche durchgeführt: Zur Berechnung der Tiefenauflösung wurde eine planare Oberfläche in zwei Winkeln (45 ° und 60 °) zur Kinect ausgerichtet und bei verschiedenen Abständen gemessen. Die Ergebnisse sind in der Abbildung zu sehen. Die Werte zwischen 0 und 0,5 m wurden zu null gesetzt, da dort keine Messung möglich ist. Für einen Winkel von 45 ° ergibt sich eine durchschnittliche Auflösung von 1 mm bei einer Distanz von 1 m bis zu 4 mm bei einer Distanz von 4 m. Für einen Winkel von 60 ° fallen die Werte etwas schlechter aus (ca. 1,3 mm bei 1 m und 6 mm bei 4 m). Die Standardabweichung ist bei beiden Winkeln zwischen 1 und 2 m nahezu konstant, während sie danach annähernd linear zunimmt (60 ° wieder etwas schlechter).
Signalverarbeitung des ToF Sensors
Der eigentliche ToF Sensor besteht nicht nur aus dem CMOS Pixel Array, sondern enthält auch die gesamte Signalverarbeitungskette. Es handelt sich also um ein System-on-Chip (SoC). Der Ausgang des SoCs ist realisiert über ein MIPI D-Phy (Master), das mit einem anderen SoC, dem Kamera SoC über das PCB verbunden ist. PHY ist die Abkürzung für Physical Layer (Bitübertragungsschicht des OSI-Modells) und ist ein Verbindungsprotokoll. Ein MIPI D-Phy ist ein PHY der MIPI Alliance für Verbindungen von Kameras und Displays zu einem Applikationsprozessor. [10] Die Schnittstelle die zwischen beiden SoCs benutzt wird ist das sogenannte CSI (Camera Serial Interface), also eine serielle Schnittstelle. Das Kamera SoC empfängt die Daten über ein MIPI D-Phy (Slave), konvertiert sie in den USB Standard und gibt die Daten über den USB 3.0 Bus an den Rechner weiter. Mit wie vielen Lanes das CSI Interface angebunden ist und wie die Konvertierung realisiert wird ist nicht bekannt. Die Abbildung zeigt das Blockschatbild der Verbindung der beiden SoCs.
Das SoC des Sensors wurde in einem 130 nm TSMC Prozess mit fünf Lagen Metall und einer Lage Polysilizium gefertigt. Das Sensorfeld besteht aus 512 Zeilen und 424 Spalten. Die Größe der einzelnen Pixel beträgt 10 * 10 um.
Realisierung
Das Kapitel beschreibt welche Hard- und Software für die Implementierung benutzt wurde, wie der Aufbau realisiert wurde,den Programmablaufplan und den Signalflussplan.
Verwendete 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))
Verwendete Software
- MS Windows 10 Version 1607
- Kinect for Windows Runtime v1.6
- Matlab R2016b
- Matlab Addons:
- KEV3 version 1.15 by Liviu Ivanescu
- 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
Aufbau
Um die Kinect auf dem Fahrzeug zu befestigen wurde eine kleine Holzplatte gesägt. Da die Kinect an der Unterseite ein Stativgewinde besitzt, wird dieses mittels Stativschraube am Holz befestigt. Zwei weitere Schrauben sorgen für Halt am Fahrzeug (vgl. Abbildung). Die Kinect ist über den USB Bus an den Laptop angeschlossen. Zusätzlich benötigt sie eine 230V Spannungsversorgung. Damit ist die Mobilität des Aufbaus recht eingeschränkt, allerdings ist sie ausreichend, um die Funktionalität zu zeigen. Sämtliche Steuerbefehle an den Brick werden über eine zuvor aufgebaute Bluetooth Verbindung zwischen Laptop und Brick realisiert wie in der Abbildung zu erkennen ist. Da die Kinect nicht bündig mit den Vorderreifen abschließt, muss ein Versatz addiert werden. In diesem Fall wird ein Wert von 4 cm gewählt (nach Messung), der zu den 70 cm addiert wird.
Programmablaufplan
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 wird jeweils 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 Tiefenbild 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.
Signalflussplan
Obwohl die gesamte Signalverarbeitung in Software implementiert ist, zeigt die folgende Abbildung den Signalflussplan, der für jedes Frame bis zur Notbremsung durchlaufen wird.
Ergebnisse
Das Ergebnis des Projektes wurde ferner in einem Video festgehalten, das unter folgendem Link zu erreichen ist:
Die Zeitdauer der einzelnen Schritte kann mittels der Variable "measurePerformance" gesetzt werden. Dann wird zwischen den wichtigsten Sequenzen der Matlabbefehl "tic-toc" verwendet. Die Werte werden auf das Matlab Command Window ausgegeben. Die Initialisierung der USB Verbindung und das Einrichten des Videoobjektes dauert tpyischerweise zwischen 10 und 15 Sekunden. Die Ermittlung der aktuellen Distanz in etwa 200 ms.
Projektplan
Um die Übersicht über das Projekt zu behalten, wurde ein Projektplan mit MS Project 2016 erstellt. Das folgende Bild zeigt den Plan in Form einer Zeitachse.
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!
Quellen/Referenzen
!!!Für SVN Ordner sind die entsprechenden Zugriffsrechte erforderlich!!!
- ↑ https://de.wikipedia.org/wiki/Kinect, Abgerufen am 09.05.2017
- ↑ Von Evan-Amos - Eigenes Werk, Gemeinfrei, https://commons.wikimedia.org/w/index.php?curid=33217678, Abgerufen am 09.05.2017
- ↑ 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,0 4,1 https://msdn.microsoft.com/de-de/library/dn785530.aspx, Abgerufen am 27.05.2017
- ↑ Pohlmann, Stefanie T. L.; Harkness, Elaine F.; Taylor, Christopher J.; Astley, Susan M. (2016): Evaluation of Kinect 3D Sensor for Healthcare Imaging. In: Journal of medical and biological engineering 36 (6), S. 857–870. DOI: 10.1007/s40846-016-0184-2.
- ↑ https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=0ahUKEwiv4tiPtMTUAhWQLVAKHXsGAzIQFghAMAI&url=http%3A%2F%2Fwww.irf.tu-dortmund.de%2Fcms%2Fde%2FIT%2FLehre%2FWintersemester%2FSeminar_Robo-Cup%2F3DSensoren_Kuhnert.pdf&usg=AFQjCNECO8ulgYTJt9SPxGJpGUlaDE9SyQ, Abgerufen am 17.06.2017
- ↑ 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.
- ↑ Lachat, E.; Macher, H.; Mittet, M.-A.; Landes, T.; Grussenmeyer, P. (2015): FIRST EXPERIENCES WITH KINECT V2 SENSOR FOR CLOSE RANGE 3D MODELLING. In: Int. Arch. Photogramm. Remote Sens. Spatial Inf. Sci. XL-5/W4, S. 93–100. DOI: 10.5194/isprsarchives-XL-5-W4-93-2015.
- ↑ 9,0 9,1 Yang, Lin; Zhang, Longyu; Dong, Haiwei; Alelaiwi, Abdulhameed; Saddik, Abdulmotaleb El (2015): Evaluating and Improving the Depth Accuracy of Kinect for Windows v2. In: IEEE Sensors J. 15 (8), S. 4275–4285. DOI: 10.1109/JSEN.2015.2416651.
- ↑ https://mipi.org/specifications/physical-layer, Abgerufen am 04.06.2017
- ↑ Sell, John; O'Connor, Patrick (2014): The Xbox One System on a Chip and Kinect Sensor. In: IEEE Micro 34 (2), S. 44–53. DOI: 10.1109/MM.2014.9.
→ zurück zum Hauptartikel: Signalverarbeitende Systeme SoSe2017