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

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

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

Kalman理论介绍

一. 简单理论介绍理论

二. 升华理论介绍

Kalman基本应用

一. Kalman跟踪/滤波

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

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

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

举例:

对一个平面运动的质点进行跟踪(\(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()

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

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

举例一:

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

举例二:

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\)代码在这里

注意:

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

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

四. Kalman多传感器融合B

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

举例:

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

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

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

五. Kalman多传感器融合C

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

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

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

假设求取小车的 \(\omega\) 和 \(v\)

传感器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\)也不同

完毕!!!

Kalman实际应用总结的更多相关文章

  1. 【滤波】标量Kalman滤波的过程分析和证明及C实现

    摘要: 标量Kalman滤波的过程分析和证明及C实现,希望能够帮助入门的小白,同时得到各位高手的指教.并不涉及其他Kalman滤波方法. 本文主要参考自<A Introduction to th ...

  2. 理解Kalman滤波的使用

    Kalman滤波简介 Kalman滤波是一种线性滤波与预测方法,原文为:A New Approach to Linear Filtering and Prediction Problems.文章推导很 ...

  3. 卡尔曼滤波器 Kalman Filter (转载)

    在学习卡尔曼滤波器之前,首先看看为什么叫“卡尔曼”.跟其他著名的理论(例如傅立叶变换,泰勒级数等等)一样,卡尔曼也是一个人的名字,而跟他们不同的是,他是个现代人! 卡 尔曼全名Rudolf Emil ...

  4. Kalman滤波器原理和实现

    Kalman滤波器原理和实现 kalman filter Kalman滤波器的直观理解[1] 假设我们要测量一个房间下一刻钟的温度.据经验判断,房间内的温度不可能短时大幅度变化,也就是说可以依经验认为 ...

  5. 关于卡尔曼滤波(Kalman Filter)的很好讲解

    http://bilgin.esme.org/BitsAndBytes/KalmanFilterforDummies C#代码: double[] Data = new double[] { 0.39 ...

  6. [stm32] MPU6050 HMC5883 Kalman 融合算法移植

    一.卡尔曼滤波九轴融合算法stm32尝试 1.Kalman滤波文件[.h已经封装为结构体] /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronic ...

  7. 代码生成器Kalman Studio2.2发布,完美支持Oracle,不需要安装Oracle客户端

    这次更新主要是增加对Oracle的支持,不需要安装Oracle客户端,下面的配置文件列出了Kalman Studio支持的几种数据库 <?xml version="1.0" ...

  8. 学习OpenCV——Kalman滤波

    背景: 卡尔曼滤波是一种高效率的递归滤波器(自回归滤波器), 它能够从一系列的不完全及包含噪声的测量中,估计动态系统的状态.卡尔曼滤波的一个典型实例是从一组有限的,包含噪声的,对物体位置的观察序列(可 ...

  9. 卡尔曼滤波—Simple Kalman Filter for 2D tracking with OpenCV

    之前有关卡尔曼滤波的例子都比较简单,只能用于简单的理解卡尔曼滤波的基本步骤.现在让我们来看看卡尔曼滤波在实际中到底能做些什么吧.这里有一个使用卡尔曼滤波在窗口内跟踪鼠标移动的例子,原作者主页:http ...

  10. (二). 细说Kalman滤波:The Kalman Filter

    本文为原创文章,转载请注明出处,http://www.cnblogs.com/ycwang16/p/5999034.html 前面介绍了Bayes滤波方法,我们接下来详细说说Kalman滤波器.虽然K ...

随机推荐

  1. lock的等效代码

    1.lock的等效代码 在.NET的多线程程序中,经常会遇到lock关键字来控制同步,比如下列代码: private object o = new object(); public void Work ...

  2. metasploit安卓木马

    metasploit---安卓木马入侵 (仅供学习使用,禁止非法使用) 1.生成木马程序 msfvenom -p android/meterpreter/reverse_tcp LHOST=本机ip ...

  3. MySQL中You can't specify target table '表名'('sn_app_label') for update in FROM clause错误解决办法

    在有些时候有级联关系的数据放在了同一张表中,在写sql语句的时候可能会遇到这样的场景:我要插入两条数据,第一条是父节点,第二条是子节点,关联关系是父节点的自增长id:在写这样的sql语句时有可能就会出 ...

  4. Robo 3T SQL

    查询指定日期,指定显示字段,排序,注释功能 db.getCollection('spuBasisInfo') .find({"createTime":{$gte:ISODate(& ...

  5. python之约束、加密及logging模块

    一.什么是约束? 在生活中的约束大概就是有什么原因,导致你不能做这件事情了,称之为约束.而在python中的约束是在当多个类中,都需要使用某些方法时,需要人为抛出异常或使用基类+异常处理来进行约束 c ...

  6. Python面向对象之多态、封装

    一.多态 超过一个子类继承父类,出现了多种的形态. 例如,动物种类出现了多种形态,比如猫.狗.猪 class Animal:pass class Cat(Animal):pass class Dog( ...

  7. LTS秘钥协商算法分析

    1.根据RCF文档说法 在1-RTT中有两种密钥协商算法(1-RTT ECDHE和 1-RTT PSK  )和4中0-RTT密钥协商方式(0-RTT PSK, 0-RTT ECDH ,0-RTT EC ...

  8. 吾爱破解 Happy_New_Year_2019_Challenge 第二题

    题目在这里面找 https://down.52pojie.cn/Challenge/Happy_New_Year_2019_Challenge.rar 内容方面参考论坛上的文章,并做了一些补充 htt ...

  9. charles 手机抓包设置

    本文参考:charles 抓包手机 charles经常会进行手机上的网页抓包,比如去copy别人网站图片或脚本的时候o(∩_∩)o : 手机抓包的原理,和PC类似,手机依靠charles与服务端进行对 ...

  10. linux网络编程之posix条件变量

    今天来学习posix的最后一个相关知识----条件变量,言归正传. 下面用一个图来进一步描述条件变量的作用: 为什么呢? 这实际上可以解决生产者与消费者问题,而且对于缓冲区是无界的是一种比较理解的解决 ...