Eine Implementierung der Netzwerkprotokolle, die von der Papagei AR -Drohne 2.0 verwendet werden. Es scheint, dass auch 1.0 Drohnen kompatibel sind.
Installieren Sie über GitHub, um die neueste Version zu erhalten:
npm install git://github.com/felixge/node-ar-drone.git
Oder, wenn es Ihnen gut ist, ein paar innovative Sachen zu verpassen, gehen Sie für NPM:
npm install ar-drone
Die AR -Drohne ist ein erschwinglicher, aber überraschend fähiger Quadcopter. Die Drohne selbst führt eine proprietäre Firmware aus, die über WLAN mit der offiziellen FreeFlight Mobile App (verfügbar für iOS und Android) kontrolliert werden kann.
Im Gegensatz zur Firmware ist das Client -Protokoll geöffnet und papagriert eine SDK (Anmeldung zum Herunterladen) mit einer guten Menge an Dokumentation und C -Code. Ihre Zielgruppe scheint mobile Entwickler zu sein, die dieses SDK nutzen können, um Spiele und andere Apps zu erstellen, damit Menschen mehr Spaß mit ihren Drohnen haben.
Das Protokoll kann jedoch auch zum Empfangen von Video- und Sensordaten verwendet werden, sodass Entwickler autonome Programme für die bevorstehende Roboterrevolution schreiben können.
Dieses Modul befindet sich immer noch unter starker Entwicklung. Bitte überraschen Sie sich also nicht, wenn Sie eine fehlende Funktionalität oder undokumentiert finden.
Die dokumentierten Teile werden jedoch getestet und sollten für die meisten Teile gut funktionieren.
Dieses Modul enthält eine hochrangige Client -API, die versucht, alle Drohnenfunktionen zu unterstützen, und macht sie einfach zu bedienen.
Der beste Weg, um loszulegen, besteht darin, eine repl.js
-Datei wie folgt zu erstellen:
var arDrone = require ( 'ar-drone' ) ;
var client = arDrone . createClient ( ) ;
client . createRepl ( ) ;
Mit dieser Wiederholung sollten Sie Spaß haben:
$ node repl . js
// Make the drone takeoff
drone > takeoff ( )
true
// Wait for the drone to takeoff
drone > clockwise ( 0.5 )
0.5
// Let the drone spin for a while
drone > land ( )
true
// Wait for the drone to land
Jetzt können Sie ein autonomes Programm schreiben, das dasselbe tut:
var arDrone = require ( 'ar-drone' ) ;
var client = arDrone . createClient ( ) ;
client . takeoff ( ) ;
client
. after ( 5000 , function ( ) {
this . clockwise ( 0.5 ) ;
} )
. after ( 3000 , function ( ) {
this . stop ( ) ;
this . land ( ) ;
} ) ;
OK, aber was ist, wenn Sie Ihre Drohne machen möchten, um mit etwas zu interagieren? Nun, Sie können sich zunächst die Sensordaten ansehen:
client . on ( 'navdata' , console . log ) ;
Nicht all dies wird noch nicht von der Client -Bibliothek behandelt, aber Sie sollten zumindest in der Lage sein, droneState
und demo
-Daten zu erhalten.
Eine gute anfängliche Herausforderung könnte darin bestehen, zu versuchen, in eine bestimmte Höhe zu fliegen, die auf der Immobilie navdata.demo.altitudeMeters
basiert.
Sobald Sie dies geschafft haben, möchten Sie vielleicht versuchen, auf das Kamera -Bild zu schauen. Hier ist eine einfache Möglichkeit, dies als PNGBuffer zu erhalten (erfordert eine aktuelle FFMPEG -Version, die in Ihrem $PATH
zu finden ist):
var pngStream = client . getPngStream ( ) ;
pngStream . on ( 'data' , console . log ) ;
Ihre erste Herausforderung könnte darin bestehen, diese PNG -Bilder als Knoten -HTTP -Webserver aufzudecken. Sobald Sie dies getan haben, sollten Sie versuchen, sie in das OpenCV -Modul zu füttern.
Gibt ein neues Client
-Objekt zurück. Zu options
gehören:
ip
: Die IP der Drohne. Verzug zu '192.168.1.1'
.frameRate
: Die Bildrate des Pngencoders. Standardeinstellung auf 5
.imageSize
: Die von PngenCoder erzeugte Bildgröße. Standardmäßig null
. Startet eine interaktive Schnittstelle mit allen im aktiven Bereich verfügbaren Clientmethoden. Zusätzlich wird client
in die client
-Instanz selbst auflöst.
Gibt ein PngEncoder
-Objekt zurück, das individuelle PNG -Bildpuffer als 'data'
-Ereignisse abgibt. Mehrere Aufrufe dieser Methode geben dasselbe Objekt zurück. Der Verbindungslebenszyklus (z. B. eine Wiederverbindung für Fehler) wird vom Client verwaltet.
Gibt ein TcpVideoStream
-Objekt zurück, das RAW -TCP -Pakete als 'data'
-Ereignisse ausgibt. Mehrere Aufrufe dieser Methode geben dasselbe Objekt zurück. Der Verbindungslebenszyklus (z. B. eine Wiederverbindung für Fehler) wird vom Client verwaltet.
Legt den internen fly
-Status auf true
, callback
wird nach der Drohnenberichten aufgerufen, dass sie schweben.
Setzt den internen fly
auf false
. callback
wird nach der Landung der Drohnenberichte aufgerufen.
Lässt die Drohne gewinnen oder die Höhe reduzieren. speed
kann ein Wert von 0
bis 1
sein.
Führt dazu, dass die Drohne dreht. speed
kann ein Wert von 0
bis 1
sein.
Steuert die Tonhöhe, die eine horizontale Bewegung mit der Kamera als Referenzpunkt verwendet. speed
kann ein Wert von 0
bis 1
sein.
Steuert die Rolle, die eine horizontale Bewegung mit der Kamera als Referenzpunkt darstellt. speed
kann ein Wert von 0
bis 1
sein.
Legt alle Drone -Bewegungsbefehle auf 0
fest, wodurch es effektiv an Ort und Stelle schwebt.
Fragt die Drohne, ein Gerät zu kalibrieren. Obwohl die AR.Drone -Firmware nur ein Gerät unterstützt, das kalibriert werden kann. Diese Funktion enthält auch FTRIM.
Das Magnetometer
Gerät: 0
Das Magnetometer kann nur während der Fliege der Drohne kalibriert werden, und die Kalibrierungsroutine bewirkt, dass die Drohne eine volle 360 Grad an Ort und Stelle an Ort und Stelle.
Ftrim
Gerät: 1
FTRIM setzt im Wesentlichen den Gieren, die Tonhöhe und rollen auf 0 zurück. Niemals während des Fliegens benutzen.
Sendet einen Konfigurationsbefehl an die Drohne. Sie müssen die Drohnen -SDK herunterladen, um eine vollständige Liste der Befehle in ARDrone_Developer_Guide.pdf
zu finden.
Dieser Befehl kann beispielsweise verwendet werden, um die Drohne zum Senden aller Navdata anzuweisen.
client . config ( 'general:navdata_demo' , 'FALSE' ) ;
callback
wird aufgerufen, nachdem die Drohne die Konfigurationsanforderung bestätigt oder wenn eine Zeitüberschreitung stattfindet.
Alternativ können Sie ein Optionsobjekt übergeben, das Folgendes enthält:
key
: Der Konfigurationsschlüssel zum Setzen.value
: Der Konfigurationswert auf festgelegt.timeout
: Die Zeit in Millisekunden, um auf einen Ack der Drohne zu warten.Zum Beispiel:
var callback = function(err) { if (err) console.log(err); };
client.config({ key: 'general:navdata_demo', value: 'FALSE', timeout: 1000 }, callback);
Führt eine vorprogrammierte Flugsequenz für eine bestimmte duration
(in MS) durch. animation
kann eine der folgenden sein:
[ 'phiM30Deg' , 'phi30Deg' , 'thetaM30Deg' , 'theta30Deg' , 'theta20degYaw200deg' ,
'theta20degYawM200deg' , 'turnaround' , 'turnaroundGodown' , 'yawShake' ,
'yawDance' , 'phiDance' , 'thetaDance' , 'vzDance' , 'wave' , 'phiThetaMixed' ,
'doublePhiThetaMixed' , 'flipAhead' , 'flipBehind' , 'flipLeft' , 'flipRight' ]
Beispiel:
client . animate ( 'flipLeft' , 1000 ) ;
Bitte beachten Sie, dass die Drohne eine gute Menge an Höhe und Kopffreiheit benötigt, um einen Flip durchzuführen. Also sei vorsichtig!
Führt eine vorprogrammierte LED-Sequenz bei gegebener hz
Häufigkeit und duration
aus (in Sec!). animation
kann eine der folgenden sein:
[ 'blinkGreenRed' , 'blinkGreen' , 'blinkRed' , 'blinkOrange' , 'snakeGreenRed' ,
'fire' , 'standard' , 'red' , 'green' , 'redSnake' , 'blank' , 'rightMissile' ,
'leftMissile' , 'doubleMissile' , 'frontLeftGreenOthersRed' ,
'frontRightGreenOthersRed' , 'rearRightGreenOthersRed' ,
'rearLeftGreenOthersRed' , 'leftGreenRightRed' , 'leftRedRightGreen' ,
'blinkStandard' ]
Beispiel:
client . animateLeds ( 'blinkRed' , 5 , 2 )
Bewirkt, dass das Notfall -Ref -Bit auf 1 gesetzt wird, bis navdata.droneState.emergencyLanding
0 ist. Dies erholt sich von einer Drohne, die umgedreht wurde und rote Lichter wieder fliegen und grüne Lichter anzeigen. Es wird auch implizit durchgeführt, wenn ein neuer Client auf hoher Ebene erstellt wird.
Ein Kunde wird gelandet, schweben, fliegen, landet, batteriebüroend und Altitudechange -Ereignisse, solange Demo NavData aktiviert ist.
So können Sie Demo Navdata verwenden
client . config ( 'general:navdata_demo' , 'FALSE' ) ;
Siehe Dokumentation für navadata
-Objekt
Dies ist eine API auf niedriger Ebene. Wenn Sie etwas Einfacheres bevorzugen, lesen Sie die Client -Dokumente.
Die Drohne wird durch Senden von UDP -Paketen auf Port 5556 gesteuert. Da UDP keine Meldungsbestellung oder -zustellung garantiert, müssen die Clients ihre Anweisungen wiederholt senden und eine Inkrementierungssequenznummer mit jedem Befehl angeben.
Beispielsweise sieht der für Start/Landung (REF) verwendete Befehl mit einer Sequenznummer von 1 und einem Parameter von 512 (Start) Folgendes aus:
AT*REF=1,512r
Um die Erstellung und das Senden dieser Pakete zu erleichtern, enthält dieses Modul eine UdpControl
-Klasse, die diese Aufgabe umgeht. Zum Beispiel führt das folgende Programm dazu, dass Ihre Drohne den Start und die Angestellte an Ort und Stelle hat.
var arDrone = require ( 'ar-drone' ) ;
var control = arDrone . createUdpControl ( ) ;
setInterval ( function ( ) {
// The emergency: true option recovers your drone from emergency mode that can
// be caused by flipping it upside down or the drone crashing into something.
// In a real program you probably only want to send emergency: true for one
// second in the beginning, otherwise your drone may attempt to takeoff again
// after a crash.
control . ref ( { fly : true , emergency : true } ) ;
// This command makes sure your drone hovers in place and does not drift.
control . pcmd ( ) ;
// This causes the actual udp message to be send (multiple commands are
// combined into one message)
control . flush ( ) ;
} , 30 ) ;
Nachdem Sie in der Luft sind, können Sie herumfliegen, indem Sie ein Argument an die pcmd()
-Methode weitergeben:
control . pcmd ( {
front : 0.5 , // fly forward with 50% speed
up : 0.3 , // and also fly up with 30% speed
} ) ;
Das war's! Eine vollständige Liste aller pcmd()
-Optionen finden Sie in den folgenden API -Dokumenten.
Mit dem, was Sie bisher gelernt haben, können Sie ein einfaches Programm wie dieses erstellen:
var arDrone = require ( 'ar-drone' ) ;
var control = arDrone . createUdpControl ( ) ;
var start = Date . now ( ) ;
var ref = { } ;
var pcmd = { } ;
console . log ( 'Recovering from emergency mode if there was one ...' ) ;
ref . emergency = true ;
setTimeout ( function ( ) {
console . log ( 'Takeoff ...' ) ;
ref . emergency = false ;
ref . fly = true ;
} , 1000 ) ;
setTimeout ( function ( ) {
console . log ( 'Turning clockwise ...' ) ;
pcmd . clockwise = 0.5 ;
} , 6000 ) ;
setTimeout ( function ( ) {
console . log ( 'Landing ...' ) ;
ref . fly = false ;
pcmd = { } ;
} , 8000 ) ;
setInterval ( function ( ) {
control . ref ( ref ) ;
control . pcmd ( pcmd ) ;
control . flush ( ) ;
} , 30 ) ;
Erstellt eine neue UDPControl -Instanz, in der options
enthalten sind:
ip
: Die Drone IP -Adresse, standardmäßig '192.168.1.1'
.port
: Der zu verwendende Port ist standardmäßig 5556
. Enqueueues einen AT*
. Dies ist nützlich, wenn Sie die volle Kontrolle wünschen.
Zum Beispiel werden ein Startanweisungen wie folgt gesendet:
udpControl . raw ( 'REF' , ( 1 << 9 ) ) ;
Enqueueues A AT*REF
-Befehl, Optionen sind:
fly
: Setzen Sie dies für true
Start / Aufenthalt in der Luft oder false
, um Landung / Aufenthalt auf dem Boden zu initiieren. Standardmäßig false
.emergency
: Stellen Sie dies auf true
ein, um das Notfallbit festzulegen, oder false
um es nicht festzulegen. Details dazu finden Sie im offiziellen SDK -Leitfaden. Standardmäßig false
. Enqueueues A AT*PCMD
(Progressive) Befehl, Optionen sind:
front
oder back
: Fliegen Sie von der Richtung der Frontkamera in Richtung oder weg.left
oder/ right
: Fliegen Sie nach links oder rechts von der Frontkamera.up
oder down
: Gewinne oder reduzieren Sie die Höhe.clockwise
oder counterClockwise
: Drehen Sie um die mittlere Achse. Die Werte für jede Option sind die für den Vorgang zu verwendende Geschwindigkeit und können zwischen 0 und 1 reichen. Sie können auch negative Werte wie {front: -0.5}
verwenden, was gleich ist wie {back: 0.5}
.
Sendet alle Enquoed -Befehle als UDP -Paket an die Drohne.
@Todo Dokumentieren Sie die Low -Level -Video -API.
@Todo Dokumentieren Sie die Navdata -API mit niedriger Ebene.
Sie können auf die Kopfkamera und die untere Kamera zugreifen. Sie müssen nur die Konfiguration ändern:
// access the head camera
client . config ( 'video:video_channel' , 0 ) ;
// access the bottom camera
client . config ( 'video:video_channel' , 3 ) ;