欧拉角 四元数
时间: 2025-04-27 12:35:03 浏览: 27
### 欧拉角与四元数的定义
在计算机图形学和机器人学领域,欧拉角用于描述刚体的姿态通过三个连续旋转的角度来实现。这些角度通常被称为俯仰角(pitch)、偏航角(yaw)和滚转角(roll)[^1]。
另一方面,四元数是一种扩展复数系统的数学实体,用来高效地表示三维空间中的旋转变换。一个单位四元数可以被看作是一个轴向量加上一个实部组成,形式上写作 \( q = w + xi + yj + zk \),其中 \(w\) 是实部而\(xi+yj+zk\)代表虚部。
### 区别
两者之间存在显著差异:
- **表达范围**:欧拉角容易遇到万向锁问题(gimbal lock),即当某些特定组合下会丢失自由度;相比之下,四元数不会遭遇此类局限性。
- **计算效率**:对于连贯性的姿态变化或者插值操作而言,基于四元数的方法往往更加快捷稳定,并且能够提供更加平滑的结果。
- **直观理解难度**:尽管如此,在实际应用中人们可能觉得欧拉角更容易理解和解释给定的姿态状态。
### 转换方法
#### 从欧拉角到四元数
假设有一个绕Z-Y-X顺序的欧拉角序列\((\phi,\theta,\psi)\),对应的四元数可以通过如下公式获得:
\[q_w=\cos(\frac{\phi}{2})\cdot\cos(\frac{\theta}{2})\cdot\cos(\frac{\psi}{2})+\sin(\frac{\phi}{2})\cdot\sin(\frac{\theta}{2})\cdot\sin(\frac{\psi}{2})\]
\[q_x=\sin(\frac{\phi}{2})\cdot\cos(\frac{\theta}{2})\cdot\cos(\frac{\psi}{2})-\cos(\frac{\phi}{2})\cdot\sin(\frac{\theta}{2})\cdot\sin(\frac{\psi}{2})\]
\[q_y=\cos(\frac{\phi}{2})\cdot\sin(\frac{\theta}{2})\cdot\cos(\frac{\psi}{2})+\sin(\frac{\phi}{2})\cdot\cos(\frac{\theta}{2})\cdot\sin(\frac{\psi}{2})\]
\[q_z=\cos(\frac{\phi}{2})\cdot\cos(\frac{\theta}{2})\cdot\sin(\frac{\psi}{2})-\sin(\frac{\phi}{2})\cdot\sin(\frac{\theta}{2})\cdot\cos(\frac{\psi}{2})\][^1]
#### 从四元数到欧拉角
如果已知一个四元数\(q=(q_w,q_x,q_y,q_z)\),那么其相应的Euler angles可通过以下方程求得(这里采用的是ZYX convention):
\[yaw=atan2(2(q_wq_z+q_xq_y),1-2(q_y^2+q_z^2))\]
\[pitch=asin(max(-1,min(1,2(q_wq_y-q_zq_x))))\]
\[roll=atan2(2(q_wq_x+q_yq_z),1-2(q_x^2+q_y^2))\]
```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 = max(min(t2, 1), -1)
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 [math.degrees(yaw), math.degrees(pitch), math.degrees(roll)]
print(quaternion_to_euler(0.707, 0, 0.707, 0))
```
阅读全文
相关推荐















