卡尔曼滤波算法及其python实现

卡尔曼滤波算法及其python实现卡尔曼滤波算法及其python实现算法原理python实现算法原理python实现#KFalgorithdemobyLeo#2020.01.06#ZJGCAMPUS,ZJUimportnumpyasnpimportmatplotlib.pyplotasplt”’生成带噪声的传感器观测值ZZ中一共包含500个samples,第k个s…

大家好,又见面了,我是你们的朋友全栈君。

卡尔曼滤波算法及其python实现

算法原理

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

python实现

# KF algorith demo by Leo
# 2020.01.06
# ZJG CAMPUS,ZJU

import numpy as np
import matplotlib.pyplot as plt
 

''' 生成带噪声的传感器观测值Z Z中一共包含500个samples,第k个sample代表k时刻传感器的读数 假设只对机器人位置进行传感器观测,并且只用距离表示位置 因此,Z中只有一个观测变量,即机器人的位置,这个位置一维数据表示 '''
# 生成不带噪声的数据
Z_raw = [i for i in range(500)]
# 创建一个均值为0,方差为1的高斯噪声,共有500个samples,精确到小数点后两位
noise = np.round(np.random.normal(0, 1, 500), 2)
# 将z的观测值和噪声相加
Z = np.mat(Z_raw) + np.mat(noise)

 

''' 定义状态向量X的初始状态 X中包含两个状态变量:p和v,二者都被初始化为0,且二者都用标量表示 '''
X = np.mat([[0,], [0,]])



''' 定义初始状态协方差矩阵P '''
P = np.mat([[1, 0], [0, 1]])



''' 定义状态转移矩阵F,假设每秒钟采一次样,所以delta_t = 1 '''
F = np.mat([[1, 1], [0, 1]])



''' 定义状态转移协方差矩阵Q 这里我们把协方差设置的很小,因为觉得状态转移矩阵准确度高 '''
Q = np.mat([[0.0001, 0], [0, 0.0001]])



''' 定义观测矩阵H '''
H = np.mat([1, 0])



''' 定义观测噪声协方差R '''
R = np.mat([1])
 


''' 卡尔曼滤波算法的预测和更新过程 '''
for i in range(100):
    x_predict = F * X#demo中没有引入控制矩阵B
    p_predict = F * P * F.T + Q
    K = p_predict * H.T / (H * p_predict * H.T + R)
    X = x_predict + K *(Z[0, i] - H * x_predict)
    P = (np.eye(2) - K * H) * p_predict
    print(X)
    plt.plot(X[0, 0], X[1, 0], 'ro', markersize = 4)
    
plt.show()

在这里插入图片描述
其中,横轴表示X[0,0],即位置p; 纵轴表示X[1,0],即速度v
可以看到速度v很快收敛于1.0,这是因为设置delta_t=1,即Z中的数据从0-500,每秒加1,卡尔曼滤波预测的速度与实际速度1.0很好的契合。
并且,我相信如果将横轴展开来看,卡尔曼滤波也对位置的预测具有很好的契合。

参考资料

1.[blog]详解卡尔曼滤波原理
翻译自http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/
blog地址:https://blog.csdn.net/u010720661/article/details/63253509
2.[blog]我所理解的卡尔曼滤波
blog地址:https://www.jianshu.com/p/d3b1c3d307e0
3.[blog]卡尔曼滤波,最最容易理解的讲解.找遍网上就这篇看懂了.
blog地址:https://blog.csdn.net/phker/article/details/48468591
4.[paper]A New Approach to Linear Filtering
and Prediction Problems
paper地址:http://www.cs.unc.edu/~welch/kalman/media/pdf/Kalman1960.pdf

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140986.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Github搭建个人博客(2019最新版,亲测)

    Github搭建个人博客(2019最新版,亲测)版权声明:本文为徐代龙原创文章,未经徐代龙允许不得转载。https://blog.csdn.net/xudailong_blog/article/details/78762262(一)前言:建议:慢慢看,也就这一篇用心了点写说来话长,一把辛酸泪,可算是弄好了。1起因:在很早很早,大一的时候,估计快记不得日子了,那时候来到PC吧创业团队,一个大一级的学长通过…

    2022年5月27日
    30
  • stl merge函数使用

    stl merge函数使用merge函数的作用是:将两个已经排好序的序列合并为一个有序的序列。函数参数:merge(first1,last1,first2,last2,result,compare);firs1t为第一个容器的首迭代器,last1为第一个容器的末迭代器;first2为第二个容器的首迭代器,last2为容器的末迭代器;result为存放结果的容器,comapre为比较函数(可略写,默认为合并为…

    2022年6月8日
    40
  • 锂电池3V升12V(AH6901)低成本替代6291升压芯片

    锂电池3V升12V(AH6901)低成本替代6291升压芯片锂电池3V升12V(AH6901)低成本替代6291升压芯片应用于数码相机,移动电源,蓝牙音箱,插卡音箱、LED台灯便捷DVD,MID,移动电话等数码产品AH6901是一款小封装(SOT23-6)、CC(恒流)模式的PWM升压IC,适用于锂电池(3~4.2V)输出5V,1A的移动电源应用。AH6901输入电压范围可由最低2.6伏特到最高6伏特,输出电压3.3–20V可调整且内部MOS输出开关电流可高达2A,封装为SOT23-6,工作频率为1MHZ,可以搭配3.3uh小型贴片电感,减少成品体积,非常适

    2022年10月6日
    0
  • 九章算法_九章算法(杭州)科技有限公司

    九章算法_九章算法(杭州)科技有限公司1BST迭代器注意点:1.实际就是中序遍历的非递归写法,迭代器就是要用Stack存储数据,不过把不同的模块功能进行了分割,而不是一次完成中序遍历;2.可以把添加到Stack单独抽取成一个函数

    2022年8月3日
    2
  • python图像轮廓识别_python数字图像处理

    python图像轮廓识别_python数字图像处理前面一篇文章介绍了图像分类知识,包括常见的图像分类算法,并介绍Python环境下的贝叶斯图像分类算法、基于KNN算法的图像分类和基于神经网络算法的图像分类等案例。这篇文章将详细讲解图像分割知识,包括阈值分割、边缘分割、纹理分割、分水岭算法、K-Means分割、漫水填充分割、区域定位等。万字长文整理,希望对您有所帮助。同时,该部分知识均为作者查阅资料撰写总结,并且开设成了收费专栏,为小宝赚点奶粉钱,感谢您的抬爱。当然如果您是在读学生或经济拮据,可以私聊我给你每篇文章开白名单,或者转发原文给你,更希望您能进步

    2022年10月7日
    0
  • 光棍节程序员闯关秀-解密

    光棍节程序员闯关秀-解密前言最近看到的了一个比较有意思的解密游戏,这解密的过程中确实花了不少的功夫,后来通过搜索才发现这是好几年前的题目,但是题目虽然是老的,但技术是没有过时的,不得不承认其中有些问题我确实解答不上来,不过解密的过程还是很有意思的,在此记录一下,游戏地址为光棍节程序员闯关秀第1关(总共10关)有兴趣的可以自己玩一下,有些题目还是很需要专业知识的,具体的解题步骤网络上一大堆,不过我发现一个问题,你们为什么不把

    2022年7月17日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号