(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_144348.json
[RTD   ] 到達許容差は本線 run_pick_place.py の stage 値を使います（区間ごと。一律 8.0° は 2026-10-19 にやめた）:
[RTD   ]   HOME                       2.5°  ← rpp.TOL_HOME（stage1_to_home / HOME 復帰）
[RTD   ]   APPROACH_PICK              2.0°  ← rpp.TOL_APPROACH（approach 系）
[RTD   ]   PICK                       3.0°  ← rpp.TOL_PICK_PLACE（stage4_pick）
[RTD   ]   APPROACH_PICK (lift)       3.0°  ← rpp.TOL_LIFT_BACK（lift の残差 2.19° を吸収）
[RTD   ]   APPROACH_PLACE             3.0°  ← rpp.TOL_APPROACH_PLACE（stage7）
[RTD   ]   PLACE                      3.0°  ← rpp.TOL_PICK_PLACE（stage8_place）
[RTD   ]   APPROACH_PLACE (retreat)   3.0°  ← rpp.TOL_LIFT_BACK（stage10_lift_back）
[RTD   ] 到達を待つ最大時間 = clamp(2.0 + max|Δ|/20*3.0, 8.0, 30.0) 秒（本線と同じ wr._compute_arrival_timeout）
[RTD   ] モード: ドライラン（アームに何も送りません）
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20221013_144348.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_dw9gijsg/drag_v2_20221013_144348.json
[RTD   ] 入力ファイル: drag_v2_20221013_144348.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=240 (start=240 end=290, gap=14.76°)
                    angles = [ -36.12,  +65.83,  +16.78,   +4.39,  -86.74,  -29.61]
  PICK           <- gripper close mark idx=355（PICK phase 範囲内）
                    angles = [ -35.94,  +80.59,   +7.11,   +3.16,  -88.68,  -30.32]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=470 (start=470 end=512, gap=27.86°)
                    angles = [ +43.41,  +31.81,  +18.54,   +6.24,  -56.95,  -29.88]
  PLACE          <- gripper open mark idx=552（PLACE phase 範囲内）
                    angles = [ +44.20,  +59.67,   +6.15,  +10.54,  -74.88,  -30.84]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 162 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] [WARN] j4 の余裕が最小 1.32°（< 3.0°）です: APPROACH_PICK → PICK 経路上の点 8 j4=-88.68。実測が安全範囲の外に振れる可能性があります（実測では止めません。試行 JSON に WARN として残します）
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = 未取得（ドライラン・daemon に接続していない）
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
  [STEP  2] GRIPPER OPEN  daemon_set_gripper(0, 50, wait=0) ×1 回（daemon 事前 2.0s + 事後 2.0s + 待ち 2.0s）= 計 6.0s
            開いたかは確認しません（gv を使わず・開始前の y/n も無し。判定は終了後の y/n と動画）
  [STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  tol=2.0°  [rpp.TOL_APPROACH（approach 系）]
            from    = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            to      = [ -36.12,  +65.83,  +16.78,   +4.39,  -86.74,  -29.61]
            max |Δ| = 86.74°  1 回送信 speed=20  (~ 4.3s @ 20°/s 目安・到達待ち 最大 15.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -36.12,  +65.83,  +16.78,   +4.39,  -86.74,  -29.61]
            to      = [ -35.94,  +80.59,   +7.11,   +3.16,  -88.68,  -30.32]
            max |Δ| = 14.76°  1 回送信 speed=20  (~ 0.7s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  5] GRIPPER CLOSE  daemon_set_gripper_value(20, 50) + sleep(2.0s)
  [STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  tol=3.0°  [rpp.TOL_LIFT_BACK（lift の残差 2.19° を吸収）]
            from    = [ -35.94,  +80.59,   +7.11,   +3.16,  -88.68,  -30.32]
            to      = [ -36.12,  +65.83,  +16.78,   +4.39,  -86.74,  -29.61]
            max |Δ| = 14.76°  1 回送信 speed=20  (~ 0.7s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -36.12,  +65.83,  +16.78,   +4.39,  -86.74,  -29.61]
            to      = [ +43.41,  +31.81,  +18.54,   +6.24,  -56.95,  -29.88]
            max |Δ| = 79.53°  1 回送信 speed=20  (~ 4.0s @ 20°/s 目安・到達待ち 最大 13.9s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +43.41,  +31.81,  +18.54,   +6.24,  -56.95,  -29.88]
            to      = [ +44.20,  +59.67,   +6.15,  +10.54,  -74.88,  -30.84]
            max |Δ| = 27.86°  1 回送信 speed=20  (~ 1.4s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  9] GRIPPER OPEN  daemon_set_gripper(0, 50, wait=0) ×1 回（daemon 事前 2.0s + 事後 2.0s + 待ち 2.0s）= 計 6.0s
            開いたかは確認しません（gv を使わず・開始前の y/n も無し。判定は終了後の y/n と動画）
  [STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  tol=3.0°  [rpp.TOL_LIFT_BACK（stage10_lift_back）]
            from    = [ +44.20,  +59.67,   +6.15,  +10.54,  -74.88,  -30.84]
            to      = [ +43.41,  +31.81,  +18.54,   +6.24,  -56.95,  -29.88]
            max |Δ| = 27.86°  1 回送信 speed=20  (~ 1.4s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +43.41,  +31.81,  +18.54,   +6.24,  -56.95,  -29.88]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 56.95°  1 回送信 speed=20  (~ 2.8s @ 20°/s 目安・到達待ち 最大 10.5s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 32.4s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 15.4s（max|Δ| 合計 308.5° @ 20°/s 目安） + gripper 14.0s
[RTD   ]   到達確認: 許容は区間ごと（本線 run_pick_place.py の stage 値）/ 最大は clamp(2.0 + max|Δ|/20*3.0, 8.0, 30.0) 秒
[RTD   ]   届かないとき: 送信前から 1.0° 未満しか動いていなければ 5.0s 待って**同じ目標へ 1 回だけ**再送（本線と同じ）。それでも届かなければ ABORT（HOME へ自動で戻らない）
[RTD   ]   実測 j4: [-90.0, +60.0] の外は WARN / [-98.0, +68.0] の外は ABORT
==============================================================================
[RTD   ] measure: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_092616.json
[RTD   ]   measured_at = 2026-11-09T09:26:18.245166  block = (+200.0, +191.4) mm  box = (-219.8, +188.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] [WARN] 再生直前: 四隅が最大 62.6px ずれています（1 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 62.0px ずれています（2 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 62.5px ずれています（3 回目 / 上限 15.0px）。やり直しの上限に達しました
[RTD   ] 再生直前: block = (+199.2, +201.6) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_092939.jpg
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_092939_rejected.json
[RTD   ] [WARN] マット四隅が measure 時から最大 62.5px ずれています（上限 15.0px・最大 3 回やり直しても収まらず）。カメラが動いた可能性があるので止めます。measure を取り直してください（各隅のずれ: 9.0, 1.0, 62.5, 42.1）（**止めません**・WARN のみ）
[RTD   ] ドライランなので、ここで終了します（アームには何も送っていません）
[RTD   ] Pi 版と比べる点: 抽出ウェイポイント 4 姿勢と各区間の max|Δ| は同じ。送り方は単発（Pi 版は 0.1s 補間ストリーミング）なので n_steps / ticks は比較対象外。送信 8 回 / 想定所要 ≈ 32.4s
