Pilotear AR-Drone 2.0 con NodeJS

Iniciado por skollprog, Diciembre 27, 2017, 03:03:52 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Diciembre 27, 2017, 03:03:52 AM Ultima modificación: Diciembre 27, 2017, 02:09:49 PM por skollprog
Tengo un drone ahí en una esquina de mi cuarto
casi sin usar dado que es molesto usarlo con
las MobileApps
ya que me consume mucha batería,
el manejo es anti-intuitivo y demás.

Así que decidí experimentar y ver cómo podía usarlo
desde la Notebook. Investigando en varios lugares
(sin mucha info al respecto), descubrí que se podía
utilizar la librería "ar-drone" de NodeJS.

Me puse a hacer un poco de scripting para ver
qué me salía. Cuestión... ahora tan sólo debo
manejar el drone desde la consola de comandos.

Cómo se hace?

Primero que nada, hay que asegurarse de tener
instalado NodeJS y NPM. En caso de no ser así,
les dejo esta URL, de donde pueden descargarlo
para el SO que tengan uds.

Código: php
https://nodejs.org/es/download/


Si ya está instalado, abrimos la consola de comandos
(o la terminal, si es que están usando linux),
e instalamos el paquete antes mencionado.

Código: dos
> npm install ar-drone


Una vez lo hayan instalado (no se preocupen si
tira tags amarillos con la palabra "WARN"),
abrimos SublimeText, Atom, Brackets
o cualquiera fuese el editor de texto que suelan usar
y escribimos el siguiente código:

Atención: El código está hecho a mi manera...
por lo que cada uno puede mejorar y cambiar lo
que le parezca necesario.


Modificación 12/27/2017: Código simplificado y más teclas agregadas.

Código: javascript
var arDrone = require('ar-drone');
var client  = arDrone.createClient();

client.disableEmergency();

status = "on";
camera = "frontal";
sens   = 0.6;

console.log("\033c");
console.log("\n[!] Ar-Drone connected.\n");

const readline = require('readline');
readline.emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);
process.stdin.on('keypress', (str, key) => {

kn = key.name;

if (kn === "escape") {
status = "off";
client.stop();
client.land();
console.log("\n\n[!] Disconnected.");
process.exit();
} else {

if (kn === "return") {
client.takeoff();
process.stdout.write(" --takeoff ");
}

if (kn === "backspace") {
client.stop();
client.land();
process.stdout.write(" --land ");
}

if (kn === "delete") {
client.stop();
process.stdout.write(" --kswitch ");
}

if (kn === "tab") {
if (camera == "frontal") {
client.config("video:video_channel", 3);
camera = "bottom";
process.stdout.write(" --cam:1 ");
} else if (camera == "bottom") {
client.config("video:video_channel", 0);
camera = "frontal";
process.stdout.write(" --cam:2 ");
}
}

if (kn === "1") {
sens = 0.2;
process.stdout.write(" --sens:1 ");
} else if (kn === "2") {
sens = 0.4;
process.stdout.write(" --sens:2 ");
} else if (kn === "3") {
sens = 0.6;
process.stdout.write(" --sens:3 ");
} else if (kn === "4") {
sens = 0.8;
process.stdout.write(" --sens:4 ");
} else if (kn === "5") {
sens = 1.0;
process.stdout.write(" --sens:5 ");
}

if (status == "on")
{
if (kn === "w") {
client.up(sens)
process.stdout.write(" +z ");
} else if (kn === "s") {
client.down(sens)
last = "s";
process.stdout.write(" -z ");
} else if (kn === "up") {
client.front(sens)
process.stdout.write(" +y ");
} else if (kn === "down") {
client.back(sens)
process.stdout.write(" -y ");
} else if (!key.shift && kn === "right") {
client.right(sens)
process.stdout.write(" +x ");
} else if (!key.shift && kn === "left") {
client.left(sens)
process.stdout.write(" -x ");
} else if (key.shift && kn === "right") {
client.clockwise(-sens);
process.stdout.write(" +r ");
} else if (key.shift && kn === "left") {
client.clockwise(sens);
process.stdout.write(" -r ");
}
}
}

});


A continuación, simplemente guardan este archivo
con el nombre que quieran, y en formato "js".
(Como ejemplo, voy a usar el nombre "ar-drone.js".)

Bien, suponiendo que tienen tarjeta WiFi o USB WiFi,
hay que conectarse al Drone (van a perder la conexión
a internet).

Ahora, en la consola de comandos o en terminal, tipeamos
lo siguiente:

Código: bash
node ar-drone.js


Y automáticamente se creará un enlace entre la Notebook,
PC, o similar y el Drone.

Cómo manejamos el Drone?

De la manera en que está programado el script
(que seguramente copiaron y pegaron), van a poder
usar las teclas (si se las ingenian, pueden usar sus
propios comandos, pero se les va a complicar un poco
para manejarlo).

Aquí la lista de controles...

Código: dos
Escape: Aterrizar y desconectar.
Delete: Killswitch.
Enter: Despegar.
Backspace: Aterrizar.
Up: Hacia adelante.
Down: Hacia atrás.
Left: Hacia la izquierda.
Rgiht: Hacia la derecha.
Shift + Left: Rotar hacia la izquierda.
Shift + Right: Rotar hacia la derecha.
W: Elevar.
S: Descender.
Tab: Cámara frontal / trasera.
1 / 2 / 3 / 4 / 5: Sensibilidad de movimiento.


Un ejemplo cómo se vería la consola de comandos
mientras piloteamos el Drone, sería el siguiente...

Código: dos
[!] Ar-Drone connected.

+y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +z  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +x  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +y  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  +r  -z  -z  -z  -z  -z  -z  -z  -z  -z  -z  -z  -z  -z  -z  -z  -z  -x  -x  -x  -x  -x  -x  -x  -x  -x  -x  -x  -x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  +x  --land

[!] Disconnected.


Espero que les sea útil, y si de casualidad
alguien tiene alguna información extra que
sirva, el comentario será bienvenido entonces.

Saludos!