首页 > 其他分享 >【转载】如何通俗地解释欧拉角?之后为何要引入四元数?

【转载】如何通俗地解释欧拉角?之后为何要引入四元数?

时间:2023-08-25 14:36:12浏览次数:45  
标签:欧拉角 万向节 旋转 四元 死锁 船体 通俗 偏航

转载自:https://www.zhihu.com/tardis/bd/ans/236284413?source_id=1001

  

 

为何要引入四元数?首先是因为欧拉角有万向节死锁的问题。

3D游戏或者3D电影中,比如黑客帝国中酷炫的旋转是怎么实现的?

旋转的算法有很多,这里主要介绍其中一种:欧拉角。

1 欧拉角

1.1 欧拉角的算法思想是什么

陌生的你来到了成都,站在盐市口茫然四顾,想知道春熙路怎么走?

这个时候你选择了去问路,得到了两种回答:

  • 往东经104°04′、北纬30°40′走
  • 右转后一直走

第一种回答,告诉了你春熙路的绝对坐标,可是很反人类啊!

第二种回答,告诉了你春熙路的相对坐标,很具有操作性。

欧拉角算法的思想就是采用的第二种回答的方式,优点在于很好理解。

1.2 具体实现步骤

维基百科 中,有这么一副动图,清楚的表明了如何通过欧拉角来完成旋转:

具体来拆解下旋转步骤,先看图:

图中有两组坐标:

  • xyz 为全局坐标,保持不动
  • XYZ 为局部坐标,随着物体一起运动

旋转步骤如下:

  • 物体绕全局的 z 轴旋转 \alpha  角
  • 继续绕自己的 X 轴(也就是图中的 N 轴)旋转 \beta  角
  • 最后绕自己的 Z 轴旋转 \gamma  角

这里有一副动图很直观的展示了旋转过程(角度标记的有点不一样: \psi  对应 \alpha  , \theta  对应 \beta  , \phi  对应 \gamma  ),图来自gfycat

可能你感到奇怪,为什么第一步是绕着全局坐标旋转?因为要和世界保持联系,否则就和世界完全没有关系了。

还不理解?没有关系,自己动手试试(有三个可以操作的点,分别对应三个角度):

很显然,按照不同的旋转步骤,旋转的结果是不一样的。

就好比刚才问路的时候,回答你,“左转再右转”,和“右转再左转”,肯定到达的地点是不一样的。

我们需要把上面的旋转步骤按照顺序标记为 zXZ ,加上角度就是一个完整的欧拉角:

zXZ-(\alpha , \beta , \gamma )

2 万向节死锁(Gimbal Lock)

局部坐标是很直观,但是导致欧拉角有一个重大缺陷,万向节死锁!

本节大部分参考了博文: 欧拉角与万向节死锁(图文版) ,博主: andrewfan 。

2.1 什么是万向节(Gimbal)

平衡环架(英语:Gimbal)为一具有枢纽的装置,使得一物体能以单一轴旋转。由彼此垂直的枢纽轴所组成的一组三只平衡环架,则可使架在最内的环架的物体维持旋转轴不变,而应用在船上的陀螺仪、罗盘、饮料杯架等用途上,而不受船体因波浪上下震动、船身转向的影响。

----维基百科

长这个样子:

中间有一根竖轴,穿过一个金属圆盘。金属圆盘称为转子,竖轴称为旋转轴。转子用金属制成,应该是了增加质量,从而增大惯性。竖轴外侧是三层嵌套的圆环,它们互相交叉,带来了三个方向自由度的旋转。

看着不停转来转去,有点晕,接下来看下静态的。图来自百度百科:

2.2 欧拉角与万向节

其实欧拉角的工作方式与万向节几乎一样。

看几幅动图就知道(图来自 Euler Angle Class )。

这个旋转叫pitch,中文是俯仰:

这个旋转叫Yaw,中文叫偏航:

这个旋转叫Roll,中文叫桶滚:

可以看出,确实工作方式和万向节一样。

2.3 死锁的产生

为了解释清楚问题,画了一个简单的万向节示意图(金属圆盘就省略了,丑点儿也就别管了):

把三个Gimbal环用不同的颜色做了标记,底部三个轴向,RGB分别对应 XYZ 。

假设现在这个万向节被放在一艘船上,船头的方向沿着+Z轴,也就是右前方。

2.3.1 桶滚

现在假设,船体发生了摇晃,是沿着前方进行旋转的摇晃,也就是桶滚。由于转子和旋转轴具有较大的惯性,只要没有直接施加扭矩,就会保持原有的姿态。由于上图中绿色的活动的连接头处是可以灵活转动的,此时将发生相对旋转,从而出现以下的情形:

2.3.2 俯仰

再次假设,船体发生了pitch摇晃,也就是俯仰。同样,由于存在相应方向的可以相对旋转的连接头(红色连接头),转子和旋转轴将仍然保持平衡,如下图:

2.3.3 偏航

最后假设,船体发生了yaw摇晃,也就是偏航,此时船体在发生水平旋转。相对旋转发生在蓝色连接头。如下图:

最终,在船体发生Pitch、Yaw、Roll的情况下,万向节都可以通过自身的调节,而让转子和旋转轴保持平衡。

2.3.4 死锁

现在看起来,这个万向节一切正常,在船体发生任意方向摇晃都可以通过自身调节来应对。然而,真的是这样吗?

假如,船体发生了剧烈的变化,此时船首仰起了90度(这是要翻船的节奏。。。。),此时的陀螺仪调节状态如下图:

此时,船体再次发生转动,沿着当前世界坐标的+Z轴(蓝色轴,应该正指向船底)进行转动,那么来看看发生了什么情况:

现在,转子不平衡了,万向节的三板斧不起作用了。它失去了自身的调节能力。那么这是为什么呢?

之前万向节之所以能通过自身调节,保持平衡,是因为存在可以相对旋转的连接头。在这种情况下,已经不存在可以相对旋转的连接头了。

那么连接头呢?去了哪里?显然,它还是在那里,只不过从上图中,我们清楚地看到:

  • 红色连接头:可以给予一个相对俯仰的自由度。
  • 绿色连接头:可以给予一个相对偏航的自由度。
  • 蓝色连接头:可以给予一个相对偏航的自由度。

没错,三个连接头,提供的自由度只对应了俯仰和偏航两个自由度,桶滚自由度丢失了。

我们可以回头去试试之前的 操作页面 ,在下面这样子的情况下其实就是死锁了:

 

4 总结

在编程中很难规避死锁问题,所以现在很多时候都使用四元数实现旋转,四元数那又是另外的话题了。

标签:欧拉角,万向节,旋转,四元,死锁,船体,通俗,偏航
From: https://www.cnblogs.com/yansink/p/17656828.html

相关文章

  • 零基础学Android,通俗易懂的Android教程
    前言对于一个想要入门Android的新手同学来说最重要的就是找对入门的学习路线,那样可以少走很多弯路,今天,小编就来和大家唠唠Android入门的学习方法。首先,一定要有一定的JAVA基础。我们都知道AndroidSDK是基于JAVA开发的,也是用的JAVA语言,比如在Android中要使用到的接口、继承、覆盖......
  • 旋转矩阵与欧拉角
    旋转矩阵与欧拉角参考文献:[ComputingEuleranglesfromarotationmatrix——GregoryG.Slabaugh]三个主轴的旋转矩阵右手坐标系,逆时针转动角度为正(右手螺旋定则确定)。关于绕\(x\)轴旋转\(\psi\)弧度的主动旋转定义为\[R_x(\psi)=\begin{bmatrix}......
  • 《高级程序员 面试攻略 》go抢占式调度 通俗拟人解释
    当我们谈论Go语言的抢占式调度时,可以使用一个通俗的拟人解释来描述它的工作原理。假设你正在组织一场音乐会,有许多音乐家需要在舞台上演奏乐器。你作为指挥,负责协调他们的演奏。每个音乐家都是一个Goroutine(Go协程),而你是调度器(Scheduler)。在开始音乐会之前,你将每个音乐家的......
  • 《高级程序员 面试攻略 》通俗拟人解释 swoole的协程 和 go的协程有什么区别
    Swoole的协程和Go的协程(Goroutine)都是用于实现轻量级并发的机制,但它们有一些区别。1.语言和环境:Swoole协程是在PHP语言中实现的,而Go协程是在Go语言中实现的。因此,它们在语言和运行时环境上存在差异。1.编程模型:Swoole协程使用的是“同步风格”的编程模型,类似于传统......
  • Python PIL Image.crop()详解+裁剪四元组定位的小技巧
    0Image.crop详解image.crop是Python中用于裁剪图片的函数。在使用该函数前,我们需要先导入PIL库,即PythonImageLibrary。fromPILimportImage#打开图片img=Image.open('example.jpg')#图片的裁剪区域(区域左上角的坐标为(100,100),右下角的坐标为(300,300))crop_are......
  • Linux 配置Node环境变量[通俗易懂]
    大家好,又见面了,我是你们的朋友全栈君。修改/etc/profile文件,在末尾添加以下内容exportNODE_HOME=/usr/local/node//Node所在路径exportPATH=$NODE_HOME/bin:$PATH复制修改完成后需要重新登陆才能生效,也可以执行命令source/etc/profile或者./etc/profile来生效(注意......
  • 通俗理解OSI七层模型
    OSI七层模型国际标准化组织(InternationalStandardOrganization,ISO)于1984年颁布了开放系统互连(OpenSystemInterconnection,OSI)参考模型OSI参考模型是一个开放式体系结构,它规定将网络分为七层,从下往上依次是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层ISO制订的......
  • 7.7 通俗易懂详解稠密连接网络DenseNet & 手撕稠密连接网络DenseNet
    一.思想与ResNet的区别DenseNet这样拼接有什么好处?DenseNet优点对于每一层,使用前面所有层的特征映射作为输入,并且其自身的特征映射作为所有后续层的输入。DenseNet的优点:缓解了消失梯度问题,加强了特征传播,鼓励特征重用,并大大减少了参数的数量,改进了整个网络的信息流和梯度,这使得......
  • 7.6 通俗易懂解读残差网络ResNet & 手撕ResNet
    一.举例通俗解释ResNet思想假设你正在学习如何骑自行车,并且想要骑到一个遥远的目的地。你可以选择直接骑到目的地,也可以选择在途中设置几个“中转站”,每个中转站都会告诉你如何朝着目的地前进。在传统的神经网络中,就好比只能选择直接骑到目的地。当你的目的地很远时,可能会出现骑不......
  • 系统理解PID控制,这篇文章就够了,通俗易懂!
    在我们实际工作经常会用到PID控制系统,但是对这个PID到底是什么?该如何调节,我们相信大家都比较头痛。但是今天,我们就用大白话的方式给大家讲讲PID。一、PID应用场景其实不管是在自动化行业还是在生活中,我们都或多或少都会接触PID。比如空调系统、定速巡航系统、恒压供水系......