Programoni kontrollin me zë të droneve duke përdorur Node.js dhe ARDrone

Programoni kontrollin me zë të droneve duke përdorur Node.js dhe ARDrone

Në këtë udhëzues do të shqyrtojmë krijimin e një programi për dron me kontroll me zë në Node.js dhe Web Speech API. Droni është Parrot ARDrone 2.0.

Kujtojmë: për të gjithë lexuesit e «Habra» — zbritje prej 10,000 rublesh për regjistrimin në çdo kurs Skillbox me kodin promovues «Habr».

Skillbox rekomandon: Kurs praktik «Mobil developer PRO».

Hyrje

Dronët janë të mrekullueshëm. Më pëlqen shumë të luaj me dronin tim, duke regjistruar foto dhe video ose thjesht duke u argëtuar. Por pajisjet pa pilot (BPL) nuk përdoren vetëm për argëtim. Ato përdoren në kinematografi, studiojnë glaciaren, dhe janë të përdorura nga ushtarët dhe përfaqësuesit e sektorit bujqësor.

Në këtë udhëzues do të shqyrtojmë krijimin e një programi që do të lejojë kontrollin e dronit duke përdorur komandat me zë. Po, droni do të bëjë atë që i thoni. Në fund të artikullit do të ketë programin e gatshëm dhe një video për kontrollin e BPL.

Hardueri

Na nevojitet e mëposhtme:

  • Parrot ARDrone 2.0;
  • Kabllon Ethernet;
  • një mikrofon të mirë.

Zhvillimi dhe menaxhimi do të bëhet në stacionet e punës me Windows/Mac/Ubuntu. Personalish kam punuar me Mac dhe Ubuntu 18.04.

Softuer

Shkarkoni versionin më të fundit të Node.js nga faqja zyrtare.

Po ashtu na nevojitet versioni më i fundit i Google Chrome.

Të kuptojmë dronin

Le të përpiqemi të kuptojmë si funksionon Parrot ARDrone. Ky dron ka katër motorë.

Programoni kontrollin me zë të droneve duke përdorur Node.js dhe ARDrone

Motorët përballë punojnë në të njëjtin drejtim. Një çift rrotullohet në drejtimin e akrepave të orës, tjetri në të kundërt. Droni lëviz duke ndryshuar këndin e pjerrësisë në raport me sipërfaqen e tokës, duke ndryshuar shpejtësinë e rrotullimeve të motorëve dhe disa manovra të tjera.

Programoni kontrollin me zë të droneve duke përdorur Node.js dhe ARDrone

Siç e shohim në diagramin më sipër, ndryshimi i parametrave të ndryshëm çon në ndryshimin e drejtimit të lëvizjes së dronit. Për shembull, zvogëlimi apo rritja e shpejtësisë së rrotullimit të rotorëve të majtë dhe të djathtë krijon një pjerrësi. Kjo i lejon dronit të fluturojë përpara ose prapa.

Duke ndryshuar shpejtësinë dhe drejtimin e lëvizjes së motorëve, ne përcaktojmë këndet e pjerrësisë që lejojnë dronin të lëvizë në drejtime të tjera. Në thelb, për projektin aktual nuk është e nevojshme të studiohet aerodinamika, thjesht duhet të kuptohet parimi themelor.

Si funksionon Parrot ARDrone

Droni shërben si një pikë akses Wi-Fi. Për të marrë dhe dërguar komanda dronit, duhet të lidhemi me këtë pikë. Ka shumë aplikacione të ndryshme që lejojnë kontrollin e dronëve. Kjo duket diku ashtu:

Programoni kontrollin me zë të droneve duke përdorur Node.js dhe ARDrone

Sapo droni të lidhet, hapni terminalin dhe përdorni telnet 192.168.1.1 — kjo është IP-ja e dronit. Për Linux mund të përdorni Linux Busybox.

Arkitektura e aplikacionit

Kodi ynë do të ndahet në modulet e mëposhtme:

  • interfaci i përdoruesit me API të zërit për zbulimin e zërit;
  • filtrimi i komandave dhe përputhja me referencën;
  • dërgimi i komandave te droni;
  • transmetim të drejtpërdrejtë të videos.

API funksionon me kushtin e një lidhjeje interneti. Për ta siguruar këtë, ne po shtojmë lidhjen përmes Ethernet.

Është koha të krijojmë aplikacionin!

Krijojmë

Për të filluar, të krijojmë një dosje të re dhe të kalojmë në të përmes terminalit.

Më pas krijojmë një projekt Node, duke përdorur komandat e mëposhtme.

Së pari instalojmë varësitë e nevojshme.

npm install 

Do të përkrahim komandat e mëposhtme:

  • ngritje;
  • ulje;
  • lart — droni ngrihet për një metër dhe qëndron në vend;
  • poshtë — zbret për një metër dhe qëndron në vend;
  • majtas — shkon majtas për një metër;
  • djathtas — shkon djathtas për një metër;
  • kthesë — kthehet në të djathtë për 90 gradë;
  • përpara — shkon përpara për një metër;
  • mbrapa — shkon mbrapa për një metër;
  • ndalu.

Këtu është kodi që lejon pranimin e komandave, filtrimin e tyre dhe kontrollin e dronit.

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 received ', 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);

Ky është kodi HTML dhe JavaScript që dëgjon përdoruesin dhe dërgon komandën në serverin Node.

<!DOCTYPE html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Aplikacioni i Shënimeve me Kontroll të Zërit</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>Dron me Kontroll të Zërit</h1>
            <p class="page-description">Një aplikacion i vogël që ju lejon të kontrolloni dronin AR duke përdorur zërin</p>
 
            <h3 class="no-browser-support">Na vjen keq, shfletuesi juaj nuk mbështet Web Speech API. Provo të hapësh këtë demo në Google Chrome.</h3>
 
            <div class="app">
                <h3>Jepni komandën</h3>
                <div class="input-single">
                    <textarea id="note-textarea" placeholder="Krijoni një shënim të ri duke shkruar ose duke përdorur njohjen e zërit." rows="6"></textarea>
                </div>    
                <button id="start-record-btn" title="Nis Regjistrimin">Nis Njohjen</button>
                <button id="pause-record-btn" title="Ndalo Regjistrimin">Ndalo Njohjen</button>
                <p id="recording-instructions">Shtypni <strong>Nis Njohjen</strong> butonin dhe lejoni aksesin.</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>

Dhe këtu është kodi JavaScript për të punuar me komandat zanore, duke i dërguar ato në serverin Node.

provo {
 var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
 var recognition = new SpeechRecognition();
 }
 catch(e) {
 console.error(e);
 $('.no-browser-support').show();
 $('.app').hide();
 }
// kod tjetër, ju lutem referojuni burimit në GitHub
recognition.onresult = function(event) {
// ngjarja është një objekt SpeechRecognitionEvent.
// Ajo mbante të gjitha rreshtat që kemi kapur deri tani.
 // Ne na nevojitet vetëm aktuali.
 var current = event.resultIndex;
// Merrni një transkript të asaj që u tha.
var transcript = event.results[current][0].transcript;
// dërgojeni në backend
$.ajax({
 type: 'POST',
 url: '\/command\/',
 data: JSON.stringify({command: transcript}),
 success: function(data) { console.log(data) },
 contentType: "application\/json",
 dataType: 'json'
 });
};

Nisim aplikacionin

Programi mund të nisë në këtë mënyrë (është shumë e rëndësishme të sigurohemi që copteri është i lidhur me Wi-Fi dhe kablli Ethernet është i lidhur me kompjuterin).

Hapni localhost:3000 në shfletues dhe klikoni Start Recognition.

Programoni kontrollin me zë të droneve duke përdorur Node.js dhe ARDrone

Provojmë të menaxhojmë dronin dhe gëzohemi.

Transmetimi i videos nga droni

Në projekt krijoni një skedë të re dhe kopjoni atje këtë kod:

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

Dhe ja kodi HTML, vendoseni brenda dosjes public.

<!doctype html>
 <html>
 <head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8">
 <title>Transmetoni si modul</title>
 <script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
 </head>
 <body>
 <h1 id="heading">Transmetimi i videos me dron</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>

Nisim dhe lidhuni me localhost:8080 për të parë videon nga kamera përpara.

Programoni kontrollin me zë të droneve duke përdorur Node.js dhe ARDrone

Këshilla të dobishme

  • Menaxhoni këtë dron brenda.
  • Gjithmonë vendosni mbulesën mbrojtëse në dron para se të fluturojë.
  • Kontrolloni nëse bateria është e karikuar.
  • Nëse droni sillet çuditshëm, mbajeni nga poshtë dhe përmbyseni. Ky veprim do ta çonte copterin në modalitetin e emergjencës, dhe rotoret do të ndalojnë menjëherë.

Kodi i gatshëm dhe demo

LIVE DEMO

SHKARKO

Kemi arritur!

Për të shkruar kod dhe pastaj të shihni se si makina fillon të dëgjojë do t'ju sjellë kënaqësi! Tani ne e kuptuam se si ta mësojmë dronin të dëgjojë komandat me zë. Në të vërtetë, mundësitë janë shumë më të mëdha: njohja e fytyrës së përdoruesit, fluturimet autonome, njohja e gjesteve dhe shumë më tepër.

Çfarë mund të ofroni për të përmirësuar programin?

Skillbox rekomandon:

Burimi: habr.com

Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS 🔥 Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS - ProHoster