Programiramo glasovno upravljanje helikopterom koristeći Node.js i ARDrone

Programiramo glasovno upravljanje helikopterom koristeći Node.js i ARDrone

U ovom vodiču ćemo pogledati stvaranje programa za dron s glasovnom kontrolom pomoću Node.js i Web govornog API-ja. Copter - Parrot ARDrone 2.0.

Podsjećamo: za sve čitatelje "Habra" - popust od 10 000 rubalja pri upisu na bilo koji tečaj Skillbox koristeći promotivni kod "Habr".

Skillbox preporučuje: Praktični tečaj "Mobile Developer PRO".

Uvod

Dronovi su nevjerojatni. Zaista uživam igrati se sa svojim quadom, fotografirati i snimati ili se jednostavno zabavljati. Ali bespilotne letjelice (UAV) koriste se više od puke zabave. Rade u kinu, proučavaju ledenjake, koriste ih vojska i predstavnici poljoprivrednog sektora.

U ovom vodiču ćemo pogledati stvaranje programa koji će vam omogućiti upravljanje dronom. pomoću glasovnih naredbi. Da, helikopter će učiniti što mu kažete. Na kraju članka nalazi se gotov program i video nadzor UAV-a.

željezo

Trebamo sljedeće:

  • Parrot ARDrone 2.0;
  • Ethernet kabel;
  • dobar mikrofon.

Razvoj i upravljanje će se provoditi na radnim stanicama s Windows/Mac/Ubuntu. Osobno sam radio s Mac-om i Ubuntuom 18.04.

Softver

Preuzmite najnoviju verziju Node.js sa službena stranica.

Također potrebno najnovija verzija Google Chromea.

Razumijevanje helikoptera

Pokušajmo razumjeti kako Parrot ARDrone radi. Ovaj helikopter ima četiri motora.

Programiramo glasovno upravljanje helikopterom koristeći Node.js i ARDrone

Suprotni motori rade u istom smjeru. Jedan par se okreće u smjeru kazaljke na satu, drugi u suprotnom smjeru. Dron se kreće promjenom kuta nagiba u odnosu na površinu zemlje, promjenom brzine rotacije motora i nekoliko drugih manevarskih pokreta.

Programiramo glasovno upravljanje helikopterom koristeći Node.js i ARDrone

Kao što možemo vidjeti na gornjem dijagramu, promjena različitih parametara dovodi do promjene smjera kretanja helikoptera. Na primjer, smanjenje ili povećanje brzine rotacije lijevog i desnog rotora stvara okretanje. To omogućuje dronu da leti naprijed ili natrag.

Promjenom brzine i smjera motora postavljamo kutove nagiba koji omogućavaju kretanje helikoptera u drugim smjerovima. Zapravo, za trenutni projekt nema potrebe proučavati aerodinamiku, samo trebate razumjeti osnovne principe.

Kako radi Parrot ARDrone

Dron je Wi-Fi hotspot. Kako biste primali i slali naredbe helikopteru, morate se spojiti na ovu točku. Postoji mnogo različitih aplikacija koje vam omogućuju upravljanje kvadrokopterima. Sve to otprilike izgleda ovako:

Programiramo glasovno upravljanje helikopterom koristeći Node.js i ARDrone

Čim se dron spoji, otvorite terminal i telnet 192.168.1.1 - ovo je IP adresa helikoptera. Za Linux možete koristiti Linux Busybox.

Arhitektura aplikacije

Naš kod će biti podijeljen u sljedeće module:

  • korisničko sučelje s govornim API-jem za detekciju glasa;
  • filtriranje naredbi i usporedba sa standardom;
  • slanje naredbi dronu;
  • video prijenos uživo.

API radi sve dok postoji internetska veza. Kako bismo to osigurali, dodajemo Ethernet vezu.

Vrijeme je za izradu aplikacije!

Kodirati

Najprije stvorimo novu mapu i prebacimo se na nju pomoću terminala.

Zatim stvaramo Node projekt pomoću donjih naredbi.

Prvo instaliramo potrebne ovisnosti.

npm instalirati 

Podržat ćemo sljedeće naredbe:

  • polijetanje;
  • slijetanje;
  • gore - dron se diže pola metra i lebdi;
  • dolje - pada pola metra i smrzava se;
  • ulijevo - ide pola metra ulijevo;
  • udesno - ide pola metra udesno;
  • rotacija - okreće se u smjeru kazaljke na satu za 90 stupnjeva;
  • naprijed - ide naprijed pola metra;
  • leđa - ide natrag pola metra;
  • Stop.

Evo koda koji vam omogućuje prihvaćanje naredbi, njihovo filtriranje i upravljanje dronom.

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

A ovdje je HTML i JavaScript kod koji sluša korisnika i šalje naredbu Node poslužitelju.

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

I također JavaScript kod za rad s glasovnim naredbama, slanje ih na poslužitelj čvora.

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

Pokretanje aplikacije

Program se može pokrenuti na sljedeći način (važno je provjeriti je li helikopter spojen na Wi-Fi i Ethernet kabel spojen na računalo).

Otvorite localhost:3000 u pregledniku i kliknite Pokreni prepoznavanje.

Programiramo glasovno upravljanje helikopterom koristeći Node.js i ARDrone

Pokušavamo kontrolirati dron i sretni smo.

Emitiranje videa iz drona

U projektu stvorite novu datoteku i tamo kopirajte ovaj 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);

I ovdje je HTML kod, stavljamo ga u javnu mapu.

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

Pokrenite i povežite se na localhost:8080 za gledanje videa s prednje kamere.

Programiramo glasovno upravljanje helikopterom koristeći Node.js i ARDrone

Korisni savjeti

  • Letite ovim dronom u zatvorenom prostoru.
  • Uvijek stavite zaštitnu masku na svoj dron prije polijetanja.
  • Provjerite je li baterija napunjena.
  • Ako se dron čudno ponaša, držite ga i preokrenite. Ova radnja će prebaciti helikopter u hitni način rada i rotori će se odmah zaustaviti.

Spremni kod i demo

LIVE DEMO

DOWNLOAD

Dogodilo se!

Pisanje koda i zatim gledanje stroja kako se pokorava pružit će vam zadovoljstvo! Sada smo otkrili kako dron naučiti da sluša glasovne naredbe. Zapravo, postoji mnogo više mogućnosti: prepoznavanje lica korisnika, autonomni letovi, prepoznavanje gesta i još mnogo toga.

Što možete predložiti za poboljšanje programa?

Skillbox preporučuje:

Izvor: www.habr.com

Dodajte komentar