Home > リソース > MBDynチュートリアル > 8.自由回転するブロック(1)〜主慣性モーメント
MBDynチュートリアル

8.自由回転するブロック(1)〜主慣性モーメント

本項から新しい例題に入ります。前の例題に引き続き、剛体が一つだけの非常に簡単なモデルを考えます。前の例題では並進運動を扱いましたが、今度の例題では回転運動を扱います。

例題2(自由回転するブロック)

無重力の空間内に、図1に示すような直方体のブロックを考えます。質量はM = 1.0kg、辺の長さはLx = 15cm、Ly = 5cm、Lz = 30cmとします。このブロックに様々な初期角速度を与えた時のブロックの回転運動をシミュレーションします。


Block

図1: ブロック

主慣性モーメント

ブロックの重心を原点とし、x、y、z軸が初期時刻におけるLx、Ly、Lzにそれぞれ平行な静止座標系を考え、これをグローバル座標系とします。ブロックの慣性主軸は、初期時刻においてグローバル座標系のx、y、z軸と一致し、主慣性モーメントは次の式で求められます。


PrincipalMOI_Block

質量Mと辺の長さLx、Ly、Lzの数値を代入すると、Ixx = 7.7e3 (kg m2)、Iyy = 9.4e3 (kg m2)、Izz = 2.1e3 (kg m2) となり、Iyy > Ixx > Izz であることが分かります。

入力ファイル

例題2のブロックの回転運動をMBDynで解析するための、入力ファイルの記述例を下のコード1に示します。

free_rotating_block.mbd
# free_rotating_block.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: 1;
   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 = 0.;   # [rad/s] Initial angular velocity along x axis
set: real Wy0 = 0.;   # [rad/s] Initial angular velocity along y axis
set: real Wz0 = 5.;   # [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;

# 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
      
end: nodes;

begin: elements;
   body: Body_Block, Node_Block,
      M,                   # mass
      null,                # relative center of mass
      diag, Ixx, Iyy, Izz; # inertia matrix
      
end: elements;
コード1: 例題2(自由回転するブロック)の入力ファイル記述例

入力ファイルの解説

まず注目していただきたいのは、ブロックの慣性行列(inertia matrix)の定義の仕方です。これは3段階で行われています。まずMLxLyLzを設計変数として定義し、次にこれらの変数を用いて主慣性モーメントIxxIyyIzzを式によって求めています(ここでもsetカードが用いられます)。そして最後にIxxIyyIzzを用いて、body「Body_Block」の慣性行列を定義しています。ここで「Body_Block」の慣性行列の記述は

   diag, Ixx, Iyy, Izz

となっていますが、「diag」はそれに続く3つの数値を対角成分とする対角行列(diagonal matrix)を表すキーワードです。尚、一般の慣性行列は対称行列(symmetric matrix)なので、キーワード「sym」を用いて定義できます。(第12項参照)

次に注目していただきたいのは、node「Node_Block」の初期角速度が、変数Wx0Wy0Wz0で定義されている点です。このシミュレーションモデルは、様々な初期角速度でシミュレーションすることが前提となっているので、このように初期角速度を変数にしておくと便利なのです。

シミュレーション

では、次の3ケースについてシミュレーションを行って見ましょう。

シミュレーション結果のアニメーションを動画1〜3に示します。ケース1はz軸に対応する慣性主軸周りに回転し、ケース2はx軸に対応する慣性主軸周りに回転します。ケース3はより一般的な回転運動をします。




動画1: ケース1: Wx0=0., Wy0=0., Wz0=5. (rad/s)



動画2: ケース2: Wx0=5., Wy0=0., Wz0=0. (rad/s)



動画3: ケース3: Wx0=5., Wy0=0., Wz0=5. (rad/s)