Programiramo glasovnu kontrolu helikoptera koristeći Node.js i ARDrone

Programiramo glasovnu kontrolu helikoptera koristeći Node.js i ARDrone

U ovom vodiču ćemo pogledati kreiranje programa za dron sa glasovnom kontrolom koristeći Node.js i Web govorni API. Copter - Parrot ARDrone 2.0.

Podsećamo: za sve čitaoce "Habra" - popust od 10 rubalja pri upisu na bilo koji Skillbox kurs koristeći "Habr" promotivni kod.

Skillbox preporučuje: Praktični kurs "Mobile Developer PRO".

Uvod

Dronovi su neverovatni. Zaista uživam u igranju sa svojim quadom, snimanju fotografija i videa ili jednostavno zabavljanju. No, bespilotne letjelice (UAV) se koriste za više od zabave. Rade u bioskopu, proučavaju glečere, a koriste ih vojska i predstavnici poljoprivrednog sektora.

U ovom vodiču ćemo se osvrnuti na kreiranje programa koji će vam omogućiti da upravljate dronom. koristeći glasovne komande. Da, helikopter će uraditi ono što mu kažete. Na kraju članka nalazi se gotov program i video kontrole UAV.

Gvožđe

trebamo sljedeće:

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

Razvoj i upravljanje će se vršiti na radnim stanicama sa Windows/Mac/Ubuntu. Lično sam radio sa Mac i Ubuntu 18.04.

Softver

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

Također potrebno najnovija verzija Google Chromea.

Razumijevanje helikoptera

Pokušajmo razumjeti kako Parrot ARDrone funkcionira. Ovaj helikopter ima četiri motora.

Programiramo glasovnu kontrolu helikoptera koristeći Node.js i ARDrone

Suprotstavljeni motori rade u istom smjeru. Jedan par se rotira u smjeru kazaljke na satu, drugi u suprotnom smjeru. Dron se kreće promjenom ugla nagiba u odnosu na površinu zemlje, promjenom brzine rotacije motora i nekoliko drugih pokreta koji se mogu manevrirati.

Programiramo glasovnu kontrolu helikoptera koristeći Node.js i ARDrone

Kao što možemo vidjeti na dijagramu iznad, promjena različitih parametara dovodi do promjene smjera kretanja helikoptera. Na primjer, smanjenje ili povećanje brzine rotacije lijevog i desnog rotora stvara kotrljanje. Ovo omogućava dronu da leti naprijed ili nazad.

Promjenom brzine i smjera motora postavljamo uglove nagiba koji omogućavaju helikopteru da se kreće u drugim smjerovima. Zapravo, za trenutni projekat nema potrebe za proučavanjem aerodinamike, samo trebate razumjeti osnovne principe.

Kako Parrot ARDrone radi

Dron je Wi-Fi hotspot. Da biste primali i slali komande helikopteru, potrebno je da se povežete na ovu tačku. Postoji mnogo različitih aplikacija koje vam omogućavaju da upravljate kvadrokopterima. Sve to izgleda otprilike ovako:

Programiramo glasovnu kontrolu helikoptera koristeći Node.js i ARDrone

Čim se dron poveže, otvorite terminal i telnet 192.168.1.1 - ovo je IP helikoptera. Za Linux možete koristiti Linux Busybox.

Arhitektura aplikacije

Naš kod će biti podijeljen u sljedeće module:

  • korisnički interfejs sa govornim API-jem za detekciju glasa;
  • filtriranje komandi i poređenje sa standardom;
  • slanje komandi dronu;
  • video prenos uživo.

API radi sve dok postoji internetska veza. Da bismo to osigurali, dodajemo Ethernet vezu.

Vrijeme je da kreirate aplikaciju!

Kod

Prvo, napravimo novi folder i prebacimo se na njega pomoću terminala.

Zatim kreiramo Node projekat koristeći naredbe ispod.

Prvo, instaliramo potrebne zavisnosti.

npm install 

Podržaćemo sledeće komande:

  • poletanje;
  • slijetanje;
  • gore - dron se podiže pola metra i lebdi;
  • dolje - pada pola metra i smrzava se;
  • lijevo - ide pola metra lijevo;
  • desno - ide pola metra udesno;
  • rotacija - rotira se u smjeru kazaljke na satu za 90 stepeni;
  • naprijed - ide naprijed pola metra;
  • nazad - vraća se pola metra unazad;
  • stani.

Evo koda koji vam omogućava da prihvatite komande, filtrirate ih i kontrolišete dron.

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

A evo HTML i JavaScript koda koji sluša korisnika i šalje naredbu Node serveru.

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

I takođe JavaScript kod za rad sa glasovnim komandama, šaljući ih 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'
 });
};

Pokretanje aplikacije

Program se može pokrenuti na sljedeći način (važno je osigurati da je helikopter povezan na Wi-Fi i da li je Ethernet kabel povezan s računalom).

Otvorite localhost:3000 u pretraživaču i kliknite na Start Recognition.

Programiramo glasovnu kontrolu helikoptera koristeći Node.js i ARDrone

Trudimo se da kontrolišemo dron i zadovoljni smo.

Emitovanje videa sa drona

U projektu kreirajte novu datoteku i tamo kopirajte ovaj 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);

A evo i HTML koda, stavljamo ga u javni folder.

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

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

Programiramo glasovnu kontrolu helikoptera koristeći Node.js i ARDrone

Korisni saveti

  • Letite ovim dronom u zatvorenom prostoru.
  • Uvijek stavite zaštitni poklopac na svoj dron prije polijetanja.
  • Provjerite je li baterija napunjena.
  • Ako se dron ponaša čudno, držite ga pritisnutim i prevrnite. Ova akcija će prebaciti helikopter u hitni režim i rotori će se odmah zaustaviti.

Spreman kod i demo

LIVE DEMO

SKINUTI

Desilo se!

Pisanje koda, a zatim gledanje kako mašina počinje da sluša, pružit će vam zadovoljstvo! Sada smo shvatili kako da naučimo dron da sluša glasovne komande. Zapravo, postoji mnogo više mogućnosti: prepoznavanje lica korisnika, autonomni letovi, prepoznavanje gestova i još mnogo toga.

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

Skillbox preporučuje:

izvor: www.habr.com

Dodajte komentar