机器人传感器模拟器:标定与传感器融合
在一个结果完全可复现的交互式机器人传感器模拟器里,逐项探索噪声、偏置、漂移、量化、数据丢失、滤波与传感器融合。
- 类别
- 传感器
- 时长
- 60–150 分钟
- 平台
- 浏览器 · 单片机
01 / 从这里开始
简介
机器人依据的测量值总是带有延迟、偏置和噪声,而且并不完整。这个项目把这些局限变得看得见。比较真值、原始采样和滤波后的估计值;改变采样条件;了解标定如何影响下游的控制——同时不要把一个教学模型误当成某个具体的传感器。
Live lab / Deterministic measurement model
Robot sensor simulator
Compare a known signal with noisy absolute readings and a filtered estimate. Change one error source at a time to see what calibration can—and cannot—fix.
The main plot compares solid truth, individual absolute-sensor samples, and the thicker dashed estimate. The lower band shows signed estimation error around zero; gaps mark dropped absolute samples.
- Truth
- —
- Absolute
- —
- Estimate
- —
- Error
- —
- RMSE
- —
- Dropped
- 0
Keyboard: focus the plot, then use Space to run/pause, N to step, R to reset, and F for full screen.
控件
先选择一个平滑或阶跃的真值信号,然后调整采样率、量化、随机噪声、漂移、偏置、丢包和滤波记忆。可以把原始数据与滑动平均、低通、中值和互补估计放在一起比较。预设让有噪声、有偏置和不可靠的传感器行为变得可重复。
原理
每个传感器都有量程、分辨率、精度、带宽、延迟和失效行为。数据手册上的精度只描述了系统的一部分;安装方式、温度、电源噪声、电磁干扰和表面属性往往才主导真实结果。
当各个传感器提供互补的信息、并且它们的不确定性被诚实地表示出来时,融合才有效。把两次带偏置的测量结合起来,并不会自动产生真值。先从标定、时间戳、坐标系和数据质量检查做起。
算法
- 在采集边界处为每个样本打时间戳并做范围检查。
- 用标定的比例系数、偏移和轴对齐把原始单位换算出来。
- 剔除不可能的跳变,或把它们标记为无效,而不是凭空编造数据。
- 施加满足下游噪声要求的最轻的一级滤波。
- 把测量值变换到一个共同的坐标系中,并按已知的不确定性做融合。
- 记录原始值和处理后的值,让故障仍可复现。
源代码
当时间常数是被有意挑选的时候,指数低通滤波很有用:
class LowPass:
def __init__(self, alpha):
self.alpha = alpha
self.value = None
def update(self, sample):
if self.value is None:
self.value = sample
else:
self.value += self.alpha * (sample - self.value)
return self.value
把原始样本和滤波结果并排记录下来。否则一条看着漂亮的曲线可能掩盖了截断、丢包和标定错误。
假设与硬件差异
这个实验台是一个教学用的信号模型,而不是某一份具体的传感器数据手册。噪声是用一个由你控制的旋钮设定的种子化高斯或均匀分布;而真实的 IMU 或 ToF 传感器还会带来随温度变化的偏置、非高斯尖峰和总线时序抖动,这些都被这个模型简化了。这里的采样是完美周期的,但在单片机上,回路时序和中断延迟让时间戳变得不可或缺——这也正是控件里的每种处理模式都把真值、原始采样和估计值放在一起比较的原因。滤波在图上看着很吸引人,可每一种更平滑的滤波都会增加滞后,而它日后会以控制延迟的形式出现在硬件上;同一笔交易在传感器噪声教程里也有讨论。
电路图
接上多个传感器之前,先确认总线电压、上拉要求、地址和最大线缆长度。
引导实验
这个实验台里的每一个旋钮,都是为了让你刻意造出某一种传感器故障, 再看看哪个工具能修好它。亲手做一遍,抵得上读很多东西。
1. 证明滤波修不好偏置
把噪声设为零,把偏置设成一个明显的偏移。然后依次试用每一种滤波——滑动平均、 低通、中值。它们没有一个会把估计值往真值方向拉,因为这三种滤波 都在衰减变化,而偏置本身并不变化。
然后把偏置设为零、噪声调高,看着同样的滤波工作得很好。这是传感器工作中 最有用的一个区分:噪声、偏置和漂移在图上看起来很像,却需要三种不同的修法, 而再多滤波也永远治不好偏置。
2. 看均值如何抹平一个中值会拒掉的尖峰
打开丢包或尖峰,把滑动平均和同样窗口长度的中值放在一起比较。
| 滤波 | 一个离群值会造成什么 |
|---|---|
| 5 点滑动平均 | 让估计值在连续五个样本上发生偏移 |
| 5 点中值 | 完全没有贡献 |
超声波和飞行时间传感器的噪声不是高斯的——它是在一个本来稳定的信号上 偶尔出现的反常数值。而这恰恰是平均值处理得最差的情形。
3. 量化滞后要付出多少代价
切换到阶跃真值信号,把滤波的 alpha 调小(或者把窗口加长)。估计值
变得更平滑,到达也更晚。在每个设置下从图上读出延迟:
| 滤波设置 | 典型滞后 | 在 0.3 m/s 下相当于 |
|---|---|---|
| 3 点中值 | 约 1 个样本 | 3 mm |
| 10 点滑动平均 | 约 4.5 个样本 | 14 mm |
| 低通,α = 0.1 | 约 9 个样本 | 27 mm |
| 低通,α = 0.02 | 约 49 个样本 | 147 mm |
最后一行会给出一条非常平滑的曲线,同时让机器人按照 15 厘米前障碍物的位置来转向。 一定要用机器人真正在意的单位去检查滞后,而不是用样本数——这是一个 出于好心的滤波反而把机器人弄坏的最常见方式。
4. 看清融合能做什么、不能做什么
把一个源设成有噪声但无偏置,另一个设成平滑但在漂移,观察互补估计 如何取走两者各自好的那一半。然后给两个源加上相同的偏置, 看着融合后的估计原样继承了它。
融合利用的是彼此独立的误差。共模误差会原封不动地存活下来, 这就是为什么标定要放在融合之前,而不是之后。
你应该观察到什么
| 配置 | 原始数据 | 最合适的滤波 | 原因 |
|---|---|---|---|
| 高斯噪声,无偏置 | 对称地散布 | 滑动平均或低通 | 噪声平均后趋向真值 |
| 偶发尖峰 | 大体正常,偶有反常数值 | 中值 | 直接把离群值拒掉 |
| 恒定偏移 | 紧密但错误 | 没有——去标定 | 滤波看不见这个偏移 |
| 缓慢漂移 | 起点正确,越走越远 | 没有——重新标定或做融合 | 需要一个绝对参考 |
| 丢包 | 缺口 | 中值,外加保持上一次有效值 | 编造一个值比标一个缺口更糟 |
| 量化 | 落在离散的台阶上 | 没有——这就是你的分辨率 | 在台阶之间滤波只增加滞后,不增加信息 |
硬件落地
| 这个实验台 | 真实传感器 |
|---|---|
| 采样是完美周期的 | 回路时序和中断延迟让时间戳变得不可或缺 |
| 噪声是种子化的高斯或均匀分布 | 非高斯尖峰,以及随温度变化的偏置 |
| 有真值可供对比 | 你没有真值——这正是你要对着已知输入做标定的原因 |
| 丢包是明确标出的 | 一次丢包可能看起来像一个合理的数值 |
| 一次只用一个传感器 | 多条总线、多种速率,以及它们之间的对齐问题 |
对真实传感器而言,实用的流程很短:把它静止地贴在一个已知输入上,记录几千个 带时间戳的样本,并且把时间序列和一张直方图都画出来。直方图是人们 会跳过的那一部分,却也是信息量最大的——高斯噪声会画出一个钟形, 离群值会让钟形在尾部多出几个远处的点,而这两者需要不同的滤波器。 完整方法见传感器噪声、偏置与滤波。
硬件清单
元器件
- 单片机或单板计算机
- 一个或多个数字或模拟传感器
- 已知的标定基准
- 稳定的稳压电源和正确的逻辑电平
- 用于可重复实验的日志记录连接
探索关联图谱
哪里用到这个模拟器
以这个实验台为基础的项目、学习路线和教程。
继续搭建
下载资源
完成项目时可以参考本页上的这些资料。可下载的项目包只会在其源文件和版本发布之后才会添加。
常见问题
常见问题解答
信号越平滑就一定越好吗?
不是。强滤波可能会去掉有用的运动信息,并引入延迟。选择滤波器时,要依据噪声的频谱、所需的响应时间,以及要用这项测量值去做的决策。
偏置和噪声有什么区别?
偏置是相对真值的一个可重复的偏移,而噪声在样本之间变化。标定可以估计出偏置;取平均或滤波也许能减小随机噪声,却无法可靠地消除未知的偏置。
什么是传感器漂移,它和偏置有什么不同?
偏置是一个固定的偏移,测量一次就可以减掉。漂移则是这个偏移随时间缓慢变化,通常与温度或元件老化有关,所以开机时做的标定会逐渐与实际不再相符。正因为有漂移,长时间运行才需要定期重新标定,或者需要一个可供估计器据以修正的参考。
应该用哪种滤波:滑动平均、低通还是中值?
滑动平均和指数低通都能平滑高斯类噪声,它们通过窗口长度或时间常数,在响应速度和平滑程度之间做取舍。中值滤波更擅长去除偶发的尖峰和丢包,因为少数几个坏样本不会移动中间值。选择能满足下游要求的最轻的滤波,而不是看起来最平滑的那一种。
滤波会增加多少延迟?
每一种平滑滤波都会滞后于真实信号,平滑得越多,滞后就越大:时间常数长的低通滤波能抑制更多噪声,但在快速变化面前会落后得更多。一定要把滤波后的估计值与原始采样和真值画在一起,让滞后在你把它用进控制回路之前就清晰可见。
什么是传感器融合,它什么时候才真正有用?
融合把多个传感器合并成一个估计,只有当这些传感器提供互补的信息、并且它们的不确定性被诚实地表示出来时,它才有用。把两次带偏置的测量结合起来,并不会产生真值。例如,互补滤波在高频段信任一个传感器、在低频段信任另一个;在做融合之前,先把标定、时间戳和坐标系处理好。
为什么每个样本都应该打时间戳?
样本很少以完全固定的间隔到达,而融合和滤波都假定你知道每个值是在何时测得的。时间戳让你能够发现抖动、对齐来自不同传感器的数据,并剔除过期的读数。把原始值和处理后的值并排记录下来,能让截断、丢包和标定错误这类故障保持可复现。
延伸阅读
参考资料
权威资料,帮助你越过本模拟器有限的教学模型,进一步深入学习。