python实现卡尔曼滤波代码详解

Kalman滤波算法的原理可以参考: 卡尔曼滤波理解

python中filterpy库中实现了各种滤波算法, 其中就包括了kalman滤波算法。
具体实现代码: https://github.com/rlabbe/filterpy/blob/master/filterpy/kalman/kalman_filter.py

本文针对该代码进行详细解读分析。

1 初始化及参数设置

需要设定的几个参数可参考: 详解多目标跟踪(MOT)算法中的Kalman滤波

  • 状态变量的维度: dim_x
  • 观测变量的维度:dim_z
  • 状态变量:x, 初始化为大小为dim_x, 全0的列向量
  • 观测变量:z, 初始化为大小为dim_z, 全0的列向量
  • 状态转移矩阵: F, 初始化为维度为dim_x, 值为1的对角阵
  • 状态变量协方差矩阵: P, 初始化为维度为dim_x, 值为1的对角阵
  • 处理噪声写房产矩阵: Q, 初始化为维度为dim_x, 值为1的对角阵
  • 测量矩阵:H,初始化为维度为(dim_z, dim_x)的全0矩阵
  • 测量误差协方差矩阵: R, 初始化为维度为dim_z, 值为1的对角阵
 def __init__(self, dim_x, dim_z, dim_u=0):if dim_x < 1:raise ValueError('dim_x must be 1 or greater')if dim_z < 1:raise ValueError('dim_z must be 1 or greater')if dim_u < 0:raise ValueError('dim_u must be 0 or greater')self.dim_x = dim_xself.dim_z = dim_zself.dim_u = dim_uself.x = zeros((dim_x, 1))        # stateself.P = eye(dim_x)               # uncertainty covarianceself.Q = eye(dim_x)               # process uncertaintyself.B = None                     # control transition matrixself.F = eye(dim_x)               # state transition matrixself.H = zeros((dim_z, dim_x))    # measurement functionself.R = eye(dim_z)               # measurement uncertaintyself._alpha_sq = 1.               # fading memory controlself.M = np.zeros((dim_x, dim_z)) # process-measurement cross correlationself.z = np.array([[None]*self.dim_z]).T

2 predict

在这里插入图片描述

def predict(self, u=None, B=None, F=None, Q=None):"""Predict next state (prior) using the Kalman filter state propagationequations.Parameters----------u : np.array, default 0Optional control vector.B : np.array(dim_x, dim_u), or NoneOptional control transition matrix; a value of Nonewill cause the filter to use `self.B`.F : np.array(dim_x, dim_x), or NoneOptional state transition matrix; a value of Nonewill cause the filter to use `self.F`.Q : np.array(dim_x, dim_x), scalar, or NoneOptional process noise matrix; a value of None will cause thefilter to use `self.Q`."""if B is None:B = self.Bif F is None:F = self.Fif Q is None:Q = self.Qelif isscalar(Q):Q = eye(self.dim_x) * Q# x = Fx + Buif B is not None and u is not None:self.x = dot(F, self.x) + dot(B, u)else:self.x = dot(F, self.x)# P = FPF' + Qself.P = self._alpha_sq * dot(dot(F, self.P), F.T) + Q# save priorself.x_prior = self.x.copy()self.P_prior = self.P.copy()

predict的过程比较简单, 就是根据上一次的状态变量, 估计当前的状态变量值, 同时更新状态变量的协方差。

3 update

在这里插入图片描述

  def update(self, z, R=None, H=None):"""Add a new measurement (z) to the Kalman filter.If z is None, nothing is computed. However, x_post and P_post areupdated with the prior (x_prior, P_prior), and self.z is set to None.Parameters----------z : (dim_z, 1): array_likemeasurement for this update. z can be a scalar if dim_z is 1,otherwise it must be convertible to a column vector.If you pass in a value of H, z must be a column vector theof the correct size.R : np.array, scalar, or NoneOptionally provide R to override the measurement noise for thisone call, otherwise  self.R will be used.H : np.array, or NoneOptionally provide H to override the measurement function for thisone call, otherwise self.H will be used."""# set to None to force recomputeself._log_likelihood = Noneself._likelihood = Noneself._mahalanobis = Noneif z is None:self.z = np.array([[None]*self.dim_z]).Tself.x_post = self.x.copy()self.P_post = self.P.copy()self.y = zeros((self.dim_z, 1))returnif R is None:R = self.Relif isscalar(R):R = eye(self.dim_z) * Rif H is None:z = reshape_z(z, self.dim_z, self.x.ndim)H = self.H# y = z - Hx# error (residual) between measurement and predictionself.y = z - dot(H, self.x)# common subexpression for speedPHT = dot(self.P, H.T)# S = HPH' + R# project system uncertainty into measurement spaceself.S = dot(H, PHT) + Rself.SI = self.inv(self.S)# K = PH'inv(S)# map system uncertainty into kalman gainself.K = dot(PHT, self.SI)# x = x + Ky# predict new x with residual scaled by the kalman gainself.x = self.x + dot(self.K, self.y)# P = (I-KH)P(I-KH)' + KRK'# This is more numerically stable# and works for non-optimal K vs the equation# P = (I-KH)P usually seen in the literature.I_KH = self._I - dot(self.K, H)self.P = dot(dot(I_KH, self.P), I_KH.T) + dot(dot(self.K, R), self.K.T)# save measurement and posterior stateself.z = deepcopy(z)self.x_post = self.x.copy()self.P_post = self.P.copy()

update的过程需要提供观测变量z。

1 首先计算卡尔曼增益。
2 计算当前观测值与通过观测矩阵得到的值之间的误差, 这个误差值乘上卡尔曼增益, 再加上predict过程得到的先验状态估计结果, 得到当前的卡尔曼滤波估计结果。
3 更新状态变量协方差矩阵。

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

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

相关文章

视频云存储/安防监控EasyCVR视频汇聚平台接入GB国标设备时,无法显示通道信息该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

三极管NPN、PNP的区别及简单应用

目录 一、NPN、PNP三极管的概念 二、NPN、PNP三极管的区别 三、三极管NPN、PNP的简单应用 一、NPN、PNP三极管的概念 NPN型三极管&#xff1a; 由两块N型半导体和一块P型半导体组成&#xff0c;P型半导体在中间&#xff0c;两块N型半导体在两侧。 三极管是电子电路中最重要的…

elementui table 在浏览器分辨率变化的时候界面异常

异常点&#xff1a; 界面显示不完整&#xff0c;表格卡顿&#xff0c;界面已经刷新完成&#xff0c;但是表格的宽度还在一点一点变化&#xff0c;甚至有无线延伸的情况 思路&#xff1a; 1. 使用doLayout 这里官方文档有说明&#xff0c; 所以我的想法是&#xff0c;监听浏览…

Jetbrains IDE新UI设置前进/后退导航键

背景 2023年6月&#xff0c;Jetbrains在新发布的IDE&#xff08;Idea、PyCharm等&#xff09;中开放了新UI选项&#xff0c;我们勾选后重启IDE&#xff0c;便可以使用这一魔性的UI界面了。 但是前进/后退这对常用的导航键却找不到了&#xff0c;以前的设置方式&#xff08;Vi…

【C++】容器适配器stack、queue以及deque容器

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、什么是容器适配器1.1 stack的…

Redis 的混合持久化

RDB 相比于 AOF&#xff0c;数据恢复的速度更快&#xff0c;因为是二进制数据&#xff0c;直接加载进内存即可&#xff0c;但是 RDB 的频率不好把握。 如果频率太低&#xff0c;在两次快照期间服务器发生宕机&#xff0c;可能会丢失较多的数据如果频率太高&#xff0c;频繁写入…

研磨设计模式day12迭代器模式

目录 场景 解决方案 解决思路 代码示例 代码改造 Java实现迭代器 迭代器模式的优点 思考 何时选用 场景 大公司收购了一个小公司&#xff0c;大公司的工资系统采用List来记录工资列表&#xff0c;而小公司是采用数组&#xff0c;老板希望通过决策辅助系统来统一查看…

Android studio之GridView使用

目录 效果图&#xff1a;![在这里插入图片描述](https://img-blog.csdnimg.cn/86e4a48a71164dec82613d58b1fbaa1c.jpeg)代码&#xff1a; 效果图&#xff1a; 代码&#xff1a; UserGridviewAdapter package com.example.gridviewpro.Adapter;import android.content.Contex…

202 | 抽象类、接口、内部类

抽象类 abstract 注意项 父类方法需要声明&#xff0c;但是有不确定性&#xff0c;考虑将该方法设计为抽象方法抽象方法没有实现的方法没有方法体&#xff08;跟接口的区别&#xff1f;&#xff09;抽象方法的类必须设置为抽象类&#xff0c;实现方法由其子类实现 abstract …

nuxt.js框架使用swiper的5.4.5版本记录,创建广告位幻灯片

nuxt依赖 “nuxt”: “^2.15.8”, “swiper”: “^5.4.5”, “vue”: “^2.7.10”, “vue-awesome-swiper”: “^4.1.1”, 需要完成的效果是 参考地址&#xff1a;https://3.swiper.com.cn/demo/pcSlide/ nuxt代码&#xff1a; <template><div class"page&quo…

ServiceManger Binder的处理流程

陌生知识点如下&#xff1a; BinderProxy&#xff1a;是将Native层的BpBinder对象进行封装后传给Java层使用的Binder对象android_util_binder: Binder在JNI层的相关注册&#xff0c;处理&#xff0c;转换封装接口BpBinder:Binder驱动在Native层的封装。IPCThreadState&#xf…

机器学习的测试和验证(Machine Learning 研习之五)

关于 Machine Learning 研习之三、四&#xff0c;可到秋码记录上浏览。 测试和验证 了解模型对新案例的推广效果的唯一方法是在新案例上进行实际尝试。 一种方法是将模型投入生产并监控其性能。 这很有效&#xff0c;但如果你的模型非常糟糕&#xff0c;你的用户会抱怨——这…

Sentinel 控制台(集群流控管理)

规则配置 要通过 Sentinel 控制台配置集群流控规则&#xff0c;需要对控制台进行改造。我们提供了相应的接口进行适配。 从 Sentinel 1.4.0 开始&#xff0c;我们抽取出了接口用于向远程配置中心推送规则以及拉取规则&#xff1a; DynamicRuleProvider<T>: 拉取规则Dy…

jvm开启远程调试功能;idea远程debug

概述 有时候一些问题本地调试无法复现&#xff0c;这个时候可以开启jvm的远程调试功能 jar包启动 jdk8 java -agentlib:jdwptransportdt_socket,address8787,servery,suspendn -jar xxx.jarjdk11/17 java -agentlib:jdwptransportdt_socket,address*:8787,servery,suspe…

关于ios Universal Links apple-app-site-association文件 Not Found的问题

1. 背景说明 1.1 Universal Links 是什么 Support Universal Links 里面有说到 Universal Links 是什么、注意点、以及如何配置的。简单来说就是 当您支持通用链接时&#xff0c;iOS 用户可以点击指向您网站的链接&#xff0c;并无缝重定向到您安装的应用程序 大白话就是说&am…

APP爬虫之-Protobuf协议逆向解析

在做APP抓取时&#xff0c;会发现有的APP Response回来的数据有“加密”。不知道返回的内容是什么。 如下&#xff1a; 如上&#xff0c;内容不是明文的&#xff0c;没办法解析数据。APP常见的对数据加密有三种情况&#xff1a;第一种是&#xff0c;用诸如AES这类加密算法对数…

R语言绘图相关函数(含实例)

目录 plot:可用于创建多种类型的图形 dev.new():新建画板 hist&#xff1a;绘制直方图 dotchart&#xff1a;绘制点图的函数 pie:绘制饼图 pair&#xff1a;绘制散点图矩阵 boxplot&#xff1a;绘制箱线图 scatterplot3D&#xff1a; 绘制三维散点图 par&#xff1a;修…

【动态规划】1137. 第 N 个泰波那契数

Halo&#xff0c;这里是Ppeua。平时主要更新C&#xff0c;数据结构算法&#xff0c;Linux与ROS…感兴趣就关注我bua&#xff01; 文章目录 0. 题目解析1.算法原理1.1 状态表示1.2 状态转移方程1.3初始化1.4 填表顺序1.5 返回值 2.算法代码 &#x1f427; 本篇是整个动态规划的…

【八股】2023秋招八股复习笔记4(MySQL Redis等)

文章目录 目录1、MySQLmysql索引实现mysql索引优化mysql索引失效的情况mysql 千万数据优化mysql 事务隔离级别 & 实现原理mysql MVCC版本链&#xff08;undo log&#xff09;mysql数据同步机制 & 主从复制 &#xff08;binlog&#xff09;mysql 日志&数据恢复&…

Springboot开发所遇问题(持续更新)

SpringBoot特征&#xff1a; 1. SpringBoot Starter&#xff1a;他将常用的依赖分组进行了整合&#xff0c;将其合并到一个依赖中&#xff0c;这样就可以一次性添加到项目的Maven或Gradle构建中。 2,使编码变得简单&#xff0c;SpringBoot采用 JavaConfig的方式对Spring进行配置…