Programem el control de veu de l'copter mitjançant Node.js i ARDrone

Programem el control de veu de l'copter mitjançant Node.js i ARDrone

En aquest tutorial veurem com crear un programa per a un drone amb control de veu mitjançant Node.js i l'API de veu web. Copter - Parrot ARDrone 2.0.

Recordem: per a tots els lectors de "Habr": un descompte de 10 rubles en inscriure's a qualsevol curs de Skillbox amb el codi promocional "Habr".

Skillbox recomana: Curs pràctic "Desenvolupador mòbil PRO".

Introducció

Els drons són increïbles. M'agrada molt jugar amb el meu quad, fer fotos i vídeos, o simplement divertir-me. Però els vehicles aeris no tripulats (UAV) s'utilitzen per a més que només entreteniment. Treballen al cinema, estudien les glaceres i són utilitzats per militars i representants del sector agrícola.

En aquest tutorial veurem com crear un programa que us permetrà controlar un drone. utilitzant ordres de veu. Sí, l'copter farà el que li dius que faci. Al final de l'article hi ha un programa preparat i un vídeo de control d'UAV.

Ferro

Necessitem el següent:

  • Parrot ARDrone 2.0;
  • cable Ethernet;
  • bon micròfon.

El desenvolupament i la gestió es realitzaran en estacions de treball amb Windows/Mac/Ubuntu. Personalment, vaig treballar amb Mac i Ubuntu 18.04.

Programari

Baixeu la darrera versió de Node.js de El lloc oficial.

També cal darrera versió de Google Chrome.

Comprensió de l'heptero

Intentem entendre com funciona Parrot ARDrone. Aquest helicòpter té quatre motors.

Programem el control de veu de l'copter mitjançant Node.js i ARDrone

Els motors oposats funcionen en la mateixa direcció. Un parell gira en sentit horari i l'altre en sentit contrari. El drone es mou canviant l'angle d'inclinació respecte a la superfície de la terra, canviant la velocitat de gir dels motors i altres moviments maniobrables.

Programem el control de veu de l'copter mitjançant Node.js i ARDrone

Com podem veure al diagrama anterior, el canvi de diversos paràmetres comporta un canvi en la direcció del moviment de l'copter. Per exemple, disminuir o augmentar la velocitat de rotació dels rotors esquerre i dret crea un rotllo. Això permet que el drone voli cap endavant o cap enrere.

En canviar la velocitat i la direcció dels motors, establim angles d'inclinació que permeten que l'copter es mogui en altres direccions. De fet, per al projecte actual no cal estudiar aerodinàmica, només cal entendre els principis bàsics.

Com funciona Parrot ARDrone

El drone és un punt d'accés Wi-Fi. Per rebre i enviar ordres a l'copter, heu de connectar-vos a aquest punt. Hi ha moltes aplicacions diferents que us permeten controlar quadcopters. Tot sembla una cosa així:

Programem el control de veu de l'copter mitjançant Node.js i ARDrone

Tan bon punt el drone estigui connectat, obriu el terminal i telnet 192.168.1.1: aquesta és la IP de l'heptero. Per a Linux es pot utilitzar Linux Busybox.

Arquitectura d'aplicacions

El nostre codi es dividirà en els següents mòduls:

  • interfície d'usuari amb API de veu per a la detecció de veu;
  • ordres de filtratge i comparació amb un estàndard;
  • enviant ordres al drone;
  • emissió de vídeo en directe.

L'API funciona sempre que hi hagi connexió a Internet. Per garantir-ho, afegim una connexió Ethernet.

És hora de crear una aplicació!

Codi

Primer, creem una carpeta nova i canviem-hi mitjançant el terminal.

A continuació, creem un projecte Node utilitzant les ordres següents.

Primer, instal·lem les dependències necessàries.

npm instal·lar 

Admetarem les ordres següents:

  • treure;
  • aterratge;
  • amunt - el dron s'aixeca mig metre i planeja;
  • avall - cau mig metre i es congela;
  • a l'esquerra - va mig metre a l'esquerra;
  • a la dreta - va mig metre a la dreta;
  • rotació: gira en sentit horari 90 graus;
  • endavant - avança mig metre;
  • enrere - retrocedeix mig metre;
  • Atura.

Aquí teniu el codi que us permet acceptar ordres, filtrar-les i controlar el drone.

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);

I aquí hi ha el codi HTML i JavaScript que escolta l'usuari i envia una ordre 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>

I també codi JavaScript per treballar amb ordres de veu, enviant-les al servidor 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'
 });
};

Inicieu l'aplicació

El programa es pot llançar de la següent manera (és important assegurar-se que l'copter està connectat a Wi-Fi i el cable Ethernet està connectat a l'ordinador).

Obriu localhost:3000 al navegador i feu clic a Inicia el reconeixement.

Programem el control de veu de l'copter mitjançant Node.js i ARDrone

Intentem controlar el dron i estem contents.

Emissió de vídeo des d'un dron

Al projecte, creeu un fitxer nou i copieu-hi aquest codi:

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);

I aquí teniu el codi HTML, el col·loquem dins 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>

Inicieu i connecteu-vos a localhost:8080 per veure el vídeo des de la càmera frontal.

Programem el control de veu de l'copter mitjançant Node.js i ARDrone

Consells Útils

  • Vola aquest dron a l'interior.
  • Col·loqueu sempre la funda protectora al vostre drone abans d'enlairar-vos.
  • Comproveu si la bateria està carregada.
  • Si el drone es comporta de manera estranya, manteniu-lo premut i gireu-lo. Aquesta acció posarà l'copter en mode d'emergència i els rotors s'aturaran immediatament.

Codi preparat i demostració

DEMO VIU

DESCARREGAR

Succeït!

Escriure codi i veure com la màquina comença a obeir et donarà plaer! Ara hem descobert com ensenyar a un drone a escoltar ordres de veu. De fet, hi ha moltes més possibilitats: reconeixement facial d'usuari, vols autònoms, reconeixement de gestos i molt més.

Què pots suggerir per millorar el programa?

Skillbox recomana:

Font: www.habr.com

Afegeix comentari