主要内容

particleFilter

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

描述

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

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

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

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

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

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

  1. 属性初始化粒子初始化命令。

  2. 在下一个步骤中使用预测命令。

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

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

创建

对象描述

例子

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

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

输入参数

全部展开

状态转移函数,指定为一个函数句柄,决定了粒子在时间步之间的转移(状态假设)。也是一种性质particleFilter对象。有关更多信息,请参见属性

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

属性

全部展开

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

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

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

相反的,状态转移函数extendedKalmanFilterunscentedKalmanFilter在给定的时间步长生成单个状态估计。

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

函数签名如下:

函数predictedParticles = myStateTransitionFcn(previousParticles,varargin)

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

预测(pf、__arg1最长)

如果StateOrientation“列”呢previousParticles是一个NumStateVariables——- - - - - -NumParticles数组中。如果StateOrientation“行”呢previousParticles是一个NumParticles——- - - - - -NumStateVariables数组中。

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

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

来看看状态转移函数的例子StateOrientation属性设置为“列”,键入编辑vdpParticleFilterStateFcn在命令行。

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

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

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

函数签名如下:

function likelihood = mymeasurementlikelihood dfcn (predictedParticles,measurement,varargin)

MeasurementLikelihoodFcn函数接受至少两个输入参数。第一个参数是粒子的集合predictedParticles这代表了预测状态假说。如果StateOrientation“列”呢predictedParticles是一个NumStateVariables——- - - - - -NumParticles数组中。如果StateOrientation“行”呢predictedParticles是一个NumParticles——- - - - - -NumStateVariables数组中。第二个参数,测量,为n元传感器在当前时间步长的测量值。您可以使用变长度输入宗量

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

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

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

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

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

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

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

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

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

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

财产 价值 类型 描述

TriggerMethod

“比”(默认)

“间隔”

特征向量

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

SamplingInterval

1(默认)

标量

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

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

MinEffectiveParticleRatio

0.5(默认)

标量

它是有效粒子数与总粒子数的最小期望比率NumParticles.粒子的有效数量是当前粒子集合近似后验分布的程度的度量。较低的有效粒子比意味着参与估计和重采样的粒子数较低。

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

用于粒子重采样的方法,具体如下:

  • 多项式的

  • “残留”

  • “分层”

  • “系统”

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

  • “的意思是”-对象根据属性输出粒子的加权平均值权重粒子,就像州政府估计的那样。

  • “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.如果指定不支持协方差的状态估计方法,则函数返回万博1manbetxStateCovariance[]。

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

对象的功能

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

例子

全部折叠

要创建一个粒子滤波对象来估计系统的状态,请为系统创建适当的状态转移函数和测量可能性函数。

在本例中,函数vdpParticleFilterStateFcn描述了非线性参数为1的范德堡尔振荡器的离散时间近似。此外,它还模拟了高斯过程噪声。vdpMeasurementLikelihood函数从第一个状态的噪声测量中计算粒子的可能性,假设是高斯测量噪声分布。

创建粒子过滤器对象。使用函数句柄为对象提供状态转换和度量可能性函数。

myPF = particleFilter (@vdpParticleFilterStateFcn @vdpMeasurementLikelihoodFcn);

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

The MathWorks, Inc.版权所有

加载van der Pol 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(numel(tSpan),1); / /输出

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

myPF = particleFilter (@vdpParticleFilterStateFcn @vdpMeasurementLikelihoodFcn);

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

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

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

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

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

x = 0(大小(xTrue));k=1:size(xTrue,1) xEst(k,:) = correct(myPF,yMeas(k));预测(myPF);结束

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

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

图中包含一个坐标轴。轴线包含2个线型对象。这些对象表示True, Estimated。

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

扩展功能

介绍了R2017b