MV-1060:MDLステートメントを用いた振子モデルの構築
本チュートリアルでは、モデル定義言語(MDL)を用いて振子モデルを作成し、モデルの動的シミュレーションを実行し、振子の回転のプロッティングとアニメーションの確認を行う方法について学習します。
- 任意のテキストエディタで開いて編集が可能
- モデルのデバッグを補助
- カスタムモデリングの要件に条件ステートメント"if"を使用可能
- モジュールモデルおよび再使用可能モデルの構築が可能
- モードのパラメータ化が可能
- GUIで使用できないモデリングエンティティ(CommandSetsなど)の使用が可能
- Section 1:MDLのエンティティ
- モデリングエンティティは、MDLステートメントのかたちでMDLに保存されます。全てのMDLステートメントは、アスタリスク(*)で始まります。 エンティティには以下の2つのタイプがあります:
- 一般的なエンティティ
- 定義ベースのエンティティ
- 一般的なエンティティ
-
- エンティティの定義に1つのステートメントのみを有します。プロパティの設定には1つまたは複数のステートメントを有します。
- 例として、ポイント、ボディ、ジョイントなどが挙げられます。
- 各一般的エンティティは、そのタイプに応じたプロパティを有します。例えば、1つのポイントはx座標、y座標、z座標、ラベル、ステート、および変数名のプロパティを有しています。
- 定義ベースのエンティティ
-
- 定義と呼ばれるブロックステートメントで定義され、そのインスタンスはインスタンス生成ステートメントによってモデル内に生成されます。
- ブロックは通常*Define()ステートメントで始まり、*EndDefine()ステートメントで終わります。
- エンティティ(またはブロック)は、一連のMDLエンティティまたは部材で構成されています。
- これらのエンティティは、再使用可能です。一旦定義されると、同じエンティティ定義は同じモデルまたは別のモデルファイル内で何度もインスタンス生成されることが可能です。
- Section 2:エンティティのプロパティ
-
- 各エンティティは、変数、ラベル、およびエンティティに関連したその他の特性を有しています。
- 各エンティティには、固有の変数名が付けられていなくてはなりません。
- 以下は、推奨される変数名の命名規則です。これによって、ユーザーはデバッグ中にモデリングエンティティを特定することができます。この規則は強制するものではありませんが、適用が推奨されます。
- 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()ブロックに含まれている場合、ステートメントのブロックは『定義』と呼ばれます。ブロック内のステートメントには下記が含まれます:
- エンティティを定義するトポロジーステートメント
- プロパティを割り当てるSetステートメント。定義ブロック内のこれらのSetステートメントは定義内のエンティティのデフォルト値と考えられるため、"Default Sets"と呼ばれます。
*Define()ブロックのコンテキストの外側にあるステートメントまたはブロックは、データと呼ばれます。それらは:- システム、アセンブリ、またはアナリシス内のエンティティに関連した*BeginContext()ブロック内のSetステートメント
- *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モデルファイルを作成します。
- テキストエディタを開きます。
-
モデルの目的を説明するコメントステートメントを作成します:
//Pendulum falling under gravity //date
-
モデルファイルの先頭と最後を意味する*BeginMdl() - *EndMdl()ブロックを作成します。
重要: すべてのMDLモデルファイルステートメントは、これらのブロックステートメントの間になければなりません。これは、*BegingMdl()ステートメントのシンタックスです:
*BeginMdl(model_name, "model_label")
model_name
はモデルの変数名。model_label
はラベルの記述モデル。本チュートリアルの目的のために、以下を使用します:*BeginMdl(pendulum, "Pendulum Model") *EndMdl()
ヒント: menu barに進み、 をクリックすることにより、対応するステートメントのシンタックスを確認します。続いて、Index内にステートメントを入力します。MDLステートメントでは、キーワードのみが大文字小文字の別が識別されます。
エンティティ宣言の作成
ここでは、この問題に必要なエンティティ宣言を作成します。
-
*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
識別番号としてポイントに割り当てられた整数の引数。このチュートリアルでは使用しません。
-
*Point()ステートメントを使って、振子の重心にポイントを作成します:
*Point(p_pendu_cm, "Pendulum CM")
-
*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
エンティティ番号としてボディに割り当てられたオプションの整数の引数(本モデルでは不使用)。
[ ]
は、引数がオプションであることを意味します。 -
リンクと球を表示するには、*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]
円筒の一方または両方の終端が覆われているべきかどうかを識別するオプションの引数
-
ピボットポイントにおける回転ジョイントを作成するには、*RevJoint()ステートメントを使用します:
*RevJoint()ステートメントのシンタックスは、*RevJoint(joint_name, "joint_label", body_1,body_2, origin, POINT|VECTOR, point|vector, [ALLOW_COMPLIANCE])//Revolute Joint *RevJoint(j_joint, "New Joint", B_Ground, b_link, p_pendu_pivot, VECTOR, V_Global_X)
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]
ジョイントはコンプライアントとすることが可能であることを示すオプションの引数(コンプライアントであるジョイントはブッシュのように扱われ、コンプライアントと非コンプライアントとの間で切り替えが可能)
-
エンティティ出力ステートメントを作成するには、*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マーカーまたは両方のマーカー上での出力の捕捉を示すキーワード。デフォルトは両方のマーカー
-
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)
-
モデルを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ファイルを実行します。エンティティ宣言の作成。
- 新しいMotionViewセッションを開始します。
-
Standardツールバーから
(Open Model)アイコンをクリックします。
ヒント: menu barから を選択することも可能です。 - Open modelダイアログからファイルpendulum.mdlを選択し、Openをクリックします。
-
Standard Viewツールバーで、
(YZ Rear Plane View)ボタンをクリックします。
モデルは、図 2に示すとおりに見えるはずです:図 2.
- Project Browserを使って、モデルエンティティを確認し、それらのプロパティを検証します。
- menu barで、 をクリックし、モデリングのエラーがないかをチェックします。
-
MotionSolveを実行します。
-
(Run)パネルボタンをクリックします。
- Simulation TypeにTransientを選択します。
- End timeに2秒と指定します。
- Simulation Settings ボタンをクリックします。ダイアログ内でTransientタブをクリックし、積分器パラメータを確認します。
- Closeをクリックします。
- MainタブでSave and run current modelラジオボタンをクリックします。
-
(ファイルブラウザ)をクリックし、.xmlの名称をpendulumと指定します。
- Runをクリックします。実行が完了したら、ソルバーウィンドウとメッセージログを閉じます。
-
結果のアニメーション表示とプロッティング
ここで、振子のMDLモデル実行の結果をアニメーション表示、およびプロッティングします。
-
Runパネルで、Animateをクリックします。
pendulum.h3d結果ファイルを含んだウィンドウが、modeling windowの横に読み込まれます。
- 新しいウィンドウ内をクリックし、アクティブウィンドウとします。
-
Animationツールバーから
(Start/Pause Animation)ボタンをクリックし、モデルをアニメーション表示します。
注: ボタンを再度クリックすると、アニメーションを停止することができます。
-
Standard Viewsツールバーの
(Fit Model/Fit All Frames)アイコンをクリックし、アニメーションの全てのフレームでウィンドウいっぱいに表示させます。
- MotionViewウィンドウ上をクリックし、アクティブウィンドウとします。
-
Runパネルで、Plotをクリックします。
pendulum.h3d結果ファイルを含んだプロットウィンドウが、modeling windowの横に読み込まれます。
- パネルで、Y TypeをMarker Displacementに、Y RequestをREQ/70000000 Disp Output - (On Ball)に、Y ComponentをDZに設定します。
-
Applyをクリックします。
振子のZ方向の変位がプロットされます。
-
Animationツールバーから
(Start/Pause Animation)ボタンをクリックし、プロットとアニメーションを一緒に表示します。
注: ボタンを再度クリックすると、アニメーションを停止することができます。セッションは、図 3で示すようになるはずです:図 3.
- menu barで をクリックし、セッションを閉じます。