MATLAB - 估计滤波器(Estimation Filters)

2023-12-23 22:28

本文主要是介绍MATLAB - 估计滤波器(Estimation Filters),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录


前言

        本篇文章翻译自官网,部分下标有问题,请自行分辨。


一、背景介绍

1.1 估算系统

        对于许多自主系统(autonomous systems)来说,了解系统状态(system state)是设计任何应用的先决条件。但在现实中,系统状态往往无法直接获取(not directly obtainable)。系统状态通常是根据某些仪器(如传感器(sensors))测得的系统输出以及动力学或运动模型(a dynamic or motion model)控制的状态流推断或估计出来的。一些简单的技术,如最小二乘估计(least square estimation)或批量估计,足以解决静态或离线估计问题(static or offline estimation problems)。对于在线和实时(连续)估算(online and real time (sequential) estimation)问题,通常需要使用更复杂的估算滤波器。

        估计系统由描述状态流的动态或运动模型和描述如何获得测量值的测量模型组成。在数学上,这两个模型可以用运动方程和测量方程来表示。例如,一般非线性离散估计系统的运动方程和测量方程可以写成:

$\begin{array}{c}{​{x_{k+1}=f(x_{k})}}\\ {​{y_{k}=h(x_{k})}}\end{array}$

        其中,k 为时间步长,xk 为时间步长 k 时的系统状态,f(xk) 为与状态相关的运动方程,h(xk) 为与状态相关的测量方程,yk 为输出。

1.2 噪声分布

        在大多数情况下,建立一个完美的模型来捕捉所有动态现象是不可能的。例如,在自动驾驶汽车的运动模型中包含所有摩擦是不可能的。为了弥补这些未建模的动态现象(unmodeled dynamics),通常会在动态模型中加入过程噪声(process noise) (w)。此外,在进行测量时,测量结果中不可避免地会包含校准误差(calibration errors)等多种误差源。为了考虑这些误差,必须在测量模型中加入适当的测量噪声。包含这些随机噪声和误差(random noises and errors)的估算系统称为随机估算系统(stochastic estimation system),可以用以下方式表示:

$\begin{array}{c}{​{x_{k+1}=f(x_{k},w_{k})}}\\ {​{y_{k}=h(x_{k},v_{k})}}\end{array}$

        其中,wk 和 vk 分别代表过程噪声和测量噪声。

        在大多数工程应用中,过程噪声和测量噪声被假定遵循零均值高斯分布(zero-mean Gaussian)或正态分布(normal distributions),或至少近似于高斯分布。此外,由于确切状态未知,状态估计值是一个随机变量(random variable),通常假定遵循高斯分布。假设这些变量的分布为高斯分布,可以大大简化估计滤波器的设计,并构成卡尔曼滤波器(Kalman filter)系列的基础。

        随机变量 (x) 的高斯分布由均值 μ 和协方差矩阵(covariance matrix) P 参数化,可写成 x∼N(μ,P)。给定一个高斯分布,平均值也就是 x 的最可能值,由期望 (E) 定义为:

$\mu=E[x]$

        平均值也称为 x 关于原点(the origin)的第一矩(first moment)。描述 x 不确定性的协方差用期望 (E) 来定义,即

$P=E[(x-\mu)(x-\mu)^{T}]$

        协方差(The covariance)也称为 x 关于其均值(mean)的第二矩(second moment)。

        如果 x 的维数为一,则 P 只是一个标量。在这种情况下,P 的值通常用 σ2 表示,称为方差(variance)。平方根 σ 称为 x 的标准差(standard deviation)。标准差具有重要的物理意义。例如,下图显示了均值等于 μ、标准差等于 σ 的一维高斯分布的概率密度函数(probability density function)(描述了 x 取某个值的可能性)。约 68% 的数据位于 x 的 1σ 边界内,95% 的数据位于 2σ 边界内,99.7% 的数据位于 3σ 边界内。

        尽管高斯分布假设是工程应用中的主要假设,但也存在无法用高斯分布近似其状态的系统。在这种情况下,需要使用非卡尔曼滤波器(如粒子滤波器(particle filter))来准确估计系统状态。 

二、滤波器设计

        设计滤波器的目的是利用测量结果和系统动态来估计系统状态。由于测量通常是按离散的时间步长进行的,因此滤波过程通常分为两个步骤:

  1. 预测(Prediction): 使用动态模型在离散测量时间步(k = 1、2、3......,N)之间传播状态和协方差(Propagate state and covariance)。这一步也称为流程更新(flow update)。
  2. 校正(Correction): 利用测量结果修正离散时间步的状态估计值和协方差。这一步也称为测量更新(measurement update)。

        在表示不同步骤的状态估计和协方差状态时,xk|k 和 Pk|k 表示时间步骤 k 修正后的状态估计和协方差,而 xk+1|k 和 Pk+1|k 表示从上一个时间步骤 k 到当前时间步骤 k+1 预测的状态估计和协方差。

2.1 预测


        在预测步骤中,状态传播非常简单。滤波器只需将状态估计值代入动态模型,并按 xk+1|k = f(xk|k) 的方式向前传播。

        协方差传播则更为复杂。如果估计系统是线性的,那么协方差就可以根据系统特性在标准方程中精确传播 (Pk|k→Pk+1|k)。对于非线性系统,精确的协方差传播具有挑战性。不同滤波器的主要区别在于它们如何传播系统协方差。例如

  • 线性卡尔曼滤波器使用线性方程精确传播协方差。
  • 扩展卡尔曼滤波器基于线性近似来传播协方差,当系统高度非线性时,会产生较大误差。
  • 无迹卡尔曼滤波器使用无迹变换对协方差分布进行采样,并在时间上传播。

        如何传播状态和协方差也会极大地影响滤波器的计算复杂度。举个例子:

  • 线性卡尔曼滤波器使用线性方程精确传播协方差,通常计算效率较高。
  • 扩展卡尔曼滤波器使用线性近似,需要计算雅各布矩阵,需要更多计算资源。
  • 无特征卡尔曼滤波器需要对协方差分布进行采样,因此需要传播多个采样点,这对高维系统来说成本很高。

2.2 修正


        在修正步骤中,滤波器通过测量反馈来修正状态估计值。基本上,真实测量值与预测测量值之间的差值在乘以反馈增益矩阵后,会被添加到状态估计值中。例如,在扩展卡尔曼滤波器中,状态估计值的修正公式为

$x_{k+1|k+1} =x_{k+1|k} +K _k(y _{k+1}-h(x_{k+1|k}))$

        如前所述,xk+1|k 是(先验)修正前的状态估计值,xk+1|k+1 是(后验)修正后的状态估计值。Kk 是卡尔曼增益,受最优准则制约,yk 是真实测量值,h(xk+1|k) 是预测测量值。

        在修正步骤中,滤波器还要修正估计误差协方差。其基本思想是利用 yk+1 的分布信息修正 x 的概率分布。在滤波器中,预测和修正步骤是递归处理的。流程图显示了卡尔曼滤波器的一般算法。

 

三、传感器融合与跟踪工具箱中的估计滤波器(Estimation Filters in Sensor Fusion and Tracking Toolbox)

        传感器融合与跟踪工具箱™ 提供多种估计滤波器,可用于估计和跟踪动态系统的状态。

3.1 卡尔曼滤波器


        经典卡尔曼滤波器(trackingKF)是具有高斯过程和测量噪声的线性系统的最佳滤波器。线性估计系统可表示为

$\begin{array}{c}{​{x_{k+1}=A_{k}x_{k}+w_ k}}\\ {​{y_{k}=H_{k}x_{k}+v_{k}}}\end{array}$

        假设过程噪声和测量噪声都是高斯噪声,即

$\begin{array}{c}{​{w _k\sim N(0,Q_{k})}}\\ {​{v_{k}\sim N(0,R_{k})}}\end{array}$

        因此,协方差矩阵可以通过线性代数方程在测量步骤之间直接传播,即

$P_{k+1|k}=A_{k}P_{k|k}A_{k}^{T}+Q_{k}$

         测量更新的校正方程为

$\begin{array}{c}{​{x_{k+1|k+1}=x_{k+1|k}+K_{k}(y_{k}-H_{k}x_{k+1|k})}}\\ {​{P_{k+1|k+1}=(I-K_{k}H_{k})P_{k+1|k}}}\end{array}$

        为了在每次更新中计算卡尔曼增益矩阵 (Kk),滤波器需要计算一个矩阵的逆矩阵:

$K_{k}=P_{k|k-1}H_{k}^{T}\left[H_{k}P_{k|k-1}H_{k}^{T}+R_{k}\right]^{-1}$

        由于转置矩阵的维数等于估计状态的维数,因此对于高维系统来说,这种计算需要一定的计算量。更多详情,请参阅线性卡尔曼滤波器。

3.2 Alpha-Beta 滤波器

        Alpha-Beta 滤波器(trackingABF)是一种适用于线性系统的次优滤波器。该滤波器可视为简化的卡尔曼滤波器。在卡尔曼滤波器中,卡尔曼增益矩阵和协方差矩阵是动态计算的,每一步都会更新。然而,在 Alpha-Beta 滤波器中,这些矩阵是恒定的。这种处理方法牺牲了卡尔曼滤波器的最优性,但提高了计算效率。因此,在计算资源有限的情况下,Alpha-Beta 滤波器可能是首选。

 3.3 扩展卡尔曼滤波器


        最流行的扩展卡尔曼滤波器(trackingEKF)是从经典卡尔曼滤波器改进而来,以适应非线性模型。它的工作原理是将非线性系统与状态估计值线性化,并忽略二阶及更高阶的非线性项。除了卡尔曼滤波器中的 Ak 和 Hk 矩阵被 f(xk ) 和 h(xk) 的雅可比矩阵所取代外,它的公式与线性卡尔曼滤波器的公式基本相同: 

$\begin{array}{c}{​{A_{k}=\dfrac{\partial f(x_{k})}{\partial x_{k}}\bigg|_{x_{k|k-1}}}}\\ {​{H_{k}=\dfrac{\partial h(x_{k})}{\partial x_{k}}\bigg|_{x_{k|k-1}}}}\end{array}$ 

        如果估计系统的真实动态接近线性化动态,那么使用这种线性近似在短时间内不会产生明显误差。因此,对于更新间隔较短的轻度非线性估计系统,EKF 可以产生相对准确的状态估计。然而,由于 EKF 忽略了高阶项,因此对于高度非线性系统(例如四旋翼飞行器),特别是更新间隔较大的系统,EKF 可能会出现偏离。

        与 KF 相比,EKF 需要推导雅各布矩阵,这就要求系统动力学是可微分的,还需要计算雅各布矩阵使系统线性化,这就需要更多的计算资产。

        需要注意的是,对于状态以球面坐标表示的估计系统,可以使用 trackingMSCEKF。

3.4 无迹卡尔曼滤波器


        无迹卡尔曼滤波器(trackingUKF)使用无迹变换(UT)来近似传播非线性模型的协方差分布。UT 方法对当前时间的协方差高斯分布进行采样,利用非线性模型传播采样点(称为 sigma 点),并通过评估这些传播的 sigma 点来近似假定为高斯分布的协方差分布。图中说明了实际传播、线性化传播和不确定性协方差的UT 传播之间的差异。 

        与 EKF 采用的线性化方法相比,UT 方法能更准确地传播协方差,并能进行更准确的状态估计,尤其是对于高度非线性系统。UKF 不需要推导和计算雅各矩阵。但是,UKF 需要通过非线性模型传播 2n+1 个 sigma 点,其中 n 是估计状态的维度。对于高维系统来说,计算成本可能会很高。 

3.5 立方卡尔曼滤波器


        立方卡尔曼滤波器(trackingCKF)采用与 UKF 稍有不同的方法生成 2n 个用于传播协方差分布的样本点,其中 n 是估计状态的维度。这种交替的样本点集通常能带来更好的统计稳定性,并避免 UKF 可能出现的发散现象,尤其是在单精度平台上运行时。请注意,当 UKF 参数设置为 α = 1、β = 0 和 κ = 0 时,CKF 本质上等同于 UKF。 有关这些参数的定义,请参见 trackingUKF。 

3.6 高斯求和滤波器


        高斯和滤波器(TrackingGSF)使用多个高斯分布的加权和来近似估计状态的分布。估计状态由高斯状态的加权和给出: 

$x_ k=\sum_{i=1}^{N}{​{c}}^i_{k}{​{​{x}}}^i_{k}$

        其中,N 是滤波器中保持的高斯状态的数量,cki 是相应高斯状态的权重,每次更新都会根据测量结果进行修改。多个高斯状态遵循相同的动态模型:

${x}_{k+1}^{​{i}}=f(x_{k}^{​{i}},w_{k}^{​{i}}),\,\mathrm{for}\,i=1,2,\dots,N.$

        该滤波器能有效估计不完全可观测估计系统的状态。例如,当只有测距数据时,滤波器可以使用多个角度参数化的扩展卡尔曼滤波器来估计系统状态。有关示例,请参阅 "仅测距跟踪"。

3.7 交互式多重模型滤波器


        交互式多模型滤波器(trackingIMM)使用多个高斯滤波器来跟踪目标的位置。在高机动性系统中,系统动力学可以在多个模型(例如匀速、匀加速和匀转向)之间切换。仅使用一种运动模型来模拟目标的运动是很困难的。多模型估计系统可描述为:

$\begin{array}{l}\\ {​{x^{i}_{k+1}=f_ i(x_{k}^{\ i},w_{k}^{\ i})}}\\ {​{y_{k}^i=h _i(x_{k}^{i},v_{k}^i)}}\end{array}$

        其中 i = 1,2,...,M,M 是动态模型的总数。IMM 过滤器通过对机动目标使用多个模型来解决目标运动的不确定性。滤波器同时处理所有模型,并将总体估计值表示为这些模型估计值的加权和,其中权重为每个模型的概率。有关示例,请参阅 "跟踪机动目标"。

3.8 粒子滤波器


        粒子滤波器(trackingPF)不同于卡尔曼滤波器系列(例如 EKF 和 UKF),因为它不依赖于高斯分布假设,后者相当于使用均值和方差对不确定性进行参数化描述。取而代之的是,粒子滤波器通过时间对系统运行的加权样本(粒子)进行多次模拟,然后将这些粒子作为未知真实分布的代理进行分析。粒子滤波算法简介如图所示。

 

        这种方法背后的动机是大数定律论证 —— 随着粒子数量的增加,粒子的经验分布会越来越接近真实分布。与各种卡尔曼滤波器相比,粒子滤波器的主要优势在于它可以应用于非高斯分布。此外,该滤波器对系统动力学没有限制,可用于高度非线性系统。另一个优点是,粒子滤波器本身就能代表关于当前状态的多种假设。由于每个粒子都代表一个具有一定相关可能性的状态假设,因此粒子滤波器在状态存在模糊性的情况下非常有用。

        除了这些吸引人的特性外,粒子滤波器的计算复杂度也很高。例如,UKF 需要传播 13 个采样点来估计物体的三维位置和速度。然而,粒子滤波器可能需要数千个粒子才能获得合理的估计值。而且,实现良好估计所需的粒子数量会随着状态维度的增加而快速增长,在高维空间中会导致粒子剥夺问题。因此,粒子滤波器大多被应用于维数较低的系统(例如机器人)。

 四、如何选择跟踪滤波器


        下表列出了传感器融合与跟踪工具箱中所有可用的跟踪滤波器,以及在系统非线性、状态分布和计算复杂度等限制条件下如何选择这些滤波器。

滤波器名称支持非线性模型高斯状态计算复杂度评论
Alpha-BetaLowSuboptimal filter.次优滤波器。
KalmanMedium LowOptimal for linear systems.线性系统的最佳方案
Extended KalmanMediumUses linearized models to propagate uncertainty covariance.使用线性化模型传播不确定性协方差。
Unscented KalmanMedium HighSamples the uncertainty covariance to propagate the sample points. May become numerically unstable in a single-precision platform.采样不确定性协方差来传播采样点。在单精度平台上可能会出现数值不稳定的情况。
Cubature KalmanMedium HighSamples the uncertainty covariance to propagate the sample points. Numerically stable.采样不确定性协方差来传播采样点。数值稳定。
Gaussian-Sum

(Assumes a weighted sum of distributions假设分布的加权和)

HighGood for partially observable cases (angle-only tracking for example).适用于部分可观测的情况(例如只跟踪角度)。
Interacting Multiple Models (IMM)

Multiple models

(Assumes a weighted sum of distributions假设分布的加权和)

HighManeuvering objects (which accelerate or turn, for example)操纵物体(例如加速或转弯的物体)
ParticleVery HighSamples the uncertainty distribution using weighted particles.使用加权粒子对不确定性分布进行采样。

References

[1] Wang, E.A., and R. Van Der Merwe. "The Unscented Kalman Filter for Nonlinear Estimation." IEEE 2000 Adaptive Systems for Signal Processing, Communications, and Control Symposium. No. 00EX373, 2000, pp. 153–158.

[2] Fang, H., N. Tian, Y. Wang, M. Zhou, and M.A. Haile. "Nonlinear Bayesian Estimation: From Kalman Filtering to a Broader Horizon." IEEE/CAA Journal of Automatica Sinica. Vol. 5, Number 2, 2018, pp. 401–417.

[3] Arasaratnam, I., and S. Haykin. "Cubature Kalman Filters." IEEE Transactions on automatic control. Vol. 54, Number 6, 2009, pp. 1254–1269.

[4] Konatowski, S., P. Kaniewski, and J. Matuszewski. "Comparison of Estimation Accuracy of EKF, UKF and PF Filters." Annual of Navigation. Vol. 23, Number 1, 2016, pp. 69–87.

[5] Darko, J. "Object Tracking: Particle Filter with Ease." https://www.codeproject.com/Articles/865934/Object-Tracking-Particle-Filter-with-Ease.

 

这篇关于MATLAB - 估计滤波器(Estimation Filters)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/529678

相关文章

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数_matlab pmsm-CSDN博客

MATLAB层次聚类分析法

转自:http://blog.163.com/lxg_1123@126/blog/static/74841406201022774051963/ 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征

数据集 3DPW-开源户外三维人体建模-姿态估计-人体关键点-人体mesh建模 >> DataBall

3DPW 3DPW-开源户外三维人体建模数据集-姿态估计-人体关键点-人体mesh建模 开源户外三维人体数据集 @inproceedings{vonMarcard2018, title = {Recovering Accurate 3D Human Pose in The Wild Using IMUs and a Moving Camera}, author = {von Marc

MATLAB的fix(),floor()和ceil()函数的区别与联系

fix(x),floor(x)和ceil(x)函数都是对x取整,只不过取整方向不同而已。 这里的方向是以x轴作为横坐标来看的,向右就是朝着正轴方向,向左就是朝着负轴方向。 fix(x):向0取整(也可以理解为向中间取整) floor(x):向左取整 ceil(x):向右取整 举例: 4个数:a=3.3、b=3.7、c=-3.3、d=-3.7 fix(a)=3 fl

MATLAB中的eig函数

在MATLAB中,计算矩阵A的特征值和特征向量的函数是eig(A),常用的调用格式有5种: E=eig(A):求矩阵A的全部特征值,构成向量E。 [V,D]=eig(A):求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量。 [V,D]=eig(A,'nobalance'):与第2种格式类似,但第2种格式中先对A作相似变换后求矩阵A的特征值和特征向量,而格式3直接求矩阵A的特

MATLAB中的diag函数

diag函数功能:矩阵对角元素的提取和创建对角阵 设以下X为方阵,v为向量 1、X = diag(v,k)当v是一个含有n个元素的向量时,返回一个n+abs(k)阶方阵X,向量v在矩阵X中的第k个对角线上,k=0表示主对角线,k>0表示在主对角线上方,k<0表示在主对角线下方。例1: v=[1 2 3]; diag(v, 3) ans =      0     0     0