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

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

In diesem Tutorial werden wir uns mit der Erstellung eines Programms für eine Drohne mit Sprachsteuerung mithilfe von Node.js und der Web-Sprach-API befassen. Copter - Parrot ARDrone 2.0.

Erinnerung: für alle Leser von „Habr“ – ein Rabatt von 10 Rubel bei der Anmeldung zu einem beliebigen Skillbox-Kurs mit dem Aktionscode „Habr“.

Skillbox empfiehlt: Praktischer Kurs „Mobile Developer PRO“.

Einführung

Drohnen sind erstaunlich. Es macht mir großen Spaß, mit meinem Quad zu spielen, Fotos und Videos zu machen oder einfach nur Spaß zu haben. Doch unbemannte Luftfahrzeuge (UAVs) dienen nicht nur der Unterhaltung. Sie arbeiten im Kino, erforschen Gletscher und werden vom Militär und Vertretern der Landwirtschaft eingesetzt.

In diesem Tutorial beschäftigen wir uns mit der Erstellung eines Programms, mit dem Sie eine Drohne steuern können. mithilfe von Sprachbefehlen. Ja, der Copter wird tun, was Sie ihm sagen. Am Ende des Artikels finden Sie ein vorgefertigtes Programm und Video zur UAV-Steuerung.

Eisen

Wir benötigen folgende:

  • Papagei ARDrone 2.0;
  • Ethernet Kabel;
  • gutes Mikrofon.

Die Entwicklung und Verwaltung erfolgt auf Workstations mit Windows/Mac/Ubuntu. Ich persönlich habe mit Mac und Ubuntu 18.04 gearbeitet.

Software

Laden Sie die neueste Version von Node.js herunter von offizielle Seite.

Wird auch benötigt neueste Version von Google Chrome.

Den Copter verstehen

Versuchen wir zu verstehen, wie Parrot ARDrone funktioniert. Dieser Copter verfügt über vier Motoren.

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

Gegenläufige Motoren arbeiten in die gleiche Richtung. Ein Paar dreht sich im Uhrzeigersinn, das andere gegen den Uhrzeigersinn. Die Drohne bewegt sich, indem sie den Neigungswinkel relativ zur Erdoberfläche ändert, die Drehzahl der Motoren ändert und verschiedene andere manövrierfähige Bewegungen ausführt.

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

Wie wir im obigen Diagramm sehen können, führt die Änderung verschiedener Parameter zu einer Änderung der Bewegungsrichtung des Kopters. Wenn Sie beispielsweise die Rotationsgeschwindigkeit des linken und rechten Rotors verringern oder erhöhen, entsteht ein Rollen. Dadurch kann die Drohne vorwärts oder rückwärts fliegen.

Durch Ändern der Geschwindigkeit und Richtung der Motoren stellen wir Neigungswinkel ein, die es dem Kopter ermöglichen, sich in andere Richtungen zu bewegen. Eigentlich ist es für das aktuelle Projekt nicht nötig, Aerodynamik zu studieren, man muss nur die Grundprinzipien verstehen.

Wie Parrot ARDrone funktioniert

Die Drohne ist ein WLAN-Hotspot. Um Befehle an den Kopter zu empfangen und zu senden, müssen Sie sich mit diesem Punkt verbinden. Es gibt viele verschiedene Anwendungen, mit denen Sie Quadrocopter steuern können. Das Ganze sieht ungefähr so ​​aus:

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

Sobald die Drohne verbunden ist, öffnen Sie das Terminal und telnet 192.168.1.1 – das ist die IP des Copters. Für Linux können Sie verwenden Linux Busybox.

Anwendungsarchitektur

Unser Code wird in die folgenden Module unterteilt:

  • Benutzeroberfläche mit Sprach-API zur Spracherkennung;
  • Befehle filtern und mit einem Standard vergleichen;
  • Senden von Befehlen an die Drohne;
  • Live-Videoübertragung.

Die API funktioniert, solange eine Internetverbindung besteht. Um dies zu gewährleisten, fügen wir eine Ethernet-Verbindung hinzu.

Es ist Zeit, eine Anwendung zu erstellen!

Code

Erstellen wir zunächst einen neuen Ordner und wechseln wir über das Terminal zu diesem.

Anschließend erstellen wir mit den folgenden Befehlen ein Node-Projekt.

Zuerst installieren wir die erforderlichen Abhängigkeiten.

npm installieren 

Wir unterstützen die folgenden Befehle:

  • abheben;
  • Landung;
  • hoch – die Drohne erhebt sich einen halben Meter und schwebt;
  • nach unten – fällt einen halben Meter und gefriert;
  • nach links – geht einen halben Meter nach links;
  • nach rechts - geht einen halben Meter nach rechts;
  • Drehung – dreht sich um 90 Grad im Uhrzeigersinn;
  • vorwärts – geht einen halben Meter vorwärts;
  • zurück – geht einen halben Meter zurück;
  • stoppen.

Hier ist der Code, mit dem Sie Befehle annehmen, filtern und die Drohne steuern können.

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);

Und hier ist der HTML- und JavaScript-Code, der dem Benutzer zuhö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>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>

Und auch JavaScript-Code, um mit Sprachbefehlen zu arbeiten und diese an den Node-Server zu senden.

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'
 });
};

Starten der Anwendung

Das Programm kann wie folgt gestartet werden (es ist wichtig sicherzustellen, dass der Copter mit WLAN verbunden ist und das Ethernet-Kabel mit dem Computer verbunden ist).

Öffnen Sie „localhost:3000“ im Browser und klicken Sie auf „Erkennung starten“.

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

Wir versuchen die Drohne zu kontrollieren und sind zufrieden.

Videoübertragung von einer Drohne

Erstellen Sie im Projekt eine neue Datei und kopieren Sie diesen Code dorthin:

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);

Und hier ist der HTML-Code, wir platzieren ihn im öffentlichen Ordner.

<!doctype html>
 <html>
 <head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8">
 <title>Stream as module</title>
 <script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
 </head>
 <body>
 <h1 id="heading">Drone video 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 localhost:8080 und stellen Sie eine Verbindung her, um Videos von der Frontkamera anzuzeigen.

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

Nützliche Tipps

  • Fliegen Sie diese Drohne drinnen.
  • Befestigen Sie immer die Schutzhülle an Ihrer Drohne, bevor Sie abheben.
  • Prüfen Sie, ob der Akku geladen ist.
  • Wenn sich die Drohne seltsam verhält, halten Sie sie gedrückt und drehen Sie sie um. Durch diese Aktion wird der Kopter in den Notmodus versetzt und die Rotoren stoppen sofort.

Bereiter Code und Demo

LIVE DEMO

HERUNTERLADEN

Es stellte sich heraus!

Code zu schreiben und dann zuzusehen, wie die Maschine zu gehorchen beginnt, wird Ihnen Freude bereiten! Jetzt haben wir herausgefunden, wie man einer Drohne beibringt, auf Sprachbefehle zu hören. Tatsächlich gibt es noch viel mehr Möglichkeiten: Gesichtserkennung des Benutzers, autonome Flüge, Gestenerkennung und vieles mehr.

Was können Sie zur Verbesserung des Programms vorschlagen?

Skillbox empfiehlt:

Source: habr.com

Kommentar hinzufügen