Programiramo glasovno upravljanje dronom koristeći Node.js i ARDrone

Programiramo glasovno upravljanje dronom koristeći Node.js i ARDrone

U ovom vodiču razmotrit ćemo stvaranje programa za dron s glasovnim upravljanjem na Node.js i Web Speech API-ju. Dron je Parrot ARDrone 2.0.

Podsjećamo: za sve čitatelje "Habra" — popust od 10 000 rubalja prilikom upisa na bilo koji tečaj Skillbox uz promo kod "Habr".

Skillbox preporučuje: Praktični tečaj «Mobilni programer PRO».

Uvod

Dronovi su fascinantni. Jako volim upravljati svojim dronom, snimajući fotografije i videozapise ili se jednostavno zabavljajući. No, bespilotne letjelice (BPL) ne koriste se samo za zabavu. Koriste se u kinematografiji, istražuju ledenjake, a koriste ih vojska i poljoprivrednici.

U ovom vodiču razmotrit ćemo stvaranje programa koji će omogućiti upravljanje dronom koristeći glasovne komande. Da, dron će raditi ono što mu kažete. Na kraju članka — gotov program i video o upravljanju BPL-om.

Hardver

Trebamo sljedeće:

  • Parrot ARDrone 2.0;
  • Ethernet kabel;
  • dobar mikrofon.

Razvoj i upravljanje bit će na radnim stanicama s Windows/Mac/Ubuntu. Osobno sam radio s Mac-om i Ubuntu 18.04.

Softver

Preuzmite najnoviju verziju Node.js sa službene stranice.

Također je potrebna najnovija verzija Google Chrome-a.

Upoznajmo se s dronom

Pogledajmo kako radi Parrot ARDrone. Ovaj dron ima četiri motora.

Programiramo glasovno upravljanje dronom koristeći Node.js i ARDrone

Suprotstavljeni motori rade u istom smjeru. Jedan par se okreće u smjeru kazaljke na satu, a drugi — u suprotnom. Dron se pomiče promjenom kuta nagiba u odnosu na tlo, promjenom brzine okretanja motora i nekoliko drugih manevra.

Programiramo glasovno upravljanje dronom koristeći Node.js i ARDrone

Kao što vidimo iz gornjeg dijagrama, promjena različitih parametara dovodi do promjene smjera kretanja drona. Na primjer, smanjenje ili povećanje brzine okretanja lijevih i desnih rotora stvara nagib. To omogućuje dronu da leti naprijed ili nazad.

Promjenom brzine i smjera kretanja motora definiramo kutove nagiba koji omogućuju dronu kretanje u drugim smjerovima. U osnovi, za trenutni projekt nije potrebno proučavati aerodinamiku, samo je važno razumjeti osnovne principe.

Kako radi Parrot ARDrone

Dron predstavlja Wi-Fi pristupnu točku. Da bismo slali i primali komande dronu, potrebno je povezati se s tom točkom. Postoji mnogo raznih aplikacija koje omogućuju upravljanje dronovima. Sve to izgleda otprilike ovako:

Programiramo glasovno upravljanje dronom koristeći Node.js i ARDrone

Kada je dron povezan, otvaramo terminal i upisujemo telnet 192.168.1.1 — to je IP adresa drona. Za Linux možemo koristiti Linux Busybox.

Arhitektura aplikacije

Naš kod bit će podijeljen na sljedeće module:

  • korisničko sučelje s govornim API-jem za otkrivanje glasa;
  • filtriranje naredbi i uspoređivanje s referencom;
  • slanje naredbi dronu;
  • izravno prijenos video sadržaja.

API radi pod uvjetom da postoji internetska veza. kako bismo je osigurali, dodajemo Ethernet povezivanje.

Vrijeme je za stvaranje aplikacije!

Kodiramo

Za početak, stvorit ćemo novu mapu i prebaciti se na nju pomoću terminala.

Zatim stvorimo Node projekt koristeći upute navedene u nastavku.

Za početak instaliramo potrebne ovisnosti.

npm install 

Podržavat ćemo sljedeće naredbe:

  • uzlet;
  • slijetanje;
  • gore — dron se podiže za pola metra i lebdi;
  • dolje — spušta se za pola metra i lebdi;
  • lijevo — kreće lijevo za pola metra;
  • desno — kreće desno za pola metra;
  • okret — okreće se u smjeru kazaljke na satu za 90 stupnjeva;
  • naprijed — kreće naprijed za pola metra;
  • natrag — kreće unatrag za pola metra;
  • stop.

Evo koda koji omogućuje prihvaćanje naredbi, njihovo filtriranje i kontrolu drona.

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

Evo HTML i JavaScript koda koji sluša korisnika i šalje naredbu na Node server.

<!DOCTYPE html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Aplikacija za bilješke kontrolirana glasom</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>Dron kontroliran glasom</h1>
            <p class="page-description">Mala aplikacija koja vam omogućuje kontrolu AR drona koristeći glas</p>
 
            <h3 class="no-browser-support">Žao nam je, vaš preglednik ne podržava Web Speech API. Pokušajte otvoriti ovu demonstraciju u Google Chromeu.</h3>
 
            <div class="app">
                <h3>Dajte naredbu</h3>
                <div class="input-single">
                    <textarea id="note-textarea" placeholder="Izradite novu bilješku tako da otkucate ili koristite glasovno prepoznavanje." rows="6"></textarea>
                </div>    
                <button id="start-record-btn" title="Započni snimanje">Započni prepoznavanje</button>
                <button id="pause-record-btn" title="Pauziraj snimanje">Pauziraj prepoznavanje</button>
                <p id="recording-instructions">Pritisnite <strong>Započni prepoznavanje</strong> gumb i dozvolite pristup.</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>

I još JavaScript koda za upravljanje glasovnim naredbama, slanjem na Node server.

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

Pokrenite aplikaciju

Program možete pokrenuti na sljedeći način (važna je provjera da li je dron povezan na Wi-Fi i da je Ethernet kabel priključen na računalo).

Otvorite localhost:3000 u pregledniku i kliknite Start Recognition.

Programiramo glasovno upravljanje dronom koristeći Node.js i ARDrone

Pokušajte upravljati dronom i uživajte.

Prijenos videa s drona

U projektu kreirajte novu datoteku i kopirajte taj kod:

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

Evo HTML koda, smjestite ga unutar mape public.

<!doctype html>
 <html>
 <head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8">
 <title>Prijenos kao modul</title>
 <script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
 </head>
 <body>
 <h1 id="heading">Video prijenos drona</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>

Pokrenite i povežite se na localhost:8080 za pregled videa s prednje kamere.

Programiramo glasovno upravljanje dronom koristeći Node.js i ARDrone

Korisni savjeti

  • Upravljajte ovim dronom unutar prostora.
  • Uvijek stavite zaštitnu kapicu na dron prije poletanja.
  • Provjerite je li baterija napunjena.
  • Ako se dron ponaša čudno, držite ga s donje strane i preokrenite. Ova akcija će prebaciti dron u hitni režim i rotori će se odmah zaustaviti.

Završni kod i demonstracija

LIVE DEMO

DOWNLOAD

Uspjelo je!

Pisanje koda i gledanje kako dron počinje slušati pružit će vam zadovoljstvo! Sada smo naučili kako naučiti dron da sluša glasovne naredbe. U stvarnosti, mogućnosti su daleko veće: prepoznavanje lica korisnika, autonomni letovi, prepoznavanje gesti i još mnogo toga.

Što možete predložiti za poboljšanje programa?

Skillbox preporučuje:

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster