Ohjelmoimme kopterin ääniohjauksen Node.js:n ja ARDronen avulla

Ohjelmoimme kopterin ääniohjauksen Node.js:n ja ARDronen avulla

Tässä opetusohjelmassa tarkastellaan ohjelman luomista dronille ääniohjauksella Node.js:n ja Web puheen API:n avulla. Kopteri - Parrot ARDrone 2.0.

Muistutamme sinua: kaikille "Habrin" lukijoille - 10 000 ruplan alennus ilmoittautuessaan mille tahansa Skillbox-kurssille "Habr" -tarjouskoodilla.

Skillbox suosittelee: Käytännön kurssi "Mobile Developer PRO".

Esittely

Dronit ovat upeita. Nautin todella mönkijäni kanssa leikkimisestä, valokuvien ja videoiden ottamisesta tai vain hauskanpidosta. Mutta miehittämättömiä ilma-aluksia (UAV) käytetään muuhunkin kuin vain viihteeseen. He työskentelevät elokuvissa, tutkivat jäätiköitä, ja niitä käyttävät armeija ja maataloussektorin edustajat.

Tässä opetusohjelmassa tarkastellaan ohjelman luomista, jonka avulla voit ohjata dronea. käyttämällä äänikomentoja. Kyllä, kopteri tekee mitä käsket sen tehdä. Artikkelin lopussa on valmis ohjelma ja video UAV-ohjauksesta.

rauta

Tarvitsemme seuraavat:

  • Parrot ARDrone 2.0;
  • Ethernet kaapeli;
  • hyvä mikrofoni.

Kehitys ja hallinta toteutetaan työasemilla, joissa on Windows/Mac/Ubuntu. Henkilökohtaisesti työskentelin Macin ja Ubuntu 18.04:n kanssa.

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

Lataa Node.js:n uusin versio osoitteesta virallinen sivusto.

Tarvitaan myös Google Chromen uusin versio.

Kopterin ymmärtäminen

Yritetään ymmärtää, kuinka Parrot ARDrone toimii. Tässä kopterissa on neljä moottoria.

Ohjelmoimme kopterin ääniohjauksen Node.js:n ja ARDronen avulla

Vastakkaiset moottorit toimivat samaan suuntaan. Yksi pari pyörii myötäpäivään, toinen vastapäivään. Drone liikkuu muuttamalla kaltevuuskulmaa suhteessa maan pintaan, muuttamalla moottoreiden pyörimisnopeutta ja useita muita ohjattavia liikkeitä.

Ohjelmoimme kopterin ääniohjauksen Node.js:n ja ARDronen avulla

Kuten yllä olevasta kaaviosta näemme, erilaisten parametrien muuttaminen johtaa muutokseen kopterin liikesuunnassa. Esimerkiksi vasemman ja oikean roottorin pyörimisnopeuden vähentäminen tai lisääminen luo rullauksen. Näin drone voi lentää eteen- tai taaksepäin.

Muuttamalla moottoreiden nopeutta ja suuntaa asetamme kallistuskulmat, jotka mahdollistavat kopterin liikkumisen muihin suuntiin. Itse asiassa nykyisessä projektissa ei tarvitse opiskella aerodynamiikkaa, sinun on vain ymmärrettävä perusperiaatteet.

Kuinka Parrot ARDrone toimii

Drone on Wi-Fi-hotspot. Jotta voit vastaanottaa ja lähettää komentoja kopteriin, sinun on muodostettava yhteys tähän pisteeseen. On olemassa monia erilaisia ​​sovelluksia, joiden avulla voit ohjata nelikoptereita. Kaikki näyttää jotakuinkin tältä:

Ohjelmoimme kopterin ääniohjauksen Node.js:n ja ARDronen avulla

Heti kun drone on kytketty, avaa pääte ja telnet 192.168.1.1 - tämä on kopterin IP. Linuxille voit käyttää Linux Busybox.

Sovellusarkkitehtuuri

Koodimme jaetaan seuraaviin moduuleihin:

  • käyttöliittymä puhe API:lla äänentunnistusta varten;
  • suodatuskomennot ja vertailu standardiin;
  • komentojen lähettäminen dronille;
  • suora videolähetys.

API toimii niin kauan kuin on Internet-yhteys. Tämän varmistamiseksi lisäämme Ethernet-yhteyden.

On aika luoda sovellus!

Koodi

Luodaan ensin uusi kansio ja siirrytään siihen terminaalilla.

Sitten luomme solmuprojektin käyttämällä alla olevia komentoja.

Ensin asennamme tarvittavat riippuvuudet.

npm asentaa 

Tuemme seuraavia komentoja:

  • ottaa pois;
  • lasku;
  • ylös - drone nousee puoli metriä ja leijuu;
  • alas - putoaa puoli metriä ja jäätyy;
  • vasemmalle - menee puoli metriä vasemmalle;
  • oikealle - menee puoli metriä oikealle;
  • kierto - pyörii myötäpäivään 90 astetta;
  • eteenpäin - menee eteenpäin puoli metriä;
  • takaisin - menee takaisin puoli metriä;
  • Lopettaa.

Tässä on koodi, jonka avulla voit hyväksyä komentoja, suodattaa niitä ja ohjata dronea.

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 tässä on HTML- ja JavaScript-koodi, joka kuuntelee käyttäjää ja lähettää komennon solmupalvelimelle.

<!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 myös JavaScript-koodi, joka toimii puhekomentojen kanssa ja lähettää ne Node-palvelimelle.

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

Käynnistä sovellus

Ohjelma voidaan käynnistää seuraavasti (on tärkeää varmistaa, että kopteri on kytketty Wi-Fi-verkkoon ja Ethernet-kaapeli on kytketty tietokoneeseen).

Avaa localhost:3000 selaimessa ja napsauta Aloita tunnistus.

Ohjelmoimme kopterin ääniohjauksen Node.js:n ja ARDronen avulla

Yritämme hallita dronea ja olemme onnellisia.

Videon lähettäminen dronista

Luo projektissa uusi tiedosto ja kopioi tämä koodi sinne:

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 tässä on HTML-koodi, asetamme sen julkiseen kansioon.

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

Käynnistä ja muodosta yhteys localhost:8080:een nähdäksesi videon etukamerasta.

Ohjelmoimme kopterin ääniohjauksen Node.js:n ja ARDronen avulla

Hyödyllisiä vinkkejä

  • Lennätä tämä drone sisätiloissa.
  • Laita aina suojakuori droonillesi ennen lentoonlähtöä.
  • Tarkista, onko akku ladattu.
  • Jos drone käyttäytyy oudosti, pidä sitä alhaalla ja käännä se ympäri. Tämä toiminto asettaa kopterin hätätilaan ja roottorit pysähtyvät välittömästi.

Valmis koodi ja demo

LIVE DEMO

LATAA

Tapahtui!

Koodin kirjoittaminen ja sen jälkeen koneen tottelemisen katsominen tuottaa sinulle iloa! Nyt olemme keksineet, kuinka drone opetetaan kuuntelemaan äänikomentoja. Itse asiassa mahdollisuuksia on paljon enemmän: käyttäjän kasvojentunnistus, autonomiset lennot, eleiden tunnistus ja paljon muuta.

Mitä voit ehdottaa ohjelman parantamiseksi?

Skillbox suosittelee:

Lähde: will.com

Lisää kommentti