Home > リソース > MBDynチュートリアル > 5.自由落下する剛体(3)〜剛体を定義するStructural NodeとBody
MBDynチュートリアル

5.自由落下する剛体(3)〜剛体を定義するStructural NodeとBody

前項の続きで、例題1の入力ファイル「free_falling_body.mbd」のnodesブロックとelementsブロックの内容について解説します。ここでは、MBDynでシミュレーションモデルを構築する上で最も基本となる、“structural node”と“body”要素が登場します。

Structural Node

nodeとは、シミュレーションモデルの自由度の担い手であり、シミュレーションモデルを構築する上で欠かせない要素です。 nodeには次のような種類があります。

この中で、剛体の自由度(6自由度)を担うことができるのはstructural nodeです。例題1では、1つの剛体の運動を扱うので、structural nodeを空間内に1つ定義する必要があります。もし剛体が2つならば2つのstructural nodeが必要となり、一般にN個の剛体の運動をシミュレーションする際にはN個のstructural nodeが必要となります。structural nodeにはstaticdynamicmodaldummyの4つの形態(type)がありますが、運動する剛体の自由度を担わせる用途においては、dynamicを選択します。

dynamicなstructural nodeを定義する基本的なステートメントの型は次のようになります。

 structural: <node label>, dynamic, <position>, <orientation>,
             <velocity>, <angular velocity> ;

さて、例題1の入力ファイルのnodesブロックでは、1つのstructural nodeが定義されています。

   structural: 1, dynamic, null, eye, 0., 3., 0., null;

これを上記の型と対応させると、以下のようになります。

つまり、このdynamicなstructural nodeには「1」というラベル(名前)が付けられ、初期位置は「null」(=[0.,0.,0.])、初期姿勢は「eye」(単位行列)、初期速度は「0., 3., 0.」(Y方向に3.0)、初期角速度は「null」(=[0.,0.,0.])となります。剛体の初期速度を、このstructural nodeの初期速度に反映させている点に注目しましょう。

一般に、<node label>は整数、<position><velocity><angular velocity>3次元ベクトル(3×1ベクトル)、<orientation>3×3回転行列で指定します。また、零ベクトルは「null」、単位行列は「eye」というキーワードで代用することが可能です。

3次元ベクトルは一般に、単に数字を3つ並べれば良いので簡単ですが、eye以外の3×3回転行列は一般にどのように記述すれば良いのでしょうか?いくつか方法がありますが、最も単純な方法は、「matr」というキーワードに続いて9個の行列要素を行順に羅列する方法です。例えば、Z軸周り45度の回転を表す回転行列


OrientationMatrixExample

は、次のように記述できます。

   matr, cos(pi/4.), -sin(pi/4.), 0., sin(pi/4.), cos(pi/4.), 0., 0., 0., 1.,

ちなみに、eye

   matr, 1., 0., 0., 0., 1., 0., 0., 0., 1.,

と同義です。行列や回転行列を記述する色々な方法については第13項で紹介します。

Body

structural nodeは剛体の自由度を与えるだけなので、それだけでは剛体を定義したことにはなりません。剛体を定義するためには、質量重心位置、および慣性テンソルの情報が必要です。これらの情報を担うのがbodyと呼ばれる要素で、elementsブロック内で定義します。

bodyを定義する基本的なステートメントの型は次のようになります。

 body: <label>, <node label>, <mass>, <relative center of mass>,
       <inertia matrix> ;

さて、例題1の入力ファイルのelementsブロックでは、1つのbodyが定義されています。

   body: 1, 1, 1., null, eye;

これを上記の型と対応させると、以下のようになります。

つまり、このbodyには「1」というラベルが付けられ、ラベル「1」のnodeにくっつきます。また、質量は「1.」、nodeに対する重心の相対位置は「null」(=[0.,0.,0.])、慣性行列は「eye」(単位行列)となります。

一般に、<label>は整数、<node label>は存在するnodeのラベル(整数)、<mass>は実数、<relative center of mass>は3次元ベクトル(3×1ベクトル)、<inertia matrix>3×3行列で指定します。また、零ベクトルは「null」、単位行列は「eye」というキーワードで代用することが可能です。

Gravity

最後は、重力を定義するステートメントです。

   gravity: 0., 0., -1., const, 9.81;

これは、おそらく簡単に予想できるように、「0., 0., -1.」で重力の方向(−Z方向)を定め、「const, 9.81」で重力加速度の大きさ(定数)を定義しています。正確には、gravityカードの引数はtemplate drive caller(第19項参照)と呼ばれるオブジェクトで、上記ステートメントは実は、次のステートメントの省略形です。

   gravity: single, 0., 0., -1., const, 9.81;