Programamos el control por voz del helicóptero usando Node.js y ARDrone.

Programamos el control por voz del helicóptero usando Node.js y ARDrone.

En este tutorial veremos cómo crear un programa para un dron con control por voz usando Node.js y API de voz web. Helicóptero - Parrot ARDrone 2.0.

Recordamos: para todos los lectores de "Habr": un descuento de 10 rublos al inscribirse en cualquier curso de Skillbox utilizando el código promocional "Habr".

Skillbox recomienda: Curso práctico "Desarrollador móvil PRO".

introducción

Los drones son increíbles. Disfruto mucho jugando con mi quad, tomando fotos y vídeos, o simplemente divirtiéndome. Pero los vehículos aéreos no tripulados (UAV) se utilizan para algo más que entretenimiento. Trabajan en cine, estudian glaciares y son utilizados por militares y representantes del sector agrícola.

En este tutorial veremos cómo crear un programa que te permitirá controlar un dron. usando comandos de voz. Sí, el helicóptero hará lo que usted le diga. Al final del artículo hay un programa ya preparado y un vídeo de control del UAV.

hierro

Necesitamos lo siguiente:

  • Loro ARDrone 2.0;
  • Cable de ethernet;
  • buen microfono

El desarrollo y gestión se realizará en estaciones de trabajo con Windows/Mac/Ubuntu. Personalmente, trabajé con Mac y Ubuntu 18.04.

Software

Descargue la última versión de Node.js desde El sitio oficial.

También es necesario última versión de Google Chrome.

Entendiendo el helicóptero

Intentemos entender cómo funciona Parrot ARDrone. Este helicóptero tiene cuatro motores.

Programamos el control por voz del helicóptero usando Node.js y ARDrone.

Los motores opuestos funcionan en la misma dirección. Un par gira en el sentido de las agujas del reloj y el otro en el sentido contrario. El dron se mueve cambiando el ángulo de inclinación con respecto a la superficie de la tierra, cambiando la velocidad de rotación de los motores y varios otros movimientos maniobrables.

Programamos el control por voz del helicóptero usando Node.js y ARDrone.

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

Al cambiar la velocidad y dirección de los motores, establecemos ángulos de inclinación que permiten que el helicóptero se mueva en otras direcciones. En realidad, para el proyecto actual no es necesario estudiar aerodinámica, solo es necesario comprender los principios básicos.

Cómo funciona Parrot ARDrone

El dron es un punto de acceso Wi-Fi. Para recibir y enviar comandos al helicóptero, debe conectarse a este punto. Existen muchas aplicaciones diferentes que te permiten controlar cuadricópteros. Todo se parece a esto:

Programamos el control por voz del helicóptero usando Node.js y ARDrone.

Tan pronto como el dron esté conectado, abra la terminal y haga telnet 192.168.1.1: esta es la IP del helicóptero. Para Linux puedes usar Caja ocupada de Linux.

Arquitectura de aplicaciones

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

  • interfaz de usuario con API de voz para detección de voz;
  • filtrar comandos y compararlos con un estándar;
  • enviar comandos al dron;
  • transmisión de vídeo en vivo.

La API funciona siempre que haya una conexión a Internet. Para garantizar esto, agregamos una conexión Ethernet.

¡Es hora de crear una aplicación!

Código

Primero, creemos una nueva carpeta y cambiemos a ella usando la terminal.

Luego creamos un proyecto de Nodo usando los siguientes comandos.

Primero, instalamos las dependencias requeridas.

npm instalar 

Admitiremos los siguientes comandos:

  • despegar;
  • aterrizaje;
  • arriba: el dron se eleva medio metro y flota;
  • abajo - cae medio metro y se congela;
  • a la izquierda - va medio metro hacia la izquierda;
  • a la derecha - va medio metro hacia la derecha;
  • rotación: gira 90 grados en el sentido de las agujas del reloj;
  • adelante - avanza medio metro;
  • atrás - retrocede medio metro;
  • parar

Aquí está el código que te permite aceptar 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();
// disable emergency
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('command recieved ', req.body);
    console.log('existing commands', commands);
    let command = req.body.command.replace(/ /g,'');
    if(commands.indexOf(command) !== -1) {
        switch(command.toUpperCase()) {
            case "TAKEOFF":
                console.log('taking off the drone');
                drone.takeoff();
            break;
            case "LAND":
                console.log('landing the drone');
                drone.land();
            break;
            case "UP":
                console.log('taking the drone up half meter');
                drone.up(0.2);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "DOWN":
                console.log('taking the drone down half meter');
                drone.down(0.2);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOLEFT":
                console.log('taking the drone left 1 meter');
                drone.left(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },1000);
            break;
            case "GORIGHT":
                console.log('taking the drone right 1 meter');
                drone.right(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },1000);
            break;
            case "TURN":
                console.log('turning the drone');
                drone.clockwise(0.4);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOFORWARD":
                console.log('moving the drone forward by 1 meter');
                drone.front(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOBACKWARD":
                console.log('moving the drone backward 1 meter');
                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);

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

<!DOCTYPE html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Voice Controlled Notes App</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>Voice Controlled Drone</h1>
            <p class="page-description">A tiny app that allows you to control AR drone using voice</p>
 
            <h3 class="no-browser-support">Sorry, Your Browser Doesn't Support the Web Speech API. Try Opening This Demo In Google Chrome.</h3>
 
            <div class="app">
                <h3>Give the command</h3>
                <div class="input-single">
                    <textarea id="note-textarea" placeholder="Create a new note by typing or using voice recognition." rows="6"></textarea>
                </div>    
                <button id="start-record-btn" title="Start Recording">Start Recognition</button>
                <button id="pause-record-btn" title="Pause Recording">Pause Recognition</button>
                <p id="recording-instructions">Press the <strong>Start Recognition</strong> button and allow access.</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 también código JavaScript para trabajar con comandos de voz, enviándolos al servidor de Node.

try {
 var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
 var recognition = new SpeechRecognition();
 }
 catch(e) {
 console.error(e);
 $('.no-browser-support').show();
 $('.app').hide();
 }
// other code, please refer GitHub source
recognition.onresult = function(event) {
// event is a SpeechRecognitionEvent object.
// It holds all the lines we have captured so far.
 // We only need the current one.
 var current = event.resultIndex;
// Get a transcript of what was said.
var transcript = event.results[current][0].transcript;
// send it to the backend
$.ajax({
 type: 'POST',
 url: '/command/',
 data: JSON.stringify({command: transcript}),
 success: function(data) { console.log(data) },
 contentType: "application/json",
 dataType: 'json'
 });
};

Lanzamiento de la aplicación

El programa se puede iniciar de la siguiente manera (es importante asegurarse de que el helicóptero esté conectado a Wi-Fi y que el cable Ethernet esté conectado a la computadora).

Abra localhost:3000 en el navegador y haga clic en Iniciar reconocimiento.

Programamos el control por voz del helicóptero usando Node.js y ARDrone.

Intentamos controlar el dron y estamos contentos.

Transmitir vídeo desde un dron

En el proyecto, cree un nuevo archivo y copie 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);

Y aquí está el código HTML, lo colocamos dentro de la carpeta pública.

<!doctype html>
 <html>
 <head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8">
 <title>Stream as module</title>
 <script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
 </head>
 <body>
 <h1 id="heading">Drone video stream</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>

Inicie y conéctese a localhost:8080 para ver el video desde la cámara frontal.

Programamos el control por voz del helicóptero usando Node.js y ARDrone.

Consejos útiles

  • Vuela este dron en interiores.
  • Coloque siempre la cubierta protectora en su dron antes de despegar.
  • Compruebe si la batería está cargada.
  • Si el dron se comporta de manera extraña, mantenlo presionado y dale la vuelta. Esta acción pondrá el helicóptero en modo de emergencia y los rotores se detendrán inmediatamente.

Código listo y demostración

DEMO EN VIVO

DESCARGA

¡Resultó!

¡Escribir código y luego ver cómo la máquina comienza a obedecer le dará placer! Ahora hemos descubierto cómo enseñarle a un dron a escuchar comandos de voz. De hecho, hay muchas más posibilidades: reconocimiento facial del usuario, vuelos autónomos, reconocimiento de gestos y mucho más.

¿Qué puedes sugerir para mejorar el programa?

Skillbox recomienda:

Fuente: habr.com

Añadir un comentario