Drony jsou úžasné. Strašně mě baví hrát si se svou čtyřkolkou, fotit a natáčet, nebo se jen tak bavit. Bezpilotní letouny (UAV) se však používají nejen k zábavě. Pracují v kině, studují ledovce a využívá je armáda a zástupci zemědělského sektoru.
V tomto tutoriálu se podíváme na vytvoření programu, který vám umožní ovládat dron. pomocí hlasových příkazů. Ano, vrtulník udělá, co mu řeknete. Na konci článku je připravený program a video ovládání UAV.
Železo
Potřebujeme následující:
Parrot ARDrone 2.0;
Ethernetový kabel;
dobrý mikrofon.
Vývoj a správa bude probíhat na pracovních stanicích s Windows/Mac/Ubuntu. Osobně jsem pracoval s Mac a Ubuntu 18.04.
Pokusme se pochopit, jak Parrot ARDrone funguje. Tato helikoptéra má čtyři motory.
Protilehlé motory pracují ve stejném směru. Jeden pár se otáčí ve směru hodinových ručiček, druhý proti směru hodinových ručiček. Dron se pohybuje změnou úhlu sklonu vzhledem k povrchu Země, změnou rychlosti otáčení motorů a několika dalšími manévrovatelnými pohyby.
Jak můžeme vidět na obrázku výše, změna různých parametrů vede ke změně směru pohybu vrtulníku. Například snížením nebo zvýšením rychlosti otáčení levého a pravého rotoru se vytvoří role. To umožňuje dronu létat dopředu nebo dozadu.
Změnou rychlosti a směru motorů nastavujeme úhly náklonu, které umožňují pohyb vrtulníku v jiných směrech. Ve skutečnosti pro současný projekt není třeba studovat aerodynamiku, stačí pochopit základní principy.
Jak Parrot ARDrone funguje
Dron je Wi-Fi hotspot. Abyste mohli vrtulníku přijímat a odesílat příkazy, musíte se k tomuto bodu připojit. Existuje mnoho různých aplikací, které umožňují ovládat kvadrokoptéry. Všechno to vypadá nějak takto:
Jakmile se dron připojí, otevřete terminál a telnet 192.168.1.1 – to je IP helikoptéry. Pro Linux můžete použít Linux Busybox.
Architektura aplikace
Náš kód bude rozdělen do následujících modulů:
uživatelské rozhraní s API řeči pro detekci hlasu;
filtrování příkazů a porovnávání se standardem;
odesílání příkazů do dronu;
živé video vysílání.
Rozhraní API funguje, dokud existuje připojení k internetu. Abychom to zajistili, přidáváme ethernetové připojení.
Je čas vytvořit aplikaci!
Kód
Nejprve si vytvořte novou složku a přepněte se do ní pomocí terminálu.
Poté pomocí níže uvedených příkazů vytvoříme projekt Node.
Nejprve nainstalujeme požadované závislosti.
npm install
Budeme podporovat následující příkazy:
vzlétnout;
přistání;
nahoru - dron se zvedne o půl metru a vznáší se;
dolů - spadne půl metru a zamrzne;
doleva - jde půl metru doleva;
doprava - jde půl metru doprava;
rotace - otáčí se ve směru hodinových ručiček o 90 stupňů;
vpřed - jde vpřed o půl metru;
zpět - vrátí se o půl metru;
zastavit
Zde je kód, který vám umožní přijímat příkazy, filtrovat je a ovládat 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);
A zde je kód HTML a JavaScript, který naslouchá uživateli a odesílá příkaz serveru 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>
A také kód JavaScript pro práci s hlasovými příkazy a jejich odesílání na server 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'
});
};
Spusťte aplikaci
Program lze spustit následovně (je důležité se ujistit, že je koptér připojen k Wi-Fi a ethernetový kabel připojen k počítači).
Otevřete localhost:3000 v prohlížeči a klikněte na Spustit rozpoznávání.
Snažíme se ovládat dron a jsme šťastní.
Vysílání videa z dronu
V projektu vytvořte nový soubor a zkopírujte tam tento kód:
Psaní kódu a sledování, jak stroj začne poslouchat, vám udělá radost! Nyní jsme přišli na to, jak naučit dron poslouchat hlasové příkazy. Ve skutečnosti existuje mnohem více možností: rozpoznávání obličeje uživatele, autonomní lety, rozpoznávání gest a mnoho dalšího.