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, y: 0.0, z: 0.0 }"
.
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 ( angular: {x: 0.0, y: 0.0, z: 0.1}
).
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. (Lösung siehe Abb.1)
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 anderen Terminal gestartet werden muss, als die WeBots-Simulation.
Steuerung
Die Steuerung sollte im Terminal angezeigt werden. Das Programm können Sie durch die Tastenkombination "Strg-C" beenden.
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.
Um das FTF in der Simulation zu steuern, wird die "Nav2 Goal"-Funktion in RViz verwendet. RViz wird beim Starten der Simulation automatisch geöffnet und visualisiert den Roboter, Punktwolken und andere Daten.
Tieferer Einblick in die Funktionsweise: Navigation in ROS2