卡尔曼滤波之二:Python实现

news2024/11/26 1:32:01

卡尔曼滤波之二: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:
    # predict
    if time==0:
        # initialize 
        predicted_state_means=initial_state
        predicted_state_covariances=initial_current_state_covariance
    else:
        predicted_state_means = F @ current_state_mean+ B*U
        predicted_state_covariances = F @current_state_covariance @F.T + Q

    # update
    kalman_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_covariances

    estimated_signal.append(current_state_mean[0,0])
    time + =1

3.4 效果可视化

import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt

plt.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.coloradmin.cn/o/1179279.html

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

相关文章

STM8单片机在医疗设备中的应用和优势

STM8单片机作为一种高性能、低功耗的微控制器,在医疗设备领域得到了广泛的应用。本文对STM8单片机在医疗设备中的应用进行了研究,探讨了它在医疗设备中的优势和特点,并分析了其在提升医疗设备性能、精确控制和数据处理等方面的应用效果。 一…

接口幂等性详解

1. 什么是幂等性 幂等性指的是对同一个操作的多次执行所产生的影响与一次执行的影响相同。无论操作执行多少次,系统状态都应该保持一致。 在计算机科学和网络领域中,幂等性通常用来描述服务或操作的特性。对于RESTful API或HTTP方法,一个幂…

【Linux】服务器与磁盘补充知识,硬raid操作指南

服务器硬件 cpu 主板 内存 硬盘 网卡 电源 raid卡 风扇 远程管理卡 1.硬盘尺寸: 目前生产环境中主流的两种类型硬盘 3.5寸 和2.5寸硬盘 2.5寸硬盘可以通过使用硬盘托架后适用于3.5寸硬盘的服务器 但是3.5寸没法转换成2.5寸 2.如何在服务器上制作raid 华为服务器为例子做…

DAY46 139.单词拆分 + 多重背包 + 背包问题总结篇

139.单词拆分 题目要求:给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 思路 完全背…

NVMe FDP会被广泛使用吗?

文章开头,我们需要先了解固态硬盘的读写机制。我们知道,固态硬盘的存储单元是由闪存颗粒组成的,无法实现物理性的数据覆盖,只能擦除然后写入,重复这一过程。因而,我们可以想象得到,在实际读写过…

04-SpringBoot的基础配置及其配置文件分类,解决Yaml文件失效问题

SpringBoot的配置 SpringBoot是用来提高Spring程序的开发效率的,使用SpringBoot后几乎不用做任何配置功能就有了,因为很多功能已经有默认配置帮我们做好了 配置文件的相关配置 在一个项目中不同的技术对应不同的配置文件并且这些配置文件的格式也不统一 SpringBoot提供了一…

打印由*组成的菱形

如图所示,这是我们要用代码所实现的图形。 那么我们该如何实现这个呢,对于这种题,我们只有静下心来找其中的规律了。 我们先来看看它的上面部分: 它是由空格和星号组成的,那么我们是不是可以先打印空格然后再打印星号…

2023 年 API 安全状况

在当今快速变革的数字世界中,API 已成为快速交付业务功能的关键。这些数字连接器支撑着我们今天见证的大部分企业创新,从无缝的客户体验到集成的合作伙伴生态系统。 随着 API 使用量的激增,潜在风险呈指数级增长。让我们用硬数据来说明 API …

【redis 面试题】③ 缓存雪崩

文章目录 前言一、什么是缓存雪崩二、缓存雪崩的解决方案 前言 跟着B站的黑马程序员学习面试题,目前是redis的第三个内容——缓存雪崩 课程传送门:redis——缓存雪崩 一、什么是缓存雪崩 缓存雪崩是设置缓存时采用了相同的过期时间,导致缓存…

Pytorch 快速参数权重初始化

定义一个函数: 这里比如要初始化2维卷积权重值,采用xaiver 数据分布,还有很多其他的数据分布可以探索 def weights_init(m):if isinstance(m, nn.Conv2d):xavier(m.weight.data)xavier(m.bias.data) 然后定义一个含2维卷积的网络&#xff…

HTML5+CSS3小实例:带功能区的图片悬停特效

实例:带功能区的图片悬停特效 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&…

esxi 6.7下安装黑裙

esxi上创建一个黑裙系统的虚拟机&#xff0c;用来存资料 一、工具 硬件&#xff1a; 工控机&#xff1a;装有esxi6.7系统&#xff08;192.168.100.2&#xff09;&#xff0c;配置&#xff1a;3865U&#xff0c;16G内存&#xff0c;120Gmsata120sata硬盘&#xff0c;6个网口 主…

oracle转换人大金仓全过程

前提 Oracle服务器&#xff1a;创建用户&#xff0c;导入数据库人大金仓服务&#xff1a;创建用户 注意&#xff1a;两者的参数设置要保持一致&#xff08;数字集UTF-8&#xff09;&#xff0c;人大金仓设置大小字符不敏感 人大金仓工具介绍 数字库开发管理工具&#xff1a;链…

【PTE-day03 报错注入】

报错注入 1、报错注入 group by count2、报错注入 extractvalue3、报错注入updatexml1、报错注入 group by count http://124.222.124.9:8888/Less-5/?id=-1 union select 1,count(*),concat((select database()),ceil(rand(0)*2)) as a from information_schema.tables grou…

思维模型 飞轮效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。万事开头难&#xff0c;坚持就不难。 1 飞轮效应的应用 1.1使用飞轮效应的亚马逊 亚马逊的创始人杰夫贝索斯&#xff08;Jeff Bezos&#xff09;提出了“飞轮理论”&#xff0c;即通过不断…

jira Licenses更新步骤

有时候我们不想花钱使用jira,那么只有通过一个月以续期的方式来使用jira。下面提供下自己实测的方式 1、获取License Key 登录地址&#xff1a;https://my.atlassian.com 登录自己的Google账号&#xff0c;进入到下面账号&#xff0c;然后点击“New Trial License” product上…

HTB——introduction to active directory

文章目录 一、Active directory structure二、Active Directory Terminology 一、Active directory structure Active Directory &#xff08;AD&#xff09; 是用于 Windows 网络环境的目录服务。它是一种分布式分层结构&#xff0c;允许集中管理组织的资源&#xff0c;包括用…

【java】实现自定义注解校验——方法一

自定义注解校验的实现步骤&#xff1a; 1.创建注解类&#xff0c;编写校验注解&#xff0c;即类似NotEmpty注解 2.编写自定义校验的逻辑实体类&#xff0c;编写具体的校验逻辑。(这个类可以实现ConstraintValidator这个接口&#xff0c;让注解用来校验) 3.开启使用自定义注解进…

14.2 并发与竞争实验

一、原子操作实验 这节使用原子操作来实现对 LED 设备的互斥访问&#xff0c;也就是只有一个应用程序能使用 LED。 1.1 实验程序编写 因为是 12 章已经修改了设备树&#xff0c;所以这里暂时不用修改。 在 /linux/atk-mpl/Drivers 该目录下创建 7_atomic 子目录&#xff0c;并且…

大数据商城人流数据分析与可视化 - python 大数据分析 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的基站数据分析与可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度…