Una implementación de los protocolos de red utilizados por el Parrot AR Drone 2.0. Parece que 1.0 drones también son compatibles.
Instalar a través de GitHub para obtener la última versión:
npm install git://github.com/felixge/node-ar-drone.git
O, si está bien al perder algunas cosas de vanguardia, elija NPM:
npm install ar-drone
El dron AR es un quadcopter asequible pero sorprendentemente capaz. El dron en sí ejecuta un firmware patentado que se puede controlar mediante WiFi utilizando la aplicación móvil FreeFlight oficial (disponible para iOS y Android).
A diferencia del firmware, el protocolo del cliente está abierto y Parrot publica un SDK (el registro requerido para descargar), incluida una buena cantidad de documentación y código C. Su público objetivo parece ser desarrolladores móviles que pueden usar este SDK para crear juegos y otras aplicaciones para que las personas se diviertan más con sus drones.
Sin embargo, el protocolo también se puede utilizar para recibir datos de video y sensor, lo que permite a los desarrolladores escribir programas autónomos para la próxima revolución del robot.
Este módulo todavía está en un desarrollo pesado, así que no se sorprenda si encuentra alguna funcionalidad faltante o indocumentada.
Sin embargo, las piezas documentadas se prueban y deberían funcionar bien para la mayoría de las partes.
Este módulo expone una API cliente de alto nivel que intenta admitir todas las características de drones, al tiempo que las hace fáciles de usar.
La mejor manera de comenzar es crear un archivo repl.js
como este:
var arDrone = require ( 'ar-drone' ) ;
var client = arDrone . createClient ( ) ;
client . createRepl ( ) ;
Usando este replica, debería poder divertirse:
$ 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
Ahora podría escribir un programa autónomo que haga lo mismo:
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, pero ¿qué pasa si quieres hacer que tu dron interactúe con algo? Bueno, podría comenzar mirando los datos del sensor:
client . on ( 'navdata' , console . log ) ;
Aún no todo esto es manejado por la biblioteca del cliente, pero al menos debe poder recibir datos droneState
y demo
.
Un buen desafío inicial podría ser intentar volar a una cierta altitud basada en la propiedad navdata.demo.altitudeMeters
.
Una vez que haya manejado esto, es posible que desee intentar mirar la imagen de la cámara. Aquí hay una manera simple de obtener esto como PNGBuffers (requiere una versión reciente de FFMPEG en su $PATH
):
var pngStream = client . getPngStream ( ) ;
pngStream . on ( 'data' , console . log ) ;
Su primer desafío podría ser exponer estas imágenes PNG como un servidor web de nodo HTTP. Una vez que haya hecho eso, debe intentar alimentarlos en el módulo OpenCV.
Devuelve un nuevo objeto Client
. options
incluyen:
ip
: la IP del dron. El valor predeterminado es '192.168.1.1'
.frameRate
: la velocidad de cuadro del pngencoder. El valor predeterminado a 5
.imageSize
: el tamaño de la imagen producido por Pngencoder. El valor predeterminado a null
. Inicia una interfaz interactiva con todos los métodos del cliente disponibles en el alcance activo. Además, client
se resuelve con la instancia client
en sí.
Devuelve un objeto PngEncoder
que emite búferes de imagen PNG individuales como eventos 'data'
. Múltiples llamadas a este método devuelve el mismo objeto. El ciclo de vida de la conexión (por ejemplo, reconectar el error) es administrado por el cliente.
Devuelve un objeto TcpVideoStream
que emite paquetes TCP sin procesar como eventos 'data'
. Múltiples llamadas a este método devuelve el mismo objeto. El ciclo de vida de la conexión (por ejemplo, reconectar el error) es administrado por el cliente.
Establece el estado fly
interna en true
, callback
se invoca después de que el dron informa que está flotando.
Establece el estado fly
interna en false
, callback
se invoca después de que el dron informa que ha aterrizado.
Hace que el dron gane o reduzca la altitud. speed
puede ser un valor de 0
a 1
.
Hace que el dron gire. speed
puede ser un valor de 0
a 1
.
Controla el tono, que un movimiento horizontal usando la cámara como punto de referencia. speed
puede ser un valor de 0
a 1
.
Controla el rollo, que es un movimiento horizontal que usa la cámara como punto de referencia. speed
puede ser un valor de 0
a 1
.
Establece todos los comandos de movimiento de drones a 0
, lo que lo hace pasar efectivamente en su lugar.
Le pide al dron que calibre un dispositivo. Aunque el firmware AR.Drone solo admite un dispositivo que puede calibrarse. Esta función también incluye ftrim.
El magnetómetro
Dispositivo: 0
El magnetómetro solo se puede calibrar mientras el dron está volando, y la rutina de calibración hace que el dron bostee en su lugar 360 grados completos.
Ftrim
Dispositivo: 1
Ftrim esencialmente restablece la guiñada, el tono y el rodar a 0. Tenga mucho cuidado con el uso de esta función y solo calibre mientras está en la superficie plana. Nunca use mientras vuela.
Envía un comando de configuración al dron. Deberá descargar el SDK Drone para encontrar una lista completa de comandos en el ARDrone_Developer_Guide.pdf
.
Por ejemplo, este comando se puede utilizar para instruir al dron que envíe todos los Navdata.
client . config ( 'general:navdata_demo' , 'FALSE' ) ;
callback
se invoca después de que el dron reconoce la solicitud de configuración o si se produce un tiempo de espera.
Alternativamente, puede pasar un objeto de opciones que contiene lo siguiente:
key
: la tecla de configuración para configurar.value
: el valor de configuración para establecer.timeout
: El tiempo, en milisegundos, para esperar un ACK del dron.Por ejemplo:
var callback = function(err) { if (err) console.log(err); };
client.config({ key: 'general:navdata_demo', value: 'FALSE', timeout: 1000 }, callback);
Realiza una secuencia de vuelo preprogramada durante una duration
dada (en MS). animation
puede ser uno de los siguientes:
[ 'phiM30Deg' , 'phi30Deg' , 'thetaM30Deg' , 'theta30Deg' , 'theta20degYaw200deg' ,
'theta20degYawM200deg' , 'turnaround' , 'turnaroundGodown' , 'yawShake' ,
'yawDance' , 'phiDance' , 'thetaDance' , 'vzDance' , 'wave' , 'phiThetaMixed' ,
'doublePhiThetaMixed' , 'flipAhead' , 'flipBehind' , 'flipLeft' , 'flipRight' ]
Ejemplo:
client . animate ( 'flipLeft' , 1000 ) ;
Tenga en cuenta que el dron necesitará una buena cantidad de altitud y espacio para la cabeza para realizar un flip. ¡Así que ten cuidado!
Realiza una secuencia LED preprogramada a la frecuencia y duration
hz
dada (¡en la SEC!). animation
puede ser uno de los siguientes:
[ 'blinkGreenRed' , 'blinkGreen' , 'blinkRed' , 'blinkOrange' , 'snakeGreenRed' ,
'fire' , 'standard' , 'red' , 'green' , 'redSnake' , 'blank' , 'rightMissile' ,
'leftMissile' , 'doubleMissile' , 'frontLeftGreenOthersRed' ,
'frontRightGreenOthersRed' , 'rearRightGreenOthersRed' ,
'rearLeftGreenOthersRed' , 'leftGreenRightRed' , 'leftRedRightGreen' ,
'blinkStandard' ]
Ejemplo:
client . animateLeds ( 'blinkRed' , 5 , 2 )
Hace que la referencia de emergencia se establezca en 1 hasta que navdata.droneState.emergencyLanding
tierra de emergencia es 0. Esto recupera un dron que se ha volcado y muestra que las luces rojas se pueden volar nuevamente y muestran luces verdes. También se hace implícitamente al crear un nuevo cliente de alto nivel.
Un cliente emitirá eventos aterrizados, flotando, volando, aterrizaje, cambio de batería y altitudeChange siempre que la demostración Navdata esté habilitada.
Para habilitar el uso de la demo navdata
client . config ( 'general:navdata_demo' , 'FALSE' ) ;
Ver documentación para el objeto navadata
Esta es una API de bajo nivel. Si prefiere algo más simple, consulte los documentos del cliente.
El dron se controla enviando paquetes UDP en el puerto 5556. Debido a que UDP no garantiza el pedido o entrega de mensajes, los clientes deben enviar sus instrucciones repetidamente e incluir un número de secuencia de incremento con cada comando.
Por ejemplo, el comando utilizado para despegue/aterrizaje (ref), con un número de secuencia de 1, y un parámetro de 512 (despegue) se ve así:
AT*REF=1,512r
Para aliviar la creación y el envío de estos paquetes, este módulo expone una clase UdpControl
que maneja esta tarea. Por ejemplo, el siguiente programa hará que su dron se despegue y se desplace en su lugar.
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 ) ;
Ahora que está en el aire, puede volar pasando una discusión al método pcmd()
:
control . pcmd ( {
front : 0.5 , // fly forward with 50% speed
up : 0.3 , // and also fly up with 30% speed
} ) ;
¡Eso es todo! Se puede encontrar una lista completa de todas las opciones pcmd()
en los documentos de API a continuación.
Con lo que ha aprendido hasta ahora, podría crear un programa simple como este:
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 ) ;
Crea una nueva instancia de UDPControl donde options
pueden incluir:
ip
: la dirección IP de drones, predeterminada a '192.168.1.1'
.port
: el puerto para usar, por defecto es 5556
. Enqueues un comando RAW AT*
. Esto es útil si desea un control total.
Por ejemplo, se enviarán instrucciones de despegue así:
udpControl . raw ( 'REF' , ( 1 << 9 ) ) ;
Enqueues A AT*REF
Command, las opciones son:
fly
: Establezca esto en true
para despegar / permanecer en el aire, o false
para iniciar aterrizaje / permanecer en el suelo. El valor predeterminado es false
.emergency
: configure esto en true
para establecer el bit de emergencia, o false
para no establecerlo. Los detalles sobre esto se pueden encontrar en la Guía Oficial de SDK. El valor predeterminado es false
. Enqueues A AT*PCMD
(Progressive), las opciones son:
front
o back
: vuele hacia o lejos de la dirección de la cámara frontal.left
o/ right
: vuela hacia la izquierda o la derecha de la cámara frontal.up
o down
: gane o reduzca la altitud.clockwise
o counterClockwise
: gire alrededor del eje central. Los valores para cada opción son la velocidad a usar para la operación y pueden variar de 0 a 1. También puede usar valores negativos como {front: -0.5}
, que es lo mismo que {back: 0.5}
.
Envía todos los comandos eneados como un paquete UDP al dron.
@Todo Documente la API de video de bajo nivel.
@Todo documenta la API NavData de bajo nivel.
Puede acceder a la cámara principal y a la cámara inferior, solo tiene que cambiar la configuración:
// access the head camera
client . config ( 'video:video_channel' , 0 ) ;
// access the bottom camera
client . config ( 'video:video_channel' , 3 ) ;