Sensor: Event
Model Elementこのモデリング要素は、モデル内のイベントセンサーを定義します。
説明
Sensor_Eventは、シミュレーション中の重要なイベントの定義および監視に使用されます。対象のイベントが発生したら、そのイベントに応じてアクションをとることができます。
例えば、車両シミュレーション中に車体の横加速度を監視することで、車が制御不能になるかどうかを判断することができます。この量がしきい値を超えたら、シミュレーションを停止できます。
もう1つの例として、2つのボディ間の接触力を監視し、ゼロクロッシングアクションをトリガーできます。このアクションにより、モデル内で発生した最初の接触をより正確に捕えることができ、結果の精度が向上します。
さまざまなイベント応答は、Sensor_Eventを使用して自動化できます。イベントへの一般的な応答としては、出力間隔の変更、積分器の再起動、シミュレーションの停止、積分器のステップサイズの変更などがあります。
フォーマット
<Sensor_Event
label = "string"
id = "integer"
value = "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"
}
[ compare = { "GE" | "LT" | "EQ" } ]
[ evaluate_id = "integer" ]
[ error_tol = "real" ]
[ dt = "real" ]
[ stepsize = "real" ]
[ zero_crossing = "real" ]
[ hmax = "real" ]
[ halt = { "TRUE" | "FALSE" } ]
[ print = { "TRUE" | "FALSE" } ]
[ restart = { "TRUE" | "FALSE" } ]
[ verbose = { "TRUE" | "FALSE" } ]
[ return = { "TRUE" | "FALSE" } ]
/>
属性
- label
- Sensor_Eventに関連付けられた任意の英数字。
- id
- 要素識別番号(整数 > 0)。この番号は、すべてのSensor_Event要素の中で一意です。
- value
- センサーイベントのしきい値。式またはユーザーサブルーチンがvalueに関して比較条件を満たしている場合、イベントが発生したと見なされます。
- type
- EXPRESSIONまたはUSERSUBを選択します。イベント式の定義方法を指定します。
- expr
- センサーイベントを定義する式を指定します。このパラメータは、type = EXPRESSIONである場合にのみ使用します。任意の有効な実行時MotionSolve式を使用できます。
- compare
- 比較基準を定義します。
- evaluate_id
- センサーがアクティブになると評価されるSensor_Evaluate要素のIDを指定します。Sensor_Evaluateの値は、センサーが別のイベントを検出するまで変更されません。
- error_tol
- イベントを検出するための誤差トレランスを定義します。検知された値は、しきい値のこのトレランス内に収まっている必要があります。このトレランスを超えると、ソルバーによってイベントが生成されます。
- usrsub_param_string
- データファイルからユーザー定義のSENSUBに渡されるパラメータのリスト。このキーワードは、type = USERSUBが選択されている場合にのみ使用します。
- usrsub_dll_name
- ユーザーサブルーチンを含むDLLまたは共有ライブラリのパスと名前を指定します。MotionSolveはこの情報を使用して、実行時にDLL内のユーザーサブルーチンSENSUBを読み込みます。
- dt
- イベントが発生したときに適用する新しい出力間隔を指定します。
- stepsize
- 次の試験ステップの最大ステップサイズを指定します。これは1ステップで期限切れになります。
- zero_crossing
- ゼロクロッシング検索のトレランスを指定します。トレランスは、zero_crossingの値に現在のhmaxを掛けたものとして定義されます。検索は、このトレランス内でイベントが発生した時間ちょうどの時点で停止します。詳細については、コメント3をご参照ください。
- hmax
- センサーがトリガーされた直後にソルバーが取ることのできる最大ステップサイズの値を指定します。この値は、他のセンサーによって変更されない限り、シミュレーションの最後まで存続します。詳細については、コメント3をご参照ください。
- halt
- イベントが発生するとシミュレーションを停止します。
- usrsub_fnc_name
- ユーザー作成サブルーチンSENSUBの代替名を指定します。
- script_name
- usrsub_fnc_nameで指定されたルーチンを含むユーザー作成スクリプトのパスと名前を指定します。このキーワードは、type = USERSUBが選択されている場合にのみ使用します。
- interpreter
- ユーザースクリプトが記述されたインタープリタ型言語を指定します。有効な選択肢は、MATLABまたはPYTHONです。
- 結果を出力します。
- restart
- MotionSolveが積分器を再起動するよう強制します。システムのすべての積分器履歴が削除され、積分器が再起動されます。
- verbose
- この属性を使用して、センサーがトリガーされたときに、アクションメッセージが画面とログファイルに出力される頻度を制御します。
- return
- プログラムの制御をコマンドプロセッサに戻し、次のコマンドを処理できるようにします。他にコマンドがなければ、シミュレーションは中断されます。
例
以下に示すセンサーは、マーカー21の座標系で、マーカー11に対するマーカー21の加速度のx成分の絶対値を監視します。マーカー11に関連付けられた参照フレームですべての時間微分が取られます。監視された値が5m/s2を超えると、Sensor_Evaluate/100内の式が評価され、シミュレーションが中断されます。1e-4という誤差トレランスを使用してイベントを監視します。
このようなセンサーを使用することで、車両が制御不能であることが明らかな場合に、その車両シミュレーションを停止することができます。
< Sensor_Event
id = "100"
type = "EXPRESSION"
expr = "ABS( ACCX(21,11,21,11) )"
compare = "GE"
value = "5"
evaluate_id = "100"
error_tol = "0.0001"
halt = "TRUE"
/>
以下に示すセンサーは、SENSUBによって返される値を監視します。監視された値が5を超えると、Sensor_Evaluate/200内の式が評価され、シミュレーションの出力間隔が1e-2に変更されます。1e-4という誤差トレランスを使用してイベントを監視します。
このようなセンサーを使用することで、注目するイベントの発生時に出力の頻度を変更することができます。
<Sensor_Event
id = "200"
type = "USERSUB"
usrsub_param_string = "USER(22,11)"
usrsub_dll_name = "NULL"
compare = "GE"
value = "0."
evaluate_id = "200"
error_tol = "0.0001"
dt = "1e-2"
/>
コメント
- 多くのシステムが、基盤となる方程式が変化する可能性のある離散イベントによって表現されます。バルブが開閉される油圧システムがよくある例の1つです。さまざまな方程式のセットによって、このような各コンフィギュレーションでシステムが定義されます。Sensor_Event要素を使用することで、イベント(バルブの開閉)を検出し、そのような遷移が生じたときに、システムがその方程式を再定式化するように強制できます。Sensor_Evaluateを使用すると、システムの状態(バルブの開閉)を格納できます。
各Sensor_Eventには、1つ以上のセンサーアクションを定義できます。言い換えると、これらのアクションは、センサーがトリガーされるたびに実行されるということです。
- Sensor_Eventの一般的な用途としては、特定の終了条件が満たされるとシミュレーションを停止するというものがあります。終了条件は状態の関数である場合があるため、Param_Transientステートメントで明示的に指定することはできません。
- Sensor_Eventのもう1つの一般的な用途には、接触要素を含むモデルで、ゼロクロッシングアクションにより、最初の接触の時間を正確に捕捉するというものがあります。これは、現実的な接触力を求めるのに便利で、小さいステップサイズでシミュレーション全体を実行する必要はありません。これを行うには、センサーがモデル内の接触ペアの接触力を監視します。最初に接触を検出するとすぐに、zero_crossingアクションがトリガーされます。Sensor_Eventにzero_crossingが存在する場合、MotionSolveは、収束した各ステップのすべての状態をメモリに保存します。このイベントが発生すると、MotionSolveは以下のことを行います:
- センサーをリセットする。
- 前に収束した時間に戻る。
- 前に収束した時刻でのすべてのシステム状態を復元する。
- hmaxを、zero_crossingに現在のhmaxを掛けた数に減らし、hminを、zero_crossingに現在のhminを掛けた数に減らして、この縮小したhmax/hminの組み合わせで進める。
一般的なzero_crossingの値は、0.01(1%)から0.001(0.1%)です。したがって、次にイベントがトリガーされるときには、解析時間が、イベント条件がちょうど満たされた時間に近付く(縮小されたhmax以内)ことになります。その後、ソルバーはセンサーをリセットし、ステップサイズを縮小する前のhmax/hminに戻します。
このシナリオでは、オプションでhmaxなどの別のアクションを使用して、接触の検出後に永続的にソルバーステップサイズを縮小することもできます。この変更内容は、シミュレーションが終わるまで、または別のセンサーアクションや制御サブルーチン(CONSUB)によって変更されるまで、そのまま継続されます。
- あまり一般的ではないSensor_Eventの用途としては、目的のイベントが発生したら出力を強制するというものがあります。例えば、 MotionSolve関数のIMPACT()使用して力をモデル化する場合、衝撃が生じるたびに出力させることができます。これにより、システムでの正確な衝撃力を把握できます。