Node.js እና ARDroneን በመጠቀም የኮፕተሩን የድምጽ ቁጥጥር ፕሮግራም እናደርጋለን

Node.js እና ARDroneን በመጠቀም የኮፕተሩን የድምጽ ቁጥጥር ፕሮግራም እናደርጋለን

በዚህ ማጠናከሪያ ትምህርት Node.js እና Web speech API በመጠቀም ለድሮን ፕሮግራም በድምጽ ቁጥጥር መፍጠርን እንመለከታለን። ኮፕተር - ፓሮ ARDrone 2.0.

እኛ እናስታውስዎታለን- ለሁሉም የ "ሀብር" አንባቢዎች - የ "Habr" የማስተዋወቂያ ኮድን በመጠቀም በማንኛውም የ Skillbox ኮርስ ውስጥ ሲመዘገቡ የ 10 ሩብልስ ቅናሽ.

Skillbox ይመክራል፡ ተግባራዊ ኮርስ "ሞባይል ገንቢ PRO".

መግቢያ

ድሮኖች አስደናቂ ናቸው። ከኳድዬ ጋር መጫወት፣ ፎቶዎችን እና ቪዲዮዎችን ማንሳት ወይም መዝናናት በጣም ያስደስተኛል ነገር ግን ሰው አልባ የአየር ላይ ተሽከርካሪዎች (UAVs) ከመዝናኛ በላይ ጥቅም ላይ ይውላሉ። በሲኒማ ውስጥ ይሰራሉ, የበረዶ ግግርን ያጠናል, እና በወታደራዊ እና በግብርና ዘርፍ ተወካዮች ጥቅም ላይ ይውላሉ.

በዚህ ማጠናከሪያ ትምህርት ድሮንን ለመቆጣጠር የሚያስችል ፕሮግራም መፍጠርን እንመለከታለን። የድምጽ ትዕዛዞችን በመጠቀም. አዎ፣ ኮፕተሩ እንዲሰራ የታዘዝከውን ያደርጋል። በጽሁፉ መጨረሻ ላይ የ UAV መቆጣጠሪያ ዝግጁ የሆነ ፕሮግራም እና ቪዲዮ አለ.

ብረት

የሚከተሉትን እንፈልጋለን።

  • ፓሮ ARDrone 2.0;
  • የኤተርኔት ገመድ;
  • ጥሩ ማይክሮፎን.

ልማት እና ማኔጅመንት በዊንዶውስ/ማክ/ኡቡንቱ በሚገኙ የስራ ቦታዎች ላይ ይከናወናል። በግሌ ከማክ እና ከኡቡንቱ 18.04 ጋር ሠርቻለሁ።

ሶፍትዌር

የ Node.js የቅርብ ጊዜውን ስሪት ከ ያውርዱ ይፋዊ ጣቢያ.

በተጨማሪም ያስፈልጋል የ Google Chrome የቅርብ ጊዜ ስሪት.

ኮፕተሩን መረዳት

Parrot ARDrone እንዴት እንደሚሰራ ለመረዳት እንሞክር. ይህ ኮፕተር አራት ሞተሮች አሉት።

Node.js እና ARDroneን በመጠቀም የኮፕተሩን የድምጽ ቁጥጥር ፕሮግራም እናደርጋለን

ተቃራኒ ሞተሮች በተመሳሳይ አቅጣጫ ይሠራሉ. አንድ ጥንድ በሰዓት አቅጣጫ ይሽከረከራል, ሌላኛው በተቃራኒ ሰዓት አቅጣጫ. ድሮኑ የሚንቀሳቀሰው ከምድር ገጽ አንጻር ያለውን የዘንበል አቅጣጫ በመቀየር፣የሞተሮችን የማሽከርከር ፍጥነት እና ሌሎች በርካታ ተንቀሳቃሽ እንቅስቃሴዎችን በመቀየር ነው።

Node.js እና ARDroneን በመጠቀም የኮፕተሩን የድምጽ ቁጥጥር ፕሮግራም እናደርጋለን

ከላይ ባለው ሥዕላዊ መግለጫ ላይ እንደምናየው የተለያዩ መለኪያዎችን መለወጥ ወደ ኮፕተር እንቅስቃሴ አቅጣጫ ለውጥ ያመጣል. ለምሳሌ የግራ እና የቀኝ rotors የማዞሪያ ፍጥነት መቀነስ ወይም መጨመር ጥቅልል ​​ይፈጥራል። ይህ ድሮን ወደ ፊት ወይም ወደ ኋላ እንዲበር ያስችለዋል።

የሞተር ሞተሮችን ፍጥነት እና አቅጣጫ በመቀየር ኮፕተሩ ወደ ሌሎች አቅጣጫዎች እንዲንቀሳቀስ የሚያስችለውን የታጠፈ ማዕዘኖችን እናዘጋጃለን። በእውነቱ, አሁን ላለው ፕሮጀክት ኤሮዳይናሚክስ ማጥናት አያስፈልግም, መሰረታዊ መርሆችን መረዳት ብቻ ያስፈልግዎታል.

Parrot ARDrone እንዴት እንደሚሰራ

ሰው አልባ አውሮፕላኑ የዋይ ፋይ መገናኛ ነጥብ ነው። ለኮፕተሩ ትዕዛዞችን ለመቀበል እና ለመላክ, ከዚህ ነጥብ ጋር መገናኘት ያስፈልግዎታል. ኳድኮፕተሮችን እንድትቆጣጠር የሚያስችሉህ ብዙ የተለያዩ መተግበሪያዎች አሉ። ሁሉም ነገር ይህን ይመስላል።

Node.js እና ARDroneን በመጠቀም የኮፕተሩን የድምጽ ቁጥጥር ፕሮግራም እናደርጋለን

አውሮፕላኑ እንደተገናኘ ተርሚናል እና ቴልኔት 192.168.1.1 ይክፈቱ - ይህ የኮፕተሩ አይፒ ነው። ለሊኑክስ መጠቀም ይችላሉ። ሊኑክስ Busybox.

የመተግበሪያ አርክቴክቸር

የእኛ ኮድ በሚከተሉት ሞጁሎች ይከፈላል፡

  • የተጠቃሚ በይነገጽ ከንግግር ኤፒአይ ጋር ለድምጽ ፍለጋ;
  • ትዕዛዞችን በማጣራት እና ከመደበኛ ጋር ማወዳደር;
  • ወደ ድራጊው ትዕዛዞችን መላክ;
  • የቀጥታ ቪዲዮ ስርጭት.

የበይነመረብ ግንኙነት እስካለ ድረስ ኤፒአይ ይሰራል። ይህንን ለማረጋገጥ የኤተርኔት ግንኙነትን እንጨምራለን.

መተግበሪያ ለመፍጠር ጊዜው አሁን ነው!

ኮድ

መጀመሪያ አዲስ አቃፊ እንፍጠር እና ተርሚናልን ተጠቅመን ወደ እሱ እንቀይር።

ከዚያም ከታች ያሉትን ትዕዛዞች በመጠቀም የኖድ ፕሮጀክት እንፈጥራለን.

በመጀመሪያ, አስፈላጊዎቹን ጥገኞች እንጭናለን.

የሌሊት ጭነት 

የሚከተሉትን ትዕዛዞች እንደግፋለን፡-

  • አውልቅ;
  • ማረፊያ;
  • ወደ ላይ - ድራጊው ግማሽ ሜትር ከፍ ብሎ ያንዣብባል;
  • ወደታች - ግማሽ ሜትር ይወድቃል እና በረዶ ይሆናል;
  • ወደ ግራ - ወደ ግራ ግማሽ ሜትር ይሄዳል;
  • ወደ ቀኝ - ወደ ቀኝ ግማሽ ሜትር ይሄዳል;
  • ሽክርክሪት - በሰዓት አቅጣጫ በ 90 ዲግሪዎች ይሽከረከራል;
  • ወደፊት - ግማሽ ሜትር ወደ ፊት ይሄዳል;
  • ወደኋላ - ግማሽ ሜትር ወደ ኋላ ይመለሳል;
  • ተወ.

ትእዛዞችን እንዲቀበሉ ፣ እንዲያጣሩ እና ድሮኑን እንዲቆጣጠሩ የሚያስችልዎ ኮድ እዚህ አለ ።

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

እና ተጠቃሚውን የሚያዳምጥ እና ወደ መስቀለኛ መንገድ አገልጋይ ትእዛዝ የሚልክ HTML እና JavaScript ኮድ እዚህ አለ።

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

እንዲሁም የጃቫ ስክሪፕት ኮድ ከድምጽ ትዕዛዞች ጋር ለመስራት ወደ መስቀለኛ መንገድ አገልጋይ በመላክ ላይ።

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

ማመልከቻውን በማስጀመር ላይ

ፕሮግራሙ በሚከተለው መንገድ ሊጀመር ይችላል (ኮፕተሩ ከ Wi-Fi ጋር መገናኘቱን እና የኤተርኔት ገመድ ከኮምፒዩተር ጋር መገናኘቱን ማረጋገጥ አስፈላጊ ነው).

በአሳሹ ውስጥ localhost:3000 ን ይክፈቱ እና ጀምር እውቅናን ጠቅ ያድርጉ።

Node.js እና ARDroneን በመጠቀም የኮፕተሩን የድምጽ ቁጥጥር ፕሮግራም እናደርጋለን

ድሮንን ለመቆጣጠር እንሞክራለን እና ደስተኞች ነን።

ቪዲዮን ከድሮን በማሰራጨት ላይ

በፕሮጀክቱ ውስጥ አዲስ ፋይል ይፍጠሩ እና ይህን ኮድ እዚያ ይቅዱ፡-

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

እና እዚህ የኤችቲኤምኤል ኮድ አለ, በአደባባይ አቃፊ ውስጥ እናስቀምጠዋለን.

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

ቪዲዮውን ከፊት ካሜራ ለማየት ከ localhost:8080 ጋር ያስጀምሩ እና ያገናኙ።

Node.js እና ARDroneን በመጠቀም የኮፕተሩን የድምጽ ቁጥጥር ፕሮግራም እናደርጋለን

ጠቃሚ ምክሮች

  • ይህንን ድሮን በቤት ውስጥ ይብረሩ።
  • ከመነሳትዎ በፊት ሁል ጊዜ መከላከያ ሽፋኑን በድሮንዎ ላይ ያድርጉት።
  • ባትሪው መሙላቱን ያረጋግጡ።
  • አውሮፕላኑ እንግዳ ከሆነ ባህሪይ ወደ ታች ያዙት እና ገልብጡት። ይህ እርምጃ ኮፕተሩን ወደ ድንገተኛ ሁነታ ያስገባዋል እና rotors ወዲያውኑ ይቆማሉ.

ዝግጁ ኮድ እና ማሳያ

ቀጥታ ዴሞ

አውርድ

ተከሰተ!

ኮድ መጻፍ እና ማሽኑ መታዘዝ ሲጀምር መመልከት ደስታን ይሰጣል! አሁን አውሮፕላኑን የድምፅ ትዕዛዞችን ለማዳመጥ እንዴት ማስተማር እንዳለብን አውቀናል. እንደ እውነቱ ከሆነ፣ ብዙ ተጨማሪ እድሎች አሉ፡ የተጠቃሚ ፊት ለይቶ ማወቅ፣ በራስ ገዝ በረራዎች፣ የእጅ ምልክቶችን ማወቂያ እና ብዙ ተጨማሪ።

ፕሮግራሙን ለማሻሻል ምን ሀሳብ መስጠት ይችላሉ?

Skillbox ይመክራል፡

ምንጭ: hab.com

አስተያየት ያክሉ