鹦鹉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 ) ;