Projekt 27: Carolo Cup - Aufgabe: Unterschied zwischen den Versionen
Zeile 25: | Zeile 25: | ||
;RGB-Kamera abfragen: | ;RGB-Kamera abfragen: | ||
Die Abfrage der Daten wird über die OpenNI-Bibliothek abgearbeitet. Grundlage ist das Beispielprogramm '' | Die Abfrage der Daten wird über die OpenNI-Bibliothek abgearbeitet. Grundlage ist das Beispielprogramm ''MultiStreamRead''<ref>[https://github.com/OpenNI/OpenNI2/blob/master/Samples/MultipleStreamRead/main.cpp] OpenNI2::MultiStreamRead Beispielprogramm (07.01.2014)</ref>. Aus diesem Beispiel wurde folgender Code zur Abfrage der RGB-Kamera genutzt:<br/> | ||
<code> | <code> | ||
//Initialisierung der Bibliothek OpenNI | //Initialisierung der Bibliothek OpenNI | ||
Zeile 43: | Zeile 43: | ||
//Auslesen eines Frames | //Auslesen eines Frames | ||
rc = RGB.readFrame(&frame); | rc = RGB.readFrame(&frame); | ||
RGB888Pixel* | RGB888Pixel* pRGB = (RGB888Pixel*)frame.getData(); | ||
//Zerstören des Datenstreams | //Zerstören des Datenstreams | ||
Zeile 50: | Zeile 50: | ||
device.close(); | device.close(); | ||
OpenNI::shutdown();</code> | OpenNI::shutdown();</code> | ||
Wie aus dem Code ersichtlich, wird zuerst die Bibliothek OpenNI initialisiert. Nach der erfolgreichen Initialisierung kann ein Datenstream aufgebaut werden. Dieser Stream stellt die Verbindung zwischen dem Zielsystem und der Asus XTION. Durch diese Verbindung können einzelne Frames ausgelesen werden, welche dann in einem OpenNI-spezifischen Datentypen gespeichert werden. | |||
;Tiefeninformationen abfragen: | ;Tiefeninformationen abfragen: | ||
Gleich zur Abfrage der RGB-Kamera lässt sich auch eine Abfrage der Tiefeninformationen gestalten. Hierbei werden nur wenige Änderungen vollzogen, sodass folgender Code entsteht: | |||
<code> | |||
//Initialisierung der Bibliothek OpenNI | |||
Status rc = OpenNI::initialize(); | |||
//Aufbau des Datenstreams | |||
Device device; | |||
rc = device.open(ANY_DEVICE); | |||
VideoStream depth; | |||
rc = depth.create(device, SENSOR_DEPTH); | |||
rc = depth.start(); | |||
VideoFrameRef frame; | |||
int changedStreamDummy; | |||
VideoStream* pStream = &depth; | |||
rc = OpenNI::waitForAnyStream(&pStream, 1, &changedStreamDummy, SAMPLE_READ_WAIT_TIMEOUT); | |||
//Auslesen eines Frames | |||
rc = depth.readFrame(&frame); | |||
DepthPixel* pDepth = (DepthPixel*)frame.getData(); | |||
//Zerstören des Datenstreams | |||
depth.stop(); | |||
depth.destroy(); | |||
device.close(); | |||
OpenNI::shutdown();</code> | |||
Die Abfrage der Tiefeninformation unterscheidet sich von der Abfrage der RGB-Kamera nur durch die Auswahl des Sensors ''SENSOR_DEPTH'' und die Wahl des Datentypens, in dem gespeichert wird. | |||
;RGB zu Grayscale transformieren: | ;RGB zu Grayscale transformieren: |
Version vom 7. Januar 2014, 17:57 Uhr
Aufgabenstellung: Objekt- und Spurerkennung mit Asus XTION
Das Projekt steht im Zusammenhang mit der Aufgabenstellung des Carolo Cups und befasst sich mit dem Teil der Objekt- und Spurerkennung. Das Ziel des Projektes ist die Erstellung eines Modules, welches rechteckige Objekte vor dem Fahrzeug erkennen kann. Gleichfalls soll das Modul in der Lage sein die Spur erkennen zu können.
Das Projekt wurde von Jan Kifmann und Hauke Ludwig (LCP)bearbeitet.
Implementierung - Hardware
Die Hardware besteht aus folgenden Teilen:
Die Asus XTION Kamera besteht aus zwei Sensoren, sowie einer USB-Schnittstelle[1]:
- RGB-Kamera
- Die RGB-Kamera hat eine Auflösung von 240x320 bzw. 480x640 Pixel. Die Daten werden hierbei in 8-Bits pro Farbwert gespeichert und als eindimensionales Array mit der Länge Höhe*Breite ausgegeben.
- Tiefeninformationssensor
- Der Tiefeninformationssensor besitzt die gleiche Auflösung und hat einen Messbereich zwischen 0.8m und 3.5m. Die Werte werden ebenfalls als eindimensionales Array mit der Länge Höhe*Breite ausgegeben. Hierbei werden die Werte als 2-Byte-Format gespeichert.
Der RaspberryPi dient als zentrale Verarbeitungseinheit. Der RaspberryPi ist mit einem ARM1176JZFS-Prozessor ausgerüstet und eignet sich besonders für eine schnelle und einfache Verarbeitung der Kameradaten.
Implementierung - Software
Die Implementierung der Software stützt sich auf eine sequenzielle Abarbeitung der Aufgaben. Dies ist durch die Architektur der Hardware bedingt. Das Ansprechen und Abfragen der Kameradaten wird durch die Einbindung der OpenNI2-Bibliothek[2] realisiert.
Grundlegend folgt die Software den Sequenzen Daten abfragen -> Daten aufarbeiten -> Auswerten -> Ausgeben. Hierbei wurde ein modularer Aufbau des Sourcecodes verwendet, dies diente der Transparenz und Orienterung im Code.
- RGB-Kamera abfragen
Die Abfrage der Daten wird über die OpenNI-Bibliothek abgearbeitet. Grundlage ist das Beispielprogramm MultiStreamRead[3]. Aus diesem Beispiel wurde folgender Code zur Abfrage der RGB-Kamera genutzt:
//Initialisierung der Bibliothek OpenNI
Status rc = OpenNI::initialize();
//Aufbau des Datenstreams
Device device;
rc = device.open(ANY_DEVICE);
VideoStream RGB;
rc = RGB.create(device, SENSOR_RGB);
rc = RGB.start();
VideoFrameRef frame;
int changedStreamDummy;
VideoStream* pStream = &RGB;
rc = OpenNI::waitForAnyStream(&pStream, 1, &changedStreamDummy, SAMPLE_READ_WAIT_TIMEOUT);
//Auslesen eines Frames
rc = RGB.readFrame(&frame);
RGB888Pixel* pRGB = (RGB888Pixel*)frame.getData();
//Zerstören des Datenstreams
depth.stop();
depth.destroy();
device.close();
OpenNI::shutdown();
Wie aus dem Code ersichtlich, wird zuerst die Bibliothek OpenNI initialisiert. Nach der erfolgreichen Initialisierung kann ein Datenstream aufgebaut werden. Dieser Stream stellt die Verbindung zwischen dem Zielsystem und der Asus XTION. Durch diese Verbindung können einzelne Frames ausgelesen werden, welche dann in einem OpenNI-spezifischen Datentypen gespeichert werden.
- Tiefeninformationen abfragen
Gleich zur Abfrage der RGB-Kamera lässt sich auch eine Abfrage der Tiefeninformationen gestalten. Hierbei werden nur wenige Änderungen vollzogen, sodass folgender Code entsteht:
//Initialisierung der Bibliothek OpenNI
Status rc = OpenNI::initialize();
//Aufbau des Datenstreams
Device device;
rc = device.open(ANY_DEVICE);
VideoStream depth;
rc = depth.create(device, SENSOR_DEPTH);
rc = depth.start();
VideoFrameRef frame;
int changedStreamDummy;
VideoStream* pStream = &depth;
rc = OpenNI::waitForAnyStream(&pStream, 1, &changedStreamDummy, SAMPLE_READ_WAIT_TIMEOUT);
//Auslesen eines Frames
rc = depth.readFrame(&frame);
DepthPixel* pDepth = (DepthPixel*)frame.getData();
//Zerstören des Datenstreams
depth.stop();
depth.destroy();
device.close();
OpenNI::shutdown();
Die Abfrage der Tiefeninformation unterscheidet sich von der Abfrage der RGB-Kamera nur durch die Auswahl des Sensors SENSOR_DEPTH und die Wahl des Datentypens, in dem gespeichert wird.
- RGB zu Grayscale transformieren
- Spur extrahieren
- Objekte extrahieren
- Spur und Objekte ausgeben