
In questo tutorial, esamineremo la creazione di un programma per un drone con controllo vocale utilizzando Node.js e l'API Web speech. Il drone è un Parrot ARDrone 2.0.
Ricordiamo: per tutti i lettori di «Habr» — sconto di 10.000 rubli per l'iscrizione a qualsiasi corso Skillbox con il codice promozionale «Habr».
Skillbox consiglia: Corso pratico .
Introduzione
I droni sono fantastici. Mi piace davvero giocare con il mio drone, registrando foto e video o semplicemente divertendomi. Ma i veicoli aerei senza pilota (UAV) non sono utilizzati solo per divertirsi. Vengono impiegati nel cinema, studiano i ghiacciai e sono utilizzati da militari e operatori agricoli.
In questo tutorial, esamineremo la creazione di un programma che consenta di controllare un drone usando comandi vocali. Sì, il drone farà quello che gli dici. Alla fine dell'articolo troverai il programma completo e un video di controllo dell'UAV.
Hardware
Abbiamo bisogno di quanto segue:
- Parrot ARDrone 2.0;
- cavo Ethernet;
- un buon microfono.
Lo sviluppo e il controllo avverranno su workstation con Windows/Mac/Ubuntu. Personalmente, ho lavorato con Mac e Ubuntu 18.04.
Software
Scarica l'ultima versione di Node.js da .
Serve anche .
Esploriamo il drone.
Cerchiamo di capire come funziona il Parrot ARDrone. Questo drone ha quattro motori.

I motori contrapposti funzionano in una sola direzione. Una coppia ruota in senso orario, l'altra in senso antiorario. Il drone si muove grazie al cambiamento dell'angolo di inclinazione rispetto al terreno, alla variazione della velocità di rotazione dei motori e ad altri movimenti manovrabili.

Come possiamo vedere nel diagramma sopra, la variazione di diversi parametri porta a un cambiamento nella direzione di volo del drone. Ad esempio, la diminuzione o l'aumento della velocità di rotazione dei rotori sinistro e destro creano un'inclinazione. Questo permette al drone di volare in avanti o indietro.
Modificando la velocità e la direzione di movimento dei motori, impostiamo gli angoli di inclinazione, consentendo al drone di muoversi in altre direzioni. In effetti, per il progetto attuale non è necessario studiare l'aerodinamica, è sufficiente capire i principi di base.
Come funziona il Parrot ARDrone
Il drone funge da punto di accesso Wi-Fi. Per inviare e ricevere comandi al drone, è necessario collegarsi a questo punto di accesso. Esistono molte applicazioni diverse che consentono di controllare i droni. Questo appare all'incirca così:

Una volta connesso il drone, apriamo il terminale e digitiamo telnet 192.168.1.1 — questo è l'IP del quadricottero. Per Linux, possiamo utilizzare .
Architettura dell'applicazione
Il nostro codice sarà diviso nei seguenti moduli:
- interfaccia utente con API vocali per la rilevazione vocale;
- filtraggio dei comandi e corrispondenza con il riferimento;
- invio dei comandi al drone;
- streaming video.
L'API funziona a condizione che ci sia una connessione a Internet. Per garantirla, stiamo aggiungendo una connessione Ethernet.
È tempo di creare l'app!
Codifichiamo
Iniziamo creando una nuova cartella e passando a essa tramite il terminale.
Poi creiamo un progetto Node utilizzando i comandi qui sotto.
Per prima cosa, installiamo le dipendenze necessarie.
npm install
Supporteremo i seguenti comandi:
- decollo;
- atterraggio;
- su — il drone sale di mezzo metro e si ferma;
- giù — scende di mezzo metro e si ferma;
- sinistra — si sposta a sinistra di mezzo metro;
- destra — si sposta a destra di mezzo metro;
- rotazione — ruota in senso orario di 90 gradi;
- avanti — si sposta in avanti di mezzo metro;
- indietro — si sposta indietro di mezzo metro;
- stop.
Ecco il codice che consente di ricevere comandi, filtrarli e controllare un 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();
// disabilita emergenza
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 ricevuto ', req.body);
console.log('comandi esistenti', commands);
let command = req.body.command.replace(/ /g,'');
if(commands.indexOf(command) !== -1) {
switch(command.toUpperCase()) {
case "TAKEOFF":
console.log('decollo del drone');
drone.takeoff();
break;
case "LAND":
console.log('atterraggio del drone');
drone.land();
break;
case "UP":
console.log('sollevando il drone di mezzo metro');
drone.up(0.2);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "DOWN":
console.log('abbassando il drone di mezzo metro');
drone.down(0.2);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOLEFT":
console.log('portando il drone a sinistra di 1 metro');
drone.left(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},1000);
break;
case "GORIGHT":
console.log('portando il drone a destra di 1 metro');
drone.right(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},1000);
break;
case "TURN":
console.log('girando il drone');
drone.clockwise(0.4);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOFORWARD":
console.log('muovendo il drone in avanti di 1 metro');
drone.front(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOBACKWARD":
console.log('muovendo il drone indietro di 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);Ecco il codice HTML e JavaScript che ascolta l'utente e invia un comando al server Node.
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>App di Note Controllate da Voce</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>Drone Controllato da Voce</h1>
<p class="page-description">Una piccola app che ti consente di controllare un drone AR utilizzando la voce</p>
<h3 class="no-browser-support">Spiacente, il tuo browser non supporta l'API Web Speech. Prova a aprire questa demo in Google Chrome.</h3>
<div class="app">
<h3>Dai il comando</h3>
<div class="input-single">
<textarea id="note-textarea" placeholder="Crea una nuova nota digitando o utilizzando il riconoscimento vocale." rows="6"></textarea>
</div>
<button id="start-record-btn" title="Inizia Registrazione">Inizia Riconoscimento</button>
<button id="pause-record-btn" title="Pausa Registrazione">Pausa Riconoscimento</button>
<p id="recording-instructions">Premi il <strong>Inizia Riconoscimento</strong> pulsante e consenti l'accesso.</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>E ancora, il codice JavaScript per gestire i comandi vocali, inviandoli al server Node.
try {
var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
var recognition = new SpeechRecognition();
}
catch(e) {
console.error(e);
$('.no-browser-support').show();
$('.app').hide();
}
// altro codice, fare riferimento alla fonte su GitHub
recognition.onresult = function(event) {
// event è un oggetto SpeechRecognitionEvent.
// Contiene tutte le righe che abbiamo catturato finora.
// Abbiamo solo bisogno di quella attuale.
var current = event.resultIndex;
// Otteniamo un trascritto di ciò che è stato detto.
var transcript = event.results[current][0].transcript;
// inviarlo al backend
$.ajax({
type: 'POST',
url: '/command/',
data: JSON.stringify({command: transcript}),
success: function(data) { console.log(data) },
contentType: "application/json",
dataType: 'json'
});
};Avviamo l'applicazione
Il programma può essere avviato nel seguente modo (è importante assicurarsi che il drone sia connesso al Wi-Fi e che il cavo Ethernet sia collegato al computer).
Apriamo localhost:3000 nel browser e facciamo clic su Start Recognition.

Proviamo a controllare il drone e ci divertiamo.
Streaming video dal drone
Creiamo un nuovo file nel progetto e copiamo qui dentro questo codice:
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);Ecco il codice HTML, lo posizioniamo all'interno della cartella public.
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Flusso come modulo</title>
<script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<h1 id="heading">Flusso video del 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>Avviamo e ci connettiamo a localhost:8080 per visualizzare il video dalla camera frontale.

Suggerimenti utili
- Controlla questo drone al chiuso.
- Indossa sempre la copertura protettiva sul drone prima del decollo.
- Controlla se la batteria è carica.
- Se il drone si comporta in modo strano, tienilo sotto e rovescialo. Questa azione porterà il drone in modalità di emergenza e i rotori si fermeranno immediatamente.
Codice pronto e dimostrazione
Fatto!
Scrivere codice e poi osservare come la macchina inizia ad obbedire sarà un piacere! Ora abbiamo capito come insegnare al drone a rispondere ai comandi vocali. In realtà, ci sono molte più possibilità: riconoscimento facciale dell'utente, voli autonomi, riconoscimento dei gesti e molto altro.
Cosa puoi proporre per migliorare il programma?
Skillbox consiglia:
- Corso online applicativo .
- Corso online .
- Corso pratico annuale .
Fonte: habr.com
