3、测量与感知误差:编码器分辨率限制、IMU漂移、视觉SLAM重投影误差

做轨迹跟踪这些年,我踩过最多的坑,其实不是控制算法本身,而是「传感器告诉我的位置是错的」。

你想想看,你写了个完美的PID,仿真跑得飞起,一上真机就抖成筛子。为什么?因为反馈信号本身就是有问题的。这一章,我们就来聊聊测量与感知误差——它们是怎么来的,怎么影响轨迹,以及多传感器融合时误差是怎么「传染」的。

核心观点: 控制算法的上限,由传感器精度决定。你永远无法控制一个你「看不清」的系统。

3.1 编码器分辨率限制:你以为是连续,其实是离散

编码器这东西,说白了就是个「数格子的」。不管是光电编码器还是磁编码器,它输出的都是脉冲数。你每转一圈,它给你N个脉冲。

那问题来了——如果你的轮子只转了半个脉冲的距离,编码器告诉你「没动」。这就是分辨率限制。

我遇到过的一个真实案例:

有一次做AGV的轨迹跟踪,用的是500线的编码器,轮子直径100mm。算下来每个脉冲对应的位移大约是0.628mm。听起来挺精细的对吧?但问题是,AGV在低速运行时,控制器每10ms读取一次编码器。如果速度低于0.0628m/s,编码器可能连续好几个周期都读不到脉冲变化。

结果就是:控制器以为车没动,于是加大输出。等编码器突然跳了一个脉冲,位置误差瞬间被放大,车就「突突突」地往前窜。

我的经验: 编码器分辨率的选择,不能只看「精度够不够」,还要看你的控制周期和最低运行速度。公式很简单:
最低可测速度 = 分辨率 / 控制周期
如果这个值大于你的目标低速,那就要换更高分辨率的编码器,或者用观测器做速度估计。

对轨迹跟踪的直接影响:

  • 低速抖动: 编码器在低速时「丢步」或「跳变」,导致速度估计不连续,控制器反复调节
  • 累积误差: 每个脉冲的量化误差虽然小,但积分后(里程计)会越来越大。跑个几十米,位置误差可能到厘米级
  • 方向偏差: 差速驱动的机器人,左右轮编码器误差不同,会导致航向角计算偏差,轨迹越跑越偏
注意: 不要以为用高分辨率编码器就万事大吉。分辨率太高,脉冲频率也高,如果你的MCU中断处理不过来,反而会丢脉冲。我见过有人用4096线的编码器,结果电机一转快,单片机直接死机——中断太频繁了。

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做航位推算。跑了大概3分钟,位置误差就超过了2米。后来我加了个规则:IMU积分超过30秒,必须用其他传感器(比如UWB或视觉)做一次重置。

IMU漂移对轨迹跟踪的影响:

  • 姿态发散: 航向角漂移导致机器人「以为自己在直行,实际在转弯」
  • 位置发散: 加速度二次积分后,位置误差呈抛物线增长,长距离轨迹完全不可用
  • 高频噪声: IMU本身的高频噪声会通过控制器传递到执行器,导致轨迹抖动
我的做法: 在轨迹跟踪中,IMU主要用于短时间内的姿态估计和加速度前馈。位置信息?我基本不用纯IMU积分的结果。要么融合视觉,要么融合轮式里程计。

3.3 视觉SLAM重投影误差:看着准,其实不一定

视觉SLAM这几年很火。但说实话,很多人被它「看起来精确」的定位结果给骗了。

重投影误差,是视觉SLAM里最核心的优化目标。它的意思是:你把3D地图点投影到图像上,和实际观测到的像素位置之间的差值。这个差值越小,说明你的位姿估计越准。

但问题在于——重投影误差小,不代表你的轨迹就准。

我遇到过的一个坑:

有一次做视觉导航的AGV,在实验室里跑,重投影误差只有0.3个像素,看起来完美。但一拉到工厂现场,地面反光、光照变化、纹理稀疏,重投影误差直接飙到2个像素以上。轨迹跟踪开始出现「跳变」——机器人突然觉得自己往前窜了10cm,然后控制器猛打方向,整个车就开始画龙。

视觉SLAM误差的典型来源:

  • 特征点匹配错误: 光照变化、运动模糊导致匹配错误,位姿估计出现野值
  • 尺度不确定性: 单目SLAM没有尺度信息,轨迹的绝对大小是未知的
  • 累积漂移: 即使每次的位姿估计误差很小,但长时间运行后,轨迹会整体漂移
  • 动态物体干扰: 行人、车辆等移动物体会被当成静态特征,导致定位错误
重要提醒: 视觉SLAM的误差不是高斯白噪声,它是有色噪声,而且经常出现「突跳」。如果你用标准的卡尔曼滤波去融合,遇到野值会直接炸掉。我建议用鲁棒卡尔曼滤波或者加一个野值检测模块。

3.4 多传感器融合中的误差传递:一个传感器犯错,全家遭殃

好了,单个传感器的误差我们聊完了。现在说说更头疼的问题——当你把多个传感器融合在一起时,误差是怎么「传染」的。

我画了一张图,帮你理解这个误差传递的过程:

多传感器融合中的误差传递路径 编码器 分辨率限制 → 量化误差 IMU 零偏/温漂 → 积分发散 视觉SLAM 重投影误差 → 位姿跳变 多传感器融合(EKF/UKF/图优化) 误差协方差矩阵传递与更新 融合后的位姿估计 包含所有传感器的误差特性 误差传递路径 编码器量化误差 → IMU漂移 → 视觉跳变 → 融合后位姿偏差 误差放大效应 传感器A的误差 + 传感器B的误差 ≠ 简单相加

从这张图你可以看到,每个传感器都有自己的「性格缺陷」。编码器是离散的,IMU是发散的,视觉是跳变的。把它们扔进融合滤波器,误差会通过协方差矩阵互相传递。

误差传递的几个典型场景:

  • 场景一:编码器+IMU融合
    编码器提供短期准确的位置增量,IMU提供高频姿态。但编码器的量化误差会通过观测更新影响IMU的零偏估计。如果编码器在低速时「丢步」,滤波器会误以为IMU的零偏变了,然后去调整IMU的偏置——结果就是IMU的零偏估计被带偏。
  • 场景二:视觉+IMU融合(VIO)
    视觉提供绝对位姿约束,IMU提供帧间运动。但视觉的重投影误差如果突然变大(比如遇到纹理稀疏区域),滤波器会倾向于相信IMU的预测。而IMU的预测本身就在漂移——于是轨迹开始慢慢偏离。
  • 场景三:编码器+视觉+IMU全融合
    这是最复杂的。三个传感器的误差特性完全不同,频率也不同。编码器100Hz,IMU 200Hz,视觉30Hz。融合时如果时间戳对不齐,或者协方差矩阵设置不合理,误差会互相放大。
我的经验总结: 多传感器融合不是「越多越好」。每加一个传感器,就多一个误差源。我见过有人把6个传感器融合在一起,结果任何一个传感器出问题,整个系统就崩了。我的建议是:
  1. 先搞清楚每个传感器的误差特性(是白噪声?有色噪声?有界?无界?)
  2. 根据误差特性设计融合策略(比如IMU只用于短时积分,视觉用于长时修正)
  3. 加一个传感器健康监测模块,发现某个传感器误差异常时,自动降低它的权重甚至剔除

3.5 实战建议:怎么减少测量误差对轨迹跟踪的影响

说了这么多问题,总得给点解决方案。我根据自己的经验,整理了几个实用的方法:

误差类型 影响 我的处理方法
编码器量化误差 低速抖动、累积误差 1. 使用M/T法测速,低速时用T法(测脉冲间隔),高速时用M法(测脉冲数)
2. 加一个速度观测器(比如龙伯格观测器),平滑速度估计
IMU漂移 姿态发散、位置发散 1. 每次启动时做静态初始化,估计零偏
2. 积分超过一定时间(我一般设30秒)强制用其他传感器重置
3. 使用预积分技术,减少重复积分误差
视觉重投影误差 位姿跳变、尺度漂移 1. 加野值检测:如果重投影误差超过2个像素,丢弃该观测
2. 使用滑动窗口优化,限制历史帧数量
3. 在纹理稀疏区域,降低视觉权重,增加IMU/编码器权重
融合误差传递 互相干扰、协方差膨胀 1. 使用自适应协方差调节:根据传感器健康度动态调整观测噪声协方差
2. 加一个故障检测模块:如果某个传感器的残差持续偏大,暂时剔除它
一个小技巧: 在做轨迹跟踪时,我习惯在控制器前面加一个「误差预处理器」。这个预处理器的作用是:
- 检测传感器数据是否跳变(比如位置突然变了10cm)
- 如果是跳变,用上一时刻的值代替,或者做一阶低通滤波
- 如果连续跳变超过3次,触发传感器故障报警

这个简单的预处理,能避免很多「传感器抽风导致控制器炸掉」的情况。

嗯,关于测量与感知误差,就聊这么多。说白了,传感器没有完美的,我们能做的就是理解它们的「脾气」,然后在融合和控制层面做好应对。下一节我们会聊到执行器误差——电机响应延迟、死区、饱和——这些才是真正让轨迹「跑偏」的元凶。

可可精品资料库