MV-1070:MDLを用いた単純振子システムの作成

本チュートリアルでは、MDLを用いて定義ベースのエンティティ(システムなど)を作成する方法について学習します。

システムの使用により、下記の事柄が可能となります:
  • モデルファイルのモジュール化
  • システム定義ファイルの再使用
  • ファイルの簡単なデバッグおよびメンテナンス
  • モデリングコンポーネントのライブラリ作成
  • システムに対する一定の操作(システムの表示のオン / オフ切り替え、システム全体の弾性化 / 剛体化、移動など)を一挙に実行。システムの移動といった操作は、システム内のすべてのサブシステムについて自動的に適用されます。

システム定義の概念は、プログラミング言語のプロシージャ / サブルーチンに似ています。



図 1.
プログラミングとMDLアプローチの類似点
プロシージャは、メインプログラムからの情報を必要とするプログラムです。プロシージャは、任意の回数コール / インスタンス化されることが可能です。1つのプロシージャはメインプログラムの一部ですが、別個に維持されることが可能です。

同様に、システム定義は、メインモデルからの情報を必要とするモデル集合体です。システム定義は、任意の回数コール / インスタンス生成されることが可能です。1つのシステム定義はメインモデルの一部ですが、別個にメンテナンスすることが可能です。

システム定義の使用は、下記の2段階のプロセスです:
  1. システムの定義
  2. モデル内のシステム定義のインスタンス化
Section 1:システム定義
システム定義は、すべてのアタッチメントの要件が満足される限り任意のモデルの一部分となり得る再使用可能なシステムモデルです。

システム定義は*DefineSystem()ブロックで表されます。このブロックは、定義ブロックの末尾を示す*EndDefine()ステートメントで終わります。このブロック内で定義されたすべてのエンティティは、システム定義の一部であるとみなされます。

典型的なシステム定義の例を以下に示します:
*DefineSystem(def_sys, att_1, att_2…att_n)
このシステム定義の例では:
  • def_sysはシステム定義の変数名で、このシステムのインスタンス化の間に使用されます。
  • att_1, att_2, … att_nは、システムへのアタッチメントとして機能する引数のリストです。
システム定義は下記の2つの方法で作成することができます:
  1. テキストエディタを使用
  2. グラフィカルユーザーインターフェースから作成。これには、最小限のテキスト編集を要します。MV-1030:MotionView GUIを用いたシステム定義の作成をご参照ください。
注: 本チュートリアルでは、システム定義の詳細をカバーするため、方法1.を使用します。
Section 2:システムアタッチメント
下の図は、SLAサスペンションのシステム定義を表わしたものです。これは、ボディとポイントが結合されるべきアタッチメントについての情報を必要とする不完全なシステムです。


図 2.

*Attachment()ステートメントを除けば、システム定義内の他のエンティティ群はMDLモデルファイルに似ています。

システム定義の一般的な構造は:
  • システムは、システムの外部のエンティティに関する情報を、アタッチメントを介して受け取ります。
  • MDLエンティティは、アタッチメントとしてシステムに渡されることが可能です。
  • システム定義内の*Attachment()ステートメントは、*DefineSystemブロック内の引数をアタッチメントとして宣言し、そのアタッチメントがどのタイプのエンティティになるかを割り当てます。
  • 外部エンティティに依存するエンティティを定義する際は、アタッチメントと同じ変数名が定義内で参照される必要があります。
  • 下に示す例の太字のエントリをご覧ください(Reference Numbersは参照用のためのみのもので、MDLファイルの一部ではありません)。
    • 行 2 - 変数名がsys_definitionで、アタッチメントとして1つの引数b_body_attを有するシステムを定義
    • 行 4 - エンティティタイプがボディで、アタッチメントとしてb_body_attを宣言
    • 行 7 - このシステム内で定義されている(表示はされていない)ボディb_sys_bodyとこのシステムへのアタッチメントであるボディb_body_attとの間に回転ジョイントを作成


    図 3.
    注: あるアタッチメントエンティティが、システム定義内のエンティティへの物理的アタッチメントである必要はありません。アタッチメントエンティティは、システム定義に渡される外部変数を表わすために使用できます。例えば、データセットもアタッチメントとして機能します。
Section 3:システムのインスタンス化
  • システムのインスタンス化とは、システム定義のインスタンスを生成するという意味です。システムは、以下のシンタックスを有する*System() MDLステートメントを使ってインスタンス化されます:
    *System(varname, “label”, def_varname, arg_1, arg_2, …, arg_n)

    ここで、

    • varname – システムインスタンスの変数名
    • label – システムの説明的ラベル
    • def_varname – インスタンス化されるシステム定義の変数名
    • arg_1, arg_2,… arg,_n –システムへのアタッチメントとして機能するエンティティの変数名。引数の数は、システム定義内でリストされ、かつ、宣言されているアタッチメントの数と一致していなくてはなりません。
  • 定義は複数回インスタンス化されることが可能です。例えば、SLAサスペンションについての1つのシステム定義ファイルは、複数の車両モデルファイル内で複数のSLAサスペンションシステムを作成するために使用できます。
  • 以下の例は、システム定義とMDLモデルファイル内でのそれのインスタンス化を表しています。例内で、システム定義とそのインスタンス化の間の重要な関係を強調するため、一部が太字で示されています(Reference Numbersは例のためのみに付けられており、MDLファイルには含まれていません)。
    • 変数名system1のシステムインスタンスは、定義sys_definitionを参照する行2で作成されます。B_Ground (Ground Body)はアタッチメント用に引数として渡されます。
    • システム定義は行3と行7の間の*DefineSystem()*EndDefine()ブロック内で説明されています。アタッチメントb_attB_Groundに適用されます。
    Reference Numbers System Instantiation with Definition
    1 // Model : Body.mdl

    *BeginMDL(base_model, "Base Model")

    2 //Instantiate the system definition sys_definition

    *System(system1, "First System", sys_definition, B_Ground)

    3 //Begin System Definition Block

    *DefineSystem(sys_definition, b_att)

    4 //Declare a body attachment to the system

    *Attachment(b_att, "Body Attachment", Body, "Add an body external to this system

    5 //Entities within the system

    *Point(p_sys, "Point in the system")

    *Body(b_sys, "Body in the system")

    6 //Define a joint with the body b_sys and the body attachment b_att

    *RevJoint(j_rev, "Revolute Joint", b_sys, b_att, p_sys, VECTOR, V_Global_X

    7 *EndDefine() //End Definition Block
    8 *EndMDL()
モデル内のシステムは、次の3つの方法のいずれかでインスタンス化できます:
  1. 上の例に示すように、MDLファイルを手動でオーサリング
  2. MotionViewのMBD Modelウィンドウ内のSystem/Assemblyパネルからシステムをインポート
  3. MotionView MBD Modelウィンドウ内のAssembly Wizardを使用

以下の演習は最初の2つの方法を説明しています。3つ目の方法は別のチュートリアルでカバーされます。