6. Robot Operating System

Das Robot Operating System (ROS) ist ein flexibles Framework für die Entwicklung von Robotersoftware. Es wurde ursprünglich von Willow Garage entwickelt und ist mittlerweile eine Open-Source-Plattform, die von einer großen Community unterstützt wird. ROS bietet eine Sammlung von Tools, Bibliotheken und Konventionen, die das Erstellen von komplexen und robusten Robotikanwendungen erleichtern.

6.1. Distributionen

Es gibt mehrere ROS Distributionen.

ROS Noetic Ninjemys

  • Vorteile:
    • LTS bis Mai 2025

    • Unterstützung für Ubuntu 20.04 und Debian Buster

    • Stabilität

  • Nachteile:
    • Veraltete Bibliotheken

    • Begrenzte neue Features

  • Anwendungsfälle:
    • Langfristige Projekte, die Stabilität erfordern

    • Systeme, die auf bewährten Technologien basieren

ROS 2 Humble Hawksbill

  • Vorteile:
    • LTS bis Mai 2027

    • Verbesserte Middleware (DDS für bessere Kommunikation und Skalierbarkeit)

    • Sicherheitsfunktionen

  • Nachteile:
    • Neuere Softwarebasis (ggf. weniger stabil)

    • Steilere Lernkurve: Neue API und Paradigmen im Vergleich zu ROS 1

  • Anwendungsfälle:
    • Projekte, die erweiterte Funktionen, Sicherheit und Echtzeitfähigkeit erfordern

    • Roboter in dynamischen und vernetzten Umgebungen

ROS 2 Iron Irwini

  • Vorteile:
    • Enthält neueste Entwicklungen und Verbesserungen

    • Community Support

    • Zukunftsicher

  • Nachteile:
    • Nicht LTS

    • Stabilität

  • Anwendungsfälle:
    • Forschung und Entwicklung, die auf neuesten Technologien angewiesen sind

    • Kurzfristige Projekte oder Prototypen

[ROS2_Website]

6.2. Grundkonzepte von ROS2

Nodes: In ROS ist ein Node ein Prozess, der eine Aufgabe ausführt. Roboteranwendungen bestehen oft aus vielen Nodes, die miteinander kommunizieren. Ein Node könnte beispielsweise ein Kameramodul steuern, während ein anderer Node die Bilddaten verarbeitet.

Topics: Nodes kommunizieren miteinander durch das Veröffentlichen und Abonnieren von Nachrichten auf Topics. Ein Topic ist ein benannter Bus, über den Nodes Nachrichten senden und empfangen können. Beispiel: Ein Kameranode könnte Bilddaten auf dem Topic /camera/image_raw veröffentlichen, während ein Bildverarbeitungsnode dieses Topic abonniert und die Bilddaten verarbeitet.

Messages: Die Daten, die zwischen Nodes über Topics ausgetauscht werden, werden in Form von Nachrichten (Messages) übertragen. Nachrichten haben eine definierte Struktur, die aus einer Sammlung von Feldern besteht.

Services: Neben der asynchronen Kommunikation über Topics ermöglicht ROS auch die synchrone Kommunikation mittels Services. Ein Service besteht aus einem Anfrage-Nachrichtentyp und einem Antwort-Nachrichtentyp. Ein Node kann einen Service anbieten, während ein anderer Node diesen Service aufrufen kann.

Actions: Für längere Aufgaben, die eine Rückmeldung während der Ausführung erfordern, bietet ROS das ActionLib-Framework. Aktionen sind ähnlich wie Services, aber sie bieten die Möglichkeit, Fortschritts-Updates und Zwischenziele zu senden.

Packages: ROS-Software wird in Packages organisiert. Ein Package enthält ROS-Nodes, Bibliotheken, Konfigurationsdateien und alles andere, was zur Ausführung einer spezifischen Funktion benötigt wird. Ein Package kann auch andere Packages als Abhängigkeiten haben.

[ROS2_Website]

6.3. Beispielprojekt: Subsumptionsarchitektur mit ROS2 Turtles

Als Übungsprojekt bzw. -Aufgabe zum Erlernen der grundlegenden ROS2 Features wurde uns empfohlen, die Subsumptionsarchitektur eines Roboters mithilfe von ROS2 Turtles zu implementieren.

6.3.1. Subsumptionsarchitektur

Die Subsumptionsarchitektur ist eine parallele, reaktive Roboterarchitektur, die Verhaltensweisen in hierarchischen Schichten organisiert, wobei höhere Ebenen die Kontrolle über niedrigere Ebenen ausüben können. Dabei steht jede Schicht steht für eine Gruppe von Verhaltensweisen und kann autonom auf Sensorinputs reagieren. Höhere Schichten in der Hierarchie können die Aktionen niedrigerer Schichten unterdrücken. Dabei verhindern verhindern Inhibitoren das Eingehen von Nachrichten und Suppressoren ermöglichen das Unterdrücken von Ausgangsnachrichten.

[SubSumWikpedia]

Dieses System lässt sich dem nachfolgenden Bild mit einem Beispiel für eine Subsumptionsarchitektur veranschaulichen:

Subsumptionsarchitektur

Im abgebildeten Beispiel gehen alle Aktionen von den Daten der Sensoren aus, mit denen der Roboter sensorische Informationen aus seiner Umgebung erfasst.Wenn der Roboter ein Objekt erkennt, führt er eine Inspektion durch. Dies könnte bedeuten, dass er näher herangeht, um Details zu erkennen. Falls der Roboter auf ein Hindernis stößt, weicht er aus, um eine Kollision zu vermeiden. Wenn keine spezifischen Objekte erkannt werden und keine Kollision droht, bewegt sich der Roboter einfach weiter. Das Umherwandern ist sozusagen die Default-Aktion. Am Ende setzen die Aktuatoren die Aktionen des Roboters um, z. B. die Bewegung der Räder oder Arme.

6.3.2. turtlesim Package

Das turtlesim Package ist ein beliebtes Einstiegstool in das Robot Operating System (ROS), das speziell für Lernzwecke entwickelt wurde. Es bietet eine einfache Simulationsumgebung, in der Nutzer grundlegende ROS-Konzepte und -Befehle erlernen und ausprobieren können. Das Package simuliert Schildkröten in einem zweidimensionalen Raum, die durch verschiedene Befehle gesteuert werden kann. Mit turtlesim können die Funktionsweise von ROS-Nodes, Topics, Services und Nachrichtenformaten auf eine anschauliche und interaktive Weise ausprobiert werden. Somit eine ideale Umgebung, um die Grundlagen von ROS zu erlernen und erste praktische Erfahrungen zu sammeln, bevor man zu komplexeren Robotikanwendungen übergeht. Die Funktionalität wird im Wesentlichen durch zwei Nodes bereitgestellt:

  1. turtlesim_node: Diese Node simuliert die Schildkröte in einer zweidimensionalen Umgebung. Es stellt die grafische Oberfläche bereit und ermöglicht die Bewegung der Schildkröte durch empfangene Befehle.

  2. turtle_teleop_key: Diese Node ermöglicht die Steuerung der Schildkröte über die Tastatur. Es liest Tastatureingaben ein und sendet entsprechende Bewegungsbefehle, die in der turtlesim_node verarbeitet werden.

[Turtlesim]

6.3.3. Erstellung des Packages

Um das turtlesim Package zu benutzen, muss natürlich zunächst ROS2 installiert werden. Wie bereits erwähnt, gibt es mehrere ROS2 Distributionen. Für ROS2 wird aktuell Humble Hawskbill empfohlen, da diese Distribution am Längsten unterstützt wird und noch Support bis Mai 2027 erhält. ROS2 wird unter anderem auf Windows, MacOS oder verschiedenen Linux Betriebssystemen unterstützt. Empfohlen wird aber ein Linux Betriebssystem, speziell Ubuntu 22.04. Auf der offiziellen ROS2 Website wird die Installation wie folgt für Ubuntu (Debian packages) empfohlen:

  1. Zunächst muss UTF-8 Support aktiviert werden:

locale  # UTF-8 Check

sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8

locale  # Einstellungen überprüfen
  1. Danach werden die verschiedenen Quellen der Packages zum System hinzugefügt:

# Ubuntu Universe Repository aktivieren
sudo apt install software-properties-common
sudo add-apt-repository universe

# ROS2 GPG Keys hinzufügen
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

# Repositories zur Liste der Quellen hinzufügen
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
  1. Installation:

sudo apt update
sudo apt upgrade

# Desktop-Version installieren (inkl. ROS, RViz, Demos, Tutorials)
sudo apt install ros-humble-desktop

# Alternativ: Nur benötigte Dateien installieren, benötigt weniger Speicherplatz
sudo apt install ros-humble-ros-base

# Entwickler-Tools: Kompiler und andere Tools zum kompilieren von Packages
sudo apt install ros-dev-tools
  1. Konsole sourcen: Um ROS2 Befehle auszuführen, muss die Konsole immer die ROS Distribution aktiviert haben. Deshalb muss bei jedem neuen Terminal folgender Befehl ausgeführt werden:

source /opt/ros/humble/setup.bash

Am Besten fügt man diesen Befehl z.B. der .bashrc hinzu, damit man den Befehl automatisch beim Erstellen eines neuen Terminals ausführen kann.

Nach der Installation muss zunächst ein Workspace für ROS2 erstellt werden, wo die verschiedenen Projekte gespeichert, installiert und entwickelt werden. Colcon wird dabei verwendet um die verschiedenen Packages und Projekte zu kompilieren. Ein Workspace erstellt man mit:

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build

Nach dem ersten Kompilieren der Packages kann man das Turtle-Sim Package wie folgt installieren:

sudo apt update
sudo apt install ros-humble-turtlesim

[ROS2_Installation]

6.3.4. Implementierung einer einfachen Subsumptionsarchitektur

Das Ziel soll es sein, die Schildkröte zufällig umherwandern zu lassen und dieses Verhalten durch manuelle Steuerung mit der Tastatur zu unterbrechen. Die Klasse TurtleController in unserem Python-Code steuert das Verhalten einer virtuellen Schildkröte.

Im Konstruktur der Klasse wird eine ROS2 Node erstellt, welche die Steuerung der Schildkröte übernimmt:

class TurtleController(Node):
   def __init__(self):
      super().__init__('turtle_controller')
      self.publisher = self.create_publisher(Twist, '/turtle1/cmd_vel', 10)
      self.subscription = self.create_subscription(String, 'turtle_teleop_key/cmd_key', self.suppress_callback, 10)
      self.suppress_random_walk = False
      timer_period = 0.5
      self.timer = self.create_timer(timer_period, self.random_walk)

Der publisher richtet einen Kommunikationskanal ein, über den Bewegungsbefehle (Geschwindigkeit und Richtung) an die Schildkröte gesendet werden. Diese Befehle werden an das sogenannte Topic /turtle1/cmd_vel gesendet. Mittels subscription wird ein Kanal eingerichtet, um Tastatureingaben zu empfangen. Diese Eingaben kommen von der turtle_teleop_key Node, die Tastenanschläge erfasst und als Nachrichten an das Topic turtle_teleop_key/cmd_key sendet. Wenn eine Nachricht empfangen wird, wird die Methode suppress_callback aufgerufen. Abschließend wird ein Timer erstellt, der alle 0,5 Sekunden die Methode random_walk aufruft. Diese Methode steuert das zufällige Umherwandern der Schildkröte.

Die Methode suppress_callback wird aufgerufen, wenn eine Nachricht empfangen wird. Sie setzt den Wert von suppress_random_walk auf True, um das zufällige Umherwandern zu unterbrechen.

def suppress_callback(self, msg):
     if msg.data:
         self.suppress_random_walk = True

Das zufällige Umherwandern wird durch die Methode random_walk gesteuert. Diese Methode generiert zufällige Bewegungsbefehle für die Schildkröte, solange suppress_random_walk nicht gesetzt ist. Dazu wird eine zufällige lineare Geschwindigkeit und eine zufällige Winkelgeschwindigkeit erzeugt und als Twist-Nachricht veröffentlicht. Diese bestimmen die Geschwindigkeit und Richtung, mit der sich die Schildkröte bewegen soll.

def random_walk(self):
     if not self.suppress_random_walk:
         twist = Twist()
         twist.linear.x = random.uniform(0, 1)
         twist.angular.z = random.uniform(-1, 1)
         self.publisher.publish(twist)

Ebenfalls benötigt wird eine main-Methode, die die ROS 2-Clientbibliothek initialisiert, eine TurtleController-Node erstellt und diese in einer Schleife am Laufen hält, damit Nachrichten gesendet und empfangen werden können. Bei Programmende wird die Node explizit zerstört und die ROS 2-Clientbibliothek sauber beendet.

6.3.5. Starten der Simulation

Nach dem builden des Packages kann die Simulation gestartet werden. Dazu werden drei Terminals benötigt und zunächst die turtlesim_node gestartet, sowie die turtle_teleop_key Node. Dies funtkioniert mittels:

# Terminal 1
ros2 run turtlesim turtlesim_node
# Terminal 2
ros2 run turtlesim turtle_teleop_key

Anschließend wird in einem weiteren Terminal die neu geschriebene turtle_controller-Node gestartet, die die Schildkröte steuert.

# Terminal 3
ros2 run turtle_sim_random turtle_controller

Nun kann die Schildkröte zufällig umherwandern. Wenn eine der Pfeiltasten gedrückt wird, wird das zufällige Umherwandern unterbrochen und die Schildkröte bewegt sich in die entsprechende Richtung. Hier ein Video der Simulation:

6.4. Literaturangaben

[SubSumWikpedia]

Subsumptionsarchitektur Wikipedia (EN) https://en.wikipedia.org/wiki/Subsumption_architecture (abgerufen am 06.06.2024)

[ROS2_Website] (1,2)

ROS 2 Website https://www.ros.org/blog/getting-started/ (abgerufen am 07.06.2024)