主要内容

kalman

R2026b

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

    描述

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

    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,使得 w 由 sys 的最后 Nw 个输入组成。“真实”被控对象输出 yt 由 sys 的所有输出组成。您还需要提供噪声协方差数据 Q、R 和 N。返回的卡尔曼滤波器 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 指定哪些输入是已知的(确定性的)。这些已知输入构成 u。kalman 命令将 sys 的其余输入视为随机输入 w。

    示例

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

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

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

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

    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 作为独立输入。因此,sys 与 Plant 不同,因为 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 的维度来确定哪些输入是已知输入,哪些是噪声输入。对于标量 Q,kalman 假设只有一个噪声输入,且使用最后一个输入,除非您另行指定(参见具有未测量输出的被控对象)。

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

    R = [1 0;
         0 1.3];

    设计卡尔曼滤波器。

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

    检查输入和输出。kalman 使用 kalmf 的 InputName、OutputName、InputGroup 和 OutputGroup 属性来帮助您跟踪 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'}
    
    

    因此,两个已知输入 u1 和 u2 是 kalmf 的前两个输入,两个测量输出 y1 和 y2 是 kalmf 的最后两个输入。对于 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 为此系统设计滤波器,请使用 known 和 sensors 输入参量来指定被控对象的哪些输入是已知的,哪些输出被测量。

    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,[B G],C,[D H]

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

    x˙=Ax+Bu+Gw  y=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[n−1] 的测量值,计算输出估计值 y^[n|n−1] 和状态估计值 x^[n|n−1]。延迟估计器更易于在控制环内部实现。

    有关 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 会自动设置 kalmf 的 InputName、OutputName、InputGroup 和 OutputGroup 属性来帮助您跟踪哪些输入和输出对应哪些信号。

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

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

    x^˙=Ax^+Bu+L(y−Cx^−Du).

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

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

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

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

    P=limt→∞E({x−x^}{x−x^}T).

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

    P=limn→∞E({x[n]−x^[n|n−1]}{x[n]−x^[n|n−1]}T),Z=limn→∞E({x[n]−x^[n|n]}{x[n]−x^[n|n]}T).

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

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

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

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

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

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

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

    数组 Mx 和 My 的维度取决于 sys 的维度,如下所述。

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

    • My - Ny×Ny.

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

    限制

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

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

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

      [Q¯N¯N¯′R¯]=[G0HI][QNN′R][G0HI]′.

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

    算法

    全部折叠

    版本历史记录

    在 R2006a 之前推出