用另一个四元数的偏航角部分校正一个四元数的偏航角部分

|| 我有以下问题:来自运动捕获设备的四元数(q1)需要通过第二个被跟踪物体派生的另一个方位四元数(q2)的偏航角(并且仅偏航!)进行校正,从而使俯仰和滚动q1的偏向与以前相同,但q1偏向q2。 工作解决方案是将quat转换为矩阵,然后进行计算以提取旋转角度,然后进行航向校正。但这直接在某个轴的方向上(例如在0°至359°之后)会导致“翻转”。还尝试了其他不方便的转换。 是否有可能直接对四元数进行数学运算而无需转换为矩阵或欧拉角(即因此我可以将校正后的四元数设置为跟踪对象的四元数)? 如上所述-校正应仅包括围绕上轴的旋转(偏航)。关于数学类,我编程的可能性不多(不幸的是,Virtools的VSL脚本在这个方向上非常有限)。有人有什么建议吗?     
已邀请:
        对于这个任务,欧拉角是最好的选择,因为它们的优点(根本是唯一的优点)在于围绕正交轴分成单独的旋转。因此,将两个四元数都转换为适合您需求的欧拉角惯例,只需用q2 \代替q1 \的偏航角即可。 当然,您需要使用匹配的欧拉角惯例,其中另一种旋转不取决于偏航角(因此在变换点时首先应用偏航旋转?),以便您可以更改角度而无需影响其他轴。将生成的欧拉角三倍角转换回四元数时,您应该再次获得唯一的表示形式,否则我会丢失某些东西吗?     
        您可以通过计算偏航部分,然后应用其倒数来除去四元数的偏航部分。假设您的四元数为
quat(w,x,y,z) == w + xi + yj + zk)
,并且偏航角定义为围绕Z轴(本文中的Euler 123或213)。 请注意,在这些帧中,以四元数
quat(cos(yaw/2), 0, 0, sin(yaw/2))
表示围绕Z轴旋转
yaw
。 将四元数分解为欧拉角,我们的偏航为:
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();
要回答您的原始问题-我们想从
q1
开始偏航,并以replace7ѭ来代替。我们可以这样做,如下所示:
q2 = get_quat_yaw(q1) * get_quat_yaw(q2).conj() * q2;
    
        简短的回答:是的,有可能。您可以制定旋转(绕任意轴)并使用四元数运算执行旋转。 长答案:请参见有关四元数和旋转的维基百科文章。我想您描述的问题是万向节锁。     
        如果您有四元数Q1和Q2,并且您的\'up \'方向是y,那么如果您取出Q1的y分量并重新归一化,那么您会得到没有偏航分量的四元数。同样,如果取出Q2的x和z分量,则将得到仅包含偏航分量的四元数。将第二个与第一个相乘(使用四元数乘法),您就在那里。
Q1[2] = 0;
normalize4d(Q1);
Q2[1] = 0;
Q2[3] = 0;
normalize4d(Q2);
Q3 = quatMult(Q2,Q1);
当然,您可能想检查一种特殊情况,即存在一个正好(或接近)180度的旋转,因为当您尝试对很小的矢量进行归一化时,这会使数值在数值上不稳定。     

要回复问题请先登录注册