Við forritum raddstýringu vélarinnar með því að nota Node.js og ARDrone

Við forritum raddstýringu vélarinnar með því að nota Node.js og ARDrone

Í þessari kennslu munum við skoða að búa til forrit fyrir dróna með raddstýringu með því að nota Node.js og Web Speech API. Copter - Parrot ARDrone 2.0.

Við minnum á: fyrir alla Habr lesendur - 10 rúblur afsláttur þegar þú skráir þig á hvaða Skillbox námskeið sem er með því að nota Habr kynningarkóðann.

Skillbox mælir með: Verklegt námskeið "Mobile Developer PRO".

Inngangur

Drónar eru ótrúlegir. Mér finnst mjög gaman að leika mér með fjórhjólið mitt, taka myndir og myndbönd eða bara hafa gaman. En ómannað flugfarartæki (UAV) eru notuð fyrir meira en bara skemmtun. Þeir vinna í kvikmyndahúsum, rannsaka jökla og eru notuð af hernum og fulltrúum landbúnaðargeirans.

Í þessari kennslu munum við skoða að búa til forrit sem gerir þér kleift að stjórna dróna. með raddskipunum. Já, flugvélin mun gera það sem þú segir honum að gera. Í lok greinarinnar er tilbúið forrit og myndband af UAV stjórn.

Járn

Við þurfum eftirfarandi:

  • Páfagaukur ARDrone 2.0;
  • Ethernet snúru;
  • góður hljóðnemi.

Þróun og stjórnun fer fram á vinnustöðvum með Windows/Mac/Ubuntu. Persónulega vann ég með Mac og Ubuntu 18.04.

Программное обеспечение

Sæktu nýjustu útgáfuna af Node.js frá opinbera síða.

Einnig þörf nýjustu útgáfuna af Google Chrome.

Að skilja flugvélina

Við skulum reyna að skilja hvernig Parrot ARDrone virkar. Þessi flugvél hefur fjóra mótora.

Við forritum raddstýringu vélarinnar með því að nota Node.js og ARDrone

Andstæðir mótorar vinna í sömu átt. Annað parið snýst réttsælis, hitt rangsælis. Dróninn hreyfist með því að breyta hallahorninu miðað við yfirborð jarðar, breyta snúningshraða mótoranna og nokkrum öðrum stjórntækum hreyfingum.

Við forritum raddstýringu vélarinnar með því að nota Node.js og ARDrone

Eins og við sjáum á skýringarmyndinni hér að ofan leiðir breyting á ýmsum breytum til breytinga á stefnu flugvélarinnar. Til dæmis, með því að minnka eða auka snúningshraða vinstri og hægri snúninga myndast rúlla. Þetta gerir drónanum kleift að fljúga fram eða aftur.

Með því að breyta hraða og stefnu mótoranna stillum við hallahorn sem gerir vélinni kleift að hreyfa sig í aðrar áttir. Reyndar, fyrir núverandi verkefni er engin þörf á að læra loftaflfræði, þú þarft bara að skilja grunnreglurnar.

Hvernig Parrot ARDrone virkar

Dróninn er Wi-Fi heitur reitur. Til þess að taka á móti og senda skipanir til flugvélarinnar þarftu að tengjast þessum stað. Það eru mörg mismunandi forrit sem gera þér kleift að stjórna quadcopters. Þetta lítur allt einhvern veginn svona út:

Við forritum raddstýringu vélarinnar með því að nota Node.js og ARDrone

Um leið og dróninn er tengdur skaltu opna flugstöðina og telnet 192.168.1.1 - þetta er IP-tala flugvélarinnar. Fyrir Linux geturðu notað Linux Busybox.

Umsókn arkitektúr

Kóðanum okkar verður skipt í eftirfarandi einingar:

  • notendaviðmót með tal API fyrir raddgreiningu;
  • sía skipanir og bera saman við staðal;
  • senda skipanir til dróna;
  • beinni myndbandsútsending.

API virkar svo lengi sem það er nettenging. Til að tryggja þetta bætum við við Ethernet tengingu.

Það er kominn tími til að búa til umsókn!

Kóði

Fyrst skulum við búa til nýja möppu og skipta yfir í hana með flugstöðinni.

Síðan búum við til Node verkefni með því að nota skipanirnar hér að neðan.

Fyrst setjum við upp nauðsynlegar ósjálfstæði.

npm setja í embætti 

Við munum styðja eftirfarandi skipanir:

  • flugtak;
  • lending;
  • upp - dróninn rís hálfan metra og svífur;
  • niður - fellur hálfan metra og frýs;
  • til vinstri - fer hálfan metra til vinstri;
  • til hægri - fer hálfan metra til hægri;
  • snúningur - snýst réttsælis 90 gráður;
  • áfram - fer fram um hálfan metra;
  • til baka - fer hálfan metra til baka;
  • hætta.

Hér er kóðinn sem gerir þér kleift að samþykkja skipanir, sía þær og stjórna drónanum.

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 hér er HTML og JavaScript kóðinn sem hlustar á notandann og sendir skipun til Node þjónsins.

<!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 líka JavaScript kóða til að vinna með raddskipunum, senda þær á hnútþjóninn.

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

Að ræsa forritið

Hægt er að ræsa forritið sem hér segir (mikilvægt er að ganga úr skugga um að vélin sé tengd við Wi-Fi og Ethernet snúran sé tengd við tölvuna).

Opnaðu localhost:3000 í vafranum og smelltu á Start Recognition.

Við forritum raddstýringu vélarinnar með því að nota Node.js og ARDrone

Við reynum að stjórna drónanum og erum ánægð.

Sendir út myndband frá dróna

Í verkefninu, búðu til nýja skrá og afritaðu þennan kóða þangað:

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 hér er HTML kóðinn, við setjum hann í opinberu möppuna.

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

Ræstu og tengdu við localhost:8080 til að skoða myndskeið frá myndavélinni að framan.

Við forritum raddstýringu vélarinnar með því að nota Node.js og ARDrone

Gagnlegar ábendingar

  • Fljúgðu þessum dróna innandyra.
  • Settu alltaf hlífðarhlífina á drónann þinn áður en þú ferð á loft.
  • Athugaðu hvort rafhlaðan sé hlaðin.
  • Ef dróninn hegðar sér undarlega skaltu halda honum niðri og snúa honum við. Þessi aðgerð mun setja flugvélina í neyðarstillingu og snúningarnir stöðvast strax.

Tilbúinn kóða og kynningu

LIVE DEMO

DOWNLOAD

Gerðist!

Að skrifa kóða og horfa síðan á vélina byrja að hlýða mun veita þér ánægju! Nú höfum við fundið út hvernig á að kenna dróna að hlusta á raddskipanir. Reyndar eru miklu fleiri möguleikar: Andlitsgreining notenda, sjálfstætt flug, látbragðsþekking og margt fleira.

Hvað getur þú lagt til til að bæta forritið?

Skillbox mælir með:

Heimild: www.habr.com

Bæta við athugasemd