3. 外参标定问题建模:最小二乘问题、目标函数构建、优化变量
好,咱们进入正题。
外参标定,说白了就是解一个数学问题。你拿着传感器数据,知道它们之间应该有什么关系,但实际测出来总有偏差。怎么办?把它变成一个优化问题,让计算机自己去算。
我个人习惯,先把问题拆成三块:目标函数、优化变量、求解方法。今天咱们重点聊前两块,顺带说说最小二乘这个老朋友。
3.1 为什么是最小二乘?
你想想看,传感器测量总有噪声。你测100次,每次结果都不一样。如果硬要找一个完美的解,让所有方程都精确成立,那基本不可能。
所以,我们换个思路:找一个解,让所有误差的平方和最小。这就是最小二乘的核心思想。
我在项目中遇到过一位同事,非要用解线性方程组的方法硬算,结果噪声一上来,解出来的外参完全不能用。后来换成最小二乘,效果立竿见影。为什么?因为最小二乘天然对噪声有抑制作用——平方项让大误差被放大,优化器会优先去压平那些离谱的偏差。
min ∑ || r_i(x) ||²
其中 r_i(x) 是第 i 个观测的残差,x 是待优化的外参。
3.2 目标函数怎么构建?
目标函数,就是你要最小化的那个东西。它由一堆残差项组成。每个残差项,代表一个测量约束的违反程度。
3.2.1 点云匹配残差
这是最常用的。比如激光雷达和相机标定,你找一个标定板,激光扫出点云,相机拍出图像。理论上,点云上的点投影到图像上,应该落在对应的像素位置。
残差就是:投影点位置 - 实际观测到的像素位置。
3.2.2 重投影误差
这个在视觉-惯性标定里很常见。你把3D点投影到图像上,和实际检测到的特征点位置做差。
公式长这样:
e = p_observed - project(T * P_3D)
其中 T 是外参矩阵,P_3D 是3D点坐标,project 是相机投影函数。
3.2.3 相对位姿约束
有时候你不需要绝对位置,只需要两个传感器之间的相对关系。比如IMU和相机,你通过积分IMU数据得到一段运动,相机通过视觉里程计也得到一段运动。这两段运动之间的差异,就是残差。
| 残差类型 | 适用场景 | 典型传感器对 |
|---|---|---|
| 点云匹配残差 | 有共同观测目标 | 激光雷达-相机 |
| 重投影误差 | 有3D-2D对应关系 | 相机-IMU |
| 相对位姿约束 | 有运动轨迹 | IMU-轮速计 |
3.3 优化变量是什么?
优化变量,就是你要调整的那些参数。外参标定里,通常包括:
- 旋转矩阵 R:3个自由度(比如欧拉角或四元数)
- 平移向量 t:3个自由度(x, y, z)
- 时间偏移 Δt:1个自由度(传感器时间戳不同步的问题)
一共7个自由度。但注意,旋转矩阵如果用欧拉角表示,会有万向锁问题。我建议用四元数,虽然多了一个维度(4个参数),但避免了奇异性。
3.4 知识体系结构图
下面这张图,把整个建模过程串起来了。你看一眼,心里就有数了。
3.5 实际建模中的几个坑
嗯,这里要注意几个容易翻车的地方。
- 参数化选择:旋转矩阵用四元数还是李代数?我建议用李代数,因为它在优化时没有约束,梯度计算也方便。四元数虽然直观,但需要归一化约束,处理起来麻烦一点。
- 权重设置:不同残差项的尺度可能差很多。比如点云残差是米级,重投影残差是像素级。如果不加权重,优化器会优先压平数值大的项。我一般先做一次预标定,统计各残差的方差,然后用逆方差作为权重。
- 初始化:最小二乘是局部优化,初始值不好会掉进局部最优。我的习惯是先用闭式解法(比如P3P)算一个粗略值,再扔给优化器精调。
好了,建模这块就聊到这儿。你只要记住:目标函数是你要优化的东西,优化变量是你能调的东西,最小二乘是帮你找到最优解的工具。这三者搞清楚了,外参标定就成功了一半。