OSE - Objekterkennung und -verfolgung mittels LiDAR WS20/21

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen


Autoren: Stefan Arndt, Marius Köhler

Schematischer Ablauf der Verarbeitung eines LiDAR-Sweeps

Einleitung

Im Rahmen des Praktikums "SDE - Systemintegration" wurde im Wintersemster 2020/2021 eine Software entwickelt, welche die LiDAR-basierte Erkennung und Verfolgung von Hindernissen durch das CaroloCup-Fahrzeug ermöglichen soll. Die Software wurde - grob unterteilt - in einem zweistufigen Prozess entwickelt. Zunächst erfolgte die prototypische Entwicklung und Erprobung in Matlab, anhand vorab aufgezeichneter Messungen. Nach Erreichen eines zufriedenstellenden Zustandes, folgte die Implementierung in C++, welche neben der Verarbeitung von aufgezeichneten Messungen auch direkt auf den LiDAR zugreifen und somit in Echtzeit Hindernisse erkennen und verfolgen kann.

Anforderungen

Im Lastenheft des Autonomen Fahrzeugs finden sich folgenden zwei Anforderungen an das Fahrzeug:


Die Erkennung und Verfolgung der Hindernisse (der statischen, wie der dynamischen) soll LiDAR-basiert erfolgen. Daher wurden folgende Pflichten aus Obigem abgeleitet:

Software-Entwurf

Zur rechten ist der Programmablaufplan der Objekttracking-Software zusehen.
In den folgenden Abschnitten werden die wichtigsten der dort aufgeführten Funktionen und Module beschrieben. Zur tatsächlichen Funktionsweise wird ein Blick in den Programm-Code empfohlen.

Pap der Objekterkennung und -verfolgung anhand vorab aufgezeichneter LiDAR-Messungen.

Segmentierung

Die Segmentierung eines LiDAR-Sweeps erfolgt in Anlehnung an das sog. "Successive Edge Following". D.h. es werden all jene Punkte zu einem Segment zusammengefasst, die innerhalb eines bestimmten Abstandes zu den ihnen benachbarten Liegen.

Die Segmente werden als Liste von Instanzen einer eigens dazu zuimplementierenden Klasse gespeichert. Diese wird unter Anderem eine Methode zur Charakterisierung des Segments als L-förmig bzw. nicht L-förmig umfassen. Diese Charakterisierung wird für die spätere Objekterkennung von Nutzen sein.

Objekterkennung

In Absprache mit Prof. Dr.-Ing Ulrich Schneider wurde ein modellbasierter Ansatz zur Erkennung relevanter Hindernisse verfolgt. Zur Modellbildung wird auf die vorab bekannten Abmessungen und Eigenschaften der möglichen Hindernisse zurückgegriffen. Bei diesen handelt es sich um weiße Kartons einer Breite von 20cm und einer Länge von 30cm. Die Höhe ist aufgrund der zweidimensionalität der LiDAR-Messung irrelevant.
Weiterhin können folgende Annahmen getroffen werden:

  1. Erfasst der LiDAR eine vollständige Seite des Hindernisses, ist diese entweder die lange (30cm) oder die kurze (20cm) Seite.
  2. Erfasst der Lidar zwei vollständige Seiten, sind das sowhl eine kurze, als auch eine lange.
  3. Der LiDAR kann ebenso eine Seite vollständig und eine weitere partiell erfassen.

Die untere Animation zeigt an einem L-förmigen Segment exemplarisch, wie die Erkennung von Karton-Objekten und die Ermittlung von Bezugspunkten und Ausrichtungswinkeln (zwecks Tracking) funktionieren.

Somit können Ausrichtungswinkel und Position eines Hindernisses bestimmt werden. Gemäß des Schnittstellendokuments, Punkt 3: RS-232 Schnittstelle, sollen folgende Track-Attribute er- bzw. übermittelt werden:

Zur anfänglichen Vereinfachung des Tracking-Problems soll zunächst die Erkennung und Verfolgung eines Hindernisses realisiert werden. Somit entfallen zunächst folgendes Attribut:

  • Objekt[n].Nummer

Weiterhin wurde auf das Tracking von

  • Objekt[n].b
  • Objekt[n].t

mittels eines Kalmanfilters zunächst verzichtet. Breite und Tiefe entfallen, da beide größen vorab bekannt sind und wie oben bereits geschildert zur modellbasierten Objekterkennung genutzt werden. Der Ausrichtungswinkel wird vorerst nicht getrackt, sondern der jeweils aktuellen Messung entnommen. Das Tracking des Ausrichtungswinkels zusätzlich zu Position und Geschwindigkeit der Hindernisse bedürfte eines komplexeren physikalischen Modells, welches über den hier vorliegenden Bedarf hinaus ginge.

Kalman-Filter

Wie den obigen Ausführungen zu entnehmen ist, wird zum Tracking der Position (Objekt[n].x0, Objekt[n].y0) und der Geschwindigkeit (Objekt[n].v) ein 4D-Kalman-Filter genutzt. Diesem liegt folgendes physikalisches Modell der Hindernisse zugrunde:



Mit

  • dem Zustandsvektor zum Zeitpunkt ,
  • der Systemmatrix ,
  • und dem Zustandsvektor zum Zeitpunkt .

Zur Implementierung sei hier widerum ein Blick in den im SVN liegenden Matlab-Code empfohlen. Weitere Informationen zum Kalman-Filter im Allgemeinen finden sich z.b. hier.

Zuordnung und Gating

Grob unterteilt besteht der Kalman-Filter aus zwei Schritten:

  1. Aus der Prädiktion und
  2. der Korrektur dieser Vorausage über den Abgleich mit einer Messung.

Um den zweiten Schritt, die Korrektur, durchzuführen, bedarf es der korrekten Zuordnung von Objekten (entspricht Messungen) zu bestehenden Tracks. Diese Zuordnung wird hier mit einem Gating realisiert. Dieses ordnet räumlich naheliegende und ähnlivhausgerichtete Objekte und prädizierte Tracks einander zu. Funktion und Ablauf von Prädiktion, Zuordnung und Korrektur sollen - da im Verbund verständlicher - folgend veranschaulicht werden:

Programmierung

Das Modul wurde sowohl in C++ als auch in Matlab programmiert.

Offline-Modus

Für beide Anwendungen wurde ein Offline-Modus programmiert, der .ubh-Dateien einliest.

.ubh-Dateien werden mit der Anwendung UrgBenriPlus erstellt.

Implementierung in C++

Softwarevoraussetzungen

OpenCV 4.3.0_32bit - Einrichtugn siehe hier und hier
python 2.7.18 x86 - hier | Download
NuGet Package (Eigen) - Installation im Packet Manager von Visual Studio

Installation und Inbetriebnahme

1. Install just for me


2. Installationsverzeichnis sollte C:\Python27-x86 sein

3. pip.exe -V ausführen. Ausgabe sollte wie auf dem Bild sein und das richtige Verzeichnis ausgeben.

4. pip.exe install matplotlib ausführen

5. In Visual Studio Debug und x86 einstellen

6. Die Projekt-Properties einstellen (siehe Bilder)

Dyn. und statische Tests

Das Ergebnis der statischen Codeanalyse liegt im SVN-Ordner.

Die dynamische Codeanalyse hat eine konstante RAM- und CPU-Auslastung ergeben.

RAM-Auslastung
CPU-Auslastung

Fazit

Matlab-Anwendung
C++-Anwendung

Die Pflichten, die der hier vorgestellten Software zur Grundlage dienen, sind in vollem Umfang erfüllt. Die Software ist sowohl zur Verabreitung von vorab aufgezeichneten Szenarien (Matlab- und C++-Implementierung ), als auch zum Echtzeitbetrieb mit Zugriff auf den Hokuyo URG-04LX-UG01 LiDAR (C++-Implementierung) geeignet. Mit Hilfe geringfügiger Erweiterungen (siehe Ausblick) ist auch Muliobjecttracking möglich. Bezüglich der Erkennung und Verfolgung von Objekten ist somit die Grundlage zur Erfolgreichen autonomen Fahrt auf dem Rundkurs mit Hindernissen gegeben. Die Integration der Software steht jedoch noch aus.

Ausblick

  • Integrationstest
  • Kalman-Filter Parametrisierung für das autonome Fahrzeug
  • Test ob 6D-Kalman-Filter in der C++-Anwendung durch einen 4D-Kalman-Filter ersetzt werden kann
  • Multi-Objekttracking ID vergabe für Tracks implementieren (z.B. Ergänzung der Klasse durch entsprechende Propertie)
  • Berechnung eines Vertrauenwerts für den Track (z.B. Anhand von Lebensdauer und Anzahl konsekutiver Zyklen ohne Zuordnung, somit fehlender Messungen zur Korrektur)
  • Filterung des Ausrichtungswinkel (z.B. Tiefpass-Filter)
  • Bestimmung einer dynamischen Region of Interest aus der Spurerkennung (optional)

→ zurück zum Hauptartikel: Praktikum SDE