Reference: Marker

Model ElementReference_Markerは、MotionSolve内の直交右手座標系と参照フレームを定義します。Reference_Markerはボディに属する必要があります。ボディは、任意のタイプ(剛体、弾性体、またはポイント)にできます。

説明

ニュートン参照フレーム(地面)は、剛体の特殊なケースと見なされます。

下の図は、Reference_Markerがどのように定義されているかを示しています。
図 1. 地面でのReference_Markerの定義


上の図で、Nはニュートン参照フレームおよび座標系を表します。これは全体座標系の原点Oと、右手系の相互に直交する3つの方向OX、OY、およびOZで構成されます。

Mは注目する別の座標系を表します。Mの原点はoMで表され、Mの軸はxM、yM、zMで表されます。この例では、MはNに対して固定と見なします。

Mを定義するには、座標系NでのベクトルO-oMの値が必要です。これはこの図ではrで表されています。

xM-yM-zMの基底からx-y-zの基底に変換する回転マトリクスが必要です。これはこの図ではNAMで表されています。

Reference_Markerは、以下を指定することで定義されます:
  • ベクトルr。
  • マトリクスNAM。
  • 属するボディ。
MotionSolveReference_Markerの一般的な用途には次のようなものがあります:
  • 剛体、弾性体、および質点の参照座標系(LPRF)の定義。
  • 拘束要素での結合の指定。
  • 力要素での結合の指定。
  • Reference_CurveReference_Surface、およびPost_Graphicの参照座標系の定義。
  • 変位、速度、および加速度の値の出力チャネルの定義。

id = 0Reference_Markerには特別な意味があります。これは、すべてのMotionSolve表現で、全体座標系を示すために使用されます。

属性node_idは省略可能です。これは、弾性体でのみ使用されます。

フォーマット

<Reference_Marker
       id                    = "integer"
     [ label                 = "string" ]
       body_id               = "integer"
     [ body_type             = {"RIGIDBODY" | "FLEXBODY" | "POINTBODY"} ]     
     [ rm_id                 = "integer" ]
     [ node_id               = "integer" ]
{      
       pos_x                 = "real"
       pos_y                 = "real"
       pos_z                 = "real" 
 [{           
       a00                   = "real"
       a10                   = "real"
       a20                   = "real"
       a01                   = "real"
       a11                   = "real"
       a21                   = "real"
       a02                   = "real"
       a12                   = "real"
       a22                   = "real"
    |      
       psi                   = "real"
       theta                 = "real"
       phi                   = "real"
    | 
       yaw                   = "real"
       pitch                 = "real"
       roll                  = "real"
    | 
       e0                    = "real"
       e1                    = "real"
       e2                    = "real"
       e3                    = "real" 
 }]
}
|
{     
      usrsub_param_string    = "USER(..,..)"
      usrsub_fnc_name        = "valid fnc name"
      usr_dll_name           = "valid dll name"
 |
      usrsub_param_string    = "USER(..,..)"
      usrsub_fnc_name        = "valid fnc name"
      interpreter            = "PYTHON | MATLAB"
      script_name            = "valid script name"
}
/>    

属性

id
要素識別番号(整数 > 0)。この番号は、すべてのReference_Marker要素の中で一意です。
label
Reference_Marker要素の名前。
body_id
マーカーが属するボディのID。このボディは、地面、剛体、質点、または弾性体のいずれかです。
body_type

ボディがRIGIDBODYFLEXBODY、またはPOINTBODYのどのタイプかを指定します。

このパラメータは省略可能です。デフォルトのタイプはRIGIDBODYです。

rm_id

Reference_Marker IDを指定するオプション属性。指定した場合、マーカーの位置と方向は参照マーカーを基準にしていると見なされます。

デフォルトのIDは0で、全体参照フレームを参照します。

node_id
弾性体でのみ使用されるオプションの属性。
pos_x, pos_y, pos_z
全体フレームを基準にして指定されたマーカー原点のx、y、z座標。pos_xは原点のx座標、pos_yは原点のy座標、pos_zは原点のz座標を定義します。
a00a01a02
a10a11a12
a20a21a22
全体フレームを基準にしてReference_Markerの方向を定義する変換マトリクスの要素。
{a00 a10 a20}は、x軸の方向余弦を定義します。
{a01 a11 a21}は、y軸の方向余弦を定義します。
{a02 a12 a22}は、z軸の方向余弦を定義します。これらの9つの要素によって、3x3の正規直交マトリクスが定義されます。
すなわち、これらの9つの数値は次の条件を満たす必要があります:
  • 各列の大きさが1である。
  • 各列は他の2列と直交している(他の2列に対して垂直である)。
psi
元のz軸の周りの回転(ラジアン単位)。
theta
Psiを適用した後の新しいx軸の周りの回転(ラジアン単位)。
phi
Thetaを適用した後の新しいz軸の周りの回転(ラジアン単位)。
yaw
マーカーの元のz軸の周りの回転(ラジアン単位)。
pitch
yawを適用した後のマーカーの新しい位置のy軸の周りの回転(ラジアン単位)。
roll
pitchを適用した後の新しい位置のx軸の周りの回転(ラジアン単位)。
e0, e1, e2, e3
回転を表すオイラーパラメータ。
usrsub_param_string
データファイルからユーザー定義のサブルーチンに渡されるパラメータのリスト。
usrsub_fnc_name
ユーザーサブルーチンMARKER_READの代替名を指定します。
usrsub_dll_name
ユーザーサブルーチンを含むDLLまたは共有ライブラリのパスと名前を指定します。MotionSolveはこの情報を使用して、実行時にDLL内のユーザーサブルーチンを読み込みます。
script_name
usrsub_fnc_nameで指定されたルーチンを含むユーザー作成スクリプトのパスと名前を指定します。
interpreter
ユーザースクリプトが記述されたインタープリタ型言語を指定します。有効な選択肢は、MATLABまたはPYTHONです。

次の例では、剛体上のReference_Markerを定義します。

<Reference_Marker
   id                  = "1012"
   body_id             = "1000"
   body_type           = "RIGIDBODY"
   pos_x               = "1.414"
   pos_y               = "3.14159"
   pos_z               = "1.61804"
   a00                 = "0."
   a10                 = "1."
   a20                 = "0."
   a01                 = "0.041630503"
   a11                 = "0."
   a21                 = "0.99913307"
   a02                 = "0.99913307"
   a12                 = "0."
   a22                 = "-0.04163050">
</Reference_Marker>

次の例では、DCマトリクスの2つの列(つまり、X軸とZ軸に対応した列)のみが指定されています。Y軸に対応した3つ目の列は、ZベクトルとXベクトルの外積を使用して計算されます。

<Reference_Marker
     id                  = "90000072"
     body_id             = "30303"
     body_type           = "RigidBody"
     pos_x               = "-130."
     pos_y               = "0."
     pos_z               = "-50."
     a00                 = "0."
     a10                 = "1."
     a20                 = "0."
     a02                 = "0.447214"
     a12                 = "0."
     a22                 = "0.89442699"
  />

次の例では、DCマトリクスは省略されています。これはIDマトリクスであることを意味しています。pos_xpos_y、およびpos_zも省略されています。これらはデフォルトですべてゼロであることを意味しています。

<Reference_Marker
     id                  = "90000072"
     body_id             = "30303"
     body_type           = "RigidBody"
/>

次の例では、Pythonスクリプトを使用してReference_Markerが指定されています。

<Reference_Marker
   id                  = "30102040"
   label               = "Joint 3-Marker I"
   body_id             = "30102"
   body_type           = "RigidBody"
   usrsub_param_string = "USER(1,-0.5,0.3,0.,1.57079633,1.57079633,-1.57079633)"
   interpreter         = "Python"
   script_name         = "script/marker_read.py"
   usrsub_fnc_name     = "MARKER_READ"
/>

スクリプトmarker_read.pyは次のように定義されます:

def MARKER_READ(id, par, npar):
    eflg = 0
    errflg = 0
    r = 3*[0.0]
    angle = 6*[0.0]
    angle_type = int(par[0])
    r[0] = par[1]
    r[1] = par[2]
    r[2] = par[3]
    if angle_type==0: # DCMTX
        angle[0] = par[4]
        angle[1] = par[5]
        angle[2] = par[6]
        angle[3] = par[7]
        angle[4] = par[8]
        angle[5] = par[9]
    elif (angle_type ==1) | (angle_type ==2): # Euler angles (313 or YPR)
        angle[0] = par[4]
        angle[1] = par[5]
        angle[2] = par[6]
    elif angle_type ==3: # Euler parameters
        angle[0] = par[4]
        angle[1] = par[5]
        angle[2] = par[6]
        angle[3] = par[7]
    else: 
        errflg = 1;
        return errflg
    eflg = py_put_marker(id, r, angle_type, angle)
    
    return  errflg

コメント

  1. 地面、質点、および剛体の要素上のReference_Markerは、それらの参照座標系に対して固定されています。
  2. 弾性体上のReference_Markerは、ボディの参照座標系に対して動くことができます。このようなことが起こるのは、弾性体はシミュレーション中に変形できるためです。
  3. 完全変換マトリクス(方向余弦(DC)マトリクスとも呼ぶ)を指定することは有効ですが、必須ではありません。任意の2軸を指定することで、MotionSolveがその2つの軸のベクトルの外積を使用して3つ目の軸を計算できます。
  4. DCマトリクスが指定されていない場合、これはデフォルトでIDマトリクスになります。