Ni programas voĉan kontrolon de la koptero uzante Node.js kaj ARDrone

Ni programas voĉan kontrolon de la koptero uzante Node.js kaj ARDrone

En ĉi tiu lernilo ni rigardos krei programon por virabelo kun voĉa kontrolo per Node.js kaj Retparola API. Copter - Papago ARDrone 2.0.

Ni memorigas vin: por ĉiuj legantoj de "Habr" - rabato de 10 000 rubloj kiam oni enskribas en iu ajn Skillbox-kurso per la reklamkodo "Habr".

Skillbox rekomendas: Praktika kurso "Poŝtelefona Programisto PRO".

Enkonduko

Drones estas mirindaj. Mi tre ŝatas ludi kun mia kvaropo, fari fotojn kaj filmetojn, aŭ simple amuziĝi. Sed senpilotaj aerveturiloj (UAV) estas uzataj por pli ol nur distro. Ili laboras en kinejo, studas glaĉerojn, kaj estas uzitaj fare de la militistaro kaj reprezentantoj de la agrikultura sektoro.

En ĉi tiu lernilo ni rigardos krei programon, kiu permesos al vi kontroli dronon. uzante voĉkomandojn. Jes, la koptero faros tion, kion vi diras al ĝi. Ĉe la fino de la artikolo estas preta programo kaj video de UAV-kontrolo.

Fero

Ni bezonas la jenon:

  • Papago ARDrone 2.0;
  • Ethernet-kablo;
  • bona mikrofono.

Disvolviĝo kaj administrado estos efektivigitaj sur laborstacioj kun Vindozo/Mac/Ubuntu. Persone, mi laboris kun Mac kaj Ubuntu 18.04.

Programaro

Elŝutu la lastan version de Node.js de oficiala retejo.

Ankaŭ bezonata lasta versio de Google Chrome.

Komprenante la kopteron

Ni provu kompreni kiel funkcias Parrot ARDrone. Ĉi tiu koptero havas kvar motorojn.

Ni programas voĉan kontrolon de la koptero uzante Node.js kaj ARDrone

Kontraŭaj motoroj funkcias en la sama direkto. Unu paro turniĝas dekstrume, la alia maldekstrume. La virabelo moviĝas ŝanĝante la angulon de deklivo rilate al la surfaco de la tero, ŝanĝante la rapidon de rotacio de la motoroj kaj plurajn aliajn manovreblajn movojn.

Ni programas voĉan kontrolon de la koptero uzante Node.js kaj ARDrone

Kiel ni povas vidi en la supra diagramo, ŝanĝi diversajn parametrojn kondukas al ŝanĝo en la direkto de movado de la koptero. Ekzemple, malpliigi aŭ pliigi la rotacian rapidon de la maldekstraj kaj dekstraj rotoroj kreas rulon. Ĉi tio permesas al la virabelo flugi antaŭen aŭ malantaŭen.

Ŝanĝante la rapidecon kaj direkton de la motoroj, ni starigas kliniĝajn angulojn, kiuj permesas al la koptero moviĝi en aliaj direktoj. Efektive, por la nuna projekto ne necesas studi aerodinamikon, vi nur bezonas kompreni la bazajn principojn.

Kiel funkcias Parrot ARDrone

La virabelo estas Wifi-retpunkto. Por ricevi kaj sendi komandojn al la koptero, vi devas konekti al ĉi tiu punkto. Estas multaj malsamaj aplikoj, kiuj ebligas al vi kontroli kvarkopterojn. Ĉio aspektas kiel ĉi tio:

Ni programas voĉan kontrolon de la koptero uzante Node.js kaj ARDrone

Tuj kiam la virabelo estas konektita, malfermu la terminalon kaj telnet 192.168.1.1 - ĉi tio estas la IP de la koptero. Por Linukso vi povas uzi Linukso Busybox.

Aplika arkitekturo

Nia kodo estos dividita en la jenajn modulojn:

  • uzantinterfaco kun parolado API por voĉa detekto;
  • filtri komandojn kaj kompari kun normo;
  • sendante komandojn al la virabelo;
  • viva videoelsendo.

La API funkcias tiel longe kiel ekzistas interreta konekto. Por certigi ĉi tion, ni aldonas Ethernet-konekton.

Estas tempo krei aplikaĵon!

Kodo

Unue, ni kreu novan dosierujon kaj ŝanĝu al ĝi uzante la terminalon.

Tiam ni kreas Node-projekton uzante la komandojn sube.

Unue ni instalas la postulatajn dependecojn.

npaga instali 

Ni subtenos la jenajn komandojn:

  • ekflugo;
  • surteriĝo;
  • supren - la virabelo leviĝas duonmetron kaj ŝvebas;
  • down - falas duonmetron kaj frostas;
  • to the left - iras duonmetron maldekstren;
  • dekstre - iras duonmetron dekstren;
  • rotacio - turniĝas dekstrume 90 gradoj;
  • forward - iras antaŭen duonmetron;
  • back - reiras duonmetron;
  • haltu.

Jen la kodo, kiu permesas vin akcepti komandojn, filtri ilin kaj kontroli la dronon.

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

Kaj jen la HTML kaj JavaScript-kodo, kiu aŭskultas la uzanton kaj sendas komandon al la Node-servilo.

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

Kaj ankaŭ JavaScript-kodo por labori kun voĉaj komandoj, sendante ilin al la Node-servilo.

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

Lanĉante la programon

La programo povas esti lanĉita jene (gravas certigi, ke la koptero estas konektita al Wi-Fi kaj la Ethernet-kablo estas konektita al la komputilo).

Malfermu localhost:3000 en la retumilo kaj alklaku Komenci Rekonon.

Ni programas voĉan kontrolon de la koptero uzante Node.js kaj ARDrone

Ni provas kontroli la dronon kaj estas feliĉaj.

Dissendado de video de virabelo

En la projekto, kreu novan dosieron kaj kopiu ĉi tiun kodon tie:

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

Kaj jen la HTML-kodo, ni metas ĝin en la publikan dosierujon.

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

Lanĉu kaj konektu al localhost:8080 por vidi videon de la antaŭa fotilo.

Ni programas voĉan kontrolon de la koptero uzante Node.js kaj ARDrone

Helpema Konsiletoj

  • Flugu ĉi tiun dronon endome.
  • Ĉiam metu la protektan kovrilon sur vian dronon antaŭ ol ekflugi.
  • Kontrolu ĉu la kuirilaro estas ŝargita.
  • Se la virabelo kondutas strange, tenu ĝin kaj renversu ĝin. Ĉi tiu ago metos la kopteron en kriz-reĝimon kaj la rotoroj tuj ĉesos.

Preta kodo kaj demo

VIVA DEMO

DOWNLOAD

Okazis!

Skribi kodon kaj poste rigardi la maŝinon komenci obei donos al vi plezuron! Nun ni eksciis kiel instrui dronon aŭskulti voĉajn komandojn. Fakte, estas multe pli da eblecoj: uzanta vizaĝrekono, aŭtonomaj flugoj, gestrekono kaj multe pli.

Kion vi povas sugesti por plibonigi la programon?

Skillbox rekomendas:

fonto: www.habr.com

Aldoni komenton