鸚鵡AR Drone 2.0使用的網絡協議的實現。看來1.0無人機也兼容。
通過github安裝以獲取最新版本:
npm install git://github.com/felixge/node-ar-drone.git
或者,如果您缺少一些最先進的東西,請選擇NPM:
npm install ar-drone
AR無人機是一個負擔得起但功能令人驚訝的四輪驅動器。無人機本身運行專有固件,可以使用官方Freeflight移動應用程序通過WiFi(可用於iOS和Android)來控制該固件。
與固件不同,客戶端協議是打開的,鸚鵡發布了SDK(需要下載的註冊),包括大量文檔和C代碼。他們的目標受眾似乎是移動開發人員,他們可以使用此SDK創建遊戲和其他應用程序,以便人們使用無人機更加有趣。
但是,該協議也可用於接收視頻和傳感器數據,使開發人員能夠為即將到來的機器人革命編寫自主程序。
該模塊仍處於繁重的開發中,因此,如果您發現缺少或無證功能,請不要感到驚訝。
但是,記錄的零件經過測試,應該在大多數零件上都可以很好地工作。
該模塊公開了一個高級客戶端API,該API試圖支持所有無人機功能,同時使其易於使用。
入門的最佳方法是創建一個這樣的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的簡單方法(需要在您的$PATH
中找到最近的FFMPEG版本):
var pngStream = client . getPngStream ( ) ;
pngStream . on ( 'data' , console . log ) ;
您的第一個挑戰可能是將這些PNG圖像視為節點HTTP Web服務器。完成此操作後,您應該嘗試將它們饋入OpenCV模塊。
返回一個新的Client
對象。 options
包括:
ip
:無人機的IP。默認為'192.168.1.1'
。frameRate
:PNGENCODER的幀速率。默認為5
。imageSize
:PNGENCODER產生的圖像大小。默認為null
。 使用活動範圍中可用的所有客戶端方法啟動交互式接口。另外, client
可以解決client
實例本身。
返回一個PngEncoder
對象,該對象將單個PNG圖像緩衝區排放為'data'
事件。對此方法的多個調用返回同一對象。連接生命週期(例如重新連接錯誤)由客戶端管理。
返回一個將原始TCP數據包排放為'data'
事件的TcpVideoStream
對象。對此方法的多個調用返回同一對象。連接生命週期(例如重新連接錯誤)由客戶端管理。
將內部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本質上重置偏航,俯仰和滾動到0。使用此功能非常謹慎,並且僅在平坦的表面上進行校準。飛行時永遠不會使用。
將配置命令發送到無人機。您將需要下載無人機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 ) ;
請注意,無人機需要大量的高度和淨空才能進行翻轉。所以小心!
在給定的hz
頻率和duration
(以sec!)進行預編程的LED序列。 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。這恢復了一架已翻轉的無人機,並顯示了紅燈再次可飛行並顯示綠燈。在創建新的高級客戶端時,它也隱含地進行。
只要啟用演示NAVDATA,客戶就會發射降落,懸停,飛行,著陸,電池彙和Altitudechange事件。
啟用DEMO NAVDATA使用
client . config ( 'general:navdata_demo' , 'FALSE' ) ;
請參閱文檔中的navadata
對象
這是一個低級別的API。如果您更喜歡簡單的內容,請查看客戶端文檔。
通過在端口5556上發送UDP數據包來控制無人機。由於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
。 在AT*
命令中加入RAW。如果您想要完全控制,這將很有用。
例如,以這樣的方式發送起飛說明:
udpControl . raw ( 'REF' , ( 1 << 9 ) ) ;
AT*REF
命令的入選,選項為:
fly
:將其設置為true
以進行起飛 /停留在空中,或者false
以啟動著陸 /留在地面上。默認為false
。emergency
:將其設置為true
以設置緊急位,或者false
以不設置。有關此信息的詳細信息可以在官方SDK指南中找到。默認為false
。 AT*PCMD
(漸進式)命令,選項為:
front
:飛向前置攝像頭方向或遠離前置back
頭。left
或/ right
:朝著前置攝像頭的左或右飛行。up
或down
:增加或降低高度。clockwise
或counterClockwise
:圍繞中心軸旋轉。每個選項的值是用於操作的速度,範圍從0到1。您還可以使用{front: -0.5}
之類的負值,與{back: 0.5}
相同。
將所有重新命令作為UDP數據包發送到無人機。
@todo記錄低級視頻API。
@todo記錄低級NAVDATA API。
您可以訪問頭部攝像頭和底部攝像頭,只需更改配置:
// access the head camera
client . config ( 'video:video_channel' , 0 ) ;
// access the bottom camera
client . config ( 'video:video_channel' , 3 ) ;