Beiträge in der Reihe:
8. Wir steuern von der Telefon-ROS-Steuerung, GPS-Knoten7. Roboterlokalisierung: Gmapping, AMCL, Referenzpunkte auf der Raumkarte6. Kilometerzähler mit Radgebern, Raumkarte, Lidar5. Wir arbeiten in Rviz und Pavillon: Xacro, neue Sensoren.4. Erstellen Sie eine Robotersimulation mit den Editoren rviz und pavillon.3. Beschleunigen, Kamera wechseln, Gang fixieren2. Software1. EisenWeiter zum Lächeln
Nachdem wir den „Burger“ nach dem Schema des letzten
Beitrags zusammengestellt haben , fahren wir mit dem Software-Inhalt fort.
Da wir für ein bereits abgeschlossenes Projekt sammeln, ist es logisch, die darin angegebenen Anweisungen zu geben. Sie sind
hier .
Alles ist sehr praktisch und an der gleichen Stelle können Sie ein fertiges Bild von Raspbian Stretch + ROS + OpenCV herunterladen und auf eine SD-Karte für Himbeere schreiben. (ROS Kinetic, OpenCV 3.4.1. Ja, es gibt neuere, aber manchmal ist es besser zu nehmen und zu gehen, als alles von der Quelle zu sammeln).
Trotz der Bequemlichkeit musste ich das Bild dennoch leicht korrigieren. Da sich einige unangenehme Details des Originalbildes herausstellten:
- keine GUI (grafische Oberfläche). Dies ist nicht kritisch, insbesondere für ROS. Um jedoch auf einer Linie zu fahren, müssen Sie die Kamera auf der Himbeere selbst kalibrieren und sehen, wie sie (die Kamera) Farben überträgt (mehr dazu weiter unten).
- Die OpenCV-Assembly zeigt das Bild nicht auf dem Bildschirm an, selbst wenn Sie die GUI selbst installieren. Offensichtlich wurde opencv im Rosbots-Projekt ohne diese Option erstellt.
- keine kleinen Krücken (VNC, Texteditor für Notizen, mc).
- Daher wurde OpenCV mit Unterstützung für die Bildausgabe in der GUI (kompiliert von openCV 3.4.3) neu erstellt, eine GUI wurde installiert, kleine Krücken.
Das fertige Bild ist
hier und weitere Arbeiten werden auf seiner Grundlage erstellt.
Konfigurieren Sie das Netzwerk (Wi-Fi) und den ROS-Master auf Himbeer-Pi
.
Ich empfehle dringend, für Experimente einen separaten Router mit Ihrem Wi-Fi zu verwenden. Zu diesen Zwecken können Sie einfach einen Zugangspunkt auf Ihrem Telefon erstellen. Dies liegt an der Tatsache, dass viele Pakete über WLAN fliegen und vorzugsweise nicht im allgemeinen Verkehr versinken.
Konfigurieren Sie das Netzwerk, nachdem Sie das Bild auf die Himbeer-SD-Karte hochgeladen haben. Die anfänglichen Netzwerkeinstellungen lauten wie folgt:
interface wlan0 static ip_address=192.168.43.174/24 static routers=192.168.43.1 static domain_name_servers=192.168.43.1
Enthalten in /etc/dhcpcd.conf
Daher können Sie die Schläuche nicht mit Himbeere verbinden, um alles zu ändern, sondern einfach einen Zugangspunkt mit dem Pathos-Namen Boss und dem Passwort 1234554321 erstellen. Die Himbeeradresse lautet 192.168.43.174. Neben ssh können Sie auch über VNC auf diese Adresse zugreifen: login - pi, password - 123qweasdzxcV.
Lassen Sie uns den ROS-Master konfigurierenEine kleine Bemerkung für diejenigen, die ROS (Robot Operation System) noch nicht kennengelernt haben. Ein ROS-Master ist ein Vermittler, über den verschiedene Knoten in ros kommunizieren (Knoten, Dienste usw.). Wenn der ros-Master nicht oder an der falschen Adresse ausgeführt wird, sehen sich die Knoten nicht.
In unserem ROS-System startet der Assistent automatisch mit dem Laden des Betriebssystems. Wir müssen lediglich die IP-Adresse für den ROS-Assistenten in der entsprechenden Systemdatei angeben.
Wenn Sie die oben aufgeführten Netzwerkeinstellungen nicht geändert haben, müssen Sie nichts konfigurieren.
Andernfalls bearbeiten Sie bashrc:
nano ~/.bashrc
Korrigieren Sie ganz am Ende der Datei die IP-Adressen (beide) für Ihren Fall:
export ROS_MASTER_URI=http://192.168.43.174:11311 export ROS_HOSTNAME=192.168.43.174
Starten Sie neu.
Wenn Sie nun das Terminal auf dem Wagen starten, sieht die Ausgabe folgendermaßen aus (oder was auch immer Sie in den Einstellungen angegeben haben):
For all slaves, "export ROS_MASTER_URI=http://192.168.43.174:11311"
Dies bedeutet, dass der ROS-Master an der angegebenen IP-Adresse arbeitet.
Wir steuern den Wagen über WLAN
Wir werden von Anfang an prüfen, ob die Knoten für uns funktionieren.
Im Terminal:
rosnode list
Die Ausgabe sieht folgendermaßen aus:
/ Rosout
/ uno_serial_node
Wenn nichts herausgekommen ist, überprüfen Sie, ob Sie ROS-Master in den oben beschriebenen Einstellungen registriert haben, ob Sie den USB-Schlauch an Arduino angeschlossen und neu gestartet haben.
Führen Sie nach der Überprüfung den ersten Knoten aus, der für die Bewegung verantwortlich ist:
rosrun rosbots_driver part2_cmr.py
* Der spezielle Befehl ros startet die Datei part2_cmr.py aus dem Python-Paket rosbots_driver
Das System informiert, dass der Knoten ausgeführt wird:

Hier sehen Sie, dass der Radius der Räder und der Abstand zwischen ihnen bestimmt werden. Sie können diese und andere Werte in Bezug auf die Bewegung in der Datei robot.py entlang des Pfads korrigieren
/home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/examples/coursera_control_of_mobile_robots/part2/full/controller
da part2_cmr.py selbst diese Parameter nicht hat. Öffnen Sie das zweite Terminal und geben Sie die Rostopic-Liste ein:

Hier sehen Sie, dass das Thema / part2_cmr / cmd_vel angezeigt wurde. In diesem Thema "hört" / part2_cmr zu, was andere Knoten dazu sagen, und steuert die Bewegung, je nachdem, was sie sagen. Was genau "zuhört", aber nicht "spricht", kann mit dem Befehl verstanden werden.
rostopic info /part2_cmr/cmd_vel

Hier können Sie sehen, dass / part2_cmr Abonnent (abonniert) das Thema und hört.
* Sie können selbst etwas zum Thema "sagen", ohne Knoten.
Zum Beispiel:
rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: 1.0}'
mit dem linken Rad vorwärts drehen
rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: 0.0}'
linkes Rad anhalten
rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: -1.0}'
Mit einem Rad von Rücken zu Rücken drehen
rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: -0.5}'
Drehen Sie mit dem linken Rad langsamer zurück.
Die Syntax lautet: rostopic pub - Wunsch, im Thema zu sprechen, -1 - einmaliger Wunsch, / Wheel_power_left - Thema, in dem wir sagen, std_msgs / Float32 - Sprache (Nachrichtenformat), '{data: -0.5}' - was wir sagen.
Führen Sie nun denjenigen aus, der im Thema / part2_cmr / cmd_vel spricht. Dies ist der Tastaturbefehls-Sendeknoten.
Führen Sie einen anderen aus, ohne das vorherige Terminal mit einem Arbeitsknoten zu schließen, und geben Sie Folgendes ein:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel
* Da die Veröffentlichung standardmäßig im Thema / cmd_vel erfolgt, leiten wir sie mit weiter
/ cmd_vel: = / part2_cmr / cmd_vel, sodass Nachrichten in / part2_cmr / cmd_vel eingegossen werden.
Der Steuerknoten wurde gestartet und Sie können fahren, indem Sie die Tasten auf der Tastatur drücken:

Wenn es unmöglich ist zu fahren oder ein leichtes Quietschen unter den Rädern auftritt, müssen Sie die Geschwindigkeit erhöhen, indem Sie im Terminal bei laufendem Knoten auf "w" klicken. Das Gleiche (Erhöhen oder Verringern) kann mit der Drehzahl erfolgen - der Taste „e“. Es ist auch wichtig, sich in einem Terminal mit einem laufenden Knoten zu befinden, wenn die Steuertasten nicht funktionieren, wenn Sie zu einem anderen Terminal wechseln. Die Taste „k“ im Steuerterminal ist ein Stopp.
Sehen Sie sich in einem separaten Terminal das Thema / part2_cmr / cmd_vel an:

Jetzt gibt es im Thema / part2_cmr / cmd_vel sowohl einen Sprecher als auch einen Zuhörer.
Auf OpenCV die Linie fahren
Bevor Sie irgendwohin gehen, müssen Sie sicherstellen, dass der Roboter mit Tastatursteuerung fährt. Hier ist eine wichtige Bemerkung erforderlich. Wenn Sie im obigen Beispiel über die Tastatur steuern, sollte das Drehen nach links dem Drücken der Taste j entsprechen, nach rechts l (lateinisch l), vorwärts i, rückwärts (Komma). Wenn dies in Ihrem Fall nicht der Fall ist, kann es zu Problemen mit der Reise kommen. Um alles wieder normal zu machen, ist es notwendig, die Drahtpaare, die vom Lokführer zu den Beinen auf Arduino kommen, in unserem Burger 4,5,6,7 Arduino zu ändern: 4,5, um mit 6,7 oder 4 und 5,6 und 7 jeweils mit auszutauschen eine andere, je nachdem, wo sich die Räder drehen. Sie können dies auch programmgesteuert tun, indem Sie den Code für Arduino entlang des Pfads anpassen - /home/pi/gitspace/rosbots_driver/platformio/rosbots_firmware/examples/motor_driver/src/main.cpp
und Laden Sie es auf Arduino mit dem Befehl neu:
upload_firmware ~/gitspace/rosbots_driver/platformio/rosbots_firmware/examples/motor_driver
Lass uns mit Blumen arbeitenUnsere Gartenerfahrung besteht darin, die Linie auf dem Boden hervorzuheben, auf der sich der Roboter bewegt, um seine Farbe zu bestimmen. Standardmäßig sieht der Roboter es nicht. Als Linie können Sie entweder Klebeband (gelb) oder Klebeband oder etwas anderes mit einer charakteristischen Farbe und ziemlich breit verwenden. * Transparentes Klebeband funktioniert wahrscheinlich nicht, weil es wird schwierig sein, vom Hintergrund zu unterscheiden.
Gehen wir in den Ordner und führen das Skript aus:
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python bgr-to-hsv.py
* Achtung! Wenn Sie das Originalbild von Rosbots verwenden und nicht meins, ist dieses Programm nicht vorhanden.
Zwei Fenster öffnen sich:

Hier sind die Farbbereiche im HSV. Was ist hsv und warum nicht rgb, bitte googeln Sie es selbst.
h1, s1, v1 - unterer und h2, s2, v2 - jeweils der obere Bereich.
Jetzt müssen Sie eine Linie mit Klebeband (möglicherweise nicht Klebeband, sondern Klebeband) auf dem Boden auswählen, indem Sie die Schieberegler im Fenster bewegen. Im Ergebnisfenster sollte nur die Isolierbandlinie verbleiben:

Die Linie des Isolierbandes ist ungewöhnlich weiß, alles andere ist schwarz. Dieses Ergebnis ist notwendig.
Notieren Sie sich die Nummern der HSV-Bereiche. Mein Fall ist 56.155,40 und 136.255.255. Die HSV-Bereiche sind unter verschiedenen Lichtbedingungen in der Nähe der Roboterkamera unterschiedlich.
Schließen Sie die Fenster, indem Sie im Terminal Strg + C eingeben und die HSV-Bereiche zur Datei follow_line_step_hsv.py hinzufügen:
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver nano follow_line_step_hsv.py
In den Zeilen:
lower_yellow = np.array([21,80,160]) upper_yellow = np.array([255,255,255])
Wir geben die Nummern unserer HSV-Bereiche an.
Zeit, die Linie zu fahrenWir starten den Motorknoten in Klemme 1:
rosrun rosbots_driver part2_cmr.py
Starten Sie den Kameraknoten im zweiten Terminal:
sudo modprobe bcm2835-v4l2 roslaunch usb_cam usb_cam-test.launch
Führen Sie den opencv-Knoten im dritten Terminal aus:
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python follow_line_step_hsv.py
Wenn alles gut gegangen ist, geht der Roboter entlang der Linie und ein zusätzliches Fenster erscheint:

In diesem Fenster wird das Isolierband mit einem roten Kreis markiert.
Die allgemeine Bedeutung des Codes besteht darin, das Farbsegment in einem bestimmten Abstand von der Kamera hervorzuheben, einen roten Kreis zu zeichnen und zu diesem Kreis zu wechseln, um ihn in der Mitte zu halten.
Schließlich über das Wichtige - über Katzen und Lächeln
Da unser Ziel darin besteht, zur Katze oder zu einer lächelnden Person zu gehen, müssen wir in unserem Code etwas Komplizierteres verwenden. Wir werden auch Katzen und lächelnde Menschen brauchen. Das zweite ist jetzt schwieriger: Nur wenige Menschen lächeln in dieser schwierigen, alarmierenden Zeit. Fangen wir also mit Katzen an.
Für Experimente eignen sich Fotos von Katzen im Gesicht.
Führen Sie den Kameraknoten im 1. Terminal aus:
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python pi_camera_driver.py
Im 2. Terminal der Motorknoten:
rosrun rosbots_driver part2_cmr.py
Im 3. Terminal des Katzensuchknotens:
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python follow_cat2.py
Der Wagen bewegt sich allmählich zur Katze:

Jetzt brauchen Sie einen Freiwilligen, der weiß, wie man lächelt. Machen Sie ein Porträt einer wenig bekannten Persönlichkeit des öffentlichen Lebens in einem kleinen Land.
Im 3. Terminal des Suchknotens der Katze können Sie Strg + C schließen und stattdessen nach einem Lächeln auf dem Gesicht einer wenig bekannten öffentlichen Person suchen:
python follow_smile.py
Der Wagen muss langsam und ungläubig zum Lächeln einer wenig bekannten Person fahren:

Wie viele vielleicht bereits vermutet haben, verwenden die von uns ausgeführten Skripte Haar-Kaskaden. Nach dem gleichen Prinzip wie bei einer Fahrt entlang der Linie wird ein Quadrat des gewünschten Bereichs hervorgehoben, und das Programm versucht, es durch Bewegen des Roboters in der Mitte zu halten.
Leider lässt die Leistung von Himbeer 3b trotz der Kameraeinstellungen von 320x240 und 15 Fps zu wünschen übrig. Verzögerungen machen sich mit zunehmender Zeit bemerkbar. Nicht jede Katze kann es aushalten.
Wie kann dies verbessert werden?
Versuchen Sie, optimiertes OpenCV neu zu erstellen, wie von Adrian empfohlen (https://www.pyimagesearch.com/2017/10/09/optimizing-opencv-on-the-raspberry-pi/). Externe PC-Ressourcen für die Bildverarbeitung verwenden? Versuchen Sie nicht, Bilder in JPEG zu komprimieren, die zum Haar-Handler fliegen? Und noch ein großes Minus - Katzen sollten groß und vorne sein. 15 cm Abstand auf A4-Blatt. Wenn Sie sich von der Kamera entfernen, ist die Katze bereits nicht wiederzuerkennen und unverwundbar. Ein Himbeermonokel mit 8-facher Vergrößerung vor die Kamera stellen?
PS: Wenn Sie Experimente mit dem im Artikel angegebenen Bild in die Hände bekommen, können Sie immer noch für verschiedene Körperteile fahren und entsprechend anstelle des Katzenknotens starten:
python follow_fullbody.py python follow_upperbody.py python follow_lowerbody.py
Gesicht oder Auge:
python follow_face.py python follow_right_eye.py
Wenn Sie daran interessiert sind, wie Sie sich reibungslos entfernen können, damit der Roboter keinen Tee verschüttet, und wie Sie ihn nicht mit Himbeeren selbst bedienen, schreiben Sie.