ROS Crashkurs 002
Heute soll es um die wichtigen Grundbegriffe gehen. Was ist ein Package, Node, der ROS-Master ein Publisher, ein Subscriber, eine Topic und eine Message. Wie hängt das alles zusammen und wie kann man das hübsch visualisieren?
Schau dir das Video zu dem Tutorial hier oder ganz unten auf der Seite an! Abonnier meinen Kanal, um kein Tutorial mehr zu verpassen
Du hast ROS noch nicht installiert? Oder hast noch nie etwas vom catkin-Workspace gehört? Dann lies dir vielleicht erstmal das vorherige Tutorial durch: Das Robot Operating System
Grundbegriffe
Workspace und Nodes
Ein catkin-Workspace ist eine Sammlung von verschiedenen ROS-Paketen (Packages), die du heruntergeladen oder selbst erstellt haben kannst. Navigierst du innerhalb deines Workspaces in den src-Ordner, findest du all diese Pakete als eigene Ordner. Wenn du bereits einige Pakete heruntergeladen hast, sollte der Inhalt dieses Ordners etwa so aussehen.

Innerhalb der einzelnen Pakete finden sich wiederum weitere Ordner und Dateien, die wir uns im Folgenden genauer anschauen werden. Hierin finden sich dann die ROS-Programme, die sogenannten Nodes. Bevor wir nun unsere ersten Nodes starten oder selbst erstellen, müssen wir uns jedoch noch mit ein paar anderen Konzepten befassen.
ROS-Master
Startet mal einen ROS-Master, indem ihr in einem neuen Terminal roscore
eintippt. Der ROS-Master verwaltet all eure laufenden ROS-Programme (ROS-Nodes) und dient dabei ein wenig wie euer WLAN-Router zu Hause. Wird ein neuer Node gestartet, meldet er sich beim ROS-Master an.
Und an dieser Stelle wird es interessant: Mit Hilfe von ROS ist es euch nämlich sehr einfach möglich, Nachrichten zwischen verschiedenen Programmen (Nodes) auszutauschen. Und das ist auch sehr wichtig. Wenn ihr mit ROS arbeitet, baut ihr euer System in einzelnen Modulen auf. Stellen wir uns mal ein Beispiel vor:
Ihr habt einen Roboter, dessen Motoren Befehle empfangen sollen, die von einem ganz anderen Modul, einer Robotersteuerung berechnet werden (oder manuell mit einem Controller "erstellt" werden). Und dieses Modul bezieht vielleicht sogar Daten von der Kamera des Roboters. Auch für das Auslesen der Kameradaten gibt es wieder einen eigenen Node. Ich habe das mal skizziert:

Publisher- und Subscriber-Nodes
Wie kommunizieren die Nodes nun in unserem Netzwerk an Nodes miteinander? Jeder Node kann bestimmte Daten senden (dann nennen wir ihn Publisher) und/oder empfangen (dann nennen wir ihn Subscriber). Dabei ist es unwichtig, ob die Verbindung per Kabel, per WLAN oder per was auch immer aufgebaut wurde. Diese Daten sind immer in ROS-Messages (Nachrichten) eines bestimmten Typs (Messagetypes) organisiert. Alle Daten werden über Nachrichtenkanäle, die sogenannten Topics gesendet. Jeder Node kann Daten an beliebige Topics senden und von beliebigen Topics empfangen. Und ja, es können auch verschiedene Nodes Daten an die gleiche Topic senden oder aus der gleichen Topic lesen.
Hier kommt der ROS-Master jetzt ins Spiel. Dieser teilt einem Node mit, welche anderen Nodes die Daten senden, die unser neue Node braucht oder wohin unser neuer Node seine Daten senden soll. Starten wir beispielsweise die Robotersteuerung, nachdem unser ROS-Master gestartet wurde und der Roboter bereits aktiviert und beim ROS-Master registriert ist, könnte dieser Teil unseres Schaubildes im Detail so aussehen:

Der Robotersteuerungs-Node ist ein Publisher, der Daten vom Typ Arm-Data in eine Topic namens /robot_arm_topic sendet. Der ROS-Master kennt bereits den Roboterarm-Node, der auf diese Topic subscribt. Er "verbindet beide Nodes" und sorgt dafür, dass ab sofort alle von der Robotersteuerung gesendeten Befehle bei den Roboterarmen ankommen.
Kurz und bündig
Zusammenfassend ist ein ROS-System ein Hybrid aus einem klassischen Client-Server-System und einer völlig dezentralisierten Architektur. Der ROS-Master arbeitet ähnlich wie das Domain Name System (DNS) in IP-basierten Netzwerken. Topics sind der Daten-Bus, über welchen es möglich ist, Messages zwischen Nodes auszutauschen. Topics ermöglichen eine asynchrone Kommunikation zwischen verschiedenen Nodes. Über synchrone Kommunikation, Services und Actions schreibe ich in einem anderen Tutorial.
ROS-Software ist in Packages in Workspaces organisiert. Und in diesen Paketen finden sich unsere Programme, unsere Nodes, die wir dann im nächsten Tutorial mal programmieren.
Wichtige Befehle und Tools
Habt ihr einen ROS-Master (mit dem Befehl roscore
) gestartet oder sogar noch weitere Nodes "an", könnt ihr mit folgendem Befehl eine Übersicht aller aktiven Nodes bekommmen. Mit dem Starten des ROS-Masters startet automatisch der Node /rosout
, der zum Loggen von allem, was in eurem Netz so passiert, dient.
rosnode list
Um einen genaueren Blick auf zum Beispiel den /rosout
-Node zu werfen, tippt:
rosnode info /rosout
Euch wird angezeigt auf welche Topics der entsprechende Node subscribed und in welche Topics er Daten published1
Wollt ihr sehen, welche Topics es gerade in eurem ROS-Netzwerk gibt, tippt:
rostopic list
Analog zu den Nodes könnt ihr Informationen zu einer Topic (zum Beispiel zu /rosout
) bekommen, indem ihr diesen Befehl nutzt:
rostopic info /rosout
Turtlesim
Um die grundlegenden Konzepte von ROS zu lernen, nutze ich im folgenden die Simulation eines kleinen Schildkrötenroboters: Die Turtlesim
Installation
Zuerst installieren wir die Simulation auf unserem Rechner. Hier nochmal der Hinweis: Wenn ihr eine andere ROS-Version verwenden solltet, ersetzt bei der Paketinstallation immer das noetic durch eure jeweilige Version. Da das Video zu diesem Tutorial schon etwas älter ist, lade ich dort zum Beispiel die Simulation für ROS Melodic herunter. Lasst euch davon nicht irritieren.
sudo apt-get install ros-noetic-turtlesim
rospack, rosrun
Wollt ihr wissen, wo ROS die Pakete installiert hat, könnt ihr mit rospack find
an den Installationsort navigieren.
Weiter gehts. Ohne ROS-Master geht nicht, also an mit ihm:
roscore
Jetzt wollen wir die Simulation starten. Die liegt in einem eigenen Node. Wie starten wir einen Node? Mit rosrun
, dahinter der Paketname, dahinter der Name des Nodes, den wir starten wollen. Also zum Beispiel:
rosrun turtlesim äh moment wie hieß jetzt der Node noch genau...
Nutzt das Autocomplete-Feature (Doppelt TAB drücken) und lasst euch alle Möglichkeiten anzeigen. Wir wollen den turtlesim_node nutzen. Gebt Folgenden Befehl ein und die Simulation startet:
rosrun turtlesim turtlesim_node
Eine Schildkröte erwacht zum Leben
Jetzt solltet ihr euren ersten Roboter innerhalb eines neuen Fensters sehen. In dem Terminal, in dem ihr die Simulation gestartet habt, teilt euch der Node seinen aktuellen Status und andere wichtige Mitteilungen mit. Habt daher immer mal ein Auge auf das Terminal.

Schaut ihr jetzt mit rosnode und rostopic
mal, was gerade alles so in eurem ROS-Netzwerk abgeht, solltet ihr endlich mal etwas mehr sehen.
So gibt es beispielsweise die /turtle1/cmd_vel
-Topic. Diese Topic enthält Nachrichten vom Typ Twist. Ein Twist setzt sich zusammen aus einer Position und einer Rotation2. Damit endlich mal etwas passiert, starten wir in einem neuen Terminal mal einen anderen Node aus dem turtlesim-Paket:
rosrun turtlesim turtle_teleop_key
Drückt nun mal die Pfeiltasten! Und schwupps, euer Schildkrötenroboter erwacht zum Leben. Was passiert im Hintergrund? Der neue Node /turtle_teleop_key
aus dem Paket turtlesim registriert sich beim ROS-Master. Dieser weiß, dass der Node /turtlesim_node
aus dem Paket turtlesim ein Subscriber für Twist-Nachrichten ist. Das heißt dieser Node braucht genau die Daten, die der Tastatursteuerungsnode sendet. Der ROS-Master etabliert die Verbindung und schon kann die Schildkröte sich bewegen.
Was passiert da im Hintergrund?
Schauen wir uns noch einen weiteren sehr nützlichen Befehl an (startet auch den wieder in einem neuen Terminal:
rostopic echo /turtle1/pose
Bewegen wir nun die Schildkröte (Achtung: Ihr müsst den Fokus auf dem Terminal mit dem Tastatursteuerungnode haben, damit ihr die Schildkröte befehligen könnt) seht ihr in dem neuen Terminal die aktuelle Pose der Schildkröte. Mit rostopic echo
schaut ihr immer direkt in eine Topic rein (Ihr erstellt eigentlich einen Subscriber, der dann die Daten abgreift und ausgibt, aber...)
Diesen Befehl werdet ihr sicherlich nochmal brauchen, glaubt mir. Probiert doch einfach mal ein wenig mit den Befehlen rum, die ihr nun kennengelernt habt. Scheut euch nicht eure Fragen in die Kommentare zu schreiben.
Wollt ihr mal manuell eine Nachricht an eine Topic senden, könnt ihr das mit folgendem Befehl machen:
rostopic pub /turtle1/cmd_vel und was muss hier jetzt hin???
Nutzt Autocomplete! Ruhig schon nach den ersten Buchstaben des Topicnamens. Dann nochmal, nachdem die vollständige Topic da steht, um den entsprechenden Typen automatisch angeben zu lassen und dann nochmal, um eine "leere Nachricht" zu generieren, bei der ihr nur noch die Werte ändern müsst. Hier soll sich die Schildkröte 2 Einheiten in x-Richtung bewegen und 1 (in Radiant) um die z-Achse (die Hochachse) drehen. Der vollständige Befehl sollte dann in etwa so aussehen:
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 1.0
rqt
Sprechen wir zum Abschluss dieses Tutorials noch über ein sehr nützliches Tool, dass uns ROS zur Verfügung stellt: rqt
Startet rqt:
rqt
Jetzt könnt ihr über das Menü Plugins viele verschiedene Plugins in eure rqt-Oberfläche hinzufügen. Wählt doch zum Beispiel mal Introspection -> Node Graph aus und ihr seht einen vollständigen Überblick über euer gesamtes ROS-Netzwerk. Gerade bei komplexeren Systemen äußerst hilfreich. Bei euch sollte der Graph in etwa so aussehen:

Als zweites Plugin fügen wir mal einen Visualization -> Plot ein. In diesem Plot müssen wir nun eine Topic eingeben, die wir visualisieren wollen. Versucht mal /turtle1/pose/x
und /turtle1/pose/y
. Dabei ist /turtle1/pose
der Name unserer Topic und x und y sind einzelne Elemente daraus. Ihr werdet nun sehen, dass die x und y-Koordinate unserer Schildkröte in einem Plot ständig aktualisiert dargestellt werden.

Gute Arbeit. Klickt euch doch nochmal durch die Plugins und schaut ein wenig, was es sonst noch alles gibt.
Zusammenfassung
Jetzt kennst du die wichtigsten Grundbegriffe von ROS und solltest wissen, wie ein ROS-Netzwerk aufgebaut ist. Damit bist du sehr gut gerüstet auf deiner Reise zum ROS-Meister (na, jetzt verstanden...)
Schau dir gerne auch das Video an, in dem ich den gesamten hier vorgestellten Installationsprozess noch einmal erkläre und noch auf ein paar weitere Details eingehe.
Hier gehts zum nächsten Tutorial: Unser erstes Programm in C++, Turtlesim
Für Fragen und Diskussionen über das Robot Operating System hier ein Link zu einem Discord-Server, auf dem wir gemeinsam über eure Ideen und Herausforderungen sprechen können: https://discord.gg/Qs4MZT2n63
Unterstützt mich und gönnt mir einen Kaffee, sodass ich auch schneller eine neue Folge aufnehme 😉 : https://paypal.me/maxivu ROS Introduction: http://wiki.ros.org/de/ROS/Introduction
Über ROS: https://www.ros.org/about-ros/
ROS Installation: http://wiki.ros.org/melodic/Installation/Ubuntu Für Fragen und Antworten zu ROS: https://answers.ros.org/questions/