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):
- 実行中の遷移を破棄 (active をリセット)。
violatedがfaultの場合、状態を予約状態 kFault にしfault_code = "during_violated"を設定。他の名前なら通常状態としてそこへ着地。- 保持していた lease を解放 (手動制御などの占有権を手放す)。
- 走行中の手続き (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 由来。
最終更新: