Installieren Sie ROS auf einem Raspberry Pi

Ich habe bereits in einem früheren Artikel über die Installation von rosserial_arduino für die Interaktion des Arduino-Mikrocontrollers mit der ROS-Roboterplattform geschrieben. rosserial_arduino ist ein Paket des Rosserial-Stacks, das für die ROS-Plattform entwickelt wurde, und verwandelt die Arduino-Karte in einen eigenständigen ROS-Knoten, mit dem andere Komponenten des Systems interagieren können. Bei der Verwendung von Arduino für Roboterprojekte gibt es eine wesentliche Einschränkung: Arduino kann nicht als vollwertiger Rechenknoten verwendet werden, der alle für die normale Funktion des Roboters erforderlichen Vorgänge ausführen kann. Beispielsweise können Sie keine OpenCV-Skripts für Computer Vision-Aufgaben ausführen. In diesem Artikel möchte ich über meine Erfahrungen bei der Installation eines ROS-Systems und dem Anschließen eines Arduino an einen Raspberry Pi-Mikrocomputer mit dem bereits bekannten Paket rosserial_arduino sprechen.

Bild


Motivation


Nachdem ich die Plattform rosserial_arduino kennengelernt hatte, hatte ich eine Frage: Kann ich Arduino irgendwie in Verbindung mit einem leistungsstärkeren Mikrocomputer so verwenden, dass der Roboter unabhängiger vom Laptop wird?
Dann kam mir die Idee, ROS auf einem Raspberry Pi-Mikrocomputer auszuprobieren. Der Raspberry Pi ist ein eigenständiger Mini-Computer auf dem Board. Es verfügt über einen CPU-Chip, einen Grafikchip, einen SD-Kartensteckplatz, einen Ethernet-Eingang, mehrere USB-Schnittstellen und einen HDMI-Videoausgang zum Anschließen eines Monitors. Sie können eine Maus, eine Tastatur und eine externe Festplatte an die USB-Eingänge anschließen.
Die Kombination aus Raspberry Pi und Arduino ist sehr vielversprechend und wurde wiederholt in Roboterprojekten eingesetzt.
Mit Raspberry Pi können Sie auch eine Kamera (Webcam oder spezielle RPi-Board-Kamera) anschließen. Ein einfacher Roboter mit Rädern auf einem modifizierten Arduino Uno-Board ist mir vor einem Jahr in die Hände gefallen. In meinen Händen war gerade das Raspberry Pi Model B.

Bild

Installieren des Betriebssystems auf dem Raspberry Pi


Zuerst müssen Sie die Linux-Distribution auf der "Himbeere" installieren. Der einfachste Weg, dies zu tun, ist mit dem NOOBS OS-Installationsmanager. Wie das geht, lesen Sie in diesem Handbuch auf dem offiziellen Raspberry Pi-Portal .
Ich habe mich für Raspbian entschieden, eine modifizierte Debian-Distribution, die speziell für Raspberry entwickelt wurde.
Hinweis: Beim Anschließen eines Monitors treten häufig Probleme bei der Anzeige eines Bildes auf, insbesondere bei älteren Monitoren ohne HDMI-Eingang. Hier hilft uns die Datei config.txt - die Himbeer-Konfigurationsdatei für die Monitoreinstellungen. In einigen Fällen befindet es sich bereits im System-Image-Archiv (Raspbian), im Fall von NOOBS muss es im Stammverzeichnis der SD-Karte erstellt werden.
Fügen Sie die folgenden Zeilen in die Datei ein:

# For more options and information see
# http://www.raspberrypi.org/documentation/configuration/config-txt.md
# Some settings may impact device functionality. See link above for details
 
# uncomment if you get no picture on HDMI for a default "safe" mode
hdmi_safe=1
 
# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
#disable_overscan=1
 
# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16
 
# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720
 
# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1
 
# uncomment to force a specific HDMI mode (this will force VGA)
#hdmi_group=1
#hdmi_mode=1
 
# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2
 
# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
config_hdmi_boost=4
 
# uncomment for composite PAL
#sdtv_mode=2
 
#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800


In diesem Fall sind die wichtigen Zeilen:

hdmi_safe=1
hdmi_force_hotplug=1
config_hdmi_boost=4


In meinem Fall ermöglichten diese Einstellungen das Erhalten des richtigen Bildes auf einem Monitor mit einem VGA-Eingang.

Konfigurieren Sie den Remotezugriff auf den Raspberry Pi


Sie können über das Netzwerk über SSH eine Verbindung zur Raspberry Pi-Karte herstellen. Dazu muss der Raspberry Pi entweder über ein Ethernet-Kabel (hierfür befindet sich ein spezieller Eingang auf der Karte) oder über einen an einen USB-Anschluss angeschlossenen WLAN-Adapter mit dem Netzwerk verbunden sein. Wenn Sie ein Ethernet-Kabel anschließen, erhält Raspberry automatisch eine IP-Adresse im Netzwerk und wird sofort verfügbar.
Wenn Sie einen Adapter verwenden, müssen Sie eine Reihe einfacher Verfahren ausführen.
Ich habe den folgenden TPLINK-WLAN-Adapter verwendet: Schließen Sie

Bild

den Adapter an den USB-Anschluss an und überprüfen Sie, ob das Gerät im System vom Befehl erkannt wird

$ iwconfig

Jetzt scannen wir den Raum, um nach verfügbaren drahtlosen Netzwerken zu suchen:

$ sudo iwlist wlan0 scan

Das ESSID-Feld in der Befehlsausgabe gibt den Namen des Zugriffspunkts an.
Stellen Sie nun mit dem Dienstprogramm wpa_supplicant eine Verbindung zum Zugriffspunkt für die WPA-Verschlüsselung her.
Mit dem Dienstprogramm wpa_passphrase, das Teil des Pakets wpa_supplicant ist, generieren wir ein Kennwort basierend auf dem Zugriffsschlüssel:

$ wpa_passphrase <hotspot_name> <hotspot_access_key>

Dabei sind hotspot_name und hotspot_access_key der Name des Zugriffspunkts bzw. des Zugriffsschlüssels.
Das Dienstprogramm gibt die generierte psk-Zeichenfolge zurück.
Als nächstes wird der gesamte Netzwerkblock, der die Netzwerk-SSID und die PSK-Zeile enthält, am Ende der Konfigurationsdatei /etc/wpa_supplicant/wpa_supplicant.conf eingefügt und gespeichert. Schließlich starten wir unseren Raspberry Pi neu und überprüfen die Netzwerkverbindung.
Um eine Verbindung über SSH im Terminal des Computers herzustellen, müssen Sie den folgenden Befehl ausführen:

$ ssh pi@<raspi_ip>

Dabei ist <raspi_ip> die Himbeer-IP-Adresse, die vom Befehl ifconfig erkannt werden kann, der direkt im Himbeer-Terminal ausgeführt wird.
Verwenden Sie den folgenden Befehl, um eine Verbindung über SSH mit der Möglichkeit zum Ausführen grafischer Anwendungen herzustellen:

$ ssh -X pi@<raspi_ip>

Sie können im Remotedesktopmodus mit dem Programm Virtual Network Computing (VNC) eine Verbindung zum „Malinka“ herstellen. Die Verwaltung erfolgt durch Übertragen von Tastenanschlägen auf der Tastatur und der Maus von einem Computer auf einen anderen und Weiterleiten des Bildschirminhalts über ein Computernetzwerk. Das VNC-System ist plattformunabhängig.
Installieren Sie zuerst den VNC-Server auf dem Raspberry Pi mit dem Befehl im Terminal:

$ sudo apt-get install tightvncserver

Führen Sie nach Abschluss der Installation den folgenden Befehl aus:

$ vncserver :1 -geometry 1280x800 -depth 16

Dieser Befehl startet den VNC-Server. In diesem Fall bedeutet dies, dass eine virtuelle X-Sitzung ausgeführt wird (virtuelle Präsentation des Raspberry Pi-Desktops). Nachdem Sie den VNC-Client gestartet und eine Verbindung hergestellt haben, werden Sie mit diesem virtuellen Desktop verbunden.
Parameter: 1 definiert die Portnummer, auf der der VNC-Prozess ausgeführt wird. Der Geometrieparameter legt die Auflösung (in diesem Fall die Größe) des virtuellen Desktops fest. Der Tiefenparameter bestimmt die Farbtiefe der Desktop-Anzeige in Bit (8, 16 und 24, der Standardwert ist 16).
Beim ersten Start werden Sie vom VNC-Server aufgefordert, ein Kennwort einzugeben, das beim Herstellen einer Verbindung zum Remotedesktop abgefragt wird.
Installieren Sie nun den VNC-Client auf einem Desktop-Computer:

$ sudo apt-get install xtightvncviewer

Wir sind bereit, eine Verbindung zum Remote-Desktop „Malinka“ herzustellen:

$ vncviewer <raspi_ip>:1

und geben Sie das Passwort ein.
Ein Fenster mit einem ähnlichen Desktop-Image wird geöffnet:

Bild

Beachten Sie, dass der VNC-Server bei jedem Neustart einer Himbeere neu gestartet werden muss.

Verbinde Arduino mit Raspberry Pi


Der Arduino kann genauso einfach an den Raspberry Pi angeschlossen werden wie an einen normalen Computer. Installieren Sie zunächst die Arduino IDE auf dem Raspberry Pi:

$ sudo apt-get update
$ sudo apt-get install arduino

Starten Sie den Befehl Arduino IDE:

$ arduino

Die Arduino IDE wird über ihr USB-Programmierkabel mit dem Raspberry Pi verbunden. Für eine solche Verbindung muss die serielle Konsole getrennt werden. Standardmäßig konfiguriert der Raspberry Pi die serielle Schnittstelle (GPIO14-GPIO15) so, dass Startinformationen bereitgestellt werden. Sie können sich auch über ein angeschlossenes Gerät bei Ihrem Raspberry Pi anmelden. Um Arduino programmieren zu können, müssen Sie diese Option standardmäßig deaktivieren.
Bearbeiten Sie die inittab-Systemdatei, um die Autorisierung zu deaktivieren:

$ sudo nano /etc/inittab


Finden Sie die Linie:

T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

kommentiere es aus:

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

Speichern und schließen Sie danach die Datei.
Beim Booten sendet der Raspberry Pi Debugging-Meldungen an die serielle Schnittstelle. Dies kann in einigen Fällen nützlich sein, aber jetzt müssen wir diese Funktionalität deaktivieren. Bearbeiten Sie dazu die Systemdatei cmdline.txt:

$ sudo nano /boot/cmdline.txt

Finden Sie die Linie:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

und entfernen Sie den Konsolenparameterblock, um eine Zeile wie die folgende zu erhalten:

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Speichern und schließen Sie die Datei.
Damit die Änderungen vom System übernommen werden, müssen Sie den Raspberry Pi neu starten:

$ sudo reboot

Jetzt können Sie die Arduino-Karte an den USB-Anschluss des Raspberry Pi anschließen, die Arduino-IDE für Ihr Arduino-Kartenmodell konfigurieren und die Skizze darauf hochladen.

ROS und rosserial_arduino einstellen


Ich habe mich für die Installation von ROS Indigo entschieden. Die Installationsanweisungen für ROS Indigo sind auf der offiziellen Seite ausführlich beschrieben .
Ich empfehle die Installation der ROS-Comm-Installationsoption. Aus eigener Erfahrung kann ich sagen, dass die Installation der Desktop-Option sehr lange dauern kann.
Nach der Installation von ROS und dem Auflösen aller Abhängigkeiten mit dem Dienstprogramm rosdep kompilieren wir einfach catkin_workspace:

$ catkin_make
$ catkin_make install


Ausführen von rosserial_arduino-Skizzen auf Raspberry Pi


Jetzt haben wir rosserial_arduino installiert und können es ausführen:

$ roslaunch rosserial_python serial_node.py /de/ttyACM0

Beim Starten des Rosserial-Servers kann ein Fehler auftreten: Kein Modul mit dem Namen diagnostic_msgs.msg.
Um das Problem zu lösen, müssen Sie die Quelle der ROS- Nachrichten - common_msgs, die sich nicht in der Installation befinden, aus dem offiziellen ROS-Repository herunterladen und in den Ordner rosserial package im Arbeitsbereichsordner laden und anschließend ROS kompilieren:

$ catkin_make install

Kommentar! Beim Laden von Skizzen in die Arduino IDE kann der Fehler "Schwerwiegender Fehler: Zeichenfolge: Keine solche Datei- oder Verzeichniskompilierung beendet" auftreten. Dies bedeutet, dass wir ROS-Nachrichtentypen in ros_lib haben, diese müssen jedoch auch in die entsprechenden Typen für Arduino kompiliert werden. Sie müssen sie folgendermaßen kompilieren:

$ cd <sketchbook>/libraries
$ rm -rf ros_lib
$ rosrun rosserial_python make_libraries.py .

Jetzt können Sie mit rosserial_arduino auf dem Raspberry Pi wie auf einem normalen Computer arbeiten: Knoten erstellen, Themen abonnieren, Themen veröffentlichen usw.
Sie können eine RPi-Board-Kamera an den Raspberry Pi anschließen und das ROS-Paket cv_bridge (die ROS-Schnittstelle für die Interaktion mit OpenCV, die Beschreibung finden Sie hier ) verwenden, um Computer-Vision-Aufgaben auszuführen.
Mein Roboter ist übrigens voll bewaffnet:

Bild

Bild

Fazit


Ich hoffe, dass dieser Artikel ein guter Input für Sie ist, um mit ROS auf dem Raspberry Pi zu arbeiten, und Sie haben Ihre eigenen Ideen für die Verwendung des Raspberry Pi in Verbindung mit Arduino oder anderen Mikrocontrollern dieses Typs. Ich wünsche Ihnen viel Glück bei Ihren Experimenten und Projekten und hoffe, dass ich bald meine neuen Ideen in den folgenden Artikeln teilen werde!

PS: Einige Anweisungen stammen aus dem Buch von V. Petin, „Electronics. Raspberry Pi Mikrocomputer. Praktischer Leitfaden. “

Source: https://habr.com/ru/post/de385493/


All Articles