1. 传感器标定基础:为什么需要标定?
大家好,我是你们这门课的老朋友。今天咱们聊聊传感器标定。
说实话,我刚入行那会儿,觉得标定这事儿挺玄乎的。不就是个传感器嘛,插上电就能读数,干嘛还要折腾?直到有一次,我在一个四足机器人项目里,IMU 的数据直接拿来用,结果机器人站起来就倒,跟喝醉了似的。嗯,从那以后,我再也不敢小看标定了。
1.1 为什么需要标定?
你想想看,传感器本质上是个物理器件。它把现实世界的物理量(比如加速度、角速度)转换成电信号,再变成数字。但这个过程不是完美的。
举个例子。你买了个电子秤,放上 1kg 的砝码,它显示 1.02kg。你说这算不算问题?
算,也不算。如果你只是称称体重,差个 2% 无所谓。但如果你在做无人机姿态控制,IMU 的加速度偏差哪怕只有 0.01g,飞控算出来的角度就会漂移,飞机在天上就稳不住。
标定的核心目的就一个:让传感器输出更接近真实值。
我个人习惯把标定比作「给传感器做体检」。体检完了,该吃药吃药,该做手术做手术。最终目的是让传感器「说实话」。
1.2 标定的核心概念
标定听起来高大上,其实核心概念就三个:
- 零偏(Bias):传感器静止时,输出不为零。比如加速度计平放,理论上 Z 轴应该是 1g,但实际可能是 1.02g。多出来的 0.02g 就是零偏。
- 尺度因子(Scale Factor):输入和输出之间的比例关系不准。比如你转 90 度,陀螺仪输出 89 度。少了 1 度,这就是尺度因子误差。
- 交叉耦合(Cross-axis Sensitivity):X 轴的变化,影响了 Y 轴的输出。说白了就是串扰。这在 MEMS 传感器里很常见。
这三个概念,你记住了,标定的大框架就抓住了。
我在项目中遇到过最典型的例子:一个六轴 IMU,静止时 Z 轴加速度显示 1.05g,X 轴和 Y 轴居然还有 0.02g 的读数。这就是零偏加交叉耦合。不标定的话,姿态解算出来的角度直接偏了 2 度。
1.3 误差来源分析
误差从哪来?我总结了几大类:
1.3.1 制造误差
这是天生的。MEMS 工艺再先进,硅片上的微结构也不可能完全对称。每个传感器出厂时,参数都不一样。所以 datasheet 里会写「典型值」和「最大值」,而不是精确值。
1.3.2 温度漂移
这个我吃过亏。有一次在户外做测试,早上 10 度,中午 35 度。IMU 的零偏直接翻了一倍。你想想,如果不做温度补偿,数据根本没法用。
1.3.3 安装误差
传感器装在 PCB 上,PCB 装在机器人上。每个环节都有角度偏差。你以为是水平的,其实歪了 0.5 度。这在视觉惯性里程计(VIO)里是致命的。
1.3.4 噪声
噪声是随机的,没法完全消除。但我们可以通过滤波和多次采样来降低它的影响。标定的时候,我一般会采集 1000 个样本取平均,把噪声的影响降到最低。
1.4 标定的知识体系
说了这么多,咱们用一张图来总结一下标定的核心逻辑。
1.5 标定的数学模型
搞工程的人,光讲概念不行,得上公式。不过别怕,这个公式很简单。
一个传感器的输出模型可以写成:
y = S * (x + b) + n
其中:
- y:传感器实际输出
- x:真实物理量
- S:尺度因子矩阵(包含交叉耦合)
- b:零偏向量
- n:噪声
标定的任务,就是求出 S 和 b,然后反过来补偿:
x_compensated = S^(-1) * (y - b)
说白了,就是解一个线性方程组。对于三轴 IMU,S 是一个 3x3 的矩阵,b 是一个 3x1 的向量。一共 12 个未知数。
怎么解?需要至少 6 个不同姿态下的测量数据。这就是为什么标定时要转来转去。
1.6 一个简单的标定示例
咱们拿加速度计举个例子。假设你有一个三轴加速度计,静止放在桌面上。
理论上,Z 轴应该是 1g,X 和 Y 轴是 0g。但实际读数可能是:
| 轴 | 理论值 (g) | 实测值 (g) | 误差 |
|---|---|---|---|
| X | 0.00 | 0.02 | +0.02 |
| Y | 0.00 | -0.01 | -0.01 |
| Z | 1.00 | 1.05 | +0.05 |
你看,Z 轴偏了 0.05g。如果你不做标定,直接用这个数据算俯仰角,结果会偏大约 3 度。
怎么补偿?很简单:
// 标定参数(示例)
float bias[3] = {0.02, -0.01, 0.05};
float scale[3] = {1.0, 1.0, 0.952}; // 1/1.05 ≈ 0.952
// 补偿
float raw[3] = {0.02, -0.01, 1.05};
float compensated[3];
for (int i = 0; i < 3; i++) {
compensated[i] = (raw[i] - bias[i]) * scale[i];
}
// 结果:compensated = {0.00, 0.00, 1.00}
嗯,就是这么简单。但实际项目中,尺度因子矩阵 S 不是对角阵,还有交叉耦合项。那就需要用最小二乘法来解了。这个我们后面章节会详细讲。
好了,这一章咱们把标定的「为什么」和「是什么」讲清楚了。下一章,我会带大家手把手做一次 IMU 的六面静态标定,把理论变成代码。
可可精品资料库