3D Time-of-Flight Sensor Evaluation Module mit Matlab/Simulink

Aus HSHL Mechatronik
Version vom 6. Juli 2018, 16:52 Uhr von Suleihi (Diskussion | Beiträge) (→‎Inbetriebnahme des Sensors)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Sensor: TI Evaluation Module: OPT8241-CDK-EVM

Autor: Asaad Al-Suleihi

Bei dem betrachteten Sensor handelt es sich um ein Kamerasystem, das mit Hilfe des Time-of-Flight-Verfahrens ein 3D-Bild seiner Umgebung erstellen kann, kurz 3D ToF. Bei diesem wird ein Lichtstrahl pulsiert in eine Umgebung geworfen und die reflektierten Strahlen von einem Sensor aufgenommen. Anhand der Phasenverschiebung der gesendeten und aufgenommenen Strahlen lässt sich pro Bildpunkt die Entfernung zu einem Objekt berechnen und somit ein 3D-Bild der Umgebung erstellen. Der Bildsensor in einem ToF-System wird auch als Photonic Mixer Device, kurz PMD, bezeichnet [1. S. 336].

Beschreibung des Sensors

Aufbau der Evaluations-Kit OPT8241 CDK

Das Sensorsystem besteht aus drei Komponenten. Die Optik besteht aus einer Platine mit einer Lichtquelle. Genauer sind hier vier Laserdioden eingebaut. In der Abbildung 1 ist diese Komponente grün umrandet. Die zweite Komponente, die Steuerungs- und Auswerteelektronik, steuert zum einem die Lichtquelle und bestimmt somit die Lichtimpulse. Zum anderen enthält sie den eigentlichen Lichtsensor samt seiner Optik. Sie wertet die nimmt die von Objekten in der Umgebung zurückreflektierten Lichtstrahlen auf und berechnet daraus die Tiefeninformationen der jeweiligen Pixel. Diese Komponente ist im Bild 1 rot umrandet. Unterstützt wird das System durch die dritte Komponente, die z.B. Arbeitsspeicher, Konfigurations- und Kalibrierspeicher, USB-Schnittstelle, Power-Management usw. bereitstellt. Im Bild ist diese blau umrandet.

Funktionsweise des Sensors

Ein 3D ToF-Sensor besteht hauptsächlich aus zwei Komponenten: ein Lichtsensor, z.B. ein CMOS-Lichtsensormatrix, und eine modulierte Lichtquelle, meist eine Laserdiode [3. S. 1]. Die Umgebung wird von der Quelle mit Lichtpulsen angestrahlt. Diese Lichtstrahlen werden von Objekten in der Umgebung zurückreflektiert und vom Sensor erfasst. Durch die Berechnung der Phasenverschiebung zwischen abgestrahlten und aufgenommenen Lichtstrahl kann die Entfernung zum Reflektionspunkt ermittelt werden. Es wird also über die Flugdauer zum Objekt die Distanz ermittelt. Daher stammt der Name Time-of-Flight. Die Abbildung 2 soll diesen Zusammenhang darstellen.

Die Lichtquelle sendet ein Lichtpuls der Breite aus. Am Sensor werden dabei über zwei Zeitfenster und , die Phasenverschoben sind, die Menge der auftretenden Lichtenergie gemessen und aufaddiert. Diese wird im Sensorinneren durch freigesetzte Elektronen erfasst. Durch das Aufaddieren von Elektronenaufkommen wird die Ladung über die Zeitfenster und ermittelt. Diese werden respektive und bezeichnet. Daraus lässt sich mit der Formel

die Entfernung vom Reflektionspunkt zu Bildpixel im Sensor berechnen.[3. S. 2] Die Abbildung 3 verdeutlicht das Funktionsprinzip.

Der Sensorkern stellt ein CMOS-Bildsensor dar. Hier werden die eintreffenden Photonen in einem elektrischen Signal umgewandelt. Um diesen Kern herum existiert eine Reihe von anderen Bausteinen. Unter anderem ein Analog-Digital-Umwandler, Timing-Generator, der das zeitliche Abstimmen der Lichtausstrahlung und Bildaufnahme koordiniert, ein Modulationsblock, der die Modulation der Lichtimpulse regelt und ein Ausgabeblock für die Ausgabe der Sensordaten zur weiteren Bearbeitung. Der schematische Aufbau des Sensors ist in der Abbildung 4 dargestellt.

Technische Daten

(Nach [5. S. 1])

  • Sensorauflösung: 320 x 240 Pixel
  • Bildrate: 30 Bilder / Sekunde
  • Entfernungsgenauigkeit: < 0,01%
  • Wellenlänge der emittierten Lichtstrahlen: 850 nm
  • Sensorreichweite: bis zu 5 m
  • Sichtfeld: Horizontal: 74,4°; Vertikal: 59,3°

Die Messkette

Von Erfassen der Umgebung bis zur Ermittlung von Entfernungsdaten durch den Sensor müssen zuerst einige Schritte durchlaufen werden. Diese werden allgemein als Messkette bezeichnet. Für das korrekte Verständnis eines Sensorsystems und zur Evaluierung seiner Einsatzfähigkeit sowie Ermittlung von Fehlerquellen ist die Betrachtung der Messkette besonders wichtig. Die Abbildung 5 zeigt die Messkette des 3D ToF-Moduls.

Als erstes steht der Sensorkern. Diese ist ein CMOS-Bildsensor. Anderes als bei normalen Bildsensoren wird der Sensorkern zusätzlich von einer Logik angesteuert, die aus dem einfallenden Licht korrelationsabhängige Spannung auf Pixelebene erzeugt. Dies entspricht das in Kapitel 1.2 beschriebene Verhalten. Die Pixelspannung wird dann in einem folgenden Element analog vorverarbeitet. Leider sind hierzu keine weiteren Erkenntnisse aus der Herstellerdokumentation zu finden. Die vorverarbeiteten analogen Signale werden dann von einem Analog-Digital-Umsetzer in digitale Werte mit 12-Bit-Auflösung umgesetzt.

Die digitalen Werte verlassen nun den Sensorchip und werden von dem "Depth Engine OPTA9221" weiterverarbeitet. Dies ist ein separater Bauteil, der sich auf der Platine des Evaluationsmoduls befindet. Die Kommunikation erfolgt parallel über das CMOS-Data-Interface. In diesem Schritt berechnet das Depth-Engine aus den Korrelationsdaten die Tiefendaten. Diese werden im Anschluss an einem Rechner über die USB-Schnittstelle weitergegeben.

Im Folgenden wird auf einige von diesen Elementen näher eingegangen.


Ausgangssignale des Sensors

Der Sensor liefert als Rohsignale sogenannte "Phase Correlation Data". Diese geben einen Vergleich der gesendeten Lichtimpulse mit den empfangenen Strahlen in Hinblick auf die zeitliche Verschiebung an. Die Korrelationsdaten werden in einer Auflösung von 12 Bit weitergegeben. Des Weiteren werden noch Common Mode Data ausgegeben. Das sind Gleichtaktsignale die nicht aufgrund des gesendeten Lichtstrahls vom Sensor erfasst wurden und können als Störung durch die Umgebung oder Hintergrundstrahlung verstanden werden. Diese leitet der Sensor in 4 Bit Auflösung weiter.

Neben diese Rohdaten werden durch den auf der Sensorplatine integrierten Verarbeitungschip, den "Depth Engine OPTA9221", noch zwei weitere Datenarten geliefert: Tiefenbild und Punktwolke.

Ein Tiefenbild, englisch Depth Image, bezeichnet ein Pixel-Map, in der jedes Pixel eine Tiefeninformation trägt. Das heißt, der Wert des Pixels stellt die Entfernung dieses Bildpunktes zum Sensor dar. Die Abbildung 6 zeigt ein Tiefenbild einer flachen Fläche. Zu sehen ist, dass die Entfernung eines Pixels aufsteigt, je weiter man sich radial vom Bildmittelpunkt entfernt. Dies lässt sich trivial mit einem rechtwinkligen Dreieck erklären, dessen Hypotenuse länger wird, je länger die Gegenkathete wird.

Die zweite Art der Daten ist die Punktwolke, zu Englisch Point Cloud. Sie berührt auf sogenannten Voxel statt Pixel. Ein Voxel bezeichnet einen Gitterpunkt. Es wird durch die Angaben x-, y-, und z-Koordinaten beschrieben und stellt sozusagen ein Punkt im Raum. Eine Punkwolke ist somit ein Vektor aus Voxel. Die Abbildung 7 zeigt eine Punktwolke einer Szene, in welcher ein Stuhl und Rollcontainter als Punktwolke abgebildet sind. Im Vergleich zu einem Tiefenbild, wie in Abbildung 8, lassen sich aus einer Punktwolke einfacher z.B. Objekte konstruieren, da die Punkte einzeln in einem Vektor vorliegen und nicht erst vorher aus einem Pixel-Map herausgerechnet werden müssen.

Signalvorverarbeitung

Das Blockschaltbild in der Abbildung 4 des Sensors zeigt einen Verarbeitungsblock, den Analog-Processing-Block. Daraus lässt sich schließen, dass die Rohsignale zunächst vorverarbeitet werden bevor die Umsetzung in digitale Daten erfolgt. Leider gibt das Datenblatt keinerlei Informationen darüber, was in diesem Schritt passiert. Da es sich hier jedoch um einen CMOS-Sensor handelt, sind folgende Varianten vorstellbar:

  • Verstärkung der Messsignale
  • Rauschunterdrückung

Diese lassen sich im analogen Bereich durch Operationsverstärker und analoge Filter respektive umsetzen. Es ist auch denkbar, dass an dieser Stelle die Trennung der Korrelationssignale von Gleichtaktsignale stattfindet.

Analog-Digital-Umsetzung

Nach dem vorverarbeiten der analogen Signalen werden diese in digitale Daten umgesetzt. Hierzu wird ein Analog-Digital-Umsetzer genutzt. Nach diesem Schritt stehen die Korrelationsdaten in 12-Bit- und die Gleichtaktdaten in 4-Bit-Auflösung bereit. Die Art des ADU ist aus dem Datenblatt sowie verschiedene White-Paper des Herstellers nicht zu entnehmen.

Übertragung der Daten zum Mikrocontroller

Der Sensor besitzt eine CMOS-Data-Interface-Schnittstelle. Bei dieser handelt es sich um ein paralleles Bussystem, das vorwiegend in Bereich der CMOS-Bildsensoren eingesetzt wird. Für die Übertragung der Daten stehen 16-Bit zur Verfügung. Diese sind in der Abbildung 9 mit CMOS[15..0] gekennzeichnet. Des Weiteren existiert noch ein Systemtaktsignal, CLKOUT, das die Ausgabe jedes parallele Datum signalisiert, sowie zwei weitere Taktsignale, VD und HD, die respektive die Übertragung eines ganzen Bildes sowie einer Sensorzeile signalisieren. Bei jedem Taktsignal werden 16 Bit gleichzeitig ausgegeben.

Bei der Übertragung wird als erstes Datum eine Frame-ID übertragen. In dieser stehen die Quadraturnummer, also der Sensorabschnitt aus dem die Daten herausgelesen werden, sowie eine Sub-Framenummer. Danach werden Zellenweise pro Zeile die digitalen Sensordaten ausgegeben. Der Ablauf der Kommunikation ist in der Abbildung 9 dargestellt.

Berechnung der Entfernungsdaten

Bei der Bewertung der Messdaten wurde eine Diskrepanz zur Realität festgestellt. Als Maßnahme bietet sich eine Umrechnungsfunktion. Zum Ermitteln der Umrechnungsfunktion wurden eine Versuchsreihe durchgeführt. Dazu wurde das Sensorsystem vor einer ebenen Fläche gestellt. Bei sechs verschiedenen Abständen wurden jeweils zehn Messwerte aufgenommen und ausgewertet. Da die Messwerte des Sensors ein gewisses Rauschen aufweisen wurde zunächst das Mittelwert jeder Messreihe ermittelt. Die Abbildung 10 zeigt die Darstellung der Mittelwert der Messwerte über die wahre Entfernung. Zu sehen ist, dass der Zusammenhang linear ist. Somit lässt sich eine lineare Umrechnungsfunktion, eine Gerade, ermitteln. Diese Funktion lautet:

Die Abbildung 11 zeigt die in Entfernung umgerechneten Messwerte nach der oben genannten Formel. Aus dem Diagramm ist ersichtlich, dass die umgerechnete Entfernung mit der gemessenen übereinstimmt. Allerdings ist zu beachten, dass die Referenzmessungen mit einem Messband durchgeführt wurde und nicht zuverlässig ist. Nichtsdestotrotz ist diese für eine erste Betrachtung ausreichend.

Fehlermöglichkeiten

Wie bei jedem Sensor und jeder Messkette können hier auch Fehler unterschiedlicher Natur entstehen. Folgend ist eine Auflistung einige dieser Möglichkeiten:

  • Der Sensor arbeitet mit NIR-Lichtstrahlen (Near Infra-Red). Umgebungslicht, Wärmequellen usw. können Fehlerhafte Signale erzeugen. Um dies entgegenzuwirken, arbeitet das Sensorsystem mit modulierten Lichtstrahlen. Trotzdem kann eine Störung durch die Umgebung nicht ausgeschlossen werden.
  • Die Steuerelektronik, die die Korrelationsmessung im Sensorkern ermöglicht, untersteht strenge Zeit-Anforderungen. Durch fehlerhaftes Timing, z.B. durch Schwankungen im Taktgeber, können fehlerhafte Messungen entstehen.
  • CMOS-Bildsensoren Rauschen, wodurch eine saubere Abbildung der eintreffenden Lichtstrahlen kaum Ermöglicht.
  • Ungenauigkeiten bei der analogen Vorverarbeitung, systematischer Art wie z.B. Herstellungsfehler in den verwendeten Bauteilen oder stochastischer Natur wie z.B. Temperatureffekte, können Einfluss auf die Messungen nehmen.
  • Bei der Analog-Digital-Umsetzung können Quantisierungsfehler, Amplitudenfehler, Phasenfehler, Linearitätsfehler und Rauschen auftreten.

Auswertung der Messergebnisse

Im Folgenden wird das Mittelwert, die Standardabweichung, Messunsicherheit sowie der Vertrauensbereich für das Sensorsystem ermittelt. Wie im Vorherigen beschrieben wurde bei sechs verschiedenen Abständen jeweils zehn Messwerte aufgenommen und diese analysiert. Für den Vertrauensbereich wurde ein Vertrauensniveau von 68,3% da es sich hier um eine vermessungstechnische Aufgabe handelt. In der folgenden Tabelle sind die Ergebnisse dargestellt:

Wahre Entfernung / m Gemessene Entfernung / m Mittelwert / m Standardabweichung / m Messunsicherheit / m Vertrauensbereich für Erwartungswert / m
1 2 3 4 5 6 7 8 9 10
0,50 0,4966 0,4966 0,4918 0,4918 0,4918 0,5014 0,4966 0,5014 0,4966 0,4918 0,4956 0,0038 0,0013 0,4956 ± 0,0013
0,75 0,7491 0,7515 0,7515 0,7491 0,7515 0,7515 0,7419 0,7467 0,7467 0,7491 0,7481 0,0038 0,0013 0,7481 ± 0,0013
100 1,0040 0,9992 1,0112 1,0061 1,0061 1,0088 1,0088 1,0064 1,0112 1,0136 1,0066 0,0049 0,0016 1,0066 ± 0,0016
1,25 1,2468 1,2565 1,2565 1,2541 1,2613 1,2613 1,2492 1,2613 1,2541 1,2468 1,2548 0,0057 0,0019 1,2548 ± 0,0019
1,5 1,5186 1,4945 1,5041 1,5017 1,4993 1,4921 1,4945 1,4993 1,5017 1,5017 1,5008 0,0074 0,0025 1,5008 ± 0,0025
1,57 1,7470 1,7542 1,7470 1,7470 1,7494 1,7422 1,7302 1,7662 1,7422 1,7422 1,7468 0,0093 0,0031 1,7468 ± 0,0031

Aus der Tabelle kann entnommen werden, dass bei steigendem Abstand die Messunsicherheit zunimmt.

Inbetriebnahme des Sensors

Der betrachtete Sensor wird nicht von MATLAB unterstützt. Eine Verbindung mit MATLAB ist daher mit Verwendung der verfügbaren Support-Packages nicht möglich. Lediglich eine C++-SDK existiert, die Voxel SDK [1], mit deren Hilfe der Sensor in einem C++-Programm abgefragt werden kann. Unter diese Voraussetzung stehen folgende Alternativen, den Sensor in MATLAB auszulesen:

  • C++-S-Function in MATLAB implementieren,
  • Sensordaten aus MATLAB über eine lokale Client/Server-Architektur (TCP oder UDP) vom C++-Programm zu MATLAB übertragen und
  • Übertragung der Sensordaten aus dem C++-Programm über den MATLAB-Engine.

Die erste Variante wurde aufgrund des asynchronen Aufbaus des Voxel-APIs nicht verfolgt, da dies nicht in Rahmen einer S-Function realisierbar ist. Die zweite Variante wurde getestet aber wegen nicht akzeptabel hohen Übertragungszeiten verworfen.

Für die Betrachtung in Rahmen dieser Arbeit wurde die dritte Variante aufgegriffen. Für die Lösung wurde ein C++-Programm auf Basis eines Beispiels aus der Voxel-SDK implementiert und darin eine Verbindung zu MATLAB über den MATLAB-Engine aufgebaut. Zur Ausführung müssen folgende Schritte durchlaufen werden:

  • MATLAB starten und dort das Skript "matlab_engine.m" aus der hierzugehörigen SVN-Repository ausführen. Alternativ genügt folgenden Befehl im Command Window einzugeben: "matlab.engine.shareEngine".
  • C++-Programm starten und Modus und Anzahl der gewünschten Frames eingeben.

Die aufgenommenen Daten werden daraufhin bei jedem Frame nach MATLAB übertragen und erscheinen dort im Workspace. Es ist möglich, Skripte einzubinden, die bei jedem Frame ausgeführt werden, um z.B. Berechnungen durchzuführen oder Daten zu visualisieren. Dabei ist zu beachten, dass diese in ihre Gesamtheit nur einen Zyklusdurchlauf darstellen sollten, da sie wie erwähnt bei jedem Frame erneut aufgerufen werden. Als Beispiel dienen die Skripte "processDepthData.m" und "processPointCloud.m", die bei jedem Durchlauf die Daten in einem geeigneten Plot ausgeben.

Systemanforderungen

  • Voxel SDK
  • Point Cloud Library PCL
  • MATLAB Computer Vision System Toolbox
  • Von MATLAB Engine unterstütztes Compiler

Beschreibung der Software

Wie bereits erwähnt, lässt sich das Sensorsystem nur mit Hilfe der Voxel-SDK ansteuern. Um die Messdaten trotzdem in MATLAB in Echtzeit verarbeiten zu können, wurde auf das MATLAB-Engine zugegriffen. Mit dem MATLAB-Engine lassen sich Daten von einem C++-Programm nach MATLAB übertragen und dort Funktionen ausführen.

Die realisierte Software besteht aus zwei Hauptkomponenten. Die Erste Komponente ist ein C++-Programm. In diesem wird mit der Voxel-SDK eine Verbindung mit dem Sensorsystem aufgebaut und eine Funktion registriert, sogenannte Callback-Funktion, die nach der Aufnahme eines jeden Frames durch den Sensor angetriggert wird. Ferner wird in diesem Programm die Kommunikation mit MATLAB über den MATLAB-Engine initialisiert und die Daten von jedem Frame dorthin übertragen. Die zweite Komponente stellen MATLAB-Skripte dar. Diese werden bei jedem Frame vom C++-Programm aus gestartet, laufen aber vollständig in der MATLAB-Umgebung. In diesen können die übermittelte Messdaten weiterverarbeitet und visualisiert werden.

Die Abbildung 12 zeigt eine grobe Darstellung der Software und deren Abläufe in Form eines UML-Aktivitätsdiagramms. Die Komponenten der Software sind dort in Swimlanes aufgeteilt. Zusätzlich zur oben beschriebenen Architektur ist noch eine Komponente "Kamera-Thread" im Diagramm dargestellt. Diese stellt die Ausführung der registrierten Callback-Funktionen nach jedem Frame dar. Sie wurde in eine eigene Swimlane daher abgebildet, da sie durch die Voxel-SDK in einem separaten Programm-Thread automatisch ausgelagert wird und von Ausführung der restlichen Software unabhängig ist.

In dem C++-Programm wird am Anfang der Benutzer gefragt, in welchem Betriebsmodus der Sensor messen soll. Zur Auswahl stehen Tiefenbilder und Punktwolken. Anhand diese Entscheidung wird jeweils die zugehörige Callback-Funktion bei der Voxel-SDK registriert. Diese liefert in der Callback-Funktion dann die passenden Daten. In der Callback-Funktion werden, im Kontext des Kamera-Threads, die Sensordaten für das aktuelle Frame ausgelesen und nach MATLAB über geeignete MATLAB-Engine-API übertragen. Je nach Betriebsmodus, wird in MATLAB dann das passende Skript aufgerufen und durchlaufen. In diesem werden z.B. die Messdaten in geeignete Datenstrukturen abgelegt und visuell dargestellt. Des Weiteren gibt der Benutzer an, wie viele Frames insgesamt aufgenommen werden sollen. Die Anzahl der aufgenommenen Frames wird in der Callback-Funktion aktualisiert. Erreicht die Anzahl die gegebene Grenze, wird die Aufnahme gestoppt und das ganze Programm terminiert. Falls eine Dauerübertragung gewünscht ist, kann der Benutzer als Anzahl Frames die Zahl -1 angeben.

YouTube-Video

Eine Live-Aufnahme des Sensorbetriebs ist auf YouTube unter folgendem Link ersichtlich:

https://www.youtube.com/watch?v=zcfETX4N8Xc

Herausgeber: Asaad Al-Suleihi.
Beschreibung der Veranstaltung: Semesterbegleitendes Projekt in der Lehrveranstaltung "Signalverarbeitende Systeme".
Ziel: Inbetriebnahme eines 3D ToF Sensor (Texas Instruments OPT8241) und auslesen der Daten in MATLAB in Echtzeit.
Ergebnis: Sensordaten über Voxel-SDK und MATLAB-Engine in Echtzeit aufgenommen und zu MATLAB übertragen. Bei jedem Frame wird ein Skript 
getriggert, der die Daten verarbeiten kann. Hier im Video werden die Frame-Daten geplottet.
Studiengang: Business and System Engineering 1. Fachsemester.
Hochschule: Hochschule Hamm-Lippstadt.
Betreuender Professor: Prof. Dr.-Ing. Ulrich Schneider.
Beschreibungstext: 3D Time-of-Flight Sensor Evaluation Module mit Matlab/Simulink.

Literatur

[1] Winner, Hermann (Hrsg.): Handbuch Fahrerassistenzsysteme. 3. Auflage. Wiesbaden: Springer Vieweg. 2015.

[2] Texas Instruments Incorporated (Hrsg.): High Accuracy, 320×240 Voxel 3D Time-of-Flight Robot Vision Reference Design. Dallas, 2018 (TIDA-01173). - Referenzdesign.

[3] Texas Instruments Incorporated (Hrsg.): Time-of-Flight Camera – An Introduction. Dallas, 2014 (SLOA190B). - White-Paper.

[4] Hüning, Felix: The fundamentals of electrical engineering : For mechatronics. Oldenbourg, Boston : De Gruyter. 2014.

[5] Texas Instruments Incorporated (Hrsg.): OPT8241 3D Time-of-Flight Sensor. Dallas, 2015 (SBAS704B). - Datenblatt.


→ zurück zum Hauptartikel: Signalverarbeitende Systeme