A helikopter hangvezérlését Node.js és ARDrone segítségével programozzuk

A helikopter hangvezérlését Node.js és ARDrone segítségével programozzuk

Ebben az oktatóanyagban egy program létrehozását vizsgáljuk meg hangvezérléssel rendelkező drónokhoz a Node.js és a Web beszéd API használatával. Kopter - Parrot ARDrone 2.0.

Emlékeztetünk: a "Habr" minden olvasója számára - 10 000 rubel kedvezmény, ha a "Habr" promóciós kóddal bármely Skillbox tanfolyamra jelentkezik.

A Skillbox a következőket ajánlja: Gyakorlati tanfolyam "Mobile Developer PRO".

Bevezetés

A drónok csodálatosak. Nagyon szeretek játszani a quadommal, fotózni és videózni, vagy egyszerűen csak szórakozni. A pilóta nélküli légi járműveket (UAV) azonban nem csupán szórakozásra használják. Moziban dolgoznak, gleccsereket tanulnak, a katonaság és a mezőgazdasági szektor képviselői használják őket.

Ebben az oktatóanyagban egy olyan program létrehozását vizsgáljuk meg, amely lehetővé teszi egy drón vezérlését. hangutasítások segítségével. Igen, a helikopter megteszi, amit mondasz neki. A cikk végén van egy kész program és videó az UAV vezérléséről.

vas

A következőkre van szükségünk:

  • Parrot ARDrone 2.0;
  • Hálózati kábel;
  • jó mikrofon.

A fejlesztés és a felügyelet Windows/Mac/Ubuntu operációs rendszerrel működő munkaállomásokon történik. Személy szerint Mac és Ubuntu 18.04-el dolgoztam.

Szoftver

Töltse le a Node.js legújabb verzióját innen hivatalos honlapja.

Szintén szükséges a Google Chrome legújabb verziója.

A helikopter megértése

Próbáljuk megérteni, hogyan működik a Parrot ARDrone. Ennek a helikopternek négy motorja van.

A helikopter hangvezérlését Node.js és ARDrone segítségével programozzuk

Az ellentétes motorok ugyanabban az irányban működnek. Az egyik pár az óramutató járásával megegyező, a másik az óramutató járásával ellentétes irányba forog. A drón a föld felszínéhez viszonyított dőlésszögének megváltoztatásával, a motorok forgási sebességének változtatásával és számos más manőverezhető mozgással mozog.

A helikopter hangvezérlését Node.js és ARDrone segítségével programozzuk

Ahogy a fenti ábrán is láthatjuk, a különféle paraméterek megváltoztatása a helikopter mozgási irányának megváltozásához vezet. Például a bal és a jobb oldali rotor forgási sebességének csökkentése vagy növelése gördülést hoz létre. Ez lehetővé teszi, hogy a drón előre vagy hátra repüljön.

A motorok sebességének és irányának változtatásával olyan dőlésszögeket állítunk be, amelyek lehetővé teszik a kopter más irányokba való mozgását. Valójában a jelenlegi projekthez nincs szükség aerodinamika tanulmányozására, csak meg kell értenie az alapelveket.

Hogyan működik a Parrot ARDrone

A drón egy Wi-Fi hotspot. Ahhoz, hogy parancsokat kapjon és küldjön a helikopternek, ehhez a ponthoz kell csatlakoznia. Számos különböző alkalmazás létezik, amelyek lehetővé teszik a kvadrokopterek vezérlését. Valahogy így néz ki az egész:

A helikopter hangvezérlését Node.js és ARDrone segítségével programozzuk

Amint a drón csatlakoztatva van, nyissa meg a terminált és telnet 192.168.1.1 - ez a helikopter IP-címe. Linux esetén használhatod Linux Busybox.

Alkalmazás architektúra

Kódunk a következő modulokra lesz felosztva:

  • felhasználói felület beszéd API-val a hangérzékeléshez;
  • szűrési parancsok és összehasonlítás szabvánnyal;
  • parancsok küldése a drónnak;
  • élő videó közvetítés.

Az API addig működik, amíg van internetkapcsolat. Ennek biztosítására Ethernet kapcsolatot adunk hozzá.

Itt az ideje egy alkalmazás létrehozásának!

Kód

Először hozzunk létre egy új mappát, és váltsunk rá a terminál segítségével.

Ezután az alábbi parancsok segítségével létrehozunk egy Node projektet.

Először telepítjük a szükséges függőségeket.

npm telepítés 

A következő parancsokat támogatjuk:

  • levesz;
  • leszállás;
  • felfelé - a drón fél métert emelkedik és lebeg;
  • lefelé - fél métert esik és lefagy;
  • balra - fél méterrel balra megy;
  • jobbra - fél méterrel jobbra megy;
  • forgatás - az óramutató járásával megegyező irányban 90 fokkal elfordul;
  • előre - fél méterrel előre megy;
  • vissza - fél métert visszamegy;
  • Álljon meg.

Itt található a kód, amely lehetővé teszi a parancsok elfogadását, szűrését és a drón vezérlését.

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

És itt van a HTML és JavaScript kód, amely meghallgatja a felhasználót, és parancsot küld a Node szervernek.

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

És JavaScript-kód is a hangparancsokkal való együttműködéshez, és elküldi azokat a csomópont-kiszolgálónak.

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

Az alkalmazás elindítása

A program a következőképpen indítható el (fontos, hogy a kopter Wi-Fi-re csatlakozzon, az Ethernet kábel pedig a számítógéphez).

Nyissa meg a localhost:3000-et a böngészőben, és kattintson a Felismerés indítása gombra.

A helikopter hangvezérlését Node.js és ARDrone segítségével programozzuk

Igyekszünk irányítani a drónt, és boldogok vagyunk.

Videó adása drónról

A projektben hozzon létre egy új fájlt, és másolja oda ezt a kódot:

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

És itt van a HTML kód, a nyilvános mappába helyezzük.

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

Indítsa el és csatlakozzon a localhost:8080-hoz, hogy megnézze a videót az elülső kameráról.

A helikopter hangvezérlését Node.js és ARDrone segítségével programozzuk

Hasznos tippek

  • Repüljön beltérben ezzel a drónnal.
  • Felszállás előtt mindig tegye fel drónjára a védőhuzatot.
  • Ellenőrizze, hogy az akkumulátor fel van-e töltve.
  • Ha a drón furcsán viselkedik, tartsa lenyomva, és fordítsa meg. Ezzel a művelettel a helikopter vészüzemmódba kerül, és a rotorok azonnal leállnak.

Kész kód és demó

LIVE DEMO

LETÖLTÉS

Megtörtént!

Ha megírod a kódot, majd nézed, ahogy a gép elkezd engedelmeskedni, az örömet okoz! Most kitaláltuk, hogyan tanítsuk meg a drónt a hangutasítások hallgatására. Valójában sokkal több lehetőség van: felhasználói arcfelismerés, autonóm repülés, gesztusfelismerés és még sok más.

Mit tudtok javasolni a program fejlesztésére?

A Skillbox a következőket ajánlja:

Forrás: will.com

Hozzászólás