
Во ова упатство ќе погледнеме како креираме програма за беспилотно летало со гласовна контрола со помош на Node.js и Web говор API. Copter - Parrot ARDrone 2.0.
Потсетуваме: за сите читатели на „Хабр“ - попуст од 10 рубли при запишување на кој било курс Skillbox користејќи го промотивниот код „Хабр“.
Skillbox препорачува: Практичен курс .
Вовед
Дроновите се неверојатни. Навистина уживам да си играм со мојот кварт, да фотографирам и видеа или едноставно да се забавувам. Но, беспилотните летала (UAVs) се користат за повеќе од само забава. Тие работат во кино, ги проучуваат глечерите и ги користат војската и претставниците на земјоделскиот сектор.
Во овој туторијал ќе погледнеме како креираме програма која ќе ви овозможи да контролирате дрон. користејќи гласовни команди. Да, коптерот ќе го направи тоа што ќе му кажете да го направи. На крајот од статијата има готова програма и видео за контрола на UAV.
Железо
Ни треба следново:
- Папагал ARDrone 2.0;
- Етернет кабел;
- добар микрофон.
Развојот и управувањето ќе се вршат на работни станици со Windows/Мек/UbuntuЛично, работев со Mac и Ubuntu 18.04.
Софтвер
Преземете ја најновата верзија на Node.js од .
Исто така потребно .
Разбирање на хеликоптерот
Ајде да се обидеме да разбереме како функционира Parrot ARDrone. Овој хеликоптер има четири мотори.

Спротивните мотори работат во иста насока. Еден пар се ротира во насока на стрелките на часовникот, а другиот спротивно од стрелките на часовникот. Дронот се движи со менување на аголот на наклон во однос на површината на земјата, менување на брзината на ротација на моторите и неколку други маневрирачки движења.

Како што можеме да видиме на дијаграмот погоре, менувањето на различни параметри доведува до промена во насоката на движење на коптерот. На пример, со намалување или зголемување на брзината на ротација на левиот и десниот ротор се создава ролна. Ова му овозможува на дронот да лета напред или назад.
Со менување на брзината и насоката на моторите, поставуваме агли на навалување што му овозможуваат на коптерот да се движи во други насоки. Всушност, за сегашниот проект нема потреба од проучување на аеродинамиката, само треба да ги разберете основните принципи.
Како функционира Parrot ARDrone
Дронот е Wi-Fi hotspot. За да примате и испраќате команди до коптерот, треба да се поврзете на оваа точка. Постојат многу различни апликации кои ви дозволуваат да контролирате квадкоптери. Сето тоа изгледа вака:

Откако дронот ќе се поврзе, отворете го терминалот и телнетирајте 192.168.1.1 - ова е IP адресата на хеликоптерот. Linux може да се користи .
Архитектура на апликацијата
Нашиот код ќе биде поделен на следните модули:
- кориснички интерфејс со говорен API за откривање глас;
- филтрирање команди и споредување со стандард;
- испраќање команди до дронот;
- видео пренос во живо.
API работи се додека има интернет конекција. За да го обезбедиме ова, додаваме етернет конекција.
Време е да креирате апликација!
Код
Прво, ајде да создадеме нова папка и да се префрлиме на неа користејќи го терминалот.
Потоа креираме проект Node користејќи ги командите подолу.
Прво, ги инсталираме потребните зависности.
npm инсталирај
Ние ќе ги поддржиме следните команди:
- Соблечи;
- слетување;
- нагоре - дронот се крева половина метар и лебди;
- надолу - паѓа половина метар и замрзнува;
- лево - оди половина метар лево;
- десно - оди половина метар десно;
- ротација - ротира во насока на стрелките на часовникот за 90 степени;
- напред - оди напред половина метар;
- назад - се враќа половина метар назад;
- запре.
Еве го кодот кој ви овозможува да прифаќате команди, да ги филтрирате и да го контролирате дронот.
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 recieved ', 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);И тука е HTML и JavaScript кодот што го слуша корисникот и испраќа команда до серверот Node.
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Voice Controlled Notes App</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>Voice Controlled Drone</h1>
<p class="page-description">A tiny app that allows you to control AR drone using voice</p>
<h3 class="no-browser-support">Sorry, Your Browser Doesn't Support the Web Speech API. Try Opening This Demo In Google Chrome.</h3>
<div class="app">
<h3>Give the command</h3>
<div class="input-single">
<textarea id="note-textarea" placeholder="Create a new note by typing or using voice recognition." rows="6"></textarea>
</div>
<button id="start-record-btn" data-gt-translate-attributes='["title"]' title="Start Recording">Start Recognition</button>
<button id="pause-record-btn" data-gt-translate-attributes='["title"]' title="Pause Recording">Pause Recognition</button>
<p id="recording-instructions">Press the <strong>Start Recognition</strong> button and allow access.</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>И, исто така, JavaScript код за работа со гласовни команди, испраќајќи ги до серверот Node.
try {
var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
var recognition = new SpeechRecognition();
}
catch(e) {
console.error(e);
$('.no-browser-support').show();
$('.app').hide();
}
// other code, please refer GitHub source
recognition.onresult = function(event) {
// event is a SpeechRecognitionEvent object.
// It holds all the lines we have captured so far.
// We only need the current one.
var current = event.resultIndex;
// Get a transcript of what was said.
var transcript = event.results[current][0].transcript;
// send it to the backend
$.ajax({
type: 'POST',
url: '/command/',
data: JSON.stringify({command: transcript}),
success: function(data) { console.log(data) },
contentType: "application/json",
dataType: 'json'
});
};Стартување на апликацијата
Програмата може да се стартува на следниов начин (важно е да бидете сигурни дека коптерот е поврзан на Wi-Fi и кабелот за етернет е поврзан со компјутерот).
Отворете localhost:3000 во прелистувачот и кликнете Start Recognition.

Се обидуваме да го контролираме дронот и сме среќни.
Емитување видео од дрон
Во проектот, креирајте нова датотека и копирајте го овој код таму:
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);И тука е HTML-кодот, го ставаме во јавната папка.
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Stream as module</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>Стартувајте и поврзете се со localhost:8080 за да гледате видео од предната камера.

Корисни совети
- Летајте со овој дрон во затворен простор.
- Секогаш ставајте го заштитниот капак на вашиот дрон пред полетување.
- Проверете дали батеријата е наполнета.
- Ако дронот се однесува чудно, држете го и превртете го. Оваа акција ќе го стави коптерот во режим за итни случаи и роторите веднаш ќе застанат.
Подготвен код и демо
Се случи!
Пишувањето код и потоа гледањето како машината почнува да се покорува ќе ви донесе задоволство! Сега сфативме како да научиме дрон да слуша гласовни команди. Всушност, има многу повеќе можности: препознавање на лицето на корисникот, автономни летови, препознавање гестови и многу повеќе.
Што можете да предложите за подобрување на програмата?
Skillbox препорачува:
- Применет онлајн курс .
- Онлајн курс .
- Практичен годишен курс .
Извор: www.habr.com
