In diesem Teil wollen wir den Roboter nun auch noch mit einem Xbox 360 Controller fernsteuern. Im Vergleich zu der Infrarot Fernbedienung hat der Controller den Vorteil, dass er zwei Joysticks besitzt, welche optimal zum Steuern geeignet sind. Zusätzlich lässt sich mit dem zweiten Joystick z.B. eine Kamera drehen und die Knöpfe können ebenfalls mit Funktionen versehen werden.
Auch wenn wir bereits eine Steuerung realisiert haben, finde ich diese Art doch um einiges cooler. Daher geht es in diesem Video um die Einrichtung der kabellosen Xbox 360 Controller Fernsteuerung.
Zubehör
In diesem Tutorial wird nicht viel benötigt, im speziellen nur der Controller und Adapter:
Wer einen Raspberry Pi Zero verwendet, wird ggf. Probleme mit der Stromversorgung bekommen. Nichtsdestotrotz ist ein kleiner USB Hub nötig, da der einzige USB Port des Zero Models höchstwahrscheinlich für den Wlan Adapter gebraucht wird.
Vorbereitung & Installation des Xbox360 Controllers
Bevor wir den Controller mit dem Raspberry Pi verbinden und die Funktionen definieren, müssen die benötigten Treiber installiert werden. Im Tutorial „Raspberry Pi mittels Xbox 360 Controller steuern“ ist die Installation und einige Tests, ob der Controller erkannt wurde, genau erklärt. Die Beispiel Schritte sowie die Nutzung als Maus kannst du überspringen. Wichtig ist nur, dass bevor du fortfährst dein Xbox Controller also erkannt und bereit sein sollte.
Da das Kabel des Adapters doch recht lang ist, würde ich das beiliegende Gummi erst gar nicht abnehmen oder das Kabel ggf. wieder aufwickeln. Die Platzierung spielt dabei keine Rolle, da keine visuellen Infrarotsignale sondern Funksignale gesendet und empfangen werden. Im Video habe ich den Adapter vorne über die Ultraschall-„Augen“ gehängt, was vielleicht nicht die beste Wahl ist, sofern auch die automatisches Hinderniserkennung beibehalten bleiben soll 😉
Modul laden und Code erweitern
Zum Erkennen der Signale nutzen wir die selbe Bibliothek, die im vorherigen Tutorial auch genutzt wurde. Dafür laden wir uns zunächst diese Datei in unseren Roboter Ordner:
cd robot/ wget https://raw.githubusercontent.com/FRC4564/Xbox/2dcc49eb198e57e4dd0af9a15e53fef85c411ea1/xbox.py
Diese (und die math) Bibliothek binden wir in unserer Main-Datei ein. Dazu bearbeiten wir sie und ergänzen den Code am Anfang um die beiden import
Befehle.
sudo nano robot.py
1 2 |
import math import xbox |
Anschließend gilt es den Code am Ende zu erweitern. Dazu erstellen wir zwei Funktionen, dessen Erklärung du nachfolgend findest.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
def moveByAxis(self, x, y): if x == 0.0 and y == 0.0: # nowhere to move, stop self.motor.stop() elif x == 0: # only forward / backward if y < 0: self.motor.backward() else: self.motor.forward() else: angle = math.degrees(math.atan(y/x)) angle += 180 if x < 0 else 360 angle = angle % 360 if angle == 0: self.motor.forwardRight() elif angle == 180: self.motor.forwardLeft() if angle > 0 and angle < 90: # forwardRight self.motor.forwardRight() time.sleep(self.motor.SEC_PER_TURN / 360.0 * angle) self.motor.forward() time.sleep(5.0 / self.motor.DIST_PER_SEC) # move 5cm forward elif angle > 90 and angle < 180: # forwardLeft angle -= 90 self.motor.forwardLeft() time.sleep(self.motor.SEC_PER_TURN / 360.0 * angle) self.motor.forward() time.sleep(5.0 / self.motor.DIST_PER_SEC) # move 5cm forward def xboxControl(self): joy = xbox.Joystick() while not joy.Back(): # button A to stop if joy.A(): self.motor.stop() else: # left joystick to move x, y = joy.leftStick() self.moveByAxis(x, y) joy.close() |
Speichere und beende mit STRG+O und STRG+X.
Die Funktion xboxControl
ist zum Verwalten der Tastendrücke/Bewegungen des Joysticks von dem Controller da. Hier können wir bestimmte Funktionen aufrufen, sofern eine Taste gedrückt wurde. In unserem Fall soll das Drücken der A-Taste den Roboter stoppen lassen (auch wenn der Joystick bewegt wird). Falls die Taste nicht gedrückt wird, so wollen wir den Roboter mit Hilfe des linken Joysticks steuern.
Die eigentliche Bewegung findet wiederum in der Funktion moveByAxis
statt. Ist der Joystick in der Mitte (x = y = 0), so soll der Roboter stoppen, ansonsten in die angegebene Richtung fahren. Da der Code recht selbstbeschreibend ist, gehe ich hier nun nicht weiter darauf ein. Solltest du eine spezielle Frage haben, kannst du diese gerne als Kommentar posten.
Der Vollständigkeit halber muss noch gesagt werden, dass ein Bewegen des Joysticks nach hinten rechts bzw. hinten links keine zugeordnete Bewegung hat, da ich sie nicht gebraucht habe. Falls du die Funktionalität einbauen möchtest, musst du analog zu den vorherigen Abfragen den Winkel betrachten: Dieser liegt zwischen 180 und 270 falls der Stick sich unten links befindet und zwischen 270 und 360 im unteren rechten Bereich.
Code testen
Abschließend wollen wir den Roboter natürlich auch fahren lassen. Stelle dazu sicher, dass der Xbox 360 Controller an ist und erkannt wurde (gedrückte Tasten sollten erscheinen):
sudo xboxdrv --detach-kernel-driver
Wird die Eingabe erkannt, brich mit STRG+C ab.
Nun öffnest du die Python Konsole (sudo python
) und kopierst folgenden Code hinein:
1 2 3 4 5 6 7 8 9 10 |
from robot import Robot import time try: r=Robot() r.xboxControl() except Exception as e: print(e) finally: r.motor.stop() |
Sofern alles funktioniert kannst du den Roboter mit dem linken Steuerknüppel fernsteuern. Im nachfolgenden Video siehst du wie ich meinen Raspberry Pi Roboter mit Hilfe des Xbox 360 Conrtollers hin und her navigiere.
Sofern du nur eine kurze Drehung möchtest, darf der Stick auch nur kurz in diese Richtung gedreht werden. Da es damit manchmal gar nicht so einfach ist, den Roboter präzise zu steuern, habe ich den A-Knopf als Bremse vorgesehen.
Als Zusatz kann nun der rechte Controller bspw. einen Servo- oder Schrittmotor drehen, auf dem eine Livestream Kamera befestigt ist.
40 Kommentare
mache doch noch ein toturial z.B.:
den roboter bei einer roten ampel anhalten lassen
Du meinst mit Kamera drauf, sodass er automatisch diese erkennt? Falls ja, muss ich sagen, dass das den Rahmen sprengt. Damit beschäftigen sich u.a. ganze wissenschaftliche Teams und Firmen (Stichwort autonomes Fahren) und ist nicht so einfach wie es klingt 😀
Geniale Artikel! Bitte noch einen – mit oder ohne Ampel. Die Serie ist super!
Ich bin für Vorschläge offen 🙂
Wäre es vielleicht möglich einen kleinen bildschirm an den roboter zu bauen der auf sprachbefehle oder auf Musik reagiert und entsprechende Muster dazu anzeigt?
Es wäre echt cool wenn du das machen könntest (voraussetzlich es ist möglich).
Oder du lässt den Roboter „Tanzen“ das wäre auch cool.
Liebe Grüße
Max
Hallo max,
möglich ist das (Tutorial zum Bildschirm), jedoch habe ich schon etwas länger nicht an dem Roboter weiter gebaut, da inzwischen andere Projekte anstehen 🙂
Viele Grüße,
Felix
Evtl. Kamera Livestream und Steuerung über ein Web-Interface?
Das sollte sich einfach mit diesem Tutorial realisieren lassen: Raspberry Pi + Android: Schwenkbarer Kamera-Livestream
Vielleicht machen wir noch ein darauf angepasstes Tutorial.
Das wäre super. Alternativ könnte man versuchen etwas mit GPS zu bauen oder evtl. einem Pfad mit der Kamera (Raspberry Pi Kameramodul) folgen lassen?
Was für mich auch interessant wäre, … hat evtl. jemand das Tutorial erfolgreich mit einem 4WD-Bausatz hinbekommen? Ich möchte das Fahrzeug gerne mit 4 Rädern statt diesen 3 Rädern bauen.
Du müsstest dazu nur den Code zum Fahren ein wenig ändern: Statt nur ein rechtes/linkes Rad zu drehen, müssen sich beide drehen. Und einen L293D mehr bräuchtest du.
Hi Felix,
müsste ich dann auch den Code für die Verfolgung der Linie und den Ultraschall anpassen?
Kommt drauf an, ob du sie ersetzen oder eben nur an die anderen Sensoren anpassen willst.
Hallo super Tutorial, es gibt zu diesen Themen sehr wenig in Deutsch.
Was mich interessieren würde wäre eine Objektverfolgung über Kamera.
Hallo,
hat das hier zufällig jemand mit einem Playstation 3 Controller geschafft?
Ich habe einen Raspberry Pi 3, welcher ja Bluetooth integriert hat und habe den Controller auch schon gekoppelt, sodass er unter /dev/input/js auftaucht.
Allerdings habe ich keine Ahnung, wie ich den Controller hier einbinde um ihn für das Steuern der Servos zu nutzen :/ Bräuchte da bitte etwas Hilfe
Das Tutorial hier ist nur für Xbox 360 Controller und wird nicht mit einem Playstation Controller funktionieren. Eventuell gibt es andere Packages, die ihn unterstützen.
Wie wäre es mit einem WebInterface zum Steuern des Roboters inkl. LiveStream des Bildes?
Das ganze wäre mit einer Pan/Tilt-Kamera ganz interessant (könnte man über 2 Servos SG90 realisieren) und diese Servos noch über den XBox-Controller steuern.
Ich hatte mir sowas auch schon überlegt. Wir haben aber etwas ähnliches bereits (eine Achse) für Android Smartphones entwickelt: Raspberry Pi + Android: Schwenkbarer Kamera-Livestream
Das macht ja nichst, evtl. könnte man dann mit OpenCV o.ä. noch etwas anstellen?
Tiefenerkennung wäre noch so eine Sache. Ich habe mal vor über einem Jahr dazu einen Test gemacht (auf einem Raspberry Pi 2) und es war leider nicht echtzeitfähig. Wenn Interesse besteht, kann ich versuchen dazu dennoch noch ein Tutorial zu machen.
Ich würde mich auf jeden Fall freuen und habe Interesse! Bitte Bitte Bitte!
Hallo, ich wollte mich nach dem Tutorial für die Tiefenerkennung mit OpenCV erkundigen. Ist sowas geplant oder schon umgesetzt?
Ist geplant und teilweise auch schon umgesetzt, aber ich habe noch keine Zeit gefunden, das in ein Tutorial zu schreiben.
evtl. könnte man mit OpenCV auch Marker tracken und damit den Roboter selbstständig fahren lassen oder sowas? Fände ich auch interessant 🙂 Wäre schön, wenn du sowas umsetzen könntest.
Guten Morgen,
das Tutorial gefällt mir sehr gut; danke. Eine Frage kennst Du eines, bei dem ein Robi an eine bestimmte Koordinate (x,y) in einer zweidimensionalen Matrix geschickt wird?
Liebe Grüße
Georg
Wenn du sie per GPS abfragst, sollte das möglich sein. Ansonsten müsstest du die aktuelle Koordinaten irgendwie herausfinden, bevor du das Ziel setzen kannst.
Hallo, ich habe meinen Roboter jetzt fertig und er fährt auch gut. Vielen Dank für die Skripte. Um diese zum Laufen zu bringen, brauchte ich aber Hilfe. Gut, dass ich einen Schwiegersohn habe, der sich damit auskennt. Es waren irgend welche versteckten Zeichen, die gestört haben. Jetzt funktioniert es.
Eine Frage habe ich noch. Ich muss den Roboter über Monitor und Tastatur starten. Beim Runterfahren reicht schon die Tastatur und 4 Tasten. Wie kann ich im autostart den Roboter ansteuern, so dass ich nichts weiter brauche. Vielne Dank schon im Voraus
Raspifrog
Starte einfach das Skript, das du im Moment manuell startest per Autostart.
Hallo Felix,
Mein Roboter fährt ausgezeichnet. Vielen Dank für den Link.
Ich habe mal gelesen, dass man den pi herunterfahren kann, indem man 2Pins kurzschliesst. Ich weiß aber nicht mehr welche. Kannst Du helfen?
Einen Shutdown Pin gibt es nicht, aber du kannst ein Skript schreiben und in den Autostart packen, welches bei anliegender Spannung den Pi herunterfährt. Dazu einfach den Pin als Input zuweisen und einen Trigger setzen.
Sorry that I don’t speak German, but I keep running across a problem when trying to run the test code. It says:
‚Robot‘ object has no attribute ‚xboxControl‘
Traceback (most recent call last):
File „/home/pi/RaspberryPi-Robot/xboxrobot.py“, line 10, in
r.motor.stop()
AttributeError: ‚Robot‘ object has no attribute ‚motor‘
I don’t know if I have all of the files that I need from the other parts of the robot tutorial. I only wish to make a robot that is controlled using the Xbox 360 controller. I would appreciate it if someone could help me. Thanks!
You can download the code from GitHub and compare it to yours. You are probably missing files.
Are all of the robot files on GitHub? Or just xbox.py?
All of them: https://github.com/tutRPi/RaspberryPi-Robot
Okay, that problem appears to be fixed. Now, it gives me a different error, saying:
Unable to detect Xbox controller/receiver – Run python as sudo
My controller should be connected, because I can run “ sudo xboxdrv –detach-kernel-driver“ and it detects the controller. Is this a problem with the code, or something else?
Have you run python as root (sudo python …) ?
Hallo,
mich würde auch interessieren, wann der Teil mit OpenCV hier erscheint? Kanns kaum erwarten 🙂
Hallo,
habe nun alle Teile des Raspberry Robot Tutorials nachgebaut.
Sehr, sehr geil ! Habe eine Menge gelernt !
Vielen, vielen Dank !
Hey, hoffe jemand ist noch hier 😀
Wir arbeiten momentan an unserer VA. Ich bin momentan dieser anleitung am folgen, super beschrieben!
Jedoch habe ich das Problem dass wenn ich den code in die python konsole kopiere folgender fehler kommt:
„from robot import Robot
ImportError: cannot import name Robot“
Woran könnte das liegen? Danke im voraus 🙂
Hallo Felix, auch ich bin gerade dabei, diese coole Projekt mit meinem Pi3 umzusetzen und wollte dafür meinen XBox One Wireless Controler dafür verwenden.
Die Verbindung über Bluetooth klappt wunderbar und wenn ich Joystick installiere und dann teste mit:
sudo jstest /dev/input/js0
Driver version is 2.1.0.
Joystick (Xbox Wireless Controller) has 8 axes (X, Y, Z, Rz, Gas, Brake, Hat0X, Hat0Y)
and 15 buttons (BtnA, BtnB, BtnC, BtnX, BtnY, BtnZ, BtnTL, BtnTR, BtnTL2, BtnTR2, BtnSelect, BtnStart, BtnMode, BtnThumbL, BtnThumbR).
Testing … (interrupt to exit)
Axes: 0: 0 1: 0 2: 0 3: 0 4:-32767 5:-32767 6: 0 7: 0 Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 10:off 11:off 12:off 13:off 14:off
kann ich die Joystickwerte und alle Taster erfolgreich testen.
Nur wie komme ich jetzt an die events, so wie im xbox.py beschrieben? Kann man das umschreiben?
Über eine Antwort würde ich mich sehr freuen!
Grüße Roland