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.persistentobj;ifisempty(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 ファイルを生成します。

    codegenukfcodegen-args{1}

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

    メモ

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

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

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

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

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

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

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

      loadmeasured_data.matoutput

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

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

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

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

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

参考

||

関連するトピック