主要内容

kalman

设计用于状态估计的卡尔曼滤波器

    说明

    [kalmf,L,P] = kalman(sys,Q,R,N) 根据被控对象模型 sys 以及噪声协方差数据 QRN 创建卡尔曼滤波器。该函数计算卡尔曼滤波器,用于具有下图所示配置的卡尔曼估计器。

    Kalman estimator including plant sys and Kalman filter kalmf. The plant has input u, noise input w, and output yt. The Kalman filter takes as inputs w and noisy plant output y = yt + v. The filter outputs are y-hat, the estimated true plant output, and x-hat, the estimated state values.

    您使用已知输入 u 和白过程噪声输入 w 构造模型 sys,使得 wsys 的最后 Nw 个输入组成。“真实”被控对象输出 ytsys 的所有输出组成。您还需要提供噪声协方差数据 QRN。返回的卡尔曼滤波器 kalmf 是一个状态空间模型,它接受已知输入 u 和含噪测量值 y,并生成真实被控对象输出的估计值 y^ 和被控对象状态的估计值 x^kalman 还返回卡尔曼增益 L 和稳态误差协方差矩阵 P

    示例

    当以下一个或两个条件成立时,[kalmf,L,P] = kalman(sys,Q,R,N,sensors,known) 计算卡尔曼滤波器。

    • 并非 sys 的全部输出都被测量。

    • 扰动输入 w 不是 sys 的最后几个输入。

    索引向量 sensors 指定 sys 的哪些输出被测量。这些输出构成 y。索引向量 known 指定哪些输入是已知的(确定性的)。这些已知输入构成 ukalman 命令将 sys 的其余输入视为随机输入 w

    示例

    [kalmf,L,P,Mx,Z,My] = kalman(___) 针对离散时间 sys,还会返回新信息增益 MxMy 以及稳态误差协方差 PZ。此语法可与上述任一输入参量组合结合使用。

    [kalmf,L,P,Mx,Z,My] = kalman(___,type) 指定离散时间 sys 的估计器类型。

    • type = 'current' - 使用截至 y[n] 的所有可用测量值,计算输出估计值 y^[n|n] 和状态估计值 x^[n|n]

    • type = 'delayed' - 仅使用截至 y[n1] 的测量值,计算输出估计值 y^[n|n1] 和状态估计值 x^[n|n1]。延迟估计器更易于在控制环内部实现。

    type 输入参量可与上述任一输入参量组合结合使用。

    示例

    全部折叠

    为一个在输入端存在加性白噪声 w、在输出端存在加性白噪声 v 的被控对象(如下图示)设计卡尔曼滤波器。

    kalman4.png

    假设该被控对象具有以下状态空间矩阵,并且是一个未指定采样时间 (Ts = -1) 的离散时间被控对象。

    A = [1.1269   -0.4940    0.1129 
         1.0000         0         0 
              0    1.0000         0];
    
    B = [-0.3832
          0.5919
          0.5191];
    
    C = [1 0 0];
    
    D = 0;
    
    Plant = ss(A,B,C,D,-1);
    Plant.InputName = 'un';
    Plant.OutputName = 'yt';

    要使用 kalman,您提供的模型 sys 必须包含噪声 w 作为独立输入。因此,sysPlant 不同,因为 Plant 接受输入 un = u + w。您可以通过为噪声输入创建一个求和结点来构造 sys

    Sum = sumblk('un = u + w');
    sys = connect(Plant,Sum,{'u','w'},'yt');

    等效地,您也可以使用 sys = Plant*[1 1]

    指定噪声协方差。由于该被控对象包含一个噪声输入和一个输出,因此这些值都是标量。实际上,这些值是您的系统中噪声源的属性,您可以通过测量或根据系统的其他信息来源来确定。对于此示例,假设两个噪声源都具有单位协方差且不相关 (N = 0)。

    Q = 1;
    R = 1;
    N = 0;

    设计滤波器。

    [kalmf,L,P] = kalman(sys,Q,R,N);
    size(kalmf)
    State-space model with 4 outputs, 2 inputs, and 3 states.
    

    卡尔曼滤波器 kalmf 是一种具有两个输入和四个输出的状态空间模型。kalmf 接受被控对象输入信号 u 和含噪被控对象输出 y=yt+v 作为输入。第一个输出是估计的真实被控对象输出 yˆ。其余三个输出是状态估计值 xˆ。检查 kalmf 的输入和输出名称,了解 kalman 是如何相应地为它们设置标签的。

    kalmf.InputName
    ans = 2×1 cell
        {'u' }
        {'yt'}
    
    
    kalmf.OutputName
    ans = 4×1 cell
        {'yt_e'}
        {'x1_e'}
        {'x2_e'}
        {'x3_e'}
    
    

    检查卡尔曼增益 L。对于具有三个状态的 SISO 被控对象,L 是一个三元素列向量。

    L
    L = 3×1
    
        0.3586
        0.3798
        0.0817
    
    

    有关说明如何使用 kalmf 减少由噪声引起的测量误差的示例,请参阅卡尔曼滤波

    假设有一个具有三个输入(其中一个输入代表过程噪声 w)和两个测量输出的被控对象。该被控对象具有四个状态。

    kalman5.png

    假设有以下状态空间矩阵,创建 sys

    A = [-0.71  0.06 -0.19 -0.17;
          0.06 -0.52 -0.03  0.30;
         -0.19 -0.03 -0.24 -0.02;
         -0.17  0.30 -0.02 -0.41];
    
    B = [ 1.44  2.91   0;
         -1.97  0.83 -0.27;
         -0.20  1.39  1.10;
         -1.2   0    -0.28];
    
    C = [ 0    -0.36 -1.58 0.28;
         -2.05  0     0.51 0.03];
    
    D = zeros(2,3);
    
    sys = ss(A,B,C,D);
    sys.InputName = {'u1','u2','w'};
    sys.OutputName = {'y1','y2'};

    由于该被控对象只有一个过程噪声输入,因此协方差 Q 是标量。对于此示例,假设该过程噪声具有单位协方差。

    Q = 1;

    kalman 利用 Q 的维度来确定哪些输入是已知输入,哪些是噪声输入。对于标量 Qkalman 假设只有一个噪声输入,且使用最后一个输入,除非您另行指定(参见具有未测量输出的被控对象)。

    对于两个输出上的测量噪声,指定一个 2×2 的噪声协方差矩阵。对于此示例,为第一个输出使用单位方差,为第二个输出使用方差 1.3。将非对角线值设置为 0,以指示两个噪声通道不相关。

    R = [1 0;
         0 1.3];

    设计卡尔曼滤波器。

    [kalmf,L,P] = kalman(sys,Q,R);

    检查输入和输出。kalman 使用 kalmfInputNameOutputNameInputGroupOutputGroup 属性来帮助您跟踪 kalmf 的输入和输出所代表的含义。

    kalmf.InputGroup
    ans = struct with fields:
         KnownInput: [1 2]
        Measurement: [3 4]
    
    
    kalmf.InputName
    ans = 4×1 cell
        {'u1'}
        {'u2'}
        {'y1'}
        {'y2'}
    
    
    kalmf.OutputGroup
    ans = struct with fields:
        OutputEstimate: [1 2]
         StateEstimate: [3 4 5 6]
    
    
    kalmf.OutputName
    ans = 6×1 cell
        {'y1_e'}
        {'y2_e'}
        {'x1_e'}
        {'x2_e'}
        {'x3_e'}
        {'x4_e'}
    
    

    因此,两个已知输入 u1u2kalmf 的前两个输入,两个测量输出 y1y2kalmf 的最后两个输入。对于 kalmf 的输出,前两个是估计输出,其余四个是状态估计值。要使用卡尔曼滤波器,请以类似于卡尔曼滤波中针对 SISO 被控对象所示的方式将这些输入连接到被控对象和噪声信号。

    假设有一个具有四个输入和两个输出的被控对象。第一个和第三个输入是已知的,而第二个和第四个输入代表过程噪声。该被控对象也具有两个输出,但只有第二个输出被测量。

    kalman6.png

    使用以下状态空间矩阵创建 sys

    A = [-0.37  0.14 -0.01  0.04;
         0.14 -1.89  0.98 -0.11;
        -0.01  0.98 -0.96 -0.14;
         0.04 -0.11 -0.14 -0.95];
    
    B = [-0.07 -2.32  0.68  0.10;
         -2.49  0.08  0     0.83;
          0    -0.95  0     0.54;
         -2.19  0.41  0.45  0.90];
    
    C = [ 0     0    -0.50 -0.38;
         -0.15 -2.12 -1.27  0.65];
    
    D = zeros(2,4);
    
    sys = ss(A,B,C,D,-1);    % Discrete with unspecified sample time
    
    sys.InputName = {'u1','w1','u2','w2'};
    sys.OutputName = {'yun','ym'};

    要使用 kalman 为此系统设计滤波器,请使用 knownsensors 输入参量来指定被控对象的哪些输入是已知的,哪些输出被测量。

    known = [1 3];
    sensors = [2];

    指定噪声协方差并设计滤波器。

    Q = eye(2);
    R = 1;
    N = 0;
    
    [kalmf,L,P] = kalman(sys,Q,R,N,sensors,known); 

    检查 kalmf 的输入和输出标签,可了解滤波器期望的输入及其返回的输出。

    kalmf.InputGroup
    ans = struct with fields:
         KnownInput: [1 2]
        Measurement: 3
    
    
    kalmf.InputName
    ans = 3×1 cell
        {'u1'}
        {'u2'}
        {'ym'}
    
    

    kalmf 接受 sys 的两个已知输入和 sys 的含噪测量输出作为输入。

    kalmf.OutputGroup
    ans = struct with fields:
        OutputEstimate: 1
         StateEstimate: [2 3 4 5]
    
    

    kalmf 的第一个输出是其对测量被控对象输出真实值的估计。其余输出是状态估计值。

    输入参数

    全部折叠

    含过程噪声的被控对象模型,指定为状态空间 (ss) 模型。该被控对象具有已知输入 u 和白过程噪声输入 w。被控对象输出 yt 不包含测量噪声。

    Diagram showing that sys includes plant dynamics and process noise inputs, but not the additive noise on the plant output.

    您可以将此类被控对象模型的状态空间矩阵写为:

    A,[BG],C,[DH]

    kalman 假设输出端存在高斯噪声 v。因此,在连续时间中,kalman 所处理的状态空间方程为:

    x˙=Ax+Bu+Gwy=Cx+Du+Hw+v

    在离散时间中,状态空间方程为:

    x[n+1]=Ax[n]+Bu[n]+Gw[n]y[n]=Cx[n]+Du[n]+Hw[n]+v[n]

    如果您不使用 known 输入参量,kalman 会利用 Q 的大小来确定 sys 的哪些输入是噪声输入。在这种情况下,kalman 将最后 Nw = size(Q,1) 个输入视为噪声输入。当噪声输入 w 不是 sys 的最后几个输入时,您可以使用 known 输入参量来指定哪些被控对象输入是已知的。kalman 会将其余输入视为随机输入。

    有关被控对象矩阵属性的附加约束,请参阅限制

    过程噪声协方差,指定为标量或 Nw×Nw 矩阵,其中 Nw 是被控对象的噪声输入数。kalman 利用 Q 的大小来确定 sys 的哪些输入是噪声输入,默认将最后 Nw = size(Q,1) 个输入视为噪声输入,除非您使用 known 输入参量另行指定。

    kalman 假设过程噪声 w 是高斯噪声,其协方差为 Q = E(wwT)。当被控对象只有一个过程噪声输入时,Q 是标量,等于 w 的方差。当被控对象具有多个不相关的噪声输入时,Q 是对角矩阵。在实际操作中,您可以通过测量或对您的系统的噪声属性进行有根据的猜测来确定 Q 的适当值。

    测量噪声协方差,指定为标量或 Ny×Ny 矩阵,其中 Ny 是被控对象输出数。kalman 假设测量噪声 v 是白噪声,其协方差为 R = E(vvT)。当被控对象只有一个输出通道时,R 是标量,等于 v 的方差。当被控对象具有多个输出通道且测量噪声不相关时,R 是对角矩阵。在实际操作中,您可以通过测量或对您的系统的噪声属性进行有根据的猜测来确定 R 的适当值。

    有关测量噪声协方差的附加约束,请参阅限制

    噪声互协方差,指定为标量或 Nw×Ny 矩阵。kalman 假设过程噪声 w 和测量噪声 v 满足 N = E(wvT)。如果两个噪声源不相关,则可以省略 N,这相当于设置 N = 0。在实际操作中,您可以通过测量或对您的系统的噪声属性进行有根据的猜测来确定 N 的适当值。

    sys 的测量输出,指定为标识 sys 的哪些输出会被测量的索引向量。例如,假设您的系统有三个输出,但只有其中两个输出会被测量,对应于 sys 的第一个和第三个输出。在这种情况下,设置 sensors = [1 3]

    sys 的已知输入,指定为标识哪些输入是已知的(确定性的)的索引向量。例如,假设您的系统有三个输入,但只有第一个和第二个输入是已知的。在这种情况下,设置 known = [1 2]kalman 会将 sys 的其余输入解释为随机输入。

    要计算的离散时间估计器类型,指定为 'current''delayed'。此输入仅与离散时间 sys 相关。

    • 'current' - 使用截至 y[n] 的所有可用测量值,计算输出估计值 y^[n|n] 和状态估计值 x^[n|n]

    • 'delayed' - 仅使用截至 y[n1] 的测量值,计算输出估计值 y^[n|n1] 和状态估计值 x^[n|n1]。延迟估计器更易于在控制环内部实现。

    有关 kalman 如何计算当前估计值和延迟估计值的详细信息,请参阅离散时间估计

    输出参量

    全部折叠

    卡尔曼估计器或卡尔曼滤波器,以状态空间 (ss) 模型形式返回。生成的估计器具有输入 [u;y] 和输出 [y^;x^]。换句话说,kalmf 接受被控对象输入 u 和含噪被控对象输出 y 作为输入,并生成估计的无噪声被控对象输出 y^ 和估计的状态值 x^ 作为输出。

    Diagram showing Kalman filter with inputs u and y and outputs y-hat and x-hat.

    kalman 会自动设置 kalmfInputNameOutputNameInputGroupOutputGroup 属性来帮助您跟踪哪些输入和输出对应哪些信号。

    有关 kalmf 的状态方程和输出方程,请参阅连续时间估计离散时间估计

    滤波器增益,以大小为 Nx×Ny 的数组形式返回,其中 Nx 是被控对象中的状态数,Ny 是被控对象输出数。在连续时间中,卡尔曼滤波器的状态方程为:

    x^˙=Ax^+Bu+L(yCx^Du).

    在离散时间中,状态方程为:

    x^[n+1|n]=Ax^[n|n1]+Bu[n]+L(y[n]Cx^[n|n1]Du[n]).

    有关这些表达式以及如何计算 L 的详细信息,请参阅连续时间估计离散时间估计

    稳态误差协方差,以 Nx×Nx 形式返回,其中 Nx 是被控对象中的状态数。卡尔曼滤波器计算使 P 最小化的状态估计值。在连续时间中,稳态误差协方差由下式给出:

    P=limtE({xx^}{xx^}T).

    在离散时间中,稳态误差协方差由下式给出:

    P=limnE({x[n]x^[n|n1]}{x[n]x^[n|n1]}T),Z=limnE({x[n]x^[n|n]}{x[n]x^[n|n]}T).

    有关这些量以及 kalman 如何使用它们的详细信息,请参阅连续时间估计离散时间估计

    离散时间系统的状态估计器的新信息增益,以数组形式返回。

    仅当 type = 'current'(这是离散时间系统的默认估计器)时,MxMy 才相关。对于连续时间 systype = 'delayed',则 Mx = My = []

    对于 'current' 类型估计器,MxMy 是更新方程中的新信息增益:

    x^[n|n]=x^[n|n1]+Mx(y[n]Cx^[n|n1]Du[n])

    y^[n|n]=Cx^[n|n1]+Du[n]+My(y[n]Cx^[n|n1]Du[n])

    当噪声输入 w 到被控对象输出 y 没有直接馈通时(即,当 H = 0 时,参见离散时间估计),则 My=CMx,输出估计值简化为 y^[n|n]=Cx^[n|n]+Du[n]

    数组 MxMy 的维度取决于 sys 的维度,如下所述。

    • Mx - Nx×Ny,其中 Nx 是被控对象中的状态数,Ny 是输出数。

    • My - Ny×Ny.

    有关 kalman 如何获得 MxMy 的详细信息,请参阅离散时间估计

    限制

    被控对象和噪声数据必须满足:

    • (C,A) 可检测到,其中:

    • R¯>0[Q¯N¯;N¯R¯]0,其中

      [Q¯N¯N¯R¯]=[G0HI][QNNR][G0HI].

    • (AN¯R¯1C,Q¯N¯R¯1N¯T) 在连续时间的虚轴上或离散时间的单位圆上没有不可控模式。

    算法

    全部折叠

    版本历史记录

    在 R2006a 之前推出