Kalman实际应用总结

@[toc]

理论部分不详细说明,网上大部分都给出很好的解释

网上大部分都是理论和简单的例子,很少看到实战的信息

本博文是笔者实际使用的总结,如有错误,请不吝指教

Kalman理论介绍

一. 简单理论介绍理论

二. 升华理论介绍

Kalman基本应用

一. Kalman跟踪/滤波

<u>对单个数据滤波,无法建立运动学模型</u>

<u>通过建立和自身相关的状态方程即可</u>

<u>是一种平滑操作(上一时刻和当前时刻的关系)</u>

举例:

对一个平面运动的质点进行跟踪(X、Y)?

  • 速度v、\alpha,\omega都是未知状态

求解:

fig = plt.figure()
axis = fig.add_subplot(1,1,1)

func_data = lambda x : x + x^2
z = np.mat(func_data(np.arange(1,100)))
x_mat = np.mat([[0,],[0.]])#状态矩阵[x,delta_x]
p_mat = np.mat([[1, 0], [0, 1]])#状态协方差矩阵
f_mat = np.mat([[1, 1],[0.,1.]])#状态转移矩阵
q_mat = np.mat([[0.0001, 0], [0, 0.0001]])
h_mat = np.mat([1.,0])# 观测矩阵[x]
r_mat = np.mat([1])#观测协方差矩阵
result = []
for i in range(z.shape[1]):
    x_predict = f_mat * x_mat
    p_predict = f_mat * p_mat * f_mat.T + q_mat
   
    kalman = p_predict * h_mat.T / (h_mat * p_predict * h_mat.T + r_mat)  
    
    x_mat = x_predict + kalman *(z[0, i] - h_mat * x_predict)
    p_mat = (np.eye(2) - kalman * h_mat) * p_predict
    result.append(x_predict[0,0])

axis.plot(result,label='predict')
axis.plot(z.tolist()[0],label='groundtruth')
axis.legend()
image

二. Kalman预测/融合(单传感器)

  • [x] 运动学模型
  • [x] 单一传感器
  • [x] 速度v、\alpha,\omega推导可知

举例一:

一个运动小车的位置和速度的测量等信息可以被测量(一个传感器),也可以通过牛顿运动学方程进行解算,这两个到底谁占的比例高?使用Kalman的协方差矩阵进行比例的计算。。。。具体看文档

image

举例二:

import numpy as np
import matplotlib.pyplot as plt

def kalman_xy(x, P, measurement, R,
              motion = np.matrix('0. 0. 0. 0.').T,
              Q = np.matrix(np.eye(4))):
    """
    Parameters:    
    x: initial state 4-tuple of location and velocity: (x0, x1, x0_dot, x1_dot)
    P: initial uncertainty convariance matrix
    measurement: observed position
    R: measurement noise 
    motion: external motion added to state vector x
    Q: motion noise (same shape as P)
    """
    return kalman(x, P, measurement, R, motion, Q,
                  F = np.matrix('''
                      1. 0. 1. 0.;
                      0. 1. 0. 1.;
                      0. 0. 1. 0.;
                      0. 0. 0. 1.
                      '''),
                  H = np.matrix('''
                      1. 0. 0. 0.;
                      0. 1. 0. 0.'''))

def kalman(x, P, measurement, R, motion, Q, F, H):
    '''
    Parameters:
    x: initial state
    P: initial uncertainty convariance matrix
    measurement: observed position (same shape as H*x)
    R: measurement noise (same shape as H)
    motion: external motion added to state vector x
    Q: motion noise (same shape as P)
    F: next state function: x_prime = F*x
    H: measurement function: position = H*x

    Return: the updated and predicted new values for (x, P)

    See also http://en.wikipedia.org/wiki/Kalman_filter

    This version of kalman can be applied to many different situations by
    appropriately defining F and H 
    '''
    # UPDATE x, P based on measurement m    
    # distance between measured and current position-belief
    y = np.matrix(measurement).T - H * x
    S = H * P * H.T + R  # residual convariance
    K = P * H.T * S.I    # Kalman gain
    x = x + K*y
    I = np.matrix(np.eye(F.shape[0])) # identity matrix
    P = (I - K*H)*P

    # PREDICT x, P based on motion
    x = F*x + motion
    P = F*P*F.T + Q

    return x, P

def demo_kalman_xy():
    x = np.matrix('0. 0. 0. 0.').T 
    P = np.matrix(np.eye(4))*1000 # initial uncertainty

    N = 20
    true_x = np.linspace(0.0, 10.0, N)
    true_y = true_x**2
    observed_x = true_x + 0.05*np.random.random(N)*true_x
    observed_y = true_y + 0.05*np.random.random(N)*true_y
    plt.plot(observed_x, observed_y, 'ro')
    result = []
    R = 0.01**2
    for meas in zip(observed_x, observed_y):
        x, P = kalman_xy(x, P, meas, R)
        result.append((x[:2]).tolist())
    kalman_x, kalman_y = zip(*result)
    plt.plot(kalman_x, kalman_y, 'g-')
    plt.show()

demo_kalman_xy()

这部分比较简单,网上的例子大部分都是基于此的。。。

三. Kalman多传感器融合A

  • [x] 运动学模型
  • [x] 多个传感器
  • [x] 传感器时间序列不同

举例:

以汽车跟踪为例,目标是知道汽车时刻的状态x=(p_x,p_y,v_x,v_y)$$x=(p_x,p_y,v_x,v_y)

已知的传感器有、lidar、radar

lidar:笛卡尔坐标系。可检测到位置,没有速度信息。其测量值z=(px,py)z=(px,py)

radar:极坐标系。可检测到距离,角度,速度信息,但是精度较低。其测量值z=(ρ,ϕ,ρ˙)z=(ρ,ϕ,ρ˙)

这是优达学城的一个例子,具体我也没视频网址。

matlab代码地址在这里python代码在这里

注意:

​ 这里相当于建立了两个模型,一个线性模型,一个非线性模型,在不同的时刻使用不同的传感器进行更新

​ 其实就是单个传感器合并到一起了。。。。

image

四. Kalman多传感器融合B

  • [ ] 无运动学模型
  • [x] 多传感器
  • [x] 传感器时序相同

举例:

一个小车做不均则运动(速度、加速度、角速度等都是可变的),现在有两个传感器:仪器A仪器B,他们都能测量 \omegav ,那么如何进行融合两个传感器呢?

  • <u>具体的代码这里不方便给出,有需要可以一起讨论</u>

这里其实和Kalman的滤波比较类似,就是把两个传感器当做一个传感器的不同时间序列 T_1,T_2 时刻测量的数据,然后滤波操作。

五. Kalman多传感器融合C

  • [ ] 无运动学模型
  • [x] 多传感器
  • [x] 传感器时序相同

条件和Kalman多传感器融合B相同,单处理方式不同

由于部分传感器精度不同,进行特定的取舍很有必要(亲身经历

假设求取小车的 \omegav

传感器A对\omega 测量较为准确

传感器B对 v 测量较为准确

解决:

其实我们如果直接按照Kalman多传感器融合B进行操作的话,误差基本不会缩小,可能还会增加

这个时候笔者的解决方案是把传感器A和B当做一个整体传感器C,传感器C测量的 \omega 是A的,测量的 v 是B的

那么我们就把这个合起来的传感器C进行滤波就行了

实测可用。。。

六. Kalman多传感器融合D

  • [x] 运动学模型
  • [x] 多传感器
  • [x] 传感器时序相同

看到网上很多人问这个问题,这里笔者没有亲自实现,只是做了猜想,不正确还望读者指正

解决:

由于卡尔曼只能一次融合两个信息(预测和观测),所以只能进行如下想法

  1. 进行两次融合,一次是预测和传感器A,一次结果和传感器B(这部分就是多传感器B
  2. 进行一次融合,预测和新的传感器C(Kalman多传感器融合C

七. Extend Kalman

  • 运动学模型不是线性的
  • 使用雅克比代替状态矩阵观测矩阵

注意:

笔者认为这种情况比较少见,因为 t 趋向于 \epsilon ,所以可以认为在无穷小的区间都近似于很恒定的

实在没办法的时候就使用EKF,原理都很简单,计算代价大许多

后续可以使用UKF进行操作,这部分笔者还未尝试

本文总结

最后来个简单的总结,什么是卡尔曼K

两个相同信息:A 和 B

都满足y=kx+b

那么如何得到 y ?

正常来说:y=(A+B)/2*x+b

但是好像不是非常好,这个(A+B)/2总是不变的,假如他们某个时刻占比改变了呢?

这个时候Kalman的作用的体现了,他计算A和B的关系(看公式吧)

得出一个系数 K 这个K 和A、B相关

此时:y=K*x+b

输入的A、B不同,那么K也不同

完毕!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容