
V tomto tutoriálu se budeme zabývat vytvořením programu pro dron s hlasovým ovládáním na Node.js a Web Speech API. Dron je Parrot ARDrone 2.0.
Připomínáme: pro všechny čtenáře "Habra" – sleva 10 000 korun při registraci na jakýkoli kurz Skillbox s promokódem "Habr".
Skillbox doporučuje: Praktický kurz .
Úvod
Drony jsou úžasné. Velmi mě baví hrát si se svým dronem, pořizovat fotografie a videa nebo se jen bavit. Ale bezpilotní letadla (BPLA) se používají nejen pro zábavu. Pracují v kinematografii, zkoumají ledovce, využívají je armáda a zemědělci.
V tomto tutoriálu se budeme zabývat vytvořením programu, který umožní ovládat dron pomocí hlasových příkazů. Ano, dron bude dělat to, co mu řeknete. Na konci článku najdete hotový program a video o ovládání BPLA.
Hardware
Budeme potřebovat následující:
- Parrot ARDrone 2.0;
- Ethernetový kabel;
- dobrý mikrofon.
Vývoj a řízení bude probíhat na pracovních stanicích s Windows/Mac/Ubuntu. Osobně jsem pracoval na Macu a Ubuntu 18.04.
Software
Stáhněte si nejnovější verzi Node.js z .
Také budete potřebovat .
Zkoumáme dron
Pojďme se pokusit pochopit, jak funguje Parrot ARDrone. Tento dron má čtyři motory.

Proti sobě pracující motory fungují ve stejném směru. Jeden pár se otáčí ve směru hodinových ručiček, druhý proti. Dron se pohybuje díky změně sklonu vzhledem k povrchu země, změně rychlosti otáčení motorů a dalším manévrovacím pohybům.

Jak vidíme na diagramu výše, změna různých parametrů vede ke změně směru pohybu dronu. Například snížení nebo zvýšení rychlosti otáčení levých a pravých rotorů vyvolává náklon. To umožňuje dronu letět vpřed nebo vzad.
Změnou rychlosti a směru pohybu motorů nastavujeme úhly náklonu, které umožňují dronu pohybovat se v jiných směrech. Vlastně pro aktuální projekt není třeba studovat aerodynamiku, stačí pochopit základní principy.
Jak funguje Parrot ARDrone
Dron představuje Wi-Fi přístupový bod. Aby bylo možné přijímat a odesílat příkazy dronu, je nutné se k tomuto bodu připojit. Existuje mnoho různých aplikací, které umožňují ovládání dronů. Vypadá to přibližně takto:

Jakmile je dron připojen, otevřeme terminál a telnet 192.168.1.1 — to je IP adresa dronu. Pro Linux můžete použít .
Architektura aplikace
Náš kód bude rozdělen do následujících modulů:
- uživatelské rozhraní se službou rozpoznávání hlasu API;
- filtrování příkazů a porovnání s referencí;
- odesílání příkazů dronu;
- průběžný přenos videa.
API funguje za podmínky připojení k internetu. Proto přidáváme připojení přes Ethernet.
Je čas vytvořit aplikaci!
Kódujeme
Nejprve vytvoříme novou složku a přepneme se do ní pomocí terminálu.
Poté vytvoříme Node projekt pomocí níže uvedených příkazů.
Nejprve nainstalujeme potřebné závislosti.
npm install
Budeme podporovat následující příkazy:
- vzlet;
- přistání;
- nahoru — dron se zvedne o půl metru a vyčkává;
- dolů — klesne o půl metru a vyčkává;
- vlevo — posune se vlevo o půl metru;
- vpravo — posune se vpravo o půl metru;
- otočení — otočí se po směru hodinových ručiček o 90 stupňů;
- vpřed — posune se vpřed o půl metru;
- zpět — posune se zpět o půl metru;
- stop.
Toto je kód, který umožňuje přijímat příkazy, filtrovat je a ovládat dron.
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();
// vypnout nouzový režim
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('příkaz přijat ', req.body);
console.log('existující příkazy', commands);
let command = req.body.command.replace(/ /g,'');
if(commands.indexOf(command) !== -1) {
switch(command.toUpperCase()) {
case "TAKEOFF":
console.log('drón vzlétá');
drone.takeoff();
break;
case "LAND":
console.log('drón přistává');
drone.land();
break;
case "UP":
console.log('zdvihám drón o půl metru');
drone.up(0.2);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "DOWN":
console.log('snížení drónu o půl metru');
drone.down(0.2);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOLEFT":
console.log('posuvuji drón na levé straně o 1 metr');
drone.left(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},1000);
break;
case "GORIGHT":
console.log('posuvuji drón na pravé straně o 1 metr');
drone.right(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},1000);
break;
case "TURN":
console.log('otáčím drónem');
drone.clockwise(0.4);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOFORWARD":
console.log('posuvuji drón dopředu o 1 metr');
drone.front(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOBACKWARD":
console.log('posuvuji drón dozadu o 1 metr');
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);Zde je HTML a JavaScript kód, který naslouchá uživateli a odesílá příkaz na Node server.
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Aplikace pro poznámky ovládané hlasem</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 ovládaný hlasem</h1>
<p class="page-description">Malá aplikace, která vám umožňuje ovládat AR dron pomocí hlasu</p>
<h3 class="no-browser-support">Omlouváme se, váš prohlížeč nepodporuje API Web Speech. Zkuste otevřít tuto ukázku v Google Chrome.</h3>
<div class="app">
<h3>Dejte příkaz</h3>
<div class="input-single">
<textarea id="note-textarea" placeholder="Vytvořte novou poznámku psaním nebo pomocí rozpoznávání hlasu." rows="6"></textarea>
</div>
<button id="start-record-btn" title="Zahájit nahrávání">Spustit rozpoznávání</button>
<button id="pause-record-btn" title="Pozastavit nahrávání">Pozastavit rozpoznávání</button>
<p id="recording-instructions">Stiskněte <strong>Spustit rozpoznávání</strong> tlačítko a povolte přístup.</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>A zde je JavaScript kód pro práci s hlasovými příkazy, které se odesílají na Node server.
zkuste {
var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
var recognition = new SpeechRecognition();
}
catch(e) {
console.error(e);
$('.no-browser-support').show();
$('.app').hide();
}
// další kód, prosím, odkazujte na zdroj na GitHubu
recognition.onresult = function(event) {
// event je objekt typu SpeechRecognitionEvent.
// Obsahuje všechny řádky, které jsme dosud zachytili.
// Potřebujeme pouze aktuální.
var current = event.resultIndex;
// Získejte přepis toho, co bylo řečeno.
var transcript = event.results[current][0].transcript;
// odešlete to na backend
$.ajax({
type: 'POST',
url: '\/command\/',
data: JSON.stringify({command: transcript}),
success: function(data) { console.log(data) },
contentType: "application\/json",
dataType: 'json'
});
};Spouštíme aplikaci
Aplikaci lze spustit následujícím způsobem (je důležité ujistit se, že je dron připojen k Wi-Fi a Ethernet kabel je připojen k počítači).
Otevřete localhost:3000 v prohlížeči a klikněte na Start Recognition.

Zkoušíme ovládat dron a užíváme si to.
Přenos videa z dronu
V projektu vytvořte nový soubor a zkopírujte do něj tento kód:
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);Toto je HTML kód, umístíme ho dovnitř složky public.
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Stream jako modul</title>
<script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<h1 id="heading">Videoový stream dronu</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>Spusťte a připojte se k localhost:8080 pro zobrazení videa z přední kamery.

Užitečné tipy
- Ovládejte tento dron uvnitř.
- Vždy si nasaďte ochranný kryt na dron před vzletem.
- Zkontrolujte, zda je baterie nabitá.
- Pokud se dron chová podivně, uchopte ho ze spodu a otočte. Tento úkon přepne dron do nouzového režimu a rotory se okamžitě zastaví.
Hotový kód a ukázka
Uspělo to!
Napsat kód a poté pozorovat, jak dron začíná poslouchat, vám přinese radost! Nyní jsme se naučili, jak naučit dron poslouchat hlasové povely. Ve skutečnosti je toho mnohem víc: rozpoznávání obličeje uživatele, autonomní lety, rozpoznávání gest a mnoho dalšího.
Co byste mohli navrhnout pro zlepšení programu?
Skillbox doporučuje:
- Aplikovaný online kurz .
- Online kurz .
- Praktický roční kurz .
Zdroj: habr.com
