3. 外参标定:坐标系定义与刚体变换
外参标定,说白了就是搞清楚各个传感器之间的「相对位置和朝向」。我刚开始做多传感器融合时,总觉得算法才是核心,坐标系嘛随便对齐一下就行。结果呢?数据融合出来全是鬼影,定位轨迹直接漂到天上去。嗯,从那以后我再也不敢小看外参标定了。
这一节,我们重点聊三个东西:坐标系怎么定义、刚体变换怎么算、以及手眼标定到底在干什么。
3.1 坐标系定义:世界、相机、IMU、车身
先说说坐标系。每个传感器都有自己的「小世界」,你得把它们统一到一个「大世界」里。
3.1.1 世界坐标系 (World Frame)
世界坐标系是全局参考系。一般选在机器人起始位置,或者某个固定点。我习惯用 ENU(东-北-天)坐标系,因为IMU的输出天然就是东北天方向。当然,也有人用NED(北-东-地),看你的应用场景。
3.1.2 相机坐标系 (Camera Frame)
相机坐标系的原点在光心,Z轴指向镜头前方(也就是拍摄方向),X轴向右,Y轴向下。注意,这个Y轴向下是计算机视觉的惯例,和机器人学的习惯不太一样。我在项目中遇到过,有人把相机坐标系的Y轴搞反了,结果点云投影全歪了,排查了整整两天。
3.1.3 IMU坐标系 (IMU Frame)
IMU坐标系一般印在芯片外壳上。X轴指向芯片的某个边,Y轴垂直X轴,Z轴朝上。但不同厂家的定义可能不同,一定要看数据手册。我曾经吃过这个亏——某款IMU的Z轴是朝下的,我按默认方向去解算姿态,结果俯仰角直接反了180度。
3.1.4 车身坐标系 (Body Frame)
车身坐标系的原点通常在车辆后轴中心,或者质心。X轴指向车头,Y轴指向左侧,Z轴朝上。这个坐标系是最终控制用的,所有传感器的数据最终都要变换到车身坐标系下。
3.2 刚体变换:旋转 + 平移
刚体变换,说白了就是「把传感器A的坐标系搬到传感器B的坐标系上」。它由两部分组成:旋转和平移。
3.2.1 旋转矩阵
旋转矩阵是一个3x3的正交矩阵,行列式为+1。它描述了坐标系之间的旋转关系。比如,从相机坐标系到IMU坐标系的旋转,可以写成 R_cam_imu。
我个人习惯用 四元数 来表示旋转,因为它在插值和滤波时更稳定。但旋转矩阵在可视化时更直观。你想想看,一个3x3的矩阵,你一眼就能看出哪个轴转了多大角度。
3.2.2 平移向量
平移向量是一个3x1的向量,表示两个坐标系原点之间的位移。比如,IMU在相机前方10厘米、右侧5厘米、上方2厘米,那平移向量就是 [0.05, -0.10, 0.02](注意方向)。
3.2.3 齐次变换矩阵
把旋转和平移合在一起,就是4x4的齐次变换矩阵:
T = | R t |
| 0 1 |
这个矩阵可以把一个点从传感器A坐标系变换到传感器B坐标系。比如,把相机坐标系下的一个3D点 P_cam 变换到IMU坐标系下:
P_imu = T_cam_imu * P_cam
T_source_target,比如 T_cam_imu 表示「从相机坐标系到IMU坐标系的变换」。这样不容易搞混。
3.3 手眼标定原理
手眼标定,名字听着玄乎,其实就一个问题:相机装在机器人手上,怎么知道相机和手之间的相对位置?
这个问题在SLAM里很常见。比如,你的相机装在无人机云台上,云台会动,但相机和云台之间的相对位置是固定的。你得标定出这个固定关系。
3.3.1 手眼标定的数学模型
手眼标定有两种经典场景:
- 眼在手上 (Eye-in-Hand):相机固定在机器人末端,随机械臂运动。
- 眼在手外 (Eye-to-Hand):相机固定在世界坐标系中,观察机器人运动。
两种场景的数学形式略有不同,但核心都是解一个 AX = XB 的方程。其中:
- A:机器人末端两次运动之间的变换(从运动学得到)
- B:相机两次观测之间的变换(从视觉SLAM得到)
- X:相机和机器人末端之间的固定变换(我们要标定的外参)
3.3.2 求解方法
解 AX = XB 的方法有很多,我常用的有两种:
- 两步法:先解旋转,再解平移。用四元数或旋转矩阵的线性方程求解。速度快,适合在线标定。
- 非线性优化:把旋转和平移一起优化,用Levenberg-Marquardt或高斯-牛顿法。精度高,适合离线标定。
3.3.3 我在项目中的实践
有一次,我在做无人机视觉SLAM,相机装在云台上。云台会俯仰和偏航,但相机和云台之间的外参是固定的。我用手眼标定,采集了30组不同云台姿态下的标定板图像,解出了相机到云台的变换矩阵。
结果发现,标定出的平移向量和机械图纸差了2毫米。嗯,这就是加工误差。如果不标定,这2毫米的误差会在融合时放大,导致定位精度下降。
3.4 知识体系总览
下面这张图,把这一节的核心逻辑串起来了:
3.5 避坑指南
最后,分享几个我踩过的坑:
- 坐标系方向搞反:我曾经把IMU的Z轴方向搞反了,结果姿态解算出来的俯仰角一直是负的。排查了三天,最后发现是数据手册没看仔细。
- 旋转顺序搞错:刚体变换时,旋转矩阵的乘法顺序很重要。先旋转后平移,还是先平移后旋转?答案是先旋转后平移。顺序搞反了,结果会差很多。
- 标定数据不够:手眼标定至少需要20组数据,而且要有足够的旋转和平移变化。如果只做平移运动,旋转部分就解不出来。
好了,这一节就到这里。外参标定是传感器融合的基石,搞清楚了坐标系和刚体变换,后面的融合算法才能跑得稳。下一节我们聊内参标定,那个更细,但同样重要。