Programmiamo il controllo vocale dell'elicottero utilizzando Node.js e ARDrone

Programmiamo il controllo vocale dell'elicottero utilizzando Node.js e ARDrone

In questo tutorial esamineremo la creazione di un programma per un drone con controllo vocale utilizzando Node.js e API vocale Web. Elicottero - Parrot ARDrone 2.0.

Ti ricordiamo: per tutti i lettori di "Habr" - uno sconto di 10 rubli al momento dell'iscrizione a qualsiasi corso Skillbox utilizzando il codice promozionale "Habr".

Skillbox consiglia: Corso pratico "Sviluppatore mobile PRO".

Introduzione

I droni sono fantastici. Mi piace molto giocare con il mio quad, scattare foto e video o semplicemente divertirmi. Ma i veicoli aerei senza pilota (UAV) non vengono utilizzati solo per l’intrattenimento. Funzionano nel cinema, studiano i ghiacciai e sono utilizzati dai militari e dai rappresentanti del settore agricolo.

In questo tutorial vedremo come creare un programma che ti permetterà di controllare un drone. utilizzando i comandi vocali. Sì, l'elicottero farà quello che gli dici di fare. Alla fine dell'articolo c'è un programma già pronto e un video di controllo UAV.

ferro

Abbiamo bisogno di quanto segue:

  • Parrot ARDrone 2.0;
  • Cavo Ethernet;
  • buon microfono.

Lo sviluppo e la gestione saranno effettuati su postazioni Windows/Mac/Ubuntu. Personalmente ho lavorato con Mac e Ubuntu 18.04.

Software

Scarica l'ultima versione di Node.js da sito ufficiale.

Anche necessario ultima versione di Google Chrome.

Capire l'elicottero

Cerchiamo di capire come funziona Parrot ARDrone. Questo elicottero ha quattro motori.

Programmiamo il controllo vocale dell'elicottero utilizzando Node.js e ARDrone

I motori opposti lavorano nella stessa direzione. Una coppia ruota in senso orario, l'altra in senso antiorario. Il drone si muove modificando l'angolo di inclinazione rispetto alla superficie terrestre, modificando la velocità di rotazione dei motori e numerosi altri movimenti manovrabili.

Programmiamo il controllo vocale dell'elicottero utilizzando Node.js e ARDrone

Come possiamo vedere nel diagramma sopra, la modifica di vari parametri porta ad un cambiamento nella direzione del movimento dell'elicottero. Ad esempio, diminuendo o aumentando la velocità di rotazione dei rotori sinistro e destro si crea un rollio. Ciò consente al drone di volare avanti o indietro.

Modificando la velocità e la direzione dei motori, impostiamo angoli di inclinazione che consentono all'elicottero di muoversi in altre direzioni. In realtà per il progetto attuale non è necessario studiare l'aerodinamica, basta solo comprenderne i principi di base.

Come funziona Parrot ARDrone

Il drone è un hotspot Wi-Fi. Per ricevere e inviare comandi all'elicottero è necessario connettersi a questo punto. Esistono molte applicazioni diverse che ti consentono di controllare i quadricotteri. Sembra tutto più o meno questo:

Programmiamo il controllo vocale dell'elicottero utilizzando Node.js e ARDrone

Non appena il drone è connesso, apri il terminale e telnet 192.168.1.1: questo è l'IP dell'elicottero. Per Linux puoi usare Casella occupata di Linux.

Architettura dell'applicazione

Il nostro codice sarà suddiviso nei seguenti moduli:

  • interfaccia utente con API vocale per il rilevamento vocale;
  • filtraggio dei comandi e confronto con uno standard;
  • inviare comandi al drone;
  • trasmissione video in diretta.

L'API funziona finché è disponibile una connessione Internet. Per garantire ciò, aggiungiamo una connessione Ethernet.

È il momento di creare un'applicazione!

Codice

Innanzitutto, creiamo una nuova cartella e passiamo ad essa utilizzando il terminale.

Quindi creiamo un progetto Node utilizzando i comandi seguenti.

Per prima cosa installiamo le dipendenze richieste.

installazione di npm 

Supporteremo i seguenti comandi:

  • decollare;
  • approdo;
  • su: il drone si alza di mezzo metro e si libra;
  • giù - cade per mezzo metro e si blocca;
  • a sinistra - va mezzo metro a sinistra;
  • a destra - va mezzo metro a destra;
  • rotazione: ruota in senso orario di 90 gradi;
  • avanti: va avanti di mezzo metro;
  • indietro: torna indietro di mezzo metro;
  • Stop.

Ecco il codice che ti permette di accettare comandi, filtrarli e controllare il 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);

Ed ecco il codice HTML e JavaScript che ascolta l'utente e invia un comando al server 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>

E anche codice JavaScript per funzionare con i comandi vocali, inviandoli al server 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'
 });
};

Avvio dell'applicazione

Il programma può essere lanciato nel modo seguente (è importante assicurarsi che l'elicottero sia connesso al Wi-Fi e che il cavo Ethernet sia collegato al computer).

Aprire localhost:3000 nel browser e fare clic su Avvia riconoscimento.

Programmiamo il controllo vocale dell'elicottero utilizzando Node.js e ARDrone

Cerchiamo di controllare il drone e siamo felici.

Trasmissione di video da un drone

Nel progetto, crea un nuovo file e copia lì questo codice:

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

Ed ecco il codice HTML, lo inseriamo nella cartella pubblica.

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

Avvia e connettiti a localhost:8080 per visualizzare il video dalla fotocamera anteriore.

Programmiamo il controllo vocale dell'elicottero utilizzando Node.js e ARDrone

Consigli utili

  • Fai volare questo drone in ambienti chiusi.
  • Metti sempre la copertura protettiva sul tuo drone prima del decollo.
  • Controlla se la batteria è carica.
  • Se il drone si comporta in modo strano, tienilo premuto e capovolgilo. Questa azione metterà l'elicottero in modalità di emergenza e i rotori si fermeranno immediatamente.

Codice pronto e demo

LIVE DEMO

DOWNLOAD

Si è scoperto!

Scrivere il codice e poi guardare la macchina iniziare a obbedire ti farà piacere! Ora abbiamo capito come insegnare a un drone ad ascoltare i comandi vocali. In effetti, ci sono molte più possibilità: riconoscimento facciale dell'utente, voli autonomi, riconoscimento dei gesti e molto altro.

Cosa puoi suggerire per migliorare il programma?

Skillbox consiglia:

Fonte: habr.com

Aggiungi un commento