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

将四元数转换为 Android 坐标中的欧拉角

如何解决将四元数转换为 Android 坐标中的欧拉角

我使用以下代码在 Android 智能手机 (YXZ) 中将四元数转换为欧拉角,反之亦然。但是,当我从 quaternion_to_euler_android 获取输出并将其作为 euler_to_quaternion_android 的输入时,我得到了不同的结果。

def euler_to_quaternion_android(r):
    (yaw,pitch,roll) = (r[0],r[1],r[2])
    qy = np.sin(roll/2) * np.cos(pitch/2) * np.cos(yaw/2) + np.cos(roll/2) * np.sin(pitch/2) * np.sin(yaw/2)
    qx = np.cos(roll/2) * np.sin(pitch/2) * np.cos(yaw/2) - np.sin(roll/2) * np.cos(pitch/2) * np.sin(yaw/2)
    qz = np.cos(roll/2) * np.cos(pitch/2) * np.sin(yaw/2) + np.sin(roll/2) * np.sin(pitch/2) * np.cos(yaw/2)
    qw = np.cos(roll/2) * np.cos(pitch/2) * np.cos(yaw/2) - np.sin(roll/2) * np.sin(pitch/2) * np.sin(yaw/2)
    return [qw,qx,qy,qz]

def quaternion_to_euler_android(q):
    (w,x,y,z) = (q[0],q[1],q[2],q[3])
    t0 = +2.0 * (x * z - y * w)
    t1 = +1.0 - 2.0 * (x * x + y * y)
    roll = math.atan2(-t0,t1) #Math.atan2(-R[6],R[8]);
    t2 = +2.0 * (y * z + x * w) #q2_q3 + q1_q0;
    t2 = +1.0 if t2 > +1.0 else t2
    t2 = -1.0 if t2 < -1.0 else t2
    pitch = math.asin(-t2)
    t3 = +2.0 * (x * y - w * z)
    t4 = +1.0 - 2.0 * (x * x + z * z)
    yaw = math.atan2(t3,t4) #Math.atan2(R[1],R[4]);
    return [yaw,roll]

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