主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

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

学習目的

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

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

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

  • MATLAB函数ブロックからMATLABコードを呼び出すには,外部编码器を使用します。

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

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

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

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

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

必要な知識

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

必要な製品

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

  • MATLAB

  • MATLAB编码器™

  • 金宝app

  • 金宝app仿真软件编码器

  • Cコンパイラ

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

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

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

例: カルマン フィルター

説明

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

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

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

アルゴリズム

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

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

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

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

X = X 0 + v x . D T Y = Y 0 + v Y . D T v x = v x 0 + A. x . D T v Y = v Y 0 + A. Y . D T

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

%初始化状态转移矩阵dt=1;A=[1 0 dt 0 0;..0 1 0 dt 0;..0 1 0 dt 0;..0 0 1 0 dt;..0 0 0 0 1 0;..0 0 0 0 1];

フィルター処理

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

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

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

    %预测状态和协方差x_prd = A * x_est;p_prd = A * p_est * A' + Q;

  • 推定

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

    %测量矩阵H=[1 0 0;0 1 0 0 0];Q=眼睛(6);R=1000*眼睛(2);
    %估计S=H*p_prd'*H'+R;B=H*p_prd';klm_增益=(S\B);%估计状态和协方差x_est=x_prd+klm_增益*(z-H*x_prd);p_est=p_prd-klm_增益*H*p_prd;%计算估计测量值y=H*x_est;

参考文献

微积分,西蒙。自适应滤波器理论。上鞍河,新泽西州:Prentice-Hall, Inc., 1996。

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

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

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

  • チュートリアルの各ステップの仿金宝app真软件モデルファイル。

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

    このチュートリアル全体を通して,カルマンフィルターアルゴリズムを含むMATLABファイルを呼び出す仿真软件モ金宝appデルを操作します。

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

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

ファイルの位置

チュートリアルのファイルは次のフォルダーにあります。docroot \工具箱\仿真软金宝app件\ \卡尔曼例子。チュートリアルを実行するには、これらのファイルをローカル フォルダーにコピーしなければなりません。詳細は、ファイルの局所的なコピーを参照してください。

ファイルの名前と説明

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

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

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

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

  1. たとえばc: 金宝app\模型、卡尔曼滤波、解决方案金宝搏官方网站のようなローカル金宝搏官方网站フォルダーを作成します。

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

    Cd (fullfile(docroot, 'toolbox', 金宝app'simulink', 'examples'))

  3. 金宝搏官方网站フォルダーの絶対パス名を指定して、卡尔曼サブフォルダーの内容をローカルの金宝搏官方网站フォルダーにコピーします。

    copyfile('kalman','s金宝搏官方网站olutions')

    以下に例を示します。

    拷贝文件(“卡尔曼”、“c: \仿真软件\卡尔金宝app曼\解决方案”)金宝搏官方网站

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

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

  5. 以下のファイルを金宝搏官方网站フォルダーから工作フォルダーにコピーします。

    • ex_kalman01

    • ex_kalman00

    • 位置

    • 绘制轨道图

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

Cコンパイラの設定

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

ex_kalman00モデルについて

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

  1. 金宝app模拟でex_kalman00モデルを開きます。

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

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

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

      ex_kalman00

      このモデルは,MATLABコードを仿真金宝app软件に統合する方法を示す不完全なモデルです。完全なモデルは,ex_Kalman 11で,これもこのチュートリアルに付属しています。

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

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

  • 选择器ブロックへの2番目の入力を提供する索引生成器ブロックで使用されるデータを設定する

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

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

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

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

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

    加载位置.mat;[R,C]=尺寸(位置);idx=(1:C)';t=idx-1;

ソース ブロック-このモデルは2つの来源ブロックを使用して,位置データとスカラーインデックスを选择器ブロックに提供します。

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

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

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

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

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

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

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

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

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

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

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

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

  1. 金宝app模拟でex_kalman00を開きます。

    ex_kalman00

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

    1. MATLABコマンドラインで”slLibraryBrowser“と入力して仿金宝app真软件ライブラリブラウザーを開きます。

    2. 金宝app仿真软件ライブラリのリストから用户定义函数ライブラリを選択します。

    3. MATLAB函数ブロックをクリックしてex_kalman00モデルにドラッグします。将MATLAB功能块放在这里という赤い注釈テキストのすぐ上にブロックを配置します。

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

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

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

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

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

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

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

    函数y=kalman(u)%35; codegen y=ex#u kalman01(u);

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

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

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

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

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

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

  1. 金宝app仿真软件モデルウィンドウで[実行]をクリックします。

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

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

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

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

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

MATLABコードの変更-コードを自分で変更するには,このセクションの演習を行ってください。それ以外の場合は,金宝搏官方网站サブフォルダーの指定のファイルex_Kalman 03.mを開いて、変更されたアルゴリズムを表示してください。

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

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

    编辑ex_kalman02.m

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

    1. コメントの前に,

      %预测状态与协方差
      以下を挿入します。
      我= 1:尺寸(z, 2)

    2. コメントの後に、

      %计算估计的测量值y = H * x_est;
      以下を挿入します。
      终止

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

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

    我= 1:尺寸(z, 2)%预测状态和协方差x_prd = A * x_est;p_prd = A * p_est * A' + Q;%估计S=H*p_prd'*H'+R;B=H*p_prd';klm_增益=(S\B);%估计状态和协方差x_est=x_prd+klm_增益*(z-H*x_prd);p_est=p_prd-klm_增益*H*p_prd;%计算估计测量值y=H*x_est;终止

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

    変更する名前

    x_est = x_prd + klm_gain * (z - H * x_prd);
    これを次のように変更します。
    x_est=x_珠三角+荷航增益*(z(1:2)-H*x_珠三角);

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

    変更する名前

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

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

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

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

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

    %预分配输出信号:y=0(大小(z));

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

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

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

ex_Kalman 03.mの内容

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

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

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

  1. 金宝app模拟でex_Kalman 11モデルを開きます。

    ex_Kalman 11

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

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

    函数y=kalman(u)%#codegeny=ex_kalman03(u);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    1. 金宝app仿真软件モデルウィンドウの[モデル化]タブで、[モデル設定]をクリックします。

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

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

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

  8. モデルをex_kalman22.mdlとして保存します。

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

  1. 金宝app仿真软件モデルウィンドウで[実行]をクリックします。

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

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

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

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

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

可変サイズの入力を使用するようにモデルを更新する-モデルを自分で変更するには,このセクションの演習を行ってください。それ以外の場合は,金宝搏官方网站サブフォルダーの指定のモデルex_Kalman 33.mdlを開いて、変更されたモデルを表示してください。

  1. 金宝app模拟でex_kalman22.mdlを開きます。

    ex_kalman22

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

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

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

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

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

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

      load position.mat;idx=[11;23;46;710;1115;1630;3170;71100;101200;201250;251 310];LEN=长度(idx);t=(0:1:LEN-1)';
      このコールバックは11の異なるサイズの入力を生成するインデックスを設定します。サンプル時間ごとに開始インデックスと終了インデックスが指定されます。1.番目のサンプル時間は 1 番目の要素のみを使用し、2 番目のサンプル時間は 2 番目と 3 番目の要素を使用するというように続きます。101から200までの最大のサンプルには,100の要素が含まれます。

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

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

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

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

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

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

  4. (端子とデータの管理]を使用して,MATLAB函数入力xと出力Yを可変サイズのデータとして設定します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  7. モデルをex_Kalman 33.mdlとして保存します。

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

  1. 金宝app仿真软件モデルウィンドウで[実行]をクリックします。

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

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

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

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

MATLAB函数ブロックのデバッグ

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

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

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

    y=kalman03(u);

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

  3. 金宝app仿真软件モデルウィンドウで[実行]をクリックします。

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

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

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

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

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

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

    卡尔曼03.mファイルが閉じて,MATLAB函数ブロックコードがエディターに再表示されます。

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

    Yの値が表示されます。

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

  9. MATLAB函数ブロックエディターのメニューから,(退出调试)を選択します。

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

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

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

Cコードの生成

アルゴリズムが 金宝app模拟で機能することが実証されました。次に、モデルの C/C++コードを生成します。コードを生成するには金宝app仿真软件编码器が必要です。

メモ

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

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

    MATLAB函数ブロックに対してコードを生成する場合、金宝app仿真软件编码器では生成コードでブロックの名前を使用します。意味のある名前を使用することを実践してください。

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

    1. 金宝app仿真软件モデルウィンドウの[モデル化]タブで、[モデル設定]をクリックします。

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

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

    3. 右側のペインで,[コード生成レポートを作成][レポートを自動的に開く]を選択します。

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

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

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

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

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

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

    • 金宝app仿真软件モデルウィンドウの[モデル化]タブで、[モデル設定]をクリックします。

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

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

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

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

    • モデルを保存します。

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

    金宝app仿真软件编码器ソフトウェアにより,ブロックに対するCコードが生成され,コード生成レポートが開きます。

    コード生成レポートの使用方法の詳細については、コード生成レポート(金宝app仿真软件编码器)を参照してください。

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

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

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

      编码器内联('never');

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

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

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

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

      函数y=kalman(u)%#codegeny=ex_kalman04(u);

    5. モデルをex_Kalman 44.mdlとして保存します。

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

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

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

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

      /*局部函数的前向声明*/静态空洞跟踪×kalman04(const real_T z_数据[620]、const int32_T z_大小[2]、real_T y_数据[620]、int32_T y_大小[2]);/*MATLAB函数块的函数:“/跟踪”*/静态空洞跟踪×kalman04(const real_T z_数据[620]、const int32_T 48 z_大小[2]、real_T y_数据[620],int32_T y_尺寸[2])

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

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

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

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

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

  • シミュレーションのために,コードを生成する前に,外部编码器を使用してMATLABコードを呼び出して,アルゴリズムが仿真软金宝app件での使用に適しているか確認します。このプラクティスには次のようなメリットがあります。

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

    • MATLABコードを 模金宝app拟から呼び出すときに MATLABでデバッグできます。

  • 金宝app仿真软件编码器コード生成レポートを作成します。このHTMLレポートでは,コードの生成に使用したコンフィギュレーション設定のまとめを含む生成ファイルのリストに簡単にアクセスできます。

参考

関連する例

詳細