2. 坐标系与位姿描述:刚体在空间中的描述、齐次变换矩阵、欧拉角与四元数
各位同学,咱们今天聊点硬核的。坐标系与位姿描述,说白了就是回答三个问题:“它在哪里?”、“它朝哪看?”、“我怎么从A走到B?”。
我刚开始做机器人那会儿,觉得这玩意儿不就是高中数学里的向量嘛。直到第一次调试六轴机械臂,发现末端执行器死活对不准目标点……嗯,从那以后我才真正明白,位姿描述不准确,后面所有的运动规划都是空中楼阁。
2.1 刚体在空间中的描述
刚体,你可以想象成一块“不会变形的铁疙瘩”。它在空间里怎么表示?
- 位置:用坐标系原点相对于参考系原点的偏移量 (x, y, z) 表示。
- 姿态:用固连在刚体上的坐标系相对于参考系的旋转关系表示。
我个人习惯把姿态想象成“把参考系掰弯成刚体坐标系”的过程。这个“掰弯”的过程,就是旋转矩阵。
举个例子,一个坐标系 {B} 相对于 {A} 的姿态,可以用一个 3x3 的旋转矩阵 ABR 来表示。矩阵的每一列,其实就是 {B} 的坐标轴在 {A} 中的投影。
// 旋转矩阵示例:绕Z轴旋转θ角
R_z(θ) = | cosθ -sinθ 0 |
| sinθ cosθ 0 |
| 0 0 1 |
2.2 齐次变换矩阵
旋转矩阵只能描述姿态,不能描述位置。那怎么办?把旋转和位移打包在一起,就是齐次变换矩阵。
齐次变换矩阵是一个 4x4 的方阵,长这样:
T = | R p |
| 0 1 |
其中:
R:3x3 旋转矩阵
p:3x1 位置向量
0:1x3 零向量
1:标量 1
为什么要加个“1”?说白了就是为了把旋转和位移统一成一次矩阵乘法。你想想看,如果只用 3x3 矩阵,你没法处理平移。齐次坐标(加一维)让这个问题变得优雅。
我记得有一次做多轴联动插补,需要把工具坐标系下的力传感器数据转换到基坐标系。如果没有齐次变换矩阵,你得先旋转再平移,步骤繁琐还容易出错。用齐次矩阵,一次乘法搞定。
2.3 欧拉角
旋转矩阵虽然数学上严谨,但人看着头疼。你想想看,9个数字,谁能一眼看出机器人转了多少度?所以工程上更常用欧拉角。
欧拉角的核心思想:三次绕坐标轴的旋转,合成任意姿态。
常见的欧拉角约定有:
| 约定名称 | 旋转顺序 | 应用场景 |
|---|---|---|
| ZYX(RPY) | 绕Z轴→绕Y轴→绕X轴 | 航空、机器人末端姿态 |
| ZYZ | 绕Z轴→绕Y轴→绕Z轴 | 工业机器人运动学 |
| XYZ(固定角) | 绕X轴→绕Y轴→绕Z轴 | 视觉标定、相机位姿 |
这里有个大坑——万向锁。当第二次旋转达到 ±90° 时,第一次和第三次旋转的轴会重合,导致丢失一个自由度。我在做六轴机器人奇异点规避时,就吃过这个亏。当时机器人姿态突然“抽搐”,就是因为欧拉角表示遇到了万向锁。
2.4 四元数
四元数,听起来玄乎,其实就是一个“带约束的复数升级版”。它用四个数表示旋转:
q = w + xi + yj + zk
其中:
w:实部(标量部分)
x, y, z:虚部(向量部分)
约束:w² + x² + y² + z² = 1
为什么用四元数?三个理由:
- 无万向锁:这是最大的优势。你随便转,不会丢自由度。
- 插补平滑:球面线性插补(SLERP)可以在两个姿态之间生成平滑过渡。
- 计算高效:比旋转矩阵少一个维度,比欧拉角更稳定。
我记得有一次做协作机器人的拖动示教,需要实时记录操作者拖动的姿态轨迹。如果用欧拉角,稍微转得快一点就出现跳变。换成四元数后,数据平滑得像丝绸一样。
2.5 知识体系总览
下面这张图,把本章的核心逻辑串起来了。你仔细看一遍,就能明白这些概念之间的关系。
2.6 工程选型建议
最后,我根据多年项目经验,给你一个选型对照表。不同场景用不同表示方法,别死磕一种。
| 应用场景 | 推荐表示方法 | 原因 |
|---|---|---|
| 运动学正解/逆解 | 齐次变换矩阵 | 链式乘法方便,物理意义清晰 |
| 轨迹插补(连续运动) | 四元数 | 无万向锁,SLERP插补平滑 |
| 人机界面/示教器 | 欧拉角 (RPY) | 直观,操作者容易理解 |
| 视觉标定/手眼标定 | 旋转矩阵 + 平移向量 | 便于与相机模型对接 |
| 姿态优化/滤波 | 四元数 | 无奇异,适合数值优化 |
好了,这一章的内容就到这里。坐标系和位姿描述是运动规划的基石,你花时间把它吃透,后面学轨迹插补、避障算法会轻松很多。记住:基础不牢,地动山摇。