怎么把向量转化为四元数或欧拉角

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么把向量转化为四元数或欧拉角相关的知识,希望对你有一定的参考价值。

参考技术A 四元数应该是给出一个四维向量才可以转换的。
基底是1,i,j,k。这之间有运算i^2=j^2=k^2=-1,ij=k,ji=-k。
用矩阵的语言来说,i、j、k各自对应一个复矩阵。从而一个四元数对应一个SU(2)群元素。本回答被提问者采纳

如何将欧拉角转换为四元数并从四元数中得到相同的欧拉角?

我使用Euler角度以XYZ的顺序旋转n形状,这意味着对象首先沿着X轴旋转,然后是Y然后Z。我想将欧拉角转换为四元数,然后使用一些[最好] Python代码或只是一些伪代码或算法从Quaternion中获得相同的欧拉角。下面,我有一些代码将欧拉角转换为四元数,然后转换四元数以获得欧拉角。但是,这并没有给我相同的欧拉角。

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

这是我使用的代码:

此函数将Euler角度转换为Quaternions:

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)这样的数字我得到这个四元数 - > [0.749, 0.290, -0.449, 0.389]并将四元数转换为欧拉角给我这个 - > (132.35, 64.17, 11.45)这是非常错误的。我想知道如何解决这个问题?

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

答案

主要问题:

euler_to_quaternion的输入顺序与quaternion_to_euler的输出顺序不同

前者采用Z, Y, X(偏航,俯仰,滚动)的顺序,而后者返回X, Y, Z。固定:

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

小问题

euler_to_quaternion获得弧度,而quaternion_to_euler获得度数。

本身并不是一个问题,但由于大多数库函数都使用它们,所以最好将角度保持为弧度。

X = math.atan2(t0, t1)
Y = math.asin(t2)
Z = math.atan2(t3, t4)

以上是关于怎么把向量转化为四元数或欧拉角的主要内容,如果未能解决你的问题,请参考以下文章

如何将欧拉角转换为四元数并从四元数中得到相同的欧拉角?

欧拉角与四元数(计算,编程)

欧拉角到四元数然后四元数到欧拉角

unity3d 欧拉角怎么转换为方向向量

3D图形:矩阵、欧拉角、四元数与方位的故事

3D计算机图形学变换矩阵欧拉角四元数