Programmieren Sie die Sprachsteuerung für Drohnen mit Node.js und ARDrone

Programmieren Sie die Sprachsteuerung für Drohnen mit Node.js und ARDrone

In diesem Tutorial werden wir ein Programm für eine Drohne mit Sprachsteuerung in Node.js und der Web Speech API erstellen. Die Drohne ist das Modell 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 „Mobile Entwickler PRO“.

Einführung

Drohnen sind faszinierend. Ich liebe es, mit meiner Drohne zu spielen, Fotos und Videos aufzunehmen oder einfach nur Spaß zu haben. Aber unbemannte Flugzeuge (UAVs) werden nicht nur zur Unterhaltung verwendet. Sie finden auch Anwendung in der Filmindustrie, bei der Untersuchung von Gletschern sowie im Militär- und Landwirtschaftsbereich.

In diesem Tutorial werden wir ein Programm erstellen, das es ermöglicht, die Drohne mit Sprachbefehlen zu steuern. Ja, die Drohne wird das tun, was Sie ihr sagen. Am Ende des Artikels finden Sie das fertige Programm und ein Video zur Steuerung des UAV.

Hardware

Wir brauchen Folgendes:

  • Parrot ARDrone 2.0;
  • Ethernet-Kabel;
  • ein gutes Mikrofon.

Die Entwicklung und Steuerung wird auf Arbeitsstationen mit Windows/Mac/Ubuntu erfolgen. Ich persönlich habe mit Mac und Ubuntu 18.04 gearbeitet.

Software

Laden Sie die neueste Version von Node.js von der offiziellen Webseite.

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

Lernen wir die Drohne kennen.

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

Programmieren Sie die Sprachsteuerung für Drohnen mit Node.js und ARDrone

Die opposing Motoren arbeiten in eine Richtung. Ein Paar dreht sich im Uhrzeigersinn, das andere dagegen. Der Drohne wird durch das Ändern des Neigungswinkels zur Erdoberfläche, der Veränderung der Drehgeschwindigkeit der Motoren und weiteren manövrierfähigen Bewegungen Bewegung ermöglicht.

Programmieren Sie die Sprachsteuerung für Drohnen mit Node.js und ARDrone

Wie in dem obigen Diagramm zu sehen, führt die Änderung verschiedener Parameter zu einer Änderung der Flugrichtung des Kopters. Zum Beispiel erzeugt eine Verringerung oder Erhöhung der Drehgeschwindigkeit der linken und rechten Rotoren eine Neigung. Dies ermöglicht es der Drohne, vorwärts oder rückwärts zu fliegen.

Durch die Änderung der Geschwindigkeit und Richtung der Motoren bestimmen wir die Neigungswinkel, die es dem Kopter ermöglichen, sich in andere Richtungen zu bewegen. Für das aktuelle Projekt ist es nicht notwendig, die Aerodynamik zu studieren; es genügt, die grundlegenden Prinzipien zu verstehen.

Wie funktioniert der Parrot ARDrone?

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, die das Steuern von Koptern ermöglichen. So sieht das ungefähr aus:

Programmieren Sie die Sprachsteuerung für Drohnen mit Node.js und ARDrone

Sobald die Drohne verbunden ist, öffnen wir das Terminal und geben telnet 192.168.1.1 ein – dies ist die IP-Adresse der Drohne. Für Linux kann man verwenden Linux Busybox.

Anwendungsarchitektur

Unser Code wird in die folgenden Module unterteilt:

  • Benutzeroberfläche mit Sprach-API zur Spracherkennung;
  • Befehlsfilterung und Abgleich mit dem Standard;
  • Befehle an die Drohne senden;
  • Live-Videoübertragung.

Die API funktioniert, wenn eine Internetverbindung vorhanden ist. Um diese sicherzustellen, fügen wir die Ethernet-Verbindung hinzu.

Es ist Zeit, die Anwendung zu erstellen!

Programmieren wir

Zunächst erstellen wir einen neuen Ordner und wechseln mithilfe des Terminals zu diesem.

Dann erstellen wir ein Node-Projekt mit den folgenden Befehlen.

Zuerst installieren wir die erforderlichen Abhängigkeiten.

npm install 

Wir werden die folgenden Befehle unterstützen:

  • Start;
  • Landung;
  • Hoch – die Drohne steigt einen halben Meter auf und schwebt dort;
  • Runter – sie sinkt einen halben Meter und schwebt dort;
  • Links – sie bewegt sich einen halben Meter nach links;
  • Rechts – sie bewegt sich einen halben Meter nach rechts;
  • Drehung – sie dreht sich im Uhrzeigersinn um 90 Grad;
  • Vorwärts – sie bewegt sich einen halben Meter vorwärts;
  • Rückwärts – sie bewegt sich einen halben Meter rückwärts;
  • Stop.

Hier ist der Code, der es ermöglicht, Befehle zu empfangen, 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('vorhandene Befehle', commands);
    let command = req.body.command.replace(/ /g,'');
    if(commands.indexOf(command) !== -1) {
        switch(command.toUpperCase()) {
            case "TAKEOFF":
                console.log('Drohne startet');
                drone.takeoff();
            break;
            case "LAND":
                console.log('Drohne landet');
                drone.land();
            break;
            case "UP":
                console.log('Drohne hebt sich um einen halben Meter');
                drone.up(0.2);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "DOWN":
                console.log('Drohne senkt sich um einen halben Meter');
                drone.down(0.2);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOLEFT":
                console.log('Drohne fährt nach links um 1 Meter');
                drone.left(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },1000);
            break;
            case "GORIGHT":
                console.log('Drohne fährt nach rechts um 1 Meter');
                drone.right(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },1000);
            break;
            case "TURN":
                console.log('Drohne dreht');
                drone.clockwise(0.4);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOFORWARD":
                console.log('Drohne bewegt sich um 1 Meter nach vorne');
                drone.front(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOBACKWARD":
                console.log('Drohne bewegt sich um 1 Meter zurück');
                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 auf Benutzer hört und einen Befehl 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 Drone</h1>
            <p class="page-description">Eine kleine App, mit der Sie die AR-Drohne per Sprache 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 Spracherkennung 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, der mit Sprachbefehlen arbeitet und diese an den Node-Server sendet.

try {
 var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
 var recognition = new SpeechRecognition();
 }
 catch(e) {
 console.error(e);
 $('.no-browser-support').show();
 $('.app').hide();
 }
// anderer Code, siehe GitHub-Quellcode
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;
// sendet 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 wie folgt gestartet werden (es ist wichtig, sicherzustellen, dass die Drohne mit Wi-Fi verbunden ist und das Ethernet-Kabel mit dem Computer verbunden ist).

Öffnen Sie localhost:3000 im Browser und klicken Sie auf Start Recognition.

Programmieren Sie die Sprachsteuerung für Drohnen mit Node.js und ARDrone

Versuchen Sie, die Drohne zu steuern, und freuen Sie sich.

Videoübertragung von der Drohne

Erstellen Sie im Projekt eine neue Datei und kopieren Sie diesen Code dort 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 Ordner public ablegen.

<!doctype html>
 <html>
 <head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8">
 <title>Modulstream</title>
 <script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
 </head>
 <body>
 <h1 id="heading">Drohnen-Videostream</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.

Programmieren Sie die Sprachsteuerung für Drohnen mit Node.js und ARDrone

Nützliche Tipps

  • Steuern Sie diesen Drohnen im Innenbereich.
  • Tragen Sie immer eine Schutzhaube auf der Drohne, bevor Sie starten.
  • Überprüfen Sie, ob der Akku geladen ist.
  • Wenn sich die Drohne seltsam verhält, halten Sie sie von unten und drehen Sie sie um. Diese Aktion versetzt den Kopter in den Notmodus, und die Rotoren stoppen sofort.

Fertiger Code und Demo

LIVE DEMO

HERUNTERLADEN

Erledigt!

Es macht Spaß, den Code zu schreiben und dann zu sehen, wie die Maschine anfängt, zu reagieren! Jetzt haben wir gelernt, wie man die Drohne dazu bringt, Sprachbefehle zu verstehen. Tatsächlich gibt es noch viele weitere Möglichkeiten: Benutzererkennung, autonome Flüge, Gestenerkennung und vieles mehr.

Was können Sie zur Verbesserung des Programms vorschlagen?

Skillbox empfiehlt:

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Servern 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Servern | ProHoster