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

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster