Quadrocopter

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

  Ein Projekt, bei dem durch Handgesten das Steuern eines Quadrocopters ermöglicht worden ist.


Grundidee

Jeder kennt es: Modellfliegen. Ob Kind, Kind gebliebener, Erwachsener, Hobbybastler, Hobbypilot oder einfach nur Flug Fan. Allen gefällt es, das fliegen kleiner Fluggeräte per Fernsteuerung.
Man umklammert die Fernsteuerung fest in seinen Händen und startet in das Abenteuer. Aber halt, warum muss man was 'umklammern' oder per 'Fernsteuerung' steuern, wenn wir im 21. Jahrhundert leben
und schon längst die Zukunft eingeholt haben, und das Science-Fiction der Vergangenheit zum Teil schon jetzt Real geworden ist. Ich spreche von 'Gestensteuerung'. Der Steuerung von Maschinen, Computern oder auch Flugobjekten
ohne jegliche Tastatur oder Fernbedienung, sondern mit den elementarsten Mittel das dem Menschen zur Verfügung steht: Den Händen!

Unsere Idee war es die Ar.Drone, umgangssprachlich Quadrocopter genannt, nicht wie ursprünglich vorgesehen mit dem Iphone/Ipad zu steuern, sondern nur mit den Händen.
Man sollte alle Bewegungen des Quadrocopters ansteuern können, die man auch mit der eigentlichen Fernsteuerung ausüben kann. Also 360° drehen, nach vorne/hinten/links/rechts fliegen, nach oben/unten bewegen.
Zusätzlich wollten wir das Bild der Dronenkamera auf eine Leinwand projizieren, mit einer zusätzlichen Aufnahme der steuernden Person selbst und Rechtecken im Bild um ein besseres Gefühl für die Steuerung zu bekommen und den Quadrocopter präziser fliegen zu können.

Umsetzung

Komponenten

Parrot AR.Drone

Parrot AR.Drone
  • hierbei handelt es sich um einen ferngesteuerter Quadrocopter des französischen Herstellers Parrot SA
  • die Drone kann über eine App, die für Apple iOS und Android zur Verfügung steht, vom Benutzer gesteuert werden
  • der Quadrocopter besitzt mehrere Sensoren, die unter dem Rumpf angebracht sind (z.B. für die Höhenregulierung)
  • zwei integrierte Kameras (Front und Boden) für die Liveübertragung des Bildes auf das Steuergerät
  • hochwertige Brushless-Motoren
  • integrierter Autopilot
  • sehr stabile Fluglage durch Videostabilisierung
  • Reichweite von bis zu 50 m

Weiterführende Informationen:
- http://wiki.ohm-hochschule.de/wikitoolbox/index.php/Parrot_AR.Drone
- http://de.wikipedia.org/wiki/Parrot_AR.Drone
- http://www.parrot.com/de/
Link=https://commons.wikimedia.org/wiki/File%3AXbox-360-Kinect-Standalone.png

Kinect

  • Hardware zur Steuerung von Videospielen der Xbox 360
  • Bedienung der Software durch Körperbewegungen
  • die Steuerung wird durch eine Kombination von PrimeSense-Tiefensensor, 3D-Mikrofon, Farbkamera und Software ermöglicht
  • außerdem ist eine Sprachsteuerung möglich
  • angeschlossen wird die Kinect mit einem üblichen USB Stecker


Weiterführende Informationen:
- http://de.wikipedia.org/wiki/Kinect
- http://www.xbox.com/de-DE/Kinect


Programm (Code) & Schnittstellen


I. Vorbereitung:

Folgende Schnittstellen werden verwendet:

- OpenNi (API) & Kinect Treiber (http://www.openni.org/)
- SimpleOpenNi (Processing Libary) (http://code.google.com/p/simple-openni/)
- ARDroneForP5 (Processing Libary) (http://kougaku-navi.net/ARDroneForP5/index_en.html)

Der Programmcode ist in Processing (http://processing.org/) realisiert, da die notwendigen Schnittstellen zu unserer Peripherie für Processing vorhanden und ausreichend dokumentiert sind.

II. Ansteuerung der Kinect:

Die Kinect wird mit der USB-Schnittstelle des Rechners verbunden. Über den von OpenNI mitgelieferten Treiber wird die Kommunikation zwischen OpenNI und der Kinect hergestellt. Da die Verarbeitung der Daten in Processing realisiert ist, muss die Processing Libary „SimpleOpenNI“ eingebunden werden. Diese erlaubt über einfache Befehle auf die Funktionalitäten von OpenNI zuzugreifen.

III. Ansteuerung der AR Drone:

Die AR-Drone erzeugt einen WLAN-Accesspoint mit dem das Steuergerät (der Rechner) verbunden wird. Über DHCP wird dem Rechner eine IP-Adresse zugewiesen. Die Steueranweisungen (vor, zurück, hoch, runter, etc.) werden über Netzwerkpakete zur AR-Drone versendet und entsprechend umgesetzt. Um diese Nachrichten über Processing zu versenden wird die Libary „ARDroneForP5“ verwendet. Diese ermöglicht über einfache Befehle ( z.B. ardrone.down() ) die AR-Drone zu kontrollieren.

IV. Verarbeitung der Daten:

Im nachfolgenden Text wird kurz der Aufbau unseres Processing-Codes erklärt (eckige Klammern weißen auf Programmcode hin):

Zuerst werden die beiden Bibliotheken in Processing eingebunden (SimpleOpenNi und ARDroneForP5).

[ import SimpleOpenNI.*; ]
[ import com.shigeodayo.ardrone.processing.*; ]

In der setup()-Funktion wird OpenNI mitgeteilt, Personen mit Hilfe der 3D-Sensordaten der Kinect zu erkennen und deren Skelett zu berechnen. Dies geschieht über Befehle der SimpleOpenNI Libary.

[ Kinect.enableUser(SimpleOpenNI.SKEL_PROFILE_ALL); ]

Erkennt OpenNI eine Person, werden die XYZ-Koordinaten der sogenannten Joints (das sind signifikante Punkte des Körpers wie Hände, Kopf, Hüfte, etc.) berechnet. Auf diese kann nun in Processing zugegriffen werden.
Zusätzlich wird die Verbindung zu der AR-Drone hergestellt:

[ ardrone=new ARDroneForP5("192.168.1.1"); ]
[ ardrone.connect();]
[ ardrone.connectNav(); ]
[ ardrone.connectVideo(); ]
[ ardrone.start(); ]


Unser Programm fordert in jedem Durchlauf der draw()-Schleife die Koordinaten der linken und rechten Hand an und speichert diese in die 3D-Vektor-Variablen.

[ PVector JointLinkeHand = new PVector(); ]
[ Kinect.getJointPositionSkeleton(SimpleOpenNI.SKEL_LEFT_HAND, JointLinkeHand); ]

[ PVector JointRechteHand = new PVector(); ]
[ Kinect.getJointPositionSkeleton(SimpleOpenNI.SKEL_LEFT_HAND, JointRechteHand); ]

Da zur Steuerung nur die Bewegung der jeweiligen Hand nach Links und Rechts eine Rolle spielt, werden die XYZ-Vektor-Variablen im nächsten Schritt in x und y Variablen zerlegt.
Anhand dieser Variablen werden Kreise für die linke und die rechte Hand gezeichnet. Daher müssen diese Variablen an den Anzeigebereich angepasst werden.

Zerlegung und Anpassung:

[ xPosLinkeHand = (JointLinkeHand.x/0.3)*(-1)+1700; ]
[ yPosLinkeHand = (JointLinkeHand.y/0.2)-550; ]

[ xPosRechteHand = (jointRechteHand.x/0.3)*(-1)+1700; ]
[ yPosRechteHand = (JointRechteHand.y/0.2)-550; ]

Zeichnen:

[ ellipse(xPosRechteHand, yPosRechteHand, 50, 50); ]
[ ellipse(xPosLinkeHand, yPosLinkeHand, 50, 50); ]

Um dem Benutzer die Steuerung zu erleichtern, werden zusätzlich zwei Rechtecke gezeichnet. Über eine Kollisionserkennung wird nun erkannt ob die Variablen bzw. der jeweilige Kreis das Rechteck verlässt. Dementsprechend wird der AR-Drone eine entsprechende Steuernachricht geschickt.

Zum Beispiel:
[ if ( xPosLinkeHand > 850 ) { ardrone.down(50); } ]

Das Live-Bild der AR-Drone Front-Kamera wird per WLAN übertragen und in FullScreen angezeigt.

[ image(ardrone.getVideoImage(false),0,0,1400,1050); ]

Steuerung

Der Ausgangszustand im Ruhezustand

Steuerung Ruheposition.jpg

Die Händebewegung für das Starten der Drone

Steuerung1.png

Probleme

  • Ein Problem stellte das Videostreaming der Drone dar:

Sobald man das Programm und damit den Quadrocopter startete, begann auch das Streamen der Dronenkamera auf dem Bildschirm.
Jedoch konnte man nach wenigen Sekunden nur noch ein Standbild der Aufnahme ausmachen. Ebenso wurde ein Fehler in Processing angezeigt, dass der Speicherpuffer voll sei.
Das Problem war das jedes einzelne Bild der streamenden Kamera eigens angelegt und gespeichert wurde. Verständlicherweise wurde dabei schnell die Kapazität des dafür verfügbaren Speichers erreicht.
Lösung: Wir schrieben das Programm dahingehend um, dass es nach jedem einzelnen Bild den zugehörenden Speicher wieder freigibt, und darin das neue Bild wieder speichert.


  • Die Latenz:

Ein weiteres Problem ist die Latenz. Also die zeitliche Verzögerung von Eingabe (zB Handbewegung nach vorne) bis zur Ausführung der Drone (zB Flugbewegung nach vorne).
Anfangs ließen wir alles über einen Rechner laufen, dabei herrschte eine größere Latenz. Wenn man die Drone per Gestensteuerung drehen wollte, dauerte es 1 - 2 Sekunden bis die Drone reagierte.
Später nahmen wir zur Realisierung des Projekts 2 Rechner her. Über einen PC ließen wir das Programm und Steuerung laufen, und über den anderen nur das Streamende Video und die Beamer Ausgabe.
Die Latenz wurde dadurch drastisch verringert, da die Rechenaufgabe aufgeteilt wurde und damit die Rechenleistung erhöht wurde. Nun konnten wir die Drone fast ohne Verzögerung mit den Händen steuern.
Jedoch ist eine komplette Beseitigung einer Latenz physikalisch unmöglich, da der Datenstrom immer eine gewisse Zeit in Anspruch nimmt. Jedoch kann man durch erhöhen der Rechenleistung und Verminderung der Komplexität des Systems die Latenz soweit vermindern,
sodass es für die Menschlichen Sinne kaum warzunehmen ist.


  • Ein kleineres Problem war das treffen der richtigen Einstellungen für die Größe der Rechtecke und für die Geschwindigkeit des Quadrocopters:

Die Rechtecke in denen die Hände bzw. Punkte liegen, dürfen nicht zu groß oder zu klein sein. Man soll ein natürliches Gefühl für die Bewegungen der Drone bekommen,
ohne das man mit den Händen weite Strecken zurücklegen muss. Ebenso darf die Drone aber auch nicht bei der geringsten Handbewegung ausschlagen. Die Drone hat einen Variablen Neigungswinkel, d.h. man kann sie mit verschiedener Geschwindigkeit fliegen.
aber was war nun die 'passende' Geschwindigkeit, mit der man am meisten Kontrolle mit den Händen hatte. Wir legten uns fest die vorwärts/rückwärts/rechts/links Bewegung variabel zu machen.
Also je weiter die Hände aus dem Rechteck sich entfernen, desto schneller wird die Drone. Die Rotier- und Höhenbewegung legten wir konstant fest.

Ausblick

Alles in allem konnten wir unsere Grundidee voll und ganz gut umsetzen. Jedoch steckt noch ein viel größeres Potenzial in diesem Thema und vor allem auch in dieser Sparte der Interaktion. Das System könnte noch rundum aufgewertet werden (aktuellere Drone mit HD Stream, Vereinfachung des Programmcodes, bessere Visualisierung der Projektion, etc.). Die Ar.Drone ist vielleicht nur ein kleines Beispiel, was in der Verbindung der Interaktion mit diesem Thema möglich ist. So könnte man theoretisch ebenso jedes andere Flugobjekt, ob ferngesteuertes Flugzeug oder Helikopter auf Steuerung durch Hände umstellen und somit ein völlig neues Gefühl des Fliegens erleben.