AR.Drone 2.0 unter Linux mit einem Joystick fliegen

ardrone_joystick

Auf dem Weg zu unserem Fernziel, die Drohne autonom einige GPS-Wegpunkte abfliegen zu lassen, sowie auch für die fertige Software macht es Sinn, die Kontrolle im Notfall selbst wieder übernehmen zu können. Hierzu evaluieren wir die Möglichkeit, die Drohne mit einem Joystick über die Bodenstation zu steuern.

Wir werden dabei zunächst die zuvor aufgesetzte Crunchbang Linux VM mit dem AR.Drone SDK verwenden, um die Drohne mit einem Logitech Freedom 2.4 USB-Joystick zu steuern. Zur Projektdokumentation und Benefit für andere, werden wir dies hier im Stile einer Anleitung verfassen. Um die Drohne mit einem USB-Joystick steuern zu können, müssen wir diesen als erstes von der Host-Maschine mittels eines USB-Filters an die VirtualBox-VM durchreichen:

Nun den USB-Stecker abziehen und direkt wieder anstecken. Im Log der Gastmaschine sollte das USB-Gerät erkannt worden sein. Wir vergewissern uns, ob dies auch so ist:

System log beim Anschluss eines USB-Joysticks

System log beim Anschluss eines USB-Joysticks

Der Joystick wurde erkannt und kann nun verwendet werden. Nun ermitteln wir noch den Pfad, unter dem wir das Gerät ansprechen können:

Interessant sind hier die mit js beginnenden Geräte

Interessant sind hier die mit js beginnenden Geräte

In meinem Fall war das /dev/input/js2 – dies kann aber abweichen. Wer sichergehen will, installiert nun noch die joystick-Pakete zum Kalibrieren und Testen seiner Eingabegeräte:

Mittels jscal kann der Joystick – falls nötig – nun kalibriert werden. Mit dem ebenfalls enthaltenen Tool jstest kann der Joystick dann getestet werden:

jstest

Nach dem Start der zuvor gebauten, mit dem AR.Drone SDK 2.0.1 mitgelieferten Beispielanwendung, wird dort unser Joystick auch angezeigt – lässt sich allerdings nicht konfigurieren:

Der Joystick wird zwar von der Beispielanwendung erkannt, kann aber nicht konfiguriert werden.

Der Joystick wird zwar von der Beispielanwendung erkannt, kann aber nicht konfiguriert werden.

Für ein spezifisches Eingabegerät, wie hier der Logitech Joystick, muss in diesem Fall noch eine Konfigurationsdatei der Beispielanwendung angepasst werden. In der ardrone.xml (Bei Verwendung der Crunchbang-VM im Verzeichnis ~/ARDrone_SDK_2_0_1/Examples/Linux/Build/Release) tragen wir die Device-ID des Joysticks ein. Die ID können wir mit folgendem Befehl ermitteln:

Die beiden Hexadezimalwerte nach

Die beiden Hexadezimalwerte nach “ID” repräsentieren Vendor- und Device-ID

Die ermittelte ID “046d:c213″ müssen wir nun noch in das Dezimalsystem konvertieren (74301971) und in die ardrone.xml eintragen. Der Eintrag für den verwendeten Logitech Freedom 2.4 Joystick sieht wie folgt aus:

Hierzu sei erwähnt, das die value-Attribute die Achs- bzw. Button-Nummer des Joysticks darstellen, die bei Buttons mit denen des zuvor erwähnten jstest-Tools identisch sind – aber Vorsicht: Die Achsennummer die hier angegeben wird ist die Achsennummer von jstest + 1 (jstest Achse 0 -> Valuewert=1). Das Typ Attribut spezifiziert, ob es sich um einen Button (3) oder eine Achse (1) handelt. Ist ein Eintrag vom type=”3″, so kann der zugehörige value-Eintrag negativ sein – hiermit wird die Richtung der Achse spezifiziert. Um es noch einmal zu erwähnen: Bevor nun geflogen werden kann, sollte eine Kalibrierung des Eingabegeräts vorgenommen worden sein. Bei meinen Tests ergab die Überprüfung, ob das Gerät kalibriert ist via

immer die Rückmeldung “jscal: axes not calibrated”. Augenscheinlich wird dort überprüft, ob die Mittelstellung exakt getroffen wird, was bei den Achsen des erwähnten Joysticks als auch denen eines ebenfalls getesteten Gamepads selbst nach einer Kalibrierung nicht zutraf. Man muss also damit leben, den Joystick zuerst mittels

zu kalibrieren und anschließend per

selbst abzuschätzen, ob die Mittelstellung “genügend genau” erreicht wird. Um einige Werte zu nennen: Nach der Kalibrierung verfehlte mein Joystick die Mittelstellung in einigen Achsen um bis zu 2000, wobei die Achsen auf Werte von -32767 bis +32767 abgebildet werden. Bei den Flugtests stellte sich dies als nicht sonderlich problematisch heraus, weshalb auf weitere Recherchen zum konfigurieren von Tot- und Sättigungszonen der Achse verzichtet wurde – falls hier jemand eine Lösung hat, möge er uns doch bitte mit seinem Kommentar erleuchten ;-)

Zum Fliegen selbst. Wir starten die Beispielanwendung (neu)

und Konfigurieren unterhalb des Menüpunktes “Input Configuration” via Klick auf “USB configuration” unseren Joystick aus der Dropdown-Liste und klicken “OK”.

Konfiguration des USB-Joysticks

Konfiguration des USB-Joysticks

Zum Starten jetzt den Button am Joystick drücken, der mit Emergency/Reset belegt ist. Dabei sollten die LEDs der AR.Drone ihre Farbe wechseln – bei den Tests funktionierte das nicht immer und der Button musste einfach mehrfach gedrückt werden. Ab hier kann mit dem Take-Off-Button gestartet und geflogen werden. Für den ersten Start empfiehlt es sich mittels des “Flight-Control-Settings”-Buttons die maximalen Neigungswinkel und Geschwindigkeiten etwas zu drosseln. Bei der zuvor aufgeführte XML-Belegung (ardrone.xml) für den Joystick, wurden neben den drei Hauptachsen folgende Buttons – der Nummerierung auf dem Joystick selbst folgend – belegt:

Button-Nummer
Aktion
6Emergency/Reset
7Takeoff/Land
1Höhe +
2Höhe -

Die Korrekturen durch jscal können zur späteren Wiederverwendung gespeichert werden

Das Ergebnis ist dann eine Datei (hier) Logitech_Freedom_2.6_calibration.jscal, die einen Kommandozeilenbefehl enthält, der die Kalibrierungsdaten wieder übernimmt. Für den getesteten Joystick war das

Die Daten können dann später einfach per

wiederhergestellt werden.

 

One thought on “AR.Drone 2.0 unter Linux mit einem Joystick fliegen”

  1. I enjoy, result in I discovered exactly what I was looking for.
    You have ended my four day long hunt! God Bless you man. Have a nice day.
    Bye

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">