Ние програмираме гласовна контрола на коптерот користејќи Node.js и ARDrone

Ние програмираме гласовна контрола на коптерот користејќи Node.js и ARDrone

Во ова упатство ќе погледнеме како креираме програма за беспилотно летало со гласовна контрола со помош на Node.js и Web говор API. Copter - Parrot ARDrone 2.0.

Потсетуваме: за сите читатели на „Хабр“ - попуст од 10 рубли при запишување на кој било курс Skillbox користејќи го промотивниот код „Хабр“.

Skillbox препорачува: Практичен курс „Програма за мобилни програмери“.

Вовед

Дроновите се неверојатни. Навистина уживам да си играм со мојот кварт, да фотографирам и видеа или едноставно да се забавувам. Но, беспилотните летала (UAVs) се користат за повеќе од само забава. Тие работат во кино, ги проучуваат глечерите и ги користат војската и претставниците на земјоделскиот сектор.

Во овој туторијал ќе погледнеме како креираме програма која ќе ви овозможи да контролирате дрон. користејќи гласовни команди. Да, коптерот ќе го направи тоа што ќе му кажете да го направи. На крајот од статијата има готова програма и видео за контрола на UAV.

Железо

Ни треба следново:

  • Папагал ARDrone 2.0;
  • Етернет кабел;
  • добар микрофон.

Развојот и управувањето ќе се вршат на работни станици со Windows/Mac/Ubuntu. Лично, работев со Mac и Ubuntu 18.04.

Софтвер

Преземете ја најновата верзија на Node.js од официјална страница.

Исто така потребно најновата верзија на Google Chrome.

Разбирање на хеликоптерот

Ајде да се обидеме да разбереме како функционира Parrot ARDrone. Овој хеликоптер има четири мотори.

Ние програмираме гласовна контрола на коптерот користејќи Node.js и ARDrone

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

Ние програмираме гласовна контрола на коптерот користејќи Node.js и ARDrone

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

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

Како функционира Parrot ARDrone

Дронот е Wi-Fi hotspot. За да примате и испраќате команди до коптерот, треба да се поврзете на оваа точка. Постојат многу различни апликации кои ви дозволуваат да контролирате квадкоптери. Сето тоа изгледа вака:

Ние програмираме гласовна контрола на коптерот користејќи Node.js и ARDrone

Штом дронот ќе се поврзе, отворете го терминалот и телнетот 192.168.1.1 - ова е IP-а на коптерот. За Linux можете да користите Linux Busybox.

Архитектура на апликацијата

Нашиот код ќе биде поделен на следните модули:

  • кориснички интерфејс со говорен 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" 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 и кабелот за етернет е поврзан со компјутерот).

Отворете 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-кодот, го ставаме во јавната папка.

<!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 препорачува:

Извор: www.habr.com

Додадете коментар