卡尔曼滤波之二:Python实现

卡尔曼滤波之二:Python实现

  • 1.背景描述
  • 2.构建卡尔曼滤波公式
    • 2.1 预测
    • 2.2 更新
  • 3.代码实现
  • 3.1 输入值
    • 3.2 pykalman包实现
    • 3.3 不使用Python包实现
    • 3.4 效果可视化
  • 参考文献

了解了卡尔曼滤波之一:基本概念,可以结合代码来理解下卡尔曼滤波的2个预测+3个更新环节。

1.背景描述

设有一个球在30m的起始高度,以10m/s的速度竖直上抛,用传感器来跟踪球的高度。

对应于卡尔曼滤波,此系统的状态包括位置 h h h及速度 v v v

球的高度满足式子:

x t = x t − 1 + v t − 1 τ − 1 2 g τ 2 \qquad x_t = x_{t-1} + v_{t-1}\tau - \frac{1}{2} g \tau^2 xt=xt1+vt1τ21gτ2

速度满足:
v t = v t − 1 − g τ \qquad v_t = v_{t-1} - g \tau vt=vt1

其中, τ \tau τ t − 1 t-1 t1 t t t之间的时间(s), g g g 为重力加速度。

传感器检测高度,存在的位置协方差约为3m。

2.构建卡尔曼滤波公式

2.1 预测

  • 状态值预测

x ^ t − = F ⋅ x ^ t − 1 + B ⋅ u t − 1 ① \qquad\qquad\quad \hat x_t^-=F\cdot\hat x_{t-1} + B\cdot u_{t-1}\qquad\qquad \qquad\qquad \qquad\qquad \quad\ \ \ ① x^t=Fx^t1+But1   

[ h t − v t − ] = [ 1 τ 0 1 ] [ h t − 1 v t − 1 ] + [ − 1 2 τ 2 − τ ] ⋅ g \qquad\qquad\begin{bmatrix} h_t^-\\v_t^-\end{bmatrix} =\begin{bmatrix} 1& \tau \\0 & 1 \end{bmatrix}\begin{bmatrix} h_{t-1}\\v_{t-1}\end{bmatrix}+\begin{bmatrix} - \frac{1}{2} \tau^2\\- \tau\end{bmatrix}\cdot g [htvt]=[10τ1][ht1vt1]+[21τ2τ]g

  • 状态协方差预测

P t − = F ⋅ P t − 1 ⋅ F T + Q ② \qquad\qquad \quad P_{t}^{-}=F\cdot P_{t-1}\cdot F^{T}+Q\qquad\qquad \qquad\qquad \qquad\qquad \qquad ② Pt=FPt1FT+Q

\qquad 状态协方差预测值的初始值 P 0 − P_{0}^{-} P0 [ 1 0 0 1 ] \begin{bmatrix} 1& 0 \\0 & 1 \end{bmatrix} [1001],过程噪声的协方差 Q Q Q [ 0 0 0 0 ] \begin{bmatrix} 0& 0 \\0 & 0 \end{bmatrix} [0000]

2.2 更新

  • 更新卡尔曼增益 K t K_{t} Kt

K t = P t − ⋅ H T H ⋅ P t − ⋅ H T + R ③ \qquad\qquad K_{t}=\cfrac {P_{t}^{-} \cdot H^{T}}{H\cdot P_{t}^{-} \cdot H^{T}+R}\qquad\qquad \qquad\qquad \qquad\qquad \qquad\ ③ Kt=HPtHT+RPtHT 

\qquad 观测矩阵 H H H 这里为 [ 1 0 ] \begin{bmatrix} 1& 0 \end{bmatrix} [10] R R R 为 3.

  • 融合状态估计值 x ^ t − \hat x_{t}^{-} x^t以及观测量 Z t Z_t Zt,更新状态值 x ^ t \hat x_{t} x^t

x ^ t = x ^ t − + K t ( Z t − H ⋅ x ^ t − ) ④ \qquad\qquad \hat x_{t}=\hat x_{t}^{-}+K_t(Z_t-H\cdot \hat x_{t}^{-})\qquad\qquad \qquad\qquad\qquad \qquad\ ④ x^t=x^t+Kt(ZtHx^t) 

  • 更新状态协方差​ P t P_{t} Pt

P t = ( 1 − K t ⋅ H ) P t − ⑤ \qquad\qquad P_{t}=(1-K_t\cdot H) P_{t}^{-}\qquad\qquad \qquad\qquad\qquad \qquad \qquad\ \ \ \ ⑤ Pt=(1KtH)Pt    

3.代码实现

3.1 输入值

import numpy as np
times = 40
tau = 0.1
actual = -4.9*tau**2*np.arange(times)**2
# Simulate the noisy camera data
sim = actual + 3*np.random.randn(times)# kalman filter parameters
initial_state = np.array([[30],[10]])  
initial_current_state_covariance =np.eye(2) 
Q = np.zeros((2,2)) # process_noise_covariance
R = 3 # observation_covariance
F=np.array([[1,tau],[0,1]])
B=np.array([[-0.5*tau**2],[-tau]])
U=g=9.8
H=np.array([[1,0]])

3.2 pykalman包实现

from pykalman import KalmanFilter
# Set up the filter
kf = KalmanFilter(n_dim_obs=1, n_dim_state=2,initial_state_mean=initial_state.reshape(-1) ,initial_state_covariance=initial_current_state_covariance ,transition_matrices=F,observation_matrices=H,observation_covariance=R,transition_covariance=Q,transition_offsets=[-4.9*tau**2, -9.8*tau])state_means, state_covs = kf.filter(sim)

注意,pykalman包中使用transition_offsets来替代 B ⋅ u t − 1 B\cdot u_{t-1} But1部分。

3.3 不使用Python包实现

current_state_covariance=None
current_state_mean=None
time=0
estimated_signal = []
for measurement in sim:# predictif time==0:# initialize predicted_state_means=initial_statepredicted_state_covariances=initial_current_state_covarianceelse:predicted_state_means = F @ current_state_mean+ B*Upredicted_state_covariances = F @current_state_covariance @F.T + Q# updatekalman_gain = predicted_state_covariances @ H.T @ np.linalg.pinv(H@predicted_state_covariances@H.T + R)current_state_mean = predicted_state_means  + kalman_gain * (measurement - H @ predicted_state_means)current_state_covariance = predicted_state_covariances - kalman_gain @ H @ predicted_state_covariancesestimated_signal.append(current_state_mean[0,0])time + =1

3.4 效果可视化

import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as pltplt.figure(figsize=(12, 6))
plt.plot(range(times), sim, label="Noisy Signal")
plt.plot(range(times), state_means[:,0], label="Kalman Signal1")plt.plot(range(times), estimated_signal, label="Estimated Signal (Kalman Filter)")
plt.legend()
plt.title("Signal Denoising with Kalman Filter")
plt.show(block=True)

在这里插入图片描述
两种方法曲线重合在一起,说明Python实现没有问题。

注意:这里的两种实现都默认t=0时只赋初值,不进行预测。

信号去噪之卡尔曼滤波代码实现中,t=0时也进行了预测。

长期来看,效果差不多,

从图上可以看出,滤波信号与有噪声信号相比,非常平滑,同时也有很好的跟踪效果。

参考文献

[1] 信号去噪之卡尔曼滤波
[2] 卡尔曼滤波:再也不用瑟瑟发抖了
[3] https://github.com/quantopian/research_public/blob/master/notebooks/lectures/Kalman_Filters/notebook.ipynb
[4] https://github.com/pykalman/pykalman/tree/master
[5] https://pykalman.github.io/#choosing-parameters
[6] Kalman Filter and Maximum Likelihood Estimation of Linearized DSGE Models
[7] 卡尔曼滤波之一:基本概念

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

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

相关文章

3.27每日一题(常系数线性非齐次方程的特解)

常系数非齐次线性方程的特解如何假设(两种)形式: 1、题目中 e 的 x 次幂以及 1,都是第一种:1可以看成为e的0次幂 注:题目给的多项式是特殊的形式,我们要设为一般的形式的多项式 2、题目中sin…

Python 爬虫基础

Python 爬虫基础 1.1 理论 在浏览器通过网页拼接【/robots.txt】来了解可爬取的网页路径范围 例如访问: https://www.csdn.net/robots.txt User-agent: * Disallow: /scripts Disallow: /public Disallow: /css/ Disallow: /images/ Disallow: /content/ Disallo…

KaiOS APN配置文件apn.json调试验证方法(无需项目全编)

1、KaiOS 的应用就类似web应用,结合文件夹路径webapp字面意思理解。 2、KaiOS APN配置文件源代码在apn.json, (1)apn.json可以自定义路径,通过配置脚本实现拷贝APN在编译时动态选择路径在机器中生效。 (…

4.网络之TCP

TCP协议(传输层) 文章目录 TCP协议(传输层)1. TCP报文格式2. TCP相关机制2.1 确认应答机制2.2 超时重传机制2.3 连接管理机制(重点)2.3.1 三次握手2.3.2 四次挥手 2.4 滑动窗口机制2.5 流量控制机制2.6 拥塞控制机制2.7 延迟应答机制2.8 捎带应答机制 3.…

登录Tomcat控制台,账号密码输入正确但点击登录没反应不跳转到控制台页面

在tomcat-users.xml里面可以查看登录tomcat控制台的账号密码,如果账号密码输入正确还是登录不进去,则很有可能是tomcat的账号被锁了(可在catalina.xxx.log里面查看)。tomcat账号被锁定后默认情况是不访问控制台后5分钟自动解锁&am…

访问者模式-操作复杂对象结构

商场里有许多的店铺,大致分为服装区、饮食区及休闲区,每天都会有络绎不绝的不同角色(打工人、学生、有钱人)的人来逛商场。商场想开发个系统用来模拟这些人的在这些店铺的行为。 public class SuperMarket {public static void m…

立创eda专业版学习笔记(8)(运行模式)

以前没注意过这个问题,我有2台电脑,都能登录eda专业版,但是一台是全在线模式,另外一台是半离线模式,虽然是同一个账号,但是打开里面的工程会发现,两边的工程完全不同,因为一台的工程…

【UE5 Cesium】actor随着视角远近来变化其本身大小

效果 步骤 1. 首先我将“DynamicPawn”设置为默认的pawn类 2. 新建一个父类为actor的蓝图,添加一个静态网格体组件 当事件开始运行后添加一个定时器,委托给一个自定义事件,每2s执行一次,该事件每2s获取一下“DynamicPawn”和acto…

kafka问题汇总

报错1: 解决方式 1、停止docker服务   输入如下命令停止docker服务 systemctl stop docker 或者service docker stop1   停止成功的话,再输入docker ps 就会提示出下边的话: Cannot connect to the Docker daemon. Is the docker daem…

YoloV5训练V3Det数据集实战

摘要 V3Det:一个庞大的词汇视觉检测数据集,在大量真实世界图像上具有精确注释的边界框,其包含13029个类别中的245k个图像(比LVIS大10倍),数据集已经开源! 图片的数量比COCO多一些,…

云计算的大模型之争,亚马逊云科技落后了?

文丨智能相对论 作者丨沈浪 “OpenAI使用了Azure的智能云服务”——在过去的半年,这几乎成为了微软智能云最好的广告词。 正所谓“水涨船高”,凭借OpenAI旗下的ChatGPT在全球范围内爆发,微软趁势拉了一波自家的云计算业务。2023年二季度&a…

嵌入式C语言自我修养《数据存储与指针》学习笔记

目录 一、数据类型和存储 1.大端模式和小端模式 2.有符号数和无符号数 二、数据对齐 1.为什么要数据对齐 2.结构体对齐 3.联合体对齐 三、数据的可移植性 四、 Linux内核中的size_t类型 五、typedef的使用 1. typedef的基本用法 2.使用typedef的优势 3. typedef的作用域 六…

【SQL篇】一、Flink动态表与流的关系以及DDL语法

文章目录 1、启动SQL客户端2、SQL客户端常用配置3、动态表和持续查询4、将流转为动态表5、用SQL持续查询6、动态表转为流7、时间属性8、DDL-数据库相关9、DDL-表相关 1、启动SQL客户端 启动Flink(基于yarn-session模式为例): /opt/module/f…

Java_类和对象详解

文章目录 前言简单认识类类定义和使用类的实例化引用的一些注意事项 类和对象的说明及关系this引用为什么要有this引用this应用this特性 构造方法构造特性及应用用this简化用idea编译器快捷创建构造 封装封装的概念访问限定符 封装的扩展-包包的概念导入包中的类自定义包常见的…

Skywalking介绍

一个优秀的项目,除了具有高拓展的架构、高性能的方案、高质量的代码之外,还应该在上线后具备多角度的监控功能。现在企业中的监控服务也有很多,Skywalking除了提供多维度、多粒度的监控之外,也提供了良好的图形化界面以及性能剖析…

LeetCode 面试题 16.17. 连续数列

文章目录 一、题目二、C# 题解 一、题目 给定一个整数数组,找出总和最大的连续数列,并返回总和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。…

DDD学习笔记

1)ddd: 软件复杂性的应对之道。 但是不是说:redis这种不会使用。 开发过程中,一直面临的一种复杂性。 是一种架构思想: 领域之间的组合。 让开发软件具有搭积木的感觉。 领域的核心是边界。 以领域划分为基础。 以通用语言为建设…

持续集成交付CICD:安装Jenkins Slave(从节点)

目录 一、实验 1.安装Jenkins Slave(从节点) 二、问题 1.salve节点启动jenkins报错 2.终止命令行后jenkins从节点状态不在线 一、实验 1.安装Jenkins Slave(从节点) (1)查看jenkins版本 Version 2.…

c语言进阶部分详解(《高质量C-C++编程》经典例题讲解及柔性数组)

上篇文章我介绍了介绍动态内存管理 的相关内容:c语言进阶部分详解(详细解析动态内存管理)-CSDN博客 各种源码大家可以去我的github主页进行查找:唔姆/比特学习过程2 (gitee.com) 今天便接“上回书所言”,来介绍《高质…

ElasticSearch 实现 全文检索 支持(PDF、TXT、Word、HTML等文件)通过 ingest-attachment 插件实现 文档的检索

一、Attachment 介绍 Attachment 插件是 Elasticsearch 中的一种插件,允许将各种二进制文件(如PDF、Word文档等)以及它们的内容索引到 Elasticsearch 中。插件使用 Apache Tika 库来解析和提取二进制文件的内容。通过使用 Attachment 插件&a…