Objekterkennung mit Kinect Tiefenkamera mit Matlab/Simulinkmit und EV3: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 143: Zeile 143:
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 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.  


[[Datei:MesswertevsIdeal.png |mini|zentriert|600px|Abbildung 4: Gemessene Werte vs Ideal Werte]]
[[Datei:MesswertevsIdeal.png |mini|zentriert|600px|Abbildung 5: Gemessene Werte vs Ideal Werte]]




Zeile 199: Zeile 199:
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 <ref name=ResKin> 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. </ref> 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).
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 <ref name=ResKin> 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. </ref> 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).


[[Datei:Auflösung-Kinect.PNG |mini|zentriert|600px|Abbildung 5: Auflösung des ToF Sensors <ref name=ResKin />]]
[[Datei:Auflösung-Kinect.PNG |mini|zentriert|600px|Abbildung 6: Auflösung des ToF Sensors <ref name=ResKin />]]


=== Signalverarbeitung des ToF Sensors ===
=== Signalverarbeitung des ToF Sensors ===
Zeile 205: Zeile 205:




[[Datei:MIPI.png |mini|zentriert|600px|Abbildung 6: MIPI Interface der SoCs <ref> 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. </ref>]]
[[Datei:MIPI.png |mini|zentriert|600px|Abbildung 7: MIPI Interface der SoCs <ref> 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. </ref>]]


Die Abbildung unten zeigt das Blockschaltbild des Sensorcips. Sowohl prozesstechnisch als auch schaltungstechnisch handelt es sich um einen sehr komplexes Design, das hier nur in Kürze beschrieben werden kann. Der interessierte Leser sei auf <ref name=CMOS-SOC/> verwiesen.
Die Abbildung unten zeigt das Blockschaltbild des Sensorcips. Sowohl prozesstechnisch als auch schaltungstechnisch handelt es sich um einen sehr komplexes Design, das hier nur in Kürze beschrieben werden kann. Der interessierte Leser sei auf <ref name=CMOS-SOC/> verwiesen.
Das Sensorfeld besteht aus 512 Zeilen und 424 Spalten.
Das Sensorfeld besteht aus 512 Zeilen und 424 Spalten.


[[Datei:SensorChip.PNG |mini|zentriert|600px|Abbildung 6: Blockschaltbild des Sensor SoCs <ref name=CMOS-SOC/>]]
[[Datei:SensorChip.PNG |mini|zentriert|600px|Abbildung 8: Blockschaltbild des Sensor SoCs <ref name=CMOS-SOC/>]]


== Realisierung ==
== Realisierung ==
Zeile 234: Zeile 234:


=== Aufbau ===
=== Aufbau ===
<div class="tright" style="clear:none;vertical-align:top">[[Datei:Aufbau.png|thumb|150px|Abbildung 9: Realer Aufbau des Systems]]</div>
<div class="tright" style="clear:none;vertical-align:top">[[Datei:Aufbau.png|thumb|150px|Abbildung 10: Realer Aufbau des Systems]]</div>
<div class="tright" style="clear:none;vertical-align:top">[[Datei:Aufbau-System.png|thumb|200px|Abbildung 8: Schematischer Aufbau des Systems]]</div>
<div class="tright" style="clear:none;vertical-align:top">[[Datei:Aufbau-System.png|thumb|200px|Abbildung 9: Schematischer Aufbau des Systems]]</div>
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.
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.


Zeile 241: Zeile 241:
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.
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.


[[Datei:PAP.png|gerahmt|zentriert|1000x1000px|Abbildung 10: Programmablaufplan für die Notbremsung]]
[[Datei:PAP.png|gerahmt|zentriert|1000x1000px|Abbildung 11: Programmablaufplan für die Notbremsung]]


=== Signalflussplan ===
=== Signalflussplan ===
Zeile 247: Zeile 247:




[[Datei:Signalflussplan.png|mini|zentriert|900px|Abbildung 11: Signalflussplan]]
[[Datei:Signalflussplan.png|mini|zentriert|900px|Abbildung 12: Signalflussplan]]


== Ergebnisse ==
== Ergebnisse ==
Zeile 260: Zeile 260:




[[Datei:Zeitachse.png|mini|zentriert|1200px|Abbildung 12: Projektplan in Zeitachsenform]]
[[Datei:Zeitachse.png|mini|zentriert|1200px|Abbildung 13: Projektplan in Zeitachsenform]]


== Lessons Learned ==
== Lessons Learned ==

Version vom 17. Juni 2017, 10:29 Uhr

Autor: Lars Naujocks

Betreuer: Prof. Dr.-Ing. Ulrich 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

Abbildung 1: Kinect Version V2 [1]

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 [2].

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

Abbildung 2: Kinect Koordinatensystem [4]

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:

Abbildung 3: Prinzip ToF Sensor


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


für jedes beliebige ganzzahlige k. Das bedeutet, dass wenn eine Phase von

 

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.

Abbildung 4: Umgehung des Phase-Wraparound-Fehlers im Kinect ToF Sensor [7]

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.

Abbildung 5: 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. 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).

Abbildung 6: Auflösung des ToF Sensors [9]

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. Alle Chipdaten sind über 2 4- Lane MIPI D-Phy angebunden mit einer gesamten Übertragungsrate von 8 Gb/s. Wie die Konvertierung MIPI-USB realisiert wird ist nicht bekannt. Die Abbildung zeigt das Blockschaltbild der Verbindung der beiden SoCs.


Abbildung 7: MIPI Interface der SoCs [11]

Die Abbildung unten zeigt das Blockschaltbild des Sensorcips. Sowohl prozesstechnisch als auch schaltungstechnisch handelt es sich um einen sehr komplexes Design, das hier nur in Kürze beschrieben werden kann. Der interessierte Leser sei auf [7] verwiesen. Das Sensorfeld besteht aus 512 Zeilen und 424 Spalten.

Abbildung 8: Blockschaltbild des Sensor SoCs [7]

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

Abbildung 10: Realer Aufbau des Systems
Abbildung 9: Schematischer Aufbau des Systems

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.

Abbildung 11: Programmablaufplan für die Notbremsung

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.


Abbildung 12: Signalflussplan

Ergebnisse

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

https://youtu.be/Ex-KgOV4YVA

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.


Abbildung 13: Projektplan in Zeitachsenform

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!!!

  1. Von Evan-Amos - Eigenes Werk, Gemeinfrei, https://commons.wikimedia.org/w/index.php?curid=33217678, Abgerufen am 09.05.2017
  2. https://de.wikipedia.org/wiki/Kinect, 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. 4,0 4,1 https://msdn.microsoft.com/de-de/library/dn785530.aspx, Abgerufen am 27.05.2017
  5. 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.
  6. 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
  7. 7,0 7,1 7,2 7,3 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.
  8. 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. 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.
  10. https://mipi.org/specifications/physical-layer, Abgerufen am 04.06.2017
  11. 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