问题描述
我正在使用配备陀螺仪/加速度计/磁力计的运动跟踪设备。设备在任何时间点输出其旋转方向作为四元数。
当我从原始方向旋转设备时,我试图计算两件事:(1)沿球体表面与原始方向的距离(我实际上已经完成了这一步),以及(2 ) 方向的方向 - 但方向必须是简单的 1 或 -1,而不是向量。
让我进一步解释一下我对方向的意思:假设设备以初始旋转状态开始,然后我将其向一个方向旋转。完成一定程度的旋转后,我将它旋转回原来的位置,然后我继续沿着相同的轨迹旋转它——基本上是在我原来旋转的相反方向上旋转它。
所以,如果我有一个原始四元数 Q0,然后我有另一个四元数代表我的第一个旋转 Q1,那么我想说对于任何未来的四元数 Qn:
- Qn 到 Q0 的距离是多少?
- Qn 从 Q0 的方向(有效值为 1 或 -1)是什么?其中“1”表示“与从 Q0 到 Q1 的旋转方向相同”,“-1”表示“与从 Q0 到 Q1 的旋转方向相反”。
就像我说的,由于找到了这篇有用的帖子,我已经解决了“距离”部分:https://math.stackexchange.com/questions/90081/quaternion-distance?newreg=f0fcab1eca8d4a4faaad1ea555d1cdf7
我还没有解决方向部分。以下帖子让我参与了其中:
但我的理解还不够完整。谁能帮助阐明我如何做到这一点?谢谢!
解决方法
我不知道你使用的四元数约定是左链还是右链,所以我会选择一个例子。假设 P1 是将您从 Q0 带到 Q1 的四元数,如下所示:
P1 * Q0 = Q1
然后我们有
P1 = Q1 * Q0^-1
如果 P1 的 w 部分为负,则翻转 P1 元素的所有符号,使 w 部分为正。
If P1w < 0
P1 = -P1
Endif
P1 的其余 x、y、z 部分然后指向旋转轴,因此我们可以将其用于“方向”。调用这个向量 v1 = [P1x,P1y,P1z]
现在您有另一个四元数 Qn,您想看看它是否与 Q1 处于相同的旋转“方向”。首先按照我们上面的方法生成以下内容:
Pn = Qn * Q0^-1
如有必要,翻转 Pn 的所有符号以确保 Pnw 为正。
形成向量 vn = [Pnx,Pny,Pnz]
如果 vn 与 v1 的“方向”相同,则旋转方向相同。否则是相反的方向。即,
If dot(v1,vn) > 0
Direction is the same
Else
Direction is opposite
Endif
当您涉及 0 度或 180 度的旋转,或者如果您的旋转超过 180 度时,这一切都会失效,因此您可能需要特殊的逻辑来处理这些情况。例如,如果 v1 或 vn 非常接近或相同 [0,0],你想要什么结果?
对于不同的四元数约定,您可能需要从 Q0 * P1 = Q1 开始 并相应地进行。