卡尔曼滤波器2——数据融合(笔记篇 + 代码实现)

举报
一颗小树x 发表于 2021/08/26 00:18:36 2021/08/26
【摘要】 前言本文是观看DR_CAN老师的视频后,简单总结了一下的笔记,并根据思路写了示例代码;这里主要讲使用卡尔曼滤波器进行数据融合。视频地址:https://www.bilibili.com/video/BV12D4y1S7fU数据融合 Date Fusion这里从一个例子开始,用“两个称”来称同一个物体,得到两个结果;第一个称结果是30g,第二个称结构是32g。由于两个称都不准,存在误差的。第一...

前言

本文是观看DR_CAN老师的视频后,简单总结了一下的笔记,并根据思路写了示例代码;这里主要讲使用卡尔曼滤波器进行数据融合。

视频地址:https://www.bilibili.com/video/BV12D4y1S7fU


数据融合 Date Fusion

这里从一个例子开始,用“两个称”来称同一个物体,得到两个结果;第一个称结果是30g,第二个称结构是32g。

由于两个称都不准,存在误差的。第一个称的标准差是2g;第二个称的标准差是4g。而且都符合正态分布,也称为高斯分布。

数学形式记为:

第一个称  Z_{1} = 30g;\sigma _{1}=2g

第二个称  Z_{2} = 32g;\sigma _{2}=4g

 下面看看,两个称的输出的概率分布情况;第一个称服从正态分布,标准差是2g;所以他在28g到32g之间的概率是68.4%。

 第二个称也服从正态分布,标准差是4g;所以他在28g到36g之间的概率是68.4%。相对于第一个称,由于标准差更大,所以看起来,更矮一些更胖一些。

 

现在需要用这两个称的结果,去“估计真实值”,如何估算呢?

感觉上是在这两个称结果之间,而且第一个称标准差更小,真实结果更靠近第一个称的结果。

数学上是找到一个最优值,于是采用卡尔曼算法。设估计值为z \hat{},则:     z\hat{} = Z_{_{1}} + K( Z_{_{2}} - Z_{_{1}} )

其中 K 是卡尔曼增益;它的范围在0到1,即[0,1]。

目的 是求 K 使得估计值的标准最少,也就是使得估计值的方差最小。

设: 估计值z \hat{} ,估计值标准差\sigma _{z},估计值的方差Var(z \hat{})。

估计值的方差 \sigma _{_{z}}^{2}=

= Var(Z_{_{1}} + K( Z_{_{2}} - Z_{_{1}} ))                     

= Var(Z_{_{1}} + KZ_{_{2}} - KZ_{_{1}} )

= Var({\color{Red} (1-K)Z_{_{1}}} + {\color{Blue} KZ_{_{2}}} )                      

= Var((1-K)Z_{_{1}}) +Var(KZ_{_{2}} )   

= (1-K)^{2} *Var(Z_{_{1}}) +K^{2}*Var(Z_{_{2}} )    

= {\color{Teal} {\color{Teal} (1-K)^{2} *\sigma _{1}^{2} +K^{2}*\sigma _{2}^{2}}}

备注:红色和蓝色两部分相互独立,可以单独拿出来;


如果要求估计值方差的最小值,需要对k求导,然后令它等于0,就可以求得极值了:

\frac{d\sigma _{z}^{2}}{dk} = 0

上面求得 估计值的方差\sigma _{z}^{2}= {\color{Teal} {\color{Teal} (1-K)^{2} *\sigma _{1}^{2} +K^{2}*\sigma _{2}^{2}}},进行求导得到:

-2(1-k)\sigma _{1}^{2} + 2k\sigma _{2}^{2} = 0

即: -\sigma _{1}^{2} + k\sigma _{1}^{2} + k\sigma _{2}^{2} =0

整理后得到: k=\frac{\sigma _{1}^{2}}{\sigma _{1}^{2} + \sigma _{2}^{2}}

好啦,现在求出k,这个k值能使得估计值方差的最小

然后把数据代入,

第一个称  Z_{1} = 30g;\sigma _{1}=2g  解释:称得是30g,标准差是2g。

第二个称  Z_{2} = 32g;\sigma _{2}=4g  解释:称得是32g,标准差是4g。

先求k值 卡尔曼增益,k= \frac{2^{2}}{2^{2} + 4^{2}} =0.2

然后计算估计值 z \hat{}z\hat{} = Z_{_{1}} + K( Z_{_{2}} - Z_{_{1}} ) = 30+0.2(32-30)=30.4

最后更新一下估计值的方差\sigma _{_{z}}^{2}\sigma _{_{z}}^{2}={\color{Teal} {\color{Teal} (1-K)^{2} *\sigma _{1}^{2} +K^{2}*\sigma _{2}^{2}}}=(1-0.2)^{2}2^{2}+0.2^{2}4^{2}=3.2

 于是估计值的标准差\sigma _{_{z}}^{} 等于1.79。

Python版的伪代码:

 
'''
卡尔曼滤波——数据融合
'''
 
# 卡尔曼增益 = 数据1的误差 除以 (数据1的误差 + 数据2的误差)
# 误差对应方差!!
def kalman_gain(e1, e2):
    return e1/(e1 + e2)
 
# 估计值 = 数据1的估计值 + 系数*(数据2测量值 - 数据1的估计值)
def now_estimated_value(X1, K, X2):
    return X1 + K(X2 - X1)
 
 
# 更新估计误差 = (1 - 卡尔曼增益)* 数据1的估计误差 + 卡尔曼增益* 数据2的估计误差
def now_estimated_error(K, e1, e2):
    return (1 - K)*e1 + k*e2
 
 
# 循环体
K = kalman_gain(e1, e2)
X_k = now_estimated_value(X1, K, X2)
e_EST = now_estimated_error(K, e1, e2)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。