AR.Drone四轴飞行器ROS开发方法介绍

  版权信息:
● 本博客使用CC 3.0协议,转载请保留该信息。
● 原文作者: 戴晓天 @ 云飞机器人实验室
● 原文地址: AR.Drone四轴飞行器ROS开发方法介绍

之前有人咨询如何在AR.Drone平台上进行开发,这里就简单介绍一下AR.Drone在Linux和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丰富的传感器及极佳的稳定性,让其十分适合于机器人研究。相比于固定翼平台,四轴平台无需太大的实验场地,从而更适合于室内飞行实验。

ardrone
图1. Parrot公司的AR.Drone 2.0四轴飞行器

整个系统是服务器-客户端架构,其中AR.Drone作为服务器,对用户提供WiFi接口,需要用户主动去连接。其官方提供的SDK (AR.Drone SDK) 向用户提供了飞行姿态数据、视频流以及用户控制命令接口,基于该SDK可以使用C或C++进一步扩展功能,如增加路径规划导航及图像识别等。该SDK的具体使用方法我并没有仔细研究过,命令和数据好像在是建立socket连接后通过AT指令传输的,详情可以参见开发手册

在我的项目中,我并没有使用AR.Drone SDK,而是使用了AR.Drone SDK的二次封装库:ardrone-autonomy. ardrone-autonomy是在ROS下实现的,所以需要ROS和Linux Ubuntu开发环境。ROS Hydro版本的安装方法在我另一篇博文中。

Ubuntu和ROS的安装工作完成后,在terminal中输入以下指令安装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 (%),电池电量

  • state: The Drone’s current state,当前飞行器状态:
    • 0: Unknown,未知
    • 1: Inited,初始化完成
    • 2: Landed,着陆
    • 3,7: Flying,飞行
    • 4: Hovering,悬停
    • 5: Test (?),测试
    • 6: Taking off,正在起飞
    • 8: Landing,正在着陆
    • 9: Looping (?)
  • rotX: Left/right tilt in degrees (rotation about the X axis),左右倾角Roll

  • rotY: Forward/backward tilt in degrees (rotation about the Y axis),前后倾角Pitch

  • rotZ: Orientation in degrees (rotation about the Z axis),方向角Yaw

  • 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, 电机PWM控制值

  • 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双向通信了。ROS的开发编程方法在此不再赘述,但是推荐使用C++的API(另一个为python接口,觉得支持的还不好)。

目前先写这么多,如果还收到其他开发上的疑问,我再进行补充。最后附上ardrone_autonomy的在线手册地址

%d bloggers like this: