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の使用を検討してください。

関連する例

詳細