Programujemy sterowanie głosowe helikopterem za pomocą Node.js i ARDrone

Programujemy sterowanie głosowe helikopterem za pomocą Node.js i ARDrone

W tym samouczku przyjrzymy się tworzeniu programu dla drona ze sterowaniem głosowym przy użyciu Node.js i Web Speech API. Helikopter - Parrot ARDrone 2.0.

Przypomnienie: dla wszystkich czytelników „Habr” - rabat w wysokości 10 000 rubli przy zapisywaniu się na dowolny kurs Skillbox przy użyciu kodu promocyjnego „Habr”.

Skillbox poleca: Kurs praktyczny „Programista mobilny PRO”.

Wprowadzenie

Drony są niesamowite. Bardzo lubię bawić się moim quadem, robić zdjęcia i nagrywać filmy lub po prostu dobrze się bawić. Jednak bezzałogowe statki powietrzne (UAV) służą nie tylko rozrywce. Pracują w kinie, badają lodowce, są wykorzystywani przez wojsko i przedstawicieli sektora rolniczego.

W tym samouczku przyjrzymy się stworzeniu programu, który pozwoli Ci sterować dronem. za pomocą poleceń głosowych. Tak, helikopter zrobi wszystko, co mu każesz. Na końcu artykułu znajduje się gotowy program i film przedstawiający sterowanie UAV.

żelazo

Potrzebujemy:

  • Parrot ARDrone 2.0;
  • Kabel Ethernet;
  • dobry mikrofon.

Rozwój i zarządzanie będą odbywać się na stacjach roboczych z systemem Windows/Mac/Ubuntu. Osobiście pracowałem z Macem i Ubuntu 18.04.

Oprogramowanie

Pobierz najnowszą wersję Node.js z Oficjalna strona.

Również potrzebne najnowsza wersja Google Chrome.

Zrozumienie helikoptera

Spróbujmy zrozumieć jak działa Parrot ARDrone. Ten helikopter ma cztery silniki.

Programujemy sterowanie głosowe helikopterem za pomocą Node.js i ARDrone

Przeciwne silniki pracują w tym samym kierunku. Jedna para obraca się zgodnie z ruchem wskazówek zegara, druga przeciwnie do ruchu wskazówek zegara. Dron porusza się poprzez zmianę kąta nachylenia względem powierzchni ziemi, zmianę prędkości obrotowej silników oraz kilka innych ruchów manewrowych.

Programujemy sterowanie głosowe helikopterem za pomocą Node.js i ARDrone

Jak widać na powyższym schemacie, zmiana różnych parametrów powoduje zmianę kierunku ruchu helikoptera. Na przykład zmniejszenie lub zwiększenie prędkości obrotowej lewego i prawego wirnika powoduje powstanie rolki. Dzięki temu dron może latać do przodu lub do tyłu.

Zmieniając prędkość i kierunek silników, ustawiamy kąty pochylenia, które pozwalają helikopterowi poruszać się w innych kierunkach. Właściwie w przypadku obecnego projektu nie ma potrzeby studiowania aerodynamiki, wystarczy zrozumieć podstawowe zasady.

Jak działa Parrot ARDrone

Dron jest hotspotem Wi-Fi. Aby odbierać i wysyłać polecenia do helikoptera należy połączyć się z tym punktem. Istnieje wiele różnych aplikacji, które pozwalają na sterowanie quadkopterami. Wszystko wygląda mniej więcej tak:

Programujemy sterowanie głosowe helikopterem za pomocą Node.js i ARDrone

Jak tylko dron się połączy, otwórz terminal i użyj telnetu 192.168.1.1 – jest to adres IP helikoptera. W przypadku Linuksa możesz użyć Linux Busybox.

Architektura aplikacji

Nasz kod zostanie podzielony na następujące moduły:

  • interfejs użytkownika z API mowy do wykrywania głosu;
  • filtrowanie poleceń i porównywanie ze standardem;
  • wysyłanie poleceń do drona;
  • transmisja wideo na żywo.

API działa tak długo jak istnieje połączenie z Internetem. Aby to zapewnić, dodajemy połączenie Ethernet.

Czas stworzyć aplikację!

Kod

Najpierw utwórzmy nowy folder i przełączmy się do niego za pomocą terminala.

Następnie tworzymy projekt Node za pomocą poniższych poleceń.

Najpierw instalujemy wymagane zależności.

npm zainstalować 

Będziemy obsługiwać następujące polecenia:

  • startować;
  • lądowanie;
  • w górę – dron wznosi się o pół metra i unosi się w powietrzu;
  • w dół - spada z pół metra i zamarza;
  • w lewo - idzie pół metra w lewo;
  • w prawo - idzie pół metra w prawo;
  • obrót - obraca się zgodnie z ruchem wskazówek zegara o 90 stopni;
  • do przodu - idzie do przodu o pół metra;
  • wstecz - cofa się o pół metra;
  • zatrzymywać się.

Oto kod, który pozwala akceptować polecenia, filtrować je i sterować dronem.

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 oto kod HTML i JavaScript, który nasłuchuje użytkownika i wysyła polecenie do serwera 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>

A także kod JavaScript do pracy z poleceniami głosowymi, wysyłający je do serwera 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'
 });
};

Uruchomienie aplikacji

Program można uruchomić w następujący sposób (ważne, aby helikopter był podłączony do Wi-Fi i kabel Ethernet był podłączony do komputera).

Otwórz localhost:3000 w przeglądarce i kliknij Rozpocznij rozpoznawanie.

Programujemy sterowanie głosowe helikopterem za pomocą Node.js i ARDrone

Próbujemy zapanować nad dronem i jesteśmy szczęśliwi.

Transmisja wideo z drona

W projekcie utwórz nowy plik i skopiuj tam ten 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);

A oto kod HTML, umieszczamy go w folderze publicznym.

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

Uruchom i połącz się z localhost:8080, aby oglądać wideo z przedniej kamery.

Programujemy sterowanie głosowe helikopterem za pomocą Node.js i ARDrone

Przydatne wskazówki

  • Lataj tym dronem w pomieszczeniu.
  • Zawsze zakładaj osłonę ochronną na drona przed startem.
  • Sprawdź, czy akumulator jest naładowany.
  • Jeśli dron zachowuje się dziwnie, przytrzymaj go i odwróć. Ta czynność przełączy helikopter w tryb awaryjny, a wirniki natychmiast się zatrzymają.

Gotowy kod i demo

DEMO NA ŻYWO

POBIERZ

Stało się!

Pisanie kodu, a następnie obserwowanie, jak maszyna zaczyna się słuchać, sprawi Ci przyjemność! Teraz wymyśliliśmy, jak nauczyć drona słuchania poleceń głosowych. W rzeczywistości możliwości jest znacznie więcej: rozpoznawanie twarzy użytkownika, loty autonomiczne, rozpoznawanie gestów i wiele więcej.

Co możesz zasugerować, aby ulepszyć program?

Skillbox poleca:

Źródło: www.habr.com

Dodaj komentarz