3、测量与感知误差:编码器分辨率限制、IMU漂移、视觉SLAM重投影误差
做轨迹跟踪这些年,我踩过最多的坑,其实不是控制算法本身,而是「传感器告诉我的位置是错的」。
你想想看,你写了个完美的PID,仿真跑得飞起,一上真机就抖成筛子。为什么?因为反馈信号本身就是有问题的。这一章,我们就来聊聊测量与感知误差——它们是怎么来的,怎么影响轨迹,以及多传感器融合时误差是怎么「传染」的。
3.1 编码器分辨率限制:你以为是连续,其实是离散
编码器这东西,说白了就是个「数格子的」。不管是光电编码器还是磁编码器,它输出的都是脉冲数。你每转一圈,它给你N个脉冲。
那问题来了——如果你的轮子只转了半个脉冲的距离,编码器告诉你「没动」。这就是分辨率限制。
我遇到过的一个真实案例:
有一次做AGV的轨迹跟踪,用的是500线的编码器,轮子直径100mm。算下来每个脉冲对应的位移大约是0.628mm。听起来挺精细的对吧?但问题是,AGV在低速运行时,控制器每10ms读取一次编码器。如果速度低于0.0628m/s,编码器可能连续好几个周期都读不到脉冲变化。
结果就是:控制器以为车没动,于是加大输出。等编码器突然跳了一个脉冲,位置误差瞬间被放大,车就「突突突」地往前窜。
最低可测速度 = 分辨率 / 控制周期
如果这个值大于你的目标低速,那就要换更高分辨率的编码器,或者用观测器做速度估计。
对轨迹跟踪的直接影响:
- 低速抖动: 编码器在低速时「丢步」或「跳变」,导致速度估计不连续,控制器反复调节
- 累积误差: 每个脉冲的量化误差虽然小,但积分后(里程计)会越来越大。跑个几十米,位置误差可能到厘米级
- 方向偏差: 差速驱动的机器人,左右轮编码器误差不同,会导致航向角计算偏差,轨迹越跑越偏
3.2 IMU漂移:时间越长,越不靠谱
IMU这个东西,我个人的态度是:短期看它,长期别看它。
IMU测量的是加速度和角速度。要得到位置和姿态,你得做积分。但积分这东西,误差会随时间累积。加速度计有零偏,陀螺仪有温漂,再加上噪声——积分一次,误差线性增长;积分两次,误差按时间平方增长。
为什么会这样?
假设你的加速度计零偏是0.01 m/s²。这个值很小对吧?但你积分1秒,速度误差是0.01 m/s;积分10秒,速度误差是0.1 m/s;积分100秒,位置误差就是0.5米!
陀螺仪更惨。角速度的零偏哪怕只有0.1°/s,积分10秒,姿态误差就是1°。对于轨迹跟踪来说,1°的航向误差,在10米外就会产生约17cm的横向偏差。
IMU漂移对轨迹跟踪的影响:
- 姿态发散: 航向角漂移导致机器人「以为自己在直行,实际在转弯」
- 位置发散: 加速度二次积分后,位置误差呈抛物线增长,长距离轨迹完全不可用
- 高频噪声: IMU本身的高频噪声会通过控制器传递到执行器,导致轨迹抖动
3.3 视觉SLAM重投影误差:看着准,其实不一定
视觉SLAM这几年很火。但说实话,很多人被它「看起来精确」的定位结果给骗了。
重投影误差,是视觉SLAM里最核心的优化目标。它的意思是:你把3D地图点投影到图像上,和实际观测到的像素位置之间的差值。这个差值越小,说明你的位姿估计越准。
但问题在于——重投影误差小,不代表你的轨迹就准。
我遇到过的一个坑:
有一次做视觉导航的AGV,在实验室里跑,重投影误差只有0.3个像素,看起来完美。但一拉到工厂现场,地面反光、光照变化、纹理稀疏,重投影误差直接飙到2个像素以上。轨迹跟踪开始出现「跳变」——机器人突然觉得自己往前窜了10cm,然后控制器猛打方向,整个车就开始画龙。
视觉SLAM误差的典型来源:
- 特征点匹配错误: 光照变化、运动模糊导致匹配错误,位姿估计出现野值
- 尺度不确定性: 单目SLAM没有尺度信息,轨迹的绝对大小是未知的
- 累积漂移: 即使每次的位姿估计误差很小,但长时间运行后,轨迹会整体漂移
- 动态物体干扰: 行人、车辆等移动物体会被当成静态特征,导致定位错误
3.4 多传感器融合中的误差传递:一个传感器犯错,全家遭殃
好了,单个传感器的误差我们聊完了。现在说说更头疼的问题——当你把多个传感器融合在一起时,误差是怎么「传染」的。
我画了一张图,帮你理解这个误差传递的过程:
从这张图你可以看到,每个传感器都有自己的「性格缺陷」。编码器是离散的,IMU是发散的,视觉是跳变的。把它们扔进融合滤波器,误差会通过协方差矩阵互相传递。
误差传递的几个典型场景:
- 场景一:编码器+IMU融合
编码器提供短期准确的位置增量,IMU提供高频姿态。但编码器的量化误差会通过观测更新影响IMU的零偏估计。如果编码器在低速时「丢步」,滤波器会误以为IMU的零偏变了,然后去调整IMU的偏置——结果就是IMU的零偏估计被带偏。 - 场景二:视觉+IMU融合(VIO)
视觉提供绝对位姿约束,IMU提供帧间运动。但视觉的重投影误差如果突然变大(比如遇到纹理稀疏区域),滤波器会倾向于相信IMU的预测。而IMU的预测本身就在漂移——于是轨迹开始慢慢偏离。 - 场景三:编码器+视觉+IMU全融合
这是最复杂的。三个传感器的误差特性完全不同,频率也不同。编码器100Hz,IMU 200Hz,视觉30Hz。融合时如果时间戳对不齐,或者协方差矩阵设置不合理,误差会互相放大。
- 先搞清楚每个传感器的误差特性(是白噪声?有色噪声?有界?无界?)
- 根据误差特性设计融合策略(比如IMU只用于短时积分,视觉用于长时修正)
- 加一个传感器健康监测模块,发现某个传感器误差异常时,自动降低它的权重甚至剔除
3.5 实战建议:怎么减少测量误差对轨迹跟踪的影响
说了这么多问题,总得给点解决方案。我根据自己的经验,整理了几个实用的方法:
| 误差类型 | 影响 | 我的处理方法 |
|---|---|---|
| 编码器量化误差 | 低速抖动、累积误差 | 1. 使用M/T法测速,低速时用T法(测脉冲间隔),高速时用M法(测脉冲数) 2. 加一个速度观测器(比如龙伯格观测器),平滑速度估计 |
| IMU漂移 | 姿态发散、位置发散 | 1. 每次启动时做静态初始化,估计零偏 2. 积分超过一定时间(我一般设30秒)强制用其他传感器重置 3. 使用预积分技术,减少重复积分误差 |
| 视觉重投影误差 | 位姿跳变、尺度漂移 | 1. 加野值检测:如果重投影误差超过2个像素,丢弃该观测 2. 使用滑动窗口优化,限制历史帧数量 3. 在纹理稀疏区域,降低视觉权重,增加IMU/编码器权重 |
| 融合误差传递 | 互相干扰、协方差膨胀 | 1. 使用自适应协方差调节:根据传感器健康度动态调整观测噪声协方差 2. 加一个故障检测模块:如果某个传感器的残差持续偏大,暂时剔除它 |
- 检测传感器数据是否跳变(比如位置突然变了10cm)
- 如果是跳变,用上一时刻的值代替,或者做一阶低通滤波
- 如果连续跳变超过3次,触发传感器故障报警
这个简单的预处理,能避免很多「传感器抽风导致控制器炸掉」的情况。
嗯,关于测量与感知误差,就聊这么多。说白了,传感器没有完美的,我们能做的就是理解它们的「脾气」,然后在融合和控制层面做好应对。下一节我们会聊到执行器误差——电机响应延迟、死区、饱和——这些才是真正让轨迹「跑偏」的元凶。