Arnect

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

Ein Projekt, bei dem eine AR-Drohne durch die Bewegungen des Anwenders vor einer Kinect gesteuert werden kann, sodass die Drohne den Anwender "nachahmt".


Umsetzung

Grundgedanke

ARnect Module .jpg


Mithilfe des KinectA-Moduls ist eine genaue Positionsbestimmung von verschiedenen Punkten am menschlichen Körper sowie deren selektiver Auswertung möglich.


KinectA versendet die Koordinaten der Skelett-Punkte anschließend via OSC. Das Modul "OpenDroneControl", das für die Steuerung der Drohne zuständig ist, empfängt die Daten, und wandelt diese in entsprechende Steuerbefehle um.



Komponenten

ARParrot

Parrot ar drone 12.jpg
  • Drohne bereits vorhanden
  • Akkulaufzeit ausreichend für Funktionstests



Weiterführende Informationen:
- http://www.parrot.com/de/

Kinect

Kinect Desc.png
  • 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

OSC Nachrichten

OSC-Schnittstelle


In diesem Fall wird OSC verwendet, um die drei Werte an einen Laptop weiterzusenden. Die Nachricht besteht aus einer Adresse, in diesem Fall „/skeletons/ID-centralXYZ“ und den vier Werten. Die Werte werden an die Adresse angehängt: Der erste Wert ist die id des erkannten Objekts, danach der Wert für die Rechts- und Linksbewegung, dann der Wert für die Höhe und als letztes der Wert für die Vorwärts- und Rückwärtsbewegung. Im folgendem Code - Ausschnitt ist die OSC Empfangsfunktion dargestellt.

while(receiver.hasWaitingMessages()) {
    // get the next message
    ofxOscMessage m;
    receiver.getNextMessage(&m);
 
    ...
 
    else if(m.getAddress() == "/hands/ID-centralXYZ") {
         kinect_hand_nr = m.getArgAsInt32(0);
         kinect_hand_x = m.getArgAsFloat(1);
         kinect_hand_y = m.getArgAsFloat(2);
         kinect_hand_z = m.getArgAsFloat(3);
     }
 
     else if(m.getAddress() == "/skeletons/ID-centralXYZ") {
         kinect_nr = m.getArgAsInt32(0);
         kinect_x = m.getArgAsFloat(1);
         kinect_y = m.getArgAsFloat(2);
         kinect_z = m.getArgAsFloat(3);
     }
 
     ...
}


Analog zu den Koordinaten des Skeletons, wird eine OSC-Botschaft versendet, die die Handkoordinaten enthält. Addressiert is diese mit "/hands/ID-centralXYZ", verarbeitet wird jedoch nur die Y-Koordinate (Höhe). Aktuelle Werte lassen sich in einem separaten Fenster auslesen, s. Abbildung.

ARnect OSC Ausgabe.png


Code für die Befehlserkennung

//Startkommando - Sendet den Befehl "Take Off" an die Drohne
if(kinect_hand_y < 0.2 && (!isnan(kinect_hand_x) && !isnan(kinect_hand_y) && !isnan(kinect_hand_z))) {
    ofxOscMessage m;
    m.setAddress("/takeOff");
    sender.sendMessage(m);
}
 
//Landekommando - Sendet den Befehl "Land" an die Drohne
if( kinect_y > 0.8 || isnan(kinect_x) || isnan(kinect_y) || isnan(kinect_z)) {
    ofxOscMessage m;
    m.setAddress("/land");
    sender.sendMessage(m);
}


Einfaches Code-Beispiel für die Erkennung des Start- bzw. Landekommandos.


Steuerbewegungen

Die Umsetzung der Steuerung sollte sich so intuitiv wie nur möglich gestalten, und dabei größtmöglichen Schutz vor Fehlbedienung seitens des Anwenders bieten.

Die Startgeste ist eine erhobene Hand, während zum Landen in die Hocke gegangen werden muss. Dadurch wird verhindert, dass gleichzeitig "Start" und "Landung" getriggert werden können.

Bewegungen im Raum, wollten wir 1:1 auf Bewegungen der Drohne umlegen, der zeitliche Rahmen gab dieses Feature allerdings nicht mehr her.


Ausblick

  • Mehrere Skeletons selektieren
  • Bewegung der Drone
  • Rotation
  • Steigen/Sinken
  • Links/Rechts/Vor-wärts und Rückwärts
  • Bereichsbegrenzung der ARDrone