卡尔曼滤波分析及程序

简介: 卡尔曼滤波分析及程序

这部分内容不注重卡尔曼滤波的推导,只关注卡尔曼滤波的作用【据说推导很难😒😒,总之这篇文章是对卡尔曼的整体流程进行解释,没有纠结公式的逐步推导,看了这部分会让你知道卡尔曼滤波是干什么的,具体的步骤是什么✔✔】

卡尔曼滤波是干什么的

卡尔曼滤波是用来对事物的状态进行估计的,为什么要对事物的状态进行估计呢?那肯定是我们无法准确的知道事物的当前状态,这时候我们就要进行估计了嘛【但是我们不可能是随便的估计,往往是根据一些经验等来进行估计,所有估计的结果是相对准确的】;另一方面,为了估计一个事物的状态,我们还可以借助一些仪器来进行测量,但是用仪器进行测量就会存在一定的测量误差。这时候就会产生一个问题,我们应该相信我们的估计结果还是相信测量结果呢?我想大概率人们都会这么想:如果我们使用的测量仪器是从某个小厂家手里花五毛钱买的劣质仪器,那么我们会更相信估计结果;如果买的仪器价值千金,那我们则有理由相信测量结果。其实呢,我们往往都会给这两种结果分配不同的比例,表示我们更信任哪种结果。那么卡尔曼滤波就是结合事先的估计和仪器的测量这两种手段来估计 事物状态的方法。


我们再举个例子来说明上文所要表达的含义。如下图所示,我们用炉子给水壶烧水,现在水沸腾了,我们结合初中知识,估计水的温度是95.4°C【受大气压影响,没有一百度🎈】,即Xk=95.4°C。这时候我们用一个温度计测量水的温度,发现其值为yk=94.1°C。发现xk和yk不一致,该相信谁呢?我们假设温度计的可信度为0.6,估计的为0.4,则最终的的水温=0.6*94.1+0.4*95.4=94.62。730d0a4bac284ca58f5f4131e7bcc5ea.png

卡尔曼滤波例子分析

612737d8514b4cea8bf5fdf3921174f7.png

卡尔曼公式

da6b885aa1ae4645adbc2e7933ac7986.png

卡尔曼主要就是上图中的五个公式,首先是对物体状态进行预测,然后进行测量更新,如此循环。

卡尔曼滤波直观理解

682fea7d1e4d461a8c8f07db1bc666ea.png

卡尔曼Python例子【使用jupyter-notebook】

该例子主要是随机生产一些位置和速度信息,然后通过卡尔曼滤波估计出行人速度和位置。

#载入相关的库
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
from scipy.stats import norm
#初始化行人状态x, 行人的不确定性(协方差矩阵)P,测量的时间间隔dt,处理矩阵F以及测量矩阵H:
x = np.matrix([[0.0, 0.0, 0.0, 0.0]]).T
print(x, x.shape)
P = np.diag([1000.0, 1000.0, 1000.0, 1000.0])
print(P, P.shape)
dt = 0.1 # Time Step between Filter Steps
F = np.matrix([[1.0, 0.0, dt, 0.0],
              [0.0, 1.0, 0.0, dt],
              [0.0, 0.0, 1.0, 0.0],
              [0.0, 0.0, 0.0, 1.0]])
print(F, F.shape)
H = np.matrix([[0.0, 0.0, 1.0, 0.0],
              [0.0, 0.0, 0.0, 1.0]])
print(H, H.shape)
ra = 10.0**2
R = np.matrix([[ra, 0.0],
              [0.0, ra]])
print(R, R.shape)
#计算测量过程的噪声的协方差矩阵R和过程噪声的协方差矩阵Q
ra = 0.09
R = np.matrix([[ra, 0.0],
              [0.0, ra]])
print(R, R.shape)
sv = 0.5
G = np.matrix([[0.5*dt**2],
               [0.5*dt**2],
               [dt],
               [dt]])
Q = G*G.T*sv**2
from sympy import Symbol, Matrix
from sympy.interactive import printing
printing.init_printing()
dts = Symbol('dt')
Qs = Matrix([[0.5*dts**2],[0.5*dts**2],[dts],[dts]])
Qs*Qs.T
I = np.eye(4)
print(I, I.shape)
#随机产生一些测量数据
m = 200 # Measurements
vx= 20 # in X
vy= 10 # in Y
mx = np.array(vx+np.random.randn(m))
my = np.array(vy+np.random.randn(m))
measurements = np.vstack((mx,my))
print(measurements.shape)
print('Standard Deviation of Acceleration Measurements=%.2f' % np.std(mx))
print('You assumed %.2f in R.' % R[0,0])
fig = plt.figure(figsize=(16,5))
plt.step(range(m),mx, label='$\dot x$')
plt.step(range(m),my, label='$\dot y$')
plt.ylabel(r'Velocity $m/s$')
plt.title('Measurements')
plt.legend(loc='best',prop={'size':18})

b11a7e5105f7492cb64acf77f1133cd2.png

#一些过程值,用于结果的显示
xt = []
yt = []
dxt= []
dyt= []
Zx = []
Zy = []
Px = []
Py = []
Pdx= []
Pdy= []
Rdx= []
Rdy= []
Kx = []
Ky = []
Kdx= []
Kdy= []
def savestates(x, Z, P, R, K):
    xt.append(float(x[0]))
    yt.append(float(x[1]))
    dxt.append(float(x[2]))
    dyt.append(float(x[3]))
    Zx.append(float(Z[0]))
    Zy.append(float(Z[1]))
    Px.append(float(P[0,0]))
    Py.append(float(P[1,1]))
    Pdx.append(float(P[2,2]))
    Pdy.append(float(P[3,3]))
    Rdx.append(float(R[0,0]))
    Rdy.append(float(R[1,1]))
    Kx.append(float(K[0,0]))
    Ky.append(float(K[1,0]))
    Kdx.append(float(K[2,0]))
    Kdy.append(float(K[3,0]))    
#卡尔曼滤波
for n in range(len(measurements[0])):
    # Time Update (Prediction)
    # ========================
    # Project the state ahead
    x = F*x
    # Project the error covariance ahead
    P = F*P*F.T + Q
    # Measurement Update (Correction)
    # ===============================
    # Compute the Kalman Gain
    S = H*P*H.T + R
    K = (P*H.T) * np.linalg.pinv(S)
    # Update the estimate via z
    Z = measurements[:,n].reshape(2,1)
    y = Z - (H*x)                            # Innovation or Residual
    x = x + (K*y)
    # Update the error covariance
    P = (I - (K*H))*P
    # Save states (for Plotting)
    savestates(x, Z, P, R, K)
#显示一下关于速度的估计结果
def plot_x():
    fig = plt.figure(figsize=(16,9))
    plt.step(range(len(measurements[0])),dxt, label='$estimateVx$')
    plt.step(range(len(measurements[0])),dyt, label='$estimateVy$')
    plt.step(range(len(measurements[0])),measurements[0], label='$measurementVx$')
    plt.step(range(len(measurements[0])),measurements[1], label='$measurementVy$')
    plt.axhline(vx, color='#999999', label='$trueVx$')
    plt.axhline(vy, color='#999999', label='$trueVy$')
    plt.xlabel('Filter Step')
    plt.title('Estimate (Elements from State Vector $x$)')
    plt.legend(loc='best',prop={'size':11})
    plt.ylim([0, 30])
    plt.ylabel('Velocity')
plot_x()

33471cbc4ea7407087f16486a9e2fde2.png

#显示位置的估计结果
def plot_xy():
    fig = plt.figure(figsize=(16,16))
    plt.scatter(xt,yt, s=20, label='State', c='k')
    plt.scatter(xt[0],yt[0], s=100, label='Start', c='g')
    plt.scatter(xt[-1],yt[-1], s=100, label='Goal', c='r')
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.title('Position')
    plt.legend(loc='best')
    plt.axis('equal')
plot_xy()

1d12d03b2ea2446486f6d7d4ebbb6704.png

相关文章
【Leetcode -367.有效的完全平方数 -374.猜数字大小】
【Leetcode -367.有效的完全平方数 -374.猜数字大小】
209 0
|
机器学习/深度学习 人工智能 数据可视化
【2024美赛】C题 Momentum in Tennis网球运动中的势头 25页中英文论文及Python代码
本文提供了一篇25页的中英文论文,针对2024美国大学生数学建模竞赛C题"网球运动中的势头",建立了数学模型来分析网球比赛中势头的形成和影响,并通过Python代码实现了模型的定量分析和可视化,同时对模型的合理性、影响因素、预测方法和战术策略进行了深入探讨。
786 3
【2024美赛】C题 Momentum in Tennis网球运动中的势头 25页中英文论文及Python代码
|
存储 缓存 安全
内存屏障,写屏障和读屏障
本文介绍了Java内存模型(JMM)的关键概念,包括主内存、工作内存、原子性操作、可见性和有序性,并详细解释了写屏障和读屏障的作用,它们是用来确保多线程环境中内存可见性和指令重排序一致性的同步操作。
601 1
|
分布式计算 DataWorks 调度
DataWorks产品使用合集之如何进入迁移助手页面并使用迁移助手功能
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
存储 自然语言处理 搜索推荐
深入了解Elasticsearch搜索引擎篇:倒排索引、架构设计与优化策略
首先,我们介绍了Elasticsearch(ES)的倒排索引,这是一种用于快速检索的数据结构。其次,我们了解了ES集群的架构,包括主节点、数据节点和协调节点的功能和作用。然后,我们探讨了中文分词器的选择,其中包括IK、HanLP和Jieba等常用的分词工具。接着,我们解释了写入数据和查询数据的工作原理,包括请求的分配和预处理,数据的存储和查询结果的处理过程。最后,我们讨论了ES部署的优化方法,包括调整JVM内存、分片布局和数量、节点身份设计以及配置Ingest节点等方面的策略。
355 0
深入了解Elasticsearch搜索引擎篇:倒排索引、架构设计与优化策略
顺序表与链表(双向)优劣势
顺序表与链表(双向)优劣势
261 0
|
机器学习/深度学习 TensorFlow 数据处理
01 使用LSTM模型预测双色球,中大奖指日可待!
01 使用LSTM模型预测双色球,中大奖指日可待!
|
机器学习/深度学习 人工智能 编解码
【数据挖掘】期末复习笔记(重点知识)
数据挖掘期末复习笔记
1217 0
|
存储 Java
LeetCode精讲 03无重复字符的最长子串(滑动窗口)
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
249 0
LeetCode精讲 03无重复字符的最长子串(滑动窗口)
|
SQL 消息中间件 机器学习/深度学习
面试官:谈谈Redis缓存和MySQL数据一致性问题
对于Web来说,用户量和访问量增一定程度上推动项目技术和架构的更迭和进步。可能会有以下的一些状况:
532 0
面试官:谈谈Redis缓存和MySQL数据一致性问题