Grundbegriffe/Tools und Schildkröten

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.

Pakete (Packages) im src-Ordner des catkin Workspaces beinhalten Nodes
So sieht derzeit der Inhalt des src-Ordners meines Workspaces aus.

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:

Die Kameradaten des Roboters werden von einem Kameraauslesungsmodul ausgewertet und an die Robotersteuerung weitergegeben. Damit lassen sich Befehle für die Motoren berechnen.
Die Kameradaten des Roboters werden von einem Kameraauslesungsmodul ausgewertet und an die Robotersteuerung weitergegeben. Damit lassen sich Befehle für die Motoren berechnen.

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:

Robotersteuerung und Roboterarme, verknüpft über den ROS Master
Nachdem sich Nodes beim ROS-Master registriert haben, können diese peer-to-peer kommunizieren.

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.

Schildkröte auf blauem Grund, Turtlesim
Eine kleine Schildkröte mit außergewöhnlichen Fähigkeiten

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:

Der teleop_turtle Node sendet Nachrichten über die Topic /turtle1/cmd_vel an den /turtlesim-Node
Der teleop_turtle Node sendet Nachrichten über die Topic /turtle1/cmd_vel an den /turtlesim-Node

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.

Plot, der die aktuelle Pose des Roboters (der Schildkröte) anzeigt
Plot, der die aktuelle Pose des Roboters (der Schildkröte) anzeigt

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/

  1. Wenn ihr genau wissen wollt, was der /rosout-Node macht, schaut hier nach.
  2. Hier die Dokumentation für alle Interessierten: Twist

Leave a comment



Mark

2 Jahren ago

Thanks for your blog, nice to read. Do not stop.

Copyright 2017 maximilian von unwerth © All Rights Reserved