Roboter mit ROS. Murat Calis
stammen.
Abb. 1–6Viele Publisher, viele Topics und viele Subscriber
Der Befehl, der in ROS wohl am häufigsten benutzt wird, ist der zum Anzeigen der Topics.
rostopic list
Zum Abonnieren bzw. Ausgeben der Nachrichten in der Konsole verwenden wir echo.
rostopic echo /camera/image_raw
Für das Publizieren muss nicht gleich ein Node programmiert werden, denn der pub-Befehl erfüllt diese Funktion bereits in der Konsole. In nachfolgendem Befehl geht es um Nachrichten, die mit einer Rate -r in Hertz, also zehnmal in der Sekunde an das Topic mit der Bezeichnung /cmd_vel gesendet werden. Die publizierten Nachrichten enthalten dann Daten im Format geometry_msgs/Twist. Mehr Information darüber erfährt man mit rosmsg show geometry_msgs/Twist. Die beiden aufeinanderfolgenden Minussymbole ermöglichen negative Werteangaben. Ein Tupel beginnt immer mit einem einfachen hochgestellten Komma und muss damit auch beendet werden. Die Einheit für Fortbewegungen in einem Drei-Achsen-System wird von ROS in Meter pro Sekunde vorgegeben. Also bewirkt der folgende Befehl, dass sich das Fahrzeug mit 0,2 Meter/Sekunde auf der x-Achse rückwärts bewegt und mit 1,57 Radiant/ Sekunde gegen den Uhrzeigersinn dreht.
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist -- '{linear: {x: -0.2, y:
0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.57}}'
Nachrichten in der Konsole publizieren
Oft ist es nicht trivial, die grammatikalisch korrekte Schreibweise zum Publizieren von Nachrichten in der Konsole zu erahnen. Da wir bereits zuvor schon von der
1.2.7ROS-Messages
Zuvor haben wir von Nachrichten (engl. Messages) im Zusammenhang mit Nodes gesprochen. Sie sind die Datenströme, die zwischen zwei oder mehr Nodes transportiert werden. Messages werden in .msg-Dateien definiert. Dort steht der Datentyp mit Bezeichner. ROS unterstützt einfache Datentypen und mehrdimensionale Arrays, aus denen man komplexe Datenstrukturen konstruieren kann. Der Ordnername für Messagedateien lautet msg.
Messages fließen immer nur in eine Richtung. Um eine bidirektionale Kommunikation zwischen zwei Nodes zu etablieren, benötigt man ein Service oder eine Action.
Die Kompatibilität der ausgetauschten Nachrichten gewährleisten Subscriber durch Überprüfen der MD5-Quersumme, die aus der Nachrichtendefinition berechnet wird. Jeder Subscriber prüft also zuerst, ob die MD5-Quersumme korrekt ist, um dann die empfangenen Nachrichten zu verarbeiten.
Fehlerhafte Nachrichtenübertragung
Eine Fehlermeldung in der MD5-Quersumme kann auf eine inkompatible Nachrichtendefinition aus einer älteren ROS-Version hindeuten.
Detaillierte Auskunft über Nachrichtendefinitionen erhalten wir mit rosmsg. Schauen wir uns die weiter oben verwendete Nachrichtendefinition geometry_msgs/Twist etwas genauer an. Der Name ist aufgeteilt in Paket (geometry_msgs) und Format (Twist).
Die Einteilung in Namensräume dient hauptsächlich der Kollisionsvermeidung mit anderen identischen Formatnamen. Es kann also geometry_msgs/Twist und turtlebot/ Twist geben, die eine vermeintlich ähnliche Datenstruktur verkörpern.
Der folgende Befehl gibt eine solche Datenstruktur auf der Konsole aus. Wenn man nicht weiß, wie die Datentypbezeichnung lautet, kann man eine Linux-Pipe (das senkrechte |-Symbol wird mit
rosmsg show geometry_msgs/Twist
rostopic type /cmd_vel | rosmsg show
Abb. 1–7Datenformate ausgeben mit rosmsg show.
Nachrichten, die an cmd_vel gesendet werden, enthalten eine Zusammensetzung aus zwei Vektoren. Im ersten Vektor, bestehend aus drei Fließkommazahlen, definiert man die lineare Geradeaus-Richtung. Der zweite Vektor, ebenfalls zusammengesetzt aus drei Fließkommazahlen, definiert die angulare Drehrichtung.
Die Vector3-Definition repräsentiert eine Richtung im freien Raum. Mit ihr kann man eine Beschleunigungsangabe in x-, y- und z-Richtung machen. Eine Drehbeschleunigung in die gewünschte Richtung wird anhand der Achsendrehung um x, y oder z angegeben.
ROS-Koordinatensystem
Es gilt die Rechte-Hand-Regel, wobei Folgendes zu beachten ist. Der Zeigefinger zeigt in x-, der Mittelfinger in y- und der Daumen in z-Richtung. Der Drehsinn läuft gegen den Uhrzeiger. Die Maßeinheit für Geschwindigkeit in x-, y- oder z-Richtung ist Meter/Sekunde und bei der Drehung ist es Radiant/Sekunde.
Solange es geht, verwenden wir in ROS vorhandene Nachrichtendefinitionen, um unnötige Arbeit und Redundanz zu vermeiden.
Um in Ubuntu herauszufinden, welche Nachrichtendefinitionen von welchen Paketen zur Verfügung gestellt werden, sucht man mittels »dpkg -l |grep msgs« alle Kandidaten ab. Die Trefferliste liefert meist eine Beschreibung der Nachrichtendefinitionen und deren Verwendung mit.
Wer eigene Nachrichtendefinitionen erstellen möchte, dem empfehle ich, zunächst das ROS-Tutorial zu besuchen, um eine Anleitung parat zu haben (http://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrv).
1.2.8ROS-Services
Ein erweitertes Kommunikationskonzept in ROS sind Services. Vergleichbar mit Diensten arbeiten sie im Gegensatz zu Messages bidirektional. Man hat es also nicht mit einem Datenstrom zu tun, der in nur eine Richtung fließt, vielmehr ist es ein Frage-Antwort-Mechanismus (engl. Request-Response). Ein Node übernimmt die Server-Funktion, also Service, und am anderen Ende nutzt ein Client verfügbare Service-Leistungen.
Services werden in .srv-Dateien definiert, ähnlich wie Messages, nur dass zusätzlich ein Bereich für die Antwort vom Service definiert werden muss. Der Antwortbereich ist durch drei Bindestriche vom Anfragebereich abgetrennt. Der Ordnername für Servicedateien lautet srv. Die verwendbaren Datentypen sind dieselben, die in Messages verwendet werden können. Im Internet finden wir diese Datentypen in einer tabellarischen Übersicht unter http://wiki.ros.org/msg.
Wer eigene .srv-Dateien verwenden möchte, muss diese zunächst mit catkin_make in Klassendateien umwandeln lassen. Erst dann können die Servicedefinitionen in eigene Programme als Header bzw. Bibliotheken eingebunden und verwendet werden. Insgesamt berührt man die Dateien CMakeLists.txt, package.xml und die .srv-Datei, bevor man eine eigene Servicedefinition überhaupt verwenden kann. Ein ROS-Tutorial beschreibt die benötigten Schritte auf folgender Website: http://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrv.
Services