Motion: Marker Based

Model ElementMotion_Markerは、2つのReference_Marker間でのモーション入力を定義します。

説明

モーションの入力は、並進または回転であり得ます。ユーザーがモーション特性の式を定義します。この式は、変位、速度、または加速度入力を定義するために使用できます。式は通常時間の関数です。システム状態に依存するモーションの式を作成する場合は、コメント8をご参照ください。

並進運動は、次のいずれかの方法で定義します。
  1. 関数DX()DY()、およびDZ()は、J Reference_Markerの座標系で測定された、J Reference_Markerに対するI Reference_Markerの並進変位ベクトルの、それぞれx、y、z成分を表します。
    • DX(I,J,J) - 式 = 0
    • DY(I,J,J) - 式 = 0 >> 並進変位運動の場合
    • DZ(I,J,J) - 式 = 0
  2. 関数VX()VY()、およびVZ()は、J Reference_Markerの座標系で測定された、J Reference_Markerに対するI Reference_Markerの並進速度ベクトルの、それぞれx、y、z成分を表します。J Reference_Markerの参照フレームで時間微分が取られます。
    • VX(I,J,J,J) - 式 = 0
    • VY(I,J,J,J) - 式 = 0 >> 並進速度運動の場合
    • VZ(I,J,J,J) - 式 = 0
  3. 関数ACCX()ACCY()、およびACCZ()は、J Reference_Markerの座標系で測定された、J Reference_Markerに対するI Reference_Markerの並進加速度ベクトルの、それぞれx、y、z成分を表します。J Reference_Markerの参照フレームですべての時間微分が取られます。
    • ACCX(I,J,J,J) - 式 = 0
    • ACCY(I,J,J,J) - 式 = 0 >> 並進加速度運動の場合
    • ACCZ(I,J,J,J) - 式 = 0
回転運動は、次のいずれかの方法で定義します:
  1. B1(I,J)B2(I,J)、およびB3(I,J)は、 J Reference_Markerを基準にしてI Reference_Markerを配向する、Body 1-2-3のオイラー角のシーケンスで1番目、2番目、3番目の角度を表します。B123のオイラー角シーケンスの詳細については、コメントのセクションをご参照ください。
    • B1(I,J) - 式 = 0
    • B2(I,J) - 式 = 0 >> 回転変位運動の場合
    • B3(I,J) - 式 = 0
    • d [B1(I,J)] / dt - 式 = 0
    • d [B2(I,J)] / dt - 式 = 0 >> 回転速度運動の場合
    • d [B3(I,J)] / dt - 式 = 0
    • d2 [B1(I,J)] / dt2 - 式 = 0
    • d2 [B2(I,J)] / dt2 - 式 = 0 >> 回転加速度運動の場合
    • d2 [B3(I,J)] / dt2 - 式 = 0

フォーマット

式ベースのモーション
<Motion_Marker
       id           = "integer"
     [ label        = "string" ]
       i_marker_id  = "integer"
       j_marker_id  = "integer"
       direction    = { "X" | "Y" | "Z" | "B1" | "B2" | "B3" }

   {   val_type     = "D"
      |
       val_type     = "V"
       ic_disp      = "real"
      |
       val_type     = "A"
       ic_disp      = "real"
       ic_vel       = "real"
   }
   {
       type                = "expression"
       expr                = "motionsolve_expression"
      |
       type                = "USERSUB"
       usrsub_dll_name     = "valid_path_name"
       usrsub_param_string = "USER( [[par_1[,...][,par_n]] )"
       usrsub_fnc_name     = "custom_fnc_name" >
      |
       type                = "USERSUB"
       script_name         =  valid_path_name
       interpreter         = {"PYTHON" | "MATLAB"}
       usrsub_param_string = "USER([[par_1[,...][,par_n]])"
       usrsub_fnc_name     = "custom_fnc_name"
   }
/>
プラント入力ベースのモーション
<Motion_Marker
         id            = "integer"
        [label         = "string"]
         i_marker_id   = "integer"
         j_marker_id   = "integer"
         direction     = { "X" | "Y" | "Z" | "B1" | "B2" | "B3" }
         type          = "PLANT_INPUT"
         pinput_id     = "integer"
         val_index     = "integer"
/>

属性

id
要素識別番号(整数 > 0)。この番号は、すべてのMotion_Marker要素の中で一意です。
label
Motion_Marker要素の名前。
i_marker_id
モーション入力が適用されるReference_Marker IDを指定します。
j_marker_id
適用されるモーション入力の基準となるReference_Marker IDを指定します。
direction
入力の方向を指定します。“X”、“Y”、“Z”、“B1”、“B2”、および“B3”からいずれかを選択します。
X”、“Y”、および“Z”は、並進運動の方向を指定します。これはJマーカーの座標系で測定されます。
B1”、“B2”、“B3”は、Jマーカーの方向からIマーカーの方向に取ったBody 1-2-3またはTait-Bryant角です。選択内容により、モーションで使用される角が指定されます。
val_type
モーションが変位入力(D)、速度入力(V)、または加速度入力(A)のうちどれを適用するかを指定します。“D”、“V”、または“A”から1つの値を選択する必要があります。
ic_disp
val_type = "V"またはval_type = "A"の場合、必要な変位の初期条件を指定します。
ic_vel
val_type = "A"の場合、必要な速度の初期条件を指定します。
type
EXPRESSION”、“USERSUB”、“PLANT_INPUT”から選択します。モーションの式の定義方法を指定します。
EXPRESSION
モーションの値が実行時に評価できるMotionSolveの式であることを指定します。
USERSUB
モーションの値がユーザー定義のサブルーチンで指定されることを示します。パラメータ“usrsub_param_string”および“usrsub_dll_name”は、このユーザー定義サブルーチンに関する詳細情報を提供するために使用されます。
PLANT_INPUT
モーションがプラント入力として使用されることを示します。“val_index”が適用レベルを定義し、“pinput_id”がControl_PlantInputを参照します。
expr
モーション値を定義する式を定義します。このパラメータは、type = EXPRESSIONである場合にのみ使用します。任意の有効な実行時MotionSolve式を入力として指定できます。
usrsub_param_string
データファイルからユーザー定義のサブルーチンに渡されるパラメータのリスト。このキーワードは、type = USERSUBが選択されている場合にのみ使用します。
usrsub_dll_name
ユーザーサブルーチンを含むDLLまたは共有ライブラリのパスと名前を指定します。MotionSolveはこの情報を使用して、実行時にDLL内のユーザーサブルーチンを読み込みます。
usrsub_fnc_name
ユーザーサブルーチンMOTSUBの代替名を指定します。
script_name
usrsub_fnc_nameで指定されたルーチンを含むユーザー作成スクリプトのパスと名前を指定します。
interpreter
ユーザースクリプトが記述されたインタープリタ型言語を指定します。有効な選択肢は、MATLABまたはPYTHONです。
val_index
位置、速度、および加速度のレベルで、拘束の同時適用を定義します。
“3”
モーションは、位置レベルでのみ適用されます。
“2”
モーションは、位置と速度のレベルで同時に適用されます。
“1”
モーションは、位置、速度、および加速度のレベルで同時に適用されます。
コメント10をご参照ください。
pinput_id
モーション入力が適用されるControl_PlantInput IDを指定します。

時間の関数として、マーカーIの座標系で、ある座標系の原点であるマーカーJの変位と速度を測定したとします。マーカーJに対するマーカーIの3つの並進変位を、次のように指定できます:

<Motion_Marker
     id             = "1"
     i_marker_id    = "301"
     j_marker_id    = "201"
     direction      = "X"
     val_type       = "D"
     type           = "EXPRESSION"
     expr           = "CUBSPL(1, Time, 0)"
/>

<Motion_Marker
     id             = "2"
     i_marker_id    = "301"
     j_marker_id    = "201"
     direction      = "Y"
     val_type       = "D"
     type           = "EXPRESSION"
     expr           = "CUBSPL(2, Time, 0)"
/>

<Motion_Marker
     id             = "3"
     i_marker_id    = "301"
     j_marker_id    = "201"
     direction      = "Z"
     val_type       = "D"
     type           = "EXPRESSION"
     expr           = "CUBSPL(3, Time, 0)"
/>

代わりに、Iマーカーから見たJマーカーの速度を、次のように指定することもできます:

<Motion_Marker
     id             = "11"
     i_marker_id    = "301"
     j_marker_id    = "201"
     direction      = "X"
     val_type       = "V" 
     icdisp         = "-4.56"
     type           = "EXPRESSION"
     expr           = "CUBSPL(11, Time, 0)"
/>

<Motion_Marker
     id             = "12"
     i_marker_id    = "301"
     j_marker_id    = "201"
     direction      = "Y"
     val_type       = "V"
     icdisp         = "11.13"
     type           = "EXPRESSION"
     expr           = "CUBSPL(12, Time, 0)"
/>

<Motion_Marker
     id             = "13"
     i_marker_id    = "301"
     j_marker_id    = "201"
     direction      = "Z"
     val_type       = "V"
     icdisp         = "0.0"
     type           = "EXPRESSION"
     expr           = "CUBSPL(13, Time, 0)"
/>

2番目の例は、全体空間で3Dパスを辿りながら、ロボットマニピュレーターのエンドエフェクターのモーションを指定する方法を示しています。

Reference_marker 314159は、エンドエフェクターの先端で座標系を定義します。Reference_Curve 3は、全体空間内で3D曲線を定義します。エンドエフェクターのX、Y、Z座標は、時間の関数として指定します。XおよびYの方向のモーションを以下に示します。
<Motion_Marker
     id	      = "101"
     i_marker_id    = "314159"
     j_marker_id    = "0" 
     direction      = "X"
     val_type       = "D" 
     type           = “EXPRESSIION”
     expr           = "CURVE(Time, 0, 1, 1)"
/>

<Motion_Marker
     id	      = "101"
     i_marker_id    = "314159"
     j_marker_id    = "0" 
     direction      = "Y"
     val_type       = "D" 
     type           = “EXPRESSIION”
     expr           = "CURVE(Time, 0, 1, 2)"
/>

<Motion_Marker
     id	      = "101"
     i_marker_id    = "314159"
     j_marker_id    = "0" 
     type           = “EXPRESSIION”
     direction      = "Z"
     val_type       = "D" 
     type           = “EXPRESSIION”
     expr           = "CURVE(Time, 0, 1, 3)"
/>

3番目の例は、プラント入力としてモーションを指定し、機構システムまたはプラントのディスクリプター(陰的)状態空間表現を作成する方法を示しています。

Reference_Variable 1は、位置レベルで式としてモーションを定義します。The Control_PlantInputは、Motion_Markerへの入力を収集します。
<Reference_Variable
    id                  = "1"
    type                = "EXPRESSION"
    expr                = "DM(1,1)"
 />

 <Control_PlantInput
    id                  = "1"
    hold_order          = "1"
    sampling_period     = "0."
    offset_time         = "0."
    num_element         = "1"
    variable_id_list    = "1"
 />

 <Motion_Marker
    id                  = "1"
    i_marker_id         = "2"
    j_marker_id         = "1002"
    type                = "PLANT_INPUT"
    direction           = "Z"
    val_index           = "3"
    pinput_id           = "1"
 />

コメント

  1. Motion_Markerに1つの拘束が追加されます。
    • 変位拘束が指定されている場合(val_type="D")、この式は、モーションの瞬時変位を定義します。
    • 速度拘束が指定されている場合(val_type="V")、この式は、モーションの瞬時速度を定義します。現在の変位は、瞬時速度を時間で積分することで求められます。
    • 加速度拘束が指定されている場合(val_type="A")、この式は、モーションの瞬時加速度を定義します。現在の速度は、瞬時加速度を時間で積分することで求められます。現在の変位は、瞬時速度を時間で積分することで求められます。
  2. 微分は、入力シグナル内のノイズを増幅する傾向があります。したがって、入力として提供されるすべての式と実験データは滑らかであるようにすることが重要です。より正確には、これらは、連続な1次および2次時間導関数を持つ必要があります。実験データでの補間では、AKIMA()による補間方法は避けてください。AKIMA()は、良好な1次および2次導関数を計算しません。代わりにCUBSPL()を使用してください。
  3. 積分は、入力シグナル内のノイズを削減する傾向があります。したがって、運動入力方程式として補間された実験データまたは表形式のデータを与える際に、速度の入力の使用が適切です。
  4. できる限りポイントの数が少ないカーブを定義します。3次曲線内に補間ポイント数が極端に多いと、曲線自体が滑らかに見えても、1次導関数に"揺れ"が、2次導関数に"激しい揺れ"が生じます。
  5. モーションの初期速度が、それに影響するボディの初期速度に一致することを確実にします。例えば、初期静的状態からシミュレーションが開始される場合、入力するモーションの初速はゼロであることを確認する必要があります。モーションの入力は、ボディおよびジョイントの初速度と一致しない場合にそれを無効とします。
  6. 速度の入力を使用することを決定した場合、位置は、Param_Transient要素に指定された積分エラーに対してのみ満たされる点にご留意ください。同様に、加速度の入力については、速度と位置のみが、指定された積分エラーに対し満足されます。したがって、解析的なソリューションからは多少逸れるかもしれません。これは、数値積分に基づいたあらゆる手法の限界です。
  7. モーションの拘束による反力 / トルクの時刻歴を確認することは役に立ちます。この履歴により、指定したモーションを達成するためにどれだけの反力/トルクが必要かを知ることができます。それが現実的であるかどうかは、ユーザーが確認します。さらに、モーションを適用されるフォースに置き換え、制御則を加味すると、物理的に、より意味をなすようになる場合があります。動解析におけるモーションは、コンプライアンスの余地のない"ハード"な拘束として扱われる点に留意する必要があります。
  8. モーションは、時間の関数(type=”EXPRESSION”またはプラント入力(type = “PLANT_INPUT”)のみが可能です。他のシステム変位、速度、加速度、反力、および適用される力の関数を使用することは避けるようにしてください。このような場合、MotionSolveが解を見つけることができる保証はありません。制御則を実装するなど、このような必要が生じた場合は、ユーザーサブルーチンを記述してこれを行ってください。ただし、要求しているシステムデータにタイムラグを適用した後、以下に示すようにこれを平滑化する必要があります。
    • Motion_Jointを使用して、2つのReference_Marker 100と200の間で検知された半径方向速度に基づく変位を適用するとします。この場合、ユーザーサブルーチンをコード化し、以下を実装する必要があります:
      EXPR(Tk+1) = VR(100,200)|Tk

      これはTkで評価されます。Tk+1- Tkは、システムのサンプリング周期です。

      EXPR(Tn+1)は一定であることに注意してください。ただし、これは速度VR()がサンプリングされると必ず変化します。この実装は、サンプリングされる値が連続的でないため適切ではありません。ここで、以前にサンプリングした値で曲線をフィットさせ、曲線を外挿して滑らかな値を提供する必要があります。これを以下に記号で示します:
      EXPR(Tk+1) = CUBIC(VR(100,200)|Tk, VR(100,200)|Tk-1, VR(100,200)|Tk-2)
  9. 方向B1B2、およびB3は、1、2、および3のオイラー角の1番目、2番目および3番目の角度を参照し、Jマーカーを基準にしてIマーカーを配向します。下の図は、このシーケンスを示しています。


    図 1.
    • 座標系X-Y-Zで開始します。X軸を中心にシステムを回転します。これはB1の回転です。この回転により、YはY'に、ZはZ'に移動します。B1の回転により取得された座標系は、X-Y'-Z'です。
    • ここで、Y'軸の周りを角B2だけ回転します。この回転により、Z'は、その最終位置Z1に、XX''に移動します。B2の回転により取得された座標系は、X''-Y'-Z1です。
    • Z1軸を中心にして、最後の回転が発生します。この回転B3により、X''はその最終位置X1に、Y'はその最終位置Y1に移動します。元の方向はX-Y-Z、最終的な方向はX1-Y1-Z1です。
  10. プラント入力によってモーションを定義する場合は、モーション拘束が位置レベル ( Φ ( q ) = 0 ) MathType@MTEF@5@5@+= feaagKart1ev2aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLn hiov2DGi1BTfMBaeXatLxBI9gBaebbnrfifHhDYfgasaacH8srps0l bbf9q8WrFfeuY=Hhbbf9v8qiqrFr0xc9pk0xbba9q8WqFfea0=yr0R Yxir=Jbba9q8aq0=yq=He9q8qqQ8frFve9Fve9Ff0dmeGabeqadiWa ceGabeqabeqadeqadmaakeaadaqadaqaaGqaaabaaaaaaaaapeGaa8 NPdmaabmaapaqaaGqac8qacaGFXbaacaGLOaGaayzkaaGaeyypa0Ja aGimaaWdaiaawIcacaGLPaaaaaa@3948@ 、または同時に位置レベルと速度レベル ( [ Φ ( q ) = 0 Φ ( q ) = 0 ] T ) MathType@MTEF@5@5@+= feaagKart1ev2aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLn hiov2DGi1BTfMBaeXatLxBI9gBaebbnrfifHhDYfgasaacH8srps0l bbf9q8WrFfeuY=Hhbbf9v8qiqrFr0xc9pk0xbba9q8WqFfea0=yr0R Yxir=Jbba9q8aq0=yq=He9q8qqQ8frFve9Fve9Ff0dmeGabeqadiWa ceGabeqabeqadeqadmaakeaadaqadaqaaabaaaaaaaaapeWaamWaa8 aabaqbaeqabeGaaaqaaGqaa8qacaWFMoWaaeWaa8aabaacbiWdbiaa +fhaaiaawIcacaGLPaaacqGH9aqpcaaIWaaapaqaa8qaceWFMoWday aafaWdbmaabmaapaqaa8qacaGFXbaacaGLOaGaayzkaaGaeyypa0Ja aGimaaaaaiaawUfacaGLDbaapaWaaWbaaSqabeaapeGaa4hvaaaaaO WdaiaawIcacaGLPaaaaaa@425D@ で、あるいは同時に位置レベル、速度レベル、および加速度レベル [ Φ ( q ) = 0 Φ ( q ) = 0 Φ ( q ) = 0 ] T MathType@MTEF@5@5@+= feaagKart1ev2aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLn hiov2DGi1BTfMBaeXatLxBI9gBaebbnrfifHhDYfgasaacH8srps0l bbf9q8WrFfeuY=Hhbbf9v8qiqrFr0xc9pk0xbba9q8WqFfea0=yr0R Yxir=Jbba9q8aq0=yq=He9q8qqQ8frFve9Fve9Ff0dmeGabeqadiWa ceGabeqabeqadeqadmaakeaadaqadaqaaabaaaaaaaaapeWaamWaa8 aabaqbaeqabeWaaaqaaGqaa8qacaWFMoWaaeWaa8aabaacbiWdbiaa +fhaaiaawIcacaGLPaaacqGH9aqpcaaIWaaapaqaa8qacaWFMoWaae Waa8aabaWdbiaa+fhaaiaawIcacaGLPaaacqGH9aqpcaaIWaaapaqa a8qaceWFMoWdayaagaWdbmaabmaapaqaa8qacaGFXbaacaGLOaGaay zkaaGaeyypa0JaaGimaaaaaiaawUfacaGLDbaapaWaaWbaaSqabeaa peGaa4hvaaaaaOWdaiaawIcacaGLPaaaaaa@4802@ で、完全に満たされます。必要なすべてのレベルで、Reference_Variableを使用してモーションを指定し、Control_PlantInputを使用してこれらをリストにまとめる必要があります。数学的な観点から見ると、インデックス番号は、Motion_Markerによって導入されたDAEのインデックスを参照します。インデックス番号を削減すると、拘束違反の可能性が低減します。