Nou pwograme kontwòl vwa nan copter la lè l sèvi avèk Node.js ak ARDrone
Nan leson patikilye sa a nou pral gade nan kreye yon pwogram pou yon abèy ak kontwòl vwa lè l sèvi avèk Node.js ak API lapawòl entènèt. Copter - Parrot ARDrone 2.0.
Nou raple:pou tout lektè "Habr" - yon rabè nan 10 rubles lè w ap enskri nan nenpòt kou Skillbox lè l sèvi avèk kòd pwomosyon "Habr".
Drones yo etonan. Mwen vrèman renmen jwe ak kwadwilatè mwen an, pran foto ak videyo, oswa jis pran plezi. Men, machin ayeryen san ekipe (UAV) yo itilize pou plis pase jis amizman. Yo travay nan sinema, etidye glasye, epi militè yo ak reprezantan sektè agrikòl yo itilize yo.
Nan leson patikilye sa a nou pral gade nan kreye yon pwogram ki pral pèmèt ou kontwole yon abèy. lè l sèvi avèk kòmandman vwa. Wi, copter a pral fè sa ou di li fè. Nan fen atik la gen yon pwogram pare ak videyo sou kontwòl UAV.
Iron
Nou bezwen sa ki annapre yo:
Jako ARDrone 2.0;
Ethernet kab;
bon mikwofòn.
Devlopman ak jesyon yo pral fèt sou estasyon travay ak Windows/Mac/Ubuntu. Pèsonèlman, mwen te travay ak Mac ak Ubuntu 18.04.
Ann eseye konprann ki jan Parrot ARDrone travay. copter sa a gen kat motè.
Motè opoze yo travay nan menm direksyon an. Yon pè vire nan direksyon goch, lòt la nan sens goch. Abèy la deplase pa chanje ang enklinasyon an parapò ak sifas tè a, chanje vitès wotasyon motè yo ak plizyè lòt mouvman manyabl.
Kòm nou ka wè nan dyagram ki anwo a, chanje divès paramèt mennen nan yon chanjman nan direksyon mouvman copter la. Pou egzanp, diminye oswa ogmante vitès wotasyon rotor gòch ak dwa kreye yon woulo liv. Sa a pèmèt abèy la vole pi devan oswa dèyè.
Lè nou chanje vitès la ak direksyon motè yo, nou mete ang enklinezon ki pèmèt copter la deplase nan lòt direksyon. Aktyèlman, pou pwojè aktyèl la pa gen okenn bezwen etidye aerodinamik, ou jis bezwen konprann prensip debaz yo.
Ki jan Parrot ARDrone travay
Abèy la se yon otspot Wi-Fi. Yo nan lòd yo resevwa epi voye kòmandman nan copter a, ou bezwen konekte nan pwen sa a. Gen anpil aplikasyon diferan ki pèmèt ou kontwole quadcopters. Li tout sanble yon bagay tankou sa a:
Le pli vit ke abèy la konekte, louvri tèminal la ak telnet 192.168.1.1 - sa a se IP copter la. Pou Linux ou ka itilize Linux Busybox.
Achitekti aplikasyon
Kòd nou an pral divize an modil sa yo:
koòdone itilizatè ak API lapawòl pou deteksyon vwa;
kòmandman filtraj ak konpare ak yon estanda;
voye kòmandman abèy la;
emisyon videyo an dirèk.
API a travay osi lontan ke gen yon koneksyon entènèt. Pou asire sa, nou ajoute yon koneksyon Ethernet.
Li lè yo kreye yon aplikasyon!
Kòd
Premyèman, ann kreye yon nouvo katab epi chanje nan li lè l sèvi avèk tèminal la.
Lè sa a, nou kreye yon pwojè Node lè l sèvi avèk kòmandman ki anba yo.
Premyèman, nou enstale depandans ki nesesè yo.
npm enstale
Nou pral sipòte kòmandman sa yo:
dekole;
aterisaj;
moute - abèy la leve mwatye yon mèt ak plane;
desann - tonbe mwatye yon mèt ak jele;
gòch - ale mwatye yon mèt sou bò gòch la;
sou bò dwat la - ale mwatye yon mèt sou bò dwat la;
wotasyon - wotasyon nan sens goch 90 degre;
pi devan - ale pi devan mwatye yon mèt;
tounen - ale tounen mwatye yon mèt;
sispann.
Isit la se kòd la ki pèmèt ou aksepte kòmandman, filtre yo ak kontwole abèy la.
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);
Ak isit la se HTML ak JavaScript kòd ki koute itilizatè a epi voye yon lòd nan sèvè a 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>
Epi tou kòd JavaScript pou travay ak kòmandman vwa, voye yo nan sèvè a 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'
});
};
Lanse aplikasyon an
Pwogram nan ka lanse jan sa a (li enpòtan asire w ke copter a konekte ak Wi-Fi ak kab Ethernet la konekte ak òdinatè a).
Louvri localhost:3000 nan navigatè a epi klike sou Kòmanse rekonesans.
Nou eseye kontwole abèy la epi yo kontan.
Difize videyo ki soti nan yon abèy
Nan pwojè a, kreye yon nouvo dosye epi kopye kòd sa a la:
Ekri kòd ak Lè sa a, gade machin nan kòmanse obeyi pral ba ou plezi! Koulye a, nou te kalkile ki jan yo anseye yon abèy koute kòmandman vwa. An reyalite, gen plis posiblite: rekonesans vizaj itilizatè, vòl otonòm, rekonesans jès ak plis ankò.