Dronai yra nuostabūs. Man labai patinka žaisti su savo keturkoju, fotografuoti ir filmuoti ar tiesiog smagiai leisti laiką. Tačiau nepilotuojami orlaiviai (UAV) naudojami ne tik pramogoms. Jie dirba kine, studijuoja ledynus, juos naudoja kariškiai ir žemės ūkio sektoriaus atstovai.
Šioje pamokoje apžvelgsime, kaip sukurti programą, kuri leis valdyti droną. naudojant balso komandas. Taip, kopteris padarys tai, ką jam liepsite. Straipsnio pabaigoje yra paruošta UAV valdymo programa ir vaizdo įrašas.
geležies
Mums reikia šių dalykų:
Parrot ARDrone 2.0;
Ethernet kabelis;
geras mikrofonas.
Kūrimas ir valdymas bus vykdomas darbo vietose su Windows/Mac/Ubuntu. Asmeniškai aš dirbau su Mac ir Ubuntu 18.04.
Pabandykime suprasti, kaip veikia Parrot ARDrone. Šis kopteris turi keturis variklius.
Priešingi varikliai veikia ta pačia kryptimi. Viena pora sukasi pagal laikrodžio rodyklę, kita prieš laikrodžio rodyklę. Dronas juda keičiant polinkio kampą žemės paviršiaus atžvilgiu, keičiant variklių sukimosi greitį ir keletą kitų manevringų judesių.
Kaip matome aukščiau esančioje diagramoje, keičiant įvairius parametrus, pasikeičia kopterio judėjimo kryptis. Pavyzdžiui, sumažinus arba padidinus kairiojo ir dešiniojo rotoriaus sukimosi greitį, susidaro ritinys. Tai leidžia dronui skristi pirmyn arba atgal.
Keisdami variklių greitį ir kryptį nustatome pasvirimo kampus, kurie leidžia kopteriui judėti kitomis kryptimis. Tiesą sakant, dabartiniam projektui nereikia studijuoti aerodinamikos, tereikia suprasti pagrindinius principus.
Kaip veikia Parrot ARDrone
Dronas yra „Wi-Fi“ viešosios interneto prieigos taškas. Norėdami gauti ir siųsti komandas kopteriui, turite prisijungti prie šio taško. Yra daug įvairių programų, kurios leidžia valdyti keturkoperius. Viskas atrodo maždaug taip:
Kai tik dronas bus prijungtas, atidarykite terminalą ir telnet 192.168.1.1 - tai yra kopterio IP. „Linux“ galite naudoti Linux Busybox.
Programos architektūra
Mūsų kodas bus padalintas į šiuos modulius:
vartotojo sąsaja su kalbos API balso aptikimui;
filtravimo komandas ir lyginimas su standartu;
komandų siuntimas dronui;
tiesioginė vaizdo transliacija.
API veikia tol, kol yra interneto ryšys. Norėdami tai užtikrinti, pridedame Ethernet ryšį.
Atėjo laikas sukurti programą!
Kodas
Pirmiausia sukurkime naują aplanką ir perjunkite į jį naudodami terminalą.
Tada mes sukuriame mazgo projektą naudodami toliau pateiktas komandas.
Pirmiausia įdiegiame reikiamas priklausomybes.
npm įdiegti
Mes palaikysime šias komandas:
kilimas;
nusileidimas;
į viršų – dronas pakyla pusę metro ir pakyla;
žemyn - nukrenta pusę metro ir sustingsta;
į kairę - eina pusę metro į kairę;
į dešinę - eina pusę metro į dešinę;
pasukimas - sukasi pagal laikrodžio rodyklę 90 laipsnių;
į priekį - eina į priekį pusę metro;
atgal - grįžta pusę metro;
sustabdyti.
Čia yra kodas, leidžiantis priimti komandas, jas filtruoti ir valdyti droną.
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);
O štai HTML ir JavaScript kodas, kuris klauso vartotojo ir siunčia komandą į Node serverį.
<!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>
Taip pat JavaScript kodas, skirtas dirbti su balso komandomis, siunčiant jas į Node serverį.
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'
});
};
Programos paleidimas
Programą galima paleisti taip (svarbu įsitikinti, kad kopteris yra prijungtas prie Wi-Fi, o Ethernet laidas prijungtas prie kompiuterio).
Naršyklėje atidarykite localhost:3000 ir spustelėkite Pradėti atpažinimą.
Stengiamės suvaldyti droną ir džiaugiamės.
Vaizdo įrašų transliacija iš drono
Projekte sukurkite naują failą ir nukopijuokite šį kodą:
Rašydami kodą ir tada stebėdami, kaip aparatas pradeda paklusti, suteiks jums malonumą! Dabar mes sugalvojome, kaip išmokyti droną klausytis balso komandų. Tiesą sakant, yra daug daugiau galimybių: vartotojo veido atpažinimas, autonominiai skrydžiai, gestų atpažinimas ir daug daugiau.