MATLAB でのオンライン状態推定のコードの生成
オンライン状態推定のための extendedKalmanFilter
、unscentedKalmanFilter
および particleFilter
オブジェクトを使用する MATLAB® コードから C/C++ コードを生成できます。C/C++ コードは MATLAB Coder™ ソフトウェアの codegen
(MATLAB Coder) コマンドを使用して生成されます。生成されたコードを使用して、オンライン推定アルゴリズムを組み込みターゲットに展開します。MATLAB Compiler™ ソフトウェアを使用してスタンドアロン アプリケーションを作成し、オンライン推定コードを展開することもできます。
オンライン状態推定のための C/C++ コードを生成するには、以下の手順に従います。
関数を作成し、フィルター オブジェクトを永続として宣言して、オブジェクトを初期化します。オブジェクトを永続として定義して、呼び出し間でオブジェクトの状態を維持します。
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.m
でvdpStateFcn.m
として指定) およびMeasurementFcn
(ukfcodegen.m
でvdpMeasurementFcn.m
として指定) などのオブジェクトの調整不可能なプロパティを指定します。その後、調整可能なプロパティのみを指定できます。詳細については、調整可能なオブジェクト プロパティと調整不可能なオブジェクト プロパティを参照してください。状態遷移関数と測定関数では、コード生成でサポートされているコマンドのみを使用しなければなりません。これらのコマンドの一覧については、C/C++ コードの生成でサポートされている関数およびオブジェクト (MATLAB Coder)を参照してください。これらの関数にコンパイル命令
%#codegen
を含め、この関数向けのコードを生成することを示します。この命令を追加することで、コード生成時にエラーになるような違反を MATLAB コード アナライザーで診断し修正しやすくします。たとえば、コマンド ラインで「vdpStateFcn.m
」と入力します。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)}
生成されたコードを使用します。
生成された 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) を参照してください。
調整可能なオブジェクト プロパティと調整不可能なオブジェクト プロパティ
プロパティ タイプ | 拡張カルマン フィルター オブジェクト | アンセンテッド カルマン フィルター オブジェクト | 粒子フィルター オブジェクト |
---|---|---|---|
オブジェクトの作成中またはその後のドット表記の使用時のいずれかで複数回指定できる調整可能なプロパティ | State 、StateCovariance 、ProcessNoise 、および MeasurementNoise | State 、StateCovariance 、ProcessNoise 、MeasurementNoise 、Alpha 、Beta 、および Kappa | Particles および Weights |
オブジェクトの作成中またはその後のドット表記の使用時に、predict または correct コマンドを使用する前に、一度だけ指定できる調整不可能なプロパティ | StateTransitionFcn 、MeasurementFcn 、StateTransitionJacobianFcn 、および MeasurementJacobianFcn | StateTransitionFcn および MeasurementFcn | StateTransitionFcn 、MeasurementLikelihoodFcn 、StateEstimationMethod 、StateOrientation 、ResamplingPolicy および ResamplingMethod |
オブジェクトの作成中に指定しなければならない調整不可能なプロパティ | HasAdditiveProcessNoise および HasAdditiveMeasurementNoise | HasAdditiveProcessNoise および HasAdditiveMeasurementNoise |
参考
extendedKalmanFilter
| particleFilter
| unscentedKalmanFilter