最近学路径规划,忘记了万向死锁的原因(也可能本身就懵懵懂懂),我看网上大量关于俯仰角旋转90°导致“x轴与z轴重合”的说法。我对此表示不理解,首先欧拉角旋转包括固定轴和变动轴,无论绕什么轴旋转,都不应该出现所谓的“轴重合”的这种反直觉的说法。

一、数学公式的角度分析

万向死锁的本质,可以从旋转矩阵的数学结构来理解。设物体依次绕 Z 轴、Y 轴、X 轴旋转,对应的欧拉角为 α(偏航角)、β(俯仰角)、γ(滚转角),则总的旋转矩阵为:

R = Rz(α) · Ry(β) · Rx(γ)

其中各基本旋转矩阵为:

Rz(α) = [cosα  -sinα  0]
         [sinα   cosα  0]
         [  0      0    1]

Ry(β) = [cosβ   0   sinβ]
         [  0    1     0 ]
         [-sinβ  0   cosβ]

Rx(γ) = [1    0      0  ]
         [0  cosγ  -sinγ]
         [0  sinγ   cosγ]

将三者相乘,得到完整的旋转矩阵。当 β=90 时,cosβ=0sinβ=1,代入后矩阵会退化为:

R = [ 0   sin(γ-α)   cos(γ-α) ]
    [ 0   cos(γ-α)  -sin(γ-α) ]
    [ 1      0          0      ]

观察这个退化矩阵可以发现:矩阵中只出现了 γ - α 的差值组合,而 γα 各自单独的值不再独立出现。这意味着,无论 γα 分别取什么值,只要它们的差值相同,最终得到的旋转矩阵就完全相同。换句话说,在 β = 90° 时,滚转角和偏航角两个自由度合并成了一个自由度,系统丢失了一个旋转自由度,这就是万向死锁的数学本质,而非“两轴重合”。

从线性代数的角度看,旋转矩阵的秩从 3 降为 2,雅可比矩阵出现奇异,导致姿态解算时无法唯一反解出欧拉角。这也解释了为什么工程上常采用四元数或旋转矩阵来避免万向死锁——它们不存在这种参数奇异性。当然本文介绍的是ZYX特例,若为其他变换如ZXY等,那么绕X轴旋转的角度不应该为90(中间那个变量)。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐