最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

MATLAB コードを使用したオブジェクトの追跡

学習目的

このチュートリアルでは、以下の方法について説明します。

  • モデル化、シミュレーション、組み込みプロセッサへの配布のために MATLAB® 関数を Simulink® モデルに追加するには MATLAB Function ブロックを使用します。

    この機能は、Simulink のグラフィック言語よりは MATLAB のテキスト言語を使った方が記述しやすいアルゴリズムのコード作成に役立ちます。

  • MATLAB Function ブロックから MATLAB コードを呼び出すには、coder.extrinsic を使用します。

    この機能により、ラピッド プロトタイピングが可能になります。Simulink から既存の MATLAB コードを呼び出すことができ、このコードをコード生成に適したものにする必要はありません。

  • コードを生成する前に、既存の MATLAB コードがコード生成に適していることを確認します。

    コードを生成する前にコードを準備しなければなりません。

  • コードを生成するときに可変サイズの入力を指定します。

チュートリアルの必要条件

必要な知識

このチュートリアルを完了するためには、MATLAB ソフトウェアに関する基本的な知識が必要です。また、基本的な Simulink モデルを作成してシミュレーションする方法を理解していなければなりません。

必要な製品

このチュートリアルを実行するには、次の製品をインストールしなければなりません。

  • MATLAB

  • MATLAB Coder™

  • Simulink

  • Simulink Coder

  • C コンパイラ

サポートされているコンパイラのリストは、サポートされるコンパイラを参照してください。

C コードを生成する前に、C コンパイラを設定しなければなりません。C コンパイラの設定を参照してください。

MathWorks® 製品のインストール方法の詳細は、ご使用のプラットフォームに対応した MATLAB インストール ガイドを参照してください。MATLAB がインストールされている場合、その他にインストールされている MathWorks 製品を確認するには、MATLAB コマンド ウィンドウに「ver」と入力します。

例: カルマン フィルター

説明

この節では、このチュートリアルで使用する例について説明します。このチュートリアルを完了するために、アルゴリズムに習熟している必要はありません。

このチュートリアルの例では、過去の位置に基づく一連のノイズを含む入力から 2 次元空間に移動するオブジェクトの位置を推定するカルマン フィルターを使用します。位置ベクトルには、水平座標と垂直座標を示す xy の 2 つのコンポーネントがあります。

カルマン フィルターには、制御、信号および画像処理、レーダーおよびソナー、金融モデルなど、広範囲の用途があります。カルマン フィルターは、一連の不完全な測定やノイズを含む測定から線形動的システムの状態を推定する再帰フィルターです。カルマン フィルターのアルゴリズムはフィルターの状態空間表現に依存し、状態ベクトルに保存されている一連の変数を使用して、システムの動作を完全に特徴付けます。このアルゴリズムは、状態遷移行列とプロセス ノイズの推定を使用して、線形かつ再帰的に状態ベクトルを更新します。

アルゴリズム

この節では、このチュートリアルで提供される MATLAB バージョンのフィルターで実装されているカルマン フィルターのアルゴリズムを説明します。

このアルゴリズムは、カルマン フィルターの状態推定器を使用し、過去の位置に基づいて移動するオブジェクトの位置を予測します。このアルゴリズムは、移動するオブジェクトの位置 (x と y)、速度 (Vx と Vy)、および加速度 (Ax と Ay) を含むカルマン状態ベクトルを更新して、現在の位置を推定します。カルマン状態ベクトル x_est は永続変数です。

% Initial conditions
persistent x_est p_est
if isempty(x_est)
    x_est = zeros(6, 1);
    p_est = zeros(6, 6);
end
x_est は、空の 6x1 列ベクトルに初期化され、フィルターを使用するたびに更新されます。

カルマン フィルターは運動の法則を使用して、新しい状態を推定します。

X=X0+Vx.dtY=Y0+Vy.dtVx=Vx0+Ax.dtVy=Vy0+Ay.dt

これらの運動の法則は、状態遷移マトリックス A で取得されます。これは、xyVxVyAx および Ay の係数値を含む行列です。

% 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 ];

フィルター処理

フィルター処理には次の 2 つの段階があります。

  • 予測される状態と共分散

    カルマン フィルターは以前に推定した状態 x_est を使用して、現在の状態 x_prd を予測します。予測された状態と共分散は次のように計算されます。

    % Predicted state and covariance
    x_prd = A * x_est;
    p_prd = A * p_est * A' + Q; 

  • 推定

    このフィルターは現在の測定 z および予測された状態 x_prd を使用して、現在の状態のより正確な近似を推定します。推定された状態と共分散は次のように計算されます。

    % Measurement matrix
    H = [ 1 0 0 0 0 0; 0 1 0 0 0 0 ];
    Q = eye(6);
    R = 1000 * eye(2);
    % 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;

参考文献

Haykin, Simon. Adaptive Filter Theory.Upper Saddle River, NJ: Prentice-Hall, Inc., 1996.

チュートリアルのファイル

チュートリアル ファイルについて

チュートリアルでは、以下のファイルを使用します。

  • チュートリアルの各ステップの Simulink モデル ファイル。

  • チュートリアルの各ステップの MATLAB コード ファイルの例。

    このチュートリアル全体を通して、カルマン フィルター アルゴリズムを含む MATLAB ファイルを呼び出す Simulink モデルを操作します。

  • 入力データの例を含む MAT ファイル。

  • プロット用の MATLAB ファイル。

ファイルの位置

チュートリアルのファイルは次のフォルダーにあります。docroot\toolbox\simulink\examples\kalman。チュートリアルを実行するには、これらのファイルをローカル フォルダーにコピーしなければなりません。詳細は、ファイルの局所的なコピーを参照してください。

ファイルの名前と説明

タイプ名前説明
MATLAB 関数ファイルex_kalman01スカラー カルマン フィルターのベースライン MATLAB 実装。
ex_kalman02コード生成に適したオリジナル アルゴリズムのバージョン。
ex_kalman03コード生成およびフレーム ベースとパケット ベースの入力による使用に適したカルマン フィルターのバージョン。
ex_kalman04コード生成のためにインライン化を無効にする。
Simulink モデル ファイルex_kalman00MATLAB Function ブロックのない Simulink モデル。
ex_kalman11スカラー カルマン フィルターの MATLAB Function ブロックをもつ完全な Simulink モデル。
ex_kalman22固定サイズ (フレーム ベース) の入力を受け入れるカルマン フィルターの MATLAB Function ブロックをもつ Simulink モデル。
ex_kalman33可変サイズ (パケット ベース) の入力を受け入れるカルマン フィルターの MATLAB Function ブロックをもつ Simulink モデル。
ex_kalman44インライン化を無効にした ex_kalman04.m を呼び出す Simulink モデル。
MATLAB データ ファイルpositionアルゴリズムで使用される入力データを含む。
プロット ファイルplot_trajectoryオブジェクトの軌跡およびカルマン フィルターの推定位置をプロット。

チュートリアルのステップ

ファイルの局所的なコピー

次の手順に従って、チュートリアル ファイルをローカルの作業フォルダーにコピーします。

  1. たとえば c:\simulink\kalman\solutions のようなローカル solutions フォルダーを作成します。

  2. docroot\toolbox\simulink\examples フォルダーに変更します。MATLAB コマンド ラインで以下のように入力します。

    cd(fullfile(docroot, 'toolbox', 'simulink', 'examples')) 

  3. solutions フォルダーの絶対パス名を指定して、kalman サブフォルダーの内容をローカルの solutions フォルダーにコピーします。

    copyfile('kalman', 'solutions')

    以下に例を示します。

    copyfile('kalman', 'c:\simulink\kalman\solutions')

    これで solutions フォルダーには、チュートリアルの解の完全セットが含まれます。このチュートリアルの各タスクのステップを実行しない場合は、解を表示して、コードの外観を確認できます。

  4. たとえば c:\simulink\kalman\work のようなローカル work フォルダーを作成します。

  5. 以下のファイルを solutions フォルダーから work フォルダーにコピーします。

    • ex_kalman01

    • ex_kalman00

    • position

    • plot_trajectory

    これで work フォルダーにはチュートリアルの開始にあたり必要なすべてのファイルが含まれます。

C コンパイラの設定

MATLAB Function ブロックを構築するには、サポートされているコンパイラが必要です。MATLAB では既定のコンパイラとして 1 つのコンパイラが自動的に選択されます。システムに MATLAB でサポートされているコンパイラが複数インストールされている場合は、mex -setup コマンドを使用して既定のコンパイラを変更できます。既定のコンパイラの変更 (MATLAB)を参照してください。

ex_kalman00 モデルについて

まず、チュートリアルに付属する ex_kalman00 モデルを実行し、カルマン フィルターを使用して解決しようとしている問題を確認します。

  1. Simulink で ex_kalman00 モデルを開きます。

    1. MATLAB の現在のフォルダーを、このチュートリアルの作業ファイルを含むフォルダーに設定します。MATLAB コマンド ラインで以下のように入力します。

      cd work
      ここで、work はユーザーのファイルを含むフォルダーの絶対パス名です。

    2. MATLAB コマンド ラインで以下のように入力します。

      ex_kalman00

      このモデルは、MATLAB コードを Simulink に統合する方法を示す不完全なモデルです。完全なモデルは、ex_kalman11 で、これもこのチュートリアルに付属しています。

InitFcn モデルのコールバック関数-  このモデルでは、以下の操作にこのコールバック関数を使用します。

  • MAT ファイルから位置データを読み込む

  • Selector ブロックへの 2 番目の入力を提供する Index Generator ブロックで使用されるデータを設定する

このコールバックを表示するには、次の手順に従います。

  1. [モデル化] タブで、[モデル設定][モデル プロパティ] を選択します。

  2. [コールバック] タブを選択します。

  3. [モデルのコールバック] ペインで [InitFcn] を選択します。

    コールバックが表示されます。

    load position.mat;
    [R,C]=size(position);
    idx=(1:C)';
    t=idx-1;

ソース ブロック-  このモデルは 2 つの Source ブロックを使用して、位置データとスカラー インデックスを Selector ブロックに提供します。

Selector ブロック-  このモデルは入力信号の要素を選択する Selector ブロックを使用し、インデックス入力とその [インデックス オプション] 設定に基づいて出力信号を生成します。このブロックのコンフィギュレーションを変更することによって、さまざまなサイズの信号を生成できます。

Selector ブロックの設定を表示するには、Selector ブロックをダブルクリックして、関数ブロック パラメーターを表示します。

このモデルでは、[インデックス オプション] は、1 番目の端子では [すべて選択] で、2 番目の端子では [インデックス ベクトル (端子)] です。入力は 2 x 310 位置行列で、インデックス データは 1 から 310 までインクリメントするため、Selector ブロックはサンプル時間ごとに 1 つの 2x1 出力のみ出力します。

MATLAB Function ブロック-  このモデルでは、MATLAB Function ブロックを使用して、オブジェクトの軌跡とカルマン フィルターの推定位置をプロットします。この関数では以下の操作が行われます。

  • まず、関数 figurehold、および plot_trajectory を外部関数として宣言します。これらの MATLAB 可視化関数は、コード生成用にサポートされていないためです。サポートされていない MATLAB 関数を呼び出す場合、その関数を外部関数として呼び出さなければなりません。これにより、MATLAB でその関数を実行できますが、この関数のコードは生成されません。

  • Figure ウィンドウを作成し、シミュレーションの間保持します。それ以外の場合、サンプル時間ごとに新しい Figure ウィンドウが表示されます。

  • オブジェクトの軌跡およびカルマン フィルターの推定位置をプロットする関数 plot_trajectory を呼び出します。

シミュレーション終了時間-  フィルターへの入力は 310 要素を含むベクトルで、Simulink はゼロベースのインデックスを使用するため、シミュレーション終了時間は 309 になります。

MATLAB Function ブロックのモデルへの追加

モデルとコードを自分で変更するには、このセクションの演習を行ってください。演習を省略する場合は、solutions サブフォルダーの指定のモデル ex_kalman11 を開いて、変更されたモデルを表示してください。

このチュートリアルの目的上、チュートリアルに付属の ex_kalman00.mdl モデルに MATLAB Function ブロックを追加します。空の Simulink モデルから開始して独自のテスト ベンチを開発しなければなりません。

MATLAB Function ブロックの追加-  ex_kalman00 モデルに MATLAB Function ブロックを追加するには、次の手順に従います。

  1. Simulink で ex_kalman00 を開きます。

    ex_kalman00

  2. MATLAB Function ブロックをモデルに追加します。

    1. MATLAB コマンド ラインで「slLibraryBrowser」と入力して Simulink ライブラリ ブラウザーを開きます。

    2. Simulink ライブラリのリストから User-Defined Functions ライブラリを選択します。

    3. MATLAB Function ブロックをクリックして ex_kalman00 モデルにドラッグします。Place MATLAB Function Block here. という赤い注釈テキストのすぐ上にブロックを配置します。

    4. 赤い注釈テキストをモデルから削除します。

    5. 現在のフォルダーにモデルを ex_kalman11 として保存します。

       ベスト プラクティス - インクリメンタルなコード更新の保存

MATLAB Function ブロックからの MATLAB コードの呼び出し-   MATLAB Function ブロックから MATLAB コードを呼び出すには、次の手順に従います。

  1. MATLAB Function ブロックをダブルクリックして MATLAB Function ブロック エディターを開きます。

  2. エディターに表示された既定のコードを削除します。

  3. 次のコードを MATLAB Function ブロックにコピーします。

    function y = kalman(u)
    %#codegen
    
    y = ex_kalman01(u);

  4. モデルを保存します。

MATLAB Function ブロックの入力と出力の接続

  1. モデルが次のようになるように、MATLAB Function ブロックの入力と出力を接続します。

  2. モデルを保存します。

ex_kalman11 モデルのシミュレーション

モデルをシミュレートするには、次の手順に従います。

  1. Simulink モデル ウィンドウで [実行] をクリックします。

    Simulink でモデルを実行するときに、オブジェクトの軌跡は青で、カルマン フィルターの推定位置は緑でプロットされます。最初は、短時間でオブジェクトの推定位置が実際の位置に収束します。次に 3 回、急な位置のシフトが起きます。それぞれの回にカルマン フィルターが再調整して、数回の反復後にオブジェクトを追跡します。

  2. シミュレーションが停止します。

MATLAB アルゴリズムが Simulink で機能することが実証されました。これで、フィルターを変更して、固定サイズの入力を受け入れるで説明されているとおりに、フィルターを変更して、固定サイズの入力を受け入れる準備ができました。

フィルターを変更して、固定サイズの入力を受け入れる

このチュートリアルで、これまで操作してきたフィルターは、一度に 1 つの入力を受け入れる単純なバッチ処理を使用しているため、入力するたびに繰り返し関数を呼び出さなければなりません。チュートリアルのこの部分では、アルゴリズムをフレーム ベースの処理に適したものにする固定サイズの入力を受け入れるようにアルゴリズムを変更する方法を学びます。次に、入力を固定サイズのフレームのデータとして提供し、データを一度に 1 フレームずつ渡すフィルターを呼び出すようにモデルを変更します。

MATLAB コードの変更-  コードを自分で変更するには、このセクションの演習を行ってください。演習を省略する場合は、solutions サブフォルダーの指定のファイル ex_kalman03.m を開いて、変更されたアルゴリズムを表示してください。

ここで、1 つを超える入力を含むベクトルを処理するようにアルゴリズムを変更できます。ベクトルの長さを調べ、ベクトル内の各要素のフィルター コードを順番に呼び出さなくてはなりません。これは、for ループでフィルター アルゴリズムを呼び出すことによって行います。

  1. MATLAB エディターで ex_kalman02.m を開きます。MATLAB コマンド ラインで以下のように入力します。

    edit ex_kalman02.m

  2. フィルター コードの周囲に for ループを追加します。

    1. コメントの前に、

      % Predicted state and covariance
      以下を挿入します。
      for i=1:size(z,2)

    2. コメントの後に、

      % Compute the estimated measurements
      y = H * x_est;
      以下を挿入します。
      end

    3. for ステートメントと end ステートメントの間のコードを選択し、右クリックしてコンテキスト メニューを開き、[スマート インデント] を選択して、コードにインデントを適用します。

    フィルター コードはこの時点で次のようになっているはずです。

    for i=1:size(z,2)
    	 % 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

  3. 状態推定値と共分散を計算する行を入力 zith 要素を使用するように変更します。

    変更する名前

    x_est = x_prd + klm_gain * (z - H * x_prd);
    これを次のように変更します。
    x_est = x_prd + klm_gain * (z(1:2,i) - H * x_prd);

  4. 推定計測値を計算する行を変更して、出力 yith 要素に結果を追加するようにします。

    変更する名前

    y = H * x_est;
    これを次のように変更します。
    y(:,i) = H * x_est;

    右上のコード アナライザーのメッセージ インジケーターがオレンジ色になり、コード アナライザーで警告が検出されたことを示します。コード アナライザーは、問題のあるコードにオレンジ色でアンダースコアを引き、右側にオレンジ色のマーカーを表示します。

  5. エラー情報を表示するには、ポインターをオレンジ色のマーカーに移動します。

    コード アナライザーは、y が添字を使用する前に完全に定義しなければならないことと、生成されたコードでインデックス付けして変数を増やすことができないことを検出します。

  6. この警告を解決するために、入力 z と同じサイズの出力 y にメモリを事前に割り当てます。for ループの前にこのコードを追加します。

     % Pre-allocate output signal:
     y=zeros(size(z));

    オレンジ色のマーカーが消え、コードの右上縁のコード アナライザー メッセージ インジケーターが緑色になります。これは、コード アナライザーで検出されたすべてのエラーと警告が修正されたことを意味します。

     出力をあらかじめ割り当てる理由

  7. 関数名を ex_kalman03 に変更し、現在のフォルダーにファイルを ex_kalman03.m として保存します。

 ex_kalman03.m の内容

チュートリアルの次のタスク、更新されたアルゴリズムを呼び出すためのモデルの変更を開始する準備ができました。

更新されたアルゴリズムを呼び出すためのモデルの変更-  モデルを自分で変更するには、このセクションの演習を行ってください。演習を省略する場合は、solutions サブフォルダーの指定のモデル ex_kalman22.mdl を開いて、変更されたモデルを表示してください。

次に、入力を固定サイズのフレームのデータとして提供し、データを一度に 1 フレームずつ渡す ex_kalman03 を呼び出すようにモデルを更新します。

  1. Simulink で ex_kalman11 モデルを開きます。

    ex_kalman11

  2. MATLAB Function ブロックをダブルクリックして MATLAB Function ブロック エディターを開きます。

  3. ex_kalman02 を呼び出すコードを ex_kalman03 への呼び出しに置き換えます。

    function y = kalman(u)
    %#codegen
    
    y = ex_kalman03(u);

  4. エディターを閉じます。

  5. InitFcn コールバックを変更します。

    1. [モデル化] タブで、[モデル設定][モデル プロパティ] を選択します。

      [モデル プロパティ] ダイアログ ボックスが開きます。

    2. このダイアログ ボックスで、[コールバック] タブを選択します。

    3. [モデルのコールバック] ペインで [InitFcn] を選択します。

    4. 既存のコールバックを次のコールバックに置き換えます。

      load position.mat;
      [R,C]=size(position);
      FRAME_SIZE=5;
      idx=(1:FRAME_SIZE:C)';
      LEN=length(idx);
      t=(1:LEN)'-1;
      
      このコールバックはフレーム サイズを 5 に設定し、インデックスを 5 ずつ増加するように設定します。

    5. [適用] をクリックして [モデル プロパティ] ダイアログ ボックスを閉じます。

  6. Selector ブロックを、正しいインデックスを使用するように更新します。

    1. Selector ブロックをダブルクリックして、関数ブロック パラメーターを表示します。

      [関数ブロック パラメーター] ダイアログ ボックスが開きます。

    2. 2 番目の [インデックス オプション][開始インデックス (端子)] に設定します。

    3. 2 番目の入力の [出力サイズ]FRAME_SIZE に設定し、[適用] をクリックして、ダイアログ ボックスを閉じます。

    これで、[インデックス オプション] は、1 番目の端子では [すべて選択] で、2 番目の端子では [開始インデックス (端子)] になりました。インデックスは、サンプル時間ごとに 5 ずつインクリメントし、出力サイズは 5 となるため、Selector ブロックはサンプル時間ごとに 2x5 の出力を出力します。

  7. モデル シミュレーション終了時間を 61 に変更します。これで、フレーム サイズは 5 になるため、シミュレーションは 5 番目のサンプル時間で終了します。

    1. Simulink モデル ウィンドウの [モデル化] タブで、[モデル設定] をクリックします。

    2. [コンフィギュレーション パラメーター] ダイアログ ボックスの左のペインで、[ソルバー] を選択します。

    3. 右側のペインで、[終了時間] を [61] に設定します。

    4. [適用] をクリックしてダイアログ ボックスを閉じます。

  8. モデルを ex_kalman22.mdl という名前で保存します。

変更したアルゴリズムのテスト-  モデルをシミュレートするには、次の手順に従います。

  1. Simulink モデル ウィンドウで [実行] をクリックします。

    Simulink でモデルを実行するときに、以前にバッチ フィルターを使用したときと同じようにオブジェクトの軌跡は青で、カルマン フィルターの推定位置は緑でプロットされます。

  2. シミュレーションが停止します。

アルゴリズムが固定サイズの信号を受け入れることが実証されました。これで、次のタスクフィルターを使用して可変サイズの入力を受け入れるに進む準備ができました。

フィルターを使用して可変サイズの入力を受け入れる

チュートリアルのこの部分では、Simulink モデルで可変サイズのデータを指定する方法を学習します。次に可変サイズの入力をもつカルマン フィルター アルゴリズムをテストして、このアルゴリズムが可変サイズのデータのパケットの処理に適していることを確認します。Simulink での可変サイズ データの使い方の詳細は、可変サイズの信号の基礎を参照してください。

可変サイズの入力を使用するようにモデルを更新する-  モデルを自分で変更するには、このセクションの演習を行ってください。演習を省略する場合は、solutions サブフォルダーの指定のモデル ex_kalman33.mdl を開いて、変更されたモデルを表示してください。

  1. Simulink で ex_kalman22.mdl を開きます。

    ex_kalman22

  2. InitFcn コールバックを変更します。

    1. [モデル化] タブで、[モデル設定][モデル プロパティ] を選択します。

      [モデル プロパティ] ダイアログ ボックスが開きます。

    2. [コールバック] タブを選択します。

    3. [モデルのコールバック] ペインで [InitFcn] を選択します。

    4. 既存のコールバックを次のコールバックに置き換えます。

      load position.mat;
      idx=[ 1 1 ;2 3 ;4 6 ;7 10 ;11 15 ;16 30 ;
           31 70 ;71 100 ;101 200 ;201 250 ;251 310];
      LEN=length(idx);
      t=(0:1:LEN-1)';
      このコールバックは 11 の異なるサイズの入力を生成するインデックスを設定します。サンプル時間ごとに開始インデックスと終了インデックスが指定されます。1 番目のサンプル時間は 1 番目の要素のみを使用し、2 番目のサンプル時間は 2 番目と 3 番目の要素を使用するというように続きます。101 から 200 までの最大のサンプルには、100 の要素が含まれます。

    5. [適用] をクリックして [モデル プロパティ] ダイアログ ボックスを閉じます。

  3. Selector ブロックを、正しいインデックスを使用するように更新します。

    1. Selector ブロックをダブルクリックして、関数ブロック パラメーターを表示します。

      [関数ブロック パラメーター] ダイアログ ボックスが開きます。

    2. 2 番目の [インデックス オプション][最初と最後のインデックス (端子)] に設定し、[適用] をクリックして、ダイアログ ボックスを閉じます。

      この設定により、インデックス端子への入力でサンプル時間ごとの入力の開始および終了インデックスが指定されます。インデックス入力により、サンプル時間ごとの開始および終了インデックスが指定されるため、Selector ブロックは、可変サイズの信号をシミュレーション間隔として出力します。

  4. [端子とデータの管理] を使用して、MATLAB Function 入力 x と出力 y を可変サイズのデータとして設定します。

    1. MATLAB Function ブロックをダブルクリックして MATLAB Function ブロック エディターを開きます。

    2. エディターのメニューから、[データの編集] を選択します。

    3. [端子とデータの管理] の左ペインで、入力 u を選択します。

      [端子とデータの管理] で、右のペインに u に関する情報が表示されます。

    4. [一般] タブで、[可変サイズ] チェック ボックスを選択して、[適用] をクリックします。

    5. 左側のペインで出力 y を選択します。

    6. [一般] タブで、次の操作を実行します。

      1. y[サイズ][2 100] に設定して、最初の次元の上限値が 2 で 2 番目の次元の上限値が 100 の 2 次元行列を指定します。これは InitFcn コールバックで指定される最大サイズの入力です。

      2. [可変サイズ] チェック ボックスをオンにします。

      3. [適用] をクリックします。

    7. [端子とデータの管理] を終了します。

  5. ここで、他の MATLAB Function ブロックに同じ手順を実行します。[端子とデータの管理] を使用して、可視化ブロック入力 y と出力 z を可変サイズのデータとして設定します。

    1. 可視化ブロックをダブルクリックして MATLAB Function ブロック エディターを開きます。

    2. エディターのメニューから、[データの編集] を選択します。

    3. [端子とデータの管理] の左ペインで、入力 y を選択します。

    4. [一般] タブで、[可変サイズ] チェック ボックスを選択して、[適用] をクリックします。

    5. 左側のペインで入力 z を選択します。

    6. [一般] タブで、[可変サイズ] チェック ボックスを選択して、[適用] をクリックします。

    7. [端子とデータの管理] を終了します。

  6. モデル シミュレーション終了時間を 10 に変更します。ここで、フィルターはサンプル時間ごとに 11 の異なるサイズの入力のいずれかを処理します。

  7. モデルを ex_kalman33.mdl という名前で保存します。

変更したモデルのテスト-  モデルをシミュレートするには、次の手順に従います。

  1. Simulink モデル ウィンドウで [実行] をクリックします。

    Simulink でモデルを実行するときに、以前と同じようにオブジェクトの軌跡は青で、カルマン フィルターの推定位置は緑でプロットされます。

    Selector ブロックとトラッキングおよび可視化ブロックの間の信号線がこれらの信号が可変サイズであることを示すように変わることに注意してください。

  2. シミュレーションが停止します。

可変サイズの入力を受け入れるアルゴリズムが正しく作成されました。次に、MATLAB Function ブロックのデバッグで説明したとおりに MATLAB Function ブロックをデバッグする方法を学習します。

MATLAB Function ブロックのデバッグ

MATLAB Function ブロックのデバッグは、MATLAB での関数のデバッグ方法と同じです。

  1. カルマン フィルターを呼び出す MATLAB Function ブロックをダブルクリックして、MATLAB Function ブロック エディターを開きます。

  2. エディター内で、下の行の左側の余白に表示されるダッシュ (-) 文字をクリックします。

    y = kalman03(u);

    ブレーク ポイントを設定したことを示す小さい赤いボールが、6 行目の余白に表示されます。

  3. Simulink モデル ウィンドウで [実行] をクリックします。

    実行がブレークポイントに達し、左の余白に小さな緑の矢印が表示されると、シミュレーションは一時停止します。

  4. ポインターを変数 u に合わせます。

    u の値がポインターの横に表示されます。

  5. MATLAB Function ブロック エディターのメニューから、[ステップ イン] を選択します。

    エディターで kalman03.m ファイルが開き、[ステップ][ステップ イン] および [ステップ アウト] を使ってこのコード内でステップ実行できるようになります。

  6. [ステップ アウト] を選択します。

    kalman03.m ファイルが閉じて、MATLAB Function ブロック コードがエディターに再表示されます。

  7. ポインターを出力変数 y に合わせます。

    y の値が表示されます。

  8. ブレークポイントを削除するには赤いボールをクリックします。

  9. MATLAB Function ブロック エディターのメニューから、[Quit Debugging] を選択します。

  10. エディターを閉じます。

  11. Figure ウィンドウを閉じます。

    これで、次のタスクC コードの生成に進む準備ができました。

C コードの生成

アルゴリズムが Simulink で機能することが実証されました。次に、モデルの C/C++ コードを生成します。コードを生成するには Simulink Coder が必要です。

メモ

コードを生成する前に、MATLAB コードがコード生成に適していることを確認しなければなりません。MATLAB コードを外部関数として呼び出す場合、コードを生成する前に、外部呼び出しを削除しなければなりません。

  1. MATLAB Function ブロックの名前を Tracking に変更します。ブロックの名前を変更するには、MATLAB Function ブロックの下の注釈 MATLAB Function をダブルクリックして、テキストを Tracking に置き換えます。

    MATLAB Function ブロックに対してコードを生成する場合、Simulink Coder では生成コードでブロックの名前を使用します。意味のある名前を使用することを実践してください。

  2. コードを生成する前に、Simulink Coder でコード生成レポートが作成されることを確認してください。この HTML レポートでは、コードの生成に使用したコンフィギュレーション設定のまとめを含む生成ファイルのリストに簡単にアクセスできます。

    1. Simulink モデル ウィンドウの [モデル化] タブで、[モデル設定] をクリックします。

      [コンフィギュレーション パラメーター] ダイアログ ボックスが開きます。

    2. [コンフィギュレーション パラメーター] ダイアログ ボックスの左ペインで、[コード生成] の下の [レポート] を選択します。

    3. 右ペインで、[コード生成レポートを作成] を選択します。

      [レポートを自動的に開く] のオプションも選択されています。

    4. [適用] をクリックして [コンフィギュレーション パラメーター] ダイアログ ボックスを閉じます。

    5. モデルを保存します。

  3. Tracking ブロックのコードを生成するには、次の手順に従います。

    1. Tracking ブロックを右クリックして、[C/C++ コード][選択したサブシステムをビルド] を選択します。

    2. [サブシステムに対するコードをビルド] ウィンドウで [ビルド] をクリックします。詳細については、個別のサブシステムのコードと実行可能ファイルの生成 (Simulink Coder)を参照してください。

  4. Simulink ソフトウェアで、可変サイズの信号を配列としてログを作成できないことを示すエラーが発生します。MATLAB ワークスペースに保存されるデータ形式を変更しなくてはなりません。この形式を変更するには、次の手順に従います。

    • Simulink モデル ウィンドウの [モデル化] タブで、[モデル設定] をクリックします。

      [コンフィギュレーション パラメーター] ダイアログ ボックスが開きます。

    • [コンフィギュレーション パラメーター] ダイアログ ボックスの左ペインで、[データのインポート/エクスポート] を選択し、[形式][時間付き構造体] に設定します。

      ログ データの形式は、時間フィールドと信号フィールドのフィールドをもつ構造体になります。これにより Simulink は可変サイズの信号をログ記録できるようになります。

    • [適用] をクリックして [コンフィギュレーション パラメーター] ダイアログ ボックスを閉じます。

    • モデルを保存します。

  5. 手順 3 を反復して、Tracking ブロックのコードを生成します。

    Simulink Coder ソフトウェアにより、ブロックに対する C コードが生成され、コード生成レポートが開きます。

    コード生成レポートの使用方法の詳細については、コード生成レポート (Simulink Coder)を参照してください。

  6. コード生成レポートの左ペインで、Tracking.c リンクをクリックして、生成された C コードを表示します。MATLAB Function ブロック Tracking で生成されるコードでは、既定で関数のインライン化が有効になっているため、関数 ex_kalman03 には個別の関数コードが存在しない場合があることに注意してください。

  7. フィルター アルゴリズムを変更してインライン化を無効にします。

    1. ex_kalman03.m で、関数宣言の後に次のコードを追加します。

      coder.inline('never');

    2. 関数名を ex_kalman04 に変更し、現在のフォルダーにファイルを ex_kalman04.m として保存します。

    3. ex_kalman33 モデルで、Tracking ブロックをダブルクリックします。

      MATLAB Function ブロック エディターが開きます。

    4. ex_kalman04 を呼び出すようにフィルター アルゴリズムの呼び出しを変更します。

      function y = kalman(u)
      %#codegen
      
      y = ex_kalman04(u);

    5. モデルを ex_kalman44.mdl という名前で保存します。

  8. C コードを生成して検証します。

    1. 手順 3 を繰り返します。

    2. コード生成レポートの左ペインで、Tracking.c リンクをクリックして、生成された C コードを表示します。

      関数 ex_kalman04 用に生成された C コードを検証します。

      /* Forward declaration for local functions */
      static void Tracking_ex_kalman04(const real_T z_data[620], const int32_T
        z_sizes[2], real_T y_data[620], int32_T y_sizes[2]);
      
      /* Function for MATLAB Function Block: '<Root>/Tracking' */
      static void Tracking_ex_kalman04(const real_T z_data[620], const int32_T   48 
           z_sizes[2], real_T y_data[620], int32_T y_sizes[2])

このチュートリアルで使用されるベスト プラクティス

 ベスト プラクティス - インクリメンタルなコード更新の保存

覚えておきたい重要なポイント

  • MATLAB コードを変更する前に、必ずバックアップしてください。

  • ファイルの命名規則を決めて、頻繁に中間バージョンを保存してください。たとえば、このチュートリアルでは 2 桁のサフィックスを使用して、さまざまなバージョンのフィルター アルゴリズムを区別します。

  • シミュレーションのために、コードを生成する前に、coder.extrinsic を使用して MATLAB コードを呼び出して、アルゴリズムが Simulink での使用に適しているか確認します。このプラクティスには次のようなメリットがあります。

    • MATLAB コードをコード生成に適したものにする必要がありません。

    • MATLAB コードを Simulink から呼び出すときに MATLAB でデバッグできます。

  • Simulink Coder コード生成レポートを作成します。この HTML レポートでは、コードの生成に使用したコンフィギュレーション設定のまとめを含む生成ファイルのリストに簡単にアクセスできます。

参考

関連する例

詳細