Ons programmeer stembeheer van die copter deur Node.js en ARDrone te gebruik

Ons programmeer stembeheer van die copter deur Node.js en ARDrone te gebruik

In hierdie tutoriaal sal ons kyk na die skep van 'n program vir 'n hommeltuig met stembeheer met behulp van Node.js en Web spraak API. Copter - Papegaai ARDrone 2.0.

Ons herinner: vir alle lesers van "Habr" - 'n afslag van 10 000 roebels wanneer u inskryf vir enige Skillbox-kursus met behulp van die "Habr"-promosiekode.

Skillbox beveel aan: Praktiese kursus "Mobiele ontwikkelaar PRO".

Inleiding

Drones is wonderlik. Ek geniet dit baie om met my quad te speel, foto's en video's te neem, of net pret te hê. Maar onbemande lugvoertuie (UAV's) word vir meer as net vermaak gebruik. Hulle werk in rolprentteaters, bestudeer gletsers en word deur die weermag en verteenwoordigers van die landbousektor gebruik.

In hierdie handleiding sal ons kyk na die skep van 'n program wat jou sal toelaat om 'n hommeltuig te beheer. stemopdragte te gebruik. Ja, die helikopter sal doen wat jy hom beveel om te doen. Aan die einde van die artikel is daar 'n klaargemaakte program en video van UAV-beheer.

yster

Ons benodig die volgende:

  • Papegaai ARDrone 2.0;
  • Ethernet-kabel;
  • goeie mikrofoon.

Ontwikkeling en bestuur sal op werkstasies met Windows/Mac/Ubuntu uitgevoer word. Persoonlik het ek met Mac en Ubuntu 18.04 gewerk.

Sagteware

Laai die nuutste weergawe van Node.js af vanaf amptelike webwerf.

Ook nodig nuutste weergawe van Google Chrome.

Verstaan ​​die helikopter

Kom ons probeer verstaan ​​hoe Parrot ARDrone werk. Hierdie helikopter het vier motors.

Ons programmeer stembeheer van die copter deur Node.js en ARDrone te gebruik

Opponerende motors werk in dieselfde rigting. Een paar draai kloksgewys, die ander linksom. Die hommeltuig beweeg deur die hellingshoek relatief tot die oppervlak van die aarde te verander, die spoed van rotasie van die motors en verskeie ander maneuvreerbare bewegings te verander.

Ons programmeer stembeheer van die copter deur Node.js en ARDrone te gebruik

Soos ons in die diagram hierbo kan sien, lei die verandering van verskeie parameters tot 'n verandering in die bewegingsrigting van die copter. Byvoorbeeld, die vermindering of verhoging van die rotasiespoed van die linker en regter rotors skep 'n rol. Dit laat die hommeltuig vorentoe of agtertoe vlieg.

Deur die spoed en rigting van die motors te verander, stel ons kantelhoeke wat die helikopter in staat stel om in ander rigtings te beweeg. Eintlik, vir die huidige projek is dit nie nodig om aërodinamika te bestudeer nie, jy moet net die basiese beginsels verstaan.

Hoe Parrot ARDrone werk

Die hommeltuig is 'n Wi-Fi-hotspot. Om opdragte na die helikopter te ontvang en te stuur, moet jy aan hierdie punt koppel. Daar is baie verskillende toepassings wat jou toelaat om quadcopters te beheer. Dit lyk alles so iets:

Ons programmeer stembeheer van die copter deur Node.js en ARDrone te gebruik

Sodra die hommeltuig gekoppel is, maak die terminale oop en telnet 192.168.1.1 - dit is die helikopter se IP. Vir Linux kan jy gebruik Linux Busybox.

Toepassingsargitektuur

Ons kode sal in die volgende modules verdeel word:

  • gebruikerskoppelvlak met spraak-API vir stemopsporing;
  • filter opdragte en vergelyking met 'n standaard;
  • die stuur van bevele na die hommeltuig;
  • regstreekse video-uitsending.

Die API werk solank daar 'n internetverbinding is. Om dit te verseker, voeg ons 'n Ethernet-verbinding by.

Dit is tyd om 'n toepassing te skep!

Kode

Laat ons eers 'n nuwe vouer skep en oorskakel na dit met behulp van die terminaal.

Dan skep ons 'n Node-projek deur die opdragte hieronder te gebruik.

Eerstens installeer ons die vereiste afhanklikhede.

npm installeer 

Ons sal die volgende opdragte ondersteun:

  • haal af;
  • landing;
  • op - die hommeltuig styg 'n halwe meter en sweef;
  • af - val 'n halwe meter en vries;
  • na links - gaan 'n halwe meter na links;
  • na regs - gaan 'n halwe meter na regs;
  • rotasie - draai kloksgewys 90 grade;
  • vorentoe - gaan 'n halwe meter vorentoe;
  • terug - gaan 'n halwe meter terug;
  • stop.

Hier is die kode wat jou toelaat om opdragte te aanvaar, dit te filter en die hommeltuig te beheer.

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 hier is die HTML- en JavaScript-kode wat na die gebruiker luister en 'n opdrag na die Node-bediener stuur.

<!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 ook JavaScript-kode om met stemopdragte te werk, wat dit na die Node-bediener stuur.

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

Die bekendstelling van die toepassing

Die program kan soos volg geloods word (dit is belangrik om seker te maak dat die copter aan Wi-Fi gekoppel is en die Ethernet-kabel aan die rekenaar gekoppel is).

Maak localhost:3000 in die blaaier oop en klik Begin Herkenning.

Ons programmeer stembeheer van die copter deur Node.js en ARDrone te gebruik

Ons probeer die hommeltuig beheer en is gelukkig.

Saai video vanaf 'n hommeltuig uit

Skep 'n nuwe lêer in die projek en kopieer hierdie kode daarheen:

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 hier is die HTML-kode, ons plaas dit in die publieke gids.

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

Begin en koppel aan localhost:8080 om video vanaf die voorste kamera te sien.

Ons programmeer stembeheer van die copter deur Node.js en ARDrone te gebruik

Nuttige wenke

  • Vlieg hierdie hommeltuig binnenshuis.
  • Sit altyd die beskermende bedekking op jou hommeltuig voordat jy opstyg.
  • Kyk of die battery gelaai is.
  • As die hommeltuig vreemd optree, hou dit in en draai dit om. Hierdie aksie sal die helikopter in noodmodus plaas en die rotors sal onmiddellik stop.

Klaar kode en demo

LEEF DEMO

AFLAAI

Het gebeur!

Om kode te skryf en dan te kyk hoe die masjien begin gehoorsaam, sal jou plesier gee! Nou het ons uitgevind hoe om 'n hommeltuig te leer om na stemopdragte te luister. Trouens, daar is baie meer moontlikhede: gebruikersgesigsherkenning, outonome vlugte, gebareherkenning en nog baie meer.

Wat kan jy voorstel om die program te verbeter?

Skillbox beveel aan:

Bron: will.com

Voeg 'n opmerking