1. 外参标定基础:坐标系定义、刚体变换、李群与李代数基础
大家好,我是你们的老朋友。今天咱们开始聊外参标定。说实话,这玩意儿我刚开始接触的时候也觉得头大,一堆坐标系转来转去,稍不留神就搞混了。但后来我发现,只要把几个核心概念吃透,后面就顺了。
外参标定,说白了就是搞清楚两个传感器之间的“相对位置和朝向”。比如你的相机和激光雷达装在一起,它们各自看到的世界,怎么才能对齐?这就是外参要解决的问题。
1.1 坐标系定义:你得先知道自己在哪
做SLAM和标定,坐标系是绕不开的坎。我个人习惯把坐标系分成三类:
- 世界坐标系:固定不动的大地基准。你放个棋盘格在地上,那个棋盘格就是世界坐标系的一部分。
- 传感器坐标系:相机、激光雷达、IMU各自的原点。比如相机光心就是相机坐标系的原点。
- 车体/机器人坐标系:通常定义在车辆中心或后轴中心。外参标定的目标,就是把传感器坐标系和车体坐标系对齐。
嗯,这里要注意一个坑:不同厂家对坐标轴的定义可能不一样。比如有的相机Z轴朝前,有的Z轴朝上。我在项目中遇到过,两个传感器明明物理上装好了,但标定出来的结果就是不对。后来一查,原来是坐标系定义没统一。所以,动手之前,先把每个传感器的坐标系定义文档翻出来看清楚。
核心原则:所有坐标变换,必须明确“从哪个坐标系到哪个坐标系”。写代码时,我习惯在变量名里带上坐标系后缀,比如 p_cam 表示相机坐标系下的点,p_world 表示世界坐标系下的点。这招帮我避免了很多低级错误。
1.2 刚体变换:旋转和平移,缺一不可
两个坐标系之间的关系,可以用一个刚体变换来描述。它包含两部分:
- 旋转:用旋转矩阵 R 表示,3x3 的正交矩阵,行列式为 +1。
- 平移:用平移向量 t 表示,3x1 的向量。
一个点从坐标系 A 变换到坐标系 B,公式很简单:
p_b = R * p_a + t
但实际工程中,我们更喜欢用齐次坐标,把旋转和平移合并成一个 4x4 的变换矩阵 T:
| R t |
| 0 1 |
这样,连续变换就可以直接矩阵相乘了。比如从激光雷达到相机,再到世界坐标系:
T_world_cam = T_world_lidar * T_lidar_cam
你看,是不是清爽多了?
小技巧:写代码时,我习惯用 Eigen 或 Sophus 库来管理变换矩阵。手写矩阵乘法?别闹了,容易出错。我曾经手写过一个旋转矩阵,结果符号搞反了,标定出来的外参直接把点云映射到了地底下……嗯,从那以后我再也不敢手撸了。
1.3 李群与李代数基础:为什么需要它?
你可能会问:旋转矩阵 R 不是挺好的吗?为什么还要搞什么李群李代数?
原因很简单:优化问题需要求导。旋转矩阵 R 是正交矩阵,有约束条件(R^T R = I),直接对它求导非常麻烦。而李代数是一个无约束的向量空间,求导就方便多了。
说白了,李群和李代数就是一对“好基友”:
- 李群 SO(3):三维旋转矩阵的集合。它是一个流形,不是线性空间。
- 李代数 so(3):三维旋转向量的集合。它是一个线性空间,对应 SO(3) 在单位元处的切空间。
它们之间通过指数映射和对数映射相互转换:
R = exp(φ^) // 从李代数到李群
φ = log(R) // 从李群到李代数
其中 φ 是一个三维向量,φ^ 是它的反对称矩阵。这个映射关系,我在做图优化的时候几乎天天用。
避坑指南:我曾经在优化外参时,直接对旋转矩阵的9个元素做优化,结果优化出来的矩阵根本不是正交矩阵,导致后续计算全崩了。后来改用李代数参数化,问题迎刃而解。记住:优化旋转,永远用李代数。
1.4 知识体系总览
为了让你更直观地理解本章的知识结构,我画了一张图:
这张图把本章的三个核心模块串起来了。你想想看,坐标系定义是基础,刚体变换是工具,李群李代数是优化手段。三者缺一不可。
1.5 实战中的一点体会
最后,我想分享一点个人经验。很多初学者喜欢一上来就调代码、跑标定程序,结果出了问题根本不知道错在哪。我的建议是:先把坐标系画出来。
拿张纸,画出你的传感器安装位置,标出每个坐标系的原点和轴方向。然后手动推导一下变换关系。这一步虽然看起来“土”,但能帮你理清思路。我在做多传感器融合项目时,每次都会先画这个图,哪怕只是草稿。
好了,这一章的内容就到这里。记住:坐标系是根,变换是干,优化是枝叶。根扎稳了,后面的标定工作才能枝繁叶茂。
本章要点回顾:
- 明确三种坐标系:世界、传感器、车体
- 刚体变换 = 旋转 + 平移,用齐次矩阵统一表示
- 李群 SO(3) 和李代数 so(3) 通过指数/对数映射转换
- 优化旋转参数时,务必使用李代数,避免约束问题
可可精品资料库