การใช้งานโปรโตคอลเครือข่ายที่ใช้โดย Parrot AR Drone 2.0 ปรากฏว่า 1.0 โดรนก็เข้ากันได้เช่นกัน
ติดตั้งผ่าน GitHub เพื่อรับเวอร์ชัน ล่าสุด :
npm install git://github.com/felixge/node-ar-drone.git
หรือถ้าคุณสบายดีกับสิ่งที่ขาดหายไปบางอย่างไปที่ NPM:
npm install ar-drone
AR Drone เป็น quadcopter ที่มีราคาไม่แพง แต่มีความสามารถอย่างน่าประหลาดใจ เสียงพึมพำนั้นใช้เฟิร์มแวร์ที่เป็นกรรมสิทธิ์ซึ่งสามารถควบคุมได้ผ่าน WiFi โดยใช้แอพมือถือ Freeflight อย่างเป็นทางการ (พร้อมใช้งานสำหรับ iOS และ Android)
ซึ่งแตกต่างจากเฟิร์มแวร์โปรโตคอลไคลเอ็นต์เปิดอยู่และนกแก้วเผยแพร่ SDK (จำเป็นต้องลงทะเบียนในการดาวน์โหลด) รวมถึงเอกสารจำนวนมากและรหัส C กลุ่มเป้าหมายของพวกเขาดูเหมือนจะเป็นนักพัฒนามือถือที่สามารถใช้ SDK นี้เพื่อสร้างเกมและแอพอื่น ๆ เพื่อให้ผู้คนมีความสนุกสนานมากขึ้นกับโดรนของพวกเขา
อย่างไรก็ตามโปรโตคอลยังสามารถใช้เพื่อรับข้อมูลวิดีโอและเซ็นเซอร์ทำให้นักพัฒนาสามารถเขียนโปรแกรมอิสระสำหรับการปฏิวัติหุ่นยนต์ที่กำลังจะมาถึง
โมดูลนี้ยังอยู่ระหว่างการพัฒนาอย่างหนักดังนั้นโปรดอย่าแปลกใจหากคุณพบฟังก์ชั่นบางอย่างที่ขาดหายไปหรือไม่มีเอกสาร
อย่างไรก็ตามชิ้นส่วนที่บันทึกไว้จะได้รับการทดสอบและควรทำงานได้ดีสำหรับส่วนต่างๆ
โมดูลนี้เปิดเผย API ไคลเอนต์ระดับสูงที่พยายามรองรับคุณสมบัติเสียงพึมพำทั้งหมดในขณะที่ทำให้ใช้งานง่าย
วิธีที่ดีที่สุดในการเริ่มต้นคือการสร้างไฟล์ repl.js
เช่นนี้:
var arDrone = require ( 'ar-drone' ) ;
var client = arDrone . createClient ( ) ;
client . createRepl ( ) ;
การใช้ REPL นี้คุณควรจะมีความสนุกสนาน:
$ 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'
การโทรหลายครั้งไปยังวิธีนี้ส่งคืนวัตถุเดียวกัน การเชื่อมต่อ Lifecycle (เช่นการเชื่อมต่อข้อผิดพลาดอีกครั้ง) ได้รับการจัดการโดยไคลเอนต์
ส่งคืนวัตถุ TcpVideoStream
ที่ปล่อยแพ็คเก็ต TCP ดิบเป็นเหตุการณ์ 'data'
การโทรหลายครั้งไปยังวิธีนี้ส่งคืนวัตถุเดียวกัน การเชื่อมต่อ Lifecycle (เช่นการเชื่อมต่อข้อผิดพลาดอีกครั้ง) ได้รับการจัดการโดยไคลเอนต์
ตั้งค่าสถานะ fly
ภายในเป็น true
callback
จะถูกเรียกใช้หลังจากรายงานเสียงพึมพำว่ามันกำลังลอยอยู่
ตั้งค่าสถานะ fly
ภายในเป็น false
callback
จะถูกเรียกใช้หลังจากรายงานเสียงพึมพำมันลงจอด
ทำให้เสียงพึมพำเพิ่มขึ้นหรือลดระดับความสูง speed
สามารถเป็นค่าตั้งแต่ 0
ถึง 1
ทำให้เสียงพึมพำหมุน speed
สามารถเป็นค่าตั้งแต่ 0
ถึง 1
ควบคุมระดับเสียงซึ่งการเคลื่อนไหวในแนวนอนโดยใช้กล้องเป็นจุดอ้างอิง speed
สามารถเป็นค่าตั้งแต่ 0
ถึง 1
ควบคุมม้วนซึ่งเป็นการเคลื่อนไหวในแนวนอนโดยใช้กล้องเป็นจุดอ้างอิง speed
สามารถเป็นค่าตั้งแต่ 0
ถึง 1
ตั้งค่าคำสั่งการเคลื่อนไหวของเสียงพึมพำทั้งหมดเป็น 0
ทำให้วางเมาส์ได้อย่างมีประสิทธิภาพ
ขอให้เสียงพึมพำปรับเทียบอุปกรณ์ แม้ว่าเฟิร์มแวร์ ar.drone รองรับอุปกรณ์เดียวที่สามารถสอบเทียบได้ ฟังก์ชั่นนี้ยังรวมถึง FTRIM
เครื่องวัดสนามแม่เหล็ก
อุปกรณ์: 0
Magnetometer สามารถปรับเทียบได้ในขณะที่เสียงพึมพำกำลังบินและรูทีนการสอบเทียบจะทำให้เสียงพึมพำเป็นไปได้ที่จะเพิ่มขึ้น 360 องศา
ftrim
อุปกรณ์: 1
FTRIM จะรีเซ็ตการหันเหการขว้างและม้วนเป็น 0 ต้องระมัดระวังในการใช้ฟังก์ชั่นนี้และปรับเทียบเฉพาะขณะอยู่บนพื้นผิวเรียบ ไม่เคยใช้ขณะบิน
ส่งคำสั่ง config ไปยังโดรน คุณจะต้องดาวน์โหลด Drone SDK เพื่อค้นหารายการคำสั่งทั้งหมดใน ARDrone_Developer_Guide.pdf
ตัวอย่างเช่นคำสั่งนี้สามารถใช้เพื่อสั่งให้โดรนส่ง NAVDATA ทั้งหมด
client . config ( 'general:navdata_demo' , 'FALSE' ) ;
callback
จะถูกเรียกใช้หลังจากเสียงพึมพำรับทราบคำขอกำหนดค่าหรือหากหมดเวลาเกิดขึ้น
หรือคุณสามารถผ่านวัตถุตัวเลือกที่มีสิ่งต่อไปนี้:
key
: คีย์ config ที่จะตั้งค่า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
ที่กำหนด (เป็นวินาที!) 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 ตราบใดที่เปิดใช้งาน Demo Navdata
เพื่อเปิดใช้งานการสาธิต navdata
client . config ( 'general:navdata_demo' , 'FALSE' ) ;
ดูเอกสารสำหรับวัตถุ navadata
นี่คือ API ระดับต่ำ หากคุณต้องการสิ่งที่ง่ายกว่าให้ตรวจสอบเอกสารไคลเอนต์
เสียงพึมพำถูกควบคุมโดยการส่งแพ็กเก็ต 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
: ที่อยู่ Drone IP, ค่าเริ่มต้นเป็น '192.168.1.1'
port
: พอร์ตที่จะใช้ค่าเริ่มต้นเป็น 5556
enqueues คำสั่ง raw AT*
สิ่งนี้มีประโยชน์หากคุณต้องการการควบคุมอย่างเต็มที่
ตัวอย่างเช่นคำแนะนำการบินขึ้นจะส่งแบบนี้:
udpControl . raw ( 'REF' , ( 1 << 9 ) ) ;
enqueues a AT*REF
คำสั่งตัวเลือกคือ:
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 เอกสาร API วิดีโอระดับต่ำ
@Todo เอกสารระดับต่ำ NAVDATA API
คุณสามารถเข้าถึงกล้องหัวและกล้องด้านล่างคุณต้องเปลี่ยน config:
// access the head camera
client . config ( 'video:video_channel' , 0 ) ;
// access the bottom camera
client . config ( 'video:video_channel' , 3 ) ;