Home > リソース > MBDynチュートリアル > 19.クランク‐スライダ機構(3)〜Structural Force、Template Drive Caller
MBDynチュートリアル

19.クランク‐スライダ機構(3)〜Structural Force、Template Drive Caller

本項では、外部からの力を表現する“structural force”要素を紹介します。また、structural forceを定義するのに必要な“template drive caller”オブジェクトについて説明します。

例題6(クランク‐スライダ機構)

例題5で作成したクランク‐スライダ機構のシミュレーションモデルにおいて、スライダに外力が働く場合を考えてみましょう。図1に示すようにスライダに外力が働くとして、入力ファイルを書き直してみます。


image_crank_slider_force

図1: クランク‐スライダ機構

Structural force

外部から働く力は“structural force”要素で表現します。structural forceのステートメントの型は次のようになります。

   force: <label>, 
      { absolute | follower }, 
         <node label>,
            position, <relative arm>,
            <force value>;

ここで、<node label>は作用対象のnodeのラベル、<relative arm>は作用点のnodeに対する相対座標です。また<force value>はtemplate drive callerオブジェクトによって指定される力の時間関数です。template drive callerについては以下で説明します。

absolutefollowerのどちらかを選択します。absoluteを選択すると、力の向きはグローバル座標系に対して常に一定に保たれます。一方、followerを選択すると、力の向きはnodeとともに変化します。

Template Drive Caller

第18項で紹介したdrive callerは、時間依存のスカラー、つまり1次元の入力でした。“template drive caller”は、多次元の入力を与える必要がある場合に用います。例えば、3次元ベクトルや6次元ベクトルの入力が必要な場合です。次の4種類のtemplate drive callerがあります。

nullは零ベクトルを表し、「何も入力しない」ことを意味します。

singleは次のように記述し、基準ベクトルとゲインによって多次元の入力を定義します。

   single,
      <entity>, <drive caller>

ここで、<entity>は一定の基準ベクトル、<drive caller>は時間依存のゲインです。

componentは次のように記述し、多次元の入力を成分ごとに定義します。この場合は、次元の数だけdrive callerが必要です。

   component,
      { inactive | <drive caller> }, { inactive | <drive caller> }, ...

arrayについての説明はここでは省略します。

スライダ外力

例題5のクランク‐スライダ機構のシミュレーションモデルに、F = 50(N) の一定スライダ外力をstructural forceによって追加します。スライダは1自由度しか持たないので、作用点はどこでも構いません。「Node_Slider」の位置を作用点とすれば簡単でしょう。以下は、-x方向のスライダ外力を、template drive callerのsingleによって定義します。

set: integer FoStr_Slider = 1;

force: FoStr_Slider,
   absolute,
      Node_Slider,
         position, null,              # relative arm
         single, -1, 0, 0, const, 50; # force value

入力ファイル

コード1に、スライダ外力を追加した例題6のクランク‐スライダ機構モデルの入力ファイルの全体を示します。structural force要素を追加した最後の箇所以外は例題5の入力ファイルとほとんど同じですが、control dataブロック内でforcesの項が追加されていることに注目してください。

crank_slider_2.mbd
# crank_slider_2.mbd

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

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

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

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

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

begin: control data;
   structural nodes: 4;
   rigid bodies:     3;
   joints:           6;
   forces:           1;
end: control data;

#-----------------------------------------------------------------------------
# Design Variables
set: real Mass_Crank    = 1.;
set: real Mass_Conrod   = 1.;
set: real Mass_Slider   = 1.;
set: real Length_Crank  = 0.2;
set: real Length_Conrod = 0.4;
set: real Offset_Slider = 0.05;

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

# Node Labels
set: integer Node_Ground = 1;
set: integer Node_Crank  = 2;
set: integer Node_Conrod = 3;
set: integer Node_Slider = 4;

# Body Labels
set: integer Body_Crank  = 1;
set: integer Body_Conrod = 2;
set: integer Body_Slider = 3;

# Joint Labels
set: integer JoClamp_Ground        = 1;
set: integer JoAxrot_Ground_Crank  = 2;
set: integer JoRevh_Crank_Conrod   = 3;
set: integer JoInlin_Conrod_Slider = 4;
set: integer JoInlin_Ground_Slider = 5;
set: integer JoPrism_Ground_Slider = 6;

# Force Labels
set: integer FoStr_Slider = 1;

#-----------------------------------------------------------------------------
# Intermediate Variables
set: real Izz_Crank  = Mass_Crank*Length_Crank^2./12.;
set: real Izz_Conrod = Mass_Conrod*Length_Conrod^2./12.;

#-----------------------------------------------------------------------------
# References
reference: Ref_Conrod,
   Length_Crank, 0., 0.,                             # absolute position
   euler, 0., 0., asin(Offset_Slider/Length_Conrod), # absolute orientation
   null,                                             # absolute velocity
   null;                                             # absolute angular velocity

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

begin: nodes;

   #-----------------------------------------------------------------------------
   # Nodes
   structural: Node_Ground, static,
      0., 0., 0., # absolute position
      eye,        # absolute orientation
      null,       # absolute velocity
      null;       # absolute angular velocity

   structural: Node_Crank, dynamic,
      Length_Crank/2., 0., 0., # absolute position
      eye,                     # absolute orientation
      null,                    # absolute velocity
      null;                    # absolute angular velocity
      
   structural: Node_Conrod, dynamic,
      reference, Ref_Conrod, Length_Conrod/2., 0., 0., # absolute position
      reference, Ref_Conrod, eye,                      # absolute orientation
      null,                                            # absolute velocity
      null;                                            # absolute angular velocity
      
   structural: Node_Slider, dynamic,
      reference, Ref_Conrod, Length_Conrod, 0., 0., # absolute position
      eye,                                          # absolute orientation
      null,                                         # absolute velocity
      null;                                         # absolute angular velocity
      
end: nodes;

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

begin: elements;

   #-----------------------------------------------------------------------------
   # Bodies
   body: Body_Crank, Node_Crank,
      Mass_Crank,              # mass
      null,                    # relative center of mass
      diag, 1., 1., Izz_Crank; # inertia matrix
      
   body: Body_Conrod, Node_Conrod,
      Mass_Conrod,              # mass
      null,                     # relative center of mass
      diag, 1., 1., Izz_Conrod; # inertia matrix
      
   body: Body_Slider, Node_Slider,
      Mass_Slider, # mass
      null,        # relative center of mass
      eye;         # inertia matrix
   
   #-----------------------------------------------------------------------------
   # Joints
   joint: JoClamp_Ground,
      clamp,
         Node_Ground,
            null, # absolute position
            eye;  # absolute orientation
   
   joint: JoAxrot_Ground_Crank, 
      axial rotation, 
         Node_Ground,
            null,                     # relative offset
            hinge, eye,               # relative orientation
         Node_Crank,
            -Length_Crank/2., 0., 0., # relative offset
            hinge, eye,               # relative orientation
         ramp, 2.*pi, 0., 1., 0.;     # angular velocity   
            
   joint: JoRevh_Crank_Conrod, 
      revolute hinge, 
         Node_Crank,
            reference, Ref_Conrod, null,       # relative offset
            hinge, reference, Ref_Conrod, eye, # relative axis orientation
         Node_Conrod,
            reference, Ref_Conrod, null,       # relative offset
            hinge, reference, Ref_Conrod, eye; # relative axis orientation
            
   joint: JoInlin_Conrod_Slider, 
      in line, 
         Node_Conrod,
            Length_Conrod/2., 0., 0., # relative line position
            eye,                      # relative orientation
         Node_Slider;
      
   joint: JoInlin_Ground_Slider, 
      in line,
         Node_Ground,
            0., Offset_Slider, 0.,         # relative line position
            1, 0., 0., -1., 3, 1., 0., 0., # relative orientation
         Node_Slider;
      
   joint: JoPrism_Ground_Slider,
      prismatic,
         Node_Ground,
         Node_Slider;
         
   #-----------------------------------------------------------------------------
   # Forces
   force: FoStr_Slider,
      absolute,
         Node_Slider,
            position, null,              # relative arm
            single, -1, 0, 0, const, 50; # force value
                  
end: elements;
コード1: 例題6(クランク‐スライダ機構)の入力ファイル記述例