
În acest tutorial, vom analiza crearea unei aplicații pentru dronă cu control vocal pe Node.js și Web Speech API. Drona este Parrot ARDrone 2.0.
Vă reamintim: pentru toți cititorii „Habr” — reducere de 10.000 de ruble la înscrierea la orice curs Skillbox cu codul de promovare „Habr”.
Skillbox recomandă: Curs practic .
Introducere
Dronele sunt uimitoare. Îmi place foarte mult să mă joc cu drona mea, înregistrând fotografii și videoclipuri sau pur și simplu distrându-mă. Însă aeronavele fără pilot (UAV) nu sunt folosite doar pentru divertisment. Ele sunt utilizate în cinematografie, studiază ghețarii și sunt folosite de către armate și reprezentanți din domeniul agricol.
În acest tutorial, vom analiza crearea unei aplicații care va permite controlul dronei prin comenzi vocale. Da, drona va face ceea ce îi spui. La sfârșitul articolului – codul final și un videoclip de control al UAV.
Hardware
Avem nevoie de următoarele:
- Parrot ARDrone 2.0;
- cablul Ethernet;
- un microfon bun.
Dezvoltarea și controlul vor fi efectuate pe stații de lucru cu Windows/Mac/Ubuntu. Personal, am lucrat cu Mac și Ubuntu 18.04.
Software
Descărcați cea mai recentă versiune de Node.js de pe .
De asemenea, avem nevoie de .
Înțelegem drona
Hai să încercăm să înțelegem cum funcționează Parrot ARDrone. Această dronă are patru motoare.

Motoarele opuse funcționează în aceeași direcție. O pereche se rotește în sensul acelor de ceasornic, cealaltă – în sens invers. Drona se mișcă prin schimbarea unghiului de înclinare față de suprafața terenului, modificarea vitezei de rotație a motoarelor și câteva mișcări manevrabile.

Așa cum vedem în diagrama de mai sus, schimbarea diferitelor parametrii duce la schimbarea direcției de mișcare a dronei. De exemplu, reducerea sau creșterea vitezei de rotație a rotorilor stâng și drept generează un unghi de înclinare. Aceasta permite dronei să zboare înainte sau înapoi.
Prin modificarea vitezei și direcției de mișcare a motoarelor, stabilim unghiurile de înclinare, permițând dronei să se miște în alte direcții. În esență, pentru proiectul actual nu este necesară studierea aerodinamicii, trebuie doar să înțelegem principiile de bază.
Cum funcționează Parrot ARDrone
Drona este un punct de acces Wi-Fi. Pentru a primi și trimite comenzi către dronă, trebuie să te conectezi la acest punct. Există multe aplicații diverse care permit controlul dronelor. Arată cam așa:

Odată conectată drona, deschidem terminalul și tastăm telnet 192.168.1.1 – acesta este IP-ul dronei. Pentru Linux, se poate folosi .
Arhitectura aplicației
Codul nostru va fi împărțit în următoarele module:
- interfața utilizatorului cu API vocal pentru detectarea vocii;
- filtrarea comenzilor și potrivirea cu referința;
- trimiterea comenzilor către drone;
- transmiterea live a video-ului.
API-ul funcționează cu condiția să existe o conexiune la internet. De aceea, adăugăm o conexiune Ethernet.
E timpul să creăm aplicația!
Programăm
La început, vom crea un nou folder și ne vom schimba în el prin intermediul terminalului.
Apoi, vom crea un proiect Node folosind comenzile de mai jos.
La început, instalăm dependențele necesare.
npm install
Vom susține următoarele comenzi:
- decolare;
- aterizare;
- sus — dronele se ridică cu jumătate de metru și rămân suspendate;
- jos — coboară cu jumătate de metru și rămân suspendate;
- stânga — se deplasează la stânga cu jumătate de metru;
- dreapta — se deplasează la dreapta cu jumătate de metru;
- întoarcere — se rotește în sensul acelor de ceasornic cu 90 de grade;
- în față — se deplasează înainte cu jumătate de metru;
- înapoi — se deplasează înapoi cu jumătate de metru;
- oprește.
Iată codul care permite primirea comenzilor, filtrarea acestora și controlul dronei.
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();
// dezactivează urgența
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('comandă primită ', req.body);
console.log('comenzi existente', commands);
let command = req.body.command.replace(/ /g,'');
if(commands.indexOf(command) !== -1) {
switch(command.toUpperCase()) {
case "TAKEOFF":
console.log('decolare drone');
drone.takeoff();
break;
case "LAND":
console.log('aterizare drone');
drone.land();
break;
case "UP":
console.log('ridicarea dronei cu jumătate de metru');
drone.up(0.2);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "DOWN":
console.log('coborârea dronei cu jumătate de metru');
drone.down(0.2);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOLEFT":
console.log('mutarea dronei la stânga 1 metru');
drone.left(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},1000);
break;
case "GORIGHT":
console.log('mutarea dronei la dreapta 1 metru');
drone.right(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},1000);
break;
case "TURN":
console.log('rotirea dronei');
drone.clockwise(0.4);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOFORWARD":
console.log('mutarea dronei înainte cu 1 metru');
drone.front(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOBACKWARD":
console.log('mutarea dronei înapoi 1 metru');
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);Iată codul HTML și JavaScript care ascultă utilizatorul și trimite comenzile către serverul Node.
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Aplicație pentru Note cu Control Vocal</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 cu Control Vocal</h1>
<p class="page-description">O aplicație mică care îți permite să controlezi drona AR folosind vocea</p>
<h3 class="no-browser-support">Ne pare rău, browserul tău nu suportă Web Speech API. Încearcă să deschizi această demonstrație în Google Chrome.</h3>
<div class="app">
<h3>Dă comanda</h3>
<div class="input-single">
<textarea id="note-textarea" placeholder="Creează o notă nouă prin tastare sau folosind recunoașterea vocală." rows="6"></textarea>
</div>
<button id="start-record-btn" title="Începe Înregistrarea">Începe Recunoașterea</button>
<button id="pause-record-btn" title="Pauză Înregistrare">Pauză Recunoaștere</button>
<p id="recording-instructions">Apasă pe <strong>Începe Recunoașterea</strong> buton și permite accesul.</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 un cod JavaScript pentru a lucra cu comenzile vocale, trimițându-le către serverul Node.
încearcă {
var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
var recognition = new SpeechRecognition();
}
catch(e) {
console.error(e);
$('.no-browser-support').show();
$('.app').hide();
}
// alt cod, vă rugăm să consultați sursa GitHub
recognition.onresult = function(event) {
// event este un obiect SpeechRecognitionEvent.
// Acesta conține toate liniile pe care le-am capturat până acum.
// Avem nevoie doar de cea curentă.
var current = event.resultIndex;
// Obțineți un transcriere a celor spuse.
var transcript = event.results[current][0].transcript;
// trimiteți-l la backend
$.ajax({
type: 'POST',
url: '\/command\/',
data: JSON.stringify({command: transcript}),
success: function(data) { console.log(data) },
contentType: "application\/json",
dataType: 'json'
});
};Lansăm aplicația
Programul poate fi lansat în felul următor (este important să ne asigurăm că drona este conectată la Wi-Fi, iar cablul Ethernet este conectat la computer).
Deschideți localhost:3000 în browser și faceți clic pe Start Recognition.

Încercați să controlați drona și bucurați-vă.
Transmitere video de la dronă
În proiect, creăm un fișier nou și copiem acest cod acolo:
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);Iată codul HTML, îl plasăm în interiorul folderului public.
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Fluxați ca modul</title>
<script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<h1 id="heading">Flux de video cu drone</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>Lansați și conectați-vă la localhost:8080 pentru a viziona video de la camera frontală.

Sfaturi utile
- Controlați această dronă în interior.
- Întotdeauna puneți capacul de protecție pe dronă înainte de decolare.
- Verificați dacă bateria este încărcată.
- Dacă drona se comportă ciudat, țineți-o de jos și răsturnați-o. Această acțiune va duce drona în modul de urgență, iar rotoarele se vor opri imediat.
Codul finalizat și demonstrația
A reușit!
Să scrii cod și apoi să observi cum mașina începe să asculte îți va aduce satisfacție! Acum am învățat cum să învățăm drona să asculte comenzile vocale. De fapt, există multe alte posibilități: recunoașterea feței utilizatorului, zboruri autonome, recunoașterea gesturilor și multe altele.
Ce puteți propune pentru a îmbunătăți programul?
Skillbox recomandă:
- Curs online aplicat .
- Curs online .
- Curs practic anual .
Sursa: habr.com
