MV-1060:MDLステートメントを用いた振子モデルの構築

本チュートリアルでは、モデル定義言語(MDL)を用いて振子モデルを作成し、モデルの動的シミュレーションを実行し、振子の回転のプロッティングとアニメーションの確認を行う方法について学習します。

MDLは、モデル定義言語(Model Definition Language)のことです。MotionViewモデルは、この言語のフォームで機構システムの表現に必要な情報を有したオブジェクトです。モデルに関する完全な情報は、MDLフォーマットで保管されています。MDLは、ASCIIフォーマットのプログラム可能な言語です。MDLの利点としては、以下が挙げられます:
  • 任意のテキストエディタで開いて編集が可能
  • モデルのデバッグを補助
  • カスタムモデリングの要件に条件ステートメント"if"を使用可能
  • モジュールモデルおよび再使用可能モデルの構築が可能
  • モードのパラメータ化が可能
  • GUIで使用できないモデリングエンティティ(CommandSetsなど)の使用が可能
Section 1:MDLのエンティティ
モデリングエンティティは、MDLステートメントのかたちでMDLに保存されます。全てのMDLステートメントは、アスタリスク(*)で始まります。
エンティティには以下の2つのタイプがあります:
  • 一般的なエンティティ
  • 定義ベースのエンティティ
一般的なエンティティ
  • エンティティの定義に1つのステートメントのみを有します。プロパティの設定には1つまたは複数のステートメントを有します。
  • 例として、ポイント、ボディ、ジョイントなどが挙げられます。
  • 各一般的エンティティは、そのタイプに応じたプロパティを有します。例えば、1つのポイントはx座標、y座標、z座標、ラベル、ステート、および変数名のプロパティを有しています。
定義ベースのエンティティ
  • 定義と呼ばれるブロックステートメントで定義され、そのインスタンスはインスタンス生成ステートメントによってモデル内に生成されます。
  • ブロックは通常*Define()ステートメントで始まり、*EndDefine()ステートメントで終わります。
  • エンティティ(またはブロック)は、一連のMDLエンティティまたは部材で構成されています。
  • これらのエンティティは、再使用可能です。一旦定義されると、同じエンティティ定義は同じモデルまたは別のモデルファイル内で何度もインスタンス生成されることが可能です。
一般的に使用されるユーザー定義エンティティの概要は、以下の一覧にあるとおりです:
エンティティ 詳細
System システムエンティティは、モデリングエンティティの集合体を定義します。これらの定義は、同じモデルまたは別のMDLモデルファイル内で繰り返し使用することができます。モデルは異なるシステムにまとめられている場合もあります。システムエンティティの例としては、SLAサスペンションシステム、ワイパーブレードシステム、パワートレインシステムなどが挙げられます。システムは事実上、階層構造となっています(例えば、1つのシステムは別のシステムの子であり得ます)。
Assembly アセンブリはシステムエンティティに似ていますが、定義がモデルファイルではなく別個のファイルに存在する点が異なります。
アナリシス アナリシスエンティティは、モデルに適用される特定の解析タスクを描写するエンティティ(ボディ、ジョイント等)などの集合体です。例えば、Static Ride Analysisは、モデルに適用可能なアナリシスの一つです。アナリシスはModel(ルートシステムのトップレベル)の下でしかインスタンス生成できません。システムはアナリシスの子であり得ますが、その逆は真ではありません。
Dataset データセットエンティティは、整数、実数、ストリング、ブーリアン演算式のタイプのユーザー定義の変数またはファイル名の集合体です。これらの変数は、他のエンティティ特性にパラメータ化または参照できます。データセットは表形式で表示されるため、モデルを修正するには1つのウィンドウが提供されます。一般的に、設計変数はデータセットのかたちで集合的に定義されます。データセットは、システムまたはアナリシス内でインスタンス生成することが可能です。
Template テンプレートは、HyperWorks内でTemplexプログラムを使用するユーティリティです。ユーザー定義の計算やモデルに埋め込まれたコードを作成するために使用することができます。そのようなコードの出力は、ソルバーデックへの書き出しと別のプログラムに書き出すことが可能です。テンプレートエンティティのその他の用途は、MDLでサポートされていないソルバーステートメントやコマンドのインプリメント、およびテキストレポートの生成です。
注: システム、アセンブリおよびアナリシスはコンテナエンティティ(またはシンプルにコンテナ)として参照されます。
Section 2:エンティティのプロパティ
  • 各エンティティは、変数、ラベル、およびエンティティに関連したその他の特性を有しています。
  • 各エンティティには、固有の変数名が付けられていなくてはなりません。
  • 以下は、推奨される変数名の命名規則です。これによって、ユーザーはデバッグ中にモデリングエンティティを特定することができます。この規則は強制するものではありませんが、適用が推奨されます。
このエンティティのプロパティのリストは完全なものではありません。完全なリストについては、MDL Language Referenceオンラインヘルプをご参照下さい。
表 1. 一般的なエンティティ、それらの命名法およびプロパティ
一般的なエンティティ 命名法 プロパティ
Point p_ x, y, z, label, state, varname
Body b_ mass, IXX, IYY, IZZ, IXY, IYZ, IXZ, cg, cm, im, lprf, label, state, varname
RevJoint j_ b1, b2, i, j, id
Vector v_ x, y, z, label, state, varname
Marker m_ body, flt, x-axis, y-axis, z-axis, origin
ActionReactionForce frc_ b1, b2, fx, fy, fz, id, tx, ty, tz
表 2. ユーザー定義エンティティの命名規則とプロパティ
定義ベースのエンティティ 命名法 プロパティ
System sys_ Label, varname, state
アナリシス ana_ Label, varname, state
Dataset ds_ Label, varname, state
Template tmplt_ Label, varname, state
エンティティのプロパティにアクセスするには、エンティティ変数名、ドットセパレータ、プロパティの順で使用します。以下に例を示します:
エンティティ変数名 変数名の意味
b_knuckle 機構システム内の関節を表わすボディ
p_knuckle_cg 関節ボディの重心ポイントを表わすポイント
エンティティプロパティ名 アクセスされるプロパティ
b_knuckle.cm 関節ボディb_knuckleの重心マーカー
b_knuckle.cm.id 関節ボディb_knuckleの重心マーカーのID
p_knuckle_cg.x p_knuckle_cgのx座標
Section 3:グローバル変数
MotionViewはデフォルトで、モデル内のあらゆる箇所で使用可能なグローバル変数を伴います。これらの変数は、大文字小文字の別が識別されます。
下の一覧は、一般的に使用されるキーワードおよびそれらの意味を示すものです。
表 3. MotionViewでの一般的なキーワード
   
B_Ground グラウンドボディ
P_Global_Origin 全体座標系原点
V_Global_X, V_Global_Y, V_Global_Z 全体座標系のXYZ軸に沿ったベクトル
Global_Frame 全体座標系参照マーカー
MODEL モデルのトップレベルのシステムへの参照
Section 4:MDLステートメントの分類
トポロジーステートメント
エンティティを定義し、1つのエンティティとその他のものとのトポロジー的な関係を確立します。例えば、*Body(b_body, “Body”, p_cg)。この例では、*Bodyステートメントはポイントp_cgに重心のあるボディを定義します。このステートメントを介して、ボディ(b_body)はポイントp_cgとトポロジー的に結合されます。
プロパティまたはSetステートメント
トポロジー的エンティティによって生成されたエンティティにプロパティを割り当てます。例えば、*SetBody()は、*Body()を使って定義されたボディに質量と慣性プロパティを割り当てるステートメントです。ほとんどのプロパティステートメントは“*Set”から始まるため、これらは一般的にSetステートメントと呼ばれます。
定義とデータ
定義ブロックのコンセプトを踏まえ、これらの用語は特に、システム、アセンブリ、アナリシスなどのコンテナエンティティに関して使用されます。
*Define()ブロックに含まれている場合、ステートメントのブロックは『定義』と呼ばれます。ブロック内のステートメントには下記が含まれます:
  1. エンティティを定義するトポロジーステートメント
  2. プロパティを割り当てるSetステートメント。定義ブロック内のこれらのSetステートメントは定義内のエンティティのデフォルト値と考えられるため、"Default Sets"と呼ばれます。
*Define()ブロックのコンテキストの外側にあるステートメントまたはブロックは、データと呼ばれます。それらは:
  1. システム、アセンブリ、またはアナリシス内のエンティティに関連した*BeginContext()ブロック内のSetステートメント
  2. *BeginAssemblySelection*BeginAnalysisなどの*Beginステートメントの一部
Section 5:MDLモデルファイルの概要
  • MDLモデルファイルはASCIIファイルであり、テキストエディタを使うことで編集が可能です。
  • モデル内の全てのステータスは、*BeginMDL() - *EndMDL()ブロック内に含まれます。
  • MDLステートメントのシンタックスは、アスタリスク(*)に続いて、引数が定義された有効なステートメントです。
  • 先頭にアスタリスク(*)のついていないステートメントは、コメントとみなされます。本チュートリアルでは、コメントステートメントには読みやすいよう先頭に//を付けてあります。コメントはMotionViewグラフィカルユーザーインターフェースによっては読み出されず、モデルのMDLが元のファイルまたは別のファイルに保存されると削除されます。

MDLは、いくつかの例外を除き、任意の順序でステートメントを受け入れます。

この言語の習得に役立つよう、チュートリアル例内のコードをこの構造の後ろに示します:
//comments about the MDL file
*BeginMDL(argument list)
//Topology section
*Point…
*Body…
*System(…)
// definitions sub-section
*DefineSystem(..)…
..
.*EndDefine()
//Property of entities directly in *BeginMDL()//Property section for 
entities within Systems and analysis
*BeginContext()
..
..
*EndContext()
.
*EndMDL
図 1 は、振子モデルの詳細を示しています。振子は、絶対座標系の原点において回転ジョイントで地面に固定されています。振子は重力下で自由に落下し、その作用は負の全体座標系Z軸方向です。形状および慣性プロパティが図に示されています。振子の重心は、(0, 10, 10)に位置しています。


図 1. 振子の詳細図
モデルは下記のMDLステートメントを使用します:

MDLモデルファイルの作成

このステップでは、振子モデルにMDLモデルファイルを作成します。

  1. テキストエディタを開きます。
  2. モデルの目的を説明するコメントステートメントを作成します:
    //Pendulum falling under gravity
    //date
  3. モデルファイルの先頭と最後を意味する*BeginMdl() - *EndMdl()ブロックを作成します。
    重要: すべてのMDLモデルファイルステートメントは、これらのブロックステートメントの間になければなりません。
    これは、*BegingMdl()ステートメントのシンタックスです:
    *BeginMdl(model_name, "model_label") 

    model_nameはモデルの変数名。

    model_labelはラベルの記述モデル。

    本チュートリアルの目的のために、以下を使用します:
    *BeginMdl(pendulum, "Pendulum Model")
    *EndMdl()
    ヒント: メニューバーに進み、Help > Indexをクリックすることにより、対応するステートメントのシンタックスを確認します。続いて、Index内にステートメントを入力します。MDLステートメントでは、キーワードのみが大文字小文字の別が識別されます。

エンティティ宣言の作成

ここでは、この問題に必要なエンティティ宣言を作成します。

  1. *Point()ステートメントを使って、振子のピボットにポイントを作成します。
    //Points
    *Point(p_pendu_pivot, "Pivot Point")
    *Point()ステートメントのシンタックスは、*Point(point_name, "point_label", [point_num])です。
    • point_name ポイントの変数名(p_pendu_pivot)。
    • point_label ポイントの記述名(Pivot Point)。
    • point_num 識別番号としてポイントに割り当てられた整数の引数。このチュートリアルでは使用しません。
  2. *Point()ステートメントを使って、振子の重心にポイントを作成します:
    *Point(p_pendu_cm, "Pendulum CM")
  3. *Body()ステートメントを使って、ボールのボディを定義します:
    //Bodies
    *Body(b_link, "Ball", p_pendu_cm)
    *Body()ステートメントのシンタックスは、*Body(body_name, "body_label", [cm_origin], [im_origin], [lprf_origin],[body_num])です。
    • body_name ボディの変数名(b_link)。
    • body_label グラフィカル表示に現れるボディの記述名(Ball)。
    • cm_origin ボディの慣性マーカーの原点についてのオプションの引数(p_pendu_cm)。
    • im_origin ボディの慣性マーカーの原点についてのオプションの引数(本モデルでは不使用)。
    • lprf_origin ボディの局所パート基準枠の原点についてのオプションの引数(本モデルでは不使用)。
    • body_num エンティティ番号としてボディに割り当てられたオプションの整数の引数(本モデルでは不使用)。
    ステータスシンタックスの説明にある角括弧[ ]は、引数がオプションであることを意味します。
  4. リンクと球を表示するには、*Graphics()ステートメントを使用します(円筒に1つと球に1つ)。
    //Graphics
    *Graphic(gr_link, "pendulum link graphic", CYLINDER, b_link
    p_pendu_pivot, POINT, p_pendu_cm, 0.5, CAPBOTH )
    *Graphic(gr_sphere, "pendulum sphere graphic", SPHERE, b_link,
    p_pendu_cm, 1)
    球グラフィックスのシンタックスは、*Graphic(gr_name, "gr_label", SPHERE, body, origin, radius)です。
    • gr_name グラフィックの変数名(gr_sphere)。
    • gr_label グラフィックの記述ラベル(pendulum sphere graphic)。
    • SPHERE この引数は、グラフィックが球であることを示します
    • body グラフィックに関連付けされたボディ(b_link
    • origin 球の中心点の位置(p_pendu_cm)。
    • radius 球の半径(1)。
    円筒グラフィックのシンタックスは、*Graphic(gr_name, "gr_label", CYLINDER, body, point_1, POINT|VECTOR, orient_entity, radius, [CAPBOTH|CAPBEGIN|CAPEND])です。
    • gr_name グラフィックの変数名(gr_link)。
    • gr_label グラフィックの記述ラベル(pendulum link graphic)。
    • CYLINDER この引数は、グラフィックが円筒であることを示します
    • body グラフィックに関連付けされたボディ(b_link
    • Point 1 円筒の一方の終端の位置(p_pendu_pivot)。
    • POINT|VECTOR 円筒の方向付けに使用されるエンティティのタイプを示すキーワード。POINTが使用される場合、以下の引数はポイントを、そうでない場合はベクトルを選択しなくてはなりません。
    • orient_entity 円筒を方向付けするためのエンティティの変数名(p_pendu_cm)。
    • radius 円筒の半径(0.5)。
    • [CAPBOTH|CAPBEGIN|CAPEND] 円筒の一方または両方の終端が覆われているべきかどうかを識別するオプションの引数
  5. ピボットポイントにおける回転ジョイントを作成するには、*RevJoint()ステートメントを使用します:
    //Revolute Joint
    *RevJoint(j_joint, "New Joint", B_Ground, b_link, p_pendu_pivot, VECTOR,
    V_Global_X)
    *RevJoint()ステートメントのシンタックスは、*RevJoint(joint_name, "joint_label", body_1,body_2, origin, POINT|VECTOR, point|vector, [ALLOW_COMPLIANCE])
    • joint_name ジョイントの変数名(j_joint)。
    • joint label 回転ジョイントの記述ラベル(New Joint)。
    • body 1 回転ジョイントによって拘束される1つ目のボディ(B_ground)。
    • body 2 回転ジョイントによって拘束される2つ目のボディ(b_link)。
    • origin 回転ジョイントの位置(p_pendu_pivot)。
    • POINT|VECTOR ポイントまたはベクトルを使ってジョイントを方向付けするための方法を提案するキーワード(VECTOR
    • point|vector 回転ジョイントの回転軸を定義するポイントまたはベクトル(V_Global_X)。
    • [ALLOW COMPLIANCE] ジョイントはコンプライアントとすることが可能であることを示すオプションの引数(コンプライアントであるジョイントはブッシュのように扱われ、コンプライアントと非コンプライアントとの間で切り替えが可能)
  6. エンティティ出力ステートメントを作成するには、*Output - output on entitiesステートメントを使用します。
    //Output
    *Output(o_pendu, "Disp Output", DISP, BODY, b_link)
    出力ステートメントのシンタックスは、*Output(out_name, "out_label", DISP|VEL|ACCL|FORCE, entity_type, ent_name, [ref_marker], [I_MARKER|J_MARKER|BOTH_MARKERS]).
    • out_name 出力の変数名(o_pendu)。
    • out_label 出力の記述ラベル(Disp Output)。
    • DISP|VEL|ACCL|FORCE 出力タイプが変位、速度、加速度、フォースのいずれかを示す引数(DISP)。
    • entity_type 出力がリクエストされるエンティティのタイプを示すキーワード。有効な値は次のとおりです:BODY|JOINT|BEAM|BUSHING|FORCE|SPRINGDAMPER (BODY)
    • ent_name 出力が要求されるエンティティ(b_link)。
    • ref_marker 出力が要求される参照マーカーについてのオプションの引数
    • I_MARKER|J_MARKER|BOTH_MARKERS Iマーカー、Jマーカーまたは両方のマーカー上での出力の捕捉を示すキーワード。デフォルトは両方のマーカー
  7. MDLファイル内に作成したエンティティに正しい値を設定するには、*SetSystem()*SetPoint()*SetBody()を使用します。
    //Property data section
    *SetPoint(p_pendu_pivot, 0, 5, 5)
    *SetPoint(p_pendu_cm, 0, 10, 10)
    *SetBody(b_link, 1, 1000, 1000, 1000, 0, 0, 0)
  8. モデルをpendulum.mdlとして保存します。
    MDLモデルファイルは、以下に示すように見えるはずです:
    //Pendulum Model
    //05/31/XX
    *BeginMDL(pendulum, "Pendulum Model")
    //Topology information
    //declaration of entities
    //Points
    *Point(p_pendu_pivot, "Pivot Point")
    *Point( p_pendu_cm, "Pendulum CM")
    //Bodies
    *Body(b_link, "Ball", p_pendu_cm)
    //Graphics
    *Graphic(gr_sphere, "pendulum sphere graphic", SPHERE, b_link,
    p_pendu_cm, 1)
    *Graphic(gr_link, "pendulum link graphic", CYLINDER, b_link,
    p_pendu_pivot, p_pendu_cm, 0.5, CAPBOTH)
    //Revolute Joint
    *RevJoint(j_joint, "New Joint", B_Ground, b_link, p_pendu_pivot, VECTOR,
    V_Global_X)
    //Output
    *Output(o_pendu, "Disp Output", DISP, BODY, b_link)
    //End Topology
    // Property Information
    *SetPoint(p_pendu_pivot, 0, 5, 5)
    *SetPoint(p_pendu_cm, 0, 10, 10)
    *SetBody( b_link, 1, 1000, 1000, 1000, 0, 0, 0)
    *EndMDL()

MDLモデルファイルの読み込みと実行

このステップでは、ステップで作成したMDLファイルを実行します。エンティティ宣言の作成

  1. 新しいMotionViewセッションを開始します。
  2. Standardツールバーから(Open Model)アイコンをクリックします。
    ヒント: メニューバーからFile > Open > Modelを選択することも可能です。
  3. Open modelダイアログからファイルpendulum.mdlを選択し、Openをクリックします。
  4. Standard Viewツールバーで、(YZ Rear Plane View)ボタンをクリックします。
    モデルは、図 2に示すとおりに見えるはずです:


    図 2.
  5. Projectブラウザを使って、モデルエンティティを確認し、それらのプロパティを検証します。
  6. メニューバーで、Tools > Check Modelをクリックし、モデリングのエラーがないかをチェックします。
  7. MotionSolveを実行します。
    1. (Run)パネルボタンをクリックします。
    2. Simulation TypeにTransientを選択します。
    3. End timeに2秒と指定します。
    4. Simulation Settings ボタンをクリックします。ダイアログ内でTransientタブをクリックし、積分器パラメータを確認します。
    5. Closeをクリックします。
    6. MainタブでSave and run current modelラジオボタンをクリックします。
    7. (ファイルブラウザ)をクリックし、.xmlの名称をpendulumと指定します。
    8. Runをクリックします。実行が完了したら、ソルバーウィンドウとメッセージログを閉じます。

結果のアニメーション表示とプロッティング

ここで、振子のMDLモデル実行の結果をアニメーション表示、およびプロッティングします。

  1. Runパネルで、Animateをクリックします。
    pendulum.h3d結果ファイルを含んだウィンドウが、モデリングウィンドウの横に読み込まれます。
  2. 新しいウィンドウ内をクリックし、アクティブウィンドウとします。
  3. Animationツールバーから(Start/Pause Animation)ボタンをクリックし、モデルをアニメーション表示します。
    注: ボタンを再度クリックすると、アニメーションを停止することができます。
  4. Standard Viewsツールバーの(Fit Model/Fit All Frames)アイコンをクリックし、アニメーションの全てのフレームでウィンドウいっぱいに表示させます。
  5. MotionViewウィンドウ上をクリックし、アクティブウィンドウとします。
  6. Runパネルで、Plotをクリックします。
    pendulum.h3d結果ファイルを含んだプロットウィンドウが、モデリングウィンドウの横に読み込まれます。
  7. パネルで、Y TypeをMarker Displacementに、Y RequestをREQ/70000000 Disp Output - (On Ball)に、Y ComponentをDZに設定します。
  8. 適用(Apply)をクリックします。
    振子のZ方向の変位がプロットされます。
  9. Animationツールバーから(Start/Pause Animation)ボタンをクリックし、プロットとアニメーションを一緒に表示します。
    注: ボタンを再度クリックすると、アニメーションを停止することができます。
    セッションは、図 3で示すようになるはずです:


    図 3.
  10. メニューバーFile > Exitをクリックし、セッションを閉じます。