Main Content

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 を作成し、w が sys への最後の Nw 入力で構成されるようにします。"真" のプラント出力 yt は、sys のすべての出力で構成されています。ノイズの共分散データ QR および 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 コマンドは、確率的入力 w になる sys の残りの入力を取ります。

    [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 を使用するには、ノイズ w の入力をもつモデル sys を指定しなければなりません。したがって、Plant は入力 un = u + w を取るため、sysPlant とは同じにはなりません。ノイズ入力の加算結合を作成して、sys を作成できます。

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

    同様に、sys = Plant*[1 1] を使用できます。

    ノイズ共分散を指定します。プラントには 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 は、2 つの入力と 4 つの出力をもつ状態空間モデルです。kalmf は、入力としてプラント入力信号 "u" とノイズを含むプラント出力 y=yt+v を取ります。最初の出力は、推定された真のプラント出力 yˆ です。残りの 3 つの出力は、状態推定値 xˆ です。kalmf の入力名と出力名を調べて、kalman でそれらに適宜ラベル付けされていることを確認します。

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

    カルマン ゲイン L を調べます。3 つの状態をもつ SISO プラントの場合、L は 3 要素の列ベクトルになります。

    L
    L = 3×1
    
        0.3586
        0.3798
        0.0817
    
    

    kalmf を使用してノイズによる測定誤差を削減する方法を示す例については、カルマン フィルター処理を参照してください。

    3 つの入力をもち、その中の 1 つがプロセス ノイズ "w"、2 つが測定出力を表すプラントについて考えます。プラントには次の 4 つの状態があります。

    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'};

    プラントに 1 つのプロセス ノイズ入力のみがあるため、共分散 "Q" はスカラーになります。この例では、プロセス ノイズに単位共分散があるものと仮定します。

    Q = 1;

    kalman は、Q の次元を使用して、既知入力はどれで、ノイズ入力はどれかを判別します。スカラー Q の場合、他に指定しない限り、kalman は 1 つがノイズ入力と仮定し、最後の入力を使用します (非測定出力をもつプラントを参照)。

    2 つの出力の測定ノイズについては、2 行 2 列のノイズ共分散行列を指定します。この例では、最初の出力に単位分散を使用し、2 番目の出力に 1.3 の分散を使用します。非対角要素値を 0 に設定して、2 つのノイズ チャネルが無相関であることを示します。

    R = [1 0;
         0 1.3];

    カルマン フィルターを設計します。

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

    入力と出力を調べます。kalman は、kalmf の入力と出力が表す内容を追跡するのに役立つ、kalmfInputName プロパティ、OutputName プロパティ、InputGroup プロパティ、および OutputGroup プロパティを使用します。

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

    したがって、2 つの既知入力 u1 および u2kalmf の最初の 2 つの入力で、2 つの測定出力 y1 および y2kalmf への最後の 2 つの入力です。kalmf の出力では、最初の 2 つが推定出力で、残りの 4 つが状態推定です。カルマン フィルターを使用するには、カルマン フィルター処理で SISO プラントについて説明されている方法と類似の方法で、これらの入力をプラントとノイズ信号に接続します。

    4 つの入力と 2 つの出力をもつプラントについて考えます。最初の入力と 3 番目の入力は既知ですが、2 番目と 4 番目の入力はプロセス ノイズを表します。プラントには 2 つの出力もありますが、2 番目の出力のみ測定されます。

    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 = 3x1 cell
        {'u1'}
        {'u2'}
        {'ym'}
    
    

    kalmf は、入力として sys の 2 つの既知入力および 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 入力引数を使用しない場合、kalmanQ のサイズを使用して、ノイズ入力である sys の入力を判別します。この例では、kalman は最後の Nw = size(Q,1) 入力をノイズ入力として扱います。ノイズ入力 wsys の最後の入力でない場合、known 入力引数を使用して既知のプラント入力を指定できます。kalman では、残りの入力を確率的として扱います。

    プラント行列のプロパティに対する追加の制約については、制限を参照してください。

    プロセス ノイズ共分散。スカラーまたは Nw 行 Nw 列の行列として指定します。ここで Nw はプラントのノイズ入力の数です。kalmanQ のサイズを使用して、ノイズ入力である sys の入力を判別し、known 入力引数で他に指定しない限り、ノイズである最後の Nw = size(Q,1) 入力を取ります。

    kalman は、プロセス ノイズ w が共分散 Q = E(wwT) をもつガウス ノイズであると仮定します。プラントに 1 つのプロセス ノイズ入力のみがある場合、Q は w の分散と等しいスカラーになります。プラントに複数の無相関のノイズ入力がある場合、Q は対角行列になります。実際には、測定を行うか、システムのノイズ プロパティについての、経験や知識に基づく推測によって、Q の適切な値を特定します。

    測定ノイズ共分散。スカラーまたは Ny 行 Ny 列の行列として指定します。ここで Ny はプラント出力の数です。kalman は、測定ノイズ v が共分散 R = E(vvT) をもつホワイト ノイズであると仮定します。プラントに 1 つの出力チャネルのみがある場合、R は v の分散と等しいスカラーになります。プラントに、無相関の測定ノイズをもつ複数の出力チャネルがある場合、R は対角行列になります。実際には、測定を行うか、システムのノイズ プロパティについての、経験や知識に基づく推測によって、R の適切な値を特定します。

    測定ノイズ共分散に対する追加の制約については、制限を参照してください。

    ノイズ相互共分散。スカラーまたは Nw 行 Ny 列の行列として指定します。kalman は、プロセス ノイズ w と測定ノイズ v が N = E(wvT) を満たすことを前提としています。2 つのノイズ源が相関しない場合は、N を省略できます。これは N = 0 と設定するのと同じです。実際には、測定を行うか、システムのノイズ プロパティについての、経験や知識に基づく推測によって、N の適切な値を特定します。

    sys の測定された出力。測定される sys の出力を特定するインデックスのベクトルとして指定します。たとえば、システムに 3 つの出力があっても、測定されるのは、sys の最初と 3 番目の出力にあたる 2 つの出力であるとします。この場合は、sensors = [1 3] と設定します。

    sys の既知入力。既知 (確定的) の入力を特定するインデックスのベクトルとして指定します。たとえば、システムに 3 つの入力があっても、既知となるのは最初と 2 番目の入力のみです。この場合は、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 では、kalmfInputNameOutputNameInputGroup、および OutputGroup プロパティが自動的に設定されるため、どの信号にどの入力と出力が対応するのか追跡できます。

    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 でのそれらの使用方法の詳細については、連続時間の推定および離散時間の推定を参照してください。

    離散時間システムの状態推定器のイノベーション ゲイン。配列として返されます。

    Mx および My は、type = 'current' の場合にのみ関連します。これは離散時間システムの既定の推定器です。連続時間 sys または type = 'delayed' の場合、Mx = My = [] となります。

    'current' タイプの推定器の場合、Mx および My は、更新の式におけるイノベーション ゲインです。

    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] に単純化されます。

    配列 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][QNNR][G0HI].

    • (AN¯R¯1C,Q¯N¯R¯1N¯T) は、連続時間の場合は虚軸または離散時間の場合は単位円に非可制御モードがありません。

    アルゴリズム

    すべて折りたたむ

    連続時間の推定

    既知入力 u、プロセス ノイズ w、および測定ノイズ v をもつ連続時間プラントについて考えます。

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

    ノイズ信号 w および v は次を満たします。

    E(w)=E(v)=0,E(wwT)=Q,E(vvT)=R,E(wvT)=N

    カルマン フィルター、つまりカルマン推定器は、定常偏差の共分散を最小化する状態推定値 x^(t) を計算します。

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

    カルマン フィルターは、次の状態方程式と出力方程式をもっています。

    dx^dt=Ax^+Bu+L(yCx^Du)[y^x^]=[CI]x^+[D0]u

    フィルター ゲイン L を取得するために、kalman は代数リカッチ方程式を解きます。

    L=(PCT+N¯)R¯1

    ここで、

    R¯=R+HN+NTHT+HQHTN¯=G(QHT+N)

    P は対応する代数リカッチ方程式を解きます。

    推定器は既知の入力 u と測定値 y を使用して、出力と状態の推定 y^ および x^ を生成します。

    離散時間の推定

    離散プラントは、次のように求められます。

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

    離散時間の場合、ノイズ信号 w および v は次を満たします。

    E(w[n]w[n]T)=Q,E(v[n]v[n]T)=R,E(w[n]v[n]T)=N

    離散時間推定器は、次の状態方程式をもっています。

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

    kalman は離散リカッチ方程式を解いて、ゲイン行列 L を取得します。

    L=(APCT+N¯)(CPCT+R¯)1

    ここで、

    R¯=R+HN+NTHT+HQHTN¯=G(QHT+N)

    kalman は離散時間のカルマン推定器の 2 つのバリアント、現在の推定器 (type = 'current') と遅延推定器 (type = 'delayed') を計算できます。

    • 現在の推定器 — y[n] までの使用可能なすべての測定値を使用して、出力推定 y^[n|n] および状態推定 x^[n|n] を生成します。この推定器は、次の出力方程式をもっています。

      [y^[n|n]x^[n|n]]=[(IMy)CIMxC]x^[n|n1]+[(IMy)DMyMxDMx][u[n]y[n]].

      ここで、イノベーション ゲイン Mx および My は次のように定義されます。

      Mx=PCT(CPCT+R¯)1,My=(CPCT+HQHT+HN)(CPCT+R¯)1.

      したがって、Mx は、新しい測定値 y[n] を使用して状態推定 x^[n|n1] を更新します。

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

      同様に、My は更新された出力推定を計算します。

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

      H = 0 の場合、My=CMx となり、出力推定は y^[n|n]=Cx^[n|n]+Du[n] に単純化されます。

    • 遅延推定器 — yv[n–1] までの測定値のみを使用して、出力推定 y^[n|n1] と状態推定 x^[n|n1] を生成します。この推定器は次の出力方程式をもっています。

      [y^[n|n1]x^[n|n1]]=[CI]x^[n|n1]+[D000][u[n]y[n]]

      遅延推定器は制御ループ内で展開する方が簡単です。

    バージョン履歴

    R2006a より前に導入