
Në këtë tutorial do të analizojmë krijimin e një programi për dronin 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 rublej pĂ«r regjistrimin nĂ« çdo kurs Skillbox me kodin promocional "Habr".
Skillbox rekomandon: Kurs praktik .
Hyrje
Dronët janë të mahnitshëm. Më pëlqen shumë të luaj me dronin tim, duke regjistruar fotografi dhe video ose thjesht duke u argëtuar. Mirëpo, pajisjet pa pilot (BPL) përdoren jo vetëm për argëtim. Ato punojnë në kinematografi, studjojnë glaciere, përdoren nga ushtria dhe përfaqësuesit e sektorit bujqësor.
NĂ« kĂ«tĂ« tutorial do tĂ« analizojmĂ« krijimin e njĂ« programi qĂ« do t'ju lejojĂ« tĂ« kontrolloni dronin duke pĂ«rdorur komandat me zĂ«. Po, droni do tĂ« bĂ«jĂ« atĂ« qĂ« i thoni. NĂ« fund tĂ« artikullit â programi i gatshĂ«m dhe video pĂ«r kontrollet BPL.
Pajisjet
Na nevojitet e siguiente:
- Parrot ARDrone 2.0;
- Kablë Ethernet;
- mikrofon i mirë.
Zhvillimi dhe menaxhimi do të bëhet në stacione pune me Windows/Mac/Ubuntu. Personalish kam punuar me Mac dhe Ubuntu 18.04.
Software
Shkarkoni versionin më të fundit të Node.js nga .
Kërkohet gjithashtu .
Mësojmë rreth copter-it
Le të përpiqemi të kuptojmë si funksionon Parrot ARDrone. Ky copter ka katër motorë.

Motoret pĂ«rballĂ« punojnĂ« nĂ« njĂ« drejtim. NjĂ« çift rrotullohet nĂ« drejtimin e akrepave tĂ« orĂ«s, tjetra â nĂ« drejtim tĂ« kundĂ«rt. Droni lĂ«viz duke ndryshuar kĂ«ndin e pjerrĂ«sisĂ« nĂ« raport me sipĂ«rfaqen e tokĂ«s, ndryshimin e shpejtĂ«sisĂ« sĂ« rrotullimit tĂ« motorĂ«ve dhe lĂ«vizje tĂ« tjera manovruese.

Siç shohim në diagramin e mësipërm, ndryshimi i parametrave të ndryshëm çon në një ndryshim të drejtimit të lëvizjes së copter-it. Për shembull, zvogëlimi ose rritja e shpejtësisë së rrotatorëve të majtë dhe të djathtë krijon 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 vendosim këndet e pjerrësisë që lejojnë copter-in të lëvizë në drejtime të tjera. Në fakt, për projektin aktual nuk është e nevojshme të studiohet aerodinamika, thjesht duhet të kuptohet parimi bazë.
Si funksionon Parrot ARDrone
Droni është një pikë akses Wi-Fi. Për të marrë dhe dërguar komandat në copter, është e nevojshme të lidhemi me këtë pikë. Ka shumë aplikacione të ndryshme që lejojnë menaxhimin e copterëve. Kjo duket kështu:

Pasi droni Ă«shtĂ« i lidhur, hapim terminalin dhe shkruajmĂ« telnet 192.168.1.1 â kjo Ă«shtĂ« adresa IP e copter-it. PĂ«r Linux mund tĂ« pĂ«rdorim .
Arkitektura e aplikacionit
Kodi ynë do të ndahet në modula të mëposhtëm:
- interfaci i përdoruesit me API për njohjen e zërit;
- filtrimi i komandave dhe përputhja me standardin;
- dërgimi i komandave në dron;
- transmetimi i drejtpërdrejtë i videos.
API-eja funksionon në rast se ka një lidhje interneti. Për ta siguruar këtë, shtojmë një lidhje përmes Ethernet.
ĂshtĂ« koha tĂ« krijojmĂ« aplikacionin!
Të programojmë
Së pari, krijojmë një dosje të re dhe kalojmë në të duke përdorur terminalin.
Pastaj krijojmë një projekt Node, duke përdorur komandat më poshtë.
Së pari, instalojmë varësitë e nevojshme.
npm installâ
Do të mbështesim komandat e mëposhtme:
- ngritje;
- ulje;
- lart â droni ngrihet njĂ« metĂ«r dhe qĂ«ndron nĂ« ajĂ«r;
- poshtĂ« â zbret njĂ« metĂ«r dhe qĂ«ndron nĂ« ajĂ«r;
- majtas majtas në gjysmë metri;
- majtas djathtas në gjysmë metri;
- kthesa â kthehet nĂ« drejtim tĂ« dikasterit pĂ«r 90 gradĂ«;
- pĂ«rpara â mvaret pĂ«rpara nĂ« gjysmĂ« metri;
- mbrapa â mvaret mbrapa nĂ« gjysmĂ« metri;
- ndal.
Ja 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();
// anulo emergjencën
drone.disableEmergency();
// shprehja
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('komanda e pranuar ', req.body);
console.log('komandat ekzistuese', commands);
let command = req.body.command.replace(/ /g,'');
if(commands.indexOf(command) !== -1) {
switch(command.toUpperCase()) {
case "TAKEOFF":
console.log('duke u ngritur droni');
drone.takeoff();
break;
case "LAND":
console.log('duke ulur dronin');
drone.land();
break;
case "UP":
console.log('duke ngritur dronin gjysmë metri');
drone.up(0.2);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "DOWN":
console.log('duke zbritur dronin gjysmë metri');
drone.down(0.2);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOLEFT":
console.log('duke lëvizur dronin majtas 1 metër');
drone.left(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},1000);
break;
case "GORIGHT":
console.log('duke lëvizur dronin djathtas 1 metër');
drone.right(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},1000);
break;
case "TURN":
console.log('duke e kthyer dronin');
drone.clockwise(0.4);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOFORWARD":
console.log('duke lëvizur dronin përpara me 1 metër');
drone.front(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOBACKWARD":
console.log('duke lëvizur dronin prapa 1 metër');
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);Këtu është kodi HTML dhe JavaScript që dëgjon përdoruesin dhe dërgon një komandë 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 dron AR duke përdorur zë</p>
<h3 class="no-browser-support">Na vjen keq, shfletuesi juaj nuk mbështet Web Speech API. Provoni të hapni këtë demo në Google Chrome.</h3>
<div class="app">
<h3>Jepni urdhrin</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="Filloni regjistrimin">Filloni njohjen</button>
<button id="pause-record-btn" title="Pauzoni regjistrimin">Pauzoni njohjen</button>
<p id="recording-instructions">Shtypni <strong>Filloni njohjen</strong> butonin dhe lejoni qasje.</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>Po ashtu, ky është kodi JavaScript për të punuar me komandat me zë, duke i dërguar ato në serverin Node.
try {
var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
var recognition = new SpeechRecognition();
}
catch(e) {
console.error(e);
$('.no-browser-support').show();
$('.app').hide();
}
// kodi tjetër, ju lutemi referojuni burimit në GitHub
recognition.onresult = function(event) {
// ngjarja është një objekt SpeechRecognitionEvent.
// Ajo përmban 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'
});
};Fillojmë aplikacionin
Programin mund ta filloni në këtë mënyrë (është e rëndësishme të siguroni që droni të jetë i lidhur me Wi-Fi dhe kablli Ethernet të jetë i lidhur me kompjuterin).
Hapni localhost:3000 në shfletues dhe klikoni Start Recognition.

Provojmë të kontrollojmë dronin dhe gëzohemi.
Transmetimi i videos nga droni
Në projekt krijojmë një skedar të ri dhe kopjojmë këtë kod atje:
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);Këtu është kodi HTML, vendoseni brenda dosjes public.
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Shkarko si modul</title>
<script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<h1 id="heading">Përmbledhja e videos me drone</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>Filloni dhe lidhuni me localhost:8080 për të parë videon nga kamera frontale.

Këshilla të dobishme
- Kontrolloni dronin në ambiente të brendshme.
- Gjithmonë vendosni kapakun mbrojtës mbi dron para se të fluturoni.
- Kontrolloni nëse bateria është e ngarkuar.
- Nëse droni sillet çuditshëm, mbani poshtë dhe përmbyseni. Kjo dotë e çojë dronin në mënyrën emergjente dhe rotorët do të ndalojnë menjëherë.
Kodi i gatshëm dhe demonstrimi
Kemi arritur!
Shkrimi i kodit dhe pastaj të shohësh si makina fillon të përgjigjet do t'ju sjellë kënaqësi! Tani kemi mësuar si të mësojmë dronin të dëgjojë urdhra me zë. Në të vërtetë, mundësitë janë shumë më të shumta: njohja e fytyrës së përdoruesit, fluturimet autonome, njohja e gjesteve dhe shumë më tepër.
ĂfarĂ« mund tĂ« ofroni pĂ«r pĂ«rmirĂ«simin e programit?
Skillbox rekomandon:
- Kursi online i aplikimit .
- Kurs online .
- Kurs praktik njëvjeçar .
Burimi: habr.com
