
Selles Ôpetuses kÀsitleme hÀÀlejuhtimisega drooni rakenduse loomist Node.js ja Web Speech API abil. Kopter on Parrot ARDrone 2.0.
Tuletame meelde: kĂ”igile «Habr» lugejatele â 10 000 rubla allahindlus igale Skillboxi kursusele, kasutades sooduskoodi «Habr».
Skillbox soovitab: Praktiline kursus .
Sissejuhatus
Droonid on hÀmmastavad. Mulle meeldib vÀga mÀngida oma kopteriga, jÀÀdvustades fotosid ja videoid vÔi lihtsalt lÔbutsedes. Kuid droone (BPLA-sid) kasutatakse mitte ainult meelelahutuseks. Need töötavad filmikunstis, uurivad jÀÀkoguseid ning neid kasutavad militaar- ja pÔllumajandussektor.
Selles Ă”petuses kĂ€sitleme programmi loomist, mis vĂ”imaldab drooni juhtida hÀÀlekĂ€skude abil. Jah, kopter teeb seda, mida te talle ĂŒtlete. Artikli lĂ”pus on valmis programm ja video BPLA juhtimisest.
Riistvara
Meil on vaja jÀrgmist:
- Parrot ARDrone 2.0;
- Ethernet-kaabel;
- hea mikrofon.
Arendust ja juhtimist teostatakse Windowsi/Maci/Ubuntu tööjaamades. Isiklikult olen töötanud Maci ja Ubuntu 18.04-ga.
Tarkvara
Laadi alla viimane versioon Node.js-ist .
Samuti on vajalik .
Kopteri mÔistmine
Proovime aru saada, kuidas Parrot ARDrone töötab. Sellel kopteril on neli mootorit.

Vastassuunalised mootorid töötavad ĂŒhes suunas. Ăks paar pöörleb pĂ€ripĂ€eva, teine â vastupĂ€eva. Droon liigub, muutes kallutusnurka maapinna suhtes, muutes mootoreid pöörlemiskiirus ja tehes mitmeid manööverdusi.

Nagu nĂ€eme ĂŒlaltoodud diagrammil, toovad erinevate parameetrite muutmine kaasa kopteri liikumissuuna muutuse. NĂ€iteks vasaku ja parema rootori pöörlemiskiiruse vĂ€hendamine vĂ”i suurendamine loob kallutuse. See vĂ”imaldab droonil liikuda edasi vĂ”i tagasi.
Muutudes mootori pöörlemiskiirus ja suunda, mÀÀrame kallutuse nurgad, mis vĂ”imaldavad kopteril liikuda teistesse suundadesse. Tegelikult ei ole hetkel aerodĂŒnaamika uurimine vajalik, tuleb lihtsalt mĂ”ista pĂ”hiteooriaid.
Kuidas Parrot ARDrone töötab
Droon on Wi-Fi pÀÀsupunkt. Selleks, et saada ja saata kĂ€ske kopterile, tuleks selle pÀÀsupunktiga ĂŒhendada. On palju erinevaid rakendusi, mis vĂ”imaldavad koptereid juhtida. KĂ”ik see nĂ€eb vĂ€lja umbes nii:

Kuna droon on ĂŒhendatud, avame terminali ja telnet 192.168.1.1 â see on kopteri IP. Linuxi puhul vĂ”ib kasutada .
Rakenduse arhitektuur
Meie kood jaguneb jÀrgmiseks mooduliteks:
- kasutajaliidese hÀÀle tuvastamise API;
- kÀskude filtreerimine ja vÔrdlemine standardiga;
- kÀskude edastamine droonile;
- video otseĂŒlekanne.
API töötab ainult siis, kui on olemas internetiĂŒhendus. Selle tagamiseks lisame EthernetiĂŒhenduse.
On aeg rakendust luua!
Koodime
Alustuseks loome uue kausta ja lĂŒlitumme sinna terminali abil.
SeejÀrel loome Node-projekti, kasutades allpool toodud kÀske.
Esialgu installime vajalikud sÔltuvused.
npm installâ
Toetame jÀrgmisi kÀske:
- tÔus;
- maandumine;
- ĂŒles â droon tĂ”useb pool meetrit ja peatub;
- alla â laske pool meetrit alla ja peatage;
- vasakule â liigub vasakule pool meetrit;
- paremale â liigub paremale pool meetrit;
- pööre â pöörab 90 kraadi pĂ€ripĂ€eva;
- edasi â liigub edasi pool meetrit;
- tagasi â liigub tagasi pool meetrit;
- peatus.
Siin on kood, mis vÔimaldab kÀskude vastuvÔtmist, nende filtreerimist ja drooni juhtimist.
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);Siin on HTML- ja JavaScripti kood, mis kuulab kasutajat ja saadab kÀsu Node-serverile.
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Hääljuhtimisega märkmete rakendus</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>Hääljuhtimisega droon</h1>
<p class="page-description">Väike rakendus, mis võimaldab sul juhtida AR drooni häält kasutades</p>
<h3 class="no-browser-support">Kahjuks ei toeta su braUser Web Speech API. Proovi avada see demo Google Chrome'is.</h3>
<div class="app">
<h3>Anna käsklus</h3>
<div class="input-single">
<textarea id="note-textarea" placeholder="Loo uus märge, kirjutades või kasutades häältuvastust." rows="6"></textarea>
</div>
<button id="start-record-btn" title="Alusta salvestamist">Alusta tuvastamist</button>
<button id="pause-record-btn" title="Peata salvestamine">Peata tuvastamine</button>
<p id="recording-instructions">Press the <strong>Alusta tuvastamist</strong> nuppu ja luba juurdepääs.</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>Ja veel JavaScripti kood, et töötada hÀÀlekÀskudega, saates need Node-serverile.
katsume {
var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
var recognition = new SpeechRecognition();
}
catch(e) {
console.error(e);
$('.no-browser-support').show();
$('.app').hide();
}
// muu kood, palun viidake GitHubi allikale
recognition.onresult = function(event) {
// event on SpeechRecognitionEvent objekt.
// See sisaldab kÔiki ridu, mida oleme seni tabanud.
// Me vajame ainult praegust.
var current = event.resultIndex;
// Saage transkriptsioon sellest, mis öeldi.
var transcript = event.results[current][0].transcript;
// saata see tagumisse ossa
$.ajax({
type: 'POST',
url: '\/command\/',
data: JSON.stringify({command: transcript}),
success: function(data) { console.log(data) },
contentType: "application\/json",
dataType: 'json'
});
};KĂ€ivitame rakenduse
Programmi saab kĂ€ivitada jĂ€rgmiselt (oluline on veenduda, et droon on ĂŒhendatud Wi-Fi ja Ethernet-kaabel on ĂŒhendatud arvutiga).
Avame localhost:3000 brauseris ja klÔpsame Start Recognition.

Proovime drooni juhtida ja rÔÔmustame.
Droonivideo edastamine
Projektis loome uue faili ja kopeerime sinna selle koodi:
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);Siin on HTML-kood, asetame selle public kausta.
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Voog modulina</title>
<script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<h1 id="heading">Droonivideo voog</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>KĂ€ivitame ja ĂŒhendame localhost:8080, et vaadata videod esikaamerast.

Kasulikud nÀpunÀited
- Juhtige seda drooni siseruumides.
- Kandke alati droonile kaitsekate enne ÔhkutÔusu.
- Kontrollige, kas aku on laetud.
- Kui droon kĂ€itub kummaliselt, hoidke seda altpoolt ja pöörake ĂŒmber. See toiming viib drooni hĂ€daolukorra reĆŸiimi ja rootorid seiskuvad kohe.
Valmis kood ja demo
Saime hakkama!
Koodi kirjutamine ja seejĂ€rel jĂ€lgimine, kuidas masin hakkab kuulama, toob teile rÔÔmu! NĂŒĂŒd oleme aru saanud, kuidas Ă”petada drooni kuulama hÀÀlkĂ€sklusi. Tegelikult on vĂ”imalusi palju rohkem: kasutaja nĂ€o tuvastamine, iseseisvad lennud, ĆŸestide tuvastamine ja palju muud.
Mida saate pakkuda programmi parendamiseks?
Skillbox soovitab:
- Rakenduslik veebikursus .
- Veebikursus .
- Praktiline aastakursus .
Allikas: habr.com
