20. 里程计、编码器、IMU 与 PID¶
20.1 学习目标¶
理解目标速度、编码器反馈、PID、底盘速度、里程计和IMU之间的因果关系,并用这条链判断轮子在动而里程计异常发生在哪一步。
20.2 适用范围¶
适用于带电机编码器和板载/外置 IMU 的轮式底盘。编码器线数、减速比、轮径、控制周期和 IMU 量程必须取自当前硬件与固件。
20.3 操作前检查¶
- 轮号、编码器方向和底盘几何参数已记录。
- 不在载人或拥挤场地调 PID。
- 修改参数前保存当前值、固件和一段正常日志。
20.4 工作原理¶
编码器把电机或车轮的转动变成可计数的脉冲,控制板据此测量轮速。里程计根据轮速和底盘几何参数持续推算机器人走过的距离、朝向和速度;车轮打滑时,这个推算会产生误差。PID 用目标速度与测量速度的差来修正输出。PWM是控制板常用的电机驱动方式:通过改变脉冲的有效时间比例来调节平均驱动强度。
控制与估计链如下:
机器人目标速度
→ 逆运动学 → 各轮目标速度
→ PI/PID 与 PWM → 电机实际速度
→ 编码器脉冲 → 各轮测量速度
→ 正运动学 → 底盘速度
→ 时间积分 → 轮式里程计
IMU 原始加速度/角速度
→ 零偏与量程转换
→ 姿态或融合估计
轮子线速度常按下面关系计算:
\[
v = \omega_m \frac{r}{N}
\]
其中 ω_m 是电机轴角速度,N 是减速比,r 是轮半径。若直接从编码器计数计算,还要明确每转脉冲数、四倍频方式和采样周期。
速度控制可采用增量式 PI 思路。PI 是 PID 中省略微分项的形式;许多底盘在这个环节只使用比例项和积分项:
\[
u_k = u_{k-1} + K_p(e_k-e_{k-1}) + K_i e_k
\]
e_k 是目标速度与测量速度之差。输出通常还有限幅。参数过大可能引起振荡和发热,过小则响应慢、负载下误差大。
IMU 能提供角速度和加速度,但积分会累积零偏;轮式里程计在打滑时也会漂移。二者是互补信息,不应把单一传感器当成绝对位置真值。
20.5 操作步骤¶
- 架空轮子,给一个稳定的小目标速度,记录目标、编码器计数、测量速度和 PWM。
- 手动转动单个轮子,确认编码器计数方向与轮号一致。
- 核对每转计数、减速比、轮径和控制周期的单位。
- 落地低速直行,比较左右/各轮目标与测量速度。
- 静止记录 IMU 至少 30 秒,计算角速度均值和波动,确认零偏是否稳定。
- 缓慢原地转动允许自旋的底盘,比较编码器推导角速度与 IMU Z 轴方向。
- 在 ROS 2 中同时记录里程计和 IMU 话题;停止后检查速度是否回零、姿态是否持续快速漂移。
- 只有硬件、单位和方向均正确后才调 PI。一次只改一个参数,并保存前后曲线。
20.6 验收标准¶
- 每个编码器方向和轮号正确。
- 同一目标下,各轮测量速度趋势相近且不过度振荡。
- 停止命令后 PWM 与测量速度回落,电机不持续啸叫。
- 静止 IMU 没有明显跳变,零偏已记录。
- 正转方向下,轮式角速度与 IMU Z 轴符号经过驱动转换后保持一致。
- ROS 里程计的单位为米和弧度,未把 mm/s 或放大后的角速度直接发布。
20.7 故障排查¶
| 现象 | 可能原因 |
|---|---|
| 轮子转但速度始终为 0 | 编码器供电、线序、计数中断或错误接口 |
| 测量速度符号反了 | A/B 相方向或软件符号错误 |
| 速度周期性振荡 | PI 参数过大、采样周期不稳或机械间隙 |
| 低速不动,高速突然冲出 | 静摩擦、死区补偿或积分累积 |
| 直行里程计旋转 | 左右轮径/方向/比例不一致 |
| 静止航向持续漂移 | 陀螺零偏、温漂或积分未约束 |