轮式自主移动机器人编程实战
上QQ阅读APP看书,第一时间看更新

2.2 轮式机器人的转向结构

笔者最终选用了双驱动结构,其中两个轮子是减速驱动轮,也就是电动机输出轴通过齿轮结构箱和联轴器连接,这两个驱动轮并排在同一个轴线上,外形与生活中的三轮车相似,但笔者设计的两只驱动轮并非连接在同一个轴上。

图2-3 轮式机器人的底盘

图2-3是轮式机器人的底盘,可以看到,两个电动机(图2-3中箭头所示)并未连接到同一个轴上。那么这种轮式机器人如何实现转弯呢?

2.2.1 轮式机器人的差速转向

差速转向结构利用两个轮子的不同速度实现转弯动作。在轮式机器人中,当两个轮子的转动速度不同时,便可以实现转向,这就要求两个轮子固定在两个电动机上。如图2-4所示,当A轮和B轮分别按照图中的箭头方向转动时便实现了右转弯的动作。

图2-4 转弯动作示意图

这种结构很容易实现转弯,但是却有一个很明显的问题,那就是很难实现直线行驶。即两个轮子在行驶过程中很难保证速度一模一样,这样就会存在偏移误差,即使短时间内偏移误差只有0.01°,但是随着时间积累,误差被逐步放大,偏移角度会越来越大。速度差异是由于每个电动机的参数在生产过程中因材质的批次不同,或者一些其他因素造成的,这就好比天下没有一模一样的两片叶子,所以即使用相同的电压驱动两个电动机,两个电动机的转速也不会完全一样。

图2-5 轮式机器人直行示意图

笔者在实际实验中发现,给两个电动机提供相同的电压,使其运动,当运动一段距离后,会发现所走的路线是有弧度的,如图2-5所示。R是弧度的半径,V1V2分别是右轮和左轮的速度,V是向前的线速度,B是左、右轮之间的距离。笔者采用型号为 GA370的带编码测速的电动机,每个电动机接入约8 V电源(电源存在波动,实际会有偏差),通过编码器获取转速值(编码指将电动机的转速通过传感器变成可读的电压值序列,会在2.2.4节中讲述),最终结果如表2-1所示。

表2-1 左、右编码脉冲计数对比

那么轮式机器人无法走直线的问题怎么解决?通过引入闭环控制,即找到参照物可以实现。根据轮式机器人与参照物的偏差进行修正,从而保证轮式机器人走直线。在自动控制领域,有一种控制算法叫PID算法,能使采样速度和设置速度无限接近。这也是1.1节中第5个问题的答案(如何控制机器人走直线)。截止到目前,本书中都是以差速转向进行讲述的。

2.2.2 轮式机器人的独立舵机转向

独立舵机转向依靠一个舵机实现转向。该舵机安装在两个轮子中间,如图2-6所示。

两个轮子之所以发生转向,是因为中间的舵机在转动。舵机可以旋转180°,180°指的是向左、向右分别旋转90°。就像人的头部正常情况下朝向正前方,可以向左转头或向右转头。

舵机有电源线、地线以及一根信号线。舵机的中间位置定义为舵机在顺时针或逆时针方向上具有相同旋转量的位置。舵机的旋转可以由信号线上的PWM波实现,通过信号线上PWM波发送的脉冲的持续时间的不同,可以控制舵机转向不同的位置。例如,周期为20 ms,高电平(脉冲)时间t=1.5 ms将使电动机从0°顺时针旋转90°,这是刚才所说的中间位置。高电平(脉冲)t=0.5 ms控制舵机恢复到0°位置,可以认为是从中间位置向左转了90°。高电平(脉冲)t=2.5 ms控制舵机以顺时针方向从0°转动180°,可以认为是从中间位置向右转了90°,如图2-7所示。

图2-6 四轮机器人底盘

图2-7 脉冲示意图

目前轮式机器人中常用的舵机是SG90小舵机,驱动电压为5~12 V,PWM信号线可以直接连接单片机的IO引脚,不需要驱动模块,这是因为单片机的IO引脚和舵机的信号线连接,而不是可流过大电流(500 mA~1 A)的电源线,舵机接线如图2-8所示。

图2-8 舵机接线示意图

在STM32中用代码实现舵机的转动,指令如下:

A 指令:TIM_SetCompare2(TIM3,10); //左旋转90°

B 指令:TIM_SetCompare2(TIM3,20); //右旋转90°

C 指令:TIM_SetCompare2(TIM3,15);//正前方

无论当前舵机处于什么状态,如果想让舵机朝向正前方,只需要调用C指令即可。

2.2.3 阿克曼转向结构

阿克曼转向结构是四轮机器人中常用的转向结构,它的特殊结构导致转弯内径R1小于转弯外径R2,如图2-9所示。从图中可以看到,图中两个轮子固定在同一个金属连接轴上,每个轮子不能单独横向摆动,可以依靠控制力矩使整个金属连接轴转动,从而带动两个轮子,以旋转中心实现转弯。此类转向结构驱动轮可以是后轮,用一个电动机就可以驱动两个轮子同时转动。

图2-9 舵机转向示意图

2.2.4 轮式机器人转向比较

差速转向的转弯半径相对阿克曼转向可以小很多,并且只要电动机转动起来,立马可以得到航向角的变化。而舵机转向需要将传感器安装在舵机结构件上,才能知道指令发布后返回的结构,需要特殊的结构设计,转弯半径也相对较大,但是舵机的IO资源利用非常少,很适合四轮双驱的车体。

对于差速转向,前行速度v和角速度w不必同时存在数值。当前行速度v=0,角速度w≠0,同样可以完成原地转向。在笔者的机器人设计中,正是利用这一特性才完成的避障算法。

例如,机器人被一堵墙拦住了去路,如图2-10所示。差速转向机器人可以原地旋转,实现转弯动作。而阿克曼转向需要考虑转弯半径,设计算法时需要考虑转弯半径。对于阿克曼转向结构的机器人来说,要求转弯时离墙的距离更远,以免转弯时撞到墙上。

图2-10 差速转向机器人“面壁”思考

综上可见,差速转向的机器人的机械结构则相对简单,本书主要以差速转向结构进行讲解。

2.2.5 差速机器人里程计运动模型

2.6节将讲解如何低成本DIY一个机器人,但是机器人的运动依旧需要科学地利用数学知识和运动学知识。

机器人运动学引入里程计运动模型,里程计运动模型是在基于平面的二维坐标系中,将机器人的坐标位置、航向角用数学的方法表示出来。机器人的位姿包括x轴坐标、y轴坐标以及与x轴的夹角,可用Pose(xyθ)表示,如图2-11所示。相关公式如下。

其中,L是两个轮子之间的距离,根据编码器可得到两轮的速度,可计算得到线速度v、角速度w、时间dt内机器人的最新位置,如图2-12所示。

图2-11 初始位姿示意图

图2-12 移动后的位姿

假设机器人有三个时刻,t0t1t2,为方便计算,角度单位为deg/s,t0时刻机器人上电,机器人坐标系原点与里程计坐标系原点重合,位于里程计坐标系(0,0,0)点,此时机器人以0.2 m/s的速度向前移动1s。t1时刻机器人停止运动,此时里程计下的位姿是(0.2,0,0)。然后机器人以30 deg/s的角速度旋转1s,停止转动后里程计下的位姿是(0.2,0,30)。t2时刻机器人再以0.2 m/s的速度运行1s,然后停止运动,此时里程计下坐标是(0.373,0.1,30)。

但在实际中,随着时间的累积,误差会增加,导致里程计的数据发生偏移,所以需要引入IMU传感器(陀螺仪、加速度计等)进行校正。