ArduPilot 卡尔曼滤波算法

ArduPilot是一个开源的飞行控制系统,它支持多种无人机和自主车辆。作为一个开源项目,其代码可以在 Github 上公开访问。

ArduPilot的卡尔曼滤波代码位于libraries/AP_NavEKF2目录中。NavEKF2代表Navigation EKF second generation,即导航扩展卡尔曼滤波器第二代。

在这个目录中,最重要的代码文件是EKF.cpp,它包含了整个EKF算法的实现。该文件实现了解析陀螺仪、加速度计、磁力计、GPS等传感器数据的过程,并使用卡尔曼滤波器来估计系统的状态。

除了EKF.cpp之外,还有其他一些文件也包括一些与卡尔曼滤波相关的代码,例如:

  • AP_NavEKF2.h:定义了导航EK的配置选项和各种数据结构。
  • AP_NavEKF2_core.cpp: 实现了导航EK的基本功能,例如更新状态和计算航向。
  • AP_NavEKF2_core.h:定义了导航EK的核心功能接口。

在ArduPilot中,卡尔曼滤波使用了一种称为EKF(Extended Kalman Filter)的改进型算法,用于同时处理多项传感器的数据。

该算法的中体框架如下:

  1. 预测状态

在控制系统中,我们需要对无人机的位置、速度、角度等状态进行预测。这可以通过利用物理方程与上一时刻的状态进行计算来实现。在ArduPilot中,预测状态的过程用一个函数EKFFusion::CalculatePrediction()实现。该函数会根据系统动力学模型将上次的估计状态值和参数输入,计算出当前时间步估计出来的状态更新值,存储到kalmanStatePred结构体中。

  1. 传感器数据融合

在控制系统中,我们通常会使用多个传感器读取不同的状态量,并将它们合并成一个有关目标的更完整的状态估计。在ArduPilot中,使用传感器数据集的贡献来估计新的航空位置解和能够使得所有传感器数据点内部最小化误差偏差扰动的状态方差/协方差矩阵。

该算法的输入是姿态、位置和速度测量及其对应的状态噪声模型。在预测状态后,通过将得到的传感器数据与刚才的EKF预测进行比较,并使用Kalman增益修正预测来校准一部分或所有的状态变量。如果传感器数据以内部的标准进行校准,它们的最佳贡献将被合并为一个最终估计值。在ArduPilot中,传感器数据融合过程用一个函数EKFFusion::Fuse()实现。

  1. 误差补偿

当我们使用数据进行校准时,可能会发现我们所使用的数据有一定的误差和偏差。因此,在数据融合之后,我们需要进一步地进行误差补偿。通常,误差补偿是消除传感器畸变和系统偏差的过程。在ArduPilot中,误差补偿过程由EKFFusion::CorrectStates()函数实现。该函数将校准过的传感器数据投影回原始状态变量上,并计算误差后,再次更新kalmanState结构体来完成当前飞行间隔(delta_time)下机体角度,速度及位置等状态的卡尔曼滤波更新。

  1. 输出

当以上步骤完成后,我们就可以使用EKF在动态运行的系统下对无人机进行姿态、位置和速度估计了。 ArduPilot将结果输出到系统的指令队列中,通过先前定义好的系统命令完成控制算法,实现了自主飞行。

综上所述,ArduPilot中卡尔曼滤波的基本框架包括预测状态、传感器数据融合、误差补偿等步骤。其中预测状态和传感器数据融合是整个算法最为核心的部分,在广泛应用多项传感器的同时,可以大大提高飞行姿态估计及定位的精度和可靠性 。

相关文章