Objekttracking mit LiDAR: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
 
(197 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Autoren: [[Benutzer:Ahmad Hassan|Ahmad Hassan]], [[Benutzer:Lihui Liu|Lihui Liu]]  
Autoren: [[Benutzer:Ahmad Hassan|Ahmad Hassan]], [[Benutzer:Lihui Liu|Lihui Liu]]  
== Einleitung ==
== Einleitung ==
Die Gruppe Hassan/Liu beschäftigt sich im Wintersemester 2020/2021 mit dem Thema Objekterkennung und Objekttracking mit dem Hokuyo LiDAR. Im Sommersemester wurde schon ein Arbeitskonzept dazu entworfen inkl. einem Signalflussplan sowie einem morphologischen Kasten. In dem WS20/21 soll eine Umsetzung dieses Arbeitskonzepts in C erfolgen. Zuerst kommt die Einbindung bzw. Einrichtung und Ansteuerung des LiDARs in C. Darauffolgend wird die Koordinatentransformation implementiert. Zum Testen des Schnittstellenkommunikationsprinzips wird auch eine Funktion programmiert, die innerhalb des ersten Monats des Semesters eine Dummy Objektliste erstellt, die an die DS1104 verschickt werden kann anhand von dem vom Team Heuer/Kruse entwickelten Kommunikationsframework. Zukünftig dient diese Funktion dem Versand der tatsächlichen, erfassten Objekte und ihrer Attribute. Es ist die Implementierung eines Connected Component Clusterung Algorithmus zur Segmentierung und eines L-Shape Fitting Algorithmus zur Objektbildung vorgesehen. An letzter Stelle findet die Programmierung des Kalman-Filters zur Objektverfolgung und Schätzung Attribute wie Geschwindigkeit und Beschleunigung der verfolgten Objekte.  
Die Gruppe Hassan/Liu beschäftigt sich im Wintersemester 2020/2021 mit dem Thema Objekterkennung und Objekttracking mit dem Hokuyo LiDAR. Im Sommersemester wurde schon ein Arbeitskonzept dazu entworfen inkl. einem Signalflussplan sowie einem morphologischen Kasten. In dem WS20/21 soll eine Umsetzung dieses Arbeitskonzepts in C/C++ erfolgen. Zuerst kommt die Einbindung bzw. Einrichtung und Ansteuerung des LiDARs in C/C++. Darauffolgend wird die Koordinatentransformation implementiert. Zum Testen des Schnittstellenkommunikationsprinzips wird auch eine Funktion programmiert, die innerhalb des ersten Monats des Semesters eine Dummy Objektliste erstellt, die an die DS1104 verschickt werden kann anhand von dem vom Team Heuer/Kruse entwickelten Kommunikationsframework. Zukünftig dient diese Funktion dem Versand der tatsächlichen, erfassten Objekte und ihrer Attribute. Danach kommt eine Implementierung der Segmentierung. Allerdings wird hier die Successive Edge Following genommen statt der Connected Component Clustering im Gegensatz zu dem aus dem SS20/21 resultierenden Konzept. Anschließend erfolgt die Umsetzung der Komponenten Objektbildung, Datenzuordnung und das Gating. An letzter Stelle findet die Programmierung des Kalman-Filters zur Objektverfolgung und Schätzung der Attribute wie Geschwindigkeit und Beschleunigung der verfolgten Objekte statt.  
Eine detaillierte Beschreibung der erforderlichen, fachlichen Grundlagen und des entwickelten Konzepts ist im [https://wiki.hshl.de/wiki/index.php?title=Objekterkennung_mit_Hokuyo_LiDAR&oldid=65410: Objekterkennung mit Hokuyo LiDAR] zu finden.   
Eine detaillierte Beschreibung der erforderlichen, fachlichen Grundlagen und des entwickelten Konzepts ist im [https://wiki.hshl.de/wiki/index.php?title=Objekterkennung_mit_Hokuyo_LiDAR&oldid=65410: Objekterkennung mit Hokuyo LiDAR] zu finden.   
Vorgehensweise war, dass Datensätze erstmal mit einer LiDAR C-Anwendung aufgenommen werden. Zweiter Schritt war diese Datensätze in ein MatLab Framework (Offline-Betrieb) einzulesen, in dem die von den oben erwähnten Komponenten verarbeitet werden. Ziel dahinter war die Verifikation der Lauffähigkeit einer Funktion vor Beginn der Überführung dieser Funktion in C/C++
[[Datei:Vorgehensweise_zur_Verifikation.PNG|400px|thumb|center|Alternativer Text]]


Eine Auflistung der Aufgaben zu den entsprechenden Meilensteinen ist unten ersichtlich.
Eine Auflistung der Aufgaben zu den entsprechenden Meilensteinen ist unten ersichtlich.
Zeile 20: Zeile 24:


== Anforderungen ==
== Anforderungen ==
[[Datei:REQ10.2330.PNG|600px |thumb| none |Abbildung 1 der Anforderung]]
[[Datei:REQ10.2330.PNG|600px |thumb| none |Abbildung 2.1: der Anforderung]]
[[Datei:REQ10_3275.PNG|600px|thumb| none |Abbildung 2 der Anforderung]]
[[Datei:REQ10_3275.PNG|600px|thumb| none |Abbildung 2.2: der Anforderung]]
[[Datei:REQ10_3290.PNG|600px|thumb| none |Abbildung 3 der Anforderung]]
[[Datei:REQ10_3290.PNG|600px|thumb| none |Abbildung 2.3: der Anforderung]]


== Pflichten ==
== Pflichten ==
Die vorgenommenen Pflichten zeigen die folgenden Abbildungen:<br>
Die vorgenommenen Pflichten zeigen die folgenden Abbildungen:<br>
[[Datei:Pflichtheft Teil1.PNG|800px |thumb| none |Pflichtheft Teil1]]
[[Datei:Pflichtheft(1).PNG|800px |thumb| none |Abbildung 3.1: Pflichtheft Teil1]]
[[Datei:Pflichtheft Teil2.PNG|800px |thumb| none |Pflichtheft Teil2]]
[[Datei:Pflichtheft(2).PNG|800px |thumb| none |Abbildung 3.2: Pflichtheft Teil2]]
[[Datei:Pflichtheft Teil3.PNG|800px |thumb| none |Pflichtheft Teil3]]
[[Datei:Pflichtheft(3).PNG|800px |thumb| none |Abbildung 3.3: Pflichtheft Teil3]]
<br>
<br>


== Funktionaler Systementwurf / Technischer Systementwurf ==
== Funktionaler Systementwurf / Technischer Systementwurf ==


 
==== Inbetriebnahme und Ansteuerung des LiDARs / Koordinatentransformation ====
 
Damit eine Programmierung der Teilfunktionen in MatLab und in C/C++ im Anschluss an ihrer Lauffähigkeitsverifikation möglich ist, ist die Bereitstellung von Datensätzen erforderlich. Es muss also eine Verbindung mit dem LiDAR hergestellt werden und reale Messdaten in Echtzeit aufgenommen und transformiert werden. 
== Komponentenspezifikation (Hier pro Modul ein PAP) ==
 
==== Inbetriebnahme und Ansteuerung des LiDARs ====
 
==== Koordinatentransformation ====


==== Erstellung einer Dummy Objektliste zum Testen des Schnittstellenkommunikationsprinzips für LiDAR Daten ====
==== Erstellung einer Dummy Objektliste zum Testen des Schnittstellenkommunikationsprinzips für LiDAR Daten ====
Um das Kommunikationsprinzip von dem Team Heuer/Kruse im Hinblick auf LiDAR Objekte ohne Integration zu testen, werden Dummyparameter in Form einer Objektliste generiert.Diese sieht folgendermaßen aus.
{| class="mw-datatable"
! style="font-weight: bold;" | Signal
! style="font-weight: bold;" | Bedeutung
! style="font-weight: bold;" | Datentype
|-
| nObjekte
| Gesamtanzahl der relevanten Objekte (max. 5)
| u8
|-
| Objekt[n].Nummer
| Objektzähler
| u8
|-
| Objekt[n].x0
| x-Koordinate des Objektmittelpunktes (mitte, vorn)
| f32
|-
| Objekt[n].y0
| y-Koordinate des Objektmittelpunktes (mitte, vorn)
| f32
|-
| Objekt[n].b
| Objektbreite
| f32
|-
| Objekt[n].t
| Objekttiefe
| f32
|-
| Objekt[n].alpha
| Objektausrichtung
| f32
|-
| Objekt[n].v
| Betrag des Geschwindigkeitsvektors
| f32
|-
| Objekt[n].Plausibel
| Vertrauenswert für das Objekt (100: 100% vertrauenswürdig)
| u8
|}
<br>


==== Segmentierung: Connected Component Clustering ====
==== Segmentierung: Successive Edge Following ====
Bei der Successive Edge Following werden alle von dem LiDAR empfangenen Messdaten aus derselben Punktwolke in einem Array abgelegt. Danach wird der erste Punkt in dem Array als der erste Punkt des ersten Segments in dieser Punktwolke angesehen. Die Distanz zwischen diesem Punkt und seinem benachbarten Punkt wird berechnet und mit einem dynamisch berechneten Schwellwert verglichen. Der Schwellwert muss dynamisch berechnet werden, da sich der Öffnungswinkel des LiDARs in Abhängigkeit von Distanz zu Objekten ändert. Das kann zu Ober- oder Untersegmentierung führen. Ist die Distanz kleiner als der Schwellwert, gehört dieser Punkt zu dem aktuellen Segment und es wird ab ihm genauso weiter vorgegangen. Ist die berechnete Distanz größer als der Schwellwert, wird das Segment abgeschlossen. Jedes Segment wird weiter definiert, indem sein Mittelpunkt ermittelt wird sowie der Punkt am weitesten Rechts und am weitesten Links. Das geht relativ einfach, da mit dem beschriebenen Vorgang, der Rechtste Punkt immer der erste Punkt des Segments ist während der linkste Punkt der letzte ist.


==== Objektbildung: L-Shape Fitting ====
==== Objektbildung ====


==== Objekttracking: Kalman Filter ====
In diesem Artikel werden verschiedene Fahrtszenarien dargestellt. Darauf aufbauend wird ein Ansatz zur Objektbildung bzw. Beschreibung der Hindernisse entwickelt.
<br>
'''Hier gehts zu Artikel'''    [[Datei:Ezgif-3-aa149494be25.gif]] [https://wiki.hshl.de/wiki/index.php/Objektbildung Objektbildung]


==== Attribute schätzen ====
==== Tracking ====
Die Segmentierung liefert eine Segmentliste. Jedes Segment wird an der Objektbildung übergeben, um ein Objekt daraus zu machen. Stellvertreter jedes Objektes ist der Mittelpunkt der Vorderkante. Beim ersten Durchlauf bilden alle Mittelpunkte bzw. Objekte neue Tracks. Hiernach passiert der Prädikitionsschritt des Kalmanfilters


== Programmierung (Hier pro Modul Code-Snippets und Erklärung) ==
[[Datei:Prediction.PNG|400px|thumb|none]]


=== Inbetriebnahme und Ansteuerung des LiDARs ===
[[Datei:gain.PNG|400px|thumb|none]]


=== Koordinatentransformation ===
Sobald eine neue Liste von Objekten ankommt im Zyklus k findet eine Datenzuordnung statt über ein Munkres-Algorithmus, um die neuen Objekte den Prädiktionen des Kalman-Filters aus dem vorigen Zyklus k-1 zuzuordnen. Zur Vereinfachung der Distanzmatrix, die an dem Munkres übergeben wird, kommt ein euklidisches Gating zum Einsatz. Nach der Datenzuordnung findet der Korrekturschritt des Kalman-Filters statt
[[Datei:correct.PNG|400px|thumb|none]]
[[Datei:correct2.PNG|400px|thumb|none]]
Tracks, denen keine Messungen für eine gewisse Anzahl an Durchläufen zugeordnet worden sind, werden gelöscht. Neue Messungen, die keinem bestehenden Track zugeordnet worden sind, bilden neue Tracks. Somit erfolgt die Aktualisierung der Trackliste.


Das Modul zur Umsetzung der Koordinatentransformation besteht aus der Schnittstellendatei coordinate_transformation.h und ihrer Implementierung coordinate_transformation.c.  
== Programmierung in MatLab (Offline Framework) ==
Der Funktionsprototyp sieht folgendermaßen aus:
Alle Komponenten inkl. Segmentierung, Objektbildung, Datenzuordnung und Gating, Tracking sind zusammen in dem folgenden MatLab Framework integriert.  
[https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Teams/OSE/OSE_LiDAR_Tracking/Hokuyo LiDAR Framework_Mat_Vison_2]


<pre>
=== Segmentierung: Successive Edge Following ===
void coord_transform(const urg_t* lidar_handle, long* distance_array, int numMeasurements, long* x_coord, long* y_coord, int trans_x, int trans_y);
In dem oben verlinkten Ordner ist die Segmentierung:
</pre>
# getSegs.mat
# defSegs.mat


Die Eingangsparameter sind:
=== Objektbildung ===
[https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Teams/OSE/OSE_LiDAR_Tracking/Objektbildung/]


#lidar_handle: Lidarobjekt dient dem Zugriff auf die erstellte LiDAR Instanz und ihre Funktionalitäten
=== Objekttracking ===
#distance_array: dynamisch erstellte Array der empfangenen Schrägentfernungswerte
In dem oben verlinkten Ordner ist der Tracking Algorithmus
#numMeasurements: Anzahl der durchgeführten Messungen
#x_coord: Dieser leere, dynamische Array wird über Call-by-Reference übergeben. Die transformierten x-Koordinaten werden in diesem Array geschrieben 
#y_coord: Dieser leere, dynamische Array wird über Call-by-Reference übergeben. Die transformierten y-Koordinaten werden in diesem Array geschrieben 
#trans_x: x-Komponente des Translationsvektors, falls nötig, zwischen Ursprung dem KoS des Fahrzeugs und dem des LiDARs
#trans_y: y-Komponente des Translationsvektors, falls nötig, zwischen Ursprung dem KoS des Fahrzeugs und dem des LiDARs


Die Funktion ist void. Es wird kein Rückgabewert zurückgeliefert. Die Ausgangsparameter der Funktion bzw. ihre Resultate werden in den übergebenen, dynamischen, leeren Arrays gespeichert. Im Folgenden wird die Definition der Koordinatentransformationsfunktion in detaillierten Schritten erklärt.
# PraediziereTrack.m - Kalman Filter Prädikition
# Zuordnung.m - Zuordnung und Gating
# KalmanFilter.m - KalmanKorrektur


Zuerst findet die Deklaration der lokalen Variablen statt
== Programmierung in C/C++ (Online Framework)==
<pre>
=== Inbetriebnahme und Ansteuerung des LiDARs / Koordinatentransformation ===
long distance; // einen Schrägentfernungswert von dem distance_array ablesen und speichern pro Durchlauf
[https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Teams/OSE/OSE_LiDAR_Tracking/LiDAR_Tracking_Software_C/Test_LiDAR/]
double angle_rad; // den entsprechenden Winkel ermitteln und in dieser Variable speichern pro Durchlauf
        long x; // die daraus berechnete x-Koordinate hier speichern pro Durchlauf
long y; // die daraus berechnete y-Koordinate hier speichern pro Durchlauf
</pre>


Hiernach kommt die Hauptschleife. Innerhalb dieser Schleife wird ein Entfernungswert von dem übergebenen Array distance_array abgelesen und in eine x- und y- Koordinate überführt. Diese bilden das x-y Koordinatenpaar dieses bestimmten Messpunktes.
=== Erstellung einer Dummy Objektliste zum Testen des Schnittstellenkommunikationsprinzips für LiDAR Daten ===
Dies passiert, indem die folgenden mathematischen Gleichungen angewendet werden:
[https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Teams/OSE/OSE_LiDAR_Tracking/LiDAR_Tracking_Software_C/Objektliste(1)/]


<math> x = radius * cos(\vartheta )</math>
=== Segmentierung===
[https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Teams/OSE/OSE_LiDAR_Tracking/Segmentierung%20Testumgebung%20C++//]


<math> y = radius * sin(\vartheta )</math>
=== Kalman Filter===
Hierfür wird die Bibliothek Eigen benötigt


Gegebenenfalls erfolgt eine Translation anhand von dem übergebenen Translationsvektor-Argument. Am Ende vom Durchlauf wird jede Koordinate an der richtigen Stelle in dem entsprechenden, leeren Array, der über Call-by-Reference übergeben wurde, gespeichert.
[https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Teams/OSE/OSE_LiDAR_Tracking/LiDAR_Tracking_Software_C-C++/KalmanTest/]
<pre>
        /*Main loop*/
for (int i = 0 ; i < numMeasurements ; i++) {
distance = distance_array[i]; // Entfernungswert ablesen und speichern
angle_rad = urg_index2rad(lidar_handle, i); // Entsprechenden Winkel ermitteln mit der verfügbaren Member-Method                 
x = (long)(distance * cos(angle_rad)); // x-Koordinate aus Polarkoordinaten ermitteln in mm
y = (long)(distance * sin(angle_rad)); // y-Koordinate aus Polarkoordinaten ermitteln in mm


/*Je nachdem ist die Translation erforderlich*/
== Komponententest ==
//x = (long)(trans_x + x); // Translate x
=== Laufzeit CCC gegenüber SEF ===
//y = (long)(trans_y + y); // Translate y
[https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Teams/OSE/OSE_LiDAR_Tracking/Vergleich%20SEF%20und%20CCC_%20PerformanceProfiler/]


/*Speichern in Arrays*/
== Zusammenfassung und Ergebnisse ==
x_coord[i] = x;
=== Segmentierung in MatLab===
y_coord[i] = y;
[[Datei:Segmentierung.mp4|800px|thumb|none]]
}
=== Objektbildung in MatLab===
</pre>
[[Datei:OBMat.mp4|800px|thumb|none]]


=== Erstellung einer Dummy Objektliste zum Testen des Schnittstellenkommunikationsprinzips für LiDAR Daten ===
=== Framework in MatLab===
In dem Offline Framework in MatLab sind alle Komponenten inkl. Segmentierung, Objektbildung, Datenzuordnung und Gating sowie das Kalmanfilter zusammenintegriert und verfiziert worden.


=== Segmentierung: Connected Component Clustering ===
[[Datei:TrackingMat.mp4|8000px|thumb|none]]


=== Objektbildung: c ===
=== Segmentierung in C++ ===
L-Shape Fitting ist für die Schätzung der Fahrzeugorientierung verantwortlich. Die zwei senkrechten Linien der L-Form können definiert werden als
<math>  xcosθ + ysinθ = c1 </math>
<math>  −xsinθ + ycosθ = c2 </math>


Die mögliche Richtung θ des Rechtecks reicht von 0◦ bis 90◦, da die beiden Seiten des Rechtecks orthogonal sind und wir uns nur um die einzelne Kante kümmern, die zwischen 0◦ und 90◦ liegt. Die andere Richtung ist einfach θ + π / 2.
[[Datei:Segmentierung_2.mp4|400px|thumb|none]]


=== Objekttracking: Kalman Filter ===
=== Framework in C++ ===
 
Da bis Ende Meilenstein 4 noch keine Objektbildung oder Datenzuordnung implementiert wurde, wurde das in C++ umgesetzte Kalman Filter in dem Live C++ LiDAR Framework von Team Arndt/Köhler eingesetzt [https://wiki.hshl.de/wiki/index.php/OSE_-_Objekterkennung_und_-verfolgung_mittels_LiDAR_WS20/21]
=== Attribute schätzen ===
 
== Komponententest ==
 
== Zusammenfassung ==


== Ausblick ==
== Ausblick ==
 
* Die Koordinatentransformation des LiDAR-Faremworks in C muss mehrmals getestet werden
== Link zum Quelltext in SVN ==
* Integrationstest
 
* Kalman-Filter Parametrisierung für das autonome Fahrzeug
== Literaturverzeichnis ==
* Bestimmung der ROI anhand von Spurpolynom und Spurzuordnung
 
* Übertragung echter LiDAR Daten nach Integration in Kommunikationsmodul


--------------------------
--------------------------
→ zurück zum Gruppenartikel: [[SDE-Team_2020/21|SDE-Team_2020/21]]<br>
→ zurück zum Gruppenartikel: [[SDE-Team_2020/21|SDE-Team_2020/21]]<br>
→ zurück zum Hauptartikel: [[Praktikum_SDE|SDE Praktikum Autonomes Fahren]]
→ zurück zum Hauptartikel: [[Praktikum_SDE|SDE Praktikum Autonomes Fahren]]

Aktuelle Version vom 12. Februar 2021, 23:06 Uhr

Autoren: Ahmad Hassan, Lihui Liu

Einleitung

Die Gruppe Hassan/Liu beschäftigt sich im Wintersemester 2020/2021 mit dem Thema Objekterkennung und Objekttracking mit dem Hokuyo LiDAR. Im Sommersemester wurde schon ein Arbeitskonzept dazu entworfen inkl. einem Signalflussplan sowie einem morphologischen Kasten. In dem WS20/21 soll eine Umsetzung dieses Arbeitskonzepts in C/C++ erfolgen. Zuerst kommt die Einbindung bzw. Einrichtung und Ansteuerung des LiDARs in C/C++. Darauffolgend wird die Koordinatentransformation implementiert. Zum Testen des Schnittstellenkommunikationsprinzips wird auch eine Funktion programmiert, die innerhalb des ersten Monats des Semesters eine Dummy Objektliste erstellt, die an die DS1104 verschickt werden kann anhand von dem vom Team Heuer/Kruse entwickelten Kommunikationsframework. Zukünftig dient diese Funktion dem Versand der tatsächlichen, erfassten Objekte und ihrer Attribute. Danach kommt eine Implementierung der Segmentierung. Allerdings wird hier die Successive Edge Following genommen statt der Connected Component Clustering im Gegensatz zu dem aus dem SS20/21 resultierenden Konzept. Anschließend erfolgt die Umsetzung der Komponenten Objektbildung, Datenzuordnung und das Gating. An letzter Stelle findet die Programmierung des Kalman-Filters zur Objektverfolgung und Schätzung der Attribute wie Geschwindigkeit und Beschleunigung der verfolgten Objekte statt. Eine detaillierte Beschreibung der erforderlichen, fachlichen Grundlagen und des entwickelten Konzepts ist im Objekterkennung mit Hokuyo LiDAR zu finden.

Vorgehensweise war, dass Datensätze erstmal mit einer LiDAR C-Anwendung aufgenommen werden. Zweiter Schritt war diese Datensätze in ein MatLab Framework (Offline-Betrieb) einzulesen, in dem die von den oben erwähnten Komponenten verarbeitet werden. Ziel dahinter war die Verifikation der Lauffähigkeit einer Funktion vor Beginn der Überführung dieser Funktion in C/C++

Alternativer Text


Eine Auflistung der Aufgaben zu den entsprechenden Meilensteinen ist unten ersichtlich.

  1. Meilenstein 3:
    1. Implementierung der Einbindung und Ansteuerung des Hokuyo LiDAR
    2. Implementierung der Koordinatentransformation
    3. Testdokumentation der Koordinatentransformation
    4. Versand einer Dummy-Objektliste an DS1104
    5. Implementierung der Segmentierung (Connected Component Clustering)
    6. Erstellen eines PAPs zum L-Shape Fitting Algorithmus
  2. Meilenstein 4:
    1. Implementierung des L-Shape Fitting Algorithmus
    2. Implementierung des Kalman Filters
    3. Attribute schätzen
    4. Versand der echten Objektlisten an die dSpace-Karte
    5. Dokumentation im Wiki

Anforderungen

Abbildung 2.1: der Anforderung
Abbildung 2.2: der Anforderung
Abbildung 2.3: der Anforderung

Pflichten

Die vorgenommenen Pflichten zeigen die folgenden Abbildungen:

Abbildung 3.1: Pflichtheft Teil1
Abbildung 3.2: Pflichtheft Teil2
Abbildung 3.3: Pflichtheft Teil3


Funktionaler Systementwurf / Technischer Systementwurf

Inbetriebnahme und Ansteuerung des LiDARs / Koordinatentransformation

Damit eine Programmierung der Teilfunktionen in MatLab und in C/C++ im Anschluss an ihrer Lauffähigkeitsverifikation möglich ist, ist die Bereitstellung von Datensätzen erforderlich. Es muss also eine Verbindung mit dem LiDAR hergestellt werden und reale Messdaten in Echtzeit aufgenommen und transformiert werden.

Erstellung einer Dummy Objektliste zum Testen des Schnittstellenkommunikationsprinzips für LiDAR Daten

Um das Kommunikationsprinzip von dem Team Heuer/Kruse im Hinblick auf LiDAR Objekte ohne Integration zu testen, werden Dummyparameter in Form einer Objektliste generiert.Diese sieht folgendermaßen aus.

Signal Bedeutung Datentype
nObjekte Gesamtanzahl der relevanten Objekte (max. 5) u8
Objekt[n].Nummer Objektzähler u8
Objekt[n].x0 x-Koordinate des Objektmittelpunktes (mitte, vorn) f32
Objekt[n].y0 y-Koordinate des Objektmittelpunktes (mitte, vorn) f32
Objekt[n].b Objektbreite f32
Objekt[n].t Objekttiefe f32
Objekt[n].alpha Objektausrichtung f32
Objekt[n].v Betrag des Geschwindigkeitsvektors f32
Objekt[n].Plausibel Vertrauenswert für das Objekt (100: 100% vertrauenswürdig) u8


Segmentierung: Successive Edge Following

Bei der Successive Edge Following werden alle von dem LiDAR empfangenen Messdaten aus derselben Punktwolke in einem Array abgelegt. Danach wird der erste Punkt in dem Array als der erste Punkt des ersten Segments in dieser Punktwolke angesehen. Die Distanz zwischen diesem Punkt und seinem benachbarten Punkt wird berechnet und mit einem dynamisch berechneten Schwellwert verglichen. Der Schwellwert muss dynamisch berechnet werden, da sich der Öffnungswinkel des LiDARs in Abhängigkeit von Distanz zu Objekten ändert. Das kann zu Ober- oder Untersegmentierung führen. Ist die Distanz kleiner als der Schwellwert, gehört dieser Punkt zu dem aktuellen Segment und es wird ab ihm genauso weiter vorgegangen. Ist die berechnete Distanz größer als der Schwellwert, wird das Segment abgeschlossen. Jedes Segment wird weiter definiert, indem sein Mittelpunkt ermittelt wird sowie der Punkt am weitesten Rechts und am weitesten Links. Das geht relativ einfach, da mit dem beschriebenen Vorgang, der Rechtste Punkt immer der erste Punkt des Segments ist während der linkste Punkt der letzte ist.

Objektbildung

In diesem Artikel werden verschiedene Fahrtszenarien dargestellt. Darauf aufbauend wird ein Ansatz zur Objektbildung bzw. Beschreibung der Hindernisse entwickelt.
Hier gehts zu Artikel Objektbildung

Tracking

Die Segmentierung liefert eine Segmentliste. Jedes Segment wird an der Objektbildung übergeben, um ein Objekt daraus zu machen. Stellvertreter jedes Objektes ist der Mittelpunkt der Vorderkante. Beim ersten Durchlauf bilden alle Mittelpunkte bzw. Objekte neue Tracks. Hiernach passiert der Prädikitionsschritt des Kalmanfilters

Sobald eine neue Liste von Objekten ankommt im Zyklus k findet eine Datenzuordnung statt über ein Munkres-Algorithmus, um die neuen Objekte den Prädiktionen des Kalman-Filters aus dem vorigen Zyklus k-1 zuzuordnen. Zur Vereinfachung der Distanzmatrix, die an dem Munkres übergeben wird, kommt ein euklidisches Gating zum Einsatz. Nach der Datenzuordnung findet der Korrekturschritt des Kalman-Filters statt

Tracks, denen keine Messungen für eine gewisse Anzahl an Durchläufen zugeordnet worden sind, werden gelöscht. Neue Messungen, die keinem bestehenden Track zugeordnet worden sind, bilden neue Tracks. Somit erfolgt die Aktualisierung der Trackliste.

Programmierung in MatLab (Offline Framework)

Alle Komponenten inkl. Segmentierung, Objektbildung, Datenzuordnung und Gating, Tracking sind zusammen in dem folgenden MatLab Framework integriert. LiDAR Framework_Mat_Vison_2

Segmentierung: Successive Edge Following

In dem oben verlinkten Ordner ist die Segmentierung:

  1. getSegs.mat
  2. defSegs.mat

Objektbildung

[1]

Objekttracking

In dem oben verlinkten Ordner ist der Tracking Algorithmus

  1. PraediziereTrack.m - Kalman Filter Prädikition
  2. Zuordnung.m - Zuordnung und Gating
  3. KalmanFilter.m - KalmanKorrektur

Programmierung in C/C++ (Online Framework)

Inbetriebnahme und Ansteuerung des LiDARs / Koordinatentransformation

[2]

Erstellung einer Dummy Objektliste zum Testen des Schnittstellenkommunikationsprinzips für LiDAR Daten

[3]

Segmentierung

[4]

Kalman Filter

Hierfür wird die Bibliothek Eigen benötigt

[5]

Komponententest

Laufzeit CCC gegenüber SEF

[6]

Zusammenfassung und Ergebnisse

Segmentierung in MatLab

Objektbildung in MatLab

Framework in MatLab

In dem Offline Framework in MatLab sind alle Komponenten inkl. Segmentierung, Objektbildung, Datenzuordnung und Gating sowie das Kalmanfilter zusammenintegriert und verfiziert worden.

Segmentierung in C++

Framework in C++

Da bis Ende Meilenstein 4 noch keine Objektbildung oder Datenzuordnung implementiert wurde, wurde das in C++ umgesetzte Kalman Filter in dem Live C++ LiDAR Framework von Team Arndt/Köhler eingesetzt [7]

Ausblick

  • Die Koordinatentransformation des LiDAR-Faremworks in C muss mehrmals getestet werden
  • Integrationstest
  • Kalman-Filter Parametrisierung für das autonome Fahrzeug
  • Bestimmung der ROI anhand von Spurpolynom und Spurzuordnung
  • Übertragung echter LiDAR Daten nach Integration in Kommunikationsmodul

→ zurück zum Gruppenartikel: SDE-Team_2020/21
→ zurück zum Hauptartikel: SDE Praktikum Autonomes Fahren