Sicwangcisa ulawulo lwelizwi kwi-copter usebenzisa i-Node.js kunye ne-ARDrone

Sicwangcisa ulawulo lwelizwi kwi-copter usebenzisa i-Node.js kunye ne-ARDrone

Kule tutorial siza kujonga ekudaleni inkqubo yedrone enolawulo lwelizwi usebenzisa iNode.js kunye neWeb Speech API. ICopter-Parrot ARDrone 2.0.

Siyakhumbuza: kubo bonke abafundi be "Habr" - isaphulelo se-ruble ye-10 xa ubhalisa kuyo nayiphi na ikhosi ye-Skillbox usebenzisa ikhowudi yokuphromotha "Habr".

I-Skillbox iyacebisa: Ikhosi esebenzayo "UMqulunqi we-PRO".

Intshayelelo

Iidrone ziyamangalisa. Ndikonwabela kakhulu ukudlala nequad yam, ukuthatha iifoto kunye neevidiyo, okanye ukonwaba nje. Kodwa iinqwelo-moya ezingenabantu (ii-UAVs) zisetyenziselwa okungakumbi kunokuzonwabisa nje. Basebenza kwi-cinema, bafunda imikhenkce, kwaye basetyenziswa ngamajoni kunye nabameli becandelo lezolimo.

Kule tutorial siza kujonga ekudaleni inkqubo eya kukuvumela ukuba ulawule idrone. usebenzisa imiyalelo yelizwi. Ewe, icopter iya kwenza le nto uyixelela ukuba iyenze. Ekupheleni kwenqaku kukho inkqubo esele yenziwe kunye nevidiyo yolawulo lwe-UAV.

Intsimbi

Sifuna oku kulandelayo:

  • I-Parrot ARDrone 2.0;
  • Intambo ye-Ethernet;
  • imakrofoni elungileyo.

Uphuhliso nolawulo luya kuqhutywa kwiindawo zokusebenza ezineWindows/Mac/Ubuntu. Ngokomntu, ndasebenza noMac kunye no-Ubuntu 18.04.

Software

Khuphela inguqulelo yamva nje yeNode.js ukusuka indawo esemthethweni.

Kwakhona kufuneka inguqulelo yamva nje kaGoogle Chrome.

Ukuqonda icopter

Makhe sizame ukuqonda indlela iParrot ARDrone esebenza ngayo. Le copter ineenjini ezine.

Sicwangcisa ulawulo lwelizwi kwi-copter usebenzisa i-Node.js kunye ne-ARDrone

Iinjini ezichasayo zisebenza kwicala elinye. Esinye isibini sijikeleza ngasekunene, esinye sijikeleza ngasekunene. Idrone ihamba ngokuguqula i-engile yokuthambekela kumphezulu womhlaba, itshintsha isantya sokujikeleza kweenjini kunye nezinye iintshukumo ezininzi ezinokulawuleka.

Sicwangcisa ulawulo lwelizwi kwi-copter usebenzisa i-Node.js kunye ne-ARDrone

Njengoko sinokubona kumzobo ongasentla, ukutshintsha iiparamitha ezahlukeneyo kukhokelela kutshintsho kwindlela yokuhamba kwecopter. Ngokomzekelo, ukunciphisa okanye ukwandisa isantya sokujikeleza kwe-rotors yasekhohlo nasekunene kudala umqulu. Oku kuvumela idrone ukuba ibhabhe phambili okanye ngasemva.

Ngokutshintsha isantya kunye necala leenjini, sibeka ii-engile zokuthambeka ezivumela ukuba i-copter ihambe kwelinye icala. Ngokwenyani, kwiprojekthi yangoku akukho mfuneko yokufunda i-aerodynamics, kufuneka nje uqonde imigaqo esisiseko.

Isebenza njani iParrot ARDrone

Idrone yindawo yeWi-Fi. Ukuze ufumane kwaye uthumele imiyalelo kwi-copter, kufuneka udibanise kule ndawo. Zininzi izicelo ezahlukeneyo ezikuvumela ukuba ulawule ii-quadcopters. Yonke into ibonakala ngolu hlobo:

Sicwangcisa ulawulo lwelizwi kwi-copter usebenzisa i-Node.js kunye ne-ARDrone

Ngokukhawuleza ukuba i-drone ixhunyiwe, vula i-terminal kunye ne-telnet 192.168.1.1 - le yi-IP ye-copter. KwiLinux ungasebenzisa Linux Busybox.

Uyilo lwesicelo

Ikhowudi yethu iya kwahlulwa ngokwezi modyuli zilandelayo:

  • ujongano lomsebenzisi ngentetho yeAPI yokuchongwa kwelizwi;
  • imiyalelo yokucoca nokuthelekisa nomgangatho;
  • ukuthumela imiyalelo kwidrone;
  • usasazo lwevidiyo ephilayo.

I-API isebenza nje ukuba kukho uxhumano lwe-Intanethi. Ukuqinisekisa oku, songeza uqhagamshelo lwe-Ethernet.

Lixesha lokwenza isicelo!

Ikhowudi

Okokuqala, masenze ifolda entsha kwaye sitshintshele kuyo sisebenzisa i-terminal.

Emva koko senza iprojekthi yeNode usebenzisa le miyalelo ingezantsi.

Okokuqala, sifaka ukuxhomekeka okufunekayo.

npm ukufakaβ€Š

Siza kuxhasa le miyalelo ilandelayo:

  • suka uhambe;
  • ukuhla;
  • phezulu - i-drone iphakama isiqingatha semitha kunye ne-hovers;
  • phantsi - iwela isiqingatha semitha kunye neqhwa;
  • ngakwesobunxele - ukuya kwisiqingatha semitha ukuya ngakwesobunxele;
  • ngakwesokudla - iya kwisiqingatha semitha ukuya ngasekunene;
  • ukujikeleza - ukujikeleza nge-clockwise 90 degrees;
  • phambili - iya phambili isiqingatha semitha;
  • umva - ubuyela emva kwesiqingatha semitha;
  • Yeka.

Nantsi ikhowudi ekuvumela ukuba wamkele imiyalelo, uyihluze kwaye ulawule idrone.

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

Kwaye nantsi ikhowudi yeHTML kunye neJavaScript ephulaphula umsebenzisi kwaye ithumela umyalelo kwiseva yeNode.

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

Kwaye kunye nekhowudi yeJavaScript yokusebenza ngemiyalelo yelizwi, ukuyithumela kwiseva yeNode.

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

Qalisa isicelo

Inkqubo inokuqaliswa ngolu hlobo lulandelayo (kubalulekile ukuqinisekisa ukuba i-copter ixhunyiwe kwi-Wi-Fi kunye nekhebula le-Ethernet lixhunyiwe kwikhompyutheni).

Vula i-localhost: 3000 kwisikhangeli kwaye ucofe uQala ukuQiniswa.

Sicwangcisa ulawulo lwelizwi kwi-copter usebenzisa i-Node.js kunye ne-ARDrone

Sizama ukulawula idrone kwaye sonwabile.

Ukusasaza ividiyo kwidrone

Kwiprojekthi, yenza ifayile entsha kwaye ukope le khowudi apho:

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

Kwaye nantsi ikhowudi ye-HTML, siyibeka ngaphakathi kwifolda yoluntu.

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

Qalisa kwaye uqhagamshele kwi-localhost:8080 ukujonga ividiyo kwikhamera engaphambili.

Sicwangcisa ulawulo lwelizwi kwi-copter usebenzisa i-Node.js kunye ne-ARDrone

Iingcebiso eziNcedo

  • Bhabha le drone ngaphakathi endlwini.
  • Soloko ubeka isigqubuthelo sokhuselo kwidrone yakho phambi kokuba ihambe.
  • Jonga ukuba ibhetri ishajiwe na.
  • Ukuba idrone iziphatha ngendlela engaqhelekanga, yibambe phantsi kwaye uyijikelezise. Esi senzo siya kubeka i-copter kwimodi yongxamiseko kwaye i-rotors iya kuyeka ngokukhawuleza.

Ikhowudi esele ilungile kunye nedemo

I-DEMO ephilayo

KHUPHELE

Yenzekile!

Ikhowudi yokubhala kwaye emva koko ukubukela umatshini uqala ukuthobela kuya kukunika uyolo! Ngoku sifumene indlela yokufundisa idrone ukumamela imiyalelo yelizwi. Ngapha koko, maninzi kakhulu amathuba anokwenzeka: ukuqondwa kobuso bomsebenzisi, iinqwelomoya ezizimeleyo, ukuqondwa komzimba kunye nokunye okuninzi.

Ungacebisa ntoni ukuphucula inkqubo?

I-Skillbox iyacebisa:

umthombo: www.habr.com

Yongeza izimvo