Vi programmerer stemmestyring af copteren ved hjælp af Node.js og ARDrone

Vi programmerer stemmestyring af copteren ved hjælp af Node.js og ARDrone

I denne tutorial vil vi se på at skabe et program til en drone med stemmestyring ved hjælp af Node.js og Web Speech API. Copter - Parrot ARDrone 2.0.

Påmindelse: for alle læsere af "Habr" - en rabat på 10 rubler ved tilmelding til ethvert Skillbox-kursus ved hjælp af "Habr"-kampagnekoden.

Skillbox anbefaler: Praktisk kursus "Mobiludvikler PRO".

Indledning

Droner er fantastiske. Jeg nyder virkelig at lege med min quad, tage billeder og videoer eller bare have det sjovt. Men ubemandede luftfartøjer (UAV'er) bruges til mere end bare underholdning. De arbejder i biografen, studerer gletschere og bruges af militæret og repræsentanter for landbrugssektoren.

I denne tutorial vil vi se på at skabe et program, der giver dig mulighed for at styre en drone. ved hjælp af stemmekommandoer. Ja, helikopteren vil gøre, hvad du beder den om at gøre. I slutningen af ​​artiklen er der et færdigt program og video af UAV-kontrol.

jern

Vi har brug for følgende:

  • Papegøje ARDrone 2.0;
  • Ethernet-kabel;
  • god mikrofon.

Udvikling og styring vil blive udført på arbejdsstationer med Windows/Mac/Ubuntu. Personligt arbejdede jeg med Mac og Ubuntu 18.04.

Software

Download den seneste version af Node.js fra officielle site.

Også nødvendig nyeste version af Google Chrome.

Forståelse af copteren

Lad os prøve at forstå, hvordan Parrot ARDrone virker. Denne copter har fire motorer.

Vi programmerer stemmestyring af copteren ved hjælp af Node.js og ARDrone

Modsatrettede motorer arbejder i samme retning. Det ene par roterer med uret, det andet mod uret. Dronen bevæger sig ved at ændre hældningsvinklen i forhold til jordens overflade, ændre motorernes rotationshastighed og flere andre manøvrerbare bevægelser.

Vi programmerer stemmestyring af copteren ved hjælp af Node.js og ARDrone

Som vi kan se i diagrammet ovenfor, fører ændring af forskellige parametre til en ændring i bevægelsesretningen for copteret. For eksempel opstår der en rulning ved at mindske eller øge rotationshastigheden for venstre og højre rotor. Dette gør det muligt for dronen at flyve frem eller tilbage.

Ved at ændre motorernes hastighed og retning indstiller vi hældningsvinkler, der gør det muligt for copteren at bevæge sig i andre retninger. Faktisk er der ikke behov for at studere aerodynamik for det aktuelle projekt, du skal bare forstå de grundlæggende principper.

Sådan virker Parrot ARDrone

Dronen er et Wi-Fi-hotspot. For at modtage og sende kommandoer til copteren skal du oprette forbindelse til dette punkt. Der er mange forskellige applikationer, der giver dig mulighed for at styre quadcoptere. Det hele ser sådan her ud:

Vi programmerer stemmestyring af copteren ved hjælp af Node.js og ARDrone

Så snart dronen er tilsluttet, skal du åbne terminalen og telnet 192.168.1.1 - dette er copterens IP. Til Linux kan du bruge Linux Busybox.

Applikationsarkitektur

Vores kode vil være opdelt i følgende moduler:

  • brugergrænseflade med tale-API til stemmedetektion;
  • filtrering af kommandoer og sammenligning med en standard;
  • sende kommandoer til dronen;
  • live videoudsendelse.

API'en virker, så længe der er en internetforbindelse. For at sikre dette tilføjer vi en Ethernet-forbindelse.

Det er tid til at oprette en ansøgning!

Kode

Lad os først oprette en ny mappe og skifte til den ved hjælp af terminalen.

Derefter opretter vi et Node-projekt ved hjælp af kommandoerne nedenfor.

Først installerer vi de nødvendige afhængigheder.

npm installere 

Vi understøtter følgende kommandoer:

  • Afgang;
  • landing;
  • op - dronen rejser sig en halv meter og svæver;
  • ned - falder en halv meter og fryser;
  • til venstre - går en halv meter til venstre;
  • til højre - går en halv meter til højre;
  • rotation - roterer 90 grader med uret;
  • fremad - går en halv meter frem;
  • tilbage - går en halv meter tilbage;
  • hold op.

Her er koden, der giver dig mulighed for at acceptere kommandoer, filtrere dem og styre 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, der lytter til brugeren 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 til at arbejde med stemmekommandoer, 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'
 });
};

Start applikationen

Programmet kan startes som følger (det er vigtigt at sikre sig, at copteren er tilsluttet Wi-Fi og Ethernet-kablet er tilsluttet computeren).

Åbn localhost:3000 i browseren, og klik på Start genkendelse.

Vi programmerer stemmestyring af copteren ved hjælp af Node.js og ARDrone

Vi forsøger at kontrollere dronen og er glade.

Udsender video fra en drone

I projektet skal du oprette en ny fil og kopiere denne kode der:

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 placerer den i den offentlige mappe.

<!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 opret forbindelse til localhost:8080 for at se video fra frontkameraet.

Vi programmerer stemmestyring af copteren ved hjælp af Node.js og ARDrone

Nyttige tips

  • Flyv denne drone indendørs.
  • Sæt altid beskyttelsescoveret på din drone, før du starter.
  • Kontroller, om batteriet er opladet.
  • Hvis dronen opfører sig mærkeligt, skal du holde den nede og vende den om. Denne handling vil sætte copteret i nødtilstand, og rotorerne stopper øjeblikkeligt.

Klar kode og demo

LIVE DEMO

DOWNLOAD

skete!

At skrive kode og derefter se maskinen begynde at adlyde vil give dig fornøjelse! Nu har vi fundet ud af, hvordan man lærer en drone at lytte til stemmekommandoer. Faktisk er der meget flere muligheder: Brugeransigtsgenkendelse, autonome flyvninger, gestusgenkendelse og meget mere.

Hvad kan du foreslå for at forbedre programmet?

Skillbox anbefaler:

Kilde: www.habr.com

Tilføj en kommentar