Vi programmerar röststyrning av coptern med Node.js och ARDrone
I den här handledningen kommer vi att titta på att skapa ett program för en drönare med röststyrning med hjälp av Node.js och Web Speech API. Copter - Parrot ARDrone 2.0.
Påminnelse:för alla läsare av "Habr" - en rabatt på 10 000 rubel när du anmäler dig till någon Skillbox-kurs med hjälp av "Habr"-kampanjkoden.
Drönare är fantastiska. Jag gillar verkligen att leka med min fyrhjuling, ta foton och filma eller bara ha kul. Men obemannade flygfarkoster (UAV) används för mer än bara underhållning. De arbetar på bio, studerar glaciärer och används av militären och representanter för jordbrukssektorn.
I den här handledningen kommer vi att titta på att skapa ett program som låter dig styra en drönare. med hjälp av röstkommandon. Ja, coptern kommer att göra vad du säger åt den att göra. I slutet av artikeln finns ett färdigt program och video av UAV-kontroll.
järn
Vi behöver följande:
Parrot ARDrone 2.0;
Ethernet-kabel;
bra mikrofon.
Utveckling och hantering kommer att utföras på arbetsstationer med Windows/Mac/Ubuntu. Personligen arbetade jag med Mac och Ubuntu 18.04.
Mjukvara
Ladda ner den senaste versionen av Node.js från officiell plats.
Låt oss försöka förstå hur Parrot ARDrone fungerar. Denna copter har fyra motorer.
Motsatta motorer arbetar i samma riktning. Ett par roterar medurs, det andra moturs. Drönaren rör sig genom att ändra lutningsvinkeln i förhållande till jordens yta, ändra motorernas rotationshastighet och flera andra manövrerbara rörelser.
Som vi kan se i diagrammet ovan leder ändring av olika parametrar till en förändring i rörelseriktningen för coptern. Till exempel, minskning eller ökning av rotationshastigheten för vänster och höger rotor skapar en rulle. Detta gör att drönaren kan flyga framåt eller bakåt.
Genom att ändra hastigheten och riktningen på motorerna ställer vi in tiltvinklar som gör att coptern kan röra sig i andra riktningar. För det aktuella projektet finns det faktiskt inget behov av att studera aerodynamik, du behöver bara förstå de grundläggande principerna.
Hur Parrot ARDrone fungerar
Drönaren är en Wi-Fi-hotspot. För att ta emot och skicka kommandon till coptern måste du ansluta till denna punkt. Det finns många olika applikationer som låter dig styra quadcoptrar. Det hela ser ut ungefär så här:
Så snart drönaren är ansluten öppnar du terminalen och telnet 192.168.1.1 - detta är copterns IP. För Linux kan du använda Linux Busybox.
Applikationsarkitektur
Vår kod kommer att delas in i följande moduler:
användargränssnitt med tal-API för röstdetektering;
filtrera kommandon och jämföra med en standard;
skicka kommandon till drönaren;
livesändning av video.
API:et fungerar så länge det finns en internetanslutning. För att säkerställa detta lägger vi till en Ethernet-anslutning.
Det är dags att skapa en ansökan!
Koda
Låt oss först skapa en ny mapp och byta till den med terminalen.
Sedan skapar vi ett nodprojekt med hjälp av kommandona nedan.
Först installerar vi de nödvändiga beroenden.
npm installera
Vi kommer att stödja följande kommandon:
ta av;
landning;
upp - drönaren stiger en halv meter och svävar;
ner - faller en halv meter och fryser;
till vänster - går en halv meter till vänster;
till höger - går en halv meter till höger;
rotation - roterar medurs 90 grader;
framåt - går framåt en halv meter;
tillbaka - går tillbaka en halv meter;
sluta.
Här är koden som låter dig acceptera kommandon, filtrera dem och styra drönaren.
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);
Och här är HTML- och JavaScript-koden som lyssnar på användaren och skickar ett kommando till Node-servern.
<!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>
Och även JavaScript-kod för att fungera med röstkommandon, skicka dem till Node-servern.
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'
});
};
Starta applikationen
Programmet kan startas enligt följande (det är viktigt att se till att coptern är ansluten till Wi-Fi och att Ethernet-kabeln är ansluten till datorn).
Öppna localhost:3000 i webbläsaren och klicka på Starta igenkänning.
Vi försöker kontrollera drönaren och är nöjda.
Sänder video från en drönare
Skapa en ny fil i projektet och kopiera denna kod dit:
Att skriva kod och sedan se maskinen börja lyda kommer att ge dig nöje! Nu har vi kommit på hur man lär en drönare att lyssna på röstkommandon. Faktum är att det finns mycket fler möjligheter: användarens ansiktsigenkänning, autonoma flygningar, gestigenkänning och mycket mer.