Nou pwograme kontwòl vwa nan copter la lè l sèvi avèk Node.js ak ARDrone

Nou pwograme kontwòl vwa nan copter la lè l sèvi avèk Node.js ak ARDrone

Nan leson patikilye sa a nou pral gade nan kreye yon pwogram pou yon abèy ak kontwòl vwa lè l sèvi avèk Node.js ak API lapawòl entènèt. Copter - Parrot ARDrone 2.0.

Nou raple: pou tout lektè "Habr" - yon rabè nan 10 rubles lè w ap enskri nan nenpòt kou Skillbox lè l sèvi avèk kòd pwomosyon "Habr".

Skillbox rekòmande: Kou pratik "Mobile Developer PRO".

Entwodiksyon

Drones yo etonan. Mwen vrèman renmen jwe ak kwadwilatè mwen an, pran foto ak videyo, oswa jis pran plezi. Men, machin ayeryen san ekipe (UAV) yo itilize pou plis pase jis amizman. Yo travay nan sinema, etidye glasye, epi militè yo ak reprezantan sektè agrikòl yo itilize yo.

Nan leson patikilye sa a nou pral gade nan kreye yon pwogram ki pral pèmèt ou kontwole yon abèy. lè l sèvi avèk kòmandman vwa. Wi, copter a pral fè sa ou di li fè. Nan fen atik la gen yon pwogram pare ak videyo sou kontwòl UAV.

Iron

Nou bezwen sa ki annapre yo:

  • Jako ARDrone 2.0;
  • Ethernet kab;
  • bon mikwofòn.

Devlopman ak jesyon yo pral fèt sou estasyon travay ak Windows/Mac/Ubuntu. Pèsonèlman, mwen te travay ak Mac ak Ubuntu 18.04.

Программное обеспечение

Telechaje dènye vèsyon Node.js nan sit ofisyèl.

Li nesesè tou dènye vèsyon Google Chrome.

Konprann copter la

Ann eseye konprann ki jan Parrot ARDrone travay. copter sa a gen kat motè.

Nou pwograme kontwòl vwa nan copter la lè l sèvi avèk Node.js ak ARDrone

Motè opoze yo travay nan menm direksyon an. Yon pè vire nan direksyon goch, lòt la nan sens goch. Abèy la deplase pa chanje ang enklinasyon an parapò ak sifas tè a, chanje vitès wotasyon motè yo ak plizyè lòt mouvman manyabl.

Nou pwograme kontwòl vwa nan copter la lè l sèvi avèk Node.js ak ARDrone

Kòm nou ka wè nan dyagram ki anwo a, chanje divès paramèt mennen nan yon chanjman nan direksyon mouvman copter la. Pou egzanp, diminye oswa ogmante vitès wotasyon rotor gòch ak dwa kreye yon woulo liv. Sa a pèmèt abèy la vole pi devan oswa dèyè.

Lè nou chanje vitès la ak direksyon motè yo, nou mete ang enklinezon ki pèmèt copter la deplase nan lòt direksyon. Aktyèlman, pou pwojè aktyèl la pa gen okenn bezwen etidye aerodinamik, ou jis bezwen konprann prensip debaz yo.

Ki jan Parrot ARDrone travay

Abèy la se yon otspot Wi-Fi. Yo nan lòd yo resevwa epi voye kòmandman nan copter a, ou bezwen konekte nan pwen sa a. Gen anpil aplikasyon diferan ki pèmèt ou kontwole quadcopters. Li tout sanble yon bagay tankou sa a:

Nou pwograme kontwòl vwa nan copter la lè l sèvi avèk Node.js ak ARDrone

Le pli vit ke abèy la konekte, louvri tèminal la ak telnet 192.168.1.1 - sa a se IP copter la. Pou Linux ou ka itilize Linux Busybox.

Achitekti aplikasyon

Kòd nou an pral divize an modil sa yo:

  • koòdone itilizatè ak API lapawòl pou deteksyon vwa;
  • kòmandman filtraj ak konpare ak yon estanda;
  • voye kòmandman abèy la;
  • emisyon videyo an dirèk.

API a travay osi lontan ke gen yon koneksyon entènèt. Pou asire sa, nou ajoute yon koneksyon Ethernet.

Li lè yo kreye yon aplikasyon!

Kòd

Premyèman, ann kreye yon nouvo katab epi chanje nan li lè l sèvi avèk tèminal la.

Lè sa a, nou kreye yon pwojè Node lè l sèvi avèk kòmandman ki anba yo.

Premyèman, nou enstale depandans ki nesesè yo.

npm enstale 

Nou pral sipòte kòmandman sa yo:

  • dekole;
  • aterisaj;
  • moute - abèy la leve mwatye yon mèt ak plane;
  • desann - tonbe mwatye yon mèt ak jele;
  • gòch - ale mwatye yon mèt sou bò gòch la;
  • sou bò dwat la - ale mwatye yon mèt sou bò dwat la;
  • wotasyon - wotasyon nan sens goch 90 degre;
  • pi devan - ale pi devan mwatye yon mèt;
  • tounen - ale tounen mwatye yon mèt;
  • sispann.

Isit la se kòd la ki pèmèt ou aksepte kòmandman, filtre yo ak kontwole abèy la.

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

Ak isit la se HTML ak JavaScript kòd ki koute itilizatè a epi voye yon lòd nan sèvè a 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>

Epi tou kòd JavaScript pou travay ak kòmandman vwa, voye yo nan sèvè a 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'
 });
};

Lanse aplikasyon an

Pwogram nan ka lanse jan sa a (li enpòtan asire w ke copter a konekte ak Wi-Fi ak kab Ethernet la konekte ak òdinatè a).

Louvri localhost:3000 nan navigatè a epi klike sou Kòmanse rekonesans.

Nou pwograme kontwòl vwa nan copter la lè l sèvi avèk Node.js ak ARDrone

Nou eseye kontwole abèy la epi yo kontan.

Difize videyo ki soti nan yon abèy

Nan pwojè a, kreye yon nouvo dosye epi kopye kòd sa a la:

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

Ak isit la se kòd HTML la, nou mete li andedan katab piblik la.

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

Lanse epi konekte ak localhost:8080 pou wè videyo ki soti nan kamera devan an.

Nou pwograme kontwòl vwa nan copter la lè l sèvi avèk Node.js ak ARDrone

Konsèy itil

  • Vole abèy sa a andedan kay la.
  • Toujou mete kouvèti pwoteksyon an sou abèy ou anvan ou dekole.
  • Tcheke si batri a chaje.
  • Si abèy la konpòte l yon fason etranj, kenbe l desann epi vire l. Aksyon sa a pral mete copter a nan mòd ijans ak rotor yo ap sispann imedyatman.

Pare kòd ak Demo

LIVE DEMO

DOWNLOAD

Sa te pase!

Ekri kòd ak Lè sa a, gade machin nan kòmanse obeyi pral ba ou plezi! Koulye a, nou te kalkile ki jan yo anseye yon abèy koute kòmandman vwa. An reyalite, gen plis posiblite: rekonesans vizaj itilizatè, vòl otonòm, rekonesans jès ak plis ankò.

Kisa ou ka sijere pou amelyore pwogram nan?

Skillbox rekòmande:

Sous: www.habr.com

Add nouvo kòmantè