Kopterio valdymą balsu programuojame naudodami Node.js ir ARDrone

Kopterio valdymą balsu programuojame naudodami Node.js ir ARDrone

Šioje pamokoje apžvelgsime, kaip sukurti programą dronui su valdymu balsu naudojant Node.js ir žiniatinklio kalbos API. Kopteris – Parrot ARDrone 2.0.

Primename: visiems „Habr“ skaitytojams – 10 000 rublių nuolaida užsiregistravus į bet kurį „Skillbox“ kursą naudojant „Habr“ reklamos kodą.

„Skillbox“ rekomenduoja: Praktinis kursas „Mobile Developer PRO“.

įvedimas

Dronai yra nuostabūs. Man labai patinka žaisti su savo keturkoju, fotografuoti ir filmuoti ar tiesiog smagiai leisti laiką. Tačiau nepilotuojami orlaiviai (UAV) naudojami ne tik pramogoms. Jie dirba kine, studijuoja ledynus, juos naudoja kariškiai ir žemės ūkio sektoriaus atstovai.

Šioje pamokoje apžvelgsime, kaip sukurti programą, kuri leis valdyti droną. naudojant balso komandas. Taip, kopteris padarys tai, ką jam liepsite. Straipsnio pabaigoje yra paruošta UAV valdymo programa ir vaizdo įrašas.

geležies

Mums reikia šių dalykų:

  • Parrot ARDrone 2.0;
  • Ethernet kabelis;
  • geras mikrofonas.

Kūrimas ir valdymas bus vykdomas darbo vietose su Windows/Mac/Ubuntu. Asmeniškai aš dirbau su Mac ir Ubuntu 18.04.

Programinė įranga

Atsisiųskite naujausią Node.js versiją iš oficiali svetainė.

Taip pat reikalingas naujausia Google Chrome versija.

Kopterio supratimas

Pabandykime suprasti, kaip veikia Parrot ARDrone. Šis kopteris turi keturis variklius.

Kopterio valdymą balsu programuojame naudodami Node.js ir ARDrone

Priešingi varikliai veikia ta pačia kryptimi. Viena pora sukasi pagal laikrodžio rodyklę, kita prieš laikrodžio rodyklę. Dronas juda keičiant polinkio kampą žemės paviršiaus atžvilgiu, keičiant variklių sukimosi greitį ir keletą kitų manevringų judesių.

Kopterio valdymą balsu programuojame naudodami Node.js ir ARDrone

Kaip matome aukščiau esančioje diagramoje, keičiant įvairius parametrus, pasikeičia kopterio judėjimo kryptis. Pavyzdžiui, sumažinus arba padidinus kairiojo ir dešiniojo rotoriaus sukimosi greitį, susidaro ritinys. Tai leidžia dronui skristi pirmyn arba atgal.

Keisdami variklių greitį ir kryptį nustatome pasvirimo kampus, kurie leidžia kopteriui judėti kitomis kryptimis. Tiesą sakant, dabartiniam projektui nereikia studijuoti aerodinamikos, tereikia suprasti pagrindinius principus.

Kaip veikia Parrot ARDrone

Dronas yra „Wi-Fi“ viešosios interneto prieigos taškas. Norėdami gauti ir siųsti komandas kopteriui, turite prisijungti prie šio taško. Yra daug įvairių programų, kurios leidžia valdyti keturkoperius. Viskas atrodo maždaug taip:

Kopterio valdymą balsu programuojame naudodami Node.js ir ARDrone

Kai tik dronas bus prijungtas, atidarykite terminalą ir telnet 192.168.1.1 - tai yra kopterio IP. „Linux“ galite naudoti Linux Busybox.

Programos architektūra

Mūsų kodas bus padalintas į šiuos modulius:

  • vartotojo sąsaja su kalbos API balso aptikimui;
  • filtravimo komandas ir lyginimas su standartu;
  • komandų siuntimas dronui;
  • tiesioginė vaizdo transliacija.

API veikia tol, kol yra interneto ryšys. Norėdami tai užtikrinti, pridedame Ethernet ryšį.

Atėjo laikas sukurti programą!

Kodas

Pirmiausia sukurkime naują aplanką ir perjunkite į jį naudodami terminalą.

Tada mes sukuriame mazgo projektą naudodami toliau pateiktas komandas.

Pirmiausia įdiegiame reikiamas priklausomybes.

npm įdiegti 

Mes palaikysime šias komandas:

  • kilimas;
  • nusileidimas;
  • į viršų – dronas pakyla pusę metro ir pakyla;
  • žemyn - nukrenta pusę metro ir sustingsta;
  • į kairę - eina pusę metro į kairę;
  • į dešinę - eina pusę metro į dešinę;
  • pasukimas - sukasi pagal laikrodžio rodyklę 90 laipsnių;
  • į priekį - eina į priekį pusę metro;
  • atgal - grįžta pusę metro;
  • sustabdyti.

Čia yra kodas, leidžiantis priimti komandas, jas filtruoti ir valdyti droną.

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

O štai HTML ir JavaScript kodas, kuris klauso vartotojo ir siunčia komandą į Node serverį.

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

Taip pat JavaScript kodas, skirtas dirbti su balso komandomis, siunčiant jas į Node serverį.

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

Programos paleidimas

Programą galima paleisti taip (svarbu įsitikinti, kad kopteris yra prijungtas prie Wi-Fi, o Ethernet laidas prijungtas prie kompiuterio).

Naršyklėje atidarykite localhost:3000 ir spustelėkite Pradėti atpažinimą.

Kopterio valdymą balsu programuojame naudodami Node.js ir ARDrone

Stengiamės suvaldyti droną ir džiaugiamės.

Vaizdo įrašų transliacija iš drono

Projekte sukurkite naują failą ir nukopijuokite šį kodą:

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

Ir čia yra HTML kodas, mes įdedame jį į viešąjį aplanką.

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

Paleiskite ir prisijunkite prie localhost:8080, kad peržiūrėtumėte vaizdo įrašą iš priekinės kameros.

Kopterio valdymą balsu programuojame naudodami Node.js ir ARDrone

Naudingi patarimai

  • Skriskite šiuo dronu patalpose.
  • Prieš pakildami ant drono visada uždėkite apsauginį dangtelį.
  • Patikrinkite, ar akumuliatorius įkrautas.
  • Jei dronas elgiasi keistai, laikykite jį nuspaudę ir apverskite. Šis veiksmas perves kopterį į avarinį režimą, o rotoriai iš karto sustos.

Paruoštas kodas ir demonstracinė versija

GYVAS DEMO

ATSISIŲSTI

Įvyko!

Rašydami kodą ir tada stebėdami, kaip aparatas pradeda paklusti, suteiks jums malonumą! Dabar mes sugalvojome, kaip išmokyti droną klausytis balso komandų. Tiesą sakant, yra daug daugiau galimybių: vartotojo veido atpažinimas, autonominiai skrydžiai, gestų atpažinimas ir daug daugiau.

Ką galėtumėte pasiūlyti programai tobulinti?

„Skillbox“ rekomenduoja:

Šaltinis: www.habr.com

Добавить комментарий