3、刚体变换与位姿表示:旋转矩阵、平移向量、齐次坐标、欧拉角、四元数

各位同学,今天我们来聊聊外参标定里最核心的数学基础——刚体变换。说白了,就是研究一个物体在三维空间里怎么转、怎么挪。你想想看,相机装在车上,车在动,相机跟着动,这个「动」就是刚体变换。

我刚开始做标定的时候,觉得这东西不就是个旋转加平移嘛,有啥难的?结果第一次实际标定,数据怎么都对不上,折腾了两天才发现是旋转矩阵的符号搞反了。嗯,从那以后我再也不敢小看这块了。

3.1 旋转矩阵:三维旋转的数学表达

旋转矩阵,说白了就是一个3x3的方阵。它描述了一个坐标系相对于另一个坐标系的朝向关系。我习惯把它理解成「三个轴的方向余弦」——你想想看,新坐标系的x轴在原坐标系里的投影,就是矩阵的第一列。

旋转矩阵有个重要性质:它是正交矩阵。什么意思?就是它的逆等于它的转置。这个性质在实际计算中特别有用,比如你要求反向旋转,直接转置就行,不用求逆。

核心性质:

  • RTR = I(正交性)
  • det(R) = 1(右手系)
  • 三个自由度(9个元素,6个约束)

我在项目中遇到过一个问题:用旋转矩阵做连续旋转时,由于浮点误差,矩阵会慢慢偏离正交性。这时候就需要做正交化处理。我一般用SVD分解来修正,效果还不错。

3.2 平移向量:位置偏移的直观表示

平移向量就简单多了,就是一个3x1的列向量,表示两个坐标系原点之间的偏移。比如相机坐标系原点相对于世界坐标系原点的位置,就是平移向量t。

这里有个容易踩的坑:平移向量的方向。我记得有一次标定,数据怎么都对不上,后来发现是平移向量的方向搞反了。你想想看,从世界坐标系到相机坐标系的平移,和从相机到世界的平移,正好是相反数。

避坑指南:

我曾经在项目中把平移向量和旋转矩阵的变换顺序搞混了。记住:先旋转,后平移。顺序错了,结果完全不对。

3.3 齐次坐标:统一旋转和平移的优雅方式

为什么要引入齐次坐标?说白了就是为了把旋转和平移统一成一个矩阵乘法。你想想看,如果不用齐次坐标,你要先做旋转(矩阵乘法),再做平移(向量加法),两步操作。用齐次坐标,一步矩阵乘法搞定。

齐次坐标就是把三维点(x, y, z)变成四维(x, y, z, 1)。对应的变换矩阵是4x4的:

| R   t |
| 0   1 |

这个4x4矩阵就是刚体变换矩阵,也叫SE(3)矩阵。我习惯叫它「外参矩阵」,因为相机外参标定标的就是这个矩阵。

个人经验:

我在做多相机标定时,经常用齐次坐标来串联多个变换。比如从相机1到世界,再从世界到相机2,直接矩阵相乘就行,非常方便。

3.4 欧拉角:直观但容易出问题的表示

欧拉角用三个角度来表示旋转:绕x轴转(roll)、绕y轴转(pitch)、绕z轴转(yaw)。听起来很直观对吧?但实际用起来坑不少。

最大的问题是万向锁。当pitch接近90度时,roll和yaw会变得无法区分。我记得第一次遇到这个问题是在做无人机姿态估计时,飞机垂直朝下时,航向角突然跳变,吓了我一跳。

另一个问题是旋转顺序。不同的应用场景用不同的顺序:航空航天用ZYX,机器人常用ZYZ。我建议你在项目里统一用一种顺序,并在文档里明确标注。

旋转顺序 应用场景 说明
ZYX 航空航天 yaw-pitch-roll
ZYZ 机器人 避免万向锁
XYZ 计算机视觉 常用但注意顺序

3.5 四元数:无万向锁的优雅方案

四元数是我个人最喜欢的旋转表示方式。它用四个数表示旋转:一个实部和三个虚部。形式上写成q = w + xi + yj + zk。

为什么用四元数?三个原因:

  • 无万向锁:这是最大的优势
  • 插值平滑:做球面线性插值(SLERP)非常自然
  • 计算高效:比旋转矩阵少用内存,组合旋转也快

我建议你在做视觉SLAM或者IMU融合时,优先用四元数。旋转矩阵虽然直观,但做优化时约束太多,四元数只需要归一化约束就行。

四元数转旋转矩阵公式:

R = | 1-2(y²+z²)  2(xy-wz)    2(xz+wy)   |
    | 2(xy+wz)    1-2(x²+z²)  2(yz-wx)   |
    | 2(xz-wy)    2(yz+wx)    1-2(x²+y²) |

3.6 知识体系总览

下面这张图是我整理的刚体变换知识体系,你可以看到各种表示方式之间的关系和转换路径。

刚体变换 SE(3) 旋转矩阵 R 平移向量 t 欧拉角 (roll,pitch,yaw) 四元数 q 9个参数 3个参数 3个参数,有万向锁 4个参数,无万向锁 四种表示方式可以互相转换,各有优缺点

看到这张图,你应该能理解:旋转矩阵、平移向量、齐次坐标、欧拉角、四元数,它们都是描述同一个东西的不同方式。就像描述一个人的位置,你可以说经纬度,也可以说地址,还可以说GPS坐标——本质一样,只是表达方式不同。

我个人建议:做标定计算时用旋转矩阵(方便求导),做姿态估计时用四元数(避免万向锁),做可视化时用欧拉角(直观)。至于齐次坐标,那是把旋转和平移统一起来的工具,写代码时用起来特别顺手。

实用建议:

我在写标定代码时,会封装一个Transform类,内部用四元数+平移向量存储,对外提供转旋转矩阵、转欧拉角、转齐次矩阵的接口。这样既保证了内部计算的稳定性,又方便外部调用。

好了,这一章的内容就到这里。刚体变换是外参标定的数学基础,理解透了,后面的标定算法学起来就轻松多了。

可可精品资料库