Motion: Marker Based
Model ElementMotion_Markerは、2つのReference_Marker間でのモーション入力を定義します。
説明
モーションの入力は、並進または回転であり得ます。ユーザーがモーション特性の式を定義します。この式は、変位、速度、または加速度入力を定義するために使用できます。式は通常時間の関数です。システム状態に依存するモーションの式を作成する場合は、コメント8をご参照ください。
- 関数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
- 関数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
- 関数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
- 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”からいずれかを選択します。
- 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”
- モーションは、位置、速度、および加速度のレベルで同時に適用されます。
- 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パスを辿りながら、ロボットマニピュレーターのエンドエフェクターのモーションを指定する方法を示しています。
<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
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"
/>
コメント
- 各Motion_Markerに1つの拘束が追加されます。
- 変位拘束が指定されている場合(val_type="D")、この式は、モーションの瞬時変位を定義します。
- 速度拘束が指定されている場合(val_type="V")、この式は、モーションの瞬時速度を定義します。現在の変位は、瞬時速度を時間で積分することで求められます。
- 加速度拘束が指定されている場合(val_type="A")、この式は、モーションの瞬時加速度を定義します。現在の速度は、瞬時加速度を時間で積分することで求められます。現在の変位は、瞬時速度を時間で積分することで求められます。
- 微分は、入力シグナル内のノイズを増幅する傾向があります。したがって、入力として提供されるすべての式と実験データは滑らかであるようにすることが重要です。より正確には、これらは、連続な1次および2次時間導関数を持つ必要があります。実験データでの補間では、AKIMA()による補間方法は避けてください。AKIMA()は、良好な1次および2次導関数を計算しません。代わりにCUBSPL()を使用してください。
- 積分は、入力シグナル内のノイズを削減する傾向があります。したがって、運動入力方程式として補間された実験データまたは表形式のデータを与える際に、速度の入力の使用が適切です。
- できる限りポイントの数が少ないカーブを定義します。3次曲線内に補間ポイント数が極端に多いと、曲線自体が滑らかに見えても、1次導関数に"揺れ"が、2次導関数に"激しい揺れ"が生じます。
- モーションの初期速度が、それに影響するボディの初期速度に一致することを確実にします。例えば、初期静的状態からシミュレーションが開始される場合、入力するモーションの初速はゼロであることを確認する必要があります。モーションの入力は、ボディおよびジョイントの初速度と一致しない場合にそれを無効とします。
- 速度の入力を使用することを決定した場合、位置は、Param_Transient要素に指定された積分エラーに対してのみ満たされる点にご留意ください。同様に、加速度の入力については、速度と位置のみが、指定された積分エラーに対し満足されます。したがって、解析的なソリューションからは多少逸れるかもしれません。これは、数値積分に基づいたあらゆる手法の限界です。
- モーションの拘束による反力 / トルクの時刻歴を確認することは役に立ちます。この履歴により、指定したモーションを達成するためにどれだけの反力/トルクが必要かを知ることができます。それが現実的であるかどうかは、ユーザーが確認します。さらに、モーションを適用されるフォースに置き換え、制御則を加味すると、物理的に、より意味をなすようになる場合があります。動解析におけるモーションは、コンプライアンスの余地のない"ハード"な拘束として扱われる点に留意する必要があります。
- モーションは、時間の関数(
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)
- Motion_Jointを使用して、2つのReference_Marker 100と200の間で検知された半径方向速度に基づく変位を適用するとします。この場合、ユーザーサブルーチンをコード化し、以下を実装する必要があります:
- 方向B1、B2、および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に、XはX''に移動します。B2の回転により取得された座標系は、X''-Y'-Z1です。
- Z1軸を中心にして、最後の回転が発生します。この回転B3により、X''はその最終位置X1に、Y'はその最終位置Y1に移動します。元の方向はX-Y-Z、最終的な方向はX1-Y1-Z1です。
- プラント入力によってモーションを定義する場合は、モーション拘束が位置レベル 、または同時に位置レベルと速度レベル で、あるいは同時に位置レベル、速度レベル、および加速度レベル で、完全に満たされます。必要なすべてのレベルで、Reference_Variableを使用してモーションを指定し、Control_PlantInputを使用してこれらをリストにまとめる必要があります。数学的な観点から見ると、インデックス番号は、Motion_Markerによって導入されたDAEのインデックスを参照します。インデックス番号を削減すると、拘束違反の可能性が低減します。