Wir programmieren die Sprachsteuerung des Drohnen mit Node.js und ARDrone.

Wir programmieren die Sprachsteuerung des Drohnen mit Node.js und ARDrone.

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 „Mobiler Entwickler PRO“.

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 der offiziellen Website.

Sie benötigen auch die aktuellste Version von Google Chrome..

Verstehen wir den Kopter

Lassen Sie uns versuchen, zu verstehen, wie der Parrot ARDrone funktioniert. Diese Drohne hat vier Motoren.

Wir programmieren die Sprachsteuerung des Drohnen mit Node.js und ARDrone.

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.

Wir programmieren die Sprachsteuerung des Drohnen mit Node.js und ARDrone.

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:

Wir programmieren die Sprachsteuerung des Drohnen mit Node.js und ARDrone.

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 Linux Busybox.

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.

Wir programmieren die Sprachsteuerung des Drohnen mit Node.js und ARDrone.

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.

Wir programmieren die Sprachsteuerung des Drohnen mit Node.js und ARDrone.

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

LIVE DEMO

HERUNTERLADEN

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:

Quelle: habr.com

60GB SSD 8Gb DDR4