KFEKFIEKFUKF卡尔曼滤波器

Posted m_buddy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KFEKFIEKFUKF卡尔曼滤波器相关的知识,希望对你有一定的参考价值。

1. 概述

1.1 开篇

对于卡尔曼滤波的直观理解便是对所掌握数据的融合处理,假设手头有两个随机变量,知道其均值和方差,而且均值相同,那么我希望找到一个权重,使得把这两个随机变量组合起来,均值不变,方差减小,从线条上看当然变得平稳了一些,于是被搞工程的人成为滤波。

问题是权重如何找呢?简化一下问题,把这两个随机变量都视作服从正态分布的随机变量,这样通过计算可知,权重与它们的方差有关。

下一个问题是,往往手头只有一个滤波器,怎么办?可以给系统建模,根据历史信息计算出一个额外的数值来,为了简化问题,认为系统是线性的,那么输入数学模型给出的数值任然服从某个正态分布,均值和方差都可以从模型中导出。然后就可以开开心心地滤波了。

齐次要理解粒子滤波。接上,然而问题接踵而至,系统的模型往往都不是线性的啊!输入个正态分布的量,有的连解析式都写不出来,根本不知道输出的是个啥啊!于是想了个办法,我们不用均值和方差来表示随机变量,我们用数量居多的采样点来表示!!!把每个采样带进模型去计算,统统算完就得到了下一次的随机变量的采样点,当需要计算权重的时候再把方差给算出来。在计算力十分十分强大的仿真平台上,这方法还能说得过去。因为一般要用到的采样点很多,所以也被称作粒子云滤波。

现在可以理解无迹卡尔曼滤波了,在一般情况下,应用粒子滤波困难重重,因为那些粒子云经过多次迭代,很容易发生聚集,这样就无法精准的描述随机变量了,所以一般要择机向粒子云里稀疏的地方添加粒子,在太过稠密的地方减去粒子,不过谁能保证这么操作不会带来均值与方差的偏差?

此外为了达到精度要求,粒子的数量需要很大,这很难算的过来啊。此时相信你已经体会到了,如何更准更快的计算某个随机变量经过某个函数变成了怎样的随机变量才是卡尔曼滤波器的关键所在。无迹变换是尝试解决这个问题的一个方案,通过某种规则去采样,在粒子数量尽量小的情况下,去保证采样点云的均值和方差不变。不过我没做过无迹卡尔曼的仿真,对ut的理解不深入。

ref:无迹卡尔曼到底是什么东西?

1.2 问题定义

在时序运动系统中为了得到当前时刻自身的状态信息,一方面需要根据以往数据对当前时刻进行估计,同时需要使用传感器等测量工具对自身状态进行测量,进而调整估计模型使得估计更加准确。
x ˉ t = x ^ t + K t ( x ˙ t − H ⋅ x ^ t ) \\barx_t=\\hatx_t+\\mathcalK_t(\\dotx_t-\\mathcalH\\cdot\\hatx_t) xˉt=x^t+Kt(x˙tHx^t)
K t ∈ [ 0 , 1.0 ] \\mathcalK_t\\in[0,1.0] Kt[0,1.0]为卡尔曼增益, H \\mathcalH H为测量转换矩阵。符号统一定义:

  • 1)真实无偏差状态状态信息: x t x_t xt
  • 2)根据以往数据得到的当前时刻预测结果: x ^ t \\hatx_t x^t
  • 3)当前利用传感器等测量手段得到的测量结果: x ˙ t \\dotx_t x˙t
  • 4)根据现有预测结果和传感器测量结果得到的最后估计结果: x ˉ t \\barx_t xˉt

2. KF滤波器

2.1 KF下模型建立与推导

KF滤波器是线型滤波器,其理想状态转移方程(也可称为运动方程)可以描述为:
x t = F ⋅ x t − 1 + B ⋅ u t + ω t x_t=\\mathcalF\\cdot x_t-1+\\mathcalB\\cdot u_t+\\omega_t xt=Fxt1+But+ωt
其中, F \\mathcalF F代表状态转移矩阵, B \\mathcalB B代表控制矩阵, u t u_t ut代表控制信号(如加速度、转向角度等变量), ω t \\omega_t ωt代表系统噪声扰动,服从高斯分布。而上述的过程是理想情况下对线型系统的建模,而实际中对于实际运动预测描述为:
x ^ t = F ⋅ x ˉ t − 1 + B ⋅ u t \\hatx_t=\\mathcalF\\cdot \\barx_t-1+\\mathcalB\\cdot u_t x^t=Fxˉt1+But
注意,上面的式子中运动状态为上一时刻的估计结果 x ˉ t − 1 \\barx_t-1 xˉt1,而不是上一时刻的预测结果 x ^ t − 1 \\hatx_t-1 x^t1。在上述的过程中可以看到运动估计结果与真实无偏结果是存在偏差的,这里使用协方差去度量它们之间的差异:
P ^ t = E ( e ˉ e ˉ T ) = E ( ( x t − x ^ t ) ( x t − x ^ t ) T ) = E ( ( F ⋅ x t − 1 + B ⋅ u t + ω t − F ⋅ x ˉ t − 1 − B ⋅ u t ) ( F ⋅ x t − 1 + B ⋅ u t + ω t − F ⋅ x ˉ t − 1 − B ⋅ u t ) T ) = E ( ( F ( x t − 1 − x ˉ t − 1 ) + ω t ) ( F ( x t − 1 − x ˉ t − 1 ) + ω t ) T ) = E ( F ( x t − 1 − x ˉ t − 1 ) ( x t − 1 − x ˉ t − 1 ) T F T + ω t ω t T + F ( x t − 1 − x ˉ t − 1 ) ω t T + ω t ( x t − 1 − x ˉ t − 1 ) T F T ) = F E ( ( x t − 1 − x ˉ t − 1 ) ( x t − 1 − x ˉ t − 1 ) T ) F T + E ( ω t ω t T ) = F E ( ( x t − 1 − x ˉ t − 1 ) ( x t − 1 − x ˉ t − 1 ) T ) F T + Q t = F P ˉ t − 1 F T + Q t \\beginalign \\hatP_t&=E(\\bare\\bare^T)=E((x_t-\\hatx_t)(x_t-\\hatx_t)^T) \\\\ & = E((\\mathcalF\\cdot x_t-1+\\mathcalB\\cdot u_t+\\omega_t-\\mathcalF\\cdot \\barx_t-1-\\mathcalB\\cdot u_t)(\\mathcalF\\cdot x_t-1+\\mathcalB\\cdot u_t+\\omega_t-\\mathcalF\\cdot \\barx_t-1-\\mathcalB\\cdot u_t)^T) \\\\ & = E((\\mathcalF(x_t-1-\\barx_t-1)+\\omega_t)(\\mathcalF(x_t-1-\\barx_t-1)+\\omega_t)^T) \\\\ & = E(\\mathcalF(x_t-1-\\barx_t-1)(x_t-1-\\barx_t-1)^T\\mathcalF^T+\\omega_t\\omega_t^T+\\mathcalF(x_t-1-\\barx_t-1)\\omega_t^T+\\omega_t(x_t-1-\\barx_t-1)^T\\mathcalF^T) \\\\ & = \\mathcalFE((x_t-1-\\barx_t-1)(x_t-1-\\barx_t-1)^T)\\mathcalF^T+E(\\omega_t\\omega_t^T) \\\\ & = \\mathcalFE((x_t-1-\\barx_t-1)(x_t-1-\\barx_t-1)^T)\\mathcalF^T+Q_t \\\\ & = \\mathcalF\\barP_t-1\\mathcalF^T+Q_t \\endalign P^t=E(eˉeˉT)=E((xtx^t)(xtx^t)T)=E((Fxt1+But+ωtFxˉt1更改 OpenCV 的卡尔曼滤波器中的增益以使其更具响应性

C语言实现简单卡尔曼滤波

如果卡尔曼滤波器无法计算出稳定的卡尔曼增益,可能的原因是啥?

卡尔曼滤波器1——递归算法(笔记篇 + 代码实现)

卡尔曼滤波器1——递归算法(笔记篇 + 代码实现)

目标定位基于matlab循环增益卡尔曼滤波目标定位仿真含Matlab源码 145期