1. Kalman filter基本介绍

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

卡尔曼滤波预测轨迹python 卡尔曼滤波预测轨迹_卡尔曼滤波

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

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

2. Kalman filter的核心思路

卡尔曼滤波预测轨迹python 卡尔曼滤波预测轨迹_卡尔曼滤波预测轨迹python_02

图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的相应公式

卡尔曼滤波预测轨迹python 卡尔曼滤波预测轨迹_.net_03

图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://zhuanlan.zhihu.com/p/48876718

代码示例类:


https://zhuanlan.zhihu.com/p/113685503