نقوم ببرمجة التحكم الصوتي بالمروحية باستخدام Node.js وARDrone

نقوم ببرمجة التحكم الصوتي بالمروحية باستخدام Node.js وARDrone

في هذا البرنامج التعليمي، سننظر في إنشاء برنامج لطائرة بدون طيار مع التحكم الصوتي باستخدام Node.js وواجهة برمجة التطبيقات الخاصة بالكلام على الويب. المروحية - الببغاء ARDrone 2.0.

نذكر: لجميع قراء "Habr" - خصم 10 روبل عند التسجيل في أي دورة Skillbox باستخدام رمز "Habr" الترويجي.

يوصي Skillbox بما يلي: دورة عملية "Mobile Developer PRO".

مقدمة

الطائرات بدون طيار مذهلة. أنا أستمتع حقًا باللعب مع رباعيتي أو التقاط الصور ومقاطع الفيديو أو الاستمتاع فقط. لكن المركبات الجوية بدون طيار (UAVs) تُستخدم لأكثر من مجرد الترفيه. إنهم يعملون في السينما ويدرسون الأنهار الجليدية ويستخدمهم العسكريون وممثلو القطاع الزراعي.

سننظر في هذا البرنامج التعليمي في إنشاء برنامج يسمح لك بالتحكم في طائرة بدون طيار. باستخدام الأوامر الصوتية. نعم، ستفعل المروحية ما تطلبه منها. يوجد في نهاية المقال برنامج وفيديو جاهز للتحكم في الطائرات بدون طيار.

حديد

نحتاج إلى ما يلي:

  • الببغاء ARdrone 2.0؛
  • كابل إيثرنت؛
  • ميكروفون جيد.

سيتم تنفيذ التطوير والإدارة على محطات العمل التي تعمل بنظام التشغيل Windows/Mac/Ubuntu. أنا شخصياً عملت مع 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 الخاص بالمروحية. لنظام التشغيل Linux يمكنك استخدامه لينكس بوزي بوكس.

بنية التطبيق

سيتم تقسيم الكود الخاص بنا إلى الوحدات التالية:

  • واجهة المستخدم مع واجهة برمجة تطبيقات الكلام للكشف عن الصوت؛
  • تصفية الأوامر والمقارنة مع المعيار؛
  • إرسال الأوامر إلى الطائرة بدون طيار؛
  • بث فيديو مباشر.

تعمل واجهة برمجة التطبيقات (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 و JavaScript الذي يستمع للمستخدم ويرسل أمرًا إلى خادم 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>

وأيضًا كود JavaScript للعمل مع الأوامر الصوتية وإرسالها إلى خادم 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 وأن كابل Ethernet متصل بالكمبيوتر).

افتح 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);

وهذا هو كود 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>

قم بتشغيل والاتصال بالمضيف المحلي: 8080 لعرض الفيديو من الكاميرا الأمامية.

نقوم ببرمجة التحكم الصوتي بالمروحية باستخدام Node.js وARDrone

نصائح مفيدة

  • تطير هذه الطائرة بدون طيار في الداخل.
  • ضع دائمًا الغطاء الواقي على طائرتك بدون طيار قبل الإقلاع.
  • تحقق مما إذا كانت البطارية مشحونة.
  • إذا تصرفت الطائرة بدون طيار بشكل غريب، فاضغط عليها واقلبها. سيؤدي هذا الإجراء إلى وضع المروحية في وضع الطوارئ وستتوقف الدوارات على الفور.

رمز جاهز والعرض التوضيحي

عرض حي

DOWNLOAD

حدث!

إن كتابة التعليمات البرمجية ثم مشاهدة الجهاز يبدأ في الانصياع سوف يمنحك المتعة! لقد اكتشفنا الآن كيفية تعليم الطائرة بدون طيار الاستماع إلى الأوامر الصوتية. في الواقع، هناك المزيد من الإمكانيات: التعرف على وجه المستخدم، والرحلات الجوية المستقلة، والتعرف على الإيماءات، وغير ذلك الكثير.

ماذا يمكنك أن تقترح لتحسين البرنامج؟

يوصي Skillbox بما يلي:

المصدر: www.habr.com

إضافة تعليق