我正在按照 XYZ 的顺序使用欧拉角旋转 n 个 3D 形状,这意味着对象首先沿 X 轴旋转,然后是 Y ,然后是 Z 。我想将欧拉角转换为四元数,然后使用一些 [最好] Python 代码或只是一些伪代码或算法从四元数返回相同的欧拉角。下面,我有一些代码将欧拉角转换为四元数,然后将四元数转换为欧拉角。然而,这并没有给我相同的欧拉角。

我认为问题是我不知道如何将偏航、俯仰和滚转与 X、Y 和 Z 轴相关联。另外,我不知道如何更改代码中的转换顺序以将欧拉角正确转换为四元数,然后将四元数转换为欧拉角,以便我能够获得相同的欧拉角。有人可以帮我弄这个吗?

这是我使用的代码:

此函数将欧拉角转换为四元数:

def euler_to_quaternion(yaw, pitch, roll):

        qx = np.sin(roll/2) * np.cos(pitch/2) * np.cos(yaw/2) - np.cos(roll/2) * np.sin(pitch/2) * np.sin(yaw/2)
        qy = 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 [qx, qy, qz, qw]

这将四元数转换为欧拉角:
def quaternion_to_euler(x, y, z, w):

        import math
        t0 = +2.0 * (w * x + y * z)
        t1 = +1.0 - 2.0 * (x * x + y * y)
        X = math.degrees(math.atan2(t0, t1))

        t2 = +2.0 * (w * y - z * x)
        t2 = +1.0 if t2 > +1.0 else t2
        t2 = -1.0 if t2 < -1.0 else t2
        Y = math.degrees(math.asin(t2))

        t3 = +2.0 * (w * z + x * y)
        t4 = +1.0 - 2.0 * (y * y + z * z)
        Z = math.degrees(math.atan2(t3, t4))

        return X, Y, Z

我使用它们如下:
import numpy as np
euler_Original = np.random.random(3) * 360).tolist() # Generate random rotation angles for XYZ within the range [0, 360)
quat = euler_to_quaternion(euler_Original[0], euler_Original[1], euler_Original[2]) # Convert to Quaternion
newEulerRot = quaternion_to_euler(quat[0], quat[1], quat[2], quat[3]) #Convert the Quaternion to Euler angles

print (euler_Original)
print (newEulerRot)

打印语句为 euler_OriginalnewEulerRot 打印不同的数字,我不想这样。例如,如果 euler_original 包含类似 (0.2, 1.12, 2.31) 的弧度数,我得到这个 Quaternion --> [0.749, 0.290, -0.449, 0.389] 并将四元数转换为 Euler 角给我这个 --> (132.35, 64.17, 11.45) 这是非常错误的。我想知道我该如何解决这个问题?

虽然我有兴趣通过对上面的代码进行更改来使其工作,但是,我宁愿学习如何正确设置方程。这样我就知道如何获得正确的四元数,即使应用欧拉角的旋转顺序(XYZ --> YZX 等)发生变化。

最佳答案

主要问题 :



前者以 Z, Y, X (yaw, pitch, roll) 的顺序获取角度,后者返回 X, Y, Z 。使固定:

def euler_to_quaternion(roll, pitch, yaw):
# or
euler_to_quaternion(euler_Original[2], euler_Original[1], euler_Original[0])

小问题



本身并不是真正的问题,但最好将角度保持为弧度,因为大多数库函数都使用它们。
X = math.atan2(t0, t1)
Y = math.asin(t2)
Z = math.atan2(t3, t4)

关于python - 如何将欧拉角转换为四元数并从四元数返回相同的欧拉角?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53033620/

10-10 17:33