Objekterkennung mit Laserscanner: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „==Hardware Inbetriebnahme== Zur Objekterkennung mittels LIDAR wird der Laserscanner URG-04LX der Firma Hokuyo verwendet. Im Praktikum stehen zwei Laserscanne…“) |
Keine Bearbeitungszusammenfassung |
||
Zeile 9: | Zeile 9: | ||
==Programm== | ==Programm== | ||
===Messwerte=== | |||
Auf Anfrage mit dem entsprechenden Befehl gibt der Laserscanner ein Array mit Messwerten zurück. Der Platz im Array entspricht dem Winkel, in dem der zugehörige Wert gemessen wurde. Der Wert entspricht der Entfernung in mm. Zu beachten ist, dass 1024 Werte des Laserscanners einer 360° Messung entsprechen. Die Messung beginnt am hinteren Ende des Sichtbereichs. Je nach Ausführung (auf Fahrzeug oder Testscanner) misst der Scanner dann im oder gegen den Uhrzeigersinn. | |||
===Ansatz zur Objekterkennung=== | |||
Zur Objekterkennung wird die zweite Ableitung der Y-Position der Messwerte genutzt. Entlang einer Kante eines Objektes und wenn sich an einer Position kein Objekt befindet bleibt diese annähernd Null. An einer Außenkante besitzt die zweite Ableitung einen großen Wert, da sich die erste Ableitung stark ändert. Bei einer Kannte innerhalb eines Objektes ändert sich die erste Ableitung weniger stark und so ist auch der Wert der zweiten Ableitung geringer. Dies ermöglicht es zwischen Innen- und Außenkanten zu unterscheiden. Bei einer detektierten Innenkante können somit der Winkel des Objektes und seine Tiefe berechnet werden. | Zur Objekterkennung wird die zweite Ableitung der Y-Position der Messwerte genutzt. Entlang einer Kante eines Objektes und wenn sich an einer Position kein Objekt befindet bleibt diese annähernd Null. An einer Außenkante besitzt die zweite Ableitung einen großen Wert, da sich die erste Ableitung stark ändert. Bei einer Kannte innerhalb eines Objektes ändert sich die erste Ableitung weniger stark und so ist auch der Wert der zweiten Ableitung geringer. Dies ermöglicht es zwischen Innen- und Außenkanten zu unterscheiden. Bei einer detektierten Innenkante können somit der Winkel des Objektes und seine Tiefe berechnet werden. | ||
===Implementierung in C/C++=== | |||
Es gibt ein allein lauffähiges Programm, welches zu Tests abseits vom Fahrzeug und zur Aufzeichnung von Messdaten genutzt werden kann. Dieses ist im SVN unter ''trunk\Software\Laserscanner\Laserscanner_Testprogramme\laser_continuous_mode'' zu finden. Die einzelnen Verarbeitungsschritte sind durch Kommentare erklärt. | |||
===Implementierung auf Fahrzeug=== | |||
Für die Ausführung auf dem Fahrzeug wurden die Objekterkennung mit Laserscanner, die Objekterkennung mit Kamera und die Spurerkennung mit Kamera in einem Programm zusammengeführt. Hierdurch muss keine Kommunikation zwischen den einzelnen Softwareteilen aufgebaut werden. Ebenso können die detektierten Objekte in das Videobild eingespießt werden ums sie so besser mit der Realität vergleichen zu können. Allerdings gibt es Probleme mit der Koordinatentransformation. Diese müssen noch behoben werden. Das kombinierte Programm ist unter ''trunk\Software\ObjektSpurFusion'' zu finden. Die für die Objekterkennung relevanten Dateien sind hierbei ''LidarObject.h'' und ''LidarObject.cpp''. Sie werden in der Hauptdatei ''SpurerkennungV01'' genutzt. Die öffentlichen Funktionen sind hierbei ''Lidar_Init()'', welche einmal pro Programmausführung aufgerufen werden muss um die Kommunikation mit dem Laserscanner zu initialisieren, sowie ''object_detection()'', welche zyklisch aufgerufen wird. Diese ließt die Daten vom Laserscanner, detektiert vorhandene Objekte und gibt die Objektliste zurück. | |||
===Nächste Schritte=== | |||
Die Objekte werden zur Zeit nur zyklisch gebildet. Der nächste Schritt, nachdem die Koordinatentransformation funktionsfähig ist, wird ein | Die Objekte werden zur Zeit nur zyklisch gebildet. Der nächste Schritt, nachdem die Koordinatentransformation funktionsfähig ist, wird ein Objekttracking mit Datenfusion der LIDAR- und Kameraobjekte sein. Hierfür wird ein Kalman-Filter vorgeschlagen. Als Zuordnungsverfahren wäre z.B. ein Munkrest-Algorithmus empfehlenswert. | ||
==MATLAB Testumgebung== | ==MATLAB Testumgebung== | ||
Zur Auswertung der Aufzeichnung und zum Test des Programms gibt es zwei MATLAB Skripte, die eine graphische Darstellung ermöglichen. Die nachfolgend beschriebenen Dateien sind im SVN unter ''trunk\Software\Laserscanner\Matlab'' zu finden. | |||
===Anzeigen der aufgezeichneten Messdaten=== | |||
Das Skript ''ExportDataViewer.m'' erlaubt es die Aufzeichnungen aus den Textdateien des allein lauffähigen C-Programms einzulesen und darzustellen. Hierfür müssen die gewünschten zusammengehörigen Objekt- und Messaufzeichnungen ausgewählt werden. Die Ergebnisse werden dann zyklisch angezeigt. Der jeweilige Messzyklus wird in der Koonsole von MATLAB ausgegeben. | |||
===Simulation von Messdaten=== | |||
Im Skript ''Object_Simulation.m'' können beliebige Objekte erzeugt werden. Aus den angegebenen Objektmaßen und Positionen werden anschließend Messdaten des Laserscanners erzeugt und an die C-File zur Objekterkennung übergeben. Die Ergebnisse der Objekterkennung werden anschließend Ebenfalls angezeigt. | |||
Um C-Files mittels mex aufzurufen muss folgende Funtion dem C-Code hinzugefügt werden: | |||
void mexFunction( int nlhs, mxArray *plhs[], | |||
int nrhs, const mxArray *prhs[]) | |||
{ | |||
double *inMatrix; /* 1xN input matrix */ | |||
size_t ncols; /* size of matrix */ | |||
double *outMatrix; /* output matrix */ | |||
/* check for proper number of arguments */ | |||
if(nrhs!=1) { | |||
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nrhs","One inputs required."); | |||
} | |||
if(nlhs!=1) { | |||
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs","One output required."); | |||
} | |||
/* check that number of rows in first input argument is 1 */ | |||
if(mxGetM(prhs[0])!=1) { | |||
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notRowVector","Input must be a row vector."); | |||
} | |||
/* create a pointer to the real data in the input matrix */ | |||
inMatrix = mxGetPr(prhs[0]); | |||
/* get dimensions of the input matrix */ | |||
ncols = mxGetN(prhs[0]); | |||
/* create the output matrix */ | |||
plhs[0] = mxCreateDoubleMatrix(1,(mwSize)ncols,mxREAL); | |||
/* get a pointer to the real data in the output matrix */ | |||
outMatrix = mxGetPr(plhs[0]); | |||
/* call the computational routine */ | |||
object_detection(inMatrix,outMatrix,(mwSize)ncols); | |||
} | |||
Diese ruft im letzten Schritt dann die eigentliche Funktion zur Objekterkennung auf. | |||
Anschließend muss die C-File mittels mex-Compiler kompiliert werden hierzu dient der Befehl | |||
mex -g NameDerC-File.c | |||
Eine Beispieldatei liegt im Ordner der MATLAB-Dateien als ''Object_detection.c'' vor. | |||
--[[Benutzer:Jens Ruhrlaender|Jens Ruhrlaender]] ([[Benutzer Diskussion:Jens Ruhrlaender|Diskussion]]) 16:10, 6. Feb. 2014 (CET) |
Version vom 6. Februar 2014, 16:10 Uhr
Hardware Inbetriebnahme
Zur Objekterkennung mittels LIDAR wird der Laserscanner URG-04LX der Firma Hokuyo verwendet.
Im Praktikum stehen zwei Laserscanner zur Verfügung. Ein auf dem Fahrzeug verbauter und ein nicht verbauter zum Testen ohne das Fahrzeug für andere Teams zu blockieren. Mit beiden können die nachfolgenden Programme ausgeführt werden.
Es ist zu beachten, dass der nicht verbaute Laserscanner neben der USB-Schnittstelle, die auch der auf dem Fahrzeug befindliche Scanner hat, einen RS232 Anschluss besitzt. Bei dieser Version wird die Stromversorgung über bestimmte Pins an der RS232 Schnittstelle gewährleistet. Hierfür wurde ein Adapterkabel angefertigt, um die Stromversorgung über einen zweiten USB-Anschluss am PC zu verwirklichen. Es müssen also beide USB-Kabel für den Betrieb angeschlossen werden.
Beim erstmaligen Anschluss werden die Treiber nicht automatisch installiert. Diese müssen manuell eingebunden werden. Die Treiber sind im SVN unter trunk\Dokumentation\Datenblätter\Laserscanner\URG Driver for Win zu finden. Eine genaue Beschreibung hierfür und zum Einbinden der URG-Bibliothek für die Kommunikation mit dem Laserscanner über C/C++ hat Asaad Al-Suleihi angefertigt. Sie ist zu finden unter trunk\Dokumentation\Datenblätter\Laserscanner\Anleitung_Laserscanner_URG-04XL-UG01.
Programm
Messwerte
Auf Anfrage mit dem entsprechenden Befehl gibt der Laserscanner ein Array mit Messwerten zurück. Der Platz im Array entspricht dem Winkel, in dem der zugehörige Wert gemessen wurde. Der Wert entspricht der Entfernung in mm. Zu beachten ist, dass 1024 Werte des Laserscanners einer 360° Messung entsprechen. Die Messung beginnt am hinteren Ende des Sichtbereichs. Je nach Ausführung (auf Fahrzeug oder Testscanner) misst der Scanner dann im oder gegen den Uhrzeigersinn.
Ansatz zur Objekterkennung
Zur Objekterkennung wird die zweite Ableitung der Y-Position der Messwerte genutzt. Entlang einer Kante eines Objektes und wenn sich an einer Position kein Objekt befindet bleibt diese annähernd Null. An einer Außenkante besitzt die zweite Ableitung einen großen Wert, da sich die erste Ableitung stark ändert. Bei einer Kannte innerhalb eines Objektes ändert sich die erste Ableitung weniger stark und so ist auch der Wert der zweiten Ableitung geringer. Dies ermöglicht es zwischen Innen- und Außenkanten zu unterscheiden. Bei einer detektierten Innenkante können somit der Winkel des Objektes und seine Tiefe berechnet werden.
Implementierung in C/C++
Es gibt ein allein lauffähiges Programm, welches zu Tests abseits vom Fahrzeug und zur Aufzeichnung von Messdaten genutzt werden kann. Dieses ist im SVN unter trunk\Software\Laserscanner\Laserscanner_Testprogramme\laser_continuous_mode zu finden. Die einzelnen Verarbeitungsschritte sind durch Kommentare erklärt.
Implementierung auf Fahrzeug
Für die Ausführung auf dem Fahrzeug wurden die Objekterkennung mit Laserscanner, die Objekterkennung mit Kamera und die Spurerkennung mit Kamera in einem Programm zusammengeführt. Hierdurch muss keine Kommunikation zwischen den einzelnen Softwareteilen aufgebaut werden. Ebenso können die detektierten Objekte in das Videobild eingespießt werden ums sie so besser mit der Realität vergleichen zu können. Allerdings gibt es Probleme mit der Koordinatentransformation. Diese müssen noch behoben werden. Das kombinierte Programm ist unter trunk\Software\ObjektSpurFusion zu finden. Die für die Objekterkennung relevanten Dateien sind hierbei LidarObject.h und LidarObject.cpp. Sie werden in der Hauptdatei SpurerkennungV01 genutzt. Die öffentlichen Funktionen sind hierbei Lidar_Init(), welche einmal pro Programmausführung aufgerufen werden muss um die Kommunikation mit dem Laserscanner zu initialisieren, sowie object_detection(), welche zyklisch aufgerufen wird. Diese ließt die Daten vom Laserscanner, detektiert vorhandene Objekte und gibt die Objektliste zurück.
Nächste Schritte
Die Objekte werden zur Zeit nur zyklisch gebildet. Der nächste Schritt, nachdem die Koordinatentransformation funktionsfähig ist, wird ein Objekttracking mit Datenfusion der LIDAR- und Kameraobjekte sein. Hierfür wird ein Kalman-Filter vorgeschlagen. Als Zuordnungsverfahren wäre z.B. ein Munkrest-Algorithmus empfehlenswert.
MATLAB Testumgebung
Zur Auswertung der Aufzeichnung und zum Test des Programms gibt es zwei MATLAB Skripte, die eine graphische Darstellung ermöglichen. Die nachfolgend beschriebenen Dateien sind im SVN unter trunk\Software\Laserscanner\Matlab zu finden.
Anzeigen der aufgezeichneten Messdaten
Das Skript ExportDataViewer.m erlaubt es die Aufzeichnungen aus den Textdateien des allein lauffähigen C-Programms einzulesen und darzustellen. Hierfür müssen die gewünschten zusammengehörigen Objekt- und Messaufzeichnungen ausgewählt werden. Die Ergebnisse werden dann zyklisch angezeigt. Der jeweilige Messzyklus wird in der Koonsole von MATLAB ausgegeben.
Simulation von Messdaten
Im Skript Object_Simulation.m können beliebige Objekte erzeugt werden. Aus den angegebenen Objektmaßen und Positionen werden anschließend Messdaten des Laserscanners erzeugt und an die C-File zur Objekterkennung übergeben. Die Ergebnisse der Objekterkennung werden anschließend Ebenfalls angezeigt.
Um C-Files mittels mex aufzurufen muss folgende Funtion dem C-Code hinzugefügt werden: void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { double *inMatrix; /* 1xN input matrix */ size_t ncols; /* size of matrix */ double *outMatrix; /* output matrix */ /* check for proper number of arguments */ if(nrhs!=1) { mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nrhs","One inputs required."); } if(nlhs!=1) { mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs","One output required."); } /* check that number of rows in first input argument is 1 */ if(mxGetM(prhs[0])!=1) { mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notRowVector","Input must be a row vector."); } /* create a pointer to the real data in the input matrix */ inMatrix = mxGetPr(prhs[0]); /* get dimensions of the input matrix */ ncols = mxGetN(prhs[0]); /* create the output matrix */ plhs[0] = mxCreateDoubleMatrix(1,(mwSize)ncols,mxREAL); /* get a pointer to the real data in the output matrix */ outMatrix = mxGetPr(plhs[0]); /* call the computational routine */ object_detection(inMatrix,outMatrix,(mwSize)ncols); }
Diese ruft im letzten Schritt dann die eigentliche Funktion zur Objekterkennung auf. Anschließend muss die C-File mittels mex-Compiler kompiliert werden hierzu dient der Befehl
mex -g NameDerC-File.c
Eine Beispieldatei liegt im Ordner der MATLAB-Dateien als Object_detection.c vor.
--Jens Ruhrlaender (Diskussion) 16:10, 6. Feb. 2014 (CET)