Arduino und rosserial

ROS Crashkurs 012

Für die Ansteuerung von echter Hardware mit ROS gibt es rosserial, das als Schnittstelle zwischen unserem PC und einem Arduino dient. Bevor wir einen Motor antreiben oder Sensoren auslesen, sehen wir aber erstmal, wie rosserial funktioniert: Mit einer simplen LED.

Schau dir das Video zu dem Tutorial hier oder ganz unten auf der Seite an! Abonnier meinen Kanal, um kein Tutorial mehr zu verpassen

Arduino und ROS

Verpassen wir unserem Roboter mal sein Hirn, seinen Hauptcomputer. Dafür nehmen wir uns einen Arduino Uno, den wir über rosserial ansteuern.

Um Motoren, LEDs, Sensoren,... mit ROS zu verbinden, ist der einfachste und schnellste Weg Folgender: Wir nehmen einen Arduino zur Hand, der sich um die Ansteuerung der Hardware kümmert und kommunizieren mit ihm über einen gewöhnlichen PC, auf dem wir ROS laufen haben. Den Arduino verbinden wir über USB mit unserem Computer. ROS übernimmt dann die Kommunikation zwischen den beiden Geräten, wobei Arduino und der Computer (im Folgenden Operator) als einzelner ROS-Node in unserem Netzwerk fungieren.

Wer keinen Arduino zur Hand hat, kann zum Beispiel hier einen erwerben. Ein günstigerer Arduino-Klon sollte aber wohl auch funktionieren.

Arduino angesteckt an den PC
Der Arduino wird über USB mit dem PC verbunden

Arduino vorbereiten

Zuerst laden wir uns die aktuelle Version der Arduino IDE von der offiziellen Website herunter. Achtet darauf, dass ihr die richtige Version für euer jeweiliges Betriebssystem wählt. In der Installationsdatei für Linux / Ubuntu findet ihr einen Ordner mit einer Datei install.sh, die ihr einmal über ein Terminal ausführen müsst, um die Entwicklungsumgebung zu installieren. Startet ihr nun über eure Programmübersicht die Arduino IDE, wird euch eine Meldung angezeigt werden, dass euer aktueller Benutzer zu der Gruppe dialout hinzugefügt werden sollte. Da wir über den USB-Port unseres Rechner mit dem Arduino reden wollen, ist dieser Schritt notwendig. Startet danach am besten einmal euren PC neu.

Falls ihr die Arduino IDE über euer Terminal mit Hilfe von apt installiert haben solltet, kann es passieren, dass eine Fehlermeldung euch mitteilt, dass nullptr nicht gefunden wurde. Deinstalliert eure Version der Entwicklungsumgebung und installiert sie nocheinmal über die Website von Arduino neu.

Nun schließen wir den Arduino an unseren PC an, öffnen die Arduino IDE und laden aus den Beispielen unter Basics die Blink-Datei mit folgendem Inhalt. In den Kommentaren seht ihr die Aufgaben der einzelnen Zeilen.

Ein Arduino-Programm ist grundsätzlich aus den zwei Methoden setup() und loop() aufgebaut. In der setup()-Methode definiert ihr alles, was vor der Ausführung eures Codes in der loop()-Methode initialisiert werden soll. Die loop()-Methode wiederholt danach solange den enthaltenen Code, bis ihr den Arduino von seiner Stromzufuhr trennt.

void setup() {
  // Initialisiere die eingebaute LED als OUTPUT
  pinMode(LED_BUILTIN, OUTPUT);
}

// Wiederhole für immer, beginnend wenn du Strom bekommst
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // LED an
  delay(1000);                       // Warte eine Sekunde
  digitalWrite(LED_BUILTIN, LOW);    // LED aus
  delay(1000);                       // Warte eine Sekunde
}

Klickt nun auf Übertragen, dann sollte die kleine grüne LED auf eurem Arduino anfangen zu blinken. Jetzt seid ihr bereit, euch mit dem ROS-Teil zu befassen.

ROS vorbereiten

Wir benötigen jetzt das Paket rosserial. Hierfür laden wir Folgendes herunter:

sudo apt install ros-noetic-rosserial
sudo apt install ros-noetic-rosserial-arduino

Mit Hilfe des zweiten der beiden Pakete können wir nun die vom Arduino benötigte ROS-Bibliothek erstellen. Navigiert dazu in den libraries-Ordner in eurem Arduino Workspace. Wenn ihr nicht wisst, wo der ist, speichert ein neues Projekt in der Arduino IDE und euch wird direkt das Hauptverzeichnis eures Arduino Workspaces vorgeschlagen. Darin liegt für gewöhnlich der Ordner libraries. Öffnet innerhalb dieses Ordners ein neues Terminal und führt folgenden Befehl aus, der euch die Bibliothek ros-lib erstellt.

rosrun rosserial_arduino make_libraries.py .

Startet nun die Arduino IDE neu und überprüft, ob ihr in den Beispielen unter Custom Library Examples das Untermenü ros_lib sehen könnt. Wenn dem so ist, habt ihr bis hierhin alles richtig gemacht und ihr könnt daraus das Blink Beispiel öffnen:

#include <ros.h> //Nicht vergessen!
#include <std_msgs/Empty.h>

ros::NodeHandle nh; //Neuer NodeHandle

void messageCb(const std_msgs::Empty& toggle_msg){
  digitalWrite(LED_BUILTIN, HIGH-digitalRead(LED_BUILTIN)); //Toggle die LED
}

ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb ); //Subscriber für die LED-Topic

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  nh.initNode(); //Node initialisieren
  nh.subscribe(sub);
}

void loop()
{
  nh.spinOnce(); //Halte den ROS-Node am Leben
  delay(1);
}

Vergleichen wir einmal das klassische Blink-Beispiel mit dem ROS-Blink-Code. Zu Beginn des Programms wird ein NodeHandle erstellt, wie man ihn für jeden ROS-Node benötigt. Außerdem erstellen wir nun einen Subscriber sub, der Nachrichten vom Typ Empty1 empfängt. In seiner Callback-Methode, also der Methode, die aufgerufen wird, wenn eine neue Nachricht empfangen wird, schaltet der Node die interne LED des Arduinos um.

Arduino und rosserial verbinden

Auf dem Operator-PC starten wir nun unser ROS-Netzwerk:

roscore

Um die Kommunikation zwischen dem Operator und dem Arduino herzustellen, starten wir in einem neuen Terminal die Verbindung mit rosserial. Achtet darauf den richtigen Port anzugeben. Den könnt ihr in der Arduino IDE einsehen.

rosrun rosserial_python serial_node.py /dev/ttyUSB0

Nun könnt ihr mit rostopic list sehen, ob die /toggle_led-Topic verfügbar ist. Versucht doch mal etwas in die Topic zu publishen.

Zusammenfassung

rosserial stellt das Interface zwischen unserem Operator PC und dem Arduino her. Mit Hilfe der ros_lib Bibliothek kann der Arduino als eigener ROS-Node arbeiten. In diesem Tutorial machen wir unseren Arduino zu einem Subscriber, der auf die Topic /toggle_led horcht und die interne LED schaltet, wenn eine neue Nachricht vom Operator aus gesendet wurde.

Hier findet ihr den gesamten Artikel nochmal als Video:

Im nächsten Tutorial befassen wir uns mit der Ansteuerung eines Schrittmotors mit rosserial. Schaut es euch hier mal an.

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/

rosserial: http://wiki.ros.org/rosserial

  1. http://docs.ros.org/en/melodic/api/std_msgs/html/msg/Empty.html

Leave a comment



Copyright 2017 maximilian von unwerth © All Rights Reserved