Implementasi protokol jaringan yang digunakan oleh Parrot AR Drone 2.0. Tampaknya 1.0 drone juga kompatibel.
Instal via GitHub untuk mendapatkan versi terbaru :
npm install git://github.com/felixge/node-ar-drone.git
Atau, jika Anda baik -baik saja dengan kehilangan beberapa barang canggih, pilih NPM:
npm install ar-drone
AR Drone adalah quadcopter yang terjangkau, namun mengejutkan yang mampu. Drone itu sendiri menjalankan firmware berpemilik yang dapat dikontrol melalui WiFi menggunakan aplikasi seluler resmi Freeflight (tersedia untuk iOS dan Android).
Berbeda dengan firmware, protokol klien terbuka, dan Parrot menerbitkan SDK (pendaftaran yang diperlukan untuk mengunduh) termasuk sejumlah besar dokumentasi dan kode C. Target audiens mereka tampaknya adalah pengembang seluler yang dapat menggunakan SDK ini untuk membuat game dan aplikasi lain bagi orang untuk bersenang -senang dengan drone mereka.
Namun, protokol juga dapat digunakan untuk menerima data video dan sensor, memungkinkan pengembang untuk menulis program otonom untuk revolusi robot mendatang.
Modul ini masih dalam pengembangan besar, jadi tolong jangan kaget jika Anda menemukan beberapa fungsi yang hilang atau tidak berdokumen.
Namun, bagian yang terdokumentasi diuji dan harus bekerja dengan baik untuk sebagian besar bagian.
Modul ini memperlihatkan API klien tingkat tinggi yang mencoba mendukung semua fitur drone, sambil membuatnya mudah digunakan.
Cara terbaik untuk memulai adalah dengan membuat file repl.js
seperti ini:
var arDrone = require ( 'ar-drone' ) ;
var client = arDrone . createClient ( ) ;
client . createRepl ( ) ;
Menggunakan rept ini, Anda harus dapat bersenang -senang:
$ 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
Sekarang Anda bisa menulis program otonom yang melakukan hal yang sama:
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 ( ) ;
} ) ;
Oke, tapi bagaimana jika Anda ingin membuat drone Anda berinteraksi dengan sesuatu? Nah, Anda bisa mulai dengan melihat data sensor:
client . on ( 'navdata' , console . log ) ;
Belum semua ini ditangani oleh Perpustakaan Klien, tetapi Anda setidaknya harus dapat menerima data droneState
dan demo
.
Tantangan awal yang baik mungkin untuk mencoba terbang ke ketinggian tertentu berdasarkan properti navdata.demo.altitudeMeters
.
Setelah Anda mengelola ini, Anda mungkin ingin mencoba melihat gambar kamera. Berikut adalah cara sederhana untuk mendapatkan ini sebagai pngbuffer (membutuhkan versi FFMPEG baru -baru ini dapat ditemukan di $PATH
Anda):
var pngStream = client . getPngStream ( ) ;
pngStream . on ( 'data' , console . log ) ;
Tantangan pertama Anda mungkin untuk mengekspos gambar PNG ini sebagai server web http simpul. Setelah Anda melakukannya, Anda harus mencoba memberi makan mereka ke modul OpenCV.
Mengembalikan objek Client
baru. options
termasuk:
ip
: IP drone. Default ke '192.168.1.1'
.frameRate
: frame rate pngencoder. Default ke 5
.imageSize
: Ukuran gambar yang diproduksi oleh pngencoder. Default ke null
. Meluncurkan antarmuka interaktif dengan semua metode klien yang tersedia dalam ruang lingkup aktif. Selain itu, client
memutuskan untuk instance client
itu sendiri.
Mengembalikan objek PngEncoder
yang memancarkan buffer gambar PNG individual sebagai peristiwa 'data'
. Beberapa panggilan ke metode ini mengembalikan objek yang sama. Siklus hidup koneksi (misalnya terhubung kembali pada kesalahan) dikelola oleh klien.
Mengembalikan objek TcpVideoStream
yang memancarkan paket TCP mentah sebagai peristiwa 'data'
. Beberapa panggilan ke metode ini mengembalikan objek yang sama. Siklus hidup koneksi (misalnya terhubung kembali pada kesalahan) dikelola oleh klien.
Menetapkan keadaan fly
internal ke true
, callback
dipanggil setelah drone melaporkan bahwa ia melayang.
Menetapkan keadaan fly
internal ke false
, callback
dipanggil setelah drone melaporkan telah mendarat.
Membuat drone gain atau mengurangi ketinggian. speed
bisa menjadi nilai dari 0
hingga 1
.
Menyebabkan drone berputar. speed
bisa menjadi nilai dari 0
hingga 1
.
Mengontrol pitch, yang gerakan horizontal menggunakan kamera sebagai titik referensi. speed
bisa menjadi nilai dari 0
hingga 1
.
Mengontrol gulungan, yang merupakan gerakan horizontal menggunakan kamera sebagai titik referensi. speed
bisa menjadi nilai dari 0
hingga 1
.
Mengatur semua perintah gerakan drone ke 0
, membuatnya secara efektif melayang di tempat.
Mintalah drone untuk mengkalibrasi perangkat. Meskipun firmware ar.drone hanya mendukung satu perangkat yang dapat dikalibrasi. Fungsi ini juga termasuk FTRIM.
Magnetometer
Perangkat: 0
Magnetometer hanya dapat dikalibrasi saat drone terbang, dan rutin kalibrasi menyebabkan drone menguap di tempat 360 derajat penuh.
Ftrim
Perangkat: 1
Ftrim pada dasarnya mengatur ulang yaw, pitch, dan roll ke 0. Sangat berhati -hati menggunakan fungsi ini dan hanya kalibrasi saat berada di permukaan datar. Jangan pernah digunakan saat terbang.
Mengirimkan perintah konfigurasi ke drone. Anda perlu mengunduh drone SDK untuk menemukan daftar lengkap perintah di ARDrone_Developer_Guide.pdf
.
Misalnya, perintah ini dapat digunakan untuk menginstruksikan drone untuk mengirim semua navdata.
client . config ( 'general:navdata_demo' , 'FALSE' ) ;
callback
dipanggil setelah drone mengakui permintaan konfigurasi atau jika terjadi batas waktu.
Atau, Anda dapat melewati objek opsi yang berisi berikut:
key
: Kunci konfigurasi untuk mengatur.value
: Nilai konfigurasi yang akan diatur.timeout
: Waktu, dalam milidetik, untuk menunggu ACK dari drone.Misalnya:
var callback = function(err) { if (err) console.log(err); };
client.config({ key: 'general:navdata_demo', value: 'FALSE', timeout: 1000 }, callback);
Melakukan urutan penerbangan yang telah diprogram untuk duration
yang diberikan (dalam MS). animation
bisa menjadi salah satu dari yang berikut:
[ 'phiM30Deg' , 'phi30Deg' , 'thetaM30Deg' , 'theta30Deg' , 'theta20degYaw200deg' ,
'theta20degYawM200deg' , 'turnaround' , 'turnaroundGodown' , 'yawShake' ,
'yawDance' , 'phiDance' , 'thetaDance' , 'vzDance' , 'wave' , 'phiThetaMixed' ,
'doublePhiThetaMixed' , 'flipAhead' , 'flipBehind' , 'flipLeft' , 'flipRight' ]
Contoh:
client . animate ( 'flipLeft' , 1000 ) ;
Harap dicatat bahwa drone akan membutuhkan jumlah ketinggian dan ruang kepala yang baik untuk melakukan flip. Jadi hati -hati!
Melakukan urutan LED yang telah diprogram pada frekuensi dan duration
hz
yang diberikan (dalam SEC!). animation
bisa menjadi salah satu dari yang berikut:
[ 'blinkGreenRed' , 'blinkGreen' , 'blinkRed' , 'blinkOrange' , 'snakeGreenRed' ,
'fire' , 'standard' , 'red' , 'green' , 'redSnake' , 'blank' , 'rightMissile' ,
'leftMissile' , 'doubleMissile' , 'frontLeftGreenOthersRed' ,
'frontRightGreenOthersRed' , 'rearRightGreenOthersRed' ,
'rearLeftGreenOthersRed' , 'leftGreenRightRed' , 'leftRedRightGreen' ,
'blinkStandard' ]
Contoh:
client . animateLeds ( 'blinkRed' , 5 , 2 )
Menyebabkan bit ref darurat ditetapkan ke 1 sampai navdata.droneState.emergencyLanding
adalah 0. Ini memulihkan drone yang telah terbalik dan menunjukkan lampu merah dapat diterbangkan lagi dan menunjukkan lampu hijau. Ini juga dilakukan secara implisit saat membuat klien tingkat tinggi baru.
Seorang klien akan memancarkan acara mendarat, melayang, terbang, mendarat, Batterychange, dan Altitudechange selama demo navdata diaktifkan.
Untuk mengaktifkan penggunaan demo navdata
client . config ( 'general:navdata_demo' , 'FALSE' ) ;
Lihat Dokumentasi untuk Objek navadata
Ini adalah API tingkat rendah. Jika Anda lebih suka sesuatu yang lebih sederhana, lihat dokumen klien.
Drone dikendalikan dengan mengirim paket UDP pada port 5556. Karena UDP tidak menjamin pemesanan atau pengiriman pesan, klien harus berulang kali mengirim instruksi mereka dan menyertakan nomor urutan yang meningkat dengan setiap perintah.
Misalnya, perintah yang digunakan untuk lepas landas/pendaratan (REF), dengan nomor urutan 1, dan parameter 512 (lepas landas) terlihat seperti ini:
AT*REF=1,512r
Untuk memudahkan pembuatan dan pengiriman paket -paket ini, modul ini memperlihatkan kelas UdpControl
yang menangani tugas ini. Misalnya, program berikut akan menyebabkan drone Anda lepas landas dan melayang di tempat.
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 ) ;
Sekarang setelah Anda mengudara, Anda dapat terbang dengan mengesahkan argumen ke metode pcmd()
:
control . pcmd ( {
front : 0.5 , // fly forward with 50% speed
up : 0.3 , // and also fly up with 30% speed
} ) ;
Itu saja! Daftar lengkap semua opsi pcmd()
dapat ditemukan di dokumen API di bawah ini.
Dengan apa yang telah Anda pelajari sejauh ini, Anda dapat membuat program sederhana seperti ini:
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 ) ;
Membuat instance UDPControl baru di mana options
dapat mencakup:
ip
: Alamat IP drone, default ke '192.168.1.1'
.port
: Port yang akan digunakan, default ke 5556
. Membuat perintah RAW AT*
. Ini berguna jika Anda ingin kontrol penuh.
Misalnya, instruksi lepas landas dikirim seperti ini:
udpControl . raw ( 'REF' , ( 1 << 9 ) ) ;
ENQUUUE A AT*REF
Command, Opsi adalah:
fly
: Tetapkan ini ke true
untuk lepas landas / tetap di udara, atau false
untuk memulai pendaratan / tetap di tanah. Default ke false
.emergency
: Tetapkan ini ke true
untuk mengatur bit darurat, atau false
untuk tidak mengaturnya. Rincian tentang ini dapat ditemukan di panduan SDK resmi. Default ke false
. ENQUUUE A AT*PCMD
(progresif) Perintah, opsi adalah:
front
atau back
: Terbang menuju atau menjauh dari arah kamera depan.left
atau/ right
: Terbang ke arah kiri atau kanan kamera depan.up
atau down
: dapatkan atau kurangi ketinggian.clockwise
atau counterClockwise
: putar di sekitar sumbu tengah. Nilai untuk setiap opsi adalah kecepatan yang digunakan untuk operasi dan dapat berkisar dari 0 hingga 1. Anda juga dapat menggunakan nilai negatif seperti {front: -0.5}
, yang sama dengan {back: 0.5}
.
Mengirim semua perintah yang diaktifkan sebagai paket UDP ke drone.
@Todo mendokumentasikan API video tingkat rendah.
@Todo mendokumentasikan API NavData level rendah.
Anda dapat mengakses kamera kepala dan kamera bawah, Anda hanya perlu mengubah konfigurasi:
// access the head camera
client . config ( 'video:video_channel' , 0 ) ;
// access the bottom camera
client . config ( 'video:video_channel' , 3 ) ;