Diffdrive
1 概述
以下为两轮差速机器人计算的相关公式.
v: 机器人的线速度
w: 机器人的角速度
L: 两轮之间的距离
x: 机器人车体朝向在全局坐标系 x 轴的位置
y: 机器人车体朝向在全局坐标系 x 轴的位置
θ: 机器人车体朝向与全局坐标系 x 轴正方向的夹角
坐标系遵守右手法则: X轴指向前方, Y轴指向左方, Z轴指向上方.
2 运动学正解
1 | v = ( v(R) + v(L) ) / 2 |
3 运动学逆解
1 | v(R) = v + (L / 2) * w; |
4 编码电机的计算
轮子的半径为 rd, 直径为 dl, 圆周率为 PI.
编码脉冲计数为 Tick, s 为 1 个 Ticks 轮子走过的距离, S 为经过 dt 时间后轮子走过的举例.
4.1 轮子的速度计算
左右轮子的计算公式为.
1 | s = 2 * rd * PI |
轮子的速度为.
1 | S = s * Ticks |
5 PID
由于两轮差速机器人需要控制 v(R) == v(L), 这里描述一下基础版的 PID 算法.
PID的精髓是: 比例调节(P), 积分调节(I), 微分调节(D).
快准稳!!!
1 | u = kp * error + ki ∗ ∫error + kd * ( derror / dt) |
在实际的计算当中, 我们当作这个过程是离散的.
5.1 比例控制算法
假设目标值为 T = 100, 初始数值为 0, 此时 kp = 0.5.
第一时刻: u = 0.5 * 100 = 50, 此时 T = 0 + 50 = 50.
第二时刻: u = 0.5 * 50 = 25, 此时 T = 50 + 25 = 75.
…
但是光靠比例控制算法我们可能无法到达目标值, 实际的情况下轮子存在摩擦力, 还可能有其他阻力, 这些阻力可能抵消掉我们通过 kp 靠近的数值, 我们称之为稳态误差.
5.1 积分控制算法
积分控制算法用来帮我们抵消掉存在的阻力.
假设目标值为 T = 100, 初始数值为 0, 此时 kp = 0.5, ki = 0.2.
第一时刻: u = 0.5 * 100 + 0.2 * 100 = 50 + 20 = 70, 此时 T = 0 + 70 = 70.
第二时刻: u = 0.5 * 30 + 0.2 * (100 + 30) = 15 + 26 = 41, 此时 T = 70 + 41 = 111.
这个积分项会将前面若干次的误差进行累计,所以可以很好的消除稳态误差.
5.2 微分控制算法
当车辆离目标非常接近的时候, 我们要考虑到平稳过渡过去, 为了使这个过程足够平缓, 我们加入了微分项.
1 | u= kd * (error(t) - error(t-1)) |
假设目标值为 T = 100, 初始数值为 0, 此时 kp = 0.5, ki = 0.2, kd = 0.1.
第一时刻: u = 0.5 * 100 + 0.2 * 100 + 0.1 * 100 = 50 + 20 + 10 = 80, 此时 T = 0 + 80 = 80.
第一时刻: u = 0.5 * 20 + 0.2 * (100 + 20) + 0.1 * (20 - 100) = 10 + 24 - 8 = 26, 此时 T = 80 + 26 = 106.