Програмирамо гласовну контролу хеликоптера користећи Ноде.јс и АРДроне

Програмирамо гласовну контролу хеликоптера користећи Ноде.јс и АРДроне

У овом водичу ћемо погледати креирање програма за дрон са гласовном контролом користећи Ноде.јс и АПИ за веб говор. Цоптер - Паррот АРДроне 2.0.

Подсећамо: за све читаоце „Хабра“ – попуст од 10 рубаља при упису на било који курс Скиллбок користећи промотивни код „Хабр“.

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

Увод

Дронови су невероватни. Заиста уживам да се играм са својим куадом, снимам фотографије и видео записе или се само забављам. Али беспилотне летелице (УАВ) се користе за више од забаве. Они раде у биоскопу, проучавају глечере, а користе их војска и представници пољопривредног сектора.

У овом туторијалу ћемо погледати креирање програма који ће вам омогућити да контролишете дрон. користећи гласовне команде. Да, хеликоптер ће урадити оно што му кажете. На крају чланка налази се готов програм и видео контроле УАВ.

Гвожђе

Треба нам следеће:

  • Паррот АРДроне 2.0;
  • Етернет кабал;
  • добар микрофон.

Развој и управљање ће се вршити на радним станицама са Виндовс/Мац/Убунту. Лично сам радио са Мац и Убунту 18.04.

Софтвер

Преузмите најновију верзију Ноде.јс са званични сајт.

Такође потребно најновија верзија Гоогле Цхроме-а.

Разумевање хеликоптера

Хајде да покушамо да разумемо како Паррот АРДроне функционише. Овај хеликоптер има четири мотора.

Програмирамо гласовну контролу хеликоптера користећи Ноде.јс и АРДроне

Супротстављени мотори раде у истом правцу. Један пар се ротира у смеру казаљке на сату, други у супротном смеру. Беспилотна летелица се креће променом угла нагиба у односу на површину земље, променом брзине ротације мотора и неколико других маневарских покрета.

Програмирамо гласовну контролу хеликоптера користећи Ноде.јс и АРДроне

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

Променом брзине и правца мотора постављамо углове нагиба који омогућавају хеликоптеру да се креће у другим правцима. Заправо, за садашњи пројекат нема потребе да проучавате аеродинамику, само треба да разумете основне принципе.

Како функционише Паррот АРДроне

Дрон је Ви-Фи хотспот. Да бисте примали и слали команде хеликоптеру, потребно је да се повежете на ову тачку. Постоји много различитих апликација које вам омогућавају да контролишете квадрокоптере. Све то изгледа отприлике овако:

Програмирамо гласовну контролу хеликоптера користећи Ноде.јс и АРДроне

Чим се дрон повеже, отворите терминал и телнет 192.168.1.1 - ово је ИП адреса хеликоптера. За Линук можете користити Линук Бусибок.

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

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

  • кориснички интерфејс са говорним АПИ-јем за детекцију гласа;
  • филтрирање команди и поређење са стандардом;
  • слање команди дрону;
  • видео пренос уживо.

АПИ ради све док постоји интернет веза. Да бисмо то осигурали, додајемо Етхернет везу.

Време је да направите апликацију!

Код

Прво, направимо нову фасциклу и пребацимо се на њу помоћу терминала.

Затим креирамо Ноде пројекат користећи команде испод.

Прво, инсталирамо потребне зависности.

нпм инсталл 

Подржаћемо следеће команде:

  • скинути;
  • слетање;
  • горе - дрон се подиже пола метра и лебди;
  • доле - пада пола метра и замрзава се;
  • лево - иде пола метра лево;
  • десно - иде пола метра удесно;
  • ротација - ротира у смеру казаљке на сату за 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);

А ево ХТМЛ и ЈаваСцрипт кода који слуша корисника и шаље команду Ноде серверу.

<!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>

И такође ЈаваСцрипт код за рад са гласовним командама, шаљући их на Ноде сервер.

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'
 });
};

Покретање апликације

Програм се може покренути на следећи начин (важно је да проверите да ли је хеликоптер повезан на Ви-Фи и да ли је Етхернет кабл повезан са рачунаром).

Отворите лоцалхост:3000 у претраживачу и кликните на Старт Рецогнитион.

Програмирамо гласовну контролу хеликоптера користећи Ноде.јс и АРДроне

Трудимо се да контролишемо дрон и срећни смо.

Емитовање видеа са дрона

У пројекту креирајте нову датотеку и тамо копирајте овај код:

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);

А ево ХТМЛ кода, стављамо га у јавну фасциклу.

<!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>

Покрените и повежите се на лоцалхост:8080 да бисте видели видео са предње камере.

Програмирамо гласовну контролу хеликоптера користећи Ноде.јс и АРДроне

Корисни савети

  • Летите овим дроном у затвореном простору.
  • Увек ставите заштитни поклопац на дрон пре полетања.
  • Проверите да ли је батерија напуњена.
  • Ако се дрон понаша чудно, држите га притиснутим и окрените га. Ова акција ће пребацити хеликоптер у хитни режим и ротори ће се одмах зауставити.

Спреман код и демо

УЖИВО ДЕМО

ПРЕУЗИМАЊЕ

Десило!

Писање кода, а затим гледање како машина почиње да се повинује, пружиће вам задовољство! Сада смо схватили како да научимо дрон да слуша гласовне команде. У ствари, постоји много више могућности: препознавање лица корисника, аутономни летови, препознавање гестова и још много тога.

Шта можете да предложите за побољшање програма?

Скиллбок препоручује:

Извор: ввв.хабр.цом

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