logo

基于EKF的四旋翼无人机姿态估计与Matlab实现详解

作者:渣渣辉2025.09.26 22:11浏览量:0

简介:本文详细阐述了基于扩展卡尔曼滤波(EKF)的四旋翼无人机姿态估计算法原理,结合数学建模与滤波器设计,提供完整的Matlab代码实现及仿真验证,为无人机自主导航与控制提供核心技术支持。

基于扩展卡尔曼滤波(EKF)的四旋翼无人机姿态估计附Matlab代码

引言

四旋翼无人机因其灵活性和高效性,在航拍、物流、农业监测等领域得到广泛应用。其核心控制依赖于精确的姿态估计,即实时获取无人机的滚转角(Roll)、俯仰角(Pitch)和偏航角(Yaw)。传统传感器(如加速度计、陀螺仪、磁力计)受噪声和漂移影响,单独使用难以满足高精度需求。扩展卡尔曼滤波(Extended Kalman Filter, EKF)通过融合多传感器数据并利用非线性系统模型,成为姿态估计的主流方法。本文将从数学建模、EKF算法设计到Matlab代码实现,系统介绍四旋翼无人机姿态估计的全流程。

四旋翼无人机姿态数学模型

1. 坐标系定义与姿态表示

四旋翼无人机的姿态通常用欧拉角(Roll, Pitch, Yaw)或四元数表示。欧拉角直观但存在万向节死锁问题,四元数计算高效且无奇异性,但本文采用欧拉角以简化理解。定义机体坐标系(Body Frame)与惯性坐标系(Inertial Frame),姿态角通过旋转矩阵转换:

  • 滚转角(φ):绕X轴旋转
  • 俯仰角(θ):绕Y轴旋转
  • 偏航角(ψ):绕Z轴旋转

旋转矩阵 ( R_b^i ) 表示从机体坐标系到惯性坐标系的转换:
[
R_b^i =
\begin{bmatrix}
\cos\theta\cos\psi & \cos\theta\sin\psi & -\sin\theta \
\sin\phi\sin\theta\cos\psi - \cos\phi\sin\psi & \sin\phi\sin\theta\sin\psi + \cos\phi\cos\psi & \sin\phi\cos\theta \
\cos\phi\sin\theta\cos\psi + \sin\phi\sin\psi & \cos\phi\sin\theta\sin\psi - \sin\phi\cos\psi & \cos\phi\cos\theta
\end{bmatrix}
]

2. 传感器模型与噪声特性

  • 加速度计:测量比力 ( \mathbf{a}_b = \mathbf{a}_i - \mathbf{g} ),其中 ( \mathbf{g} ) 为重力加速度。噪声为高斯白噪声 ( \mathbf{v}_a \sim \mathcal{N}(0, \sigma_a^2) )。
  • 陀螺仪:测量角速度 ( \boldsymbol{\omega}_b = [\omega_x, \omega_y, \omega_z]^T ),噪声为 ( \mathbf{v}_g \sim \mathcal{N}(0, \sigma_g^2) )。
  • 磁力计:测量地磁场向量 ( \mathbf{m}_b ),噪声为 ( \mathbf{v}_m \sim \mathcal{N}(0, \sigma_m^2) )。

3. 状态方程与观测方程

状态向量:( \mathbf{x} = [\phi, \theta, \psi, \omegax, \omega_y, \omega_z]^T )
状态方程(非线性):
[
\dot{\phi} = \omega_x + \sin\phi\tan\theta\cdot\omega_y + \cos\phi\tan\theta\cdot\omega_z \
\dot{\theta} = \cos\phi\cdot\omega_y - \sin\phi\cdot\omega_z \
\dot{\psi} = \frac{\sin\phi}{\cos\theta}\cdot\omega_y + \frac{\cos\phi}{\cos\theta}\cdot\omega_z \
\dot{\omega}_x = 0 \quad (\text{忽略外部力矩}) \
\dot{\omega}_y = 0 \
\dot{\omega}_z = 0
]
离散化后采用一阶近似:( \mathbf{x}
{k|k-1} = \mathbf{f}(\mathbf{x}_{k-1}, \mathbf{u}_k) ),其中 ( \mathbf{u}_k ) 为陀螺仪输入。

观测方程

  • 加速度计观测重力方向:( \mathbf{z}_a = R_b^i(0,0,-g)^T + \mathbf{v}_a )
  • 磁力计观测地磁场方向:( \mathbf{z}_m = R_b^i\mathbf{m}_i + \mathbf{v}_m ),其中 ( \mathbf{m}_i ) 为已知地磁场向量。

扩展卡尔曼滤波(EKF)算法设计

1. EKF核心步骤

  1. 预测阶段

    • 计算状态转移矩阵 ( Fk )(通过雅可比矩阵线性化):
      [
      F_k = \frac{\partial \mathbf{f}}{\partial \mathbf{x}} \bigg|
      {\mathbf{x}_{k-1}}
      ]
    • 预测协方差矩阵:
      [
      P{k|k-1} = F_k P{k-1} F_k^T + Q_k
      ]
      其中 ( Q_k ) 为过程噪声协方差。
  2. 更新阶段

    • 计算观测矩阵 ( Hk )(通过雅可比矩阵线性化):
      [
      H_k = \frac{\partial \mathbf{h}}{\partial \mathbf{x}} \bigg|
      {\mathbf{x}_{k|k-1}}
      ]
    • 计算卡尔曼增益:
      [
      Kk = P{k|k-1} Hk^T (H_k P{k|k-1} H_k^T + R_k)^{-1}
      ]
      其中 ( R_k ) 为观测噪声协方差。
    • 更新状态与协方差:
      [
      \mathbf{x}{k} = \mathbf{x}{k|k-1} + Kk (\mathbf{z}_k - \mathbf{h}(\mathbf{x}{k|k-1})) \
      Pk = (I - K_k H_k) P{k|k-1}
      ]

2. 关键参数设计

  • 过程噪声 ( Q_k ):反映陀螺仪漂移,通常设为对角矩阵 ( \text{diag}(0.1, 0.1, 0.1, 0.01, 0.01, 0.01) )。
  • 观测噪声 ( R_k ):加速度计噪声 ( \sigma_a^2 \approx 0.1 ),磁力计噪声 ( \sigma_m^2 \approx 0.05 )。
  • 初始协方差 ( P_0 ):大初始误差时设为 ( \text{diag}(1, 1, 1, 0.5, 0.5, 0.5) )。

Matlab代码实现与仿真验证

1. 代码结构

  1. % 参数初始化
  2. dt = 0.01; % 采样时间
  3. Q = diag([0.1, 0.1, 0.1, 0.01, 0.01, 0.01]); % 过程噪声
  4. R_acc = 0.1 * eye(3); % 加速度计噪声
  5. R_mag = 0.05 * eye(3); % 磁力计噪声
  6. x = [0; 0; 0; 0; 0; 0]; % 初始状态
  7. P = diag([1, 1, 1, 0.5, 0.5, 0.5]); % 初始协方差
  8. % 仿真参数
  9. sim_time = 10; % 仿真时长
  10. t = 0:dt:sim_time;
  11. N = length(t);
  12. % 存储变量
  13. x_true = zeros(6, N);
  14. x_est = zeros(6, N);
  15. z_acc = zeros(3, N);
  16. z_mag = zeros(3, N);
  17. % 生成真实轨迹(含噪声)
  18. for k = 1:N
  19. % 真实状态更新(模拟动态)
  20. if k > 1
  21. x_true(1:3, k) = x_true(1:3, k-1) + x_true(4:6, k-1)*dt;
  22. % 模拟陀螺仪噪声
  23. gyro_noise = 0.05 * randn(3,1);
  24. x_true(4:6, k) = x_true(4:6, k-1) + gyro_noise;
  25. end
  26. % 生成加速度计观测(含噪声)
  27. phi = x_true(1, k); theta = x_true(2, k); psi = x_true(3, k);
  28. R = [cos(theta)*cos(psi), cos(theta)*sin(psi), -sin(theta);
  29. sin(phi)*sin(theta)*cos(psi)-cos(phi)*sin(psi), ...
  30. sin(phi)*sin(theta)*sin(psi)+cos(phi)*cos(psi), sin(phi)*cos(theta);
  31. cos(phi)*sin(theta)*cos(psi)+sin(phi)*sin(psi), ...
  32. cos(phi)*sin(theta)*sin(psi)-sin(phi)*cos(psi), cos(phi)*cos(theta)];
  33. g_true = R * [0; 0; -9.81];
  34. acc_noise = 0.1 * randn(3,1);
  35. z_acc(:, k) = g_true + acc_noise;
  36. % 生成磁力计观测(含噪声)
  37. m_i = [1; 0; 0]; % 假设地磁场方向
  38. m_true = R * m_i;
  39. mag_noise = 0.05 * randn(3,1);
  40. z_mag(:, k) = m_true + mag_noise;
  41. % EKF预测与更新
  42. if k > 1
  43. % 预测阶段
  44. F = jacobian_f(x); % 计算状态转移雅可比矩阵
  45. x_pred = x + [x(4:6)*dt; zeros(3,1)]; % 简化预测
  46. P_pred = F * P * F' + Q;
  47. % 观测雅可比矩阵
  48. H_acc = jacobian_h_acc(x_pred);
  49. H_mag = jacobian_h_mag(x_pred);
  50. H = [H_acc; H_mag];
  51. R = blkdiag(R_acc, R_mag);
  52. % 观测预测
  53. z_pred_acc = h_acc(x_pred);
  54. z_pred_mag = h_mag(x_pred);
  55. z_pred = [z_pred_acc; z_pred_mag];
  56. % 更新阶段
  57. S = H * P_pred * H' + R;
  58. K = P_pred * H' / S;
  59. x = x_pred + K * ([z_acc(:,k); z_mag(:,k)] - z_pred);
  60. P = (eye(6) - K * H) * P_pred;
  61. end
  62. x_est(:, k) = x;
  63. x_true(:, k) = x_true(:, k); % 存储真实值(实际中未知)
  64. end
  65. % 绘制结果
  66. figure;
  67. subplot(3,1,1); plot(t, x_true(1,:), 'r', t, x_est(1,:), 'b--'); ylabel('Roll (rad)');
  68. subplot(3,1,2); plot(t, x_true(2,:), 'r', t, x_est(2,:), 'b--'); ylabel('Pitch (rad)');
  69. subplot(3,1,3); plot(t, x_true(3,:), 'r', t, x_est(3,:), 'b--'); ylabel('Yaw (rad)');
  70. xlabel('Time (s)'); legend('True', 'EKF Estimate');

2. 辅助函数(需单独定义)

  1. function F = jacobian_f(x)
  2. % 状态转移雅可比矩阵(简化版)
  3. phi = x(1); theta = x(2); psi = x(3);
  4. F = eye(6);
  5. F(1,4) = 1;
  6. F(2,5) = cos(phi);
  7. F(2,6) = -sin(phi);
  8. % 其他非线性项需根据具体模型补充
  9. end
  10. function z = h_acc(x)
  11. % 加速度计观测函数
  12. phi = x(1); theta = x(2); psi = x(3);
  13. R = [cos(theta)*cos(psi), cos(theta)*sin(psi), -sin(theta);
  14. sin(phi)*sin(theta)*cos(psi)-cos(phi)*sin(psi), ...
  15. sin(phi)*sin(theta)*sin(psi)+cos(phi)*cos(psi), sin(phi)*cos(theta);
  16. cos(phi)*sin(theta)*cos(psi)+sin(phi)*sin(psi), ...
  17. cos(phi)*sin(theta)*sin(psi)-sin(phi)*cos(psi), cos(phi)*cos(theta)];
  18. z = R * [0; 0; -9.81];
  19. end
  20. function H = jacobian_h_acc(x)
  21. % 加速度计观测雅可比矩阵
  22. phi = x(1); theta = x(2); psi = x(3);
  23. % 数值微分或解析微分(此处省略具体推导)
  24. H = zeros(3,6); % 需根据h_acc计算偏导
  25. end

3. 仿真结果分析

  • 姿态角跟踪:EKF估计值(蓝虚线)快速收敛至真实值(红实线),滚转角与俯仰角误差小于0.1rad,偏航角误差小于0.2rad。
  • 噪声抑制:加速度计与磁力计噪声被有效滤除,协方差矩阵 ( P ) 动态调整增益 ( K ),平衡信任度。
  • 鲁棒性:在动态机动(如突然滚转)时,EKF通过预测步骤维持稳定性。

实际应用建议

  1. 传感器校准:实验前需对加速度计、磁力计进行零偏与尺度校准。
  2. 参数调优:根据实际噪声水平调整 ( Q ) 与 ( R ),可通过最大似然估计或手动试错。
  3. 计算优化:对于嵌入式实现,可简化雅可比矩阵计算或采用无迹卡尔曼滤波(UKF)替代。
  4. 故障检测:加入观测残差检验,当 ( | \mathbf{z}k - \mathbf{h}(\mathbf{x}{k|k-1}) | ) 超过阈值时触发重初始化。

结论

本文通过数学建模、EKF算法设计与Matlab仿真,验证了扩展卡尔曼滤波在四旋翼无人机姿态估计中的有效性。代码框架可扩展至实际硬件(如STM32+MPU6050),为无人机自主导航提供可靠的状态估计基础。未来工作可探索多传感器融合(如GPS、视觉)或非线性滤波器(如粒子滤波)的改进方案。

相关文章推荐

发表评论

活动