HÀÀljuhtimise programmeerimine droonil Node.js ja ARDroneiga

HÀÀljuhtimise programmeerimine droonil Node.js ja ARDroneiga

Selles Ôpetuses kÀsitleme hÀÀlejuhtimisega drooni rakenduse loomist Node.js ja Web Speech API abil. Kopter on Parrot ARDrone 2.0.

Tuletame meelde: kĂ”igile «Habr» lugejatele – 10 000 rubla allahindlus igale Skillboxi kursusele, kasutades sooduskoodi «Habr».

Skillbox soovitab: Praktiline kursus «Mobiilne arendaja PRO».

Sissejuhatus

Droonid on hÀmmastavad. Mulle meeldib vÀga mÀngida oma kopteriga, jÀÀdvustades fotosid ja videoid vÔi lihtsalt lÔbutsedes. Kuid droone (BPLA-sid) kasutatakse mitte ainult meelelahutuseks. Need töötavad filmikunstis, uurivad jÀÀkoguseid ning neid kasutavad militaar- ja pÔllumajandussektor.

Selles Ă”petuses kĂ€sitleme programmi loomist, mis vĂ”imaldab drooni juhtida hÀÀlekĂ€skude abil. Jah, kopter teeb seda, mida te talle ĂŒtlete. Artikli lĂ”pus on valmis programm ja video BPLA juhtimisest.

Riistvara

Meil on vaja jÀrgmist:

  • Parrot ARDrone 2.0;
  • Ethernet-kaabel;
  • hea mikrofon.

Arendust ja juhtimist teostatakse Windowsi/Maci/Ubuntu tööjaamades. Isiklikult olen töötanud Maci ja Ubuntu 18.04-ga.

Tarkvara

Laadi alla viimane versioon Node.js-ist ametlikult veebisaidilt.

Samuti on vajalik viimane versioon Google Chromest.

Kopteri mÔistmine

Proovime aru saada, kuidas Parrot ARDrone töötab. Sellel kopteril on neli mootorit.

HÀÀljuhtimise programmeerimine droonil Node.js ja ARDroneiga

Vastassuunalised mootorid töötavad ĂŒhes suunas. Üks paar pöörleb pĂ€ripĂ€eva, teine — vastupĂ€eva. Droon liigub, muutes kallutusnurka maapinna suhtes, muutes mootoreid pöörlemiskiirus ja tehes mitmeid manööverdusi.

HÀÀljuhtimise programmeerimine droonil Node.js ja ARDroneiga

Nagu nĂ€eme ĂŒlaltoodud diagrammil, toovad erinevate parameetrite muutmine kaasa kopteri liikumissuuna muutuse. NĂ€iteks vasaku ja parema rootori pöörlemiskiiruse vĂ€hendamine vĂ”i suurendamine loob kallutuse. See vĂ”imaldab droonil liikuda edasi vĂ”i tagasi.

Muutudes mootori pöörlemiskiirus ja suunda, mÀÀrame kallutuse nurgad, mis vĂ”imaldavad kopteril liikuda teistesse suundadesse. Tegelikult ei ole hetkel aerodĂŒnaamika uurimine vajalik, tuleb lihtsalt mĂ”ista pĂ”hiteooriaid.

Kuidas Parrot ARDrone töötab

Droon on Wi-Fi pÀÀsupunkt. Selleks, et saada ja saata kĂ€ske kopterile, tuleks selle pÀÀsupunktiga ĂŒhendada. On palju erinevaid rakendusi, mis vĂ”imaldavad koptereid juhtida. KĂ”ik see nĂ€eb vĂ€lja umbes nii:

HÀÀljuhtimise programmeerimine droonil Node.js ja ARDroneiga

Kuna droon on ĂŒhendatud, avame terminali ja telnet 192.168.1.1 — see on kopteri IP. Linuxi puhul vĂ”ib kasutada Linux Busybox.

Rakenduse arhitektuur

Meie kood jaguneb jÀrgmiseks mooduliteks:

  • kasutajaliidese hÀÀle tuvastamise API;
  • kĂ€skude filtreerimine ja vĂ”rdlemine standardiga;
  • kĂ€skude edastamine droonile;
  • video otseĂŒlekanne.

API töötab ainult siis, kui on olemas internetiĂŒhendus. Selle tagamiseks lisame EthernetiĂŒhenduse.

On aeg rakendust luua!

Koodime

Alustuseks loome uue kausta ja lĂŒlitumme sinna terminali abil.

SeejÀrel loome Node-projekti, kasutades allpool toodud kÀske.

Esialgu installime vajalikud sÔltuvused.

npm install 

Toetame jÀrgmisi kÀske:

  • tĂ”us;
  • maandumine;
  • ĂŒles — droon tĂ”useb pool meetrit ja peatub;
  • alla — laske pool meetrit alla ja peatage;
  • vasakule — liigub vasakule pool meetrit;
  • paremale — liigub paremale pool meetrit;
  • pööre — pöörab 90 kraadi pĂ€ripĂ€eva;
  • edasi — liigub edasi pool meetrit;
  • tagasi — liigub tagasi pool meetrit;
  • peatus.

Siin on kood, mis vÔimaldab kÀskude vastuvÔtmist, nende filtreerimist ja drooni juhtimist.

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 received ', 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);

Siin on HTML- ja JavaScripti kood, mis kuulab kasutajat ja saadab kÀsu Node-serverile.

<!DOCTYPE html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Hääljuhtimisega märkmete rakendus</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>Hääljuhtimisega droon</h1>
            <p class="page-description">Väike rakendus, mis võimaldab sul juhtida AR drooni häält kasutades</p>
 
            <h3 class="no-browser-support">Kahjuks ei toeta su braUser Web Speech API. Proovi avada see demo Google Chrome'is.</h3>
 
            <div class="app">
                <h3>Anna käsklus</h3>
                <div class="input-single">
                    <textarea id="note-textarea" placeholder="Loo uus märge, kirjutades või kasutades häältuvastust." rows="6"></textarea>
                </div>    
                <button id="start-record-btn" title="Alusta salvestamist">Alusta tuvastamist</button>
                <button id="pause-record-btn" title="Peata salvestamine">Peata tuvastamine</button>
                <p id="recording-instructions">Press the <strong>Alusta tuvastamist</strong> nuppu ja luba juurdepääs.</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>

Ja veel JavaScripti kood, et töötada hÀÀlekÀskudega, saates need Node-serverile.

katsume {
 var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
 var recognition = new SpeechRecognition();
 }
 catch(e) {
 console.error(e);
 $('.no-browser-support').show();
 $('.app').hide();
 }
// muu kood, palun viidake GitHubi allikale
recognition.onresult = function(event) {
// event on SpeechRecognitionEvent objekt.
// See sisaldab kÔiki ridu, mida oleme seni tabanud.
 // Me vajame ainult praegust.
 var current = event.resultIndex;
// Saage transkriptsioon sellest, mis öeldi.
var transcript = event.results[current][0].transcript;
// saata see tagumisse ossa
$.ajax({
 type: 'POST',
 url: '\/command\/',
 data: JSON.stringify({command: transcript}),
 success: function(data) { console.log(data) },
 contentType: "application\/json",
 dataType: 'json'
 });
};

KĂ€ivitame rakenduse

Programmi saab kĂ€ivitada jĂ€rgmiselt (oluline on veenduda, et droon on ĂŒhendatud Wi-Fi ja Ethernet-kaabel on ĂŒhendatud arvutiga).

Avame localhost:3000 brauseris ja klÔpsame Start Recognition.

HÀÀljuhtimise programmeerimine droonil Node.js ja ARDroneiga

Proovime drooni juhtida ja rÔÔmustame.

Droonivideo edastamine

Projektis loome uue faili ja kopeerime sinna selle koodi:

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

Siin on HTML-kood, asetame selle public kausta.

<!doctype html>
 <html>
 <head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8">
 <title>Voog modulina</title>
 <script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
 </head>
 <body>
 <h1 id="heading">Droonivideo voog</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>

KĂ€ivitame ja ĂŒhendame localhost:8080, et vaadata videod esikaamerast.

HÀÀljuhtimise programmeerimine droonil Node.js ja ARDroneiga

Kasulikud nÀpunÀited

  • Juhtige seda drooni siseruumides.
  • Kandke alati droonile kaitsekate enne Ă”hkutĂ”usu.
  • Kontrollige, kas aku on laetud.
  • Kui droon kĂ€itub kummaliselt, hoidke seda altpoolt ja pöörake ĂŒmber. See toiming viib drooni hĂ€daolukorra reĆŸiimi ja rootorid seiskuvad kohe.

Valmis kood ja demo

ELAV DEMO

ALLA LAADIDA

Saime hakkama!

Koodi kirjutamine ja seejĂ€rel jĂ€lgimine, kuidas masin hakkab kuulama, toob teile rÔÔmu! NĂŒĂŒd oleme aru saanud, kuidas Ă”petada drooni kuulama hÀÀlkĂ€sklusi. Tegelikult on vĂ”imalusi palju rohkem: kasutaja nĂ€o tuvastamine, iseseisvad lennud, ĆŸestide tuvastamine ja palju muud.

Mida saate pakkuda programmi parendamiseks?

Skillbox soovitab:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster