您可以通过计算偏航部分,然后应用其逆来移除四元数的偏航部分。假设您的四元数是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
,并用它替换q2
s yaw 。我们可以这样做:
q2 = get_quat_yaw(q1) * get_quat_yaw(q2).conj() * q2;