Main Content

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 で外部関数として処理される plotfigure が含まれるため、Visualizing ブロックからは C コードを生成できません。詳細については、生成コードでの MATLAB エンジンを使用した関数呼び出しの実行 (MATLAB Coder)を参照してください。ただし、Tracking ブロックの C コードは生成できます。Tracking ブロックの C コードを生成するには、ブロックを右クリックし、[C/C++ コード][このサブシステムをビルド] をクリックします。

制限

  • このモデルのシミュレーション時間は位置データ配列のサイズと一致する必要があります。入力データ サイズが変化した場合、シミュレーション時間を手動で調整する必要があります。

  • このモデルでは移動する点の位置の推定のみ実行できます。より高度な動き推定機能については、Computer Vision Toolboxの使用を検討してください。

  • MATLAB Function ブロックの関数は、その関数を定義するブロックや他の MATLAB Function ブロックのコードなど、他の場所で呼び出すことはできません。たとえば、MATLAB Function ブロックの関数が foo という名前で、その本文に関数 foo の呼び出しが含まれている場合、ブロック関数でそれ自体の再帰呼び出しは行われません。代わりに、現在のフォルダーまたはパス上にある foo.m が検索され、その呼び出しが試行されます。

関連する例

詳細