卡尔曼滤波 KF | 扩展卡尔曼滤波 EKF (思路流程和计算公式)

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,1000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 本文分析卡尔曼滤波和扩展卡尔曼滤波,包括:思路流程、计算公式、简单案例等。滤波算法,在很多场景都有应用,感觉理解其思路和计算过程比较重要。

前言

本文分析卡尔曼滤波扩展卡尔曼滤波,包括:思路流程、计算公式、简单案例等。滤波算法,在很多场景都有应用,感觉理解其思路和计算过程比较重要。


一、卡尔曼滤波

卡尔曼滤波思想由 kalman于 1960 年提出,该方法:

假设状态噪声观测噪声符合高斯分布;

通过观测数据状态量 进行最优估计。

其实质是计算最大后验概率问题,只能应用于线性系统。


1.1 KF计算公式

卡尔曼滤波法的核心问题是:如何建立滤波所需的状态方程观测方程。在实际工作过程中,卡尔曼滤波法将为系统提供最优估计,其前提是系统应具备线性模型,使用卡尔曼滤波法可以简化计算量,并且节数据存储。

在定义系统的 状态方程 和 观测方程 分别如下:

image.gif

第一条公式:定义 k-1 时刻的状态为 ,其对应的协方差为。k时刻(当前时刻)的状态为;思路:先用上一时刻的状态,来预估当前时刻的状态

第二条公式:定义为当前时刻的观测值。思路:通过预估当前时刻的状态 和观测变量,来计算观察值


1.2 KF迭代过程

(1)预测:

image.gif

(2)更新:

首先更新卡尔曼增益 K

image.gif

然后基于卡尔曼增益 K再更新 更新后验概率分布(即:状态值、协方差)

image.gif


1.3 KF使用说明

卡尔曼滤波仅适用线性高斯系统, 目前大多数情况下机器人所涉及的状态估计是非线性的, 卡尔曼滤波的结果并不可靠。

针对卡尔曼滤波的缺陷,学者们提出了许多改进方法, 如扩展卡尔曼滤波(EKF)、无损卡尔曼滤波(UKF)、压缩扩展 卡尔曼滤波(CEKF)……。


二、卡尔曼滤波案例——多目标跟踪

多目标跟踪算法的经典算法DeepSort,它是一个两阶段的算法,达到实时跟踪效果,曾被应用于工业开发。

核心思想:使用递归的卡尔曼滤波和逐帧的匈牙利数据关联。

假定跟踪场景是定义在 8 维状态空间(u, v, γ, h, ẋ, ẏ, γ̇, ḣ)中, 边框中心(u, v),宽高比 γ,高度 h 和和它们各自在图像坐标系中的速度。

这里依旧使用的是匀速运动模型,并把(u,v,γ,h)作为对象状态的直接观测量。

image.gif编辑

在目标跟踪中,需要估计目标的以下两个状态:

均值(Mean):包含目标的位置和速度信息,由 8 维向量(u, v, γ, h, ẋ, ẏ, γ̇, ḣ)表示,其中每个速度值初始化为 0。均值 Mean 可以通过观测矩阵 H 投影到测量空间输出(u,v,γ,h)。

协方差(Covariance):表示估计状态的不确定性,由 8x8 的对角矩阵表示,矩阵中数字越大则表明不确定性越大。


2.1 卡尔曼滤波器——预测阶段

•step1:首先利用上一时刻 k-1 的后验估计值,通过状态转移矩阵 F 变换,得到当前时刻 k 的先验估计状态

image.gif编辑

其中,状态转移矩阵 F如下:

image.gif编辑

•step2:然后使用上一时刻 k-1 的后验估计协方差来计算当前时刻 k 的先验估计协方差

image.gif编辑

通过上一时刻后验估计均值和方差 估计 当前时刻先验估计均值x和协方差P

实现代码如下:

def predict(self, mean, covariance):
    # mean, covariance 相当于上一时刻的后验估计均值和协方差
    std_pos = [
        self._std_weight_position * mean[3],
        self._std_weight_position * mean[3],
        1e-2,
        self._std_weight_position * mean[3]]
    std_vel = [
        self._std_weight_velocity * mean[3],
        self._std_weight_velocity * mean[3],
        1e-5,
        self._std_weight_velocity * mean[3]]
    # 初始化噪声矩阵 Q
    motion_cov = np.diag(np.square(np.r_[std_pos, std_vel]))
    # x' = Fx
    mean = np.dot(self._motion_mat, mean)
    # P' = FPF^T + Q
    covariance = np.linalg.multi_dot((
        self._motion_mat, covariance, self._motion_mat.T)) + motion_cov
    # 返回当前时刻的先验估计均值 x 和协方差 P
    return mean, covariance

image.gif


2.2 卡尔曼滤波器——更新阶段

    • step1:首先利用先验估计协方差矩阵 P 和观测矩阵 H 以及测量状态协方差矩阵 R 计算出卡尔曼增益矩阵 K

    image.gif

      • step2:然后将卡尔曼滤波器的先验估计值 x 通过观测矩阵 H 投影到测量空间,并计算出与测量值 z 的残差 y

      image.gif

      image.gif

        • step3:将卡尔曼滤波器的预测值和测量值按照卡尔曼增益的比例相融合,得到后验估计值 x

        image.gif

          • step4:计算出卡尔曼滤波器的后验估计协方差

          image.gif

          卡尔曼滤波器更新阶段,代码实现:

          def update(self, mean, covariance, measurement):
              # 将先验估计的均值和协方差映射到检测空间,得到 Hx' 和 HP'
              projected_mean, projected_cov = self.project(mean, covariance)
              chol_factor, lower = scipy.linalg.cho_factor(
                  projected_cov, lower=True, check_finite=False)
              # 计算卡尔曼增益 K
              kalman_gain = scipy.linalg.cho_solve(
                  (chol_factor, lower), np.dot(covariance, self._update_mat.T).T,
                  check_finite=False).T
              # y = z - Hx'
              innovation = measurement - projected_mean
              # x = x' + Ky
              new_mean = mean + np.dot(innovation, kalman_gain.T)
              # P = (I - KH)P'
              new_covariance = covariance - np.linalg.multi_dot((
                  kalman_gain, projected_cov, kalman_gain.T))
              # 返回当前时刻的后验估计均值 x 和协方差 P
              return new_mean, new_covariance

          image.gif

          总结一下:

          在目标跟踪中,需要估计目标的以下两个状态:

          均值(Mean):包含目标的位置和速度信息,由 8 维向量(u, v, γ, h, ẋ, ẏ, γ̇, ḣ)表示,其中每个速度值初始化为 0。均值 Mean 可以通过观测矩阵 H 投影到测量空间输出(u,v,γ,h)。

          协方差(Covariance):表示估计状态的不确定性,由 8x8 的对角矩阵表示,矩阵中数字越大则表明不确定性越大。

          predict 阶段和 update 阶段都是为了计算出卡尔曼滤波的估计均值 x 协方差 P,不同的是前者是基于上一历史状态做出的先验估计,而后者则是融合了测量值信息并作出校正的后验估计

          详细参考:多目标跟踪算法 | DeepSort_一颗小树x的博客-CSDN博客_deepsort


          三、扩展卡尔曼滤波 EKF

          扩展卡尔曼滤波可以通过泰勒展开解决非线性情况下的问题

          3.1  EKF计算公式

          image.gif

          其中image.gif编辑是展开后得到的一阶偏导项。 在展开过程中省略了次数较高的项将状态估计方程转化为 近似的线性化方程

           

          3.2 EKF迭代过程

          迭代过程与卡尔曼滤波大致相似,

          (1)预测:

          image.gif

          (2)更新:

          首先更新卡尔曼增益 K

          image.gif

          然后基于卡尔曼增益 K再更新 更新后验概率分布(即:状态值、协方差)

          image.gif

          其中 R'与 Q' 为线性化后状态方程对应的新的协方差。


          3.3 EKF使用说明

          扩展卡尔曼滤波可以在非线性的场景下工作。但是,它在计算的时候忽略了展开式的高次项,因此估计会有误差,有可能会导致滤波器发散。

          几种滤波器的对比说明

          image.gif



          参考文献:

          [1] 李庆玲,许茂洲,张慧祥. SLAM 后端优化原理研究[J]. 技术设计与试验应用,2020.

          [2] 危双丰,庞 帆,刘振彬, 师现杰. 基于激光雷达的同时定位与地图构建方法综述[J]. 计算机应用研究,2020.


          本文直供大家参考学习,谢谢!

          相关文章
          |
          机器学习/深度学习 算法 计算机视觉
          3D目标检测框架 MMDetection3D环境搭建 docker篇
          本文介绍如何搭建3D目标检测框架,使用docker快速搭建MMDetection3D的开发环境,实现视觉3D目标检测、点云3D目标检测、多模态3D目标检测等等。
          1409 0
          |
          3月前
          |
          传感器 机器学习/深度学习 分布式计算
          卡尔曼滤波的多传感器数据融合算法
          卡尔曼滤波的多传感器数据融合算法
          366 0
          |
          传感器 机器学习/深度学习 数据采集
          【航迹关联】基于NNDA、PDA、JPDA三种算法实现航迹关联附matlab代码
          【航迹关联】基于NNDA、PDA、JPDA三种算法实现航迹关联附matlab代码
          |
          传感器 算法 定位技术
          【信号处理】扩展卡尔曼滤波EKF(Matlab代码实现)
          【信号处理】扩展卡尔曼滤波EKF(Matlab代码实现)
          671 0
          【信号处理】扩展卡尔曼滤波EKF(Matlab代码实现)
          |
          8月前
          |
          存储 机器学习/深度学习 算法
          《共轭梯度法VS梯度下降法:深度剖析两大优化算法的差异》
          梯度下降法与共轭梯度法是机器学习和优化中的重要算法。梯度下降法每次沿最速下降方向迭代,收敛慢且易出现“之字形”路径;共轭梯度法则利用共轭方向,避免重复搜索,收敛更快,尤其在二次型问题中表现优异。梯度下降法对步长敏感,存储需求大;共轭梯度法存储需求低,适合大规模问题。选择算法需综合考虑问题特性、数据规模及精度要求。
          281 6
          |
          9月前
          |
          传感器 资源调度 算法
          时间序列分析中的状态估计:状态空间模型与卡尔曼滤波的隐状态估计
          状态空间模型通过构建生成可观测数据的潜在未观测状态来进行时间序列分析,卡尔曼滤波为其核心,提供实时隐状态估计。本文深入探讨其理论基础与实践应用,涵盖线性及非线性系统的高级滤波算法(如EKF和UKF),并展示在运动目标跟踪等领域的具体应用,强调了参数调优和性能评估的重要性。
          364 11
          时间序列分析中的状态估计:状态空间模型与卡尔曼滤波的隐状态估计
          |
          机器学习/深度学习 分布式计算 并行计算
          【MATLAB】史上最全的13种数据拟合算法全家桶
          【MATLAB】史上最全的13种数据拟合算法全家桶
          2091 1
          |
          机器学习/深度学习 资源调度 自然语言处理
          长短时记忆网络(LSTM)完整实战:从理论到PyTorch实战演示
          长短时记忆网络(LSTM)完整实战:从理论到PyTorch实战演示
          17163 0
          |
          传感器 算法 定位技术
          卡尔曼滤波的原理、系统模型和C代码
          卡尔曼滤波用于陀螺仪加速度计数据融合
          |
          计算机视觉
          【目标跟踪】卡尔曼滤波器(Kalman Filter) 含源码
          【目标跟踪】卡尔曼滤波器(Kalman Filter) 含源码
          670 0