四元数和数值稳定性

rmp*_*251 8 math rotation quaternions rotational-matrices numerical-stability

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

Ali*_*Ali 8

维基百科的文章有偏见.

截至2014年4月18日:

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

这是有偏见的.重新正交旋转矩阵没有什么困难,例如:

和Quaternions也必须重新规范化:"略微偏离的四元数仍然代表标准化后的旋转".四元数在这里没有显着的优势.

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

这回答了你的问题.


更新:我忘记提到:万向节锁在这里没有发挥作用; 四元数和旋转矩阵都不会受此影响.


一些旁注.尽管四元数比旋转矩阵更紧凑,它根本不是一个明确的,使用四元数将导致您的应用程序作为一个整体更小的数值计算,请参阅:

仅供参考:旋转矩阵在资源受限的微控制器上使用非常成功,以跟踪方向,参见方向余弦矩阵IMU: William Premerlani和Paul Bizard的理论.我还拥有在微控制器(MSP430)上跟踪方向的第一手经验,而且我只能说明旋转矩阵对于跟踪方向来说是快速且稳定的.

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

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

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

  • 嗯,当然,如果你有整合漂移担心,那么数值稳定性是你最不关心的问题.但是,没有理由认为这是OP的应用程序. (3认同)
  • 你的技术看起来确实合理,我不得不通过它来解决这个偏见的语义.但请注意,您丢弃旧Z矢量中包含的所有信息,而不是旧X矢量和Y矢量中的信息,因此仍存在偏差.是的,我确实有该领域的经验. (2认同)

Ret*_*adi 5

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

由于这种冗余,矩阵中的 9 个值构成有效的旋转矩阵受到限制。矩阵必须是正交的,这意味着行向量必须是正交的(每个向量的长度为 1,每对的标量积为 0)。

当您更新旋转矩阵时(通常通过将其与增量旋转矩阵连接),会引入数值误差。这些错误会随着每次更新而累积。除非你采取一些措施,否则行向量会越来越远离正交。一旦矩阵距离正交足够远,它就会开始明显地使其所应用的几何体变形(倾斜、缩放等)。

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