关于欧拉角与四元素的关系

1.欧拉角 

在四元数出现之前先看下欧拉角: 

对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。为了后面的角度不混乱,我们要先区分参考系和坐标系的概念。 

参考系即为大地参考系,是静止不动的。而坐标系则固定于四轴飞行器,随着四轴飞行器的旋转而旋转。 

按照右图所示。设定 xyz-轴为四轴上的参考轴,XYZ-轴则是大地的参考轴。右图即为四轴相对地面进行了一定旋转, xy-平面与XY-平面的相交线为交点线,用英文字母(N)代表。我们可以这样定义欧拉角: 

 是 x-轴与交点线的夹角 

 是 z-轴与Z-轴的夹角  是交点线与X-轴的夹角 

这样我们就可以用三个欧拉角:(,,)其取值为0-360来描述四轴飞行器 相对于大地的参考系的姿态角度了。 

三个欧拉角:(,,)。蓝色的轴是 xyz-轴,红色的轴是 XYZ-坐标轴。绿色的线是交点线 (N) 。 

2.轴角 

欧拉角使用roll,pitch,yaw来表示这些分量的旋转值。需要注意的是,这里的旋转是针对大地参考系说的,这意味着第一次的旋转不会影响第二、三次的转轴,简单的说,三角度系统无法表现任意轴的旋转,只要一开始旋转,物体本身就失去了任意轴的自主性,这也就导致了万向节锁(Gimbal Lock)的问题。 

什么是Gimbal Lock? 正如前面所说,因为欧拉描述中针对x,y,z的旋转描述是世界坐标系下的值,所以当任意一轴旋转90°的时候会导致该轴同其他轴重合,此时旋转被重合的轴可能没有任何效果,这就是Gimbal Lock,还有一种是轴角的描述方法,这种方法比欧拉描述要好,它避免了Gimbal Lock,它使用一个3维向量表示转轴和一个角度分量表示绕此转轴的旋转角度,即(x,y,z,angle),一般表示为(x,y,z,w)或者(v,w)。(x,y,z)为旋转轴,w为旋转角度。但这种描述法却不适合插值。 

 


在Python中,将四元数转换为欧拉角可以借助一些数学公式来完成。通常,我们使用`numpy`库来进行矩阵运算,并利用已知的旋转顺序(如XYZ、ZYX等)计算对应的欧拉角。 以下是简单的步骤说明: ### 四元数欧拉角的基本原理 假设有一个表示姿态的四元数 \( q = [w, x, y, z] \),其中 \( w \) 是实部,\( x, y, z \) 是虚部。那么可以根据以下公式将其转化为欧拉角: 对于常见的 ZYX (Tait-Bryan angles) 欧拉角次序: \[ roll(x)\text{-axis rotation} \\ pitch(y)\text{-axis rotation} \\ yaw(z)\text{-axis rotation} \] 其对应的关系式为: ```python import math def quaternion_to_euler(w, x, y, z): t0 = +2.0 * (w * x + y * z) t1 = +1.0 - 2.0 * (x * x + y * y) roll = 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 pitch = math.asin(t2) t3 = +2.0 * (w * z + x * y) t4 = +1.0 - 2.0 * (y * y + z * z) yaw = math.atan2(t3, t4) return [ roll * 180 / math.pi, pitch * 180 / math.pi, yaw * 180 / math.pi] ``` 该函数会返回滚转角(roll), 俯仰角(pitch) 和偏航角(yaw),结果是以度为单位的角度值。 如果需要更简便的方式,也可以直接采用 `scipy.spatial.transform.Rotation` 或者其他类似工具包简化上述操作过程。 --- **示例代码** ```python from scipy.spatial.transform import Rotation as R # 定义一个四元数组[w,x,y,z] quat = [0.707, 0.0, 0.707, 0.0] r = R.from_quat(quat[1:] + quat[:1]) # 需要注意scipy对四元数输入的形式[x,y,z,w] euler_angles = r.as_euler('xyz', degrees=True) print(euler_angles) ``` 这将会打印出以 XYZ 序列形式给出的一组欧拉角度数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值