Мо бо истифода аз Node.js ва ARDrone назорати овозии коптерро барномарезӣ мекунем

Мо бо истифода аз Node.js ва ARDrone назорати овозии коптерро барномарезӣ мекунем

Дар ин дарс мо ба сохтани барнома барои бесарнишин бо назорати овоз бо истифода аз Node.js ва Web суханронии API назар хоҳем кард. Коптер - Parrot ARDrone 2.0.

Мо ба шумо хотиррасон мекунем: барои ҳамаи хонандагони "Habr" - тахфифи 10 000 рубл ҳангоми номнавис шудан ба курсҳои Skillbox бо истифода аз рамзи таблиғотии "Habr".

Skillbox тавсия медиҳад: Курси амалӣ "Таҳиягари мобилӣ PRO".

Муқаддима

Дронҳо аҷибанд. Ман воқеан аз бозӣ бо чоргонаи худ, аксбардорӣ ва видео ё танҳо вақтхушӣ лаззат мебарам. Аммо ҳавопаймоҳои бесарнишин (UAV) на танҳо барои фароғат истифода мешаванд. Онхо дар кино кор мекунанд, пирьяххоро меомузанд ва аз онхо харбиён ва намояндагони сохахои хочагии кишлок истифода мебаранд.

Дар ин дарс мо эҷод кардани барномаеро дида мебароем, ки ба шумо имкон медиҳад, ки дронро идора кунед. бо истифода аз фармонҳои овозӣ. Бале, коптер он чизеро, ки шумо ба он мефармоед, иҷро мекунад. Дар охири мақола барномаи омода ва видеои идоракунии UAV мавҷуд аст.

Iron

Мо ба инҳо ниёз дорем:

  • Parrot ARDrone 2.0;
  • кабели Ethernet;
  • микрофони хуб.

Таҳия ва идоракунӣ дар истгоҳҳои корӣ бо Windows/Mac/Ubuntu амалӣ карда мешаванд. Шахсан ман бо Mac ва Ubuntu 18.04 кор кардам.

Software

Версияи охирини 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 эҷод мекунем.

Аввалан, мо вобастагии заруриро насб мекунем.

насб 

Мо фармонҳои зеринро дастгирӣ мекунем:

  • гирифтан;
  • фуруд омадан;
  • боло - ҳавопаймои бесарнишин ним метр баланд мешавад ва парвоз мекунад;
  • поён - ним метр меафтад ва ях мекунад;
  • ба чап - ним метр ба тарафи чап меравад;
  • ба рост — ним метр ба тарафи рост меравад;
  • гардиш - бо ақрабаки соат 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 -ро кушоед ва Оғози шинохтро пахш кунед.

Мо бо истифода аз 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 тавсия медиҳад:

Манбаъ: will.com

Илова Эзоҳ