四元数和欧拉角互相转换

四元数和欧拉角都是用于表示旋转的工具,它们之间可以相互转换。以下是四元数和欧拉角之间的转换公式推导,并提供了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轴旋转。

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

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

  1. 欧拉角转四元数:

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

q = [ c o s ϕ 2 s i n ϕ 2 0 0 ] [ c o s θ 2 0 s i n θ 2 0 ] [ c o s ψ 2 0 0 s i n ψ 2 ] q=\begin{bmatrix} cos\frac{\phi}{2} \\ sin\frac{\phi}{2} \\ 0 \\ 0 \end{bmatrix} \begin{bmatrix} cos\frac{\theta}{2} \\ 0 \\ sin\frac{\theta}{2} \\ 0 \end{bmatrix} \begin{bmatrix} cos\frac{\psi}{2} \\ 0 \\ 0 \\ sin\frac{\psi}{2} \end{bmatrix} q= cos2ϕsin2ϕ00 cos2θ0sin2θ0 cos2ψ00sin2ψ

对应的代码实现如下:

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;
}
  1. 四元数转欧拉角:

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

旋转矩阵 R R R通过四元数 q q q计算,即 R = [ 1 − 2 ( q 2 2 + q 3 2 ) 2 ( q 1 q 2 − q 0 q 3 ) 2 ( q 0 q 2 + q 1 q 3 ) 2 ( q 1 q 2 + q 0 q 3 ) 1 − 2 ( q 1 2 + q 3 2 ) 2 ( q 2 q 3 − q 0 q 1 ) 2 ( q 1 q 3 − q 0 q 2 ) 2 ( q 0 q 1 + q 2 q 3 ) 1 − 2 ( q 1 2 + q 2 2 ) ] R= \begin{bmatrix} 1-2(q_2^2+q_3^2) & 2(q_1q_2-q_0q_3) & 2(q_0q_2+q_1q_3) \\ 2(q_1q_2+q_0q_3) & 1-2(q_1^2+q_3^2) & 2(q_2q_3-q_0q_1) \\ 2(q_1q_3-q_0q_2) & 2(q_0q_1+q_2q_3) & 1-2(q_1^2+q_2^2) \end{bmatrix} R= 12(q22+q32)2(q1q2+q0q3)2(q1q3q0q2)2(q1q2q0q3)12(q12+q32)2(q0q1+q2q3)2(q0q2+q1q3)2(q2q3q0q1)12(q12+q22)

计算旋转矩阵分解的代码实现如下:

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]);
}

三、总结

本文介绍了四元数和欧拉角之间的转换公式推导及C语言代码实现,在实际使用中可以根据需要进行选择。四元数具有很好的性质,可以避免万向锁等问题,因此在计算机图形学、机器人控制等领域中得到了广泛应用。欧拉角虽然表示方式较为简单,但在某些情况下容易出现奇点等问题,因此需要进行相应的处理。

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FlyDremever

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值