之前有人问我如何使用AR.Drone平台进行开发,这里简单介绍一下AR.Drone在ROS (Robot Operating System) 下的开发方法。原来计划是一篇更加完整的开发介绍,但是因为中间搁置了一段时间,很多细节到现在已经不能完全记清楚了,所以只简单介绍一下工具及方法。开发过程是在我的研究生毕业设计: Vision-Based Localization and Tracking of a UGV with a Quadcopter中整理的,该项目的介绍和演示视频可以在这里找到。
AR.Drone是法国Parrot公司生产的高性能四轴飞行器平台,它因其极高的性价比和丰富的板载传感器而被广泛应用于机器人研究中。AR.Drone平台于2010年在CES大会上首次发布,它最初的定义是应用于虚拟增强游戏的高科技四轴飞行器平台。AR.Drone使用了极轻的聚丙烯和碳纤维材料,不含外壳的总重量仅为380g。AR.Drone可用于室内或室外飞行,每一种模式可以配备不同的外壳。其第二代AR.Drone 2.0于2012年发布,相对于一代增强了摄像头分辨率,并提高了处理器性能。新版本的AR.Drone 2.0 (Power Edition) 还支持使用GPS定位模块,同时续航时间由最初的18分钟提高到了40分钟。AR.Drone丰富的传感器及极佳的稳定性,让其十分适合于机器人研究。相比于固定翼平台,四轴平台无需太大的实验场地,从而更适合于室内飞行实验。
图1. Parrot公司的AR.Drone 2.0四轴飞行器
AR.Drone提供WiFi接口,需要用户主动去连接。其官方提供的SDK (AR.Drone SDK) 向用户提供了飞行姿态数据、视频流以及用户控制命令接口,基于该SDK可以使用c或c++进一步扩展功能。具体的方法我并没有仔细研究过,详情可以参见开发手册。在我的项目中,我使用了AR.Drone SDK的二次封装库:ardrone-autonomy。ardrone-autonomy是在ROS下实现的,所以需要安装ROS。ROS Hydro版本的安装方法见此:http://www.yfworld.com/?p=2281.
ROS安装完成后,输入以下指令安装ardrone-autonomy:
apt-get install ros-hydro-ardrone-autonomy
如果不是使用的ROS Hydro而是其他版本,则将-hydro-换为对应版本:-Indigo-或-Groovy-。安装完成后,通过rosrun运行驱动:
rosrun ardrone_autonomy ardrone_driver
运行之前确定WiFi需要确定正常连接。如果连接失败,命令提示行中会有对应的提示输出。该驱动在运行时还可以修改配置参数:
# Default Setting - 50Hz non-realtime update, the drone transmission rate is 200Hz $ rosrun ardrone_autonomy ardrone_driver _realtime_navdata:=False _navdata_demo:=0 # 200Hz real-time update $ rosrun ardrone_autonomy ardrone_driver _realtime_navdata:=True _navdata_demo:=0 # 15Hz real-rime update $ rosrun ardrone_autonomy ardrone_driver _realtime_navdata:=True _navdata_demo:=1
其中,_realtime_navdata 参数决定数据是否缓冲发送,而_navdata_demo 参数决定数据的发送频率是15Hz还是200Hz。该驱动运行成功后,将作为一个Node向外Publish或者Subscribe topics。topics有三类:
1) Legacy navigation data,位于ardrone/navdata,包括当前状态、转角、速度、加速度等:
header: ROS message header
batteryPercent: The remaining charge of the drone’s battery (%)
rotX: Left/right tilt in degrees (rotation about the X axis)
rotY: Forward/backward tilt in degrees (rotation about the Y axis)
rotZ: Orientation in degrees (rotation about the Z axis)
magX, magY, magZ: Magnetometer readings (AR-Drone 2.0 Only) (TBA: Convention)
pressure: Pressure sensed by Drone’s barometer (AR-Drone 2.0 Only) (Pa)
temp : Temperature sensed by Drone’s sensor (AR-Drone 2.0 Only) (TBA: Unit)
wind_speed: Estimated wind speed (AR-Drone 2.0 Only) (TBA: Unit)
wind_angle: Estimated wind angle (AR-Drone 2.0 Only) (TBA: Unit)
wind_comp_angle: Estimated wind angle compensation (AR-Drone 2.0 Only) (TBA: Unit)
altd: Estimated altitude (mm)
motor1..4: Motor PWM values
vx, vy, vz: Linear velocity (mm/s) [TBA: Convention]
ax, ay, az: Linear acceleration (g) [TBA: Convention]
tm: Timestamp of the data returned by the Drone returned as number of micro-seconds passed since Drone’s boot-up.
2) Cameras,前置摄像头和底部摄像头的视频流分别位于ardrone/front/image_raw 和 ardrone/bottom/image_raw,传输使用标准的ROS camera interface接口。同时摄像头可以通过ardrone_front.yaml和ardrone_bottom.yaml这两个配置文件进行校正;
3) 飞行器控制 (输入),位于cmd_vel,该节点接受geometry_msgs::Twist 数据作为输入,可以控制飞行器在x, y, z上的速度,以及控制yaw的角速度。
-linear.x: move backward +linear.x: move forward -linear.y: move right +linear.y: move left -linear.z: move down +linear.z: move up -angular.z: turn left +angular.z: turn right
用户开发自己的Node程序时,只要Publish或者Subscribe上述对应的topics,就可以实现和AR.Drone的双向通信了。目前先写这么多,如果还收到其他开发上的疑问,我再进行补充。最后附上ardrone_autonomy的手册地址。