Prugrammu u cuntrollu di voce di l'copter utilizendu Node.js è ARDrone

Prugrammu u cuntrollu di voce di l'copter utilizendu Node.js è ARDrone

In questu tutoriale, guardemu à creà un prugramma per un drone cù cuntrollu di voce cù Node.js è API di discorsu Web. Copter - Parrot ARDrone 2.0.

Ramintemu: per tutti i lettori di "Habr" - un scontu di 10 000 rubles quandu si iscrizzione in ogni cursu Skillbox cù u codice promozionale "Habr".

Skillbox consiglia: Corso praticu "Sviluppatore Mobile PRO".

Introduzione

I droni sò incredibili. Mi piace veramente ghjucà cù u mo quad, piglià foto è video, o solu divertevi. Ma i veiculi aerei senza pilota (UAV) sò usati per più di l'intrattenimentu. U travagliu in u cinema, studia i glaciers, è sò usati da i militari è rapprisintanti di u settore agriculu.

In questu tutoriale, avemu da circà à creà un prugramma chì vi permetterà di cuntrullà un drone. usendu cumandamenti di voce. Iè, l'copter farà ciò chì dite di fà. À a fine di l'articulu ci hè un prugramma prontu è video di cuntrollu UAV.

Ferru

Avemu bisognu di i seguenti:

  • Parrot ARDrone 2.0;
  • cable Ethernet;
  • bonu microfonu.

U sviluppu è a gestione seranu realizati nantu à stazioni di travagliu cù Windows / Mac / Ubuntu. In modu persunale, aghju travagliatu cù Mac è Ubuntu 18.04.

Software

Scaricate l'ultima versione di Node.js da situ ufficiali.

Hè ancu necessariu l'ultima versione di Google Chrome.

Capisce u copter

Pruvemu di capisce cumu funziona Parrot ARDrone. Stu copter hà quattru mutori.

Prugrammu u cuntrollu di voce di l'copter utilizendu Node.js è ARDrone

I mutori opposti travaglianu in a listessa direzzione. Una coppia gira in senso orario, l'altra in senso antiorario. U drone si move cambiendu l'angolo di inclinazione relative à a superficia di a terra, cambiendu a velocità di rotazione di i mutori è parechji altri movimenti manuvrabili.

Prugrammu u cuntrollu di voce di l'copter utilizendu Node.js è ARDrone

Comu pudemu vede in u diagramma sopra, cambià parechji paràmetri porta à un cambiamentu in a direzzione di u muvimentu di l'copter. Per esempiu, a diminuzione o l'aumentu di a velocità di rotazione di i rotori di manca è di diritta crea un rollu. Questu permette à u drone di vulà in avanti o in daretu.

Cambiendu a vitezza è a direzzione di i mutori, avemu stabilitu anguli d'inclinazione chì permettenu à l'copter di spustà in altre direzzione. In verità, per u prughjettu attuale ùn ci hè bisognu di studià l'aerodinamica, basta à capisce i principii basi.

Cumu funziona Parrot ARDrone

U drone hè un hotspot Wi-Fi. Per riceve è mandà cumandamenti à l'copteru, avete bisognu di cunnette à questu puntu. Ci hè parechje applicazioni diverse chì permettenu di cuntrullà i quadcopters. Tuttu pare qualcosa cusì:

Prugrammu u cuntrollu di voce di l'copter utilizendu Node.js è ARDrone

Appena u drone hè cunnessu, apre u terminal è telnet 192.168.1.1 - questu hè l'IP di l'copter. Per Linux pudete aduprà Linux Busybox.

Architettura di l'applicazione

U nostru codice serà divisu in i seguenti moduli:

  • interfaccia d'utilizatore cù API di voce per a rilevazione di voce;
  • cumandamenti di filtru è paragunà cù un standard;
  • mandendu cumandamenti à u drone;
  • trasmissione video in diretta.

L'API funziona sempre chì ci hè una cunnessione Internet. Per assicurà questu, aghjunghjemu una cunnessione Ethernet.

Hè ora di creà una applicazione!

Codice

Prima, creemu un novu cartulare è cambiassi cù u terminal.

Allora creamu un prughjettu Node cù i cumandamenti sottu.

Prima, installemu e dipendenze necessarie.

npm install 

Supporteremu i seguenti cumandamenti:

  • vai ti ne;
  • sbarcu;
  • up - u drone s'alza una mità di metru è passa;
  • falà - cade un mezu metru è si congela;
  • à manca - va un mezu metru à manca;
  • à a diritta - va un mezu metru à a diritta;
  • rotazione - gira in senso orario 90 gradi;
  • avanti - avanza un mezu metru;
  • back - torna à mezu metru;
  • ferma.

Eccu u codice chì permette di accettà cumandamenti, filtrà è cuntrullà u drone.

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

È quì hè u codice HTML è JavaScript chì sente à l'utilizatore è manda un cumandamentu à u servitore Node.

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

È ancu codice JavaScript per travaglià cù cumandamenti di voce, mandendu à u servitore Node.

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

Lanciatu di l'applicazione

U prugramma pò esse lanciatu cum'è seguitu (hè impurtante per assicurà chì u copter hè cunnessu à Wi-Fi è u cable Ethernet hè cunnessu à l'urdinatore).

Aprite localhost:3000 in u navigatore è cliccate Start Recognition.

Prugrammu u cuntrollu di voce di l'copter utilizendu Node.js è ARDrone

Pruvemu di cuntrullà u drone è sò felici.

Trasmissione di video da un drone

In u prughjettu, crea un novu schedariu è copià stu codice quì:

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

È quì hè u codice HTML, u pusemu in u cartulare publicu.

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

Lanciate è cunnette à localhost: 8080 per vede u video da a camera frontale.

Prugrammu u cuntrollu di voce di l'copter utilizendu Node.js è ARDrone

Tips Tips

  • Vola stu drone in casa.
  • Mettite sempre a tappa protettiva nantu à u vostru drone prima di cullà.
  • Verificate se a bateria hè carica.
  • Se u drone si cumporta in modu stranu, tenete premutu è girallu. Questa azzione metterà l'copteru in modu d'emergenza è i rotori si fermanu immediatamente.

Codici pronti è demo

DEMO LIVE

DOWNLOAD

Accadutu!

Scrive u codice è poi fighjulà a macchina chì principia à ubbidisce vi darà piacè! Avà avemu capitu cumu insignà à un drone à sente i cumandamenti di voce. In fatti, ci sò assai più pussibulità: ricunniscenza faciale d'utilizatori, voli autonomi, ricunniscenza di gestu è assai di più.

Chì pudete suggerisce per migliurà u prugramma?

Skillbox consiglia:

Source: www.habr.com

Add a comment