卡尔曼滤波器(一):卡尔曼滤波器简介

观看MATLAB技术讲座笔记,该技术讲座视频来自bilibili账号:MATLAB中国。

一、什么是卡尔曼滤波器

卡尔曼滤波器是一种优化估计算法,是一种设计最优状态观测器的方法,其功能为:

  • 估算只能被间接测量的变量;
  • 通过组合各种可能受噪声影响的传感器测量值,估算系统状态。

通常被应用于制导与导航系统、计算机视觉系统以及信号处理等领域。

卡尔曼滤波器就是一种状态观测器,要想了解什么是卡尔曼滤波器,需要先了解什么是状态观测器。状态观测器用来估计无法直接查看或测量的内容。

二、状态观测器

以下图为例,其中u为系统输入,x为系统状态,x不可直接测量,y为x的间接测量量。 x ^ \hat x x^ y ^ \hat y y^为x、y的估计值。如果测量值y能与其估计值 y ^ \hat y y^相互匹配,则 x ^ \hat x x^也会与真实的x相吻合。图中蓝色部分即为状态观测器,通过状态观测器,来消除测量值y和估算值 y ^ \hat y y^之间的误差,这样,x的估算值就会与其真实值吻合。

在这里插入图片描述

定义 e o b s = x − x ^ e_{obs}=x-\hat{x} eobs=xx^,由系统和观测器的方程可得:
e ˙ o b s = ( A − K C ) e o b s \dot e_{obs}=(A-KC)e_{obs} e˙obs=(AKC)eobs
该微分方程的解为:
e o b s ( t ) = e ( A − K C ) t e o b s ( 0 ) e_{obs}(t)=e^{(A-KC)t}e_{obs}(0) eobs(t)=e(AKC)teobs(0)
那么,如果 ( A − K C ) < 0 (A-KC)<0 (AKC)<0 e o b s e_{obs} eobs一定会随时间收敛至0,即 x ^ \hat x x^会收敛至 x x xK可以控制误差函数的衰减率。

三、最优状态估计

以一个简化的汽车模型为例,系统的输入为速度 u k u_k uk,系统状态为汽车的位置 x k x_k xk y k y_k yk x k x_k xk的间接测量输出,这里 C = 1 C=1 C=1。用随机变量 v k v_k vk表示传感器测量噪声,用随机变量 w k w_k wk表示系统过程噪声,可以代表风的影响或汽车速度的变化。假设噪声服从以下高斯分布:
v ∼ N ( 0 , R ) v \sim N(0,R) vN(0,R)
w ∼ N ( 0 , Q ) w \sim N(0,Q) wN(0,Q)
这里,R、Q为协方差,在这里由于系统为单输出,协方差为标量且等于噪声的方差。

在这里插入图片描述
我们可以用汽车数学模型来估算 x k x_k xk,但由于真实系统中过程噪声的存在,这个估算不会是完美的。
在这里插入图片描述
此时,我们有了估算值 x ^ k \hat x_k x^k和测量值 y k y_k yk,其均服从高斯分布。

四、卡尔曼滤波器(KF)

将上述 x ^ k \hat x_k x^k y k y_k yk的概率密度函数相乘,得到新的估计值的概率密度函数,同样服从高斯分布,新的方差小于原本的估计值分布的方差,新的均值即为 x k x_k xk的最佳估计。这就是卡尔曼滤波器背后的基本思想,其实现过程如下式所示。
x ^ k = A x ^ k − 1 + B u k + K k ( y k − C ( A x ^ k − 1 + B u k ) ) \hat x_k=A\hat x_{k-1}+Bu_k+K_k(y_k-C(A\hat x_{k-1}+Bu_k)) x^k=Ax^k1+Buk+Kk(ykC(Ax^k1+Buk))
其中, A x ^ k − 1 + B u k A\hat x_{k-1}+Bu_k Ax^k1+Buk为根据前一时间步估算状态以及当前输入对当前状态的预测,表示为 x ^ k − \hat{x}^{-}_k x^k,称其为先验估计值,其在使用当前测量值之前计算。上述方程重写为:
x ^ k = x ^ k − + K k ( y k − C x ^ k − ) \hat x_k=\hat{x}^{-}_k+K_k(y_k-C\hat{x}^{-}_k) x^k=x^k+Kk(ykCx^k)
K k ( y k − C x ^ k − ) K_k(y_k-C\hat{x}^{-}_k) Kk(ykCx^k)使用当前测量值来更新估计值,将最终结果 x ^ k \hat x_k x^k称为后验估计值。

所以可知,卡尔曼滤波器分为预测和更新两个部分。在预测部分计算先验状态预估值和其误差协方差(对于单状态系统即为方差):
x ^ k − = A x ^ k − 1 + B u k \hat{x}^{-}_k=A\hat x_{k-1}+Bu_k x^k=Ax^k1+Buk
P k − = A P k − 1 A T + Q {P}^{-}_k=AP_{k-1}A^T+Q Pk=APk1AT+Q
在更新阶段,用先验预估值计算后验状态预估值和其误差协方差:
K k = P k − C T C P k − C T + R K_k=\frac{P^-_kC^T}{CP^-_kC^T+R} Kk=CPkCT+RPkCT
x ^ k = x ^ k − + K k ( y k − C x ^ k − ) \hat x_k=\hat{x}^{-}_k+K_k(y_k-C\hat{x}^{-}_k) x^k=x^k+Kk(ykCx^k)
P k = ( I − K k C ) P k − P_k=(I-K_kC)P^-_k Pk=(IKkC)Pk
调整卡尔曼滤波增益 K k K_k Kk,使更新后的状态值误差协方差 P k P_k Pk最小。

考虑两种极端情况,当测量噪声方差R为0时,此时 K k = C − 1 K_k=C^{-1} Kk=C1 x ^ k = y k \hat x_k=y_k x^k=yk,即对状态量的后验估计完全取决于测量值。当先验状态预估值误差协方差 P k − P^-_k Pk为0时, K k = 0 K_k=0 Kk=0 x ^ k = x ^ k − \hat x_k=\hat{x}^{-}_k x^k=x^k,即对状态量的后验估计完全取决于先验估计。

综上,用卡尔曼滤波器估计当前状态,需要上一个时间步的后验状态估计值及其误差协方差矩阵和当前测量值。

针对同样的问题,如果有两个传感器(即两个测量值),则卡尔曼滤波器方程为:
x ^ k [ 1 × 1 ] = x ^ k − [ 1 × 1 ] + K k [ 1 × 2 ] ( y k [ 2 × 1 ] − C [ 2 × 1 ] x ^ k − [ 1 × 1 ] ) {\hat x_k}_{[1\times1]}={\hat{x}^{-}_k}_{[1\times1]}+{K_k}_{[1\times2]}({y_k}_{[2\times1]}-C_{[2\times1]}{\hat{x}^{-}_k}_{[1\times1]}) x^k[1×1]=x^k[1×1]+Kk[1×2](yk[2×1]C[2×1]x^k[1×1])

五、非线卡尔曼滤波器

KF仅适用于线性系统,对于如下状态转换函数或观测函数是非线性的系统,需要使用非线性状态估算器。卡尔曼滤波器假设状态服从高斯分布,但高斯分布经非线性变化之后得到的可能不再是高斯分布,卡尔曼滤波器算法可能不会收敛。
x k = f ( x k − 1 , u k ) + w k x_k=f(x_{k-1},u_k)+w_k xk=f(xk1,uk)+wk
y k = g ( x k ) + v k y_k=g(x_k)+v_k yk=g(xk)+vk
可以使用以下三种非线性状态估算器。

1、扩展卡尔曼滤波器(EKF)

EKF把非线性函数在当前估算状态的平均值附近进行线性化,如下图所示。
在这里插入图片描述
在每个时间步执行线性化,然后将得到的雅可比矩阵用于预测和更新状态。
雅可比矩阵:
F = ∂ f ∂ x ∣ x ^ k − 1 , u k F=\frac{\partial f}{\partial x}|_{\hat x_{k-1},u_k} F=xfx^k1,uk
G = ∂ g ∂ x ∣ x ^ k G=\frac{\partial g}{\partial x}|_{\hat x_k} G=xgx^k
线性化系统:
Δ x k ≈ F Δ x k − 1 + w k \Delta x_k\approx F\Delta x_{k-1}+w_k ΔxkFΔxk1+wk
Δ y k ≈ G Δ x k + v k \Delta y_k\approx G\Delta x_k+v_k ΔykGΔxk+vk
EKF缺点如下:

  • 如果有复杂的导数存在,可能难以解析计算雅可比矩阵;
  • 如果以数值方式计算雅可比矩阵可能需要很高的计算成本;
  • EKF不适用于具有不连续模型的系统,因为系统不可微分时雅可比矩阵不存在;
  • 高度非线性系统的线性化效果不好,非线性函数可能不能通过线性函数很好的近似表达出来。换言之,使用EKF需要非线性系统本身能够很好的进行线性化。

2、无迹卡尔曼滤波器(UKF)

UKF不像EKF那样近似非线性函数,其近似概率分布。UKF选择一组最小的采样点(称为sigma点),让它们均值与协方差和要近似的分布一致,且sigma围绕均值对称分布。将sigma进行非线性变化,计算变化后的点的均值和协方差,用来确定确定新的高斯分布,计算新的状态值。
在这里插入图片描述

粒子滤波器(PF)与UKF原理类似,其使用的样本点称为粒子。但与UKF不同,PF近似任意分布。为了表示未明确知道的任意分布,PF所需的粒子数远大于UKF。

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

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

相关文章

​漏电继电器JHOK-ZBLφ150mm 0.03-3A 0.2-2S导轨安装JOSEF约瑟

系列型号&#xff1a; JHOK-ZBL多档切换式漏电&#xff08;剩余&#xff09;继电器&#xff08;导轨&#xff09; JHOK-ZBL1多档切换式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBL2多档切换式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBM多档切换式漏电&#xff08;…

深入理解分布式事务① ---->分布式事务基础(四大特性、五大类型、本地事务、MySQL并发事务问题、MySQL事务隔离级别命令设置)详解

目录 深入理解分布式事务① ---->分布式事务基础&#xff08;四大特性、五大类型、本地事务、MySQL并发事务问题、MySQL事务隔离级别命令设置&#xff09;详解事务的基本概念1、什么是事务&#xff1f;2、事务的四大特性2-1&#xff1a;原子性&#xff08;Atomic&#xff09…

STM32点灯大师(中断法)

一、使用CubeMX配置 新增加了RCC进行配置 二、代码 需要重写虚函数&#xff0c;给自己引用

Python打怪升级(4)

在计算机领域常常有说"合法"和"非法"指的是:是否合理&#xff0c;是否有效&#xff0c;并不是指触犯了法律。 random.randint(begin,end) 详细讲解一下这个random是指模板&#xff0c;也就是别人写好的代码直接来用&#xff0c;在Python当中&#xff0c;…

《R语言与农业数据统计分析及建模》学习——ggplot2绘图基础

一、农业科研数据可视化常用图形及用途 1、数据可视化的重要性 通过可视化&#xff0c;我们可以更直观地理解和分析数据的特征和趋势。 2、常用图表类型及其概述 散点图&#xff1a;用于展示两个变量之间的关系&#xff0c;可用于观察数据的分布、趋势和异常值。 折线图&…

网络安全之CSRFSSRF漏洞(上篇)(技术进阶)

目录 一&#xff0c;CSRF篇 二&#xff0c;认识什么是CSRF 三&#xff0c;实现CSRF攻击的前提 四&#xff0c;实战演练 【1】案例1 【2】案例2 【3】案例3 【4】案例4&#xff08;metinfo&#xff09; 一&#xff0c;CSRF篇 二&#xff0c;认识什么是CSRF CSRF&#x…

YesPMP众包平台最新项目

YesPMP一站式互联网众包平台&#xff0c;最新外包项目&#xff0c;有感兴趣的用户可进入平台参与竞标。 &#xff08;竞标后由项目方直接与服务商联系&#xff0c;双方直接对接&#xff09; 1.查看项目&#xff1a;个人技术-YesPMP平台 2.查看项目&#xff1…

【003_音频开发_基础篇_Linux进程通信(20种你了解几种?)】

003_音频开发_基础篇_Linux进程通信&#xff08;20种你了解几种&#xff1f;) 文章目录 003_音频开发_基础篇_Linux进程通信&#xff08;20种你了解几种&#xff1f;)创作背景Linux 进程通信类型fork() 函数fork() 输出 2 次fork() 输出 8 次fork() 返回值fork() 创建子进程 方…

zkVM选型要点

1. 引言 当选择ZK工具&#xff0c;来做可验证链下计算来扩容区块链时&#xff0c;需考虑&#xff1a; 1&#xff09;为何应选择zkVM&#xff1f;2&#xff09;zkVM有哪些基本功能&#xff1f;3&#xff09;哪些zkVM可提供这些基本功能&#xff1f; 2. 为何应选择zkVM&#x…

OpenCV——图像分块局部阈值二值化

目录 一、算法原理1、算法概述2、参考文献 二、代码实现三、结果展示 OpenCV——图像分块局部阈值二值化由CSDN点云侠原创&#xff0c;爬虫自重。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫。 一、算法原理 1、算法概述 针对目前局部阈值二值…

消息队列 Kafka 入门篇(二) -- 安装启动与可视化工具

一、Windows 10 环境安装 1、下载与解压 首先&#xff0c;访问Apache Kafka的官方下载地址&#xff1a; https://kafka.apache.org/downloads 在本教程中&#xff0c;我们将使用kafka_2.13-2.8.1版本作为示例。下载完成后&#xff0c;解压到您的工作目录的合适位置&#xff…

目标检测——YOLOv6算法解读

论文&#xff1a;YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications (2022.9.7) 作者&#xff1a;Chuyi Li, Lulu Li, Hongliang Jiang, Kaiheng Weng, Yifei Geng, Liang Li, Zaidan Ke, Qingyuan Li, Meng Cheng, Weiqiang Nie, Yiduo Li, Bo …

企业商业活动如何获得央级媒体的采访报道?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 企业想要获得央级媒体的采访报道&#xff0c;确实需要精心策划和准备&#xff1a; 一、如何巧妙给媒体报选题 精准定位&#xff1a;首先要明确企业的核心价值、创新点或行业影响力&…

【C++】手撕list(list的模拟实现)

目录 01.节点 02.迭代器 迭代器运算符重载 03.list类 &#xff08;1&#xff09;构造与析构 &#xff08;2&#xff09;迭代器相关 &#xff08;3&#xff09;容量相关 &#xff08;4&#xff09;访问操作 &#xff08;5&#xff09;插入删除 我们在学习数据结构的时候…

StartAI智能绘图软件出现“缺少Python运行库”怎么办?

StartAI做为一款国产AI界的新秀&#xff0c;是一款贴合AIGC新手的智能绘图软件。新手安装遇见“缺少Python运行库”怎么办”&#xff1f;小编一招搞定~ 解决方法&#xff1a;手动下载【resource文件】&#xff0c;将文件添加到安装目录下。 点击链接进行手动下载噢~ 确保 Star…

图像处理之模板匹配(C++)

图像处理之模板匹配&#xff08;C&#xff09; 文章目录 图像处理之模板匹配&#xff08;C&#xff09;前言一、基于灰度的模板匹配1.原理2.代码实现3.结果展示 总结 前言 模板匹配的算法包括基于灰度的匹配、基于特征的匹配、基于组件的匹配、基于相关性的匹配以及局部变形匹…

Spring-IOC之组件扫描

版本 Spring Framework 6.0.9​ 1. 前言 通过自动扫描&#xff0c;Spring 会自动从扫描指定的包及其子包下的所有类&#xff0c;并根据类上的特定注解将该类装配到容器中&#xff0c;而无需在 XML 配置文件或 Java 配置类中逐一声明每一个 Bean。 支持的注解 Spring 支持一系…

Mysql索引详解(索引分类)

文章目录 概述索引对查询速度的影响索引的优缺点索引类型一级索引和二级索引的区别MySQL 回表联合索引&#xff08;最左前缀原则主键索引和唯一索引的区别BTree索引和Hash索引的区别 覆盖索引索引下推加索引能够提升查询效率原因MySQL 索引结构采用 B树原因索引失效的场景MySQL…

JAVASE基础语法(异常、常用类)

一、异常 1.1 什么是异常 异常就是指不正常。是指代码在运行过程中可能发生错误&#xff0c;导致程序无法正常运行。 package com.atguigu.exception;public class TestException {public static void main(String[] args) {int[] arr {1,2,3,4,5};System.out.println(&quo…

前端css中filter(滤镜)的使用

前端css中filter的使用 一、前言二、补充内容说明三、模糊&#xff08;一&#xff09;、模糊效果&#xff0c;源码1&#xff08;二&#xff09;、源码1运行效果1.视频演示2.截图演示 四、阴影&#xff08;一&#xff09;、阴影效果&#xff0c;源码2&#xff08;二&#xff09;…