卡尔曼滤波(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)

大家都在看

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