Autonome Spurführung mit einem JetRacer ROS AI Robot

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Abb. 1: JetRacer ROS AI Roboter von Waveshare
Autor: Jonas Michael Beisler
Modul: Projektarbeit, MBP-B-2-6.05
Starttermin: 19.02.2024
Abgabetermin: TBD
Prüfungsform: Modulabschlussprüfung als Hausarbeit (Praxisbericht, Umfang 10-50 Seiten Textteil)
Betreuer: Prof. Dr.-Ing. Schneider, Tel. 806
Mitarbeiter: Marc Ebmeyer, Tel. 847

Einführung

Der JetRacer ist ein Modellrennwagen im Maßstab 1:10. Hierbei handelt es sich um ein leistungsstarkes intelligentes KI-Modellfahrzeug, das speziell für Studierende entwickelt wurde, die den Umgang mit dem Robot Operation Systelm (ROS) erlernen möchten. Das System besteht aus zwei Steuereinheiten. Den Host-Controller bildet das JETSON-NANO-DEV-KIT-A und als Sub-Controller wird ein Raspberry Pi RP2040-Mikrocontroller verwendet. Die Hauptplatine integriert die OLED, den Servomotor-Antriebsschaltkreis, den Batterieschutzschaltkreis, einen Audioausgangsschaltkreis usw., das lästige Löten des Schaltkreises erspart, das Entladen und Laden unterstützt und kein wiederholtes Entfernen des Akkus erfordert. Der verbauter IMU-Lagesensor und DC-Encodermotor regelt die Geschwindigkeit über einen PID-Regler und kann einen Radkilometerzähler ausgeben. Die Software ist mit dem Open-Source-Projektprogramm NVIDIA Jetbot kompatibel und unterstützt AI Deep Learning, SLAM-Mapping und -Navigation, visuelle OpenCV-Verarbeitung, intelligente Sprachinteraktion und andere Funktionen.

Aufgabenstellung

  1. Einarbeitung in den JetRacer
  2. Ansteuerung des Antriebs und der Lenkung
  3. Einlesen der Sensoren
  4. Fokus auf eines der Schwerpunktgebiete
    1. SLAM LiDAR Mapping
    2. Bahnplanung, Autonome Navigation, dynamische Hindernisbehandlung
  5. Systemtest
  6. Optimierung
  7. Dokumentation der Vorgehensweise im HSHL-Wiki

Durchführung

  • Zeitplanung
  1. Ursprüngliche Planung
  2. Überarbeitete Planung
  • Montage des Jetracers
Der Jetracer wurde wie in diesem Tutorial: Anleitung zum Aufbau des Jetracers beschrieben aufgebaut. Besonders zu beachten hierbei ist dass das sogenannte Expansion Board, welches die Batterien hält, und das Jetson Nano Modul. Beide sollten vor der kompletten Montage einmal aufgebaut und hochgefahren werden. Somit kann sicher gegangen werden das beide funktionieren und nicht später wieder ausgebaut werden müssen. Der "First Boot" des Jetson Nano Moduls kann am besten wie in diesem Tutorial: Get Started with Jetson Nano beschrieben, durchgeführt werden.
Verbesserung beim Aufbau
Eine Abänderung/Verbesserung zum Montage-Tutorial war das die Schraubenlöcher die zum fixieren des Servo-Motor dienen, nach unten hin größer gefeilt wurden. Dies war nötig da der Servo Motor sonst die über ihm liegenden Teile blockiert hätte. Außerdem wurde die Aufhängung des Motors durch größere Schrauben, und Gummringe zur Dämpfung, verbessert.
  • Multimachine Communication
  1. Jetracer Image
Anleitung für die Inbetriebnahme des Racers
Virtualbox Ubuntu Image
Anleitung für die Inbetriebnahme des Controllers
(Ändern des Files auf den richtigen File Typen)
Verbinden der beiden Parteien
(Darauf achten das der PC im gleichen WLAN wie der Roboter ist (Autonome System))
(Darauf achten das sich die IPs der Komponenten ändern können. Diese müssen dann in /etc/hosts geändert werden)
Anleitung für die Verbindung zwischen Racer und Controller
NoMachine
Außerdem wurde für den Zugriff auf den Jetracer, wenn dieser nicht per HDMI an einen Monitor und an eine Tastatur sowie Maus angeschlossen war, das Programm NoMachine benutzt. Dieses Programm kann den Desktop des Roboters über das WLAN spiegeln, und erlaubt so einen kabellosen Zugriff. Hierfür muss lediglich die IP Adresse des Roboters innerhalb des WLANs im Programm angegeben werden, und dann kann eine Verbindung aufgebaut werden.
  • Austesten aller Funktionen
Kamera (Vll. Bild der Kamera)
In diesem Tutorial: Start the Camera Node wird beschrieben wie man die Kamera des JetRacers initial einschaltet und das aufgenommene Video entweder in RViz in der Virtualbox oder im Browser anschauen kann. Außerdem wird hier beschrieben wie die Kamera, anhand eines Python Skripts und eines beigelegten Schachbrettmusters, kalibriert werden kann. Für eine einfachere Kalibrierung kann aber auch das Schachbrett welches im Autonome Systeme Labor vorhanden ist benutzt werden. Hierfür muss dann lediglich die Größe des Brettes im Befehl, welcher die Kalibrierung startet, auf die neuen Werte angepasst werden.
LIDAR (Vll. Bild des LIDAR)
In diesem Tutorial: Enable the Lidar Node wird beschrieben wie man den LIDAR des JetRacers initial einschaltet und dann überprüft ob Daten gesendet werden. Danach kann dann eine Karte des Raumes erstellt werden. Hierfür kann dem Tutorial SLAM Lidar Mapping gefolgt werden, und es können vier verschiedene Mapping-Algorithmen ausprobiert werden.
Hier bei ist allerdings zu beachten das der im Tutorial gegebene Save Befehl abgeändert werden muss. Das jetbot_pro im Befehl muss auf jetracer_ros geändert werden, sodass der Befehle "cd catkin_ws/src/jetracer_ros/maps"lautet.
Verschiedene manuelle Steuerungsmodi
Die verschiedenen Möglichkeiten wie der JetRacer gesteuert werden kann werden im Tutorial Robot Movement Control beschrieben. Hierbei ist zu beachten das beim Befehl "sudo adduser jetbot dialout" welcher den User hinzufügt, das jetbot durch ein jetracer ersetzt werden muss.
  1. Steuerung per Node Publishing
Wie im Tutorial beschrieben kann der Roboter anhand einer Publishing Note Befehl für Befehl gesteuert werden. Dies ist zu Beginn nützlich um zu testen ob alle Bewegungsmöglichkeiten funktionieren.
  1. Steuerung per Tastatur
Ebenfalls kann der Roboter per Tastatur gesteuert werden. Dieser Modus läuft flüssiger als die Publishing Node, ist aber gewöhnungsbedürftig.
  1. Steuerung per Joystick
Der intuitivste Steurungsmodus ist das steuern per Game Controller, hier genannt Joystick. Für diesen Modus muss allerdings erst der Controller mit der Virtualbox verbunden werden. Hierfür muss in den Einstellungen der VM der Controller als USB Input Gerät festgelegt werden. Außerdem muss vielleicht der Input an der Virtualbox von js0 auf js1 geändert werden, da sonst die Maus als Input für die Steuerung benutzt wird. In diesem Tutorial: Assign specific device input paths wird beschrieben wie dies in einer ubunutu Umgebung möglich ist.
Falls der Roboter nicht geradeaus fährt wenn man eine gerade Bewegung eingibt, könnte es daran liegen das die Räder beim Aufbau leicht versetzt montiert wurden. Dies kann durch eine Änderung des Fahrtwinkels kompensiert werden. In diesem Tutorial: Robot Odometer Calibration wird beschrieben wie man den Winkel einstellen kann. Außerdem nützlich dafür ist dieser Beitrag: Editing Cfg Files in Linux welcher erklärt wie man eine config Datei in Linux bearbeitet.
Automatisches Fahren
Im Tutorial Autonomous Navigation ist beschrieben wie die Navigations-Funktion des Jetracers aktiviert und genutzt werden kann. Hierfür werden auf Seiten des JetRacers und im Controller, also der Virtualbox, sogenannte "Launch Files" gestartet. Danach öffnet sich dann RViz auf dem Controller und man kann über den Button "2D Pose Estimate" die Position und Orientierung des Roboters angeben, falls diese vom Ursprung der Map abweicht. Danach kann man mit dem Button "2D Nav Goal" einen beliebigen Punkt auf der Map angeben werden und der Roboter wird versuchen diesen zu erreichen.
Abfahren mehrerer Punkte
Um mehrere Zielpunkte setzen und dann abfahren zu können muss auf Seiten des Jetracers das sogenannte "Multipoint_navigation.py" Skript ausgeführt werden. Danach aktiviert sich im Rviz die Funktion "Publish Point" und die Punkte können per Maus nacheinander gesetzt werden. Diese Punkte werden dann der Reihe nach abgefahren, wobei wenn der letzte Punkt erreicht wurde der Loop von neuem beginnt und wieder der erste Zielpunkt angefahren wird.
  • Endziel festlegen
Als Endziel wurde festgelegt das der Roboter die im Labor aufgemalte Strecke abfahren soll. Dies sollte anhand von automatisch gesetzten Navigationspunkten erfolgen. Als Automatisch wird in diesem Falle festgelegt das alle benötigten Punkte gesetzt werden sobald ein bestimmtes Skript im Jetracer ausgeführt wird.
  • Raum Kartographieren
Anhand des unter Punkt "LIDAR" beschriebenen Tutorials wurde eine Karte des Labors erstellt. Wichtig war dabei das der Mapping Algorithmus dort gestartet wurde, wo das Auto auch später für das Abfahren der Strecke starten wird. Dadurch wird die Karte mit dem korrektem Fokus angezeigt, und der Ursprung liegt gleichzeitig im Startpunkt.

Karte des Raums

In der Karte sind in hellgrau die freien Flächen und in schwarz die Hindernisse dargestellt.
  • Erstellen eigener Python Skripte
Vorhandene Skripte verstehen
Als Vorbild wurde das oben bereits erwähnte, Multipoint Navigation Skript, genutzt. In diesem war der Code, der für das markieren der Punkte in Rviz und das setzten der Zielpunkte für den Racer, vorhanden. Dieser Code wurde dann erstmal so abgeändert das einige Marker in Rviz nicht beim Mausklick, sondern direkt beim ausführen des Skriptes gesetzt wurden. Allerdings stellte sich das setzen der Zielpunkte als etwas schwierieger dar, da dieses ausführlicheren Publisher Code benötigte.
ROS Publisher & Subscriber verstehen
Die sogenannten Publisher und Subscriber sind eine der wichtigsten Funktionen die es in ROS gibt. Sie sind dafür zuständig Daten, wie zum Beispiel Informationen über Marker oder Befehle, zwischen den verschiedenen Nodes hin und her zu schicken. "ROS Tutorial Seite".
Einbauen der gewollten Funktionen
Automatische Marker und Target Points
Anfahren der Target Points
Orientierung an den Target Points
Quaternions verstehen
  • Austesten der Skripte
Testen & Verbessern des Skriptes
Die Skripte wurden bei den jeweiligen Problemen kontinuierlich getestet und verbessert. Dabei wurde Schritt für Schritt das jeweilige Problem bearbeitet und beseitigt, um einen möglichst reibungslosen Ablauf zu gewähren.
Einige Problemfälle waren zum Beispiel:
Die Marker wurden außerhalb des angezeigten Kartenraums gesetzt. Dies wurde durch kleinere Koordinatenräume behoben
Der Roboter fuhr zu Beginn des Skriptes nicht los um den ersten Targetpoint zu ereichen. Dies wurde behoben durch einen kleinen Delay zwischen dem erstellen der Targetpoints. Wohlmöglich kam das Programm nicht mit dem gleichzeitigen Erstellen von mehreren Punkten klar.
Der Roboter wollte an jedem Punkt die gleiche Orientierung wie am Startpunkt einnehmen. Auf der Geraden war das kein Problem, in Kurven führte dies jedoch zu einem unnatürlichem Fahrverhalten. Behoben wurde dieses Problem durch...
  • Finale Vorführung des Ziels
Video

Anforderungen

Das Projekt erfordert Vorwissen in den nachfolgenden Themengebieten. Sollten Sie die Anforderungen nicht erfüllen müssen Sie sich diese Kenntnisse anhand im Rahmen der Arbeit anhand von Literatur/Online-Kursen selbst aneignen.

  • Umgang mit Linux
  • Python-Programmierung
  • Dokumentenversionierung mit SVN
  • Optional:
    • AI Deep Learning mit NVIDIA Jetson Nano
    • OpenCV Vision Processing
    • Simulation mit WeBots
    • Umgang mit ROS2
    • Partikel Filter SLAM
    • Mensch-Roboter Sprachinteraktion

Anforderungen an die wissenschaftliche Arbeit

Repositorium

  • Sciebo-Projektordner: \JetRacer_ROS_AI_Robot\
  • Sciebo-Abgabeordner: \Jonas_Beisler\Projektarbeit\

Getting started

Lesen Sie zum Einstieg diese Artikel

Tabelle 1: Checkliste
LOP Status Bemerkung
Sicherheitseinweisung für die Labore von Marc Ebmeyer
Schlüsselübergabe für die Labore von Marc Ebmeyer
SVN-Zugang bereitstellen user: Jonas_Beisler
Vereinbarung wöchentlicher Meetings user: Jonas_Beisler
Wiki-Zugang bereitstellen user: Jonas_Beisler


Nützliche Artikel


→ zurück zum Hauptartikel: Studentische Arbeiten