四元数教程
四元数(Quaternion)是由爱尔兰数学家威廉·卢云·哈密顿在1843年创立出的数学概念。通常记为H,或 H {\displaystyle \mathbb {H} }。 从明确地角度而言,四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话,四元数则代表着一个四维空间,相对于复数为二维空间。 作为用于描述现实空间的坐标表示方式,人们在复数的基础上创造了四元数并以a+bi+cj+dk的形式说明空间点所在位置。 i、j、k作为一种特殊的虚数单位参与运算,并有以下运算规则:i0=j0=k0=1,i2=j2=k2=-1 对于i、j、k本身的几何意义可以理解为一种旋转,其中i旋转代表X轴与Y轴相交平面中X轴正向向Y轴正向的旋转,j旋转代表Z轴与X轴相交平面中Z轴正向向X轴正向的旋转,k旋转代表Y轴与Z轴相交平面中Y轴正向向Z轴正向的旋转,-i、-j、-k分别代表i、j、k旋转的反向旋转。
四元数(Quaternion)计算是机器人学、计算机图形学和航空航天等领域的重要数学工具。以下是为您整理的体系化学习路径,结合理论与实践:
一、四元数核心概念
-
基本定义
- 四元数形式:q = w + xi + yj + zk(w为实部,x,y,z为虚部)
- 单位四元数:w² + x² + y² + z² = 1(用于旋转表示)
-
与旋转的关联
- 比欧拉角更高效:避免万向节锁问题
- 比旋转矩阵更紧凑:仅需4个参数 vs 矩阵的9个参数
二、关键计算操作(附代码实现)
- 基本运算(Python示例)
import numpy as np
from scipy.spatial.transform import Rotation as R
# 创建四元数 (w,x,y,z顺序)
q1 = R.from_quat([0.707, 0, 0, 0.707]).as_quat() # 绕x轴旋转90度
# 四元数乘法(旋转叠加)
q2 = R.from_rotvec(np.pi/2 * np.array([0, 1, 0])).as_quat() # 绕y轴旋转90度
q_composite = (R.from_quat(q1) * R.from_quat(q2)).as_quat()
- 旋转向量转换
# 旋转向量 -> 四元数
rot_vec = np.array([0.1, 0.2, 0.3])
q = R.from_rotvec(rot_vec).as_quat()
# 四元数 -> 旋转矩阵
rot_matrix = R.from_quat(q).as_matrix()
三、典型应用场景
-
机器人姿态插值
- SLERP(球面线性插值)实现平滑旋转过渡:
q_start = R.from_euler('z', 30, degrees=True).as_quat() q_end = R.from_euler('z', 60, degrees=True).as_quat() t = 0.5 # 插值比例 q_interp = R.from_quat(q_start).slerp(q_end, t) -
IMU数据处理
- 陀螺仪积分获得姿态:
delta_angle = gyro_data * dt # 角速度积分 delta_q = R.from_rotvec(delta_angle).as_quat() current_q = (R.from_quat(prev_q) * R.from_quat(delta_q)).as_quat()
四、学习资源推荐
-
交互式工具
- 3Blue1Brown《四元数与三维旋转》可视化教程(B站可搜)
- Quaternion Calculator在线计算器
-
经典文献
- 《Quaternions and Rotation Sequences》(Jack B. Kuipers)
- NASA技术报告《Euler Angles, Quaternions, and Transformation Matrices》
-
编程实践
- ROS 2的tf2库四元数工具
- Eigen库的Quaternion类(C++)
五、常见误区提醒
-
约定差异注意:
- 不同库的存储顺序可能不同(w在前或xyz在前)
- ROS使用Hamilton约定,Unity使用JPL约定
-
计算稳定性:
- 定期归一化防止数值误差累积:
q /= np.linalg.norm(q) # 归一化处理
建议从2D旋转理解复数开始,逐步过渡到3D旋转的四元数表示。实际开发中推荐使用成熟的数学库(如Eigen、SciPy),避免重复造轮子。

浙公网安备 33010602011771号