تنفيذ بروتوكولات الشبكات المستخدمة من قبل Parrot AR بدون طيار 2.0. يبدو أن 1.0 طائرات بدون طيار متوافقة أيضًا.
التثبيت عبر github للحصول على أحدث إصدار:
npm install git://github.com/felixge/node-ar-drone.git
أو ، إذا كنت بخير مع فقدان بعض الأشياء المتطورة ، فانتقل إلى NPM:
npm install ar-drone
طائرة AR بدون طيار هي كوادكوبتر ميسورة التكلفة ، ولكنه قادرة بشكل مدهش. تقوم الطائرة بدون طيار نفسها بتشغيل البرامج الثابتة الخاصة التي يمكن التحكم فيها عبر WiFi باستخدام تطبيق Freeflight Mobile الرسمي (متاح لنظام التشغيل iOS و Android).
على عكس البرامج الثابتة ، فإن بروتوكول العميل مفتوح ، وينشر Parrot SDK (الاشتراك المطلوب للتنزيل) بما في ذلك كمية جيدة من الوثائق ورمز C. يبدو أن جمهورهم المستهدف هم مطورو الهواتف المحمولة الذين يمكنهم استخدام SDK هذا لإنشاء الألعاب والتطبيقات الأخرى للأشخاص للحصول على المزيد من المرح مع الطائرات بدون طيار.
ومع ذلك ، يمكن أيضًا استخدام البروتوكول لتلقي بيانات الفيديو والمستشعر ، مما يمكّن المطورين من كتابة برامج مستقلة لثورة الروبوت القادمة.
لا تزال هذه الوحدة تحت التطوير الثقيل ، لذا يرجى ألا تفاجأ إذا وجدت بعض الوظائف مفقودة أو غير موثقة.
ومع ذلك ، يتم اختبار الأجزاء الموثقة ويجب أن تعمل بشكل جيد لمعظم الأجزاء.
تعرض هذه الوحدة واجهة برمجة تطبيقات عميل عالية المستوى تحاول دعم جميع ميزات الطائرات بدون طيار ، مع تسهيل استخدامها.
أفضل طريقة للبدء هي إنشاء ملف repl.js
مثل هذا:
var arDrone = require ( 'ar-drone' ) ;
var client = arDrone . createClient ( ) ;
client . createRepl ( ) ;
باستخدام هذا الاستبدال ، يجب أن تكون قادرًا على الاستمتاع ببعض:
$ node repl . js
// Make the drone takeoff
drone > takeoff ( )
true
// Wait for the drone to takeoff
drone > clockwise ( 0.5 )
0.5
// Let the drone spin for a while
drone > land ( )
true
// Wait for the drone to land
يمكنك الآن كتابة برنامج مستقل يفعل الشيء نفسه:
var arDrone = require ( 'ar-drone' ) ;
var client = arDrone . createClient ( ) ;
client . takeoff ( ) ;
client
. after ( 5000 , function ( ) {
this . clockwise ( 0.5 ) ;
} )
. after ( 3000 , function ( ) {
this . stop ( ) ;
this . land ( ) ;
} ) ;
حسنًا ، لكن ماذا لو كنت تريد أن تجعل طائرة بدون طيار تتفاعل مع شيء ما؟ حسنًا ، يمكنك البدء بالنظر إلى بيانات المستشعر:
client . on ( 'navdata' , console . log ) ;
لا يتم التعامل مع كل هذا من قبل مكتبة العميل حتى الآن ، ولكن يجب أن تكون قادرًا على الأقل على استلام بيانات droneState
و demo
.
قد يكون التحدي الأولي الجيد هو محاولة الطيران على ارتفاع معين بناءً على خاصية navdata.demo.altitudeMeters
.
بمجرد إدارتك ، قد ترغب في محاولة النظر إلى صورة الكاميرا. فيما يلي طريقة بسيطة للحصول على هذا كـ pngbuffers (يتطلب العثور على إصدار FFMPEG حديثًا في $PATH
الخاص بك):
var pngStream = client . getPngStream ( ) ;
pngStream . on ( 'data' , console . log ) ;
قد يكون التحدي الأول هو فضح صور PNG هذه كخادم ويب HTTP العقدة. بمجرد القيام بذلك ، يجب أن تحاول إطعامهم في وحدة OpenCV.
إرجاع كائن Client
جديد. تشمل options
:
ip
: IP للطائرة بدون طيار. الإعدادات الافتراضية إلى '192.168.1.1'
.frameRate
: معدل إطار PNGencoder. الافتراضات إلى 5
.imageSize
: حجم الصورة الذي تنتجه PNGencoder. الافتراضات إلى null
. يطلق واجهة تفاعلية مع جميع أساليب العميل المتاحة في النطاق النشط. بالإضافة إلى ذلك client
يحل على مثيل client
نفسه.
إرجاع كائن PngEncoder
الذي ينبعث منه مخازن المؤقتة صورة PNG الفردية كأحداث 'data'
. مكالمات متعددة إلى هذه الطريقة إرجاع نفس الكائن. تتم إدارة دورة حياة الاتصال (على سبيل المثال إعادة الاتصال على الخطأ) من قبل العميل.
إرجاع كائن TcpVideoStream
الذي ينبعث من حزم TCP الخام كأحداث 'data'
. مكالمات متعددة إلى هذه الطريقة إرجاع نفس الكائن. تتم إدارة دورة حياة الاتصال (على سبيل المثال إعادة الاتصال على الخطأ) من قبل العميل.
يحدد حالة fly
الداخلية إلى true
، يتم استدعاء callback
بعد أن تقارير الطائرات بدون طيار أنها تحوم.
يحدد حالة fly
الداخلية إلى false
، يتم استدعاء callback
بعد أن تقارير الطائرات بدون طيار.
يجعل كسب الطائرة بدون طيار أو تقليل الارتفاع. يمكن أن تكون speed
قيمة من 0
إلى 1
.
يؤدي إلى تدور الطائرات بدون طيار. يمكن أن تكون speed
قيمة من 0
إلى 1
.
يتحكم في الملعب ، الذي حركة أفقية باستخدام الكاميرا كنقطة مرجعية. يمكن أن تكون speed
قيمة من 0
إلى 1
.
يتحكم في لفة ، وهي حركة أفقية باستخدام الكاميرا كنقطة مرجعية. يمكن أن تكون speed
قيمة من 0
إلى 1
.
يضع جميع أوامر حركة الطائرات بدون طيار إلى 0
، مما يجعلها تحوم بشكل فعال في مكانها.
يطلب الطائرة بدون طيار لمعايرة الجهاز. على الرغم من أن البرامج الثابتة AR.DRONE تدعم فقط جهازًا واحدًا يمكن معايرته. هذه الوظيفة تشمل أيضا ftrim.
مقياس المغنطيسية
الجهاز: 0
لا يمكن معايرة مقياس المغنطيسي إلا أثناء الطيران ، ويؤدي روتين المعايرة إلى تثبيت الطائرة بدون طيار في مكان 360 درجة كاملة.
ftrim
الجهاز: 1
Ftrim يعيد تعيين yaw ، الملعب ، ولف إلى 0. لا تستخدم أثناء الطيران.
يرسل أمر التكوين إلى الطائرة بدون طيار. ستحتاج إلى تنزيل Drone SDK للعثور على قائمة كاملة بالأوامر في ARDrone_Developer_Guide.pdf
.
على سبيل المثال ، يمكن استخدام هذا الأمر لتوجيه الطائرة بدون طيار لإرسال جميع Navdata.
client . config ( 'general:navdata_demo' , 'FALSE' ) ;
يتم استدعاء callback
بعد أن تعترف الطائرة بدون طيار بطلب التكوين أو في حالة حدوث مهلة.
بدلاً من ذلك ، يمكنك تمرير كائن خيارات يحتوي على ما يلي:
key
: مفتاح التكوين لتعيين.value
: قيمة التكوين لتعيينها.timeout
: الوقت ، بالميلي ثانية ، لانتظار ACK من الطائرة بدون طيار.على سبيل المثال:
var callback = function(err) { if (err) console.log(err); };
client.config({ key: 'general:navdata_demo', value: 'FALSE', timeout: 1000 }, callback);
يؤدي تسلسل رحلة مبرمج مسبقًا duration
معينة (في MS). يمكن أن تكون animation
واحدة مما يلي:
[ 'phiM30Deg' , 'phi30Deg' , 'thetaM30Deg' , 'theta30Deg' , 'theta20degYaw200deg' ,
'theta20degYawM200deg' , 'turnaround' , 'turnaroundGodown' , 'yawShake' ,
'yawDance' , 'phiDance' , 'thetaDance' , 'vzDance' , 'wave' , 'phiThetaMixed' ,
'doublePhiThetaMixed' , 'flipAhead' , 'flipBehind' , 'flipLeft' , 'flipRight' ]
مثال:
client . animate ( 'flipLeft' , 1000 ) ;
يرجى ملاحظة أن الطائرة بدون طيار ستحتاج إلى قدر كبير من الارتفاع والمساحة الرئيسية لأداء الوجه. لذا كن حذرا!
يؤدي تسلسل LED المبرمج مسبقًا بتردد duration
hz
المعطى (في SEC!). يمكن أن تكون animation
واحدة مما يلي:
[ 'blinkGreenRed' , 'blinkGreen' , 'blinkRed' , 'blinkOrange' , 'snakeGreenRed' ,
'fire' , 'standard' , 'red' , 'green' , 'redSnake' , 'blank' , 'rightMissile' ,
'leftMissile' , 'doubleMissile' , 'frontLeftGreenOthersRed' ,
'frontRightGreenOthersRed' , 'rearRightGreenOthersRed' ,
'rearLeftGreenOthersRed' , 'leftGreenRightRed' , 'leftRedRightGreen' ,
'blinkStandard' ]
مثال:
client . animateLeds ( 'blinkRed' , 5 , 2 )
يسبب ضبط بتات الطوارئ على 1 حتى navdata.droneState.emergencyLanding
هو 0. وهذا يسترد طائرة بدون طيار التي انقلبت ويظهر أن الأضواء الحمراء يمكن الطيران مرة أخرى وإظهار الأضواء الخضراء. يتم ذلك أيضًا ضمنيًا عند إنشاء عميل جديد عالي المستوى.
سوف ينبعث العميل ، ويحوم ، والطيران ، والهبوط ، وبطارية تشاف ، و ALTITUDECHANGE أحداث طالما تم تمكين NAVDATA التجريبي.
لتمكين استخدام Navdata التجريبي
client . config ( 'general:navdata_demo' , 'FALSE' ) ;
انظر وثائق كائن navadata
هذا هو واجهة برمجة تطبيقات منخفضة المستوى. إذا كنت تفضل شيئًا أكثر بساطة ، تحقق من مستندات العميل.
يتم التحكم في الطائرة بدون طيار عن طريق إرسال حزم UDP على المنفذ 5556. نظرًا لأن UDP لا يضمن طلب الرسائل أو التسليم ، يجب على العملاء إرسال تعليماتهم بشكل متكرر وتضمين رقم تسلسل متزايد مع كل أمر.
على سبيل المثال ، يبدو الأمر المستخدم للإقلاع/الهبوط (المرجع) ، مع رقم تسلسل من 1 ، ومعلمة 512 (إقلاع) مثل هذا:
AT*REF=1,512r
لتخفيف إنشاء وإرسال هذه الحزم ، تكشف هذه الوحدة فئة UdpControl
التي تتعامل مع هذه المهمة. على سبيل المثال ، سيؤدي البرنامج التالي إلى إقلاع الطائرة بدون طيار وتحوم في مكانها.
var arDrone = require ( 'ar-drone' ) ;
var control = arDrone . createUdpControl ( ) ;
setInterval ( function ( ) {
// The emergency: true option recovers your drone from emergency mode that can
// be caused by flipping it upside down or the drone crashing into something.
// In a real program you probably only want to send emergency: true for one
// second in the beginning, otherwise your drone may attempt to takeoff again
// after a crash.
control . ref ( { fly : true , emergency : true } ) ;
// This command makes sure your drone hovers in place and does not drift.
control . pcmd ( ) ;
// This causes the actual udp message to be send (multiple commands are
// combined into one message)
control . flush ( ) ;
} , 30 ) ;
الآن بعد أن أصبحت محمولة جواً ، يمكنك الطيران عن طريق تمرير وسيطة إلى طريقة pcmd()
:
control . pcmd ( {
front : 0.5 , // fly forward with 50% speed
up : 0.3 , // and also fly up with 30% speed
} ) ;
هذا كل شيء! يمكن العثور على قائمة كاملة بجميع خيارات pcmd()
في مستندات API أدناه.
مع ما تعلمته حتى الآن ، يمكنك إنشاء برنامج بسيط مثل هذا:
var arDrone = require ( 'ar-drone' ) ;
var control = arDrone . createUdpControl ( ) ;
var start = Date . now ( ) ;
var ref = { } ;
var pcmd = { } ;
console . log ( 'Recovering from emergency mode if there was one ...' ) ;
ref . emergency = true ;
setTimeout ( function ( ) {
console . log ( 'Takeoff ...' ) ;
ref . emergency = false ;
ref . fly = true ;
} , 1000 ) ;
setTimeout ( function ( ) {
console . log ( 'Turning clockwise ...' ) ;
pcmd . clockwise = 0.5 ;
} , 6000 ) ;
setTimeout ( function ( ) {
console . log ( 'Landing ...' ) ;
ref . fly = false ;
pcmd = { } ;
} , 8000 ) ;
setInterval ( function ( ) {
control . ref ( ref ) ;
control . pcmd ( pcmd ) ;
control . flush ( ) ;
} , 30 ) ;
ينشئ مثيل UDPControl جديد حيث يمكن أن تتضمن options
:
ip
: عنوان IP بدون طيار ، الإعدادات الافتراضية إلى '192.168.1.1'
.port
: المنفذ للاستخدام ، الافتراضي إلى 5556
. enqueues الخام AT*
. هذا مفيد إذا كنت تريد التحكم الكامل.
على سبيل المثال ، يتم إرسال تعليمات الإقلاع مثل هذا:
udpControl . raw ( 'REF' , ( 1 << 9 ) ) ;
enqueues a AT*REF
command ، الخيارات هي:
fly
: اضبط هذا على true
للإقلاع / البقاء في الهواء ، أو false
لبدء الهبوط / البقاء على الأرض. الإعدادات الافتراضية إلى false
.emergency
: اضبط هذا على true
لتعيين بت الطوارئ ، أو false
لعدم تعيينه. يمكن العثور على تفاصيل حول هذا في دليل SDK الرسمي. الإعدادات الافتراضية إلى false
. enqueues a AT*PCMD
(progressive) ، الخيارات هي:
front
أو back
: تطير نحو أو بعيدًا عن اتجاه الكاميرا الأمامية.left
أو/ right
: تطير نحو اليسار أو يمين الكاميرا الأمامية.up
أو down
: كسب أو تقليل الارتفاع.clockwise
أو counterClockwise
: تدوير حول المحور المركزي. قيم كل خيار هي السرعة المراد استخدامها للعملية ويمكن أن تتراوح من 0 إلى 1. يمكنك أيضًا استخدام القيم السلبية مثل {front: -0.5}
، وهو نفس {back: 0.5}
.
يرسل جميع الأوامر enqueued كحزمة UDP إلى الطائرة بدون طيار.
@todo توثيق واجهة برمجة تطبيقات الفيديو منخفض المستوى.
@todo توثيق مستوى Navdata API منخفض المستوى.
يمكنك الوصول إلى كاميرا الرأس والكاميرا السفلية ، عليك فقط تغيير التكوين:
// access the head camera
client . config ( 'video:video_channel' , 0 ) ;
// access the bottom camera
client . config ( 'video:video_channel' , 3 ) ;