第2章 坐标系与位姿描述:空间坐标系、刚体位姿描述、齐次变换矩阵、欧拉角与四元数

各位工程师朋友,欢迎来到第二章。这一章的内容,说白了就是运动控制的“语言基础”。你想想看,要让机器人动起来,首先得告诉它“你在哪”、“要去哪”、“怎么转”。这些信息怎么描述?就是靠坐标系和位姿。

我刚开始做运动控制那会儿,觉得这玩意儿太简单了,不就是几个坐标嘛。结果第一次调试六轴机械臂,因为欧拉角万向锁问题,手臂直接在天上画了个奇怪的弧线,差点撞到设备。嗯,从那以后我再也不敢小看位姿描述了。

2.1 空间坐标系:给世界一个“尺子”

坐标系是描述物体位置的基准。没有坐标系,你说“往前走1米”,机器人根本不知道往哪走。

常用的空间坐标系有三种:

坐标系类型 特点 典型应用
世界坐标系(全局坐标系) 固定不动,是整个场景的参考 机器人基座标、AGV全局定位
工具坐标系(TCP坐标系) 固定在机器人末端执行器上 焊接、抓取、涂胶的末端位姿控制
用户坐标系(工件坐标系) 定义在工件或工作台上 沿斜面焊接、绕工件旋转加工

我个人习惯,在项目一开始就先把坐标系定义清楚。坐标系乱了,后面所有轨迹都得重来。记住一个原则:世界坐标系是“根”,其他坐标系都是“枝”。

核心概念:坐标系由原点O和三个正交轴X、Y、Z组成。右手定则确定方向——拇指X、食指Y、中指Z。这个定则贯穿整个运动控制领域,务必刻在脑子里。

2.2 刚体位姿描述:位置+姿态=完整状态

刚体在空间中的状态,由两部分组成:位置和姿态。位置好理解,就是三个坐标值(x, y, z)。姿态呢?就是物体“朝哪看”、“怎么转”。

位置用向量表示:

p = [x, y, z]^T

姿态用旋转矩阵表示:

R = [r11 r12 r13;
     r21 r22 r23;
     r31 r32 r33]

旋转矩阵有9个元素,但自由度只有3个。所以它内部有约束——列向量单位正交,行列式为+1。我在项目中遇到过有人直接手动填旋转矩阵,结果行列式变成0.98,轨迹直接飘了。记住:旋转矩阵必须满足正交性,否则你算出来的位置全是错的。

小技巧:实际工程中,我们很少直接操作旋转矩阵的9个元素。一般用欧拉角或四元数来输入,内部再转成矩阵计算。这样既直观又稳定。

2.3 齐次变换矩阵:把“转”和“移”打包

位置和姿态分开算太麻烦。能不能合在一起?能。齐次变换矩阵就是干这个的。

T = [R   p;
     0   1]

其中:
R: 3x3 旋转矩阵
p: 3x1 位置向量
0: 1x3 零向量
1: 1x1 标量1

这个4x4的矩阵,一次乘法就能完成旋转+平移。你想想看,机械臂从基座到末端,中间经过好几个关节,每个关节一个变换矩阵,乘起来就是末端位姿。这就是运动学正解的核心。

我曾经调试一个协作机器人,发现末端位置总是差2mm。查了半天,发现是齐次变换矩阵里把平移向量写成了列向量,而库函数要求行向量。这种坑,你不踩一次真的记不住。

注意:齐次变换矩阵的乘法顺序很重要!先旋转后平移,和先平移后旋转,结果完全不同。一般约定是:T = Trans(p) * Rot(轴, 角度)。顺序错了,位置能差出十万八千里。

2.4 欧拉角:直观但“有坑”

欧拉角用三个角度描述姿态:绕X轴转(滚转Roll)、绕Y轴转(俯仰Pitch)、绕Z轴转(偏航Yaw)。直观吧?飞行员、游戏玩家都喜欢用。

但欧拉角有个致命问题——万向锁。当俯仰角达到±90°时,滚转和偏航的旋转轴重合,丢失一个自由度。我在做云台控制时就遇到过:相机朝天看时,水平旋转突然失灵,画面乱转。

欧拉角类型 旋转顺序 常见场景
ZYX(航空顺序) 偏航→俯仰→滚转 无人机、飞行器姿态
ZYZ(机器人顺序) 绕Z→绕Y→绕Z 工业机器人腕部姿态
XYZ(固定轴顺序) 绕X→绕Y→绕Z 相机标定、视觉引导

我个人建议:人机交互界面用欧拉角,内部计算用四元数。这样既方便操作员理解,又避免万向锁。

2.5 四元数:稳定、无奇点

四元数是什么?说白了就是一个“超复数”。它用四个数表示旋转:

q = w + xi + yj + zk

其中:
w: 标量部分(旋转角度的一半的余弦)
x, y, z: 向量部分(旋转轴的方向)
满足:w² + x² + y² + z² = 1

四元数最大的好处是:平滑插值、无万向锁。你让机械臂从姿态A转到姿态B,用欧拉角插值可能中途乱转,用四元数的球面线性插值(SLERP)就能走出最短路径。

我记得有个项目要做机器人打磨,要求末端姿态连续变化。用欧拉角写轨迹,每到90°附近就抖动。换成四元数SLERP,丝般顺滑。从那以后,我所有涉及姿态插值的项目,一律用四元数。

工程建议:

  • 欧拉角→四元数:用转换公式,注意旋转顺序
  • 四元数→旋转矩阵:用Rodrigues公式,计算量小
  • 四元数乘法:表示旋转的复合,注意顺序(q1 * q2表示先q2后q1)

2.6 知识体系总览

下面这张图,是我梳理的本章知识结构。建议你保存下来,做项目时对照着看。

坐标系与位姿描述 · 知识体系 刚体位姿描述 位置描述 姿态描述 坐标系类型 笛卡尔坐标 圆柱/球坐标 旋转矩阵 欧拉角 四元数 世界坐标系 工具/用户 齐次变换矩阵 T = [R p; 0 1] 运动学正解 姿态插值(SLERP) 坐标变换链 核心原则:先定义坐标系 → 再描述位姿 → 最后用齐次变换串联

2.7 工程避坑指南

最后,分享几个我踩过的坑,希望能帮你省点时间:

  • 坐标系方向搞反:我曾经把工具坐标系的Z轴方向定义反了,结果机器人抓取时直接往工件上怼。建议:定义完坐标系后,先用示教器手动点动验证方向。
  • 欧拉角顺序不统一:不同厂家、不同库的欧拉角顺序可能不同。ABB用ZYX,KUKA用ZYZ,ROS用RPY。转换时务必确认顺序,否则姿态全乱。
  • 四元数归一化:四元数经过多次乘法后,数值误差会累积,导致模长偏离1。我习惯每算完一次变换,就做一次归一化。计算量不大,但能避免很多诡异问题。
  • 齐次变换矩阵的逆:求逆时,别直接对4x4矩阵求逆。用公式:T⁻¹ = [Rᵀ, -Rᵀp; 0, 1],又快又准。