「送り直して詰める」を入れました。変更は pi05/run_policy_client.py の 1 ファイルのみ(未コミット)。 変えた行 ┌─────────┬─────────────────────────────────────────────────────────────────┐ │ 行 │ 変更 │ ├─────────┼─────────────────────────────────────────────────────────────────┤ │ 23-24 │ docstring の安全策に 1 │ │ │ 項目(送り直しで詰める・新しい目標は作らない・0 で従来どおり) │ ├─────────┼─────────────────────────────────────────────────────────────────┤ │ 199-245 │ settle_target(target, label, tol, retries) を新設(下記) │ ├─────────┼─────────────────────────────────────────────────────────────────┤ │ 272-276 │ --settle-tol(既定 1.0)と --settle-retries(既定 2)を追加 │ ├─────────┼─────────────────────────────────────────────────────────────────┤ │ │ 送信後に rec["settle"], rec["settle_retries_used"] = │ │ 457-459 │ settle_target(target, f"pi05_chunk{i:03d}", args.settle_tol, │ │ │ args.settle_retries) │ └─────────┴─────────────────────────────────────────────────────────────────┘ settle_target の中身: - retries <= 0 なら即 return(関節角の読み取りもしないので、従来と完全に同じ動き) - 関節角を読み、|target − actual| の最大が tol 以下なら何もしない - 超えていたら _send_and_wait_arrival(tgt.tolist(), f"{label}_settle{n}", 3.0) で同じ目標を送り直し、読み直して記録。tol 以下になるか retries 回に達するまで - 送る値は引数の target そのもの(apply_limits と check_send_safe を通ったもの)。足し引きも再計算もしていません - 最後まで詰まらなければ [WARN] を出して戻る(停止条件は増やしていません) - 関節角が読めなくなったら送り直しをやめて戻る _send_and_wait_arrival 本体(j0_sweep_scan.py)、HOME・SPEED・SEND_WAIT・J4_SAF E・J1_SAFE_MAX・apply_limits は一切触っていません。呼ぶ側で足しただけです。 背景の裏取り(4 回分の記録) 実装前に log.jsonl のチャンク間で「送った目標」と「次のチャンクの実測」を突き合わせました: - 肩を持ち上げる向き(j1 を小さくする指令): 28 回、すべて届かず 0.77〜2.80°(中央 2.00°)低いところで停止。28 回すべて 3° 未満 なので到達判定を通ってしまう 確認結果(アームは動かさず・偽の daemon) 偽の腕は「_send_and_wait_arrival を受けると姿勢 = 目標 + 残差(j1 のみ)」にし、read_angles がそれを返します。開始 j1=60.0° → 目標 j1=50.0°(10° 持ち上げ)。 1. 1 回目 +2.0° → 送り直すと +0.4°(既定 tol 1.0 / retries 2) [000] 推論 0ms 5ステップ先 Δ= +0.0 -10.0 +0.0 +0.0 +0.0 +0.0 [SETTLE] 送り直し 1 回目 最大ずれ 2.00°(関節 j1)→ 0.40° 送信の履歴 (2 回): pi05_chunk000 目標 j1=+50.00 → 実際 j1=+52.00 pi05_chunk000_settle1 目標 j1=+50.00 → 実際 j1=+50.40 log: chunk=0 arrived=True settle_retries_used=1 {"try": 1, "max_err_before": 2.0, "max_err_after": 0.4, "joint": 1, "actual": [0.0, 50.4, 0.0, 0.0, -40.0, -30.0]} 0.40° ≤ 1.0° なので 2 回目には進まず、送り直し 1 回で終了。記録も残っています。 2. 何度送っても +2.0° のまま [SETTLE] 送り直し 1 回目 最大ずれ 2.00°(関節 j1)→ 2.00° [SETTLE] 送り直し 2 回目 最大ずれ 2.00°(関節 j1)→ 2.00° [WARN] 送り直し 2 回でも最大ずれ 2.00° > 1.0°. 詰まりませんでした (止めずに次へ進みます) 送信の履歴 (3 回): chunk000 / chunk000_settle1 / chunk000_settle2 log: chunk=0 arrived=True settle_retries_used=2 (settle に 2 件) 終了コード 0 2 回で打ち切り、警告を出して次へ。終了コードは 0 のまま(停止条件を増やしていない)。 3. --settle-retries 0 送信の履歴 (1 回): pi05_chunk000 のみ log: chunk=0 arrived=True settle_retries_used=0 ("settle": []) 送り直しなし・[SETTLE] の表示なし = 従来どおり。 おまけ: ドライラン(--execute なし) も確認しました — 送信の呼び出しなし/グリッパーの呼び出しなし/settle キーも arrived キーも付かない(executed=False)。HOME 復帰(h)とグリッパー開閉の経路は今回の差分に含まれていません。 commit はしていません。codex レビューに出す準備ができています(出しますか? 観点は「同じ目標の再送がアームに与える危険(再送で安全範囲を外れないか・h と