Asus Xtion Pro Tiefenkamera mit Matlab/Simulink

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

→ zurück zum Hauptartikel: SigSys SoSe2018


Autoren: Maximilian Harrer
Betreuer: Prof. Dr. Ulrich Schneider

Abbildung 1: Asus Xtion Pro Live

Einleitung

Im Rahmen der semesterbegleitenden Prüfung der Veranstaltung „Signalverarbeitende Systeme“ im Sommersemester 2018 des Masterstudiengangs „Business and Systems Engineering“ sind die Studiereinden zur Bearbeitung eines Projekts angehalten. Dabei handelt es sich um die Auslesung eines Sensors mittels MATLAB/Simulink sowie der Beschreibung, Untersuchung und dem Verstehen der Signalverarbeitungskette.

Asus Xtion Pro Live

Abbildung 2: Xtion Pro Live mit OpenNI2 NIViewer

Der taiwanische Hersteller von Computer-Hardware Asus hat 2012 die Xtion Pro Live offiziell vorgestellt. Dabei handelt es sich um ein Eingabegerät für bewegungsgesteuerte Spiele, Natural User Interfaces, wie dem Nutzer eine direkte Interaktion mit der Bedienoberfläche durch Wischen, Tippen, Berühren, Gesten oder Sprache ermöglichen, und Computer Vision Research, der computergestützte Lösung von Aufgabenstellungen, die sich an den Fähigkeiten des menschlichen visuellen Systems orientieren [1]. Die Kamera verwendet eine SD-Speicherkarte, auf der das Linux basierte Betriebssystem Dabian installiert ist. Dies ermöglicht eine einfache Konfiguration der Asus Xtion Pro Live mittels OpenNi Library und PrimeSense Sensor Treiber.

Abbildung 3: Aufbau der Xtion Pro Live [2]

Tabelle 1: Technische Daten der Asus Xtion Pro Live [3]

Sensoren RGB-Sensor, Tiefensensor, Mikrofon (2x)
Auflösung Tiefenkamera VGA (640x480), QVGA (320x240)
Bildrate Tiefenkamera VGA 30 fps, QVGA 60 fps
Auflösung SXGA (1280x1024)
Sichtfeld horizontal 58°
Sichtfeld vertikal 45°
Sichtfeld diagonal 70°
Distanz des Tiefensensors 0.8m bis 3.5m
Stromverbrauch 2.5W
Schnittstelle USB2.0/3.0
Plattform Intel X86, AMD
Betriebssysteme Windows, Linux, Android
Software OpenNI
Programmiersprache C++/C (Windows), C++(Linux), JAVA
Nutzungsfeld Innen
Abmessungen 18x3.5x5cm

Primärsensor & Signalvorverarbeitung

Abbildung 4: Strukturiertes Infrarot-Lichtmuster eines Infrarotprojektors [4]

Für die Tiefenwahrnehmung der Xtion Pro Live spielen, neben dem PrimeSense Carmine 1.09 Sensor, zwei Elemente eine entscheidende Rolle. Dabei handelt es sich einerseits um einen Infrarot-Projektor und andererseits eine Infrarot-Kamera. Der Projektor projiziert ein Punktmuster auf in Reichweite befindliche Objekte, welche jedoch vom menschlichen Auge nicht wahrgenommen werden können. Die Infrarot-Kamera ist jedoch in der Lage diese aufzunehmen, da die aufgenommen Bilder der Kamera im Infrarot-Farbbereich liegen. Durch die unterschiedliche Entfernung der Objekte zum Projektor ergeben sich verschiedene Ausprägungen der Infrarot-Punkte. Die Größe der Punkte steigt umso weiter ein Objekt von der Kamera entfernt ist. Dies lässt sich mit dem Lichtkegel einer handelsüblichen Taschenlampe vergleichen. Umso näher man diese an eine Wand hält, umso kleiner und konzentrierter wird der Lichtkegel.

Abbildung 5: Kennlinie eines ADU [5]

Die Kamera sendet anschließend die analogen Rohsignale an einen PrimeSense Carmine 1.09 Tiefensensor, welcher aus der Größe der Punkte die Entfernung berechnet. Die Rechenleistung übernimmt dabei der PrimeSense SoC (System-on-a-Chip). Mithilfe eines Analog/Digital-Wandlers werden die analogen in digitale Daten umgewandelt. Durch die vorhandene Auflösung von 640x480 ergibt sich für jeden der 307200 Pixel ein Wert in Millimeter, woraus eine Tiefenkarte erstellt wird [6]. Die Asus Xtion Pro Live überträgt somit vorverarbeitete Daten an das angeschlossene System. Zur Umwandlung der analogen Eingangswerte der Tiefenkamera in digitale Ausgangswerte wird eine Kennlinie eingesetzt. Abbildung 5 zeigt exemplarisch, wie eine solche Kennlinie aussehen könnte. Die in der Asus Xtion Pro Live eingesetzte Kennlinie konnte indes nicht ermittelt werden. Signale in einem bestimmten mV-Bereich werden durch den Wandler in digitale Zahlenwerte umgewandelt. Für die Xtion Pro Live würde dies bedeuten, dass ein bestimmter Bereich der Ausprägung der projizierten Infrarotpunkte einem digitalen Ausgangswert entsprechen. Die genaue Kalibrierung der Kennlinie konnte jedoch nicht ermittelt werden [5].

Analog-Digital-Umsetzung

Abbildung 6: Prinzip der sukzessiven Approximation [7]

Welcher Analog-Digital Umsetzer (ADU) in der Asus Xtion Pro Live zum Einsatz kommt lässt sich nicht ermitteln. Für die Wahl eines sinnvollen Analog-Digital-Wandlers müssen die Abtastrate, Auflösung, der Stromverbrauch und die Größe des Wandlers berücksichtigt werden. Da die Sensoren bereits viel Platz einnehmen, würde ein ADU mit großem Flächenbedarf den Chip unnötig Groß machen. Für den Stromverbrauch muss bedacht werden, dass durch eine hohe Anzahl an Komparatoren die Verlustleistung exponentiell ansteigt und dies zur Folge hätte, dass zusätzliche Supplypads eingefügt werden müssten um den Stromverbrauch zu decken, was den Chip möglicherweise ebenfalls vergrößern würde [8]. Eine sinnvolle Wahl für die Xtion Pro Live wäre ein Wandler auf Basis der suxessiven Approximation, da diese sich leicht in ein CMOS integrieren lässt, eine Auflösung von 12-16 Bit und eine Abtastrate von 20 kHz bis 5 mHz erreicht und mit einem Stromverbrauch von lediglich 100-400mW gerechnet werden kann. Alternativ wäre auch die Nutzung einer Delta-Sigma-Modulation denkbar [9] [10].

Datenübertragung

Abbildung 7: Prinzip der symmetrischen Datenübertragung

Der Steckerplatz für die Tiefenkamera verfügt über 32 Leitungen. Bei der Datenübertragung in Kameras wird meist auf die symmetrische Datenübertragung zurückgegriffen, mit welcher für jeweils ein Bit zwei Leitungen genutzt werden (Plus und Minus). Diese Art der Datenübertragung wird dazu verwendet um Fehler durch äußere Faktoren erkennen zu können und dadurch die Richtigkeit der zu übertragenden Daten zu gewährleisten. Dies wird ermöglicht, da die Beeinflussung des Nutzsignals auf dem Übertragungsweg durch Einkopplungen auf beiden Leitern fast gleichartig ist, sodass beim Bilden der Differenz beider Leiterpotenziale die Störung nahezu aufgehoben ist (Abbildung 7) [11]. Geht man für die Xtion Pro Live davon aus, dass dadurch jeweils 2 Leitungen für Spannung/Masse, I²C und Clock genutzt werden, bleiben zur Datenübertragung 26 Leitungen übrig. Daraus lässt sich ableiten, dass es sich aller Voraussicht nach um eine serielle Übertragung der Daten handelt, da eine parallele Datenübertragung mit mehr als 4 Leitungen unüblich ist.

Implementierung der Messdaten in MATLAB/Simulink

Zur Implementierung der vom Tiefensensor ausgegebenen Tiefenwerte in Matlab wurde die Toolbox „Kinect Matlab“ von Dirk-Jan Kroon in der Version 1.9 genutzt und zur Erlangung der nötigen Daten bearbeitet. Zur Nutzung der Toolbox musste zusätzliche Software auf dem Rechner installiert werden. Dabei handelt es sich um das OpenNI Framework (Version 1.5.2.23), die Sensor DDK (Version 5.1.0.41) und PrimeSense Nite (Version 3.1.3.1). Die Toolbox unterstützt jedoch nicht jede Matlab-Version, weshalb zur Ansteuerung des Sensors auf die Version R2010a zurückgegriffen werden musste [12]. Um die nötigen Mex-Files kompilieren zu können, musste zudem Visual Studio Express 2010 C++ installiert und mit VS2010MEXSupport[13] ergänzt werden, da die Toolbox nur diese Version unterstützt. Durch das Starten der Datei „compile_cpp_files.m“ erstellt die Toolbox die zum Ansteuern des Sensors nötigen Rahmenbedingungen. Der folgend gezeigte Code erzeugt eine Matlab-Tabelle mit den Tiefenwerten in mm für jeden Pixel. Erwähnt werden muss jedoch, dass bei jeder Messung die ersten 7x480 Pixel als „0“ deklariert werden, woraus sich eine Auflösung von lediglich 633x480 Pixeln ergibt.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Implementierung der Sensordaten des   %
% Tiefensensors der Asus Xtion Pro Live %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
% Mex-Dateien hinzufügen
addpath('Mex')
 
% SamplesConfig als Variable anlegen
SAMPLE_XML_PATH='SamplesConfig.xml';
 
% Daten der Xtion nutzen
KinectHandles=mxNiCreateContext(SAMPLE_XML_PATH);
 
% Erstellt ein Bild aus Tiefeninformationen
D=mxNiDepth(KinectHandles); D=permute(D,[2 1]); %Generiert Matrix aus Sensordaten
d=D % Erstellt Kopie von Matrix 'D'
d=d(d~=0) % Entfernt Fehlerhafte Messungen (Wert=0) aus Matrix
s=sum(d) %Summe aller Elemente in d
a=numel(d) %Summe aller ELemente in d
p=s./a %Mittelwert der Elemente in d
 
% Tiefenbild und RGB-Bild des Versuchsaufbaus
figure;
I=mxNiPhoto(KinectHandles); I=permute(I,[3 2 1]); %Generiert Array aus Kameradaten
subplot(1,2,1),h1=imshow(I); 
subplot(1,2,2),h2=imshow(D); colormap('Jet'); %Anzeige des Tiefenbildes

Digitale Signalverarbeitung

Die digitale Signalverarbeitung wird intern durch die Rechenleistung des SoC durchgeführt, über einen USB-Port an den Rechner weitergeleitet und dort mit Matlab verarbeitet.

Filter

Welche Filter zur Reduktion von Fehler bei der Tiefenmessung in der Asus Xtion Pro Live eingesetzt werden kann nicht ermittelt werden. Wahrscheinlich ist jedoch, dass Filter verwendet werden, welche die aus unterschiedlichsten Ursachen auftretenden Fehler in der Tiefenkarte verringern sollen (siehe Tabelle zu den möglichen Fehlern in der Signalverarbeitung). Diese Fehlerquellen können Löcher oder Rauschen in der Tiefenkarte hervorrufen. Kanten werden dabei aus dem Farbbild bestimmt, während Löcher den fehlerhaften Werten der Tiefenmessung entsprechen. Daraus resultieren vier Fehlergruppen (non-hole/non-edge, non-hole/edge, hole/non-edge, und hole/edge). Zur Behebung können Joint Trilateral Filter (non-hole/non-edge), Directional Joint Bilateral Filter (non-hole/edge und hole/edge), Partial Directional Joint Bilateral Filter (hole/non-edge) verwendet werden [14].

Tiefenauflösung und Empfindlichkeit

Abbildung 8: Tiefenauflösung der Asus Xtion Pro Live in Abhängigkeit der Tiefe (f = 640 Pixel, b = 59 mm und d =1 Pixel)

Da strukturierte Lichttiefenkameras auf Triangulation basieren, haben sie das gleiche Tiefenauflösungsmodell wie das von Standard-Stereo-Systemen. Ihre Tiefenauflösung kann daher als berechnet werden. Dabei ist z die Tiefe (in Millimeter), b die horizontale Grundlinie zwischen Beamer und Kamera (in Millimeter), f die Brennweite der Kamera (in Pixel) und die Disparität (in Pixel). Die Disparitätsauflösung (d) ist im Falle der Xtion Pro Live 1, da eine Pixelauflösung vorliegt [15] [16] [4]. Die Empfindlichkeit der Asus Xtion Pro Live liegt bei einem Millimeter, da kleinere Werte nicht ermittelt werden.

Messunsicherheit und Vertrauensintervall

Zur Berechnung der Messunsicherheit und des Vertrauensintervalls wurden 3 unterschiedliche Versuchsaufbauten in den Räumlichkeiten der HSHL vorgenommen (Abbildungen 9, 10 und 11).

Versuchsaufbau "Weiße Wand"

Abbildung 9: Versuchsaufbau Weiße Wand

Durch die Implementierung in Matlab konnten so nach Abzug der bereits erwähnten Fehlerwerte (Wert=0) Werte für 303840 Pixel (Array D) ermittelt werden. Zur Weiterverarbeitung wurde daraus ein Mittelwert der Messung errechnet (Wert d). Die „d“-Werte der 15 Messungen werden folgend in Array dg dargestellt. Durch die folgenden, in Matlab durchgeführten, Berechnungen konnte für die absolute Messunsicherheit ein Wert von u = 0.18454mm, für die relative Messunsicherheit ein Wert von u_rel = 0.013268% und ein Vertrauensintervall von [1390.4652mm ; 1391.2568mm] ermittelt werden. Für das Vertrauensintervall wurde eine statistische Sicherheit von 95% für 15 Messwerte bei t-Verteilung angenommen [10]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Berechnung der Messunsicherheit und des Vertrauensintervalls des %
% Tiefensensors der Asus Xtion Pro Live                            %
% Versuch: Weiße Wand                                              %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
% Mittelwerte der Messreihen
dg = [1391.079874 1391.253893 1390.972558 1391.335167 1391.181862 1390.936519 1390.755022 1390.857484 1390.386526 1389.728838 1389.727643 1390.253186 1390.850885 1390.882695 1392.713231]; 
 
% Anzahl Messungen
m = length(dg); 
 
% Gesamtmittelwert
xgg = mean(dg); % Mittelwert der Messmittelwerte
 
% Empirische Standardabweichung
s = std(dg);
 
% Messunsicherheit
u = s/sqrt(m); %
 
% Relative Messunsicherheit
u_rel = (u/abs(xgg))*100; % in %
 
% Vertrauensbereich (t-Student Verteilung)
% Vertrauensniveau: P=95%
vn = 0.95;% Vertrauensniveau
fg = m-1; % Freiheitsgrade
 
% Obere Grenze
vo = xgg+(tinv((1+vn)/2,fg)*u);
 
% Untere Grenze
vu = xgg-(tinv((1+vn)/2,fg)*u);

Versuchsaufbau "Kaffeebecher & Hülle"

Abbildung 10: Versuchsaufbau Kaffeebecher & Hülle
Abbildung 11: Generierte Abbildung der RGB-Kamera der Xtion Pro Live des Versuchsaufbaus Rucksack

In den Versuchsaufbauten "Kaffebecher & Hülle" und "Rucksack" mussste die vorgehensweise im Vergleich zum Versuchsaufbau "Weiße Wand" etwas abgewandelt werden, da fehlerhafte Werte aufgrund der erhöten Komplexität auch innerhalb der verbliebenen 633x480 Pixel auftraten. Daher wurde die je Messreihe in Matlab erstellte Tiefenkarte manuell in Excel überführt und dort ein erster Mittelwert der 633x480 güligen Pixel errechnet. Der Wert je Messreihe wurde anschließend wieder in Matlab in den Array dg überführt.

Versuchsaufbau Kaffeebecher & Hülle
Messreihen 5
Absolute Messunsicherheit 0.1933mm
Relative Messunsicherheit 0.0203%
Vertrauensintervall [949.8086mm ; 950.8818mm]

Versuchsaufbau "Rucksack"

Versuchsaufbau Rucksack
Messreihen 10
Absolute Messunsicherheit 2.1360mm
Relative Messunsicherheit 0.2915%
Vertrauensintervall [727.9873mm ; 737.6512mm]

Aus den Versuchen ist zu entnehmen, dass die Messunsicherheit bei Objekten im Vergleich zu konstanten Oberflächen zunimmt. Zudem sinkt die Messsicherheit mit der Größe der Objekte im Sensorbereich.

Mögliche Fehler in den Verarbeitungsschritten

Messung Analog-Digital-Umsetzung [10] Matlab-Implementierung
Oberflächeneigenschaften Amplitudenfehler Rundungsdifferenzen
Schnelle Bewegungen Linearitätsfehler Codierungsfehler
Kantenrauschen Phasenfehler
Fehlerhafter Versuchsaufbau Quantisierungsfehler
Lichteinfluss Quantisierungsrauschen
Sensorentfernung

Youtube Video

Unter folgendem Link ist das Video zum Projekt zu finden: https://youtu.be/h_Lw6dRoJns

Literaturverzeichnis

  1. JOSEPH HOWSE, STEVEN PUTTEMANS, QUAN HUA, UTKARSH SINHA: "OpenCV 3 Blueprints", Birgmingham 2013
  2. PrimeSense: "PrimeSense 3D Sensors", auf http://www.i3du.gr/pdf/primesense.pdf, letzte Informationsabfrage am 03.07.2018
  3. https://www.asus.com/de/3D-Sensor/Xtion_PRO_LIVE/specifications/, letzte Informationsabfrage am 16.06.2018
  4. 4,0 4,1 PIETRO ZANUTTIGH: „Time-of-Flight and Structured Light Depth Cameras“, Springer 2016
  5. 5,0 5,1 ELV journal 2/07: „Einführung in die digitale Signalverarbeitung“
  6. MATHEW FISHER: „Kinect“ auf http://graphics.stanford.edu/~mdfisher/Kinect.html, letzte Informationsabfrage am 24.06.2018
  7. http://www.vias.org/mikroelektronik/img/adcsukap.png
  8. CONOR POWER: „Spezifikationen für Wandler – Auswahlkriterien für A/D-Wandler“ auf https://www.elektronikpraxis.vogel.de/auswahlkriterien-fuer-a-d-wandler-a-151736/, letzte Informationsabfrage am 25.06.2018
  9. ROLAND KÜNG: „Elektrotechnik 2 – A/D- und D/A- Wandler“ auf https://home.zhaw.ch/kunr/Elektronik2/Skript/AD_Wandler_v3.pdf, letzte Informationsabfrage am 25.06.2018
  10. 10,0 10,1 10,2 PROF. DR. ULRICH SCHNEIDER: „Skript Signalverarbeitende Systeme 2018“
  11. KUNBUS: „Praxiswissen“ auf https://www.kunbus.de/symmetrische-signaluebertragung.html, letzte Informationsabfrage am 01.07.2018
  12. https://de.mathworks.com/matlabcentral/fileexchange/30242-kinect-matlab
  13. https://de.mathworks.com/matlabcentral/answers/uploaded_files/1211/VS2010MEXSupport.zip
  14. ANH VU LE, SEUNG-WONG JUNG, CHEE SUN WON: "Directional Joint Bilateral Filter for Depth Images", 2014
  15. KURT KONOLIGE, PATRICK MIHELICH: "Technical description of Kinect calibartion" auf http://wiki.ros.org/kinect_calibration/technical, letzte Informationsabfrage am 01.07.2018
  16. DANIEL BACHFELD, DR. VOLKER ZOTA, PETER KÖNIG: " Kopieren in 3D - Räumlich scannen mit Digitalkamera, Kinect oder Laser-Scanner" auf https://www.heise.de/ct/ausgabe/2012-11-Raeumlich-scannen-mit-Digitalkamera-Kinect-oder-Laser-Scanner-2346188.html, letzte Informationsabfrage am 03.07.2018

→ zurück zum Hauptartikel: SigSys SoSe2018