Main Content

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

システムのモデル化と検証

システム構造内の各コンポーネントをモデル化して、そのコンポーネントの物理的または機能的な動作を表現します。コンポーネントの基本的な動作を検証するには、テスト データを使用してシミュレーションします。

システム レイアウトを開く

全システム レイアウトの全体像を把握することは、個々のコンポーネントをモデル化するときに役立ちます。まず、以下のようにレイアウト モデルを読み込みます。MATLAB® コマンド ラインで、次のように入力します。

open_system('system_layout.slx')

コンポーネントのモデル化

コンポーネントの Simulink® モデルは、次のような複数のスタート地点に基づきます。

  • 物理的コンポーネントの入力と出力の間にある明示的な数学的関係 — 代数的計算と微分方程式の積によって、直接的または間接的に、入力からコンポーネントの出力を計算できます。たとえば、与えられた流入速度から、タンクの水位を計算するのは、明示的な関係です。各 Simulink ブロックは、その入力から出力への計算の定義に基づいて実行されます。

  • 物理的コンポーネントのモデル変数間の間にある暗黙的な数学的関係 — 変数は相互に依存しているため、コンポーネントに入力と出力を割り当てるのは単純ではありません。たとえば、ある回路のモーターの + 端子の電圧と - 端子の電圧の間には、暗黙的な関係があります。Simulink でこのような関係にある変数をモデル化するには、Simscape™ などの物理的モデリング ツールを使用するか、入力/出力を定義可能な大きめのコンポーネントの一部としてモデル化します。場合によっては、モデリング目標とコンポーネント定義をじっくりと確認することが、入力/出力の関係を定義するのに役立ちます。

  • 実際のシステムから得られたデータ — 実際のコンポーネントから入力/出力データを測定したが、完全に定義された数学的関係は存在していない場合です。多くのデバイスに、この説明に当てはまる、モデル化されていないコンポーネントが存在します。たとえば、テレビによって消費される熱です。System Identification Toolbox™ を使用すると、このようなシステムの入力/出力の関係を定義することができます。

  • 明示的な機能的定義 — 機能的コンポーネントの出力を、入力をもとに代数演算や論理演算を使用して定義します。たとえば、サーモスタットの切り替えロジックです。ほとんどの機能的関係は、Simulink ブロックおよびサブシステムとしてモデル化できます。

このチュートリアルでは、明示的な入力/出力関係をもつ物理的コンポーネントおよび機能的コンポーネントをモデル化します。このチュートリアルでは、以下を行います。

  1. システム方程式を使用して Simulink モデルを作成します。

  2. Simulink エディターで Simulink ブロックを追加して接続します。ブロックは方程式の係数と変数を表します。

  3. 各コンポーネントのモデルを個別に作成します。システムのモデルを最も効果的に作成する方法は、まず各コンポーネントを個別に考慮することです。

  4. システムの近似を使用した簡単なモデルの作成から開始します。モデルの精度に影響を与える可能性がある仮定を特定します。複雑度のレベルがモデル化と精度の要件を満たすまで詳細を追加する作業を繰り返します。

物理的コンポーネントのモデル化

たとえばデータ、エネルギー、力の伝達などのコンポーネント間の関係を記述します。Simulink でシステム方程式を使用して、システムのグラフィカル モデルを作成します。

コンポーネントをモデル化する前に次のような質問を検討します。

  • 各コンポーネントのコンポーネントとは。変更しない限り変わらない値は何か。

  • 各コンポーネントの変数とは。時間と共に変化する値は何か。

  • コンポーネントがもつ状態変数の数は

科学的法則を利用して、各コンポーネントの方程式を導き出します。多くのシステム方程式は、次の 3 つのカテゴリに分けられます。

  • 連続システムの場合、微分方程式は変数の変化率をすべての時間の値に対して定義された方程式を使用して記述します。たとえば、1 次微分方程式により、車の速度が得られます。

    dv(t)dt=bmv(t)+u(t)

  • 離散システムの場合、差分方程式は変数の変化率を記述しますが、方程式は特定の時間に対してのみ定義されます。たとえば、次のような離散比例 - 微分コントローラーによる制御信号です。

    pd[n]=(e[n]e[n1])Kd+e[n]Kp

  • 導関数を使用しない方程式は代数方程式です。たとえば、代数方程式によって、2 つのコンポーネントを使用した並列回路の全電流が次のように求められます。

    It=Ia+Ib

車輪と直線運動.  1 つの車輪に対して、次の 2 つの力が働きます。

  • モーターに働く力 — 力 F は、速度変更方向に沿って働く力で、その車輪のサブシステムの入力です。

  • 抗力 — 力 Fdrag は、速度変更方向と逆向きに働く力で、速度の関数です。

    Fdrag=kdragV|V|

加速度は、これらの力の合計に比例します。

(m/2)V˙=FFdrag(m/2)V˙=FkdragV|V|V˙=FkdragV|V|(m/2)

ここで、kdrag は抵抗係数で、m はロボットの質量です。この質量の半分がそれぞれの車輪に乗っています。

車輪のモデルを作成するには、以下のようにします。

  1. system_layout モデルで、Right Wheel サブシステムをダブルクリックし、空のサブシステムを表示します。

  2. 速度と加速度をモデル化します。Integrator ブロックを追加します。初期条件を 0 に設定したままにします。このブロックの入力は加速度 Vdot で、出力は速度 V です。

  3. 抗力をモデル化します。MATLAB Function ブロックを User-Defined Functions ライブラリからモデルに追加します。MATLAB Function ブロックは、数式をモデルに素早く実装できます。関数を編集するには、ブロックをダブルクリックして MATLAB Function エディターを開きます。

  4. MATLAB Function ブロックの引数を定義します。MATLAB Function ブロック エディターで、[データの編集] ボタンをクリックします。k_drag をクリックし、[スコープ][パラメーター] に設定して、[適用] をクリックします。

  5. Subtract ブロックでモーター力から抗力を減算します。Gain ブロックのパラメーターを 1/(m/2) として、力 - 加速度の方程式を完成させます。

  6. MATLAB Function ブロックの向きを反転させるため、ブロックを選択します。ツールストリップの [書式設定] タブで、[左右を反転] Flip left-right button をクリックします。ブロックを結線します。

  7. 2 つの車輪のダイナミクスは同じです。モデル化した Right Wheel サブシステムのコピーを作成し、それを Left Wheel サブシステムに貼り付けます。

  8. モデルの最上位レベルを表示します。[親に移動する] ボタン をクリックします。

回転運動.   2 つの車輪がそれぞれ反対の方向に回転するとき、車輪は半径 r の円を描くように動き、ロボットの回転運動が起こります。両輪が同じ方向に回転するときは、回転は起こりません。車輪の速度の絶対値が常に同じであると仮定すると、回転運動が 2 つの速度 VR と VL の差に依存するものとして次のようにモデル化すると実用的です。

θ˙=VRVL2r

回転ダイナミクスのモデルを作成するには、以下のようにします。

  1. system_layout モデルの最上位で、Rotation サブシステムをダブルクリックし、空のサブシステムを表示します。Inport ブロックと Outport ブロック間の接続を削除します。

  2. 角速度と角度をモデル化するには、以下のようにします。Integrator ブロックを追加します。初期条件を 0 に設定したままにします。このブロックの出力は角度 theta で、入力は角速度 theta_dot です。

  3. 接線速度から角速度を計算します。Gain を追加し、パラメーターを 1/(2*r) にします。

  4. ブロックを結線します。

  5. モデルの最上位レベルを表示します。[親に移動する] ボタン をクリックします。

機能的コンポーネントのモデル化

関数の入力から出力への関数を記述します。この記述には、代数方程式と論理構文を含めることができ、これらを使用して、Simulink でシステムのグラフィカル モデルを作成できます。

座標変換.  X 座標および Y 座標におけるロボットの速度、VX および VY は、直線運動速度 VN および角度 theta と次のような関係にあります。

VX=VNcos(θ)VY=VNsin(θ)

座標変換のモデルを作成するには、以下のようにします。

  1. system_layout モデルの最上位で、Coordinate Transform サブシステムをダブルクリックし、空のサブシステムを表示します。

  2. 三角関数をモデル化します。Math Operations ライブラリから SinCos ブロックを追加します。

  3. 乗算をモデル化します。Math Operations ライブラリから Product ブロックを 2 つ追加します。

  4. ブロックを結線します。

  5. モデルの最上位レベルを表示します。[親に移動する] ボタン をクリックします。

モデル パラメーターの設定

モデル パラメーター値のソースとして、以下を使用できます。

  • 標準のプロパティ テーブルや、メーカーのデータ シートなどの明文化された仕様書

  • 既存システムの直接測定値

  • システムの入力/出力を使用した推定値

このモデルは、以下のパラメーターを使用します。

パラメーター記号
質量m2.5 kg
転がり抵抗k_drag30 Ns2/m
ロボットの半径r0.15 m

Simulink は MATLAB® ワークスペースを使用してパラメーターを評価します。MATLAB コマンド ウィンドウで、以下のパラメーターを設定します。

m = 2.5;
k_drag = 30;
r = 0.15;

シミュレーションを使用したコンポーネントの検証

入力を指定して、出力を観察することで、コンポーネントを検証します。このようなシンプルな検証でも、モデルを改良するための即効性のある方法を指し示すことが可能です。この例では、次の動作を検証します。

  • 車輪に力が継続的に加えられたとき、速度は定常状態の速度に達するまで上昇する。

  • 2 つの車輪がそれぞれ反対の方向に回転するとき、回転角は一定の割合で増加します。

車輪のコンポーネントの検証

車輪のコンポーネントのテスト モデルを作成し、実行します。

  1. 新しいモデルを作成します。[シミュレーション] タブで、[新規] をクリックします。Right Wheel ブロックを新しいモデルにコピーします。

  2. テスト入力を作成します。Source ライブラリから Step ブロックを追加し、それを Right Wheel ブロックの入力に接続します。[ステップ時間] パラメーターを 1 に設定したままにします。

  3. 出力にビューアーを追加します。Right Wheel ブロックの出力端子を右クリックし、[ビューアーの作成と接続]、[Simulink]、[スコープ] を選択します。

  4. シミュレーションを実行します。[シミュレーション] タブで、[実行] をクリックします。

シミュレーション結果は、一般的に予想される動作を示しています。ステップ時間に力が加えられるまで、運動はありません。力が加えられると、速度は上昇を始め、加えられた力と抗力が平衡状態に達すると、一定の値で落ち着きます。検証に加えて、このシミュレーションにより、指定した力に対する車輪の最高速度について情報が得られます。

回転のコンポーネントの検証

回転のコンポーネントのテスト モデルを作成し、実行します。

  1. 新しいモデルを作成します。 をクリックし、Rotation ブロックを新しいモデルにコピーします。

  2. 新しいモデルでテスト入力を作成します。Sources ライブラリから Step ブロックを追加します。[ステップ時間] パラメーターを 1 に設定したままにします。それを Rotation ブロックの入力に接続します。この入力は、車輪が回転する方向が反対のとき、車輪速度の差を表します。

  3. 出力にビューアーを追加します。Rotation ブロックの出力端子を右クリックし、[ビューアーの作成と接続]、[Simulink]、[スコープ] を選択します。

  4. シミュレーションを実行します。[シミュレーション] タブで、[実行] をクリックします。

このシミュレーションは、各車輪が同じ速度で反対方向に回転しているとき、角度が一定の割合で増加することを示しています。モデルを少し改良すると、たとえば、角度の出力を解釈しやすくすることができます。

  • ラジアン単位の出力を、度単位に変換できます。Gain ブロックを追加し、ゲインを 180/pi にします。

  • 360 度サイクルの度単位の出力を表示できます。Math Function ブロックを追加し、関数 mod を設定します。

MATLAB 三角関数はラジアン単位で入力を受け取ります。

モデルの検証

各コンポーネントの検証を行った後、完成したモデルについて同様の検証を行うことができます。この例では、次の動作を検証します。

  • 両輪に対して同じ方向に同じ力が加えられた場合、ロボットは直線移動をします。

  • 両輪に対して反対方向に同じ力が加えられた場合、ロボットはその場で回転運動します。

  1. system_layout モデルで、Inputs サブシステムをダブルクリックし、空のサブシステムを表示します。

  2. Step ブロックを追加して、テスト入力を作成します。[ステップ時間] パラメーターを 1 に設定したままにします。それを両方の Outport ブロックに接続します。

  3. モデルの最上位レベルで、両方の出力信号を同じスコープ ビューアーに接続します。

  4. モデルを実行します。

    この図で、黄色の線は X 方向、青色の線は Y 方向です。角度は 0 で変化していないため、車両は想定通り、X 方向にのみ移動します。

  5. Inputs サブシステムをダブルクリックし、ソースと 2 番目の出力の間に Gain ブロックを追加し、パラメーターを -1 にします。これで、左車輪の方向が反転します。

  6. 角度出力にスコープを追加します。

  7. モデルを実行します。

    1 つ目のビューは、X-Y 平面に一切の運動が生じていないことを示しています。2 つ目のビューは、一定のペースの回転運動が生じていることを示しています。

この最終モデルを使用し、入力を変化させることで、モデルに関する多くの質問に答えることができます。その例は次のとおりです。

  • 初期角度が 0 でないときどうなるか。

  • 力が 0 になってから運動が停止するまでにどのくらいの時間がかかるか。

  • ロボットがもっと重いときはどうなるか。

  • ロボットがもっと滑らかな表面、すなわち抵抗係数の低い表面を移動する場合はどうなるか。

関連するトピック