
Ebben a bemutatóban egy hangvezérléssel rendelkező drónprogram létrehozását fogjuk részletezni Node.js és a Web Speech API segítségével. A drón — Parrot ARDrone 2.0.
Emlékeztetjük: minden «Habr» olvasónak 10 000 rubeles kedvezmény jár bármely Skillbox kurzus jelentkezésekor a «Habr» promóciós kód felhasználásával.
A Skillbox ajánlja: Gyakorlati kurzus .
Bevezetés
A drónok lenyűgözőek. Nagyon szeretek játszani a drónommal, fényképeket és videókat készíteni, vagy csak szórakozni. De a drónok (UAV) nem csak szórakozásra használhatók. A filmiparban dolgoznak, a gleccsereket tanulmányozzák, és a hadsereg valamint a mezőgazdasági területek képviselői is alkalmazzák őket.
Ebben a bemutatóban egy program létrehozásáról beszélünk, amely lehetővé teszi a drón irányítását hangparancsokkal. Igen, a drón azt fogja csinálni, amit mondasz neki. A cikk végén a kész programot és a drón irányításáról készült videót találod.
Hardver
Szükségünk van a következőkre:
- Parrot ARDrone 2.0;
- Ethernet-kábel;
- jó mikrofonra.
A fejlesztést és az irányítást Windows/Mac/Ubuntu munkaállomásokon végezzük. Személy szerint Mac és Ubuntu 18.04 alatt dolgoztam.
Szoftver
Töltsd le a legújabb Node.js verziót a .
Szükséges a .
A drón megismerése
Próbáljuk megérteni, hogyan működik a Parrot ARDrone. Ennek a drónnak négy motorja van.

Az ellentétes motorok egy irányba működnek. Az egyik pár óramutató járásával megegyezően, a másik pedig ellentétesen forog. A drón a talajhoz viszonyított dőlésszögének megváltoztatásával, a motorok forgási sebességének módosításával, valamint néhány egyéb manőverezési mozgással helyezkedik el.

Ahogy azt a fenti diagramon láthatjuk, a különböző paraméterek megváltoztatása a drón mozgásának irányának megváltozásához vezet. Például a bal és jobb rotorok forgási sebességének csökkentése vagy növelése dőlést okoz. Ez lehetővé teszi a drón számára, hogy előre vagy hátra repüljön.
A motorok sebességének és mozgásának irányának megváltoztatásával dőlésszögeket állítunk be, amelyek lehetővé teszik a drón számára, hogy más irányokba mozogjon. A jelenlegi projekt szempontjából az aerodinamikával nem kell foglalkozni, csak az alapelveket kell megérteni.
Hogyan működik a Parrot ARDrone
A drón egy Wi-Fi hozzáférési pontként működik. Ahhoz, hogy parancsokat kapjon és küldjön a drónnak, csatlakozni kell ehhez a ponthoz. Sokféle alkalmazás létezik, amelyek lehetővé teszik a drónok irányítását. Ez nagyjából így néz ki:

Amint a drón csatlakozik, nyisd meg a terminált és írd be a telnet 192.168.1.1 — ez a drón IP címe. Linux alatt használható: .
Az alkalmazás architektúrája
A kódunk a következő modulokra lesz felosztva:
- hangsúlyos API a hangészleléshez tartozó felhasználói felület;
- utasítások szűrése és referenciával való összevetés;
- utasítások küldése a drónnak;
- élő videó közvetítés.
Az API működéséhez internetkapcsolatra van szükség. Ennek biztosítása érdekében Ethernet csatlakozást is hozzáadunk.
Ideje alkalmazást létrehozni!
Kódolunk
Először hozzunk létre egy új mappát, és váltson át rá a terminál segítségével.
Ezután hozzuk létre a Node-projektet, az alábbi parancsok segítségével.
Először telepítsük a szükséges függőségeket.
npm install
A következő parancsokat fogjuk támogatni:
- felszállás;
- leszállás;
- fel — a drón fél méter magasba emelkedik és lebeg;
- le — fél méterre süllyed és lebeg;
- balra — fél méterre mozdul balra;
- jobbra — fél méterre mozdul jobbra;
- fordulás — 90 fokkal az óramutató járásával megegyezően fordul;
- előre — fél méterre halad előre;
- hátra — fél méterre halad hátra;
- megáll.
Itt van a kód, amely lehetővé teszi az utasítások fogadását, szűrését és a drón irányítását.
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 a meter');
drone.up(0.2);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "DOWN":
console.log('taking the drone down half a 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);Itt van a HTML- és JavaScript-kód, amely figyeli a felhasználót, és parancsot küld a Node-szerverre.
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Hangvezérlésű Jegyzetek Alkalmazás</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>Hangvezérlésű Drón</h1>
<p class="page-description">Egy apró alkalmazás, amely lehetővé teszi az AR drón vezérlését hanggal</p>
<h3 class="no-browser-support">Sajnáljuk, a böngésződ nem támogatja a Web Speech API-t. Próbáld meg ezt a demót a Google Chrome-ban megnyitni.</h3>
<div class="app">
<h3>Add meg a parancsot</h3>
<div class="input-single">
<textarea id="note-textarea" placeholder="Hozz létre egy új jegyzetet gépeléssel vagy hangfelismeréssel." rows="6"></textarea>
</div>
<button id="start-record-btn" title="Kezd el a felvételt">Indítsd el a felismerést</button>
<button id="pause-record-btn" title="Hagyd abba a felvételt">Pauszdd a felismerést</button>
<p id="recording-instructions">Nyomd meg a <strong>Indítsd el a felismerést</strong> gombot, és engedélyezd a hozzáférést.</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>És itt van a JavaScript-kód, amely a hangutasításokkal dolgozik, elküldve azokat a Node-szerverre.
próbálja meg {
var SpeechRecognition = ablak.SpeechRecognition || ablak.webkitSpeechRecognition;
var recognition = új SpeechRecognition();
}
catch(e) {
console.error(e);
$('.no-browser-support').show();
$('.app').hide();
}
// más kód, kérjük, hivatkozzon a GitHub forrásra
recognition.onresult = function(event) {
// az esemény egy SpeechRecognitionEvent objektum.
// Ez tartalmazza az összes eddig rögzített mondatot.
// Csak a jelenlegire van szükségünk.
var current = event.resultIndex;
// Tekintse meg a mondottak átírását.
var transcript = event.results[current][0].transcript;
// küldje el a háttérprogramnak
$.ajax({
típus: 'POST',
url: ' /command/',
adatok: JSON.stringify({command: transcript}),
siker: function(data) { console.log(data) },
contentType: "application/json",
dataType: 'json'
});
};Alkalmazás indítása
A programot a következő módon indíthatja (fontos megbizonyosodni arról, hogy a drón csatlakozik a Wi-Fi-hoz, míg az Ethernet-kábel a számítógéphez van csatlakoztatva).
Nyissuk meg a localhost:3000-at a böngészőben, és kattintsunk a Start Recognition gombra.

Próbálja meg irányítani a drónt, és örvendjen.
Videóátvitel a drónról
A projektben létrehozunk egy új fájlt, és bemásoljuk ebbe a kódot:
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);Íme a HTML-kód, ezt helyezzük el a public mappában.
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Modulként közvetítés</title>
<script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<h1 id="heading">Drónvideó élőközvetítés</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>Indítsa el, és csatlakozzon a localhost:8080-hoz, hogy megnézze a videót az elülső kamerából.

Hasznos tippek
- Irányítsa ezt a drónt zárt térben.
- Mindig rakja rá a védőburkolatot a drónra a felszállás előtt.
- Ellenőrizze, hogy fel van-e töltve az akkumulátor.
- Ha a drón furcsán viselkedik, tartsa alulról, és fordítsa meg. Ez a cselekvés biztonsági módba helyezi a drónt, és a rotorok azonnal megállnak.
Kész kód és bemutató
Sikerült!
A kód megírása és azután figyelni, ahogy a gép elkezd engedelmeskedni, örömet fog okozni Önnek! Most már megtanultuk, hogyan taníthatjuk meg a drónt, hogy hallgassa a hangparancsokat. Valójában sokkal több lehetőség van: arcfelismerés, autonóm repülés, gesztusok felismerése és még sok más.
Mit javasol a program javítására?
A Skillbox ajánlja:
- Alkalmazott online kurzus .
- Online kurzus .
- Gyakorlati éves kurzus .
Forrás: habr.com
