四元数和欧拉角的比较

48

你好
“四元数”和“欧拉角”方法各有什么优点缺点
- 哪个更快
- 哪个需要更少的计算量
- 哪个更准确(在舍入误差方面)?


2
个人而言,我更喜欢使用矩阵。 - David Heffernan
我自己找到了这个链接:http://biomch-l.isbweb.org/threads/11415-Summary-Quaternions-vs.-Euler-angles,但它有些晦涩。 - mrbm
@David 四元数表示为矩阵。 - Ross
谢谢大家,哪一个更准确(四舍五入误差)?我认为四元数更快更准确,那么为什么有人会使用欧拉角呢? - mrbm
2
@mrbm 可能是。但不要让它的“三维复数”解释让你感到困惑。就按原样处理吧。除了乘以正弦和余弦之外,它只是旋转轴和角度的另一种表示方式,但以更高效的方式(通过编码的正弦/余弦)来促进快速乘法和矩阵转换。 - Christian Rau
显示剩余4条评论
6个回答

39

欧拉角更容易被人理解,也适合将旋转分解为独立自由度(例如运动关节等),但缺点是存在歧义和万向节锁定。在实践中,我更喜欢四元数,因为它们更容易计算(对于计算机而言,不是对于人类)且更高效。旋转欧拉角需要进行三次旋转并将它们相乘,而四元数只需要进行一次旋转,并且已经编码了正弦和余弦,所以从四元数到矩阵的转换非常高效。


16

谢谢您提供的链接,看起来很有用,我会去看看的。 - mrbm
我可以确认这一点。在分子物理模拟中使用四元数,万向锁是使用它们的主要原因。这使得一个数值问题变少了。 - Ross

11

从Christian Rau的回答中进一步扩展一下:

Euler角度规范存在歧义:哪个角度应用于哪个轴?使用约定(偏航、俯仰、翻滚)的代码将无法与假定(翻滚、俯仰、偏航)的代码互操作,并且从代码中看不出使用了哪种解释。

四元数不会受到这种歧义的影响,因为它们只表示单个旋转,具有明确定义的轴。


4
我也是指模棱两可的情况,即不同角度三元组(同一约定)可能指向相同的旋转。 - Christian Rau
2
这不需要极端的万向节锁定情况,每个旋转都可以用多个欧拉角三元组来表示,即使是在同一约定下。 - Christian Rau

7

正如其他答案指出的那样,四元数在许多方面都比欧拉角有优势。但是,欧拉角确实比四元数具有一个优点:

欧拉角可以告诉您旋转的方向和大小。当您将欧拉角转换为四元数时,该信息就丢失了。例如,欧拉旋转(-270°,0,0)和(1170°,0,0)产生相同的四元数(-0.7071,0,0,-0.7071)。


2
是的,基本上没有人知道这个。为了防止信息丢失,内部应始终将方向值存储为欧拉角。只有在进行其他计算时才暂时将该值转换为四元数。如果您需要从方向中获取偏航的大小,并且您只在内存中存储了四元数,请放弃...那些信息永远失去了。这是一个明显的好处。 - Brian Yeh
这是非常情境化的优势。如果你有一个应用程序,需要跟踪绕轴旋转的次数(例如由于缠绕数等原因),那么你可能不会使用欧拉角来处理这个问题。 - Blackclaws
@Blackclaws 这可能是真的,但你仍然需要使用其他东西而不是四元数。否则,你将面临与尝试从视频镜头中确定RPM相同的问题 - 一旦你在一个帧中旋转超过半个旋转,就无法再告诉它的方向或速度了(假设快门速度为无限)。 - Fax
@Blackclaws 这可能是真的,但你仍然需要使用其他方法来解决这个问题,而不是四元数。否则,当你在一个帧中旋转超过半圈时,就无法确定旋转方向和速度了(假设快门速度无限)。 - Fax

3
欧拉角比四元数更好。您应该始终将欧拉角存储在内存中,仅在计算时使用四元数。虽然没有人知道这一点,但我说的是绝对正确的。如果您正在观望,请注意这很重要。听我说完。
原因是您始终可以轻松地从欧拉角导出四元数。转换是微不足道的。但是从四元数到欧拉角的转换基本上是有问题的。对于每个四元数都有两个可能的欧拉角,您无法知道您的四元数来自哪个可能性。
对于虚拟世界和3D游戏,您始终可以使用四元数。这是因为您的计算机可以在朝向位置上绘制对象的图像,而无需实际扭动和俯仰物理万向节以实现该朝向。但是对于机器人和其他真实世界的应用程序,在转换为四元数时会出现真正的信息丢失。
如果您有一个真正的物理万向节,并且您得到了表示该万向节方向的四元数,则除非该万向节在某个运动范围内受限制,否则您绝对无法提取出万向节用于实现该方向的原始偏航、滚动或俯仰。
记住这一点。如果您在机器人或某些机械设置中,请将方向值保存为原始欧拉角。仅在计算时暂时转换为四元数。
一旦转换为四元数,基本上没有回到欧拉的返回之旅。因此,不要将该旅程变成永久性的,将所有信息都存储为欧拉角。

1
虽然我认为你的回答很有用且信息量大,但我仍然不认为这使得欧拉角比四元数“更好”。如果说有什么区别的话,我会说欧拉角在某些情况下确实有其用处,而且在某些场景下可能会更好。即使在机器人领域,你也可以不使用它们,唯一需要使用它们的地方就是在控制物理万向节时,正如你所提到的那样。 - Trap
@Trap 我应该说欧拉角更适合存储或数据传输。在计算和变换时暂时转换为四元数,但对于数据存储,请将其保留为欧拉角。 - Brian Yeh
@BrianYeh说转换很简单并不完全正确。在计算中涉及4个余弦和一个正弦,根据您的用例,这可能需要相当长的时间来计算,特别是如果您经常需要这样做。然而,在只有3个关节的单个机器人的用例中,这可能并不重要。 - Blackclaws
@Blackclaws,实际上我在一年后回到这个问题。欧拉角的官方定义故意将俯仰角限制在-180到180之间,以防止出现这个问题。这意味着只有一个欧拉角代表一个方向。从欧拉角的官方定义来看,我的说法是错误的。但是,如果你的机器人关节超过了欧拉角官方定义所施加的人为限制,那么这个问题仍然存在。是的,我也明白你的意思。 - Brian Yeh

0

Euler角度更快。

Euler角度需要更少的计算工作。

四元数绝对更准确。

在Euler角度中存在一个称为万向节锁定的问题。当两个轴对齐时会发生这种情况。 另一方面,四元数更加灵活,并解决了这个问题,因为它更加面向轴。然而,理解起来比较复杂。

好吧,为了更容易理解四元数。让我们将四个组件分成两个部分:一个角度和与轴原点相连的x、y、z点,称为P。 (x,y,z)-P线表示一个新的轴。 角度表示轴和真实方向之间的角度。 要想可视化这个答案,您需要查看这个5分钟的视频。 https://eater.net/quaternions/video/intro


很不幸,这是非常误导人的。在大多数情况下,欧拉角并不更快。 - Blackclaws

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接