Programando el control por voz de un dron utilizando Node.js y ARDrone

Programando el control por voz de un dron utilizando Node.js y ARDrone

En este tutorial, abordaremos la creación de un programa para un dron con control de voz utilizando Node.js y la API de Web Speech. El dron es un Parrot ARDrone 2.0.

Recordamos: para todos los lectores de «Habr» — un descuento de 10,000 rublos al registrarse en cualquier curso de Skillbox usando el código promocional «Habr».

Skillbox recomienda: Curso práctico «Desarrollador Móvil PRO».

Introducción

Los drones son impresionantes. Me encanta jugar con mi dron, capturando fotos y videos o simplemente divirtiéndome. Pero los vehículos aéreos no tripulados (VANT) no solo se utilizan para el entretenimiento. También trabajan en el cine, estudian glaciares y son utilizados por fuerzas militares y en la agricultura.

En este tutorial, examinaremos la creación de un programa que permitirá controlar un dron utilizando comandos de voz. Sí, el dron hará lo que le digas. Al final del artículo, habrá un programa listo y un video para controlar el VANT.

Hardware

Necesitamos lo siguiente:

  • Parrot ARDrone 2.0;
  • Cable Ethernet;
  • un buen micrófono.

El desarrollo y control se llevará a cabo en estaciones de trabajo con Windows/Mac/Ubuntu. Personalmente, he trabajado con Mac y Ubuntu 18.04.

Software

Descarga la última versión de Node.js desde el sitio oficial.

También necesitas la última versión de Google Chrome.

Entendiendo el dron

Vamos a intentar entender cómo funciona el Parrot ARDrone. Este dron tiene cuatro motores.

Programando el control por voz de un dron utilizando Node.js y ARDrone

Los motores opuestos trabajan en la misma dirección. Un par gira en el sentido de las agujas del reloj, el otro en sentido contrario. El dron se mueve cambiando el ángulo de inclinación respecto al suelo, variando la velocidad de rotación de los motores y realizando otras maniobras.

Programando el control por voz de un dron utilizando Node.js y ARDrone

Como podemos ver en el diagrama anterior, cambiar diferentes parámetros produce un cambio en la dirección de movimiento del dron. Por ejemplo, disminuir o aumentar la velocidad de rotación de los rotores izquierdo y derecho crea un inclinación. Esto permite que el dron vuele hacia adelante o hacia atrás.

Al cambiar la velocidad y dirección de movimiento de los motores, establecemos ángulos de inclinación que permiten al dron moverse en otras direcciones. Para este proyecto, no es necesario estudiar la aerodinámica, solo se deben comprender los principios básicos.

Cómo funciona el Parrot ARDrone

El dron actúa como un punto de acceso Wi-Fi. Para enviar y recibir comandos al dron, es necesario conectarse a este punto. Existen muchas aplicaciones que permiten controlar drones. Se ve algo así:

Programando el control por voz de un dron utilizando Node.js y ARDrone

Una vez que el dron está conectado, abrimos una terminal y escribimos telnet 192.168.1.1 — esta es la IP del dron. Para Linux puedes usar Linux Busybox.

Arquitectura de la aplicación

Nuestro código se dividirá en los siguientes módulos:

  • interfaz de usuario con API de voz para detección de voz;
  • filtrado de comandos y coincidencia con el estándar;
  • envío de comandos al dron;
  • transmisión en vivo de video.

La API funciona bajo la condición de tener conexión a Internet. Por eso añadimos la conexión a través de Ethernet.

¡Es hora de crear la aplicación!

Programamos

Primero, crearemos una nueva carpeta y nos moveremos a ella usando la terminal.

Luego, creamos un proyecto de Node utilizando los comandos a continuación.

Primero, instalamos las dependencias requeridas.

npm install 

Soportaremos los siguientes comandos:

  • despegar;
  • aterrizar;
  • arriba — el dron ascendió medio metro y se detuvo;
  • abajo — desciende medio metro y se detiene;
  • izquierda — se mueve a la izquierda medio metro;
  • derecha — se mueve a la derecha medio metro;
  • giro — gira en el sentido de las agujas del reloj 90 grados;
  • adelante — avanza medio metro;
  • atrás — retrocede medio metro;
  • detener.

Aquí está el código que permite recibir comandos, filtrarlos y controlar el dron.

const express = require('express');
const bodyparser = require('body-parser');
var arDrone = require('ar-drone');
const router = express.Router();
const app = express();
const commands = ['takeoff', 'land','up','down','goleft','goright','turn','goforward','gobackward','stop'];
 
var drone  = arDrone.createClient();
// desactivar emergencia
drone.disableEmergency();
// express
app.use(bodyparser.json());
app.use(express.static(__dirname + '/public'));
 
router.get('/',(req,res) => {
    res.sendFile('index.html');
});
 
router.post('/command',(req,res) => {
    console.log('comando recibido ', req.body);
    console.log('comandos existentes', commands);
    let command = req.body.command.replace(/ /g,'');
    if(commands.indexOf(command) !== -1) {
        switch(command.toUpperCase()) {
            case "TAKEOFF":
                console.log('despegando el dron');
                drone.takeoff();
            break;
            case "LAND":
                console.log('aterrizando el dron');
                drone.land();
            break;
            case "UP":
                console.log('elevando el dron medio metro');
                drone.up(0.2);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "DOWN":
                console.log('bajando el dron medio metro');
                drone.down(0.2);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOLEFT":
                console.log('moviendo el dron a la izquierda 1 metro');
                drone.left(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },1000);
            break;
            case "GORIGHT":
                console.log('moviendo el dron a la derecha 1 metro');
                drone.right(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },1000);
            break;
            case "TURN":
                console.log('girando el dron');
                drone.clockwise(0.4);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOFORWARD":
                console.log('moviendo el dron hacia adelante 1 metro');
                drone.front(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOBACKWARD":
                console.log('moviendo el dron hacia atrás 1 metro');
                drone.back(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "STOP":
                drone.stop();
            break;
            default:
            break;    
        }
    }
    res.send('OK');
});
 
app.use('/',router);
 
app.listen(process.env.port || 3000);

Aquí está el código HTML y JavaScript que escucha al usuario y envía el comando al servidor Node.

<!DOCTYPE html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Aplicación de notas controlada por voz</title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/shoelace-css/1.0.0-beta16/shoelace.css">
        <link rel="stylesheet" href="styles.css">
 
    </head>
    <body>
        <div class="container">
 
            <h1>Dron controlado por voz</h1>
            <p class="page-description">Una pequeña aplicación que te permite controlar un dron AR usando la voz</p>
 
            <h3 class="no-browser-support">Lo siento, tu navegador no soporta la API de Web Speech. Intenta abrir esta demostración en Google Chrome.</h3>
 
            <div class="app">
                <h3>Da la orden</h3>
                <div class="input-single">
                    <textarea id="note-textarea" placeholder="Crea una nueva nota escribiendo o utilizando el reconocimiento de voz." rows="6"></textarea>
                </div>    
                <button id="start-record-btn" title="Iniciar grabación">Iniciar reconocimiento</button>
                <button id="pause-record-btn" title="Pausar grabación">Pausar reconocimiento</button>
                <p id="recording-instructions">Presiona el <strong>Iniciar reconocimiento</strong> botón y permite el acceso.</p>
 
            </div>
 
        </div>
 
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script src="script.js"></script>
 
    </body>
</html>

Y aquí está el código de JavaScript para trabajar con comandos de voz, enviándolos al servidor Node.

intenta {
 var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
 var recognition = new SpeechRecognition();
 }
 catch(e) {
 console.error(e);
 $('.no-browser-support').show();
 $('.app').hide();
 }
// otro código, consulta la fuente de GitHub
recognition.onresult = function(event) {
// el evento es un objeto SpeechRecognitionEvent.
// Contiene todas las líneas que hemos capturado hasta ahora.
 // Solo necesitamos la actual.
 var current = event.resultIndex;
// Obtener una transcripción de lo que se dijo.
var transcript = event.results[current][0].transcript;
// enviarlo al backend
$.ajax({
 tipo: 'POST',
 url: '\/command\/',
 data: JSON.stringify({command: transcript}),
 success: function(data) { console.log(data) },
 contentType: "application\/json",
 dataType: 'json'
 });
};

Iniciamos la aplicación

Puedes iniciar la aplicación de la siguiente manera (asegúrate de que el dron esté conectado a Wi-Fi y que el cable Ethernet esté conectado a la computadora).

Abrimos localhost:3000 en el navegador y hacemos clic en Iniciar Reconocimiento.

Programando el control por voz de un dron utilizando Node.js y ARDrone

Intentamos controlar el dron y nos divertimos.

Transmisión de video desde el dron

Creamos un nuevo archivo en el proyecto y copiamos este código allí:

const http = require("http");
const drone = require("dronestream");
 
const server = http.createServer(function(req, res) {
 
require("fs").createReadStream(__dirname + "\/public\/video.html").pipe(res);
 });
 
drone.listen(server);
 
server.listen(4000);

Aquí tienes el código HTML, colócalo dentro de la carpeta public.

<!doctype html>
 <html>
 <head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8">
 <title>Transmitir como módulo</title>
 <script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
 </head>
 <body>
 <h1 id="heading">Transmisión de video de drones</h1>
 <div id="droneStream" style="width: 640px; height: 360px"> </div>
 
<script type="text/javascript" charset="utf-8">
 
new NodecopterStream(document.getElementById("droneStream"));
 
</script>
 
</body>
</html>

Iniciamos y nos conectamos a localhost:8080 para ver el video desde la cámara frontal.

Programando el control por voz de un dron utilizando Node.js y ARDrone

Consejos útiles

  • Controla este dron en interiores.
  • Siempre coloca la cubierta protectora en el dron antes de despegar.
  • Verifica que la batería esté cargada.
  • Si el dron se comporta de manera extraña, sostenlo por debajo y dale vuelta. Esta acción llevará al dron a modo de emergencia, y los rotores se detendrán de inmediato.

Código listo y demostración

DEMO EN VIVO

DESCARGAR

¡Lo logramos!

Escribir código y luego observar cómo la máquina comienza a obedecer será gratificante. Ahora hemos aprendido cómo hacer que el dron escuche comandos de voz. En realidad, hay muchas más posibilidades: reconocimiento de caras de usuarios, vuelos autónomos, reconocimiento de gestos y mucho más.

¿Qué puedes sugerir para mejorar el programa?

Skillbox recomienda:

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster