Биз Node.js жана ARDrone аркылуу коптерди үн менен башкарууну программалайбыз

Биз Node.js жана ARDrone аркылуу коптерди үн менен башкарууну программалайбыз

Бул окуу куралында биз Node.js жана Web speak API аркылуу үн менен башкаруусу бар дрон үчүн программа түзүүнү карайбыз. Copter - 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 аркылуу коптерди үн менен башкарууну программалайбыз

Дрон туташкандан кийин терминалды жана 192.168.1.1 телнетти ачыңыз - бул коптердин IP. Linux үчүн сиз колдоно аласыз Linux Busybox.

Колдонмо архитектурасы

Биздин код төмөнкү модулдарга бөлүнөт:

  • үн аныктоо үчүн сөз API менен колдонуучу интерфейси;
  • буйруктарды чыпкалоо жана стандарт менен салыштыруу;
  • дронго буйруктарды жөнөтүү;
  • түз видео берүү.

API Интернет байланышы бар эле иштейт. Муну камсыз кылуу үчүн биз Ethernet байланышын кошобуз.

Колдонмону түзүүгө убакыт келди!

Code

Биринчиден, келгиле, жаңы папканы түзүп, терминал аркылуу ага которулалы.

Андан кийин биз төмөндөгү буйруктарды колдонуп 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 ачыңыз жана "Тааныууну баштоо" баскычын басыңыз.

Биз 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 аркылуу коптерди үн менен башкарууну программалайбыз

Пайдалуу кеңештер

  • Бул дронду үйдө учуңуз.
  • Учаардан мурун ар дайым дронуңузга коргоочу капкакты кийиңиз.
  • Батарея заряддалганын текшериңиз.
  • Эгер дрон кызыктай болсо, аны басып туруп, оодарыңыз. Бул аракет коптерди авариялык режимге коет жана роторлор дароо токтойт.

Даяр код жана демо

LIVE DEMO

DOWNLOAD

Болду!

Кодду жазып, анан машинанын баш ийип баштаганын көрүү сизге ырахат тартуулайт! Эми биз дронду үн буйруктарын угууга кантип үйрөтүүнү чечтик. Чынында, дагы көп мүмкүнчүлүктөр бар: колдонуучунун жүзүн таануу, автономдуу учуу, жаңсоо таануу жана башкалар.

Программаны жакшыртуу үчүн эмне сунуштай аласыз?

Skillbox сунуштайт:

Source: www.habr.com

Комментарий кошуу