Programmeerime kopteri hääljuhtimise Node.js ja ARDrone abil

Programmeerime kopteri hääljuhtimise Node.js ja ARDrone abil

Selles õpetuses vaatleme hääljuhtimisega drooni programmi loomist Node.js'i ja veebikõne API abil. Kopter – papagoi ARDrone 2.0.

Tuletame meelde: kõigile "Habr" lugejatele - allahindlus 10 000 rubla, kui registreerute mis tahes Skillboxi kursusele, kasutades sooduskoodi "Habr".

Skillbox soovitab: Praktiline kursus "Mobile Developer PRO".

Sissejuhatus

Droonid on hämmastavad. Mulle meeldib väga oma nelikuga mängimine, fotode ja videote tegemine või lihtsalt lõbutsemine. Kuid mehitamata õhusõidukeid (UAV) kasutatakse enamaks kui lihtsalt meelelahutuseks. Nad töötavad kinos, uurivad liustikke ning neid kasutavad sõjaväelased ja põllumajandussektori esindajad.

Selles õpetuses vaatleme programmi loomist, mis võimaldab teil drooni juhtida. kasutades häälkäsklusi. Jah, kopter teeb seda, mida te kästate. Artikli lõpus on UAV juhtimise valmis programm ja video.

Raud

Vajame järgmist:

  • Parrot ARDrone 2.0;
  • Etherneti kaabel;
  • hea mikrofon.

Arendus ja haldamine toimub Windows/Mac/Ubuntu tööjaamades. Isiklikult töötasin Maci ja Ubuntu 18.04-ga.

Программное обеспечение

Laadige alla Node.js uusim versioon aadressilt ametlik veebileht.

Vajalik ka Google Chrome'i uusim versioon.

Kopteri mõistmine

Proovime mõista, kuidas Parrot ARDrone töötab. Sellel kopteril on neli mootorit.

Programmeerime kopteri hääljuhtimise Node.js ja ARDrone abil

Vastandmootorid töötavad samas suunas. Üks paar pöörleb päripäeva, teine ​​vastupäeva. Droon liigub muutes kaldenurka maapinna suhtes, muutes mootorite pöörlemiskiirust ja mitmeid muid manööverdatavaid liigutusi.

Programmeerime kopteri hääljuhtimise Node.js ja ARDrone abil

Nagu ülaltoodud diagrammil näha, toob erinevate parameetrite muutmine kaasa kopteri liikumissuuna muutumise. Näiteks vasaku ja parempoolse rootori pöörlemiskiiruse vähendamine või suurendamine tekitab rulli. See võimaldab droonil lennata edasi või tagasi.

Mootorite kiirust ja suunda muutes seame kaldenurgad, mis võimaldavad kopteril teistes suundades liikuda. Tegelikult pole praeguse projekti jaoks vaja aerodünaamikat uurida, peate lihtsalt mõistma põhiprintsiipe.

Kuidas Parrot ARDrone töötab

Droon on Wi-Fi leviala. Kopterile käskude vastuvõtmiseks ja saatmiseks peate selle punktiga ühenduse looma. On palju erinevaid rakendusi, mis võimaldavad teil kvadrokoptereid juhtida. See kõik näeb välja umbes selline:

Programmeerime kopteri hääljuhtimise Node.js ja ARDrone abil

Niipea kui droon on ühendatud, avage terminal ja telnet 192.168.1.1 – see on kopteri IP. Linuxi jaoks saate kasutada Linux Busybox.

Rakenduse arhitektuur

Meie kood jaguneb järgmisteks mooduliteks:

  • kasutajaliides kõne API-ga hääle tuvastamiseks;
  • käskude filtreerimine ja võrdlemine standardiga;
  • käskude saatmine droonile;
  • video otseülekanne.

API töötab seni, kuni on olemas Interneti-ühendus. Selle tagamiseks lisame Etherneti ühenduse.

On aeg luua rakendus!

Kood

Kõigepealt loome uue kausta ja lülitume sellele terminali abil.

Seejärel loome allolevate käskude abil Node projekti.

Esiteks installime vajalikud sõltuvused.

npm installi 

Toetame järgmisi käske:

  • õhkutõus;
  • maandumine;
  • üles - droon tõuseb pool meetrit ja hõljub;
  • alla - kukub pool meetrit ja külmub;
  • vasakule - läheb pool meetrit vasakule;
  • paremale - läheb pool meetrit paremale;
  • pöörlemine - pöörleb päripäeva 90 kraadi;
  • edasi - läheb pool meetrit edasi;
  • tagasi - läheb pool meetrit tagasi;
  • Lõpeta.

Siin on kood, mis võimaldab teil käske vastu võtta, 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 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);

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

Ja ka JavaScripti kood häälkäsklustega töötamiseks, saates need Node serverisse.

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

Rakenduse käivitamine

Programmi saab käivitada järgmiselt (oluline on veenduda, et kopter on ühendatud Wi-Fi-ga ja Etherneti kaabel on ühendatud arvutiga).

Avage brauseris localhost:3000 ja klõpsake nuppu Start Recognition.

Programmeerime kopteri hääljuhtimise Node.js ja ARDrone abil

Üritame drooni juhtida ja oleme rahul.

Video edastamine droonilt

Looge projektis uus fail ja kopeerige see kood sinna:

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

Ja siin on HTML-kood, asetame selle avalikku kausta.

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

Esikaamerast video vaatamiseks käivitage ja ühendage see localhost:8080.

Programmeerime kopteri hääljuhtimise Node.js ja ARDrone abil

Kasulikku

  • Lennake selle drooniga siseruumides.
  • Enne õhkutõusmist pange droonile alati kaitsekate.
  • Kontrollige, kas aku on laetud.
  • Kui droon käitub imelikult, hoidke seda all ja pöörake ümber. See toiming lülitab kopteri avariirežiimi ja rootorid seiskuvad kohe.

Valmis kood ja demo

LIVE DEMO

DOWNLOAD

Juhtus!

Koodi kirjutamine ja seejärel masina kuuletuma vaatamine pakub teile naudingut! Nüüd oleme välja mõelnud, kuidas õpetada drooni häälkäsklusi kuulama. Tegelikult on võimalusi palju rohkem: kasutaja näotuvastus, autonoomsed lennud, žestituvastus ja palju muud.

Mida saate programmi täiustamiseks soovitada?

Skillbox soovitab:

Allikas: www.habr.com

Lisa kommentaar