欧拉角如何表示空间姿态?
如果您使用六轴机器人(如本教程以 Meca500 为例),您很可能需要将其工具(末端执行器) 定位到各种姿态。换句话说,您需要能够编程让机器人将其末端执行器移动到期望的位置 和 姿态(即期望的 位姿)。当然,您可以随时通过示教或手动引导将机器人的末端执行器移至大致期望的位姿,但这种所谓的 在线编程方法 既繁琐又极不精确。离线计算并定义期望位姿要高效得多。此外,为了定义与末端执行器关联的 工具参考坐标系(如图所示),您需要计算该工具参考坐标系相对于 法兰参考坐标系 的位姿。
在三维空间中,定义一个位姿至少需要六个参数。例如,机器人末端执行器的位置,或更准确地说是 TCP(工具中心点)的位置,通常定义为工具参考坐标系原点相对于 世界参考坐标系 的 x、y 和 z 坐标。那么,如何定义空间中的姿态呢?
空间姿态的表示是一个复杂的问题。欧拉旋转定理 指出,在(三维)空间中,刚体的任何位移(使刚体上一点保持固定)等效于绕通过该固定点的单一轴的一次旋转。因此,这种旋转可以用三个独立参数描述:两个描述轴,一个描述旋转角。然而,空间姿态可以用多种其他方式表示,每种都有其优缺点。其中一些表示使用的参数多于必要的最小三个参数。
将位置坐标从一个笛卡尔(三维)参考坐标系 F 变换到另一个 F' 的最常用方法是 旋转矩阵。这个 3×3 矩阵因此可用于表示参考坐标系 F' 相对于参考坐标系 F 的姿态。不过,这种表示虽然稍后常被需要,但并非定义姿态的紧凑直观方式。
另一种更紧凑的定义姿态的方式是 四元数。这种表示由一个归一化的四标量向量组成。四元数通常用于机器人控制器,因为它不仅比旋转矩阵更紧凑,而且对近似误差的敏感度更低。此外,在两个不同姿态之间插值时,四元数的元素连续变化,避免了欧拉角等三参数固有的不连续性。尽管如此,四元数很少作为用户与机器人控制器之间的通信手段,因为它不直观。
欧拉角的详细定义
在 CAD 软件或机器人控制器中,向用户传达空间姿态或允许用户定义姿态,最常用的方法是使用 欧拉角。由于“欧拉角”一词常被误用,我们准备了本交互式教程。
欧拉角是一组(更准确说是一序列)三个角,可记为 α、β 和 γ。(欧拉角常记为 横滚、俯仰 和 偏航。)欧拉角定义如下:考虑两个右手笛卡尔三维参考坐标系,任意将一个称为 固定 坐标系,另一个称为 移动 坐标系。两个坐标系初始重合。要定义第三个坐标系的姿态(三个坐标系共享同一原点),按以下顺序旋转移动坐标系使其与第三个坐标系重合:
- 绕固定坐标系的 x、y 或 z 轴,或移动坐标系的 x'、y' 或 z' 轴,旋转 α 度;
- 然后绕固定坐标系的 x、y 或 z 轴,或移动坐标系的 x'、y' 或 z' 轴,旋转 β 度;
- 最后绕固定坐标系的 x、y 或 z 轴,或移动坐标系的 x'、y' 或 z' 轴,旋转 γ 度。
三次旋转的顺序至关重要。因此共有 216 (63) 种可能序列:x→y→z、y→y→z、z→y→z、x'→y→z、y'→y→z、z'→y→z,等等。然而,两次连续旋转绕同一轴的序列(如 y→y→z)无法描述一般姿态。此外,首次旋转前,x 与 x' 重合,y 与 y' 重合,z 与 z' 重合。因此,在这 216 种组合中,仅存在十二种唯一的有意义的有序旋转序列,即 十二种欧拉角约定:XYX、XYZ、XZX、XZY、YXY、YXZ、YZX、YZY、ZXY、ZXZ、ZYX、ZYZ。
也就是说,这十二种组合中的每一种都等价于其他三种序列。换句话说,每种欧拉角约定可用四种不同方式描述。例如,ZYX 约定等价于序列 z→y→x、x'→y'→z'、y→z'→x 和 y→x→z'。幸运的是,没人会用既绕固定轴又绕移动轴的混合序列描述欧拉角(如 y→z'→x 和 y→x→z')。
因此,虽然有十二种不同的欧拉角约定,但每种通常用两种方式描述:要么作为绕固定坐标系轴的旋转序列,要么作为绕移动坐标系轴的旋转序列。因此,谈论固定约定和移动约定很方便,尽管它们等价。例如,固定 XYZ 欧拉角约定由 x→y→z 序列描述,而移动 ZYX 欧拉角约定由 z'→y'→x' 序列描述,两者等价,稍后将说明。
在机器人领域,FANUC 和 KUKA 使用固定 XYZ 欧拉角约定,ABB 使用移动 ZYX 欧拉角约定。川崎、欧姆龙 Adept 和 Stäubli 使用移动 ZYZ 欧拉角约定。CATIA 和 SolidWorks 使用的欧拉角由移动 ZYZ 欧拉角约定描述。
Mecademic 采用移动 XYZ 欧拉角约定,因此将欧拉角描述为序列 x'→y'→z'。为什么与众不同?因为我们曾提供一种用于处理轴对称工件的机械夹爪(见视频),由第 6 轴电机驱动。配备这种夹爪的六轴机器人只能控制两个旋转自由度,即第 6 轴轴线的方向,也就是工件对称轴的方向。在所选欧拉角约定中,α 和 β 定义该方向,而 γ 被忽略,因为它对应不可控的寄生旋转。
下方的小程序将帮助您理解欧拉角。您可以通过点击第一、二、三次旋转的 x、y、z 框来选择十二种可能的欧拉角约定之一。(默认序列为 Mecademic 所用。)要在固定坐标系轴旋转和移动坐标系轴旋转之间切换,需双击这九个框中的任意一个。固定坐标系轴以灰色显示,移动坐标系轴以黑色显示。x 和 x' 为红色,y 和 y' 为绿色,z 和 z' 为蓝色。沿三个蓝色水平箭头滑动鼠标可改变对应的欧拉角。或者,在箭头下方的文本框中直接设置欧拉角值(度)。最后,可拖动鼠标改变视角。
| R = Rx(0°) Ry(0°) Rz(0°) = |
|
| 1.000 | 0.000 | 0.000 |
| 0.000 | 1.000 | 0.000 |
| 0.000 | 0.000 | 1.000 |
|
|
|
通过旋转矩阵计算欧拉角
通过上述小程序,您可以看到给定欧拉角下移动坐标系相对于固定坐标系的姿态(最右侧子图)。然而在实践中,情况通常相反。您常有两个参考坐标系,想求出描述其中一个相对于另一个姿态的欧拉角。
对于至少两个轴平行的姿态,您可以尝试通过试错猜测欧拉角。例如,回看本教程开头的图片,试着找出 Mecademic 用于定义夹爪工具参考坐标系相对于法兰参考坐标系姿态的欧拉角。答案是 α = −90°,β = 0°,γ = −90°。不容易吧?因此,为了更高效,您必须学习旋转矩阵。
如前所述,空间中任意姿态可用 3×3 旋转矩阵表示。例如,绕 x 轴旋转 α、绕 y 轴旋转 β、绕 z 轴旋转 γ,分别对应以下三个基本旋转矩阵:
| Rx(α) = |
|
| 1 | 0 | 0 |
| 0 | cos(α) | −sin(α) |
| 0 | sin(α) | cos(α) |
|
|
, |
|
| Ry(β) = |
|
| cos(β) | 0 | sin(β) |
| 0 | 1 | 0 |
| −sin(β) | 0 | cos(β) |
|
|
, |
|
| Rz(γ) = |
|
| cos(γ) | −sin(γ) | 0 |
| sin(γ) | cos(γ) | 0 |
| 0 | 0 | 1 |
|
|
。 |
|
我们将上述矩阵称为 基本旋转矩阵。要得到对应旋转序列的基本旋转矩阵乘积,先写第一次旋转对应的基本旋转矩阵。例如,若第一次旋转绕 x(或 x')轴,则写 Rx(ψ),其中 ψ 为旋转角。对于后续每次旋转,若绕移动参考坐标系轴,则右乘(后乘)下一个旋转矩阵;若绕固定参考坐标系轴,则左乘(前乘)下一个旋转矩阵。使用小程序查看基本旋转矩阵乘积结果。例如,旋转序列 x'→y'→z' 对应乘积 R = Rx(α)Ry(β)Rz(γ)。因此,Mecademic 所用欧拉角对应的旋转矩阵为:
| R(α, β, γ) = |
|
| cos(β)cos(γ) | −cos(β)sin(γ) | sin(β) |
| cos(α)sin(γ) + sin(α)sin(β)cos(γ) | cos(α)cos(γ) − sin(α)sin(β)sin(γ) | −sin(α)cos(β) |
| sin(α)sin(γ) − cos(α)sin(β)cos(γ) | sin(α)cos(γ) + cos(α)sin(β)sin(γ) | cos(α)cos(β) |
|
|
。 |
|
因此,对于给定姿态,您需要做两件事:首先,找到对应该姿态的旋转矩阵;其次,用几个简单方程提取欧拉角。让我们先展示两种找到旋转矩阵的方法。
考虑下图示例,需要求出表示坐标系 F' 相对于坐标系 F 姿态的旋转矩阵。(回顾:我们始终用红色表示 x 轴,绿色表示 y 轴,蓝色表示 z 轴。)
这里很容易看出,若将第三个参考坐标系与 F 对齐作为移动坐标系,然后绕其 z' 轴旋转 θ 度,再绕其 y' 轴旋转 φ 度,即可得到 F 的姿态。因此,我们要找的旋转矩阵为:
| Rdesired = Rz(θ)Ry(φ) = |
|
| cos(θ)cos(φ) | −sin(θ) | cos(θ)sin(φ) |
| sin(θ)cos(φ) | cos(θ) | sin(θ)sin(φ) |
| −sin(φ) | 0 | cos(φ) |
|
|
。 |
|
或者,我们可以直接获得上述旋转矩阵。其第一、二、三列分别表示坐标系 F' 的 x、y、z 轴单位向量在坐标系 F 中的坐标。
现在您有了表示期望姿态的旋转矩阵,只需解九个标量三角方程组 Rdesired = R(α, β, γ),求 α、β、γ。幸运的是,此问题有通用解,我们直接给出方程。
设坐标系 F' 相对于坐标系 F 的期望姿态由以下旋转矩阵表示:
| Rdesired = |
|
| r1,1 | r1,2 | r1,3 |
| r2,1 | r2,2 | r2,3 |
| r3,1 | r3,2 | r3,3 |
|
|
。 |
|
依据 Mecademic 采用的移动 XYZ 约定,欧拉角(度)按以下两种情况获得:
情况 1: r1,3 ≠ ±1(即 F' 的 z' 轴不平行于 F 的 x 轴)。
β = asin(r1,3),γ = atan2(−r1,2, r1,1),α = atan2(−r2,3, r3,3)。
情况 2: r1,3 = ±1(即 F' 的 z' 轴平行于 F 的 x 轴)。
β = r1,390°,γ = atan2(r2,1, r2,2),α = 0。
一般情况 1 实际上有两组解,所有角度在半开区间 (−180°, 180°] 内。但计算两组解无意义,故仅给出第一组,其中 −90° < β < 90°。另请注意,我们在解中使用 atan2(y, x) 函数。某些编程语言、科学计算器和大多数电子表格软件中,该函数参数顺序相反。
最后,情况 2 对应所谓的 表示奇异。这种奇异存在于任何三参数的三维空间姿态表示中(不仅限于 Mecademic 的欧拉角选择)。它类似于仅用两个参数表示球面上点的问题。例如,地球南北极的经度未定义,或可取任意值。换句话说,这种奇异与机构奇异(如所谓的 万向节死锁)无关,后者对应实际物理问题(如自由度丧失)。
练习
考虑我们遇到的真实情况。我们想将 FISNAR 分配阀安装在 Meca500 机器人末端执行器上。设计并加工适配器的工程师不关心欧拉角,只关心可加工性和可达性。其设计中本质上有两个 45° 旋转。首先,他利用法兰上两个相对的螺纹孔安装适配器,导致第一个 45° 旋转。其次,法兰接口平面与分配器轴线夹角为 45°。
上图显示实际安装(左)和需定义的工具坐标系(右)。使用轴对称工具时,通常将工具 z 轴与工具轴线对齐。这对移动 XYZ 欧拉角约定特别有用,因为绕轴对称工具的冗余旋转对应第三个欧拉角 γ。因此,前两个欧拉角定义工具轴线,第三个可用于选择机器人的最佳配置(即远离奇异点)。
回到例子,我们将展示无法通过试错得出移动 XYZ 约定下的欧拉角。对于该工具参考坐标系选择,最终姿态可表示为两次旋转序列:R = Rz(45°)Ry(45°)。由此,利用前文方程提取移动 XYZ 约定下的欧拉角,得 α = −35.264°,β = 30.000°,γ = 54.735°。现在您是否相信,像这种情况确实需要掌握欧拉角?
表示奇异与姿态误差
在移动 XYZ 欧拉角约定中,若 F' 的 z' 轴平行于 F 的 x 轴,存在无限对 α 和 γ 定义同一姿态。显然,您只需一组即可定义期望姿态,故我们任意设 α = 0。具体而言,若 β = 90°,则任意满足 α + γ = φ(φ 为任意值)的 α 和 γ 组合对应同一姿态,Mecademic 控制器输出为 {0, 90°, φ}。类似地,若 β = −90°,则满足 α − γ = φ 的任意组合对应同一姿态,控制器输出为 {0, −90°, −φ}。但请注意,若 F' 的 z' 轴 几乎 平行于 F 的 x 轴(即 β 接近 ±90°),欧拉角对数值误差极其敏感。此时,使用欧拉角定义姿态时应尽可能输入更多小数位。
考虑一下让几位 Meca500 用户担忧的情况。您将工具参考坐标系相对于世界参考坐标系的姿态设为 {0°, 90°, 0°},这是一个表示奇异。然后保持该姿态在空间中移动末端执行器到多个位置。在某些位置,由于数值噪声,控制器未检测到 r1,3 = ±1(情况 2),而是按非奇异姿态计算欧拉角。于是控制器返回类似 {41.345°, 90.001°, −41.345°} 的值,看似完全错误且远离 {0°, 90°, 0°}。其实不然。
与位置误差用 √(Δx2 + Δy2 + Δz2) 测量不同,姿态误差与欧拉角变化无直接关系,尤其在表示奇异附近。为理解欧拉角的这种非欧几里得性质,考虑用于表示地球位置的球坐标。在北极,纬度为 90°(北),但经度是多少?北极经度未定义,或可取任意值。现在假设我们仅向格林尼治方向移动 1 离北极。此时纬度为 89.99999999°,但经度变为 0°。再假设回到北极,向东京方向移动 1 米。新经度约 140°。两位置间经度误差 140°!但实际角度误差仅约 0.00000002°。
上述情况在所有其他欧拉角约定中类似。取决于约定,对应的表示奇异发生在 F' 的某一特定轴平行于 F 的另一特定轴时。在表示奇异中,第一和第三次旋转变得相关。
结论是,除非您精通欧拉角(或使用复杂的离线编程软件),更具体地说是精通编程机器人所用的约定,否则您几乎无法编程除简单拾取放置操作外的任何任务。因为机器人技术并不简单,我们尽力帮助您理解基础知识。