本項では、剛体の任意の点の運動データを出力する方法を紹介します。
movファイルに出力される運動データは、nodeの運動データだけです。例えば、本例題ではブロックの重心にstructural nodeを定義しましたので、movファイルに出力されるのは、重心の変位、速度、姿勢、および角速度です。では、例えば、ブロックの角の運動を知りたい場合にはどうすれば良いのでしょうか?
理論的には、剛体中の一点の運動(並進および回転)が分かれば、同じ剛体中の任意の点の運動は代数的な変換操作によって求めることが可能です。つまり、structural nodeの運動データさえあれば、同じ剛体に所属する任意の点の運動データはポスト処理によって求めることができます。(実際に、アニメーションはこの方法で作成されます。第12項参照)。しかし、MBDynには“dummy node”という便利な要素が用意されており、dummy nodeを用いれば、剛体中の任意の点の運動データを、MBDynの出力として求めることができます。
dummy nodeは、structural nodeの一形態です(第5項参照)。これまで用いてきたstructural nodeには、運動する剛体の自由度を担わせるために、dynamicという形態を与えました。一方、dummy nodeはstructural nodeにdummyという形態を与えることによって作成します。dummy nodeは自由度を担うことができず、他の自由度を担うnodeに“貼り付け”て使用します。dummy nodeには次の2つの種類(type)があります。
offsetタイプではグローバル座標系に対する運動データを出力します。一方、relative frameタイプでは参照するnodeを指定して、そのnodeに対する相対運動のデータを出力します。offsetタイプのdummy nodeを定義する基本的なステートメントの型は次のようになります。
structural: <node label>, dummy, <base node label>,
offset,
<relative offset>,
<relative orientation matrix> ;
ここで、<base node label>は貼り付け先のnodeのラベル、<relative offset>と<relative orientation matrix>はそれぞれbase nodeに対する相対位置と相対姿勢です。
では、offsetタイプのdummy nodeを使用して、ブロックの角の運動データを出力してみましょう。これは、次のように入力ファイルを書き換えることで行えます。
# free_rotating_block_dummynode.mbd
begin: data;
problem: initial value;
end: data;
begin: initial value;
initial time: 0.;
final time: 5.;
time step: 1.e-2;
max iterations: 10;
tolerance: 1.e-6;
end: initial value;
begin: control data;
structural nodes: 2;
rigid bodies: 1;
end: control data;
# Design Variables
set: real M = 1.; # [kg] Mass
set: real Lx = 0.15; # [m] Width
set: real Ly = 0.05; # [m] Thickness
set: real Lz = 0.3; # [m] Height
set: real Wx0 = 5.; # [rad/s] Initial angular velocity along x axis
set: real Wy0 = 0.; # [rad/s] Initial angular velocity along y axis
set: real Wz0 = 0.; # [rad/s] Initial angular velocity along z axis
set: real Ixx = 1./12.*M*(Ly^2+Lz^2); # [kgm^2] Moment of inertia about x axis
set: real Iyy = 1./12.*M*(Lz^2+Lx^2); # [kgm^2] Moment of inertia about y axis
set: real Izz = 1./12.*M*(Lx^2+Ly^2); # [kgm^2] Moment of inertia about z axis
# Node Labels
set: integer Node_Block = 1;
set: integer Node_Dummy_Block_Corner = 2;
# Body Labels
set: integer Body_Block = 1;
begin: nodes;
structural: Node_Block, dynamic,
0., 0., 0., # absolute position
eye, # absolute orientation
null, # absolute velocity
Wx0, Wy0, Wz0; # absolute angular velocity
structural: Node_Dummy_Block_Corner, dummy, Node_Block,
offset,
Lx/2., Ly/2., Lz/2., # relative offset
eye; # relative orientation
end: nodes;
begin: elements;
body: Body_Block, Node_Block,
M, # mass
null, # relative center of mass
diag, Ixx, Iyy, Izz; # inertia matrix
end: elements;
まず、control dataブロックに少し変化があることに注目してください。dummy nodeを付加したことにより、structural nodeの数は全体で2つになりますのでそのように書き直してあります。新しく付加されるdummy nodeにはラベル「2」を付け、これをあらかじめsetステートメントで「Node_Dummy_Block_Corner」という名前の変数に代入しています。
次に、nodesブロック内のdummy nodeの定義を見てみましょう。以下のように記述されています。
structural: Node_Dummy_Block_Corner, dummy, Node_Block,
offset,
Lx/2., Ly/2., Lz/2., # relative offset
eye; # relative orientation
このステートメントは、上で既に紹介したoffsetタイプのステートメントの型と照らし合わせればすぐに読み解くことができるでしょう。このdummy nodeはnode「Node_Block」に貼り付けられ、ブロックの角の位置に置かれています。
コード1の修正した入力ファイルを用いてMBDynを実行すれば、dummy nodeの出力として、ブロックの角の運動データが得られます。つまり、movファイルには「Node_Block」と「Node_Dummy_Block_Corer」の2つのnodeの運動データが書き出されます。
しかしこの場合、第7項でも少し言及しましたが、一列のデータの中に2つのnodeのデータが交互に織り込まれた形で書き出されています。従って、これまでのように列データをそのまま用いてグラフ等を作成することは出来ません。movファイルのデータに対し、nodeごとにデータを分離する処理が必要となりますが、これについては次項で説明します。