
V temle tutorialu bomo raziskali, kako ustvariti program za dron z glasovnim upravljanjem na Node.js in Web Speech API. Dron je Parrot ARDrone 2.0.
Opominjamo: za vse bralce »Habra« — popust 10 000 rubljev ob vpisu na kateri koli tečaj Skillbox s promo kodo »Habr«.
Skillbox priporoča: Praktični tečaj .
Uvod
Droni so osupljivi. Zelo rad igram s svojim dronom, snemam fotografije in videoposnetke ali se preprosto zabavam. Vendar pa brezpilotni letalniki (BPL) niso namenjeni le zabavi. Uporabljajo se v kinematografiji, raziskovanju ledenikov, vojaške enote in kmetijska področja.
V tem tutorialu bomo raziskali ustvarjanje programa, ki bo omogočil obvladovanje drona z glasovnimi ukazi. Da, dron bo delal, kar mu poveste. Na koncu članka bo na voljo končni program in video upravljanja BPL.
Strojna oprema
Potrebujemo naslednje:
- Parrot ARDrone 2.0;
- Ethernet kabel;
- dober mikrofon.
Razvijanje in upravljanje bo potekalo na delovnih postajah z Windows/Mac/Ubuntu. Osebno sem delal z Mac in Ubuntu 18.04.
Software
Prenesite najnovejšo različico Node.js s .
Potrebna je tudi .
Razumevanje drona
Poglejmo, kako deluje Parrot ARDrone. Ta dron ima štiri motorje.

Proti sebi delujoči motorji delujejo v istem smeri. Eni par se vrti v smeri urinega kazalca, drugi pa proti. Dron se premika z spreminjanjem kota nagiba glede na zemljo, s spreminjanjem hitrosti vrtenja motorjev in še nekaterimi manevrskimi gibi.

Kot vidimo na zgornjem diagramu, sprememba različnih parametrov vpliva na spremembo smeri gibanja drona. Na primer, zmanjšanje ali povečanje hitrosti vrtenja levih in desnih rotorjev ustvarja nagib. To omogoča dronu, da leti naprej ali nazaj.
Z spreminjanjem hitrosti in smeri gibanja motorjev določamo kote nagiba, ki omogočajo dronu, da se premika v drugih smereh. V bistvu za trenutni projekt ni potrebno raziskovati aerodinamike, pomembno je razumeti osnovna načela.
Kako deluje Parrot ARDrone
Dron deluje kot dostopna točka Wi-Fi. Da bi lahko prejemali in pošiljali ukaze dronu, se je treba povezati s to točko. Obstaja veliko različnih aplikacij, ki omogočajo upravljanje dronov. Vse to izgleda nekako tako:

Ko je dron povezan, odpiramo terminal in telnet 192.168.1.1 — to je IP drona. Za Linux lahko uporabimo .
Arhitektura aplikacije
Naša koda bo razdeljena na naslednje module:
- uporabniški vmesnik z API-jem za prepoznavanje govora;
- filtriranje ukazov in usklajevanje s standardom;
- pošiljanje ukazov dronu;
- živo prenašanje videa.
API deluje ob pogojih, da imate internetno povezavo. Zato dodajamo povezavo preko Ethernet.
Čas je, da ustvarimo aplikacijo!
Kodiramo
Najprej ustvarimo novo mapo in se vanjo preklopimo s terminalom.
Nato ustvarimo Node-projekt z uporabo spodnjih ukazov.
Najprej namestimo zahtevane odvisnosti.
npm install
Podpirali bomo naslednje ukaze:
- vzlet;
- pristajanje;
- navzgor — dron se dvigne za pol metra in se zadrži;
- navzdol — se spusti za pol metra in se zadrži;
- levo — gre levo za pol metra;
- desno — gre desno za pol metra;
- obrat — se obrne v smeri urinega kazalca za 90 stopinj;
- naprej — gre naprej za pol metra;
- nazaj — gre nazaj za pol metra;
- ustavi se.
Tukaj je koda, ki omogoča sprejemanje ukazov, njihovo filtriranje in nadzor drona.
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);Tukaj je HTML in JavaScript koda, ki posluša uporabnika in pošilja ukaze na Node strežnik.
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Aplikacija za opombe z glasovnim upravljanjem</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 z glasovnim upravljanjem</h1>
<p class="page-description">Majhna aplikacija, ki vam omogoča upravljanje AR drona s pomočjo glasu</p>
<h3 class="no-browser-support">Opravičujemo se, vaš brskalnik ne podpira spletnega govora API. Poskusite odpreti to demo v Google Chromu.</h3>
<div class="app">
<h3>Izdajte ukaz</h3>
<div class="input-single">
<textarea id="note-textarea" placeholder="Ustvarite novo opombo z vnosom besedila ali z uporabo glasovnega prepoznavanja." rows="6"></textarea>
</div>
<button id="start-record-btn" title="Začnite snemanje">Začnite prepoznavanje</button>
<button id="pause-record-btn" title="Ustavite snemanje">Pauzirajte prepoznavanje</button>
<p id="recording-instructions">Pritisnite <strong>Začnite prepoznavanje</strong> gumb in dovolite dostop.</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>In še JavaScript koda za delo z glasovnimi ukazi in njihovo pošiljanje na Node strežnik.
poskusimo {
var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
var recognition = new SpeechRecognition();
}
catch(e) {
console.error(e);
$('.no-browser-support').show();
$('.app').hide();
}
// druga koda, glejte vir GitHub
recognition.onresult = function(event) {
// dogodek je objekt SpeechRecognitionEvent.
// vsebuje vse vrstice, ki smo jih doslej zajeli.
// potrebujemo le trenutno.
var current = event.resultIndex;
// Pridobite transkripcijo tega, kar je bilo rečeno.
var transcript = event.results[current][0].transcript;
// pošljite to v ozadje
$.ajax({
type: 'POST',
url: 'komanda/',
data: JSON.stringify({command: transcript}),
success: function(data) { console.log(data) },
contentType: "application/json",
dataType: 'json'
});
};Zagnati aplikacijo
Program lahko zaženete na naslednji način (pomembno je preveriti, ali je dron povezan na Wi-Fi, in da je Ethernet kabel priključen na računalnik).
Odprite localhost:3000 v brskalniku in kliknite Start Recognition.

Poskusite upravljati dron in uživajte.
Prenos videa iz drona
V projektu ustvarite novo datoteko in vanjo kopirajte to kodo:
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);Tukaj je HTML koda, ki jo postavite znotraj mape public.
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Prenos kot modul</title>
<script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<h1 id="heading">Video prenos iz drona</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>Zažene in poveže na localhost:8080 za ogled videa iz sprednje kamere.

Koristni nasveti
- Upravljajte s tem dronom v zaprtih prostorih.
- Vedno namestite zaščitno pokrovko na dron pred letom.
- Preverite, ali je baterija napolnjena.
- Če se dron nenavadno obnaša, ga držite spodaj in ga obrnite. To dejanje bo preklopilo dron v nujni način, in rotorji se takoj ustavijo.
Dokončana koda in demonstracija
Uspešno!
Pisanje kode in nato opazovanje, kako se naprava začne pridružiti, vam bo v veselje! Zdaj smo razumeli, kako naučiti dron poslušati glasovne ukaze. Dejansko je možnosti še več: prepoznava obraza uporabnika, avtonomni leti, prepoznavanje gibov in še veliko več.
Kaj lahko predlagate za izboljšanje programa?
Skillbox priporoča:
- Praktični spletni tečaj .
- Spletni tečaj .
- Практический годовой курс .
Izvor: habr.com
