我正在学习单位四元数以及如何使用它们来表示和组合旋转。维基百科说它们比矩阵表示在数值上更稳定,但没有给出参考。谁能向我解释(最好用一些数学推理)为什么使用单位四元数来处理旋转(例如对于 OpenGL 应用程序)而不是旋转矩阵在数值上更稳定?是因为避免了云台锁吗?
5 回答
那篇维基百科的文章是有偏见的。从
截至 2014 年 4 月 18 日:
在计算机上进行多次旋转时,舍入误差必然会累积。稍微偏离的四元数在归一化后仍然表示旋转:稍微偏离的矩阵可能不再是正交的,并且更难转换回适当的正交矩阵。
这是有偏见的。重新正交化旋转矩阵并不难,例如:
并且四元数也必须重新标准化:“稍微偏离的四元数仍然代表标准化后的旋转”。四元数在这里没有显着优势。
我会尝试在维基百科中解决这个问题。这种有偏见的观点也出现在维基百科的其他地方...... :(
这回答了你的问题。
更新:我忘了提:万向锁在这里不起作用;四元数和旋转矩阵都不会受此影响。
一些旁注。尽管四元数比旋转矩阵更紧凑,但使用四元数会导致整个应用程序中的数值计算减少,这一点一点也不明确,请参阅:
仅作记录:旋转矩阵已在资源受限的微控制器上成功用于跟踪方向,请参阅方向余弦矩阵 IMU: William Premerlani 和 Paul Bizard 的理论。我在微控制器 (MSP430) 上跟踪方向方面也有第一手经验,我只能说旋转矩阵在跟踪方向方面是快速且稳定的。
我的观点是:当用于跟踪方向时,旋转矩阵和四元数之间没有显着差异。
如果您已经有一个使用四元数表示旋转的库,那么请坚持使用四元数;如果您的库已经使用旋转矩阵,则使用旋转矩阵。即使一种表示可以在这里和那里为您节省一些浮点运算,也没有必要更改您的应用程序/库以使用另一种表示;即使在资源受限的微控制器上,节省的费用也是微不足道的。
我看到的四元数唯一真正的优势是四元数可以用于插值。旋转矩阵和欧拉角都不能做到这一点。
不确定这在数学上是否足以满足您的口味,但无论如何我都会试一试:旋转矩阵的问题在于它包含冗余信息。您有 9 个值对只有 3 个自由度的变换进行编码。
由于这种冗余,对矩阵中的 9 个值存在约束,以形成有效的旋转矩阵。矩阵必须是正交的,这意味着行向量必须是正交的(每个向量的长度为 1,每对的标量积为 0)。
当您更新旋转矩阵时,通常通过将其与增量旋转矩阵连接起来,会引入数值错误。这些错误随着每次更新而累积。除非你对它做点什么,否则行向量离正交标准越来越远。一旦矩阵远离正交,它就可以开始明显地变形它所应用的几何体(倾斜、缩放等)。
在使用旋转矩阵时,您可以通过定期对行向量进行正交归一化来避免这些问题。只需要一些简单的向量操作就可以做到这一点,所以没什么大不了的。
“万向节锁定”是一个红鲱鱼 - 矩阵和单位四元数都不受万向节锁定的影响。
与四元数相比,矩阵实际上在保持旋转序列上的数值稳定性方面具有很小的优势,因为生成矩阵乘积中的每个元素所需的 FP 操作更少。四元数在纠正数值漂移方面有一点优势(要真正做好矩阵的工作,你需要做一个 SVD)。
不过,老实说,它不太可能对您的应用程序产生重大影响,并且数值稳定性背后的理论变得非常棘手。如果你真的对该领域感兴趣,我可以推荐 Higham 的Accuracy and Stability of Numerical Algorithms。
我有一个应用程序,其中我有一辆遵循样条曲线的“汽车”。我计算样条的导数来定义一个前向向量,然后我计算左向量和上向量来创建一个方向矩阵。然后我把它分解成一个四元数。
当我将这些四元数转换为动画中的关键帧时,Q_z 会从 -1 变为 1。
使用单位四元数可能比矩阵更不稳定。
1. 如果您转换单位四元数并假设它是单位(不是按平方幅度加权系数),那么您可能会得到巨大的错误。如果你从破碎的矩阵转换回四元数,反之亦然,你可以很快达到不稳定的旋转。
- 四元数的顺序乘法,将它们漂移到非单位长度。和以前一样会产生破碎的矩阵。
为避免此错误,您应该在每次产生舍入错误的操作后对四元数进行归一化。或者假设您的四元数为非单位,并转换为带权重的矩阵(大约额外 8flops )。
注意:许多操作比使用单位执行得更快,例如从矩阵转换。