Програмуємо голосове керування коптером з використанням Node.js та ARDrone

Програмуємо голосове керування коптером з використанням Node.js та ARDrone

У цьому туторіалі ми розберемо створення програми для дрона з голосовим управлінням на Node.js та Web Speech API. Коптер - Parrot ARDrone 2.0.

Нагадуємо: для всіх читачів "Хабра" - знижка 10 000 рублів при записі на будь-який курс Skillbox за промокодом "Хабр".

Skillbox рекомендує: Практичний курс «Мобільний розробник PRO».

Запровадження

Дрони чудові. Мені дуже подобається грати зі своїм коптером, записуючи фото та відео або просто розважаючись. Але безпілотні апарати (БПЛА) використовуються як для розваги. Вони працюють у кінематографі, вивчають льодовики, застосовуються військовими та представниками сільськогосподарської сфери.

У цьому туторіалі ми розберемо створення програми, яка дозволить керувати дроном. за допомогою голосових команд. Так, коптер робитиме те, що ви йому кажете. Наприкінці статті – готова програма та відео управління БПЛА.

Залізо

Нам потрібне таке:

  • Parrot ARDrone 2.0;
  • Ethernet-кабель;
  • гарний мікрофон.

Розробка та керування вестиметься на робочих станціях з Windows/Mac/Ubuntu. Особисто я працював з Mac та Ubuntu 18.04.

Програмне забезпечення

Завантажте останню версію Node.js з офіційного сайту.

Також потрібна остання версія Google Chrome.

Розбираємось з коптером

Спробуймо зрозуміти, як працює Parrot ARDrone. Цей коптер має чотири мотори.

Програмуємо голосове керування коптером з використанням Node.js та ARDrone

Протистоять двигуни працюють в одному напрямку. Одна пара обертається за годинниковою стрілкою, інша проти. Переміщається дрон за рахунок зміни кута нахилу щодо поверхні землі, зміни швидкості обертання моторів та ще кількох маневрених рухів.

Програмуємо голосове керування коптером з використанням Node.js та ARDrone

Як бачимо на діаграмі вище, зміна різних параметрів призводить до зміни напряму руху коптера. Наприклад, зменшення або збільшення швидкості обертання лівого та правого роторів створюють крен. Це дозволяє дрону летіти вперед чи назад.

Змінюючи швидкість і напрям руху моторів, ми задаємо кути нахилу, що дозволяють коптеру здійснювати рух в інших напрямках. Власне, для поточного проекту аеродинаміку вивчати не потрібно просто варто зрозуміти основні принципи.

Як працює Parrot ARDrone

Дрон є точку доступу Wi-Fi. Для того, щоб отримувати та відправляти команди коптеру, необхідно до цієї точки підключитися. Є багато різноманітних програм, що дозволяють керувати коптерами. Виглядає все це приблизно так:

Програмуємо голосове керування коптером з використанням Node.js та ARDrone

Як тільки дрон підключений, відкриваємо термінал та 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.

Програмуємо голосове керування коптером з використанням Node.js та ARDrone

Пробуємо керувати дроном і радіємо.

Трансляція відео з дрону

У проекті створюємо новий файл і копіюємо туди цей код:

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-код, його розміщуємо усередині папки public.

<!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 для перегляду відео з фронтальної камери.

Програмуємо голосове керування коптером з використанням Node.js та ARDrone

Корисні поради

  • Керуйте цим дроном у приміщенні.
  • Завжди надягайте захисну кришку на дрон перед злетом.
  • Перевірте, заряджен чи акумулятор.
  • Якщо дрон поводиться дивно, утримуйте його знизу і переверніть. Ця дія переведе коптер в аварійний режим і ротори негайно зупиняться.

Готовий код та демонстрація

ДЕМО ВЖИВО

Завантажити

Вийшло!

Написати код і потім спостерігати, як машина починає слухатися, принесе вам задоволення! Зараз ми розібралися у тому, як навчити дрон слухати голосові команди. Насправді можливостей набагато більше: розпізнавання особи користувача, автономні польоти, розпізнавання жестів та багато іншого.

Що ви можете запропонувати для покращення програми?

Skillbox рекомендує:

Джерело: habr.com

Додати коментар або відгук