Category Archives: Robot Design

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的在线手册地址

两轮自平衡机器人 | 研究计划

我一直对自平衡小车十分感兴趣,最早在关注Segway的时候就想玩一玩自平衡算法(当时大约还是2010年)。然而那时一无业余时间,二无设计能力,于是搁浅至今。今年5月份回国的时候,这个想法重新占上心头,于是在淘宝选够了一款评价较好的平衡车,总价不过400大洋。谁知回到英国,自己又懈怠了下来,除了偶尔拿出来当玩具玩两下,也没有仔细深入研究。这样下去自然不行,然而深入研究确实需要不少精力,只能在此痛下决心一定要把里因外果弄清楚。

虽然之前没有正式做过平衡车,然后对于这个系统还是有所了解的,其中存在的研究问题大概如下:

● 硬件设计:电机选型、电机驱动、速度反馈传感器、惯性传感器MEMS、电源、电池、MCU、通信。因为硬件设计实在繁琐,其中原理并不复杂,调试却颇费功夫,所以直接购买硬件成品;

● 系统建模:两轮自平衡的系统模型与一阶倒立摆应该是一样的。系统模型并非必须,但是通过系统模型可以了解系统特性,也可以做一些软件仿真,方便控制器的参数调节。系统的最终模型可以是s域的传递函数模型 (transfer function) 也可以是时域的状态空间模型 (state-space model);

● 传感器数据处理:主要是对惯性传感器的数据进行滤波与分析。滤波的目的是排除系统的动态扰动以及传感器的动态噪声,主要算法应该是互补滤波器 (Complementary Filter) 和卡尔曼滤波器 (Kalman Filter)。互补滤波器的算法实现较简单,而卡尔曼滤波器虽然复杂但可以和状态空间模型结合,设计性能更佳的LQG控制器;

● 控制器设计:常用的为PID控制器和状态空间下的LQR (Linear Quadratic Regulator) 或LQG (Linear-Quadratic-Gaussian) 控制器;

● 任务设计及实时性保证:整个软件有实时性要求,倾向于使用免费的FreeRTOS实时操作系统。操作系统采用静态优先级调度,优先级基于任务周期。系统中的主要任务有:传感器采集任务、传感器滤波与分析任务、控制器任务、电机转速调制任务、通信任务。

整个研究对我来说有三个目的:
1)研究运动传感器数据滤波与处理;
2)研究系统建模与控制器设计;
3)研究FreeRTOS的使用方法以及验证相关的实时性理论。

因为还未阅读相关资料,以上设计计划可能还有遗漏、错误之处,日后发现再做修正。

第三届谢菲尔德大学搜救机器人比赛

这个月月初参加了我们学校的搜救机器人大赛:谢菲尔德自动工程系搜救机器人比赛 (ACSE Robotic Search and Rescue Competition) 。该比赛的目标是设计一个移动机器人,通过远程视频控制的方法让其通过一个模拟的搜救环境,并在最短时间内到达终点。该场地模拟了很多搜救过程中可能出现的障碍:重型物体、斜坡、坑洼路面、吊桥、狭窄的通道等。图为当天的比赛场地:

DSC01711
Figure 1.  比赛当天场地实景

这个比赛的难点在于机器人的结构必须能应对复杂的场地,并且参赛队伍在比赛过程中无法直接看见机器人所在环境,只能通过远程视频的方式对机器人进行无线控制。这次我采用的架构为Arduino兼容的大谷Wild Thumper机器人控制板 + 树莓派:由Wild Thumper控制板进行电机控制与传感器采集,并通过树莓派实现远程控制与视频传输,两个系统之间通过TTL串口进行通信。PC端使用Processing对机器人实现控制,并展示当前的运行参数与传感器数据。

DSC01774
Figure 2. Wild Thumper(左) + 树莓派(右)的配置

DSC01783
Figure 3. 机器人实体(正面)

DSC01785
Figure 4. 机器人实体(侧面)

机器人所用的摄像头为树莓派官方最新发布的摄像头模块RaspiCam,该模块使用OV5647芯片,图像像素为300万,视频支持1080P@30fps。 摄像头模块通过软排线与树莓派的CSi接口相连接,并通过云台增加了倾斜方向的自由度。视频采集与传输使用Raspivid + Netcat + mplayer,为了提高传输速率使用了UDP协议,并且将采集像素下降到600 * 480。摄像头通过热熔胶固定在舵机云台上,图为摄像头的安装位置:

DSC01775Figure 5. 机器人摄像头特写

DSC01700 Figure 6. 无线视频传输调试

无标题2_副本
Figure 7. 比赛现场 之1

无标题1_副本
Figure 8. 比赛现场 之2

机器人硬件配置清单

核心主控 树莓派 Model B
辅助控制 Wild Thumper (Arduino兼容)
底盘 大谷4WD Wild Thumper Chasis
摄像头 RaspiCam + 单轴云台
传感器 3轴加速度/陀螺仪 + 3轴磁场传感器
电源供电 20C/5000mAh 2s锂聚合物电池+ USB备份电源5V 6000mAh

Rovio硬件电路图解

Rovio买回来很长时间了,其实早就已经拆解过,只是还没有整理成系统的说明。最近时间也不是非常多,再最终整理完成之前,先将目前的研究成果公布一下吧。

Rovio共有四块电路板,分别为1)运动控制板、2)电源充电板、3)北极星传感器和4)IP CAM控制板。其中前两块PCB安装在机器腹部,后两块PCB安装在头部。北极星的传感部分是外露的,就是头顶上的圆形接收区域,IP CAM的摄像头在头部的最前端,两者之间的小孔是麦克风。

DSC03813Figure 1.  Rovio的外观

运动控制板的电路原理如下:

DSC03811Figure 2.  运动控制部分电路 

IP CAM的电路结构及与北极星的接口定义如下:

DSC03810Figure 3.  IP CAM电路板与北极星传感器的接口

锂电池的主要参数与选型

在进行机器人设计时,动力源是必不可少的。常用的供能方式有很多,如干电池、镍氢电池、锂电池、硫酸铅电池。其中,锂电池在放电性能以及能量密度方面的优势明显,被广泛使用。

锂电池有三个重要的性能参数:电压容量以及放电倍数

锂电池的电压是由串联级数决定的,单节锂电的电压是一定的,所以锂电总电压永远是单节电池电压的整数倍。锂电池在表示时,使用”串联级数+s“作为其型号,如两节串联表示为2s,三节串联则为3s。单节锂电池的额定电压为3.7v,充满时为4.2v,放空为3.5v。不同级数的锂电池电压整理如下:

电池级数 额定电压(v) 电压范围(v)
2s 7.4 7.0 – 8.4
3s 11.1 10.5 – 12.6
4s 14.8 14.0 – 16.8
5s 18.5  17.5 – 21.0
6s 22.2 21.0 – 25.2

锂电池的容量表示其存储电能的大小,容量越大,充电后运行的时间就越长。锂电池的容量以毫安时为单位,如2000mAH表示以2000mA电流放电,可以持续一个小时。

锂电池另外一个重要参数是放电倍数C,C值的大小决定了其放电电流的能力,公式为最大放电电流 = C * 容量。如一个1000mAH,20C的锂电池,最大的放电电流即为1000mA * 20 = 20A。

在选用前,需要核算机器人系统需要的电压、最短续航时间以及需要的最大供电电流,同时考虑到体积、重量以及是否需要保护板等其他因素,这样就可以选择到合适的锂电池了。

【修订历史】

v1.1   07/18/2014   修改了文章版式;将电压表制作为表格形式;修正了部分单位错误。

Welcome our new friend – Rovio!

Rovio是一个具有远程视频功能的全向移动机器人,它是我之前设计失败的机器人Tri-Angle的原型之一。

Rovio可以通过Web网页进行远程控制,主要功能有方向控制、视频传输、声音传输以及自动回家功能。

这是其结构组成:

这是其充电坞,由TrueTrack系统提供对自动回家的支持:

之后的日子里,我会详细拆解Rovio,为大家介绍这款设计优良的机器人的运行原理。

一个失败的机器人设计

大概几个月之前,我心血来潮,希望做一个全向机器人平台。

这个机器人的原理是这样的:它有三个万向轮,通过三个方向的运动矢量合成,理论上可以向任意方向移动,从而避免了转向带来的运动效率低下。

可惜,这是一个失败的设计,因为万向轮的摩擦力太小了,除非在地毯上,否则打滑非常严重,从而干扰了对速度闭环的正常检测(有效的速度和测量的速度不一致)。而这个机器人的运动依赖于对速度的精确控制,所以最后无疾而终。

MicroMouse V2电机的选择

第一版本的MM(MicroMouse)使用的是带减速箱的N20电机。这种电机非常小巧,比130电机的体积还要小,空载转速大概50转/分钟,适合小型机器人。电机店和淘宝上很容易买到,价格大约在15-25元之间:

图1  N20直流电机

新版本的MM首先希望在电机上进行改进,备选的几个方案有:

1) 直流步进电机;

2) 直流无刷电机;

3) 直流空心杯电机。

步进电机的好处是易于控制,且不需要额外的转速反馈。缺点是速度较慢,且一旦打滑就会造成累积误差。2010年参加全国电脑鼠大赛时,赞助商周立功公司提供的电脑鼠就是使用步进电机的。我觉得步进电机是一个好的入门级方案,可以实现,但无法出色。

之后考虑过使用无刷电机,无刷电机没有换向接触损耗、噪音低、寿命长、稳定性好,广泛用于光盘驱动、电动车中。无刷电机的缺点就是要使用专门的驱动电路,之前和朋友做毕业设计时接触过无刷驱动器的设计,觉得还是挺麻烦的。再者就是控制难度比较大,每路需要六个Mos管、三个驱动芯片和三个PWM。虽然可以使用成品电调,可是势必会增加重量,对电脑鼠的速度性能不利。

现在我有了更好的选择:直流空心杯电机。空心杯电机使用无铁芯转子,具有很小的转动惯量,这一点对于需要快速起停、运动灵活的电脑鼠来说非常适合。参照以往电脑鼠国际大赛的设计,一般使用Faulhaber1717 (冯哈伯1717)电机。1717后缀表示直径17mm,机身长度17mm。以下是冯哈伯电机的介绍:

“FAULHABER直流电机采用斜绕方式的空心杯转子,没有齿糟效应以及非常轻的重量。这使得转子转动惯量极小。因而FAULHABER电机动态性能上卓越超群。对小动率产品,FAULHABER电机采用精密合金换向器,因其接触电阻低而使性能优良。”(引自互联网)

在机器人设计中经常可见Faulhaber电机,之前使用博创的机器人平台好像也是使用的Faulhaber电机。尤其是其德国的血统,让人对之的性能充满信心。

      图2  Faulhaber电机 

可惜的是,我在网上并没有找到本地销售Faulhaber1717这款电机的,只找到一家国外的网站,报价大约是500元一个,那是相当贵啊。不过我倒是找到有售Faulhaber2224电机的,价格也很便宜只有几十块钱。虽然体积大了一点(r=22mm l=24mm),但是我想对于我这种业余爱好者来说应该不是很大的问题。