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 的零偏直接翻了一倍。你想想,如果不做温度补偿,数据根本没法用。

小技巧: 很多 IMU 芯片内部自带温度传感器。你可以利用它做温度补偿。我习惯在标定流程里加一个「温箱测试」环节,把 -20°C 到 60°C 的零偏曲线都跑一遍。

1.3.3 安装误差

传感器装在 PCB 上,PCB 装在机器人上。每个环节都有角度偏差。你以为是水平的,其实歪了 0.5 度。这在视觉惯性里程计(VIO)里是致命的。

1.3.4 噪声

噪声是随机的,没法完全消除。但我们可以通过滤波和多次采样来降低它的影响。标定的时候,我一般会采集 1000 个样本取平均,把噪声的影响降到最低。

1.4 标定的知识体系

说了这么多,咱们用一张图来总结一下标定的核心逻辑。

传感器标定知识体系 为什么需要标定? 核心概念 零偏(Bias) 尺度因子(Scale Factor) 交叉耦合(Cross-axis) 误差来源 制造误差 温度漂移 安装误差 噪声 标定方法 六面静态法 旋转法 温箱补偿法 目标:让传感器输出更接近真实值

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 个不同姿态下的测量数据。这就是为什么标定时要转来转去。

注意: 千万别以为标定是一次性的。传感器会老化,温度会变化,安装位置可能松动。我建议每隔 3-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 不是对角阵,还有交叉耦合项。那就需要用最小二乘法来解了。这个我们后面章节会详细讲。

我的经验: 标定参数不要直接写死在代码里。我习惯把它们存在 EEPROM 或者配置文件中。这样换传感器或者重新标定时,改个文件就行,不用重新编译固件。

好了,这一章咱们把标定的「为什么」和「是什么」讲清楚了。下一章,我会带大家手把手做一次 IMU 的六面静态标定,把理论变成代码。

可可精品资料库