Біз Node.js және ARDrone көмегімен коптерді дауыспен басқаруды бағдарламалаймыз

Біз Node.js және ARDrone көмегімен коптерді дауыспен басқаруды бағдарламалаймыз

Бұл оқулықта біз Node.js және Web speaking API көмегімен дауыспен басқаруы бар дрон үшін бағдарлама жасауды қарастырамыз. Коптер - Parrot ARDrone 2.0.

Біз еске саламыз: «Хабрдың» барлық оқырмандары үшін - «Habr» жарнамалық кодын пайдаланып кез келген Skillbox курсына жазылу кезінде 10 000 рубль көлемінде жеңілдік.

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 қосылымын қосамыз.

Қолданба жасау уақыты келді!

Код

Алдымен терминал арқылы жаңа қалта жасап, оған ауысайық.

Содан кейін төмендегі пәрмендерді пайдаланып Түйін жобасын жасаймыз.

Біріншіден, біз қажетті тәуелділіктерді орнатамыз.

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 коды.

<!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 коды, оларды түйін серверіне жібереді.

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 көмегімен коптерді дауыспен басқаруды бағдарламалаймыз

Пайдалы кеңестер

  • Бұл дронды үй ішінде ұшыңыз.
  • Ұшу алдында әрқашан дроныңызға қорғаныс қақпағын киіңіз.
  • Батареяның зарядталғанын тексеріңіз.
  • Егер дрон біртүрлі әрекет етсе, оны басып тұрып, аударыңыз. Бұл әрекет коптерді апаттық режимге қояды және роторлар дереу тоқтайды.

Дайын код және демо

Жарнама DEMO

ЖҮКТЕУ

Болды!

Кодты жазу, содан кейін машинаның бағынуын көру сізге рахат әкеледі! Енді біз дронды дауыстық командаларды тыңдауға қалай үйрету керектігін анықтадық. Шын мәнінде, әлдеқайда көп мүмкіндіктер бар: пайдаланушының бет-әлпетін тану, автономды ұшулар, қимылдарды тану және т.б.

Бағдарламаны жақсарту үшін не ұсына аласыз?

Skillbox ұсынады:

Ақпарат көзі: www.habr.com

пікір қалдыру