飞行器学习——坐标系变换(一):欧拉角法

本文深入探讨飞行器领域的坐标轴定义及变换,包括惯性系、地面固定坐标系、航迹坐标系与机体轴系。讲解二维平面坐标系转换原理,通过欧拉角法介绍三维坐标系变换矩阵,提供Z-Y-X旋转顺序下的具体实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初识飞行器,第一个绕不开又让人觉得无比头疼的就是坐标轴的定义以及它们之间的变换。

 

在飞行器领域,主要用到的坐标轴有

  1. 惯性系Ox_iy_iz_i(宇宙中绝对静止的坐标轴)

  2. 地面固定坐标系 Ox_Ey_Ez_E(固定在地球中心,考虑地球自转时适用)

  3. 航迹坐标系 Ox_ey_ez_e (坐标原点位于地面,Ox_e,Oy_e,Oz_e分别指向北向、东向、地心)

  4. 机体轴系 Ox_by_bz_b (固连在机体上,Ox_b,Oy_b,Oz_b分别指向机头、机右、机底)


两个坐标系之间的转换,在飞行动力学中主要有欧拉角法四元数法等等。

本次主要学习欧拉角法

首先,针对二维平面坐标系的转换进行分析,如下图,原坐标系Oxy逆时针旋转\theta角,两个单位向量\vec{e_x},\vec{e_y}经过旋转后成为\vec{e_x^{'}},\vec{e_y^{'}},计算两个坐标系之间的转换矩阵 T ,即让等式 \begin{bmatrix} \vec{e_x^{'}} \\ \vec{e_y^{'}} \\ \end{bmatrix} = T \begin{bmatrix} \vec{e_x} \\ \vec{e_y} \\ \end{bmatrix} 成立的 T

分别分析两个向量:

\vec{e_x^{'}}=|\vec{e_x^{'}}|cos\theta\vec{e_x}+|\vec{e_x^{'}}|sin\theta\vec{e_y} \\ =cos\theta\vec{e_x}+sin\theta\vec{e_y} \vec{e_y^{'}}=-|\vec{e_y^{'}}|sin\theta\vec{e_x}+|\vec{e_y^{'}}|cos\theta\vec{e_y} \\ =-sin\theta\vec{e_x}+cos\theta\vec{e_y}

整理成紧凑形式:

\begin{bmatrix} \vec{e_x^{'}} \\ \vec{e_y^{'}} \\ \end{bmatrix} = \begin{bmatrix} cos\theta & sin\theta \\ -sin\theta & cos\theta \\ \end{bmatrix} \begin{bmatrix} \vec{e_x} \\ \vec{e_y} \\ \end{bmatrix}

如果我们这时候再加上一条垂直屏幕向外的Oz轴,上面的步骤我们可以描述成绕 Oz轴逆时针旋转\theta角,那么上述的式子就可以扩维成

\begin{bmatrix} \vec{e_x^{'}} \\ \vec{e_y^{'}} \\ \vec{e_z^{'}} \\ \end{bmatrix} = \begin{bmatrix} cos\theta & sin\theta & 0 \\ -sin\theta & cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \vec{e_x} \\ \vec{e_y} \\ \vec{e_z} \\ \end{bmatrix}

读者们可以自行按照这个步骤推导一下顺时针旋转情况下的变换矩阵。


在三维环境下,也就有三个轴的旋转,根据坐标轴转换顺序的不同,这三个矩阵按不同顺序相乘可以分别获得不同的最终坐标系变换矩阵

看到这密密麻麻的字母,我当时是有撕课本的冲动的。

想到撕了还要给图书馆还一本新的,贫穷又使我恢复了理智。 

 

下面给出三个轴旋转的基元旋转矩阵,以上所有的公式都是从这些基元旋转矩阵推出的:(Tips:实际计算时需注意顺时针或逆时针旋转)

 

绕X轴的旋转变换矩阵为:R_x(\theta_x) = \begin{bmatrix} 1 & 0 & 0\\ 0 & cos\theta_x & -sin\theta_x\\0 & sin\theta_x & cos\theta_x \end{bmatrix}

 

绕Y轴的旋转变换矩阵为:R_y(\theta_y) = \begin{bmatrix} cos\theta_y & 0 & sin\theta_y\\0 & 1 & 0\\-sin\theta_y & 0 & cos\theta_y \end{bmatrix}

 

绕Z轴的旋转变换矩阵为:R_z(\theta_z) = \begin{bmatrix} cos\theta_z & -sin\theta_z & 0\\sin\theta_z & cos\theta_z & 0\\0 & 0 & 1 \end{bmatrix}

 

按照飞行器建模时常用的Z-Y-X旋转顺序,经过验算,与上图中的答案相同。

%% 计算ZYX旋转顺序下的坐标系变换矩阵 syms cx sx cy sy cz sz 
Rx = [1 0 0; 0 cx -sx; 0 sx cx]; 
Ry = [cy 0 sy; 0 1 0; -sy 0 cy]; 
Rz = [cz -sz 0; sz cz 0; 0 0 1]; 
Rz * Ry * Rx 


--------运行以上程序-------- 

ans = 
[ cy*cz, cz*sx*sy - cx*sz, sx*sz + cx*cz*sy] 
[ cy*sz, cx*cz + sx*sy*sz, cx*sy*sz - cz*sx] 
[ -sy, cy*sx, cx*cy]

 

### 四旋翼飞行器姿态解算算法实现 四旋翼飞行器的姿态解算是指通过对传感器数据的处理,获取飞行器相对于地面坐标系的姿态信息。这过程通常依赖于IMU(惯性测量单元)提供的三轴加速度、角速度以及可能来自磁力计的数据。 #### 数据采集与预处理 MPU9250作为常用的IMU模块,能够提供16位精度的三维陀螺仪值、加速度值和磁力计值。这些原始数据需要经过初步校准去除偏置误差和其他干扰因素[^2]。 ```python import numpy as np def preprocess_data(raw_gyro, raw_accel): """ 对原始IMU数据进行预处理 """ # 这里假设已经完成了硬件级别的零点漂移补偿 gyro_calibrated = raw_gyro * GYRO_SENSITIVITY # 将ADC码转换为实际角度变化率(rad/s) accel_calibrated = (raw_accel - ACCEL_BIAS) * ACCEL_SENSITIVITY # 减去静态偏差并缩放至物理单位(m/s²) return gyro_calibrated, accel_calibrated ``` #### Mahony互补滤波算法详解 Mahony互补滤波是种简单有效的姿态估计方法,它结合了低频响应良好的加速度计读数和高频特性优秀的陀螺仪信号。该算法的核心在于动态调整比例因子k_p来权衡两者之间的贡献: - 当仅依靠积分后的陀螺仪输出时,虽然短期稳定但长期存在累积误差; - 加入重力矢量辅助修正可以有效抑制这种趋势,不过容易受到外界振动影响而引入瞬态错误; 因此,在每次迭代过程中都会计算预测姿态q_pred与观测到的地垂线方向差异e,并据此更新最终的姿态表示形式——四元数Q。 ```python class ComplementaryFilter: def __init__(self, kp=0.5): self.q = np.array([1., 0., 0., 0.]) # 初始化为无旋转状态 self.kp = kp def update(self, wxyz, acc_xyz): q_pred = ... # 使用wxyz增量更新上时刻的状态 e = compute_gravity_error(q_pred, acc_xyz) # 计算当前估算下的重力分量偏离程度 dq = correct_with_kinematic_model(e*self.kp*dt) # 应用动力学模型得出矫正项dq self.q += dq # 更新全局姿态变量 normalize_quaternion(self.q) # 归化保持数值稳定性 ``` 上述代码片段展示了如何利用Mahony互补滤波完成次完整的姿态更新操作。其中`compute_gravity_error()`函数负责评估理论重力投影同实测加速度间的差距大小;而`correct_with_kinematic_model()`则基于此差值构建相应的微调指令传递给核心姿态表达式。 值得注意的是,尽管这里采用了较为直观易懂的方式呈现整个流程,但在实际工程应用当中还需要考虑更多细节问题比如温度效应引起的灵敏度变化、多源异构传感设备同步采样机制等等。 #### 输出结果转换 为了便于后续控制逻辑的理解与实施,往往还需进步把内部存储着的四元数形态转译回更贴近人类直觉认知习惯的形式—欧拉角。这步骤涉及到复杂的三角变换关系,具体可参见相关文献说明[^3]。 ```python def quaternion_to_euler_angle(w, x, y, z): ysqr = y*y t0 = +2.0 * (w*x + y*z) t1 = +1.0 - 2.0*(x*x + ysqr) X = math.atan2(t0,t1) t2 = +2.0 * (w*y - z*x) t2 = max(-1,min(+1,t2)) Y = math.asin(t2) t3 = +2.0 * (w*z + x*y) t4 = +1.0 - 2.0 *(ysqr+z*z) Z = math.atan2(t3,t4) return X*rad2deg(),Y*rad2deg(),Z*rad2deg() ``` 通过以上步骤,实现了从原始IMU数据到可用于PID控制器输入端的标准欧拉角序列的转变,从而支持了更加精准可靠的飞行操控体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值