We programmeren de stembesturing van de helikopter met behulp van Node.js en ARDrone

We programmeren de stembesturing van de helikopter met behulp van Node.js en ARDrone

In deze tutorial zullen we kijken naar het maken van een programma voor een drone met stembesturing met behulp van Node.js en Web speech API. Copter - Papegaai ARdrone 2.0.

Herinnering: voor alle lezers van "Habr" - een korting van 10 roebel bij inschrijving voor een Skillbox-cursus met behulp van de promotiecode "Habr".

Skillbox beveelt aan: Praktische cursus "Mobiele ontwikkelaar PRO".

Introductie

Drones zijn geweldig. Ik geniet enorm van het spelen met mijn quad, het maken van foto's en video's, of gewoon van plezier maken. Maar onbemande luchtvaartuigen (UAV's) worden voor meer dan alleen entertainment gebruikt. Ze werken in de bioscoop, bestuderen gletsjers en worden gebruikt door het leger en vertegenwoordigers van de landbouwsector.

In deze tutorial zullen we kijken naar het maken van een programma waarmee je een drone kunt besturen. met behulp van spraakopdrachten. Ja, de helikopter zal doen wat u hem opdraagt. Aan het einde van het artikel vindt u een kant-en-klaar programma en video van UAV-besturing.

ijzer

We hebben het volgende nodig:

  • Papegaai ARdrone 2.0;
  • Ethernetkabel;
  • goede microfoon.

Ontwikkeling en beheer zullen plaatsvinden op werkstations met Windows/Mac/Ubuntu. Persoonlijk werkte ik met Mac en Ubuntu 18.04.

Software

Download de nieuwste versie van Node.js van officiële website.

Ook nodig nieuwste versie van Google Chrome.

De helikopter begrijpen

Laten we proberen te begrijpen hoe Parrot ARdrone werkt. Deze helikopter heeft vier motoren.

We programmeren de stembesturing van de helikopter met behulp van Node.js en ARDrone

Tegengestelde motoren werken in dezelfde richting. Het ene paar draait met de klok mee, het andere tegen de klok in. De drone beweegt door de hellingshoek ten opzichte van het aardoppervlak te veranderen, de rotatiesnelheid van de motoren te veranderen en verschillende andere manoeuvreerbare bewegingen.

We programmeren de stembesturing van de helikopter met behulp van Node.js en ARDrone

Zoals we in het bovenstaande diagram kunnen zien, leidt het veranderen van verschillende parameters tot een verandering in de bewegingsrichting van de helikopter. Als u bijvoorbeeld de rotatiesnelheid van de linker- en rechterrotor verlaagt of verhoogt, ontstaat er een rol. Hierdoor kan de drone vooruit of achteruit vliegen.

Door de snelheid en richting van de motoren te veranderen, stellen we kantelhoeken in waardoor de helikopter in andere richtingen kan bewegen. Eigenlijk is het voor het huidige project niet nodig om aerodynamica te studeren, je hoeft alleen maar de basisprincipes te begrijpen.

Hoe Parrot ARdrone werkt

De drone is een wifi-hotspot. Om commando's te ontvangen en naar de helikopter te sturen, moet je verbinding maken met dit punt. Er zijn veel verschillende toepassingen waarmee je quadcopters kunt besturen. Het ziet er allemaal ongeveer zo uit:

We programmeren de stembesturing van de helikopter met behulp van Node.js en ARDrone

Zodra de drone is verbonden, open je de terminal en telnet 192.168.1.1 - dit is het IP-adres van de helikopter. Voor Linux kun je gebruiken Linux Busybox.

Applicatie architectuur

Onze code zal worden onderverdeeld in de volgende modules:

  • gebruikersinterface met spraak-API voor stemdetectie;
  • commando's filteren en vergelijken met een standaard;
  • commando's naar de drone sturen;
  • live video-uitzending.

De API werkt zolang er een internetverbinding is. Om dit te garanderen, voegen we een Ethernet-verbinding toe.

Het is tijd om een ​​applicatie te maken!

Code

Laten we eerst een nieuwe map maken en ernaar overschakelen via de terminal.

Vervolgens maken we een Node-project met behulp van de onderstaande opdrachten.

Eerst installeren we de vereiste afhankelijkheden.

npm installeren 

We ondersteunen de volgende commando's:

  • opstijgen;
  • landen;
  • omhoog - de drone stijgt een halve meter en zweeft;
  • naar beneden - valt een halve meter en bevriest;
  • naar links - gaat een halve meter naar links;
  • naar rechts - gaat een halve meter naar rechts;
  • rotatie - draait 90 graden met de klok mee;
  • vooruit - gaat een halve meter vooruit;
  • terug - gaat een halve meter terug;
  • stop.

Hier is de code waarmee je opdrachten kunt accepteren, filteren en de drone kunt besturen.

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

En hier is de HTML- en JavaScript-code die naar de gebruiker luistert en een opdracht naar de Node-server stuurt.

<!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>

En ook JavaScript-code om met spraakopdrachten te werken en deze naar de Node-server te sturen.

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

De applicatie starten

Het programma kan als volgt worden gestart (het is belangrijk om ervoor te zorgen dat de helikopter is verbonden met Wi-Fi en dat de ethernetkabel is aangesloten op de computer).

Open localhost:3000 in de browser en klik op Herkenning starten.

We programmeren de stembesturing van de helikopter met behulp van Node.js en ARDrone

We proberen de drone te besturen en zijn blij.

Video uitzenden vanaf een drone

Maak in het project een nieuw bestand en kopieer deze code daar:

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

En hier is de HTML-code, we plaatsen deze in de openbare map.

<!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>

Start en maak verbinding met localhost:8080 om video van de camera aan de voorkant te bekijken.

We programmeren de stembesturing van de helikopter met behulp van Node.js en ARDrone

Nuttige tips

  • Vlieg deze drone binnenshuis.
  • Plaats altijd de beschermhoes op uw drone voordat u vertrekt.
  • Controleer of de batterij is opgeladen.
  • Als de drone zich vreemd gedraagt, houd hem dan ingedrukt en draai hem om. Door deze actie wordt de helikopter in de noodmodus gezet en stoppen de rotors onmiddellijk.

Klaar code en demo

DEMO

DOWNLOAD

Gebeurd!

Code schrijven en dan kijken hoe de machine begint te gehoorzamen, zal je plezier geven! Nu hebben we ontdekt hoe we een drone kunnen leren naar stemcommando’s te luisteren. Er zijn eigenlijk veel meer mogelijkheden: gezichtsherkenning van gebruikers, autonome vluchten, gebarenherkenning en nog veel meer.

Wat kunt u voorstellen om het programma te verbeteren?

Skillbox beveelt aan:

Bron: www.habr.com

Voeg een reactie