微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决用另一个四元数的偏航角部分校正一个四元数的偏航角部分

|| 我有以下问题:来自运动捕获设备的四元数(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),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,-2*x*y + 2*w*z).normalize(); // 123 angles
quat quat_2yaw = quat(w*w -x*x +y*y -z*z,-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度的旋转,因为当您尝试对很小的矢量进行归一化时,这会使数值在数值上不稳定。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。