Node.js va ARDrone yordamida kopterning ovozli boshqaruvini dasturlashtiramiz

Node.js va ARDrone yordamida kopterning ovozli boshqaruvini dasturlashtiramiz

Ushbu qo'llanmada biz Node.js va Web nutq API yordamida ovozli boshqaruvga ega dron uchun dastur yaratishni ko'rib chiqamiz. Kopter - Parrot ARDrone 2.0.

Sizga eslatib o'tamiz: "Habr" ning barcha o'quvchilari uchun - "Habr" promo-kodidan foydalangan holda har qanday Skillbox kursiga yozilishda 10 000 rubl chegirma.

Skillbox tavsiya qiladi: Amaliy kurs "Mobil dasturchi PRO".

kirish

Dronlar ajoyib. Menga quad bilan o'ynash, suratga olish va videoga olish yoki shunchaki zavqlanish juda yoqadi. Ammo uchuvchisiz uchish apparatlari (UAV) nafaqat o'yin-kulgi uchun ishlatiladi. Ular kinoda ishlaydi, muzliklarni o'rganadi va harbiylar va qishloq xo'jaligi sohasi vakillari tomonidan qo'llaniladi.

Ushbu qo'llanmada biz sizga dronni boshqarish imkonini beruvchi dasturni yaratishni ko'rib chiqamiz. ovozli buyruqlar yordamida. Ha, kopter siz buyurgan narsani bajaradi. Maqolaning oxirida UAVni boshqarishning tayyor dasturi va videosi mavjud.

temir

Bizga quyidagilar kerak:

  • Parrot ARDrone 2.0;
  • Ethernet kabeli;
  • yaxshi mikrofon.

Ishlab chiqish va boshqarish Windows/Mac/Ubuntu bilan ishlaydigan ish stantsiyalarida amalga oshiriladi. Shaxsan men Mac va Ubuntu 18.04 bilan ishlaganman.

Dasturiy ta'minot

Node.js ning oxirgi versiyasini yuklab oling rasmiy sayt.

Shuningdek, kerak Google Chrome eng so'nggi versiyasi.

Kopterni tushunish

Keling, Parrot ARDrone qanday ishlashini tushunishga harakat qilaylik. Ushbu kopter to'rtta motorga ega.

Node.js va ARDrone yordamida kopterning ovozli boshqaruvini dasturlashtiramiz

Qarama-qarshi motorlar bir xil yo'nalishda ishlaydi. Bir juftlik soat yo'nalishi bo'yicha, ikkinchisi esa soat sohasi farqli ravishda aylanadi. Dron yer yuzasiga nisbatan moyillik burchagini o'zgartirish, motorlarning aylanish tezligini va boshqa bir nechta manevrli harakatlarni o'zgartirish orqali harakat qiladi.

Node.js va ARDrone yordamida kopterning ovozli boshqaruvini dasturlashtiramiz

Yuqoridagi diagrammada ko'rib turganimizdek, turli parametrlarni o'zgartirish kopterning harakat yo'nalishini o'zgartirishga olib keladi. Misol uchun, chap va o'ng rotorlarning aylanish tezligini kamaytirish yoki oshirish rulon hosil qiladi. Bu dronga oldinga yoki orqaga uchish imkonini beradi.

Dvigatellarning tezligi va yo'nalishini o'zgartirib, biz kopterning boshqa yo'nalishlarda harakatlanishiga imkon beruvchi egilish burchaklarini o'rnatamiz. Aslida, hozirgi loyiha uchun aerodinamikani o'rganishning hojati yo'q, siz faqat asosiy tamoyillarni tushunishingiz kerak.

Parrot ARDrone qanday ishlaydi

Dron Wi-Fi ulanish nuqtasi hisoblanadi. Kopterga buyruqlarni qabul qilish va yuborish uchun siz ushbu nuqtaga ulanishingiz kerak. Kvadrokopterlarni boshqarishga imkon beruvchi juda ko'p turli xil ilovalar mavjud. Hammasi shunday ko'rinadi:

Node.js va ARDrone yordamida kopterning ovozli boshqaruvini dasturlashtiramiz

Dron ulangandan so'ng terminalni oching va telnet 192.168.1.1 - bu kopterning IP-manzili. Linux uchun siz foydalanishingiz mumkin Linux Busybox.

Ilova arxitekturasi

Bizning kodimiz quyidagi modullarga bo'linadi:

  • ovozni aniqlash uchun nutq API bilan foydalanuvchi interfeysi;
  • buyruqlarni filtrlash va standart bilan solishtirish;
  • dronga buyruqlar yuborish;
  • jonli video translyatsiya.

API Internet aloqasi mavjud ekan ishlaydi. Buni ta'minlash uchun biz Ethernet ulanishini qo'shamiz.

Ilova yaratish vaqti keldi!

Kod

Birinchidan, yangi papka yaratamiz va terminal yordamida unga o'tamiz.

Keyin quyidagi buyruqlar yordamida Node loyihasini yaratamiz.

Birinchidan, biz kerakli bog'liqliklarni o'rnatamiz.

npm o'rnatishβ€Š

Biz quyidagi buyruqlarni qo'llab-quvvatlaymiz:

  • yechish; uchib ketish;
  • qo'nish;
  • yuqoriga - uchuvchisiz uchuvchi yarim metrga ko'tariladi va uchadi;
  • pastga - yarim metrga tushadi va muzlaydi;
  • chapga - yarim metr chapga ketadi;
  • o'ngga - yarim metr o'ngga ketadi;
  • aylanish - soat yo'nalishi bo'yicha 90 daraja aylanadi;
  • oldinga - yarim metr oldinga boradi;
  • orqaga - yarim metr orqaga qaytadi;
  • STOP.

Bu yerda buyruqlarni qabul qilish, ularni filtrlash va dronni boshqarish imkonini beruvchi kod.

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

Va bu erda foydalanuvchini tinglaydigan va tugun serveriga buyruq yuboradigan HTML va JavaScript kodi.

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

Shuningdek, ovozli buyruqlar bilan ishlash, ularni tugun serveriga yuborish uchun JavaScript kodi.

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

Ilova ishga tushirilmoqda

Dasturni quyidagicha ishga tushirish mumkin (kopter Wi-Fi tarmog'iga ulanganligiga va Ethernet kabeli kompyuterga ulanganligiga ishonch hosil qilish muhimdir).

Brauzerda localhost:3000-ni oching va "Tanishni boshlash" tugmasini bosing.

Node.js va ARDrone yordamida kopterning ovozli boshqaruvini dasturlashtiramiz

Biz dronni boshqarishga harakat qilamiz va xursandmiz.

Drondan videoni translyatsiya qilish

Loyihada yangi fayl yarating va shu kodni u yerdan nusxalang:

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

Va bu erda HTML kodi, biz uni umumiy papkaga joylashtiramiz.

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

Old kameradan videoni ko'rish uchun localhost:8080-ni ishga tushiring va ulaning.

Node.js va ARDrone yordamida kopterning ovozli boshqaruvini dasturlashtiramiz

Foydali maslahatlar

  • Ushbu dronni bino ichida uching.
  • Uchishdan oldin har doim droningizga himoya qopqog'ini qo'ying.
  • Batareya zaryadlanganligini tekshiring.
  • Agar dron o'zini g'alati tutsa, uni ushlab turing va ag'daring. Ushbu harakat kopterni favqulodda holat rejimiga o'tkazadi va rotorlar darhol to'xtaydi.

Tayyor kod va demo

DEMO jonli

DOWNLOAD

Bo'ldi!

Kodni yozish va keyin mashinaning itoat qila boshlaganini tomosha qilish sizga zavq bag'ishlaydi! Endi biz dronni ovozli buyruqlarni tinglashni qanday o'rgatish kerakligini aniqladik. Aslida, juda ko'p imkoniyatlar mavjud: foydalanuvchining yuzini aniqlash, avtonom parvozlar, imo-ishoralarni aniqlash va boshqalar.

Dasturni yaxshilash uchun nima taklif qila olasiz?

Skillbox tavsiya qiladi:

Manba: www.habr.com

a Izoh qo'shish