(base) shimazueiichi@shimadzueiichinoMacBook-Pro drag_teaching % python3 record_teach_demo.py run --teach drag_v2_20221013_231249.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_231249.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_vu3bxjcs/drag_v2_20221013_231249.json
[RTD   ] 入力ファイル: drag_v2_20221013_231249.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=146 (start=146 end=194, gap=12.04°)
                    angles = [ -28.12,  +57.21,  +19.86,   -3.60,  -71.80,  -27.50]
  PICK           <- gripper close mark idx=214（PICK phase 範囲内）
                    angles = [ -27.68,  +63.10,  +13.27,   -8.26,  -59.76,  -27.33]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=286 (start=286 end=321, gap=20.83°)
                    angles = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
  PLACE          <- gripper open mark idx=345（PLACE phase 範囲内）
                    angles = [ +40.69,  +61.78,   +1.14,   +4.13,  -70.22,  -31.28]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 137 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 18.20°（しきい値 3.0° 以上）
==============================================================================
[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      = [ -28.12,  +57.21,  +19.86,   -3.60,  -71.80,  -27.50]
            max |Δ| = 71.80°  1 回送信 speed=20  (~ 3.6s @ 20°/s 目安・到達待ち 最大 12.8s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -28.12,  +57.21,  +19.86,   -3.60,  -71.80,  -27.50]
            to      = [ -27.68,  +63.10,  +13.27,   -8.26,  -59.76,  -27.33]
            max |Δ| = 12.04°  1 回送信 speed=20  (~ 0.6s @ 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    = [ -27.68,  +63.10,  +13.27,   -8.26,  -59.76,  -27.33]
            to      = [ -28.12,  +57.21,  +19.86,   -3.60,  -71.80,  -27.50]
            max |Δ| = 12.04°  1 回送信 speed=20  (~ 0.6s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -28.12,  +57.21,  +19.86,   -3.60,  -71.80,  -27.50]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 69.16°  1 回送信 speed=20  (~ 3.5s @ 20°/s 目安・到達待ち 最大 12.4s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            to      = [ +40.69,  +61.78,   +1.14,   +4.13,  -70.22,  -31.28]
            max |Δ| = 20.83°  1 回送信 speed=20  (~ 1.0s @ 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    = [ +40.69,  +61.78,   +1.14,   +4.13,  -70.22,  -31.28]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 20.83°  1 回送信 speed=20  (~ 1.0s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 49.39°  1 回送信 speed=20  (~ 2.5s @ 20°/s 目安・到達待ち 最大 9.4s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 29.8s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 12.8s（max|Δ| 合計 256.1° @ 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_LOG359/measure_20261022_164406.json
[RTD   ]   measured_at = 2026-10-22T16:44:08.337908  block = (+127.6, +216.8) mm  box = (-213.6, +178.2) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+127.2, +216.8) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_LOG359/prerun_20261022_164432.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 1.0px <= 許容 10.6px = 5.0mm / mm 換算の差 0.43mm）
[RTD   ] マット四隅のずれ 最大 4.5px（上限 15.0px・やり直し 1 回）
[RTD   ] ドライランなので、ここで終了します（アームには何も送っていません）
[RTD   ] Pi 版と比べる点: 抽出ウェイポイント 4 姿勢と各区間の max|Δ| は同じ。送り方は単発（Pi 版は 0.1s 補間ストリーミング）なので n_steps / ticks は比較対象外。送信 8 回 / 想定所要 ≈ 29.8s
(base) shimazueiichi@shimadzueiichinoMacBook-Pro drag_teaching % 
