Vi programmerar röststyrning av coptern med Node.js och ARDrone

Vi programmerar röststyrning av coptern med Node.js och ARDrone

I den här handledningen kommer vi att titta på att skapa ett program för en drönare med röststyrning med hjälp av Node.js och Web Speech API. Copter - Parrot ARDrone 2.0.

Påminnelse: för alla läsare av "Habr" - en rabatt på 10 000 rubel när du anmäler dig till någon Skillbox-kurs med hjälp av "Habr"-kampanjkoden.

Skillbox rekommenderar: Praktisk kurs "Mobilutvecklare PRO".

Inledning

Drönare är fantastiska. Jag gillar verkligen att leka med min fyrhjuling, ta foton och filma eller bara ha kul. Men obemannade flygfarkoster (UAV) används för mer än bara underhållning. De arbetar på bio, studerar glaciärer och används av militären och representanter för jordbrukssektorn.

I den här handledningen kommer vi att titta på att skapa ett program som låter dig styra en drönare. med hjälp av röstkommandon. Ja, coptern kommer att göra vad du säger åt den att göra. I slutet av artikeln finns ett färdigt program och video av UAV-kontroll.

järn

Vi behöver följande:

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

Utveckling och hantering kommer att utföras på arbetsstationer med Windows/Mac/Ubuntu. Personligen arbetade jag med Mac och Ubuntu 18.04.

Mjukvara

Ladda ner den senaste versionen av Node.js från officiell plats.

Behövs också senaste versionen av Google Chrome.

Förstå coptern

Låt oss försöka förstå hur Parrot ARDrone fungerar. Denna copter har fyra motorer.

Vi programmerar röststyrning av coptern med Node.js och ARDrone

Motsatta motorer arbetar i samma riktning. Ett par roterar medurs, det andra moturs. Drönaren rör sig genom att ändra lutningsvinkeln i förhållande till jordens yta, ändra motorernas rotationshastighet och flera andra manövrerbara rörelser.

Vi programmerar röststyrning av coptern med Node.js och ARDrone

Som vi kan se i diagrammet ovan leder ändring av olika parametrar till en förändring i rörelseriktningen för coptern. Till exempel, minskning eller ökning av rotationshastigheten för vänster och höger rotor skapar en rulle. Detta gör att drönaren kan flyga framåt eller bakåt.

Genom att ändra hastigheten och riktningen på motorerna ställer vi in ​​tiltvinklar som gör att coptern kan röra sig i andra riktningar. För det aktuella projektet finns det faktiskt inget behov av att studera aerodynamik, du behöver bara förstå de grundläggande principerna.

Hur Parrot ARDrone fungerar

Drönaren är en Wi-Fi-hotspot. För att ta emot och skicka kommandon till coptern måste du ansluta till denna punkt. Det finns många olika applikationer som låter dig styra quadcoptrar. Det hela ser ut ungefär så här:

Vi programmerar röststyrning av coptern med Node.js och ARDrone

Så snart drönaren är ansluten öppnar du terminalen och telnet 192.168.1.1 - detta är copterns IP. För Linux kan du använda Linux Busybox.

Applikationsarkitektur

Vår kod kommer att delas in i följande moduler:

  • användargränssnitt med tal-API för röstdetektering;
  • filtrera kommandon och jämföra med en standard;
  • skicka kommandon till drönaren;
  • livesändning av video.

API:et fungerar så länge det finns en internetanslutning. För att säkerställa detta lägger vi till en Ethernet-anslutning.

Det är dags att skapa en ansökan!

Koda

Låt oss först skapa en ny mapp och byta till den med terminalen.

Sedan skapar vi ett nodprojekt med hjälp av kommandona nedan.

Först installerar vi de nödvändiga beroenden.

npm installera 

Vi kommer att stödja följande kommandon:

  • ta av;
  • landning;
  • upp - drönaren stiger en halv meter och svävar;
  • ner - faller en halv meter och fryser;
  • till vänster - går en halv meter till vänster;
  • till höger - går en halv meter till höger;
  • rotation - roterar medurs 90 grader;
  • framåt - går framåt en halv meter;
  • tillbaka - går tillbaka en halv meter;
  • sluta.

Här är koden som låter dig acceptera kommandon, filtrera dem och styra drönaren.

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

Och här är HTML- och JavaScript-koden som lyssnar på användaren och skickar ett kommando till Node-servern.

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

Och även JavaScript-kod för att fungera med röstkommandon, skicka dem till Node-servern.

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

Starta applikationen

Programmet kan startas enligt följande (det är viktigt att se till att coptern är ansluten till Wi-Fi och att Ethernet-kabeln är ansluten till datorn).

Öppna localhost:3000 i webbläsaren och klicka på Starta igenkänning.

Vi programmerar röststyrning av coptern med Node.js och ARDrone

Vi försöker kontrollera drönaren och är nöjda.

Sänder video från en drönare

Skapa en ny fil i projektet och kopiera denna kod 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);

Och här är HTML-koden, vi placerar den i den offentliga 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>

Starta och anslut till localhost:8080 för att se video från den främre kameran.

Vi programmerar röststyrning av coptern med Node.js och ARDrone

Användbara tips

  • Flyg den här drönaren inomhus.
  • Sätt alltid skyddskåpan på din drönare innan du lyfter.
  • Kontrollera om batteriet är laddat.
  • Om drönaren beter sig konstigt, håll ner den och vänd på den. Denna åtgärd kommer att försätta coptern i nödläge och rotorerna stannar omedelbart.

Färdig kod och demo

LIVE-DEMO

LADDA NER

Hände!

Att skriva kod och sedan se maskinen börja lyda kommer att ge dig nöje! Nu har vi kommit på hur man lär en drönare att lyssna på röstkommandon. Faktum är att det finns mycket fler möjligheter: användarens ansiktsigenkänning, autonoma flygningar, gestigenkänning och mycket mer.

Vad kan du föreslå för att förbättra programmet?

Skillbox rekommenderar:

Källa: will.com

Lägg en kommentar