Giprograma namo ang pagkontrol sa tingog sa copter gamit ang Node.js ug ARDrone

Giprograma namo ang pagkontrol sa tingog sa copter gamit ang Node.js ug ARDrone

Niini nga panudlo atong tan-awon ang paghimo og programa alang sa usa ka drone nga adunay kontrol sa tingog gamit ang Node.js ug Web speech API. Copter - Parrot ARDrone 2.0.

Gipahinumduman namon ikaw: alang sa tanan nga mga magbabasa sa "Habr" - usa ka diskwento sa 10 nga mga rubles kung nagpalista sa bisan unsang kurso sa Skillbox gamit ang code sa promosyon nga "Habr".

Girekomenda sa Skillbox: Praktikal nga kurso "Mobile Developer PRO".

Pasiuna

Ang mga drone talagsaon. Ganahan kaayo ko sa pagdula sa akong quad, pagkuha og mga litrato ug mga video, o paglingaw-lingaw lang. Apan ang mga unmanned aerial vehicles (UAVs) gigamit alang sa labaw pa sa kalingawan. Nagtrabaho sila sa sinehan, nagtuon sa mga glacier, ug gigamit sa militar ug mga representante sa sektor sa agrikultura.

Niini nga panudlo atong tan-awon ang paghimo sa usa ka programa nga magtugot kanimo sa pagkontrol sa usa ka drone. gamit ang voice commands. Oo, buhaton sa copter kung unsa ang imong gisulti nga buhaton niini. Sa katapusan sa artikulo adunay usa ka andam nga programa ug video sa pagkontrol sa UAV.

Iron

Kinahanglan nato ang mosunod:

  • Parrot ARDrone 2.0;
  • Ethernet nga kable;
  • maayong mikropono.

Ang pag-uswag ug pagdumala himuon sa mga workstation nga adunay Windows/Mac/Ubuntu. Sa personal, nagtrabaho ko sa Mac ug Ubuntu 18.04.

Software

I-download ang pinakabag-o nga bersyon sa Node.js gikan sa opisyal nga site.

Gikinahanglan usab pinakabag-o nga bersyon sa Google Chrome.

Pagsabot sa copter

Atong sulayan nga masabtan kung giunsa ang Parrot ARDrone molihok. Kini nga copter adunay upat ka mga motor.

Giprograma namo ang pagkontrol sa tingog sa copter gamit ang Node.js ug ARDrone

Ang kaatbang nga mga motor nagtrabaho sa parehas nga direksyon. Ang usa ka pares nagtuyok sa tuo nga tuo, ang lain nga pa-counterclockwise. Ang drone naglihok pinaagi sa pagbag-o sa anggulo sa hilig nga may kalabotan sa nawong sa yuta, pagbag-o sa katulin sa pagtuyok sa mga motor ug daghang uban pang mga paglihok nga mabag-o.

Giprograma namo ang pagkontrol sa tingog sa copter gamit ang Node.js ug ARDrone

Sama sa atong makita sa dayagram sa ibabaw, ang pagbag-o sa lainlaing mga parameter nagdala sa pagbag-o sa direksyon sa paglihok sa copter. Pananglitan, ang pagkunhod o pagdugang sa katulin sa pagtuyok sa wala ug tuo nga mga rotor nagmugna og usa ka rolyo. Gitugotan niini ang drone nga molupad sa unahan o paatras.

Pinaagi sa pagbag-o sa katulin ug direksyon sa mga motor, among gibutang ang mga anggulo sa pagkiling nga nagtugot sa copter sa paglihok sa ubang mga direksyon. Sa tinuud, alang sa karon nga proyekto dili kinahanglan nga magtuon sa aerodynamics, kinahanglan nimo nga masabtan ang sukaranan nga mga prinsipyo.

Giunsa pagtrabaho ang Parrot ARDrone

Ang drone usa ka Wi-Fi hotspot. Aron makadawat ug magpadala mga sugo sa copter, kinahanglan ka nga magkonektar niini nga punto. Adunay daghang lainlaing mga aplikasyon nga nagtugot kanimo nga makontrol ang mga quadcopter. Tanan kini tan-awon sama niini:

Giprograma namo ang pagkontrol sa tingog sa copter gamit ang Node.js ug ARDrone

Sa diha nga ang drone konektado, ablihi ang terminal ug telnet 192.168.1.1 - kini ang IP sa copter. Alang sa Linux mahimo nimong gamiton Linux Busybox.

Arkitektura sa aplikasyon

Ang among code bahinon sa mosunod nga mga module:

  • user interface nga adunay speech API alang sa voice detection;
  • pagsala sa mga sugo ug pagtandi sa usa ka sumbanan;
  • pagpadala mga sugo sa drone;
  • live nga video broadcast.

Ang API molihok basta adunay koneksyon sa Internet. Aron masiguro kini, nagdugang kami usa ka koneksyon sa Ethernet.

Panahon na aron maghimo usa ka aplikasyon!

Code

Una, maghimo kita og bag-ong folder ug ibalhin kini gamit ang terminal.

Dayon maghimo kami og proyekto sa Node gamit ang mga sugo sa ubos.

Una, atong i-install ang gikinahanglan nga dependencies.

npm pag-instalarβ€Š

Atong suportahan ang mosunod nga mga sugo:

  • pag-takeoff;
  • landing;
  • pataas - ang drone motaas ug tunga sa metro ug molupad;
  • ubos - nahulog tunga sa metro ug nagyelo;
  • sa wala - moadto sa tunga sa metro sa wala;
  • sa tuo - moadto sa tunga sa metro sa tuo;
  • rotation - rotates clockwise 90 degrees;
  • sa unahan - moadto sa unahan tunga sa metro;
  • balik - mibalik tunga sa metro;
  • hunong.

Ania ang code nga nagtugot kanimo sa pagdawat sa mga sugo, pagsala niini ug pagkontrolar sa 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);

Ug ania ang HTML ug JavaScript code nga maminaw sa user ug magpadala ug command sa Node server.

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

Ug usab ang JavaScript code aron magtrabaho uban ang mga voice command, ipadala kini sa Node server.

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

Paglansad sa aplikasyon

Ang programa mahimong ilunsad ingon sa mosunod (importante nga masiguro nga ang copter konektado sa Wi-Fi ug ang Ethernet cable konektado sa kompyuter).

Ablihi ang localhost:3000 sa browser ug i-klik ang Start Recognition.

Giprograma namo ang pagkontrol sa tingog sa copter gamit ang Node.js ug ARDrone

Gisulayan namon nga kontrolon ang drone ug malipayon kami.

Pag-broadcast sa video gikan sa usa ka drone

Sa proyekto, paghimo og bag-ong file ug kopyaha kini nga code didto:

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

Ug ania ang HTML code, gibutang namo kini sa sulod sa public folder.

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

Ilunsad ug ikonektar ang localhost:8080 aron matan-aw ang video gikan sa atubangan nga camera.

Giprograma namo ang pagkontrol sa tingog sa copter gamit ang Node.js ug ARDrone

Makatabang nga mga Sugyot

  • Ilupad kini nga drone sa sulod sa balay.
  • Kanunay ibutang ang protective cover sa imong drone sa dili pa molupad.
  • Susiha kon ang baterya gi-charge.
  • Kung katingad-an ang paggawi sa drone, pugngi kini ug ibalik kini. Kini nga aksyon magbutang sa copter sa emergency mode ug ang mga rotors mohunong dayon.

Andam nga code ug demo

LIVE DEMO

DOWNLOAD

Nahitabo!

Ang pagsulat sa code ug dayon ang pagtan-aw sa makina nga nagsugod sa pagsunod makahatag kanimo kalipay! Karon nahibal-an namon kung giunsa pagtudlo ang usa ka drone sa pagpamati sa mga mando sa tingog. Sa tinuud, adunay daghang mga posibilidad: pag-ila sa nawong sa gumagamit, awtonomous flight, pag-ila sa lihok ug daghan pa.

Unsa ang imong ikasugyot aron mapauswag ang programa?

Girekomenda sa Skillbox:

Source: www.habr.com

Idugang sa usa ka comment