========================================================================
コースアウト復帰仕様 (Course-Out Recovery Specification)
========================================================================
1. 概要 (Overview)
------------------------------------------------------------------------
1-0. 目的
自動操縦中に黒線を見失った場合(コースアウト),
一定時間経過後に最後に検出した方向へ旋回しながら走行し,
コースへの復帰を試みる機能を定義する.
1-1. 基本方針
・全制御手法(PD / 2点パシュート / Theil-Sen PD)に共通で適用する
・制御手法の外側(MainWindow)で復帰判定と操舵量の上書きを行う
・復帰パラメータは GUI の折りたたみパネルでリアルタイムに調整可能
・パラメータは JSON ファイルに自動保存・復元される
2. 復帰判定 (Recovery Trigger)
------------------------------------------------------------------------
2-1. 判定条件
以下の条件がすべて満たされたとき,復帰モードに遷移する.
1. 自動操縦中である
2. 復帰機能が有効(enabled = True)である
3. 線検出結果が detected = False である
4. 最後に線を検出した時刻から timeout_sec 秒以上経過している
2-2. 復帰モードの解除
線が再び検出された時点で即座に復帰モードを解除し,
通常の制御手法による操舵に戻る.
3. 復帰動作 (Recovery Behavior)
------------------------------------------------------------------------
3-1. 操舵方向の決定
最後に線を検出したときの位置偏差(position_error)の符号から,
線がどちら側にあったかを記録する.
・position_error > 0(線が画像の左側): 左へ旋回(steer < 0)
・position_error < 0(線が画像の右側): 右へ旋回(steer > 0)
復帰操舵量の計算:
direction = -sign(last_position_error)
steer = direction × steer_amount
3-2. 走行速度
throttle パラメータで復帰時の走行速度を指定する.
・負の値: 後退しながら旋回(コースアウト地点に戻る方向)
・正の値: 前進しながら旋回(コース先回りで復帰を試みる)
・ゼロ: 停止状態で旋回のみ
用途に応じて GUI で調整する.
3-3. 処理フロー
1. 各制御手法の compute() を通常通り呼び出す
2. 検出結果を RecoveryController.update() に渡す
3. update() が SteeringOutput を返した場合,
制御手法の出力を復帰用の出力で上書きする
4. 上書きされた操舵量を Pi に送信する
4. パラメータ一覧 (Parameters)
------------------------------------------------------------------------
■ コースアウト復帰パラメータ(GUI で調整可能)
・enabled(有効/無効): True
- 復帰機能全体のオン/オフ
・timeout_sec(判定時間): 0.5 秒
- 線を見失ってから復帰動作を開始するまでの時間
- 短すぎると一時的な検出失敗で誤動作する
- 長すぎるとコースアウト後の復帰が遅れる
・steer_amount(操舵量): 0.5
- 復帰時の旋回の強さ(0.0 ~ 1.0)
- 大きいほど急旋回する
・throttle(速度): -0.3
- 復帰時の走行速度(-1.0 ~ +1.0)
- 負の値で後退,正の値で前進
5. GUI 仕様 (GUI Specification)
------------------------------------------------------------------------
5-1. パネル配置
「コースアウト復帰」という名前の折りたたみパネルを,
制御パラメータパネルとデバッグ表示パネルの間に配置する.
5-2. UI 構成
・チェックボックス: 「復帰機能を有効にする」
・判定時間: QDoubleSpinBox(0.1 ~ 10.0 秒,0.1 刻み)
・操舵量: QDoubleSpinBox(0.0 ~ 1.0,0.05 刻み)
・速度: QDoubleSpinBox(-1.0 ~ +1.0,0.05 刻み)
5-3. 自動保存
パラメータの変更は即座に params/recovery.json に保存され,
次回起動時に復元される.
6. 実装ファイル (Implementation Files)
------------------------------------------------------------------------
・src/pc/steering/recovery.py: RecoveryParams,RecoveryController
・src/pc/gui/panels/recovery_panel.py: RecoveryPanel
・src/pc/gui/main_window.py: 復帰ロジックの統合
・src/pc/steering/auto_params.py: save_recovery / load_recovery