3、数学基础(二):几何基础——欧拉角、四元数、旋转矩阵、刚体变换与相似变换

好,咱们接着聊三维重建里的数学。上一章我们讲了坐标系和向量,算是热身。这一章才是真正的硬菜——旋转和变换。

说实话,我刚入行那会儿,最头疼的就是这堆东西。欧拉角、四元数、旋转矩阵……名字听着就吓人。但后来我发现,只要搞懂了它们各自是干什么的、优缺点在哪,用起来其实挺顺手的。

你想想看,三维重建里,相机在动、物体在动、点云在动。怎么描述这些运动?怎么把不同视角的数据对齐?答案就在这章里。

3.1 旋转矩阵:最直观的旋转表达

旋转矩阵,说白了就是一个3x3的方阵。它能把一个三维向量旋转到另一个方向。

它的核心性质就两条:正交行列式为+1。正交意味着它的逆等于它的转置,这在实际计算中太方便了。行列式为+1保证了它是纯旋转,没有缩放或镜像。

举个例子,绕Z轴旋转θ角,旋转矩阵长这样:

R_z(θ) = [
  [cosθ, -sinθ, 0],
  [sinθ,  cosθ, 0],
  [0,      0,    1]
]

绕X轴和Y轴的类似,我就不写了。组合起来,任何旋转都能用三个基本旋转的乘积表示。

我的经验: 在实际项目中,我很少手动构造旋转矩阵。一般都是用现成的库,比如OpenCV的Rodrigues()函数,或者Eigen库。但理解它的几何意义很重要——它本质上就是三个坐标轴的新朝向。

3.2 欧拉角:直观但坑多

欧拉角可能是最直观的旋转表达方式了。它用三个角度来描述旋转:绕X轴转多少(roll)、绕Y轴转多少(pitch)、绕Z轴转多少(yaw)。

飞机、无人机、游戏里用得特别多。你一说“俯仰角30度”,大家都能想象出来。

但欧拉角有个大坑——万向锁。当pitch达到±90度时,roll和yaw会变得无法区分。说白了就是丢失了一个自由度。

我曾经踩过的坑: 有一次做机械臂的位姿估计,用了欧拉角做插值。结果在某个特殊姿态下,机械臂突然“抽搐”了一下。查了半天,发现就是万向锁导致的。从那以后,只要涉及插值或平滑运动,我坚决不用欧拉角。

另外,欧拉角的顺序也很重要。XYZ、ZYX、YXZ……不同顺序得到的结果完全不同。所以用欧拉角时,一定要明确约定顺序。

3.3 四元数:三维重建的“瑞士军刀”

四元数,听起来很玄乎。其实它就是四个数:一个实部加三个虚部。写成q = w + xi + yj + zk。

为什么三维重建里这么爱用四元数?原因有三:

  • 无万向锁——这是最大的优势
  • 插值平滑——SLERP插值能生成非常自然的旋转过渡
  • 计算高效——比旋转矩阵少几个乘法,比欧拉角稳定

四元数表示旋转的公式也很优雅:

v' = q * v * q^(-1)

其中v是三维向量(写成纯四元数),q是单位四元数。这个公式把旋转变成了“乘法”,数学上非常干净。

核心要点: 四元数虽然抽象,但它是三维重建里最常用的旋转表达方式。我个人建议,只要涉及相机位姿优化、点云配准,优先用四元数。

3.4 刚体变换:旋转+平移

刚体变换,就是旋转加平移。它描述的是“物体整体移动,形状不变”的运动。

在三维重建里,相机从一个位置移动到另一个位置,就是刚体变换。点云配准里,把两片点云对齐,也是刚体变换。

数学上,刚体变换可以写成:

P' = R * P + t

其中R是旋转矩阵,t是平移向量。为了计算方便,我们通常用齐次坐标把它写成4x4矩阵:

T = [
  [R, t],
  [0, 1]
]

这样,连续变换就可以用矩阵乘法串联起来,非常方便。

我的习惯: 在代码里,我一般用4x4矩阵来存储刚体变换。因为很多库(比如OpenCV、PCL)都支持这种格式,而且矩阵乘法比手动计算R和t要快得多。

3.5 相似变换:比刚体多一个尺度

相似变换,就是在刚体变换的基础上,加了一个均匀缩放

什么时候用?比如你把一个CAD模型缩放到真实尺寸,或者把不同尺度的点云对齐。说白了,就是“形状一样,大小不同”。

数学上:

P' = s * R * P + t

其中s是缩放因子。齐次坐标下:

T_s = [
  [s*R, t],
  [0,   1]
]

注意,这里的缩放是各向同性的——三个方向缩放相同。如果各方向缩放不同,那就变成仿射变换了,不在我们今天的讨论范围内。

3.6 知识体系总览

说了这么多,我画个图帮你理清思路:

三维重建几何变换知识体系 几何变换 旋转 (3 DoF) 旋转矩阵 (3x3) 欧拉角 (roll/pitch/yaw) 四元数 (w,x,y,z) 刚体变换 (6 DoF: 旋转+平移) 相似变换 (7 DoF: 旋转+平移+缩放) DoF = Degrees of Freedom (自由度)

3.7 实际项目中的选择建议

说了这么多理论,到底该用哪个?我根据实际经验给你个参考:

场景 推荐表达 原因
相机位姿优化(BA) 四元数 + 平移向量 无万向锁,参数少,优化稳定
点云配准(ICP) 4x4刚体变换矩阵 方便串联变换,库支持好
人机交互(手动调参) 欧拉角 直观,容易理解
多尺度点云对齐 相似变换矩阵 同时处理旋转、平移和缩放
动画/插值 四元数SLERP 平滑无抖动
注意: 不同表达方式之间可以互相转换。比如欧拉角转四元数、四元数转旋转矩阵。但转换过程中要注意精度损失和边界情况(比如万向锁附近)。

好了,这一章的内容就到这。几何变换是三维重建的基石,搞懂了这些,后面讲相机模型、多视图几何的时候,你会觉得轻松很多。

记住一句话:旋转用四元数,变换用齐次矩阵,调试用欧拉角。这是我多年项目经验的总结,希望对你有帮助。


专注资料整理