9

我有以下问题:来自运动捕捉设备的四元数 (q1) 需要通过来自第二个跟踪对象导出的另一个方向四元数 (q2) 的偏航角(并且只有偏航!)来校正,以便俯仰和滚动q1 的偏航角与之前相同,但 q1 具有 q2 的偏航角。

工作解决方案是将四元组转换为矩阵,然后进行计算以提取旋转角度,然后进行航向校正。但是,当直接在某个轴的方向上时(例如,在 0° - 359° 之后),这会导致“翻转”。还尝试了其他不方便的转换。

是否有可能直接在四元数上进行数学运算而不转换为矩阵或欧拉角(即,我可以将校正的四元数设置为跟踪对象的四元数)?

如前所述 - 校正应仅包括围绕上轴(偏航)的旋转。我没有太多关于数学课的编程可能性(不幸的是,来自 Virtools 的 VSL 脚本在这个方向上非常有限)。有人有什么建议吗?

4

4 回答 4

2

对于这个任务,欧拉角是最好的使用方法,因为它们的优势(唯一的优势)在于围绕正交轴分离成单独的旋转。因此,将两个四元数转换为适合您需要的欧拉角约定,只需将 q1 的偏航角替换为 q2 即可。

当然,您需要使用匹配的欧拉角约定,其中其他旋转不依赖于偏航角(所以在变换点时首先应用偏航旋转?),这样您就可以改变角度而不影响其他轴。将得到的欧拉角三元组转换回四元数时,您应该再次获得唯一的表示,还是我遗漏了什么?

于 2011-06-14T21:22:42.397 回答
1

您可以通过计算偏航部分,然后应用其逆来移除四元数的偏航部分。假设您的四元数是quat(w,x,y,z) == w + xi + yj + zk),并且偏航是围绕 Z 轴定义的(本文中的欧拉 123 或 213 )。

请注意,在这些帧中,yaw围绕 Z 轴的旋转由四元数表示quat(cos(yaw/2), 0, 0, sin(yaw/2))

将四元数分解为欧拉角,我们有偏航为:

yaw = atan2(-2*x*y + 2*w*z, +w*w +x*x -y*y -z*z); // 123 angles (page 24)
yaw = atan2(-2*x*y + 2*w*z, +w*w -x*x +y*y -z*z); // 213 angles (page 28)

我们可以从中得出

quat quat_2yaw = quat(w*w +x*x -y*y -z*z, 0, 0, -2*x*y + 2*w*z).normalize(); // 123 angles
quat quat_2yaw = quat(w*w -x*x +y*y -z*z, 0, 0, -2*x*y + 2*w*z).normalize(); // 213 angles

将四元数的角度减半的一种简单方法是将其添加到恒等四元数并归一化:

quat quat_yaw = (1 + quat_2yaw).normalize();

要回答您最初的问题 - 我们想从 yaw 中获取 yaw q1,并用它替换q2s yaw 。我们可以这样做:

q2 = get_quat_yaw(q1) * get_quat_yaw(q2).conj() * q2;
于 2017-05-20T01:07:07.957 回答
0

如果你有四元数Q1Q2并且你的“向上”方向是y,那么如果你取出Q1的y分量并重新归一化,那么你会得到一个没有偏航分量的四元数。同样,如果你取出Q2的xz分量,那么你会得到一个只有偏航分量的四元数。将第二个乘以第一个(使用四元数乘法)就可以了。

Q1[2] = 0;
normalize4d(Q1);
Q2[1] = 0;
Q2[3] = 0;
normalize4d(Q2);
Q3 = quatMult(Q2,Q1);

当然,您可能需要检查旋转恰好(或接近)180 度的特殊情况,因为当您尝试对具有非常小的幅度的向量进行归一化时,这会使数值不稳定。

于 2011-06-17T04:29:58.050 回答
0

简短的回答:是的,这是可能的。您可以制定旋转(关于任意轴)并使用四元数运算来执行它。

长答案:请参阅有关四元数和旋转的维基百科文章。我猜你描述的问题是云台锁。

于 2011-05-30T14:07:11.947 回答