Glasovno upravljanje helikopterja programiramo z uporabo Node.js in ARDrone

Glasovno upravljanje helikopterja programiramo z uporabo Node.js in ARDrone

V tej vadnici si bomo ogledali ustvarjanje programa za brezpilotno letalo z glasovnim upravljanjem z uporabo Node.js in spletnega govornega API-ja. Copter - Parrot ARDrone 2.0.

Spomnimo: za vse bralce "Habr" - popust v višini 10 rubljev ob vpisu v kateri koli tečaj Skillbox s promocijsko kodo "Habr".

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

Predstavitev

Droni so neverjetni. Zelo rad se igram s svojim štirikolesnikom, fotografiram in snemam videoposnetke ali se samo zabavam. Toda brezpilotna letala (UAV) se uporabljajo za več kot le zabavo. Delajo v kinu, preučujejo ledenike, uporabljajo jih vojska in predstavniki kmetijskega sektorja.

V tej vadnici si bomo ogledali ustvarjanje programa, ki vam bo omogočil nadzor drona. uporabo glasovnih ukazov. Da, helikopter bo naredil, kar mu boste naročili. Na koncu članka je že pripravljen program in video nadzora UAV.

Železo

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.

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

Prenesite najnovejšo različico Node.js iz uradna spletna stran.

Tudi potrebno najnovejšo različico Google Chroma.

Razumevanje helikopterja

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

Glasovno upravljanje helikopterja programiramo z uporabo Node.js in ARDrone

Nasprotni motorji delujejo v isto smer. En par se vrti v smeri urinega kazalca, drugi v nasprotni smeri urinega kazalca. Dron se premika s spreminjanjem kota naklona glede na površino zemlje, spreminjanjem hitrosti vrtenja motorjev in številnimi drugimi manevrskimi gibi.

Glasovno upravljanje helikopterja programiramo z uporabo Node.js in ARDrone

Kot lahko vidimo na zgornjem diagramu, spreminjanje različnih parametrov povzroči spremembo smeri gibanja helikopterja. Na primer, zmanjševanje ali povečanje hitrosti vrtenja levega in desnega rotorja ustvari zvitek. To omogoča, da dron leti naprej ali nazaj.

S spreminjanjem hitrosti in smeri motorjev nastavimo nagibne kote, ki omogočajo premikanje helikopterja v druge smeri. Pravzaprav za trenutni projekt ni potrebe po študiju aerodinamike, le razumeti morate osnovna načela.

Kako deluje Parrot ARDrone

Dron je dostopna točka Wi-Fi. Če želite sprejemati in pošiljati ukaze helikopterju, se morate povezati s to točko. Obstaja veliko različnih aplikacij, ki omogočajo upravljanje kvadrokopterjev. Vse skupaj izgleda nekako takole:

Glasovno upravljanje helikopterja programiramo z uporabo Node.js in ARDrone

Takoj, ko je dron povezan, odprite terminal in telnet 192.168.1.1 - to je IP helikopterja. Za Linux lahko uporabite Linux Busybox.

Arhitektura aplikacije

Naša koda bo razdeljena na naslednje module:

  • uporabniški vmesnik z govornim API-jem za zaznavanje glasu;
  • filtriranje ukazov in primerjava s standardom;
  • pošiljanje ukazov dronu;
  • video prenos v živo.

API deluje, dokler obstaja internetna povezava. Da bi to zagotovili, dodamo povezavo Ethernet.

Čas je, da ustvarite aplikacijo!

Koda

Najprej ustvarimo novo mapo in preklopimo vanjo s terminalom.

Nato z uporabo spodnjih ukazov ustvarimo projekt Node.

Najprej namestimo zahtevane odvisnosti.

namestite npm 

Podpirali bomo naslednje ukaze:

  • vzlet;
  • pristanek;
  • navzgor - dron se dvigne pol metra in lebdi;
  • navzdol - pade pol metra in zamrzne;
  • v levo - gre pol metra v levo;
  • v desno - gre pol metra v desno;
  • vrtenje - vrti se v smeri urinega kazalca za 90 stopinj;
  • naprej - gre naprej pol metra;
  • nazaj - gre nazaj pol metra;
  • stop.

Tukaj je koda, ki vam omogoča sprejemanje ukazov, njihovo filtriranje in nadzor 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 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);

In tukaj je koda HTML in JavaScript, ki posluša uporabnika in pošlje ukaz strežniku Node.

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

In tudi kodo JavaScript za delo z glasovnimi ukazi, ki jih pošilja strežniku Node.

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

Zaženite aplikacijo

Program lahko zaženete na naslednji način (pomembno je, da se prepričate, da je helikopter povezan z Wi-Fi in da je ethernetni kabel povezan z računalnikom).

V brskalniku odprite localhost:3000 in kliknite Začni prepoznavanje.

Glasovno upravljanje helikopterja programiramo z uporabo Node.js in ARDrone

Poskušamo obvladati dron in smo srečni.

Oddajanje videa iz drona

V projektu ustvarite novo datoteko in tja kopirajte to kodo:

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

In tukaj je koda HTML, postavimo jo v javno mapo.

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

Zaženite in se povežite z lokalnim gostiteljem:8080 za ogled videa s sprednje kamere.

Glasovno upravljanje helikopterja programiramo z uporabo Node.js in ARDrone

Koristni nasveti

  • Letite s tem dronom v zaprtih prostorih.
  • Pred vzletom na dron vedno namestite zaščitno prevleko.
  • Preverite, ali je baterija napolnjena.
  • Če se dron obnaša čudno, ga pridržite in obrnite. To dejanje bo preklopilo helikopter v zasilni način in rotorji se bodo takoj zaustavili.

Pripravljena koda in demo

LIVE DEMO

PRENOS

Zgodilo se!

Pisanje kode in nato opazovanje, kako stroj začne ubogati, vam bo v veselje! Zdaj smo ugotovili, kako dron naučiti poslušati glasovne ukaze. Pravzaprav je možnosti veliko več: prepoznavanje obraza uporabnika, avtonomni leti, prepoznavanje kretenj in še veliko več.

Kaj lahko predlagate za izboljšanje programa?

Skillbox priporoča:

Vir: www.habr.com

Dodaj komentar