Spreekcommando's voor een drone programmeren met Node.js en ARDrone

Spreekcommando's voor een drone programmeren met Node.js en ARDrone

In deze tutorial zullen we de ontwikkeling van een drone-programma met spraakbesturing op Node.js en de Web Speech API behandelen. De quadcopter is de Parrot ARDrone 2.0.

Ter herinnering: voor alle lezers van «Habr» — een korting van 10.000 roebel bij inschrijving voor elke cursus van Skillbox met de promocode «Habr».

Skillbox raadt aan: Praktische cursus ‘Mobiele Ontwikkelaar PRO’.

Inleiding

Dronen zijn geweldig. Ik vind het heerlijk om met mijn quadcopter te spelen, foto's en video's op te nemen of gewoon plezier te hebben. Maar onbemande luchtvaartuigen (UAV's) worden niet alleen voor vermaak gebruikt. Ze worden ingezet in de filmindustrie, bestuderen gletsjers en worden gebruikt door het leger en de landbouwsector.

In deze tutorial behandelen we de creatie van een programma dat het mogelijk maakt de drone te besturen met spraakopdrachten. Ja, de quadcopter zal doen wat je zegt. Aan het einde van het artikel — een werkend programma en video voor het besturen van de UAV.

Hardware

We hebben het volgende nodig:

  • Parrot ARDrone 2.0;
  • Ethernet-kabel;
  • goede microfoon.

De ontwikkeling en het beheer zullen plaatsvinden op werkstations met Windows/Mac/Ubuntu. Persoonlijk heb ik gewerkt met Mac en Ubuntu 18.04.

Software

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

Daarnaast is de laatste versie van Google Chrome nodig..

Laten we de quadcopter begrijpen

Laten we proberen te begrijpen hoe de Parrot ARDrone werkt. Deze quadcopter heeft vier motoren.

Spreekcommando's voor een drone programmeren met Node.js en ARDrone

De tegenovergestelde motoren draaien in dezelfde richting. Een paar draait met de klok mee, de andere ertegenin. De drone beweegt door de hoek van kanteling ten opzichte van de grond te veranderen, de snelheid van de motoren aan te passen en nog een paar andere manoeuvres.

Spreekcommando's voor een drone programmeren met Node.js en ARDrone

Zoals we in het diagram hierboven zien, leidt het veranderen van verschillende parameters tot een verandering in de bewegingsrichting van de quadcopter. Bijvoorbeeld, het verminderen of verhogen van de snelheid van de linker en rechter rotoren creëert een kanteling. Dit stelt de drone in staat om vooruit of achteruit te vliegen.

Door de snelheid en richting van de motoren te wijzigen, stellen we de hoeken van kanteling in die het de quadcopter mogelijk maken om in andere richtingen te bewegen. Voor dit project hoeft er in feite geen aerodynamica bestudeerd te worden, het is gewoon belangrijk om de basisprincipes te begrijpen.

Hoe de Parrot ARDrone werkt

De drone fungeert als een Wi-Fi toegangspunt. Om commando's naar de quadcopter te kunnen sturen en ontvangen, moet je verbinding maken met dit toegangspunt. Er zijn veel verschillende apps beschikbaar om met quadcopters te werken. Het ziet er ongeveer zo uit:

Spreekcommando's voor een drone programmeren met Node.js en ARDrone

Zodra de drone is aangesloten, openen we de terminal en typ je telnet 192.168.1.1 — dit is het IP-adres van de quadcopter. Voor Linux kun je gebruiken Linux Busybox.

Architectuur van de applicatie

Onze code zal worden verdeeld in de volgende modules:

  • gebruikersinterface met spraak-API voor stemdetectie;
  • filteren van opdrachten en vergelijken met de referentie;
  • opdrachten naar de drone verzenden;
  • live video-uitzending.

De API werkt met een internetverbinding. Daarom voegen we verbinding via Ethernet toe.

Het is tijd om een applicatie te maken!

Coderen

Laten we beginnen met het aanmaken van een nieuwe map en deze openen via de terminal.

Vervolgens creëren we een Node-project met de onderstaande commando's.

Laten we beginnen met het installeren van de vereiste afhankelijkheden.

npm install 

We zullen de volgende commando's ondersteunen:

  • opstijgen;
  • landen;
  • omhoog — de drone stijgt een halve meter en zweeft;
  • omlaag — zakt een halve meter en zweeft;
  • links — gaat een halve meter naar links;
  • rechts — gaat een halve meter naar rechts;
  • draaien — draait met de klok mee 90 graden;
  • vooruit — gaat een halve meter vooruit;
  • achteruit — gaat een halve meter achteruit;
  • stop.

Hier is de code die opdrachten accepteert, filtert en de drone bestuurt.

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();
// schakel noodsituatie uit
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('commando ontvangen ', req.body);
    console.log('bestaande commando's', commands);
    let command = req.body.command.replace(/ /g,'');
    if(commands.indexOf(command) !== -1) {
        switch(command.toUpperCase()) {
            case "TAKEOFF":
                console.log('de drone neemt afscheid');
                drone.takeoff();
            break;
            case "LAND":
                console.log('de drone landt');
                drone.land();
            break;
            case "UP":
                console.log('de drone omhoog met een halve meter');
                drone.up(0.2);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "DOWN":
                console.log('de drone omlaag met een halve meter');
                drone.down(0.2);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOLEFT":
                console.log('de drone naar links met 1 meter');
                drone.left(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },1000);
            break;
            case "GORIGHT":
                console.log('de drone naar rechts met 1 meter');
                drone.right(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },1000);
            break;
            case "TURN":
                console.log('de drone draait');
                drone.clockwise(0.4);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOFORWARD":
                console.log('de drone gaat vooruit met 1 meter');
                drone.front(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOBACKWARD":
                console.log('de drone gaat achteruit met 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);

Hier is de HTML- en JavaScript-code die de gebruiker aanroept en de opdracht naar de Node-server verzendt.

<!DOCTYPE html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Stemgestuurde Notities 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>Stemgestuurde Drone</h1>
            <p class="page-description">Een kleine app die je in staat stelt om een AR-drone met je stem te bedienen</p>
 
            <h3 class="no-browser-support">Sorry, je browser ondersteunt de Web Speech API niet. Probeer deze demo in Google Chrome te openen.</h3>
 
            <div class="app">
                <h3>Geef de opdracht</h3>
                <div class="input-single">
                    <textarea id="note-textarea" placeholder="Maak een nieuwe notitie door te typen of stemherkenning te gebruiken." rows="6"></textarea>
                </div>    
                <button id="start-record-btn" title="Begin met opnemen">Begin met herkennen</button>
                <button id="pause-record-btn" title="Pauzeer opname">Pauzeer herkenning</button>
                <p id="recording-instructions">Druk op de <strong>Begin met herkennen</strong> knop en geef toegang.</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 hier is de JavaScript-code om met spraakopdrachten te werken door deze naar de Node-server te verzenden.

proberen {
 var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
 var recognition = new SpeechRecognition();
 }
 catch(e) {
 console.error(e);
 $('.no-browser-support').show();
 $('.app').hide();
 }
// andere code, zie GitHub-bron
recognition.onresult = function(event) {
// event is een SpeechRecognitionEvent object.
// Het bevat alle zinnen die we tot nu toe hebben vastgelegd.
 // We hebben alleen de huidige nodig.
 var current = event.resultIndex;
// Verkrijg een transcriptie van wat er is gezegd.
var transcript = event.results[current][0].transcript;
// verzenden naar de backend
$.ajax({
 type: 'POST',
 url: '\/command\/',
 data: JSON.stringify({command: transcript}),
 success: function(data) { console.log(data) },
 contentType: "application\/json",
 dataType: 'json'
 });
};

Start de applicatie

De applicatie kan als volgt worden gestart (zorg ervoor dat de drone is verbonden met Wi-Fi en de netwerkkabel op de computer is aangesloten).

Open localhost:3000 in de browser en klik op Start Recognition.

Spreekcommando's voor een drone programmeren met Node.js en ARDrone

Probeer de drone te besturen en geniet.

Videotransmissie van de drone

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

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, plaats deze in de map public.

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

Start en maak verbinding met localhost:8080 om video van de frontcamera te bekijken.

Spreekcommando's voor een drone programmeren met Node.js en ARDrone

Nuttige tips

  • Bestuur deze drone binnen.
  • Draag altijd de beschermkap op de drone voor het opstijgen.
  • Controleer of de batterij is opgeladen.
  • Als de drone zich vreemd gedraagt, houd hem dan onder en keer hem om. Deze actie zet de drone in de noodmodus en de rotors stoppen onmiddellijk.

Klaar code en demonstratie

LIVE DEMO

DOWNLOAD

Gelukt!

Code schrijven en dan zien hoe de machine begint te luisteren, zal je vreugde brengen! We hebben nu geleerd hoe we de drone kunnen laten luisteren naar spraakopdrachten. De mogelijkheden zijn feitelijk veel groter: gezichtsherkenning van de gebruiker, autonome vluchten, gebarenherkenning en nog veel meer.

Wat kunt u voorstellen om de applicatie te verbeteren?

Skillbox raadt aan:

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster