神奇的卡尔曼滤波,目标追踪的福音

news/2024/5/15 22:14:11/文章来源:https://blog.csdn.net/qq_51831335/article/details/126672949

前言

        卡尔曼滤波算法由匈牙利数学家Kalman提出,主要基于线性系统提出。这里我们将其用于汽车跟踪,并对其基本原理进行介绍。


神奇的卡尔曼滤波,目标追踪的福音

1. 背景知识

1.1 时间序列模型

1.2. 滤波

1.3. 线性动态系统 

2. 卡尔曼滤波理论知识 

2.1 预测

2.1.1 第一条公式:状态转移

2.1.2 第二条公式:协方差矩阵

2.2 更新

2.2.1 第三条公式:卡尔曼增益

2.2.2 第四条公式:观测矩阵

2.2.3 第五条公式:

3. 卡尔曼滤波的应用

3.1 代码

        3.1.1 获取场景数据。

        3.1.2 初始化

        3.1.3 开始预测与更新

        3.1.4 画图 


1.背景知识

1.1 时间序列模型

时间序列模型都可以用如下示意图表示:

这个模型包含两个序列,一个是黄色部分的状态序列,用X表示,一个是绿色部分的观测序列(又叫测量序列、证据序列、观察序列,不同的书籍有不同的叫法,在这里统一叫观测序列。)用Y表示。状态序列反应了系统的真实状态,一般不能被直接观测,即使被直接观测也会引进噪声;观测序列是通过测量得到的数据,它与状态序列之间有规律性的联系。

上面序列中,假设初始时间为t_{1}, 则X_{1},Y_{1}t_{1}时刻的状态值和观测值,X_{2},Y_{2}t_{2}时刻的状态值和观测值...,即随着时间的流逝,序列从左向右逐渐展开。  

常见的时间序列模型主要包括三个:隐尔马尔科夫模型,卡尔曼滤波,粒子滤波

1.2. 滤波

时间序列模型中包括预测和滤波两步

  • 预测:指用当前和过去的数据来求取未来的数据。对应上述序列图中,则是利用t_{1}时刻X_{1},Y_{1}的值,估计t_{2}时刻X_{2}值。
  • 滤波是用当前和过去的数据来求取当前的数据。对应上述序列图中,则是先通过上一步的预测步骤得到X_{2}的一个预测值,再利用t_{2}时刻Y_{2}的值对这个预测值进行纠正,得到最终的X_{2}估计值。(通俗讲,就是通过X_{1}预测一个值, 通过传感器测量一个值Y_{2}, 将两者进行融合得到最终的X_{2}值)        

1.3. 线性动态系统 

        卡尔曼滤波又称为基于高斯过程的线性动态系统(Linear Dynamic System, LDS)。

        · 这里的高斯是指:状态变量X_{t}和观测变量Y_{t}都符合高斯分布;(为什么是高斯分布?因为卡尔曼滤波估计的结果是一个概率,概率不是一个固定的值,而是一个范围,而这个范围符合高斯分布。)

        · 这里的线性是指:X_{t}可以通过X_{t-1}线性表示,Y_{t}可以通过X_{t}线性表示;

如果用数学表达式来表达这两层含义如下:

上面表达式中F是一个矩阵,常称作状态转移矩阵,保证了X_{t}X_{t-1}的线性关系(线性代数中,矩阵就是线性变换);w_{t-1}常称作噪声,其服从均值为0,方差为Q的高斯分布,保证了X_{t}服从高斯分布(因为高斯分布加上一个常数后依然是高斯分布)。

同样的关于X_{t}Y_{t},也可以得到如下表示, 其中矩阵H称作状态空间到观测空间的映射矩阵, rtrt称作噪声,其服从高斯分布:

2.卡尔曼滤波理论知识 

以下公式需要用到的变量含义如下:

  • x\hat{}_{k}:状态变量
  • \hat{P}_{k}: 状态变量的协方差矩阵
  • F_{k}:状态转移矩阵
  • B_{k}:控制矩阵
  • u_{k}:控制向量
  • w_{k}: 状态变量的噪声矩阵
  • Q_{k}:协方差矩阵的噪声矩阵

        学习卡尔曼滤波只需要弄懂下图这五个公式与他们之间的关系。

         预测中的两条公式,是通过上一时刻的状态预测下一时刻的状态的,通过这两条公式,我们得到的是带减号和上标的,这表示,这并不是最佳的估计值,减号表示它们还欠缺点什么东西,这个欠缺的东西呢就是通过观测值里面带来的信息,因为我们还需要用观测值中带来的信息修正误差,从而得到最优估计值,这正是更新这一步要做的事情。


        更新这三个公式,第一条公式是用来求卡尔曼增益K的,卡尔曼增益K是用来协同当前状态的观测值Z来更新XP的,经过更新后的值才是最佳的估计值,所以他们是不带减号下标的。


        我们可以看出,五条公式有三条(\hat{P}_{k}w_{k}Q_{k})都是有噪声尾随其后的,这些噪声不确定性会化为数值根据每一次迭代不断的更新,并用来修正充满了噪声观测值,从而使得观测值真实可靠。

2.1 预测

2.1.1 第一条公式:状态转移

        我们假设有这样一辆小车在以可变化的速度向前行驶,这个时候它有两个状态量:位置position和速度velocity(此后简略为p和v)。

        若当前时刻为t,则x_{t}为当前时刻的状态量,它有两个属性p_{t}v_{t},分别表示当前状态的位置和速度。 上面我们也说了滤波是预测当前的状态,那么我们如何预测当前的状态?自然是用过去的状态量预测当前的状态量,于是我们又有了x_{t-1},它也有两个属性p_{t-1}v_{t-1}

        至此,我们根据位置与速度,速度与时间之间的关系,简单的推出它们的数学表达公式(左边的两个式子),如果我们用线性代数的知识:矩阵,来描述这个式子,那么它将变成一种更具有计算与表达价值的矩阵形式(右边的式子)。

        但我们可以看出他依旧不是那么的简洁,这不符合优美的数学。所以我们接下来用F_{t}状态转移矩阵,它代表我们如何从上一时刻的状态来推测当前时刻的状态,和B_{t}控制矩阵,它表示上一时刻的状态控制量u如何作用于当前状态。如下图:

         x之所以戴了尖帽子是因为这只是一个估计量,因为我们无法永远预测汽车的真实状态,只能尽量可能的估计推测出真实状态,这是因为真实状态包含了非常多的噪声,比如汽车突然减速加速,或者掉进了一个坑...等等。噪声越大,不确定性也就越大,所以我们待会还需要根据协方差矩阵来计算这个不确定性究竟有多大。

2.1.2 第二条公式:协方差矩阵

        协方差矩阵P(这次是大写的)是符合高斯分布的,它在卡尔曼滤波中是用来表示p,v两个状态量之间的相关性,比如正相关(我大你也大)、负相关(我大你却小),不相关(我大不大都不管你的事),并且计算出系数,也就是如果是正相关,那么相关的程度用数字表达是多少。具体如下图:

        那么下一个问题就是,我们通过让上一刻的协方差矩阵P_{t-1} 推测到下一刻的协方差矩阵P_{t}呢?这里可以通过协方差的性质:

来推出:(加上Q是因为这样的传递预测也同样是有噪声Q的)

2.2 更新

2.2.1 第三条公式:卡尔曼增益

2.2.2 第四条公式:观测矩阵

2.2.3 第五条公式:

3 卡尔曼滤波的应用

        假设这样一个场景:有一辆小车始终以1m/s的速度匀速行驶在公路,一共行驶了20秒。我们通过卡尔曼滤波在有强烈噪声干扰的情况下试试下,小车能否被准确预测出来速度1m/s,且每个时刻对应距离(11s对应位于离原点11m的距离)

3.1 代码

        3.1.1 获取场景数据。

# 假设条件;一个小车20秒里每秒匀速移动1米。
# 观测20个时刻状态的值
Z = np.array([x for x in range(1, 20+1)])
# 观测中的噪声
noise = np.random.randn(1, 20)
# 添加噪声
Z = Z + noise
Z = Z[0]

        从加入了噪声的Z中可以看到,Z已经非常的混乱,那么我们的卡尔曼滤波是否还能够准确预测,达到我们理想中的情况呢?(速度1m/s,11s对应位于离原点11m的距离)

>>>print(Z)
>>>[-1.54066623  2.65314083  2.55081667  3.60778965  3.5172674   6.243922596.26421322  7.71828829  9.93166587  9.91688117 11.46280844 11.8368552912.13700321 13.5197601  12.52724415 17.40105333 16.84530721 18.1012952218.74874511 21.0930127 ]

        3.1.2 初始化

# 初始状态
X = np.array([0, 0])
# 初始状态协方差矩阵
P = np.eye(2)
# 初始化状态转移矩阵
F = np.array([[1, 1],[0, 1]
])
# 初始化状态转移矩阵协方差
Q = np.eye(2) * 0.0001
# 观测矩阵
H = np.eye(2)
# 观测矩阵噪声方差
R = np.eye(2)

        3.1.3 开始预测与更新

p = []
v = []
for i in range(len(Z)):# 预测的两个式子X_ = np.dot(F, X)P_ = np.dot(F, P)P_ = np.dot(P_, F.T) + Q# 更新的三个式子k1 = np.dot(P_, H.T)k2 = np.dot(np.dot(H, P_), H.T) + RK = np.dot(k1, np.linalg.inv(k2))X = Z[i] - np.dot(H, X_)X = X_ + np.dot(K, X)P = np.eye(2) - np.dot(K, H)P = np.dot(P, P_)p.append(int(X[0]))v.append(int(X[1]))

        3.1.4 画图 

       (横轴位置p,纵轴速度v)

        我们可以从图中看出,只需要很少的迭代次数,卡尔曼滤波就能在极强的噪声干扰下依旧得出相对比较精准的结果!ps:有兴趣的伙伴可以试着增加场景的复杂度喔

完整的代码 

import random
import matplotlib.pyplot as plt
import numpy as npif __name__ == '__main__':# 假设条件;一个小车20秒里每秒匀速移动1米。# 观测20个时刻状态的值Z = np.array([x for x in range(1, 20+1)])# 观测中的噪声noise = np.random.randn(1, 20)# 添加噪声Z = Z + noiseZ = Z[0]print(Z)# 初始状态X = np.array([0, 0])# 初始状态协方差矩阵P = np.eye(2)# 初始化状态转移矩阵F = np.array([[1, 1],[0, 1]])# 初始化状态转移矩阵协方差Q = np.eye(2) * 0.0001# 观测矩阵H = np.eye(2)# 观测矩阵噪声方差R = np.eye(2)p = []v = []for i in range(len(Z)):# 预测两个方差式子X_ = np.dot(F, X)P_ = np.dot(F, P)P_ = np.dot(P_, F.T) + Qk1 = np.dot(P_, H.T)k2 = np.dot(np.dot(H, P_), H.T) + RK = np.dot(k1, np.linalg.inv(k2))X = Z[i] - np.dot(H, X_)X = X_ + np.dot(K, X)P = np.eye(2) - np.dot(K, H)P = np.dot(P, P_)p.append(int(X[0]))v.append(int(X[1]))plt.scatter(p, v)plt.show()

完毕!

如果大家觉得本文对你有帮助的话,麻烦点赞+收藏,谢谢大家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_5543.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python生成PDF报告

如何使用Python制作pdf文档? PDF报告生成软件开发(学习记录) Python生成图文并茂的PDF报告 官方用户手册 字体下载注册问题 在windows找到字体文件:C:\Windows\Fonts 在你的python环境引入字体 D:\devementtool\Anaconda3-202…

Java并发 JUC工具类:Semaphore详解

文章目录Semaphore源码分析类的继承关系类的内部类类的内部类 - Sync类类的内部类 - NonfairSync类类的内部类 - FairSync类类的属性类的构造函数核心函数分析 - acquire函数核心函数分析 - release函数Semaphore 示例更深入理解单独使用Semaphore是不会使用到AQS的条件队列的场…

USB4 V2.0即将发布,速度高达80Gbps

关注星标公众号,不错过精彩内容作者 | strongerHuang微信公众号 | strongerHuang2019年3月初,USB-IF组织官方宣布了下一代 USB4.2019年9月3日,USB-IF组织正式发布 USB4(现在称USB4 V1.0)规范。最近,也就是2022年9月1日&#xff0c…

推荐系统中的特征工程

摘要:深度学习时期,与CV、语音、NLP领域不同,搜推广场景下特征工程仍然对业务效果具有很大的影响,并且占据了算法工程师的很多精力。数据决定了效果的上限,算法只能决定逼近上限的程度,而特征工程则是数据与…

uniapp 之 获取底部安全距离,状态栏高度等

特定样式注意点固定底部按钮自定义顶部导航栏其他工作中我们常常需要设置一些特定样式: 固定底部按钮自定义顶部导航栏…… 固定底部按钮 这里需要注意的是,真机运行时底部时IOS是存在安全距离的,这个时候就需要我们处理一下 .u-fixed-b …

Echarts y轴相关配置

目录1 简介2 y轴配置2.1 y轴主要属性2.2 y轴刻度设置3.总结1 简介 本篇介绍我们在使用Echarts画图时常用的一些y轴坐标设置,如y轴位置,y轴偏移量、y轴刻度、y轴最大最小值等; 2 y轴配置 2.1 y轴主要属性 只有一个纵坐标的情况下&#xff0…

TLM通信总结1

事务级建模 (TLM) 用于模块之间的通信。 TLM 是实现基于事务的方法的概念,这些方法可用于模块之间的通信。 UVM TLM UVM 为 TLM 库提供事务级接口,ports,exports,imp ports,and analysis ports。所有这些 TLM 元素都需要发送事务、接收事务以及从一个组件传输到另一个组件…

STM32物联网项目-程序框架思想

程序框架思想 一、程序框架的构想 1、STM32cubeMX生成的代码与添加的应用代码分离; 2、利用STM32cubeMX重新生成代码,不影响应用代码; 3、应用代码的添加,移除与修改,不影响cube生成的代码; 4、代码架构方便阅读,编辑&#x…

领域最全!多传感器融合方法综述!(Camera/Lidar/Radar等多源异构数据)

点击进入→自动驾驶之心技术交流群 后台回复【ECCV2022】获取ECCV2022所有自动驾驶方向论文! 自动驾驶中的多传感器融合 原文:Multi-Sensor Fusion in Automated Driving: A Survey 自动驾驶正成为影响未来行业的关键技术,传感器是自动驾驶系统中感知外部世界的关键,其协作…

Java 开发中的 Lombok 是什么?

一. 血案 今天有个学生告诉我,他在项目中使用Mybatis框架查询时报错,提示无法创建对象。但自己仔细地检查了代码都没有发现错误,于是他就半夜拼命地给我发消息求救。 我起床拿手机,还差点摔倒闪了我的老腰,我老婆看我…

猿创征文|工作中遇到技术盲区后的自我成长

猿创征文|工作中遇到技术盲区后的自我成长 1、立场 我是一名python后端开发程序员,在一家创业公司中兢兢业业工作快两年了,从软件架构、开发、测试、部署、运维一手经办,到开发文档、API接口、开发周期、设备交付、安装完成全程…

面向对象编程原则(03)——单一职责原则

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 参考资料 《大话设计模式》 作者:程杰《Java设计模式》 作者:刘伟《图解设计模式》 作者:结城浩《重学Java设计模式》 作者:…

[论文阅读] HairGAN: Spatial-Aware Palette GAN for Hair Color Transfer

[论文地址] [代码] [ICME 22] Abstract 头发颜色转移的目的是将头发颜色从参考图像转移到原始图像,同时保持原始图像的头发结构。然而,由于复杂的头发结构以及原始图像和参考图像之间头发区域的错位,现有的方法不能很好地完成这一任务。为了…

CTFshow_MISC入门_图片篇(基础操作信息附加)wp

文章目录前言Tipsmisc1misc2misc3misc4misc5misc6misc7misc8misc9misc10misc11后记前言 挺长时间没有打CTF了,感觉技术从之前就一直没有提升多少,摸了段时间的渗透&护网,感觉CTF的基础还是比较重要,温故而知新,就…

03.thymeleaf在业务系统中的应用

thymeleaf是Java方向开源的服务端模板引擎,支持多种格式的格式渲染。在存前端项目盛行的年代,webUI纯服务端渲染已经不再适合,但并不影响服务端模板的继续应用。 在企业集成业务系统中,由于低代码平台的业务标准化/组件化/所见及…

[ Linux长征路第三篇 ] 权限理解

目录 1.root用户和普通用户相互切换 2.文件类型和访问权限(事物属性) 2.1 文件类型 2.2 基本权限 2.3 文件权限值得表示方法 1)字符表示法 2)8进制数值表示法 2.4 文件访问权限的相关设置方法 1) chomd 2)三位8进制数字 3) cho…

解决找回密码不在右边的问题

问题如下: 在10.5中,按照书中代码写法为float-right,则出现上述的问题,找回密码不能和书中的结果一样呈现在右边,而出现在了左边 解决问题:把float-right改为float-end即可。其实这也不是什么大问题,不过可能会有的同学可能找不到解决方法,所以在这里写一下。因为淋过…

2022java-web一条龙工具安装

@目录java安装java-jdk安装java环境变量配置java-eclipse工具安装Java-idea工具安装MySQL安装navicat安装tomcat安装maven安装配置本地仓库配置镜像配置jdk 备忘~安装常见的一些我需要的集成工具以及jdk java安装 java-jdk安装 1,去官网进行安装下载jdk2,找到下载jdk的文件位…

json/xml/schema

JSON JSON是JavaScript Object Notation的缩写,是一种轻量级的数据交换格式,是理想的接口数据交换语言。官网:https://www.json.org/json-en.html 工作json请求体: json字符串 hashmap对象 jackson库 json响应结果断言 语法…

堆优化dijkstra的两种写法

例题: https://www.acwing.com/problem/content/description/1131/ 1、仅用dis数组记录,出队时记录最小距离#include<bits/stdc++.h>#define fore(x,y,z) for(LL x=(y);x<=(z);x++) #define forn(x,y,z) for(LL x=(y);x<(z);x++) #define rofe(x,y,z) for(LL x=(…