Force: Two Body Vector

Model ElementForce_Vector_TwoBodyは、2つのReference_Marker間で作用する一般的な力やトルクを定義します。

説明

これは、力、トルク、またはその両方をモデル化するために使用できます。力やトルクのベクトルは、3番目のReference_Markerを基準にして、3つの成分により定義されます。成分は、MotionSolveの式を使用するか、ユーザー定義のサブルーチンを使用して定義できます。任意のシステム状態および時間の関数にできます。

フォーマット

Force_Vector_TwoBodyは次のように使用できます:
  • 力のみ:ForceOnly
  • トルクのみ:TorqueOnly
  • 力とトルク:ForceAndTorque

わかりやすいように、3つのバリエーションのフォーマットを別々に示します。

ForceOnly
<Force_Vector_TwoBody
   id                     = "integer"
   i_marker_id            = "integer"
   j_floating_marker_id   = "integer"
 [ 
   ref_marker_id          = "integer"
   label                  = "integer"
 ]
   type                   = "ForceOnly"
 [ 
   fx_expression          = "expression"
   fy_expression          = "expression"
   fz_expression          = "expression"

   usrsub_dll_name        = "valid_path_name"
   usrsub_param_string    = "USER(par_1, ... par_n)"
   usrsub_fnc_name        = "custom_fnc_name"

   script_name            = "valid_path_name"
   interpreter            = "PYTHON" | "MATLAB"
   usrsub_param_string    = "USER(par_1, ..., par_n)"
   usrsub_fnc_name        = "custom_fnc_name" 
  ]
/>
TorqueOnly
<Force_Vector_TwoBody
   id                    = "integer"
   i_marker_id           = "integer"
   j_floating_marker_id  = "integer"
 [ 
   ref_marker_id         = "integer"
   label                 = "integer"
 ]
   type                  = "TorqueOnly"
 [ 
   tx_expression         = "expression"
   ty_expression         = "expression"
   tz_expression         = "expression"

   usrsub_dll_name       = "valid_path_name"
   usrsub_param_string   = "USER(par_1, ... par_n)"
   usrsub_fnc_name       = "custom_fnc_name"

   script_name           = "valid_path_name"
   interpreter           = "PYTHON" | "MATLAB"
   usrsub_param_string   = "USER(par_1, ..., par_n)"
   usrsub_fnc_name       = "custom_fnc_name" 
  ]
/>
ForceAndTorque
<Force_Vector_TwoBody
   id                    = "integer"
   i_marker_id           = "integer"
   j_floating_marker_id  = "integer"
 [ 
   ref_marker_id         = "integer"
   label                 = "integer"
 ]
   type                  = "ForceAndTorque"
 [ 
   fx_expression         = "expression"
   fy_expression         = "expression"
   fz_expression         = "expression"
   tx_expression         = "expression"
   ty_expression         = "expression"
   tz_expression         = "expression"

   usrsub_dll_name       = "valid_path_name"
   usrsub_param_string   = "USER(par_1, ... par_n)"
   usrsub_fnc_name       = "custom_fnc_name"

   script_name           = "valid_path_name"
   interpreter           = "PYTHON" | "MATLAB"
   usrsub_param_string   = "USER(par_1, ..., par_n)"
   usrsub_fnc_name       = "custom_fnc_name" 
  ]
/>

属性

id
要素識別番号(整数 > 0)。この番号は、すべてのForce_Vector_TwoBody要素の中で一意です。
label
Force_Vector_TwoBody要素の名前。
この属性は省略可能です。
i_marker_id
力が適用されるReference_Markerを指定します。これは力の作用点として指定されます。
この属性は必須です。
j_floating_marker_id
同じ大きさで反対向きの反力が適用されるReference_Markerを指定します。このマーカーは、i_marker_id上に常に重ね合わされるよう、親ボディ上で移動されます。このような構成により、ニュートンの第三法則を自動的に満たすことができます。
この属性は必須です。
注: j_floating_marker_idは、剛体または質点のみに属することができます。弾性体の一部になることはできません。
ref_marker_id
力ベクトルの成分を定義する基準として使用する座標系を持つReference_Markerを指定します。
この属性は省略可能です。
指定しない場合は、デフォルトで地面座標系になります。
type
ForceOnly”、“TorqueOnly”、および“ForceAndTorque”から選択します。
ForceOnly
この要素によって、2つのReference_Marker間に力が適用されることを意味します。トルクは適用されません。
TorqueOnly
この要素によって、2つのReference_Marker間にトルクが適用されることを意味します。力は適用されません。
ForceAndTorque
この要素によって、2つのReference_Marker間に力とトルクが適用されることを意味します。
fx_expression, fy_expression, fz_expression
関数式として力ベクトルの3つの成分を指定します。
tx_expression, ty_expression, tz_expression
関数式としてトルクベクトルの3つの成分を指定します。
usrsub_param_string

データファイルからユーザー定義のサブルーチンに渡されるパラメータのリスト。このキーワードは、type = USERSUBが選択されている場合にのみ使用します。この属性は、すべてのタイプのユーザーサブルーチンおよびスクリプトに共通です。ユーザーサブルーチンの名前は、要素のタイプに依存します。

  • ForceOnly”はVFOSUBを使用します。
  • TorqueOnly”はVTOSUBを使用します。
  • ForceAndTorque”はGFOSUBを使用します。
usrsub_dll_name
ユーザーサブルーチンを含むDLLまたは共有ライブラリのパスと名前を指定します。MotionSolveはこの情報を使用して、実行時にDLL内のユーザーサブルーチンを読み込みます。
usrsub_fnc_name
ユーザーサブルーチンVFOSUBVTOSUB、またはGFOSUBの代替名を指定します。
script_name
usrsub_fnc_nameで指定されたルーチンを含むユーザー作成スクリプトのパスと名前を指定します。
interpreter
ユーザースクリプトが記述されたインタープリタ型言語を指定します。有効な選択肢は、MATLABまたはPYTHONです。

最初の例は、このコンポーネントを使用して非線形ブッシュの減衰をどのようにモデル化するかを示しています。

ブッシュは、多くの用途でコンプライアントコネクターとして使用されます。多くの場合、ゴムやポリウレタンのような材料でできており、非線形の剛性および減衰プロパティを示します。ブッシュは通常ラボでテストされ、テストデータがMotionSolveへの入力として提供されます。“同期された”ブッシュのテストデータを下の図に示します。



図 1. 非線形のブッシュ特性を示すサンプルのテストデータ

この例では、ブッシュがテストされ、3つの曲線1~3が使用可能です。これらは、3つそれぞれの並進方向のたわみ速度での、ブッシュ減衰力の依存性を指定します。ブッシュは2つのReference_Marker、Body 18の“1801”とBody 19の“1901”を結合します。ここでは、MotionSolveで非線形ブッシュ減衰力をモデル化します。Reference_Marker“1903”がBody 19のブッシュの結合ポイントです。

このシナリオのForce_Vector_TwoBodyモデリング要素は次のとおりです:

<Force_Vector_TwoBody
     id                     = "18"
     label                  = "My-Automotive-Bushing"
     type                   = ForceOnly
     i_marker_id            = "1801"
     j_floating_marker_id   = "1901"
     ref_marker_id          = "1903"
     fx_expression          = "CUBSPL(0, VX(1801,1903,1903,1903), 1)"  
     fy_expression          = "CUBSPL(0, VY(1801,1903,1903,1903), 2)"  
     fz_expression          = "CUBSPL(0, VZ(1801,1903,1903,1903), 3)"  
/>

次の点に注目してください:

この例では、ブッシュの参照座標系としてReference_Marker“1903”を使用することにしました。したがって、Reference_Marker“1903”の参照フレームで、変位ベクトルの時間微分が取られます。これは全体参照フレームで時間微分を取るのと同じではありません。時間導関数の参照フレームは、VX()VY()、およびVZ()関数の引数リストの最後のパラメータです。

  • これは非常に単純な減衰モデルです。ほとんどのブッシュはヒステリシスのような非線形の、周波数 / 振幅に依存した挙動を示します。この例ではこれらを無視します。
  • このモデルの力の式に剛性モデルを追加することもできます。これにより、剛性と減衰の両方のプロパティをモデル化する1つのコンポーネントが作成されます。
以下についても使用できるものとしましょう:
  • ブッシュ力に対するブッシュたわみを指定する、ID 4~6の3つの曲線。
  • ブッシュトルクに対するブッシュたわみ角速度を指定する、ID 7~9の3つの曲線。
  • ブッシュトルクに対するブッシュたわみ角を指定する、ID 10~12の3つの曲線。

これらは、以前のモデルを強化し、たわみや速度依存の力およびトルクをモデル化する、より包括的なユーザー定義のブッシュを作成するために使用できます。強化されたモデルは次のようになります:

<Force_Vector_TwoBody
     id                     = "18"
     label                  = "My-Automotive-Bushing"
     type                   = ForceAndTorque
     i_marker_id            = "1801"
     j_floating_marker_id   = "1901"
     ref_marker_id          = "1903"
     fx_expression          = "CUBSPL(0, VX(1801,1903,1903,1903),1)  + CUBSPL(0, DX(1801,1903,1903),4)"
     fy_expression          = "CUBSPL(0, VY(1801,1903,1903,1903),2)  + CUBSPL(0, DY(1801,1903,1903),5)"
     fz_expression          = "CUBSPL(0, VZ(1801,1903,1903,1903),3)  + CUBSPL(0, DZ(1801,1903,1903),6)"
     tx_expression          = "CUBSPL(0, WX(1801,1903,1903), 7)      + CUBSPL(0, AX(1801,1903), 10)"
     ty_expression          = "CUBSPL(0, WY(1801,1903,1903), 8)      + CUBSPL(0, AY(1801,1903), 11)"
     tz_expression          = "CUBSPL(0, WZ(1801,1903,1903), 9)      + CUBSPL(0, AZ(1801,1903), 12)"
/>

WX()WY()、およびWZ()は、ブッシュ内の角速度を測定し、AX()AY()、およびAZ()は、ブッシュ内のたわみ角を測定します。たわみ角は小さいもの(10度未満)とします。

コメント

  1. i_marker_idは、Force_Vector_TwoBodyの作用点として指定されます。j_floating_marker_idは反作用点です。
  2. 下の図は、2つのボディ間で作用するForce_Vector_TwoBodyの立体分解図を示しています。主な力の計算も示しています。


    図 2. Force_Vector_Two_Bodyの立体分解図
  3. j_float_idは常にi_marker_idの上に置かれるため、ニュートンの第三法則が正しく適用されます。i_marker_idに力のみが適用されると、j_floating_marker_idには同じ大きさで反対向きの力が働きます。j_floating_marker_idが親ボディを基準にして動くと、適切に変化するモーメントがその親ボディに対して適用されます。
  4. 作用点での力のみをモデル化し、反作用はモデル化しない場合は、単純に地面上にj_floating_marker_idを定義します。MotionSolveは、反力や反トルクを計算しません。ただし、地面座標系に対して反作用点がどのように移動するかについては示されます。
  5. 力およびトルクの式(またはユーザーサブルーチン)は、滑らかである必要があり、微分可能であることが望まれます。これにより、数値的な手法で効果的に力を処理することができます。
  6. VX()VY()VZ()などの速度を使用して減衰力を計算する場合、適切な参照フレームで時間微分を取るようにしてください。詳細については、例をご参照ください。
  7. Force_Vector_TwoBodyは、すべてのタイプのボディ(Body_RigidBody_Flexible、およびBody_Point)に作用できます。
  8. MotionSolveで定義される力は、次の基準を満たす必要があります:
    • 力はその入力引数に関して連続関数となります。簡単に言えば、紙の上で力をそのいずれかの引数の関数として書く場合、ペンを紙から離す必要はないということです。
    • その入力変数に関する力の導関数は常に有限です。再度簡単に言うと、力対入力変数を紙上でプロットする場合、その曲線に垂直な部分はないということです。垂直な部分は、コンピューターでの処理が困難な無限勾配を表します。
  9. 以下に、MotionSolveで定義される力の望ましい特性を示します:
    • 力は、そのすべての入力変数に関して微分可能である必要があります。簡単に言うと、力はその定義において、理想的には尖った角や折れがあってはならないということです。滑らかであることが必要です。滑らかな力は、折れや角のある力より、数値的な手法でより簡単に処理することができます。
  10. 力についてのユーザーサブルーチンを記述する際、異なるユーザー作成サブルーチン間で状態依存の情報を渡すために、共通ブロック(Fortran)やグローバル変数(C)を使用しないでください。このような場合には、アクセス関数SYSFNC()またはSYSARY()を使用して、ユーザー作成サブルーチンのデータを取得し、再計算します。中間結果の格納にReference_Variableを使用すると便利な場合もあります。これにより、結果を再計算することなく、中間結果にSYSFNC()を介してアクセスすることができます。