Main Content

MATLAB でのオンライン状態推定のコードの生成

オンライン状態推定のための extendedKalmanFilterunscentedKalmanFilter および particleFilter オブジェクトを使用する MATLAB® コードから C/C++ コードを生成できます。C/C++ コードは MATLAB Coder™ ソフトウェアの codegen (MATLAB Coder) コマンドを使用して生成されます。生成されたコードを使用して、オンライン推定アルゴリズムを組み込みターゲットに展開します。MATLAB Compiler™ ソフトウェアを使用してスタンドアロン アプリケーションを作成し、オンライン推定コードを展開することもできます。

オンライン状態推定のための C/C++ コードを生成するには、以下の手順に従います。

  1. 関数を作成し、フィルター オブジェクトを永続として宣言して、オブジェクトを初期化します。オブジェクトを永続として定義して、呼び出し間でオブジェクトの状態を維持します。

    function [CorrectedX] = ukfcodegen(output)
    % Declare object as persistent.
    persistent obj;
    if isempty(obj)
    % Initialize the object.
    obj = unscentedKalmanFilter(@vdpStateFcn,@vdpMeasurementFcn,[2;0]);
    obj.MeasurementNoise = 0.01;
    end
    % Estimate the states.
    CorrectedX = correct(obj,output);
    predict(obj);
    end

    この関数により、2 つの状態と 1 つの出力をもつファン デル ポール振動子のオンライン状態推定のためのアンセンテッド カルマン フィルター オブジェクトが作成されます。以前作成して保存した状態遷移関数と測定関数 vdpStateFcn.m および vdpMeasurementFcn.m を使用して、2 つの状態の初期状態値を [2;0] と指定します。ここでは output は測定出力データです。関数 ukfcodegen.m を MATLAB パスに保存します。あるいは、この関数の絶対パス名を指定できます。

    関数 ukfcodegen.m では、永続オブジェクトは条件 if isempty(obj) によって初期化され、関数がはじめて呼び出されるときにオブジェクトが必ず一度だけ初期化されるようにします。その関数のその後の呼び出しによって実行されるのは、状態推定を更新するための predict および correct コマンドだけです。初期化中に、StateTransitionFcn (ukfcodegen.mvdpStateFcn.m として指定) および MeasurementFcn (ukfcodegen.mvdpMeasurementFcn.m として指定) などのオブジェクトの調整不可能なプロパティを指定します。その後、調整可能なプロパティのみを指定できます。詳細については、調整可能なオブジェクト プロパティと調整不可能なオブジェクト プロパティを参照してください。

    状態遷移関数と測定関数では、コード生成でサポートされているコマンドのみを使用しなければなりません。これらのコマンドの一覧については、C/C++ コードの生成でサポートされている関数およびオブジェクト (MATLAB Coder)を参照してください。これらの関数にコンパイル命令 %#codegen を含め、この関数向けのコードを生成することを示します。この命令を追加することで、コード生成時にエラーになるような違反を MATLAB コード アナライザーで診断し修正しやすくします。たとえば、コマンド ラインで「vdpStateFcn.m」と入力します。

  2. MATLAB Coder ソフトウェアの codegen (MATLAB Coder) コマンドを使用して C/C++ コードおよび MEX ファイルを生成します。

    codegen ukfcodegen -args {1}

    構文 -args {1} は関数に対する引数の例を指定します。この引数により、関数の引数 output の次元とデータ型が倍精度スカラーと設定されます。

    メモ

    単精度浮動小数点変数をもつフィルターが必要である場合、オブジェクトの作成中に状態の初期値を単精度に指定しなければなりません。

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

    次に、コードを生成するには、次の構文を使用します。

    codegen ukfcodegen -args {{single(1)}
  3. 生成されたコードを使用します。

    • 生成された C/C++ コードを使用して、オンライン状態推定を組み込みターゲットに展開します。

    • コンパイルされた C/C++ コードを MATLAB でテストするために、生成された MEX ファイルを使用します。生成された MEX ファイルは、MATLAB で状態推定アルゴリズムのシミュレーションを高速化する際にも役立ちます。

      推定データを読み込みます。出力データが measured_data.mat ファイルに格納されていると仮定します。

      load measured_data.mat output
      

      生成された MEX ファイルを呼び出して、状態を推定します。

      for i = 1:numel(output)
          XCorrected = ukfcodegen_mex(output(i));
      end

    この例では、MEX ファイルをコンパイルするための C/C++ コードが生成されます。他のターゲットのためにコードを生成するには、MATLAB Coder ドキュメンテーションの codegen (MATLAB Coder) を参照してください。

調整可能なオブジェクト プロパティと調整不可能なオブジェクト プロパティ

プロパティ タイプ拡張カルマン フィルター オブジェクトアンセンテッド カルマン フィルター オブジェクト粒子フィルター オブジェクト
オブジェクトの作成中またはその後のドット表記の使用時のいずれかで複数回指定できる調整可能なプロパティStateStateCovarianceProcessNoise、および MeasurementNoiseStateStateCovarianceProcessNoiseMeasurementNoiseAlphaBeta、および Kappa Particles および Weights
オブジェクトの作成中またはその後のドット表記の使用時に、predict または correct コマンドを使用する前に、一度だけ指定できる調整不可能なプロパティStateTransitionFcnMeasurementFcnStateTransitionJacobianFcn、および MeasurementJacobianFcnStateTransitionFcn および MeasurementFcnStateTransitionFcnMeasurementLikelihoodFcnStateEstimationMethodStateOrientationResamplingPolicy および ResamplingMethod
オブジェクトの作成中に指定しなければならない調整不可能なプロパティHasAdditiveProcessNoise および HasAdditiveMeasurementNoiseHasAdditiveProcessNoise および HasAdditiveMeasurementNoise 

参考

| |

関連するトピック