Anleitung zum einfachen Einstieg in ROS2
Autor: Marius Küpper
Art: Projektarbeit
Dauer: April - September 2022
Betreuer: Prof. Schneider
Thema
Aufgabenstellung
- Einarbeitung in ROS 2 mit Tutorials
- Dokumentation der wesentlichen Anleitungen bezogen auf das FTF im HSHL Wiki
- Evaluation durch andere(n) Studierende
- Optimierung des Artikels
- optional: Bereitstellung von Demoprogrammen zum einfachen Einstieg
Anforderungen an die Projektarbeit
- Wissenschaftliche Vorgehensweise (Projektplan, etc.), nützlicher Artikel: Gantt Diagramm erstellen
- Zweiwöchentlicher Fortschrittsberichte (informativ)
- Projektvorstellung im Wiki
- Studentische Arbeiten bei Prof. Schneider
- Anforderungen an eine wissenschaftlich Arbeit
- Regeln zum Umgang mit SVN
Projektplan
Nützlicher Artikel: Gantt Diagramm erstellen
Anforderungen
Hardwareanforderungen
Softwareanforderungen
Installation der virtuellen Maschine VirtualBox
- 1. Download der Software
Direkter Download: VirtualBox-6.1.36.exe
- 2. Nach dem Download das Setup ausführen und abschließen.
- 3. Wenn möglich, Virtualization oder SVM im BIOS aktivieren. (Befindet sich im BIOS unter den CPU-Einstellungen. Dies sorgt dafür, dass man Virtualbox später mehr Ressourcen zuweisen kann.)
- 4. Download des Betriebssystems.
Direkter Download : Ubuntu 20.04.5 LTS Direkter Download : Ubuntu 22.04.1 LTS (Empfohlen!)
ROS2 in Ubuntu einbinden
Die aktuelle Version von ROS2 (Humble Hawksbill), sowie der Vorgänger (Galactic Geochelone) wird über das Terminal von Ubuntu installiert.
> Alle Eingaben für das Terminal befinden sich als Copy&Paste in diesen grauen Feldern <
Zunächst muss die ROS2 apt Repository zum System hinzugefügt werden. Dazu autorisieren Sie Ihren GPG Schlüssel mit apt:
sudo apt update && sudo apt install curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
Danach fügen Sie die Repository zur Liste Ihrer sources:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
Updaten Sie den Cache Ihrer apt Repository:
sudo apt update
Zur Sicherheit überprüfen wir noch, ob Ubuntu auf dem neusten Stand ist:
sudo apt upgrade
Im Fall von Ubuntu 22.04:
Installation der Vollversion von ROS2 Humble für Desktop-PCs: sudo apt install ros-humble-desktop
ODER: Installation der Basis-Version von ROS2 Humble für Raspberrys etc.: sudo apt install ros-humble-ros-base
Im Fall von Ubuntu 20.04:
Installation der Vollversion von ROS2 Galactic für Desktop-PCs: sudo apt install ros-galactic-desktop
ODER: Installation der Basis-Version von ROS2 Galactic für Raspberrys etc.: sudo apt install ros-galactic-ros-base
Nach der abgeschlossenen Installation muss nun das Environment eingerichtet werden, damit die ROS2-Befehle im Terminal auch verwendet werden können. Wir erweitern dazu die Befehlsliste des Terminals, um somit nicht jedes mal den selben Befehl eingeben zu müssen, wenn wir das Terminal öffnen. Geben Sie den folgenden Befehl ins Terminal ein um die .bashrc zu öffnen:
gedit ~/.bashrc
Nun fügen Sie unter die letzte Zeile des Dokuments zwei neue Zeilen ein und geben in die letzte Zeile (Z.119) folgenden Befehl ein:
Im Fall von Ubuntu 22.04 (Humble):
source /opt/ros/humble/setup.bash
Im Fall von Ubuntu 20.04 (Galactic):
source /opt/ros/galactic/setup.bash
SVN-Repository in Linux erstellen
Um die Befehle für die Erstellung einer SVN-Repository zu nutzen muss zunächst das entsprechende Paket installiert werden:
sudo apt install subversion
Mit der Einagbe svn help checkout
kann man sich nun eine Hilfestellung anzeigen lassen, wie man sich eine Kopie der Repository auf Ubuntu lädt.
Zunächst sollten Sie sich einen Ordner anlegen, in den die Repository abgelegt wird. In diesem Fall wird der Ordner im persönlichen Benutzerordner erstellt.
cd
mkdir svn
Nach anlegen des Ordners "svn" kann nach folgendem Schema die Repository in den zuvor erstellten Ordner abgelegt werden: svn checkout [SVN Checkout URL] [Dateipfad]
Beispiel:
svn checkout https://svn-test.hshl.de/svn/Robotik_und_Autonome-Systeme/ /home/hshl/svn
Inbetriebnahme unserer WeBots-Simulation
Installation der benötigten Pakete, Environments und Repositorys:
sudo apt install python3-serial
sudo apt install python3-colcon-common-extensions
sudo apt install ros-${ROS_DISTRO}-navigation2 ros-${ROS_DISTRO}-nav2-bringup '~ros-${ROS_DISTRO}-turtlebot3-.*' ros-${ROS_DISTRO}-laser-geometry ros-${ROS_DISTRO}-webots-ros2
wget -qO- https://cyberbotics.com/Cyberbotics.asc | sudo apt-key add -
sudo apt-add-repository 'deb https://cyberbotics.com/debian/ binary-amd64/'
sudo apt-get update
sudo apt-get install webots
Navigieren Sie jetzt ins "FTS" (FTS = Fahrerloses Transportsystem) Verzeichnis.
Beispiel: cd svn/trunk/Projekte/FTS
Durch colcon build werden die benötigten Daten komprimiert und der Workspace "vernetzt".
colcon build --packages-select hewagv_simulation openslam_gmapping slam_gmapping
Eventuell muss die Eingabe wiederholt werden, wenn es zu einer Fehlermedlung kommt. Beim zweiten colcon build sollte der Prozess dann erfolgreich verlaufen.
Als letzten Schritt vor dem Start der Simulation muss nur noch das Environment gesourcet werden.
source install/local_setup.bash
Simulation starten:
ros2 launch hewagv_simulation full_system_launch.py
Mit Strg + C kann die Simulation im Terminal beendet werden.
Der Umgang mit ROS2
Workspace erstellen
Um mit ROS2 ein Projekt zu bearbeiten, muss als Erstes ein workspace erstellt werden. Dazu liefert ROS2 einige praktische Befehle um die Erstellung zu vereinfachen. Ein workspace ist ein Verzeichnis mit Unterordnern. In dem Verzeichnis werden die Pakete (package) erstellt.
1. Zunächst muss wieder das Environment gesourcet werden.
Im Fall von Ubuntu 22.04 (Humble):
source /opt/ros/humble/setup.bash
Im Fall von Ubuntu 20.04 (Galactic):
source /opt/ros/galactic/setup.bash
2.
Erstellen Sie nun das Verzeichnis vom workspace.
mkdir -p ~/ros2_ws/src
In diesem Fall heißt das Verzeichnis "ros2_ws". Außerdem wurde in dem Verzeichnis der Unterordner "src" erstellt. Dieser dient später der Übersichtlichkeit, da die Pakete in "src" abgelegt werden und mehrere Pakete im workspace vorliegen können.
3.
Navigieren Sie ins src-Verzeichnis.
cd ~/ros2_ws/src
4.
Erstellen Sie das erste Paket im workspace.
ros2 pkg create --build-type ament_python (Paketname)
Wählen Sie einen (Paketnamen) für sich aus.
Beispiel: ros2 pkg create --build-type ament_python mein_paket
Das Terminal sollte nun folgendes ausgeben:
[Bild]
Sollten Sie bei der Bearbeitung ihrer Pakete C++ bevorzugen, können Sie den Befehl ros2 pkg create --build-type ament_cmake (Paketname)
verwenden.
Das Paket enthält alle zunächst benötigten Verzeichnisse und Dateien.
Die erste Anwendung ausführen
1.
Wenn Sie den Befehl mit dem Zusatz "--node-name (Node-Name)" verwenden, erstellen Sie außerdem noch eine einfache Anwendung, welche "Hello Word" ins Terminal ausgibt.
ros2 pkg create --build-type ament_python --node-name mein_node mein_paket
2.
Verwenden Sie "colcon build" im Verzeichnis "ros2_ws" um die Anwendung zu komprimieren.
cd
cd ros2_ws
colcon build
(Falls der workspace viele Pakete enthällt ist es sinvoll nur die benötigten Pakte mit "colcon build" zu generieren: colcon build --packages-select mein_paket
Andernfalls kann es zu längeren Wartezeiten führen.)
3.
Anwendung und ROS2-Installation im Verzeichnis "ros2_ws" verknüpfen.
source install/local_setup.bash
4.
Anwendung ausführen.
ros2 run mein_paket mein_node
Workspace bearbeiten
Visual Studio Code
Zum Bearbeiten der unterschiedlichen Dateien und Dateiformate empfiehlt sich Vidual Studio Code. Zudem erleichtert der integrierte Datei-Explorer das Navigieren in den Verzeichnissen des workspace's.
Installation: sudo apt install code
Visual Studio Code starten: code
Workspace in Visual Studio Code öffnen:
package.xml
Das Dokument ist eine XML-Datei, die zur Beschreibung eines ROS-Pakets verwendet wird. Sie gibt den Namen, die Version und die Abhängigkeiten des Pakets sowie die Dateien an, die in dem Paket enthalten sind. Kann mit Visual Studio Code bearbeitet werden.
setup.py
Die Datei setup.py ist ein Skript, das zur Installation von Python-Paketen verwendet wird. Es wird in der Regel mit dem Paketmanager pip verwendet, um Pakete aus dem Python Package Index (PyPI) oder aus einem lokalen Quellcodeverzeichnis zu installieren.
launch.py
Die Datei launch.py ist ein Python-Skript, das zum Starten einer ROS2-Node oder einer Gruppe von Nodes verwendet wird. Es ist Teil des Launch-Frameworks, einem Werkzeug zur Organisation und Verwaltung des Starts mehrerer ROS2-Nodes und wird nicht beim Erstellen eines workspaces generiert. Die Funktion "generate_launch_description()" ist der Haupteinstiegspunkt in der Datei launch.py. Sie gibt eine LaunchDescription-Funktion zurück, welche eine Liste von Funktionen ist, die die Nodes und andere Ressourcen definieren, die gestartet werden sollen.
Die LaunchDescription kann auch andere Arten von Funktionen enthalten, wie "IncludeLaunchDescription" und "ExecuteProcess", die es ermöglichen, den Inhalt anderer launch.py-Dateien einzuschließen oder externe Prozesse zu starten.
world.wbt
Die world-Datei definiert das Layout der Simulationsumgebung in Webots. Sie enthält Informationen über die Objekte, Materialien und Eigenschaften in der Umgebung sowie die Startposition und Ausrichtung des Roboters.
Geometrie: Die Form, Größe und Position von Objekten in der Umgebung. Materialien: Die physikalischen Eigenschaften von Objekten, wie z. B. ihre Dichte, Reibung und Rückprallverhalten. Beleuchtung: Die Position und Intensität von Lichtquellen in der Umgebung. Roboter: Die Form, Größe und Ausgangsposition des Roboters. Sensoren: Art, Position und Ausrichtung der Sensoren am Roboter, z. B. Kameras und Laser. Aktuatoren: Typ, Position und Ausrichtung der Aktoren am Roboter, z. B. Räder oder Gelenke.
Das spezifische Format und die Syntax einer Weltdatei hängen von der verwendeten Physik-Engine ab. Webots verwendet ".wbt", ein proprietäres XML-basiertes Format für seine Welt-Dateien.
Steuerung des FTF in der Simulation
Grundlagen
Zur Steuerung eines Roboters in WeBots wird generell das Paket "geometry_msgs" verwendet. Das "geometry_msgs"-Paket ist ein ROS-Paket, das eine Reihe von ROS-Nachrichten für geometrische Datentypen, wie Punkte, Vektoren und Posen, definiert. Es ist Teil des Pakets "std_msgs", das eine Reihe allgemeiner Nachrichtentypen bereitstellt, die in ROS häufig verwendet werden. Jeder dieser Nachrichtentypen hat eine entsprechende Python-Klasse, die im Modul "geometry_msgs.msg" definiert ist. Zum Beispiel hat die Nachricht "Twist" eine entsprechende Klasse "Twist" und die Nachricht "Pose" eine entsprechende Klasse "Pose". Um einen mobilen Roboter zu steuern, wird der ROS-Nachrichtentyp "geometry_msgs/Twist", der im "geometry_msgs"-Paket definiert ist, verwendet. Diese repräsentiert eine 3D-Geschwindigkeitstorsion im linearen und winkeligen Bereich.
Die "geometry_msgs/Twist"-Nachricht hat die folgenden Aufgaben:
- linear: Ein 3D-Vektor, der die lineare Geschwindigkeit des Roboters im Raum darstellt.
- angular: Ein 3D-Vektor, der die Winkelgeschwindigkeit des Roboters im Raum darstellt.
Steuerung per Terminal
Mit dem Terminal und der "ros2 pub"-Funktion ist es möglich Nachrichten in einem Ros2-Topic zu veröffentlichen. Dazu muss der Name des Topics, in dem veröffentlicht werden soll, verwendet werden und der Nachrichtentyp des Topics angegeben werden.
Um den FTF nun mit einer Geschwindigkeit von 0,1 m/s in X-Richtung zu bewegen verwenden wir folgenden Befehl im Terminal während die Simulation läuft: ros2 topic pub /cmd_vel geometry_msgs/Twist "linear: { x: 0.1 }"
.
Die Vorwärtsfahrt kann mit der Tastenkombination "Strg-C" beendet werden. Um den Roboter im Kreis fahren zu lassen kann der vorherige Befehl mit dem "angular"-Befehl kombiniert werden.
Steuerung mit einem Python-Skript
"rclpy" ist eine Python-Client-Bibliothek für das Robot Operating System. Sie ermöglicht es Ihnen, ROS 2-Programme in Python zu schreiben, indem sie eine Reihe von Python-Bindings für die ROS 2-APIs bereitstellt.Außerdem können Sie ROS 2-Knoten erstellen, Themen veröffentlichen und abonnieren, Dienste aufrufen und ankündigen und auf den ROS 2-Parameter-Server zuzugreifen. rclpy bietet außerdem eine Reihe weiterer Funktionen, wie z. B. Unterstützung für Timer, Callbacks und Spinner, die das Schreiben von ROS 2-Programmen in Python erleichtern.
Aufgabe: Schreiben Sie ein Python-Skript, welches den FTF mit einer Geschwindigkeit von 0,5 m/s und einer Winkelgeschwindigkeit von 1 rad/s im Uhrzeigersinn fahren lässt. Die Publishing-Rate kann auf 10 Herz gestellt werden.
Steuerung per Tastatur und dem "teleop_twist_keyboard"-Paket
Installation des Paketes
Navigieren Sie im Terminal in den src-Ordner und führen folgenden Befehl aus: sudo apt-get install ros-teleop-twist-keyboard
Ausführen
Navigieren Sie im Terminal in den src-Ordner und führen folgenden Befehl aus: ros2 run teleop_twist_keyboard teleop_twist_keyboard
Beachten Sie, dass das Paket in einem anderem Terminal gestartet werden muss, als die WeBots.Simulation.
Steuerung
Die Steuerung sollte im Terminal angezeigt werden. Das Programm lässt sich durch die Tastenkombination "Strg-C" beendet werden.
Steuerung durch SLAM
Simultane Lokalisierung und Kartierung (SLAM) ist eine Technik, die von Robotern verwendet wird, um eine Karte ihrer Umgebung zu erstellen und gleichzeitig ihren eigenen Standort innerhalb der Karte zu bestimmen. Dies ermöglicht dem Roboter die Navigation und Erkundung unbekannter Umgebungen, ohne dass externe Lokalisierungssysteme wie GPS erforderlich sind.
Das "gmapping"-Paket ist ein beliebter SLAM-Algorithmus, der Laserentfernungsmesserdaten verwendet, um eine 2D-Belegungsgitterkarte der Umgebung zu erstellen. Er basiert auf dem Monte-Carlo-Lokalisierungsalgorithmus und verwendet einen Partikelfilter, um die Haltung des Roboters (d. h. seine Position und Ausrichtung) auf der Karte zu verfolgen.
Funktionsweise:
1. Der Roboter erzeugt mit einem Laserentfernungssensor die Messdaten.
2. Die Messdaten werden an den gmapping-Knoten weitergeleitet, der die Daten verarbeitet, um eine 2D-Gitterkarte der Umgebung zu erstellen. Die Gitterkarte ist ein 2D-Gitter aus Zellen, von denen jede die Wahrscheinlichkeit darstellt, dass die Zelle von einem Hindernis besetzt ist.
3. Der Knoten "gmapping" verwendet die Laserscandaten, um die Position des Roboters in der Karte zu aktualisieren. Dazu werden Stichproben aus einer Reihe möglicher Posen (d. h. Partikel) gezogen und anhand der Laserscandaten die Wahrscheinlichkeit für jedes Partikel berechnet. Die Partikel mit der höchsten Wahrscheinlichkeit werden dann neu abgetastet, um einen neuen Satz von Partikeln zu erzeugen, die zur Aktualisierung der Schätzung der Roboterposition verwendet werden.
4. Der "gmapping"-Knoten veröffentlicht die aktualisierte Karte und die Posenschätzung in ROS, die mit Tools wie "rviz" visualisiert oder von anderen Knoten für die Navigation oder Lokalisierung verwendet werden können.
5. Der Prozess wird wiederholt, während sich der Roboter durch die Umgebung bewegt und die Karte und die Pose-Schätzung auf der Grundlage neuer Laserscan-Daten aktualisiert werden.
Knoten, Nachrichten und Beziehungen
rqt_Graph
rviz
debugging
.
Programmierung
Ergebnis
Zusammenfassung
Lessons Learned
Projektunterlagen
Link zu dem SVN_Ordner des Projekts. VM Appliance
YouTube Video
Das Video von diesem Projekt finden Sie auf Youtube unter dem Link:
Weblinks
Literatur
→ zurück zum Hauptartikel: Studentische Arbeiten