notes
ToolsFibril hsm

fibril_hsm の辺 during / violated / fault

機構状態機械の辺 (transition) における during 条件・violated 着地・特別状態 fault の意味と、fault 中の拒否 (REJECT_FAULTED) と reset_fault による回復

要点: 辺の during は遷移中に成立し続けるべき条件。破れると violated: の指定先へ着地する。violated: fault は予約状態 fault へ入り、lease 解放・手続き中断・goal 失敗となる。fault 中の achieve は REJECT_FAULTED で拒否され、reset_fault で回復する。

辺の要素#

edges:
  - from: any
    to: [A, B]
    procedure: move_to
    postcondition: { position_in_range: { target: $target, eps: 0.02 } }  # 成功=到達
    during:  [{ elapsed: { limit: 5.0 } }]   # 遷移中ずっと真であること
    violated: fault                          # during が破れたときの着地先
  • postcondition: 成立で遷移完了 (to 状態へ入場)。joint_target/instant 手続きは投げっぱなしで postcondition の観測成立を待つ。bt のみ手続きの成否も入場条件。
  • during: 遷移が走っている間の不変条件。elapsed: {limit: N} は「N 秒以内に完了」の意味。
  • violated: during が偽になった瞬間の着地先。状態名か特別状態 fault。

violated: fault の挙動#

during が偽になると (fibril_hsm_core machine.cpp):

  1. 実行中の遷移を破棄 (active をリセット)。
  2. violated が fault の場合、状態を予約状態 kFault にし fault_code = "during_violated" を設定。他の名前なら通常状態としてそこへ着地。
  3. 保持していた lease を解放 (手動制御などの占有権を手放す)。
  4. 走行中の手続き (BT / joint_target) を停止し、achieve goal を失敗で終了 ("edge halted")。

fault は自分で定義する状態ではなく予約された特別状態。

fault 中と回復#

  • fault 中は achieve 要求が REJECT_FAULTED で拒否される。
  • 回復は /mechanism/<name>/reset_fault (std_srvs/Trigger)。呼ぶと状態を再解決する。

during (辺) と invariant (状態) の違い#

  • invariant は状態に居る間の不変条件。破れるとその状態から抜ける (recognizer 再評価)。
  • during + violated は遷移中の不変条件。破れると violated 先 (多くは fault) へ。

両者は別物。移動が時間内に届かない fault は必ず辺の during (elapsed) 由来。

関連#

  • recognizer / invariant の eps とヒステリシス (recognizer eps < invariant eps) は状態側の判定。fault はこの辺側の during 由来。
最終更新:

On this page