MATLAB Function ブロックでの MATLAB 関数ファイルの呼び出し
このモデル例では、MATLAB Functionブロックを使用してパス上の MATLAB® 関数ファイルを呼び出すことにより、移動するオブジェクトの位置を推定します。次に、別の MATLAB Function ブロックによって、モデルはオブジェクトの実際の位置に対して、この予測データをプロットします。その後、この例で MATLAB 関数ファイルを呼び出す MATLAB Function ブロックからコードを生成できます。
モデルのシミュレーション
モデルは MAT ファイルに格納されているオブジェクトの位置データを取り、追跡アルゴリズムを使用してデータを実行します。Tracking
というラベルが付いた MATLAB Function ブロックは、個別の MATLAB 関数ファイル ex_kalman_f.m
を呼び出して追跡アルゴリズムを実行します。モデルで、Tracking
ブロックをダブルクリックし、ex_kalman_f.m
を呼び出すコードを確認します。
function y = kalman(u) y = ex_kalman_f(u); end
ex_kalman_f.m
を開いてアルゴリズムを表示します。ex_kalman_f.m
はカルマン フィルター アルゴリズムを使用してオブジェクトの位置を追跡します。アルゴリズムは 2 つの永続変数を使用します。x_est
はタイム ステップ間の状態を格納し、p_ext
は共分散を格納します。アルゴリズムはこれらの永続変数を使用してタイム ステップごとにオブジェクトの推定された位置を出力 y
として計算します。
function y = ex_kalman_f(z) %#codegen
% Initialize state transition matrix dt = 1; A = [ 1 0 dt 0 0 0;... 0 1 0 dt 0 0;... 0 0 1 0 dt 0;... 0 0 0 1 0 dt;... 0 0 0 0 1 0 ;... 0 0 0 0 0 1 ];
% Measurement matrix
H = [ 1 0 0 0 0 0; 0 1 0 0 0 0 ];
Q = eye(6);
R = 1000 * eye(2);
% Initial conditions persistent x_est p_est if isempty(x_est) x_est = zeros(6, 1); p_est = zeros(6, 6); end % Predicted state and covariance x_prd = A * x_est; p_prd = A * p_est * A' + Q;
% Estimation
S = H * p_prd' * H' + R;
B = H * p_prd';
klm_gain = (S \ B)';
% Estimated state and covariance
x_est = x_prd + klm_gain * (z - H * x_prd);
p_est = p_prd - klm_gain * H * p_prd;
% Compute the estimated measurements y = H * x_est; end
MATLAB Function ブロック コード、およびブロックが呼び出す関数ファイルはコード生成でサポートされていなければなりません。MATLAB Function ブロックとは異なり、MATLAB Function ブロックで呼び出される MATLAB ファイルには、コード生成時にエラーになるようなコード違反を見つけるために、%#codegen
命令が必要です。この例では、ex_kalman_f.m
に違反はありません。
Simulink® がオブジェクトの推定された位置を計算した後、Visualizing
ブロックは MATLAB 関数 plot
を使用してオブジェクトの実際の位置と推定された位置をプロットします。
function plot_me(y,z)
persistent h if isempty(h) h = figure; hold; end
N = size(z,2); title("Trajectory of object [blue] its Kalman estimate[green]"); xlabel("horizontal position"); ylabel("vertical position");
for i = 1:N plot(y(1,i), y(2,i), "bx-"); plot(z(1,i), z(2,i), "go-"); axis([-1.1, 1.1, -1.1, 1.1]); pause(0.02); end end
モデルを実行し、シミュレーション中のデータを監視します。
C コードの生成
Embedded Coder® または Simulink Coder™ のライセンスがある場合は、外部関数を含まない MATLAB Function ブロックから C コードを生成できます。この例では、MATLAB で外部関数として処理される plot
と figure
が含まれるため、Visualizing
ブロックからは C コードを生成できません。詳細については、生成コードでの MATLAB エンジンを使用した関数呼び出しの実行 (MATLAB Coder)を参照してください。ただし、Tracking
ブロックの C コードは生成できます。Tracking
ブロックの C コードを生成するには、ブロックを右クリックし、[C/C++ コード]、[このサブシステムをビルド] をクリックします。
制限
このモデルのシミュレーション時間は位置データ配列のサイズと一致する必要があります。入力データ サイズが変化した場合、シミュレーション時間を手動で調整する必要があります。
このモデルでは移動する点の位置の推定のみ実行できます。より高度な動き推定機能については、Computer Vision Toolboxの使用を検討してください。
MATLAB Function ブロックの関数は、その関数を定義するブロックや他の MATLAB Function ブロックのコードなど、他の場所で呼び出すことはできません。たとえば、MATLAB Function ブロックの関数が
foo
という名前で、その本文に関数foo
の呼び出しが含まれている場合、ブロック関数でそれ自体の再帰呼び出しは行われません。代わりに、現在のフォルダーまたはパス上にあるfoo.m
が検索され、その呼び出しが試行されます。
関連する例
- MATLAB Function ブロックを含むマスク ライブラリ サブシステムを使用したシミュレーションの実行とコードの生成
- MATLAB Function ブロックを使用したらせん状の銀河形成シミュレーション