4. 标定问题建模:外参标定的数学定义、旋转矩阵与平移向量、李群李代数基础
好,咱们进入正题。
前面几章我们把传感器原理、数据同步、时间戳对齐这些「硬骨头」啃了一遍。现在终于到了最核心的部分——标定问题建模。
说白了,标定就是求解一个数学问题。你得知道你要解什么,用什么工具解,解出来长什么样。这一章,我就带你把这些东西彻底理清楚。
4.1 外参标定的数学定义
先问个问题:什么是外参?
外参就是两个传感器坐标系之间的刚体变换。一个旋转,一个平移。就这么简单。
数学上,我们这样定义:
目标:求解从激光雷达坐标系 L 到 IMU 坐标系 I 的变换矩阵 TIL。
使得对于任意空间点 P,有:
PI = RIL · PL + tIL
其中:
- RIL 是 3×3 的旋转矩阵,描述姿态差异
- tIL 是 3×1 的平移向量,描述位置偏移
我在项目里见过不少新手,上来就问「外参是不是就是几个角度?」。嗯,角度只是旋转的一种表示方式。真正干活的时候,我们用的是矩阵。为什么?因为矩阵可以直接做乘法、求逆、插值,角度不行。
我的习惯:在代码里永远用齐次变换矩阵 T (4×4) 来存储外参。旋转矩阵 + 平移向量塞进去,一步到位。别拆开存,容易搞混。
4.2 旋转矩阵:不只是数学符号
旋转矩阵 R 有三个重要性质:
- 正交性:RTR = I,R-1 = RT
- 行列式为 +1:保证是刚体旋转,不是镜像
- 9个元素,3个自由度:所以一定有冗余约束
你想想看,9个数字描述3个角度,这本身就是个「浪费」。但正是这种冗余,让旋转矩阵在数值计算中非常稳定。我踩过坑——用欧拉角做插值,结果出现了万向锁,IMU数据直接飞了。从那以后,我再也不敢在优化过程中直接用欧拉角了。
我曾经踩过的坑:在标定优化时,直接优化旋转矩阵的9个元素。结果矩阵不满足正交性,优化出来的东西根本不能当旋转矩阵用。后来老老实实用了李代数参数化。
4.3 平移向量:简单但容易忽略的细节
平移向量 t 就是三维空间里的位移。看起来简单,对吧?
但这里有个细节:平移向量的单位必须统一。激光雷达给的是米,IMU给的是米每秒平方,那没问题。但如果激光雷达给的是毫米,IMU给的是米……嗯,你懂的。
另外,平移向量的精度直接影响标定结果。我记得有一次,一个同事标定出来的外参旋转部分很准,但平移总是差几厘米。查了半天,发现是IMU的安装位置测量错了。所以,物理测量和数学求解要互相验证。
4.4 李群与李代数:为什么需要它?
好,现在问题来了。
我们要优化外参,也就是要优化 R 和 t。但 R 有正交约束,不能随便加减。你给 R 加一个小量 ΔR,结果可能就不是旋转矩阵了。
怎么办?
答案就是李群和李代数。
简单说:
- 李群 SO(3):旋转矩阵的集合,构成一个群。满足封闭性、结合律、单位元、逆元。
- 李代数 so(3):旋转矩阵的「切空间」,是一个向量空间。没有约束,可以随便加减。
优化的时候,我们在李代数上做增量更新,然后通过指数映射回到李群。这样既保证了旋转矩阵的正交性,又可以用常规的优化算法。
核心公式:
R = exp(φ∧)
其中 φ 是 so(3) 上的三维向量,φ∧ 是它的反对称矩阵。
更新时:R ← R · exp(Δφ∧)
说白了,就是把有约束的优化问题,变成无约束的优化问题。这是现代SLAM和标定系统的基石。
4.5 知识体系总览
为了让你看得更清楚,我画了一张图,把这一章的核心逻辑串起来:
4.6 代码实现:李代数更新示例
光说不练假把式。我给你看一段实际代码,演示怎么用李代数做旋转更新:
#include <Eigen/Core>
#include <Eigen/Geometry>
#include <sophus/so3.hpp>
// 当前外参旋转矩阵
Eigen::Matrix3d R_current;
// 优化得到的增量(李代数 so(3) 上的向量)
Eigen::Vector3d delta_phi;
// 构造李代数增量
Sophus::SO3d delta_SO3 = Sophus::SO3d::exp(delta_phi);
// 更新旋转矩阵
Sophus::SO3d R_new = Sophus::SO3d(R_current) * delta_SO3;
// 提取更新后的旋转矩阵
Eigen::Matrix3d R_updated = R_new.matrix();
你看,代码就这么几行。但背后的数学原理,就是上面讲的那一套。
我的建议:刚开始接触李代数时,别被「群」「代数」这些词吓到。你就记住一句话:李代数就是旋转的「增量」表示,可以随便加减;李群就是旋转的「绝对」表示,有约束。优化时用李代数,更新完再映射回李群。
4.7 本章小结
这一章我们干了三件事:
- 明确了外参标定的数学定义:R 和 t
- 理解了旋转矩阵的性质和约束
- 引入了李群李代数,解决了有约束优化的问题
这些是后面所有标定算法的基础。你如果能把这一章吃透,后面的联合优化、图优化、因子图,理解起来会轻松很多。
嗯,今天就到这里。下一章我们开始讲具体的标定方法——手眼标定和基于运动的标定。到时候我会把实际项目中的坑一个一个给你拆开讲。