Kopteri hÀÀljuhtimise programmeerimine Node.js ja ARDrone abil

Kopteri hÀÀljuhtimise programmeerimine Node.js ja ARDrone abil

Selles Ôpetuses kÀsitleme hÀÀljuhtimise programmide loomist droonile Node.js ja Web Speech API abil. Droon on Parrot ARDrone 2.0.

Tuletame meelde: kĂ”igile «Habra» lugejatele — 10 000 rubla soodustus, kui registreerite end Skillboxi mis tahes kursusele promokoodi «Habr» abil.

Skillbox soovitab: Praktiline kursus «Mobiilne arendaja PRO».

Sissejuhatus

Droonid on hÀmmastavad. Mulle meeldib oma drooniga mÀngida, pildistades ja filmides vÔi lihtsalt lÔbutsedes. Kuid mehitamata ÔhusÔidukeid (UAV) kasutatakse mitte ainult meelelahutuseks. Need töötavad filminduses, uurivad liustikke ning on kasutusel sÔjavÀes ja pÔllumajanduses.

Selles Ă”petuses loome programmi, mis vĂ”imaldab juhtida drooni hÀÀlkĂ€skluste abil. Jah, droon teeb seda, mida te talle ĂŒtlete. Artikli lĂ”pus on valmislahendus ja video drooni juhtimise kohta.

Riistvara

Me vajame jÀrgmist:

  • Parrot ARDrone 2.0;
  • Ethernet-kaabel;
  • head mikrofoni.

Arendamine ja juhtimine toimub Windowsi/Mac/Ubuntu tööjaamadel. Isiklikult töötasin Maci ja Ubuntu 18.04-ga.

Tarkvara

Laadige alla uusim versioon Node.js-ist ametlik veebisait.

Vajalik on ka uusim versioon Google Chromest.

Tutvume drooniga

Proovime mÔista, kuidas Parrot ARDrone töötab. Sellel droonil on neli mootori.

Kopteri hÀÀljuhtimise programmeerimine Node.js ja ARDrone abil

Vastandlikud mootorsĂŒsteemid töötavad ĂŒhes suunas. Üks paar pöörleb kellwise, teine aga vastupĂ€eva. Dron liigutab end maapinna suhtes kallutamise nurga muutmise, mootorite pöörlemiskiirus muutmise ja mitmete manööverduste abil.

Kopteri hÀÀljuhtimise programmeerimine Node.js ja ARDrone abil

Nagu me nĂ€eme ĂŒlaltoodud diagrammil, toob erinevate parameetrite muutmine endaga kaasa kopteri liikumise suuna muutumise. NĂ€iteks vasaku ja parema rootori pöörlemiskiiruse vĂ€hendamine vĂ”i suurendamine loob kallaku. See vĂ”imaldab dronil lennata edasi vĂ”i tagasi.

Mootorite kiirus ja liikuvuse suuna muutmisega mÀÀrame kallutusnurgad, mis vĂ”imaldavad kopteril liikuda teistes suundades. Tegelikult ei pea kĂ€esoleva projekti jaoks aerodĂŒnaamika uurima, piisab, kui mĂ”ista pĂ”hialuseid.

Kuidas Parrot ARDrone töötab

Dron on Wi-Fi pÀÀsupunkt. Et saata ja vastu vĂ”tta kĂ€ske kopterile, on vajalik sellele punktile ĂŒhenduda. On palju erinevaid rakendusi, mis vĂ”imaldavad koptereid juhtida. See kĂ”ik nĂ€eb vĂ€lja umbes nii:

Kopteri hÀÀljuhtimise programmeerimine Node.js ja ARDrone abil

Kui droon on ĂŒhendatud, avage terminal ja kasutage telnet 192.168.1.1 — see on kopteri IP. Linuxi puhul saab kasutada Linux Busybox.

Rakenduse arhitektuur

Meie kood jaguneb jÀrgmisteks mooduliteks:

  • kasutajaliides hÀÀle tuvastamise API-ga;
  • kĂ€skude filtreerimine ja vĂ”rdlemine reference'iga;
  • kĂ€skude saatmine droonile;
  • otseĂŒlekanne videost.

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

Aeg hakata rakendust looma!

Koodime

Alustuseks loome uue kausta ja vahetame sellele terminali kaudu.

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

Esialgu installime vajalikud sÔltuvused.

npm install 

Toetame jÀrgmisi kÀske:

  • tĂ”us;
  • jĂ€relennutus;
  • ĂŒles — droon tĂ”useb poole meetri kĂ”rgusele ja jÀÀb meie juurde;
  • alla — laskub poole meetri vĂ”rra ja jÀÀb meie juurde;
  • vasakule — liigub vasakule poole meetri vĂ”rra;
  • paremale — liigub paremale poole meetri vĂ”rra;
  • pöörde — pöördub kellakeeramise suunas 90 kraadi;
  • ettepoole — liigub ettepoole poole meetri vĂ”rra;
  • tagasi — liigub tagasi poole meetri vĂ”rra;
  • peatamine.

Siin on kood, mis vÔimaldab vastu vÔtta kÀske, neid filtreerida ja drooni juhtida.

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 JavaScript 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äälega</p>
 
            <h3 class="no-browser-support">Kahjuks ei toeta teie brauser Web Speech API-d. Proovige avada see demonstreerimine Google Chrome'is.</h3>
 
            <div class="app">
                <h3>Anna käsk</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">Ava äratundmine</button>
                <button id="pause-record-btn" title="Pausita salvestamine">Pausita äratundmine</button>
                <p id="recording-instructions">Vajuta <strong>Ava äratundmine</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 JavaScript kood, et töötada hÀÀlkÀskudega, saatke need Node-serverile.

try {
 var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
 var recognition = new SpeechRecognition();
 }
 catch(e) {
 console.error(e);
 $('.no-browser-support').show();
 $('.app').hide();
 }
// muu kood, palun vaadake GitHubi allikat
recognition.onresult = function(event) {
// event on SpeechRecognitionEvent objekt.
// See sisaldab kÔiki read, mida oleme seni registreerinud.
 // Me vajame ainult praegust.
 var current = event.resultIndex;
// Saame ĂŒlevaate sellest, mis öeldi.
var transcript = event.results[current][0].transcript;
// saadame selle tagakĂŒljele
$.ajax({
 type: 'POST',
 url: '/command/',
 data: JSON.stringify({command: transcript}),
 success: function(data) { console.log(data) },
 contentType: "application/json",
 dataType: 'json'
 });
};

KĂ€ivitame rakenduse

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

Ava localhost:3000 brauseris ja kliki Start Recognition.

Kopteri hÀÀljuhtimise programmeerimine Node.js ja ARDrone abil

Proovi drooni juhtida ja naudi.

Drooni videovoo 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, paigaldame 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.

Kopteri hÀÀljuhtimise programmeerimine Node.js ja ARDrone abil

Kasulikud nÔuanded

  • Kasutage seda drooni siseruumides.
  • Alati pange drooni kaitsekate enne lendamist.
  • Kontrollige, kas aku on laetud.
  • Kui droon kĂ€itub kummaliselt, hoidke seda alt poolt kinni ja pöörake ĂŒmber. See viib kopteri avariireĆŸiimi ja propellerid peatuvad koheselt.

Valmis kood ja demo

LIVE DEMO

LAADI ALLA

Õnnestus!

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

Mida te saate pakkuda programmi parandamiseks?

Skillbox soovitab:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster