第三章 标定基础数学:最小二乘法原理、线性回归、矩阵运算在标定中的应用

各位工程师朋友,大家好。欢迎来到《传感器标定:提升感知精度实战课程》的第三讲。

说实话,很多做感知的工程师,一听到「数学」两个字就头疼。我当年刚入行时也一样,觉得搞算法就是调参、跑模型,数学差不多就行了。直到有一次,我在做激光雷达和相机的联合标定时,发现怎么调都调不准,误差始终下不去。后来一位老前辈点醒我:「你连最小二乘法的矩阵形式都没搞明白,怎么可能标定好?」

嗯,从那以后,我老老实实把这块补上了。今天我就把这几样「吃饭的家伙」——最小二乘法、线性回归、矩阵运算,用实战的视角给你讲透。

3.1 最小二乘法:标定中最朴素的「找规律」工具

最小二乘法,说白了就是「找一条线,让所有点到这条线的距离平方和最小」。你想想看,标定本质上是什么?就是找传感器输出和真实物理量之间的映射关系。这个映射关系,往往就是一条线、一个平面,或者一个高维曲面。

我习惯把最小二乘法理解成「误差的平方和最小化」。为什么用平方?因为平方能放大大误差,让优化器更关注那些偏离大的点。这在传感器标定中特别重要——一个离群点可能意味着传感器坏了或者测量环境有问题。

核心思想:

  • 给定一组观测数据 (x_i, y_i)
  • 假设模型为 y = ax + b
  • 目标是找到 a, b,使得 Σ(y_i - (ax_i + b))² 最小

我在项目中遇到过一种情况:用最小二乘法拟合IMU的零偏时,如果直接对所有数据做拟合,结果会被噪声带偏。后来我加了鲁棒性处理——先剔除残差超过3倍标准差的点,再拟合一次。效果立竿见影。

3.2 线性回归:从「画线」到「标定」的桥梁

线性回归是最小二乘法最经典的应用。在传感器标定里,我们经常遇到这样的场景:

  • 温度传感器输出和实际温度的关系
  • 压力传感器电压值和压力值的关系
  • 加速度计输出和真实加速度的关系

这些关系,绝大多数情况下是线性的,或者可以近似为线性。线性回归就是帮我们找到那条「最佳拟合线」。

举个例子,我做过一个温度传感器的标定:

# 采集数据:传感器输出值 vs 实际温度
sensor_output = [1.02, 2.05, 3.01, 4.03, 5.00]  # 单位:V
actual_temp   = [20.1, 40.0, 60.2, 80.1, 100.0]  # 单位:°C

# 用最小二乘法拟合 y = ax + b
# 计算过程(手动版)
n = len(sensor_output)
sum_x = sum(sensor_output)
sum_y = sum(actual_temp)
sum_xy = sum(x*y for x,y in zip(sensor_output, actual_temp))
sum_xx = sum(x*x for x in sensor_output)

a = (n*sum_xy - sum_x*sum_y) / (n*sum_xx - sum_x*sum_x)
b = (sum_y - a*sum_x) / n

print(f"标定结果:温度 = {a:.2f} * 电压 + {b:.2f}")
# 输出:温度 = 19.98 * 电压 + 0.12

实战小技巧:标定数据采集时,尽量覆盖整个量程范围。我曾经偷懒只采了中间段的数据,结果在量程两端误差直接飙到5%以上。记住:回归模型只在训练数据范围内可靠。

3.3 矩阵运算:让标定从「手工」走向「自动化」

当标定参数多了,比如相机内参有4个、外参有6个,甚至更多,手工解方程就不现实了。这时候矩阵运算就派上用场了。

我习惯把矩阵运算看作「批量处理」的工具。一个线性方程组,写成矩阵形式就是:

Ax = b

其中A是设计矩阵,x是待求参数,b是观测值。最小二乘解就是:

x = (AᵀA)⁻¹Aᵀb

这个公式,我建议你背下来。在标定代码里,你几乎天天见到它。

下面我用一个多传感器标定的例子来说明:

import numpy as np

# 假设我们有3个传感器,每个传感器输出和真实值的关系是线性的
# 但每个传感器的增益和偏置都不同
# 我们采集了4组数据

# 设计矩阵 A:每行对应一组观测,每列对应一个参数
# 参数顺序:[增益1, 偏置1, 增益2, 偏置2, 增益3, 偏置3]
A = np.array([
    [1.0, 1.0, 0.0, 0.0, 0.0, 0.0],  # 传感器1输出1.0
    [0.0, 0.0, 2.0, 1.0, 0.0, 0.0],  # 传感器2输出2.0
    [0.0, 0.0, 0.0, 0.0, 3.0, 1.0],  # 传感器3输出3.0
    [1.5, 1.0, 2.5, 1.0, 3.5, 1.0],  # 同时观测三个传感器
])

# 观测值 b:真实物理量
b = np.array([20.5, 41.2, 60.8, 82.3])

# 最小二乘求解
x = np.linalg.inv(A.T @ A) @ A.T @ b
print("标定参数:", x)

注意:矩阵求逆 (AᵀA)⁻¹ 要求AᵀA是满秩的。如果数据采集不够充分,或者传感器之间有耦合,矩阵可能奇异。我曾经在标定一个6轴IMU时,因为采集的位姿不够多样,导致矩阵条件数过大,解出来的参数完全不可用。后来我增加了随机姿态的采集,问题才解决。

3.4 知识体系总览

为了让你更直观地理解这三者之间的关系,我画了一张图:

标定基础数学知识体系 最小二乘法 误差平方和最小化 线性回归 y = ax + b 参数估计 矩阵运算 Ax = b 批量求解 传感器标定实战应用 单变量拟合 多变量求解 共同支撑

这张图想表达的是:最小二乘法是「思想」,线性回归是「方法」,矩阵运算是「工具」。三者层层递进,缺一不可。

3.5 实战中的避坑指南

最后,我分享几个实战中容易踩的坑:

  • 数据归一化:当不同传感器的量纲差异很大时(比如一个测毫米,一个测公里),矩阵的条件数会变得很差。我习惯先对数据做归一化处理。
  • 过拟合检测:标定参数不是越多越好。我曾经给一个简单的温度传感器加了5阶多项式,结果在测试集上误差反而更大。记住奥卡姆剃刀——如无必要,勿增实体。
  • 残差分析:标定完成后,一定要画残差图。如果残差有明显的模式(比如周期性),说明模型结构有问题,不是简单的线性关系。

一句话总结:最小二乘法是标定的「魂」,线性回归是「形」,矩阵运算是「器」。把这三样东西吃透了,传感器标定对你来说就是「套公式」的事。

好了,这一讲就到这里。数学这东西,光看不行,得动手算。建议你找一组自己的传感器数据,用今天讲的方法跑一遍,感受会完全不一样。

可可精品资料库