Autopilot
Codebase
Doxygen Documentations:
Tutorials
Watch on YouTube. You can find the video transcript in the sections below.
Part 1:
Part 2:
Part 3:
Autopilot
- output an den Regler: 𝜈 und trajectory

- ist der nächste Schritt, nachdem die Detektionen übertragen wurden
- ist ein C++ Node:
- nutzt die Lineare Algebra library Eigen3
- ist aufgeteilt in 2 Hauptpunkte:
- Umgebungsmodell
- wieder 2 Teile:
- Gitternetzkarte (Occupancy Grid Map) für Tracking und “Nachhalten” (Speichern?) der Spurbegrenzungen
- rastere Umgebung und jede Rasterzelle hat eine Wahrsch. dafür, ob und mit welcher Wahrsch. eine Spurbegrenzung vorliegt
- ist global und in Top-View (2D) (dh man schaut von oben auf die Karte drauf) (s. Skizze nächstes slide)
- multi -threaded: 500 fps auf Desktop (mal schauen wie viel auf dem Fahrzeug)
- Objekt Liste für Tracking und “Nachhalten” (Speichern?) der Hindernisse (Größe und Position)
- Odometrie
- dadurch, dass wir ein globales Modell benutzen, muss das Fahrzeug innerhalb dieser Karte lokalisiert werden
- das wird mittels der Raddrehzahl und den Gyroskopen der Inertial Measurement Unit durchgeführt
- da wird also im Grunde die Geschwindigkeit integriert, um zu schauen, wo wir uns befinden
- dadurch, dass wir ein globales Modell benutzen, muss das Fahrzeug innerhalb dieser Karte lokalisiert werden
- Gitternetzkarte (Occupancy Grid Map) für Tracking und “Nachhalten” (Speichern?) der Spurbegrenzungen
- wieder 2 Teile:
- Entscheidungsfindung
- Autopilot muss die lokale Umgebung extrahieren und Spurmitten berechnen (auf Basis der Spurbegrenzungen)
- und extrahiert auch vorausgehende Objekte, die weiter zur Entscheidungsfindung fließen

- im Bild: globale Occupancy Grid Map
- Spurbegrenzungen rechts (blau), Mitte (grün) und links (rot) sowie Fahrzeug (schwarz)
- es kommen neue Detektionen rein:
- neue Spur
- neue Hindernisse (gelb)
- diese müssen an der passenden Stelle im Umgebungsmodell eingefügt werden:
- dazu wird zuerst eine Aktualisierung der Odometrie durchgeführt, dh. es wird die neue Position des Fahrzeugs auf der Karte abgeschätzt
- auf Basis dieser neuen [Fahrzeug-]position werden die Spuren an der passenden Stelle eingefügt und auch die Hindernisse
- dabei gibts immer einen gewissen Bereich der sich mit alten Detektionen überlappt
- genau hier findet dann das Tracking statt:
- das passiert basierend darauf, dass … wir haben alte Detektionen und neue Detektionen und wenn sie sich überschneiden [grauer Bereich im Bild] wird an einem Rasterpunkt die Wahrsch. erhöht wenn da eine Spurbegrenzung vorliegt und wenn da keine wiedererkannt wurde wird da auch die Wahrsch. verringert
- genau hier findet dann das Tracking statt:
- dabei gibts immer einen gewissen Bereich der sich mit alten Detektionen überlappt
- diese lokalen Informationen vor dem Fahrzeug werden dann extrahiert und die Spurmitten berechnet (beider befahrbarer Spuren) und auch Objekte [=Hindernisse] werden extrahiert und diese fließen dann in die Entscheidungsfindung ein

- die Basis [für die Entscheidungsfindung] sind diese Spurmitten und Hindernisse
- (und auch sowas wie
- “sind wir gerade in einer geschwindigkeitsbegrenzten Zone”,
- der Fahrzeugzustand:
- “sind wir gerade in einem Spurwechsel” oder
- “haben wir gerade den Blinker an”
- also im Grunde “in welchem Zustand befindet sich das Fahrzeug” )
- die Implementation ist angelehnt an einen Entscheidungsbaum
- also auf Basis von unterschiedlichen Gegebenheiten wird eine Entscheidung getroffen was das Fahrzeug tun soll, dabei sind folgende Entscheidungen relevant:
- Wahl der Spur (wie schon gesagt)
- welche Spur solls fahren
- wann solls die Spur wechseln (bei Hindernissen wichtig)
- Geschwindigkeit muss angepasst werden (zB. in geschwindigkeitsbegrenzter Zone wichtig)
- Lichtzeichen müssen passend gesetzt werden
- zB. wenn Spur gewechselt wird, muss Blinker gesetzt werden
- Fahrzeug soll Bremsleuchte anschalten, wenn es langsamer fährt bzw wenn es abbremst auf eine langsamere Geschwindigkeit)
- StVO soll eingehalten werden
- Rechts-vor-Links (an Kreuzungen ohne Beschilderungen)
- Anhalten an Haltelinien
- nicht Fußgänger überfahren (Fußgängerüberwege, Zebrastreifen)
- Wahl der Spur (wie schon gesagt)
- also auf Basis von unterschiedlichen Gegebenheiten wird eine Entscheidung getroffen was das Fahrzeug tun soll, dabei sind folgende Entscheidungen relevant:
- (und auch sowas wie
- Umgebungsmodell

- hier Autopilot in Aktion:
- oben: was das Fahrzeug in der Simulation sehen kann
- unten drunter: Visualisierung des Umgebungsmodells
- man sieht
- den vorderen Teil, dh. die vordere lokale Umgebung des Fahrzeugs und das Fahrzeug befindet sich am Schnittpunkt der beiden weißen Linien
- Spurbegrenzungen: rechts, Mitte, links
- berechnete Spurmitten (hellblau und rosa)
- man sieht
- rechts: wenn das Fahrzeug über die gesamte Strecke gefahren ist, baut sich dieses Umfeldmodell auf
- hier in diesem Bild: ist in der Simulation passiert (dh. Genauigkeit der Odometrie = 100%)
- da muss man schauen wie weit man alte Informationen, die so weit zurückliegen, dass man einmal um die Strecke gefahren ist, wie weit man sie noch weiter benutzen kann
- der Ansatz war, dass wir ein globales Modell benutzen, weil wir später noch andere Ansätze oder Lokalisationsmethoden benutzen können, um vlt alte Detektionen mit zu benutzen
- da muss man schauen wie weit man alte Informationen, die so weit zurückliegen, dass man einmal um die Strecke gefahren ist, wie weit man sie noch weiter benutzen kann
- hier in diesem Bild: ist in der Simulation passiert (dh. Genauigkeit der Odometrie = 100%)
- Ausblick:
- Implementation der Entscheidungsfindung muss noch fertiggestellt werden
- Szenarien für CC analysieren
- am Fahrzeug testen
- Implementation der Entscheidungsfindung muss noch fertiggestellt werden
Controller/Regler
- bekommt 𝜈 und trajectory als input vom Autopilot
- output: s. “Ausgabe” auf slide

- in c++
- implements an MPC similar to “2 & ½ Carrots” method (already used successfully in CC 2016)

- red: given reference trajectory (path to be driven)
- green: tree: Es wird ein Baum aufgebaut
- mit allen möglichen
- Fahrzeug kann im aktuellen Zeitpunkt bzw im zu regelnden Zeitpunkt unterschiedliche Lenkwinkel einstellen
- 2 in “2 & ½ Carrots” kommt davon, weil wir einen Regelungshorizont von 2 haben:
- wir können am aktuellen zu regelnden Zeitpunkt und noch einmal an einem Punkt nach einem bestimmten eingestellten Zeithorizont einen neuen Lenkwinkel einstellen
- an diesen Punkten wird ausgewertet wie nah wir mit unserer geplanten Trajektorie an der Referenztrajektorie dran sind
- die beste Möglichkeit wird dann ausgewählt und passend dazu wird der Lenkwinkel eingestellt
- was wir dadurch erzielen:
- begrenzte Ausführzeit dadurch dass wir diesen Baum aufbauen
- wir hatten damals eine modellprädiktive Regelung mittels eines Optimierungsproblems implementiert
- da hatten wir unterschiedliche Laufzeiten, die teilweise relativ lang waren
- das hat sich dadurch jetzt verbessert
- wir hatten damals eine modellprädiktive Regelung mittels eines Optimierungsproblems implementiert
- begrenzte Ausführzeit dadurch dass wir diesen Baum aufbauen
- Ausblick:
- es gibt unterschiedliche Parameter, die noch am Fahrzeug getunet werden müssen, zB.
- einstellen, welche Lenkwinkel werden hier im Raum berechnet
- Zeithorizont
- es gibt unterschiedliche Parameter, die noch am Fahrzeug getunet werden müssen, zB.