ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于卡尔曼滤波的原理

2020-04-06 12:42:24  阅读:400  来源: 互联网

标签:xk 卡尔曼滤波 Hk 关于 bmatrix Pk 原理 Sigma


关于卡尔曼滤波的原理

文章目录

1.基本模型的建立

我们假设我们的系统的状态量有这样的线性的递归关系:
xk=Fkxk1+Bkuk x_k=F_kx_{k-1}+B_ku_{k} xk​=Fk​xk−1​+Bk​uk​

为了辅助读者理解,我们以匀速直线运动为例子,我们以位置(p)和速度(v)为状态量,状态检测的周期为Δt:

xk=[pkvk]=[1Δt01][pk1vk1]=Fkxk1 x_k=\begin{bmatrix} p_k\\ v_k \end{bmatrix}= \begin{bmatrix} 1&Δt\\ 0&1 \end{bmatrix} \begin{bmatrix} p_{k-1}\\ v_{k-1} \end{bmatrix} =F_kx_{k-1} xk​=[pk​vk​​]=[10​Δt1​][pk−1​vk−1​​]=Fk​xk−1​

在这里,Fk则表示前一个状态量和当前状态量的递归关系。

我们再引用变速直线运动的例子来解释Bk和uk:

xk=[pkvk]=[1Δt01][pk1vk1]+[12Δt2Δt]a=Fkxk1+Bkuk x_k=\begin{bmatrix} p_k\\ v_k \end{bmatrix}= \begin{bmatrix} 1&Δt\\ 0&1 \end{bmatrix} \begin{bmatrix} p_{k-1}\\ v_{k-1} \end{bmatrix} +\begin{bmatrix} \frac 12\Delta t^2\\ \Delta t \end{bmatrix}a =F_kx_{k-1}+B_ku_{k} xk​=[pk​vk​​]=[10​Δt1​][pk−1​vk−1​​]+[21​Δt2Δt​]a=Fk​xk−1​+Bk​uk​

匀速直线运动是物体在不受到合力的作用的时候所做的运动,其状态改变与外界无关,所以其状态只与上一检测时刻的状态相关。而变速直线运动,其运动状态的改变与加速度相关,加速度和合外力作用挂钩,所以在这个情景下,状态的变化不仅与上一观察时刻的状态相关,与当前的外界输入也相关。

为了描述一维观察量的精确程度,我们用方差这个统计量来表征。对于多维的随机变量,我们则用协相关矩阵来表征:
Pk=E(xkxkT)=[ΣppΣpvΣvpΣvv] P_k=E(x_kx_k^T)= \begin{bmatrix} \Sigma_{pp}&\Sigma_{pv}\\ \Sigma_{vp}&\Sigma_{vv} \end{bmatrix} Pk​=E(xk​xkT​)=[Σpp​Σvp​​Σpv​Σvv​​]

对于状态变量x的协相关矩阵,根据其性质,我们可以得到其递归表达式:

Pk=FkPk1FkT P_k=F_kP_{k-1}F_k^T Pk​=Fk​Pk−1​FkT​

2.引入干扰的情况

但是实际上,我们的状态观察往往存在各种各样的干扰,我们由中心极限定理,可以认为在大多数情境下,干扰服从高斯分布。我们的递归表达式也变为:
xk=Fkxk1+Bkuk+wkwkN(0,Qk) x_k=F_kx_{k-1}+B_ku_{k}+w_k \\ w_k\sim N(0,Q_k) xk​=Fk​xk−1​+Bk​uk​+wk​wk​∼N(0,Qk​)

于是我们的协相关矩阵的实际的递归表达式也应该为:

Pk=FkPk1FkT+Qk P_k=F_kP_{k-1}F_k^T+Q_k Pk​=Fk​Pk−1​FkT​+Qk​
不难看出,如果我们一直使用递归的形式来求下一观察时刻的状态观察值,那么最后协相关矩阵也可能会越来越大而不收敛。这也是为什么我们一般不会单独采用会累计误差的测量方法比如积分法的原因。

这个时候,数据融合的优势就体现出来了,加入我们还有一组传感器,它们可以测量出与x相关的被测量,我们假设传感器的测量值组成的矩阵为y,令传感器所测物理量和被观察状态物理量满足线性关系,用矩阵可以表示为:

y=Hx y=Hx y=Hx
我们可以认为传感器的测量值Y和递归估计值Hx这两个随机变量都分别服从两个高斯分布:

HkxkN(Hkx^k,HkPkHkT)YN(yk,R) H_kx_k\sim N(H_k\hat x_k,H_kP_kH_k^T) \\ Y\sim N(y_k,R) Hk​xk​∼N(Hk​x^k​,Hk​Pk​HkT​)Y∼N(yk​,R)

3.减少干扰的思路

在这里插入图片描述(图源:百家号-CSDN学院)

我们由上一部分的分析可以得知,当我们传感器测量值Y和状态改变的估计值Hx都服从两个正态分布,假设我们的观测量和测量量都是二维的,那么如图所示,这两个正态分布分布在绿色和红色两个区域(++注意:事实上服从正态分布的随机变量是不会有界的,但是我们一般认为其范围在μ±3σ之内,多维正态分布随机变量也同理++)。如果我们将这两个随机变量的概率密度函数相乘,再将其归一化,不就可以得到一个方差更小的分布吗?

对于一个服从n维正态分布的随机变量,其概率密度函数为:

p(x;μ1,Σ1)=1(2π)n2Σ112exp(12(xμ1)TΣ11(xμ1))p(x;μ2,Σ2)=1(2π)n2Σ212exp(12(xμ2)TΣ21(xμ2)) p(x;\mu_1,\Sigma_1)=\frac 1{(2\pi)^\frac n2|\Sigma_1|^\frac 12}\exp(-\frac12(x-\mu_1)^T\Sigma_1^{-1}(x-\mu_1))\\ p(x;\mu_2,\Sigma_2)=\frac 1{(2\pi)^\frac n2|\Sigma_2|^\frac 12}\exp(-\frac12(x-\mu_2)^T\Sigma_2^{-1}(x-\mu_2)) p(x;μ1​,Σ1​)=(2π)2n​∣Σ1​∣21​1​exp(−21​(x−μ1​)TΣ1−1​(x−μ1​))p(x;μ2​,Σ2​)=(2π)2n​∣Σ2​∣21​1​exp(−21​(x−μ2​)TΣ2−1​(x−μ2​))

两个概率密度函数做乘法再重新做归一化之后,所得的概率密度函数是一个高斯分布的概率密度函数,其均值和方差分别满足:
μ=μ1+K(μ2μ1)Σ=Σ1KΣ1 \mu'=\mu_1+K(\mu_2-\mu_1) \\ \Sigma'=\Sigma_1-K\Sigma_1 μ′=μ1​+K(μ2​−μ1​)Σ′=Σ1​−KΣ1​
其中:

K=Σ1(Σ1+Σ2)1 K=\Sigma_1(\Sigma_1+\Sigma_2)^{-1} K=Σ1​(Σ1​+Σ2​)−1

这样,我们就可以从概率分布与统计的角度减少了干扰对我们测量值的影响。
MPU9250

值得注意的是,我们的两个高斯分布真的会像这一部分刚开始所展示的图中所示的那样吗?答案肯定是否。但是我们在设定方案时,要尽量使我们的两个正态分布满足这样的关系。比如我们用于姿态结算的9轴传感器,就是利用陀螺仪来得到角速度,再利用角速度递归运算得到欧拉角,再利用加速度计和磁力计这两个可以获取绝对欧拉角的传感器来对结果做修正。这个数据融合的方式就可以选择卡尔曼滤波。陀螺仪可以得到较为准确的角速度信息,但是用其求欧拉角难免会存在累计误差,而加速度传感器和磁力计则没有累计误差,但是在运动时误差会很大,这三种传感器的测量结果恰好和图中的特性一致,利用卡尔曼滤波的方式则可以实现优势互补。

4.卡尔曼滤波的递归公式

根据第三部分所讲,我们可以用概率密度函数相乘的方式得到一个新的高斯分布,我们可以用这个新的高斯分布的均值和方差,作为我们新的状态值和其协相关矩阵的最优估计。

首先我们可以得到传感器测量值y的最佳估计:
Yk=Hkx^k+K(ykHkx^k)ΣYk=HkPkHkTKHkPkHkT Y'_k=H_k\hat x_k+K'(y_k-H_k\hat x_k) \\ \Sigma_{Y_k}=H_kP_kH_k^T-K'H_kP_kH_k^T Yk′​=Hk​x^k​+K′(yk​−Hk​x^k​)ΣYk​​=Hk​Pk​HkT​−K′Hk​Pk​HkT​
其中:
K=HkPkHkT(HkPkHkT+R)1 K'=H_kP_kH_k^T(H_kP_kH_k^T+R)^{-1} K′=Hk​Pk​HkT​(Hk​Pk​HkT​+R)−1
我们再根据物理量y与x的关系,得到x关于y的函数:
x=H1y x=H^{-1}y x=H−1y
于是我们对观察状态x的最优估计就可以写为:
X^k=Hk1Yk=x^k+K(ykHkx^k)Pk=PkKHkPkK=Hk1K=PkHkT(HkPkHkT+R)1 \hat X_k'=H^{-1}_kY_k'=\hat x_k+K(y_k-H_k\hat x_k) \\ P'_k=P_k-KH_kP_k \\K=H_k^{-1}K'=P_kH_k^T(H_kP_kH_k^T+R)^{-1} X^k′​=Hk−1​Yk′​=x^k​+K(yk​−Hk​x^k​)Pk′​=Pk​−KHk​Pk​K=Hk−1​K′=Pk​HkT​(Hk​Pk​HkT​+R)−1

那么综上所述,卡尔曼滤波关于观测状态x的递归公式为:
x^k=Fkx^k1+BkukP^k=FkPk1FkT+QX^k=x^k+K(ykHkx^k)Pk=(IKHk)PkK=PkHkT(HkPkHkT+R)1 \hat x_k=F_k\hat x_{k-1}+B_ku_k \\ \hat P_k=F_kP_{k-1}F_k^T+Q \\ \hat X_k'=\hat x_k+K(y_k-H_k\hat x_k) \\ P'_k=(I-KH_k)P_k \\ K=P_kH_k^T(H_kP_kH_k^T+R)^{-1} x^k​=Fk​x^k−1​+Bk​uk​P^k​=Fk​Pk−1​FkT​+QX^k′​=x^k​+K(yk​−Hk​x^k​)Pk′​=(I−KHk​)Pk​K=Pk​HkT​(Hk​Pk​HkT​+R)−1
值得注意的是,应用卡尔曼滤波的时候,我们必须要了解测量误差的方差R和过程误差的方差Q。 对于经典的卡尔曼滤波器,这两个值则需要我们通过测量和估计得到,之后有机会再深入研究一下。

5.参考资料

1.详解卡尔曼滤波原理——CSDN学院

2.【图灵鸡】什么是卡尔曼滤波?其实一点也不难!详解卡尔曼滤波

标签:xk,卡尔曼滤波,Hk,关于,bmatrix,Pk,原理,Sigma
来源: https://blog.csdn.net/LawrenceHU10/article/details/105327843

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有