Programăm controlul vocal al copterului folosind Node.js și ARDrone

Programăm controlul vocal al copterului folosind Node.js și ARDrone

În acest tutorial ne vom uita la crearea unui program pentru o dronă cu control vocal folosind Node.js și API-ul de vorbire web. Copter - Parrot ARDrone 2.0.

Amintim: pentru toți cititorii „Habr” - o reducere de 10 de ruble la înscrierea la orice curs Skillbox folosind codul promoțional „Habr”.

Skillbox recomandă: Curs practic „Dezvoltator mobil PRO”.

Introducere

Dronele sunt uimitoare. Îmi place foarte mult să mă joc cu quad-ul meu, să fac fotografii și videoclipuri sau pur și simplu să mă distrez. Dar vehiculele aeriene fără pilot (UAV) sunt folosite pentru mai mult decât doar pentru divertisment. Ei lucrează în cinematografie, studiază ghețarii și sunt folosiți de militari și de reprezentanți ai sectorului agricol.

În acest tutorial ne vom uita la crearea unui program care vă va permite să controlați o dronă. folosind comenzi vocale. Da, elicopterul va face ceea ce îi spui tu să facă. La sfârșitul articolului există un program gata făcut și un videoclip de control UAV.

fier

Avem nevoie de următoarele:

  • Parrot ARDrone 2.0;
  • Cablu Ethernet;
  • microfon bun.

Dezvoltarea și managementul vor fi efectuate pe stațiile de lucru cu Windows/Mac/Ubuntu. Personal, am lucrat cu Mac și Ubuntu 18.04.

Software

Descărcați cea mai recentă versiune de Node.js de la site-ul oficial.

De asemenea, nevoie cea mai recentă versiune de Google Chrome.

Înțelegerea aeronavei

Să încercăm să înțelegem cum funcționează Parrot ARDrone. Acest elicotter are patru motoare.

Programăm controlul vocal al copterului folosind Node.js și ARDrone

Motoarele opuse lucrează în aceeași direcție. O pereche se rotește în sensul acelor de ceasornic, cealaltă în sens invers acelor de ceasornic. Drona se deplasează prin modificarea unghiului de înclinare față de suprafața pământului, modificarea vitezei de rotație a motoarelor și alte câteva mișcări manevrabile.

Programăm controlul vocal al copterului folosind Node.js și ARDrone

După cum putem vedea în diagrama de mai sus, modificarea diferiților parametri duce la o schimbare a direcției de mișcare a elicopterului. De exemplu, scăderea sau creșterea vitezei de rotație a rotoarelor din stânga și din dreapta creează o rulare. Acest lucru permite dronei să zboare înainte sau înapoi.

Schimbând viteza și direcția motoarelor, am setat unghiuri de înclinare care permit copterului să se miște în alte direcții. De fapt, pentru proiectul actual nu este nevoie să studiezi aerodinamica, trebuie doar să înțelegi principiile de bază.

Cum funcționează Parrot ARDrone

Drona este un hotspot Wi-Fi. Pentru a primi și a trimite comenzi către elicotter, trebuie să vă conectați în acest punct. Există multe aplicații diferite care vă permit să controlați quadcoptere. Totul arată cam așa:

Programăm controlul vocal al copterului folosind Node.js și ARDrone

De îndată ce drona este conectată, deschideți terminalul și telnetul 192.168.1.1 - acesta este IP-ul copterului. Pentru Linux puteți utiliza Linux Busybox.

Arhitectura aplicatiei

Codul nostru va fi împărțit în următoarele module:

  • interfață de utilizator cu API de vorbire pentru detectarea vocii;
  • filtrarea comenzilor și compararea cu un standard;
  • trimiterea de comenzi către dronă;
  • transmisie video live.

API-ul funcționează atâta timp cât există o conexiune la internet. Pentru a asigura acest lucru, adăugăm o conexiune Ethernet.

Este timpul să creezi o aplicație!

Cod

Mai întâi, să creăm un folder nou și să comutăm la el folosind terminalul.

Apoi creăm un proiect Node folosind comenzile de mai jos.

Mai întâi, instalăm dependențele necesare.

npm install 

Vom suporta următoarele comenzi:

  • scoate;
  • aterizare;
  • sus - drona se ridică cu jumătate de metru și plutește;
  • jos - cade jumătate de metru și îngheață;
  • la stânga - merge jumătate de metru la stânga;
  • la dreapta - merge o jumătate de metru la dreapta;
  • rotație - se rotește în sensul acelor de ceasornic la 90 de grade;
  • înainte - merge înainte cu jumătate de metru;
  • înapoi - se întoarce cu o jumătate de metru;
  • Stop.

Iată codul care vă permite să acceptați comenzi, să le filtrați și să controlați 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);

Și aici este codul HTML și JavaScript care ascultă utilizatorul și trimite o comandă către serverul 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>

Și, de asemenea, cod JavaScript pentru a lucra cu comenzi vocale, trimițându-le către serverul 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'
 });
};

Lansați aplicația

Programul poate fi lansat după cum urmează (este important să vă asigurați că elicopterul este conectat la Wi-Fi și cablul Ethernet este conectat la computer).

Deschideți localhost:3000 în browser și faceți clic pe Start Recognition.

Programăm controlul vocal al copterului folosind Node.js și ARDrone

Încercăm să controlăm drona și suntem fericiți.

Difuzare video de pe o dronă

În proiect, creați un fișier nou și copiați acest cod acolo:

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

Și aici este codul HTML, îl plasăm în folderul public.

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

Lansați și conectați-vă la localhost:8080 pentru a vizualiza videoclipuri de pe camera frontală.

Programăm controlul vocal al copterului folosind Node.js și ARDrone

Sfaturi utile

  • Zboară această dronă în interior.
  • Pune întotdeauna capacul de protecție pe dronă înainte de a decola.
  • Verificați dacă bateria este încărcată.
  • Dacă drona se comportă ciudat, țineți-o apăsat și întoarceți-o. Această acțiune va pune elicotterul în modul de urgență și rotoarele se vor opri imediat.

Cod gata și demonstrație

LIVE DEMO

DOWNLOAD

S-a întâmplat!

Scrierea codului și apoi urmărirea mașinii care începe să se supună vă va face plăcere! Acum ne-am dat seama cum să învățăm o dronă să asculte comenzile vocale. De fapt, există mult mai multe posibilități: recunoașterea facială a utilizatorului, zboruri autonome, recunoașterea gesturilor și multe altele.

Ce puteți sugera pentru a îmbunătăți programul?

Skillbox recomandă:

Sursa: www.habr.com

Adauga un comentariu