Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

2.4 欧拉角:ZYZ 与 RPY

把 9 量的姿态矩阵压缩成 3 个角度,就得到两种最常用的欧拉角:机器人学惯用的 ZYZ 与航空航海惯用的 RPY。本节还收录了课堂的编外数值分析——为什么反解一律用 Atan2(录播 0:11:00–0:15:36)。全节对应录播 0:05:30–0:21:53。

欧拉角:三个环,三次旋转 ZYZ 与 RPY 都是把姿态拆成三个可读的角,但读数依赖顺序,也会遇到万向节锁。 ROBOTICS · EULER ANGLES / 11 ATLAS / R-11 欧拉角:三个环,三次旋转 ZYZ 与 RPY 都是把姿态拆成三个可读的角,但读数依赖顺序,也会遇到万向节锁。 xyzα 绕 zβ 绕 y′γ 绕 z″ZYZ:内旋三次,顺序不能换。万向节锁 β = 0 或 π两个环轴重合,丢失一个自由度。
图解读图:ZYZ 是「先绕 z 转 α,再绕新 y 转 β,最后绕新 z 转 γ」的内旋序列。三个环分别代表三次旋转;当 β=0 或 π 时,第一、第三环的轴重合,两个角只剩一个独立效果——这就是万向节锁。

2.4.1 最简表示与 12 种可行序列

旋转矩阵的 9 个元素受 6 个正交性约束,因此3 个参数就足以描述姿态(9 个量、6 个约束、3 个独立参数):一般地,SO(m)SO(m) 的最简表示需要 m(m−1)/2m(m-1)/2 个参数,m=3m=3 时恰为 3。于是把姿态写成三个角的集合 ϕ=[φ  ϑ  ψ]T\boldsymbol\phi=[\varphi\ \ \vartheta\ \ \psi]^T,由 3 个绕坐标轴的基本旋转依次合成。问题在于:三个轴共有 27 种排列组合,其中只有 12 种可行(机制见下框)。

为什么砍掉 15 种(录播 0:07:57–0:08:28)

若序列中出现「连续绕同一轴」的情况,例如 X ⁣X ⁣XX\!X\!X 或 Z ⁣X ⁣XZ\!X\!X 里的相邻同轴段,那么两次绕同轴的旋转可以合并成一次——三个角实际只贡献了两个独立的转动方向,任意的终态姿态就「转不出来」了。反过来说,只有 12 种「相邻不同轴」的组合能覆盖 SO(3)SO(3) 的每一个姿态;每一组三个角就叫一组欧拉角,欧拉角不唯一(12 种选法),本节只取课程与原书主推的两种。

2.4.2 ZYZ 角:右乘合成与正解

ZYZ 序列(原书图 2.8)的每一步都绕当前轴旋转,因此按 原理 2.3.A 依次右乘:

  1. 绕参考系 zz 轴转 φ\varphi:Rz(φ)R_z(\varphi);
  2. 绕新 y′y' 轴转 ϑ\vartheta:Ry′(ϑ)R_{y'}(\vartheta);
  3. 绕新 z′′z'' 轴转 ψ\psi:Rz′′(ψ)R_{z''}(\psi)。

三步过程中坐标架如何演化,看下图(灰虚 = 上一步的旧架):每转一次,「当前轴」就换到刚转出来的新架上——这正是「右乘」的几何本体。

ZYZ 三步旋转的坐标架演化 三个面板依次为:绕 z 转 φ 后、绕新 y′ 转 ϑ 后、绕新 z″ 转 ψ 后的坐标架;每面板灰色虚线为上一步的旧架,金色为本次转动轴并配弧形箭头。三步全绕当前轴,依次右乘。 ① Rz(φ):绕 z 转 φ(方位) 轴 z x′ y′ z′ ② Ry′(ϑ):绕新 y′ 转 ϑ(俯仰) 轴 y′ x″ y″ z″ ③ Rz″(ψ):绕新 z″ 转 ψ(自转) 轴 z″ x′′′ y′′′ z′′′ 灰虚 = 上一步的旧架;金色 = 本次转轴(「当前轴」每步都换) 新因子依次往右追加:R = Rz(φ)·Ry′(ϑ)·Rz″(ψ);ϑ → 0 时 z 与 z″ 平行,φ 与 ψ 不可分(ZYZ 表示奇点)
ZYZ 三步的坐标架演化(本教程绘,示例取 φ=40°,ϑ=55°,ψ=30°\varphi=40°,\vartheta=55°,\psi=30°):轴随转动而变——第 2 步绕的是第 1 步转出来的 y′y',第 3 步绕的是前两步转出来的 z′′z'';这与 RPY 的「三副固定架」(见下文左 / 右乘对偶图)形成对照。第三步之后 zz 与 z′′z'' 的夹角恰为 ϑ\vartheta——ϑ=0\vartheta=0 即两轴共线,φ\varphi 与 ψ\psi 的贡献合并、表示奇异(定理 2.4.B)。

R(ϕ)=Rz(φ) Ry′(ϑ) Rz′′(ψ)=[cφcϑcψ−sφsψ−cφcϑsψ−sφcψcφsϑsφcϑcψ+cφsψ−sφcϑsψ+cφcψsφsϑ−sϑcψsϑsψcϑ]R(\boldsymbol\phi)=R_z(\varphi),R_{y'}(\vartheta),R_{z''}(\psi) =\begin{bmatrix} c_\varphi c_\vartheta c_\psi-s_\varphi s_\psi & -c_\varphi c_\vartheta s_\psi-s_\varphi c_\psi & c_\varphi s_\vartheta\ s_\varphi c_\vartheta c_\psi+c_\varphi s_\psi & -s_\varphi c_\vartheta s_\psi+c_\varphi c_\psi & s_\varphi s_\vartheta\ -s_\vartheta c_\psi & s_\vartheta s_\psi & c_\vartheta \end{bmatrix}

(原书式 2.18)。正解就是代入三个角、算出矩阵的 9 个量——录播 0:10:20 老师演示:「给你 (40°,20°,⋅)(40°,20°,\cdot) 的 ZYZ 角,代进这个矩阵就能算出旋转矩阵」。这条正向通道正是后续逆运动学的基础。

2.4.3 编外数值分析:为什么用 Atan2,不用 arccos(课堂补充)

反解(见下一小节)需要从三角函数值还原角度。最省事的选择似乎是 cϑ=r33⇒ϑ=arccos⁡r33c_\vartheta=r_{33}\Rightarrow\vartheta=\arccos r_{33}(录播 0:11:22–0:11:56 老师先给出这条「简单做法」),但他随后当场否决:

原理 2.4.A · 反三角函数选用准则(课堂补充整理)

不用 arccos⁡\arccos/arcsin⁡\arcsin,原因有两个:

  1. 不唯一:arccos⁡\arccos 只在 [0,π][0,\pi] 取值,无法覆盖 (−π,π](-\pi,\pi] 内的完整角度;
  2. 精度不均匀:对 y=f(x)y=f(x) 有增量公式 Δy≈f′(x)Δx\Delta y\approx f'(x)\Delta x,可见反解误差不仅取决于输入误差 Δx\Delta x,还要被 f′(x)f'(x) 放大。而

(arccos⁡x)′=−11−x2∈(−∞,−1],x∈(−1,1),(\arccos x)'=-\frac{1}{\sqrt{1-x^2}}\in(-\infty,-1],\qquad x\in(-1,1),

在 x→±1x\to\pm1(即角度接近 00 或 π\pi)处导数无界,微小输入误差被无限放大;相比之下

(arctan⁡x)′=11+x2∈(0,1],x∈(−∞,∞),(\arctan x)'=\frac{1}{1+x^2}\in(0,1],\qquad x\in(-\infty,\infty),

导数处处有界且不超过 1,因此输入误差不会被放大。结论:从保证精度看,用反正切(反余切)类比用反正弦(反余弦)类更好。

把原理 2.4.A 的两条理由画成曲线,就是下面这张图:横轴是反解时要「读数」的那个量 xx(这里即 r33=cϑr_{33}=c_\vartheta),纵轴是输入误差被放大的倍数 ∣f′(x)∣|f'(x)|——红曲线在 x→±1x\to\pm1 处冲天,绿曲线则处处不超过 1。

arccos 与 arctan 的误差放大率对比 横轴 x 从负 1 到正 1,纵轴为反函数导数的绝对值。红色虚线是 arccos 的导数 1 除以根号下 1 减 x 平方,在两端趋于无穷;绿色实线是 arctan 的导数 1 除以 1 加 x 平方,处处不超过 1,在 x 等于 0 处取最大值 1。 为什么反解一律 Atan2:两种反函数的误差放大率 |f′(x)| |f′(x)| x −1 −0.5 0 0.5 +1 1 arctan 的导数 ≤ 1:误差不被放大 |arccos′| = 1/√(1−x²) → ∞ x → ±1(ϑ → 0 或 π)时微小误差被无限放大 |arctan′| = 1/(1+x²) ≤ 1 横轴的 x 就是反解读的 r33 = cos ϑ:ϑ → 0 或 π 时 x → ±1,arccos 路线崩溃——双变量 Atan2 同时解决象限与精度(原理 2.4.A)
反解误差放大率的几何(本教程绘):对 y=f(x)y=f(x) 有 Δy≈f′(x)Δx\Delta y\approx f'(x)\Delta x——arccos 的导数在 x→±1x\to\pm1(即 ϑ→0,π\vartheta\to0,\pi)处无界,输入端一点噪声输出端就爆炸;arctan 的导数处处 ≤1\le1。这也是数值实验里 ∣sin⁡ϑ∣≤10−2|\sin\vartheta|\le10^{-2} 的组别偏差放大 10510^5 倍的根源(见 作业二 易错点)。

最后一步补齐「唯一性」:改用双变量反正切

φ=Atan2⁡(y,x),\varphi=\operatorname{Atan2}(y,x),

它计算 y/xy/x 的反正切,但用 x,yx,y 各自的符号判定象限,从而在 (−π,π](-\pi,\pi] 内唯一确定角度(MATLAB / Python 的 atan2 即返回该区间)。录播 0:15:11 老师提醒:MATLAB 等工具里这个函数就是 atan2,后续章节「求角度更多用到它」——它是全书反解角度的标准动作。

2.4.4 ZYZ 角的逆解

已知 R=[rij]3×3R=[r_{ij}]_{3\times3},与式 2.18 对比即可反求 (φ,ϑ,ψ)(\varphi,\vartheta,\psi)。策略是挑出能暴露单个角度的元素(录播 0:15:55–0:17:44 老师现场带推导:「这前四个太长不好求,比较好求的就是第三列这一排」):

求解分三步走:① 第三列的 [1,3][1,3]、[2,3][2,3] 只含 φ,ϑ\varphi,\vartheta(r23=sφsϑ, r13=cφsϑr_{23}=s_\varphi s_\vartheta,\ r_{13}=c_\varphi s_\vartheta),由此定出 φ\varphi;② 用平方和消去 φ\varphi,再配合 [3,3]=cϑ[3,3]=c_\vartheta 定出 ϑ\vartheta(取 sϑ>0s_\vartheta>0 即 ϑ∈(0,π)\vartheta\in(0,\pi));③ 最后用 [3,1][3,1]、[3,2][3,2] 定出 ψ\psi。以下设 sϑ≠0s_\vartheta\ne0(即 r13,r23r_{13},r_{23} 不全为零;sϑ=0s_\vartheta=0 的退化情形见下方定理 2.4.B)。第一支解为(原书式 2.19)

φ=Atan2⁡(r23,r13),ϑ=Atan2⁡ ⁣(r132+r232, r33),ψ=Atan2⁡(r32,−r31);\varphi=\operatorname{Atan2}(r_{23},r_{13}),\qquad \vartheta=\operatorname{Atan2}!\big(\sqrt{r_{13}^2+r_{23}^2},\ r_{33}\big),\qquad \psi=\operatorname{Atan2}(r_{32},-r_{31});

若在 (−π,0)(-\pi,0) 中选 ϑ\vartheta,则得到效果相同的第二支(原书式 2.20)

φ=Atan2⁡(−r23,−r13),ϑ=Atan2⁡ ⁣(−r132+r232, r33),ψ=Atan2⁡(−r32,r31).\varphi=\operatorname{Atan2}(-r_{23},-r_{13}),\qquad \vartheta=\operatorname{Atan2}!\big({-\sqrt{r_{13}^2+r_{23}^2}},\ r_{33}\big),\qquad \psi=\operatorname{Atan2}(-r_{32},r_{31}).

定理 2.4.B · ZYZ 的表示奇点

当 sϑ=0s_\vartheta=0(即 ϑ=0\vartheta=0 或 π\pi)时,式 2.19–2.20 发生退化:两次绕 zz 类轴的旋转实际上绕平行轴进行、效果合并,于是只能确定 φ±ψ\varphi\pm\psi 的和或差,无法把二者分离(原书;习题 2.2、本编习题 B3)。这种退化在后续章节里就是欧拉角表示奇点。

ZYZ 右乘(绕当前轴)与 RPY 左乘(绕固定轴)的对偶 上排 ZYZ:坐标架在每一步之后都改变朝向,旋转轴随之改变;下排 RPY:三个坐标架完全相同,旋转轴始终取自同一组固定轴。 ZYZ · 绕当前轴 · 右乘 坐标架每转一次就换一副轴 —— 轴是「动」的 轴 z 绕 z 转 φ 轴 y′(出纸面) 绕 y′ 转 ϑ 轴 z″ 绕 z″ 转 ψ R = Rz(φ) · Ry′(ϑ) · Rz″(ψ) 新因子往右追加 → 右乘 轴随转动而变(动系) RPY · 绕固定轴 · 左乘 三副坐标架完全一样 —— 轴是「定」的 先绕 z 转 φ 再绕 y 转 ϑ 最后绕 x 转 ψ
同一个乘积 Rz(φ)Ry(ϑ)Rx(ψ)R_z(\varphi)R_y(\vartheta)R_x(\psi) 有两种读法(本教程绘):「按 XYZ 顺序绕固定轴转」与「按 ZYX 顺序绕当前轴转」等价——这就是左乘 / 右乘对偶。上排 ZYZ 的坐标架每转一次就换一副轴(高亮轴依次为 zz、y′y'、z′′z''),新因子追加在右;下排 RPY 的三副坐标架完全相同(高亮轴依次为 zz、yy、xx,都取自初始系),新因子前插在左。记不清方向时把序列复述成中文即可判断:「在转完的基础上再绕它的 y′y' 转」= 右乘。

正解、逆解与奇点,可以在这个操作台里一次拖个明白(下图):滑杆做正解(三步当前轴转动,坐标架实时演化),读数区做逆解(从第三列用式 2.19 反解 φ′、ψ′——正常位形下应与滑杆一致);把 ϑ 拖到 0 或 180°,就能看到 定理 2.4.B 的奇点如何发生。

ZYZ 欧拉角操作台 拖动 φ、ϑ、ψ 三个滑杆,观察绕当前轴的三次转动如何合成姿态;ϑ 接近 0 或 180 度时 z 轴与 z″ 轴共线,φ 与 ψ 不可分离,即欧拉角表示奇点。 x0 y0 z0 ZYZ 欧拉角操作台:三步全绕当前轴 → 依次右乘 第三列 (r13, r23, r33) = + 反解 φ′ = Atan2(r23, r13) = + 反解 ψ′ = Atan2(r32, −r31) = + sϑ = + 灰 = 参考系 x0y0z0;实线三色 = 末架 x‴y‴z‴ 绿虚 = 第 2 转轴 y′(Rz(φ) 转出来);金虚 = 第 3 转轴 z″ 试一试:ϑ = 0 时金虚轴与灰色 z0 重合—— φ 与 ψ 的贡献合并,只剩和(或差)可定
ZYZ 欧拉角操作台(本教程绘):滑杆是正解(式 2.18 的三次右乘,坐标架逐步演化),读数区是逆解(式 2.19:第三列暴露 φ\varphi 与 ϑ\vartheta,第三行暴露 ψ\psi)——正常位形下反解角应与滑杆一致,这本身就是「正逆互检」。ϑ 拖到 0 或 180° 即 定理 2.4.B 的表示奇点:z0z_0 与 z′′z'' 共线,第三列失去信息,φ\varphi 与 ψ\psi 只剩和 / 差可定。

2.4.5 RPY 角:绕固定轴的左乘序列

航空航海领域描述飞行器姿态,习惯用 ZYX 角,也就是滚转(roll)—俯仰(pitch)—偏航(yaw)角。三个角 ϕ=[φ  ϑ  ψ]T\boldsymbol\phi=[\varphi\ \ \vartheta\ \ \psi]^T 相对固定于飞行器质心的参考系定义(原书图 2.9):绕固定 zz 轴转 φ\varphi(偏航)、绕固定 yy 轴转 ϑ\vartheta(俯仰)、绕固定 xx 轴转 ψ\psi(滚转)。全程绕固定轴,因此按 原理 2.3.B 左乘:

R(ϕ)=Rz(φ) Ry(ϑ) Rx(ψ)=[cφcϑcφsϑsψ−sφcψcφsϑcψ+sφsψsφcϑsφsϑsψ+cφcψsφsϑcψ−cφsψ−sϑcϑsψcϑcψ]R(\boldsymbol\phi)=R_z(\varphi),R_y(\vartheta),R_x(\psi) =\begin{bmatrix} c_\varphi c_\vartheta & c_\varphi s_\vartheta s_\psi-s_\varphi c_\psi & c_\varphi s_\vartheta c_\psi+s_\varphi s_\psi\ s_\varphi c_\vartheta & s_\varphi s_\vartheta s_\psi+c_\varphi c_\psi & s_\varphi s_\vartheta c_\psi-c_\varphi s_\psi\ -s_\vartheta & c_\vartheta s_\psi & c_\vartheta c_\psi \end{bmatrix}

(原书式 2.21;英文原版与课件此页角名均标反,见勘误 E2.1)。

译注 · 两条等价说法(原书脚注)

「按 XYZ 顺序绕固定坐标系轴的旋转序列」与「按 ZYX 顺序绕当前坐标系轴的旋转序列」等价——左乘 / 右乘对偶(原理 2.3.A、原理 2.3.B)的直接推论。

逆解与 ZYZ 同法(原书式 2.22–2.23):ϑ∈(−π/2,π/2)\vartheta\in(-\pi/2,\pi/2) 时

φ=Atan2⁡(r21,r11),ϑ=Atan2⁡ ⁣(−r31,r112+r212),ψ=Atan2⁡(r32,r33);\varphi=\operatorname{Atan2}(r_{21},r_{11}),\qquad \vartheta=\operatorname{Atan2}!\Big(-r_{31},\sqrt{r_{11}^2+r_{21}^2}\Big),\qquad \psi=\operatorname{Atan2}(r_{32},r_{33});

(ϑ\vartheta 一式中 r112+r212\sqrt{r_{11}^2+r_{21}^2} 与原书 (2.22) 的 r322+r332\sqrt{r_{32}^2+r_{33}^2} 数值相同——二者都等于 ∣cϑ∣|c_\vartheta|,本式改用第一、二行元素,便于与 φ\varphi 的宗量保持同源。)ϑ∈(π/2,3π/2)\vartheta\in(\pi/2,3\pi/2) 时取等价的第二支(各宗量整体变号)。cϑ=0c_\vartheta=0 时同样退化:只能确定 φ\varphi 与 ψ\psi 的和或差——这就是 RPY 的表示奇点。

例 2.4.C · 无人机姿态控制的日常视角(新增)

录播 0:18:52–0:21:53:无人机动力学模型里用的正是这个矩阵(「你后面如果做无人机控制,动力学模型里就有这个矩阵」);但 RPY 在俯仰角 ±90°\pm90° 处会碰上奇点,卫星等需要全姿态机动的平台因此改用四元数(录播 0:21:26,见下框;例 2.4.C)。

课程预告 · 单位四元数(原书 §2.6,课程略)

单位四元数 Q={η,ϵ}Q=\{\eta,\boldsymbol\epsilon\} 用 4 个参数(满足 1 个模长约束)表示姿态:η=cos⁡(ϑ/2)\eta=\cos(\vartheta/2)、ϵ=sin⁡(ϑ/2)r\boldsymbol\epsilon=\sin(\vartheta/2)\boldsymbol r。半角打包使角和轴的 (ϑ,r)∼(−ϑ,−r)(\vartheta,\boldsymbol r)\sim(-\vartheta,-\boldsymbol r) 不唯一性消失,逆解也无 sϑ=0s_\vartheta=0 型奇点;逆与乘法有简洁的代数规则(原书式 2.36–2.37)。课程只点到「卫星姿态用四元数」这一应用背景,公式不考;需要时可按本框线索自查原书。

动手实验 · ZYZ 与 RPY 是同一件事的两种读法

下面这个操作台把 2.4.2–2.4.5 的两套公式并排放在一起:拖动 φ、ϑ、ψ,先按当前约定合成 RR,再把同一个 RR 交给另一种约定的逆解公式反算角度。换约定不改变姿态,只改变「是哪三个角」;两套角在各自的奇点附近还会互相失效——这正是 定理 2.4.B 与 RPY 万向节锁定。

默写点 · 合上书再写(主动回忆)

不看正文与速查卡,先写出下面几条,再展开核对。写不出来,就说明这一节还没「拿走」。

  1. 默写 ZYZ 逆解的第一支三式(用 rijr_{ij} 与 Atan2)。
  2. 为什么反解不用 arccos⁡\arccos?说出两个理由。
  3. ZYZ 与 RPY 的奇点各在什么条件?
核对

φ=Atan2⁡(r23,r13)\varphi=\operatorname{Atan2}(r_{23},r_{13})、ϑ=Atan2⁡(r132+r232,r33)\vartheta=\operatorname{Atan2}(\sqrt{r_{13}^2+r_{23}^2},r_{33})、ψ=Atan2⁡(r32,−r31)\psi=\operatorname{Atan2}(r_{32},-r_{31})。第二支三个宗量整体变号。

① 不唯一:arccos⁡\arccos 值域只有 [0,π][0,\pi];② 精度不均匀:(arccos⁡x)′=−1/1−x2(\arccos x)'=-1/\sqrt{1-x^2} 在 x→±1x\to\pm1 处无界,微小输入误差被无限放大;而 (arctan⁡x)′=1/(1+x2)≤1(\arctan x)'=1/(1+x^2)\le1 处处有界。

ZYZ 在 sϑ=0s_\vartheta=0(ϑ=0,π\vartheta=0,\pi);RPY 在 cϑ=0c_\vartheta=0(俯仰 ±90°\pm90°)。

2.4 小结与常见错误

  • 一条主线:9 量 6 约束 → 3 参数 → 27 组合砍到 12 → ZYZ(右乘)/ RPY(左乘)→ 正解代入、逆解挑元素 + Atan2 → 奇点 sϑ=0s_\vartheta=0 / cϑ=0c_\vartheta=0。
  • 口诀:逆解「挑只含单角的元素,先 φ\varphi 后 ϑ\vartheta 再 ψ\psi」;Atan2 在 (−π,π](-\pi,\pi] 唯一化角度。
常见错误清单 · 自查四条
  1. 用 arccos⁡\arccos 反解角度——精度在 x→±1x\to\pm1 处崩溃且不唯一(原理 2.4.A);凡反解一律 Atan2;
  2. 忘记 ZYZ / RPY 各有两支解——式 2.19/2.20、2.22/2.23 效果等价但角度值不同,编程时须固定取值区间;
  3. 把 RPY 的「滚转」配给绕 zz 的角——滚转(roll)绕纵轴 xx,偏航(yaw)绕竖轴 zz(英文原书与课件此页标签均反,勘误 E2.1);
  4. 在 sϑ=0s_\vartheta=0 附近强行分离 φ,ψ\varphi,\psi——数据上表现为两个角剧烈跳变,这是表示奇点,不是物理抖动。