Vi programmerer stemmestyring av copteret ved hjelp av Node.js og ARDrone

Vi programmerer stemmestyring av copteret ved hjelp av Node.js og ARDrone

I denne opplæringen skal vi se på å lage et program for en drone med stemmestyring ved hjelp av Node.js og Web Speech API. Copter - Parrot ARDrone 2.0.

Vi minner om: for alle lesere av "Habr" - en rabatt på 10 000 rubler når du melder deg på et hvilket som helst Skillbox-kurs ved å bruke kampanjekoden "Habr".

Skillbox anbefaler: Praktisk kurs "Mobilutvikler PRO".

Innledning

Droner er fantastiske. Jeg liker veldig godt å leke med firehjulingen min, ta bilder og videoer, eller bare ha det gøy. Men ubemannede luftfartøyer (UAV) brukes til mer enn bare underholdning. De jobber på kino, studerer isbreer, og brukes av militæret og representanter for landbrukssektoren.

I denne opplæringen skal vi se på å lage et program som lar deg kontrollere en drone. ved hjelp av talekommandoer. Ja, helikopteret vil gjøre det du ber den om å gjøre. På slutten av artikkelen er det et ferdig program og video av UAV-kontroll.

jern

Vi trenger følgende:

  • Parrot ARDrone 2.0;
  • Ethernet-kabel;
  • god mikrofon.

Utvikling og administrasjon vil bli utført på arbeidsstasjoner med Windows/Mac/Ubuntu. Personlig jobbet jeg med Mac og Ubuntu 18.04.

Programvare

Last ned den nyeste versjonen av Node.js fra offisielle nettsted.

Også nødvendig siste versjon av Google Chrome.

Forstå helikopteret

La oss prøve å forstå hvordan Parrot ARDrone fungerer. Dette copteret har fire motorer.

Vi programmerer stemmestyring av copteret ved hjelp av Node.js og ARDrone

Motstående motorer jobber i samme retning. Ett par roterer med klokken, det andre mot klokken. Dronen beveger seg ved å endre helningsvinkelen i forhold til jordoverflaten, endre rotasjonshastigheten til motorene og flere andre manøvrerbare bevegelser.

Vi programmerer stemmestyring av copteret ved hjelp av Node.js og ARDrone

Som vi kan se i diagrammet ovenfor, fører endring av ulike parametere til en endring i bevegelsesretningen til kopteret. For eksempel, å redusere eller øke rotasjonshastigheten til venstre og høyre rotor skaper en rulling. Dette gjør at dronen kan fly fremover eller bakover.

Ved å endre hastigheten og retningen til motorene setter vi tiltvinkler som gjør at helikopteret kan bevege seg i andre retninger. Faktisk, for det nåværende prosjektet er det ikke nødvendig å studere aerodynamikk, du trenger bare å forstå de grunnleggende prinsippene.

Hvordan Parrot ARDrone fungerer

Dronen er en Wi-Fi-hotspot. For å motta og sende kommandoer til copteret, må du koble til dette punktet. Det er mange forskjellige applikasjoner som lar deg kontrollere quadcoptere. Det hele ser omtrent slik ut:

Vi programmerer stemmestyring av copteret ved hjelp av Node.js og ARDrone

Så snart dronen er koblet til, åpner du terminalen og telnet 192.168.1.1 - dette er helikopterets IP. For Linux kan du bruke Linux Busybox.

Applikasjonsarkitektur

Koden vår vil bli delt inn i følgende moduler:

  • brukergrensesnitt med tale-API for stemmedeteksjon;
  • filtrere kommandoer og sammenligne med en standard;
  • sende kommandoer til dronen;
  • direktesending av video.

API-en fungerer så lenge det er en Internett-tilkobling. For å sikre dette legger vi til en Ethernet-tilkobling.

Det er på tide å lage en applikasjon!

Kode

Først, la oss lage en ny mappe og bytte til den ved hjelp av terminalen.

Deretter lager vi et Node-prosjekt ved å bruke kommandoene nedenfor.

Først installerer vi de nødvendige avhengighetene.

npm installasjon 

Vi vil støtte følgende kommandoer:

  • ta av;
  • landing;
  • opp - dronen stiger en halv meter og svever;
  • ned - faller en halv meter og fryser;
  • til venstre - går en halv meter til venstre;
  • til høyre - går en halv meter til høyre;
  • rotasjon - roterer 90 grader med klokken;
  • fremover - går en halv meter fremover;
  • tilbake - går en halv meter tilbake;
  • Stoppe.

Her er koden som lar deg godta kommandoer, filtrere dem og kontrollere dronen.

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

Og her er HTML- og JavaScript-koden som lytter til brukeren og sender en kommando til Node-serveren.

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

Og også JavaScript-kode for å fungere med talekommandoer, sende dem til Node-serveren.

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

Å starte programmet

Programmet kan startes på følgende måte (det er viktig å sørge for at kopteren er koblet til Wi-Fi og Ethernet-kabelen er koblet til datamaskinen).

Åpne localhost:3000 i nettleseren og klikk på Start gjenkjenning.

Vi programmerer stemmestyring av copteret ved hjelp av Node.js og ARDrone

Vi prøver å kontrollere dronen og er fornøyde.

Sender video fra en drone

Opprett en ny fil i prosjektet og kopier denne koden dit:

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

Og her er HTML-koden, vi plasserer den i den offentlige mappen.

<!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 og koble til localhost:8080 for å se video fra frontkameraet.

Vi programmerer stemmestyring av copteret ved hjelp av Node.js og ARDrone

Nyttige tips

  • Fly denne dronen innendørs.
  • Sett alltid beskyttelsesdekselet på dronen før du tar av.
  • Sjekk om batteriet er ladet.
  • Hvis dronen oppfører seg merkelig, hold den nede og snu den. Denne handlingen vil sette copteret i nødmodus og rotorene vil stoppe umiddelbart.

Klar kode og demo

LIVE DEMO

LAST NED

Skjedde!

Å skrive kode og deretter se maskinen begynne å adlyde vil gi deg glede! Nå har vi funnet ut hvordan vi kan lære en drone å lytte til talekommandoer. Faktisk er det mye flere muligheter: brukeransiktsgjenkjenning, autonome flyvninger, gestgjenkjenning og mye mer.

Hva kan du foreslå for å forbedre programmet?

Skillbox anbefaler:

Kilde: www.habr.com

Legg til en kommentar