四元数与欧拉角

四元数和欧拉角都是用于表示旋转的工具,它们之间可以相互转换。以下是四元数和欧拉角之间的转换公式推导,并提供了C语言代码实现。

一、四元数和欧拉角的定义及基本性质

四元数的定义:四元数是一个具有形如 q = q 0 + i q 1 + j q 2 + k q 3 q=q_0+iq_1+jq_2+kq_3 q=q0​+iq1​+jq2​+kq3​的复数扩展形式的数,其中 i , j , k i,j,k i,j,k是虚数单位, q 0 , q 1 , q 2 , q 3 q_0,q_1,q_2,q_3 q0​,q1​,q2​,q3​是实数。

四元数可以表示为一个单位四元数和一个旋转角度的乘积形式: q = r ( c o s θ 2 + i s i n θ 2 n ) q=r(cos\frac{\theta}{2}+isin\frac{\theta}{2}\textbf{n}) q=r(cos2θ​+isin2θ​n),其中 r r r是标量部分, n \textbf{n} n是旋转轴, θ \theta θ是旋转角度。

欧拉角的定义:欧拉角是用于描述物体在空间中的旋转的一种表示方法,它可以分为三个旋转,即绕 x x x轴旋转 ϕ \phi ϕ角,绕 y y y轴旋转 θ \theta θ角,绕 z z z轴旋转 ψ \psi ψ角。

欧拉角的转换顺序有三种,分别为 x y z xyz xyz, z y x zyx zyx和 y x z yxz yxz,其中 x y z xyz xyz表示先绕 x x x轴旋转,再绕 y y y轴旋转,最后绕 z z z轴旋转。

二、四元数和欧拉角之间的转换公式

四元数和欧拉角可以相互转换,它们之间的转换公式如下:

    欧拉角转四元数:

以 x y z xyz xyz为例,欧拉角绕 x x x轴旋转 ϕ \phi ϕ角,绕 y y y轴旋转 θ \theta θ角,绕 z z z轴旋转 ψ \psi ψ角,对应的四元数公式为:

void euler2quat(float phi, float theta, float psi, float quat[4]) {
    float c1 = cos(phi / 2);
    float c2 = cos(theta / 2);
    float c3 = cos(psi / 2);
    float s1 = sin(phi / 2);
    float s2 = sin(theta / 2);
    float s3 = sin(psi / 2);
    quat[0] = c1*c2*c3 + s1*s2*s3;
    quat[1] = s1*c2*c3 - c1*s2*s3;
    quat[2] = c1*s2*c3 + s1*c2*s3;
    quat[3] = c1*c2*s3 - s1*s2*c3;
}

    四元数转欧拉角:

以 x y z xyz xyz为例,先计算旋转矩阵 R ,再对旋转矩阵 R 进行分解,得到欧拉角 ϕ , θ , ψ \phi,\theta,\psi ϕ,θ,ψ。

旋转矩阵 R 通过四元数 q 计算,

void quat2euler(float quat[4], float* phi, float* theta, float* psi) {
    float R[3][3];
    R[0][0] = 1 - 2 * (quat[2] * quat[2] + quat[3] * quat[3]);
    R[0][1] = 2 * (quat[1] * quat[2] - quat[0] * quat[3]);
    R[0][2] = 2 * (quat[0] * quat[2] + quat[1] * quat[3]);
    R[1][0] = 2 * (quat[1] * quat[2] + quat[0] * quat[3]);
    R[1][1] = 1 - 2 * (quat[1] * quat[1] + quat[3] * quat[3]);
    R[1][2] = 2 * (quat[2] * quat[3] - quat[0] * quat[1]);
    R[2][0] = 2 * (quat[1] * quat[3] - quat[0] * quat[2]);
    R[2][1] = 2 * (quat[0] * quat[1] + quat[2] * quat[3]);
    R[2][2] = 1 - 2 * (quat[1] * quat[1] + quat[2] * quat[2]);

    *phi = atan2(R[2][1], R[2][2]);
    *theta = asin(-R[2][0]);
    *psi = atan2(R[1][0], R[0][0]);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值