
I denne tutorial vil vi gennemgå, hvordan man opretter et program til en drone med stemmestyring på Node.js og Web Speech API. Dronen er Parrot ARDrone 2.0.
Vi minder om: til alle læsere af 'Habr' — rabat på 10.000 rubler ved tilmelding til et hvilket som helst Skillbox-kursus med rabatkoden 'Habr'.
Skillbox anbefaler: Praktisk kursus .
Introduktion
Droner er fantastiske. Jeg elsker at lege med min drone, tage billeder og videoer eller bare have det sjovt. Men ubemandede luftfartøjer (UAV) bruges ikke kun til underholdning. De anvendes i filmproduktion, studerer gletsjere og bruges af militæret og landbrugssektoren.
I denne tutorial vil vi gennemgå, hvordan man opretter et program, som gør det muligt at styre dronen ved hjælp af stemmekommandoer. Ja, dronen vil gøre, hvad du siger. I slutningen af artiklen er der et færdigt program og en video om, hvordan man styrer UAV.
Hardware
Vi har brug for følgende:
- Parrot ARDrone 2.0;
- Ethernet-kabel;
- et godt mikrofon.
Udviklingen og styringen vil finde sted på arbejdsstationer med Windows/Mac/Ubuntu. Personligt har jeg arbejdet med Mac og Ubuntu 18.04.
Software
Download den nyeste version af Node.js fra .
Vi har også brug for den .
Forstå dronen
Lad os prøve at forstå, hvordan Parrot ARDrone fungerer. Denne drone har fire motorer.

Modstående motorer arbejder i samme retning. Et par roterer med uret, det andet mod uret. Dronen bevæger sig ved at ændre hældningsvinklen i forhold til jorden, justere hastigheden på motorerne og udføre flere manøvrer.

Som vi ser på diagrammet ovenfor, fører ændring af forskellige parametre til ændring af dronens bevægelsesretning. For eksempel skaber en reduktion eller stigning i hastigheden på venstre og højre rotor en hældning. Dette gør det muligt for dronen at flyve frem eller tilbage.
Ved at ændre hastigheden og retningen på motorerne indstiller vi hældningsvinklerne, som gør det muligt for dronen at bevæge sig i andre retninger. For dette projekt er det faktisk ikke nødvendigt at studere aerodynamik; det er blot vigtigt at forstå de grundlæggende principper.
Sådan fungerer Parrot ARDrone
Dronen fungerer som et Wi-Fi-adgangspunkt. For at sende og modtage kommandoer til dronen skal man forbinde til dette sted. Der findes mange forskellige applikationer, der kan styre droner. De ser nogenlunde sådan her ud:

Når dronen er forbundet, åbner vi terminalen og skriver telnet 192.168.1.1 — det er dronens IP-adresse. For Linux kan man bruge .
Applikationens arkitektur
Vores kode vil blive opdelt i følgende moduler:
- brugergrænseflade med et tale-API til stemmegenkendelse;
- filtrering af kommandoer og matchning med referencen;
- sending af kommandoer til dronen;
- live streaming af video.
API'en fungerer, forudsat at der er internetforbindelse. Derfor tilføjer vi også Ethernet-forbindelsen.
Det er tid til at lave en applikation!
Lad os kode
Først opretter vi en ny mappe og skifter til den ved hjælp af terminalen.
Derefter opretter vi et Node-projekt ved at bruge nedenstående kommandoer.
Først installerer vi de nødvendige afhængigheder.
npm install
Vi vil understøtte følgende kommandoer:
- take off;
- land;
- up — dronen stiger en halv meter og svæver;
- down — falder en halv meter og svæver;
- left — bevæger sig til venstre en halv meter;
- right — bevæger sig til højre en halv meter;
- turn — drejer med uret 90 grader;
- forward — bevæger sig fremad en halv meter;
- backward — bevæger sig bagud en halv meter;
- stop.
Her er koden, der gør det muligt at modtage kommandoer, filtrere dem og kontrollere dronen.
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 received ', 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);Her er HTML- og JavaScript-koden, der lytter til brugeren og sender kommandoen til Node-serveren.
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Styring af noter med stemmeapp</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>Styring af drone med stemme</h1>
<p class="page-description">En lille app, der lader dig styre AR-dronen ved hjælp af stemme</p>
<h3 class="no-browser-support">Beklager, din browser understøtter ikke Web Speech API. Prøv at åbne denne demo i Google Chrome.</h3>
<div class="app">
<h3>Giv kommandoen</h3>
<div class="input-single">
<textarea id="note-textarea" placeholder="Opret en ny note ved at skrive eller bruge tales genkendelse." rows="6"></textarea>
</div>
<button id="start-record-btn" title="Start optagelse">Start genkendelse</button>
<button id="pause-record-btn" title="Pause optagelse">Pause genkendelse</button>
<p id="recording-instructions">Tryk på <strong>Start genkendelse</strong> knappen og giv adgang.</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>Og her er JavaScript-koden, der arbejder med stemmekommandoer og sender dem til Node-serveren.
forsøg {
var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
var recognition = new SpeechRecognition();
}
catch(e) {
console.error(e);
$('.no-browser-support').show();
$('.app').hide();
}
// anden kode, se venligst GitHub kilde
recognition.onresult = function(event) {
// event er et SpeechRecognitionEvent objekt.
// Det indeholder alle de linjer, vi har fanget indtil nu.
// Vi har kun brug for den nuværende.
var current = event.resultIndex;
// Hent et transkript af hvad der blev sagt.
var transcript = event.results[current][0].transcript;
// send det til backend
$.ajax({
type: 'POST',
url: '\/command\/',
data: JSON.stringify({command: transcript}),
success: function(data) { console.log(data) },
contentType: "application\/json",
dataType: 'json'
});
};Start applikationen
Programmet kan startes som følger (det er vigtigt at sikre, at dronen er forbundet til Wi-Fi, og at Ethernet-kablet er tilsluttet computeren).
Åbn localhost:3000 i browseren og klik på Start Recognition.

Prøv at styre dronen og nyd det.
Videotransmission fra dronen
I projektet opretter vi en ny fil og kopierer denne kode derind:
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);Her er HTML-koden, som vi placerer inde i mappen public.
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Stream som modul</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>Start og forbind til localhost:8080 for at se video fra det frontale kamera.

Nyttige tips
- Styr denne drone indendørs.
- Sørg altid for at påsætte beskyttelseshætten på dronen før opstart.
- Tjek om batteriet er opladet.
- Hvis dronen opfører sig mærkeligt, skal du holde den nede og vende den om. Denne handling vil sætte dronen i nødtilstand, og rotorene stopper straks.
Færdig kode og demonstration
Det lykkedes!
At skrive koden og derefter se, hvordan maskinen begynder at adlyde, vil give dig glæde! Vi har nu lært, hvordan man får dronen til at forstå stemmekommandoer. Faktisk er der mange flere muligheder: ansigtsgenkendelse, autonome flyvninger, gestusgenkendelse og meget mere.
Hvad kan du foreslå for at forbedre programmet?
Skillbox anbefaler:
- Anvendt online-kursus .
- Online kursus .
- Praktisk års kursus .
Kilde: habr.com
