
In diesem Tutorial werden wir die Erstellung eines Programms fĂŒr eine Drohne mit Sprachsteuerung in Node.js und dem Web Speech API untersuchen. Der Kopter ist der Parrot ARDrone 2.0.
Wir erinnern daran: alle Leser von âHabrâ erhalten einen Rabatt von 10.000 Rubel bei der Anmeldung zu einem beliebigen Kurs von Skillbox mit dem Aktionscode âHabrâ.
Skillbox empfiehlt: Praktischer Kurs .
EinfĂŒhrung
Drohnen sind faszinierend. Ich spiele sehr gerne mit meinem Kopter, mache Fotos und Videos oder habe einfach nur SpaĂ. Aber unbemannte Flugzeuge (UAV) werden nicht nur zur Unterhaltung eingesetzt. Sie finden Anwendung in der Filmindustrie, untersuchen Gletscher und werden von MilitĂ€r und Landwirtschaft genutzt.
In diesem Tutorial werden wir ein Programm entwickeln, das es ermöglicht, die Drohne mit Sprachbefehlen zu steuern. Ja, der Kopter wird das tun, was Sie ihm sagen. Am Ende des Artikels gibt es das fertige Programm und ein Video zur Steuerung des UAV.
Hardware
Wir benötigen Folgendes:
- Parrot ARDrone 2.0;
- Ethernet-Kabel;
- ein gutes Mikrofon.
Die Entwicklung und Steuerung erfolgt auf Arbeitsstationen mit Windows/Mac/Ubuntu. Ich persönlich habe mit Mac und Ubuntu 18.04 gearbeitet.
Software
Laden Sie die neueste Version von Node.js von .
Sie benötigen auch die .
Verstehen wir den Kopter
Lassen Sie uns versuchen, zu verstehen, wie der Parrot ARDrone funktioniert. Diese Drohne hat vier Motoren.

Die gegenĂŒberliegenden Motoren arbeiten in dieselbe Richtung. Ein Paar dreht sich im Uhrzeigersinn, das andere dagegen. Die Drohne bewegt sich durch Ănderung des Neigungswinkels zur ErdoberflĂ€che, Drehgeschwindigkeitsvariationen der Motoren und einige weitere manövrierbare Bewegungen.

Wie wir im obigen Diagramm sehen können, fĂŒhrt die VerĂ€nderung verschiedener Parameter zu einem Richtungswechsel des Kopters. Zum Beispiel bewirken das Verringern oder Erhöhen der Drehgeschwindigkeit des linken und rechten Rotors eine Neigung. Das ermöglicht es der Drohne, vorwĂ€rts oder rĂŒckwĂ€rts zu fliegen.
Indem wir die Geschwindigkeit und Richtung der Motoren Ă€ndern, bestimmen wir die Neigungswinkel, die es dem Kopter ermöglichen, sich in andere Richtungen zu bewegen. FĂŒr das aktuelle Projekt ist es nicht nötig, die Aerodynamik zu studieren; es reicht aus, die grundlegenden Prinzipien zu verstehen.
Wie der Parrot ARDrone funktioniert
Die Drohne fungiert als Wi-Fi-Zugangspunkt. Um Befehle an den Kopter zu senden und zu empfangen, muss man sich mit diesem Punkt verbinden. Es gibt viele verschiedene Anwendungen, mit denen man Kopter steuern kann. So sieht das Ganze ungefÀhr aus:

Sobald die Drohne verbunden ist, öffnen wir das Terminal und geben telnet 192.168.1.1 ein â das ist die IP-Adresse des Kopters. FĂŒr Linux kann man .
Architektur der Anwendung
Unser Code wird in folgende Module unterteilt:
- BenutzeroberflÀche mit Sprach-API zur Spracherkennung;
- Befehlsfilterung und Abgleich mit der Referenz;
- Befehle an die Drohne senden;
- Live-VideoĂŒbertragung.
Die API funktioniert bei bestehender Internetverbindung. Um dies sicherzustellen, fĂŒgen wir die Ethernet-Verbindung hinzu.
Es ist Zeit, die Anwendung zu erstellen!
Wir codieren
Zuerst erstellen wir einen neuen Ordner und wechseln ĂŒber das Terminal zu diesem.
Dann erstellen wir ein Node-Projekt mit den folgenden Befehlen.
Zuerst installieren wir die benötigten AbhÀngigkeiten.
npm install
Wir unterstĂŒtzen die folgenden Befehle:
- Start;
- Landung;
- nach oben â die Drohne hebt sich um einen halben Meter und schwebt;
- nach unten â sie senkt sich um einen halben Meter und schwebt;
- nach links â sie bewegt sich um einen halben Meter nach links;
- nach rechts â sie bewegt sich um einen halben Meter nach rechts;
- Drehung â sie dreht sich im Uhrzeigersinn um 90 Grad;
- nach vorne â sie bewegt sich um einen halben Meter nach vorne;
- nach hinten â sie bewegt sich um einen halben Meter nach hinten;
- Stopp.
Hier ist der Code, der es ermöglicht, Befehle entgegenzunehmen, sie zu filtern und die Drohne zu steuern.
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();
// Notfall deaktivieren
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('Befehl empfangen ', req.body);
console.log('verfĂŒgbare Befehle', commands);
let command = req.body.command.replace(/ /g,'');
if(commands.indexOf(command) !== -1) {
switch(command.toUpperCase()) {
case "TAKEOFF":
console.log('Drohnensystem wird gestartet');
drone.takeoff();
break;
case "LAND":
console.log('Drohnensystem wird gelandet');
drone.land();
break;
case "UP":
console.log('Drohnensystem wird um einen halben Meter angehoben');
drone.up(0.2);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "DOWN":
console.log('Drohnensystem wird um einen halben Meter gesenkt');
drone.down(0.2);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOLEFT":
console.log('Drohnensystem wird um 1 Meter nach links bewegt');
drone.left(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},1000);
break;
case "GORIGHT":
console.log('Drohnensystem wird um 1 Meter nach rechts bewegt');
drone.right(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},1000);
break;
case "TURN":
console.log('Drohnensystem wird gedreht');
drone.clockwise(0.4);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOFORWARD":
console.log('Drohnensystem wird um 1 Meter nach vorne bewegt');
drone.front(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOBACKWARD":
console.log('Drohnensystem wird um 1 Meter nach hinten bewegt');
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);Hier ist der HTML- und JavaScript-Code, der Benutzereingaben ĂŒberwacht und Befehle an den Node-Server sendet.
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Sprachgesteuerte Notizen-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>Sprachgesteuertes Drohne</h1>
<p class="page-description">Eine kleine App, mit der Sie eine AR-Drohne per Sprachbefehl steuern können.</p>
<h3 class="no-browser-support">Entschuldigung, Ihr Browser unterstützt die Web Speech API nicht. Versuchen Sie, diese Demo in Google Chrome zu öffnen.</h3>
<div class="app">
<h3>Geben Sie den Befehl</h3>
<div class="input-single">
<textarea id="note-textarea" placeholder="Erstellen Sie eine neue Notiz, indem Sie tippen oder die Sprachsteuerung verwenden." rows="6"></textarea>
</div>
<button id="start-record-btn" title="Aufnahme starten">Erkennung starten</button>
<button id="pause-record-btn" title="Aufnahme pausieren">Erkennung pausieren</button>
<p id="recording-instructions">Drücken Sie die <strong>Erkennung starten</strong> Taste und erlauben Sie den Zugriff.</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>Und hier ist der JavaScript-Code, um mit Sprachbefehlen zu arbeiten und sie an den Node-Server zu senden.
versuchen {
var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
var recognition = new SpeechRecognition();
}
catch(e) {
console.error(e);
$('.no-browser-support').show();
$('.app').hide();
}
// weiterer Code, bitte auf die GitHub-Quelle verweisen
recognition.onresult = function(event) {
// event ist ein SpeechRecognitionEvent-Objekt.
// Es enthÀlt alle bisher erfassten Zeilen.
// Wir benötigen nur die aktuelle.
var current = event.resultIndex;
// Holen Sie sich ein Transkript von dem, was gesagt wurde.
var transcript = event.results[current][0].transcript;
// senden Sie es an das Backend
$.ajax({
type: 'POST',
url: '\/command\/',
data: JSON.stringify({command: transcript}),
success: function(data) { console.log(data) },
contentType: "application\/json",
dataType: 'json'
});
};Starten Sie die Anwendung
Die Anwendung kann folgendermaĂen gestartet werden (wichtig, um sicherzustellen, dass die Drohne mit Wi-Fi verbunden und das Ethernet-Kabel mit dem Computer verbunden ist).
Ăffnen Sie localhost:3000 im Browser und klicken Sie auf Recognition starten.

Versuchen Sie, die Drohne zu steuern und freuen Sie sich.
VideoĂŒbertragung von der Drohne
Erstellen Sie eine neue Datei im Projekt und kopieren Sie diesen Code hinein:
const http = require("http");
const drone = require("dronestream");
const server = http.createServer(function(req, res) {
require("fs").createReadStream(__dirname + "\/public\/video.html").pipe(res);
});
drone.listen(server);
server.listen(4000);Hier ist der HTML-Code, den wir im public-Ordner platzieren.
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Stream als Modul</title>
<script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<h1 id="heading">Drohnenvideo-Stream</h1>
<div id="droneStream" style="width: 640px; height: 360px"> </div>
<script type="text/javascript" charset="utf-8">
new NodecopterStream(document.getElementById("droneStream"));
</script>
</body>
</html>Starten Sie und verbinden Sie sich mit localhost:8080, um das Video von der Frontkamera anzusehen.

NĂŒtzliche Tipps
- Steuern Sie diese Drohne im Innenbereich.
- Tragen Sie immer die Schutzabdeckung auf der Drohne vor dem Start.
- ĂberprĂŒfen Sie, ob der Akku aufgeladen ist.
- Wenn die Drohne sich seltsam verhÀlt, halten Sie sie von unten und drehen Sie sie um. Diese Aktion versetzt die Drohne in den Notfallmodus, und die Rotoren hören sofort auf.
Fertiger Code und Demonstration
Es hat geklappt!
Es macht Freude, den Code zu schreiben und dann zu beobachten, wie die Maschine anfĂ€ngt, gehorchen. Jetzt haben wir erlernt, wie man die Drohne anweist, Sprachbefehle zu befolgen. TatsĂ€chlich gibt es viel mehr Möglichkeiten: Benutzererkennung, autonome FlĂŒge, Gestenerkennung und viele mehr.
Was können Sie zur Verbesserung des Programms vorschlagen?
Skillbox empfiehlt:
- Angewandter Online-Kurs .
- Online-Kurs .
- Praktischer Jahreskurs .
Quelle: habr.com
