Kopteroaren ahots kontrola programatzen dugu Node.js eta ARDrone erabiliz

Kopteroaren ahots kontrola programatzen dugu Node.js eta ARDrone erabiliz

Tutorial honetan drone batentzako programa bat sortzea aztertuko dugu ahots kontrola duen Node.js eta Web Speech API erabiliz. Copter - Parrot ARDrone 2.0.

Gogoratzen dugu: "Habr" irakurle guztientzat - 10 errubloko deskontua "Habr" promozio-kodea erabiliz Skillbox-eko edozein ikastarotan izena ematean.

Skillbox-ek gomendatzen du: Ikastaro praktikoa "Mobile Developer PRO".

Sarrera

Drones harrigarriak dira. Asko gustatzen zait nire quad-ekin jolastea, argazkiak eta bideoak ateratzea edo ondo pasatzea. Baina tripulaziorik gabeko aireko ibilgailuak (UAV) entretenimendu hutserako erabiltzen dira. Zineman lan egiten dute, glaziarrak aztertzen dituzte, eta militarrek eta nekazaritza sektoreko ordezkariek erabiltzen dituzte.

Tutorial honetan drone bat kontrolatzeko aukera emango dizun programa bat sortzea aztertuko dugu. ahots komandoak erabiliz. Bai, hegazkinak esandakoa egingo du. Artikuluaren amaieran UAV kontrolatzeko prest dauden programa eta bideoa daude.

burdin

Honako hauek behar ditugu:

  • Loro ARDrone 2.0;
  • Ethernet kablea;
  • mikrofono ona.

Garapena eta kudeaketa Windows/Mac/Ubuntu duten lan-estazioetan egingo da. Pertsonalki, Mac eta Ubuntu 18.04rekin lan egin nuen.

Software

Deskargatu Node.js-ren azken bertsioa hemendik gune ofiziala.

Beharrezkoa ere bai Google Chrome-ren azken bertsioa.

Kopteroa ulertzea

Saia gaitezen Parrot ARDrone nola funtzionatzen duen ulertzen. Helikoptero honek lau motor ditu.

Kopteroaren ahots kontrola programatzen dugu Node.js eta ARDrone erabiliz

Kontrako motorrak norabide berean lan egiten dute. Bikote batek erlojuaren orratzen noranzkoan biratzen du, bestea erlojuaren orratzen noranzkoan. Dronea lurraren gainazalearekiko inklinazio angelua aldatuz mugitzen da, motorren biraketa-abiadura eta beste hainbat mugimendu maniobragarri aldatuz.

Kopteroaren ahots kontrola programatzen dugu Node.js eta ARDrone erabiliz

Goiko diagraman ikus dezakegunez, hainbat parametro aldatzeak copter-aren mugimenduaren norabidea aldatzea dakar. Esaterako, ezkerreko eta eskuineko errotoreen biraketa-abiadura gutxitzeak edo handitzeak biribildu bat sortzen du. Horri esker, droneak aurrera edo atzera hegan egin dezake.

Motoren abiadura eta norabidea aldatuz, hegazkina beste norabide batzuetan mugitzeko aukera ematen duten okertze-angeluak ezartzen ditugu. Egia esan, egungo proiekturako ez dago aerodinamika aztertu beharrik, oinarrizko printzipioak ulertu behar dituzu.

Nola funtzionatzen duen Parrot ARDrone

Dronea Wi-Fi gune bat da. Kopteroari komandoak jaso eta bidaltzeko, puntu honetara konektatu behar duzu. Hainbat aplikazio daude kuadrikopteroak kontrolatzeko aukera ematen dutenak. Guztiak honelako itxura du:

Kopteroaren ahots kontrola programatzen dugu Node.js eta ARDrone erabiliz

Dronea konektatu bezain laster, ireki terminala eta telnet 192.168.1.1 - hau da copter-aren IPa. Linux-erako erabil dezakezu Linux Busybox.

Aplikazioen arkitektura

Gure kodea hurrengo moduluetan banatuko da:

  • erabiltzailearen interfazea hizketa APIarekin ahotsa detektatzeko;
  • komandoak iragaztea eta estandar batekin alderatzea;
  • droneari aginduak bidaltzea;
  • zuzeneko bideo emisioa.

APIak Interneterako konexioa dagoen bitartean funtzionatzen du. Hori ziurtatzeko, Ethernet konexio bat gehitzen dugu.

Aplikazio bat sortzeko garaia da!

Kodea

Lehenik eta behin, sor dezagun karpeta berri bat eta alda dezagun terminala erabiliz.

Ondoren, Node proiektu bat sortuko dugu beheko komandoak erabiliz.

Lehenik eta behin, beharrezko mendekotasunak instalatzen ditugu.

npm instalatu 

Komando hauek onartzen ditugu:

  • aireratzen;
  • lurreratzea;
  • gora - dronea metro erdira igotzen da eta igarotzen da;
  • behera - metro erdi erori eta izoztu egiten da;
  • ezkerrera - metro erdi bat ezkerrera doa;
  • eskuinera - metro erdi bat eskuinera doa;
  • biraketa - erlojuaren orratzen norantz 90 gradu biratzen du;
  • aurrera - metro erdi aurrera doa;
  • atzera - metro erdi atzera egiten du;
  • gelditu.

Hona hemen komandoak onartzeko, iragazteko eta dronea kontrolatzeko aukera ematen duen kodea.

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

Eta hona hemen erabiltzaileari entzuten eta Node zerbitzariari komando bat bidaltzen dion HTML eta JavaScript kodea.

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

Eta baita JavaScript kodea ahots komandoekin lan egiteko, Node zerbitzarira bidaliz.

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

Aplikazioa martxan jartzea

Programa honela abiarazi daiteke (garrantzitsua da hegazkina Wi-Fira konektatuta dagoela eta Ethernet kablea ordenagailura konektatuta dagoela ziurtatzea).

Ireki localhost:3000 arakatzailean eta egin klik Hasi ezagutzen.

Kopteroaren ahots kontrola programatzen dugu Node.js eta ARDrone erabiliz

Dronea kontrolatzen saiatzen gara eta pozik gaude.

Drone batetik bideoa igortzen

Proiektuan, sortu fitxategi berri bat eta kopiatu kode hau bertan:

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

Eta hona hemen HTML kodea, karpeta publikoaren barruan kokatzen dugu.

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

Abiarazi eta konektatu localhost:8080ra aurreko kamerako bideoa ikusteko.

Kopteroaren ahots kontrola programatzen dugu Node.js eta ARDrone erabiliz

Baliagarria aholkuak

  • Egin drone hau barrualdean.
  • Jarri beti babes-estalkia droneari aireratu aurretik.
  • Egiaztatu bateria kargatuta dagoen.
  • Droneak portaera arraroa badu, eutsi sakatuta eta irauli. Ekintza honek hegazkina larrialdi moduan jarriko du eta errotoreak berehala geldituko dira.

Kodea eta demoa prest

BIZI DEMO

DESKARGA

Gertatu da!

Kodea idazteak eta gero makina obeditzen hasten dela ikusteak plazerra emango dizu! Orain asmatu dugu drone bati ahots-aginduak entzuten nola irakatsi. Izan ere, askoz aukera gehiago daude: erabiltzailearen aurpegi-ezagutza, hegaldi autonomoak, keinu-ezagutza eta askoz gehiago.

Zer iradoki dezakezu programa hobetzeko?

Skillbox-ek gomendatzen du:

Iturria: www.habr.com

Gehitu iruzkin berria