卡尔曼滤波(Kalman filter)(不完全介绍)

1. Kalman filter基本介绍

卡尔曼滤波(Kalman filter)是一种高效的自回归滤波器,它能在存在诸多不确定性情况的组合信息中估计动态系统的状态,是一种强大的、通用性极强的工具。通俗一点来讲就是通过一系列 不那么准确的观测值来预测 真实值

卡尔曼滤波(Kalman filter)(不完全介绍)

图1. 一个简单的kalman filter应用

在上图中红线real是真实的运动状态,绿线measure是测量值,蓝线filter是卡尔曼滤波预测的结果。我们可以认为这里的横轴表示时间,纵轴表示位置或速度。
在一个真实的运动系统中, 仅有观测值是可知的,且观测值相对于真实值会存在误差,我们认为观测值在真实值附近呈现 高斯分布(Gaussian distribution)。那么我们就可以使用卡尔曼滤波进行一个合理的预测了。
简而言之,Kalman filter就是一个用来预测的工具,并且它是通用的、高效的!

2. Kalman filter的核心思路

卡尔曼滤波(Kalman filter)(不完全介绍)

图2. kalman filter的预测与更新

卡尔曼滤波通过” 预测“与” 更新“两个过程来对系统的状态进行最优估计。在使用代码的编辑过程中,我们通常像下面这样来编写 KalmanFilter类。

以python代码为示例,请暂时忽略传入的参数
class KalmanFilter(object):
    def __init__(self, F = None, B = None, H = None, Q = None, R = None, P = None, x0 = None):
    def predict(self, u = 0):
    def update(self, z):

使用卡尔曼滤波进行预测就是按照图2的思路进行函数的调用。大致如下:

#以下代码仅为思路示例
for z in measurements:
    kf.predict()
    kf.update()

3. Kalman filter的相应公式

卡尔曼滤波(Kalman filter)(不完全介绍)

图2. kalman filter公式

相应公式的详细理解可以参考:【工程师学算法】工程常用算法(二)—— 卡尔曼滤波(Kalman Filter)卡尔曼滤波(Kalman Filter)原理与公式推导

4. Kalman filter详细代码

摘抄自:https://zhuanlan.zhihu.com/p/113685503

import numpy as np

class KalmanFilter(object):
    def __init__(self, F = None, B = None, H = None, Q = None, R = None, P = None, x0 = None):

        if(F is None or H is None):
            raise ValueError("Set proper system dynamics.")

        self.n = F.shape[1]
        self.m = H.shape[1]

        self.F = F
        self.H = H
        self.B = 0 if B is None else B
        self.Q = np.eye(self.n) if Q is None else Q
        self.R = np.eye(self.n) if R is None else R
        self.P = np.eye(self.n) if P is None else P
        self.x = np.zeros((self.n, 1)) if x0 is None else x0

    def predict(self, u = 0):
        self.x = np.dot(self.F, self.x) + np.dot(self.B, u)
        self.P = np.dot(np.dot(self.F, self.P), self.F.T) + self.Q
        return self.x

    def update(self, z):
        y = z - np.dot(self.H, self.x)
        S = self.R + np.dot(self.H, np.dot(self.P, self.H.T))
        K = np.dot(np.dot(self.P, self.H.T), np.linalg.inv(S))
        self.x = self.x + np.dot(K, y)
        I = np.eye(self.n)
        self.P = np.dot(I - np.dot(K, self.H), self.P)

5. 卡尔曼滤波推荐阅读资料:

基础入门类:
https://classroom.udacity.com/courses/cs373/
https://zhuanlan.zhihu.com/p/39912633
公式推导理解类:
https://blog.csdn.net/honyniu/article/details/88697520
https://blog.csdn.net/ReadAir/article/details/107442359
https://zhuanlan.zhihu.com/p/48876718
代码示例类:
https://blog.csdn.net/WSCLE/article/details/119031605
https://zhuanlan.zhihu.com/p/113685503

Original: https://www.cnblogs.com/litecdows/p/KalmanFilter.html
Author: litecdows
Title: 卡尔曼滤波(Kalman filter)(不完全介绍)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610548/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【Java】关于Maven仓库地址

    Maven仓库地址 仓库 如果你没有配置阿里云仓库镜像源,可以到这里来找 https://mvnrepository.com/ 如果你配置了阿里云仓库镜像源,可以来这里找 http…

    Linux 2023年6月14日
    091
  • JavaScript闭包

    <!doctype html> <html lang="en"> <head> <title>&#x95…

    Linux 2023年6月13日
    074
  • Linux基础02

    import paramiko class SSHProxy(object): def __init__(self, hostname, port, username, passw…

    Linux 2023年6月7日
    076
  • python串口助手

    最近项目中要使用模拟数据源通过向外发送数据,以前都是用C#编写,最近在研究python,所以就用python写了一个串口助手,方便以后的测试。 在电脑上通过虚拟串口助手产生两个虚拟…

    Linux 2023年6月14日
    092
  • n的阶乘前100项。Table of n! for n = 1..100

    n的阶乘前100项 {1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600,6227020800,871782…

    Linux 2023年6月6日
    073
  • shell命令重置版整理(经典推荐)

    文件 ls&#xA0;-rtl&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&…

    Linux 2023年5月28日
    076
  • linux的启动流程详解

    linux启动流程 一、第一阶段:BIOS 上个世纪70年代初,”只读内存”(read-only memory,缩写为ROM)发明,开机程序被刷入ROM芯片…

    Linux 2023年6月7日
    085
  • .Net Core下DllImport使用方法及扩展

    引言​ 在有时候的开发过程中,我们会遇到需要调用系统的API,不巧的是.Net Core可能没办法为我们提供相关的调用方式。那需要如何才能解决这个问题呢?​ 这时候我们就可能会考虑…

    Linux 2023年6月13日
    077
  • 4.3 Linux压缩文件或目录为.zip格式(zip命令)

    我们经常会在 Windows 系统上使用 “.zip”格式压缩文件,其实”.zip”格式文件是 Windows 和 Linux 系统…

    Linux 2023年6月7日
    0101
  • 【.Net vs Java? 】 看一看二者的类有多像?

    1. 包(Package)、命名空间(NameSpace) 在Java中常用的是包(Package),较少提到NameSpace的概念。Java官方文档中这样说: 为了使类型更易于…

    Linux 2023年6月7日
    081
  • 如何使用IDEA进行DOCKER调试

    引言在日常的开发过程中我们使用的开发环境通常与正式环境并不一致,这样就比较容易出现一些意外。于是我们通常会借助docker来让我们的开发和正式环境一致。那如何在docker中进行运…

    Linux 2023年6月14日
    0109
  • QString转char *

    故事背景:最近用到阿里云的OSS,里面用到了好多char *,但是我QT里面都是QString,我尝试用QString::fromstdstring(“”)…

    Linux 2023年6月13日
    080
  • 005 Linux 命令三剑客之-sed

    grep:数据查找定位 awk:数据切片,数据格式化,功能最复杂 *sed:数据修改 三剑客各有所长,就从锅碗瓢盆一一开始吧! [En] The three swordsmen h…

    Linux 2023年5月27日
    085
  • K8S部署之VMWare网络拓扑踩坑

    知乎上最近发现一篇好文 图解K8S(01):基于Ubuntu 20.04部署1.23版K8S集群,想着之前 K8S 部署一直不成功,那么就照着这篇文章中说的试一试。结果在实验时遇到…

    Linux 2023年6月13日
    086
  • Linux命令1

    快捷键 1&#x3001;&#x6253;&#x5F00;&#x7EC8;&#x7AEF; ctrl+alt+t 2&#x3001;…

    Linux 2023年6月8日
    0105
  • zabbix钉钉报警

    1、要在linux中安装python3 yum install -y python3(如果直接安装不上参考别的文章) 这个安装好后默认有pip3(安装好模块否则发送不到) pip3…

    Linux 2023年6月6日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球