Kule tutorial siza kujonga ekudaleni inkqubo yedrone enolawulo lwelizwi usebenzisa iNode.js kunye neWeb Speech API. ICopter-Parrot ARDrone 2.0.
Siyakhumbuza: kubo bonke abafundi be "Habr" - isaphulelo se-ruble ye-10 xa ubhalisa kuyo nayiphi na ikhosi ye-Skillbox usebenzisa ikhowudi yokuphromotha "Habr".
I-Skillbox iyacebisa: Ikhosi esebenzayo
"UMqulunqi we-PRO" .
Intshayelelo
Iidrone ziyamangalisa. Ndikonwabela kakhulu ukudlala nequad yam, ukuthatha iifoto kunye neevidiyo, okanye ukonwaba nje. Kodwa iinqwelo-moya ezingenabantu (ii-UAVs) zisetyenziselwa okungakumbi kunokuzonwabisa nje. Basebenza kwi-cinema, bafunda imikhenkce, kwaye basetyenziswa ngamajoni kunye nabameli becandelo lezolimo.
Kule tutorial siza kujonga ekudaleni inkqubo eya kukuvumela ukuba ulawule idrone. usebenzisa imiyalelo yelizwi. Ewe, icopter iya kwenza le nto uyixelela ukuba iyenze. Ekupheleni kwenqaku kukho inkqubo esele yenziwe kunye nevidiyo yolawulo lwe-UAV.
Intsimbi
Sifuna oku kulandelayo:
- I-Parrot ARDrone 2.0;
- Intambo ye-Ethernet;
- imakrofoni elungileyo.
Uphuhliso nolawulo luya kuqhutywa kwiindawo zokusebenza ezineWindows/Mac/Ubuntu. Ngokomntu, ndasebenza noMac kunye no-Ubuntu 18.04.
Software
Khuphela inguqulelo yamva nje yeNode.js ukusuka
Kwakhona kufuneka
Ukuqonda icopter
Makhe sizame ukuqonda indlela iParrot ARDrone esebenza ngayo. Le copter ineenjini ezine.
Iinjini ezichasayo zisebenza kwicala elinye. Esinye isibini sijikeleza ngasekunene, esinye sijikeleza ngasekunene. Idrone ihamba ngokuguqula i-engile yokuthambekela kumphezulu womhlaba, itshintsha isantya sokujikeleza kweenjini kunye nezinye iintshukumo ezininzi ezinokulawuleka.
Njengoko sinokubona kumzobo ongasentla, ukutshintsha iiparamitha ezahlukeneyo kukhokelela kutshintsho kwindlela yokuhamba kwecopter. Ngokomzekelo, ukunciphisa okanye ukwandisa isantya sokujikeleza kwe-rotors yasekhohlo nasekunene kudala umqulu. Oku kuvumela idrone ukuba ibhabhe phambili okanye ngasemva.
Ngokutshintsha isantya kunye necala leenjini, sibeka ii-engile zokuthambeka ezivumela ukuba i-copter ihambe kwelinye icala. Ngokwenyani, kwiprojekthi yangoku akukho mfuneko yokufunda i-aerodynamics, kufuneka nje uqonde imigaqo esisiseko.
Isebenza njani iParrot ARDrone
Idrone yindawo yeWi-Fi. Ukuze ufumane kwaye uthumele imiyalelo kwi-copter, kufuneka udibanise kule ndawo. Zininzi izicelo ezahlukeneyo ezikuvumela ukuba ulawule ii-quadcopters. Yonke into ibonakala ngolu hlobo:
Ngokukhawuleza ukuba i-drone ixhunyiwe, vula i-terminal kunye ne-telnet 192.168.1.1 - le yi-IP ye-copter. KwiLinux ungasebenzisa
Uyilo lwesicelo
Ikhowudi yethu iya kwahlulwa ngokwezi modyuli zilandelayo:
- ujongano lomsebenzisi ngentetho yeAPI yokuchongwa kwelizwi;
- imiyalelo yokucoca nokuthelekisa nomgangatho;
- ukuthumela imiyalelo kwidrone;
- usasazo lwevidiyo ephilayo.
I-API isebenza nje ukuba kukho uxhumano lwe-Intanethi. Ukuqinisekisa oku, songeza uqhagamshelo lwe-Ethernet.
Lixesha lokwenza isicelo!
Ikhowudi
Okokuqala, masenze ifolda entsha kwaye sitshintshele kuyo sisebenzisa i-terminal.
Emva koko senza iprojekthi yeNode usebenzisa le miyalelo ingezantsi.
Okokuqala, sifaka ukuxhomekeka okufunekayo.
npm ukufakaβ
Siza kuxhasa le miyalelo ilandelayo:
- suka uhambe;
- ukuhla;
- phezulu - i-drone iphakama isiqingatha semitha kunye ne-hovers;
- phantsi - iwela isiqingatha semitha kunye neqhwa;
- ngakwesobunxele - ukuya kwisiqingatha semitha ukuya ngakwesobunxele;
- ngakwesokudla - iya kwisiqingatha semitha ukuya ngasekunene;
- ukujikeleza - ukujikeleza nge-clockwise 90 degrees;
- phambili - iya phambili isiqingatha semitha;
- umva - ubuyela emva kwesiqingatha semitha;
- Yeka.
Nantsi ikhowudi ekuvumela ukuba wamkele imiyalelo, uyihluze kwaye ulawule idrone.
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);
Kwaye nantsi ikhowudi yeHTML kunye neJavaScript ephulaphula umsebenzisi kwaye ithumela umyalelo kwiseva yeNode.
<!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>
Kwaye kunye nekhowudi yeJavaScript yokusebenza ngemiyalelo yelizwi, ukuyithumela kwiseva yeNode.
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'
});
};
Qalisa isicelo
Inkqubo inokuqaliswa ngolu hlobo lulandelayo (kubalulekile ukuqinisekisa ukuba i-copter ixhunyiwe kwi-Wi-Fi kunye nekhebula le-Ethernet lixhunyiwe kwikhompyutheni).
Vula i-localhost: 3000 kwisikhangeli kwaye ucofe uQala ukuQiniswa.
Sizama ukulawula idrone kwaye sonwabile.
Ukusasaza ividiyo kwidrone
Kwiprojekthi, yenza ifayile entsha kwaye ukope le khowudi apho:
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);
Kwaye nantsi ikhowudi ye-HTML, siyibeka ngaphakathi kwifolda yoluntu.
<!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>
Qalisa kwaye uqhagamshele kwi-localhost:8080 ukujonga ividiyo kwikhamera engaphambili.
Iingcebiso eziNcedo
- Bhabha le drone ngaphakathi endlwini.
- Soloko ubeka isigqubuthelo sokhuselo kwidrone yakho phambi kokuba ihambe.
- Jonga ukuba ibhetri ishajiwe na.
- Ukuba idrone iziphatha ngendlela engaqhelekanga, yibambe phantsi kwaye uyijikelezise. Esi senzo siya kubeka i-copter kwimodi yongxamiseko kwaye i-rotors iya kuyeka ngokukhawuleza.
Ikhowudi esele ilungile kunye nedemo
Yenzekile!
Ikhowudi yokubhala kwaye emva koko ukubukela umatshini uqala ukuthobela kuya kukunika uyolo! Ngoku sifumene indlela yokufundisa idrone ukumamela imiyalelo yelizwi. Ngapha koko, maninzi kakhulu amathuba anokwenzeka: ukuqondwa kobuso bomsebenzisi, iinqwelomoya ezizimeleyo, ukuqondwa komzimba kunye nokunye okuninzi.
Ungacebisa ntoni ukuphucula inkqubo?
I-Skillbox iyacebisa:
- Isicelo sekhosi ye-intanethi
"Umhlalutyi wedatha yePython" .- Ikhosi ekwi-Intanethi
"Umphuhlisi ophambili weProfessional" .- Ikhosi yonyaka osebenzayo
"Umphuhlisi we-PHP ukusuka kwi-0 ukuya kwi-PRO" .
umthombo: www.habr.com