--state-from-target を足して commit しました(483a82c、pi05/run_policy_client.py のみ個別指定)。 変えた行 ┌─────────┬────────────────────────────────────────────────────────────────┐ │ 行 │ 変更 │ ├─────────┼────────────────────────────────────────────────────────────────┤ │ 25-28 │ docstring の安全策に 1 項目(state だけを目標にする/6° │ │ │ 超で実測に戻す) │ ├─────────┼────────────────────────────────────────────────────────────────┤ │ 105-107 │ STATE_TARGET_MAX_GAP_DEG = 6.0 を追加 │ ├─────────┼────────────────────────────────────────────────────────────────┤ │ 446 │ last_sent_target = None │ │ │ を初期化(直前のチャンクで最後に送った目標) │ ├─────────┼────────────────────────────────────────────────────────────────┤ │ 396-398 │ --state-from-target(既定 off)を追加 │ ├─────────┼────────────────────────────────────────────────────────────────┤ │ │ モデルに渡す state の決定。measured_state を保持しつつ、on │ │ 531-549 │ かつ last_sent_target ありで差が 6° │ │ │ 以内なら目標を渡す。超えたら [WARN] + 実測。[STATE ] │ │ │ 行でどちらを渡したかと最大差(関節名つき)を表示 │ ├─────────┼────────────────────────────────────────────────────────────────┤ │ 564-566 │ rec に state_source と measured_state を追加(state │ │ │ はモデルに渡したほう) │ ├─────────┼────────────────────────────────────────────────────────────────┤ │ 598-601 │ 送信ブロックの先頭で last_sent_target = None(s │ │ │ で飛ばす・中断の経路で残さない) │ ├─────────┼────────────────────────────────────────────────────────────────┤ │ 620, │ sent_any を追加(実際に送ったか) │ │ 659 │ │ ├─────────┼────────────────────────────────────────────────────────────────┤ │ 690-694 │ チャンクを送り終えたら last_sent_target = │ │ │ 最後の中継点の目標(送っていなければ None) │ └─────────┴────────────────────────────────────────────────────────────────┘ apply_limits / check_send_safe / 中継点の実測からのかけ直し / plan_chunk / --via-stride / settle / h・q・s / グリッパー / _send_and_wait_arrival 本体は未変更です。変えたのはモデルに渡す state だけです。 確認結果(偽の daemon・アームは動かさず) 偽の腕は「送ると j1 が目標より 2.5° 高いところで止まる」、偽のモデルは「受け取った state の j1 から 6° 持ち上げる予測を返す」。開始 j1 = 60.0°。 1. off(既定)— 今までどおり実測 モデルに渡した state の j1: +60.00, +56.50, +53.00 送った目標 j1 → 実測 j1 : +54.00→+56.50, +50.50→+53.00, +47.00→+49.50 state_source: measured, measured, measured 3 チャンクで目標は 47.0 = 開始 −13°(−18° のはずが 2.5°×2 ぶん積み重なって足りない)。 2. on — 2 チャンク目以降は直前の目標 [STATE ] 実測を渡す (直前に送った目標がない) [STATE ] 目標を渡す 目標と実測の最大差 2.50°(関節 j1) モデルに渡した state の j1: +60.00, +54.00, +48.00 送った目標 j1 → 実測 j1 : +54.00→+56.50, +48.00→+50.50, +42.00→+44.50 state_source: measured, target, target 最後の目標は 42.0 = 開始 −18° ちょうど。不足は毎回 2.5° のままで積み重なりません。 3. 差が 6° を超えたとき(2 チャンク目だけ 8° 足りない腕) [WARN ] 目標と実測の差が 8.00° > 6° なので実測を渡します (腕がどこかに当たって止まっている可能性) [STATE ] 実測を渡す 目標と実測の最大差 8.00°(関節 j1) state_source: measured, target, measured 止めずに次へ進みます。 4. s で飛ばした次のチャンク(手動で Enter → s → Enter) state_source: measured, target, measured 送った目標: 54.0, 50.5 ← s のチャンクは送っていない 5. ドライラン — 送信 0 回、3 チャンクとも measured。 --via-stride の 11 ケースも再実行して全部 OK のままです。 実機では --state-from-target --settle-retries 0 の組み合わせになると思います。--via-stride