|
|
(305 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) |
Zeile 4: |
Zeile 4: |
| '''Betreuer:''' [[Benutzer:Ulrich_Schneider| Prof. Schneider]]<br/> | | '''Betreuer:''' [[Benutzer:Ulrich_Schneider| Prof. Schneider]]<br/> |
| '''Art:''' Praxissemester<br> | | '''Art:''' Praxissemester<br> |
| '''Projektlaufzeit:''' 02.11.2021-20.02.2022 | | '''Projektlaufzeit:''' 02.11.2021 - 20.02.2022 |
|
| |
|
|
| |
|
| [[Datei:Kommunikation_Slave_Master.png|right|mini|600px|Abb 1: Kommunikation zwischen Maste-Node und Slave-Node <nowiki></nowiki>]] | | [[Datei:Kommunikation_Slave_Master.png|right|mini|700px|Abb 1: Kommunikation zwischen Maste-Node und Slave-Node <nowiki></nowiki>]] |
|
| |
|
|
| |
|
| == Einleitung == | | == Einleitung == |
|
| |
|
| Dieser Artikel beschreibt die Kommunikation von einem [https://de.wikipedia.org/wiki/Raspberry_Pi Raspberry Pi] mit dem [[Robot_Operating_System_2|Robot Operating System2 (ROS2)]]. Dazu wird erklärt, wie ein Raspberry Pi mit einem PC über SSH(Secure Shell) verbunden werden kann und wie der AlphaBot über den Raspberry Pi und ROS2 gesteuert wurde. | | Dieser Artikel beschreibt die Kommunikation von einem [https://de.wikipedia.org/wiki/Raspberry_Pi Raspberry Pi(RPi)] mit dem [[Robot_Operating_System_2|Robot Operating System2 (ROS2)]]. In Abb. 1 sind die Nodes master und slave zu sehen, welche auf der RPi ausgeführt werden. Über die Topics, wie cmd_vel oder die SONAR-Topics, kommunizieren die Nodes mit einander. Dazu wird erklärt, wie ein Raspberry Pi mit einem PC über [https://de.wikipedia.org/wiki/Secure_Shell Secure Shell (SSH)] verbunden werden kann und wie der AlphaBot über den RPi und ROS2 gesteuert wurde. Außerdem wird beschrieben was es für grafische Anzeige Möglichkeiten unter ROS2 gibt. |
|
| |
|
| == Übersicht == | | ==== Aufgabenstellung ==== |
| === Dokumentation === | | |
| | Das Ziel war es einen [[AlphaBot|AlphaBot]] mit ROS2 zu programmieren und fahren zu lassen, damit er Hindernisse mit Infrarotsensoren und dem Ultraschallsensor umfahren kann. |
| | |
| | ==== Projektplanung ==== |
| | |
| | [[Datei:Projektplan_JonasGerken.png|left|mini|700px|Abb 2: Projektplan]] |
|
| |
|
| Am Anfang des Projekts wurden die Funktionalen und nicht Funktionalen Anforderungen aufgsetsellt.
| | <br clear=all> |
|
| |
|
| ==== Funktionale Anforderungen ==== | | ==== Funktionale Anforderungen ==== |
Zeile 23: |
Zeile 28: |
| {| class="wikitable" | | {| class="wikitable" |
| |F1 | | |F1 |
| |Der Roboter muss Hindernisse mit Infrarotsensoren erkennen können. | | |Der AlphaBot muss Hindernisse mit Infrarotsensoren erkennen können. |
| |- | | |- |
| |F2 | | |F2 |
| |Der Roboter muss Hindernisse mit einem Ultraschallsensor erkennen können. | | |Der AlphaBot muss Hindernisse mit einem Ultraschallsensor erkennen können. |
| | |- |
| | |F5 |
| | |Der Ultraschallsensor muss mit einem Servo-Motor nach rechts und links gedreht werden können. |
| |- | | |- |
| |F3 | | |F3 |
| |Der Roboter muss Hindernisse umfahren können. | | |Der AlphaBot muss Hindernisse umfahren können. |
| |- | | |- |
| |F4 | | |F4 |
Zeile 38: |
Zeile 46: |
| {| class="wikitable" | | {| class="wikitable" |
| |NF1 | | |NF1 |
| |Es muss ein Alphabot verwendet werden. | | |Es muss ein AlphaBot verwendet werden. |
| |- | | |- |
| |NF2 | | |NF2 |
| |Der Roboter soll mit [[Robot Operating System 2| ROS2]] programmiert werden. | | |Der AlphaBot muss mit ROS2 programmiert werden. |
| |- | | |- |
| |NF3 | | |NF3 |
| |Der Roboter soll mit einem [[Raspberry Pi| Raspberry Pi]] gesteuert werden. | | |Der AlphaBot soll mit einem RPi gesteuert werden. |
| |- | | |- |
| |NF4 | | |NF4 |
| |Der Roboter soll mit Python programmiert werden. | | |Der AlphaBot soll mit Python programmiert werden. |
| |- | | |- |
| |NF5 | | |NF5 |
| |Es muss die Python Bibliothek [[RPi.GPIO python Bibliothek| RPi.GPIO Installation]] | | |Es soll die Python Bibliothek [https://pypi.org/project/RPi.GPIO/ RPi.GPIO] verwendet werden. |
| |- | | |- |
| |NF6 | | |NF6 |
| |Es muss Ubuntu Server 20.04 auf dem RPi verwendent werden. | | |Es muss [[Raspberry Pi| Ubuntu Server 20.04 Server]] auf dem RPi verwendent werden. |
| |-
| |
| |NF7
| |
| |Für eine SSH-Verbindung kann [https://de.wikipedia.org/wiki/PuTTY PuTTY] verwendet werden.
| |
| |} | | |} |
|
| |
|
| ===== Hardware ===== | | == Übersicht == |
| | === Dokumentation === |
|
| |
|
| # [[AlphaBot|AlphaBot]]
| |
| # [[Raspberry Pi|Raspberry Pi]]
| |
|
| |
|
| ===== Software =====
| |
|
| |
|
| # [[Raspberry Pi| Ubuntu Server 20.04]]
| |
| # ROS2
| |
| # [[Using the Raspberry Pi’s GPIO to control hardware components| RPi.GPIO python Bibliothek]]
| |
| # [https://de.wikipedia.org/wiki/PuTTY PuTTY]
| |
|
| |
|
| ==== Raspberry Pi mit Ubuntu Server verbinden über SSH(Secure Shell) ==== | | ===== verwendete Hardware ===== |
|
| |
|
| Hier wird zunächst erklärt was SSH ist, wie es aktiviert wird und wie es verwendet werden kann.
| | # AlphaBot |
|
| | # Raspberry Pi 4 |
| Für dieses Projekt wurde [https://de.wikipedia.org/wiki/Secure_Shell Secure Shell(SSH)] verwendet, um den RPi Bildschirm unter Ubuntu Desktop anzeigen zulassen. So wird keine HDMI-Verbindung zwischen dem RPi und einem Bildschirm mehr benötigt.
| | # mciro-SD Karte mit SD-Karten Adapter |
| So kann der Roboter später auch über eine WIFI-Verbindung frei herum fahren.
| | # HDMI-Kabel |
| | # Netzwerkkabel |
| | # Netzwerkswitch |
|
| |
|
| Die SSH Verbindung kann über verschiedene Wege erfolgen. Zum einen über das Programm [https://de.wikipedia.org/wiki/PuTTY PuTTY] oder über das Ubuntu Desktop Terminal.
| | ===== verwendete Software ===== |
|
| |
|
| ===== SSH auf dem Raspberry Pi Aktivieren =====
| | # Ubuntu Server 20.04 |
| Damit SSH genutzt werden kann muss es auf dem Raspberry Pi zuerst aktiviert werden.
| | # Python |
| Dazu sind folgende Schritte zu befolgen:
| | # ROS2 |
| | | # Secure Shell (SSH) |
| # SD-Karte mit einem SD-Karten-Adapter in ein Kartenleseslot an einem PC stecken | | # [https://de.wikipedia.org/wiki/PuTTY PuTTY] |
| # im boot-Verzeichnis ("system-boot") eine leere Textdatei mit dem Namen "ssh.txt" erstellen
| |
| # in diesem Ordner die rechte Maustaste drücken, dann auf Neu und dort auf Textdokument | |
| # im Windows-Explorer unter dem Reiter Ansicht Haken bei Dateinameserweiterung setzen | |
| # .txt Dateiendung entfernen | |
| # Warnung mit JA bestätigen
| |
| # beim Booten des Raspberry Pi's wird nun SSH aktiviert(Abb. 1)
| |
| | |
| | |
| [[Datei:SSH Datei erstellen.png|left|mini|500px|Abb 1: Ordner des Boot-Verzeichnisses <nowiki></nowiki>]]
| |
| <br clear=all>
| |
| | |
| ===== Netzwerk Konfiguration =====
| |
| Damit der Raspberry Pi über SSH verbunden werden kann, wird die IPv4-Adresse des Raspberry Pi's benötigt.
| |
| Dafür wird der RPi mit einem HDMI-Kabel an einem Bildschirm angeschlossen.
| |
| Nach dem der Raspberry Pi gebootet ist, erscheint ein login Bildschirm, wo nach dem Benutzernamen (ubuntu) und nach dem Passwort (Hshl2021) gefragt wird (Abb. 2).
| |
| | |
| [[Datei:Log In Bildschirm.jpg|left|mini|250px|Abb 2: Beispiel <nowiki><log in Bildschirm</nowiki>]] | |
| <br clear=all>
| |
| | |
| Nach der Anmeldung auf dem Raspberry Pi, kann die IPv4-Adresse auf dem Start Bildschirm abgelesen werden, wie in Abb. 3 gezeigt.
| |
| | |
| [[Datei:StartBild_Ubuntu_Server.png|left|mini|300px|Abb 3: Beispiel <nowiki>IP-Adresse</nowiki>]]
| |
| <br clear=all>
| |
| | |
| Für die Verbindung über Ethernet muss nur der RPi und der PC mit einem Lan-Kabel verbunden werden. Damit beides im gleichen Netzwerk ist wird ein Netzwerk-Switch zwischengeschaltet.
| |
| Jetzt kann die SSH-Verbindung mit dem Befehl "ssh username@IP-Adresse" hergestellt werden.
| |
| Danach wird nach dem RPi Passwort gefragt.
| |
| Nach der Eingabe des Passworts wird die SSH Verbindung hergestellt.
| |
| | |
| Um ein Wifi-Netzwerk zu nutzen muss die RPI Netzwerk config geändert werden. Wie das gemacht werden kann kann in dem Artikel
| |
| | |
| Dabei ist darauf zu achten, das die IP-Addressen für Wifi und Ethernet unterschiedlich sind.
| |
| | |
| ===== PuTTY für die SSH Verbindung =====
| |
| PuTTY ist eine freie Software zur Herstellung von Secure Shell Verbindungen.
| |
| Auf einem Pc mit Ubuntu wird Putty über die Kommandozeile installiert [https://wiki.ubuntuusers.de/PuTTY/].
| |
| sudo apt-get install putty
| |
| | |
| Nach der Installaltion kann es über den Befehl "putty" in einem Terminal ausgeführt werden und ein neues Fenster öffnet sich(Abb.5).
| |
| Unter Session wird bei Host-Name bzw. IP-Addresse die IP-Addresse des Raspberry Pi's angegeben. Und im Bereich Connection type wird der Type "SSH" ausgewählt und überprüft, ob bei "Port" die Zahl 22 steht.
| |
| | |
|
| |
| [[Datei:PuTTY Konfiguration.png|left|350px|Abb. 5: Beispiel <nowiki>PuTTY Start Bildschirm]]
| |
| <br clear=all>
| |
| | |
| Um den SSH Server zu starten wird unten im Fenster auf Open geklickt.
| |
| Dann öffnet sich ein neues Fenster, wo sich mit den zuvor gezeigten Anmeldedaten auf dem RPi angemeldet werden kann.
| |
| | |
| [[Datei:Putty_Login.png|left|mini|350px|Abb. 6: PuTTY Login Bildschirm]]
| |
| <br clear=all>
| |
| | |
| Nun ist die SSH-Verbindung über PuTTY hergestellt.
| |
| | |
| Um eine SSH-Verbindung über das Ubuntu Terminal herzustellen ist der folgende Befehl nötig [https://wiki.ubuntuusers.de/SSH/]:
| |
| | |
| ssh username@IP-Adresse
| |
| | |
| Für den verwendeten RPi war der username "ubuntu" und die IP-Adresse für Ethernet war "172.31.14.89" und für Wifi war es "192.168.10.102".
| |
| | |
| ==== Microcontroller coding mit der Integration von Ros 2 ====
| |
| | |
| # ls -l /dev/ gpiomem
| |
| crw-rw---- 1 root dialout 239, 0 Apr 1 17:23 /dev/gpiomem
| |
| # groups
| |
| ubuntu adm dialout cdrom floppy sudo audio dip video plugdev netdev lxd
| |
| | |
| cd /dev
| |
| sudo chmod og+rwx gpio*
| |
| | |
| In diesem Abschnitt wird die Programmierung des Raspberry Pi's mit ROS2 beschrieben. Dazu gehört die Motorsteuerung, genau sowie die Infrarot Sensoren und/oder dem Ultraschallsensor um Hindernisse umfahren zu können.
| |
| | |
| Da es die Bibliothek wiringPi, welche für die Ansteuerung der GPIO Pins über CPP nicht mehr unterstützt wird, haben wir uns für die Python Bibliothek "RPi.GPIO" entschieden. Für mehr Informationen siehe hier: [[Raspberry Pi|Raspberry Pi]]
| |
| | |
| Um mit der Programmierung zu beginnen wurde ein Ros2 Workspace (ros_ws) mit einem source Ordner (src) erstellt.
| |
| | |
| mkdir ros_ws
| |
| cd ros_ws
| |
| mkdir src
| |
| | |
| | |
| In diesem Ordner wurde dann das ros2 Package mit den benötigten Bibliotheksabhängigkeiten erstellt.
| |
| <code> ros2 pkg create --build-type ament_python packagename(z.B. sensor_test) --dependencies rclpy std_msgs </code>
| |
| | |
| | |
| ===== Motorsteuerung =====
| |
| | |
| [[Datei:Motortest.png|right|mini|500px|Abb. 7 Programm Ablauf Motortest]]
| |
| | |
| Es wurde mit der Programmierung der Motoren begonnen. Dazu wurde eine ROS2 Node namens slave erstellt, welche alle Funktionen zur Ansteuerung der RPi.GPIO Pins beinhaltet.
| |
| | |
| | |
| Um das Programm zu starten, muss das Package zuerst mit <code> colcon build </code> kommpeliert und mit <code> . install/setup.bash </code> installiert werden.
| |
| Die Slave Node kann in einem Terminal auf dem Ubuntu Server mit dem Befehl <code>"ros2 run sensor_test slave.py"</code> gestartet werden.
| |
| | |
| | |
| | |
| Nachdem die slave-Node gestartet wurde, wartet sie auf eingehende Nachrichten. Da hier noch keine master-Node vorhanden ist, wurde die Nachricht mit dem folgenden Befehl manuell an die slave gesendet.
| |
| | |
| | |
| | |
| Dazu wird dieser Befehl in einem neuen Terminal ausgeführt.
| |
| <code> ros2 topic pub /cmd_vel std_msgs/msg/String '{data: forward}'</code>
| |
| | |
| | |
| | |
| In diesem Fall wird der Slave-Node die Nachricht forward gesendet und über eine If else Funktion entscheidet das Programm danach das er die GPIO-Pins für die Vorwärtsfahrt ansteuern muss.
| |
| | |
| | |
| | |
| So fährt der Roboter vorwärts und die Nachricht wird in einer Dauerschleife immer wieder an die slave gesendet bis diese Schleife mit der Tastenkombination <code> STRG C</code> beendet wird. Dann kann über den oben genannten Befehl eine neue Nachricht (z.B. right an stelle von forward) an die slave gesendet werden.
| |
| | |
| In Abb. 8 ist zusehen wie die selbst versendete Nachricht versendet wird und die slave die Nachricht empfängt.
| |
| | |
| [[Datei:Terminal_Motor_Controll.png|left|mini|800px|Abb. 8: Terminal Ausgabe]]
| |
| | |
| <br clear=all>
| |
| | |
| ===== Infrarot Hindernisumfahrung =====
| |
| | |
| [[Datei:Infrared.png|right|mini|500px|Abb. 9 Infrarot Hindernisumfahrung]]
| |
| | |
| Nachdem die Motoren mit ROS2 implementiert und getestet wurden, wurde die Hindernisumfahrung mit Infrarotsensoren implementiert.
| |
| Hierfür wurden zwei neue Dateien mit den Namen "master_IR.py" und "slave_IR.py" in dem source Ordner des ROS2 Packages erstellt.
| |
| | |
| | |
| | |
| Über die master_IR.py wurde die Master-Node implementiert. Diese bekommt Sensordaten von der Slave-Node und entscheidet anhand der Sensordaten was die Slave machen soll.
| |
| Die slave_IR.py ist wie bei der Motorsteuerung oben, nur das sie nicht nur die Motoren anhand von Nachrichten ansteuert, sondern auch die Sensordaten ausließt und an die Master-Node sendet.
| |
| | |
| | |
| Zudem wurde eine launch file erstellt, um den master und die slave mit einem Befehl starten zu können.
| |
| Der code für die Launch-file ist in der svn-Repository zu finden.
| |
| | |
| <code> ros2 launch sensor_test alphabot_IR_launch.py </code>
| |
| | |
| In Abb 10 ist ein Beispiel für den Abblauf der Hindernisumfahrung dargestellt.
| |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| [[Datei:IR_left.png|left|mini|500px|Abb. 10 Left]]
| |
| | |
| <br clear=all>
| |
| | |
| ===== Ultraschall Hindernisumfahrung =====
| |
| | |
| [[Datei:Ultraschall.png|right|mini|350px|Abb. 7 Ultraschall Hindernisumfahrung]]
| |
| | |
| | |
| <br clear=all>
| |
|
| |
|
| Der Code zu den verchiedenen Programmen kann unter der folgenden svn nachgelesen werden.
| | ==== [[ Raspberry Pi über Secure Shell(SSH) mit Desktop PC verbinden | Raspberry Pi über Secure Shell(SSH) mit Desktop PC verbinden]] ==== |
|
| |
|
| [http://www.example.com Link-Text] | | ==== [[ Programmierung / Funktionsweise der ROS2 Codes | Programmierung / Funktionsweise der ROS2 Codes ]] ==== |
|
| |
|
| ==== Der RQT-Graph zur Graphischen Darstellung ==== | | ==== [[ Darstellung der Ergebnisse | Darstellung der Ergebnisse ]] ==== |
|
| |
|
| === Demo === | | ==== [[ Demo | Demo]] ==== |
| === Software ===
| |
|
| |
|
| == [[Zusammenfassung_Praxissemester_Gerken|Zusammenfassung]] == | | == [[Zusammenfassung_Praxissemester_Gerken|Zusammenfassung]] == |
Zeile 255: |
Zeile 101: |
|
| |
|
| * [https://wiki.ubuntuusers.de/PuTTY/ PuTTY Installation] | | * [https://wiki.ubuntuusers.de/PuTTY/ PuTTY Installation] |
| | * [https://wiki.ubuntuusers.de/SSH/ SSH ] |
|
| |
|
|
| |
|
| ---- | | ---- |
| → zurück zum Hauptartikel: [[Robot_Operating_System_2|Robot Operating System2 (ROS2)]] | | → zurück zum Hauptartikel: [[Robot_Operating_System_2|Robot Operating System2 (ROS2)]] |