Drones estas mirindaj. Mi tre ŝatas ludi kun mia kvaropo, fari fotojn kaj filmetojn, aŭ simple amuziĝi. Sed senpilotaj aerveturiloj (UAV) estas uzataj por pli ol nur distro. Ili laboras en kinejo, studas glaĉerojn, kaj estas uzitaj fare de la militistaro kaj reprezentantoj de la agrikultura sektoro.
En ĉi tiu lernilo ni rigardos krei programon, kiu permesos al vi kontroli dronon. uzante voĉkomandojn. Jes, la koptero faros tion, kion vi diras al ĝi. Ĉe la fino de la artikolo estas preta programo kaj video de UAV-kontrolo.
Fero
Ni bezonas la jenon:
Papago ARDrone 2.0;
Ethernet-kablo;
bona mikrofono.
Disvolviĝo kaj administrado estos efektivigitaj sur laborstacioj kun Vindozo/Mac/Ubuntu. Persone, mi laboris kun Mac kaj Ubuntu 18.04.
Ni provu kompreni kiel funkcias Parrot ARDrone. Ĉi tiu koptero havas kvar motorojn.
Kontraŭaj motoroj funkcias en la sama direkto. Unu paro turniĝas dekstrume, la alia maldekstrume. La virabelo moviĝas ŝanĝante la angulon de deklivo rilate al la surfaco de la tero, ŝanĝante la rapidon de rotacio de la motoroj kaj plurajn aliajn manovreblajn movojn.
Kiel ni povas vidi en la supra diagramo, ŝanĝi diversajn parametrojn kondukas al ŝanĝo en la direkto de movado de la koptero. Ekzemple, malpliigi aŭ pliigi la rotacian rapidon de la maldekstraj kaj dekstraj rotoroj kreas rulon. Ĉi tio permesas al la virabelo flugi antaŭen aŭ malantaŭen.
Ŝanĝante la rapidecon kaj direkton de la motoroj, ni starigas kliniĝajn angulojn, kiuj permesas al la koptero moviĝi en aliaj direktoj. Efektive, por la nuna projekto ne necesas studi aerodinamikon, vi nur bezonas kompreni la bazajn principojn.
Kiel funkcias Parrot ARDrone
La virabelo estas Wifi-retpunkto. Por ricevi kaj sendi komandojn al la koptero, vi devas konekti al ĉi tiu punkto. Estas multaj malsamaj aplikoj, kiuj ebligas al vi kontroli kvarkopterojn. Ĉio aspektas kiel ĉi tio:
Tuj kiam la virabelo estas konektita, malfermu la terminalon kaj telnet 192.168.1.1 - ĉi tio estas la IP de la koptero. Por Linukso vi povas uzi Linukso Busybox.
Aplika arkitekturo
Nia kodo estos dividita en la jenajn modulojn:
uzantinterfaco kun parolado API por voĉa detekto;
filtri komandojn kaj kompari kun normo;
sendante komandojn al la virabelo;
viva videoelsendo.
La API funkcias tiel longe kiel ekzistas interreta konekto. Por certigi ĉi tion, ni aldonas Ethernet-konekton.
Estas tempo krei aplikaĵon!
Kodo
Unue, ni kreu novan dosierujon kaj ŝanĝu al ĝi uzante la terminalon.
Tiam ni kreas Node-projekton uzante la komandojn sube.
Unue ni instalas la postulatajn dependecojn.
npaga instali
Ni subtenos la jenajn komandojn:
ekflugo;
surteriĝo;
supren - la virabelo leviĝas duonmetron kaj ŝvebas;
down - falas duonmetron kaj frostas;
to the left - iras duonmetron maldekstren;
dekstre - iras duonmetron dekstren;
rotacio - turniĝas dekstrume 90 gradoj;
forward - iras antaŭen duonmetron;
back - reiras duonmetron;
haltu.
Jen la kodo, kiu permesas vin akcepti komandojn, filtri ilin kaj kontroli la dronon.
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);
Kaj jen la HTML kaj JavaScript-kodo, kiu aŭskultas la uzanton kaj sendas komandon al la Node-servilo.
<!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>
Kaj ankaŭ JavaScript-kodo por labori kun voĉaj komandoj, sendante ilin al la Node-servilo.
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'
});
};
Lanĉante la programon
La programo povas esti lanĉita jene (gravas certigi, ke la koptero estas konektita al Wi-Fi kaj la Ethernet-kablo estas konektita al la komputilo).
Malfermu localhost:3000 en la retumilo kaj alklaku Komenci Rekonon.
Ni provas kontroli la dronon kaj estas feliĉaj.
Dissendado de video de virabelo
En la projekto, kreu novan dosieron kaj kopiu ĉi tiun kodon tie:
Skribi kodon kaj poste rigardi la maŝinon komenci obei donos al vi plezuron! Nun ni eksciis kiel instrui dronon aŭskulti voĉajn komandojn. Fakte, estas multe pli da eblecoj: uzanta vizaĝrekono, aŭtonomaj flugoj, gestrekono kaj multe pli.