Wy programmearje stimbehear fan 'e copter mei Node.js en ARDrone

Wy programmearje stimbehear fan 'e copter mei Node.js en ARDrone

Yn dizze tutorial sille wy sjen nei it meitsjen fan in programma foar in drone mei stimkontrôle mei Node.js en Web spraak API. Copter - Parrot ARDrone 2.0.

Wy herinnerje: foar alle lêzers fan "Habr" - in koarting fan 10 roebel by it ynskriuwen fan in Skillbox-kursus mei de promoasjekoade "Habr".

Skillbox advisearret: Praktyske kursus "Mobiele ûntwikkelder PRO".

Ynlieding

Drones binne geweldich. Ik genietsje echt fan it boartsjen mei myn quad, it meitsjen fan foto's en fideo's, of gewoan wille hawwe. Mar ûnbemanne loftauto's (UAV's) wurde brûkt foar mear dan allinich fermaak. Se wurkje yn bioskoop, studearje gletsjers, en wurde brûkt troch it leger en fertsjintwurdigers fan 'e agraryske sektor.

Yn dizze tutorial sille wy sjen nei it meitsjen fan in programma wêrmei jo in drone kinne kontrolearje. mei help fan stim kommando's. Ja, de copter sil dwaan wat jo sizze dat te dwaan. Oan 'e ein fan it artikel is d'r in ready-made programma en fideo fan UAV-kontrôle.

Iron

Wy hawwe it folgjende nedich:

  • Parrot ARDrone 2.0;
  • Ethernet kabel;
  • goede mikrofoan.

Untwikkeling en behear sil wurde útfierd op wurkstasjons mei Windows/Mac/Ubuntu. Persoanlik wurke ik mei Mac en Ubuntu 18.04.

Software

Download de lêste ferzje fan Node.js fan offisjele webstee.

Ek nedich lêste ferzje fan Google Chrome.

De copter begripe

Litte wy besykje te begripen hoe't Parrot ARDrone wurket. Dizze copter hat fjouwer motors.

Wy programmearje stimbehear fan 'e copter mei Node.js en ARDrone

Opposing motors wurkje yn deselde rjochting. Ien pear draait mei de klok yn, de oare tsjin de klok yn. De drone beweecht troch it feroarjen fan de oanstriidhoeke relatyf oan it oerflak fan 'e ierde, it feroarjen fan de snelheid fan rotaasje fan' e motoren en ferskate oare manoeuvreerbere bewegingen.

Wy programmearje stimbehear fan 'e copter mei Node.js en ARDrone

As wy kinne sjen yn it diagram hjirboppe, feroarjen fan ferskate parameters liedt ta in feroaring yn 'e bewegingsrjochting fan' e copter. Bygelyks, it ferminderjen of fergrutsjen fan de rotaasje snelheid fan de linker en rjochter rotors makket in roll. Hjirmei kin de drone foar- of efterút fleane.

Troch de snelheid en rjochting fan 'e motoren te feroarjen, sette wy tilthoeken yn dy't de copter yn oare rjochtingen kinne bewege. Eins, foar it hjoeddeistige projekt is d'r gjin ferlet om aerodynamika te studearjen, jo moatte gewoan de basisprinsipes begripe.

Hoe Parrot ARDrone wurket

De drone is in Wi-Fi-hotspot. Om kommando's te ûntfangen en te ferstjoeren nei de copter, moatte jo ferbine mei dit punt. D'r binne in protte ferskillende applikaasjes wêrmei jo quadcopters kinne kontrolearje. It sjocht der allegear sa út:

Wy programmearje stimbehear fan 'e copter mei Node.js en ARDrone

Sadree't de drone is ferbûn, iepenje de terminal en telnet 192.168.1.1 - dit is de IP fan 'e copter. Foar Linux kinne jo brûke Linux Busybox.

Applikaasje arsjitektuer

Us koade sil wurde ferdield yn de folgjende modules:

  • brûkersynterface mei spraak API foar stimdeteksje;
  • kommando's filterje en fergelykje mei in standert;
  • it ferstjoeren fan kommando's nei de drone;
  • live video útstjoering.

De API wurket sa lang as der in ynternetferbining is. Om dit te garandearjen, foegje wy in Ethernet-ferbining ta.

It is tiid om in applikaasje te meitsjen!

Koade

Litte wy earst in nije map oanmeitsje en dernei wikselje mei de terminal.

Dan meitsje wy in Node-projekt mei de kommando's hjirûnder.

Earst ynstallearje wy de fereaske ôfhinklikens.

npm ynstallearje 

Wy sille de folgjende kommando's stypje:

  • útlûke;
  • oankomst;
  • omheech - de drone komt in heale meter omheech en sweeft;
  • del - falt in heale meter en befriest;
  • nei lofts - giet in heale meter nei lofts;
  • nei rjochts - giet in heale meter nei rjochts;
  • rotaasje - draait mei de klok mei 90 graden;
  • foarút - giet in heale meter foarút;
  • werom - giet in heale meter werom;
  • ophâlde.

Hjir is de koade wêrmei jo kommando's kinne akseptearje, se filterje en de drone kontrolearje.

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

En hjir is de HTML- en JavaScript-koade dy't harket nei de brûker en stjoert in kommando nei de Node-tsjinner.

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

En ek JavaScript-koade om te wurkjen mei stimkommando's, stjoere se nei de Node-tsjinner.

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

It starten fan de applikaasje

It programma kin wurde lansearre as folget (it is wichtich om te soargjen dat de copter is ferbûn mei Wi-Fi en de Ethernet kabel is ferbûn mei de kompjûter).

Iepenje localhost:3000 yn 'e browser en klikje op Start Erkenning.

Wy programmearje stimbehear fan 'e copter mei Node.js en ARDrone

Wy besykje de drone te kontrolearjen en binne bliid.

Fideo útstjoere fan in drone

Meitsje yn it projekt in nij bestân en kopiearje dizze koade dêr:

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

En hjir is de HTML-koade, wy pleatse it yn 'e iepenbiere map.

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

Starte en ferbine mei localhost: 8080 om fideo te besjen fan 'e frontkamera.

Wy programmearje stimbehear fan 'e copter mei Node.js en ARDrone

Helpful Tips

  • Flean dizze drone binnen.
  • Set altyd de beskermjende dekking op jo drone foardat jo ôfstjitte.
  • Kontrolearje oft de batterij is opladen.
  • As de drone him nuver gedraacht, hâld it dan del en draai it om. Dizze aksje sil de copter yn needmodus sette en de rotors sille fuortendaliks stopje.

Klear koade en demo

LIVE DEMO

DOWNLOAD

Happened!

Koade skriuwe en dan sjen hoe't de masine begjint te folgjen sil jo nocht jaan! No hawwe wy útfûn hoe't jo in drone learje om te harkjen nei stimkommando's. Eins binne d'r folle mear mooglikheden: gesichtsherkenning fan brûkers, autonome flechten, gebearkenning en folle mear.

Wat kinne jo foarstelle om it programma te ferbetterjen?

Skillbox advisearret:

Boarne: www.habr.com

Add a comment