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



في هذا البرنامج التعليمي ، سنتناول كيفية إنشاء برنامج طائرة بدون طيار مفعل بالصوت على Node.js وواجهة برمجة تطبيقات Web speech. المروحية - الببغاء ARDrone 2.0.
نذكرك: لجميع قراء "Habr" - خصم بقيمة 10،000 روبل عند التسجيل في أي دورة تدريبية في Skillbox باستخدام الرمز الترويجي "Habr".

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

مقدمة


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

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

حديد


نحن بحاجة إلى ما يلي:

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

سيتم تنفيذ التطوير والإدارة على محطات العمل باستخدام Windows / Mac / Ubuntu. أنا شخصياً عملت مع Mac و Ubuntu 18.04.

البرمجيات


قم بتنزيل أحدث إصدار من Node.js من الموقع الرسمي .

تحتاج أيضًا إلى أحدث إصدار من Google Chrome .

نحن نتعامل مع المروحية


دعونا نحاول أن نفهم كيف يعمل الببغاء ARDrone. هذا المروحية لديه أربعة محركات.



تعمل المحركات المعارضة في اتجاه واحد. زوج واحد يدور في اتجاه عقارب الساعة ، والآخر عكس اتجاه عقارب الساعة. تتحرك الطائرة بدون طيار بسبب التغير في زاوية الميل بالنسبة لسطح الأرض ، وتغير في سرعة دوران المحركات وعدد قليل من حركات المناورة.



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

عند تغيير سرعة واتجاه حركة المحركات ، قمنا بضبط زاوية الميل ، مما يسمح للطائر المرن بحركة في اتجاهات أخرى. في الواقع ، ليست هناك حاجة لدراسة الديناميكا الهوائية للمشروع الحالي ، فهي تستحق فقط فهم المبادئ الأساسية.

كيف يعمل الببغاء ARDrone


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



بمجرد توصيل الطائرة بدون طيار ، افتح الجهاز و telnet 192.168.1.1 هو عنوان IP الخاص بالمروحية. لنظام التشغيل Linux ، يمكنك استخدام Linux Busybox .

بنية التطبيق


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

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

واجهة برمجة التطبيقات تعمل وفقًا للاتصال بالإنترنت. لتوفير ذلك ، نضيف اتصال Ethernet.

حان الوقت لإنشاء تطبيق!

CODE


أولاً ، قم بإنشاء مجلد جديد والتبديل إليه باستخدام المحطة.

ثم قم بإنشاء مشروع 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 متصل بالكمبيوتر).

افتح المضيف المحلي: 3000 في المتصفح وانقر فوق "بدء التعرف".



نحاول السيطرة على الطائرة بدون طيار ونفرح.

بث الفيديو من الطائرة بدون طيار


في المشروع ، قم بإنشاء ملف جديد وانسخ هذا الرمز هناك:

 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 لمشاهدة الفيديو من الكاميرا الأمامية.



نصائح مفيدة


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

كود جاهز و تجريبي


عرض حي

DOWNLOAD

اتضح!


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

ماذا يمكنك أن تقدم لتحسين البرنامج؟
توصي Skillbox بما يلي:

Source: https://habr.com/ru/post/ar445980/


All Articles