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を選択します。イベント式の定義方法を指定します。
EXPRESSIONオプションは、イベントの値が実行時に評価できるMotionSolveの式であることを指定します。
USERSUBオプションは、イベントの値がユーザー作成のサブルーチンで指定されることを示します。パラメータ“usrsub_param_string”および“usrsub_dll_name”は、このユーザー定義サブルーチンSENSUBに関する詳細情報を提供するために使用されます。
expr
センサーイベントを定義する式を指定します。このパラメータは、type = EXPRESSIONである場合にのみ使用します。任意の有効な実行時MotionSolve式を使用できます。
compare
比較基準を定義します。
GELT、またはEQから選択します。比較基準を使用してイベントの発生を検出します。次のように実装されます。
  • GEexpr >= value
  • LTexpr < value
  • EQexpr = value
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です。
print
結果を出力します。
restart
MotionSolveが積分器を再起動するよう強制します。システムのすべての積分器履歴が削除され、積分器が再起動されます。
verbose
この属性を使用して、センサーがトリガーされたときに、アクションメッセージが画面とログファイルに出力される頻度を制御します。
TRUE:センサーがアクティブである間、MotionSolveは、報告される各時間ステップにおいてセンサーによってトリガーされたアクションに関する情報を書き出します。註: verboseTRUEに設定すると、ログファイルの内容の大部分が、これらのメッセージで占められる可能性があります。
FALSEMotionSolveは、センサーが初めてトリガーされたときに一度だけ、センサーによってトリガーされたアクションに関する情報を書き出します。
デフォルトはFALSEです。
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. 多くのシステムが、基盤となる方程式が変化する可能性のある離散イベントによって表現されます。バルブが開閉される油圧システムがよくある例の1つです。さまざまな方程式のセットによって、このような各コンフィギュレーションでシステムが定義されます。Sensor_Event要素を使用することで、イベント(バルブの開閉)を検出し、そのような遷移が生じたときに、システムがその方程式を再定式化するように強制できます。Sensor_Evaluateを使用すると、システムの状態(バルブの開閉)を格納できます。

    Sensor_Eventには、1つ以上のセンサーアクションを定義できます。言い換えると、これらのアクションは、センサーがトリガーされるたびに実行されるということです。

  2. Sensor_Eventの一般的な用途としては、特定の終了条件が満たされるとシミュレーションを停止するというものがあります。終了条件は状態の関数である場合があるため、Param_Transientステートメントで明示的に指定することはできません。
  3. Sensor_Eventのもう1つの一般的な用途には、接触要素を含むモデルで、ゼロクロッシングアクションにより、最初の接触の時間を正確に捕捉するというものがあります。これは、現実的な接触力を求めるのに便利で、小さいステップサイズでシミュレーション全体を実行する必要はありません。これを行うには、センサーがモデル内の接触ペアの接触力を監視します。最初に接触を検出するとすぐに、zero_crossingアクションがトリガーされます。
    Sensor_Eventzero_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)によって変更されるまで、そのまま継続されます。

  4. あまり一般的ではないSensor_Eventの用途としては、目的のイベントが発生したら出力を強制するというものがあります。例えば、 MotionSolve関数のIMPACT()使用して力をモデル化する場合、衝撃が生じるたびに出力させることができます。これにより、システムでの正確な衝撃力を把握できます。