主要内容

particleFilter

用于在线状态估计的粒子滤波对象

描述

粒子滤波器是一种递归的贝叶斯状态估计器,它使用离散粒子来近似估计状态的后验分布。当测量值和系统模型(将模型状态与测量值联系起来)可用时,它对于在线状态估计是有用的。粒子滤波算法递归地计算状态估计,包括初始化、预测和修正步骤。

particleFilter使用离散粒子滤波算法为离散非线性系统的在线状态估计创建一个对象。

考虑一个有状态的工厂x、输入u、输出,过程噪声w,和测量y.假设你可以把植物表示成一个非线性系统。

该算法计算状态估计 x 用你指定的状态转换和测量似然函数来计算非线性系统。

该软件支持任意非线性状态转金宝app换和测量模型,具有任意过程和测量噪声分布。

为了进行在线状态估计,创建非线性状态转移函数和测量似然函数。然后构造particleFilter对象使用这些非线性函数。创建对象后:

  1. 元素初始化粒子初始化命令。

  2. 方法在下一步中预测状态估计预测命令。

  3. 更正状态估计使用正确的命令。

预测步骤根据您提供的状态转换模型使用最新的状态来预测下一个状态。修正步骤使用当前传感器测量来修正状态估计。该算法可选地重新分配或重新采样状态空间中的粒子,以匹配估计状态的后验分布。每个粒子代表这些状态变量的一个离散状态假设。所有粒子的集合被用来帮助确定状态估计。

创建

对象描述

例子

pf= particleFilter (StateTransitionFcnMeasurementLikelihoodFcn创建一个粒子过滤器对象,用于离散非线性系统的在线状态估计。StateTransitionFcn是在给定时间步的状态向量的情况下,在下一个时间步计算粒子(状态假设)的函数。MeasurementLikelihoodFcn是一个基于传感器测量计算每个粒子的可能性的函数。

创建对象后,使用初始化命令以已知的均值和协方差初始化粒子或在定义范围内均匀分布的粒子。然后,使用正确的而且预测使用传感器测量更新粒子(以及状态估计)的命令。

输入参数

全部展开

状态转移函数,指定为函数句柄,确定粒子(状态假设)在时间步长之间的转移。的属性particleFilter对象。有关更多信息,请参见属性

测量似然函数,指定为函数句柄,用于从传感器测量中计算粒子(状态假设)的似然。的属性particleFilter对象。有关更多信息,请参见属性

属性

全部展开

状态变量的个数,指定为标量。此属性是只读的,并且是使用设置的初始化.状态数是隐式的,基于粒子初始均值或状态边界的指定矩阵。

过滤器中使用的粒子数,指定为标量。每个粒子代表一个状态假设。只能通过使用指定此属性初始化

状态转移函数,指定为函数句柄,确定粒子(状态假设)在时间步长之间的转移。这个函数计算下一个时间步的粒子,包括过程噪声,给定一个时间步的粒子。

相比较而言,状态转移函数为extendedKalmanFilter而且unscentedKalmanFilter在给定的时间步长生成单个状态估计。

为非线性系统编写并保存状态转换函数,并将其指定为函数句柄particleFilter对象。例如,如果vdpParticleFilterStateFcn.m状态转换函数,是指定的吗StateTransitionFcn作为@vdpParticleFilterStateFcn.你也可以指定StateTransitionFcn作为匿名函数的函数句柄。

函数签名如下:

函数predictedParticles = myStateTransitionFcn(previousParticles,varargin)

StateTransitionFcn函数接受至少一个输入参数。第一个参数是粒子集previousParticles这代表了前一个时间步的状态假设。可选的使用变长度输入宗量在函数中,您可以输入与预测下一个状态相关的任何额外参数,使用预测,详情如下:

预测(pf、__arg1最长)

如果StateOrientation“列”是吗previousParticles是一个NumStateVariables——- - - - - -NumParticles数组中。如果StateOrientation那么'row'是吗previousParticles是一个NumParticles——- - - - - -NumStateVariables数组中。

StateTransitionFcn必须返回一个输出,predictedParticles,是当前时间步长的预测粒子位置集(与previousParticles).

StateTransitionFcn必须将随机过程噪声(来自适合您的应用程序的任何分布)包含在predictedParticles

的状态转换函数的示例StateOrientation属性设置为'column',类型编辑vdpParticleFilterStateFcn在命令行。

测量似然函数,指定为函数句柄,用于计算使用传感器测量的粒子(状态假设)的似然。对于每个状态假设(粒子),函数首先计算一个n元素测量假设向量。然后根据传感器测量值和测量噪声概率分布计算各测量假设的似然值。

相比之下,测量函数为extendedKalmanFilter而且unscentedKalmanFilter接受一个状态假设并返回一个测量估计值。

您根据测量模型编写并保存测量似然函数,并使用它来构造对象。例如,如果vdpMeasurementLikelihoodFcn.m测量似然函数,指定吗MeasurementLikelihoodFcn作为@vdpMeasurementLikelihoodFcn.你也可以指定MeasurementLikelihoodFcn作为匿名函数的函数句柄。

函数签名如下:

函数似然= mymeasurementlikehoodfcn (predictedParticles,measurement,varargin)

MeasurementLikelihoodFcn函数接受至少两个输入参数。第一个参数是粒子集predictedParticles这代表了预测态假设。如果StateOrientation“列”是吗predictedParticles是一个NumStateVariables——- - - - - -NumParticles数组中。如果StateOrientation那么'row'是吗predictedParticles是一个NumParticles——- - - - - -NumStateVariables数组中。第二个论点,测量,为n元传感器在当前时间步长的测量值。可以使用提供额外的输入参数变长度输入宗量

MeasurementLikelihoodFcn必须返回一个输出,可能性的向量。NumParticles长度,也就是给定的概率测量对于每个粒子(状态假设)。

要查看测量似然函数的示例,请键入编辑vdpMeasurementLikelihoodFcn在命令行。

状态变量是否具有作为逻辑数组指定的循环分布。

这是一个只读属性,使用初始化

圆形(或角)分布使用范围为的概率密度函数(π-π,)IsStateVariableCircular行向量是NumStateVariables元素。每个向量元素表示相关的状态变量是否是圆形的。

策略设置,确定何时触发重新采样,指定为particleResamplingPolicy对象。

粒子的重采样是利用粒子滤波器估计粒子状态的重要步骤。它允许您基于当前状态选择粒子,而不是使用初始化时给出的粒子分布。通过不断地对当前估计值周围的粒子进行重新采样,您可以获得更准确的跟踪并提高长期性能。

您可以根据有效粒子的数量以固定的间隔或动态的方式触发重新采样。最小有效粒子比是衡量当前粒子集逼近后验分布的程度。有效粒子数计算公式为:

N e f f 1 1 N w 2

在这个方程中,N是粒子数,和w是每个粒子的归一化权重。有效粒子比为Neff/NumParticles.因此,有效粒子比是所有粒子权重的函数。在粒子的权重达到足够低的值后,它们对状态估计没有贡献。这个低值触发重采样,因此粒子更接近当前状态估计并具有更高的权重。

属性的以下属性particleResamplingPolicy对象可以修改以控制何时触发重采样:

财产 价值 类型 描述

TriggerMethod

“比”(默认)

“间隔”

特征向量

它是一种根据所选值确定何时进行重采样的方法。的“间隔”值触发在粒子滤波操作的规则时间步重采样。的“比”值触发基于有效总粒子的比率重新采样。

SamplingInterval

1(默认)

标量

重新采样之间的固定间隔,指定为标量。这个间隔决定了在哪些修正步骤中执行重采样。例如,值为2表示每隔一个修正步骤执行一次重新采样。值为意味着永远不会执行重新采样。

属性仅适用于TriggerMethod设置为“间隔”

MinEffectiveParticleRatio

0.5(默认)

标量

它是有效粒子数与总粒子数的最小期望比率NumParticles.有效粒子数是衡量当前粒子集逼近后验分布的程度。较低的有效粒子比意味着较低数量的粒子有助于估计,需要重新采样。

有效粒子数与总粒子数之比NumParticles低于MinEffectiveParticleRatio,触发重采样步骤。

用于粒子重采样的方法,指定为以下之一:

  • 多项式的-生成多项重抽样,也称为简化随机抽样N在开区间内独立于均匀分布的随机数(0,1)并用它们来选择与它们的重量成比例的粒子。

  • “残留”-残余重采样分为两个阶段。第一阶段是对每个权重大于的粒子进行确定性复制1 / N.第二阶段包括使用权重的剩余部分(标记为残差)进行随机抽样。

  • “分层”分层重采样将整个粒子种群划分为称为地层的子集。它预先划分(0,1)时间间隔为N大小不相交的子区间1 / N.在每个子层段和地层中选择的样本指数中分别绘制随机数。

  • “系统”-系统重采样类似于分层重采样,因为它也使用地层。一个区别是它只从开区间中抽取一个随机数(0, 1 / N)其余的样本点是在一个固定的确定性计算1 / N步长。

从粒子中提取状态估计的方法,指定为下列之一:

  • “的意思是”-对象根据属性输出粒子的加权平均值权重而且粒子据国家估计。

  • “maxweight”-对象输出权值最高的粒子作为状态估计。

粒子值的数组,指定为基于StateOrientation属性:

  • 如果StateOrientation“行”然后粒子是一个NumParticles——- - - - - -NumStateVariables数组中。

  • 如果StateOrientation“列”然后粒子是一个NumStateVariables——- - - - - -NumParticles数组中。

每一行或每一列对应一个状态假设(单个粒子)。

粒子权重,定义为基于矢量的值StateOrientation属性:

  • 如果StateOrientation“行”然后权重是一个NumParticles-by-1向量,其中每个权重都与元素中同一行中的粒子相关粒子财产。

  • 如果StateOrientation“列”然后权重是1 × -吗NumParticles向量,其中每个权重与粒子在同一列中的粒子财产。

当前状态估计,定义为基于值的向量StateOrientation属性:

  • 如果StateOrientation“行”然后状态是1 × -吗NumStateVariables向量

  • 如果StateOrientation“列”然后状态是一个NumStateVariables1的向量

状态是只读属性,派生自粒子基于StateEstimationMethod财产。指StateEstimationMethod的值的详细信息状态是确定的。

状态随着StateCovariance也可以用getStateEstimate

当前估计状态估计误差协方差,定义为NumStateVariables——- - - - - -NumStateVariables数组中。StateCovariance属性为只读属性,并根据StateEstimationMethod.如果指定的状态估计方法不支持协方差,则函数返回金宝appStateCovarianceAs[]。

StateCovariance而且状态可以一起用确定吗getStateEstimate

对象的功能

初始化 初始化粒子过滤器的状态
预测 利用扩展卡尔曼滤波或无气味卡尔曼滤波或粒子滤波预测下一时刻的状态和状态估计误差协方差
正确的 使用扩展或无气味卡尔曼滤波或粒子滤波和测量纠正状态和状态估计误差协方差
getStateEstimate 从粒子中提取最佳状态估计和协方差
克隆 复制在线状态估计对象

例子

全部折叠

要创建用于估计系统状态的粒子过滤器对象,请为系统创建适当的状态转换函数和测量似然函数。

在这个例子中,函数vdpParticleFilterStateFcn描述了具有非线性参数mu = 1的范德波尔振子的离散时间近似。此外,还对高斯过程噪声进行了建模。vdpMeasurementLikelihood函数从第一个状态的噪声测量中计算粒子的可能性,假设测量噪声分布为高斯分布。

创建粒子过滤器对象。使用函数句柄为对象提供状态转换和测量似然函数。

myPF = particleFilter(@vdpParticleFilterStateFcn,@ vdpmeasurementlikehoodfcn);

若要初始化和估计构造对象的状态和状态估计误差协方差,请使用初始化预测,正确的命令。

The MathWorks, Inc.版权所有

加载范德波尔ODE数据,并指定采样时间。

vdpODEdata.mat包含了具有初始条件的非线性参数mu=1的van der Pol ODE的模拟,使用ode45(2, 0).真实状态随采样时间的变化而变化Dt = 0.05

目录(fullfile (matlabroot,“例子”“控制”“主要”))添加示例数据负载(“vdpODEdata.mat”“xTrue”“dt”) tSpan = 0:dt:5;

测量尺寸。对于本例,传感器测量带有标准偏差的高斯噪声的第一个状态0.04

sqrtR = 0.04;yMeas = xTrue(:,1) + sqrtR*randn(nummel (tSpan),1);

创建一个粒子滤波器,并设置状态转换和测量似然函数。

myPF = particleFilter(@vdpParticleFilterStateFcn,@ vdpmeasurementlikehoodfcn);

初始化粒子过滤器状态[2;0]用单位协方差,和使用1000粒子。

初始化(myPF, 1000,(2, 0),眼(2));

选择的意思是状态估计和系统的重采样方法。

myPF。StateEstimationMethod =“的意思是”;myPF。ResamplingMethod =“系统”

估计状态使用正确的而且预测命令,并存储估计的状态。

xEst = 0 (size(xTrue));k=1:size(xTrue,1) xEst(k,:) =正确的(myPF,yMeas(k));预测(myPF);结束

绘制结果,并比较估计状态和真实状态。

图(1)情节(xTrue (: 1), xTrue (:, 2),“x”x (: 1) x (:, 2),“罗”)传说(“真正的”“估计”

图中包含一个轴对象。axis对象包含2个line类型的对象。这些对象表示True、Estimated。

rmpath (fullfile (matlabroot,“例子”“控制”“主要”))删除示例数据

参考文献

[1]李涛,博利克,下午Djuric,“粒子滤波的重采样方法:分类、实现和策略”,IEEE信号处理杂志,第32卷,no。3,第70-86页,2015年5月。

扩展功能

在R2017b中引入