Last login: Mon Nov  9 12:04:46 on ttys005
(base) shimazueiichi@shimadzueiichinoMacBook-Pro ~ % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure
python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_231249.json
python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_231249.json --execute
python3: can't open file '/Users/shimazueiichi/dynamic_tracking_limits/drag_teaching/record_teach_demo.py': [Errno 2] No such file or directory
python3: can't open file '/Users/shimazueiichi/dynamic_tracking_limits/drag_teaching/record_teach_demo.py': [Errno 2] No such file or directory
python3: can't open file '/Users/shimazueiichi/dynamic_tracking_limits/drag_teaching/record_teach_demo.py': [Errno 2] No such file or directory
(base) shimazueiichi@shimadzueiichinoMacBook-Pro ~ % cd ~/r2r2r-scripts
python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure
[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   ] measure: 上カメラで検出します（repeat=5 interval=0.3s）
[CAM] 接続中カメラ一覧:
  index=0  name=FaceTime HDカメラ
  index=1  name=Iriun Camera
  index=2  name=‎iPhone14 Pro MAXのカメラ
[CAM] 上カメラ(iPhone)  index=2
[CAM] 横カメラ(Iriun)   index=1
[DETECT] resolved top index: 2
[Mac] マット四隅検出中... (10フレーム)
[Mac] ✓ マット四隅検出: 10/10 フレーム成功
[Mac] ✓ 動的homography計算完了
[Mac] ✓ マット範囲: X=[304, 1701] Y=[0, 948]
[06f] TEMPLATES_DIR overridden to: /Users/shimazueiichi/r2r2r-scripts/dynamic_tracking_limits/place/templates
[06f] ROTATION_ANGLES_DEG overridden to: [0, 15, 30, 45, 60, 75]
[06f] SCALES overridden to: [0.85, 1.0, 1.15]
[テンプレ] loading white box templates from: /Users/shimazueiichi/r2r2r-scripts/dynamic_tracking_limits/place/templates
[テンプレ] glob '/Users/shimazueiichi/r2r2r-scripts/dynamic_tracking_limits/place/templates/*.png' → 8 file(s)
[テンプレ]   - white_box_20260520_163829_004.png
[テンプレ]   - white_box_20260520_163838_005.png
[テンプレ]   - white_box_20260520_163846_006.png
[テンプレ]   - white_box_20260520_163905_009.png
[テンプレ]   - white_box_20260520_163912_010.png
[テンプレ]   - white_box_20260520_163918_011.png
[テンプレ]   - white_box_20260520_163923_012.png
[テンプレ]   - white_box_20260520_163929_013.png
[テンプレ] 計 8 枚 (day165=8, auto=0)
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1489,553) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.54s)
[DETECT][1/5] box Unity=(-0.218,+0.182) score=0.6472325325012207
  赤ブロック pixel=(723, 682) → Unity=(0.1279, 0.2394)
[DETECT][1/5] block Unity=(+0.128,+0.239) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.2px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1489,553) source=template_fallback score=0.648 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.45s)
[DETECT][2/5] box Unity=(-0.218,+0.182) score=0.6475574374198914
  赤ブロック pixel=(724, 683) → Unity=(0.1275, 0.2399)
[DETECT][2/5] block Unity=(+0.127,+0.240) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1489,554) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.73s)
[DETECT][3/5] box Unity=(-0.218,+0.183) score=0.6469919085502625
  赤ブロック pixel=(724, 682) → Unity=(0.1274, 0.2394)
[DETECT][3/5] block Unity=(+0.127,+0.239) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1489,554) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.21s)
[DETECT][4/5] box Unity=(-0.218,+0.183) score=0.6472181081771851
  赤ブロック pixel=(723, 683) → Unity=(0.1279, 0.2399)
[DETECT][4/5] block Unity=(+0.128,+0.240) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.8px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1490,554) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.25s)
[DETECT][5/5] box Unity=(-0.219,+0.183) score=0.6470634937286377
  赤ブロック pixel=(724, 683) → Unity=(0.1275, 0.2399)
[DETECT][5/5] block Unity=(+0.127,+0.240) score=null
[RTD   ] measure: block = (+127.5, +239.9) mm
[RTD   ] measure: box   = (-218.3, +183.0) mm  score=0.6472181081771851
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_120729.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 1.56px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 1.0px = 0.47mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.47mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_120729.json
[RTD   ] 次は Pi で教示 → daemon 起動 → recorder.py --top --no-side 常駐 → run --teach <file> --execute
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/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_1m9msi0m/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_20261109/measure_20261109_120729.json
[RTD   ]   measured_at = 2026-11-09T12:07:31.373791  block = (+127.5, +239.9) mm  box = (-218.3, +183.0) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+127.4, +239.4) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_120752.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 1.0px <= 許容 10.5px = 5.0mm / mm 換算の差 0.47mm）
[RTD   ] マット四隅のずれ 最大 1.4px（上限 15.0px・やり直し 1 回）
[RTD   ] ドライランなので、ここで終了します（アームには何も送っていません）
[RTD   ] Pi 版と比べる点: 抽出ウェイポイント 4 姿勢と各区間の max|Δ| は同じ。送り方は単発（Pi 版は 0.1s 補間ストリーミング）なので n_steps / ticks は比較対象外。送信 8 回 / 想定所要 ≈ 29.8s
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_231249.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[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_nzrpmtyh/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 から取得します
[RTD   ] 現在姿勢 = [  +0.17,   +1.49,   +0.79,   -0.17,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  +0.17,   +1.49,   +0.79,   -0.17,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.49°  (settle 3.0s)
  [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_20261109/measure_20261109_120729.json
[RTD   ]   measured_at = 2026-11-09T12:07:31.373791  block = (+127.5, +239.9) mm  box = (-218.3, +183.0) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+127.4, +239.4) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_120813.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 1.0px <= 許容 10.5px = 5.0mm / mm 換算の差 0.47mm）
[RTD   ] マット四隅のずれ 最大 1.1px（上限 15.0px・やり直し 1 回）
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_120818
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_120818/teach/drag_v2_20221013_231249.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_120818/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.49° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.49° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.015s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.8s)
[RTD   ] 送信 OK（daemon 往復 1.021s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.14° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.043s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.93° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.013s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.29° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.4s)
[RTD   ] 送信 OK（daemon 往復 1.055s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.81° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.76° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.004s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.040s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.72° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.058s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 58/58 回, 実効 1.61 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.61 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.039s / p50 1.040s / 最大 1.058s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.058s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.36s / 最大 4.64s
[RECORD] 電流の記録終了 77 行 (2.14 行/秒. 本体が眠っている間だけ読む. 爪の間 14.05 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_120818/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_120818/run_0001_20261109_120818.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_120818 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_231249.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[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_z9apcvd5/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 から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.75,   +0.00,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.75,   +0.00,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.75°  (settle 3.0s)
  [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_20261109/measure_20261109_120729.json
[RTD   ]   measured_at = 2026-11-09T12:07:31.373791  block = (+127.5, +239.9) mm  box = (-218.3, +183.0) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+153.9, +233.3) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_121012.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 61.4px（≒27.2mm）動いています（許容 10.5px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 61.4px（許容 10.5px = 5.0mm）/ mm 換算の差 27.23mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121128
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121128/teach/drag_v2_20221013_231249.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121128/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.75° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.75° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.014s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.8s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.32° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.022s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.85° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.012s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.049s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.81° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.4s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.55° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.93° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.017s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.046s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.72° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.28° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 60/60 回, 実効 1.65 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.65 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.035s / p50 1.032s / 最大 1.049s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.049s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.43s / 最大 4.43s
[RECORD] 電流の記録終了 81 行 (2.22 行/秒. 本体が眠っている間だけ読む. 爪の間 14.054 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121128/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121128/run_0001_20261109_121128.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_121128 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_231249.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[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_9axsa31m/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 から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.75,   +0.00,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.75,   +0.00,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.75°  (settle 3.0s)
  [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_20261109/measure_20261109_120729.json
[RTD   ]   measured_at = 2026-11-09T12:07:31.373791  block = (+127.5, +239.9) mm  box = (-218.3, +183.0) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+135.4, +237.4) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_121219.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 18.7px（≒8.3mm）動いています（許容 10.5px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 18.7px（許容 10.5px = 5.0mm）/ mm 換算の差 8.31mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121224
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121224/teach/drag_v2_20221013_231249.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121224/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.75° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.75° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.014s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.8s)
[RTD   ] 送信 OK（daemon 往復 1.041s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.23° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.93° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.013s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.29° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.4s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.99° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.76° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.056s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.55° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.039s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.28° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 59/59 回, 実効 1.64 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.64 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.037s / p50 1.032s / 最大 1.056s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.056s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.38s / 最大 4.66s
[RECORD] 電流の記録終了 79 行 (2.19 行/秒. 本体が眠っている間だけ読む. 爪の間 14.052 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121224/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121224/run_0001_20261109_121224.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_121224 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_231249.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[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_53m4i4bn/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 から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.75,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.75,   +0.08,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.75°  (settle 3.0s)
  [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_20261109/measure_20261109_120729.json
[RTD   ]   measured_at = 2026-11-09T12:07:31.373791  block = (+127.5, +239.9) mm  box = (-218.3, +183.0) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+130.5, +236.1) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_121316.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 10.6px（≒4.9mm）動いています（許容 10.5px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 10.6px（許容 10.5px = 5.0mm）/ mm 換算の差 4.90mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121320
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121320/teach/drag_v2_20221013_231249.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121320/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.75° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.75° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.8s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.32° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.85° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.012s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.29° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.4s)
[RTD   ] 送信 OK（daemon 往復 1.037s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.90° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.76° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.054s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.64° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.37° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 58/58 回, 実効 1.62 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.62 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.035s / p50 1.031s / 最大 1.054s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.054s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.34s / 最大 4.37s
[RECORD] 電流の記録終了 77 行 (2.16 行/秒. 本体が眠っている間だけ読む. 爪の間 14.048 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121320/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121320/run_0001_20261109_121320.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_121320 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_231249.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[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_2pa2_2i3/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 から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.75,   +0.00,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.75,   +0.00,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.75°  (settle 3.0s)
  [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_20261109/measure_20261109_120729.json
[RTD   ]   measured_at = 2026-11-09T12:07:31.373791  block = (+127.5, +239.9) mm  box = (-218.3, +183.0) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+133.5, +226.5) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_121413.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 31.3px（≒14.7mm）動いています（許容 10.5px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 31.3px（許容 10.5px = 5.0mm）/ mm 換算の差 14.67mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121416
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121416/teach/drag_v2_20221013_231249.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121416/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.75° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.75° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.015s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.8s)
[RTD   ] 送信 OK（daemon 往復 1.048s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.32° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.85° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.011s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.29° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.4s)
[RTD   ] 送信 OK（daemon 往復 1.055s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.55° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.02° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.99° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.28° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 60/60 回, 実効 1.65 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.65 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.037s / p50 1.032s / 最大 1.055s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.055s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.42s / 最大 4.38s
[RECORD] 電流の記録終了 81 行 (2.23 行/秒. 本体が眠っている間だけ読む. 爪の間 14.053 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121416/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121416/run_0001_20261109_121416.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_121416 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_231249.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[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_ba2f9hiv/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 から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.75,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.75,   +0.08,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.75°  (settle 3.0s)
  [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_20261109/measure_20261109_120729.json
[RTD   ]   measured_at = 2026-11-09T12:07:31.373791  block = (+127.5, +239.9) mm  box = (-218.3, +183.0) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+128.4, +241.8) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_121507.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 4.5px <= 許容 10.5px = 5.0mm / mm 換算の差 2.10mm）
[RTD   ] マット四隅のずれ 最大 2.2px（上限 15.0px・やり直し 1 回）
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121511
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121511/teach/drag_v2_20221013_231249.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121511/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.75° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.75° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.016s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.8s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.40° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.056s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.85° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.010s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.028s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.37° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.4s)
[RTD   ] 送信 OK（daemon 往復 1.053s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.55° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.02° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.004s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.037s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.37° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.043s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.37° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 57/57 回, 実効 1.61 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.61 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.040s / p50 1.037s / 最大 1.056s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.056s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.29s / 最大 4.41s
[RECORD] 電流の記録終了 75 行 (2.12 行/秒. 本体が眠っている間だけ読む. 爪の間 14.053 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121511/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121511/run_0001_20261109_121511.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_121511 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_231249.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[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_z7s9m0g_/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 から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.75,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.75,   +0.08,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.75°  (settle 3.0s)
  [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_20261109/measure_20261109_120729.json
[RTD   ]   measured_at = 2026-11-09T12:07:31.373791  block = (+127.5, +239.9) mm  box = (-218.3, +183.0) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+136.2, +228.9) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_121600.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 30.5px（≒14.1mm）動いています（許容 10.5px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 30.5px（許容 10.5px = 5.0mm）/ mm 換算の差 14.06mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121605
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121605/teach/drag_v2_20221013_231249.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121605/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.75° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.75° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.8s)
[RTD   ] 送信 OK（daemon 往復 1.039s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.49° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.035s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.93° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.012s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.039s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.46° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.4s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.55° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.11° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.044s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.64° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 58/58 回, 実効 1.62 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.62 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.036s / p50 1.035s / 最大 1.044s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.044s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.34s / 最大 4.44s
[RECORD] 電流の記録終了 77 行 (2.16 行/秒. 本体が眠っている間だけ読む. 爪の間 14.059 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121605/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121605/run_0001_20261109_121605.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_121605 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_231249.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[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_6h81jhhb/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 から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.93,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.93,   +0.08,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.93°  (settle 3.0s)
  [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_20261109/measure_20261109_120729.json
[RTD   ]   measured_at = 2026-11-09T12:07:31.373791  block = (+127.5, +239.9) mm  box = (-218.3, +183.0) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+131.9, +241.7) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_121656.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 10.8px（≒4.8mm）動いています（許容 10.5px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 10.8px（許容 10.5px = 5.0mm）/ mm 換算の差 4.81mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121659
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121659/teach/drag_v2_20221013_231249.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121659/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.93° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.93° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.016s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.8s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.40° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.167s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.85° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.010s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.034s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.37° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.4s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.64° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.040s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.11° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.014s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.72° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.28° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 60/60 回, 実効 1.65 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.65 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.052s / p50 1.031s / 最大 1.167s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.167s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.43s / 最大 4.42s
[RECORD] 電流の記録終了 81 行 (2.22 行/秒. 本体が眠っている間だけ読む. 爪の間 14.054 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121659/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121659/run_0001_20261109_121659.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_121659 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_231249.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[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_nnd1ylfz/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 から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.75,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.75,   +0.08,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.75°  (settle 3.0s)
  [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_20261109/measure_20261109_120729.json
[RTD   ]   measured_at = 2026-11-09T12:07:31.373791  block = (+127.5, +239.9) mm  box = (-218.3, +183.0) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+130.0, +228.5) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_121754.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 24.7px（≒11.7mm）動いています（許容 10.5px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 24.7px（許容 10.5px = 5.0mm）/ mm 換算の差 11.70mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121815
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121815/teach/drag_v2_20221013_231249.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121815/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.75° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.75° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.8s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.32° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.85° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.013s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.049s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.37° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.4s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.55° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.93° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.90° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.28° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 60/60 回, 実効 1.65 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.65 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.034s / p50 1.031s / 最大 1.049s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.049s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.41s / 最大 4.42s
[RECORD] 電流の記録終了 81 行 (2.23 行/秒. 本体が眠っている間だけ読む. 爪の間 14.049 秒は読まない. 見込み超え 1 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121815/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_121815/run_0001_20261109_121815.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_121815 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 tools/gamepad_teleop.py --execute
/opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/pkgdata.py:25: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
  from pkg_resources import resource_stream, resource_exists
objc[15510]: Class SDLApplication is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad2c8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f4890). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class SDLAppDelegate is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad318) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f48e0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class SDLTranslatorResponder is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad390) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f4958). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class SDLMessageBoxPresenter is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad3b8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f4980). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class SDL_cocoametalview is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad408) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f49d0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class SDLOpenGLContext is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad458) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f4a20). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class SDL_ShapeData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad4d0) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f4a98). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class SDL_CocoaClosure is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad520) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f4ae8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class SDL_VideoData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad570) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f4b38). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class SDL_WindowData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad5c0) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f4b88). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class SDLWindow is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad5e8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f4bb0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class Cocoa_WindowListener is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad610) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f4bd8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class SDLView is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad688) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f4c50). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class METAL_RenderData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad700) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f4cc8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class METAL_TextureData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad750) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f4d18). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class SDL_RumbleMotor is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad778) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f4d40). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15510]: Class SDL_RumbleContext is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dad7c8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b8f4d90). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
[記録] /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261109_122141
[実機] daemon に送ります。起動したときの姿勢: -0.43 +1.49 +1.75 +0.08 -0.26 -30.23
コントローラーを待っています（つないでいなければ、今つないでください）
[接続] PS4 Controller  GUID=03008fe54c050000cc09000000016800  軸=6  ボタン=16
[長押し] j0 を -0.43° → -9.93° まで（目標を 1 回送信。止めます）
[送信] j0 -1.0° → -16.64 +1.49 +1.75 +0.08 -0.26 -30.23  届いた（ずれ 1.75°）  届いた角度 -17.05 +1.49 +1.93 +0.08 +1.49 -30.23
[送信] j0 -1.0° → -17.64 +1.49 +1.75 +0.08 -0.26 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 1.75°）  届いた角度 -16.43 +1.49 +1.93 +0.08 +1.49 -30.23
[長押し] j0 を -16.43° → -16.43° まで（目標を 1 回送信。止めます）
[長押し] j0 を -16.69° → -22.85° まで（目標を 1 回送信。止めます）
[送信] j0 +1.0° → -29.32 +1.49 +1.75 +0.08 -0.26 -30.23  届いた（ずれ 1.92°）  届いた角度 -29.09 +1.58 +1.84 +0.00 +1.66 -30.32
[送信] j0 +1.0° → -28.32 +1.49 +1.75 +0.08 -0.26 -30.23  届いた（ずれ 1.92°）  届いた角度 -28.74 +1.58 +1.84 +0.00 +1.66 -30.32
[送信] j0 +1.0° → -27.32 +1.49 +1.75 +0.08 -0.26 -30.23  届いた（ずれ 1.92°）  届いた角度 -27.33 +1.58 +1.84 +0.00 +1.66 -30.32
[送信] j0 +1.0° → -26.32 +1.49 +1.75 +0.08 -0.26 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 0.78°）  届いた角度 -27.07 +1.58 +1.84 +0.00 +0.52 -30.32
[送信] j0 +1.0° → -25.32 +1.49 +1.75 +0.08 -0.26 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 1.75°）  届いた角度 -27.07 +1.58 +1.84 +0.00 +0.52 -30.32
[関節] 上下で動かす関節を j2 にしました
[長押し] j2 を +1.84° → -7.47° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
  [WARN] daemon_get_angles failed: daemon error: get_angles returned empty/invalid after 12 retries
  [WARN] daemon_get_angles failed: daemon error: get_angles returned empty/invalid after 12 retries
  [WARN] daemon_get_angles failed: daemon error: get_angles returned empty/invalid after 12 retries
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
  [WARN] daemon_get_angles failed: daemon error: get_angles returned empty/invalid after 12 retries
  [WARN] daemon_get_angles failed: daemon error: get_angles returned empty/invalid after 12 retries
  [WARN] daemon_get_angles failed: daemon error: get_angles returned empty/invalid after 12 retries
  [WARN] daemon_get_angles failed: daemon error: get_angles returned empty/invalid after 12 retries
[送信] j4 -1.0° → -25.32 +1.49 -26.42 +0.08 -1.00 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 1.38°）  届いた角度 -25.04 +1.49 -25.04 +0.00 +0.00 -30.23
[送信] j1 +1.0° → -25.32 +2.49 -26.42 +0.08 -1.00 -30.23  届いた（ずれ 1.38°）  届いた角度 -25.04 +2.81 -25.04 +0.00 -1.58 -30.23
[長押し] j1 を +3.42° → +11.60° まで（目標を 1 回送信。止めます）
  [WARN] daemon_get_angles failed: daemon error: get_angles returned empty/invalid after 12 retries
  [WARN] daemon_get_angles failed: daemon error: get_angles returned empty/invalid after 12 retries
[送信] j1 +1.0° → -25.32 +21.83 -26.42 +0.08 -1.00 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 1.9°）  届いた角度 -25.04 +22.93 -24.52 +0.08 +0.17 -30.23
[長押し] j1 を +22.93° → +29.79° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j2 にしました
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[長押し] j4 を +1.84° → -36.82° まで（目標を 4 回送信。止めます）
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[送信] j1 -1.0° → -25.32 +38.81 -26.42 +0.08 -36.65 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 2.96°）  届いた角度 -25.04 +41.22 -23.46 +0.08 -36.38 -30.23
[長押し] j1 を +41.22° → +46.75° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j2 にしました
[長押し] j2 を -23.99° → -23.11° まで（目標を 1 回送信。止めます）
[長押し] j2 を -8.17° → -7.11° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[送信] j1 -1.0° → -25.32 +57.88 -2.81 +0.08 -36.65 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 4.3°）  届いた角度 -25.04 +60.38 -2.81 +0.17 -40.95 -30.23
[長押し] j1 を +60.38° → +51.94° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j2 にしました
[長押し] j2 を +0.43° → +0.43° まで（目標を 1 回送信。止めます）
[送信] j2 +1.0° → -25.32 +50.00 +10.75 +0.08 -36.65 -30.23  届いた（ずれ 5.27°）  届いた角度 -25.04 +47.81 +10.72 +0.26 -41.92 -30.23
[長押し] j2 を +11.25° → +11.25° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[長押し] j1 を +48.42° → +48.07° まで（目標を 1 回送信。止めます）
[長押し] j1 を +44.47° → +42.36° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j2 にしました
[止める] stop（released_while_sending）  止まった角度 -25.04 +48.16 +24.34 -0.08 -44.64 -30.76
[長押し] j2 を +24.34° → +24.25° まで（目標を 1 回送信。止めます）
[長押し] j2 を +18.01° → +17.75° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[送信] j1 +1.0° → -25.32 +52.76 +6.32 +0.08 -36.65 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 5.27°）  届いた角度 -25.04 +53.87 +4.21 +0.26 -41.92 -30.58
[長押し] j1 を +53.87° → +52.11° まで（目標を 1 回送信。止めます）
[長押し] j1 を +42.89° → +42.62° まで（目標を 1 回送信。止めます）
[送信] j1 +1.0° → -25.32 +53.47 +6.32 +0.08 -36.65 -30.23  届いた（ずれ 2.54°）  届いた角度 -25.04 +53.61 +5.53 +0.26 -39.19 -30.58
[送信] j1 +1.0° → -25.32 +54.47 +6.32 +0.08 -36.65 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 2.9°）  届いた角度 -25.04 +55.63 +4.65 +0.26 -39.55 -30.58
[送信] j1 +1.0° → -25.32 +55.47 +6.32 +0.08 -36.65 -30.23  届いた（ずれ 2.9°）  届いた角度 -25.04 +55.63 +4.65 +0.26 -39.55 -30.58
[送信] j1 +2.0° → -25.32 +57.47 +6.32 +0.08 -36.65 -30.23  届いた（ずれ 3.86°）  届いた角度 -25.04 +57.74 +4.57 +0.26 -40.51 -30.49
[関節] 上下で動かす関節を j2 にしました
[送信] j2 -1.0° → -25.32 +57.47 +5.32 +0.08 -36.65 -30.23  届いた（ずれ 4.21°）  届いた角度 -25.04 +58.53 +4.83 +0.17 -40.86 -30.23
[送信] j2 -1.0° → -25.32 +57.47 +4.32 +0.08 -36.65 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 5.44°）  届いた角度 -25.04 +58.53 +5.71 +0.00 -42.09 -30.23
[送信] j2 +1.0° → -25.32 +57.47 +5.32 +0.08 -36.65 -30.23  届いた（ずれ 5.44°）  届いた角度 -25.04 +58.53 +5.71 +0.00 -42.09 -30.23
[送信] j2 +1.0° → -25.32 +57.47 +6.32 +0.08 -36.65 -30.23  届いた（ずれ 5.44°）  届いた角度 -25.04 +58.53 +6.06 +0.00 -42.09 -30.23
[送信] j2 +2.0° → -25.32 +57.47 +8.32 +0.08 -36.65 -30.23  届いた（ずれ 7.2°）  届いた角度 -25.04 +58.53 +7.99 -0.17 -43.85 -30.23
[止める] stop（released_while_sending）  止まった角度 -25.04 +59.06 +7.99 -0.17 -44.47 -30.41
[送信] j2 +2.0° → -25.32 +57.47 +9.99 +0.08 -36.65 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 7.47°）  届いた角度 -25.04 +58.62 +9.05 -0.35 -44.12 -30.58
[関節] 上下で動かす関節を j3 にしました
[送信] j3 -1.0° → -25.32 +57.47 +9.99 -0.92 -36.65 -30.23  届いた（ずれ 7.2°）  届いた角度 -25.04 +58.62 +9.05 -0.43 -43.85 -30.49
[送信] j3 -1.0° → -25.32 +57.47 +9.99 -1.92 -36.65 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 6.5°）  届いた角度 -25.31 +58.27 +9.05 -1.23 -43.15 -30.41
[関節] 上下で動かす関節を j4 にしました
[送信] j4 -1.0° → -25.32 +57.47 +9.99 -1.92 -43.62 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 1.0°）  届いた角度 -25.40 +58.18 +9.05 -1.40 -42.62 -30.32
[止める] stop（released_while_sending）  止まった角度 -25.40 +58.35 +9.05 -1.40 -43.76 -30.32
[長押し] j4 を -43.76° → -44.82° まで（目標を 1 回送信。止めます）
[送信] j4 -1.0° → -25.32 +57.47 +9.99 -1.92 -48.28 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 1.68°）  届いた角度 -25.40 +59.15 +9.84 -1.23 -47.37 -30.41
[送信] j4 -1.0° → -25.32 +57.47 +9.99 -1.92 -49.28 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 1.68°）  届いた角度 -25.40 +59.15 +9.84 -1.31 -47.72 -30.41
[長押し] j4 を -47.81° → -47.81° まで（目標を 1 回送信。止めます）
[長押し] j4 を -51.41° → -57.39° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[送信] j1 +1.0° → -25.32 +62.25 +9.99 -1.92 -62.05 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 3.95°）  届いた角度 -25.40 +63.45 +10.01 -1.14 -66.00 -30.41
[送信] j1 +1.0° → -25.32 +63.25 +9.99 -1.92 -62.05 -30.23  届いた（ずれ 3.95°）  届いた角度 -25.40 +63.45 +10.01 -1.23 -66.00 -30.41
[長押し] j1 を +64.24° → +66.09° まで（目標を 1 回送信。止めます）
[送信] j1 -1.0° → -25.32 +69.22 +9.99 -1.92 -62.05 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 5.8°）  届いた角度 -25.40 +70.22 +10.01 -1.40 -67.85 -29.97
[送信] j1 -1.0° → -25.32 +68.22 +9.99 -1.92 -62.05 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 5.53°）  届いた角度 -25.40 +70.04 +10.01 -1.40 -67.58 -29.97
[送信] j1 -1.0° → -25.32 +67.22 +9.99 -1.92 -62.05 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 3.78°）  届いた角度 -25.40 +68.90 +10.01 -1.40 -65.83 -30.05
[長押し] j1 を +68.90° → +66.88° まで（目標を 1 回送信。止めます）
[送信] j1 +1.0° → -25.32 +60.58 +9.99 -1.92 -62.05 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 2.28°）  届いた角度 -25.40 +61.78 +10.01 -1.23 -64.33 -30.14
[送信] j1 +1.0° → -25.32 +61.58 +9.99 -1.92 -62.05 -30.23  届いた（ずれ 2.28°）  届いた角度 -25.40 +61.78 +10.01 -1.23 -64.33 -30.14
[送信] j1 +2.0° → -25.32 +63.58 +9.99 -1.92 -62.05 -30.23  届いた（ずれ 3.07°）  届いた角度 -25.40 +64.07 +10.10 -1.31 -65.12 -30.14
[送信] j1 +2.0° → -25.32 +65.58 +9.99 -1.92 -62.05 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 3.51°）  届いた角度 -25.40 +66.62 +10.10 -1.40 -65.56 -30.14
[関節] 上下で動かす関節を j2 にしました
[送信] j2 +1.0° → -25.32 +65.58 +10.99 -1.92 -62.05 -30.23  届いた（ずれ 3.95°）  届いた角度 -25.40 +66.70 +11.07 -1.58 -66.00 -30.23
[送信] j2 -1.0° → -25.32 +65.58 +9.99 -1.92 -62.05 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 1.75°）  届いた角度 -25.40 +66.70 +11.25 -1.58 -63.80 -30.14
[止める] stop（released_while_sending）  止まった角度 -25.40 +67.41 +9.31 -1.66 -62.05 -30.05
[長押し] j2 を +9.31° → +9.31° まで（目標を 1 回送信。止めます）
  [Pi] GRIPPER: VALUE=20 speed=100 result= None
[爪] 爪を閉じる（待ち 0.8 秒のあと受付）
  [Pi] GRIPPER: OPEN result= None
[爪] 爪を開く（待ち 0.8 秒のあと受付）
[送信] j2 -1.0° → -25.32 +65.58 -2.93 -1.92 -50.71 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 12.48°）  届いた角度 -25.48 +68.20 -1.84 -1.40 -63.19 -30.14
[送信] j2 +1.0° → -25.32 +65.58 -1.93 -1.92 -63.19 -30.23  届いた（ずれ 2.62°）  届いた角度 -25.48 +68.20 -1.84 -1.40 -63.19 -30.14
[送信] j2 +1.0° → -25.32 +65.58 -0.93 -1.92 -63.19 -30.23  届いた（ずれ 2.62°）  届いた角度 -25.48 +68.20 -1.05 -1.40 -64.07 -30.14
[送信] j2 +1.0° → -25.32 +65.58 +0.07 -1.92 -63.19 -30.23  届いた（ずれ 2.62°）  届いた角度 -25.48 +68.20 -0.08 -1.40 -64.16 -30.14
[送信] j2 +2.0° → -25.32 +65.58 +2.07 -1.92 -63.19 -30.23  届いた（ずれ 2.62°）  届いた角度 -25.48 +68.20 +2.19 -1.40 -65.21 -30.14
[送信] j2 +2.0° → -25.32 +65.58 +4.07 -1.92 -63.19 -30.23  届いた（ずれ 2.62°）  届いた角度 -25.48 +68.20 +4.13 -1.40 -65.56 -30.14
[送信] j2 +2.0° → -25.32 +65.58 +6.07 -1.92 -63.19 -30.23  届いた（ずれ 2.64°）  届いた角度 -25.48 +68.20 +6.32 -1.40 -65.83 -30.14
[送信] j2 +2.0° → -25.32 +65.58 +8.07 -1.92 -63.19 -30.23  届いた（ずれ 2.81°）  届いた角度 -25.48 +68.20 +7.82 -1.40 -66.00 -30.14
  [Pi] GRIPPER: VALUE=20 speed=100 result= None
[爪] 爪を閉じる（待ち 0.8 秒のあと受付）
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[長押し] j1 を +68.20° → +47.19° まで（目標を 3 回送信。止めます）
  [Pi] GRIPPER: OPEN result= None
[爪] 爪を開く（待ち 0.8 秒のあと受付）
^C
[終了] Ctrl+C
[終了] アームは動かしていません。記録: /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261109_122141
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % >....                                           
たので 2 回送り直した（ずれ 1.75°）  届いた角度 -25.40 +66.70 +11.25 -1.58 -63.80 -30.14
[止める] stop（released_while_sending）  止まった角度 -25.40 +67.41 +9.31 -1.66 -62.05 -30.05
[長押し] j2 を +9.31° → +9.31° まで（目標を 1 回送信。止めます）
  [Pi] GRIPPER: VALUE=20 speed=100 result= None
[爪] 爪を閉じる（待ち 0.8 秒のあと受付）
  [Pi] GRIPPER: OPEN result= None
[爪] 爪を開く（待ち 0.8 秒のあと受付）
[送信] j2 -1.0° → -25.32 +65.58 -2.93 -1.92 -50.71 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 12.48°）  届いた角度 -25.48 +68.20 -1.84 -1.40 -63.19 -30.14
[送信] j2 +1.0° → -25.32 +65.58 -1.93 -1.92 -63.19 -30.23  届いた（ずれ 2.62°）  届いた角度 -25.48 +68.20 -1.84 -1.40 -63.19 -30.14
[送信] j2 +1.0° → -25.32 +65.58 -0.93 -1.92 -63.19 -30.23  届いた（ずれ 2.62°）  届いた角度 -25.48 +68.20 -1.05 -1.40 -64.07 -30.14
[送信] j2 +1.0° → -25.32 +65.58 +0.07 -1.92 -63.19 -30.23  届いた（ずれ 2.62°）  届いた角度 -25.48 +68.20 -0.08 -1.40 -64.16 -30.14
[送信] j2 +2.0° → -25.32 +65.58 +2.07 -1.92 -63.19 -30.23  届いた（ずれ 2.62°）  届いた角度 -25.48 +68.20 +2.19 -1.40 -65.21 -30.14
[送信] j2 +2.0° → -25.32 +65.58 +4.07 -1.92 -63.19 -30.23  届いた（ずれ 2.62°）  届いた角度 -25.48 +68.20 +4.13 -1.40 -65.56 -30.14
[送信] j2 +2.0° → -25.32 +65.58 +6.07 -1.92 -63.19 -30.23  届いた（ずれ 2.64°）  届いた角度 -25.48 +68.20 +6.32 -1.40 -65.83 -30.14
[送信] j2 +2.0° → -25.32 +65.58 +8.07 -1.92 -63.19 -30.23  届いた（ずれ 2.81°）  届いた角度 -25.48 +68.20 +7.82 -1.40 -66.00 -30.14
  [Pi] GRIPPER: VALUE=20 speed=100 result= None
[爪] 爪を閉じる（待ち 0.8 秒のあと受付）
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[長押し] j1 を +68.20° → +47.19° まで（目標を 3 回送信。止めます）
  [Pi] GRIPPER: OPEN result= None
[爪] 爪を開く（待ち 0.8 秒のあと受付）
^C
[終了] Ctrl+C
[終了] アームは動かしていません。記録: /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261109_122141
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts %
python3 tools/gamepad_teleop.py --execute
zsh: parse error near `shimazueiichi@shimad...'
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 tools/gamepad_teleop.py --execute
/opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/pkgdata.py:25: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
  from pkg_resources import resource_stream, resource_exists
objc[15740]: Class SDLApplication is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd2c8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edcc890). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class SDLAppDelegate is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd318) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edcc8e0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class SDLTranslatorResponder is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd390) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edcc958). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class SDLMessageBoxPresenter is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd3b8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edcc980). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class SDL_cocoametalview is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd408) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edcc9d0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class SDLOpenGLContext is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd458) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edcca20). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class SDL_ShapeData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd4d0) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edcca98). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class SDL_CocoaClosure is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd520) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edccae8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class SDL_VideoData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd570) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edccb38). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class SDL_WindowData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd5c0) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edccb88). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class SDLWindow is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd5e8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edccbb0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class Cocoa_WindowListener is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd610) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edccbd8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class SDLView is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd688) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edccc50). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class METAL_RenderData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd700) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edcccc8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class METAL_TextureData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd750) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edccd18). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class SDL_RumbleMotor is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd778) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edccd40). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[15740]: Class SDL_RumbleContext is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1060bd7c8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10edccd90). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
[記録] /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261109_122554
[実機] daemon に送ります。起動したときの姿勢: -25.48 +43.06 +8.52 -2.10 -13.18 -30.23
コントローラーを待っています（つないでいなければ、今つないでください）
[接続] PS4 Controller  GUID=03008fe54c050000cc09000000016800  軸=6  ボタン=16
[HOME] 0.61 秒で離したので送りません（1 秒の長押しで送ります）
[送信] HOME → +0.00 +0.00 +0.00 +0.00 +0.00 -30.00  届いた（ずれ 2.1°）  届いた角度 -0.08 +1.66 +2.10 -0.26 +0.70 -30.23
^C
[終了] Ctrl+C
[終了] アームは動かしていません。記録: /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261109_122554
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % scp -i ~/.ssh/id_rsa_pi /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/drag_v2_20261109_123000.json ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/
drag_v2_20261109_123000.json                                                   100%   37KB   7.2MB/s   00:00    
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure
[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   ] measure: 上カメラで検出します（repeat=5 interval=0.3s）
[CAM] 接続中カメラ一覧:
  index=0  name=FaceTime HDカメラ
  index=1  name=Iriun Camera
  index=2  name=‎iPhone14 Pro MAXのカメラ
[CAM] 上カメラ(iPhone)  index=2
[CAM] 横カメラ(Iriun)   index=1
[DETECT] resolved top index: 2
[Mac] マット四隅検出中... (10フレーム)
[Mac] ✓ マット四隅検出: 10/10 フレーム成功
[Mac] ✓ 動的homography計算完了
[Mac] ✓ マット範囲: X=[302, 1703] Y=[0, 949]
[06f] TEMPLATES_DIR overridden to: /Users/shimazueiichi/r2r2r-scripts/dynamic_tracking_limits/place/templates
[06f] ROTATION_ANGLES_DEG overridden to: [0, 15, 30, 45, 60, 75]
[06f] SCALES overridden to: [0.85, 1.0, 1.15]
[テンプレ] loading white box templates from: /Users/shimazueiichi/r2r2r-scripts/dynamic_tracking_limits/place/templates
[テンプレ] glob '/Users/shimazueiichi/r2r2r-scripts/dynamic_tracking_limits/place/templates/*.png' → 8 file(s)
[テンプレ]   - white_box_20260520_163829_004.png
[テンプレ]   - white_box_20260520_163838_005.png
[テンプレ]   - white_box_20260520_163846_006.png
[テンプレ]   - white_box_20260520_163905_009.png
[テンプレ]   - white_box_20260520_163912_010.png
[テンプレ]   - white_box_20260520_163918_011.png
[テンプレ]   - white_box_20260520_163923_012.png
[テンプレ]   - white_box_20260520_163929_013.png
[テンプレ] 計 8 枚 (day165=8, auto=0)
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,572) source=template_fallback score=0.655 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.09s)
[DETECT][1/5] box Unity=(-0.220,+0.191) score=0.6553379893302917
  赤ブロック pixel=(881, 223) → Unity=(0.0540, 0.0197)
[DETECT][1/5] block Unity=(+0.054,+0.020) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,571) source=template_fallback score=0.655 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.13s)
[DETECT][2/5] box Unity=(-0.220,+0.191) score=0.655491054058075
  赤ブロック pixel=(880, 226) → Unity=(0.0545, 0.0212)
[DETECT][2/5] block Unity=(+0.054,+0.021) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1496,571) source=template_fallback score=0.656 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.13s)
[DETECT][3/5] box Unity=(-0.221,+0.191) score=0.6559053659439087
  赤ブロック pixel=(881, 221) → Unity=(0.0540, 0.0187)
[DETECT][3/5] block Unity=(+0.054,+0.019) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,571) source=template_fallback score=0.656 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.12s)
[DETECT][4/5] box Unity=(-0.220,+0.191) score=0.6560110449790955
  赤ブロック pixel=(879, 283) → Unity=(0.0554, 0.0488)
[DETECT][4/5] block Unity=(+0.055,+0.049) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,571) source=template_fallback score=0.655 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.15s)
[DETECT][5/5] box Unity=(-0.220,+0.191) score=0.6551560163497925
  赤ブロック pixel=(880, 281) → Unity=(0.0549, 0.0478)
[DETECT][5/5] block Unity=(+0.055,+0.048) score=null
[RTD   ] measure: block = (+54.5, +21.2) mm
[RTD   ] measure: box   = (-220.2, +190.9) mm  score=0.655491054058075
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_122827.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 2.24px（上限 15.0px・やり直し 1 回）
[RTD   ] [WARN] 検出したブロックがアームの根元から 58.4mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+54.5, +21.2) mm（WARN のみ・保存します）
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_122827.jpg
[RTD   ] ブロックのばらつき: 2.0px = 0.97mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 26.65mm（上限 3.0mm）
[RTD   ] [WARN] 元の検出 (+54.5, +21.2) mm と測り直し (+54.9, +47.8) mm が 26.65mm 食い違います（上限 3.0mm）。元の検出が外れている可能性があります（WARN のみ・保存します）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_122827.jpg
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_122827.json
[RTD   ] [WARN] この measure には WARN が 2 件あります: block_too_close_to_base, vs_recheck_over
[RTD   ] [WARN] 値が外れている可能性があります。気になるなら取り直してください（保存はしてあります）
[RTD   ] 次は Pi で教示 → daemon 起動 → recorder.py --top --no-side 常駐 → run --teach <file> --execute
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_123000.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_20261109_123000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_44o19u8o/drag_v2_20261109_123000.json
[RTD   ] 入力ファイル: drag_v2_20261109_123000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=146 (start=146 end=194, gap=25.14°)
                    angles = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
  PICK           <- gripper close mark idx=214（PICK phase 範囲内）
                    angles = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
  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（全 146 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 19.78°（しきい値 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      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 66.53°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 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    = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 66.52°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [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 区間）, 想定所要時間 ≈ 30.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 13.7s（max|Δ| 合計 274.4° @ 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_122827.json
[RTD   ]   measured_at = 2026-11-09T12:28:29.041753  block = (+54.5, +21.2) mm  box = (-220.2, +190.9) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+54.9, +48.3) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_122842.jpg
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_122842.jpg
[RTD   ] [WARN] 検出したブロックがアームの根元から 73.1mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+54.9, +48.3) mm（**止めません**・WARN のみ）
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 56.0px（≒27.1mm）動いています（許容 10.3px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 56.0px（許容 10.3px = 5.0mm）/ mm 換算の差 27.13mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] ドライランなので、ここで終了します（アームには何も送っていません）
[RTD   ] Pi 版と比べる点: 抽出ウェイポイント 4 姿勢と各区間の max|Δ| は同じ。送り方は単発（Pi 版は 0.1s 補間ストリーミング）なので n_steps / ticks は比較対象外。送信 8 回 / 想定所要 ≈ 30.7s
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 tools/gamepad_teleop.py --execute
/opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/pkgdata.py:25: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
  from pkg_resources import resource_stream, resource_exists
objc[16047]: Class SDLApplication is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1035352c8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d248890). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class SDLAppDelegate is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x103535318) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d2488e0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class SDLTranslatorResponder is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x103535390) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d248958). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class SDLMessageBoxPresenter is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1035353b8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d248980). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class SDL_cocoametalview is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x103535408) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d2489d0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class SDLOpenGLContext is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x103535458) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d248a20). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class SDL_ShapeData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1035354d0) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d248a98). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class SDL_CocoaClosure is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x103535520) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d248ae8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class SDL_VideoData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x103535570) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d248b38). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class SDL_WindowData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1035355c0) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d248b88). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class SDLWindow is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1035355e8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d248bb0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class Cocoa_WindowListener is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x103535610) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d248bd8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class SDLView is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x103535688) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d248c50). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class METAL_RenderData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x103535700) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d248cc8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class METAL_TextureData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x103535750) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d248d18). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class SDL_RumbleMotor is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x103535778) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d248d40). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[16047]: Class SDL_RumbleContext is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1035357c8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10d248d90). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
[記録] /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261109_122924
[実機] daemon に送ります。起動したときの姿勢: -0.26 +1.66 +2.10 -0.26 -0.26 -30.23
コントローラーを待っています（つないでいなければ、今つないでください）
[接続] PS4 Controller  GUID=03008fe54c050000cc09000000016800  軸=6  ボタン=16
[送信] HOME → +0.00 +0.00 +0.00 +0.00 +0.00 -30.00  届いた（ずれ 2.1°）  届いた角度 -0.26 +1.66 +2.10 -0.26 -0.26 -30.23
^C
[終了] Ctrl+C
[終了] アームは動かしていません。記録: /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261109_122924
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure
python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_123000.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   ] measure: 上カメラで検出します（repeat=5 interval=0.3s）
[CAM] 接続中カメラ一覧:
  index=0  name=FaceTime HDカメラ
  index=1  name=Iriun Camera
  index=2  name=‎iPhone14 Pro MAXのカメラ
[CAM] 上カメラ(iPhone)  index=2
[CAM] 横カメラ(Iriun)   index=1
[DETECT] resolved top index: 2
[Mac] マット四隅検出中... (10フレーム)
[Mac] ✓ マット四隅検出: 10/10 フレーム成功
[Mac] ✓ 動的homography計算完了
[Mac] ✓ マット範囲: X=[302, 1703] Y=[0, 949]
[06f] TEMPLATES_DIR overridden to: /Users/shimazueiichi/r2r2r-scripts/dynamic_tracking_limits/place/templates
[06f] ROTATION_ANGLES_DEG overridden to: [0, 15, 30, 45, 60, 75]
[06f] SCALES overridden to: [0.85, 1.0, 1.15]
[テンプレ] loading white box templates from: /Users/shimazueiichi/r2r2r-scripts/dynamic_tracking_limits/place/templates
[テンプレ] glob '/Users/shimazueiichi/r2r2r-scripts/dynamic_tracking_limits/place/templates/*.png' → 8 file(s)
[テンプレ]   - white_box_20260520_163829_004.png
[テンプレ]   - white_box_20260520_163838_005.png
[テンプレ]   - white_box_20260520_163846_006.png
[テンプレ]   - white_box_20260520_163905_009.png
[テンプレ]   - white_box_20260520_163912_010.png
[テンプレ]   - white_box_20260520_163918_011.png
[テンプレ]   - white_box_20260520_163923_012.png
[テンプレ]   - white_box_20260520_163929_013.png
[テンプレ] 計 8 枚 (day165=8, auto=0)
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,572) source=template_fallback score=0.655 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.46s)
[DETECT][1/5] box Unity=(-0.220,+0.191) score=0.6554038524627686
  赤ブロック pixel=(879, 284) → Unity=(0.0554, 0.0493)
[DETECT][1/5] block Unity=(+0.055,+0.049) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,572) source=template_fallback score=0.655 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.95s)
[DETECT][2/5] box Unity=(-0.220,+0.191) score=0.6552867293357849
  赤ブロック pixel=(880, 230) → Unity=(0.0545, 0.0231)
[DETECT][2/5] block Unity=(+0.054,+0.023) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,572) source=template_fallback score=0.655 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.51s)
[DETECT][3/5] box Unity=(-0.220,+0.191) score=0.6552579998970032
  赤ブロック pixel=(880, 282) → Unity=(0.0549, 0.0483)
[DETECT][3/5] block Unity=(+0.055,+0.048) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,572) source=template_fallback score=0.655 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 6.63s)
[DETECT][4/5] box Unity=(-0.220,+0.191) score=0.6553944945335388
  赤ブロック pixel=(880, 281) → Unity=(0.0549, 0.0478)
[DETECT][4/5] block Unity=(+0.055,+0.048) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,572) source=template_fallback score=0.655 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.56s)
[DETECT][5/5] box Unity=(-0.220,+0.191) score=0.6553799510002136
  赤ブロック pixel=(880, 204) → Unity=(0.0543, 0.0105)
[DETECT][5/5] block Unity=(+0.054,+0.010) score=null
[RTD   ] measure: block = (+54.9, +47.8) mm
[RTD   ] measure: box   = (-220.1, +191.4) mm  score=0.6553799510002136
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_123031.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.22px（上限 15.0px・やり直し 1 回）
[RTD   ] [WARN] 検出したブロックがアームの根元から 72.8mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+54.9, +47.8) mm（WARN のみ・保存します）
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_123031.jpg
[RTD   ] ブロックのばらつき: 113.0px = 54.85mm（5 枚・上限 4.0mm）
[RTD   ] [WARN] 検出が不安定です: ブロックのばらつきが 113.0px = 54.85mm（上限 4.0mm）。（WARN のみ・保存します）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_123031.jpg
[RTD   ] 元の検出と測り直しの差: 0.00mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_123031.json
[RTD   ] [WARN] この measure には WARN が 2 件あります: block_too_close_to_base, block_spread_over
[RTD   ] [WARN] 値が外れている可能性があります。気になるなら取り直してください（保存はしてあります）
[RTD   ] 次は Pi で教示 → daemon 起動 → recorder.py --top --no-side 常駐 → run --teach <file> --execute
[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_20261109_123000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_n_pens_2/drag_v2_20261109_123000.json
[RTD   ] 入力ファイル: drag_v2_20261109_123000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=146 (start=146 end=194, gap=25.14°)
                    angles = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
  PICK           <- gripper close mark idx=214（PICK phase 範囲内）
                    angles = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
  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（全 146 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 19.78°（しきい値 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      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 66.53°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 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    = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 66.52°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [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 区間）, 想定所要時間 ≈ 30.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 13.7s（max|Δ| 合計 274.4° @ 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_123031.json
[RTD   ]   measured_at = 2026-11-09T12:30:33.117494  block = (+54.9, +47.8) mm  box = (-220.1, +191.4) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+54.9, +47.8) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_123035.jpg
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_123035.jpg
[RTD   ] [WARN] 検出したブロックがアームの根元から 72.8mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+54.9, +47.8) mm（**止めません**・WARN のみ）
[RTD   ] ブロック位置の照合 OK（画素の差 0.0px <= 許容 10.3px = 5.0mm / mm 換算の差 0.00mm）
[RTD   ] マット四隅のずれ 最大 0.0px（上限 15.0px・やり直し 1 回）
[RTD   ] ドライランなので、ここで終了します（アームには何も送っていません）
[RTD   ] Pi 版と比べる点: 抽出ウェイポイント 4 姿勢と各区間の max|Δ| は同じ。送り方は単発（Pi 版は 0.1s 補間ストリーミング）なので n_steps / ticks は比較対象外。送信 8 回 / 想定所要 ≈ 30.7s
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure
[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   ] measure: 上カメラで検出します（repeat=5 interval=0.3s）
[CAM] 接続中カメラ一覧:
  index=0  name=FaceTime HDカメラ
  index=1  name=Iriun Camera
  index=2  name=‎iPhone14 Pro MAXのカメラ
[CAM] 上カメラ(iPhone)  index=2
[CAM] 横カメラ(Iriun)   index=1
[DETECT] resolved top index: 2
[Mac] マット四隅検出中... (10フレーム)
[Mac] ✓ マット四隅検出: 10/10 フレーム成功
[Mac] ✓ 動的homography計算完了
[Mac] ✓ マット範囲: X=[302, 1703] Y=[0, 949]
[06f] TEMPLATES_DIR overridden to: /Users/shimazueiichi/r2r2r-scripts/dynamic_tracking_limits/place/templates
[06f] ROTATION_ANGLES_DEG overridden to: [0, 15, 30, 45, 60, 75]
[06f] SCALES overridden to: [0.85, 1.0, 1.15]
[テンプレ] loading white box templates from: /Users/shimazueiichi/r2r2r-scripts/dynamic_tracking_limits/place/templates
[テンプレ] glob '/Users/shimazueiichi/r2r2r-scripts/dynamic_tracking_limits/place/templates/*.png' → 8 file(s)
[テンプレ]   - white_box_20260520_163829_004.png
[テンプレ]   - white_box_20260520_163838_005.png
[テンプレ]   - white_box_20260520_163846_006.png
[テンプレ]   - white_box_20260520_163905_009.png
[テンプレ]   - white_box_20260520_163912_010.png
[テンプレ]   - white_box_20260520_163918_011.png
[テンプレ]   - white_box_20260520_163923_012.png
[テンプレ]   - white_box_20260520_163929_013.png
[テンプレ] 計 8 枚 (day165=8, auto=0)
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,572) source=template_fallback score=0.655 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 6.32s)
[DETECT][1/5] box Unity=(-0.220,+0.191) score=0.6553415656089783
  赤ブロック pixel=(880, 282) → Unity=(0.0549, 0.0483)
[DETECT][1/5] block Unity=(+0.055,+0.048) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,572) source=template_fallback score=0.656 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.43s)
[DETECT][2/5] box Unity=(-0.220,+0.191) score=0.6555894017219543
  赤ブロック pixel=(880, 282) → Unity=(0.0549, 0.0483)
[DETECT][2/5] block Unity=(+0.055,+0.048) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,572) source=template_fallback score=0.656 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.61s)
[DETECT][3/5] box Unity=(-0.220,+0.191) score=0.6555450558662415
  赤ブロック pixel=(880, 226) → Unity=(0.0545, 0.0212)
[DETECT][3/5] block Unity=(+0.054,+0.021) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,571) source=template_fallback score=0.655 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.28s)
[DETECT][4/5] box Unity=(-0.220,+0.191) score=0.6551064252853394
  赤ブロック pixel=(880, 281) → Unity=(0.0549, 0.0478)
[DETECT][4/5] block Unity=(+0.055,+0.048) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,572) source=template_fallback score=0.655 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.32s)
[DETECT][5/5] box Unity=(-0.220,+0.191) score=0.6553043127059937
  赤ブロック pixel=(880, 281) → Unity=(0.0549, 0.0478)
[DETECT][5/5] block Unity=(+0.055,+0.048) score=null
[RTD   ] measure: block = (+54.9, +47.8) mm
[RTD   ] measure: box   = (-220.1, +191.4) mm  score=0.6553415656089783
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_123220.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.1px（上限 15.0px・やり直し 1 回）
[RTD   ] [WARN] 検出したブロックがアームの根元から 72.8mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+54.9, +47.8) mm（WARN のみ・保存します）
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_123220.jpg
[RTD   ] ブロックのばらつき: 1.0px = 0.48mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.00mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_123220.json
[RTD   ] [WARN] この measure には WARN が 1 件あります: block_too_close_to_base
[RTD   ] [WARN] 値が外れている可能性があります。気になるなら取り直してください（保存はしてあります）
[RTD   ] 次は Pi で教示 → daemon 起動 → recorder.py --top --no-side 常駐 → run --teach <file> --execute
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure
[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   ] measure: 上カメラで検出します（repeat=5 interval=0.3s）
[CAM] 接続中カメラ一覧:
  index=0  name=FaceTime HDカメラ
  index=1  name=Iriun Camera
  index=2  name=‎iPhone14 Pro MAXのカメラ
[CAM] 上カメラ(iPhone)  index=2
[CAM] 横カメラ(Iriun)   index=1
[DETECT] resolved top index: 2
[Mac] マット四隅検出中... (10フレーム)
[Mac] ✓ マット四隅検出: 10/10 フレーム成功
[Mac] ✓ 動的homography計算完了
[Mac] ✓ マット範囲: X=[302, 1702] Y=[0, 949]
[06f] TEMPLATES_DIR overridden to: /Users/shimazueiichi/r2r2r-scripts/dynamic_tracking_limits/place/templates
[06f] ROTATION_ANGLES_DEG overridden to: [0, 15, 30, 45, 60, 75]
[06f] SCALES overridden to: [0.85, 1.0, 1.15]
[テンプレ] loading white box templates from: /Users/shimazueiichi/r2r2r-scripts/dynamic_tracking_limits/place/templates
[テンプレ] glob '/Users/shimazueiichi/r2r2r-scripts/dynamic_tracking_limits/place/templates/*.png' → 8 file(s)
[テンプレ]   - white_box_20260520_163829_004.png
[テンプレ]   - white_box_20260520_163838_005.png
[テンプレ]   - white_box_20260520_163846_006.png
[テンプレ]   - white_box_20260520_163905_009.png
[テンプレ]   - white_box_20260520_163912_010.png
[テンプレ]   - white_box_20260520_163918_011.png
[テンプレ]   - white_box_20260520_163923_012.png
[テンプレ]   - white_box_20260520_163929_013.png
[テンプレ] 計 8 枚 (day165=8, auto=0)
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,571) source=template_fallback score=0.655 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.34s)
[DETECT][1/5] box Unity=(-0.220,+0.191) score=0.6553701758384705
  赤ブロック pixel=(880, 280) → Unity=(0.0548, 0.0473)
[DETECT][1/5] block Unity=(+0.055,+0.047) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,571) source=template_fallback score=0.656 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.47s)
[DETECT][2/5] box Unity=(-0.220,+0.191) score=0.6557032465934753
  赤ブロック pixel=(880, 280) → Unity=(0.0548, 0.0473)
[DETECT][2/5] block Unity=(+0.055,+0.047) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,571) source=template_fallback score=0.656 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.45s)
[DETECT][3/5] box Unity=(-0.220,+0.191) score=0.655527651309967
  赤ブロック pixel=(880, 280) → Unity=(0.0548, 0.0473)
[DETECT][3/5] block Unity=(+0.055,+0.047) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,571) source=template_fallback score=0.656 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.92s)
[DETECT][4/5] box Unity=(-0.220,+0.191) score=0.6557596921920776
  赤ブロック pixel=(880, 280) → Unity=(0.0548, 0.0473)
[DETECT][4/5] block Unity=(+0.055,+0.047) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1495,571) source=template_fallback score=0.655 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.51s)
[DETECT][5/5] box Unity=(-0.220,+0.191) score=0.6554656624794006
  赤ブロック pixel=(880, 280) → Unity=(0.0548, 0.0473)
[DETECT][5/5] block Unity=(+0.055,+0.047) score=null
[RTD   ] measure: block = (+54.8, +47.3) mm
[RTD   ] measure: box   = (-220.3, +190.8) mm  score=0.655527651309967
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_123559.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 1.41px（上限 15.0px・やり直し 1 回）
[RTD   ] [WARN] 検出したブロックがアームの根元から 72.4mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+54.8, +47.3) mm（WARN のみ・保存します）
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_123559.jpg
[RTD   ] ブロックのばらつき: 1.0px = 0.45mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.00mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_123559.json
[RTD   ] [WARN] この measure には WARN が 1 件あります: block_too_close_to_base
[RTD   ] [WARN] 値が外れている可能性があります。気になるなら取り直してください（保存はしてあります）
[RTD   ] 次は Pi で教示 → daemon 起動 → recorder.py --top --no-side 常駐 → run --teach <file> --execute
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_123000.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_123000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_bvnahdtr/drag_v2_20261109_123000.json
[RTD   ] 入力ファイル: drag_v2_20261109_123000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=146 (start=146 end=194, gap=25.14°)
                    angles = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
  PICK           <- gripper close mark idx=214（PICK phase 範囲内）
                    angles = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
  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（全 146 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 19.78°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.26,   +1.66,   +2.10,   -0.26,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.26,   +1.66,   +2.10,   -0.26,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 2.10°  (settle 3.0s)
  [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      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 66.53°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 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    = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 66.52°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [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 区間）, 想定所要時間 ≈ 30.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 13.7s（max|Δ| 合計 274.4° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+54.8, +47.7) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_123651.jpg
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_123651.jpg
[RTD   ] [WARN] 検出したブロックがアームの根元から 72.7mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+54.8, +47.7) mm（**止めません**・WARN のみ）
[RTD   ] ブロック位置の照合 OK（画素の差 1.0px <= 許容 10.3px = 5.0mm / mm 換算の差 0.48mm）
[RTD   ] マット四隅のずれ 最大 1.3px（上限 15.0px・やり直し 1 回）
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123655
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123655/teach/drag_v2_20261109_123000.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123655/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 2.10° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=2.10° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.004s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.028s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.06° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=0.88° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.009s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.041s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.02° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.55° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.055s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.02° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.015s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.55° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.028s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.37° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 55/55 回, 実効 1.58 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.58 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.034s / p50 1.030s / 最大 1.055s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.055s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.22s / 最大 4.62s
[RECORD] 電流の記録終了 71 行 (2.04 行/秒. 本体が眠っている間だけ読む. 爪の間 14.043 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123655/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123655/run_0001_20261109_123655.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_123655 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_123000.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_123000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_4s9566yb/drag_v2_20261109_123000.json
[RTD   ] 入力ファイル: drag_v2_20261109_123000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=146 (start=146 end=194, gap=25.14°)
                    angles = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
  PICK           <- gripper close mark idx=214（PICK phase 範囲内）
                    angles = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
  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（全 146 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 19.78°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.93,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.93,   +0.08,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.93°  (settle 3.0s)
  [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      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 66.53°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 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    = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 66.52°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [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 区間）, 想定所要時間 ≈ 30.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 13.7s（max|Δ| 合計 274.4° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+140.0, +221.3) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_123753.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 409.7px（≒193.7mm）動いています（許容 10.3px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 409.7px（許容 10.3px = 5.0mm）/ mm 換算の差 193.73mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123756
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123756/teach/drag_v2_20261109_123000.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123756/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.93° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.93° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.015s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.94° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.035s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=0.88° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.012s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.02° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.055s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.64° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.76° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.08° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.004s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.64° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.059s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 54/54 回, 実効 1.57 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.57 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.039s / p50 1.032s / 最大 1.059s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.059s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.18s / 最大 4.42s
[RECORD] 電流の記録終了 69 行 (2.0 行/秒. 本体が眠っている間だけ読む. 爪の間 14.044 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123756/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123756/run_0001_20261109_123756.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_123756 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_123000.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_123000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_xv19h0b5/drag_v2_20261109_123000.json
[RTD   ] 入力ファイル: drag_v2_20261109_123000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=146 (start=146 end=194, gap=25.14°)
                    angles = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
  PICK           <- gripper close mark idx=214（PICK phase 範囲内）
                    angles = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
  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（全 146 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 19.78°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.26,   +1.49,   +1.93,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.26,   +1.49,   +1.93,   +0.08,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.93°  (settle 3.0s)
  [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      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 66.53°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 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    = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 66.52°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [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 区間）, 想定所要時間 ≈ 30.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 13.7s（max|Δ| 合計 274.4° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+136.9, +226.1) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_123843.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 415.5px（≒196.8mm）動いています（許容 10.3px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 415.5px（許容 10.3px = 5.0mm）/ mm 換算の差 196.76mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123848
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123848/teach/drag_v2_20261109_123000.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123848/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.93° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.93° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.016s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.033s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.06° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.040s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.23° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.014s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.02° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.64° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.20° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.08° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.72° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 56/56 回, 実効 1.60 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.60 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.032s / p50 1.031s / 最大 1.040s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.040s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.26s / 最大 4.61s
[RECORD] 電流の記録終了 73 行 (2.08 行/秒. 本体が眠っている間だけ読む. 爪の間 14.062 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123848/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123848/run_0001_20261109_123848.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_123848 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_123000.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_123000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_mqlncefe/drag_v2_20261109_123000.json
[RTD   ] 入力ファイル: drag_v2_20261109_123000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=146 (start=146 end=194, gap=25.14°)
                    angles = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
  PICK           <- gripper close mark idx=214（PICK phase 範囲内）
                    angles = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
  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（全 146 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 19.78°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.93,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.93,   +0.08,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.93°  (settle 3.0s)
  [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      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 66.53°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 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    = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 66.52°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [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 区間）, 想定所要時間 ≈ 30.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 13.7s（max|Δ| 合計 274.4° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+137.1, +235.5) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_123937.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 433.7px（≒205.5mm）動いています（許容 10.3px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 433.7px（許容 10.3px = 5.0mm）/ mm 換算の差 205.46mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123940
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123940/teach/drag_v2_20261109_123000.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123940/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.93° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.93° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.049s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.94° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=0.88° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.002s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.041s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.02° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.64° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.056s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.02° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.08° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.014s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.90° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 56/56 回, 実効 1.60 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.60 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.038s / p50 1.032s / 最大 1.056s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.056s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.26s / 最大 4.41s
[RECORD] 電流の記録終了 73 行 (2.08 行/秒. 本体が眠っている間だけ読む. 爪の間 14.048 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123940/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_123940/run_0001_20261109_123940.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_123940 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_123000.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_123000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_buxu9ak6/drag_v2_20261109_123000.json
[RTD   ] 入力ファイル: drag_v2_20261109_123000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=146 (start=146 end=194, gap=25.14°)
                    angles = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
  PICK           <- gripper close mark idx=214（PICK phase 範囲内）
                    angles = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
  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（全 146 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 19.78°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.93,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.93,   +0.08,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.93°  (settle 3.0s)
  [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      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 66.53°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 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    = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 66.52°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [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 区間）, 想定所要時間 ≈ 30.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 13.7s（max|Δ| 合計 274.4° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+134.4, +234.6) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_124029.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 429.4px（≒203.6mm）動いています（許容 10.3px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 429.4px（許容 10.3px = 5.0mm）/ mm 換算の差 203.58mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124032
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124032/teach/drag_v2_20261109_123000.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124032/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.93° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.93° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.004s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.028s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.32° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=0.88° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.012s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.02° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.042s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.64° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.11° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.08° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.012s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.021s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.72° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.040s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 54/54 回, 実効 1.57 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.57 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.032s / p50 1.031s / 最大 1.042s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.042s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.18s / 最大 4.46s
[RECORD] 電流の記録終了 69 行 (2.0 行/秒. 本体が眠っている間だけ読む. 爪の間 14.04 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124032/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124032/run_0001_20261109_124032.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_124032 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_123000.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_123000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_htztmv7s/drag_v2_20261109_123000.json
[RTD   ] 入力ファイル: drag_v2_20261109_123000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=146 (start=146 end=194, gap=25.14°)
                    angles = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
  PICK           <- gripper close mark idx=214（PICK phase 範囲内）
                    angles = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
  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（全 146 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 19.78°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.84,   +0.00,   -0.61,  -30.32]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.84,   +0.00,   -0.61,  -30.32]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.84°  (settle 3.0s)
  [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      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 66.53°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 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    = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 66.52°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [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 区間）, 想定所要時間 ≈ 30.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 13.7s（max|Δ| 合計 274.4° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+133.4, +226.6) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_124113.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 413.1px（≒195.8mm）動いています（許容 10.3px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 413.1px（許容 10.3px = 5.0mm）/ mm 換算の差 195.80mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124117
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124117/teach/drag_v2_20261109_123000.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124117/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.84° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.84° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.94° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.05° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.013s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.02° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.057s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.64° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.29° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.004s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.81° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.050s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 53/53 回, 実効 1.55 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.55 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.038s / p50 1.032s / 最大 1.057s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.057s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.14s / 最大 4.41s
[RECORD] 電流の記録終了 67 行 (1.96 行/秒. 本体が眠っている間だけ読む. 爪の間 14.055 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124117/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124117/run_0001_20261109_124117.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_124117 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_123000.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_123000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_l6l42858/drag_v2_20261109_123000.json
[RTD   ] 入力ファイル: drag_v2_20261109_123000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=146 (start=146 end=194, gap=25.14°)
                    angles = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
  PICK           <- gripper close mark idx=214（PICK phase 範囲内）
                    angles = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
  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（全 146 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 19.78°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.93,   +0.08,   -0.35,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.93,   +0.08,   -0.35,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.93°  (settle 3.0s)
  [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      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 66.53°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 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    = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 66.52°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [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 区間）, 想定所要時間 ≈ 30.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 13.7s（max|Δ| 合計 274.4° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+134.3, +227.0) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_124203.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 414.8px（≒196.6mm）動いています（許容 10.3px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 414.8px（許容 10.3px = 5.0mm）/ mm 換算の差 196.58mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124207
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124207/teach/drag_v2_20261109_123000.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124207/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.93° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.93° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.004s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.040s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.85° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.033s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=0.88° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.013s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.02° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.55° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.02° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.08° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.46° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.040s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.28° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 54/54 回, 実効 1.57 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.57 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.034s / p50 1.032s / 最大 1.040s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.040s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.17s / 最大 4.42s
[RECORD] 電流の記録終了 69 行 (2.01 行/秒. 本体が眠っている間だけ読む. 爪の間 14.044 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124207/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124207/run_0001_20261109_124207.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_124207 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_123000.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_123000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_b4kxq_6u/drag_v2_20261109_123000.json
[RTD   ] 入力ファイル: drag_v2_20261109_123000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=146 (start=146 end=194, gap=25.14°)
                    angles = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
  PICK           <- gripper close mark idx=214（PICK phase 範囲内）
                    angles = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
  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（全 146 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 19.78°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.93,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.93,   +0.08,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.93°  (settle 3.0s)
  [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      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 66.53°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 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    = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 66.52°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [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 区間）, 想定所要時間 ≈ 30.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 13.7s（max|Δ| 合計 274.4° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+128.7, +232.8) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_124253.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 420.6px（≒199.7mm）動いています（許容 10.3px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 420.6px（許容 10.3px = 5.0mm）/ mm 換算の差 199.71mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124256
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124256/teach/drag_v2_20261109_123000.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124256/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.93° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.93° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.016s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.14° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.055s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=0.88° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.013s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.02° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.048s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.55° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.022s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.93° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.08° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.028s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.81° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 55/55 回, 実効 1.58 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.58 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.036s / p50 1.032s / 最大 1.055s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.055s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.22s / 最大 4.60s
[RECORD] 電流の記録終了 71 行 (2.04 行/秒. 本体が眠っている間だけ読む. 爪の間 14.06 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124256/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124256/run_0001_20261109_124256.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_124256 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_123000.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_123000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_7bjpxg62/drag_v2_20261109_123000.json
[RTD   ] 入力ファイル: drag_v2_20261109_123000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=146 (start=146 end=194, gap=25.14°)
                    angles = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
  PICK           <- gripper close mark idx=214（PICK phase 範囲内）
                    angles = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
  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（全 146 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 19.78°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.84,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.84,   +0.08,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.84°  (settle 3.0s)
  [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      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 66.53°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 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    = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 66.52°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [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 区間）, 想定所要時間 ≈ 30.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 13.7s（max|Δ| 合計 274.4° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+55.3, +46.8) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_124435.jpg
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_124435.jpg
[RTD   ] [WARN] 検出したブロックがアームの根元から 72.4mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+55.3, +46.8) mm（**止めません**・WARN のみ）
[RTD   ] ブロック位置の照合 OK（画素の差 1.4px <= 許容 10.3px = 5.0mm / mm 換算の差 0.66mm）
[RTD   ] マット四隅のずれ 最大 0.7px（上限 15.0px・やり直し 1 回）
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124438
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124438/teach/drag_v2_20261109_123000.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124438/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.84° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.84° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.012s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.23° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.039s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=0.88° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.011s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.02° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.64° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.02° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.012s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.72° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.037s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 54/54 回, 実効 1.51 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.51 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.032s / p50 1.031s / 最大 1.039s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.039s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.34s / 最大 4.47s
[RECORD] 電流の記録終了 69 行 (1.93 行/秒. 本体が眠っている間だけ読む. 爪の間 14.055 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124438/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124438/run_0001_20261109_124438.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_124438 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_123000.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_123000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_gl8upm_g/drag_v2_20261109_123000.json
[RTD   ] 入力ファイル: drag_v2_20261109_123000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=146 (start=146 end=194, gap=25.14°)
                    angles = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
  PICK           <- gripper close mark idx=214（PICK phase 範囲内）
                    angles = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
  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（全 146 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 19.78°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.84,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.84,   +0.08,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.84°  (settle 3.0s)
  [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      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 66.53°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 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    = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 66.52°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [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 区間）, 想定所要時間 ≈ 30.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 13.7s（max|Δ| 合計 274.4° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+142.1, +212.7) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_124527.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 396.1px（≒187.0mm）動いています（許容 10.3px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 396.1px（許容 10.3px = 5.0mm）/ mm 換算の差 187.04mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124530
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124530/teach/drag_v2_20261109_123000.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124530/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.84° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.84° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.052s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.32° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.72° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.013s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] [WARN] arrival timeout (PICK → APPROACH_PICK (lift), max|Δ|=41.75° > tol 3.0°, 8.0s)
[RTD   ] [WARN] 到達確認タイムアウト（max|Δ|=41.75° > tol 3.0°）ですが pre→last max|Δ| 44.30° >= 1.0°（動いているので再送しない）。**止めずに次の区間へ進みます**
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] [WARN] arrival timeout (APPROACH_PICK → APPROACH_PLACE, max|Δ|=36.48° > tol 3.0°, 12.0s)
[RTD   ] [WARN] 到達確認タイムアウト（max|Δ|=36.48° > tol 3.0°）ですが pre→last max|Δ| 67.13° >= 1.0°（動いているので再送しない）。**止めずに次の区間へ進みます**
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.051s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.90° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 1.76° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.37° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.041s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 131/131 回, 実効 2.19 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（2.19 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.038s / p50 1.031s / 最大 1.052s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.052s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 5.32s / 最大 13.32s
[RECORD] 電流の記録終了 227 行 (3.79 行/秒. 本体が眠っている間だけ読む. 爪の間 14.057 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124530/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > n
[RTD   ] 箱に入ったか (y/n) > n
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124530/run_0001_20261109_124530.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=no place=no recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_124530 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/align_ref
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/align_ref/run_0001_20261109_124117/frames/000000.jpg
[REF   ] お手本 run_0001_20261109_124117 (つかんだ瞬間が不明)  ← --episode 未指定なので最初のエピソード
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  +0.9  dx=  -0.8  response=0.671  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -0.8  dx=  -0.1  response=0.705  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +0.7  dx=  -0.9  response=0.673  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE  ] 終了 (何も書いていません)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_123000.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_123000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_8ws6r9vs/drag_v2_20261109_123000.json
[RTD   ] 入力ファイル: drag_v2_20261109_123000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=146 (start=146 end=194, gap=25.14°)
                    angles = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
  PICK           <- gripper close mark idx=214（PICK phase 範囲内）
                    angles = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
  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（全 146 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 19.78°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.84,   -0.26,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.84,   -0.26,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.84°  (settle 3.0s)
  [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      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 66.53°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 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    = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 66.52°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [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 区間）, 想定所要時間 ≈ 30.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 13.7s（max|Δ| 合計 274.4° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+141.0, +229.3) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_124812.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 425.8px（≒201.4mm）動いています（許容 10.3px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 425.8px（許容 10.3px = 5.0mm）/ mm 換算の差 201.41mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124817
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124817/teach/drag_v2_20261109_123000.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124817/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.84° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.84° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.013s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.14° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.14° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.012s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.02° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.054s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.64° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.040s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.37° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.08° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.004s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.039s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.55° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.051s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.37° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 56/56 回, 実効 1.59 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.59 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.040s / p50 1.039s / 最大 1.054s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.054s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.27s / 最大 4.61s
[RECORD] 電流の記録終了 73 行 (2.07 行/秒. 本体が眠っている間だけ読む. 爪の間 14.046 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124817/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124817/run_0001_20261109_124817.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_124817 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/align_ref
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/align_ref/run_0001_20261109_124117/frames/000000.jpg
[REF   ] お手本 run_0001_20261109_124117 (つかんだ瞬間が不明)  ← --episode 未指定なので最初のエピソード
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  +0.8  dx=  -0.7  response=0.679  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE  ] 終了 (何も書いていません)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_123000.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_123000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_wcevrdkg/drag_v2_20261109_123000.json
[RTD   ] 入力ファイル: drag_v2_20261109_123000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=146 (start=146 end=194, gap=25.14°)
                    angles = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
  PICK           <- gripper close mark idx=214（PICK phase 範囲内）
                    angles = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
  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（全 146 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 19.78°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.93,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.93,   +0.08,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.93°  (settle 3.0s)
  [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      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 66.53°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 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    = [ -25.48,  +68.20,   +8.43,   -1.58,  -66.53,  -30.14]
            to      = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            max |Δ| = 25.14°  1 回送信 speed=20  (~ 1.3s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -25.48,  +43.06,   +8.52,   -1.58,  -66.53,  -30.14]
            to      = [ +41.04,  +42.36,   +1.66,   +2.54,  -49.39,  -31.90]
            max |Δ| = 66.52°  1 回送信 speed=20  (~ 3.3s @ 20°/s 目安・到達待ち 最大 12.0s)
  [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 区間）, 想定所要時間 ≈ 30.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 13.7s（max|Δ| 合計 274.4° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+55.2, +45.3) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_124917.jpg
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_124917.jpg
[RTD   ] [WARN] 検出したブロックがアームの根元から 71.4mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+55.2, +45.3) mm（**止めません**・WARN のみ）
[RTD   ] ブロック位置の照合 OK（画素の差 4.1px <= 許容 10.3px = 5.0mm / mm 換算の差 1.98mm）
[RTD   ] マット四隅のずれ 最大 1.0px（上限 15.0px・やり直し 1 回）
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124920
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124920/teach/drag_v2_20261109_123000.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124920/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.93° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.93° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.004s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.048s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.23° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.23° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.012s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.02° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 12.0s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.64° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.037s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.29° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.08° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.015s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.041s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.72° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.4s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 54/54 回, 実効 1.56 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.56 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.035s / p50 1.031s / 最大 1.048s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.048s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.19s / 最大 4.54s
[RECORD] 電流の記録終了 69 行 (1.99 行/秒. 本体が眠っている間だけ読む. 爪の間 14.052 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124920/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_124920/run_0001_20261109_124920.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_124920 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 193825
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_193825/frames/000000.jpg
[REF   ] お手本 run_0001_20261019_193825 (つかんだ瞬間の j0 = -61.5°)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  +3.2  dx=  -3.5  response=0.859  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +1.8  dx=  +6.2  response=0.927  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +0.7  dx=  +3.6  response=0.946  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +2.2  dx=  -3.6  response=0.895  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +3.8  dx=  -3.9  response=0.888  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +5.0  dx=  -3.4  response=0.894  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +3.9  dx=  -3.2  response=0.885  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +1.7  dx=  -2.0  response=0.930  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +0.7  dx=  -4.4  response=0.929  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +1.7  dx=  -7.4  response=0.892  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +0.4  dx=  -3.8  response=0.892  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +2.7  dx=  -4.2  response=0.898  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +3.9  dx=  -3.5  response=0.877  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +2.2  dx=  -2.3  response=0.912  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +0.2  dx=  -0.1  response=0.912  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -1.0  dx=  -1.1  response=0.935  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE  ] 終了 (何も書いていません)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_232345.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20221013_232345.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo__zfoteg1/drag_v2_20221013_232345.json
[RTD   ] 入力ファイル: drag_v2_20221013_232345.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=123 (start=123 end=197, gap=18.89°)
                    angles = [ -59.94,  +54.31,  +22.67,   +1.49,  -78.04,  -32.34]
  PICK           <- gripper close mark idx=223（PICK phase 範囲内）
                    angles = [ -62.05,  +61.69,  +13.71,   +0.87,  -59.15,  -32.34]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=304 (start=304 end=352, gap=18.81°)
                    angles = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
  PLACE          <- gripper open mark idx=367（PLACE phase 範囲内）
                    angles = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 165 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 11.96°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +1.84,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.84,   +0.08,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.84°  (settle 3.0s)
  [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      = [ -59.94,  +54.31,  +22.67,   +1.49,  -78.04,  -32.34]
            max |Δ| = 78.04°  1 回送信 speed=20  (~ 3.9s @ 20°/s 目安・到達待ち 最大 13.7s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -59.94,  +54.31,  +22.67,   +1.49,  -78.04,  -32.34]
            to      = [ -62.05,  +61.69,  +13.71,   +0.87,  -59.15,  -32.34]
            max |Δ| = 18.89°  1 回送信 speed=20  (~ 0.9s @ 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    = [ -62.05,  +61.69,  +13.71,   +0.87,  -59.15,  -32.34]
            to      = [ -59.94,  +54.31,  +22.67,   +1.49,  -78.04,  -32.34]
            max |Δ| = 18.89°  1 回送信 speed=20  (~ 0.9s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -59.94,  +54.31,  +22.67,   +1.49,  -78.04,  -32.34]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 102.91°  1 回送信 speed=20  (~ 5.1s @ 20°/s 目安・到達待ち 最大 17.4s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 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    = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 54.58°  1 回送信 speed=20  (~ 2.7s @ 20°/s 目安・到達待ち 最大 10.2s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 32.5s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 15.5s（max|Δ| 合計 310.9° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.5px ずれています（1 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.5px ずれています（2 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.5px ずれています（3 回目 / 上限 15.0px）。やり直しの上限に達しました
[RTD   ] 再生直前: block = (+237.4, +106.4) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_125202.jpg
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_125202_rejected.json
[RTD   ] [WARN] マット四隅が measure 時から最大 16.5px ずれています（上限 15.0px・最大 3 回やり直しても収まらず）。カメラが動いた可能性があるので止めます。measure を取り直してください（各隅のずれ: 4.0, 10.0, 14.8, 16.5）（**止めません**・WARN のみ）
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_125209
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_125209/teach/drag_v2_20221013_232345.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_125209/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.84° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.84° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.014s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 13.7s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.14° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.90° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.44° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.012s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.028s）
[RTD   ] [WARN] arrival timeout (PICK → APPROACH_PICK (lift), max|Δ|=10.72° > tol 3.0°, 8.0s)
[RTD   ] [WARN] 到達確認タイムアウト（max|Δ|=10.72° > tol 3.0°）ですが pre→last max|Δ| 8.97° >= 1.0°（動いているので再送しない）。**止めずに次の区間へ進みます**
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 17.4s)
[RTD   ] 送信 OK（daemon 往復 1.039s）
[RTD   ] [WARN] arrival timeout (APPROACH_PICK → APPROACH_PLACE, max|Δ|=7.39° > tol 3.0°, 17.5s)
[RTD   ] [WARN] 到達確認タイムアウト（max|Δ|=7.39° > tol 3.0°）ですが pre→last max|Δ| 103.35° >= 1.0°（動いているので再送しない）。**止めずに次の区間へ進みます**
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.034s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.41° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.016s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.028s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.11° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 10.2s)
[RTD   ] 送信 OK（daemon 往復 1.034s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 150/150 回, 実効 2.27 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（2.27 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.032s / p50 1.030s / 最大 1.039s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.039s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 6.14s / 最大 18.83s
[RECORD] 電流の記録終了 265 行 (4.0 行/秒. 本体が眠っている間だけ読む. 爪の間 14.065 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_125209/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > n
[RTD   ] 箱に入ったか (y/n) > n
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_125209/run_0001_20261109_125209.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=no place=no recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_125209 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 193825
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_193825/frames/000000.jpg
[REF   ] お手本 run_0001_20261019_193825 (つかんだ瞬間の j0 = -61.5°)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  -1.2  dx=  -1.6  response=0.836  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE  ] 終了 (何も書いていません)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % scp -i ~/.ssh/id_rsa_pi /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/drag_v2_20261109_130000.json ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/
python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_130000.json
drag_v2_20261109_130000.json                                                   100%   38KB   2.2MB/s   00:00    
[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_20261109_130000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_jlsxds3m/drag_v2_20261109_130000.json
[RTD   ] 入力ファイル: drag_v2_20261109_130000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=123 (start=123 end=197, gap=20.00°)
                    angles = [ -62.05,  +41.69,  +13.71,   +0.87,  -59.15,  -32.34]
  PICK           <- gripper close mark idx=223（PICK phase 範囲内）
                    angles = [ -62.05,  +61.69,  +13.71,   +0.87,  -59.15,  -32.34]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=304 (start=304 end=352, gap=18.81°)
                    angles = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
  PLACE          <- gripper open mark idx=367（PLACE phase 範囲内）
                    angles = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 158 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 26.99°（しきい値 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      = [ -62.05,  +41.69,  +13.71,   +0.87,  -59.15,  -32.34]
            max |Δ| = 62.05°  1 回送信 speed=20  (~ 3.1s @ 20°/s 目安・到達待ち 最大 11.3s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -62.05,  +41.69,  +13.71,   +0.87,  -59.15,  -32.34]
            to      = [ -62.05,  +61.69,  +13.71,   +0.87,  -59.15,  -32.34]
            max |Δ| = 20.00°  1 回送信 speed=20  (~ 1.0s @ 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    = [ -62.05,  +61.69,  +13.71,   +0.87,  -59.15,  -32.34]
            to      = [ -62.05,  +41.69,  +13.71,   +0.87,  -59.15,  -32.34]
            max |Δ| = 20.00°  1 回送信 speed=20  (~ 1.0s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -62.05,  +41.69,  +13.71,   +0.87,  -59.15,  -32.34]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 105.02°  1 回送信 speed=20  (~ 5.3s @ 20°/s 目安・到達待ち 最大 17.8s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 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    = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 54.58°  1 回送信 speed=20  (~ 2.7s @ 20°/s 目安・到達待ち 最大 10.2s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 32.0s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 15.0s（max|Δ| 合計 299.3° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.5px ずれています（1 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.7px ずれています（2 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.6px ずれています（3 回目 / 上限 15.0px）。やり直しの上限に達しました
[RTD   ] 再生直前: block = (+235.6, +100.7) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_125530.jpg
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_125530_rejected.json
[RTD   ] [WARN] マット四隅が measure 時から最大 16.6px ずれています（上限 15.0px・最大 3 回やり直しても収まらず）。カメラが動いた可能性があるので止めます。measure を取り直してください（各隅のずれ: 4.0, 10.0, 16.6, 16.5）（**止めません**・WARN のみ）
[RTD   ] ドライランなので、ここで終了します（アームには何も送っていません）
[RTD   ] Pi 版と比べる点: 抽出ウェイポイント 4 姿勢と各区間の max|Δ| は同じ。送り方は単発（Pi 版は 0.1s 補間ストリーミング）なので n_steps / ticks は比較対象外。送信 8 回 / 想定所要 ≈ 32.0s
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_232345.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20221013_232345.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_solcgfb7/drag_v2_20221013_232345.json
[RTD   ] 入力ファイル: drag_v2_20221013_232345.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=123 (start=123 end=197, gap=18.89°)
                    angles = [ -59.94,  +54.31,  +22.67,   +1.49,  -78.04,  -32.34]
  PICK           <- gripper close mark idx=223（PICK phase 範囲内）
                    angles = [ -62.05,  +61.69,  +13.71,   +0.87,  -59.15,  -32.34]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=304 (start=304 end=352, gap=18.81°)
                    angles = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
  PLACE          <- gripper open mark idx=367（PLACE phase 範囲内）
                    angles = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 165 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 11.96°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +2.46,   +0.26,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +2.46,   +0.26,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 2.46°  (settle 3.0s)
  [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      = [ -59.94,  +54.31,  +22.67,   +1.49,  -78.04,  -32.34]
            max |Δ| = 78.04°  1 回送信 speed=20  (~ 3.9s @ 20°/s 目安・到達待ち 最大 13.7s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -59.94,  +54.31,  +22.67,   +1.49,  -78.04,  -32.34]
            to      = [ -62.05,  +61.69,  +13.71,   +0.87,  -59.15,  -32.34]
            max |Δ| = 18.89°  1 回送信 speed=20  (~ 0.9s @ 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    = [ -62.05,  +61.69,  +13.71,   +0.87,  -59.15,  -32.34]
            to      = [ -59.94,  +54.31,  +22.67,   +1.49,  -78.04,  -32.34]
            max |Δ| = 18.89°  1 回送信 speed=20  (~ 0.9s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -59.94,  +54.31,  +22.67,   +1.49,  -78.04,  -32.34]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 102.91°  1 回送信 speed=20  (~ 5.1s @ 20°/s 目安・到達待ち 最大 17.4s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 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    = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 54.58°  1 回送信 speed=20  (~ 2.7s @ 20°/s 目安・到達待ち 最大 10.2s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 32.5s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 15.5s（max|Δ| 合計 310.9° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.5px ずれています（1 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.5px ずれています（2 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.5px ずれています（3 回目 / 上限 15.0px）。やり直しの上限に達しました
[RTD   ] 再生直前: block = (+235.6, +100.7) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_125558.jpg
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_125558_rejected.json
[RTD   ] [WARN] マット四隅が measure 時から最大 16.5px ずれています（上限 15.0px・最大 3 回やり直しても収まらず）。カメラが動いた可能性があるので止めます。measure を取り直してください（各隅のずれ: 4.0, 10.0, 15.7, 16.5）（**止めません**・WARN のみ）
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_125607
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_125607/teach/drag_v2_20221013_232345.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_125607/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 2.46° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=2.46° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.014s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 13.7s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.06° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.054s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.98° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.08° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.011s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.37° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 17.4s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] [WARN] arrival timeout (APPROACH_PICK → APPROACH_PLACE, max|Δ|=35.51° > tol 3.0°, 17.5s)
[RTD   ] [WARN] 到達確認タイムアウト（max|Δ|=35.51° > tol 3.0°）ですが pre→last max|Δ| 103.53° >= 1.0°（動いているので再送しない）。**止めずに次の区間へ進みます**
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.19° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.17° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.012s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.19° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 10.2s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.10° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 139/139 回, 実効 2.21 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（2.21 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.034s / p50 1.031s / 最大 1.054s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.054s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 5.72s / 最大 18.86s
[RECORD] 電流の記録終了 239 行 (3.8 行/秒. 本体が眠っている間だけ読む. 爪の間 14.057 秒は読まない. 見込み超え 2 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_125607/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > n
[RTD   ] 箱に入ったか (y/n) > n
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_125607/run_0001_20261109_125607.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=no place=no recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_125607 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 193825
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_193825/frames/000000.jpg
[REF   ] お手本 run_0001_20261019_193825 (つかんだ瞬間の j0 = -61.5°)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  -1.2  dx=  -1.7  response=0.432  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE  ] 終了 (何も書いていません)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_130000.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_130000.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_0c3b7wly/drag_v2_20261109_130000.json
[RTD   ] 入力ファイル: drag_v2_20261109_130000.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=123 (start=123 end=197, gap=20.00°)
                    angles = [ -62.05,  +41.69,  +13.71,   +0.87,  -59.15,  -32.34]
  PICK           <- gripper close mark idx=223（PICK phase 範囲内）
                    angles = [ -62.05,  +61.69,  +13.71,   +0.87,  -59.15,  -32.34]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=304 (start=304 end=352, gap=18.81°)
                    angles = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
  PLACE          <- gripper open mark idx=367（PLACE phase 範囲内）
                    angles = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 158 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 26.99°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.49,   +2.10,   -0.26,   -0.26,  -29.70]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +2.10,   -0.26,   -0.26,  -29.70]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 2.10°  (settle 3.0s)
  [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      = [ -62.05,  +41.69,  +13.71,   +0.87,  -59.15,  -32.34]
            max |Δ| = 62.05°  1 回送信 speed=20  (~ 3.1s @ 20°/s 目安・到達待ち 最大 11.3s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -62.05,  +41.69,  +13.71,   +0.87,  -59.15,  -32.34]
            to      = [ -62.05,  +61.69,  +13.71,   +0.87,  -59.15,  -32.34]
            max |Δ| = 20.00°  1 回送信 speed=20  (~ 1.0s @ 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    = [ -62.05,  +61.69,  +13.71,   +0.87,  -59.15,  -32.34]
            to      = [ -62.05,  +41.69,  +13.71,   +0.87,  -59.15,  -32.34]
            max |Δ| = 20.00°  1 回送信 speed=20  (~ 1.0s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -62.05,  +41.69,  +13.71,   +0.87,  -59.15,  -32.34]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 105.02°  1 回送信 speed=20  (~ 5.3s @ 20°/s 目安・到達待ち 最大 17.8s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 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    = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 54.58°  1 回送信 speed=20  (~ 2.7s @ 20°/s 目安・到達待ち 最大 10.2s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 32.0s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 15.0s（max|Δ| 合計 299.3° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.8px ずれています（1 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.5px ずれています（2 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.5px ずれています（3 回目 / 上限 15.0px）。やり直しの上限に達しました
[RTD   ] 再生直前: block = (+234.3, +104.0) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_125818.jpg
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_125818_rejected.json
[RTD   ] [WARN] マット四隅が measure 時から最大 16.5px ずれています（上限 15.0px・最大 3 回やり直しても収まらず）。カメラが動いた可能性があるので止めます。measure を取り直してください（各隅のずれ: 4.0, 10.0, 15.9, 16.5）（**止めません**・WARN のみ）
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_125825
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_125825/teach/drag_v2_20261109_130000.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_125825/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 2.10° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=2.10° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.015s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 11.3s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.94° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.98° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.013s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] [WARN] arrival timeout (PICK → APPROACH_PICK (lift), max|Δ|=23.30° > tol 3.0°, 8.0s)
[RTD   ] [WARN] 到達確認タイムアウト（max|Δ|=23.30° > tol 3.0°）ですが pre→last max|Δ| 26.28° >= 1.0°（動いているので再送しない）。**止めずに次の区間へ進みます**
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 17.8s)
[RTD   ] 送信 OK（daemon 往復 1.038s）
[RTD   ] [WARN] arrival timeout (APPROACH_PICK → APPROACH_PLACE, max|Δ|=39.20° > tol 3.0°, 17.7s)
[RTD   ] [WARN] 到達確認タイムアウト（max|Δ|=39.20° > tol 3.0°）ですが pre→last max|Δ| 104.58° >= 1.0°（動いているので再送しない）。**止めずに次の区間へ進みます**
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.81° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.26° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.012s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.040s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.19° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 10.2s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.19° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 152/152 回, 実効 2.27 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（2.27 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.033s / p50 1.031s / 最大 1.040s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.040s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 6.23s / 最大 18.83s
[RECORD] 電流の記録終了 269 行 (4.01 行/秒. 本体が眠っている間だけ読む. 爪の間 14.056 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_125825/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > n
[RTD   ] 箱に入ったか (y/n) > n
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_125825/run_0001_20261109_125825.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=no place=no recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_125825 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 193825
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_193825/frames/000000.jpg
[REF   ] お手本 run_0001_20261019_193825 (つかんだ瞬間の j0 = -61.5°)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  -1.0  dx=  -1.7  response=0.883  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE  ] 終了 (何も書いていません)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 tools/gamepad_teleop.py --execute
/opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/pkgdata.py:25: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
  from pkg_resources import resource_stream, resource_exists
objc[17606]: Class SDLApplication is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf12c8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa60890). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class SDLAppDelegate is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf1318) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa608e0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class SDLTranslatorResponder is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf1390) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa60958). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class SDLMessageBoxPresenter is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf13b8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa60980). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class SDL_cocoametalview is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf1408) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa609d0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class SDLOpenGLContext is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf1458) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa60a20). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class SDL_ShapeData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf14d0) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa60a98). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class SDL_CocoaClosure is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf1520) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa60ae8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class SDL_VideoData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf1570) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa60b38). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class SDL_WindowData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf15c0) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa60b88). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class SDLWindow is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf15e8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa60bb0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class Cocoa_WindowListener is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf1610) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa60bd8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class SDLView is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf1688) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa60c50). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class METAL_RenderData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf1700) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa60cc8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class METAL_TextureData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf1750) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa60d18). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class SDL_RumbleMotor is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf1778) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa60d40). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[17606]: Class SDL_RumbleContext is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x106cf17c8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10fa60d90). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
[記録] /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261109_130126
[実機] daemon に送ります。起動したときの姿勢: -0.43 +1.58 +2.19 -0.26 -0.26 -30.23
コントローラーを待っています（つないでいなければ、今つないでください）
[接続] PS4 Controller  GUID=03008fe54c050000cc09000000016800  軸=6  ボタン=16
[長押し] j0 を -0.43° → -54.22° まで（目標を 5 回送信。止めます）
[送信] j0 -1.0° → -54.87 +1.58 +2.19 -0.26 -0.26 -30.23  届いた（ずれ 1.75°）  届いた角度 -54.40 +1.58 +2.02 -0.17 +1.49 -30.23
[送信] j0 -2.0° → -56.87 +1.58 +2.19 -0.26 -0.26 -30.23  届いた（ずれ 1.75°）  届いた角度 -56.77 +1.58 +2.02 -0.17 +1.49 -30.23
[送信] j0 -2.0° → -58.87 +1.58 +2.19 -0.26 -0.26 -30.23  届いた（ずれ 1.75°）  届いた角度 -58.97 +1.58 +2.02 -0.17 +1.49 -30.32
[送信] j0 -2.0° → -60.87 +1.58 +2.19 -0.26 -0.26 -30.23  届いた（ずれ 1.66°）  届いた角度 -61.08 +1.58 +2.02 -0.17 +1.40 -30.32
[関節] 上下で動かす関節を j2 にしました
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[長押し] j4 を +0.52° → -28.30° まで（目標を 3 回送信。止めます）
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[長押し] j1 を +2.63° → +2.10° まで（目標を 1 回送信。止めます）
  [WARN] daemon_get_angles failed: daemon error: get_angles returned empty/invalid after 12 retries
  [WARN] daemon_get_angles failed: daemon error: get_angles returned empty/invalid after 12 retries
  [WARN] daemon_get_angles failed: daemon error: get_angles returned empty/invalid after 12 retries
  [WARN] daemon_get_angles failed: daemon error: get_angles returned empty/invalid after 12 retries
[送信] j1 +1.0° → -60.87 +21.21 +2.19 -0.26 -38.58 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 1.2°）  届いた角度 -61.08 +22.41 +1.84 -0.08 -37.79 -30.32
[送信] j1 +2.0° → -60.87 +23.21 +2.19 -0.26 -38.58 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 1.22°）  届いた角度 -61.17 +24.43 +1.75 +0.00 -37.96 -30.32
[長押し] j1 を +24.43° → +35.15° まで（目標を 2 回送信。止めます）
[関節] 上下で動かす関節を j2 にしました
[長押し] j2 を +2.63° → +2.63° まで（目標を 1 回送信。止めます）
[長押し] j2 を +3.42° → +3.42° まで（目標を 1 回送信。止めます）
[送信] j0 +1.0° → -59.87 +40.69 +18.89 -0.26 -38.58 -30.23  届いた（ずれ 0.96°）  届いた角度 -60.20 +41.30 +18.89 +0.70 -38.23 -29.61
[送信] j0 +1.0° → -58.87 +40.69 +18.89 -0.26 -38.58 -30.23  届いた（ずれ 0.78°）  届いた角度 -58.53 +41.30 +18.89 +0.52 -38.32 -29.61
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[送信] j4 -1.0° → -58.87 +40.69 +18.89 -0.26 -39.58 -30.23  届いた（ずれ 0.61°）  届いた角度 -58.88 +41.30 +18.89 +0.17 -39.63 -30.05
[送信] j4 -1.0° → -58.87 +40.69 +18.89 -0.26 -40.58 -30.23  届いた（ずれ 0.61°）  届いた角度 -58.88 +41.30 +18.89 +0.17 -40.69 -30.05
[長押し] j4 を -41.83° → -41.83° まで（目標を 1 回送信。止めます）
[長押し] j4 を -45.61° → -48.42° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[関節] 上下で動かす関節を j2 にしました
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[長押し] j4 を -25.83° → -49.39° まで（目標を 3 回送信。止めます）
[長押し] j4 を -49.39° → -56.95° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[長押し] j1 を +42.53° → +47.10° まで（目標を 1 回送信。止めます）
[長押し] j1 を +52.64° → +53.70° まで（目標を 1 回送信。止めます）
[送信] j1 +1.0° → -58.87 +57.68 +18.89 -0.26 -60.02 -30.23  届いた（ずれ 3.26°）  届いた角度 -58.88 +58.00 +18.89 +0.43 -63.28 -30.23
[送信] j1 +1.0° → -58.87 +58.68 +18.89 -0.26 -60.02 -30.23  届いた（ずれ 3.26°）  届いた角度 -58.88 +58.71 +18.89 +0.52 -63.28 -30.23
[関節] 上下で動かす関節を j2 にしました
[送信] j2 +1.0° → -58.87 +58.68 +19.89 -0.26 -60.02 -30.23  届いた（ずれ 5.54°）  届いた角度 -58.88 +59.67 +20.30 +0.35 -65.56 -30.23
[送信] j2 -1.0° → -58.87 +58.68 +18.89 -0.26 -60.02 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 5.54°）  届いた角度 -58.88 +59.67 +20.21 +0.35 -65.56 -30.23
[長押し] j2 を +20.21° → +20.21° まで（目標を 1 回送信。止めます）
[長押し] j2 を +20.12° → +20.12° まで（目標を 1 回送信。止めます）
  [Pi] GRIPPER: VALUE=20 speed=100 result= None
[爪] 爪を閉じる（待ち 0.8 秒のあと受付）
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[長押し] j1 を +61.87° → +45.87° まで（目標を 3 回送信。止めます）
  [Pi] GRIPPER: OPEN result= None
[爪] 爪を開く（待ち 0.8 秒のあと受付）
[送信] HOME → +0.00 +0.00 +0.00 +0.00 +0.00 -30.00  届いた（ずれ 2.1°）  届いた角度 -0.35 +1.49 +2.10 -0.08 +0.61 -30.32
[受付なし] HOME: 前の操作が終わっていません（押し直してください）
[受付なし] HOME: 前の操作が終わっていません（押し直してください）
[受付なし] HOME: 前の操作が終わっていません（押し直してください）
[関節] 上下で動かす関節を j2 にしました
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[送信] HOME → +0.00 +0.00 +0.00 +0.00 +0.00 -30.00  届かなかった（ずれ 53.34°）  届いた角度 -0.43 +1.49 +2.10 -0.17 +53.34 -30.23
[送信] j4 -1.0° → +0.00 +0.00 +0.00 +0.00 +52.34 -30.00  届いた（ずれ 2.1°）  届いた角度 -0.43 +1.49 +2.10 -0.17 +51.94 -30.23
[長押し] j4 を +51.94° → -3.86° まで（目標を 7 回送信。止めます）
[送信] HOME → +0.00 +0.00 +0.00 +0.00 +0.00 -30.00  届いた（ずれ 2.9°）  届いた角度 -0.43 +1.49 +1.84 -0.17 -2.90 -30.23
^C
[終了] Ctrl+C
[終了] アームは動かしていません。記録: /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261109_130126
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % scp -i ~/.ssh/id_rsa_pi /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/drag_v2_20261109_130300.json ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/
python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_130300.json
drag_v2_20261109_130300.json                                                   100%   38KB   9.2MB/s   00:00    
[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_20261109_130300.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_w52iq5a0/drag_v2_20261109_130300.json
[RTD   ] 入力ファイル: drag_v2_20261109_130300.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=123 (start=123 end=197, gap=20.13°)
                    angles = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
  PICK           <- gripper close mark idx=223（PICK phase 範囲内）
                    angles = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=304 (start=304 end=352, gap=18.81°)
                    angles = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
  PLACE          <- gripper open mark idx=367（PLACE phase 範囲内）
                    angles = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 156 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 26.99°（しきい値 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      = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 58.88°  1 回送信 speed=20  (~ 2.9s @ 20°/s 目安・到達待ち 最大 10.8s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 20.13°  1 回送信 speed=20  (~ 1.0s @ 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    = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 20.13°  1 回送信 speed=20  (~ 1.0s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 101.85°  1 回送信 speed=20  (~ 5.1s @ 20°/s 目安・到達待ち 最大 17.3s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 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    = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 54.58°  1 回送信 speed=20  (~ 2.7s @ 20°/s 目安・到達待ち 最大 10.2s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 31.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 14.7s（max|Δ| 合計 293.2° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.3px ずれています（1 回目 / 上限 15.0px）。測り直します
[RTD   ] 再生直前: 四隅が 2 回目で収まりました（最大 14.9px <= 15.0px）
[RTD   ] 再生直前: block = (+238.7, +106.4) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_130520.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 431.8px（≒193.2mm）動いています（許容 10.3px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 431.8px（許容 10.3px = 5.0mm）/ mm 換算の差 193.17mm
[RTD   ] [WARN]   つかみ損ねる可能性があります。気になるなら Enter の前に measure を取り直してください
[RTD   ] ドライランなので、ここで終了します（アームには何も送っていません）
[RTD   ] Pi 版と比べる点: 抽出ウェイポイント 4 姿勢と各区間の max|Δ| は同じ。送り方は単発（Pi 版は 0.1s 補間ストリーミング）なので n_steps / ticks は比較対象外。送信 8 回 / 想定所要 ≈ 31.7s
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_130300.json --execute
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_130300.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_gh64qcxm/drag_v2_20261109_130300.json
[RTD   ] 入力ファイル: drag_v2_20261109_130300.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=123 (start=123 end=197, gap=20.13°)
                    angles = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
  PICK           <- gripper close mark idx=223（PICK phase 範囲内）
                    angles = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=304 (start=304 end=352, gap=18.81°)
                    angles = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
  PLACE          <- gripper open mark idx=367（PLACE phase 範囲内）
                    angles = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 156 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 26.99°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.52,   +1.49,   +1.75,   -0.17,   +0.17,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.52,   +1.49,   +1.75,   -0.17,   +0.17,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.75°  (settle 3.0s)
  [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      = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 58.88°  1 回送信 speed=20  (~ 2.9s @ 20°/s 目安・到達待ち 最大 10.8s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 20.13°  1 回送信 speed=20  (~ 1.0s @ 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    = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 20.13°  1 回送信 speed=20  (~ 1.0s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 101.85°  1 回送信 speed=20  (~ 5.1s @ 20°/s 目安・到達待ち 最大 17.3s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 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    = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 54.58°  1 回送信 speed=20  (~ 2.7s @ 20°/s 目安・到達待ち 最大 10.2s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 31.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 14.7s（max|Δ| 合計 293.2° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] [WARN] 再生直前: 四隅が最大 15.5px ずれています（1 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 15.9px ずれています（2 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 15.5px ずれています（3 回目 / 上限 15.0px）。やり直しの上限に達しました
[RTD   ] 再生直前: block = (+238.7, +105.9) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_130534.jpg
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_130534_rejected.json
[RTD   ] [WARN] マット四隅が measure 時から最大 15.5px ずれています（上限 15.0px・最大 3 回やり直しても収まらず）。カメラが動いた可能性があるので止めます。measure を取り直してください（各隅のずれ: 4.0, 10.0, 15.1, 15.5）（**止めません**・WARN のみ）
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130542
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130542/teach/drag_v2_20261109_130300.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130542/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 1.75° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.75° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.016s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 10.8s)
[RTD   ] 送信 OK（daemon 往復 1.021s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.15° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.042s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.23° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.011s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.034s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.11° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 17.3s)
[RTD   ] 送信 OK（daemon 往復 1.049s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=1.84° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.035s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.58° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.004s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.63° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 10.2s)
[RTD   ] 送信 OK（daemon 往復 1.053s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.28° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 59/59 回, 実効 1.63 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.63 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.038s / p50 1.035s / 最大 1.053s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.053s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.39s / 最大 4.63s
[RECORD] 電流の記録終了 79 行 (2.18 行/秒. 本体が眠っている間だけ読む. 爪の間 14.045 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130542/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130542/run_0001_20261109_130542.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_130542 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/align_ref --episode 130542
python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_130300.json --execute
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/align_ref/run_0001_20261109_130542/frames/000000.jpg
[REF   ] お手本 run_0001_20261109_130542 (つかんだ瞬間が不明)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  +1.8  dx=  +6.7  response=0.577  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +0.3  dx=  +6.0  response=0.587  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE  ] 終了 (何も書いていません)
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_130300.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_0yz2jwh1/drag_v2_20261109_130300.json
[RTD   ] 入力ファイル: drag_v2_20261109_130300.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=123 (start=123 end=197, gap=20.13°)
                    angles = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
  PICK           <- gripper close mark idx=223（PICK phase 範囲内）
                    angles = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=304 (start=304 end=352, gap=18.81°)
                    angles = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
  PLACE          <- gripper open mark idx=367（PLACE phase 範囲内）
                    angles = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 156 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 26.99°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.08,   +1.49,   +2.02,   +0.26,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.08,   +1.49,   +2.02,   +0.26,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 2.02°  (settle 3.0s)
  [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      = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 58.88°  1 回送信 speed=20  (~ 2.9s @ 20°/s 目安・到達待ち 最大 10.8s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 20.13°  1 回送信 speed=20  (~ 1.0s @ 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    = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 20.13°  1 回送信 speed=20  (~ 1.0s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 101.85°  1 回送信 speed=20  (~ 5.1s @ 20°/s 目安・到達待ち 最大 17.3s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 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    = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 54.58°  1 回送信 speed=20  (~ 2.7s @ 20°/s 目安・到達待ち 最大 10.2s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 31.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 14.7s（max|Δ| 合計 293.2° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.7px ずれています（1 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.7px ずれています（2 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.8px ずれています（3 回目 / 上限 15.0px）。やり直しの上限に達しました
[RTD   ] 再生直前: block = (+240.0, +102.0) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_130716.jpg
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_130716_rejected.json
[RTD   ] [WARN] マット四隅が measure 時から最大 16.8px ずれています（上限 15.0px・最大 3 回やり直しても収まらず）。カメラが動いた可能性があるので止めます。measure を取り直してください（各隅のずれ: 4.0, 10.0, 16.8, 15.5）（**止めません**・WARN のみ）
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130723
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130723/teach/drag_v2_20261109_130300.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130723/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 2.02° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=2.02° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.012s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 10.8s)
[RTD   ] 送信 OK（daemon 往復 1.033s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.50° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.14° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.011s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.11° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 17.3s)
[RTD   ] 送信 OK（daemon 往復 1.053s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=1.75° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.50° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.014s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.048s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.54° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 10.2s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.19° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 57/57 回, 実効 1.61 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.61 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.036s / p50 1.031s / 最大 1.053s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.053s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.31s / 最大 4.46s
[RECORD] 電流の記録終了 75 行 (2.11 行/秒. 本体が眠っている間だけ読む. 爪の間 14.052 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130723/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130723/run_0001_20261109_130723.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_130723 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/align_ref --episode 130542
python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_130300.json --execute
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/align_ref/run_0001_20261109_130542/frames/000000.jpg
[REF   ] お手本 run_0001_20261109_130542 (つかんだ瞬間が不明)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  +1.1  dx=  +7.8  response=0.598  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE  ] 終了 (何も書いていません)
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_130300.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_3cwlo00h/drag_v2_20261109_130300.json
[RTD   ] 入力ファイル: drag_v2_20261109_130300.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=123 (start=123 end=197, gap=20.13°)
                    angles = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
  PICK           <- gripper close mark idx=223（PICK phase 範囲内）
                    angles = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=304 (start=304 end=352, gap=18.81°)
                    angles = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
  PLACE          <- gripper open mark idx=367（PLACE phase 範囲内）
                    angles = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 156 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 26.99°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.08,   +1.49,   +2.02,   +0.26,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.08,   +1.49,   +2.02,   +0.26,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 2.02°  (settle 3.0s)
  [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      = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 58.88°  1 回送信 speed=20  (~ 2.9s @ 20°/s 目安・到達待ち 最大 10.8s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 20.13°  1 回送信 speed=20  (~ 1.0s @ 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    = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 20.13°  1 回送信 speed=20  (~ 1.0s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 101.85°  1 回送信 speed=20  (~ 5.1s @ 20°/s 目安・到達待ち 最大 17.3s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 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    = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 54.58°  1 回送信 speed=20  (~ 2.7s @ 20°/s 目安・到達待ち 最大 10.2s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 31.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 14.7s（max|Δ| 合計 293.2° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.7px ずれています（1 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.7px ずれています（2 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.7px ずれています（3 回目 / 上限 15.0px）。やり直しの上限に達しました
[RTD   ] 再生直前: block = (+239.6, +103.0) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_130817.jpg
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_130817_rejected.json
[RTD   ] [WARN] マット四隅が measure 時から最大 16.7px ずれています（上限 15.0px・最大 3 回やり直しても収まらず）。カメラが動いた可能性があるので止めます。measure を取り直してください（各隅のずれ: 4.0, 10.0, 16.7, 15.5）（**止めません**・WARN のみ）
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130824
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130824/teach/drag_v2_20261109_130300.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130824/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 2.02° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=2.02° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.004s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 10.8s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.50° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.620s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.14° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.013s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.033s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.11° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 17.3s)
[RTD   ] 送信 OK（daemon 往復 1.047s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=1.75° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.055s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.41° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.017s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.54° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 10.2s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.28° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 57/57 回, 実効 1.58 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.58 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.121s / p50 1.033s / 最大 1.620s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.620s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.38s / 最大 4.46s
[RECORD] 電流の記録終了 75 行 (2.08 行/秒. 本体が眠っている間だけ読む. 爪の間 14.05 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130824/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130824/run_0001_20261109_130824.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_130824 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/align_ref --episode 130542
python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_130300.json --execute
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/align_ref/run_0001_20261109_130542/frames/000000.jpg
[REF   ] お手本 run_0001_20261109_130542 (つかんだ瞬間が不明)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  +1.9  dx=  +7.0  response=0.600  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE  ] 終了 (何も書いていません)
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_130300.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_x5tqexdu/drag_v2_20261109_130300.json
[RTD   ] 入力ファイル: drag_v2_20261109_130300.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=123 (start=123 end=197, gap=20.13°)
                    angles = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
  PICK           <- gripper close mark idx=223（PICK phase 範囲内）
                    angles = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=304 (start=304 end=352, gap=18.81°)
                    angles = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
  PLACE          <- gripper open mark idx=367（PLACE phase 範囲内）
                    angles = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 156 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 26.99°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  +0.00,   +1.49,   +2.02,   +0.26,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  +0.00,   +1.49,   +2.02,   +0.26,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 2.02°  (settle 3.0s)
  [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      = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 58.88°  1 回送信 speed=20  (~ 2.9s @ 20°/s 目安・到達待ち 最大 10.8s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 20.13°  1 回送信 speed=20  (~ 1.0s @ 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    = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 20.13°  1 回送信 speed=20  (~ 1.0s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 101.85°  1 回送信 speed=20  (~ 5.1s @ 20°/s 目安・到達待ち 最大 17.3s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 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    = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 54.58°  1 回送信 speed=20  (~ 2.7s @ 20°/s 目安・到達待ち 最大 10.2s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 31.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 14.7s（max|Δ| 合計 293.2° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] [WARN] 再生直前: 四隅が最大 15.5px ずれています（1 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 15.5px ずれています（2 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 15.9px ずれています（3 回目 / 上限 15.0px）。やり直しの上限に達しました
[RTD   ] 再生直前: block = (+241.8, +104.4) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_130922.jpg
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_130922_rejected.json
[RTD   ] [WARN] マット四隅が measure 時から最大 15.9px ずれています（上限 15.0px・最大 3 回やり直しても収まらず）。カメラが動いた可能性があるので止めます。measure を取り直してください（各隅のずれ: 4.0, 10.0, 15.9, 15.5）（**止めません**・WARN のみ）
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130929
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130929/teach/drag_v2_20261109_130300.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130929/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 2.02° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=2.02° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.014s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 10.8s)
[RTD   ] 送信 OK（daemon 往復 1.034s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.50° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.041s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.14° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.08° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.010s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.11° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 17.3s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=1.75° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.055s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.41° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.016s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.038s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.54° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 10.2s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.19° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 57/57 回, 実効 1.61 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.61 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.037s / p50 1.034s / 最大 1.055s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.055s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.31s / 最大 4.46s
[RECORD] 電流の記録終了 75 行 (2.11 行/秒. 本体が眠っている間だけ読む. 爪の間 14.059 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130929/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_130929/run_0001_20261109_130929.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_130929 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/align_ref --episode 130542
python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_130300.json --execute
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/align_ref/run_0001_20261109_130542/frames/000000.jpg
[REF   ] お手本 run_0001_20261109_130542 (つかんだ瞬間が不明)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  +0.8  dx=  +6.9  response=0.628  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +1.9  dx=  +6.7  response=0.586  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE  ] 終了 (何も書いていません)
[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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20261109_130300.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_7l1gks85/drag_v2_20261109_130300.json
[RTD   ] 入力ファイル: drag_v2_20261109_130300.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=123 (start=123 end=197, gap=20.13°)
                    angles = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
  PICK           <- gripper close mark idx=223（PICK phase 範囲内）
                    angles = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=304 (start=304 end=352, gap=18.81°)
                    angles = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
  PLACE          <- gripper open mark idx=367（PLACE phase 範囲内）
                    angles = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 156 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 26.99°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.08,   +1.49,   +2.02,   +0.26,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.08,   +1.49,   +2.02,   +0.26,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 2.02°  (settle 3.0s)
  [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      = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 58.88°  1 回送信 speed=20  (~ 2.9s @ 20°/s 目安・到達待ち 最大 10.8s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 20.13°  1 回送信 speed=20  (~ 1.0s @ 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    = [ -58.88,  +61.87,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            max |Δ| = 20.13°  1 回送信 speed=20  (~ 1.0s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -58.88,  +41.74,   +9.31,   +0.08,  -54.05,  -30.14]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 101.85°  1 回送信 speed=20  (~ 5.1s @ 20°/s 目安・到達待ち 最大 17.3s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 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    = [ +43.85,  +62.22,   -4.83,   +7.82,  -63.01,  -36.12]
            to      = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            max |Δ| = 18.81°  1 回送信 speed=20  (~ 0.9s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +42.97,  +43.41,   +4.13,   +7.20,  -54.58,  -35.33]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 54.58°  1 回送信 speed=20  (~ 2.7s @ 20°/s 目安・到達待ち 最大 10.2s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 31.7s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 14.7s（max|Δ| 合計 293.2° @ 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_123559.json
[RTD   ]   measured_at = 2026-11-09T12:36:01.355235  block = (+54.8, +47.3) mm  box = (-220.3, +190.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.7px ずれています（1 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.8px ずれています（2 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 16.8px ずれています（3 回目 / 上限 15.0px）。やり直しの上限に達しました
[RTD   ] 再生直前: block = (+239.1, +102.1) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_131056.jpg
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_131056_rejected.json
[RTD   ] [WARN] マット四隅が measure 時から最大 16.8px ずれています（上限 15.0px・最大 3 回やり直しても収まらず）。カメラが動いた可能性があるので止めます。measure を取り直してください（各隅のずれ: 4.0, 10.0, 16.8, 15.5）（**止めません**・WARN のみ）
[RTD   ] [SAFETY] 再生中はグリッパーが実機で開閉します。爪に指を挟まないこと。
[RTD   ] [SAFETY] 止めるときはアームの電源を切ること。Ctrl-C は新しい送信をやめるだけで、進行中の移動は止まりません。
[RTD   ] [SAFETY] 開いたかの自動確認はしません（gv は使わない）。STEP 2 で open を送ってから PICK へ降ります。
[RTD   ] 周囲に手・物が無いか確認してください。OK なら Enter で開始

[RTD   ] 試行フォルダ: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_131103
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_131103/teach/drag_v2_20261109_130300.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_131103/recording/currents.csv
  [Pi] fresh_mode=1
[RTD   ] daemon_set_fresh_mode(1)（最新コマンド優先・本線 run_pick_place.py L3976 と同じ。647 試行の実績はこの状態）
[STEP  1] MOVE → HOME  daemon_send_angles(HOME, 20)
[STEP  1] 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 8.0s
[RTD   ] 先頭移動: 送信直前の実測で max|Δ| = 2.02° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=2.02° <= tol 2.5°)
[STEP  2] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step2_open: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.012s
[STEP  2] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  2] gripper dwell 2.0s（読み取りなし）
[STEP  3] MOVE → APPROACH_PICK  segment HOME → APPROACH_PICK  (1 回送信 speed=20 → 到達待ち 許容 2.0°[TOL_APPROACH（approach 系）] / 最大 10.8s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.15° <= tol 2.0°)
[STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage4_pick）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.028s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=1.23° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 0.00° <= 1.0°）
  [Pi] GRIPPER: VALUE=20 speed=50 result= None
[RTD   ] gripper close (1/1 回目) の daemon 往復 = 0.012s
[STEP  5] gripper dwell 2.0s（読み取りなし）
[STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（lift の残差 2.19° を吸収）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.038s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.11° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 17.3s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=1.84° <= tol 3.0°)
[STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_PICK_PLACE（stage8_place）] / 最大 8.0s)  [critical]
[RTD   ] 送信 OK（daemon 往復 1.039s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.50° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.09° <= 1.0°）
  [Pi] GRIPPER: OPEN result= None
[RTD   ] gripper open (1/1 回目) の daemon 往復 = 2.014s
[STEP  9] open 後 2.0s 待ちます（本線の daemon wait=2 相当・読み取りなし）
[STEP  9] gripper dwell 2.0s（読み取りなし）
[STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_LIFT_BACK（stage10_lift_back）] / 最大 8.0s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.54° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 10.2s)
[RTD   ] 送信 OK（daemon 往復 1.028s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.19° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 58/58 回, 実効 1.62 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.62 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.032s / p50 1.031s / 最大 1.040s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.040s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.34s / 最大 4.46s
[RECORD] 電流の記録終了 77 行 (2.15 行/秒. 本体が眠っている間だけ読む. 爪の間 14.051 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_131103/recording/currents.csv
==============================================================================
[RTD   ] 再生 完了
==============================================================================
[RTD   ] つかめたか (y/n) > y
[RTD   ] 箱に入ったか (y/n) > y
[RTD   ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_131103/run_0001_20261109_131103.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD   ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_131103 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % 
