3. 刚体变换与齐次矩阵
在3D点云配准与手眼标定中,核心数学工具是刚体变换。刚体变换描述了一个物体在三维空间中只发生旋转和平移,而不发生形变(即保持点间距离和手性)。本章将系统推导旋转矩阵、平移向量、齐次坐标以及4x4变换矩阵的数学形式与关键性质。
3.1 旋转矩阵:三维旋转的代数表示
旋转矩阵是一个3x3的正交矩阵,满足 RTR = I 且 det(R) = +1。它描述了坐标系或点绕原点的旋转。
核心性质: 旋转矩阵的每一列(或行)都是单位向量,且两两正交。逆矩阵等于转置矩阵:
R-1 = RT。
绕三个坐标轴的基本旋转矩阵(右手法则):
| 旋转轴 | 旋转矩阵(角度 θ) | 说明 |
|---|---|---|
| X 轴 | Rx(θ) = [[1, 0, 0], [0, cosθ, -sinθ], [0, sinθ, cosθ]] |
y 和 z 分量旋转 |
| Y 轴 | Ry(θ) = [[cosθ, 0, sinθ], [0, 1, 0], [-sinθ, 0, cosθ]] |
x 和 z 分量旋转 |
| Z 轴 | Rz(θ) = [[cosθ, -sinθ, 0], [sinθ, cosθ, 0], [0, 0, 1]] |
x 和 y 分量旋转 |
手眼标定提示: 实际应用中,旋转矩阵常由欧拉角或四元数转换而来。注意万向锁问题,优先使用四元数进行插值,但最终标定方程仍以旋转矩阵形式参与计算。
3.2 平移向量:三维空间中的位移
平移向量 t = [tx, ty, tz]T 表示坐标系原点之间的位移。在刚体变换中,平移与旋转是解耦的:先旋转,再平移。
点 p 经过旋转 R 和平移 t 后的坐标 p' 为:
p' = R * p + t
这种形式在连续变换时不够紧凑,因为每次变换都需要分别处理旋转和平移,无法通过矩阵乘法串联。
3.3 齐次坐标:统一旋转与平移
齐次坐标通过在三维向量末尾添加一个额外的维度(通常为1),将三维点表示为四维向量:
p_h = [x, y, z, 1]<sup>T</sup>
引入齐次坐标的核心优势:
- 统一变换形式: 旋转和平移可以合并为一个4x4矩阵,通过一次矩阵乘法完成变换。
- 支持变换串联: 多个刚体变换可以通过矩阵乘法合并为一个等效变换。
- 表示无穷远点: 当齐次坐标的最后一个分量为0时,表示方向向量(不受平移影响)。
常见误区: 齐次坐标的缩放因子不是任意的。对于表示点的齐次坐标,最后一个分量必须归一化为1;对于表示方向的向量,最后一个分量为0。混淆两者会导致变换结果错误。
3.4 4x4变换矩阵的推导与性质
将旋转矩阵 R 和平移向量 t 组合成4x4齐次变换矩阵 T:
T = [[R, t],
[0, 1]]
其中:
R: 3x3 旋转矩阵
t: 3x1 平移向量
0: 1x3 零向量
1: 标量 1
展开形式:
T = [[r11, r12, r13, tx],
[r21, r22, r23, ty],
[r31, r32, r33, tz],
[0, 0, 0, 1]]
点 p 的齐次坐标 p_h 经过变换 T 后:
p'_h = T * p_h
变换矩阵的逆矩阵:
T<sup>-1</sup> = [[R<sup>T</sup>, -R<sup>T</sup> * t],
[0, 1]]
这个性质非常实用:已知从坐标系A到B的变换 TAB,则从B到A的变换 TBA = TAB-1,无需重新计算旋转和平移。
变换串联: 若依次进行变换
T1、T2、T3,则等效变换为 T = T3 * T2 * T1。注意乘法顺序:先应用的变换在右侧。
3.5 刚体变换的几何意义与性质总结
| 性质 | 数学表达 | 几何含义 |
|---|---|---|
| 保距性 | ||p' - q'|| = ||p - q|| |
变换前后点间距离不变 |
| 保角性 | 向量夹角不变 | 变换前后角度不变 |
| 保手性 | det(R) = +1 |
不产生镜像(区别于反射变换) |
| 可逆性 | T-1 存在且唯一 |
变换可逆,无信息损失 |
| 封闭性 | 两个刚体变换的乘积仍是刚体变换 | 变换集合构成群(SE(3)) |
3.6 手眼标定中的刚体变换链
在手眼标定中,刚体变换构成一个闭环链。以“眼在手外”(Eye-to-Hand)为例:
- 机器人基座 → 机器人末端: 由机器人正运动学提供,记为
Tbase_to_ee - 机器人末端 → 标定板: 未知的固定变换,记为
Tee_to_calib - 标定板 → 相机: 由3D点云配准(如ICP)计算得到,记为
Tcalib_to_cam - 相机 → 机器人基座: 待求的手眼变换,记为
Tcam_to_base
闭环约束:
T<sub>cam_to_base</sub> = T<sub>base_to_ee</sub> * T<sub>ee_to_calib</sub> * T<sub>calib_to_cam</sub>
通过多组位姿数据,可以构建形如 AX = XB 的方程求解手眼变换矩阵 X。
实战建议: 在代码实现中,建议使用成熟的线性代数库(如 Eigen、NumPy)处理4x4矩阵运算。手动实现时注意矩阵乘法顺序和齐次坐标归一化,避免因数值误差导致变换矩阵失去正交性。