1. 外参标定基础:坐标系定义、刚体变换、李群与李代数基础
大家好,我是你们的老朋友。今天咱们聊聊外参标定里最基础、也最绕不开的几个概念。说实话,我见过不少工程师,一上来就调算法、跑优化,结果标定结果总是不对。回头一看,坐标系定义就搞混了。嗯,这其实是最容易踩坑的地方。
1.1 坐标系定义——别小看这个“原点”
做外参标定,说白了就是求两个坐标系之间的变换关系。那坐标系到底怎么定义?我个人习惯,先搞清楚三个东西:原点、轴方向、单位长度。
在SLAM和计算机视觉里,最常见的坐标系有这么几种:
- 世界坐标系:固定在地面上的参考系。通常用W表示。原点可以选在机器人起始位置,或者某个标志物上。
- 相机坐标系:以相机光心为原点。Z轴一般指向相机前方,X轴向右,Y轴向下(注意,这个跟OpenCV的习惯一致)。
- IMU坐标系:以IMU芯片中心为原点。X轴指向右,Y轴指向前,Z轴向上。嗯,不同IMU厂家定义可能不一样,我踩过这个坑。
- 车身/机器人坐标系:以车辆后轴中心或机器人底盘中心为原点。X轴指向前进方向,Y轴向左,Z轴向上。
重要提醒:不同传感器坐标系定义可能不同。比如有的相机用右手系,有的用左手系。标定前一定要确认清楚。我曾经因为没注意IMU的Z轴方向,整整调了两天bug。
1.2 刚体变换——旋转和平移的“组合拳”
两个坐标系之间的关系,可以用刚体变换来描述。刚体变换包含两部分:旋转和平移。说白了,就是把一个点从坐标系A变换到坐标系B。
数学上,刚体变换可以写成:
P_b = R * P_a + t
其中:
- P_a 是点在坐标系A下的坐标
- P_b 是点在坐标系B下的坐标
- R 是3x3的旋转矩阵
- t 是3x1的平移向量
旋转矩阵R有9个参数,但自由度只有3。为什么?因为旋转矩阵是正交矩阵,且行列式为+1。这9个参数之间是有约束的。所以直接用旋转矩阵做优化,其实不太方便。
我的经验:在实际标定中,我很少直接用旋转矩阵做优化变量。因为约束太难处理了。我更喜欢用四元数或者李代数来表示旋转。后面会详细讲。
1.3 李群与李代数——为什么需要它们?
你可能会问:旋转矩阵不是挺好的吗?为什么还要搞什么李群李代数?
原因很简单:旋转矩阵是流形上的点,不是欧氏空间里的点。你想想看,如果你直接对旋转矩阵做加法,结果很可能不再是旋转矩阵。这就导致优化变得很麻烦。
李群和李代数,说白了就是给旋转和刚体变换找了一个“好用的表示方式”。
1.3.1 李群 SO(3) 和 SE(3)
- SO(3):特殊正交群,就是所有3x3旋转矩阵的集合。满足 R^T R = I, det(R) = 1。
- SE(3):特殊欧氏群,就是所有刚体变换矩阵的集合。形式是4x4矩阵,左上角是旋转矩阵,右上角是平移向量,最后一行是[0,0,0,1]。
1.3.2 李代数 so(3) 和 se(3)
李代数对应的是李群在单位元处的切空间。so(3)对应旋转矩阵的导数,是3x3的反对称矩阵。se(3)对应刚体变换的导数,是4x4的矩阵。
为什么李代数好用?因为李代数是在向量空间里的。你可以直接做加法、做线性组合,然后通过指数映射回到李群上。这就让优化变得简单了。
核心公式:
- 指数映射:exp(so(3)) → SO(3)
- 对数映射:log(SO(3)) → so(3)
这两个映射,就是李群和李代数之间的桥梁。
1.4 知识体系结构图
下面这张图,是我自己总结的外参标定基础的知识结构。你看一眼,就能明白这些概念之间的关系。
1.5 实际应用中的注意事项
讲完了理论,咱们聊聊实际中怎么用。我在做外参标定时,一般遵循这几个步骤:
- 明确坐标系定义:先搞清楚每个传感器的坐标系是怎么定义的。特别是IMU,不同厂家的定义可能不一样。
- 选择旋转表示方式:我建议用四元数或者李代数。旋转矩阵虽然直观,但优化起来太麻烦。
- 构建优化问题:通常是最小化重投影误差。把外参作为优化变量,用李代数表示,然后做非线性优化。
- 验证结果:标定完一定要验证。我习惯用一组独立的数据做验证,看看重投影误差是不是足够小。
避坑指南:我曾经在标定相机和激光雷达时,发现重投影误差一直降不下去。查了两天,最后发现是激光雷达的坐标系定义跟我想的不一样。从那以后,我每次标定前都会先打印出每个传感器的坐标系定义,贴在墙上。
1.6 小结
好了,这一章的内容就到这里。咱们把坐标系定义、刚体变换、李群和李代数的基础都过了一遍。这些概念虽然基础,但真的很重要。你想想看,如果坐标系定义都搞错了,后面再怎么优化也是白搭。
下一章,咱们会深入讲外参标定的具体方法,包括基于标定板的、基于自然特征的、还有在线标定等等。到时候会用到今天讲的基础知识。
我的建议:如果你刚开始接触外参标定,不妨先花点时间把坐标系定义和李代数搞明白。磨刀不误砍柴工,基础打牢了,后面学起来会快很多。