卡尔曼滤波(Kalman Filter)原理及Python实现

Kalman-Filter-Example

项目地址 https://github.com/zhengjie9510/kalman-filter-example

理论公式

详细理论可参考DR_CAN关于卡尔曼滤波器的视频讲解。https://www.bilibili.com/video/BV1dV411B7ME
卡尔曼滤波公式分为预测更新两部分。

预测公式为:

x_hat_minus[k]= A * x_hat[k-1] + B * u[k-1]P_minus[k] = A * P[k-1] * A.T + Q

更新公式为:

K[k] = P_minus[k] * H.T * (H * P_minus[k] * H.T + R).Ix_hat[k] = x_hat_minus[k] + K[k] * (z[k] - H * x_hat_minus[k])P[k] = (np.eye(1) - K[k] * H) * P_minus[k]

其中:

x_hat_minus--先验估计状态  
P_minus--先验估计协方差矩阵  
x_hat--后验估计状态  
P--后验估计协方差矩阵  
A--状态转移矩阵  
B--控制矩阵  
u--控制量  
Q--过程噪声协方差矩阵  
K--卡尔曼增益  
H--观测矩阵  
R--观测噪声协方差矩阵  
z--观测量。

应用

背景

假定有一个匀速运动的人,状态变量x1和x2,Xx1表示人的位置,x2表示人的速度,观测变量z1和z2,z1表示人的位置,z2表示人的速度。
状态转移方程如下:

速度:x2[k] = x2[k-1] + w2[k-1]  
位置:x1[k] = x1[k-1] + x2[k-1] * dt + w1[k-1]

测量方程为:

速度:z2[k] = x2[k] + v2[k]  
位置:z1[k] = x1[k] + v1[k]

读取数据

df = pd.read_csv('data.csv', index_col=0)
x = df[['X1', 'X2']].values
z = df[['Z1', 'Z2']].values

设置参数并调用卡尔曼滤波函数

u = np.zeros(z.shape)  # 控制量,当前场景为0
x_hat_first = np.array([[0, 1]])  # 初始估计
P_first = np.array([[1, 0], [0, 1]])  # 初始估计协方差A = np.array([[1, 1], [0, 1]])  # 状态转移矩阵
B = np.array([[0, 0], [0, 0]])  # 控制矩阵
H = np.array([[1, 0], [0, 1]])  # 观测矩阵
Q = np.array([[0.1, 0], [0, 0.1]])   # 系统噪声协方差矩阵
R = np.array([[1, 0], [0, 1]])  # 测量噪声协方差矩阵x_hat = kalman_filter(x, z, u, A, B, H, Q, R, x_hat_first, P_first)

结果展示

plt.figure(figsize=(16, 9))
plt.plot(x[:, 0], 'g--', label='position--noisy system estimate')
plt.plot(z[:, 0], 'k--', label='position--noisy measurements')
plt.plot(x_hat[:, 0], 'b--', label='position--a posteri estimate')
plt.legend()
plt.xlabel('Step')
plt.ylabel('Position')
plt.title('Position')
plt.show()plt.figure(figsize=(16, 9))
plt.plot(x[:, 1], 'g-', label='speed--noisy system estimate')
plt.plot(z[:, 1], 'k-', label='speed--noisy measurements')
plt.plot(x_hat[:, 1], 'b-', label='speed--a posteri estimate')
plt.legend()
plt.xlabel('Step')
plt.ylabel('Speed')
plt.title('Speed')
plt.show()

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/120628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CVE-2022-32991靶场复现

靶场环境: 题目提示了该CMS的welcome.php中存在SQL注入攻击。 CVE官方给出的提示: welcome.php页面存在SQL注入,并且这个参数是eid 打开靶场环境: 页面是一个登陆注册的界面 用户注册: 1 010.com 123456 123456 点击Re…

国家数据局正式揭牌,数据专业融合型人才迎来发展良机

文章目录 每日一句正能量摘要《数据要素安全流通》《Python数据挖掘:入门、进阶与实用案例分析》《数据保护:工作负载的可恢复性 》《Data Mesh权威指南》《分布式统一大数据虚拟文件系统 Alluxio原理、技术与实践》《云原生数据中台:架构、方…

计算机网络之数据链路层(全)

[复习提示] 王道:本章是历年考试中考查的重点。要求在了解数据链路层基本概念和功能的基础上,重点掌握滑动窗口机制、三种可靠传输协议、各种MAC协议、HDLC协议和PPP协议,特别是CSMA/CD协议和以太网帧格式,以及局域网的争用期和最…

Oracle(6) Control File

一、oracle控制文件介绍 1、ORACLE控制文件概念 Oracle控制文件是Oracle数据库的一个重要元素,用于记录数据库的结构信息和元数据。控制文件包含了数据库的物理结构信息、数据字典信息、表空间和数据文件的信息等。在Oracle数据库启动时,控制文件会被读…

华为机试题:HJ6 质数因子

目录 第一章、算法题1.1)题目描述1.2)文的盲的解题思路与答案1.3)牛客链接 友情提醒: 先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。 第一章、算法题 1.1)题目描述 题目…

虚拟机安装openEuler系统

openEuler操作系统简介: openEuler是一款开源操作系统。当前openEuler内核源于Linux,支持鲲鹏及其他多种处理器,能够充分释放计算芯片的潜能,是由全球开源贡献者构建的高效、稳定、安全的开源操作系统,适用于数据库、大…

机架式服务器介绍

大家都知道服务器分为机架式服务器、刀片式服务器、塔式服务器三类,今天小编就分别讲一讲这三种服务器,第一篇先来讲一讲机架式服务器的介绍。 机架式服务器定义:机架式服务器是安装在标准机柜中的服务器,一般采用19英寸的标准尺寸…

【Java】电子病历编辑器源码(云端SaaS服务)

电子病历编辑器极具灵活性,它既可嵌入到医院HIS系统中,作为内置编辑工具供多个模块使用,也可以独立拿出来,与第三方业务厂商展开合作,为他们提供病历书写功能,充分发挥编辑器的功能。 电子病历基于云端SaaS…

Java API访问HDFS

一、下载IDEA 下载地址:https://www.jetbrains.com/idea/download/?sectionwindows#sectionwindows 拉到下面使用免费的IC版本即可。 运行下载下来的exe文件,注意安装路径最好不要安装到C盘,可以改成其他盘,其他选项按需勾选即可…

多测师肖sir_高级金牌讲师__接口测试之练习题(6.1)

常见的接口面试题目: 1.postman接口测试,它有一个功能可以设置参数化,你有用过吗? 用过 (1)新建一个csv.文件 填写user、pwd 新建一个全局变量 user、pwd 点击bodyform-data 填写user、pwd 点击run 导入csv.件 查看结果 &#x…

git log 命令详解

测试仓库 asdf 常用参数 查询指定目录 git -C /Users/yanlp/workspace/asdf log 限制显示提交数量 git log -n 3 限制提交人|邮箱 git log --authorEdwin Kofler | git log --authoredwinkofler.dev 限制一个月内的提交git log --since1.month.ago | git log --since2023-0…

Istio 自动注入 sidecar 失败导致无法访问webhook服务

最近工作中在部署Istio环境的过程中发现官方示例启动的pod不能访问不到Istio的webhook,这个问题也是困扰了我一天,特此记录,便于日后查阅。 我把他归类到sidecar注入失败的情况,报错如下: 1、第一种可能(我…

美摄AR人像美颜,全新视觉体验

企业越来越重视通过视觉媒体来提升品牌形象和吸引客户。然而,传统的摄影技术往往无法满足企业对于高质量、个性化视觉内容的需求。这时,美摄AR人像美颜解决方案应运而生,它以其独特的技术和优势,为企业带来了全新的视觉体验。 美…

高效管理文件夹名称:如何批量修改指定多样化的文件夹名称

在文件管理工作中,文件夹名称的管理对于整体的文件管理体系有着至关重要的作用。然而,往往我们会在文件夹名称的管理上遇到一些难题,如:需要修改的文件夹名称多样化,无法一次性满足所有需求。为了解决这个问题&#xf…

解决Visual studio 未能正确加载...包问题

问题 解决: 菜单: Visual Studio 2019 -> 输入"devenv /resetsettings " 将之前的设置恢复到原始状态。且可以正常使用。理论应该可以使用到其它版本中……

NineData:高效、安全、可靠的DB2数据管理平台

Db2 是老牌厂商 IBM 研发和维护的关系型数据库管理系统。作为一个拥有悠久历史的数据库系统,Db2 凭借它的高可靠、可扩展和高安全性等诸多优点,在如今的数据库市场依然占据相当大的份额。 对于诸多金融行业的企业而言, Db2 作为承载其核心业务…

编曲宿主软件哪个更好用?

音乐编曲软件的出现使得音乐创作者能够克服时间和空间的限制,随时随地进行创作。随着信息时代的发展,使用编曲软件已成为音乐创作领域的主流。那么编曲软件哪个好用呢?我推荐这三款。 在业内,常用的音乐编曲软件包括Cubase、Logi…

使用 jdbc 技术升级水果库存系统(后端最终版本,不包含前端)

1、配置依赖 <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></dependency><dependency><groupId>junit</groupId><…

C++继承总结(下)——菱形继承

一.什么是菱形继承 菱形继承是多继承的一种特殊情况&#xff0c;一个类有多个父类&#xff0c;这些父类又有相同的父类或者祖先类&#xff0c;那么该类就会有多份重复的成员&#xff0c;从而造成调用二义性和数据冗余。 class Person {public:Person(){cout << "P…

FL Studio21最新中文汉化解锁版,2024怎么激活FL Studio

FL Studio2024最新中文汉化解锁版是一款功能强大的数字音频工作站&#xff08;DAW&#xff09;&#xff0c;它广泛应用于音乐创作和音乐制作领域。在使用FL Studio时&#xff0c;购买正版软件是否有必要呢&#xff1f;本文将详细探讨FL Studio的功能特点以及正版软件的重要性。…