四元数和数值稳定性

时间:2014-04-18 01:43:08

标签: math rotation quaternions rotational-matrices numerical-stability

我正在学习单位四元数以及如何使用它们来表示和组合旋转。维基百科称它们在数值上比矩阵表示更稳定,但没有给出参考。任何人都可以向我解释(最好用一些数学推理)为什么使用单位四元数来处理旋转(例如对于OpenGL应用程序而不是旋转矩阵)在数值上更稳定?是不是因为避免了万向节锁?

5 个答案:

答案 0 :(得分:8)

维基百科的文章有偏见。来自

截至2014年4月18日:

  

在计算机上进行多次旋转时,舍入错误   必然积累。一个稍微偏离的四元数   表示标准化后的旋转:略微的矩阵   off可能不再正交,并且更难转换回a   适当的正交矩阵。

这是有偏见的。重新正交旋转矩阵并不困难,例如:

和Quaternions也必须重新规范化:“一个稍微偏离的四元数 表示标准化后的旋转“。四元数在这里没有显着优势。

我会尝试在维基百科中解决这个问题。这种有偏见的观点也出现在维基百科的其他地方...... :(

这回答了你的问题。


更新:我忘了提一下:云台锁在这里不起作用;四元数和旋转矩阵都不会受此影响。


有些注意事项。尽管四元数比旋转矩阵更紧凑,但使用四元数将导致整个应用程序中的数值计算量减少一点都不明确,请参阅:

仅供记录:旋转矩阵在资源受限的微控制器上使用非常成功,以跟踪方向,请参阅William Premerlani和Paul Bizard撰写的Direction Cosine Matrix IMU: Theory。我还拥有在微控制器(MSP430)上跟踪方向的第一手经验,而且我只能说旋转矩阵对于跟踪方向而言是快速且稳定的。

我的观点是:用于跟踪方向时,旋转矩阵和四元数之间没有显着的差异。

如果您已经有一个使用四元数来表示旋转的库,那么坚持使用四元数;如果您的库已经使用了旋转矩阵,那么使用旋转矩阵。即使一个表示会在这里和那里为您节省一些浮点运算,更改您的应用程序/库以使用其他表示也没有意义;即使在资源有限的微控制器上,节省也是微不足道的。

我看到四元数的唯一真正优势是四元数可以用于插值。旋转矩阵和欧拉角都不能做到这一点。

答案 1 :(得分:4)

不确定这对于你的品味是否足够数学,但无论如何我都会试一试:旋转矩阵的问题在于它包含冗余信息。您有9个值,它们只对3个自由度进行编码转换。

由于这种冗余,矩阵中的9个值存在约束,以形成有效的旋转矩阵。矩阵必须是正交的,这意味着行向量需要是正交的(每个向量的长度为1,每对的标量乘积为0)。

在更新旋转矩阵时,通常通过将其与增量旋转矩阵连接,会引入数值误差。每次更新都会累积这些错误。除非你对它做了些什么,否则行向量会越来越远离正交。一旦矩阵远离正交,它就可以开始明显地变形它所应用的几何形状(倾斜,缩放等)。

通过定期对行向量进行正交归一化来使用旋转矩阵时,可以避免这些问题。它只需要一些简单的向量操作就可以做到这一点,所以它没什么大不了的。

答案 2 :(得分:1)

"万向节锁"是一个红色的鲱鱼 - 矩阵和单位四元数本身都不受万向节锁定。

矩阵实际上在四元数方面比在一系列旋转中保持数值稳定性具有小优势,因为在矩阵乘积中生成每个元素所需的FP操作更少。四元数在轻松纠正数值漂移方面略有优势(要真正做好矩阵的工作,你需要做一个SVD)。

老实说,它不太可能对你的应用产生很大的影响,而且数值稳定性背后的理论变得非常毛茸茸。如果你真的对这个领域感兴趣,我可以推荐Higham的数值算法的准确性和稳定性

答案 3 :(得分:0)

我有一个应用程序,我在样条曲线后面有一个“汽车”。我计算样条曲线的导数以定义前向矢量,然后我计算左矢量和上矢量以创建方向矩阵。然后我将它分解为四元数。

当我将这些四元数转换为动画中的关键帧时,有一些转弯,其中Q_z从-1跳到1.我还没有研究如何让blender的python库给我一个稳定的小变化的分解

答案 4 :(得分:-1)

单位四元数的使用可能比矩阵更不稳定。

1。 如果你转换单位四元数并假设它是单位(不是加权系数的平方幅度),那么你可能会得到戏剧性的错误。如果你从破碎的矩阵转换回四元数,反之亦然,你可以很快达到不稳定的旋转。

  1. 四元数的顺序乘法,将它们漂移到非单位长度。而以前可以产生破碎的矩阵。
  2. 要避免此错误,应在每次产生舍入错误的操作后对四元数进行标准化。或者假设您的四元数为非单位,并使用加权转换为矩阵(大约额外8个字节)。

    注意:许多操作的执行速度比单位快,例如从矩阵转换。