主要内容

unscentedKalmanFilter

创建无气味卡尔曼滤波对象用于在线状态估计

描述

例子

obj= unscentedKalmanFilter (StateTransitionFcnMeasurementFcnInitialState为离散非线性系统的在线状态估计创建了一个无味卡尔曼滤波对象。StateTransitionFcn函数是计算系统时刻状态的函数吗k,给定时刻的状态向量k1。MeasurementFcn是一个函数,计算输出测量系统的时间k,给定当时的状态kInitialState指定状态估计的初始值。

创建对象后,使用正确的而且预测命令更新状态估计和状态估计误差协方差值使用离散时间无味卡尔曼滤波算法和实时数据。

例子

obj= unscentedKalmanFilter (StateTransitionFcnMeasurementFcnInitialState名称,值使用一个或多个指定无气味卡尔曼过滤器对象的其他属性名称,值对参数。

obj= unscentedKalmanFilter (StateTransitionFcnMeasurementFcn使用指定的状态转换和测量函数创建无气味卡尔曼滤波对象。在使用预测而且正确的命令时,使用点表示法指定初始状态值。例如,对于具有初始状态值的双状态系统(1, 0),指定obj。状态= [1;0]

obj= unscentedKalmanFilter (StateTransitionFcnMeasurementFcn名称,值使用一个或多个指定无气味卡尔曼过滤器对象的其他属性名称,值对参数。在使用预测而且正确的命令,使用指定初始状态值名称,值对参数或点表示法。

例子

obj= unscentedKalmanFilter (名称,值创建一个无气味卡尔曼过滤器对象,其属性使用一个或多个指定名称,值对参数。在使用预测而且正确的命令,使用指定状态转换函数、测量函数和初始状态值名称,值对参数或点表示法。

对象描述

unscentedKalmanFilter使用离散无味卡尔曼滤波算法为离散非线性系统的在线状态估计创建一个对象。

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

该算法计算状态估计<年代pan class="inlineequation"> x 利用你指定的状态转换和测量函数的非线性系统。该软件允许您指定这些函数中的噪声为加性或非加性:

  • 附加噪声术语-状态转换和测量方程有如下形式:

    x k f x k 1 u 年代 k 1 + w k 1 y k h x k u k + v k

    在这里f是描述状态演化的非线性状态转移函数吗x从一个时间步骤到下一个。非线性测量函数h有关x到测量y时间步长kw而且v分别为零均值、不相关过程噪声和测量噪声。这些函数还可以有附加的输入参数,用u<年代ub>年代而且u<年代ub>米在方程中。例如,附加参数可以是时间步长k或者输入u对非线性系统。可以有多个这样的参数。

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

  • 非加性噪声项该软件还支持更复杂的状态转换和测量功能金宝appxk]和测量yk]分别是过程噪声和测量噪声的非线性函数。当噪声项非加性时,状态转移与测量方程有如下形式:

    x k f x k 1 w k 1 u 年代 k 1 y k h x k v k u k

在执行在线状态估计时,首先要创建非线性状态转换函数f和测量函数h.然后构建unscentedKalmanFilter对象使用这些非线性函数,并指定噪声项是可加的还是不可加的。对象创建后,使用预测命令来预测下一个时间步骤的状态估计,以及正确的使用无味卡尔曼滤波算法和实时数据来修正状态估计。有关算法的信息,请参见在线状态估计的扩展和Unscented卡尔曼滤波算法

可以使用下面的命令unscentedKalmanFilter对象:

命令 描述
正确的

在时间步上修正状态和状态估计误差协方差k使用时间步长的测量数据k

预测

预测下一时间步的状态和状态估计误差协方差。

剩余 返回实际测量值和预测测量值的差值。
克隆

创建另一个具有相同对象属性值的对象。

不使用语法创建额外的对象Obj2 = obj.以这种方式创建的新对象的属性所做的任何更改(methoda)也会改变原始对象的属性(obj).

unscentedKalmanFilter对象属性,请参见属性

例子

全部折叠

为了定义一个unscented卡尔曼滤波器对象来估计系统的状态,您需要编写并保存系统的状态转换函数和测量函数。

在这个例子中,使用之前写的和保存的状态转换和测量函数,vdpStateFcn.m而且vdpMeasurementFcn.m.这些函数描述了非线性参数mu = 1的van der Pol振子的离散近似。振子有两种状态。

指定这两种状态的初始猜测。您将初始状态猜测指定为-元素行或列向量,其中是状态数。

initialStateGuess = [1;0];

创建无气味卡尔曼过滤器对象。使用函数句柄向对象提供状态转换和测量函数。

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

该对象具有一个默认结构,其中过程噪声和测量噪声是相加的。

要估计来自构造对象的状态和状态估计误差协方差,请使用正确的而且预测命令和实时数据。

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

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

指定对象构造期间的过程噪声协方差。

obj = unscentedKalmanFilter(@vdpStateFcn,@vdpMeasurementFcn,[2;0],<年代pan style="color:#0000FF">...“ProcessNoise”, 0.01);

或者,您可以使用点表示法指定对象构造后的噪声协方差。例如,指定测量噪声协方差为0.2。

obj。米easurementNoise = 0.2;

由于系统只有一个输出,测量噪声是一个1元矢量MeasurementNoise属性表示测量噪声的方差。

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

obj = unscentedKalmanFilter(<年代pan style="color:#A020F0">“HasAdditiveMeasurementNoise”、假);

指定状态转换函数和测量函数。使用之前写的和保存的函数,vdpStateFcn.m而且vdpMeasurementNonAdditiveNoiseFcn.m

假设过程噪声是加性的,给出了状态转移函数。假设测量噪声是非加性的,测量函数是这样写的。

obj。StateTransitionFcn = @vdpStateFcn;obj。米easurementFcn = @vdpMeasurementNonAdditiveNoiseFcn;

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

obj。状态= [2;0];

您现在可以使用正确的而且预测命令来估计构造对象的状态和状态估计误差协方差值。

考虑一个有输入的非线性系统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)(根号(x+u));H = @(x,v,u)(x+2*u+v^2);

f而且h是匿名函数的函数句柄,分别存储状态转换和测量函数。在测量函数中,由于测量噪声是非加性的,v也指定为输入。请注意,v是否在附加输入之前指定为输入u

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

obj = unscentedKalmanFilter(f,h,1,<年代pan style="color:#A020F0">“HasAdditiveMeasurementNoise”、假);

指定测量噪声协方差。

obj。米easurementNoise = 0.01;

方法可以估计系统的状态预测而且正确的命令。传递的值u预测而且正确的,然后分别将它们传递给状态转换函数和测量函数。

修正状态估计测量y[k]=0.8和输入u[k]=0.2在时间步长k。

正确的(obj, 0.8, 0.2)

假设u[k]=0.2,预测下一时间步的状态。

预测(obj, 0.2)

输入参数

全部折叠

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

您为您的非线性系统编写并保存状态转换函数,并使用它来构造对象。例如,如果vdpStateFcn.m状态转换函数,是指定的吗StateTransitionFcn作为@vdpStateFcn.你也可以指定StateTransitionFcn作为匿名函数的函数句柄。

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

  • HasAdditiveProcessNoise是真的-过程噪音w是可加的,并且状态转移函数指定了状态如何作为前一个时间步的状态值的函数而演化:

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

    在哪里x (k)是当时的估计状态吗k,Us1,…,Usn状态转换函数是否需要任何额外的输入参数,例如系统输入或采样时间。在估计期间,将这些附加参数传递给预测命令,然后将它们传递给状态转换函数。

  • HasAdditiveProcessNoise为false -过程噪声是非可加性的,并且状态转换函数还指定了状态如何作为过程噪声的函数演化:

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

要查看带有加性过程噪声的状态转换函数的示例,请键入编辑vdpStateFcn在命令行。

测量功能h,指定为函数句柄。函数计算N-非线性系统在时间步长的单元输出测量向量k,给定时间步长的状态向量kN是系统的测量次数。您编写并保存度量函数,并使用它来构造对象。例如,如果vdpMeasurementFcn.m测量函数,是指定的吗MeasurementFcn作为@vdpMeasurementFcn.你也可以指定MeasurementFcn作为匿名函数的函数句柄。

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

  • HasAdditiveMeasurementNoise-测量噪声v是可加的,测量函数指定测量值如何作为状态值的函数演变:

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

    在哪里y (k)而且x (k)估计的输出和估计的状态是否及时k,听Um1,…,学院测量函数所需的任何可选输入参数。例如,如果使用多个传感器跟踪一个对象,则额外的输入可以是传感器位置。在估计期间,将这些附加参数传递给正确的命令,然后将它们传递给度量函数。

  • HasAdditiveMeasurementNoise为false -测量噪声是非可加性的,并且测量函数还指定输出测量如何作为测量噪声的函数演变:

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

要查看带有附加过程噪声的测量函数的示例,请键入编辑vdpMeasurementFcn在命令行。要查看带有非可加性过程噪声的测量函数的示例,请键入编辑vdpMeasurementNonAdditiveNoiseFcn

初始状态估计,指定为Ns-element vector,其中Ns是系统的状态数。根据您对系统的了解指定初始状态值。

指定的值存储在状态对象的属性。如果你指定InitialState作为一个列向量状态也是列向量,然后预测而且正确的命令以列向量的形式返回状态估计值。否则,返回一个行向量。

如果希望筛选器具有单精度浮点变量,请指定InitialState作为一个单精度矢量变量。例如,对于具有状态转换和测量功能的双态系统vdpStateFcn.m而且vdpMeasurementFcn.m,创建带有初始状态的无味卡尔曼滤波对象[1, 2]如下:

obj = unscentedKalmanFilter(@vdpStateFcn,@vdpMeasurementFcn,single([1;2]))

数据类型:|

名称-值参数

的可选逗号分隔对名称,值参数。的名字参数名称和价值对应的值。的名字必须出现在引号内。您可以以任意顺序指定多个名称和值对参数Name1, Value1,…,的家

使用名称,值要指定的参数属性unscentedKalmanFilter对象创建过程中的对象。例如,要创建一个无气味卡尔曼滤波器对象,并将过程噪声协方差指定为0.01:

obj = unscentedKalmanFilter(StateTransitionFcn,MeasurementFcn,InitialState,<年代pan style="color:#A020F0">“ProcessNoise”, 0.01);

属性

全部折叠

unscentedKalmanFilter对象属性有三种类型:

  • 可以多次指定的可调属性,可以在对象构造期间使用名称,值参数,或者状态估计之后的任何时间。创建对象后,使用点表示法修改可调属性。

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

    可调属性为状态StateCovarianceProcessNoiseMeasurementNoiseαβ,卡巴

  • 可以在对象构造期间或之后使用点概念指定一次的不可调属性。在使用状态估计之前指定这些属性正确的而且预测.的StateTransitionFcn而且MeasurementFcn属性属于这一类。

  • 在对象构造期间必须指定的不可调属性。的HasAdditiveProcessNoise而且HasAdditiveMeasurementNoise属性属于这一类。

围绕平均状态值的西格玛点分布,指定为0到1之间的标量值(0<α< =1).

无气味卡尔曼滤波算法将系统状态视为一个具有均值的随机变量状态和方差StateCovariance.为了在下一个时间步中计算状态及其统计属性,算法首先生成一组分布在平均值周围的状态值状态通过使用unscented转换来获得值。这些生成的状态值称为sigma点。该算法使用每个sigma点作为状态转换和测量函数的输入,以获得一组新的转换状态点和测量值。转换后的点用于计算下一个时间步的状态和状态估计误差协方差值。

围绕平均状态值的西格玛点的扩展由两个参数控制α而且卡巴.第三个参数,β,在状态和测量协方差计算时影响转换点的权重:

  • α-确定平均状态值周围的西格玛点的分布。它通常是一个很小的正值。点的分布与α.较小的值对应于更接近平均状态的sigma点。

  • 卡巴—第二个缩放参数,通常设置为0。较小的值对应于更接近平均状态的sigma点。的平方根成正比卡巴

  • β-整合状态分布的先验知识。对于高斯分布,β= 2是最佳的。

如果你知道状态和状态协方差的分布,你可以调整这些参数来捕捉分布的高阶矩的变换。该算法只能跟踪状态概率分布中的一个峰值。如果系统的状态分布中有多个峰值,则可以调整这些参数,使sigma点保持在单个峰值附近。例如,选择一个小的α生成接近平均状态值的sigma点。

有关更多信息,请参见无味卡尔曼滤波算法

α是一个可调属性。你可以用点符号来改变它。

状态分布的描述,用于调整转换后的西格玛点的权重,指定为大于或等于0的标量值。对于高斯分布,β= 2是最优选择。

有关更多信息,请参见α属性描述。

β是一个可调属性。你可以用点符号来改变它。

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

  • 真正的-测量噪声v是添加剂。测量函数h这在MeasurementFcn具有以下形式:

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

    在哪里y (k)而且x (k)估计的输出和估计的状态是否及时k,听Um1,…,学院测量函数所需的任何可选输入参数。

  • -测量噪声是非加性的。度量函数指定输出度量如何作为状态的函数发展<年代pan class="emphasis">而且测量噪声:

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

HasAdditiveMeasurementNoise是不可调属性,只能在对象构造期间指定它。你不能用点表示法来改变它。

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

  • 真正的-过程噪声w是添加剂。状态转移函数f中指定的StateTransitionFcn具有以下形式:

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

    在哪里x (k)是当时的估计状态吗k,Us1,…,Usn状态转换函数需要的任何其他输入参数。

  • -过程噪声无附加性。状态转换函数指定作为状态函数的状态如何演变<年代pan class="emphasis">而且前一时间步的过程噪声:

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

HasAdditiveProcessNoise是不可调属性,只能在对象构造期间指定它。你不能用点表示法来改变它。

在平均状态值附近的西格玛点分布,指定为0到3之间的标量值(0< =卡巴< =3.).卡巴通常指定为0.较小的值对应于更接近平均状态的sigma点。的平方根成正比卡巴.有关更多信息,请参见α属性描述。

卡巴是一个可调属性。你可以用点符号来改变它。

测量功能h,指定为函数句柄。函数计算N-非线性系统在时间步长的单元输出测量向量k,给定时间步长的状态向量kN是系统的测量次数。您编写并保存度量函数,并使用它来构造对象。例如,如果vdpMeasurementFcn.m测量函数,是指定的吗MeasurementFcn作为@vdpMeasurementFcn.你也可以指定MeasurementFcn作为匿名函数的函数句柄。

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

  • HasAdditiveMeasurementNoise-测量噪声v是可加的,测量函数指定测量值如何作为状态值的函数演变:

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

    在哪里y (k)而且x (k)估计的输出和估计的状态是否及时k,听Um1,…,学院测量函数所需的任何可选输入参数。例如,如果使用多个传感器跟踪一个对象,则额外的输入可以是传感器位置。在估计期间,将这些附加参数传递给正确的命令,然后将它们传递给测量函数。

  • HasAdditiveMeasurementNoise为false -测量噪声是非可加性的,并且测量函数还指定输出测量如何作为测量噪声的函数演变:

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

要查看带有附加过程噪声的测量函数的示例,请键入编辑vdpMeasurementFcn在命令行。要查看带有非可加性过程噪声的测量函数的示例,请键入编辑vdpMeasurementNonAdditiveNoiseFcn

MeasurementFcn是不可调属性。属性之前可以指定一次正确的命令可以在对象构造期间执行,也可以在对象构造后使用点表示法。方法后不能更改它正确的命令。

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

  • HasAdditiveMeasurementNoise为真-指定协方差为标量或N——- - - - - -N矩阵,N是系统的测量次数。如果测量噪声项之间没有相互关联且所有项的方差相同,则指定标量。该软件使用标量值创建一个N——- - - - - -N对角矩阵。

  • HasAdditiveMeasurementNoise为false -指定协方差为aV——- - - - - -V矩阵,V是测量噪声项的个数。MeasurementNoise使用前必须指定正确的.在你指定之后MeasurementNoise作为一个矩阵,第一次,然后改变MeasurementNoise还可以将其指定为标量。如果测量噪声项之间没有相互关联且所有项具有相同的方差,则指定为标量。软件将标量扩展为aV——- - - - - -V对角线上有标量的对角线矩阵。

MeasurementNoise是一个可调属性。你可以用点符号来改变它。

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

  • HasAdditiveProcessNoise为真-指定协方差为标量或Ns——- - - - - -Ns矩阵,Ns是系统的状态数。如果过程噪声项之间没有相互关联,并且所有项具有相同的方差,则指定标量。该软件使用标量值创建一个Ns——- - - - - -Ns对角矩阵。

  • HasAdditiveProcessNoise为false -指定协方差为aW——- - - - - -W矩阵,W是过程噪声项的个数。ProcessNoise使用前必须指定预测.在你指定之后ProcessNoise作为一个矩阵,第一次,然后改变ProcessNoise还可以将其指定为标量。如果过程噪声项之间没有相互关联且所有项具有相同的方差,则指定为标量。软件将标量扩展为aW——- - - - - -W对角矩阵。

ProcessNoise是一个可调属性。你可以用点符号来改变它。

非线性系统的状态,用大小向量表示Ns,在那里Ns是系统的状态数。

当你使用预测命令,状态是否在时间步长用预测值更新k使用时间步长的状态值k1。当你使用正确的命令,状态是否在时间步长用估计值更新k使用时间步长的测量数据k

的初始值状态中指定的值是否为InitialState在对象创建期间输入参数。如果你指定InitialState作为一个列向量状态也是一个列向量,而预测而且正确的命令以列向量的形式返回状态估计值。否则,返回一个行向量。如果希望筛选器具有单精度浮点变量,则必须指定状态属性在对象构造过程中作为单精度变量InitialState输入参数。

状态是一个可调属性。你可以用点符号来改变它。

状态估计误差协方差,用标量或Ns——- - - - - -Ns矩阵,Ns是系统的状态数。如果指定了标量,则软件将使用该标量值创建Ns——- - - - - -Ns对角矩阵。

类中指定的初始状态值没有置信度时,请为协方差指定一个较高的值InitialState输入参数。

当你使用预测命令,StateCovariance是否在时间步长用预测值更新k使用时间步长的状态值k1。当你使用正确的命令,StateCovariance是否在时间步长用估计值更新k使用时间步长的测量数据k

StateCovariance是一个可调属性。方法后,可以使用点符号对其进行更改正确的预测命令。

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

您编写并保存非线性系统的状态转换函数,并使用它来构造对象。例如,如果vdpStateFcn.m状态转换函数,是指定的吗StateTransitionFcn作为@vdpStateFcn.你也可以指定StateTransitionFcn作为匿名函数的函数句柄。

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

  • HasAdditiveProcessNoise是真的-过程噪音w是可加的,状态转移函数指定了状态如何作为前一个时间步的状态值的函数而演化:

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

    在哪里x (k)是当时的估计状态吗k,Us1,…,Usn状态转换函数是否需要任何额外的输入参数,例如系统输入或采样时间。在估计期间,将这些附加参数传递给预测命令,然后将它们传递给状态转换函数。

  • HasAdditiveProcessNoise为false -过程噪声是非可加性的,并且状态转换函数还指定了状态如何作为过程噪声的函数演化:

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

要查看带有加性过程噪声的状态转换函数的示例,请键入编辑vdpStateFcn在命令行。

StateTransitionFcn是不可调属性。属性之前可以指定一次预测命令可以在对象构造期间执行,也可以在对象构造后使用点表示法。方法后不能更改它预测命令。

输出参数

全部折叠

用于在线状态估计的无味卡尔曼滤波器对象,返回为unscentedKalmanFilter对象。此对象是使用指定的属性.使用正确的而且预测命令来估计状态和状态估计误差协方差使用无味卡尔曼滤波算法。

当你使用预测obj。状态而且obj。StateCovariance是否在时间步长用预测值更新k使用时间步长的状态值k1。当你使用正确的obj。状态而且obj。StateCovariance是否在时间步上更新估计值k使用时间步长的测量数据k

兼容性的考虑

全部展开

R2020b的行为发生了变化

扩展功能

另请参阅

功能

  • |<年代pan itemscope itemtype="//www.tatmou.com/help/schema/MathWorksDocPage/SeeAlso" itemprop="seealso">|<年代pan itemscope itemtype="//www.tatmou.com/help/schema/MathWorksDocPage/SeeAlso" itemprop="seealso">|<年代pan itemscope itemtype="//www.tatmou.com/help/schema/MathWorksDocPage/SeeAlso" itemprop="seealso">|<年代pan itemscope itemtype="//www.tatmou.com/help/schema/MathWorksDocPage/SeeAlso" itemprop="seealso">|<年代pan itemscope itemtype="//www.tatmou.com/help/schema/MathWorksDocPage/SeeAlso" itemprop="seealso">|<年代pan itemscope itemtype="//www.tatmou.com/help/schema/MathWorksDocPage/SeeAlso" itemprop="seealso">

在R2016b中引入