Home > リソース > MBDynチュートリアル > 21.ジャイロモーメント実験装置〜Drive hinge、Scalar function drive
MBDynチュートリアル

21.ジャイロモーメント実験装置〜Drive hinge、Scalar function drive

剛体がある軸周りに自転している時、自転軸を振り回すように外部から角速度が加わると、その角速度と自転軸の双方に対して直角に回転モーメントが発生します。この回転モーメントはジャイロモーメントと呼ばれています。学校の授業や科学博物館などで、回転台の上に乗って回転する自転車の車輪を傾けてジャイロモーメントを体験する実験を見たことがあるのではないでしょうか(動画を見る>>)。この実験を模擬する装置のシミュレーションモデルを作成してみましょう。

例題7(ジャイロモーメント実験装置)

図1に示すような、ジャイロモーメント実験装置のシミュレーションモデルを作成します。ステージは地面に対して水平に摩擦無く回転します。ステージに固定された柱にはアームが取り付けられ、アームにはホイールが取り付けられています。ホイールはアームに対して一定の角速度で回転します。アームはステージに対して垂直平面内で回転し、アームの角度はモータで自由に変えることができるとします。


gyro_moment_machine

図1: ジャイロモーメント実験装置

シミュレーションモデルの設計

図2に、ジャイロモーメント実験装置のシミュレーションモデルの設計図を示します。図では、reference「Ref_Wheel_Spindle」をnode「Node_Wheel」から少しずらして描いてありますが、実際は同じ位置にあります。


plan_gyro_moment_machine

図2: ジャイロモーメント実験装置シミュレーションモデルの設計図

便宜上、各nodeはそれぞれの部品の回転方向を z 方向として定義します。アームとステージの接続は、ジョイントの“spherical hinge”と“drive hinge”を併用して行います。spherical hingeで相対位置を拘束し、drive hingeで相対姿勢を拘束します。drive hingeについては以下で説明します。ところで、この場合、spherical hingeの代わりにrevolute hingeを用いてしまうと、過拘束になってしまうので注意が必要です。(ただし、revolute hingeとtotal jointの組み合わせであれば可能です。)

Drive hinge

このジョイントは、2つのnodeの相対姿勢を拘束し(相対位置は拘束しない)、一方のnodeをもう一方のnodeに対して強制回転させることができます。強制回転の回転角はtemplate drive callerによって定義します。drive hingeの基本的なステートメントの型は次のようになります。

   joint: <label>,
      drive hinge,
         <node 1>,
            hinge, <relative orientation matrix 1>,
         <node 2>,
            hinge, <relative orientation matrix 2>,
         <hinge orientation>; 

ここで、<hinge orientation>には、template drive callerオブジェクトで強制回転の回転角を定義します。

本例題では、このdrive hingeによって、アームの角度を変化させるモータを表現します。

Scalar function drive

アーム角の入力は自由に行いたいので、drive hingeの<hinge orientation>入力には“scalar function drive”を用いることにします。scalar function driveは、任意のscalar functionを入力することができるdrive callerです。scalar function driveの型は次のようになります。

   scalar function, "<scalar function name>",
      <scalar function definition>

では、アーム角の入力を図3のグラフに示すように行いたいと仮定しましょう。図3のグラフの関数は区分線形の関数なので、“multilinear”というscalar functionを用いて定義することができます。


plot_input_angle

図3: アーム角の時間変化

scalar function driveで図3のグラフの関数の入力を行うdrive hingeの定義は次のようになります。template drive callerのsingleを用いて、「Node_Arm」のz軸周りにscalar function driveで強制変位を与えていることに注目してください。入力ファイルでは角度の単位がradianであることに注意しましょう。

set: integer JoDrivh_Stage_Arm = 3;

joint: JoDrivh_Stage_Arm,
   drive hinge,
      Node_Stage,
         hinge, euler, -pi/2., 0., 0.,                      # relative axis orientation
      Node_Arm,
         hinge, eye,                                        # relative axis orientation
      single, 0., 0., 1., scalar function, "Fun_Arm_Input", # position
         multilinear,
            0.0, 0.,
            0.5, 0.,
            1.0, pi/4.,
            1.5, pi/4.,
            2.0, pi/2.,
            2.5, pi/2.,
            3.0, pi/4.,
            3.5, pi/4.,
            4.0, 0,
            4.5, 0,
            5.0, -pi/4.,
            5.5, -pi/4.,
            6.0, -pi/2.,
            6.5, -pi/2.,
            7.0, -pi/4.,
            7.5, -pi/4.,
            8.0, 0.,
            8.5, 0.;

入力ファイル

以上を踏まえて作成した、例題7のジャイロモーメント実験装置の解析を行うための入力ファイルを以下のコード1に示します。

gyro_moment.mbd
# gyro_moment.mbd

#-----------------------------------------------------------------------------
# [Data Block]

begin: data;
   problem: initial value;
end: data;

#-----------------------------------------------------------------------------
# [<Problem> Block]

begin: initial value;
   initial time:   0.;
   final time:     8.5;
   time step:      1.e-3;
   max iterations: 10;
   tolerance:      1.e-6;
end: initial value;

#-----------------------------------------------------------------------------
# [Control Data Block]

begin: control data;
   output frequency: 10;
   structural nodes: 3;
   rigid bodies:     3;
   joints:           4;
end: control data;

#-----------------------------------------------------------------------------
# Design Variables

set: real I_Stage = 0.1;   #[kg m^2]  Moment of Inertia of Stage
set: real M_Wheel = 3.;    #[kg] Mass of Wheel
set: real R_Wheel = 0.4;   #[m] Radius of Wheel
set: real H_Arm   = 1.;    #[m] Height of Arm
set: real L_Arm   = 0.6;   #[m] Length of Arm
set: real W_Wheel = 10*pi; #[rad/s] Angular Velocity of Wheel

#-----------------------------------------------------------------------------
# Reference Labels
set: integer Ref_Wheel_Spindle = 1;

# Node Labels
set: integer Node_Stage = 1;
set: integer Node_Arm   = 2;
set: integer Node_Wheel = 3;

# Body Labels
set: integer Body_Stage = 1;
set: integer Body_Arm   = 2;
set: integer Body_Wheel = 3;

# Joint Labels
set: integer JoRevp_Stage      = 1;
set: integer JoSphh_Stage_Arm  = 2;
set: integer JoDrivh_Stage_Arm = 3;
set: integer JoRevh_Arm_Wheel  = 4;

#-----------------------------------------------------------------------------
# Intermediate Variables
set: real Ixx_Wheel = M_Wheel*R_Wheel^2./4.;
set: real Iyy_Wheel = M_Wheel*R_Wheel^2./4.;
set: real Izz_Wheel = M_Wheel*R_Wheel^2./2.;

#-----------------------------------------------------------------------------
# References
reference: Ref_Wheel_Spindle,
   0., L_Arm, H_Arm,     # absolute position
   euler, 0., pi/2., 0., # absolute orientation
   null,                 # absolute velocity
   null;                 # absolute angular velocity

#-----------------------------------------------------------------------------
# [Nodes Block]

begin: nodes;

   #-----------------------------------------------------------------------------
   # Nodes
   structural: Node_Stage, dynamic,
      null, # absolute position
      eye,  # absolute orientation
      null, # absolute velocity
      null; # absolute angular velocity
      
   structural: Node_Arm, dynamic,
      0., 0., H_Arm,         # absolute position
      euler, -pi/2., 0., 0., # absolute orientation
      null,                  # absolute velocity
      null;                  # absolute angular velocity
      
   structural: Node_Wheel, dynamic,
      reference, Ref_Wheel_Spindle, null,             # absolute position
      reference, Ref_Wheel_Spindle, eye,              # absolute orientation
      reference, Ref_Wheel_Spindle, null,             # absolute velocity
      reference, Ref_Wheel_Spindle, 0., 0., -W_Wheel; # absolute angular velocity
      
end: nodes;

#-----------------------------------------------------------------------------
# [Elements Block]

begin: elements;

   #-----------------------------------------------------------------------------
   # Bodies
   body: Body_Stage, Node_Stage,
      1.,                    # mass
      null,                  # relative center of mass
      diag, 1., 1., I_Stage; # inertia matrix
      
   body: Body_Arm, Node_Arm,
      1.,                        # mass
      null,                      # relative center of mass
      diag, 1.e-6, 1.e-6, 1.e-6; # inertia matrix
      
   body: Body_Wheel, Node_Wheel,
      M_Wheel,                               # mass
      null,                                  # relative center of mass
      diag, Ixx_Wheel, Iyy_Wheel, Izz_Wheel; # inertia matrix  
              
   #-----------------------------------------------------------------------------
   # Joints
   joint: JoRevp_Stage, 
      revolute pin, 
         Node_Stage,
            null, # relative offset
            null; # absolute pin position
            
   joint: JoSphh_Stage_Arm, 
      spherical hinge, 
         Node_Stage,
            0., 0., H_Arm, # relative offset
         Node_Arm,
            null;          # relative offset
            
   joint: JoDrivh_Stage_Arm,
      drive hinge,
         Node_Stage,
            hinge, euler, -pi/2., 0., 0.,                      # relative axis orientation
         Node_Arm,
            hinge, eye,                                        # relative axis orientation
         single, 0., 0., 1., scalar function, "Fun_Arm_Input", # position
            multilinear,
               0.0, 0.,
               0.5, 0.,
               1.0, pi/4.,
               1.5, pi/4.,
               2.0, pi/2.,
               2.5, pi/2.,
               3.0, pi/4.,
               3.5, pi/4.,
               4.0, 0,
               4.5, 0,
               5.0, -pi/4.,
               5.5, -pi/4.,
               6.0, -pi/2.,
               6.5, -pi/2.,
               7.0, -pi/4.,
               7.5, -pi/4.,
               8.0, 0.,
               8.5, 0.; 
            
   joint: JoRevh_Arm_Wheel, 
      revolute hinge, 
         Node_Arm,
            reference, Ref_Wheel_Spindle, null,        # relative offset
            hinge, reference, Ref_Wheel_Spindle, eye,  # relative axis orientation
         Node_Wheel,
            reference, Ref_Wheel_Spindle, null,        # relative offset
            hinge, reference, Ref_Wheel_Spindle, eye;  # relative axis orientation 
                
end: elements;
コード1: 例題7(ジャイロモーメント実験装置)の入力ファイル記述例

アニメーション

コード1の入力ファイルによる、シミュレーション結果のアニメーションを動画1に示します。




動画1: ジャイロモーメント実験装置シミュレーション

プロット

シミュレーション結果より、ステージの角速度と角加速度のプロットを図4に示します。アーム角が変化する時(図3参照)、ジャイロモーメントが発生し、ステージに角加速度が生じます。アーム角が±90度に近づくに従って、ステージに生じる角加速度が小さくなります。これは、ジャイロモーメントベクトルが水平方向に近づき、その鉛直方向成分が減少するためです。


plot_stage_ang_vel_acc

図4: ステージの角速度と角加速度の変化