Glasovno upravljanje helikopterja programiramo z uporabo Node.js in ARDrone
V tej vadnici si bomo ogledali ustvarjanje programa za brezpilotno letalo z glasovnim upravljanjem z uporabo Node.js in spletnega govornega API-ja. Copter - Parrot ARDrone 2.0.
Spomnimo:za vse bralce "Habr" - popust v višini 10 rubljev ob vpisu v kateri koli tečaj Skillbox s promocijsko kodo "Habr".
Droni so neverjetni. Zelo rad se igram s svojim štirikolesnikom, fotografiram in snemam videoposnetke ali se samo zabavam. Toda brezpilotna letala (UAV) se uporabljajo za več kot le zabavo. Delajo v kinu, preučujejo ledenike, uporabljajo jih vojska in predstavniki kmetijskega sektorja.
V tej vadnici si bomo ogledali ustvarjanje programa, ki vam bo omogočil nadzor drona. uporabo glasovnih ukazov. Da, helikopter bo naredil, kar mu boste naročili. Na koncu članka je že pripravljen program in video nadzora UAV.
Železo
Potrebujemo naslednje:
Parrot ARDrone 2.0;
Ethernet kabel;
dober mikrofon.
Razvoj in upravljanje bosta potekala na delovnih postajah z Windows/Mac/Ubuntu. Osebno sem delal z Mac in Ubuntu 18.04.
Poskusimo razumeti, kako deluje Parrot ARDrone. Ta helikopter ima štiri motorje.
Nasprotni motorji delujejo v isto smer. En par se vrti v smeri urinega kazalca, drugi v nasprotni smeri urinega kazalca. Dron se premika s spreminjanjem kota naklona glede na površino zemlje, spreminjanjem hitrosti vrtenja motorjev in številnimi drugimi manevrskimi gibi.
Kot lahko vidimo na zgornjem diagramu, spreminjanje različnih parametrov povzroči spremembo smeri gibanja helikopterja. Na primer, zmanjševanje ali povečanje hitrosti vrtenja levega in desnega rotorja ustvari zvitek. To omogoča, da dron leti naprej ali nazaj.
S spreminjanjem hitrosti in smeri motorjev nastavimo nagibne kote, ki omogočajo premikanje helikopterja v druge smeri. Pravzaprav za trenutni projekt ni potrebe po študiju aerodinamike, le razumeti morate osnovna načela.
Kako deluje Parrot ARDrone
Dron je dostopna točka Wi-Fi. Če želite sprejemati in pošiljati ukaze helikopterju, se morate povezati s to točko. Obstaja veliko različnih aplikacij, ki omogočajo upravljanje kvadrokopterjev. Vse skupaj izgleda nekako takole:
Takoj, ko je dron povezan, odprite terminal in telnet 192.168.1.1 - to je IP helikopterja. Za Linux lahko uporabite Linux Busybox.
Arhitektura aplikacije
Naša koda bo razdeljena na naslednje module:
uporabniški vmesnik z govornim API-jem za zaznavanje glasu;
filtriranje ukazov in primerjava s standardom;
pošiljanje ukazov dronu;
video prenos v živo.
API deluje, dokler obstaja internetna povezava. Da bi to zagotovili, dodamo povezavo Ethernet.
Čas je, da ustvarite aplikacijo!
Koda
Najprej ustvarimo novo mapo in preklopimo vanjo s terminalom.
Nato z uporabo spodnjih ukazov ustvarimo projekt Node.
Najprej namestimo zahtevane odvisnosti.
namestite npm
Podpirali bomo naslednje ukaze:
vzlet;
pristanek;
navzgor - dron se dvigne pol metra in lebdi;
navzdol - pade pol metra in zamrzne;
v levo - gre pol metra v levo;
v desno - gre pol metra v desno;
vrtenje - vrti se v smeri urinega kazalca za 90 stopinj;
naprej - gre naprej pol metra;
nazaj - gre nazaj pol metra;
stop.
Tukaj je koda, ki vam omogoča sprejemanje ukazov, njihovo filtriranje in nadzor drona.
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);
In tukaj je koda HTML in JavaScript, ki posluša uporabnika in pošlje ukaz strežniku 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>
In tudi kodo JavaScript za delo z glasovnimi ukazi, ki jih pošilja strežniku 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'
});
};
Zaženite aplikacijo
Program lahko zaženete na naslednji način (pomembno je, da se prepričate, da je helikopter povezan z Wi-Fi in da je ethernetni kabel povezan z računalnikom).
V brskalniku odprite localhost:3000 in kliknite Začni prepoznavanje.
Poskušamo obvladati dron in smo srečni.
Oddajanje videa iz drona
V projektu ustvarite novo datoteko in tja kopirajte to kodo:
Pisanje kode in nato opazovanje, kako stroj začne ubogati, vam bo v veselje! Zdaj smo ugotovili, kako dron naučiti poslušati glasovne ukaze. Pravzaprav je možnosti veliko več: prepoznavanje obraza uporabnika, avtonomni leti, prepoznavanje kretenj in še veliko več.