主要内容

扩展卡尔曼滤波器

为在线状态估计创建扩展卡尔曼滤波对象

描述

例子

obj= extendedKalmanFilter (状态转换,测量,初始状态为离散时间非线性系统的在线状态估计创建扩展卡尔曼滤波对象。状态转换是一个计算系统时刻状态的函数吗k,给定当时的状态向量k-1.测量是一个计算系统输出测量时间的函数吗k,考虑到当时的状态k初始状态指定状态估计的初始值。

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

例子

obj= extendedKalmanFilter (状态转换,测量,初始状态,名称、值指定使用一个或多个扩展卡尔曼滤波器对象的附加属性名称、值对参数。

obj= extendedKalmanFilter (状态转换,测量使用指定的状态转换和测量函数创建扩展的卡尔曼滤波对象。在使用之前预测正确的命令,使用点表示法指定初始状态值。例如,对于具有初始状态值的两状态系统(1, 0),指定对象状态=(1, 0)

obj= extendedKalmanFilter (状态转换,测量,名称、值指定使用一个或多个扩展卡尔曼滤波器对象的附加属性名称、值对参数。在使用之前预测正确的命令中指定初始状态值名称、值成对参数或点符号。

例子

obj= extendedKalmanFilter (名称、值创建具有使用一个或多个属性的扩展卡尔曼过滤器对象名称、值对参数。在使用之前预测正确的使用命令,指定状态转换函数、度量函数和初始状态值名称、值成对参数或点符号。

对象描述

扩展卡尔曼滤波器利用一阶离散时间扩展卡尔曼滤波算法建立了一个离散时间非线性系统的在线状态估计对象。

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

算法计算状态估计 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在时间步kwv分别为零均值、不相关过程和测量噪声。这些函数还可以有附加的输入参数u年代u在方程。例如,附加参数可以是时间步长k或输入u对于非线性系统,可以有多个这样的参数。

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

  • 非加性噪声项-该软件还支持更复杂的状态转换和状态测量万博1manbetx功能xk]和测量yk]分别是过程噪声和测量噪声的非线性函数。当噪声项为非加性项时,状态转移和测量方程具有以下形式:

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

执行联机状态估计时,首先创建非线性状态转换函数f和测量功能h. 然后构造扩展卡尔曼滤波器对象,并指定噪声项是可加性的还是非可加性的。你也可以指定状态转移和测量函数的雅可比矩阵。如果你没有指定它们,软件会数值计算雅可比矩阵。

创建对象后,使用预测命令来预测下一个时间步骤的状态估计,并且正确的使用算法和实时数据更正状态估计。有关算法的信息,请参阅在线状态估计的扩展和无迹卡尔曼滤波算法

您可以将以下命令用于扩展卡尔曼滤波器物体:

命令 描述
正确的

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

预测

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

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

使用相同的对象属性值创建另一个对象。

不使用语法创建其他对象methoda = obj。对以这种方式创建的新对象的属性所做的任何更改(obj2)还可以更改原始对象的属性(obj).

对于扩展卡尔曼滤波器对象属性,看性质

例子

全部崩溃

要定义用于估计系统状态的扩展卡尔曼滤波器对象,请首先写入并保存系统的状态转换函数和测量函数。

在本例中,使用先前编写和保存的状态转换和测量函数,vdpStateFcn.mvdpMeasurementFcn.m这些函数描述了非线性参数mu等于1的范德波尔振荡器的离散近似。振荡器有两种状态。

为这两种状态指定一个初始猜测。你指定猜测为an-元素行或列向量,其中是州数。

initialStateGuess=[1;0];

创建扩展卡尔曼滤波器对象。使用函数句柄为对象提供状态转换和测量函数。

obj=扩展的Kalman过滤器(@vdpStateFcn、@vdpMeasurementFcn、initialStateGuess);

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

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

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

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

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

obj=ExtendedKalman过滤器(@vdpStateFcn,@vdpMeasurementFcn,[2;0],...“加工噪音”,0.01);

或者,您可以使用点符号在对象构造之后指定噪声协方差。例如,指定测量噪声协方差为0.2。

obj.MeasurementNoise=0.2;

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

为具有两个状态和一个输出的范德堡尔振荡器创建一个扩展卡尔曼滤波器对象。使用先前编写和保存的状态转换和测量功能,vdpStateFcn.mvdpMeasurementFcn.m。将这两个状态的初始状态值指定为[2;0]。

obj=扩展的Kalman过滤器(@vdpStateFcn,@vdpMeasurementFcn,[2;0]);

扩展卡尔曼滤波算法利用状态转移的雅可比矩阵和测量函数进行状态估计。编写并保存雅可比函数,并将它们作为对象的函数句柄提供。在本例中,使用先前编写和保存的函数vdpStateJacobianFcn.mvdpMeasurementJacobianFcn.m

obj.StateTransitionJacobianFcn=@vdpStateJacobianFcn;obj.MeasurementJacobianFcn=@vdpMeasurementJacobianFcn;

请注意,如果未指定函数的雅可比数,则软件将以数值方式计算雅可比数。此数值计算可能会导致处理时间增加和状态估计的数值不准确。

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

obj=扩展卡尔曼滤波器(“HasAdditiveMeasurementNoise”、假);

指定状态转换函数和测量函数。使用以前编写和保存的函数,vdpStateFcn.mVDP测量不可加性ENOISEFCN.m

假设过程噪声是可加的状态转移函数。测量函数是假定测量噪声是非可加性的。

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

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

对象状态=[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)(sqrt(x+u));h=@(x,v,u)(x+2*u+v^2);

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

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

obj = extendedKalmanFilter (f、h 1“HasAdditiveMeasurementNoise”、假);

指定测量噪声协方差。

obj.MeasurementNoise=0.01;

您现在可以使用预测正确的命令。您可以传递u预测正确的,然后分别将它们传递给状态转换函数和测量函数。

通过测量纠正状态估计yk]=0.8和输入uk]=0.2在时间步k

正确的(obj, 0.8, 0.2)

预测下一个时间步骤的状态uk]=0.2

预测(obj,0.2)

检索错误,或剩余在预测和测量之间。

[残差,残差方差]=残差(obj,0.8,0.2);

输入参数

全部崩溃

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

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

函数的输入取决于您在HasAdditiveProcessNoise对象的属性:

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

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

    在哪里x (k)是当时的估计状态k,Us1,…,Usn是状态转换函数所需的任何其他输入参数,例如系统输入或采样时间。在估计过程中,您将这些附加参数传递给预测命令,然后将其传递给状态转换函数。

  • HasAdditiveProcessNoiseis false -过程噪声是非可加性的,状态转移函数也指定状态如何演化为过程噪声的函数:

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

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

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

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

  • HasAdditiveMeasurementNoise是真的吗-测量噪音v是可加性的,度量函数指定度量如何作为状态值的函数演化:

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

    在哪里y (k)x (k)是当时的估计输出和估计状态k,Um1,…,Umn是测量函数所需的任何可选输入参数。例如,如果使用多个传感器跟踪对象,则传感器位置可能是一个附加输入。在估计过程中,将这些附加参数传递给正确的命令,然后将其传递给测量功能。

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

    y (k) = h (x (k), v (k),听Um1,…,学院)

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

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

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

如果要使用单精度浮点变量的筛选器,请指定初始状态作为单个精度向量变量。例如,对于具有状态转换和测量功能的两状态系统vdpStateFcn.mvdpMeasurementFcn.m,创建具有初始状态估计的扩展卡尔曼滤波对象[1, 2]如下:

obj=ExtendedKalman过滤器(@vdpStateFcn,@vdpMeasurementFcn,单个([1;2]))

数据类型:双重的|仅有一个的

名称-值参数

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

使用名称、值要指定的参数性质扩展卡尔曼滤波器对象创建过程中的对象。例如,要创建扩展卡尔曼滤波对象并将过程噪声协方差指定为0.01:

obj=扩展Kalman过滤器(状态转换FCN、度量值Cn、初始状态、,“加工噪音”,0.01);

性质

全部崩溃

扩展卡尔曼滤波器对象属性有三种类型:

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

    obj = extendedKalmanFilter (StateTransitionFcn MeasurementFcn InitialState);obj。ProcessNoise = 0.01;

    可调属性为状态,StateCovariance,ProcessNoise,测量噪声

  • 可指定一次的不可调优属性,可以在对象构造期间或之后使用点概念指定。在使用状态估计之前指定这些属性正确的预测.的状态转换,测量,状态转换JacobianFCN,MeasurementJacobianFcn财产属于这一类。

  • 在对象构造过程中必须指定的非功能属性HasAdditiveProcessNoiseHasAdditiveMeasurementNoise财产属于这一类。

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

  • 真正的-测量噪声v是添加剂。测量功能h这是在测量表格如下:

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

    在哪里y (k)x (k)是当时的估计输出和估计状态k,Um1,…,Umn是度量函数所需的任何可选输入参数。

  • 错误的-测量噪声是非加性的。测量功能指定输出测量如何随状态变化测量噪声:

    y (k) = h (x (k), v (k),听Um1,…,学院)

HasAdditiveMeasurementNoise是一个非功能属性,您只能在对象构造期间指定它。不能使用点表示法更改它。

工艺噪声特性,指定为以下值之一:

  • 真正的——过程噪声w是添加剂。状态转移函数f中指定的状态转换表格如下:

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

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

  • 错误的-过程噪声是非加性的。状态转换函数指定状态作为状态的函数如何演化上一时间步的过程噪声:

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

HasAdditiveProcessNoise是一个非功能属性,您只能在对象构造期间指定它。不能使用点表示法更改它。

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

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

  • HasAdditiveMeasurementNoise是真的吗-测量噪音v是可加性的,度量函数指定度量如何作为状态值的函数演化:

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

    在哪里y (k)x (k)是当时的估计输出和估计状态k,Um1,…,Umn是测量函数所需的任何可选输入参数。例如,如果使用多个传感器跟踪对象,则传感器位置可能是一个附加输入。在估计过程中,将这些附加参数传递给正确的命令,然后将其传递给测量功能。

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

    y (k) = h (x (k), v (k),听Um1,…,学院)

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

测量是一个不可调优的属性。可以在使用之前指定一次正确的在对象构造期间或在对象构造之后使用点表示法执行命令。您不能在使用后更改它正确的命令。

测量函数的雅可比矩阵h,指定为以下内容之一:

  • []-雅可比矩阵在每次调用时都是数值计算的正确的命令。这可能会增加处理时间和状态估计的数值误差。

  • 函数句柄——编写并保存雅可比函数,并指定函数的句柄。例如,如果vdpMeasurementJacobianFcn.m雅可比函数是指定的吗MeasurementJacobianFcn作为@vdpMeasurementJacobianFcn

    该函数计算测量函数相对于状态和测量噪声的偏导数。雅可比函数的输入数量必须等于测量函数的输入数量,并且必须在两个函数中以相同的顺序指定。雅可比函数的输出数量取决于HasAdditiveMeasurementNoise属性:

    • HasAdditiveMeasurementNoise为真-该函数计算测量函数相对于状态的偏导数( h / x )。输出为N-借-Ns雅可比矩阵,N系统的测量次数是多少Ns是州数。

    • HasAdditiveMeasurementNoise为假-该函数还返回第二个输出,该输出是测量函数对测量噪声项的偏导数( h / v )。第二个输出作为N-借-V雅可比矩阵,V是测量噪声项的数量。

要查看加法测量噪声的雅可比函数示例,请键入编辑vdpMeasurementJacobianFcn在命令行。

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

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

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

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

测量噪声是一个可调属性。你可以用点符号来改变它。

过程噪声协方差,指定为标量或矩阵,具体取决于HasAdditiveProcessNoise属性:

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

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

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

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

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

的初始值状态中指定的值是初始状态对象创建期间的输入参数。如果您指定初始状态作为列向量,然后状态也是列向量,那么预测正确的命令以列向量的形式返回状态估计。否则,返回一个行向量。如果希望使用单精度浮点变量的筛选器,则必须指定状态作为一个单精度变量在使用初始状态输入参数。

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

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

当您对在中指定的初始状态值没有信心时,请为协方差指定一个高值初始状态输入参数。

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

StateCovariance是一个可调属性。在使用正确的预测命令。

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

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

函数的输入取决于您在HasAdditiveProcessNoise对象的属性:

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

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

    在哪里x (k)是当时的估计状态k,Us1,…,Usn是状态转换函数所需的任何其他输入参数,例如系统输入或采样时间。在估计过程中,您将这些附加参数传递给预测命令,然后将其传递给状态转换函数。

  • HasAdditiveProcessNoiseis false -过程噪声是非可加性的,状态转移函数也指定状态如何演化为过程噪声的函数:

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

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

状态转换是一个不可调优的属性。可以在使用之前指定一次预测在对象构造期间或在对象构造之后使用点表示法执行命令。您不能在使用后更改它预测命令。

状态转移函数的雅可比矩阵f,指定为以下内容之一:

  • []-雅可比矩阵在每次调用时都是数值计算的预测命令。这可能会增加处理时间和状态估计的数值误差。

  • 函数句柄——编写并保存雅可比函数,并指定函数的句柄。例如,如果vdpStateJacobianFcn.m雅可比函数是指定的吗状态转换JacobianFCN作为@vdpStateJacobianFcn

    该函数计算状态转移函数相对于状态和过程噪声的偏导数。雅可比函数的输入数量必须等于状态转移函数的输入数量,并且必须在两个函数中以相同的顺序指定。函数的输出数量取决于HasAdditiveProcessNoise属性:

    • HasAdditiveProcessNoise为真-该函数计算状态转移函数相对于状态的偏导数( f / x )。输出为Ns-借-Ns雅可比矩阵,Ns是州数。

    • HasAdditiveProcessNoise为假-该函数还必须返回第二个输出,该输出是状态转移函数对过程噪声项的偏导数( f / w )。第二个输出作为Ns-借-W雅可比矩阵,W是过程噪声项的数量。

扩展卡尔曼滤波算法利用雅可比矩阵计算状态估计误差协方差。

要查看加性过程噪声的雅可比函数的示例,请键入编辑vdpStateJacobianFcn在命令行。

状态转换JacobianFCN是一个不可调优的属性。可以在使用之前指定一次预测在对象构造期间或在对象构造之后使用点表示法执行命令。您不能在使用后更改它预测命令。

输出参数

全部崩溃

用于在线状态估计的扩展卡尔曼滤波对象,作为扩展卡尔曼滤波器对象。此对象是使用指定的性质.使用正确的预测使用扩展卡尔曼滤波算法估计状态和状态估计误差协方差的命令。

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

兼容性的考虑

全部展开

行为在R2020b中改变

扩展能力

介绍了R2016b