Programiranje glasovnega upravljanja dronom z uporabo Node.js in ARDrone

Programiranje glasovnega upravljanja dronom z uporabo Node.js in ARDrone

V temle tutorialu bomo obravnavali ustvarjanje programa za dron z glasovnim upravljanjem na Node.js in Web Speech API. Dron je Parrot ARDrone 2.0.

Opominjamo: za vse bralce »Habra« — popust 10 000 rubljev ob vpisu na kateri koli tečaj Skillbox s promo kodo »Habr«.

Skillbox priporoča: Praktični tečaj Mobilni razvijalec PRO.

Uvod

Droni so osupljivi. Zelo rad igram s svojim dronom, snemam slike in videoposnetke ali se preprosto zabavam. Vendar se brezpilotni letalniki (BPL) ne uporabljajo le za zabavo. Delujejo v kinematografiji, preučujejo ledenike, uporabljajo jih vojska in kmetijski sektor.

V tem tutorialu bomo obravnavali ustvarjanje programa, ki bo omogočal upravljanje drona z glasovnimi ukazi. Da, dron bo delal tisto, kar mu boste povedali. Na koncu članka bo pripravljen program in video o upravljanju BPL.

Strojna oprema

Potrebujemo naslednje:

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

Razvoj in upravljanje bosta potekala na delovnih postajah z Windows/Mac/Ubuntu. Osebno sem delal z Mac in Ubuntu 18.04.

Software

Prenesite najnovejšo različico Node.js z službene stranice.

Potreben je tudi najnovejši Google Chrome.

Raziskujemo dron

Poskusimo razumeti, kako deluje Parrot ARDrone. Ta dron ima štiri motorje.

Programiranje glasovnega upravljanja dronom z uporabo Node.js in ARDrone

Nasprotujoči motorji delujejo v eni smeri. Ena para se vrti v smeri urinega kazalca, druga proti. Dron se premika s spreminjanjem kota nagiba glede na površino tal, z menjavanjem hitrosti vrtenja motorjev in še nekaj manevrskih gibov.

Programiranje glasovnega upravljanja dronom z uporabo Node.js in ARDrone

Kot vidimo na zgornjem diagramu, sprememba različnih parametrov povzroči spremembo smeri gibanja drona. Na primer, zmanjšanje ali povečanje hitrosti vrtenja levega in desnega rotorja povzroča nagib. To omogoča dronu letenje naprej ali nazaj.

S spreminjanjem hitrosti in smeri gibanja motorjev določamo kote nagiba, ki omogočajo dronu gibanje v drugih smereh. Za ta projekt ni potrebno preučevati aerodinamike, pomembno je razumeti osnovna načela.

Kako deluje Parrot ARDrone

Dron predstavlja dostopno točko Wi-Fi. Da bi prejemali in pošiljali ukaze dronu, se je treba povezati s to točko. Na voljo je veliko različnih aplikacij, ki omogočajo upravljanje z droni. Vse to izgleda približno tako:

Programiranje glasovnega upravljanja dronom z uporabo Node.js in ARDrone

Ko je dron povezan, odprite terminal in telnet 192.168.1.1 — to je IP drona. Za Linux lahko uporabite Linux Busybox.

Arhitektura aplikacije

Naša koda bo razdeljena na naslednje module:

  • uporabniški vmesnik z API-jem za prepoznavanje glasu;
  • filtriranje ukazov in usklajevanje z referenco;
  • pošiljanje ukazov dronu;
  • prenos videa v živo.

API deluje ob pogoju, da je na voljo internetna povezava. Zato dodajamo povezavo preko Ethernet.

Čas je, da ustvarimo aplikacijo!

Kodiramo

Na začetku ustvarimo novo mapo in se na njo preklopimo s terminalom.

Nato ustvarimo Node-projekt z uporabo spodaj navedenih ukazov.

Na začetku namestimo potrebne odvisnosti.

npm install 

Podpirali bomo naslednje ukaze:

  • vzlét;
  • sestop;
  • gor — dron se dvigne za pol metra in plava;
  • dol — se spusti za pol metra in plava;
  • levo — se premika levo za pol metra;
  • desno — se premika desno za pol metra;
  • obračanje — se obrne v smeri urinega kazalca za 90 stopinj;
  • naprej — se premika naprej za pol metra;
  • nazaj — se premika nazaj za pol metra;
  • ustavi.

Tukaj je koda, ki omogoča sprejemanje ukazov, njihovo filtriranje in nadzor nad dronom.

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();
// отключение режима экстренной остановки
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('команда получена ', req.body);
    console.log('существующие команды', commands);
    let command = req.body.command.replace(/ /g,'');
    if(commands.indexOf(command) !== -1) {
        switch(command.toUpperCase()) {
            case "TAKEOFF":
                console.log('дрон вылетает');
                drone.takeoff();
            break;
            case "LAND":
                console.log('дрон садится');
                drone.land();
            break;
            case "UP":
                console.log('поднимаем дрон на полметра');
                drone.up(0.2);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "DOWN":
                console.log('опускаем дрон на полметра');
                drone.down(0.2);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOLEFT":
                console.log('двигаем дрон влево на 1 метр');
                drone.left(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },1000);
            break;
            case "GORIGHT":
                console.log('двигаем дрон вправо на 1 метр');
                drone.right(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },1000);
            break;
            case "TURN":
                console.log('воротим дрон');
                drone.clockwise(0.4);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOFORWARD":
                console.log('двигаем дрон вперед на 1 метр');
                drone.front(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOBACKWARD":
                console.log('двигаем дрон назад на 1 метр');
                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);

Вот HTML и JavaScript код, который слушает пользователя и отправляет команду на сервер Node.

<!DOCTYPE html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Aplikacija za opombe z glasovnim upravljanjem</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 s glasovnim upravljanjem</h1>
            <p class="page-description">Majhna aplikacija, ki vam omogoča nadzor AR drona z glasom</p>
 
            <h3 class="no-browser-support">Opravičujem se, vaš brskalnik ne podpira Web Speech API. Poskusite odpreti to demov verzijo v Google Chromu.</h3>
 
            <div class="app">
                <h3>Da dajete ukaze</h3>
                <div class="input-single">
                    <textarea id="note-textarea" placeholder="Ustvarite novo opombo z vnosom ali uporabo glasovnega prepoznavanja." rows="6"></textarea>
                </div>    
                <button id="start-record-btn" title="Začnite snemanje">Začnite prepoznavanje</button>
                <button id="pause-record-btn" title="Pauzirajte snemanje">Pauzirajte prepoznavanje</button>
                <p id="recording-instructions">Pritisnite <strong>Začnite prepoznavanje</strong> gumb in omogočite dostop.</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>

И вот JavaScript код для работы с голосовыми командами, отправляя их на сервер Node.

poskuskite {
 var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
 var recognition = new SpeechRecognition();
 }
 catch(e) {
 console.error(e);
 $('.no-browser-support').show();
 $('.app').hide();
 }
// drug koda, prosimo, glejte vir na GitHubu
recognition.onresult = function(event) {
// dogodek je objekt SpeechRecognitionEvent.
// Vsebuje vse vrstice, ki smo jih doslej zajeli.
 // Potrebujemo le trenutno.
 var current = event.resultIndex;
// Pridobite transkript tega, kar je bilo rečeno.
var transcript = event.results[current][0].transcript;
// pošljite ga na backend
$.ajax({
 type: 'POST',
 url: '\/command\/','
 data: JSON.stringify({command: transcript}),
 success: function(data) { console.log(data) },
 contentType: "application\/json",
 dataType: 'json'
 });
};

Zagnati aplikacijo

Program lahko zaženete na naslednji način (pomembno je, da je dron povezan na Wi-Fi in da je Ethernet kabel povezan s računalnikom).

Odprite localhost:3000 v brskalniku in kliknite Začni prepoznavanje.

Programiranje glasovnega upravljanja dronom z uporabo Node.js in ARDrone

Poskusite upravljati dron in se veselite.

Prenos videa z drona

V projektu ustvarite novo datoteko in vanjo kopirajte ta koda:

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

Tukaj je HTML koda, ki jo namestimo znotraj mape public.

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

Zaženite in povežite se z localhost:8080 za ogled videa iz sprednje kamere.

Programiranje glasovnega upravljanja dronom z uporabo Node.js in ARDrone

Koristni nasveti

  • Upravljajte s tem dronom v zaprtih prostorih.
  • Vedno nosite zaščitni pokrov na dronu pred vzletom.
  • Preverite, ali je baterija napolnjena.
  • Če se dron obnaša nenavadno, ga držite z dnom in ga obrnite. Ta dejanje bo dron preusmerilo v nujni način, in rotatorji se bodo takoj ustavili.

Zgoden koda in demonstracija

ŽIVI DEMO

NALAGANJE

Uspešno!

Pisanje kode in nato opazovanje, kako se stroj začne ubogati, vam bo prineslo veselje! Zdaj smo razumeli, kako naučiti dron, da posluša glasovne ukaze. Pravzaprav je možnosti še več: prepoznavanje obraza uporabnika, avtonomni leti, prepoznavanje gest in še mnogo več.

Kaj lahko predlagate za izboljšanje programa?

Skillbox priporoča:

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster