Дрони чудові. Мені дуже подобається грати зі своїм коптером, записуючи фото та відео або просто розважаючись. Але безпілотні апарати (БПЛА) використовуються як для розваги. Вони працюють у кінематографі, вивчають льодовики, застосовуються військовими та представниками сільськогосподарської сфери.
У цьому туторіалі ми розберемо створення програми, яка дозволить керувати дроном. за допомогою голосових команд. Так, коптер робитиме те, що ви йому кажете. Наприкінці статті – готова програма та відео управління БПЛА.
Залізо
Нам потрібне таке:
Parrot ARDrone 2.0;
Ethernet-кабель;
гарний мікрофон.
Розробка та керування вестиметься на робочих станціях з Windows/Mac/Ubuntu. Особисто я працював з Mac та Ubuntu 18.04.
Спробуймо зрозуміти, як працює Parrot ARDrone. Цей коптер має чотири мотори.
Протистоять двигуни працюють в одному напрямку. Одна пара обертається за годинниковою стрілкою, інша проти. Переміщається дрон за рахунок зміни кута нахилу щодо поверхні землі, зміни швидкості обертання моторів та ще кількох маневрених рухів.
Як бачимо на діаграмі вище, зміна різних параметрів призводить до зміни напряму руху коптера. Наприклад, зменшення або збільшення швидкості обертання лівого та правого роторів створюють крен. Це дозволяє дрону летіти вперед чи назад.
Змінюючи швидкість і напрям руху моторів, ми задаємо кути нахилу, що дозволяють коптеру здійснювати рух в інших напрямках. Власне, для поточного проекту аеродинаміку вивчати не потрібно просто варто зрозуміти основні принципи.
Як працює Parrot ARDrone
Дрон є точку доступу Wi-Fi. Для того, щоб отримувати та відправляти команди коптеру, необхідно до цієї точки підключитися. Є багато різноманітних програм, що дозволяють керувати коптерами. Виглядає все це приблизно так:
Як тільки дрон підключений, відкриваємо термінал та telnet 192.168.1.1 – це IP коптера. Для Linux можна використовувати Linux Busybox.
Архітектура програми
Наш код буде поділено на наступні модулі:
інтерфейс користувача з мовним API для виявлення голосу;
фільтрація команд та зіставлення з еталоном;
відправлення команд дрону;
пряма трансляція відео.
API працює за умови наявності інтернет-підключення. Щоб його забезпечити, ми додаємо підключення по Ethernet.
Час створювати додаток!
Кодим
Спочатку створимо нову папку і переключимося на неї за допомогою терміналу.
Потім створюємо 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" title="Start Recording">Start Recognition</button>
<button id="pause-record-btn" 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, а Ethernet-кабель підключений до комп'ютера).
Відкриваємо localhost:3000 у браузері та клацаємо Start Recognition.
Пробуємо керувати дроном і радіємо.
Трансляція відео з дрону
У проекті створюємо новий файл і копіюємо туди цей код:
Написати код і потім спостерігати, як машина починає слухатися, принесе вам задоволення! Зараз ми розібралися у тому, як навчити дрон слухати голосові команди. Насправді можливостей набагато більше: розпізнавання особи користувача, автономні польоти, розпізнавання жестів та багато іншого.
Що ви можете запропонувати для покращення програми?