Einführung in das Robot Operating System

Nachrichten & Fazit

Strukturierte Nachrichten

Die Kommunikation zwischen den Knoten findet über sogenannte Messages statt. Eine Nachricht besteht aus typisierten Einträgen und hat Ähnlichkeiten mit einer C-Struktur. Das System unterstützt verschiedene Basisdatentypen, Felder und Verschachtelungen der Einträge.

Folgender Eintrag zeigt die Struktur des ROS-Datentyps geometry_msgs/Point unter Einsatz des Werkzeugs rosmsg:

$ rosmsg show geometry_msgs/Point 
float64 x
float64 y
float64 z

Der Zugriff auf die Elemente der Message erfolgt folgendermaßen:

#include <geometry_msgs/Point.h>
...
geometry_msgs::Point msg;
...
msg.x = 1.0;
msg.y = 2.0;
msg.z = 3.0;
...
point_publisher.publish(msg);


Entwickler können eigene Nachrichten durch Textdateien mit der Endung ".msg" spezifizieren. Die jeweilige ROS-Client-Bibliothek enthält Codegeneratoren, die aus den .msg-Dateien beim Build-Vorgang Code für die jeweilige Zielsprache erzeugen.

Eindeutige Themen

Topic (Thema) bezeichnet in ROS einen mit einem eindeutigen Namen versehenen Datenbus. Der Name ermöglicht den Nodes (unter Einbeziehung des Master) das Auffinden ihrer Kommunikationspartner für den Austausch von Nachrichten zur Laufzeit. Das Erzeugen der Daten ist vom Verbrauch entkoppelt (Producer/Consumer-Pattern). Datensenken (Knoten, die Nachrichten empfangen) greifen auf Daten eines abonnierten Themas zu. Datenquellen (Knoten, die Nachrichten versenden) publizieren Daten zu einem Topic.

Zu einem Thema kann es mehrere Datensenken, aber nur eine Datenquelle geben (1-1- oder 1-n-Verbindung). Dieser Nachrichtenaustauschmechanismus ist für die unidirektionale Kommunikation vorgesehen. Einen Überblick über alle Themen, zu denen es zum Zeitpunkt des Aufrufs sowohl Datenquellen als auch Datensenken gibt, listet das Werkzeug rostopic auf:

$ rostopic list
/point
/rosout
...

Eine weitere nützliche Funktion des Werkzeugs ist die Anzeige der zu einem Topic publizierten Messages:

$ rostopic echo /point 
x: -1.0
y: 0.0
z: 0.0
---
x: -2.0
y: 0.0
z: 0.0
---
...

Dienst für Nachrichtenpaare

Services ermöglichen bidirektionale Kommunikation in der Form von Request/Response-Nachrichten zwischen verschiedenen Nodes, während Topics nur für den unidirektionalen Datenaustausch zum Einsatz kommen. Ein Service besteht immer aus einem Nachrichtenpaar, das die Struktur der Request- und Response-Nachricht definiert:

uint32 opA
uint32 opB
---
uint32 result


Wie die Topics identifiziert den Service eines Knoten ein eindeutiger Name. Der Aufruf des Service erfolgt, indem ein Service-Client-Node eine Request-Nachricht (bestehend aus opA und opB) an den Service-Server-Node verschickt.

Anforderung der Durchführung einer Addition vom /service_server_node (Service Request) (Abb. 5)

Letzterer führt die gewünschte Operation aus und antwortet mit der Response-Nachricht, die das gewünschte Ergebnis (result) enthält.

Rückgabe des Ergebnisses der Addition an den /service_client_node (Service Response) (Abb. 6)

ROS-Client-Bibliotheken abstrahieren die Interknotenkommunikation vom Programmierer und stellen den Vorgang wie einen Remote Procedure Call dar.

Fazit

ROS vereinfacht die Softwareentwicklung für komplexe autonome Systeme, indem es voneinander unabhängige Rechenprozesse in verschiedene Knoten aufteilt. Die Prozesse laufen parallel und kommunizieren über Peer-To-Peer-Mechanismen miteinander.

Die Vorgehensweise eignet sich gut für die Modellierung autonomer Systeme, da die Repräsentation durch Knoten den Gegebenheiten in einem solchen System sehr ähnlich ist. Eine umfangreiche Werkzeugpalette ermöglicht das schnelle Auffinden von Fehlern und erleichtert die Arbeit mit ROS erheblich. (rme)

Alexander Entinger
ist Gründer und Geschäftsführer der LXRobotics GmbH. Gleichzeitig ist er als Softwareentwickler für eingebettete Systeme bei der Firma DS Automotion tätig und betreut das Studentenprojekt RoboCupRescue an der Fachhochschule Hagenberg, bei dem ein Rettungsroboter für den Einsatz in Katastrophenszenarien entwickelt wird.