ما کنترل صوتی هلی کوپتر را با استفاده از Node.js و ARDrone برنامه ریزی می کنیم

ما کنترل صوتی هلی کوپتر را با استفاده از Node.js و ARDrone برنامه ریزی می کنیم

در این آموزش به ایجاد برنامه ای برای پهپاد با کنترل صوتی با استفاده از Node.js و Web speech API خواهیم پرداخت. هلی کوپتر - Parrot ARDrone 2.0.

یادآوری می کنیم: برای همه خوانندگان "Habr" - تخفیف 10 روبل هنگام ثبت نام در هر دوره Skillbox با استفاده از کد تبلیغاتی "Habr".

Skillbox توصیه می کند: دوره عملی "موبایل توسعه دهنده PRO".

معرفی

هواپیماهای بدون سرنشین شگفت انگیز هستند. من واقعا از بازی با چهارتایی خود، گرفتن عکس و فیلم، یا فقط لذت بردن لذت می برم. اما وسایل نقلیه هوایی بدون سرنشین (پهپاد) برای چیزی فراتر از سرگرمی مورد استفاده قرار می گیرند. آنها در سینما کار می کنند، یخچال های طبیعی را مطالعه می کنند و ارتش و نمایندگان بخش کشاورزی از آنها استفاده می کنند.

در این آموزش به ایجاد برنامه ای می پردازیم که به شما امکان کنترل پهپاد را می دهد. با استفاده از دستورات صوتی بله، هلی کوپتر کاری را که شما به آن می گویید انجام می دهد. در انتهای مقاله برنامه و فیلم آماده کنترل پهپاد وجود دارد.

آهن

ما به موارد زیر نیاز داریم:

  • طوطی ARDrone 2.0;
  • کابل اترنت؛
  • میکروفون خوب

توسعه و مدیریت بر روی ایستگاه های کاری با Windows/Mac/Ubuntu انجام خواهد شد. من شخصا با مک و اوبونتو 18.04 کار کردم.

نرم افزار

آخرین نسخه Node.js را از اینجا دانلود کنید وب سایت رسمی شرکت.

همچنین مورد نیاز است آخرین نسخه گوگل کروم.

درک هلی کوپتر

بیایید سعی کنیم بفهمیم Parrot ARDrone چگونه کار می کند. این هلی کوپتر دارای چهار موتور است.

ما کنترل صوتی هلی کوپتر را با استفاده از Node.js و ARDrone برنامه ریزی می کنیم

موتورهای مخالف در یک جهت کار می کنند. یک جفت در جهت عقربه های ساعت می چرخد ​​و دیگری در خلاف جهت عقربه های ساعت. پهپاد با تغییر زاویه شیب نسبت به سطح زمین، تغییر سرعت چرخش موتورها و چندین حرکت قابل مانور دیگر حرکت می کند.

ما کنترل صوتی هلی کوپتر را با استفاده از Node.js و ARDrone برنامه ریزی می کنیم

همانطور که در نمودار بالا می بینیم، تغییر پارامترهای مختلف منجر به تغییر جهت حرکت کوپتر می شود. به عنوان مثال، کاهش یا افزایش سرعت چرخش روتور چپ و راست، یک رول ایجاد می کند. این به پهپاد اجازه می دهد تا به جلو یا عقب پرواز کند.

با تغییر سرعت و جهت موتورها، زوایای شیب را تنظیم می کنیم که به کوپتر اجازه می دهد در جهات دیگر حرکت کند. در واقع، برای پروژه فعلی نیازی به مطالعه آیرودینامیک نیست، فقط باید اصول اولیه را درک کنید.

طوطی ARDrone چگونه کار می کند

پهپاد یک نقطه اتصال Wi-Fi است. برای دریافت و ارسال دستورات به هلی کوپتر باید به این نقطه متصل شوید. برنامه های مختلفی وجود دارد که به شما امکان کنترل کوادکوپتر را می دهد. همه چیز شبیه این به نظر می رسد:

ما کنترل صوتی هلی کوپتر را با استفاده از Node.js و ARDrone برنامه ریزی می کنیم

به محض اتصال پهپاد، ترمینال و telnet را باز کنید 192.168.1.1 - این IP هلی کوپتر است. برای لینوکس می توانید استفاده کنید لینوکس Busybox.

معماری اپلیکیشن

کد ما به ماژول های زیر تقسیم می شود:

  • رابط کاربر با گفتار API برای تشخیص صدا.
  • فیلتر کردن دستورات و مقایسه با یک استاندارد؛
  • ارسال دستورات به پهپاد؛
  • پخش زنده تصویری

API تا زمانی کار می کند که اتصال اینترنت وجود داشته باشد. برای اطمینان از این موضوع، یک اتصال اترنت اضافه می کنیم.

زمان ایجاد یک برنامه است!

کد

ابتدا بیایید یک پوشه جدید ایجاد کنیم و با استفاده از ترمینال به آن سوئیچ کنیم.

سپس با استفاده از دستورات زیر یک پروژه Node ایجاد می کنیم.

ابتدا وابستگی های مورد نیاز را نصب می کنیم.

نصب npm 

ما از دستورات زیر پشتیبانی خواهیم کرد:

  • در آوردن؛
  • فرود آمدن؛
  • بالا - پهپاد نیم متر بالا می رود و شناور می شود.
  • پایین - نیم متر سقوط می کند و یخ می زند.
  • به سمت چپ - نیم متر به سمت چپ می رود.
  • به سمت راست - نیم متر به سمت راست می رود.
  • چرخش - 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 و جاوا اسکریپت است که به کاربر گوش می دهد و دستوری را به سرور 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>

و همچنین کد جاوا اسکریپت برای کار با دستورات صوتی، ارسال آنها به سرور 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'
 });
};

راه اندازی برنامه

برنامه را می توان به صورت زیر راه اندازی کرد (مهم است که مطمئن شوید که کوپتر به Wi-Fi وصل شده است و کابل اترنت به رایانه متصل است).

localhost:3000 را در مرورگر باز کنید و روی Start Recognition کلیک کنید.

ما کنترل صوتی هلی کوپتر را با استفاده از 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);

و در اینجا کد HTML است، ما آن را در پوشه عمومی قرار می دهیم.

<!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 برنامه ریزی می کنیم

نکات مفید

  • این پهپاد را در داخل خانه پرواز دهید.
  • همیشه قبل از پرواز پهپاد خود را پوشش محافظ قرار دهید.
  • بررسی کنید که آیا باتری شارژ شده است.
  • اگر پهپاد رفتار عجیبی داشت، آن را نگه دارید و برگردانید. این عمل هلی کوپتر را در حالت اضطراری قرار می دهد و روتورها بلافاصله متوقف می شوند.

کد و دمو آماده است

زنده DEMO

دانلود

اتفاق افتاد!

نوشتن کد و سپس تماشای شروع به اطاعت دستگاه به شما لذت می دهد! اکنون متوجه شده ایم که چگونه به پهپاد آموزش گوش دادن به دستورات صوتی را بدهیم. در واقع، امکانات بسیار بیشتری وجود دارد: تشخیص چهره کاربر، پروازهای مستقل، تشخیص حرکات و موارد دیگر.

برای بهبود برنامه چه پیشنهادی دارید؟

Skillbox توصیه می کند:

منبع: www.habr.com

اضافه کردن نظر