Table of Contents
Motivation
Getreu dem Motto “Konstant Lernen und Wachsen” wollte ich schon seit Jahren das Udacity nanodegree Robotics Software Engineer machen. Der Reiz an diesem Kurs lag für mich darin, dass man seinen Code einreichen und bewerten lassen muss, um zu bestehen.
Dieses Jahr war es so weit! Ich möchte euch heute hier von meinem Leidensweg berichten. Auch wenn vieles davon “first world problems” sind, möchte ich euch meine Erfahrungen nicht vorenthalten. Vielleicht hilft es ja dem ein oder anderen bei der Entscheidung, ob er sich auf dieses Abenteuer einlassen möchte.
Einschreibung
Da ich bereits einen Account hatte, waren nur 3 Klicks notwendig. Ihr könnt allerdings auch vorher einen Discount anfordern; abhängig von eurer persönlichen Situation, könnt ihr bis zu 42%-Rabatt bekommen Diese massiven Discounts auf den eh mittlerweile schon geringen Basispreis hätten mich stutzig machen sollen: 2018 kostete der Kurs noch 400$ pro Monat, jetzt war ich mit knapp 136€ pro Monat dabei. Aber dazu später mehr.
Setup
Für die Projekte müsst ihr ROS 1 / Gazebo verwenden. Mit dem Setup hatte ich allerdings ewig zu kämpfen:
Die Browser-VM (Ubuntu 18 – auch schon End of Life) die Udacity anbietet, dumpt nach jeder Session alle Daten und man kann seine Daten sehr schlecht transferieren. Es wird empfohlen die Dateien über git bzw. ein github Repo zu synchronisieren. Aber: github hat vor ein paar Jahren auf Token statt Username / Passwort umgestellt, die will man nicht bei jeder Session neu eingeben müssen.
Also lieber eine lokale Installation, jedoch: Das zur Verfügung gestellte VM-Inage (Ubuntu 16(sic!)) habe ich unter Apple Silicon (ARM-Architektur) nicht zum Laufen gebracht. Weder mit Virtualbox noch UTM. Einige Stunden versenkt.
Dann habe ich Robostack ausprobiert, was sich über conda/mamba nativ auf dem Rechner installieren lässt. Hier werden die Modelle aber aus Gründen nicht in Gazebo angezeigt.
Also, Virtualisierung again: Da ROS Noetic (aktuelle und letzte Version von ROS 1) aber nicht mehr auf Ubuntu 22 offiziell unterstützt wird, musste ich ein Ubuntu 20 Server Image für arm64 installieren und zum Desktop updaten. Yeah, wieder was gelernt!
Nachdem dann ROS Noetic installiert war, konnte es schon losgehen.
Das erste Projekt
Für das erste Projekt musste ich in Gazebo ein Gebäude modellieren und einen ersten kleinen Roboter erstellen. Obwohl mir Gazebo öfter abgestürzt ist, ging das ganze dann recht zügig. Ein bisschen Programmieren war auch schon dabei: ein Hello World Plugin musste in C++ erstellt und in die Gazebo World eingebunden werden. Alles in allem: Easy!
Das zweite Projekt
Das zweite Projekt war schon etwas anspruchsvoller: ein Roboter muss sich in einer simulierten Welt bewegen lassen. Dafür musste ich ein paar ROS-Nodes schreiben, die die Sensoren auswerten und die Motoren ansteuern. Über das Kamera-Bild musste ich einen Ball erkennen und verfolgen. Hier hat man auch den ersten Kontakt zum Tool RViz.
Auch hier ist wieder das selbstständige Arbeiten gefragt, die Anleitung ist oft nicht hinreichend. Beispielsweise wird bei mir das erstellte Roboter-Modell zwar in Gazebo aber nicht in RViz angezeigt. Hier ist Recherche notwendig. Das liegt teilweise auch wieder mit daran, dass der Kurs auf ROS Kinetic basiert und sich manche Menüs und Bezeichnungen geändert haben.
Das Programmieren wurde schon etwas anspruchsvoller: ich musste das Kamerabild segmentieren, um den Aufenthaltsort des Balles zu bestimmen, um damit die Bewegungsrichtung des Roboters festzulegen. Das hat Spaß gemacht und ich werde den Ballchaser auch mal in echt nachbauen! Empfehlung: Nehmt euch hier mal einen kompletten Tag Zeit, damit ihr euch in die Tools und den Code reingraben könnt.
Drittes Projekt
Jetzt geht es ans Eingemachte: Kalman Filters und Monte Carlo Localization. Das ist erstmal etwas Theorie, dann ist Programmieren angesagt. Allerdings hier wieder in der Browser-IDE. Man hat Kontakt zur C++-Library Eigen, um mit Matrizen zu rechnen. Machbar, aber ich musste hart meine Mathe-Kenntnisse von vor 20 Jahren ausgraben. Determinanten, Inverse, Transponieren etc.
Weiter geht es mit dem turtlebot. Hier kommt man auch mit dem teleop_twist_keyboard in Kontakt, um den Roboter zu steuern. Auch hier wieder Content der nicht mehr aktuell ist: das turtlebot_simulator Repository ist nur noch bis einschließlich ROS 1 Melodic gültig. Das heißt, patchen ist wieder angesagt!
Didaktisch ist auch manches hier wieder etwas schräg: Eine Aufgabe besteht darin mal das Paper von Sebastian Thrun zu lesen. Grundsätzlich natürlich ein sinnvoller Skill, wissenschaftliche Paper zu lesen, aber den Fluss eines Tutorials stört das doch immens.
Unter dem Titel “Where am I?” wird dann die Adaptive Monte Carlo Lokalisierung erklärt. Beim praktischen Teil wird dann ein Partikelfilter implementiert, um die Position des Roboters zu bestimmen. Das hat mir dann auch wieder Spaß gemacht, aber ich musste mich schon wieder in die Eigenheiten von ROS einarbeiten.
Als Erstes habe ich aus dem Gazebo-Modell eine Karte erstellt, die dann in RViz angezeigt wird. Das ging natürlich nicht mit dem Tool-Repo von Udacity, weil das nicht mehr aktuell ist. Aber ein cleverer Zeitgenosse hat das für ROS Noetic gepatcht und auf github gestellt.
Muchas Gracias Senor!
Ende der Geduld?
Da ich als Familienvater in meiner Freizeit mit einem relativ engen Zeitbudget gesegnet bin, war ich zwischenzeitlich an den Punkt gekommen, das Experiment zu beenden. Als ich mein Abo beendet habe, wurde mir nochmal ein Rabatt von 30% auf den bereits reduzierten Preis angeboten. Das alles bestätigt meinen Verdacht, dass hier noch ein totes Pferd vom Kunden weiter geritten werden soll.
Ich fasse mal zusammen: Es wird mit alten (veralteten) Versionen gearbeitet. ROS Noetic Ninjemys ist die letzte Version von ROS 1, bevor es zu ROS 2 geht.
Grundsätzlich nicht schlimm, da es in der Industrie noch genügend Bestandsprojekte mit ROS 1 gibt. Aber dann sollte der Kurs auch reibungslos mit einer Noetic Installation zu absolvieren sein. Das ständige rumfrickeln, um die Tools zum Laufen zu bringen ist dann irgendwann zu nervig.
Es fehlen oft grundlegende Erklärungen. Zum Beispiel wird in Projekt 1 ein Roboter als SDF erstellt im zweiten Projekt als URDF. Warum?
Der URDF-Roboter ist in Gazebo auch nicht direkt sichtbar, weil noch Meshes fehlen. Wie man die installiert, findet man durch hartnäckiges googlen heraus. Auf das XACRO-Format wird auch nicht eingegangen, das muss einfach benutzt werden.
Manchmal schreibt man direkt in XML-Dateien seine Modelle, manchmal lädt man sich einfach welche runter. Warum das mal so und dann wieder anders gemacht werden soll, bleibt offen. Diese wechselnde Flughöhe machte es mir oft schwer zu folgen.
Man trifft immer wieder auf side quests. Beispielsweise verwendet der Template-Code von Udacity Sprachfeature aus C++17, was in noetic aber nicht per default aktiviert ist.
Also CMake-Files anpassen. Kein Beinbruch, aber durch diese side quests ist man öfter vom eigentlichen Ziel “Robotik lernen” abgelenkt.
Randnotiz: Inkonsequenz auch beim Coden: da wird glorios iostream inkludiert, um dann doch printf zu verwenden. LOL
Ich habe (unfreiwillig) viel über Virtualisierung gelernt, meine Kommandozeilen- und git-Skills aufpolieren können, bzw. müssen. Ich habe viele weitere Tutorials zurate ziehen müssen, die um einiges konsistenter aufgemacht waren, als der Udacity-Kurs. Viele Tutorials waren dazu noch kostenlos!
Neuer Versuch!
Ich habe mich dann doch nochmal aufgerafft und das dritte Projekt abgeschlossen. Dazu habe ich mir nochmal einen Tag Urlaub genommen. Das kann ich sehr empfehlen! Sich mal ungestört für ein paar Stunden in die Materie zu vertiefen, hat geholfen. Aber ihr ahnt es schon:
Viertes Projekt
Unter den Titel Map my World wird das SLAM-Problem behandelt. Hier wird ein Roboter durch eine Welt geschickt, um eine Karte zu erstellen. Und täglich grüßt das Murmeltier: wieder irgendwelche Dependecies patchen und kryptische Fehler fixen. Vielleicht bin ich hier derjenige der ein totes Pferd weiterreitet?
Nachdem ich in meinem Urlaub nochmal einige Stunden in den Kurs versenkt hatte, war mein Zeit- und Finanzbudget und vor allem meine Geduld erschöpft. Und da nochmal eine nicht mehr ermäßigte Verlängerung drohte, habe ich die Reißleine gezogen.
Unterm Strich
Der Kurs hatte definitiv seine Stärken, aber die Welt hat sich in den letzten 6 Jahren weiter gedreht.
Wenn Geld keine Rolle spielt, weil es zum Beispiel euer Arbeitgeber bezahlt und ihr die Fortbildung auf Arbeitszeit machen könnt, durchaus noch überlegenswert. Privat würde ich auf aktuellere und günstigere Kurse ausweichen.
Gelernt habe ich aber auf jeden Fall eine Menge!
Links
Grundlagen
Offizielle Doku
URDF-Tutorial
https://robotics.stackexchange.com
Kurse von Edouard Renard
https://www.udemy.com/course/ros-for-beginners/
https://www.youtube.com/channel/UCelRThOKlWMnpjqr5EBq6tg
Kalman Filters
https://www.udemy.com/course/data-fusion-with-linear-kalman-filter/