欧拉角缺陷以及gimbal lock

本文详细阐述了欧拉角在刚体旋转中的应用,通过数学推导证明了两种旋转方式的等效性,并揭示了旋转过程中遇到的万向轴死锁现象。进一步探讨了死锁的成因及其对实际应用的影响,以及如何通过引入四元数解决维度丢失问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一节说到欧拉角,欧拉角的定义如下

对于任何一个参考系,一个刚体的取向,是依照顺序,从这参考系,做三个欧拉角的旋转而设定的。所以,刚体的取向可以用三个基本旋转矩阵来决定。换句话说,任何关于刚体旋转的旋转矩阵是由三个基本旋转矩阵复合而成的

如上图,我们想要将中心的小飞机旋转到任意姿态只需要沿着三个外框旋转三个指定的角度就可以得到

在旋转过程中,有两种旋转方式可以选择

1.绕坐标系E下的x轴旋转α,绕坐标系E下的y轴旋转β,绕坐标系E下的z轴旋转r,三个角度复合成为新的姿态

2.绕坐标系E下的x轴旋转α,绕 坐标系E在绕x轴旋转α后的新系E'下的y轴旋转β,绕 坐标系E'在绕y轴旋转β后的新系E''下的z轴旋转r,三个旋转角度的复合

通过数学计算我们可以得到这两种旋转方式的最终结果是完全等价的,证明过程如下

首先我们需要知道旋转角度实际上数学上是一个旋转矩阵

假设

绕坐标系E下的x轴旋转α的旋转矩阵为Rx,

绕坐标系E下的y轴旋转β的旋转矩阵为Ry,

绕坐标系E下的z轴旋转r的旋转矩阵为Rz,

假设

绕坐标系E下的z轴旋转r的旋转矩阵为RrRr=Rz),

绕坐标系E在绕z轴旋转r后的新系E'下的y轴旋转β的旋转矩阵为Rb

绕坐标系E'在绕y轴旋转β后的新系E''下的x轴旋转α的旋转矩阵为Ra

 

将矩阵R的逆记作R~

求证:Rx*Ry*Rz = Rr*Rb*Ra

证明:

Rr = Rz 定义就是一样的,显然相等

Rb = Rr~*Ry*Rr 要得到绕 坐标系E在绕z轴旋转r后的新系E'下的y轴旋转β的旋转矩阵为Rb,可以先应用Rr~这时可以视作在E下,然后使用E下的旋转Ry绕旧的y轴旋转,在应用Rr转回到E'

Ra = (Rr*Rb)~*Rx*(Rr*Rb) 理由同上

所以右边=Rr*Rb * Ra

        =Rr*Rb * (Rr*Rb)~*Rx*(Rr*Rb)

        =(Rr*Rb)* (Rr*Rb)~*Rx*(Rr*Rb)

        =Rx*(Rr*Rb)

        =Rx*(Rr*Rr~*Ry*Rr)

        =Rx*Ry*Rz =左边

我们现在采取第二种方式旋转


 
这是初始的姿态状态,我们现在县围绕绿色轴转三十度,在围绕红色轴旋转九十度,旋转到如下图所示的状态

此时,绿色轴和蓝色轴平行,这个时候,如果我们想将箭头指向面向我们的位置应该怎么转,按照最直接的转法(注意,我说的是最直接的转法),我们会发现我们缺失了一个轴,也就是下面这个轴

这个就叫做万向轴的死锁,英文名gimbal lock

并不是说我们不能转到目标状态,而是从上上图的状态到上图状态的旋转过程不能连续过度,我们需要先回退蓝色轴使蓝色轴去代替灰色轴,才能转到最终位置

数学上的定义是,需旋转过程中两轴平行,三轴系统缺失了一个维度,如果我们一定要旋转到目标位置,需要进行特殊处理,最后旋转的曲线如下所示

黄色曲线就是转动过程,转动过程被拖动成为了一个空间椭圆,而实际上我们理想的情况是红色轴的四分之一转轴,这个过程被拉长了,并不是连续空间转换。

如果这一段是一个动画的话,那么从AB的时间之前都是稳定的旋转,现在却被拖长了,动画的帧率就会被降低,闪烁,如果这是一个飞行器姿态,那么调整姿态AB的过程也就被拖长了,而且,这种情况还需要编程特殊处理,否则,这一条黄色曲线都没办法转出来

那么,为什么会造成这种情况呢?

现在我们将三维降低到二维中,

  假如我们有一个望远镜和一个用来放望远镜的三脚架,(我们将)三脚架放在地面上,使支撑望远镜的三脚架的顶部是平行于地平面(参考平面)的,以便使得竖向的旋转轴(记为x轴)是完全地垂直于地平面的。现在,我们就可以将望远镜饶x轴旋转360度,从而观察(以望远镜为中心的)水平包围圈的所有方向。通常将正北朝向方位角度记为0度方位角。第二个坐标轴,即平行于地平面的横向的坐标轴(记为y轴)使得望远镜可以饶着它上下旋转,通常将地平面朝向的仰角记为0度,这样,望远镜可以向上仰+90度指向天顶,或者向下-90度指向脚底

  我们要注意,此时的相机是一个悬浮状态,他没有底座,没有体积,就是一个矢量,也就是说,这个相机本身是没有指向的,因为如果相机有了指向,我们就有了第三条轴,方向轴,简单的理解,就是,相机不能围绕自身对称轴旋转

  好了,万事俱备。现在,天空中(包括地面上)的每个点只需要唯一的一对xy度数就可以确定。比如x=90,y=45度指向的点是位于正东方向的半天空上。

  现在,看看万向节死锁是怎么发生的。一次,我们探测到有一个飞行器贴地飞行,位于望远镜的正东方向(x=90度,y=10度),朝着我们直飞过来,我们跟踪它。飞行器飞行方向是保持x轴角度90度不变,而y向的角度在慢慢增大。随着飞行器的临近,y轴角增长的越来越快且当y向的角度达到90度时(即将超越),突然它急转弯朝南飞去。这时,我们发现我们不能将望远镜朝向南方,因为此时y向已经是90度,造成我们失去跟踪目标。这就是万向节死锁!

上面那段话比较难与理解,但是可以用手自己比划一番,理解的两个核心

1.      相机没有方向轴,不能自身围绕自身旋转

2.      坐标上,当飞机切换角度的那一瞬间,前面一刻XY为(90 90)后面一刻,XY为(189.9,89.9),而实际上我们按照这个坐标从0开始旋转是能旋转到的,但是在90 90的位置,我们需要的旋转是 89.9 -0.1,因为这个时候摄像机的机身以X轴平行了,所以这个89.9需要我们摄像机自己围绕自己旋转,但是前面已经说了,矢量不能围绕自身旋转(或者旋转也没意义,不懂这句话请重新看旋转矩阵相关知识!)!将90 90状态的摄像机旋转这样一个角度,我们会发现,根本就不是实际飞机的位置

综上所述,飞机实际上旋转的角度89.9,但是摄像头转不了,造成了失误

我们可以看到,坐标值的变化和飞行器空间的位置变化一一对应,但是从(x=90度,y=90度)到(x=180度,y=90度),再到(x=180度,y<90度)这个变化,飞行器位置是连续的变化,但坐标值的变化却不是连续的(从90突变到180),其原因在于(x=90度,y=90度)和(x=180度,y=90度)甚至和(x=任意度,y=90度)这些不同的坐标值对应空间同一个位置,这种多个坐标值对应同一个位置的不一致性是造成死锁的根源

在具体一点,大家知道地球上的南极点北极点,当我们处于这两个点的时候,经度对于我们是没有意义的,只有纬度有意义,我们可以在那个点同时符合地球上的所有经度,当我们选择一个经度踏出一步之后,对于我们而言,这一步的踏出,需要我们人体围绕自身旋转一定角度,这个时候,相当于人类在经纬度之外多出来了一个围绕自身旋转的方向轴,但是我们说过,摄像头没有方向轴,所以,他没有办法在那个点围绕自身旋转,也就是说,经度的变化摄像头无法跟随,那么当接下来纬度变化的时候,摄像头又会回到原来的经度而不是飞机当前的经度

所以,造成gimbal lock的核心原因是在空间中某些特定的点(旋转轴平行),原来的N维系统中的两维重合,使得数学上的空间维度下降了一个维度,最终导致无法跟随实际的空间变换

在欧拉角定位中,对于这种情况的出现都是要对算法进行特殊处理的,这个算法,叫做插补,也就是对于不能瞬间转化的特殊值,我们程序主动的矫正

为了彻底解决这种维度丢失的问题,数学家一劳永逸的思考,能不能在数学运算的时候,将三维演变成四维,那么即使丢失一个维度,也还是三维可以正常用,这引入的一个维度,之前已经说过,叫做虚数维,这种计算方法,叫做,四元数

 

下一章,将详解四元数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值