(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && 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_094222.json --execute
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF   ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  -2.5  dx=  +5.3  response=0.652  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -1.0  dx=  +1.1  response=0.522  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -2.6  dx=  +7.2  response=0.540  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -1.3  dx= +12.7  response=0.577  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +2.3  dx= +14.3  response=0.528  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +3.8  dx= +14.2  response=0.521  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +2.8  dx= +14.1  response=0.527  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +0.6  dx= +18.7  response=0.592  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -1.0  dx= +14.9  response=0.579  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -2.2  dx= +12.5  response=0.536  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -1.1  dx=  +4.7  response=0.510  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +0.4  dx=  +1.7  response=0.641  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -0.6  dx=  +6.3  response=0.502  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +0.7  dx=  +7.2  response=0.524  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +1.8  dx=  +8.4  response=0.523  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +3.4  dx=  +9.7  response=0.609  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +2.2  dx=  +9.5  response=0.540  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +4.9  dx=  +9.5  response=0.533  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +6.9  dx=  +8.5  response=0.566  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +8.1  dx=  +8.6  response=0.619  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +7.0  dx=  +7.9  response=0.606  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +3.7  dx=  +7.9  response=0.586  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +4.9  dx=  +7.6  response=0.607  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +3.9  dx=  +6.7  response=0.584  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +5.2  dx=  +5.3  response=0.587  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +7.9  dx=  +5.4  response=0.609  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +9.7  dx=  +5.7  response=0.626  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= +10.8  dx=  +5.8  response=0.617  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +6.5  dx=  +6.1  response=0.606  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +4.1  dx=  +6.3  response=0.566  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +3.0  dx=  +7.4  response=0.546  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +1.5  dx=  +7.9  response=0.559  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +0.3  dx=  +8.6  response=0.585  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -1.1  dx=  +9.4  response=0.602  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -2.2  dx=  +9.7  response=0.581  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -0.3  dx=  +9.3  response=0.529  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +3.2  dx=  +9.4  response=0.603  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +6.6  dx= +10.0  response=0.556  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +5.0  dx= +10.6  response=0.615  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +1.4  dx= +10.6  response=0.591  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +0.4  dx= +14.0  response=0.512  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -0.6  dx= +14.8  response=0.586  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +0.9  dx= +13.0  response=0.551  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +2.0  dx= +10.6  response=0.582  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +3.7  dx=  +7.4  response=0.585  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +5.0  dx=  +5.7  response=0.600  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +7.1  dx=  +6.7  response=0.583  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +8.3  dx=  +4.6  response=0.590  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +7.0  dx=  +2.8  response=0.617  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +3.5  dx=  +1.2  response=0.625  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -3.2  dx=  +2.2  response=0.556  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -5.0  dx=  +2.6  response=0.537  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -7.2  dx=  +6.3  response=0.495  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -5.0  dx= -13.5  response=0.518  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -6.2  dx= -18.7  response=0.354  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -7.2  dx= -11.9  response=0.471  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -9.1  dx=  -7.7  response=0.434  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -10.3  dx=  -5.7  response=0.495  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -11.7  dx=  -1.5  response=0.550  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -10.6  dx=  -2.6  response=0.570  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -4.5  dx=  +0.1  response=0.548  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +7.5  dx=  +5.3  response=0.557  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= +17.8  dx=  +5.4  response=0.407  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= +21.5  dx=  +4.6  response=0.420  → ずれ (|dy|=21.5 > 20)
[ALIGN ] dy= +19.2  dx=  +7.7  response=0.456  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= +13.0  dx= +10.8  response=0.504  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +5.6  dx= +16.4  response=0.544  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -3.7  dx= +23.1  response=0.457  → ずれ (|dx|=23.1 > 20)
[ALIGN ] dy=  -5.3  dx= +22.8  response=0.389  → ずれ (|dx|=22.8 > 20)
[ALIGN ] dy=  -1.9  dx= +15.7  response=0.475  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +1.9  dx=  +1.0  response=0.622  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +4.7  dx=  +5.0  response=0.590  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +2.7  dx=  +6.2  response=0.590  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +0.1  dx=  +0.1  response=0.571  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -1.4  dx=  -1.9  response=0.538  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -3.4  dx=  -1.0  response=0.614  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -4.4  dx=  +2.9  response=0.536  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -2.8  dx=  -1.0  response=0.547  → 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   ] 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=[277, 1690] Y=[0, 952]
[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.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1460,572) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.15s)
[DETECT][1/5] box Unity=(-0.210,+0.191) score=0.6468337774276733
  赤ブロック pixel=(859, 125) → Unity=(0.0558, -0.0283)
[DETECT][1/5] block Unity=(+0.056,-0.028) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1460,572) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][2/5] box Unity=(-0.210,+0.191) score=0.6469279527664185
  赤ブロック pixel=(859, 132) → Unity=(0.0559, -0.0249)
[DETECT][2/5] block Unity=(+0.056,-0.025) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1460,572) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.21s)
[DETECT][3/5] box Unity=(-0.210,+0.191) score=0.6468681693077087
  赤ブロック pixel=(860, 145) → Unity=(0.0556, -0.0186)
[DETECT][3/5] block Unity=(+0.056,-0.019) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1460,572) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][4/5] box Unity=(-0.210,+0.191) score=0.6468533277511597
[DETECT][4/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1460,572) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.35s)
[DETECT][5/5] box Unity=(-0.210,+0.191) score=0.6467010974884033
  赤ブロック pixel=(860, 137) → Unity=(0.0555, -0.0225)
[DETECT][5/5] block Unity=(+0.056,-0.022) score=null
[RTD   ] measure: block = (+55.7, -23.7) mm
[RTD   ] measure: box   = (-209.8, +191.2) mm  score=0.6468533277511597
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_102707.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.54px（上限 15.0px・やり直し 1 回）
[RTD   ] [WARN] 検出したブロックがアームの根元から 60.5mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+55.7, -23.7) mm（WARN のみ・保存します）
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_102707.jpg
[RTD   ] ブロックのばらつき: 3.2px = 1.51mm（3 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 1.23mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_102707.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
[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_094222.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_wx4fmt0v/drag_v2_20261109_094222.json
[RTD   ] 入力ファイル: drag_v2_20261109_094222.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=240 (start=240 end=290, gap=13.89°)
                    angles = [ -40.69,  +66.09,   +1.49,   +0.61,  -70.48,  -29.88]
  PICK           <- gripper close mark idx=355（PICK phase 範囲内）
                    angles = [ -40.51,  +79.98,   -0.43,   +0.43,  -73.47,  -29.97]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=470 (start=470 end=512, gap=27.86°)
                    angles = [ +43.41,  +31.81,  +18.54,   +6.24,  -56.95,  -29.88]
  PLACE          <- gripper open mark idx=552（PLACE phase 範囲内）
                    angles = [ +44.20,  +59.67,   +6.15,  +10.54,  -74.88,  -30.84]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 155 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 15.12°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  +0.26,   +1.40,   +0.79,   -0.26,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  +0.26,   +1.40,   +0.79,   -0.26,   -0.26,  -30.23]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.40°  (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      = [ -40.69,  +66.09,   +1.49,   +0.61,  -70.48,  -29.88]
            max |Δ| = 70.48°  1 回送信 speed=20  (~ 3.5s @ 20°/s 目安・到達待ち 最大 12.6s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -40.69,  +66.09,   +1.49,   +0.61,  -70.48,  -29.88]
            to      = [ -40.51,  +79.98,   -0.43,   +0.43,  -73.47,  -29.97]
            max |Δ| = 13.89°  1 回送信 speed=20  (~ 0.7s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  5] GRIPPER CLOSE  daemon_set_gripper_value(20, 50) + sleep(2.0s)
  [STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  tol=3.0°  [rpp.TOL_LIFT_BACK（lift の残差 2.19° を吸収）]
            from    = [ -40.51,  +79.98,   -0.43,   +0.43,  -73.47,  -29.97]
            to      = [ -40.69,  +66.09,   +1.49,   +0.61,  -70.48,  -29.88]
            max |Δ| = 13.89°  1 回送信 speed=20  (~ 0.7s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -40.69,  +66.09,   +1.49,   +0.61,  -70.48,  -29.88]
            to      = [ +43.41,  +31.81,  +18.54,   +6.24,  -56.95,  -29.88]
            max |Δ| = 84.10°  1 回送信 speed=20  (~ 4.2s @ 20°/s 目安・到達待ち 最大 14.6s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +43.41,  +31.81,  +18.54,   +6.24,  -56.95,  -29.88]
            to      = [ +44.20,  +59.67,   +6.15,  +10.54,  -74.88,  -30.84]
            max |Δ| = 27.86°  1 回送信 speed=20  (~ 1.4s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  9] GRIPPER OPEN  daemon_set_gripper(0, 50, wait=0) ×1 回（daemon 事前 2.0s + 事後 2.0s + 待ち 2.0s）= 計 6.0s
            開いたかは確認しません（gv を使わず・開始前の y/n も無し。判定は終了後の y/n と動画）
  [STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  tol=3.0°  [rpp.TOL_LIFT_BACK（stage10_lift_back）]
            from    = [ +44.20,  +59.67,   +6.15,  +10.54,  -74.88,  -30.84]
            to      = [ +43.41,  +31.81,  +18.54,   +6.24,  -56.95,  -29.88]
            max |Δ| = 27.86°  1 回送信 speed=20  (~ 1.4s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +43.41,  +31.81,  +18.54,   +6.24,  -56.95,  -29.88]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 56.95°  1 回送信 speed=20  (~ 2.8s @ 20°/s 目安・到達待ち 最大 10.5s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 31.8s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 14.8s（max|Δ| 合計 295.0° @ 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_102707.json
[RTD   ]   measured_at = 2026-11-09T10:27:09.693356  block = (+55.7, -23.7) mm  box = (-209.8, +191.2) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+55.5, -23.0) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_102712.jpg
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_102712.jpg
[RTD   ] [WARN] 検出したブロックがアームの根元から 60.1mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+55.5, -23.0) mm（**止めません**・WARN のみ）
[RTD   ] ブロック位置の照合 OK（画素の差 1.6px <= 許容 10.3px = 5.0mm / mm 換算の差 0.76mm）
[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_102715
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_102715/teach/drag_v2_20261109_094222.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_102715/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.40° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.40° <= 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.6s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.05° <= 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.99° <= tol 3.0°)
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 5.01° <= 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.63° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 14.6s)
[RTD   ] 送信 OK（daemon 往復 1.039s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.02° <= 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.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.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.035s）
[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 復帰）] / 最大 10.5s)
[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 101/101 回, 実効 2.02 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（2.02 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.033s / p50 1.030s / 最大 1.039s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.039s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 3.99s / 最大 8.50s
[RECORD] 電流の記録終了 163 行 (3.25 行/秒. 本体が眠っている間だけ読む. 爪の間 14.061 秒は読まない. 見込み超え 1 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_102715/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_102715/run_0001_20261109_102715.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_102715 --dataset mecharm_redblock_box_teach_v1
