主要内容

本页采用了机器翻译。点击此处可查看英文原文。

unscentedKalmanFilter

创建无迹卡尔曼滤波器对象,用于在线状态估计

说明

unscentedKalmanFilter 利用离散时间无迹卡尔曼滤波算法,为离散时间非线性系统的在线状态估计创建了一个对象。

进行在线状态估计时,首先需要创建非线性状态转移函数 f 和测量函数 h。然后,您可以使用这些非线性函数构造 unscentedKalmanFilter 对象,并指定噪声项是加性的还是非加性的。

创建对象后,使用 predict 命令预测下一个时间步的状态估计值,并使用 correct 命令结合无迹卡尔曼滤波算法和实时数据对状态估计值进行校正。有关该算法的信息,请参阅算法

创建对象

描述

obj = unscentedKalmanFilter(stateTransitionFcn,measurementFcn,initialState) 创建了一个无迹卡尔曼滤波器对象,用于对离散时间非线性系统进行在线状态估计。

  • stateTransitionFcn 是一个函数,它根据时间 k-1 时的状态向量,计算时间 k 时的系统状态。该函数存储在对象的 StateTransitionFcn 属性中。

  • measurementFcn 是一个函数,它根据时间 k 时的状态,计算系统在时间 k 时的输出测量值。该函数存储在对象的 MeasurementFcn 属性中。

  • initialState 指定状态估计值的初始值。该值存储在对象的 State 属性中。

创建对象后,使用 correctpredict 函数,基于离散时间无迹卡尔曼滤波算法和实时数据,更新状态估计值和状态估计误差协方差值。

  • predict 使用时间步长 k –1 时的状态值,将 obj.Stateobj.StateCovariance 更新为时间步长 k 时的预测值。

  • correct 使用时间步 k 的测量数据,将 obj.Stateobj.StateCovariance 更新为时间步 k 的估计值。

示例

obj = unscentedKalmanFilter(___,PropertyName=Value) 还会使用名称-值参量来设置属性。如果在创建时未指定状态转移函数、测量函数和初始状态值,请使用点表示法进行指定。例如,对于初始状态值为 [1;0] 的两态系统,若要在创建后指定这些值,请使用 obj.State = [1;0]

示例

属性

全部展开

unscentedKalmanFilter 对象的属性分为两种类型:

  • 可调属性,您可以多次指定这些属性,既可以在对象构造时使用 Name,Value 参量进行指定,也可以在后续的状态估计过程中随时指定。创建对象后,请使用点表示法来修改可调属性。

    obj = unscentedKalmanFilter(StateTransitionFcn,MeasurementFcn,InitialState);
    obj.ProcessNoise = 0.01;

    可调属性包括 StateStateCovarianceStateTransitionFcnMeasurementFcnProcessNoiseMeasurementNoiseAlphaBetaKappa

  • 在对象构造过程中必须指定的不可调整属性。HasAdditiveProcessNoiseHasAdditiveMeasurementNoise 属性属于这一类别。

均值周围的西格玛点分布范围,指定为 0 到 1 之间的标量值 (0 < Alpha <= 1)。

无迹卡尔曼滤波算法将系统的状态视为一个均值为 State、方差为 StateCovariance 的随机变量。为了计算下一个时间步长时的状态及其统计属性,该算法首先利用无迹变换生成一组围绕均值 State 分布的状态值。这些生成的状态值被称为西格玛点。该算法将每个σ点作为状态转移函数和测量函数的输入,从而获得一组新的变换后的状态点和测量值。变换后的点用于计算下一时间步的状态及状态估计误差协方差值。

西格玛点围绕均值值的分布范围由两个参数 AlphaKappa 控制。第三个参数 Beta 会影响在状态和测量协方差计算过程中,变换后点的权重:

  • Alpha - 确定西格玛点在均值值周围的分布范围。它通常是一个较小的正值。西格玛点的分布与 Alpha 成正比。值越小,表示西格玛点越接近均值状态。

  • Kappa - 第二个缩放参数,通常设置为 0。值越小,表示西格玛点越接近均值状态。该散布与 Kappa 的平方根成正比。

  • Beta - 纳入了关于该状态分布的先验知识。对于高斯分布,Beta = 2 是最佳值。

如果已知状态和状态协方差的分布,就可以调整这些参数,以捕捉该分布的高阶矩的变换。该算法只能追踪状态概率分布中的单一峰值。如果系统的状态分布中存在多个峰值,您可以调整这些参数,使西格玛点集中在单个峰值附近。例如,选择一个较小的 Alpha 值,以生成接近均值状态的西格玛点。

有关详细信息,请参阅Unscented Kalman Filter Algorithm

Alpha 是一个可调属性。您可以使用点表示法来修改它。

用于调整变换后西格玛点的权重的状态分布的表征,指定为一个大于或等于 0 的标量值。对于高斯分布,Beta = 2 是一个最优选择。

有关详细信息,请参阅 Alpha 属性的说明。

Beta 是一个可调属性。您可以使用点表示法来修改它。

测量噪声特性,指定为以下值之一:

  • true - 测量噪声 v 是可加的。在 MeasurementFcn 中指定的测量函数 h 具有以下形式:

    y(k) = h(x(k),Um1,...,Umn)

    其中 y(k)x(k) 分别是时间点 k 处的估计输出和估计状态,而 Um1,...,Umn 是测量函数所需的任何可选参量。

  • false - 测量噪声具有非加性。测量函数规定了输出测量值如何随状态 测量噪声的变化而变化:

    y(k) = h(x(k),v(k),Um1,...,Umn)

HasAdditiveMeasurementNoise 是一个不可调整的属性,且只能在对象构造时进行指定。您无法使用点表示法来更改它。

过程噪声特性,指定为以下值之一:

  • true - 过程噪声 w 具有累加性。在 StateTransitionFcn 中指定的状态转移函数 f 具有以下形式:

    x(k) = f(x(k-1),Us1,...,Usn)

    其中 x(k) 是时间点 k 处的估计状态,Us1,...,Usn 是状态转移函数所需的任何其他参量。

  • false - 过程噪声具有非加性。状态转移函数规定了状态如何作为当前状态 上一个时间步长过程噪声的函数而演变:

    x(k) = f(x(k-1),w(k-1),Us1,...,Usn)

HasAdditiveProcessNoise 是一个不可调整的属性,且只能在对象构造时进行指定。您无法使用点表示法来更改它。

均值状态周围的西格玛点分布范围,指定为 0 到 3 之间的标量值(0Kappa3)。Kappa 通常指定为 0。值越小,表示西格玛点越接近均值状态。该散布与 Kappa 的平方根成正比。有关详细信息,请参阅 Alpha 属性的说明。

Kappa 是一个可调属性。您可以使用点表示法来修改它。

测量函数 h,指定为函数句柄。该函数根据时间步长 k 时的状态向量,计算非线性系统在时间步长 k 时的 N-元素输出测量向量。N 是该系统的测量数量。编写并保存测量函数,然后使用该函数来构建对象。例如,如果 vdpMeasurementFcn.m 是测量函数,则将 MeasurementFcn 指定为 @vdpMeasurementFcn。您还可以将 MeasurementFcn 指定为一个匿名函数的函数句柄。

该函数的输入取决于您在对象的 HasAdditiveMeasurementNoise 属性中将测量噪声指定为加性还是非加性:

  • HasAdditiveMeasurementNoise 为真 - 测量噪声 v 是加性的,而测量函数规定了测量值如何作为状态值的函数而演变:

    y(k) = h(x(k),Um1,...,Umn)

    其中 y(k)x(k) 分别是时间点 k 处的估计输出和估计状态,而 Um1,...,Umn 是测量函数所需的任何可选参量。例如,如果您使用多个传感器来追踪一个物体,传感器位置可以作为一个额外的输入。在估计过程中,您将这些附加参量传递给 correct 命令,该命令随后会将其传递给测量函数。

  • HasAdditiveMeasurementNoise 为 false - 测量噪声是非加性的,且测量函数还规定了输出测量值如何随测量噪声的变化而变化:

    y(k) = h(x(k),v(k),Um1,...,Umn)

当启用了 HasMeasurementWrapping 属性时,测量函数的输出还必须包含绕回边界,该边界以 N×2 矩阵的形式指定,其中第一列表示最小测量边界,第二列表示最大测量边界。N 是该系统的测量次数。

要查看带有加性过程噪声的测量函数示例,请在命令行中输入 edit vdpMeasurementFcn。要查看包含非加性过程噪声的测量函数示例,请输入 edit vdpMeasurementNonAdditiveNoiseFcn

MeasurementFcn 是一个可调属性。在使用 correctpredict 命令后,您可以使用点表示法进行修改。

测量噪声协方差,根据 HasAdditiveMeasurementNoise 属性的值,指定为标量或矩阵:

  • HasAdditiveMeasurementNoise 为真 - 将协方差指定为标量或一个 N×N 的矩阵,其中 N 是该系统的测量次数。如果测量噪声项之间不存在互相关,且所有项的方差均相等,则指定一个标量。软件使用该标量值来创建一个 N×N 的对角矩阵。

  • HasAdditiveMeasurementNoise 为假 - 请将协方差指定为一个 VV 列的矩阵,其中 V 表示测量噪声项的数量。在使用 correct 之前,必须先指定 MeasurementNoise。首次将 MeasurementNoise 指定为矩阵后,若要将其更改为 MeasurementNoise,也可以将其指定为标量。如果测量噪声项之间不存在互相关,且所有项的方差均相等,则将其指定为标量。该软件将标量扩展为一个 V 行、V 列的对角矩阵,其中对角线上为该标量。

MeasurementNoise 是一个可调属性。您可以使用点表示法来修改它。

过程噪声协方差,根据 HasAdditiveProcessNoise 属性的值,指定为标量或矩阵:

  • HasAdditiveProcessNoise 为真 - 将协方差指定为标量或一个 Ns×Ns 的矩阵,其中 Ns 是系统的状态数。如果过程噪声项之间不存在互相关,且所有项的方差均相等,则指定一个标量。软件使用该标量值来创建一个 Ns×Ns 的对角矩阵。

  • HasAdditiveProcessNoise 为假 - 请将协方差指定为一个 WW 列的矩阵,其中 W 表示过程噪声项的数量。在使用 predict 之前,必须先指定 ProcessNoise。首次将 ProcessNoise 指定为矩阵后,若要将其更改为 ProcessNoise,也可以将其指定为标量。如果过程噪声项之间不存在互相关,且所有项的方差均相等,则将其指定为标量。该软件将标量扩展为一个 W 行、W 列的对角矩阵。

ProcessNoise 是一个可调属性。您可以使用点表示法来修改它。

非线性系统的状态,指定为一个大小为 Ns 的向量,其中 Ns 是系统的状态数。

当您使用 predict 命令时,系统会使用时间步 k –1 时的状态值,将 State 更新为时间步 k 时的预测值。当您使用 correct 命令时,系统会利用时间步 k 的测量数据,将 State 更新为时间步 k 时的估计值。

State 的初始值即为在创建对象时于 InitialState 参量中指定的值。如果将 InitialState 指定为列向量,则 State 也是列向量,且 predictcorrect 命令会返回以列向量形式表示的状态估计值。否则,将返回一个行向量。如果需要一个使用单精度浮点变量的过滤器,则必须在对象构造时,通过 InitialState 参量将 State 指定为单精度变量。

State 是一个可调属性。您可以使用点表示法来修改它。

状态估计误差协方差,指定为标量或一个 NsNs 列的矩阵,其中 Ns 是系统的状态数。如果指定一个标量,软件将使用该标量值创建一个 Ns×Ns 的对角矩阵。

当您对在 InitialState 参量中指定的初始状态值没有把握时,请为协方差指定一个较大的值。

当您使用 predict 命令时,系统会使用时间步 k –1 时的状态值,将 StateCovariance 更新为时间步 k 时的预测值。当您使用 correct 命令时,系统会利用时间步 k 的测量数据,将 StateCovariance 更新为时间步 k 时的估计值。

StateCovariance 是一个可调属性。在使用 correctpredict 命令后,您可以使用点表示法进行修改。

状态转移函数 f,指定为函数句柄。该函数根据时间步长 k-1 时的状态向量,计算系统在时间步长 k 时的 Ns-元素状态向量。Ns 是非线性系统的状态数。

您编写并保存非线性系统的状态转移函数,并利用它来构建该对象。例如,如果 vdpStateFcn.m 是状态转移函数,则将 StateTransitionFcn 指定为 @vdpStateFcn。您还可以将 StateTransitionFcn 指定为一个匿名函数的函数句柄。

您编写的函数的输入取决于您在对象的 HasAdditiveProcessNoise 属性中将过程噪声指定为加性还是非加性:

  • HasAdditiveProcessNoise 成立 - 过程噪声 w 是加性的,状态转移函数规定了状态如何作为前一时间步状态值的函数而演化:

    x(k) = f(x(k-1),Us1,...,Usn)

    其中 x(k) 是时间 k 时的估计状态,Us1,...,Usn 是状态转移函数所需的任何其他参量,例如系统输入或采样时间。在估计过程中,您将这些附加参量传递给 predict 命令,该命令随后会将其传递给状态转移函数。

  • HasAdditiveProcessNoise 为假 - 过程噪声是非加性的,且状态转移函数还规定了状态如何作为过程噪声的函数而演化:

    x(k) = f(x(k-1),w(k-1),Us1,...,Usn)

要查看带有加性过程噪声的状态转移函数示例,请在命令行中输入 edit vdpStateFcn

StateTransitionFcn 是一个可调属性。在使用 correctpredict 命令后,您可以使用点表示法进行修改。

启用测量值绕回,指定为 01。当您遇到与模型状态无关的循环测量值时,可以启用测量值绕回功能来估计状态。如果选择此参数,则您指定的测量函数必须包含以下两个输出:

  1. 该测量值被指定为非线性系统在时间步长 N 时的 k 元素输出测量向量,其中给定时间步长 k 时的状态向量。N 是该系统的测量次数。

  2. 测量值绕回边界,指定为一个 N × 2 的矩阵,其中第一列表示最小测量边界,第二列表示最大测量边界。

启用 HasMeasurementWrapping 属性可将测量残差限制在预定义的范围内,这有助于防止滤波器因测量残差值不正确而发散。有关示例,请参阅基于扩展卡尔曼滤波器的绕回测量值状态估计

HasMeasurementWrapping 是一个不可调属性。您可以在对象构造过程中指定一次。创建状态估计对象后,无法对其进行修改。

对象函数

correctCorrect state and state estimation error covariance using extended or unscented Kalman filter, or particle filter and measurements
predictPredict state and state estimation error covariance at next time step using extended or unscented Kalman filter, or particle filter
residualReturn measurement residual and residual covariance when using extended or unscented Kalman filter
clone复制在线状态估计对象

示例

全部折叠

要定义一个用于估计系统状态的无迹卡尔曼滤波器对象,需编写并保存该系统的状态转移函数和测量函数。

在此示例中,请使用之前编写并保存的状态转移函数和测量函数 vdpStateFcn.mvdpMeasurementFcn.m。这些函数描述了范德波尔振荡器的离散逼近,其中非线性参数 μ 等于 1。振荡器有两种状态。

为这两个状态指定一个初始猜测值。应将初始状态估计值指定为一个包含 M 个元素的行向量或列向量,其中 M 表示状态的数量。

initialStateGuess = [1;0];

创建无迹卡尔曼滤波器对象。使用函数句柄向对象提供状态转移和测量函数。

obj = unscentedKalmanFilter(@vdpStateFcn,@vdpMeasurementFcn,initialStateGuess);

该对象具有一种默认结构,其中过程噪声与测量噪声是叠加的。

要根据构建的对象估计状态及状态估计误差协方差,请使用 correctpredict 命令以及实时数据。

为一个具有两个状态和一个输出的范德波尔振荡器创建一个无迹卡尔曼滤波器对象。使用之前编写并保存的状态转移和测量函数 vdpStateFcn.mvdpMeasurementFcn.m。这些函数是针对加性过程和测量噪声项而推导的。将这两个状态的初始值指定为 [2;0]。

由于系统有两个状态,且过程噪声具有加性,因此过程噪声是一个 2 元素向量,过程噪声协方差矩阵是一个 2×2 矩阵。假设过程噪声项之间不存在互相关,且这两个项的方差均为 0.01。您可以将过程噪声协方差指定为一个标量。该软件使用该标量值创建一个 2×2 对角矩阵,其对角线元素均为 0.01。

在对象构建过程中指定过程噪声协方差。

obj = unscentedKalmanFilter(@vdpStateFcn,@vdpMeasurementFcn,[2;0],...
    'ProcessNoise',0.01);

此外,您还可以在对象构建完成后,使用点表示法指定噪声协方差。例如,将测量噪声协方差指定为 0.2。

obj.MeasurementNoise = 0.2;

由于该系统只有一个输出,因此测量噪声是一个 1 元素向量,而 MeasurementNoise 属性表示测量噪声的方差。

为一个具有两个状态和一个输出的范德波尔振荡器创建一个无迹卡尔曼滤波器对象。假设状态转移函数中的过程噪声项是可加的。也就是说,状态噪声与过程噪声之间存在线性关系。此外,假设测量噪声项是非加性的。也就是说,测量值与测量噪声之间存在非线性关系。

obj = unscentedKalmanFilter('HasAdditiveMeasurementNoise',false);

指定状态转移函数和测量函数。使用之前编写并保存的函数 vdpStateFcn.mvdpMeasurementNonAdditiveNoiseFcn.m

状态转移函数是在假设过程噪声为加性噪声的前提下推导的。该测量函数是在假设测量噪声为非加性噪声的情况下推导出来的。

obj.StateTransitionFcn = @vdpStateFcn;
obj.MeasurementFcn = @vdpMeasurementNonAdditiveNoiseFcn;

将这两个状态的初始值指定为 [2;0]。

obj.State = [2;0];

现在,您可以使用 correctpredict 命令,根据已构建的对象来估计状态和状态估计误差协方差值。

考虑一个输入为 u 的非线性系统,其状态 x 和测量值 y 分别按照以下状态转移方程和测量方程演化:

x[k]=x[k-1]+u[k-1]+w[k-1]

y[k]=x[k]+2*u[k]+v[k]2

该系统的过程噪声 w 具有加性,而测量噪声 v 则不具有加性。

为该系统创建状态转移函数和测量函数。请使用附加输入 u 来指定函数。

f = @(x,u)(sqrt(x+u));
h = @(x,v,u)(x+2*u+v^2);

fh 分别是存储状态转移函数和测量函数的匿名函数的句柄。在测量函数中,由于测量噪声是非加性的,因此还将 v 指定为输入。请注意,v 被指定为在额外输入 u 之前的输入。

创建一个无迹卡尔曼滤波器对象,用于利用指定的函数估计非线性系统的状态。将状态的初始值设为 1,并将测量噪声设为非加性。

obj = unscentedKalmanFilter(f,h,1,'HasAdditiveMeasurementNoise',false);

指定测量噪声的协方差矩阵。

obj.MeasurementNoise = 0.01;

现在,您可以使用 predictcorrect 命令对系统的状态进行估计。您将 u 的值传递给 predictcorrect,它们则分别将这些值传递给状态转移函数和测量函数。

在时间步 k 处,利用测量值 y[k]=0.8 和输入 u[k]=0.2 对状态估计进行修正。

correct(obj,0.8,0.2)

给定 u[k]=0.2,预测下一个时间步的状态。

predict(obj,0.2)

算法

离散时间无迹卡尔曼滤波算法可对离散时间非线性系统进行在线状态估计。

考虑一个具有状态 x、输入 u、输出 y、过程噪声 w 和测量噪声 v 的系统。假设可以将该装置表示为一个非线性系统。

该算法使用您指定的状态转移函数和测量函数,计算非线性系统的状态估计值 x^。该软件允许您将这些函数中的噪声指定为加性或非加性:

  • 加性噪声项 - 状态转移方程和测量方程的形式如下:

    x[k]=f(x[k1],us[k1])+w[k1]y[k]=h(x[k],um[k])+v[k]

    这里,f 是一个非线性状态转移函数,用于描述状态 x 从一个时间步到下一个时间步的演化过程。非线性测量函数 hx 与时间步 k 处的测量值 y 相关联。wv 分别是均值为零、互不相关的过程噪声和测量噪声。这些函数还可以有额外的参量,在方程中分别用 usum 表示。例如,这些附加参量可以是时间步长 k 或非线性系统的输入 u。此类参量可以有多个。

    请注意,这两个方程中的噪声项都是可加的。也就是说,x(k) 与过程噪声 w(k-1) 呈线性关系,而 y(k) 与测量噪声 v(k) 呈线性关系。

  • 非加性噪声项 - 该软件还支持更复杂的状态转移和测量函数,其中状态 x[k] 和测量 y[k] 分别是过程噪声和测量噪声的非线性函数。当噪声项具有非加性性质时,状态转移方程和测量方程具有以下形式:

    x[k]=f(x[k1],w[k1],us[k1])y[k]=h(x[k],v[k],um[k])

进行在线状态估计时,首先需要创建非线性状态转移函数 f 和测量函数 h。然后,您可以使用这些非线性函数构造 unscentedKalmanFilter 对象,并指定噪声项是加性的还是非加性的。

创建对象后,使用 predict 命令预测下一个时间步的状态估计值,并使用 correct 命令结合无迹卡尔曼滤波算法和实时数据对状态估计值进行校正。有关该算法的详细信息,请参阅Extended and Unscented Kalman Filter Algorithms for Online State Estimation

扩展功能

全部展开

版本历史记录

在 R2016b 中推出

全部展开