Tunapanga udhibiti wa sauti wa copter kwa kutumia Node.js na ARDrone
Katika somo hili tutaangalia kuunda programu ya drone yenye udhibiti wa sauti kwa kutumia Node.js na API ya hotuba ya Wavuti. Copter - Parrot ARDrone 2.0.
Tunakukumbusha:kwa wasomaji wote wa "Habr" - punguzo la rubles 10 wakati wa kujiandikisha katika kozi yoyote ya Skillbox kwa kutumia msimbo wa uendelezaji wa "Habr".
Drones ni ajabu. Ninafurahia sana kucheza na quad yangu, kupiga picha na video, au kufurahiya tu. Lakini magari ya angani yasiyo na rubani (UAVs) hutumiwa kwa zaidi ya burudani tu. Wanafanya kazi katika sinema, wanasoma barafu, na hutumiwa na wanajeshi na wawakilishi wa sekta ya kilimo.
Katika somo hili tutaangalia kuunda programu ambayo itawawezesha kudhibiti drone. kwa kutumia amri za sauti. Ndiyo, copter itafanya kile unachoiambia ifanye. Mwishoni mwa kifungu kuna programu iliyotengenezwa tayari na video ya udhibiti wa UAV.
Iron
Tunahitaji yafuatayo:
Parrot ARDrone 2.0;
Cable ya Ethernet;
kipaza sauti nzuri.
Maendeleo na usimamizi utafanywa kwenye vituo vya kazi na Windows/Mac/Ubuntu. Binafsi, nilifanya kazi na Mac na Ubuntu 18.04.
Programu
Pakua toleo jipya zaidi la Node.js kutoka tovuti rasmi.
Hebu jaribu kuelewa jinsi Parrot ARDrone inavyofanya kazi. Copter hii ina motors nne.
Motors kupinga kazi katika mwelekeo huo. Jozi moja huzunguka saa, nyingine kinyume cha saa. Drone husogea kwa kubadilisha angle ya mwelekeo kuhusiana na uso wa dunia, kubadilisha kasi ya mzunguko wa motors na harakati zingine kadhaa zinazoweza kusongeshwa.
Kama tunavyoona kwenye mchoro hapo juu, kubadilisha vigezo mbalimbali husababisha mabadiliko katika mwelekeo wa harakati ya copter. Kwa mfano, kupunguza au kuongeza kasi ya mzunguko wa rotors ya kushoto na ya kulia huunda roll. Hii inaruhusu drone kuruka mbele au nyuma.
Kwa kubadilisha kasi na mwelekeo wa motors, tunaweka pembe za tilt ambazo huruhusu copter kuhamia kwa njia nyingine. Kweli, kwa mradi wa sasa hakuna haja ya kujifunza aerodynamics, unahitaji tu kuelewa kanuni za msingi.
Jinsi Parrot ARDrone inavyofanya kazi
Drone ni mtandao-hewa wa Wi-Fi. Ili kupokea na kutuma amri kwa copter, unahitaji kuunganisha kwenye hatua hii. Kuna programu nyingi tofauti zinazokuwezesha kudhibiti quadcopters. Yote inaonekana kama hii:
Mara tu drone inapounganishwa, fungua terminal na telnet 192.168.1.1 - hii ni IP ya copter. Kwa Linux unaweza kutumia Linux Busybox.
Usanifu wa maombi
Nambari yetu itagawanywa katika moduli zifuatazo:
interface ya mtumiaji na API ya hotuba ya kutambua sauti;
kuchuja amri na kulinganisha na kiwango;
kutuma amri kwa drone;
matangazo ya moja kwa moja ya video.
API inafanya kazi mradi tu kuna muunganisho wa Mtandao. Ili kuhakikisha hili, tunaongeza muunganisho wa Ethaneti.
Ni wakati wa kuunda programu!
Kanuni
Kwanza, hebu tuunde folda mpya na tubadilishe kwa kutumia terminal.
Kisha tunaunda mradi wa Node kwa kutumia amri hapa chini.
Kwanza, tunaweka tegemezi zinazohitajika.
npm kufungaβ
Tutaunga mkono amri zifuatazo:
ondoka;
kutua;
juu - drone hupanda nusu ya mita na hovers;
chini - huanguka nusu ya mita na kufungia;
upande wa kushoto - huenda nusu ya mita kwenda kushoto;
kwa kulia - huenda nusu ya mita kwenda kulia;
mzunguko - huzunguka saa 90 digrii;
mbele - inakwenda mbele nusu ya mita;
nyuma - inarudi nusu ya mita;
acha.
Hapa kuna nambari inayokuruhusu kukubali amri, kuchuja na kudhibiti drone.
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);
Na hapa kuna nambari ya HTML na JavaScript ambayo inasikiza mtumiaji na kutuma amri kwa seva ya Node.
<!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>
Na pia msimbo wa JavaScript kufanya kazi na amri za sauti, kuzituma kwa seva ya Node.
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'
});
};
Kuzindua maombi
Programu inaweza kuzinduliwa kama ifuatavyo (ni muhimu kuhakikisha kuwa copter imeunganishwa kwenye Wi-Fi na cable ya Ethernet imeunganishwa kwenye kompyuta).
Fungua localhost:3000 kwenye kivinjari na ubofye Anza Utambuzi.
Tunajaribu kudhibiti drone na tunafurahi.
Inatangaza video kutoka kwa ndege isiyo na rubani
Katika mradi, unda faili mpya na unakili nambari hii hapo:
Nambari ya kuandika na kutazama mashine ikianza kutii itakupa raha! Sasa tumegundua jinsi ya kufundisha drone kusikiliza amri za sauti. Kwa kweli, kuna uwezekano mkubwa zaidi: utambuzi wa uso wa mtumiaji, ndege za uhuru, utambuzi wa ishara na mengi zaidi.