Mir Programm Stëmm Kontroll vun der Copter benotzt Node.js an ARDrone

Mir Programm Stëmm Kontroll vun der Copter benotzt Node.js an ARDrone

An dësem Tutorial wäerte mir kucken fir e Programm fir eng Dron mat Stëmmkontrolle mat Node.js a Web Speech API ze kreéieren. Copter - Papagei ARDrone 2.0.

Mir erënneren Iech: fir all Habr Lieser - eng Remise vun 10 Rubel wann Dir Iech an all Skillbox Cours aschreift mat dem Habr Promo Code.

Skillbox recommandéiert: Praktesch Cours "Mobilentwéckler PRO".

Aféierung

Dronen sinn erstaunlech. Ech genéissen wierklech mat mengem Quad ze spillen, Fotoen a Videoen ze maachen oder einfach Spaass ze hunn. Awer onbemannt Loftfaart (UAVs) gi fir méi wéi nëmmen Ënnerhalung benotzt. Si schaffen am Kino, studéieren Gletscher, a gi vum Militär a Vertrieder vum landwirtschaftleche Secteur benotzt.

An dësem Tutorial kucke mir e Programm ze kreéieren deen Iech erlaabt eng Dron ze kontrolléieren. benotzt Stëmm Kommandoen. Jo, de Copter wäert maachen wat Dir him seet. Um Enn vum Artikel gëtt et e fäerdege Programm a Video vun der UAV Kontroll.

Iron

Mir brauchen déi folgend:

  • Papagei ARDrone 2.0;
  • Ethernet Kabel;
  • gutt Mikro.

Entwécklung a Gestioun gëtt op Aarbechtsstatiounen mat Windows/Mac/Ubuntu duerchgefouert. Perséinlech hunn ech mat Mac an Ubuntu 18.04 geschafft.

Software

Download déi lescht Versioun vun Node.js aus offizielle Site.

Och gebraucht lescht Versioun vu Google Chrome.

Den Copter verstoen

Loosst eis probéieren ze verstoen wéi Parrot ARDrone funktionnéiert. Dëse Copter huet véier Motoren.

Mir Programm Stëmm Kontroll vun der Copter benotzt Node.js an ARDrone

Géigewier Motore schaffen an déi selwecht Richtung. Ee Pair rotéiert mat der Auer, déi aner géint d'Auer. D'Drone beweegt sech andeems de Neigungswénkel relativ zu der Äerduewerfläch geännert gëtt, d'Rotatiounsgeschwindegkeet vun de Motoren a verschidde aner manöverbar Bewegungen änneren.

Mir Programm Stëmm Kontroll vun der Copter benotzt Node.js an ARDrone

Wéi mir am Diagramm uewe kënne gesinn, féiert d'Ännerung vu verschiddene Parameteren zu enger Verännerung vun der Bewegungsrichtung vum Copter. Zum Beispill, erofzesetzen oder d'Erhéijung vun der Rotatiounsgeschwindegkeet vun de lénksen a rietse Rotoren erstellt eng Roll. Dëst erlaabt der Dron no vir oder no hannen ze fléien.

Andeems Dir d'Geschwindegkeet an d'Richtung vun de Motoren ännert, setzen mir Kippwinkelen, déi de Copter erlaben an aner Richtungen ze bewegen. Eigentlech, fir den aktuelle Projet ass et net néideg Aerodynamik ze studéieren, Dir musst just d'Basisprinzipien verstoen.

Wéi Papagei ARDrone funktionnéiert

D'Dron ass e Wi-Fi Hotspot. Fir Kommandoen un de Copter ze kréien an ze schécken, musst Dir mat dësem Punkt konnektéieren. Et gi vill verschidden Uwendungen déi Iech erlaben Quadcopter ze kontrolléieren. Et gesäit alles sou eppes aus:

Mir Programm Stëmm Kontroll vun der Copter benotzt Node.js an ARDrone

Soubal d'Drone ugeschloss ass, öffnen den Terminal an Telnet 192.168.1.1 - dëst ass d'IP vum Copter. Fir Linux kënnt Dir benotzen Linux Busybox.

Applikatioun Architektur

Eise Code gëtt an de folgende Moduler opgedeelt:

  • Benotzer Interface mat Ried API fir Stëmm Detektioun;
  • Filterbefehler a vergläichen mat engem Standard;
  • schéckt Kommandoen un d'Dron;
  • Live Video Iwwerdroung.

D'API funktionnéiert soulaang et eng Internetverbindung gëtt. Fir dëst ze garantéieren, addéiere mer eng Ethernet Verbindung.

Et ass Zäit eng Applikatioun ze kreéieren!

Code

Als éischt, loosst eis en neien Dossier erstellen a wiesselen op et mam Terminal.

Da kreéiere mir e Node-Projet mat de Kommandoen hei drënner.

Als éischt installéiere mir déi erfuerderlech Ofhängegkeeten.

npm installéiert 

Mir ënnerstëtzen déi folgend Kommandoen:

  • ofhiewen;
  • Landung;
  • erop - d'Drone klëmmt en hallwe Meter an héift;
  • erof - fällt en halleft Meter a freet;
  • lénks - geet en halleft Meter no lénks;
  • no riets - geet en halleft Meter no riets;
  • Rotatioun - rotéiert Auer 90 Grad;
  • no vir - geet en halleft Meter no vir;
  • zréck - geet en halleft Meter zréck;
  • ophalen.

Hei ass de Code deen Iech erlaabt Kommandoen ze akzeptéieren, se ze filteren an d'Drone ze kontrolléieren.

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

An hei ass den HTML a JavaScript Code deen de Benotzer lauschtert an e Kommando un den Node Server schéckt.

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

An och JavaScript Code fir mat Stëmmbefehl ze schaffen, se op den Node Server ze schécken.

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

D'Applikatioun starten

De Programm kann wéi follegt lancéiert ginn (et ass wichteg sécherzestellen, datt de Copter mat Wi-Fi ugeschloss ass an den Ethernet Kabel un de Computer ugeschloss ass).

Open localhost:3000 am Browser a klickt Start Unerkennung.

Mir Programm Stëmm Kontroll vun der Copter benotzt Node.js an ARDrone

Mir probéieren d'Drone ze kontrolléieren a si frou.

Emissioun Video vun enger Dron

Am Projet erstellt eng nei Datei a kopéiert dëse Code do:

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

An hei ass den HTML Code, mir setzen et an den ëffentlechen Dossier.

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

Lancéiere a verbannen mat localhost: 8080 fir Video vun der viischter Kamera ze gesinn.

Mir Programm Stëmm Kontroll vun der Copter benotzt Node.js an ARDrone

Nëtzlech Tipps

  • Flitt dës Dron dobannen.
  • Setzt ëmmer de Schutzdeckel op Ärem Dron virum Ofstänn.
  • Kontrolléieren ob d'Batterie gelueden ass.
  • Wann d'Drone sech komesch verhält, hält se erof a flippt se ëm. Dës Aktioun wäert den Copter an den Noutmodus setzen an d'Rotoren stoppen direkt.

Fäerdeg Code an Demo

LIEWEN DEMO

EROFLUEDEN

Ass geschitt!

Code schreiwen an dann kucken wéi d'Maschinn ufänkt ze befollegen wäert Iech Freed ginn! Elo hu mir erausfonnt wéi een eng Dron léiert fir Stëmmbefehle ze lauschteren. Tatsächlech ginn et vill méi Méiglechkeeten: Benotzer Gesiichtserkennung, autonom Flich, Geste Unerkennung a vill méi.

Wat kënnt Dir proposéiere fir de Programm ze verbesseren?

Skillbox recommandéiert:

Source: will.com

Setzt e Commentaire