---
title: "フィジカルAI研究室を作る Log#25 | 深くつかむお手本へ、mechArm 270 をゲームパッドで教え直した"
slug: reteaching-mecharm-270-grasp-with-gamepad-for-deep-demos
date: 2026-11-09
day: 463
meta_description: "mechArm 270 のつかむ姿勢をゲームパッドで作り直すと、浅かった位置1のお手本が深くなり、2か所で使えるお手本を17本足せた。爪がブロックに乗った回は、下ろす時間（普段1.1秒→7.9〜9.1秒）で見分けられた。"
tags: [フィジカルAI研究室, mechArm 270, π0.5, Physical Intelligence, 模倣学習, お手本, ゲームパッド, つかみの深さ, サーボの電流, Claude Code]
series: "フィジカルAI研究室"
---

小型ロボットアーム mechArm 270 のつかむ姿勢をゲームパッドで作り直すと、ブロックが爪の奥まで入るようになり、浅かった置き場所（位置1）でも使えるお手本が10本撮れました。同じ日に位置2も足し、Physical Intelligence の [π0.5](https://www.pi.website/blog/pi05)（ロボット用の AI のモデル）に学ばせるお手本が、2か所で17本増えました。

この回でやったことで、次のことが変わりました。

- 良くなること：お手本の数が、置き場所ごとにそろい始めた。位置1は0本から10本、位置2は3本から10本になった（どちらも、つかみが深い本だけを数えている）。前回（LOG460）で、π0.5 が浅くつかんで落とす失敗の元は、浅いお手本だと分かっていた
- もたらされること：撮った1本が使えるかを、撮った直後に3つの数字で決められるようになった。つかみの深さ（閉じて1秒後に、ブロックが爪先の印からはみ出した量）、下ろすのにかかった時間、閉じたあとの爪の電流の値
- 時間：つかむ姿勢の作り直しは、ゲームパッドで約6分（09:36〜09:42、押した操作113回）。アームの力を抜いて手で引っ張る教え方は使わずに済んだ（手で教える時間は前に測っていない）。お手本は1本あたり約1分40秒で撮れた

困っていたのは、位置1の教えた記録そのものが浅かったことです。2022年10月に手で教えた姿勢を再生すると、ブロックが爪の先にかかったまま閉じていました（10/19 の1本は38.9px、この日の1本は43.4px で、線の24px を超えていました）。置き方を直しても変わらないので、姿勢のほうを作り直しました。

**爪がブロックの上に乗ってしまった回は、ブロックの上からつかむ姿勢まで下ろす時間で見分けられました。** 普段は1.1秒で下りきるのに、乗った4本は7.9〜9.1秒かかり、肩の角度も目標の手前で止まっていました。一方、爪と肩の電流の値では見分けられませんでした。

やったことの全体は次のとおりです。

| 段階 | やったこと | 結果 |
|---|---|---|
| 位置1を前の記録のまま撮る（09:30） | 2022年に手で教えた記録を再生した | つかめたが、はみ出し43.4px で浅い |
| ゲームパッドで姿勢を作る（09:36〜09:42） | 爪の奥までブロックを入れて閉じ、そのまま肩を上げて持ち上げた | つかむ姿勢と、ブロックの上の姿勢の角度が取れた |
| 新しい教えた記録を作る（09:42） | 前の記録の2つの姿勢だけを差し替えた | 箱の側の2つの姿勢はそのまま |
| 位置1を撮る（09:48〜10:31） | 新しい記録で18本 | 使える10本・浅い5本・爪が乗った3本 |
| 位置2を撮る（10:21〜10:45） | 前からの記録で8本 | 使える7本・爪が乗った1本 |
| 乗った回を探す | 上カメラの映像・角度・時間・電流を並べた | 下ろす時間と肩の角度で見分けられた。電流では見分けられなかった |

【図解】LOG463_demo_sort.html

次は位置3（あと8本）と位置4（あと5本）を同じ手順で撮り、5か所を10本ずつにそろえてから学習し直します。

GPU を買うか借りるかの判断は、Runpod で実際に借りて学習させた費用をもとに、別のページにまとめています。

【バナー】gpu-buy-or-rent

この回の作業は、Claude（手順と数字の確かめを一緒に進めた AI）と進めました。アームとゲームパッドの操作と、目で見た判断はこちらで行い、記録に電流を足す作業は [Claude Code](https://claude.com/claude-code)（プログラムを書く AI）に依頼箱を通して頼んでいます。ここから下は、依頼文と報告・コード・端末の出力・測定データを全量で載せた作業ログです。数字は記録から数えたもので、見込みのものは見込みと書いています。鍵（アクセストークンなど）は、どこにも載せていません。


## 作業ログ ― 位置1のつかむ姿勢をゲームパッドで作り直し、深いお手本を2か所で17本撮るまで

### この回で使う言葉

| 言葉 | 意味 |
|---|---|
| お手本 | π0.5 に学ばせるための、人が用意した動きの記録。このシリーズでは、手で教えた姿勢をアームに再生させ、上カメラの映像と関節の角度を記録したものを使う |
| 教えた記録 | 手（この回からはゲームパッドも）で教えた姿勢を残した JSON のファイル（drag_v2_….json）。再生のときに使うのは、ブロックの上・つかむ・箱の上・置くの4つの姿勢だけ |
| 位置1〜5 | ブロックを置く5か所。2026-10-19（LOG352）に、それぞれ教えた記録を作った。置き場所ごとにお手本を10本ずつそろえるのが今の目標 |
| はみ出し（px） | 爪を閉じて1秒後に、ブロックが爪先の青い印からどれだけはみ出しているかを、上カメラの画で測った量（pi05/grasp_depth.py）。24px（約9mm）を超えたら浅いとして外す（LOG460 で決めた線） |
| 爪が乗る | 爪を下ろしたときに、爪の先がブロックの上の角に当たって、そのまま下りられなくなること。ブロックが押されてずれるか傾いてから、爪は下りきる |
| 爪の電流の値 | 爪のサーボの電流の番地（69・70）を読んで組み立てた数。空で閉じると15〜22前後、ブロックをつかむと800前後になる（LOG461） |
| ゲームパッド | 市販の PS4 型のコントローラー。十字キーで関節を1つずつ動かし、×で爪を閉じ、○で開く（tools/gamepad_teleop.py。LOG419・LOG446） |
| 依頼箱 | Claude Code への依頼をファイルで置くと、Mac の見張り係が順番に渡して実行させる仕組み |

[mechArm 270](https://www.elephantrobotics.com/) は Elephant Robotics の小型の6軸アームで、中に Raspberry Pi が入っています。[π0.5](https://www.pi.website/blog/pi05) は、カメラの画と指示の言葉から、次の関節の動きを出すロボット用のモデルです。このシリーズでは、[Runpod](https://www.runpod.io/) で借りた GPU で mechArm 270 のお手本を学ばせています。


## 上カメラの位置合わせは、アームを HOME に戻してから行う

撮る前に、上カメラ（スマホ）の写り方を、学習に使っているお手本と同じにそろえます。位置合わせの画面（pi05/camera_align.py。LOG358 で作った）は、ライブの映像に、お手本の最初の1コマを半透明で重ねて、ずれ（dx・dy）と重なりの強さ（response）を出します。重ねる1コマは、位置1のお手本 run_0001_20261019_183454 にしました。

π0.5 のお手本と実機推論の記録は、10/19 からすべて同じ画角で撮っています（マットの上の端が画の外に出ている画角）。新しいお手本もこの画角にそろえるため、位置合わせの画面で重ねて合わせます。

最初に開いたときは NO MATCH（重なりが弱く、ずれが測れない）でした。基準の1コマは HOME の姿勢で撮っていますが、アームは前の作業のまま、ブロックへ腕を伸ばした姿勢でした。

【画像】LOG463_01_camera_align_no_match.jpg 位置合わせの画面。アームが HOME でないまま重ねたため、腕の形が合わず NO MATCH と出ている

アームを HOME に戻して爪を開いてから開き直すと、dy −0.1・dx +4.3、response 0.57 で OK になりました（いつもの起動の1行 lab_start.sh も、HOME → 爪を開く → 位置合わせの順に動かしている）。この画面では、重なったお手本のブロックに実物のブロックを合わせて置けるので、置き場所もここで合わせます。

【画像】LOG463_02_block_positions.jpg 位置1〜5のお手本の最初の1コマ（10/19）。ブロックを置く位置の見本


## 位置1を前の教えた記録のまま撮ると、ブロックが爪の先にかかったまま閉じた

最初の1本（run_0001_20261109_093045）は、2022-10-13 に手で教えた記録 drag_v2_20221013_144348.json をそのまま再生しました。つかめて箱にも入りましたが、閉じて1秒後のはみ出しは43.4px で、線の24px を大きく超えていました。10/19 に同じ記録で撮った1本（183454）も38.9px で浅かったので、置き方ではなく、教えた姿勢そのものが浅いと判断しました。

【画像】LOG463_03_side_shallow.jpg 前の教えた記録の再生を横から撮った12コマ。ブロックを爪の先で挟んで運んでいる

教えた記録の4つの姿勢のうち、つかむ姿勢は [−35.94, 80.59, 7.11, 3.16, −88.68, −30.32] でした（関節 j0〜j5 の角度。度）。手首 j4 が −88.68° と、安全の範囲（−90〜+60°）の端に近く、ドライランでも「j4 の余裕が最小 1.32°」と注意が出ていました。


## ゲームパッドで、つかむ姿勢とブロックの上の姿勢を作り直した

教え直しは、最初は Pi の上でアームの力を抜いて手で引っ張る形（drag_teach_v2.py teach）で考えていました。ゲームパッドなら、daemon（アームの中で指令を受けるプログラム）を止めずに、1° ずつ確かめながら合わせられるので、そちらに切り替えました。手で教える手順の名残りで daemon を止めたままゲームパッドを起動し、つながらずに終わった1回があります（端末1-08）。

ゲームパッドでやったことは次の順です（09:36:20〜09:42:22。押した操作113回）。

1. HOME から、ブロックが爪の奥（爪先の青い印より根元側）に入るまで下ろした。肩 j1 は88°を超えない（LOG352 で、88°を超えた指令をアームが捨てた）。足りない分は肘 j2 と手首 j4 で下げた
2. × で爪を閉じ、奥まで入っているかを目で見た
3. つかんだまま、十字キーの上で肩 j1 を約14°上げて持ち上げた。落ちないことを確かめてから ○ で開いた

ゲームパッドの記録（log.jsonl）には、押した操作ごとに、送った角度と読んだ角度が残ります。その実測から2つの姿勢を取り出しました。

| 姿勢 | 前の教えた記録 | ゲームパッドで作った姿勢 |
|---|---|---|
| つかむ（PICK） | −35.94, 80.59, 7.11, 3.16, −88.68, −30.32 | **−40.51, 79.98, −0.43, 0.43, −73.47, −29.97** |
| ブロックの上（APPROACH_PICK・持ち上げも同じ） | −36.12, 65.83, 16.78, 4.39, −86.74, −29.61 | **−40.69, 66.09, 1.49, 0.61, −70.48, −29.88** |

根元の向き j0 が 4.6° 違っていました。前の記録は、ブロックの中心から外れた向きで、爪の片側の先でつかんでいた可能性があります。手首 j4 は −88.68° から −73.47° になり、安全の範囲の端から離れました。

- ねらい：位置1のつかむ姿勢を、ブロックが爪の奥まで入る姿勢に直す
- 変わったこと：つかむ姿勢とブロックの上の姿勢を、ゲームパッドで作った実測の角度に差し替えた。箱の側の2つはそのまま
- 見込める効果（この回で測った値）：位置1の1本目のはみ出しは43.4px → 16.2px。新しい記録で撮った18本のうち、爪が乗らなかった15本では、使える深さ（24px 以下）が10本だった

【画像】LOG463_04_old_vs_new_pick.jpg 閉じて1秒後の上カメラ。左は前の教えた記録で、ブロックが爪の先からはみ出している。右はゲームパッドで作り直した記録で、ブロックが爪の奥まで入っている

### 新しい教えた記録の作り方（make_teach_v2_20261109.py）

前の記録をコピーし、ブロックの上の範囲（idx 240〜290）とつかむ範囲（idx 291〜469）の角度を、すべて新しい姿勢にそろえました。再生は、その範囲の中から姿勢を1つ選ぶ作りなので、どれが選ばれても同じになります。変わったのは585点のうち230点で、ほかに足したのは由来を書いた derived_from の欄だけです。作ったファイルは KIOXIA の mecharm_calibration/teach_poses_20261109/ に置き、Pi に送りました（端末1-11。鍵を付けずに送ろうとしてパスワードを聞かれ、止めた1回が端末1-10）。

```python
#!/usr/bin/env python3
"""make_teach_v2_20261109.py — 位置1 の教えた記録 drag_v2_20221013_144348.json の「ブロックの上」と「つかむ」の姿勢だけを,
ゲームパッドで作り直した姿勢に差し替えた新しい教えた記録 drag_v2_20261109_094222.json を作る (LOG463・2026-11-09 09:42).

再生 (record_teach_demo.py → waypoint_replay._extract_waypoints) が使うのは 4 つの姿勢だけ:
  APPROACH_PICK  : phase APPROACH_PICK (idx 240〜290) の中で PICK と差がいちばん大きい姿勢
  PICK           : PICK phase (idx 291〜469) の中の最後の close の印 (idx 355)
  APPROACH_PLACE : phase APPROACH_PLACE (idx 470〜512) の中で PLACE と差がいちばん大きい姿勢
  PLACE          : PLACE phase の中の最後の open の印 (idx 552)
APPROACH_PICK の範囲を全部「ブロックの上」に, PICK の範囲を全部「つかむ」にそろえれば, どの idx が選ばれても同じ姿勢になる.
箱の側の 2 つ (APPROACH_PLACE・PLACE) と, phases・gripper_events・key_log はそのまま.

姿勢は tools/gamepad_teleop.py の記録 runs/experiments/gamepad_teleop/teleop_20261109_093620/log.jsonl の実測から取った:
  つかむ      = 爪を閉じた (×) ときに読んだ角度 [-40.51, 79.98, -0.43, 0.43, -73.47, -29.97]
  ブロックの上 = つかんだまま j1 を十字キーの上で上げて止めた角度 (seq 169 の measured_after_halt) [-40.69, 66.09, 1.49, 0.61, -70.48, -29.88]
"""
import json, copy
src = "runs/run_pick_place/run_0001_20261109_093045/teach/drag_v2_20221013_144348.json"
d = json.load(open(src)); n = copy.deepcopy(d)
pick = [-40.51, 79.98, -0.43, 0.43, -73.47, -29.97]   # teleop_20261109_093620 で爪を閉じた姿勢 (実測)
appr = [-40.69, 66.09, 1.49, 0.61, -70.48, -29.88]    # 同じ記録で j1 を上げて持ち上げた姿勢 (実測)
for i in range(240, 291): n['angles'][i] = list(appr)
for i in range(291, 470): n['angles'][i] = list(pick)
n['recorded_at'] = "2026-11-09T09:42:22"
n['derived_from'] = {"teach": "drag_v2_20221013_144348.json", "replaced": {"APPROACH_PICK idx 240-290": appr, "PICK idx 291-469": pick},
 "source": "runs/experiments/gamepad_teleop/teleop_20261109_093620/log.jsonl (seq 161 付近の実測・seq 169 の持ち上げ後の実測)",
 "reason": "位置1の教えた PICK が浅かった (183454 で 38.9px, 20261109_093045 で 43.4px)。ゲームパッドで奥までつかむ姿勢を作り直した。箱側の 2 姿勢は元のまま"}
out = "mecharm_calibration/teach_poses_20261109/drag_v2_20261109_094222.json"
json.dump(n, open(out, "w"), ensure_ascii=False, indent=1); print(out)
```

### ゲームパッドの記録（runs/experiments/gamepad_teleop/teleop_20261109_093620/meta.json）

```json
{
  "run_stem": "teleop_20261109_093620",
  "started_at": "2026-11-09T09:36:20",
  "execute": true,
  "argv": [
    "tools/gamepad_teleop.py",
    "--execute"
  ],
  "controllers": [
    {
      "name": "PS4 Controller",
      "guid": "03008fe54c050000cc09000000016800",
      "instance_id": 0,
      "axes": 6,
      "buttons": 16,
      "hats": 0,
      "connected_at": "2026-11-09T09:36:25"
    }
  ],
  "python": "3.12.12 | packaged by conda-forge | (main, Oct 22 2025, 23:34:53) [Clang 19.1.7 ]",
  "pygame": "2.6.1",
  "sdl": "2.28.4",
  "platform": "macOS-26.6.2-arm64-arm-64bit",
  "start_pose": [
    0.0,
    1.49,
    1.75,
    0.26,
    -0.26,
    -30.23
  ],
  "guards": {
    "J1_MAX_DEG": 90.87,
    "range": "physical_limits (no base window. 2026-11-03)",
    "J4_SAFE": [
      -90.0,
      60.0
    ],
    "JOINT_LIMITS": [
      [
        -156.0,
        161.0
      ],
      [
        -79.0,
        123.0
      ],
      [
        -177.0,
        177.0
      ],
      [
        -156.0,
        162.0
      ],
      [
        -118.0,
        118.0
      ],
      [
        -177.0,
        178.0
      ]
    ],
    "window": {
      "lo": [
        -156.0,
        -79.0,
        -177.0,
        -156.0,
        -90.0,
        -177.0
      ],
      "hi": [
        161.0,
        90.87,
        177.0,
        162.0,
        60.0,
        178.0
      ]
    },
    "home_bypasses_range_check": true
  },
  "motion": {
    "speed": 20,
    "step_fine_deg": 1.0,
    "step_coarse_deg": 2.0,
    "reach_tol_deg": 3.0,
    "reach_timeout_min_sec": 8.0,
    "poll_sec": 0.3,
    "gripper_sleep_sec": 0.8,
    "grip_close_value": 20,
    "send_wait": 0.0,
    "home": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      -30.0
    ],
    "home_hold_sec": 1.0,
    "trigger_stop_above": 0.0,
    "hold_start_sec": 0.4,
    "hold_interval_sec": 0.1,
    "hold_ahead_deg": 15.0,
    "hold_stall_sec": 1.5,
    "ignored_check_sec": 0.5,
    "ignored_max_resends": 3,
    "j0_left_sign": -1.0,
    "up_sign": -1.0,
    "select_order": [
      1,
      2,
      3,
      4,
      5
    ]
  },
  "button_map": {
    "0": "cross",
    "1": "circle",
    "2": "square",
    "3": "triangle",
    "4": "share",
    "5": "home",
    "6": "options",
    "7": "l3",
    "8": "r3",
    "9": "l1",
    "10": "r1",
    "11": "dpad_up",
    "12": "dpad_down",
    "13": "dpad_left",
    "14": "dpad_right",
    "15": "touchpad"
  },
  "git": {
    "commit": "23ed9141636c183562da3fe515d0fb0b374530d5",
    "script_status": "clean"
  },
  "script_copy": "gamepad_teleop.py",
  "script_sha256": "d211064093ab547bb9dac15dfaa53c49c8de77f1ce1b22cf58442fde253dd259",
  "ended_at": "2026-11-09T09:42:32",
  "end_reason": "ctrl_c",
  "n_sent": 61
}
```

### ゲームパッドの記録（runs/experiments/gamepad_teleop/teleop_20261109_093620/log.jsonl・170行）

```json
{"seq": 1, "t": "2026-11-09T09:36:56.220", "t_unix": 1794184616.22, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -15.0, "hold_id": 1, "hold_n": 1, "held_sec": 0.407, "accepted": true, "measured_before": [0.0, 1.49, 1.75, 0.26, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 0.0, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-15.0, 1.49, 1.75, 0.26, -0.26, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184616.2420459, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 2, "t": "2026-11-09T09:36:56.391", "t_unix": 1794184616.392, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -15.0, "hold_id": 1, "hold_n": 2, "held_sec": 0.578, "accepted": true, "measured_before": [0.0, 2.37, 2.02, 0.26, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 15.0, "sent": false, "why": "lead_ok", "hold_remaining_deg": 15.0, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 3, "t": "2026-11-09T09:36:56.494", "t_unix": 1794184616.495, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -15.0, "hold_id": 1, "hold_n": 3, "held_sec": 0.681, "accepted": true, "measured_before": [-3.51, 2.37, 2.63, 0.26, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 11.49, "sent": false, "why": "lead_ok", "hold_remaining_deg": 11.49, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 4, "t": "2026-11-09T09:36:56.596", "t_unix": 1794184616.597, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -15.0, "hold_id": 1, "hold_n": 4, "held_sec": 0.783, "accepted": true, "measured_before": [-7.38, 2.37, 2.63, 0.26, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 7.62, "sent": false, "why": "lead_ok", "hold_remaining_deg": 7.62, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 5, "t": "2026-11-09T09:36:56.699", "t_unix": 1794184616.699, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -15.0, "hold_id": 1, "hold_n": 5, "held_sec": 0.886, "accepted": true, "measured_before": [-14.85, 2.37, 2.63, 0.17, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 0.15, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-29.85, 1.49, 1.75, 0.26, -0.26, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184616.883944, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 6, "t": "2026-11-09T09:36:56.987", "t_unix": 1794184616.988, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -15.0, "hold_id": 1, "hold_n": 6, "held_sec": 1.174, "accepted": true, "released_during_job": true, "measured_before": [-14.85, 2.37, 2.63, 0.17, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 15.0, "sent": false, "why": "lead_ok", "hold_remaining_deg": 15.0, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 7, "t": "2026-11-09T09:36:57.021", "t_unix": 1794184617.022, "button": null, "button_name": null, "kind": "halt", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 1, "halt_joint": 0, "measured_at_request": [-14.85, 2.37, 2.63, 0.17, -0.26, -30.23], "t_halt": 1794184617.022624, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-19.33, 2.37, 2.63, 0.17, -0.26, -30.23], "moved_after_request_deg": [-4.48, 0.0, 0.0, 0.0, 0.0, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 8, "t": "2026-11-09T09:36:57.463", "t_unix": 1794184617.464, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -1.0, "hold_id": 2, "hold_n": 0, "accepted": true, "measured_before": [-29.53, 2.37, 2.63, 0.08, -0.26, -30.23], "start_source": "measured", "others_from_measured": [], "cmd_gap_deg": 10.2, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-30.53, 1.49, 1.75, 0.26, -0.26, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184617.53143, "measured_before_send": [-29.44, 2.37, 2.63, 0.08, -0.26, -30.23], "resends": [], "reached": true, "reached_angles": [-30.93, 2.37, 2.63, 0.0, -0.26, -30.23], "reach_err": 0.88, "elapsed_sec": 0.09, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 9, "t": "2026-11-09T09:36:58.584", "t_unix": 1794184618.585, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -15.0, "hold_id": 3, "hold_n": 1, "held_sec": 0.408, "accepted": true, "measured_before": [-30.23, 2.37, 2.63, 0.0, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 0.3, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-45.23, 1.49, 1.75, 0.26, -0.26, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184618.615581, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 10, "t": "2026-11-09T09:36:58.754", "t_unix": 1794184618.754, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -15.0, "hold_id": 3, "hold_n": 2, "held_sec": 0.578, "accepted": true, "measured_before": [-30.67, 2.37, 2.63, 0.0, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 14.56, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.56, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 11, "t": "2026-11-09T09:36:58.856", "t_unix": 1794184618.857, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -15.0, "hold_id": 3, "hold_n": 3, "held_sec": 0.68, "accepted": true, "released_during_job": true, "measured_before": [-39.11, 2.37, 2.63, -0.08, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 6.12, "sent": false, "why": "lead_ok", "hold_remaining_deg": 6.12, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 12, "t": "2026-11-09T09:36:59.009", "t_unix": 1794184619.01, "button": null, "button_name": null, "kind": "halt", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 3, "halt_joint": 0, "measured_at_request": [-30.67, 2.37, 2.63, 0.0, -0.26, -30.23], "t_halt": 1794184619.009944, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-42.62, 3.25, 3.25, -0.08, 0.7, -30.23], "moved_after_request_deg": [-11.95, 0.88, 0.62, -0.08, 0.96, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 13, "t": "2026-11-09T09:37:14.578", "t_unix": 1794184634.579, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 1.0, "hold_id": 4, "hold_n": 0, "accepted": true, "measured_before": [-41.74, 3.33, 3.6, -0.08, -1.05, -30.23], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 1.85, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-42.62, 2.49, 1.75, 0.26, -0.26, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184634.624033, "measured_before_send": [-41.74, 3.33, 3.6, -0.08, -1.05, -30.23], "resends": [0.36, 0.69], "reached": false, "not_moved": true, "reached_angles": [-44.64, 3.33, 3.6, -0.08, -1.05, -30.23], "reach_err": 2.02, "elapsed_sec": 1.03, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 14, "t": "2026-11-09T09:37:16.205", "t_unix": 1794184636.206, "button": 14, "button_name": "dpad_right", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": 1.0, "hold_id": 5, "hold_n": 0, "accepted": true, "measured_before": [-44.64, 3.33, 3.6, -0.08, -1.05, -30.23], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 2.02, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, 2.49, 1.75, 0.26, -0.26, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184636.266114, "measured_before_send": [-44.64, 3.33, 3.6, -0.08, -1.05, -30.23], "resends": [], "reached": true, "reached_angles": [-42.01, 3.33, 3.6, -0.08, -1.05, -30.23], "reach_err": 1.85, "elapsed_sec": 0.1, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 15, "t": "2026-11-09T09:37:17.055", "t_unix": 1794184637.056, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": -1.0, "hold_id": 6, "hold_n": 0, "accepted": true, "measured_before": [-41.3, 3.33, 3.6, -0.08, -1.05, -30.23], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 1.85, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, 1.49, 1.75, 0.26, -0.26, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184637.0877419, "measured_before_send": [-41.3, 3.33, 3.6, -0.08, -1.05, -30.23], "resends": [], "reached": false, "settled": true, "reached_angles": [-41.3, 2.72, 3.6, -0.08, -1.05, -30.23], "reach_err": 1.85, "elapsed_sec": 0.49, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 16, "t": "2026-11-09T09:37:18.141", "t_unix": 1794184638.142, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": -15.0, "hold_id": 7, "hold_n": 1, "held_sec": 0.407, "accepted": true, "released_during_job": true, "measured_before": [-41.3, 2.72, 3.6, -0.08, -1.05, -30.23], "start_source": "hold", "cmd_gap_deg": 1.85, "hold_lead_deg": 1.23, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, -12.28, 1.75, 0.26, -0.26, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184638.17218, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 17, "t": "2026-11-09T09:37:18.315", "t_unix": 1794184638.316, "button": null, "button_name": null, "kind": "halt", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "released_while_sending", "hold_id": 7, "halt_joint": 1, "measured_at_request": [-41.3, 2.72, 3.6, -0.08, -1.05, -30.23], "t_halt": 1794184638.316492, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-41.22, -0.79, 3.6, -0.08, -1.05, -30.23], "moved_after_request_deg": [0.08, -3.51, 0.0, 0.0, 0.0, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 18, "t": "2026-11-09T09:37:19.303", "t_unix": 1794184639.303, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": -1.0, "hold_id": 8, "hold_n": 0, "accepted": true, "measured_before": [-41.3, -0.79, 3.6, -0.08, -1.05, -30.23], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 1.85, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, -1.79, 1.75, 0.26, -0.26, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184639.3372438, "measured_before_send": [-41.3, -0.79, 3.6, -0.08, -1.05, -30.23], "resends": [0.36, 0.71], "reached": false, "not_moved": true, "reached_angles": [-41.3, -0.79, 3.6, -0.08, -1.05, -30.23], "reach_err": 1.85, "elapsed_sec": 1.03, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 19, "t": "2026-11-09T09:37:26.816", "t_unix": 1794184646.817, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 2, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 20, "t": "2026-11-09T09:37:28.127", "t_unix": 1794184648.127, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 9, "hold_n": 1, "held_sec": 0.41, "accepted": true, "measured_before": [-41.3, -0.79, 3.6, -0.08, -0.61, -30.23], "start_source": "hold", "cmd_gap_deg": 1.0, "hold_lead_deg": 1.85, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, -1.79, -11.4, 0.26, -0.26, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184648.149725, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 21, "t": "2026-11-09T09:37:28.228", "t_unix": 1794184648.228, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 9, "hold_n": 2, "held_sec": 0.511, "accepted": true, "released_during_job": true, "measured_before": [-41.3, -0.79, 1.66, -0.08, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 1.0, "hold_lead_deg": 13.06, "sent": false, "why": "lead_ok", "hold_remaining_deg": 13.06, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 22, "t": "2026-11-09T09:37:28.381", "t_unix": 1794184648.382, "button": null, "button_name": null, "kind": "halt", "selected_joint": 2, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 9, "halt_joint": 2, "measured_at_request": [-41.3, -0.79, 3.6, -0.08, -0.61, -30.23], "t_halt": 1794184648.382211, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-41.3, -0.08, -0.08, -0.08, 1.14, -30.23], "moved_after_request_deg": [0.0, 0.71, -3.68, 0.0, 1.75, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 23, "t": "2026-11-09T09:37:29.821", "t_unix": 1794184649.822, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 15.0, "hold_id": 10, "hold_n": 1, "held_sec": 0.408, "accepted": true, "measured_before": [-41.3, 0.26, 0.61, 0.0, 1.58, -30.23], "start_source": "hold", "cmd_gap_deg": 2.05, "hold_lead_deg": 0.69, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, -1.79, 15.61, 0.26, -0.26, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184649.8426838, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 24, "t": "2026-11-09T09:37:30.008", "t_unix": 1794184650.008, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 15.0, "hold_id": 10, "hold_n": 2, "held_sec": 0.594, "accepted": true, "measured_before": [-41.3, -0.26, -1.23, 0.0, 1.58, -30.23], "start_source": "hold", "cmd_gap_deg": 1.84, "hold_lead_deg": 16.84, "sent": false, "why": "lead_ok", "hold_remaining_deg": 16.84, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 25, "t": "2026-11-09T09:37:30.110", "t_unix": 1794184650.111, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 15.0, "hold_id": 10, "hold_n": 3, "held_sec": 0.696, "accepted": true, "released_during_job": true, "measured_before": [-41.3, -0.61, -1.23, 0.0, 1.49, -30.23], "start_source": "hold", "cmd_gap_deg": 1.75, "hold_lead_deg": 16.84, "sent": false, "why": "lead_ok", "hold_remaining_deg": 16.84, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 26, "t": "2026-11-09T09:37:30.177", "t_unix": 1794184650.178, "button": null, "button_name": null, "kind": "halt", "selected_joint": 2, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 10, "halt_joint": 2, "measured_at_request": [-41.3, -0.26, -1.23, 0.0, 1.58, -30.23], "t_halt": 1794184650.1781068, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-41.3, 0.43, 4.04, 0.0, 3.16, -30.23], "moved_after_request_deg": [0.0, 0.69, 5.27, 0.0, 1.58, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 27, "t": "2026-11-09T09:37:31.211", "t_unix": 1794184651.212, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 15.0, "hold_id": 11, "hold_n": 1, "held_sec": 0.406, "accepted": true, "measured_before": [-41.48, 0.35, 3.95, 0.0, 3.16, -30.23], "start_source": "mixed", "cmd_gap_deg": 3.42, "hold_lead_deg": 0.09, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, -1.79, 18.95, 0.26, -0.26, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184651.227925, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 28, "t": "2026-11-09T09:37:31.364", "t_unix": 1794184651.364, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 15.0, "hold_id": 11, "hold_n": 2, "held_sec": 0.558, "accepted": true, "measured_before": [-41.48, -0.52, 4.39, 0.0, 1.93, -30.23], "start_source": "hold", "cmd_gap_deg": 2.19, "hold_lead_deg": 14.56, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.56, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 29, "t": "2026-11-09T09:37:31.466", "t_unix": 1794184651.467, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 15.0, "hold_id": 11, "hold_n": 3, "held_sec": 0.661, "accepted": true, "measured_before": [-41.48, -0.79, 9.93, -0.08, 1.05, -30.23], "start_source": "hold", "cmd_gap_deg": 1.31, "hold_lead_deg": 9.02, "sent": false, "why": "lead_ok", "hold_remaining_deg": 9.02, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 30, "t": "2026-11-09T09:37:31.552", "t_unix": 1794184651.552, "button": null, "button_name": null, "kind": "halt", "selected_joint": 2, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 11, "halt_joint": 2, "measured_at_request": [-41.48, -0.79, 9.93, -0.08, 1.05, -30.23], "t_halt": 1794184651.554263, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-41.57, -0.79, 18.8, -0.08, 1.05, -30.23], "moved_after_request_deg": [-0.09, 0.0, 8.87, 0.0, 0.0, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 31, "t": "2026-11-09T09:37:33.757", "t_unix": 1794184653.757, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 3, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 32, "t": "2026-11-09T09:37:34.266", "t_unix": 1794184654.266, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 4, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 33, "t": "2026-11-09T09:37:35.521", "t_unix": 1794184655.522, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 12, "hold_n": 1, "held_sec": 0.407, "accepted": true, "measured_before": [-41.57, -0.79, 19.86, -0.08, 0.96, -30.23], "start_source": "hold", "cmd_gap_deg": 1.06, "hold_lead_deg": 1.22, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, -1.79, 18.8, 0.26, -14.04, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184655.545368, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 34, "t": "2026-11-09T09:37:35.623", "t_unix": 1794184655.623, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 12, "hold_n": 2, "held_sec": 0.509, "accepted": true, "measured_before": [-41.57, -0.79, 19.86, -0.08, 0.87, -30.23], "start_source": "hold", "cmd_gap_deg": 1.06, "hold_lead_deg": 14.91, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.91, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 35, "t": "2026-11-09T09:37:35.725", "t_unix": 1794184655.725, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 12, "hold_n": 3, "held_sec": 0.611, "accepted": true, "measured_before": [-41.57, -0.79, 19.86, -0.08, -1.93, -30.23], "start_source": "hold", "cmd_gap_deg": 1.06, "hold_lead_deg": 12.11, "sent": false, "why": "lead_ok", "hold_remaining_deg": 12.11, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 36, "t": "2026-11-09T09:37:35.825", "t_unix": 1794184655.826, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 12, "hold_n": 4, "held_sec": 0.711, "accepted": true, "measured_before": [-41.57, -0.79, 19.86, -0.08, -5.97, -30.23], "start_source": "hold", "cmd_gap_deg": 1.06, "hold_lead_deg": 8.07, "sent": false, "why": "lead_ok", "hold_remaining_deg": 8.07, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 37, "t": "2026-11-09T09:37:35.928", "t_unix": 1794184655.928, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 12, "hold_n": 5, "held_sec": 0.813, "accepted": true, "measured_before": [-41.57, -0.79, 19.86, -0.08, -10.54, -30.23], "start_source": "hold", "cmd_gap_deg": 1.06, "hold_lead_deg": 3.5, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, -1.79, 18.8, 0.26, -25.54, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184655.95136, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 38, "t": "2026-11-09T09:37:36.029", "t_unix": 1794184656.029, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 12, "hold_n": 6, "held_sec": 0.915, "accepted": true, "measured_before": [-41.57, -0.79, 19.86, -0.08, -13.18, -30.23], "start_source": "hold", "cmd_gap_deg": 1.06, "hold_lead_deg": 12.36, "sent": false, "why": "lead_ok", "hold_remaining_deg": 12.36, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 39, "t": "2026-11-09T09:37:36.131", "t_unix": 1794184656.132, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 12, "hold_n": 7, "held_sec": 1.017, "accepted": true, "measured_before": [-41.57, -0.79, 19.86, -0.08, -13.44, -30.23], "start_source": "hold", "cmd_gap_deg": 1.06, "hold_lead_deg": 12.1, "sent": false, "why": "lead_ok", "hold_remaining_deg": 12.1, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 40, "t": "2026-11-09T09:37:36.233", "t_unix": 1794184656.233, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 12, "hold_n": 8, "held_sec": 1.118, "accepted": true, "measured_before": [-41.57, -0.79, 19.86, -0.08, -15.9, -30.23], "start_source": "hold", "cmd_gap_deg": 1.06, "hold_lead_deg": 9.64, "sent": false, "why": "lead_ok", "hold_remaining_deg": 9.64, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 41, "t": "2026-11-09T09:37:36.335", "t_unix": 1794184656.335, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 12, "hold_n": 9, "held_sec": 1.221, "accepted": true, "measured_before": [-41.57, -0.79, 19.86, -0.08, -20.74, -30.23], "start_source": "hold", "cmd_gap_deg": 1.06, "hold_lead_deg": 4.8, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, -1.79, 18.8, 0.26, -35.74, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184656.394691, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 42, "t": "2026-11-09T09:37:36.455", "t_unix": 1794184656.456, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 12, "hold_n": 10, "held_sec": 1.341, "accepted": true, "released_during_job": true, "measured_before": [-41.57, -0.79, 19.86, -0.08, -25.92, -30.23], "start_source": "hold", "cmd_gap_deg": 1.06, "hold_lead_deg": 9.82, "sent": false, "why": "lead_ok", "hold_remaining_deg": 9.82, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 43, "t": "2026-11-09T09:37:36.638", "t_unix": 1794184656.639, "button": null, "button_name": null, "kind": "halt", "selected_joint": 4, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 12, "halt_joint": 4, "measured_at_request": [-41.57, -0.79, 19.86, -0.08, -20.74, -30.23], "t_halt": 1794184656.6388428, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-41.57, -0.79, 19.86, -0.08, -30.14, -30.23], "moved_after_request_deg": [0.0, 0.0, 0.0, 0.0, -9.4, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 44, "t": "2026-11-09T09:37:39.471", "t_unix": 1794184659.471, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 5, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 45, "t": "2026-11-09T09:37:39.809", "t_unix": 1794184659.809, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 46, "t": "2026-11-09T09:37:40.265", "t_unix": 1794184660.265, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 2, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 47, "t": "2026-11-09T09:37:41.756", "t_unix": 1794184661.756, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 15.0, "hold_id": 13, "hold_n": 1, "held_sec": 0.404, "accepted": true, "measured_before": [-41.57, -0.79, 19.86, -0.08, -30.14, -30.23], "start_source": "hold", "cmd_gap_deg": 1.0, "hold_lead_deg": 1.06, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, -1.79, 34.86, 0.26, -30.14, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184661.77772, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 48, "t": "2026-11-09T09:37:41.858", "t_unix": 1794184661.859, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 15.0, "hold_id": 13, "hold_n": 2, "held_sec": 0.507, "accepted": true, "measured_before": [-41.57, -0.79, 19.86, -0.08, -30.49, -30.23], "start_source": "hold", "cmd_gap_deg": 1.0, "hold_lead_deg": 15.0, "sent": false, "why": "lead_ok", "hold_remaining_deg": 15.0, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 49, "t": "2026-11-09T09:37:41.960", "t_unix": 1794184661.961, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 15.0, "hold_id": 13, "hold_n": 3, "held_sec": 0.609, "accepted": true, "measured_before": [-41.57, -0.79, 20.65, -0.08, -30.93, -30.23], "start_source": "hold", "cmd_gap_deg": 1.0, "hold_lead_deg": 14.21, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.21, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 50, "t": "2026-11-09T09:37:42.062", "t_unix": 1794184662.063, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 15.0, "hold_id": 13, "hold_n": 4, "held_sec": 0.711, "accepted": true, "measured_before": [-41.57, -0.79, 25.13, -0.08, -31.11, -30.23], "start_source": "hold", "cmd_gap_deg": 1.0, "hold_lead_deg": 9.73, "sent": false, "why": "lead_ok", "hold_remaining_deg": 9.73, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 51, "t": "2026-11-09T09:37:42.164", "t_unix": 1794184662.165, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 15.0, "hold_id": 13, "hold_n": 5, "held_sec": 0.813, "accepted": true, "measured_before": [-41.57, -0.79, 29.61, -0.08, -31.11, -30.23], "start_source": "hold", "cmd_gap_deg": 1.0, "hold_lead_deg": 5.25, "sent": false, "why": "lead_ok", "hold_remaining_deg": 5.25, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 52, "t": "2026-11-09T09:37:42.266", "t_unix": 1794184662.266, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 15.0, "hold_id": 13, "hold_n": 6, "held_sec": 0.914, "accepted": true, "released_during_job": true, "measured_before": [-41.57, -0.79, 33.39, -0.08, -31.11, -30.23], "start_source": "hold", "cmd_gap_deg": 1.0, "hold_lead_deg": 1.47, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, -1.79, 48.39, 0.26, -30.14, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184662.298065, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 53, "t": "2026-11-09T09:37:42.334", "t_unix": 1794184662.334, "button": null, "button_name": null, "kind": "halt", "selected_joint": 2, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 13, "halt_joint": 2, "measured_at_request": [-41.57, -0.79, 29.61, -0.08, -31.11, -30.23], "t_halt": 1794184662.3342578, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-41.57, 0.0, 36.21, 0.0, -29.53, -30.23], "moved_after_request_deg": [0.0, 0.79, 6.6, 0.08, 1.58, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 54, "t": "2026-11-09T09:37:44.650", "t_unix": 1794184664.65, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 3, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 55, "t": "2026-11-09T09:37:44.956", "t_unix": 1794184664.957, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 4, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 56, "t": "2026-11-09T09:37:45.228", "t_unix": 1794184665.229, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 5, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 57, "t": "2026-11-09T09:37:45.616", "t_unix": 1794184665.616, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 58, "t": "2026-11-09T09:37:47.176", "t_unix": 1794184667.177, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 14, "hold_n": 1, "held_sec": 0.409, "accepted": true, "measured_before": [-41.57, 0.0, 36.21, 0.0, -29.53, -30.23], "start_source": "hold", "cmd_gap_deg": 0.61, "hold_lead_deg": 1.79, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, 15.0, 36.21, 0.26, -30.14, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184667.19538, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 59, "t": "2026-11-09T09:37:47.348", "t_unix": 1794184667.349, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 14, "hold_n": 2, "held_sec": 0.581, "accepted": true, "measured_before": [-41.57, 0.26, 36.21, 0.0, -30.93, -30.23], "start_source": "hold", "cmd_gap_deg": 0.79, "hold_lead_deg": 14.74, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.74, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 60, "t": "2026-11-09T09:37:47.452", "t_unix": 1794184667.452, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 14, "hold_n": 3, "held_sec": 0.684, "accepted": true, "measured_before": [-41.57, 3.77, 36.21, 0.0, -30.93, -30.23], "start_source": "hold", "cmd_gap_deg": 0.79, "hold_lead_deg": 11.23, "sent": false, "why": "lead_ok", "hold_remaining_deg": 11.23, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 61, "t": "2026-11-09T09:37:47.554", "t_unix": 1794184667.555, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 14, "hold_n": 4, "held_sec": 0.787, "accepted": true, "measured_before": [-41.57, 8.52, 36.21, 0.0, -30.93, -30.23], "start_source": "hold", "cmd_gap_deg": 0.79, "hold_lead_deg": 6.48, "sent": false, "why": "lead_ok", "hold_remaining_deg": 6.48, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 62, "t": "2026-11-09T09:37:47.656", "t_unix": 1794184667.657, "button": null, "button_name": null, "kind": "halt", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 14, "halt_joint": 1, "measured_at_request": [-41.57, 8.52, 36.21, 0.0, -30.93, -30.23], "t_halt": 1794184667.658096, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-41.57, 14.94, 36.56, 0.0, -29.53, -30.23], "moved_after_request_deg": [0.0, 6.42, 0.35, 0.0, 1.4, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 63, "t": "2026-11-09T09:37:50.232", "t_unix": 1794184670.232, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 2, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 64, "t": "2026-11-09T09:37:51.355", "t_unix": 1794184671.355, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 15, "hold_n": 1, "held_sec": 0.406, "accepted": true, "measured_before": [-41.57, 14.94, 36.65, 0.0, -29.53, -30.23], "start_source": "hold", "cmd_gap_deg": 0.61, "hold_lead_deg": 0.44, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, 14.94, 21.65, 0.26, -30.14, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184671.385298, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 65, "t": "2026-11-09T09:37:51.457", "t_unix": 1794184671.458, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 15, "hold_n": 2, "held_sec": 0.509, "accepted": true, "measured_before": [-41.57, 15.11, 36.65, 0.0, -29.88, -30.23], "start_source": "hold", "cmd_gap_deg": 0.26, "hold_lead_deg": 15.0, "sent": false, "why": "lead_ok", "hold_remaining_deg": 15.0, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 66, "t": "2026-11-09T09:37:51.574", "t_unix": 1794184671.575, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 15, "hold_n": 3, "held_sec": 0.626, "accepted": true, "measured_before": [-41.57, 15.2, 35.94, 0.0, -30.14, -30.23], "start_source": "hold", "cmd_gap_deg": 0.26, "hold_lead_deg": 14.29, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.29, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 67, "t": "2026-11-09T09:37:51.675", "t_unix": 1794184671.676, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 15, "hold_n": 4, "held_sec": 0.727, "accepted": true, "measured_before": [-41.57, 15.2, 32.16, 0.0, -30.14, -30.23], "start_source": "hold", "cmd_gap_deg": 0.26, "hold_lead_deg": 10.51, "sent": false, "why": "lead_ok", "hold_remaining_deg": 10.51, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 68, "t": "2026-11-09T09:37:51.777", "t_unix": 1794184671.778, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 15, "hold_n": 5, "held_sec": 0.828, "accepted": true, "measured_before": [-41.57, 15.2, 27.86, 0.0, -30.14, -30.23], "start_source": "hold", "cmd_gap_deg": 0.26, "hold_lead_deg": 6.21, "sent": false, "why": "lead_ok", "hold_remaining_deg": 6.21, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 69, "t": "2026-11-09T09:37:51.863", "t_unix": 1794184671.863, "button": null, "button_name": null, "kind": "halt", "selected_joint": 2, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 15, "halt_joint": 2, "measured_at_request": [-41.57, 15.2, 27.86, 0.0, -30.14, -30.23], "t_halt": 1794184671.8636181, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-41.57, 15.2, 23.02, 0.0, -30.14, -30.23], "moved_after_request_deg": [0.0, 0.0, -4.84, 0.0, 0.0, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 70, "t": "2026-11-09T09:37:53.649", "t_unix": 1794184673.65, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 3, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 71, "t": "2026-11-09T09:37:53.919", "t_unix": 1794184673.92, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 4, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 72, "t": "2026-11-09T09:37:55.713", "t_unix": 1794184675.714, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 16, "hold_n": 1, "held_sec": 0.407, "accepted": true, "released_during_job": true, "measured_before": [-41.57, 15.29, 23.02, 0.0, -31.2, -30.23], "start_source": "hold", "cmd_gap_deg": 0.35, "hold_lead_deg": 1.06, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, 14.94, 23.02, 0.26, -46.2, -30.23], "sent": false, "why": "halted_before_send", "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 73, "t": "2026-11-09T09:37:56.615", "t_unix": 1794184676.615, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 17, "hold_n": 1, "held_sec": 0.407, "accepted": true, "measured_before": [-41.57, 15.29, 23.02, 0.0, -31.2, -30.23], "start_source": "hold", "cmd_gap_deg": 0.35, "hold_lead_deg": 1.06, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, 14.94, 23.02, 0.26, -46.2, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184676.6399848, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 74, "t": "2026-11-09T09:37:56.717", "t_unix": 1794184676.717, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 17, "hold_n": 2, "held_sec": 0.509, "accepted": true, "measured_before": [-41.57, 15.29, 23.02, 0.0, -31.28, -30.23], "start_source": "hold", "cmd_gap_deg": 0.35, "hold_lead_deg": 14.92, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.92, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 75, "t": "2026-11-09T09:37:56.819", "t_unix": 1794184676.819, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 17, "hold_n": 3, "held_sec": 0.611, "accepted": true, "released_during_job": true, "measured_before": [-41.57, 15.29, 23.02, 0.0, -31.28, -30.23], "start_source": "hold", "cmd_gap_deg": 0.35, "hold_lead_deg": 14.92, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.92, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 76, "t": "2026-11-09T09:37:56.903", "t_unix": 1794184676.904, "button": null, "button_name": null, "kind": "halt", "selected_joint": 4, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 17, "halt_joint": 4, "measured_at_request": [-41.57, 15.29, 23.02, 0.0, -31.28, -30.23], "t_halt": 1794184676.904149, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-41.57, 16.08, 23.37, 0.17, -36.91, -30.23], "moved_after_request_deg": [0.0, 0.79, 0.35, 0.17, -5.63, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 77, "t": "2026-11-09T09:37:58.070", "t_unix": 1794184678.071, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 18, "hold_n": 1, "held_sec": 0.403, "accepted": true, "measured_before": [-41.57, 16.17, 23.81, 0.08, -36.03, -30.23], "start_source": "hold", "cmd_gap_deg": 1.23, "hold_lead_deg": 0.88, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, 14.94, 23.02, 0.26, -51.03, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184678.085404, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 78, "t": "2026-11-09T09:37:58.186", "t_unix": 1794184678.187, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 18, "hold_n": 2, "held_sec": 0.519, "accepted": true, "measured_before": [-41.57, 16.17, 23.81, 0.08, -37.44, -30.23], "start_source": "hold", "cmd_gap_deg": 1.23, "hold_lead_deg": 13.59, "sent": false, "why": "lead_ok", "hold_remaining_deg": 13.59, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 79, "t": "2026-11-09T09:37:58.288", "t_unix": 1794184678.289, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 18, "hold_n": 3, "held_sec": 0.622, "accepted": true, "released_during_job": true, "measured_before": [-41.57, 16.17, 23.81, 0.08, -40.78, -30.23], "start_source": "hold", "cmd_gap_deg": 1.23, "hold_lead_deg": 10.25, "sent": false, "why": "lead_ok", "hold_remaining_deg": 10.25, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 80, "t": "2026-11-09T09:37:58.357", "t_unix": 1794184678.358, "button": null, "button_name": null, "kind": "halt", "selected_joint": 4, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 18, "halt_joint": 4, "measured_at_request": [-41.57, 16.17, 23.81, 0.08, -37.44, -30.23], "t_halt": 1794184678.359498, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-41.57, 16.08, 23.81, 0.08, -48.33, -30.23], "moved_after_request_deg": [0.0, -0.09, 0.0, 0.0, -10.89, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 81, "t": "2026-11-09T09:37:59.886", "t_unix": 1794184679.886, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 19, "hold_n": 1, "held_sec": 0.405, "accepted": true, "measured_before": [-41.57, 16.08, 23.37, 0.08, -48.6, -30.23], "start_source": "hold", "cmd_gap_deg": 1.14, "hold_lead_deg": 0.27, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, 14.94, 23.02, 0.26, -63.6, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184679.9095669, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 82, "t": "2026-11-09T09:38:00.072", "t_unix": 1794184680.072, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 19, "hold_n": 2, "held_sec": 0.591, "accepted": true, "measured_before": [-41.57, 16.08, 23.37, 0.08, -56.86, -30.23], "start_source": "hold", "cmd_gap_deg": 1.14, "hold_lead_deg": 6.74, "sent": false, "why": "lead_ok", "hold_remaining_deg": 6.74, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 83, "t": "2026-11-09T09:38:00.258", "t_unix": 1794184680.258, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 19, "hold_n": 3, "held_sec": 0.777, "accepted": true, "released_during_job": true, "measured_before": [-41.57, 16.08, 23.37, 0.08, -59.23, -30.23], "start_source": "hold", "cmd_gap_deg": 1.14, "hold_lead_deg": 4.37, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, 14.94, 23.02, 0.26, -74.23, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184680.285792, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 84, "t": "2026-11-09T09:38:00.326", "t_unix": 1794184680.326, "button": null, "button_name": null, "kind": "halt", "selected_joint": 4, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 19, "halt_joint": 4, "measured_at_request": [-41.57, 16.08, 23.37, 0.08, -56.86, -30.23], "t_halt": 1794184680.3264132, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-41.57, 17.05, 23.99, 0.17, -60.82, -30.23], "moved_after_request_deg": [0.0, 0.97, 0.62, 0.09, -3.96, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 85, "t": "2026-11-09T09:38:01.408", "t_unix": 1794184681.409, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 20, "hold_n": 1, "held_sec": 0.407, "accepted": true, "measured_before": [-41.57, 17.05, 24.08, 0.26, -60.64, -30.23], "start_source": "hold", "cmd_gap_deg": 2.11, "hold_lead_deg": 0.18, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, 14.94, 23.02, 0.26, -75.64, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184681.429373, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 86, "t": "2026-11-09T09:38:01.511", "t_unix": 1794184681.511, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 20, "hold_n": 2, "held_sec": 0.509, "accepted": true, "measured_before": [-41.57, 16.69, 24.08, 0.26, -60.73, -30.23], "start_source": "hold", "cmd_gap_deg": 1.75, "hold_lead_deg": 14.91, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.91, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 87, "t": "2026-11-09T09:38:01.612", "t_unix": 1794184681.612, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 4, "step_deg": 1.0, "execute": true, "joint": 4, "delta": -15.0, "hold_id": 20, "hold_n": 3, "held_sec": 0.611, "accepted": true, "released_during_job": true, "measured_before": [-41.57, 16.08, 23.46, 0.26, -63.72, -30.23], "start_source": "hold", "cmd_gap_deg": 1.14, "hold_lead_deg": 11.92, "sent": false, "why": "lead_ok", "hold_remaining_deg": 11.92, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 88, "t": "2026-11-09T09:38:01.646", "t_unix": 1794184681.647, "button": null, "button_name": null, "kind": "halt", "selected_joint": 4, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 20, "halt_joint": 4, "measured_at_request": [-41.57, 16.69, 24.08, 0.26, -60.73, -30.23], "t_halt": 1794184681.648274, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-41.57, 16.96, 23.9, 0.26, -65.21, -30.23], "moved_after_request_deg": [0.0, 0.27, -0.18, 0.0, -4.48, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 89, "t": "2026-11-09T09:38:01.917", "t_unix": 1794184681.917, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 5, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 90, "t": "2026-11-09T09:38:02.207", "t_unix": 1794184682.207, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 91, "t": "2026-11-09T09:38:03.711", "t_unix": 1794184683.712, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 21, "hold_n": 1, "held_sec": 0.406, "accepted": true, "measured_before": [-41.57, 17.05, 24.08, 0.26, -64.86, -30.23], "start_source": "hold", "cmd_gap_deg": 1.06, "hold_lead_deg": 2.11, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, 32.05, 23.02, 0.26, -65.21, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184683.7301602, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 92, "t": "2026-11-09T09:38:03.813", "t_unix": 1794184683.814, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 21, "hold_n": 2, "held_sec": 0.508, "accepted": true, "measured_before": [-41.57, 16.61, 23.99, 0.26, -65.91, -30.23], "start_source": "hold", "cmd_gap_deg": 0.97, "hold_lead_deg": 15.44, "sent": false, "why": "lead_ok", "hold_remaining_deg": 15.44, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 93, "t": "2026-11-09T09:38:03.916", "t_unix": 1794184683.916, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 21, "hold_n": 3, "held_sec": 0.61, "accepted": true, "measured_before": [-41.57, 17.75, 23.11, 0.26, -69.16, -30.23], "start_source": "mixed", "cmd_gap_deg": 3.95, "hold_lead_deg": 14.3, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.3, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 94, "t": "2026-11-09T09:38:04.019", "t_unix": 1794184684.019, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 21, "hold_n": 4, "held_sec": 0.713, "accepted": true, "measured_before": [-41.57, 22.5, 23.02, 0.26, -69.16, -30.23], "start_source": "mixed", "cmd_gap_deg": 3.95, "hold_lead_deg": 9.55, "sent": false, "why": "lead_ok", "hold_remaining_deg": 9.55, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 95, "t": "2026-11-09T09:38:04.104", "t_unix": 1794184684.104, "button": null, "button_name": null, "kind": "halt", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 21, "halt_joint": 1, "measured_at_request": [-41.57, 22.5, 23.02, 0.26, -69.16, -30.23], "t_halt": 1794184684.1045709, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-41.66, 28.38, 23.64, 0.35, -67.58, -30.23], "moved_after_request_deg": [-0.09, 5.88, 0.62, 0.09, 1.58, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 96, "t": "2026-11-09T09:38:05.073", "t_unix": 1794184685.074, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 22, "hold_n": 1, "held_sec": 0.407, "accepted": true, "measured_before": [-41.66, 28.38, 23.64, 0.35, -67.58, -30.23], "start_source": "hold", "cmd_gap_deg": 2.37, "hold_lead_deg": 0.0, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.62, 43.38, 23.02, 0.26, -65.21, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184685.093954, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 97, "t": "2026-11-09T09:38:05.176", "t_unix": 1794184685.177, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 22, "hold_n": 2, "held_sec": 0.51, "accepted": true, "measured_before": [-41.66, 32.6, 23.29, 0.35, -68.11, -30.23], "start_source": "hold", "cmd_gap_deg": 2.9, "hold_lead_deg": 10.78, "sent": false, "why": "lead_ok", "hold_remaining_deg": 10.78, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 98, "t": "2026-11-09T09:38:05.362", "t_unix": 1794184685.362, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 22, "hold_n": 3, "held_sec": 0.696, "accepted": true, "measured_before": [-41.66, 34.45, 23.29, 0.35, -68.11, -30.23], "start_source": "hold", "cmd_gap_deg": 2.9, "hold_lead_deg": 8.93, "sent": false, "why": "lead_ok", "hold_remaining_deg": 8.93, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 99, "t": "2026-11-09T09:38:05.464", "t_unix": 1794184685.465, "button": null, "button_name": null, "kind": "halt", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 22, "halt_joint": 1, "measured_at_request": [-41.66, 34.45, 23.29, 0.35, -68.11, -30.23], "t_halt": 1794184685.465099, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-41.66, 41.57, 23.73, 0.35, -66.62, -30.23], "moved_after_request_deg": [0.0, 7.12, 0.44, 0.0, 1.49, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 100, "t": "2026-11-09T09:38:08.410", "t_unix": 1794184688.411, "button": 14, "button_name": "dpad_right", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": 1.0, "hold_id": 23, "hold_n": 0, "accepted": true, "measured_before": [-41.66, 41.57, 23.73, 0.35, -66.62, -30.23], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 1.41, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 41.57, 23.02, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184688.451493, "measured_before_send": [-41.66, 41.57, 23.73, 0.35, -66.62, -30.23], "resends": [], "reached": true, "reached_angles": [-40.34, 42.53, 23.02, 0.43, -68.2, -30.23], "reach_err": 2.99, "elapsed_sec": 0.1, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 101, "t": "2026-11-09T09:39:43.918", "t_unix": 1794184783.918, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 24, "hold_n": 1, "held_sec": 0.408, "accepted": true, "measured_before": [-40.42, 42.53, 22.93, 0.52, -70.83, -30.23], "start_source": "mixed", "cmd_gap_deg": 5.62, "hold_lead_deg": 0.96, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 57.53, 23.02, 0.26, -65.21, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184783.942257, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 102, "t": "2026-11-09T09:39:44.020", "t_unix": 1794184784.021, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 24, "hold_n": 2, "held_sec": 0.511, "accepted": true, "measured_before": [-40.42, 42.62, 22.93, 0.52, -70.83, -30.23], "start_source": "mixed", "cmd_gap_deg": 5.62, "hold_lead_deg": 14.91, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.91, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 103, "t": "2026-11-09T09:39:44.122", "t_unix": 1794184784.122, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 24, "hold_n": 3, "held_sec": 0.612, "accepted": true, "measured_before": [-40.42, 44.47, 22.93, 0.52, -70.83, -30.23], "start_source": "mixed", "cmd_gap_deg": 5.62, "hold_lead_deg": 13.06, "sent": false, "why": "lead_ok", "hold_remaining_deg": 13.06, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 104, "t": "2026-11-09T09:39:44.222", "t_unix": 1794184784.223, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 24, "hold_n": 4, "held_sec": 0.713, "accepted": true, "released_during_job": true, "measured_before": [-40.42, 48.25, 22.93, 0.52, -70.75, -30.23], "start_source": "mixed", "cmd_gap_deg": 5.54, "hold_lead_deg": 9.28, "sent": false, "why": "lead_ok", "hold_remaining_deg": 9.28, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 105, "t": "2026-11-09T09:39:44.291", "t_unix": 1794184784.292, "button": null, "button_name": null, "kind": "halt", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 24, "halt_joint": 1, "measured_at_request": [-40.42, 44.47, 22.93, 0.52, -70.83, -30.23], "t_halt": 1794184784.292265, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-40.42, 54.31, 23.11, 0.61, -69.08, -30.23], "moved_after_request_deg": [0.0, 9.84, 0.18, 0.09, 1.75, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 106, "t": "2026-11-09T09:39:46.262", "t_unix": 1794184786.263, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 1.0, "hold_id": 25, "hold_n": 0, "accepted": true, "measured_before": [-40.42, 54.31, 23.11, 0.61, -69.08, -30.23], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 3.87, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 55.31, 23.02, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184786.3015418, "measured_before_send": [-40.42, 54.31, 23.11, 0.61, -69.08, -30.23], "resends": [0.33, 0.67], "reached": false, "not_moved": true, "reached_angles": [-40.42, 54.31, 23.11, 0.61, -69.08, -30.23], "reach_err": 3.87, "elapsed_sec": 0.97, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 107, "t": "2026-11-09T09:39:47.352", "t_unix": 1794184787.353, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 1.0, "hold_id": 26, "hold_n": 0, "accepted": true, "measured_before": [-40.42, 54.31, 23.11, 0.61, -69.08, -30.23], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 3.87, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 56.31, 23.02, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184787.391756, "measured_before_send": [-40.42, 54.31, 23.11, 0.61, -69.08, -30.23], "resends": [], "reached": false, "settled": true, "reached_angles": [-40.42, 57.3, 22.93, 0.61, -69.25, -30.23], "reach_err": 4.04, "elapsed_sec": 0.49, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 108, "t": "2026-11-09T09:39:47.912", "t_unix": 1794184787.912, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 1.0, "hold_id": 27, "hold_n": 0, "accepted": true, "measured_before": [-40.42, 57.3, 22.93, 0.61, -69.25, -30.23], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 4.04, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 57.31, 23.02, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184787.952708, "measured_before_send": [-40.42, 57.3, 22.93, 0.61, -69.25, -30.23], "resends": [], "reached": true, "reached_angles": [-40.42, 57.3, 22.93, 0.61, -69.25, -30.23], "reach_err": 4.04, "elapsed_sec": 0.02, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 109, "t": "2026-11-09T09:39:52.081", "t_unix": 1794184792.082, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 2, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 110, "t": "2026-11-09T09:39:53.264", "t_unix": 1794184793.265, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -1.0, "hold_id": 28, "hold_n": 0, "accepted": true, "measured_before": [-40.42, 58.35, 22.85, 0.7, -69.34, -30.23], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 4.13, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 57.31, 22.02, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184793.303606, "measured_before_send": [-40.42, 58.35, 22.85, 0.7, -69.34, -30.23], "resends": [0.34, 0.71], "reached": false, "not_moved": true, "reached_angles": [-40.42, 58.35, 22.85, 0.61, -71.01, -30.23], "reach_err": 5.8, "elapsed_sec": 1.02, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 111, "t": "2026-11-09T09:39:55.303", "t_unix": 1794184795.304, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 29, "hold_n": 1, "held_sec": 0.409, "accepted": true, "measured_before": [-40.42, 58.35, 22.85, 0.61, -71.01, -30.23], "start_source": "mixed", "cmd_gap_deg": 5.8, "hold_lead_deg": 0.83, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 57.31, 7.85, 0.26, -65.21, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184795.324688, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 112, "t": "2026-11-09T09:39:55.403", "t_unix": 1794184795.404, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 29, "hold_n": 2, "held_sec": 0.51, "accepted": true, "released_during_job": true, "measured_before": [-40.42, 58.35, 20.56, 0.61, -71.01, -30.23], "start_source": "mixed", "cmd_gap_deg": 5.8, "hold_lead_deg": 12.71, "sent": false, "why": "lead_ok", "hold_remaining_deg": 12.71, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 113, "t": "2026-11-09T09:39:55.554", "t_unix": 1794184795.555, "button": null, "button_name": null, "kind": "halt", "selected_joint": 2, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 29, "halt_joint": 2, "measured_at_request": [-40.42, 58.35, 22.85, 0.61, -71.01, -30.23], "t_halt": 1794184795.5549839, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-40.42, 59.32, 18.01, 0.61, -70.04, -30.23], "moved_after_request_deg": [0.0, 0.97, -4.84, 0.0, 0.97, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 114, "t": "2026-11-09T09:39:56.777", "t_unix": 1794184796.778, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 30, "hold_n": 1, "held_sec": 0.407, "accepted": true, "measured_before": [-40.42, 59.5, 18.63, 0.7, -69.43, -30.23], "start_source": "mixed", "cmd_gap_deg": 4.22, "hold_lead_deg": 0.62, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 57.31, 3.63, 0.26, -65.21, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184796.792324, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 115, "t": "2026-11-09T09:39:56.881", "t_unix": 1794184796.881, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 30, "hold_n": 2, "held_sec": 0.509, "accepted": true, "measured_before": [-40.42, 59.5, 18.54, 0.7, -69.43, -30.23], "start_source": "mixed", "cmd_gap_deg": 4.22, "hold_lead_deg": 14.91, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.91, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 116, "t": "2026-11-09T09:39:56.948", "t_unix": 1794184796.949, "button": null, "button_name": null, "kind": "halt", "selected_joint": 2, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 30, "halt_joint": 2, "measured_at_request": [-40.42, 59.5, 18.54, 0.7, -69.43, -30.23], "t_halt": 1794184796.948868, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-40.42, 60.46, 14.85, 0.7, -68.46, -30.23], "moved_after_request_deg": [0.0, 0.96, -3.69, 0.0, 0.97, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 117, "t": "2026-11-09T09:39:57.812", "t_unix": 1794184797.812, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -1.0, "hold_id": 31, "hold_n": 0, "accepted": true, "measured_before": [-40.42, 60.73, 15.38, 0.7, -67.67, -30.23], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 3.42, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 57.31, 13.85, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184797.8562381, "measured_before_send": [-40.42, 60.73, 15.38, 0.7, -67.67, -30.23], "resends": [], "reached": true, "reached_angles": [-40.51, 59.41, 13.97, 0.79, -68.02, -30.23], "reach_err": 2.81, "elapsed_sec": 0.32, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 118, "t": "2026-11-09T09:39:58.815", "t_unix": 1794184798.816, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -1.0, "hold_id": 32, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 59.41, 14.32, 0.79, -68.02, -30.23], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 2.81, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 57.31, 12.85, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184798.856011, "measured_before_send": [-40.51, 59.41, 14.32, 0.79, -68.02, -30.23], "resends": [0.34, 0.68], "reached": false, "not_moved": true, "reached_angles": [-40.51, 59.41, 14.23, 0.79, -68.11, -30.23], "reach_err": 2.9, "elapsed_sec": 0.99, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 119, "t": "2026-11-09T09:40:00.279", "t_unix": 1794184800.279, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 33, "hold_n": 1, "held_sec": 0.41, "accepted": true, "released_during_job": true, "measured_before": [-40.51, 59.41, 14.23, 0.79, -68.2, -30.23], "start_source": "hold", "cmd_gap_deg": 2.99, "hold_lead_deg": 1.38, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 57.31, -0.77, 0.26, -65.21, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184800.3075259, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 120, "t": "2026-11-09T09:40:00.347", "t_unix": 1794184800.347, "button": null, "button_name": null, "kind": "halt", "selected_joint": 2, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "released_while_sending", "hold_id": 33, "halt_joint": 2, "measured_at_request": [-40.51, 59.41, 14.23, 0.79, -68.2, -30.23], "t_halt": 1794184800.34783, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-40.51, 60.46, 14.41, 0.79, -68.11, -30.23], "moved_after_request_deg": [0.0, 1.05, 0.18, 0.0, 0.09, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 121, "t": "2026-11-09T09:40:01.461", "t_unix": 1794184801.461, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 34, "hold_n": 1, "held_sec": 0.404, "accepted": true, "measured_before": [-40.51, 60.55, 14.67, 0.79, -67.93, -30.23], "start_source": "mixed", "cmd_gap_deg": 3.24, "hold_lead_deg": 0.26, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 57.31, -0.33, 0.26, -65.21, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184801.4831638, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 122, "t": "2026-11-09T09:40:01.562", "t_unix": 1794184801.562, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 34, "hold_n": 2, "held_sec": 0.505, "accepted": true, "measured_before": [-40.51, 60.29, 14.67, 0.79, -67.93, -30.23], "start_source": "hold", "cmd_gap_deg": 2.98, "hold_lead_deg": 15.0, "sent": false, "why": "lead_ok", "hold_remaining_deg": 15.0, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 123, "t": "2026-11-09T09:40:01.664", "t_unix": 1794184801.665, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 34, "hold_n": 3, "held_sec": 0.607, "accepted": true, "measured_before": [-40.51, 59.41, 11.68, 0.79, -67.93, -30.23], "start_source": "hold", "cmd_gap_deg": 2.72, "hold_lead_deg": 12.01, "sent": false, "why": "lead_ok", "hold_remaining_deg": 12.01, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 124, "t": "2026-11-09T09:40:01.765", "t_unix": 1794184801.766, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -15.0, "hold_id": 34, "hold_n": 4, "held_sec": 0.708, "accepted": true, "released_during_job": true, "measured_before": [-40.51, 59.41, 11.68, 0.79, -67.93, -30.23], "start_source": "hold", "cmd_gap_deg": 2.72, "hold_lead_deg": 12.01, "sent": false, "why": "lead_ok", "hold_remaining_deg": 12.01, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 125, "t": "2026-11-09T09:40:01.833", "t_unix": 1794184801.834, "button": null, "button_name": null, "kind": "halt", "selected_joint": 2, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 34, "halt_joint": 2, "measured_at_request": [-40.51, 59.41, 11.68, 0.79, -67.93, -30.23], "t_halt": 1794184801.834369, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-40.51, 60.55, 4.3, 0.79, -66.44, -30.23], "moved_after_request_deg": [0.0, 1.14, -7.38, 0.0, 1.49, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 126, "t": "2026-11-09T09:40:06.016", "t_unix": 1794184806.016, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 3, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 127, "t": "2026-11-09T09:40:06.220", "t_unix": 1794184806.221, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 4, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 128, "t": "2026-11-09T09:40:06.425", "t_unix": 1794184806.426, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 5, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 129, "t": "2026-11-09T09:40:06.867", "t_unix": 1794184806.868, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 130, "t": "2026-11-09T09:40:07.863", "t_unix": 1794184807.864, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 1.0, "hold_id": 35, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 60.64, 4.83, 0.79, -66.79, -30.23], "start_source": "measured", "others_from_measured": [], "cmd_gap_deg": 3.33, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 61.64, 4.3, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184807.9036942, "measured_before_send": [-40.51, 60.64, 4.83, 0.79, -66.79, -30.23], "resends": [], "reached": false, "settled": true, "reached_angles": [-40.51, 62.92, 1.23, 0.79, -70.48, -30.23], "reach_err": 5.27, "elapsed_sec": 0.57, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 131, "t": "2026-11-09T09:40:10.258", "t_unix": 1794184810.259, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 36, "hold_n": 1, "held_sec": 0.409, "accepted": true, "released_during_job": true, "measured_before": [-40.51, 62.92, 1.23, 0.79, -70.48, -30.23], "start_source": "mixed", "cmd_gap_deg": 5.27, "hold_lead_deg": 1.28, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 77.92, 4.3, 0.26, -65.21, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184810.281413, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 132, "t": "2026-11-09T09:40:10.324", "t_unix": 1794184810.325, "button": null, "button_name": null, "kind": "halt", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "released_while_sending", "hold_id": 36, "halt_joint": 1, "measured_at_request": [-40.51, 62.92, 1.23, 0.79, -70.48, -30.23], "t_halt": 1794184810.3254778, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-40.51, 64.16, 1.31, 0.79, -68.9, -30.23], "moved_after_request_deg": [0.0, 1.24, 0.08, 0.0, 1.58, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 133, "t": "2026-11-09T09:40:11.326", "t_unix": 1794184811.327, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": 15.0, "hold_id": 37, "hold_n": 1, "held_sec": 0.408, "accepted": true, "released_during_job": true, "measured_before": [-40.51, 64.16, 1.75, 0.79, -68.9, -30.23], "start_source": "mixed", "cmd_gap_deg": 3.69, "hold_lead_deg": 0.0, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.16, 4.3, 0.26, -65.21, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184811.348453, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 134, "t": "2026-11-09T09:40:11.478", "t_unix": 1794184811.478, "button": null, "button_name": null, "kind": "halt", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "released_while_sending", "hold_id": 37, "halt_joint": 1, "measured_at_request": [-40.51, 64.16, 1.75, 0.79, -68.9, -30.23], "t_halt": 1794184811.4783769, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-40.51, 67.5, 1.75, 0.79, -68.9, -30.23], "moved_after_request_deg": [0.0, 3.34, 0.0, 0.0, 0.0, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 135, "t": "2026-11-09T09:40:18.666", "t_unix": 1794184818.666, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 2, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 136, "t": "2026-11-09T09:40:19.669", "t_unix": 1794184819.67, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -1.0, "hold_id": 38, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.27, 0.17, 0.61, -72.24, -29.97], "start_source": "measured", "others_from_measured": [1], "cmd_gap_deg": 11.77, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, -0.83, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184819.735883, "measured_before_send": [-40.51, 79.27, 0.17, 0.61, -72.24, -29.97], "resends": [], "reached": true, "reached_angles": [-40.51, 79.27, -0.96, 0.61, -70.75, -29.97], "reach_err": 5.54, "elapsed_sec": 0.17, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 137, "t": "2026-11-09T09:40:20.824", "t_unix": 1794184820.825, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -1.0, "hold_id": 39, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.27, -1.31, 0.61, -70.48, -29.97], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 5.27, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, -1.83, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184820.8610291, "measured_before_send": [-40.51, 79.27, -1.31, 0.61, -70.48, -29.97], "resends": [0.35, 0.7], "reached": false, "not_moved": true, "reached_angles": [-40.51, 79.27, -1.31, 0.61, -70.48, -29.97], "reach_err": 5.27, "elapsed_sec": 1.06, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 138, "t": "2026-11-09T09:40:22.099", "t_unix": 1794184822.1, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -1.0, "hold_id": 40, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.27, -1.31, 0.61, -70.48, -29.97], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 5.27, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, -2.83, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184822.131856, "measured_before_send": [-40.51, 79.27, -1.31, 0.61, -70.48, -29.97], "resends": [], "reached": true, "reached_angles": [-40.51, 79.54, -3.07, 0.61, -69.16, -29.97], "reach_err": 3.95, "elapsed_sec": 0.09, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 139, "t": "2026-11-09T09:40:23.046", "t_unix": 1794184823.047, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -1.0, "hold_id": 41, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.62, -3.07, 0.61, -69.16, -29.97], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 3.95, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, -3.83, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184823.0838459, "measured_before_send": [-40.51, 79.62, -3.07, 0.61, -69.16, -29.97], "resends": [], "reached": true, "reached_angles": [-40.51, 79.62, -3.42, 0.61, -69.08, -29.97], "reach_err": 3.87, "elapsed_sec": 0.17, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 140, "t": "2026-11-09T09:40:23.981", "t_unix": 1794184823.982, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -1.0, "hold_id": 42, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.71, -3.51, 0.61, -69.08, -29.97], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 3.87, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, -4.83, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184824.165189, "measured_before_send": [-40.51, 79.71, -3.51, 0.61, -69.08, -29.97], "resends": [], "reached": false, "settled": true, "reached_angles": [-40.51, 79.8, -4.3, 0.61, -68.64, -30.05], "reach_err": 3.43, "elapsed_sec": 0.46, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 141, "t": "2026-11-09T09:40:24.864", "t_unix": 1794184824.864, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -1.0, "hold_id": 43, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.8, -4.3, 0.61, -68.64, -30.05], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 3.43, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, -5.83, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184824.901658, "measured_before_send": [-40.51, 79.8, -4.3, 0.61, -68.64, -30.05], "resends": [], "reached": false, "settled": true, "reached_angles": [-40.51, 79.8, -5.27, 0.61, -67.85, -30.14], "reach_err": 2.64, "elapsed_sec": 0.52, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 142, "t": "2026-11-09T09:40:25.930", "t_unix": 1794184825.93, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -1.0, "hold_id": 44, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.8, -5.27, 0.61, -67.85, -30.14], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 2.64, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, -6.83, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184825.967736, "measured_before_send": [-40.51, 79.8, -5.27, 0.61, -67.85, -30.14], "resends": [0.34, 0.68], "reached": false, "not_moved": true, "reached_angles": [-40.51, 79.8, -5.27, 0.61, -67.85, -30.14], "reach_err": 2.64, "elapsed_sec": 0.99, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 143, "t": "2026-11-09T09:40:27.035", "t_unix": 1794184827.036, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": -1.0, "hold_id": 45, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.8, -5.27, 0.61, -67.85, -30.14], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 2.64, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, -7.83, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184827.215981, "measured_before_send": [-40.51, 79.8, -5.27, 0.61, -67.93, -30.14], "resends": [], "reached": false, "settled": true, "reached_angles": [-40.51, 79.98, -6.94, 0.52, -67.93, -30.05], "reach_err": 2.72, "elapsed_sec": 0.46, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 144, "t": "2026-11-09T09:40:38.311", "t_unix": 1794184838.312, "button": 0, "button_name": "cross", "kind": "grip_close", "selected_joint": 2, "step_deg": 1.0, "execute": true, "grip_cmd": 1, "accepted": true, "measured_before": null, "sent": true, "reached": null, "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 145, "t": "2026-11-09T09:40:42.401", "t_unix": 1794184842.402, "button": 1, "button_name": "circle", "kind": "grip_open", "selected_joint": 2, "step_deg": 1.0, "execute": true, "grip_cmd": 0, "accepted": true, "measured_before": null, "sent": true, "reached": null, "grip_state": "open", "stopped": false, "stop_reason": null}
{"seq": 146, "t": "2026-11-09T09:40:49.609", "t_unix": 1794184849.609, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 1.0, "hold_id": 46, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.98, -6.94, 0.52, -70.66, -30.14], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 5.45, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, -6.83, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184849.647746, "measured_before_send": [-40.51, 79.98, -6.94, 0.52, -70.66, -30.14], "resends": [], "reached": true, "reached_angles": [-40.51, 79.98, -6.94, 0.52, -70.66, -30.14], "reach_err": 5.45, "elapsed_sec": 0.02, "grip_state": "open", "stopped": false, "stop_reason": null}
{"seq": 147, "t": "2026-11-09T09:40:50.810", "t_unix": 1794184850.81, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 1.0, "hold_id": 47, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.98, -6.94, 0.52, -70.66, -30.14], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 5.45, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, -5.83, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184850.847334, "measured_before_send": [-40.51, 79.98, -6.94, 0.52, -70.66, -30.14], "resends": [], "reached": true, "reached_angles": [-40.51, 79.98, -5.97, 0.52, -70.66, -30.14], "reach_err": 5.45, "elapsed_sec": 0.16, "grip_state": "open", "stopped": false, "stop_reason": null}
{"seq": 148, "t": "2026-11-09T09:40:51.823", "t_unix": 1794184851.823, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 1.0, "hold_id": 48, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.98, -5.36, 0.52, -70.66, -30.14], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 5.45, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, -4.83, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184851.855812, "measured_before_send": [-40.51, 79.98, -5.36, 0.52, -70.66, -30.14], "resends": [], "reached": true, "reached_angles": [-40.51, 79.98, -4.74, 0.52, -70.66, -30.14], "reach_err": 5.45, "elapsed_sec": 0.17, "grip_state": "open", "stopped": false, "stop_reason": null}
{"seq": 149, "t": "2026-11-09T09:40:52.869", "t_unix": 1794184852.87, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 1.0, "hold_id": 49, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.98, -4.3, 0.52, -70.66, -30.14], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 5.45, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, -3.83, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184853.049938, "measured_before_send": [-40.51, 79.98, -4.3, 0.52, -70.66, -30.14], "resends": [], "reached": true, "reached_angles": [-40.51, 79.98, -4.3, 0.52, -70.66, -30.14], "reach_err": 5.45, "elapsed_sec": 0.02, "grip_state": "open", "stopped": false, "stop_reason": null}
{"seq": 150, "t": "2026-11-09T09:40:53.727", "t_unix": 1794184853.727, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 1.0, "hold_id": 50, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.98, -4.3, 0.52, -70.66, -30.14], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 5.45, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, -2.83, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184853.778517, "measured_before_send": [-40.51, 79.98, -4.3, 0.52, -70.66, -30.14], "resends": [], "reached": true, "reached_angles": [-40.51, 79.98, -2.81, 0.52, -71.71, -30.14], "reach_err": 6.5, "elapsed_sec": 0.09, "grip_state": "open", "stopped": false, "stop_reason": null}
{"seq": 151, "t": "2026-11-09T09:40:54.657", "t_unix": 1794184854.658, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 1.0, "hold_id": 51, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.98, -2.72, 0.52, -71.8, -30.05], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 6.59, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, -1.83, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184854.696063, "measured_before_send": [-40.51, 79.98, -2.72, 0.52, -71.8, -30.05], "resends": [], "reached": true, "reached_angles": [-40.51, 79.98, -2.02, 0.52, -72.33, -30.05], "reach_err": 7.12, "elapsed_sec": 0.17, "grip_state": "open", "stopped": false, "stop_reason": null}
{"seq": 152, "t": "2026-11-09T09:40:55.455", "t_unix": 1794184855.455, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 1.0, "hold_id": 52, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.98, -2.02, 0.52, -72.33, -30.05], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 7.12, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, -0.83, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184855.4958332, "measured_before_send": [-40.51, 79.98, -2.02, 0.52, -72.33, -30.05], "resends": [], "reached": true, "reached_angles": [-40.51, 79.98, -1.23, 0.52, -72.77, -30.05], "reach_err": 7.56, "elapsed_sec": 0.17, "grip_state": "open", "stopped": false, "stop_reason": null}
{"seq": 153, "t": "2026-11-09T09:40:56.273", "t_unix": 1794184856.273, "button": 12, "button_name": "dpad_down", "kind": "move", "selected_joint": 2, "step_deg": 1.0, "execute": true, "joint": 2, "delta": 1.0, "hold_id": 53, "hold_n": 0, "accepted": true, "measured_before": [-40.51, 79.98, -1.23, 0.43, -72.77, -29.97], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 7.56, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 79.27, 0.17, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184856.315825, "measured_before_send": [-40.51, 79.98, -1.23, 0.43, -72.77, -29.97], "resends": [], "reached": false, "settled": true, "reached_angles": [-40.51, 79.98, -0.43, 0.43, -73.47, -29.97], "reach_err": 8.26, "elapsed_sec": 0.46, "grip_state": "open", "stopped": false, "stop_reason": null}
{"seq": 154, "t": "2026-11-09T09:40:56.831", "t_unix": 1794184856.831, "button": 10, "button_name": "r1", "kind": "modifier", "selected_joint": 2, "step_deg": 2.0, "execute": true, "accepted": true, "grip_state": "open", "stopped": false, "stop_reason": null}
{"seq": 155, "t": "2026-11-09T09:40:59.214", "t_unix": 1794184859.214, "button": 0, "button_name": "cross", "kind": "grip_close", "selected_joint": 2, "step_deg": 1.0, "execute": true, "grip_cmd": 1, "accepted": true, "measured_before": null, "sent": true, "reached": null, "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 156, "t": "2026-11-09T09:41:51.256", "t_unix": 1794184911.256, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 3, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 157, "t": "2026-11-09T09:41:51.423", "t_unix": 1794184911.423, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 4, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 158, "t": "2026-11-09T09:41:51.660", "t_unix": 1794184911.66, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 5, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 159, "t": "2026-11-09T09:41:52.017", "t_unix": 1794184912.017, "button": 3, "button_name": "triangle", "kind": "select_joint", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 160, "t": "2026-11-09T09:41:55.336", "t_unix": 1794184915.337, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": -15.0, "hold_id": 54, "hold_n": 1, "held_sec": 0.41, "accepted": true, "measured_before": [-40.51, 79.71, -0.43, 0.0, -73.3, -30.05], "start_source": "mixed", "cmd_gap_deg": 8.09, "hold_lead_deg": 0.44, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 64.71, 0.17, 0.26, -65.21, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184915.359643, "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 161, "t": "2026-11-09T09:41:55.439", "t_unix": 1794184915.439, "button": null, "button_name": null, "kind": "halt", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 54, "halt_joint": 1, "measured_at_request": [-40.51, 79.71, -0.43, 0.0, -73.3, -30.05], "t_halt": 1794184915.439775, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-40.51, 80.24, -0.43, 0.0, -73.91, -29.97], "moved_after_request_deg": [0.0, 0.53, 0.0, 0.0, -0.61, 0.08], "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 162, "t": "2026-11-09T09:41:56.528", "t_unix": 1794184916.529, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": -15.0, "hold_id": 55, "hold_n": 1, "held_sec": 0.409, "accepted": true, "measured_before": [-40.51, 80.24, -0.43, 0.0, -74.0, -29.97], "start_source": "mixed", "cmd_gap_deg": 8.79, "hold_lead_deg": 0.0, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 65.24, 0.17, 0.26, -65.21, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184916.544727, "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 163, "t": "2026-11-09T09:41:56.645", "t_unix": 1794184916.645, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": -15.0, "hold_id": 55, "hold_n": 2, "held_sec": 0.525, "accepted": true, "released_during_job": true, "measured_before": [-40.6, 67.5, 0.79, 0.43, -68.73, -29.97], "start_source": "mixed", "cmd_gap_deg": 3.52, "hold_lead_deg": 2.26, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 52.5, 0.17, 0.26, -65.21, -30.23], "sent": false, "why": "halted_before_send", "reached": null, "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 164, "t": "2026-11-09T09:41:57.123", "t_unix": 1794184917.124, "button": null, "button_name": null, "kind": "halt", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 55, "halt_joint": 1, "measured_at_request": [-40.51, 80.24, -0.43, 0.0, -74.0, -29.97], "t_halt": 1794184917.124056, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-40.6, 68.9, 1.14, 0.52, -66.7, -29.88], "moved_after_request_deg": [-0.09, -11.34, 1.57, 0.52, 7.3, 0.09], "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 165, "t": "2026-11-09T09:42:01.367", "t_unix": 1794184921.367, "button": 0, "button_name": "cross", "kind": "grip_close", "selected_joint": 1, "step_deg": 1.0, "execute": true, "grip_cmd": 1, "accepted": true, "measured_before": null, "sent": true, "reached": null, "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 166, "t": "2026-11-09T09:42:07.607", "t_unix": 1794184927.608, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": -1.0, "hold_id": 56, "hold_n": 0, "accepted": true, "measured_before": [-40.6, 68.9, 1.4, 0.61, -67.67, -29.88], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 2.46, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 67.9, 0.17, 0.26, -65.21, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184927.655128, "measured_before_send": [-40.6, 68.9, 1.4, 0.61, -67.67, -29.88], "resends": [0.34, 0.74], "reached": false, "not_moved": true, "reached_angles": [-40.6, 68.9, 1.4, 0.61, -71.54, -29.88], "reach_err": 6.33, "elapsed_sec": 1.06, "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 167, "t": "2026-11-09T09:42:09.316", "t_unix": 1794184929.317, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": -15.0, "hold_id": 57, "hold_n": 1, "held_sec": 0.407, "accepted": true, "measured_before": [-40.6, 68.9, 1.4, 0.61, -71.54, -29.88], "start_source": "mixed", "cmd_gap_deg": 6.33, "hold_lead_deg": 1.0, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-40.62, 53.9, 0.17, 0.26, -65.21, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184929.343255, "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 168, "t": "2026-11-09T09:42:09.418", "t_unix": 1794184929.418, "button": 11, "button_name": "dpad_up", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 1, "delta": -15.0, "hold_id": 57, "hold_n": 2, "held_sec": 0.508, "accepted": true, "released_during_job": true, "measured_before": [-40.6, 67.93, 1.4, 0.61, -71.54, -29.97], "start_source": "mixed", "cmd_gap_deg": 6.33, "hold_lead_deg": 14.03, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.03, "reached": null, "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 169, "t": "2026-11-09T09:42:09.568", "t_unix": 1794184929.568, "button": null, "button_name": null, "kind": "halt", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 57, "halt_joint": 1, "measured_at_request": [-40.6, 68.9, 1.4, 0.61, -71.54, -29.88], "t_halt": 1794184929.568428, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-40.69, 66.09, 1.49, 0.61, -70.48, -29.88], "moved_after_request_deg": [-0.09, -2.81, 0.09, 0.0, 1.06, 0.0], "grip_state": "closed", "stopped": false, "stop_reason": null}
{"seq": 170, "t": "2026-11-09T09:42:22.836", "t_unix": 1794184942.837, "button": 1, "button_name": "circle", "kind": "grip_open", "selected_joint": 1, "step_deg": 1.0, "execute": true, "grip_cmd": 0, "accepted": true, "measured_before": null, "sent": true, "reached": null, "grip_state": "open", "stopped": false, "stop_reason": null}
```

### 新しい教えた記録（mecharm_calibration/teach_poses_20261109/drag_v2_20261109_094222.json）

```json
{
 "schema_version": 1,
 "model": "MyCobot",
 "recorded_at": "2026-11-09T09:42:22",
 "interval_sec": 0.1,
 "count": 585,
 "positions": {
  "block_xz_m": null,
  "box_xz_m": null,
  "detect_score": {
   "block": null,
   "box": null
  },
  "coord_note": "Unity座標系・マット原点基準"
 },
 "angles": [
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.79,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   1.05,
   -0.7,
   -95.97,
   -29.61
  ],
  [
   -0.35,
   92.72,
   0.96,
   -1.14,
   -96.85,
   -29.61
  ],
  [
   0.0,
   91.66,
   -0.52,
   -4.3,
   -101.68,
   -30.32
  ],
  [
   -0.26,
   91.75,
   -3.86,
   -3.95,
   -99.75,
   -35.33
  ],
  [
   -0.08,
   91.84,
   -5.0,
   -4.04,
   -99.75,
   -34.45
  ],
  [
   -0.08,
   91.84,
   -5.0,
   -3.16,
   -99.75,
   -32.34
  ],
  [
   -0.61,
   91.75,
   -5.71,
   -1.58,
   -99.14,
   -32.51
  ],
  [
   -0.7,
   90.7,
   -7.03,
   0.26,
   -97.38,
   -32.78
  ],
  [
   -0.7,
   88.68,
   -12.04,
   0.87,
   -88.5,
   -33.04
  ],
  [
   -0.96,
   85.6,
   -18.98,
   1.93,
   -76.37,
   -33.13
  ],
  [
   -4.57,
   83.4,
   -27.94,
   1.93,
   -65.74,
   -33.22
  ],
  [
   -10.1,
   83.32,
   -37.7,
   -0.35,
   -56.6,
   -33.22
  ],
  [
   -16.43,
   83.32,
   -46.23,
   -2.81,
   -47.9,
   -33.13
  ],
  [
   -22.58,
   83.32,
   -53.34,
   -5.0,
   -40.51,
   -33.13
  ],
  [
   -27.07,
   83.32,
   -58.18,
   -5.8,
   -35.94,
   -33.04
  ],
  [
   -30.49,
   83.32,
   -61.34,
   -6.67,
   -35.68,
   -33.13
  ],
  [
   -33.13,
   83.32,
   -62.84,
   -7.11,
   -35.15,
   -33.22
  ],
  [
   -34.98,
   83.32,
   -63.72,
   -7.38,
   -33.75,
   -33.13
  ],
  [
   -35.5,
   83.32,
   -63.89,
   -7.29,
   -33.13,
   -33.13
  ],
  [
   -35.68,
   83.32,
   -63.89,
   -6.41,
   -33.13,
   -33.13
  ],
  [
   -35.68,
   82.79,
   -64.07,
   -4.92,
   -33.22,
   -33.22
  ],
  [
   -35.68,
   81.65,
   -66.62,
   -4.92,
   -31.55,
   -33.48
  ],
  [
   -35.68,
   81.65,
   -69.96,
   -4.21,
   -26.8,
   -33.48
  ],
  [
   -35.77,
   81.65,
   -74.61,
   -4.65,
   -21.53,
   -33.48
  ],
  [
   -35.68,
   81.65,
   -79.62,
   -4.74,
   -15.9,
   -33.48
  ],
  [
   -35.5,
   81.65,
   -84.11,
   -3.86,
   -9.22,
   -33.48
  ],
  [
   -35.68,
   81.65,
   -86.22,
   -4.39,
   -6.76,
   -33.48
  ],
  [
   -35.59,
   81.65,
   -86.92,
   -6.06,
   -6.76,
   -33.48
  ],
  [
   -35.41,
   81.65,
   -86.92,
   -6.06,
   -6.76,
   -33.48
  ],
  [
   -35.77,
   81.65,
   -87.27,
   -5.97,
   -6.76,
   -33.22
  ],
  [
   -36.38,
   81.65,
   -87.62,
   -5.44,
   -6.76,
   -33.22
  ],
  [
   -38.4,
   82.96,
   -87.53,
   -3.77,
   -5.53,
   -32.78
  ],
  [
   -39.37,
   84.99,
   -87.53,
   -3.77,
   -6.41,
   -32.43
  ],
  [
   -39.19,
   84.63,
   -87.71,
   -5.18,
   -7.99,
   -32.43
  ],
  [
   -39.19,
   83.49,
   -87.71,
   -5.36,
   -7.73,
   -32.51
  ],
  [
   -39.28,
   78.66,
   -87.71,
   -6.5,
   -1.4,
   -32.6
  ],
  [
   -39.72,
   75.76,
   -87.71,
   -6.24,
   2.9,
   -32.51
  ],
  [
   -39.63,
   82.26,
   -87.18,
   -4.04,
   -3.69,
   -32.51
  ],
  [
   -39.02,
   94.39,
   -86.57,
   -2.63,
   -21.44,
   -32.51
  ],
  [
   -39.19,
   95.36,
   -81.91,
   -1.75,
   -20.91,
   -32.51
  ],
  [
   -38.93,
   96.85,
   -78.13,
   0.08,
   -19.51,
   -32.51
  ],
  [
   -38.49,
   97.29,
   -76.72,
   1.31,
   -16.25,
   -32.51
  ],
  [
   -38.32,
   98.17,
   -76.64,
   3.42,
   -8.52,
   -32.6
  ],
  [
   -38.75,
   99.4,
   -76.99,
   3.33,
   -9.14,
   -32.6
  ],
  [
   -39.19,
   100.01,
   -76.99,
   2.81,
   -10.1,
   -32.69
  ],
  [
   -39.37,
   100.28,
   -76.99,
   2.37,
   -10.1,
   -32.69
  ],
  [
   -39.37,
   100.28,
   -76.99,
   2.46,
   -10.1,
   -32.69
  ],
  [
   -39.37,
   100.45,
   -76.99,
   2.63,
   -10.19,
   -32.69
  ],
  [
   -39.28,
   100.37,
   -77.87,
   2.37,
   -13.18,
   -32.69
  ],
  [
   -39.19,
   100.37,
   -81.65,
   1.31,
   -15.55,
   -32.69
  ],
  [
   -39.37,
   100.37,
   -85.6,
   0.52,
   -14.32,
   -32.69
  ],
  [
   -39.37,
   100.37,
   -89.2,
   0.17,
   -12.83,
   -32.78
  ],
  [
   -39.37,
   100.37,
   -92.63,
   -0.96,
   -10.37,
   -32.78
  ],
  [
   -39.02,
   100.28,
   -95.36,
   -0.79,
   -5.88,
   -32.78
  ],
  [
   -38.49,
   99.05,
   -96.5,
   -0.87,
   -4.65,
   -32.78
  ],
  [
   -38.49,
   95.53,
   -96.5,
   -1.93,
   -2.28,
   -32.87
  ],
  [
   -38.49,
   92.02,
   -96.5,
   -2.46,
   1.84,
   -32.87
  ],
  [
   -38.4,
   90.61,
   -96.5,
   -2.28,
   2.46,
   -32.87
  ],
  [
   -38.4,
   85.34,
   -96.5,
   -2.63,
   7.99,
   -33.04
  ],
  [
   -38.49,
   75.58,
   -96.24,
   -2.02,
   22.06,
   -33.22
  ],
  [
   -38.75,
   66.09,
   -95.8,
   -1.4,
   36.56,
   -33.22
  ],
  [
   -38.93,
   62.4,
   -95.62,
   1.49,
   43.68,
   -33.48
  ],
  [
   -39.28,
   62.49,
   -93.42,
   2.72,
   43.41,
   -33.83
  ],
  [
   -39.28,
   61.69,
   -86.48,
   2.98,
   34.1,
   -34.01
  ],
  [
   -39.02,
   55.89,
   -74.79,
   2.72,
   27.86,
   -34.1
  ],
  [
   -38.84,
   48.95,
   -58.62,
   1.58,
   17.4,
   -34.1
  ],
  [
   -38.84,
   45.7,
   -40.07,
   1.05,
   -1.4,
   -34.1
  ],
  [
   -38.58,
   42.53,
   -21.44,
   -0.79,
   -20.91,
   -33.75
  ],
  [
   -38.58,
   39.72,
   -3.51,
   -2.19,
   -36.91,
   -33.48
  ],
  [
   -38.67,
   37.7,
   10.1,
   -2.9,
   -46.4,
   -33.48
  ],
  [
   -38.84,
   36.65,
   18.89,
   -3.42,
   -49.39,
   -33.57
  ],
  [
   -39.19,
   38.23,
   21.62,
   -4.3,
   -49.48,
   -33.57
  ],
  [
   -39.19,
   47.28,
   21.53,
   -4.74,
   -57.12,
   -33.57
  ],
  [
   -38.93,
   54.22,
   19.59,
   -4.74,
   -68.11,
   -33.92
  ],
  [
   -38.67,
   57.39,
   18.63,
   -4.13,
   -69.34,
   -34.01
  ],
  [
   -38.67,
   60.46,
   18.45,
   -1.84,
   -74.35,
   -33.83
  ],
  [
   -38.49,
   62.05,
   18.36,
   -1.4,
   -79.89,
   -33.57
  ],
  [
   -38.49,
   62.13,
   18.36,
   -2.54,
   -80.06,
   -32.78
  ],
  [
   -38.49,
   65.12,
   18.19,
   -1.58,
   -82.35,
   -32.25
  ],
  [
   -38.49,
   67.85,
   15.82,
   -1.84,
   -86.13,
   -31.99
  ],
  [
   -38.49,
   70.13,
   13.97,
   -0.7,
   -88.5,
   -31.28
  ],
  [
   -38.49,
   70.13,
   13.88,
   0.0,
   -90.87,
   -31.11
  ],
  [
   -38.49,
   69.87,
   13.79,
   -0.7,
   -91.05,
   -31.64
  ],
  [
   -38.58,
   69.87,
   13.79,
   -0.79,
   -91.05,
   -31.81
  ],
  [
   -38.67,
   66.26,
   14.41,
   -0.61,
   -88.24,
   -32.34
  ],
  [
   -38.67,
   57.12,
   18.63,
   -0.17,
   -78.31,
   -32.51
  ],
  [
   -38.49,
   50.09,
   21.44,
   -0.87,
   -72.15,
   -32.51
  ],
  [
   -38.49,
   49.13,
   22.06,
   -1.23,
   -71.19,
   -32.51
  ],
  [
   -38.49,
   49.21,
   22.5,
   -1.05,
   -70.92,
   -33.22
  ],
  [
   -38.58,
   51.85,
   22.93,
   -0.52,
   -72.86,
   -33.31
  ],
  [
   -38.58,
   53.78,
   22.93,
   -1.4,
   -77.34,
   -33.39
  ],
  [
   -38.58,
   54.66,
   22.93,
   -1.31,
   -77.69,
   -33.39
  ],
  [
   -38.49,
   56.95,
   22.93,
   -1.23,
   -79.71,
   -33.22
  ],
  [
   -38.49,
   57.3,
   22.85,
   -1.58,
   -80.77,
   -33.22
  ],
  [
   -38.49,
   57.3,
   22.85,
   -1.31,
   -80.77,
   -33.13
  ],
  [
   -38.49,
   57.3,
   22.85,
   -1.23,
   -80.77,
   -33.04
  ],
  [
   -38.49,
   57.3,
   22.85,
   -1.4,
   -80.77,
   -33.04
  ],
  [
   -38.49,
   57.3,
   22.85,
   -2.02,
   -80.68,
   -33.04
  ],
  [
   -38.49,
   57.3,
   22.76,
   -2.1,
   -80.68,
   -33.04
  ],
  [
   -38.49,
   57.3,
   22.76,
   -1.84,
   -80.41,
   -33.13
  ],
  [
   -38.49,
   57.83,
   22.76,
   -2.1,
   -80.15,
   -33.13
  ],
  [
   -38.49,
   57.83,
   22.67,
   -2.63,
   -80.15,
   -33.04
  ],
  [
   -38.49,
   58.35,
   22.67,
   -1.75,
   -80.15,
   -32.6
  ],
  [
   -38.49,
   59.15,
   22.67,
   -1.49,
   -80.33,
   -31.64
  ],
  [
   -38.4,
   59.32,
   21.88,
   -1.49,
   -80.33,
   -31.2
  ],
  [
   -38.4,
   60.82,
   20.91,
   -0.96,
   -80.33,
   -30.23
  ],
  [
   -38.4,
   61.17,
   20.56,
   -1.05,
   -80.5,
   -30.05
  ],
  [
   -38.4,
   61.17,
   20.56,
   -0.52,
   -80.68,
   -30.05
  ],
  [
   -38.32,
   61.17,
   20.56,
   0.08,
   -80.77,
   -30.32
  ],
  [
   -36.91,
   61.17,
   20.56,
   2.1,
   -80.77,
   -30.49
  ],
  [
   -31.28,
   61.17,
   20.56,
   9.93,
   -80.94,
   -30.76
  ],
  [
   -28.3,
   61.17,
   20.56,
   15.11,
   -81.82,
   -31.37
  ],
  [
   -29.97,
   61.17,
   20.56,
   12.04,
   -82.0,
   -31.37
  ],
  [
   -33.22,
   61.17,
   20.39,
   6.67,
   -81.91,
   -31.37
  ],
  [
   -35.5,
   61.17,
   19.33,
   3.42,
   -80.5,
   -31.37
  ],
  [
   -36.65,
   61.17,
   19.16,
   1.66,
   -79.8,
   -31.28
  ],
  [
   -36.65,
   61.17,
   19.16,
   1.93,
   -79.8,
   -31.28
  ],
  [
   -36.38,
   61.96,
   19.16,
   1.93,
   -79.8,
   -31.11
  ],
  [
   -36.21,
   62.92,
   19.07,
   2.1,
   -80.41,
   -30.93
  ],
  [
   -35.94,
   62.92,
   18.98,
   2.1,
   -80.94,
   -30.76
  ],
  [
   -35.85,
   63.01,
   18.98,
   2.9,
   -81.12,
   -30.41
  ],
  [
   -35.77,
   63.01,
   18.98,
   3.6,
   -81.12,
   -30.41
  ],
  [
   -35.77,
   63.01,
   18.98,
   3.86,
   -81.12,
   -30.32
  ],
  [
   -35.77,
   63.01,
   18.98,
   4.3,
   -80.85,
   -30.32
  ],
  [
   -34.89,
   63.01,
   18.98,
   4.74,
   -80.77,
   -30.23
  ],
  [
   -32.08,
   63.01,
   18.98,
   9.22,
   -80.77,
   -30.41
  ],
  [
   -31.37,
   63.01,
   18.98,
   10.45,
   -80.77,
   -30.58
  ],
  [
   -31.55,
   63.01,
   18.98,
   10.1,
   -80.77,
   -30.58
  ],
  [
   -31.64,
   63.01,
   18.98,
   9.66,
   -80.77,
   -30.58
  ],
  [
   -31.64,
   63.01,
   18.98,
   8.96,
   -80.77,
   -30.58
  ],
  [
   -31.81,
   63.01,
   18.98,
   8.52,
   -80.77,
   -30.58
  ],
  [
   -34.54,
   63.01,
   18.63,
   4.83,
   -80.15,
   -30.58
  ],
  [
   -37.61,
   63.01,
   17.05,
   0.08,
   -78.57,
   -30.41
  ],
  [
   -37.17,
   63.01,
   17.05,
   0.79,
   -78.48,
   -30.32
  ],
  [
   -35.85,
   63.01,
   17.13,
   2.54,
   -78.48,
   -30.32
  ],
  [
   -36.12,
   63.1,
   17.13,
   2.37,
   -78.57,
   -30.41
  ],
  [
   -36.12,
   63.1,
   17.13,
   2.1,
   -78.57,
   -30.41
  ],
  [
   -35.85,
   63.1,
   17.13,
   2.19,
   -78.57,
   -30.41
  ],
  [
   -35.77,
   63.1,
   17.13,
   2.54,
   -78.57,
   -30.41
  ],
  [
   -35.41,
   63.72,
   17.13,
   2.9,
   -78.57,
   -30.41
  ],
  [
   -35.41,
   63.98,
   17.13,
   3.07,
   -78.75,
   -30.23
  ],
  [
   -35.41,
   63.98,
   17.13,
   2.98,
   -78.75,
   -30.23
  ],
  [
   -35.41,
   63.98,
   17.13,
   2.98,
   -78.75,
   -30.14
  ],
  [
   -35.41,
   63.98,
   17.13,
   2.98,
   -78.92,
   -30.14
  ],
  [
   -35.41,
   63.98,
   17.05,
   2.98,
   -79.01,
   -30.14
  ],
  [
   -35.41,
   63.98,
   17.05,
   3.07,
   -79.01,
   -30.05
  ],
  [
   -35.41,
   63.98,
   17.05,
   3.16,
   -79.1,
   -29.88
  ],
  [
   -35.41,
   63.98,
   17.05,
   3.25,
   -79.18,
   -29.7
  ],
  [
   -35.41,
   63.98,
   17.05,
   3.25,
   -79.18,
   -29.61
  ],
  [
   -35.33,
   63.98,
   17.05,
   3.07,
   -79.18,
   -29.61
  ],
  [
   -35.33,
   63.98,
   17.05,
   3.07,
   -79.71,
   -29.61
  ],
  [
   -35.33,
   63.98,
   16.87,
   3.16,
   -81.03,
   -29.61
  ],
  [
   -35.33,
   63.98,
   16.78,
   3.25,
   -81.65,
   -29.61
  ],
  [
   -35.33,
   63.98,
   16.78,
   3.25,
   -82.79,
   -29.61
  ],
  [
   -35.33,
   63.98,
   16.78,
   3.07,
   -84.55,
   -29.7
  ],
  [
   -35.33,
   63.98,
   16.78,
   3.16,
   -85.42,
   -29.7
  ],
  [
   -35.33,
   63.98,
   16.78,
   3.25,
   -85.42,
   -29.7
  ],
  [
   -35.33,
   63.98,
   16.78,
   3.42,
   -85.42,
   -29.61
  ],
  [
   -35.33,
   63.98,
   16.78,
   3.51,
   -85.42,
   -29.61
  ],
  [
   -35.33,
   63.98,
   16.78,
   3.6,
   -85.42,
   -29.61
  ],
  [
   -35.33,
   63.98,
   16.78,
   3.86,
   -85.42,
   -29.61
  ],
  [
   -35.41,
   63.98,
   16.78,
   3.86,
   -85.42,
   -29.61
  ],
  [
   -35.41,
   63.98,
   16.78,
   3.77,
   -85.42,
   -29.61
  ],
  [
   -35.41,
   64.33,
   16.78,
   3.77,
   -85.42,
   -29.61
  ],
  [
   -35.41,
   65.21,
   16.78,
   3.86,
   -85.42,
   -29.7
  ],
  [
   -35.41,
   65.83,
   16.78,
   3.69,
   -85.6,
   -29.7
  ],
  [
   -35.41,
   65.83,
   16.78,
   3.77,
   -85.69,
   -29.7
  ],
  [
   -35.41,
   65.83,
   16.78,
   3.86,
   -86.13,
   -29.61
  ],
  [
   -35.59,
   65.83,
   16.78,
   3.86,
   -86.39,
   -29.61
  ],
  [
   -35.68,
   65.83,
   16.78,
   3.86,
   -86.39,
   -29.61
  ],
  [
   -35.77,
   65.83,
   16.78,
   3.86,
   -86.48,
   -29.61
  ],
  [
   -35.68,
   65.83,
   16.78,
   3.95,
   -86.66,
   -29.61
  ],
  [
   -35.68,
   65.83,
   16.78,
   3.95,
   -86.66,
   -29.61
  ],
  [
   -35.68,
   65.83,
   16.78,
   3.95,
   -86.66,
   -29.61
  ],
  [
   -35.77,
   65.83,
   16.78,
   4.04,
   -86.66,
   -29.61
  ],
  [
   -35.77,
   65.83,
   16.78,
   4.04,
   -86.66,
   -29.61
  ],
  [
   -35.85,
   65.83,
   16.78,
   4.04,
   -86.66,
   -29.61
  ],
  [
   -35.85,
   65.83,
   16.78,
   4.04,
   -86.66,
   -29.61
  ],
  [
   -35.94,
   65.83,
   16.78,
   4.04,
   -86.74,
   -29.61
  ],
  [
   -36.03,
   65.83,
   16.78,
   4.04,
   -86.74,
   -29.61
  ],
  [
   -36.03,
   65.83,
   16.78,
   4.3,
   -86.74,
   -29.61
  ],
  [
   -36.12,
   65.83,
   16.78,
   4.3,
   -86.74,
   -29.61
  ],
  [
   -36.12,
   65.83,
   16.78,
   4.3,
   -86.74,
   -29.61
  ],
  [
   -36.12,
   65.83,
   16.78,
   4.39,
   -86.74,
   -29.61
  ],
  [
   -36.12,
   65.83,
   16.78,
   4.39,
   -86.74,
   -29.61
  ],
  [
   -36.12,
   65.83,
   16.78,
   4.39,
   -86.74,
   -29.61
  ],
  [
   -36.12,
   65.83,
   16.78,
   4.39,
   -86.74,
   -29.61
  ],
  [
   -36.12,
   65.83,
   16.78,
   4.39,
   -86.74,
   -29.61
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.69,
   66.09,
   1.49,
   0.61,
   -70.48,
   -29.88
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   -40.51,
   79.98,
   -0.43,
   0.43,
   -73.47,
   -29.97
  ],
  [
   43.41,
   31.81,
   18.54,
   6.24,
   -56.95,
   -29.88
  ],
  [
   43.41,
   31.81,
   18.54,
   6.24,
   -56.95,
   -29.88
  ],
  [
   43.41,
   31.81,
   18.54,
   6.32,
   -56.95,
   -29.88
  ],
  [
   43.41,
   31.81,
   18.54,
   6.41,
   -56.95,
   -29.88
  ],
  [
   43.41,
   31.81,
   18.54,
   6.5,
   -56.95,
   -29.88
  ],
  [
   43.41,
   31.81,
   18.54,
   6.5,
   -56.95,
   -29.88
  ],
  [
   43.41,
   31.81,
   18.54,
   6.5,
   -56.95,
   -29.79
  ],
  [
   43.41,
   32.08,
   18.54,
   6.76,
   -56.95,
   -29.79
  ],
  [
   43.41,
   32.69,
   18.54,
   7.11,
   -56.95,
   -29.7
  ],
  [
   43.5,
   36.38,
   18.36,
   6.76,
   -57.21,
   -29.88
  ],
  [
   43.5,
   39.02,
   16.52,
   6.76,
   -60.2,
   -29.79
  ],
  [
   44.03,
   42.53,
   12.56,
   6.85,
   -59.94,
   -29.79
  ],
  [
   44.29,
   47.54,
   8.61,
   6.5,
   -59.85,
   -29.79
  ],
  [
   44.03,
   51.24,
   6.67,
   6.85,
   -60.55,
   -30.05
  ],
  [
   43.94,
   52.55,
   6.41,
   6.85,
   -62.13,
   -30.14
  ],
  [
   44.03,
   53.96,
   6.32,
   6.85,
   -63.72,
   -30.14
  ],
  [
   44.12,
   56.16,
   6.24,
   7.03,
   -67.67,
   -30.14
  ],
  [
   44.2,
   57.48,
   6.24,
   7.29,
   -70.75,
   -30.14
  ],
  [
   44.2,
   58.27,
   6.24,
   7.11,
   -71.45,
   -30.23
  ],
  [
   44.2,
   59.06,
   6.24,
   6.67,
   -71.71,
   -30.49
  ],
  [
   44.2,
   59.23,
   6.24,
   6.76,
   -71.89,
   -30.58
  ],
  [
   44.2,
   59.23,
   6.24,
   6.76,
   -71.89,
   -30.58
  ],
  [
   44.2,
   59.23,
   6.24,
   6.67,
   -71.8,
   -30.58
  ],
  [
   44.2,
   59.32,
   6.24,
   6.41,
   -71.71,
   -30.49
  ],
  [
   44.2,
   59.76,
   6.24,
   6.06,
   -71.98,
   -30.49
  ],
  [
   44.2,
   59.76,
   6.24,
   6.24,
   -72.5,
   -30.49
  ],
  [
   44.2,
   59.76,
   6.24,
   6.32,
   -72.77,
   -30.49
  ],
  [
   44.2,
   59.76,
   6.24,
   6.41,
   -73.12,
   -30.49
  ],
  [
   44.12,
   59.76,
   6.24,
   6.67,
   -73.3,
   -30.67
  ],
  [
   43.94,
   59.76,
   6.24,
   7.11,
   -73.65,
   -30.67
  ],
  [
   43.94,
   59.76,
   6.24,
   7.29,
   -73.74,
   -30.67
  ],
  [
   43.59,
   59.76,
   6.24,
   7.64,
   -73.91,
   -30.58
  ],
  [
   43.5,
   59.76,
   6.24,
   7.73,
   -74.0,
   -30.58
  ],
  [
   43.5,
   59.76,
   6.24,
   7.91,
   -74.0,
   -30.58
  ],
  [
   43.33,
   59.76,
   6.24,
   8.34,
   -74.09,
   -30.49
  ],
  [
   43.33,
   59.76,
   6.24,
   8.61,
   -74.44,
   -30.49
  ],
  [
   43.33,
   59.76,
   6.24,
   8.61,
   -74.44,
   -30.49
  ],
  [
   43.41,
   59.76,
   6.24,
   8.52,
   -74.44,
   -30.49
  ],
  [
   43.41,
   59.76,
   6.24,
   8.52,
   -74.7,
   -30.49
  ],
  [
   43.41,
   59.76,
   6.24,
   8.7,
   -74.79,
   -30.58
  ],
  [
   43.41,
   59.76,
   6.24,
   8.78,
   -74.79,
   -30.58
  ],
  [
   43.41,
   59.67,
   6.24,
   8.96,
   -74.79,
   -30.58
  ],
  [
   43.41,
   59.67,
   6.15,
   8.96,
   -74.79,
   -30.58
  ],
  [
   43.41,
   59.67,
   6.15,
   9.05,
   -74.79,
   -30.58
  ],
  [
   43.41,
   59.67,
   6.15,
   9.05,
   -74.79,
   -30.58
  ],
  [
   43.41,
   59.67,
   6.15,
   9.05,
   -74.88,
   -30.58
  ],
  [
   43.41,
   59.67,
   6.15,
   9.05,
   -74.88,
   -30.58
  ],
  [
   43.41,
   59.67,
   6.15,
   9.22,
   -74.88,
   -30.58
  ],
  [
   43.41,
   59.67,
   6.15,
   9.4,
   -74.88,
   -30.58
  ],
  [
   43.41,
   59.67,
   6.15,
   9.4,
   -74.88,
   -30.58
  ],
  [
   43.41,
   59.67,
   6.15,
   9.66,
   -74.88,
   -30.58
  ],
  [
   43.33,
   59.67,
   6.15,
   10.1,
   -74.88,
   -30.58
  ],
  [
   43.5,
   59.67,
   6.15,
   10.1,
   -74.88,
   -30.58
  ],
  [
   43.5,
   59.67,
   6.15,
   10.1,
   -74.97,
   -30.49
  ],
  [
   43.5,
   59.67,
   6.15,
   10.01,
   -74.97,
   -30.49
  ],
  [
   43.59,
   59.67,
   6.15,
   10.01,
   -74.97,
   -30.49
  ],
  [
   43.59,
   59.67,
   6.15,
   9.93,
   -74.97,
   -30.49
  ],
  [
   43.85,
   59.67,
   6.15,
   9.93,
   -74.97,
   -30.49
  ],
  [
   43.94,
   59.67,
   6.15,
   9.84,
   -74.97,
   -30.58
  ],
  [
   43.94,
   59.67,
   6.15,
   9.4,
   -74.79,
   -30.58
  ],
  [
   43.94,
   59.67,
   6.15,
   9.75,
   -74.79,
   -30.58
  ],
  [
   43.94,
   59.67,
   6.15,
   9.14,
   -74.44,
   -30.58
  ],
  [
   43.85,
   59.67,
   6.15,
   9.14,
   -74.35,
   -30.58
  ],
  [
   43.94,
   59.67,
   6.15,
   9.84,
   -74.35,
   -30.58
  ],
  [
   43.94,
   59.67,
   6.15,
   9.75,
   -74.53,
   -30.58
  ],
  [
   44.12,
   59.67,
   6.15,
   9.75,
   -74.53,
   -30.58
  ],
  [
   44.12,
   59.67,
   6.15,
   9.93,
   -74.79,
   -30.67
  ],
  [
   44.12,
   59.67,
   6.15,
   10.1,
   -74.88,
   -30.67
  ],
  [
   44.03,
   59.67,
   6.15,
   10.37,
   -74.88,
   -30.67
  ],
  [
   43.94,
   59.67,
   6.15,
   10.45,
   -74.88,
   -30.67
  ],
  [
   44.2,
   59.67,
   6.15,
   10.45,
   -74.88,
   -30.67
  ],
  [
   44.2,
   59.67,
   6.15,
   10.45,
   -74.88,
   -30.67
  ],
  [
   44.2,
   59.67,
   6.15,
   10.45,
   -74.88,
   -30.67
  ],
  [
   44.2,
   59.67,
   6.15,
   10.54,
   -74.88,
   -30.76
  ],
  [
   44.2,
   59.67,
   6.15,
   10.54,
   -74.88,
   -30.76
  ],
  [
   44.2,
   59.67,
   6.15,
   10.54,
   -74.88,
   -30.76
  ],
  [
   44.2,
   59.67,
   6.15,
   10.54,
   -74.88,
   -30.76
  ],
  [
   44.2,
   59.67,
   6.15,
   10.54,
   -74.88,
   -30.76
  ],
  [
   44.2,
   59.67,
   6.15,
   10.54,
   -74.88,
   -30.76
  ],
  [
   44.2,
   59.67,
   6.15,
   10.54,
   -74.88,
   -30.84
  ],
  [
   44.2,
   59.67,
   6.15,
   10.54,
   -74.88,
   -30.84
  ],
  [
   44.2,
   59.67,
   6.15,
   10.54,
   -74.88,
   -30.84
  ],
  [
   44.2,
   59.67,
   6.15,
   10.54,
   -74.88,
   -30.84
  ],
  [
   44.2,
   59.67,
   6.15,
   10.72,
   -74.88,
   -30.84
  ],
  [
   44.2,
   59.67,
   6.15,
   10.72,
   -74.88,
   -30.84
  ],
  [
   44.2,
   59.67,
   6.15,
   10.72,
   -74.88,
   -30.84
  ],
  [
   44.2,
   59.67,
   6.15,
   10.81,
   -74.88,
   -30.84
  ],
  [
   44.12,
   59.67,
   6.15,
   10.89,
   -74.88,
   -30.84
  ],
  [
   44.03,
   59.67,
   6.15,
   10.98,
   -74.88,
   -30.84
  ],
  [
   44.2,
   59.41,
   6.15,
   11.25,
   -74.88,
   -30.84
  ],
  [
   44.12,
   58.88,
   6.15,
   11.86,
   -74.53,
   -30.84
  ],
  [
   38.93,
   54.49,
   6.15,
   12.56,
   -72.42,
   -30.67
  ],
  [
   34.45,
   52.64,
   6.15,
   11.68,
   -72.24,
   -30.41
  ],
  [
   27.42,
   50.88,
   6.15,
   8.87,
   -70.31,
   -30.32
  ],
  [
   20.91,
   48.51,
   6.15,
   5.88,
   -66.26,
   -30.32
  ],
  [
   15.9,
   45.17,
   6.15,
   4.39,
   -61.25,
   -30.23
  ],
  [
   11.86,
   38.93,
   6.15,
   3.33,
   -53.96,
   -29.88
  ],
  [
   7.47,
   31.9,
   6.15,
   1.58,
   -46.84,
   -28.38
  ],
  [
   3.6,
   24.69,
   6.15,
   0.7,
   -39.72,
   -27.68
  ],
  [
   1.23,
   16.87,
   6.15,
   0.43,
   -31.46,
   -26.27
  ],
  [
   0.17,
   9.84,
   6.15,
   0.35,
   -21.97,
   -26.1
  ],
  [
   0.17,
   4.48,
   6.15,
   0.52,
   -14.15,
   -26.1
  ],
  [
   0.26,
   0.0,
   6.15,
   1.05,
   -8.26,
   -26.01
  ],
  [
   0.08,
   -3.33,
   6.15,
   1.58,
   -3.95,
   -26.01
  ],
  [
   0.08,
   -5.0,
   6.15,
   1.31,
   -0.79,
   -26.01
  ],
  [
   0.0,
   -5.0,
   6.15,
   0.35,
   -0.08,
   -26.1
  ],
  [
   -0.08,
   -5.0,
   6.15,
   0.0,
   -0.08,
   -26.1
  ],
  [
   -0.08,
   -5.0,
   6.15,
   -0.43,
   -0.08,
   -26.1
  ],
  [
   -0.08,
   -5.0,
   6.15,
   -0.79,
   -0.08,
   -26.19
  ],
  [
   -0.08,
   -5.0,
   6.15,
   -1.14,
   -0.35,
   -26.19
  ],
  [
   -0.08,
   -5.0,
   6.15,
   -1.4,
   -0.52,
   -26.27
  ],
  [
   -0.08,
   -5.0,
   6.15,
   -1.4,
   -0.52,
   -26.27
  ],
  [
   -0.08,
   -5.0,
   6.15,
   -1.58,
   -0.52,
   -26.27
  ],
  [
   -0.08,
   -4.92,
   6.15,
   -2.1,
   -0.52,
   -26.27
  ],
  [
   -0.08,
   -4.92,
   6.15,
   -2.54,
   -0.52,
   -26.27
  ]
 ],
 "rel_time_sec": [
  0.020233154296875,
  0.140028715133667,
  0.25577807426452637,
  0.37175607681274414,
  0.4880673885345459,
  0.6037614345550537,
  0.7283446788787842,
  0.8536438941955566,
  0.9755768775939941,
  1.0975346565246582,
  1.2194547653198242,
  1.341235637664795,
  1.4631600379943848,
  1.5850586891174316,
  1.7070286273956299,
  1.8240017890930176,
  1.9495978355407715,
  2.0649142265319824,
  2.1765637397766113,
  2.288447380065918,
  2.400195598602295,
  2.519766092300415,
  2.6357829570770264,
  2.751723051071167,
  2.868076801300049,
  2.9837450981140137,
  3.099738597869873,
  3.2157745361328125,
  3.331678867340088,
  3.4481329917907715,
  3.5600600242614746,
  3.6757607460021973,
  3.791828155517578,
  3.906311273574829,
  4.023740530014038,
  4.140161037445068,
  4.259756803512573,
  4.375954627990723,
  4.491740465164185,
  4.608181715011597,
  4.7278077602386475,
  4.843775033950806,
  4.954529762268066,
  5.066776514053345,
  5.178736925125122,
  5.29045557975769,
  5.40775203704834,
  5.524170398712158,
  5.643731594085693,
  5.759748220443726,
  5.870809555053711,
  5.987807512283325,
  6.104168891906738,
  6.22372579574585,
  6.339698076248169,
  6.4557106494903564,
  6.572139739990234,
  6.6917102336883545,
  6.807710647583008,
  6.923730134963989,
  7.04665994644165,
  7.171728610992432,
  7.294816732406616,
  7.414705753326416,
  7.53656530380249,
  7.658606290817261,
  7.780632257461548,
  7.895406484603882,
  8.00741195678711,
  8.128315687179565,
  8.24145793914795,
  8.353034496307373,
  8.47179889678955,
  8.587981939315796,
  8.703729629516602,
  8.82070779800415,
  8.939739465713501,
  9.055970430374146,
  9.171706438064575,
  9.288722515106201,
  9.40780258178711,
  9.523972749710083,
  9.63974905014038,
  9.756737232208252,
  9.875742673873901,
  9.99103307723999,
  10.10774540901184,
  10.224802017211914,
  10.343822479248047,
  10.459994077682495,
  10.575762271881104,
  10.692811250686646,
  10.805421113967896,
  10.917515993118286,
  11.029495000839233,
  11.14862322807312,
  11.263000011444092,
  11.379750490188599,
  11.496799945831299,
  11.615783214569092,
  11.73194169998169,
  11.843067169189453,
  11.959786653518677,
  12.076797485351562,
  12.199906587600708,
  12.315759181976318,
  12.432836055755615,
  12.551708221435547,
  12.667945146560669,
  12.783793449401855,
  12.90771222114563,
  13.031655073165894,
  13.151737928390503,
  13.27576208114624,
  13.396812915802002,
  13.518646717071533,
  13.640801906585693,
  13.759972095489502,
  13.877454042434692,
  13.98979377746582,
  14.101414680480957,
  14.219997882843018,
  14.335990905761719,
  14.451754808425903,
  14.568960666656494,
  14.687725305557251,
  14.803970098495483,
  14.919725179672241,
  15.036928653717041,
  15.15572738647461,
  15.27199125289917,
  15.387728691101074,
  15.504921674728394,
  15.623716115951538,
  15.739976406097412,
  15.855767965316772,
  15.972882509231567,
  16.08651328086853,
  16.197023630142212,
  16.31579899787903,
  16.43203377723694,
  16.547754764556885,
  16.664910316467285,
  16.77746343612671,
  16.8895902633667,
  17.00168204307556,
  17.113654851913452,
  17.23186445236206,
  17.348033666610718,
  17.463757514953613,
  17.58092498779297,
  17.69972038269043,
  17.81596064567566,
  17.931740283966064,
  18.048922300338745,
  18.16122007369995,
  18.279764413833618,
  18.395959615707397,
  18.511753797531128,
  18.628931522369385,
  18.747725009918213,
  18.870679140090942,
  18.99399161338806,
  19.116130590438843,
  19.237982988357544,
  19.35999822616577,
  19.481800079345703,
  19.601855754852295,
  19.717588186264038,
  19.829465627670288,
  19.941708087921143,
  20.060282707214355,
  20.175686359405518,
  20.287148237228394,
  20.403783798217773,
  20.520496129989624,
  20.639730215072632,
  20.75577402114868,
  20.871715545654297,
  20.98850154876709,
  21.10775399208069,
  21.223752975463867,
  21.33977746963501,
  21.456483840942383,
  21.575703620910645,
  21.6917405128479,
  21.807759046554565,
  21.924575328826904,
  22.043724298477173,
  22.159796953201294,
  22.270615339279175,
  22.38775372505188,
  22.504568815231323,
  22.617266416549683,
  22.736241817474365,
  22.851806163787842,
  22.963714122772217,
  23.07519507408142,
  23.191834211349487,
  23.309089422225952,
  23.427756309509277,
  23.5440616607666,
  23.65977120399475,
  23.777080059051514,
  23.895753622055054,
  24.012000799179077,
  24.12773609161377,
  24.24568819999695,
  24.357240915298462,
  24.475714445114136,
  24.59201145172119,
  24.712073802947998,
  24.834091424942017,
  24.956135511398315,
  25.07838201522827,
  25.20019030570984,
  25.321995735168457,
  25.44402527809143,
  25.5650851726532,
  25.679644346237183,
  25.79155206680298,
  25.903534650802612,
  26.015214443206787,
  26.13179659843445,
  26.249144792556763,
  26.361281394958496,
  26.479774475097656,
  26.59604787826538,
  26.71175456047058,
  26.829104900360107,
  26.947699546813965,
  27.06400418281555,
  27.180073261260986,
  27.299782752990723,
  27.415748834609985,
  27.53204584121704,
  27.647725820541382,
  27.765133142471313,
  27.883707284927368,
  28.000084161758423,
  28.115705728530884,
  28.23580551147461,
  28.34605836868286,
  28.463780879974365,
  28.579989194869995,
  28.691932439804077,
  28.803699731826782,
  28.915491342544556,
  29.0317862033844,
  29.14867615699768,
  29.267730951309204,
  29.383781671524048,
  29.499743461608887,
  29.616676807403564,
  29.735734224319458,
  29.85179352760315,
  29.967771291732788,
  30.084702968597412,
  30.203746557235718,
  30.31977152824402,
  30.430851697921753,
  30.547754049301147,
  30.67426061630249,
  30.796250343322754,
  30.920027256011963,
  31.03817653656006,
  31.162219524383545,
  31.282289743423462,
  31.410343170166016,
  31.519724130630493,
  31.631840467453003,
  31.744102478027344,
  31.855841636657715,
  31.971769094467163,
  32.089420795440674,
  32.2077910900116,
  32.323872804641724,
  32.43503546714783,
  32.551753997802734,
  32.6686532497406,
  32.78771471977234,
  32.90374803543091,
  33.01969242095947,
  33.13673996925354,
  33.25572872161865,
  33.37170743942261,
  33.48771286010742,
  33.604774951934814,
  33.72375249862671,
  33.83976769447327,
  33.955788135528564,
  34.07280111312866,
  34.1919949054718,
  34.3077507019043,
  34.419750690460205,
  34.531827211380005,
  34.644031286239624,
  34.755897760391235,
  34.86747360229492,
  34.983781576156616,
  35.101272106170654,
  35.219788789749146,
  35.33611822128296,
  35.44733119010925,
  35.563735485076904,
  35.682581663131714,
  35.79985332489014,
  35.91606616973877,
  36.031795263290405,
  36.14918875694275,
  36.26777219772339,
  36.38377046585083,
  36.50486516952515,
  36.62061095237732,
  36.73805618286133,
  36.86049842834473,
  36.98226881027222,
  37.10222268104553,
  37.22639179229736,
  37.34976077079773,
  37.462085008621216,
  37.573710918426514,
  37.68584394454956,
  37.79761528968811,
  37.915772438049316,
  38.03213429450989,
  38.15173006057739,
  38.26773285865784,
  38.38379740715027,
  38.500067949295044,
  38.61144399642944,
  38.7277455329895,
  38.84482669830322,
  38.96368074417114,
  39.079758167266846,
  39.19583058357239,
  39.312859773635864,
  39.43169689178467,
  39.54772615432739,
  39.663716077804565,
  39.78086709976196,
  39.89978623390198,
  40.01570129394531,
  40.1316864490509,
  40.248913526535034,
  40.36182618141174,
  40.47425818443298,
  40.58584642410278,
  40.698264360427856,
  40.809632778167725,
  40.927823066711426,
  41.04414391517639,
  41.16378402709961,
  41.279791831970215,
  41.39580035209656,
  41.51218032836914,
  41.63179898262024,
  41.74769473075867,
  41.86371660232544,
  41.98016953468323,
  42.09986734390259,
  42.21580171585083,
  42.33176136016846,
  42.456602811813354,
  42.57744240760803,
  42.69691729545593,
  42.82055044174194,
  42.94440197944641,
  43.06643486022949,
  43.18879723548889,
  43.30195212364197,
  43.41395545005798,
  43.52622318267822,
  43.638102769851685,
  43.749621629714966,
  43.86777329444885,
  43.98412871360779,
  44.095489740371704,
  44.211749792099,
  44.32925724983215,
  44.4477481842041,
  44.564218044281006,
  44.68374991416931,
  44.797563552856445,
  44.91575384140015,
  45.03216743469238,
  45.151700258255005,
  45.26777005195618,
  45.38374900817871,
  45.500187158584595,
  45.61976361274719,
  45.73576903343201,
  45.85175895690918,
  45.96818447113037,
  46.08770799636841,
  46.202199935913086,
  46.31344151496887,
  46.4260196685791,
  46.53802990913391,
  46.64967060089111,
  46.76242160797119,
  46.87984490394592,
  46.99593925476074,
  47.11173057556152,
  47.22914743423462,
  47.34780287742615,
  47.463780879974365,
  47.57974410057068,
  47.69708847999573,
  47.8157696723938,
  47.93177580833435,
  48.04775023460388,
  48.16508102416992,
  48.29022669792175,
  48.40842247009277,
  48.53038740158081,
  48.65275979042053,
  48.774433851242065,
  48.88771605491638,
  49.003740310668945,
  49.12215566635132,
  49.234137296676636,
  49.35224151611328,
  49.46796727180481,
  49.57973289489746,
  49.69578266143799,
  49.81361413002014,
  49.93172812461853,
  50.04820895195007,
  50.16774129867554,
  50.28372550010681,
  50.39969539642334,
  50.51616168022156,
  50.635722398757935,
  50.751763343811035,
  50.868319034576416,
  50.98370838165283,
  51.09975004196167,
  51.21762132644653,
  51.33571529388428,
  51.45209455490112,
  51.57175374031067,
  51.68775296211243,
  51.80375123023987,
  51.92010951042175,
  52.04035186767578,
  52.1542911529541,
  52.27228569984436,
  52.38823318481445,
  52.499751567840576,
  52.615785121917725,
  52.733731269836426,
  52.85174059867859,
  52.96785569190979,
  53.08376908302307,
  53.201671838760376,
  53.31974792480469,
  53.436039686203,
  53.55183506011963,
  53.66919660568237,
  53.787699460983276,
  53.910197019577026,
  54.034717321395874,
  54.156615257263184,
  54.27864074707031,
  54.40075969696045,
  54.520607709884644,
  54.64471125602722,
  54.76669669151306,
  54.88862156867981,
  55.01110649108887,
  55.12441301345825,
  55.23640990257263,
  55.347877979278564,
  55.45938801765442,
  55.575828075408936,
  55.69328832626343,
  55.81176137924194,
  55.92776322364807,
  56.043753147125244,
  56.16126346588135,
  56.279741048812866,
  56.39571261405945,
  56.511714696884155,
  56.62922739982605,
  56.74771189689636,
  56.8637900352478,
  56.979756355285645,
  57.09783935546875,
  57.21576189994812,
  57.33178210258484,
  57.44778299331665,
  57.565269947052,
  57.68368625640869,
  57.79972052574158,
  57.91571807861328,
  58.03365969657898,
  58.14589524269104,
  58.25776028633118,
  58.36947822570801,
  58.487792015075684,
  58.60376763343811,
  58.71971368789673,
  58.83716583251953,
  58.95572304725647,
  59.072195053100586,
  59.18396234512329,
  59.299774169921875,
  59.41785764694214,
  59.53575778007507,
  59.65229272842407,
  59.771772623062134,
  59.8878698348999,
  60.00377702713013,
  60.132246255874634,
  60.24973678588867,
  60.37190127372742,
  60.49365472793579,
  60.61568236351013,
  60.73762106895447,
  60.86001133918762,
  60.9737114906311,
  61.08598804473877,
  61.1977264881134,
  61.309701919555664,
  61.42152786254883,
  61.539708375930786,
  61.65579009056091,
  61.77172017097473,
  61.889389514923096,
  62.007741928100586,
  62.12374138832092,
  62.239715337753296,
  62.35726809501648,
  62.47571086883545,
  62.59176588058472,
  62.707725048065186,
  62.82530689239502,
  62.94370794296265,
  63.059807777404785,
  63.1728675365448,
  63.28396272659302,
  63.4038724899292,
  63.51977896690369,
  63.63579821586609,
  63.75224184989929,
  63.86468148231506,
  63.97626233100891,
  64.08841323852539,
  64.20030093193054,
  64.31208443641663,
  64.42395520210266,
  64.53983354568481,
  64.65983510017395,
  64.7757215499878,
  64.89224100112915,
  65.0117781162262,
  65.127769947052,
  65.23821258544922,
  65.35570693016052,
  65.47231841087341,
  65.80780577659607,
  65.92375755310059,
  66.04831767082214,
  66.17086100578308,
  66.29296851158142,
  66.41279721260071,
  66.5366735458374,
  66.65780377388,
  66.78077292442322,
  66.89397740364075,
  67.0059187412262,
  67.11798477172852,
  67.2297112941742,
  67.34156537055969,
  67.45974779129028,
  67.5757520198822,
  67.69172668457031,
  67.80943775177002,
  67.92769598960876,
  68.04370498657227,
  68.15971517562866,
  68.27747130393982,
  68.39571022987366,
  68.51178407669067
 ],
 "phases": [
  {
   "name": "APPROACH_PICK",
   "start_idx": 240,
   "end_idx": 290
  },
  {
   "name": "PICK",
   "start_idx": 291,
   "end_idx": 469
  },
  {
   "name": "APPROACH_PLACE",
   "start_idx": 470,
   "end_idx": 512
  },
  {
   "name": "PLACE",
   "start_idx": 513,
   "end_idx": 584
  }
 ],
 "gripper_events": [
  {
   "idx": 355,
   "rel_time_sec": 41.51218032836914,
   "action": "close"
  },
  {
   "idx": 552,
   "rel_time_sec": 64.53983354568481,
   "action": "open"
  }
 ],
 "key_log": [
  {
   "idx": 240,
   "rel_time_sec": 28.115705728530884,
   "key": "1",
   "meaning": "APPROACH_PICK"
  },
  {
   "idx": 291,
   "rel_time_sec": 34.07280111312866,
   "key": "2",
   "meaning": "PICK"
  },
  {
   "idx": 355,
   "rel_time_sec": 41.51218032836914,
   "key": "c",
   "meaning": "gripper_close"
  },
  {
   "idx": 470,
   "rel_time_sec": 55.01110649108887,
   "key": "3",
   "meaning": "APPROACH_PLACE"
  },
  {
   "idx": 513,
   "rel_time_sec": 60.00377702713013,
   "key": "4",
   "meaning": "PLACE"
  },
  {
   "idx": 552,
   "rel_time_sec": 64.53983354568481,
   "key": "o",
   "meaning": "gripper_open"
  }
 ],
 "derived_from": {
  "teach": "drag_v2_20221013_144348.json",
  "replaced": {
   "APPROACH_PICK idx 240-290": [
    -40.69,
    66.09,
    1.49,
    0.61,
    -70.48,
    -29.88
   ],
   "PICK idx 291-469": [
    -40.51,
    79.98,
    -0.43,
    0.43,
    -73.47,
    -29.97
   ]
  },
  "source": "runs/experiments/gamepad_teleop/teleop_20261109_093620/log.jsonl (seq 161 付近の実測・seq 169 の持ち上げ後の実測)",
  "reason": "位置1の教えた PICK が浅かった (183454 で 38.9px, 20261109_093045 で 43.4px)。ゲームパッドで奥までつかむ姿勢を作り直した。箱側の 2 姿勢は元のまま"
 }
}
```


## 新しい記録で位置1を18本、前からの記録で位置2を8本撮った

撮り方は、1本ごとに同じ1行です。位置合わせの画面でブロックをお手本の位置に戻し、q で閉じると、ブロックと箱の位置を測って（measure）、そのまま再生と記録に進みます。再生の最後にアームは HOME に戻るので、続けて回せます。位置2は、別のターミナルで並べて撮りました。

```
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
```

位置2は `--episode 191541`、`--teach drag_v2_20221013_230205.json` に替えて同じ形で撮りました。録画係（recorder.py --top --no-side）は別のターミナルで常駐させ、再生の始まりと終わりの合図で1本ずつ top.mp4 を書き出します。横のカメラは使っていません（π0.5 の学習に使うのは上カメラだけ）。

撮った27本を、つかみの深さ・下ろす時間・爪の値で分けた結果です。

| 位置 | 撮った本数 | 使う | 浅い | 爪が乗った | 教え直す前の記録 |
|---|---|---|---|---|---|
| 1 | 19 | 10 | 5 | 3 | 1 |
| 2 | 8 | 7 | 0 | 1 | 0 |

- 位置1の浅い5本は、はみ出しが24.9〜30.5px で、線のすぐ上でした。新しい記録で深くなっていても、ブロックの置き方の数 mm の差で線を越えます
- 位置1の深い本は、アームの根元からブロックまでが266〜276mm、浅い本は272〜284mm に集まっていました（試行 JSON の block_dist_from_base_mm。赤いケーブルを拾って40〜75mm と出た本は除く）。重なりがあり、距離だけでは決まりません
- 位置2の7本は、はみ出しが −7.8〜10.9px で、どれも深いつかみでした。前からの教えた記録のままで深くつかめています

置き場所ごとの本数は、前回（LOG460・依頼117）で浅いお手本と指の写ったお手本を外した21本と合わせて、次のようになりました。

| 位置 | 前からの21本 | この回で足した本 | 合わせて | 10本まで |
|---|---|---|---|---|
| 1 | 0 | 10 | 10 | 0 |
| 2 | 3 | 7 | 10 | 0 |
| 3 | 2 | 0 | 2 | あと8 |
| 4 | 5 | 0 | 5 | あと5 |
| 5 | 11 | 0 | 11 | 足さない |

1本の撮影にかかった時間は、位置1の続けて撮った9本（09:53〜10:04）で、1本あたり約1分40秒でした。


## 爪がブロックに乗った4本は、下ろすのに7.9〜9.1秒かかっていた

撮っている途中で、爪がブロックの端に当たって下りなくなり、ブロックがずれてから結局下りきる回がありました。その回が記録から見分けられるかを、27本の上カメラの映像・角度・時間・電流で調べました。

【画像】LOG463_05_snag_top.jpg 下ろし始めから閉じた直後までの上カメラ8コマ（左から右へ時間順）。1段目と3段目は普段の本、2段目と4段目は爪がブロックに乗った本。乗った本では、右の爪がブロックの上に重なったまま進まない

【画像】LOG463_06_side_snag.jpg 位置2 で爪が乗った回（103504）を横から撮った12コマ。2段目で爪の先がブロックの上に乗って止まり、ブロックを傾けてからつかんでいる

見分けられたのは、ブロックの上からつかむ姿勢まで下ろす区間の時間と、着いたときの肩の角度でした。

| | 普段の23本 | 爪が乗った4本 |
|---|---|---|
| 下ろす区間の時間 | 1.06〜1.10秒 | 7.86〜9.12秒 |
| 着いた肩 j1（位置1・新しい記録） | 80.50〜80.94° | 79.01〜79.10° |
| 着いた肩 j1（位置2） | 87.89° | 86.74° |
| 着いた手首 j4（位置1・新しい記録） | −75.32〜−76.02° | −76.46〜−76.99° |

乗った本では、爪がブロックに支えられて肩が目標の手前（約1.5°）で止まり、到達の確かめ（目標から3°以内）に入るまで、上限の8秒近く待っていました。再生は止まらずに閉じて進むので、端末の出力だけでは気づきにくく、区間の時間で見るのが確実です。

爪が乗った4本のうち、102715 と 102903 はブロックをつかめずに空で閉じていました（人の判定も「つかめなかった」）。この2本は、閉じたあとの爪の値が最大22で、空で閉じたときの値（15〜22前後）と同じでした。残りの2本（101434・103504）は、ブロックを押し込んだ形でつかめていて、深さの数字も1.9px・0.2px と深く出ます。**深さの数字だけでは、乗ってから押し込んだつかみを、深いつかみと取り違えます。** 使うかどうかは、深さと下ろす時間の両方で決めることにしました。

- ねらい：爪がブロックに乗った本を、学習のお手本から外せるようにする
- 変わったこと：判定に、下ろす区間の時間（5秒を超えたら外す）を足した。lab/Log25/log25_runs_table.py の決まり
- 見込める効果：深さの線だけでは使う側に入っていた2本（101434・103504）が外れる。π0.5 が、ブロックに乗ってから押し込む動きを覚えるのを防げる見込み（学習はまだ回していない）


## 爪と肩の電流の値では、爪が乗った瞬間は見えなかった

爪が乗ったことを電流で見分けられるかも調べましたが、この回の記録では見分けられませんでした。理由は2つです。

1. 下ろしている間の値が残っていない。つかむ姿勢へ下ろす命令の返事を待つ約1秒（daemon の send_angles の往復 1.03秒）の間は、電流を読まない作りにしている（依頼121。再生の本体を待たせないため）。下ろす区間の0.7秒ほどが、ちょうどこの間に入る
2. 爪の値は、開いている間は変わらない。下ろすときの爪は開いたままで、ブロックに乗っても爪のサーボには力がかからない

肩の値（番地69、下位の値）は、下ろしてから閉じるまでの間で、乗った本が0〜4、普段の本が0〜2でした（乗っていない 101023 だけ6）。差は小さく、重なっています。肩の値で見分けるなら、下ろしている間も1秒10回くらいで読む必要があります。

一方、閉じたあとの爪の値は、つかめたかどうかをはっきり分けました。つかめた25本は最大826〜889、空で閉じた2本は最大22でした。

- 1本あたりの電流の記録は、普段の本で77〜93行、爪が乗った本で147〜163行（1秒に2.2〜3.3行）。爪を開け閉めしている約14秒と、下ろす命令の返事待ちの間は読んでいない
- 読み取りが見込みの時間を超えた回（再生を待たせたかもしれない回）は、26本で0回、爪が乗った 102715 で1回だった。この本は使わない


## 27本の表（lab/Log25/runs_table.csv から）

下ろす区間は、ブロックの上からつかむ姿勢までの区間の時間（試行 JSON の segment_elapsed_sec）です。着いた j1・j4 は、その区間の終わりに読んだ角度です。

| run | 位置 | 教えた記録 | つかめた/箱 | 閉じる直前 | 閉じて1秒後 | 爪の値 最大 | 下ろす区間 | 着いた j1 | 着いた j4 | 判定 |
|---|---|---|---|---|---|---|---|---|---|---|
| 20261109_093045 | 1 | 20221013_144348 | yes/yes | 71.4px | 43.4px | 863 | 1.08秒 | 81.47° | -88.15° | 外す：浅い (閉じて 1.0 秒後 43.4px > 24px) / 教え直す前の記録 |
| 20261109_094839 | 1 | 20261109_094222 | yes/yes | 42.5px | 16.2px | 885 | 1.07秒 | 80.5° | -75.67° | 使う |
| 20261109_095308 | 1 | 20261109_094222 | yes/yes | 51.9px | 19.6px | 878 | 1.09秒 | 80.59° | -75.58° | 使う |
| 20261109_095452 | 1 | 20261109_094222 | yes/yes | 59.2px | 29.2px | 881 | 1.07秒 | 80.59° | -75.58° | 外す：浅い (閉じて 1.0 秒後 29.2px > 24px) |
| 20261109_095630 | 1 | 20261109_094222 | yes/yes | 51.0px | 26.0px | 868 | 1.06秒 | 80.59° | -75.58° | 外す：浅い (閉じて 1.0 秒後 26.0px > 24px) |
| 20261109_095810 | 1 | 20261109_094222 | yes/yes | 35.8px | 11.2px | 833 | 1.06秒 | 80.59° | -75.49° | 使う |
| 20261109_095948 | 1 | 20261109_094222 | yes/yes | 50.3px | 19.5px | 863 | 1.08秒 | 80.59° | -75.58° | 使う |
| 20261109_100126 | 1 | 20261109_094222 | yes/yes | 43.2px | 10.5px | 826 | 1.07秒 | 80.59° | -75.58° | 使う |
| 20261109_100307 | 1 | 20261109_094222 | yes/yes | 42.4px | 19.2px | 866 | 1.06秒 | 80.59° | -75.67° | 使う |
| 20261109_100444 | 1 | 20261109_094222 | yes/yes | 39.7px | 12.0px | 828 | 1.07秒 | 80.5° | -75.49° | 使う |
| 20261109_100716 | 1 | 20261109_094222 | yes/yes | 49.3px | 22.5px | 865 | 1.10秒 | 80.59° | -75.49° | 使う |
| 20261109_100852 | 1 | 20261109_094222 | yes/yes | 54.5px | 29.4px | 869 | 1.06秒 | 80.59° | -75.67° | 外す：浅い (閉じて 1.0 秒後 29.4px > 24px) |
| 20261109_101023 | 1 | 20261109_094222 | yes/yes | 59.6px | 30.5px | 864 | 1.08秒 | 80.94° | -76.02° | 外す：浅い (閉じて 1.0 秒後 30.5px > 24px) |
| 20261109_101157 | 1 | 20261109_094222 | yes/yes | 42.2px | 15.6px | 831 | 1.08秒 | 80.5° | -75.67° | 使う |
| 20261109_101434 | 1 | 20261109_094222 | yes/yes | 2.7px | 1.9px | 835 | 7.87秒 | 79.01° | -76.46° | 外す：爪がブロックに乗った (PICK の区間 7.9 秒) |
| 20261109_101615 | 1 | 20261109_094222 | yes/yes | 47.9px | 24.9px | 859 | 1.06秒 | 80.5° | -75.32° | 外す：浅い (閉じて 1.0 秒後 24.9px > 24px) |
| 20261109_102109 | 2 | 20221013_230205 | yes/yes | 41.0px | 10.9px | 841 | 1.08秒 | 87.89° | -46.49° | 使う |
| 20261109_102248 | 2 | 20221013_230205 | yes/yes | 31.1px | -0.9px | 833 | 1.07秒 | 87.89° | -46.49° | 使う |
| 20261109_102431 | 2 | 20221013_230205 | yes/yes | 26.0px | -4.6px | 835 | 1.06秒 | 87.89° | -46.49° | 使う |
| 20261109_102715 | 1 | 20261109_094222 | no/no | -2.8px | -15.7px | 22 | 8.50秒 | 79.01° | -76.46° | 外す：爪がブロックに乗った (PICK の区間 8.5 秒) |
| 20261109_102903 | 1 | 20261109_094222 | no/no | 1.1px | -1.9px | 22 | 9.12秒 | 79.1° | -76.99° | 外す：爪がブロックに乗った (PICK の区間 9.1 秒) |
| 20261109_103049 | 1 | 20261109_094222 | yes/yes | 23.9px | 3.0px | 831 | 1.07秒 | 80.5° | -75.49° | 使う |
| 20261109_103504 | 2 | 20221013_230205 | yes/yes | 10.4px | 0.2px | 889 | 7.86秒 | 86.74° | -46.14° | 外す：爪がブロックに乗った (PICK の区間 7.9 秒) |
| 20261109_103804 | 2 | 20221013_230205 | yes/yes | 24.4px | -6.9px | 840 | 1.07秒 | 87.89° | -46.49° | 使う |
| 20261109_103943 | 2 | 20221013_230205 | yes/yes | 24.3px | -7.8px | 841 | 1.07秒 | 87.89° | -46.4° | 使う |
| 20261109_104110 | 2 | 20221013_230205 | yes/yes | 26.4px | -2.0px | 832 | 1.07秒 | 87.89° | -46.4° | 使う |
| 20261109_104517 | 2 | 20221013_230205 | yes/yes | 22.0px | -7.8px | 840 | 1.06秒 | 87.89° | -46.49° | 使う |

### runs_table.csv（全量）

```csv
run,position,teach,pick,place,before_px,after_px,hand_suspect,grip_max,grip_median,pick_segment_sec,pick_to_close_sec,pick_arrival_max_delta_deg,j1_arrived,j2_arrived,j4_arrived,shoulder_lo_during_pick,block_dist_from_base_mm,block_moved_mm,use,reason
run_0001_20261109_093045,1,drag_v2_20221013_144348.json,yes,yes,71.4,43.4,False,863,854,1.084,2.08,0.88,81.47,7.82,-88.15,5,283.4,,外す,浅い (閉じて 1.0 秒後 43.4px > 24px) / 教え直す前の記録
run_0001_20261109_094839,1,drag_v2_20261109_094222.json,yes,yes,42.5,16.2,False,885,849,1.072,2.07,2.2,80.5,0.43,-75.67,1,269.3,0.37,使う,
run_0001_20261109_095308,1,drag_v2_20261109_094222.json,yes,yes,51.9,19.6,False,878,850,1.087,2.08,2.11,80.59,0.17,-75.58,1/2,272.4,0.01,使う,
run_0001_20261109_095452,1,drag_v2_20261109_094222.json,yes,yes,59.2,29.2,False,881,862,1.068,2.07,2.11,80.59,0.17,-75.58,2,284.1,0.0,外す,浅い (閉じて 1.0 秒後 29.2px > 24px)
run_0001_20261109_095630,1,drag_v2_20261109_094222.json,yes,yes,51.0,26.0,False,868,844,1.063,2.06,2.11,80.59,0.17,-75.58,2,46.4,6.26,外す,浅い (閉じて 1.0 秒後 26.0px > 24px)
run_0001_20261109_095810,1,drag_v2_20261109_094222.json,yes,yes,35.8,11.2,False,833,813,1.056,2.05,2.02,80.59,0.17,-75.49,1/2,268.7,0.0,使う,
run_0001_20261109_095948,1,drag_v2_20261109_094222.json,yes,yes,50.3,19.5,False,863,840,1.085,2.1,2.11,80.59,0.17,-75.58,1/2,269.2,0.66,使う,
run_0001_20261109_100126,1,drag_v2_20261109_094222.json,yes,yes,43.2,10.5,False,826,808,1.072,2.06,2.11,80.59,0.17,-75.58,1/2,275.6,0.49,使う,
run_0001_20261109_100307,1,drag_v2_20261109_094222.json,yes,yes,42.4,19.2,False,866,853,1.063,2.07,2.2,80.59,0.17,-75.67,1/2,268.9,0.0,使う,
run_0001_20261109_100444,1,drag_v2_20261109_094222.json,yes,yes,39.7,12.0,False,828,804,1.067,2.07,2.02,80.5,0.17,-75.49,1,47.3,3.4,使う,
run_0001_20261109_100716,1,drag_v2_20261109_094222.json,yes,yes,49.3,22.5,False,865,850,1.101,2.11,2.02,80.59,0.17,-75.49,1/2,270.4,0.0,使う,
run_0001_20261109_100852,1,drag_v2_20261109_094222.json,yes,yes,54.5,29.4,False,869,855,1.061,2.06,2.2,80.59,0.17,-75.67,1,275.0,0.0,外す,浅い (閉じて 1.0 秒後 29.4px > 24px)
run_0001_20261109_101023,1,drag_v2_20261109_094222.json,yes,yes,59.6,30.5,False,864,838,1.078,2.06,2.55,80.94,0.0,-76.02,6,278.7,0.47,外す,浅い (閉じて 1.0 秒後 30.5px > 24px)
run_0001_20261109_101157,1,drag_v2_20261109_094222.json,yes,yes,42.2,15.6,False,831,806,1.08,2.09,2.2,80.5,0.17,-75.67,0/1,266.3,0.0,使う,
run_0001_20261109_101434,1,drag_v2_20261109_094222.json,yes,yes,2.7,1.9,False,835,805,7.866,8.87,2.99,79.01,-0.96,-76.46,3/4,264.2,6.51,外す,爪がブロックに乗った (PICK の区間 7.9 秒)
run_0001_20261109_101615,1,drag_v2_20261109_094222.json,yes,yes,47.9,24.9,False,859,828,1.058,2.06,1.85,80.5,0.17,-75.32,0/1,271.7,0.0,外す,浅い (閉じて 1.0 秒後 24.9px > 24px)
run_0001_20261109_102109,2,drag_v2_20221013_230205.json,yes,yes,41.0,10.9,False,841,813,1.085,2.08,2.9,87.89,-33.83,-46.49,1,308.2,0.64,使う,
run_0001_20261109_102248,2,drag_v2_20221013_230205.json,yes,yes,31.1,-0.9,False,833,808,1.068,2.07,2.9,87.89,-33.83,-46.49,1,,,使う,
run_0001_20261109_102431,2,drag_v2_20221013_230205.json,yes,yes,26.0,-4.6,False,835,807,1.065,2.07,2.9,87.89,-33.83,-46.49,1,309.5,0.44,使う,
run_0001_20261109_102715,1,drag_v2_20261109_094222.json,no,no,-2.8,-15.7,True,22,11,8.5,10.7,2.99,79.01,-1.05,-76.46,1/3,60.1,0.76,外す,爪がブロックに乗った (PICK の区間 8.5 秒)
run_0001_20261109_102903,1,drag_v2_20261109_094222.json,no,no,1.1,-1.9,False,22,13,9.121,10.45,3.52,79.1,-0.96,-76.99,1/2/3,75.5,54.24,外す,爪がブロックに乗った (PICK の区間 9.1 秒)
run_0001_20261109_103049,1,drag_v2_20261109_094222.json,yes,yes,23.9,3.0,False,831,811,1.069,2.07,2.02,80.5,0.43,-75.49,0/1,,,使う,
run_0001_20261109_103504,2,drag_v2_20221013_230205.json,yes,yes,10.4,0.2,False,889,839,7.857,8.85,2.55,86.74,-35.77,-46.14,0/1,315.9,0.95,外す,爪がブロックに乗った (PICK の区間 7.9 秒)
run_0001_20261109_103804,2,drag_v2_20221013_230205.json,yes,yes,24.4,-6.9,False,840,817,1.068,2.07,2.9,87.89,-33.83,-46.49,1,57.4,1.22,使う,
run_0001_20261109_103943,2,drag_v2_20221013_230205.json,yes,yes,24.3,-7.8,True,841,808,1.068,2.06,2.81,87.89,-33.83,-46.4,1,54.5,,使う,
run_0001_20261109_104110,2,drag_v2_20221013_230205.json,yes,yes,26.4,-2.0,False,832,808,1.069,2.07,2.81,87.89,-33.83,-46.4,1,313.0,0.0,使う,
run_0001_20261109_104517,2,drag_v2_20221013_230205.json,yes,yes,22.0,-7.8,True,840,812,1.057,2.05,2.9,87.89,-33.83,-46.49,1,,,使う,
```

### grasp_depth.csv（pi05/grasp_depth.py --csv の出力・全量）

```csv
run,status,reason,t_close,frame_before,frame_after,before_px,after_px,after_gap_px,hand_suspect,pre_px,center_px,center_by,axis_from,max_protrude_px,shallow,grip_status,grip_current_max,grip_current_median,grip_rows,grip_grasped
run_0001_20261109_093045,ok,,1794184266.412,622,653,71.4,43.4,100.5,False,"{""pre1.5s"": 61.2, ""pre0.5s"": 71.2, ""before"": 71.4}","[589, 588]",wide,tips,24.0,True,ok,863,854,16,True
run_0001_20261109_094839,ok,,1794185338.969,596,627,42.5,16.2,99.9,False,"{""pre1.5s"": 39.7, ""pre0.5s"": 42.5, ""before"": 42.5}","[579, 578]",wide,body,24.0,False,ok,885,849,28,True
run_0001_20261109_095308,ok,,1794185607.704,583,613,51.9,19.6,99.9,False,"{""pre1.5s"": 48.2, ""pre0.5s"": 51.9, ""before"": 51.9}","[582, 589]",wide,body,24.0,False,ok,878,850,28,True
run_0001_20261109_095452,ok,,1794185712.025,584,615,59.2,29.2,99.6,False,"{""pre1.5s"": 55.1, ""pre0.5s"": 59.1, ""before"": 59.2}","[574, 597]",wide,body,24.0,True,ok,881,862,20,True
run_0001_20261109_095630,ok,,1794185810.493,582,613,51.0,26.0,99.7,False,"{""pre1.5s"": 47.9, ""pre0.5s"": 51.0, ""before"": 51.0}","[589, 591]",wide,body,24.0,True,ok,868,844,28,True
run_0001_20261109_095810,ok,,1794185909.821,572,603,35.8,11.2,99.6,False,"{""pre1.5s"": 33.8, ""pre0.5s"": 35.8, ""before"": 35.8}","[581, 582]",wide,body,24.0,False,ok,833,813,28,True
run_0001_20261109_095948,ok,,1794186007.998,582,613,50.3,19.5,99.7,False,"{""pre1.5s"": 49.6, ""pre0.5s"": 50.3, ""before"": 50.3}","[574, 581]",wide,body,24.0,False,ok,863,840,28,True
run_0001_20261109_100126,ok,,1794186106.21,584,615,43.2,10.5,99.5,False,"{""pre1.5s"": 38.7, ""pre0.5s"": 43.2, ""before"": 43.2}","[579, 580]",wide,body,24.0,False,ok,826,808,28,True
run_0001_20261109_100307,ok,,1794186207.257,583,614,42.4,19.2,99.9,False,"{""pre1.5s"": 38.9, ""pre0.5s"": 42.4, ""before"": 42.4}","[587, 580]",wide,body,24.0,False,ok,866,853,20,True
run_0001_20261109_100444,ok,,1794186304.147,575,606,39.7,12.0,99.8,False,"{""pre1.5s"": 36.7, ""pre0.5s"": 39.6, ""before"": 39.7}","[599, 566]",wide,body,24.0,False,ok,828,804,30,True
run_0001_20261109_100716,ok,,1794186456.236,578,609,49.3,22.5,99.9,False,"{""pre1.5s"": 48.5, ""pre0.5s"": 49.3, ""before"": 49.3}","[572, 584]",wide,body,24.0,False,ok,865,850,20,True
run_0001_20261109_100852,ok,,1794186551.629,581,612,54.5,29.4,100.0,False,"{""pre1.5s"": 50.1, ""pre0.5s"": 54.4, ""before"": 54.5}","[587, 597]",wide,body,24.0,True,ok,869,855,18,True
run_0001_20261109_101023,ok,,1794186643.318,578,608,59.6,30.5,99.6,False,"{""pre1.5s"": 29.6, ""pre0.5s"": 60.2, ""before"": 59.6}","[559, 590]",wide,body,24.0,True,ok,864,838,26,True
run_0001_20261109_101157,ok,,1794186737.568,584,615,42.2,15.6,99.7,False,"{""pre1.5s"": 39.9, ""pre0.5s"": 42.2, ""before"": 42.2}","[593, 586]",wide,body,24.0,False,ok,831,806,28,True
run_0001_20261109_101434,ok,,1794186900.151,777,808,2.7,1.9,98.9,False,"{""pre1.5s"": 2.1, ""pre0.5s"": 2.7, ""before"": 2.7}","[582, 577]",wide,body,24.0,False,ok,835,805,48,True
run_0001_20261109_101615,ok,,1794186993.872,562,593,47.9,24.9,99.9,False,"{""pre1.5s"": 44.2, ""pre0.5s"": 47.9, ""before"": 47.9}","[578, 580]",wide,body,24.0,True,ok,859,828,28,True
run_0001_20261109_102109,ok,,1794187289.13,575,606,41.0,10.9,100.2,False,"{""pre1.5s"": 21.3, ""pre0.5s"": 41.0, ""before"": 41.0}","[562, 681]",wide,body,24.0,False,ok,841,813,26,True
run_0001_20261109_102248,ok,,1794187387.914,582,613,31.1,-0.9,100.4,False,"{""pre1.5s"": 11.0, ""pre0.5s"": 31.1, ""before"": 31.1}","[576, 669]",wide,body,24.0,False,ok,833,808,28,True
run_0001_20261109_102431,ok,,1794187491.279,584,614,26.0,-4.6,100.3,False,"{""pre1.5s"": 6.7, ""pre0.5s"": 26.0, ""before"": 26.0}","[564, 672]",wide,body,24.0,False,ok,835,807,30,True
run_0001_20261109_102715,ok,,1794187663.524,842,873,-2.8,-15.7,76.1,True,"{""pre1.5s"": 213.7, ""pre0.5s"": -2.8, ""before"": -2.8}","[530, 589]",wide,body,24.0,False,ok,22,11,52,False
run_0001_20261109_102903,ok,,1794187771.456,825,856,1.1,-1.9,75.8,False,"{""pre1.5s"": 0.7, ""pre0.5s"": 1.1, ""before"": 1.1}","[541, 588]",wide,body,24.0,False,ok,22,13,50,False
run_0001_20261109_103049,ok,,1794187868.366,573,604,23.9,3.0,100.5,False,"{""pre1.5s"": 19.6, ""pre0.5s"": 23.2, ""before"": 23.9}","[592, 569]",wide,body,24.0,False,ok,831,811,28,True
run_0001_20261109_103504,ok,,1794188131.379,798,828,10.4,0.2,99.8,False,"{""pre1.5s"": 10.4, ""pre0.5s"": 10.4, ""before"": 10.4}","[543, 698]",wide,body,24.0,False,ok,889,839,48,True
run_0001_20261109_103804,ok,,1794188302.757,553,584,24.4,-6.9,100.0,False,"{""pre1.5s"": 3.3, ""pre0.5s"": 24.4, ""before"": 24.4}","[569, 665]",wide,body,24.0,False,ok,840,817,26,True
run_0001_20261109_103943,ok,,1794188402.603,574,605,24.3,-7.8,100.4,True,"{""pre1.5s"": 237.8, ""pre0.5s"": 24.2, ""before"": 24.3}","[570, 667]",wide,body,24.0,False,ok,841,808,28,True
run_0001_20261109_104110,ok,,1794188489.85,574,605,26.4,-2.0,100.2,False,"{""pre1.5s"": 6.0, ""pre0.5s"": 26.4, ""before"": 26.4}","[567, 676]",wide,body,24.0,False,ok,832,808,34,True
run_0001_20261109_104517,ok,,1794188735.886,563,594,22.0,-7.8,100.4,True,"{""pre1.5s"": 237.6, ""pre0.5s"": 22.1, ""before"": 22.0}","[569, 666]",wide,body,24.0,False,ok,840,812,26,True
```

### 表を作るコード（lab/Log25/log25_runs_table.py）

```python
#!/usr/bin/env python3
"""log25_runs_table.py — 2026-11-09 に撮ったお手本 (record_teach_demo.py) 27 本を 1 本 1 行の表にする
(LOG463・フィジカルAI研究室 Log#25).

読むだけ:
  runs/run_pick_place/run_0001_20261109_*/run_0001_20261109_*.json   (試行 JSON: 人の y/n・区間ごとの到達・ブロックの位置)
  runs/run_pick_place/run_0001_20261109_*/recording/states.csv       (段階の時刻・読んだ角度・爪の命令)
  runs/run_pick_place/run_0001_20261109_*/recording/currents.csv     (爪と肩の電流. 依頼 121)
  lab/Log25/grasp_depth.csv   (pi05/grasp_depth.py --csv の出力. 閉じる直前と閉じて 1.0 秒後のはみ出し・爪の値)
書く: このファイルと同じフォルダの runs_table.csv だけ.

判定 (使う/外す) の決まり:
  1. PICK の区間 (ブロックの上 → つかむ姿勢) が 5 秒より長くかかった本は「爪がブロックに乗った」として外す
     (普段は 1.9〜2.2 秒. 乗った本は到達の許容 3.0° に入るまで, 到達待ちの上限 8 秒近くかかった)
  2. 閉じて 1.0 秒後のはみ出しが 24px を超えた本は「浅い」として外す (grasp_depth.py の線. LOG460・依頼 117)
  3. 教え直す前の記録 (drag_v2_20221013_144348.json) で撮った本は, 位置 1 の比べる相手として残すが学習には使わない

Mac で動かすとき:  python3 log25_runs_table.py
(パスは R2R2R_DATA で変えられる. 既定 /Volumes/KIOXIA/r2r2r-data)
"""
import csv, json, os, statistics
from pathlib import Path

DATA = Path(os.environ.get("R2R2R_DATA", "/Volumes/KIOXIA/r2r2r-data"))
RUNS = DATA / "runs/run_pick_place"
HERE = Path(os.environ.get("LOG25_DIR", DATA / "lab/Log25"))
TEACH_POS = {"drag_v2_20221013_144348.json": 1, "drag_v2_20261109_094222.json": 1,
             "drag_v2_20221013_230205.json": 2}
SNAG_SEC = 5.0
LINE_PX = 24.0


def main():
    gd = {r["run"]: r for r in csv.DictReader(open(HERE / "grasp_depth.csv"))}
    rows = []
    for p in sorted(x for x in RUNS.glob("run_0001_20261109_*") if x.is_dir()):
        s = p.name
        tj = json.load(open(p / f"{s}.json"))
        teach = tj["teach"]["file"]
        seg = [g for g in tj["segments"] if g.get("to_name") == "PICK"][0]
        st = list(csv.DictReader(open(p / "recording/states.csv")))
        t_pick = [float(r["ts"]) for r in st if r["event_type"] == "stage" and r["stage"] == "PICK"][0]
        t_close = [float(r["ts"]) for r in st if r["event_type"] == "gripper_cmd" and r["gripper_state"] == "1"][0]
        cur = list(csv.DictReader(open(p / "recording/currents.csv")))
        sh = [int(r["r2_69"]) for r in cur if t_pick < float(r["ts"]) < t_close and r["r2_69"]]
        g = gd[s]
        after = float(g["after_px"]) if g["after_px"] else float("nan")
        arr = seg["arrival_actual"]
        if seg["segment_elapsed_sec"] > SNAG_SEC:
            use, reason = "外す", "爪がブロックに乗った (PICK の区間 %.1f 秒)" % seg["segment_elapsed_sec"]
        elif not (after <= LINE_PX):
            use, reason = "外す", "浅い (閉じて 1.0 秒後 %.1fpx > %gpx)" % (after, LINE_PX)
        else:
            use, reason = "使う", ""
        if teach == "drag_v2_20221013_144348.json":
            use, reason = "外す", (reason + " / " if reason else "") + "教え直す前の記録"
        rows.append(dict(
            run=s, position=TEACH_POS.get(teach, ""), teach=teach,
            pick=tj["judgments"]["pick"]["verdict"], place=tj["judgments"]["place"]["verdict"],
            before_px=g["before_px"], after_px=g["after_px"], hand_suspect=g["hand_suspect"],
            grip_max=g["grip_current_max"], grip_median=g["grip_current_median"],
            pick_segment_sec=seg["segment_elapsed_sec"], pick_to_close_sec=round(t_close - t_pick, 2),
            pick_arrival_max_delta_deg=seg["arrival_max_delta_deg"],
            j1_arrived=arr[1], j2_arrived=arr[2], j4_arrived=arr[4],
            shoulder_lo_during_pick="/".join(map(str, sorted(set(sh)))),
            block_dist_from_base_mm=tj["positions_before_replay"].get("block_dist_from_base_mm"),
            block_moved_mm=tj["block_move_check"].get("dist_mm"),
            use=use, reason=reason))
    with open(HERE / "runs_table.csv", "w", newline="") as f:
        w = csv.DictWriter(f, fieldnames=list(rows[0]))
        w.writeheader(); w.writerows(rows)
    for r in rows:
        print(",".join(str(v) for v in r.values()))
    for pos in (1, 2):
        u = [r for r in rows if r["position"] == pos and r["use"] == "使う"]
        print(f"位置{pos}: 使う {len(u)} 本 / 撮った {sum(1 for r in rows if r['position'] == pos)} 本")


if __name__ == "__main__":
    main()
```

### 記事の画像を作るコード（lab/Log25/make_images.py）

```python
#!/usr/bin/env python3
"""make_images.py — LOG463 の記事に載せる画像を、上カメラの録画 (top.mp4) と横からのスマホ動画から作る (読むだけ).
使い方: python3 make_images.py   (B と SIDE のパスを環境に合わせる)
"""
import cv2, csv, os, subprocess
import numpy as np
from PIL import Image, ImageDraw, ImageFont
FP = "/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc"
F = lambda s: ImageFont.truetype(FP, s, index=0)
B = os.environ.get("RUNS", "/mnt/user-data/uploads/KIOXIA/r2r2r-data/runs/run_pick_place") + "/run_0001_20261109_"
SIDE = os.environ.get("SIDE", "/mnt/user-data/attachments/13cd2fb7-9204-537e-90d7-7ae29d9f967a")
OUT = "LOG463_images"


def times(s):
    st = list(csv.DictReader(open(B + s + "/recording/states.csv")))
    tp = [float(r["ts"]) for r in st if r["event_type"] == "stage" and r["stage"] == "PICK"][0]
    tc = [float(r["ts"]) for r in st if r["event_type"] == "gripper_cmd" and r["gripper_state"] == "1"][0]
    return tp, tc


def frame(s, t):
    fl = [(int(r["frame_idx"]), float(r["capture_ts"])) for r in csv.DictReader(open(B + s + "/recording/top_frame_log.csv"))]
    fi = min(fl, key=lambda x: abs(x[1] - t))[0]
    cap = cv2.VideoCapture(B + s + "/recording/top.mp4"); cap.set(cv2.CAP_PROP_POS_FRAMES, fi)
    ok, im = cap.read(); return im


def pil(im): return Image.fromarray(cv2.cvtColor(im, cv2.COLOR_BGR2RGB))


# 04: 前の教えた記録と作り直した記録. 閉じて 1.0 秒後の上カメラ
def img04():
    pairs = [("093045", "前の教えた記録（2022-10-13 に手で教えた）", "閉じて1秒後のはみ出し 43.4px（浅い）", (200, 30, 30)),
             ("094839", "ゲームパッドで作り直した記録", "閉じて1秒後のはみ出し 16.2px（深い）", (30, 90, 200))]
    W = 2 * 660 + 60; out = Image.new("RGB", (W, 564 + 110), "white"); d = ImageDraw.Draw(out)
    for i, (s, t1, t2, col) in enumerate(pairs):
        tp, tc = times(s); im = frame(s, tc + 1.0)
        c = cv2.resize(im[330:800, 330:880], (660, 564)); x = 20 + i * 680
        out.paste(pil(c), (x, 100)); d.text((x, 12), t1, font=F(28), fill=(30, 30, 30)); d.text((x, 56), t2 + f"　{s}", font=F(22), fill=col)
    out.save(f"{OUT}/LOG463_04_old_vs_new_pick.jpg", quality=88)


# 06: 下ろし始め〜閉じた直後の上カメラ. 普段の本と爪が乗った本
def img06():
    rows = [("101157", "普段の本　下ろし始めから閉じるまで 2.1秒"), ("101434", "爪がブロックに乗った本　8.9秒"),
            ("102109", "位置2 の普段の本　2.1秒"), ("103504", "位置2 で爪が乗った本　8.9秒")]
    crops = {"101157": (330, 780, 380, 860), "101434": (330, 780, 380, 860), "102109": None, "103504": None}
    strips = []
    for s, title in rows:
        tp, tc = times(s); ts = np.linspace(tp - 0.6, tc + 0.3, 8); fr = []
        for t in ts:
            im = frame(s, t)
            if crops[s]: y0, y1, x0, x1 = crops[s]
            else:
                y0, y1, x0, x1 = 380, 830, 400, 880
            fr.append(cv2.resize(im[y0:y1, x0:x1], (240, 225)))
        strips.append((title, np.hstack(fr)))
    W = strips[0][1].shape[1] + 40; out = Image.new("RGB", (W, len(strips) * 290 + 20), "white"); d = ImageDraw.Draw(out)
    for i, (title, st) in enumerate(strips):
        y = 10 + i * 290; d.text((20, y + 4), title, font=F(26), fill=(30, 30, 30) if "普段" in title else (200, 30, 30))
        out.paste(pil(st), (20, y + 50))
    out.save(f"{OUT}/LOG463_06_snag_top.jpg", quality=86)


# 横からのスマホ動画のコマを並べる
def side(src, dst, title, n=12, cols=4):
    v = f"{SIDE}/{src}"
    dur = float(subprocess.check_output(["ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "csv=p=0", v]).decode())
    subprocess.run(["ffmpeg", "-loglevel", "error", "-y", "-i", v, "-vf", f"fps={n}/{dur},scale=420:-1,tile={cols}x{n // cols}",
                    "-frames:v", "1", "/tmp/_side.jpg"], check=True)
    im = Image.open("/tmp/_side.jpg"); out = Image.new("RGB", (im.width, im.height + 60), "white")
    ImageDraw.Draw(out).text((10, 12), title, font=F(28), fill=(30, 30, 30)); out.paste(im, (0, 60))
    out.save(f"{OUT}/{dst}", quality=84)


if __name__ == "__main__":
    os.makedirs(OUT, exist_ok=True)
    img04(); img06()
    side("35e64696-IMG_4242-compressed.mp4", "LOG463_03_side_shallow.jpg", "前の教えた記録の再生を横から（左上から右へ時間順）。爪の先でブロックを挟んでいる")
    side("b2d7b71d-IMG_4246-compressed.mp4", "LOG463_07_side_snag.jpg", "位置2 で爪がブロックに乗った回を横から（左上から右へ時間順）。2段目で爪が乗って止まる")
```


## 依頼121：教えた動きの再生の記録にも、爪と肩の電流を足した

この回のお手本に電流が残っているのは、撮る前に入れた依頼121 のおかげです。前の依頼116 で電流を足したのは、π0.5 で動かす実機推論の記録だけで、教えた動きを再生して撮るお手本には残らないことが、依頼117 の報告で分かりました。「お手本と実機推論の両方に電流を足す」と決めていたので、撮る前に埋めました。依頼箱で 07:55〜09:14（79分）かかり、外部のレビュー（codex）を3回通しています。

決めたことは次のとおりです。

- 電流を記録しながら撮る（読み取りが長引くと再生が最大1.5秒待つことがあると、codex の3回目のレビューで残った。待ったかもしれない回は記録に残るので、出た本は撮り直す）
- パッドを使っている間に記録が 9.1〜9.5Hz に下がる件（依頼116）は、このまま受け入れる
- read_servo が答えない回の stop の遅れ（最大約2秒）は、今回は手を入れない。依頼109 の測定で、読めない回は0回だった
- 手が写っていそうな本は印を出すだけで、自動では外さない
- 位置1 を教え直したら、新しい記録の名前を本数を数える表（count_by_position.py の TEACH_FILES）に足す。この回の drag_v2_20261109_094222.json は、まだ足していない

### 依頼121 の依頼文（依頼箱/済み/20261108_121_教えた動きの再生の記録にも爪と肩の電流を足す.md）

````markdown
---
作業フォルダ: /Users/shimazueiichi/r2r2r-scripts
上限時間: 120
---
# 依頼121：教えた動きを再生して撮るお手本の記録にも、爪と肩の電流を足す（2026-11-08）

依頼116・117・118 の続き。今日エイイチが `pi05/DEEP_DEMOS.md` の手順で、位置1〜4 のお手本を約30本撮る。その前に入れる。

## 背景

- 依頼116 で、実機推論の記録（pi05/policy_recorder.py）に爪と肩の電流が currents.csv として残るようになった（commit f05588c）
- 依頼117 の報告：教えた動きの再生の記録（record_teach_demo.py まわり）には電流が残らない。エイイチの決め（2026-11-07）は「お手本と実機推論の記録の両方に電流を足す」なので、ここを埋める

## A. 再生の記録に currents.csv を足す

- 教えた動きの再生で撮る記録でも、依頼116 と同じ読み方・同じ列の currents.csv を、同じ run の `recording/` に書く。できれば依頼116 の部品をそのまま使い、読み方を2か所に書かない
- 頻度の守り方・肩の上位を5回に1回にする扱い・読めない回は空にして続ける扱いは、依頼116 と同じにする
- states.csv など、今ある記録の列と中身は変えない（学習データを作る側が読むため。build_demo_episodes.py で作り直したデータが今までと同じになることをテストで確かめる）
- 再生の動き（関節の命令・待ち・速さ）は変えない

## B. 手順書 `pi05/DEEP_DEMOS.md` に、爪の電流での確かめを足す

- 1本撮るごとに、閉じたあとの gripper_current を見る手順を足す。116・109 の測定（空で閉じると15前後、ブロックをつかむと数百〜990、放すと −50 前後）を目安に書く
- できれば、run のフォルダを渡すと「閉じたあとの爪の値の最大・つかめたか（目安の線で）」を1行で出す小さな表示を足す（`grasp_depth.py` の深さと並べて出せるとよい）。線は目安として書き、外すかどうかは今まで通り深さ 24px で決める
- 位置1 を教え直したときは、新しい教えた記録のファイル名を `count_by_position.py` の `TEACH_FILES` に位置1として足す、と手順書に書く（依頼118 の決めてほしいこと → エイイチの決め：教え直したら足す）

## C. ついでに

- `auto_detect_cameras.py` を git に入れる（依頼116 の決めてほしいこと3 → 入れる。git から取り出した写しで run_policy_client とテストが動くようにするため）。中に鍵や個人の情報がないか見てから入れる

## 決まっていること（変えない）

- パッドを使っている間に記録が 9.1〜9.5Hz に下がる件は、このまま受け入れる（依頼116 の決めてほしいこと1）
- read_servo が答えない回の stop の遅れ（最大約2秒）は、今回は手を入れない（依頼116 の決めてほしいこと2。109 の測定で読めない回は0回だった）
- 手が写っていそうな本は印を出すだけで、自動では外さない（依頼117 の決めてほしいこと1）

## 確かめ

- 既存のテストが全部通ること。再生の記録に currents.csv が出るテストを足す（daemon の偽物で）
- codex のレビューを通す（再生の経路と daemon の鍵に触るため。docs/ に依頼文と結果を残す）
- アームは動かさない。実機の確かめはエイイチがやるので、手順を報告に書く
- 測定データ（runs/・datasets/・checkpoints/）は上書き・移動・削除しない。書く前に KIOXIA のマウントを確かめる
- git は個別ファイルを指定して add・commit する（git add . と git clean は使わない）

## 報告に書くこと

- 再生の記録の頻度（測った数字）と currents.csv の置き場所
- エイイチが実機で確かめる手順：DEEP_DEMOS.md の1本目を撮ったあと、深さと爪の値を見る形で短く
- 最後の1行に「判定：合格／止めた（決めてほしいことあり）／失敗」
````

### 依頼121 の作業の記録（r2r2r-scripts/logs/20261108_0911.md）

依頼箱の結果のファイルには報告の最後の数行しか残らなかったので、Claude Code が書いた作業の記録を載せます。commit は 23ed914 です。

````markdown
# 2026-11-08 依頼 121：教えた動きの再生の記録にも爪と肩の電流を足す

## A. 再生の記録に currents.csv（pi05/policy_recorder.py・record_teach_demo.py）
- 依頼 116 の読み方（read_servo 1 回・爪 7:69/7:70・肩 2:69 毎回・肩 2:70 は 5 回に 1 回・読めない回は空・unknown cmd ならやめる）を mixin `_ServoCurrents` に出し、PolicyRecorder と新しい `CurrentsRecorder` の両方が使う（読み方は 1 か所）。PolicyRecorder の動きは同じ（test_recorder_currents 15/15）
- 置き場所: `{run}/recording/currents.csv`（列は依頼 116 と同じ）と `currents_meta.json`。試行 JSON の `currents` にも同じ数
- **読むのは再生の本体が daemon を使わずに眠っている間だけ**（`_sleep_open`: 到達・静止の確かめの 0.3 秒の間、settle の読み取りの合間。眠る長さは同じ）。codex R1・R2 で「本体が鍵を待つと到達の確かめの回数が変わる」と指摘 → 偽の腕を動かすテストで実際に actual 行が 1 つ減るのを確かめ、この形に変えた
- 爪の命令〜待ちの終わり・再送の前の待ち（5 秒）は pause（「爪を動かした直後にシリアルを触らない」2026-10-19）。待ちの途中の Ctrl-C では再開しない
- 止め方: stop は スレッド 5 秒 + 閉じる 1 秒 + meta 1 秒までしか待たない。cmd_run の最後（socket を閉じる前）に `_halt_currents`
- `--no-currents` で今までと同じ動き（電流を読まない）
- record_teach_demo.py は git に入っていない。変える前の写し: `record_teach_demo.py.bak_pre_req121_20261108`

## 数字（偽の daemon。send_angles 1.6 秒・腕 10°/秒・角度 18ms・番地 20ms。実機では測っていない）
- 1 本 47 行・記録 35.9 秒（うち爪で止めた 14.1 秒）→ 全体 1.31 行/秒、止めた時間を除く 2.16 行/秒、send_angles の返事待ちと爪の間を除くと 4.7 行/秒
- 閉じてから放すまで 9.3 秒で 14 行（990）
- 本体を待たせた回（overruns）0・再生にかかる時間の差 +0.03〜0.10 秒。通知（states.csv の元）の種類・順、関節と爪の命令、区間ごとの到達・再送・WARN・静止の結果が電流なしと同じ
- 残る場合: read_servo が 0.15 秒より長くかかり本体の眠りの終わりを超えた回は、本体の次のやりとりがその分（最大 1.5 秒）待つ。overruns に数える

## B. 手順書・表示
- `pi05/grip_current.py`（新）: 最初に閉じた 1.0 秒後〜次に開くまでの gripper_current の最大・中央値・行数、最大 ≥ 100 で「つかめていそう」（目安だけ）
- `grasp_depth.py` の CLI: 深さの行の下にその 1 行、--csv に grip_* 列（measure_run・judge は同じ）
- `DEEP_DEMOS.md`: 1 本ごとに 2 行目を見る、read_servo の有無、位置 1 を教え直したら TEACH_FILES に位置 1 として足す（元の行は消さない）、4. を書き直し

## C. auto_detect_cameras.py を git に入れた（鍵・個人の情報なし。端末名だけ）

## テスト
- pi05/test_*.py 13 本（新しい test_teach_currents.py 23 件）・tools/test_*.py 5 本・test_provenance.py・place_modules/tests 4 本: すべて OK
- build_demo_episodes: currents.csv・currents_meta.json・試行 JSON の currents があっても npz・meta・画が同じ
- codex 並走中は時間に敏感なテストが落ちることがあった（単独では通る）

## codex
- R1: 必須 4（爪の待ちの途中で再開・再送の待ち・stop が止まる・確かめの時間）→ 反映
- R2: 必須 3（stop の I/O・確かめの時間がまだ・テストの文字列）→ 反映（眠りの間だけ読む形に変更）
- R3: 必須 1（見込みを超えた読み取りは本体を待たせうる）→ 作りでは消せない（daemon を変えるか、確かめの間は読まない＝持っている間の値が取れない）。overruns に数え `--no-currents` を足して、決めてほしいことに。推奨 2 は反映
- docs/review_request_20261108_teach_currents{,_r2,_r3}.md・docs/review_result_20261108_teach_currents_codex{,_r2,_r3}.md

## KIOXIA
- テストは一時フォルダだけ。runs/・datasets/・checkpoints/ には書いていない
````

### お手本を足す手順書（r2r2r-scripts/pi05/DEEP_DEMOS.md・依頼117・118・121 で作った版）

````markdown
# 深いお手本で置き場所ごとの本数をそろえる（位置 1〜5 を各 10 本。2026-11-07 依頼 117・118・121）

学習（`RUNPOD_TRAIN.md`）の前に、LOG352 で教えた 5 か所（位置 1〜5）それぞれで、ブロックが爪の奥まで入ってから閉じるお手本を撮り足し、**どの位置も 10 本**にそろえる手順。**この手順はまだ実機で通していない**（書いただけ）。

**なぜそろえるか**: 今のデータ `mecharm_redblock_box_teach_v1_trim2_corr_v5_deep`（21 本。浅い 7 本・指の写った 2 本を外した版）は半分以上が位置 5 に寄っている。SO-101 で π0.5 を学習した例（LOG443）では、タスクごとの本数の偏りがそのまま失敗の形になり、本数をそろえて直していた。エイイチの決め（2026-11-07）: 置き場所ごとの本数をそろえる。目安は各位置 10 本。

## 0. 今の本数と足す本数

`python3 pi05/count_by_position.py mecharm_redblock_box_teach_v1_trim2_corr_v5_deep` の表（2026-11-07）:

| 位置 | 教えた記録 | 今の本数 | うち教えた動き | うち補正入り | 足す本数 | 外した本（浅い・指） |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | `drag_v2_20221013_144348.json` | 0 | 0 | 0 | **＋10** | 浅い 1（183454） |
| 2 | `drag_v2_20221013_230205.json` | 3 | 3 | 0 | **＋7** | 指 2（191347・191441） |
| 3 | `drag_v2_20221013_231249.json` | 2 | 2 | 0 | **＋8** | 浅い 2（192343・192633） |
| 4 | `drag_v2_20221013_232345.json` | 5 | 5 | 0 | **＋5** | 0 |
| 5 | `drag_v2_20221013_233323.json` | 11 | 4 | 7 | **＋0** | 浅い 4（補正入り） |
| 合計 | | 21 | 14 | 7 | **＋30** | 7 |

- 位置の決め方（`count_by_position.py` の頭にも書いた）: 教えた動きは試行フォルダの `teach/` にある教えた記録のファイル名。補正入りは上カメラで見つけたブロックの位置（マットの上の mm）をいちばん近い教えた位置に割り当て、30mm を超えたら「分からない」
- 位置 5 は足さない（今の 11 本で目安を超えている）。位置 5 の補正入りを減らすかどうかは決めていない

**目安時間**: 1 本あたり約 3 分（置き直し・measure・再生 約 1 分・y/n・深さを測る。10/19 の位置 4 の 5 本は 1〜2 分おきに撮れていた）。位置を替えるときに印の確認と 1 本目の確かめで 5〜10 分。**全体で約 30 本・2 時間前後**（30 本 × 3 分 ＋ 位置の替え 4 回）（浅くて撮り直す分と、位置 1 を教え直す場合はその分だけ延びる）。

## 1. 撮る前に（全部の位置で 1 回）

- **ブロックを教えた位置からずらして置かない。** 再生するのは教えたときの関節の角度そのもので、ブロックの位置を見て動きを変えない。LOG352 では位置 4 から約 46mm ずらして置いた 193729 が使えなかった（`count_by_position.py` の見つけ方でも位置 4 から 48mm 離れて「分からない」になる）
- **マットに 5 か所の印を付けておく**（ブロックの四隅が分かる小さな印。上カメラに大きく写る色・赤は使わない）。印の場所は LOG352 で採った試行の上カメラの最初のコマ（HOME で、ブロックが置かれた画）で合わせる: `/Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261019_{183454（位置 1）・191541（位置 2）・192438（位置 3）・193459（位置 4）・194913（位置 5）}/recording/top.mp4` の 1 コマめ（`teach_poses_LOG352/prerun_*.jpg` はブロックが箱の中に写っている回があり、目安にならない）。`count_by_position.py` の `TEACH_REF_MM`（同じ見つけ方での 10/19 のブロックの中心）も目安になる: 位置 1 (182.7, 188.8)・位置 2 (215.5, 242.2)・位置 3 (123.6, 235.6)・位置 4 (240.8, 101.3)・位置 5 (−48.8, 246.4) mm
- `measure` の `block_xz` は根元近くの赤いケーブルを拾うことがあり当てにならない（LOG352 の分かったこと）。置けたかは印と画で人が見る
- 閉じる前に人がブロックを押し込まない（指が学習の画に写る。191347・191441 で起きて外した）。`run --execute` は Enter のあとは止まらないので、浅いと思ったら Enter の前に置き直すか、撮ったあとで外す

- **Pi の daemon に read_servo が入っているか**（爪の電流を残すのに使う。依頼 116・121）。入っていなければ `tools/daemon_add_read_servo.sh` で置く。入っていないまま撮っても再生と映像の記録は今までどおりで、電流だけが空になる（1 本目のあとの 4. で `currents_mode` が `get_angles_fallback` と出る）

```
python3 dynamic_tracking_limits/place/place_modules/recorder.py --top --no-side        # 別のターミナルで常駐
```

## 2. 位置ごとに撮る（位置 1 → 2 → 3 → 4 の順。位置 5 は撮らない）

どの位置も同じ流れ。`{教えた記録}` を位置の表のファイル名に替える。

```
# ブロックを位置 N の印に置く
python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure                               # 1 本ごとに置き直したら測り直す
python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach {教えた記録}             # ドライラン（計画だけ）
python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach {教えた記録} --execute   # 再生＋記録
```

| 位置 | `{教えた記録}` | 撮る本数（外れなければ） | 前に撮った本の深さ（閉じて 1.0 秒後。依頼 113 G の g_table.csv） |
| --- | --- | --- | --- |
| 1 | `drag_v2_20221013_144348.json` | 10 | 183454 が 38.9px（浅い）。**教えた記録そのものが浅い可能性がある**（下の 2-1） |
| 2 | `drag_v2_20221013_230205.json` | 7 | 残っている 3 本は 8.1・15.9・18.2px（深い） |
| 3 | `drag_v2_20221013_231249.json` | 8 | 4 本中 2 本が 27.6・28.9px（浅い）、残り 2 本は 12.7・17.9px。線のすぐ上なので置き方で変わる可能性 |
| 4 | `drag_v2_20221013_232345.json` | 5 | 5 本とも 24px 以下（4.4〜22.1px。21.6・22.1px は線に近い） |

### 2-0. 各位置の 1 本目を撮ったら、深さと爪の値を見てから続ける

```
python3 pi05/grasp_depth.py /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_YYYYMMDD_HHMMSS
```

1 本につき 2 行出る（1 行目が深さ、2 行目が閉じたあとの爪の電流。2 行目の見方は 4.）:

```
[深い] run_0001_YYYYMMDD_HHMMSS  閉じる直前 ...px  閉じて 1.0 秒後 ...px (線 24px)  爪先の印の間 ...px
    [爪 つかめていそう] run_0001_YYYYMMDD_HHMMSS  閉じたあとの爪の値 最大 ... 中央値 ... (.. 行) (目安の線 100. ...)
```

- **外すかどうかは今までどおり深さ（1 行目）で決める。** 爪の値（2 行目）は目安で、深さと食い違ったら `top.mp4` の閉じる前後を人が見る
- **閉じて 1.0 秒後のはみ出しが 24px（約 9mm）を超えたら、その位置は撮り続けずに止める。** 置き方を印に合わせ直して 1 本だけ撮り直し、それでも 24px を超えたら、教えた記録が浅いとみて 2-1 に進む（その位置の残りは撮らない）
- 24px 以下なら、その位置の残りを撮る。2 本目からも 1 本ずつ測ってよい（`grasp_depth.py` は何本でも渡せる）
- `[測れない]` が出たら（ブロックが見つからない・爪先の印が見えない）、`top.mp4` の閉じる前後を人が見て決める。測れなかった本は学習データを作るときも外されない
- `手が写っていそう` と出たら、その本は使わない方向で画を見る

### 2-1. 教えた記録が浅いとき（位置 1 で起きそう）: 深くつかむように教え直す

位置 1 の前の 1 本（183454）は 38.9px で浅かった。置き方ではなく、教えた PICK の姿勢が浅い可能性がある。教え直しはエイイチが手で行う。

1. ブロックを位置 1 の印に置く → 【Mac】`record_teach_demo.py measure`
2. 【Pi】daemon 停止 → `drag_teach_v2.py teach` → daemon 起動（`record_teach_demo.py` の頭の「1 本のお手本を作る流れ」と同じ）
3. 教えるときの決まり（LOG352 の分かったこと）:
   - **肩 j1（0 始まり）は約 88° まで。** 88° を超えた命令はアームが丸ごと捨てて降りない（LOG352 で肩 +95.53〜+99.22° の 4 つが動かなかった。手で教えるときはモーターの力が抜けているので超えて曲げられてしまう）
   - **肩を倒さず、肘と手首で下げる。** 本線は同じ場所を肩 88〜89°・肘 −33°・手首 −52° 前後でつかんでいる
   - 爪の奥（爪先の印より手前）までブロックが入ってから閉じる
4. 新しい教えた記録で 1 本撮り（ドライランで PICK の肩が 88° 以下かを見てから `--execute`）、2-0 で深さを測る。24px 以下になったら残りを撮る
5. **新しい教えた記録のファイル名を `pi05/count_by_position.py` の `TEACH_FILES` に位置 1 として 1 行足す**（エイイチの決め 2026-11-08: 教え直したら足す。足さないと新しい本が「分からない」に数えられる）。元の `drag_v2_20221013_144348.json` の行は消さない（前に撮った本の数え方が変わらないように）:

   ```
   TEACH_FILES = {
       "drag_v2_20221013_144348.json": 1,
       "drag_v2_YYYYMMDD_HHMMSS.json": 1,     # 位置 1 を教え直した記録 (DEEP_DEMOS 2-1)
       ...
   ```

## 3. 撮り終えたら: データにして、位置ごとの本数を見て、足りない分を撮り足す

```
# 1 本ずつの深さ（読むだけ）
python3 pi05/grasp_depth.py /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_YYYYMMDD_HHMMSS ...
# 新しい本だけのデータセットを作る（新しい名前。24px を超えた本は外し、index.json の grasp_depth に値と理由を残す）
python3 pi05/build_demo_episodes.py --dataset mecharm_redblock_box_teach_pos1to4_deep_v1 --trim-mid-idle \
    --max-protrude-px 24 --run run_0001_YYYYMMDD_HHMMSS --run ...
# 位置ごとの本数を見る（今の deep と新しい本を合わせて数える。読むだけ）
python3 pi05/count_by_position.py mecharm_redblock_box_teach_v1_trim2_corr_v5_deep mecharm_redblock_box_teach_pos1to4_deep_v1
```

- `build_demo_episodes.py` の最後に `[DEPTH]` の行が出る: 浅くて外した本・**測れなかった本（外していない）**・**手が写っていそうな本（外していない）**の数と名前。測れなかった本と手の本は `top.mp4` の閉じる前後を人が見て、外すなら merge の `--exclude-json` に書く
- `count_by_position.py` の表の「目標 10 本まで」が ＋ の位置だけ、2. に戻って撮り足す（浅くて外れた分）。全部の位置が ＋0 になったら次へ
- 「分からない」が出たら、表の下の理由を見る（teach/ がない・教え直した記録が `TEACH_FILES` にない・補正入りのブロックが教えた位置から 30mm を超える など）

```
# 今の deep とまとめる（元は変えない。外す本が増えたら --exclude-json に理由と一緒に書く）
python3 pi05/merge_raw_episodes.py --src mecharm_redblock_box_teach_v1_trim2_corr_v5_deep \
    --src mecharm_redblock_box_teach_pos1to4_deep_v1 --dataset <新しい名前> --tar
python3 pi05/check_dataset.py /Volumes/KIOXIA/r2r2r-data/datasets/<新しい名前>/raw_episodes
```

- `merge_raw_episodes.py` は作り終えたときに、位置ごとの本数の表を README の最後に足す（依頼 118。`--no-position-table` で足さない。raw_episodes と index.json は表があってもなくても同じ）。目標は `--target`（既定 10）
- 線 24px の意味は `/Volumes/KIOXIA/r2r2r-data/lab/twin/20261107_失敗の再生と置き場所/G_お手本の閉じる時刻/README.md`
- 補正入りの run（`run_policy_client.py`）を足すときも同じで、`build_correction_episodes.py ... --max-protrude-px 24` を付ける

## 4. 爪の電流でつかめたかを見る（依頼 116・121）

教えた動きの再生（`record_teach_demo.py run --execute`）でも、実機推論の記録と同じ読み方で爪と肩の電流が残る（依頼 121）。

- 置き場所: `{run}/recording/currents.csv`（列は実機推論と同じ。`gripper_current` が爪の符号付きの値）と `currents_meta.json`（行の数・頻度・読めなかった数）。試行 JSON（`{run}/{run}.json`）の `currents` にも同じ数が残る
- **再生の本体が daemon を使わずに待っている間（到達・静止の確かめの 0.3 秒の間など）だけ読む**（多くて 1 秒 10 回）。なので再生の動き・確かめの回数と時刻は電流なしと同じ（偽の daemon で、再生にかかる時間の差 0.1 秒以下・本体を待たせた回 0）。そのかわり行は少ない（偽の daemon で 1 本 約 47 行・全体で 1 秒 約 1.3 行。閉じてから放すまでの約 9 秒で 14 行）。`send_angles` の返事を待つ間（1 回 約 1.6 秒）は daemon が答えないので読めない
- **爪の命令を送ってから待ちが終わるまで（閉じる 2 秒・開く 約 6 秒）と、送り直しの前の待ち（5 秒）はわざと読まない**（「爪を動かした直後にシリアルを触らない」2026-10-19 の決まりを守る）。なので閉じた値は、持ち上げ始めてから放すまでの間の値になる
- states.csv の列・行の種類と並びは今までと同じ（学習データの作り方は変わらない）。`currents_meta.json` の `overruns` は、電流の読み取りが本体の待ちの終わりを超えて続いた回数（見込み 0.15 秒より長くかかった回。そのとき本体が daemon を使えば、その分だけ待つ。偽の daemon では 0）。0 でない本が続いたら知らせる（下の `--no-currents` で電流なしに戻せる）

**電流を残さずに撮るとき**: `record_teach_demo.py run --teach ... --execute --no-currents`（今までと同じ動き。電流の読み取りを一切しない）

**1 本撮るごとに見る**: 2-0 の `grasp_depth.py` の 2 行目（`python3 pi05/grip_current.py {run}` でも同じ 1 行だけ出る）。

| 2 行目 | 意味（目安。依頼 109・116 の測り） | すること |
| --- | --- | --- |
| `[爪 つかめていそう]` 最大が 100 以上 | ブロックをつかむと数百〜990 | 深さ（1 行目）で決める |
| `[爪 空で閉じた？]` 最大が 100 未満 | 空で閉じると 15 前後 | 深さが測れていても `top.mp4` を見る。つかめていなければ y/n の「つかめたか」を n に |
| `[爪 値なし]` | 電流が残っていない | 理由を見る。`currents_mode=get_angles_fallback` なら daemon に read_servo がない（1. の確かめ） |

- 放す（開く）と −50 前後になる。閉じたあとの値に負の値が混じっていたら、開いたあとの値を拾っている（爪の命令の時刻を `states.csv` で見る）
- 線 100 は空（15 前後）とつかんだ値（数百）の間に置いた目安で、再生の記録ではまだ実機で確かめていない。最初の数本で実際の値を見て、合わなければ `pi05/grip_current.py` の `GRASP_LINE` を見直す（外す決めには使っていない）
````

### 閉じたあとの爪の値を1行で出すコード（r2r2r-scripts/pi05/grip_current.py）

```python
#!/usr/bin/env python3
"""grip_current.py — 1 本の記録 (run のフォルダ) で, 爪を閉じたあとの爪の電流の値を 1 行で出す (2026-11-08 依頼 121).

入力 (run のフォルダ. runs/run_pick_place/{run}/ (教えた動きの再生) でも runs/pi05_policy/{run}/ (実機推論) でもよい):
  recording/currents.csv   gripper_current 列 (依頼 116 の符号付きの値. 爪 7 の番地 69/70)
  recording/states.csv     爪の命令 (gripper_cmd) の時刻. 閉じる命令は grasp_depth.close_time と同じ選び方

見る範囲: 最初に閉じた命令の HELD_FROM_SEC 秒後から, 次に開く命令まで (なければ記録の終わりまで).
  教えた動きの再生では, 閉じてから待ち (2 秒) が終わるまで電流を読まない (依頼 121) ので, 持ち上げてから先の値になる.

目安 (依頼 109・116 の測り. まだ再生の記録では実機で確かめていない):
  空で閉じる: 15 前後 / ブロックをつかむ: 数百〜990 / 放す (開く): −50 前後
  GRASP_LINE (100) 以上なら「つかめていそう」と出す. **目安の表示だけ**で, 学習データから外すかどうかは
  今までどおり grasp_depth.py の深さ (閉じて 1.0 秒後のはみ出し 24px) で決める.

  python3 pi05/grip_current.py RUN_DIR [RUN_DIR ...]
  (grasp_depth.py も同じ run で深さの行の下にこの 1 行を出す)

読むだけ (記録には何も書かない).
"""
import argparse
import csv
import json
import sys
from pathlib import Path

import grasp_depth as gd

GRASP_LINE = 100                # これ以上なら「つかめていそう」(空 15 前後と つかんだ 数百 の間. 目安)
HELD_FROM_SEC = 1.0             # 閉じる命令からこの秒数より後の値を見る (閉じている途中の値を混ぜない)


def summarize(run_dir):
    """戻り値 dict: status (ok / no_currents / no_close / no_values) と, ok なら max・median・n・grasped."""
    rec = Path(run_dir) / "recording"
    out = {"status": None, "max": None, "median": None, "n": 0, "grasped": None,
           "line": GRASP_LINE, "currents_mode": None, "reason": None}
    for name in ("currents_meta.json", "top_meta.json"):
        try:
            out["currents_mode"] = json.loads((rec / name).read_text()).get("currents_mode")
            if out["currents_mode"]:
                break
        except Exception:
            pass
    cur = rec / "currents.csv"
    if not cur.exists():
        out.update(status="no_currents", reason="currents.csv がない (依頼 116・121 より前の記録)")
        return out
    try:
        gt, gs = gd.load_gripper_cmds(rec / "states.csv")
    except Exception as e:
        out.update(status="no_close", reason=f"states.csv を読めない ({type(e).__name__})")
        return out
    t_c = gd.close_time(gt, gs)
    if t_c is None:
        out.update(status="no_close", reason="閉じる命令がない")
        return out
    opens = [float(t) for t, s in zip(gt, gs) if s == 0 and t > t_c]
    t_end = min(opens) if opens else float("inf")
    vals = []
    try:
        with cur.open(newline="") as f:
            for row in csv.DictReader(f):
                try:
                    t, v = float(row["ts"]), row.get("gripper_current") or ""
                except Exception:
                    continue
                if v == "" or not (t_c + HELD_FROM_SEC <= t < t_end):
                    continue
                try:
                    vals.append(int(v))
                except ValueError:
                    continue
    except Exception as e:      # 読めない currents.csv でも 1 行で返す (codex R1 推奨)
        out.update(status="no_values", reason=f"currents.csv を読めない ({type(e).__name__})")
        return out
    out.update(t_close=round(t_c, 3), held_sec=(round(t_end - t_c, 1) if opens else None))
    if not vals:
        out.update(status="no_values",
                   reason="閉じたあとの値がない" + (f" (currents_mode={out['currents_mode']})"
                                                if out["currents_mode"] not in (None, "read_servo") else ""))
        return out
    vs = sorted(vals)
    out.update(status="ok", max=vs[-1], median=vs[len(vs) // 2], n=len(vs), grasped=vs[-1] >= GRASP_LINE)
    return out


def line(run_dir, s=None):
    """表示の 1 行."""
    s = s if s is not None else summarize(run_dir)
    name = Path(run_dir).name
    if s["status"] != "ok":
        return f"[爪 値なし] {name}  {s['reason']}"
    flag = "つかめていそう" if s["grasped"] else "空で閉じた？"
    return (f"[爪 {flag}] {name}  閉じたあとの爪の値 最大 {s['max']} 中央値 {s['median']} ({s['n']} 行) "
            f"(目安の線 {GRASP_LINE}. 空 15 前後・つかむ 数百〜990)")


def main():
    ap = argparse.ArgumentParser(description=__doc__.split("\n")[0])
    ap.add_argument("run_dir", nargs="+", help="run のフォルダ (recording/ がある所)")
    args = ap.parse_args()
    for d in args.run_dir:
        print(line(d))
    return 0


if __name__ == "__main__":
    sys.exit(main())
```


## 端末の出力（全量）

端末1 は位置1 と教え直し、端末2 は位置2 を撮ったターミナルです。録画係のターミナル（recorder.py --top --no-side）は、待機中の表示のまま動いていたので載せていません。cv2 と pygame がそれぞれ同じ部品（libSDL2）を持っているための注意（objc の Class SDL… の行）が、ゲームパッドを起動するたびに出ていますが、動きには影響していません（LOG419 から同じ）。

### 端末1（位置1・ゲームパッドでの教え直し）

```
Last login: Mon Nov  9 09:20:05 on ttys003
```

#### 端末1-01 measure（ブロックと箱の位置を測る）

```
(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=[329, 1718] Y=[0, 926]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=105.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1513,553) source=template_fallback score=0.644 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.04s)
[DETECT][1/5] box Unity=(-0.220,+0.189) score=0.6440748572349548
  赤ブロック pixel=(663, 785) → Unity=(0.1665, 0.2959)
[DETECT][1/5] block Unity=(+0.167,+0.296) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=105.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1513,553) source=template_fallback score=0.644 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.06s)
[DETECT][2/5] box Unity=(-0.220,+0.189) score=0.6440508365631104
  赤ブロック pixel=(663, 785) → Unity=(0.1665, 0.2959)
[DETECT][2/5] block Unity=(+0.167,+0.296) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=105.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1513,553) source=template_fallback score=0.644 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.09s)
[DETECT][3/5] box Unity=(-0.220,+0.189) score=0.6436370611190796
  赤ブロック pixel=(656, 788) → Unity=(0.1696, 0.2973)
[DETECT][3/5] block Unity=(+0.170,+0.297) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=106.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1513,553) source=template_fallback score=0.645 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.07s)
[DETECT][4/5] box Unity=(-0.220,+0.189) score=0.6445101499557495
  赤ブロック pixel=(655, 788) → Unity=(0.1701, 0.2973)
[DETECT][4/5] block Unity=(+0.170,+0.297) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=106.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1513,553) source=template_fallback score=0.645 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.28s)
[DETECT][5/5] box Unity=(-0.220,+0.189) score=0.645190954208374
  赤ブロック pixel=(655, 788) → Unity=(0.1701, 0.2973)
[DETECT][5/5] block Unity=(+0.170,+0.297) score=null
[RTD   ] measure: block = (+169.6, +297.3) mm
[RTD   ] measure: box   = (-220.0, +188.5) mm  score=0.6440748572349548
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_092530.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 2.06px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 0.0px = 0.00mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.44mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_092530.json
[RTD   ] 次は Pi で教示 → daemon 起動 → recorder.py --top --no-side 常駐 → run --teach <file> --execute
```

#### 端末1-02 measure（ブロックと箱の位置を測る）

```
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % 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=[329, 1719] Y=[0, 926]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=106.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1513,553) source=template_fallback score=0.646 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.16s)
[DETECT][1/5] box Unity=(-0.220,+0.189) score=0.6458257436752319
  赤ブロック pixel=(438, 701) → Unity=(0.2650, 0.2538)
[DETECT][1/5] block Unity=(+0.265,+0.254) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=105.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1513,553) source=template_fallback score=0.645 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.26s)
[DETECT][2/5] box Unity=(-0.220,+0.189) score=0.6451206207275391
  赤ブロック pixel=(584, 570) → Unity=(0.2000, 0.1914)
[DETECT][2/5] block Unity=(+0.200,+0.191) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=105.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1513,553) source=template_fallback score=0.646 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.22s)
[DETECT][3/5] box Unity=(-0.220,+0.189) score=0.645586371421814
  赤ブロック pixel=(584, 569) → Unity=(0.2000, 0.1909)
[DETECT][3/5] block Unity=(+0.200,+0.191) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=105.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1513,553) source=template_fallback score=0.644 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.07s)
[DETECT][4/5] box Unity=(-0.220,+0.189) score=0.6442099809646606
  赤ブロック pixel=(584, 569) → Unity=(0.2000, 0.1909)
[DETECT][4/5] block Unity=(+0.200,+0.191) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=105.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1513,553) source=template_fallback score=0.644 angle=0° scale=0.85 size=(167x156) template=white_box_20260520_163838_005.png (eval 5.07s)
[DETECT][5/5] box Unity=(-0.220,+0.189) score=0.6444384455680847
  赤ブロック pixel=(585, 570) → Unity=(0.1996, 0.1914)
[DETECT][5/5] block Unity=(+0.200,+0.191) score=null
[RTD   ] measure: block = (+200.0, +191.4) mm
[RTD   ] measure: box   = (-219.8, +188.8) mm  score=0.6451206207275391
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_092616.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.36px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 1.4px = 0.66mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.49mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_092616.json
[RTD   ] 次は Pi で教示 → daemon 起動 → recorder.py --top --no-side 常駐 → run --teach <file> --execute
```

#### 端末1-03 位置合わせ（アームが HOME でなく NO MATCH）

```
(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
[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= -34.0  dx=  +4.7  response=-0.021  → 測れない (相関が弱く dx/dy が当てにならない (response=-0.021 < 0.20))
[ALIGN ] dy= -36.3  dx=  +8.5  response=-0.013  → 測れない (相関が弱く dx/dy が当てにならない (response=-0.013 < 0.20))
[ALIGN ] dy= -34.7  dx=  +4.6  response=-0.022  → 測れない (相関が弱く dx/dy が当てにならない (response=-0.022 < 0.20))
[ALIGN ] dy= -36.4  dx= +12.7  response=-0.009  → 測れない (相関が弱く dx/dy が当てにならない (response=-0.009 < 0.20))
[ALIGN ] dy= -37.4  dx= +18.0  response=-0.006  → 測れない (相関が弱く dx/dy が当てにならない (response=-0.006 < 0.20))
[ALIGN ] dy= -34.3  dx=  +4.3  response=-0.022  → 測れない (相関が弱く dx/dy が当てにならない (response=-0.022 < 0.20))
[ALIGN ] dy= -35.4  dx=  +3.8  response=-0.021  → 測れない (相関が弱く dx/dy が当てにならない (response=-0.021 < 0.20))
[ALIGN ] dy= -34.3  dx=  +3.0  response=-0.031  → 測れない (相関が弱く dx/dy が当てにならない (response=-0.031 < 0.20))
[DONE  ] 終了 (何も書いていません)
```

#### 端末1-04 HOME に戻す → 爪を開く → 位置合わせ（--episode 183454）

```
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 dynamic_tracking_limits/place/place_modules/08_home_from_anywhere.py && python3 -c "from visual_servo_pick import get_daemon_socket, daemon_set_gripper, close_daemon_socket; get_daemon_socket(); daemon_set_gripper(0); close_daemon_socket()" && 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
[INIT] daemon 接続中...
  [Pi] fresh_mode=1
[INIT] fresh_mode=1
[PRE]  現在姿勢: [-0.70, 93.60, 8.08, 0.61, -104.32, -29.09]
[SEND] HOME へ移動指令
[WAIT] t=0.6s  max_err=89.29°
[WAIT] t=1.1s  max_err=73.56°
[WAIT] t=1.6s  max_err=57.91°
[WAIT] t=2.1s  max_err=42.18°
[WAIT] t=2.7s  max_err=26.45°
[WAIT] t=3.2s  max_err=10.89°
[WAIT] t=3.7s  max_err=1.58°
[DONE] HOME 到達 max_err=1.58°
[POST] 最終姿勢: [-0.35, 1.23, 1.58, 0.43, 1.23, -29.53]
  [Pi] fresh_mode=0
[EXIT] fresh_mode=0, socket close
  [Pi] GRIPPER: OPEN result= None
[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=  -9.1  dx=  +9.9  response=0.565  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -8.0  dx=  +0.3  response=0.439  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -11.2  dx=  +5.2  response=0.486  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -15.6  dx= +10.2  response=0.568  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -14.6  dx= +22.8  response=0.598  → ずれ (|dx|=22.8 > 20)
[ALIGN ] dy= -17.4  dx= +31.2  response=0.555  → ずれ (|dx|=31.2 > 20)
[ALIGN ] dy= -14.6  dx= +30.1  response=0.559  → ずれ (|dx|=30.1 > 20)
[ALIGN ] dy= -11.7  dx= +28.6  response=0.522  → ずれ (|dx|=28.6 > 20)
[ALIGN ] dy= -10.0  dx= +29.6  response=0.482  → ずれ (|dx|=29.6 > 20)
[ALIGN ] dy=  -7.9  dx= +34.7  response=0.364  → ずれ (|dx|=34.7 > 20)
[ALIGN ] dy= -14.3  dx= +54.6  response=0.010  → 測れない (相関が弱く dx/dy が当てにならない (response=0.010 < 0.20))
[ALIGN ] dy=  -2.7  dx= +34.1  response=0.337  → ずれ (|dx|=34.1 > 20)
[ALIGN ] dy= -13.9  dx= +44.4  response=0.017  → 測れない (相関が弱く dx/dy が当てにならない (response=0.017 < 0.20))
[ALIGN ] dy=  -5.7  dx= +27.7  response=0.351  → ずれ (|dx|=27.7 > 20)
[ALIGN ] dy=  -7.2  dx= +24.5  response=0.494  → ずれ (|dx|=24.5 > 20)
[ALIGN ] dy=  -8.7  dx= +27.0  response=0.498  → ずれ (|dx|=27.0 > 20)
[ALIGN ] dy= -10.0  dx= +30.3  response=0.348  → ずれ (|dx|=30.3 > 20)
[ALIGN ] dy= -11.2  dx= +37.0  response=0.313  → ずれ (|dx|=37.0 > 20)
[ALIGN ] dy= -16.5  dx= +65.0  response=0.013  → 測れない (相関が弱く dx/dy が当てにならない (response=0.013 < 0.20))
[ALIGN ] dy= -21.2  dx= +57.4  response=0.052  → 測れない (相関が弱く dx/dy が当てにならない (response=0.052 < 0.20))
[ALIGN ] dy= -18.8  dx= +58.1  response=0.057  → 測れない (相関が弱く dx/dy が当てにならない (response=0.057 < 0.20))
[ALIGN ] dy= -10.4  dx= +38.1  response=0.290  → ずれ (|dx|=38.1 > 20)
[ALIGN ] dy=  -9.1  dx=  +3.8  response=0.573  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -10.4  dx=  -5.1  response=0.445  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -13.5  dx=  -1.0  response=0.508  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -16.6  dx=  +6.3  response=0.554  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -18.6  dx= +16.9  response=0.580  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -17.4  dx= +21.6  response=0.542  → ずれ (|dx|=21.6 > 20)
[ALIGN ] dy= -15.3  dx= +20.6  response=0.528  → ずれ (|dx|=20.6 > 20)
[ALIGN ] dy= -13.8  dx= +10.6  response=0.524  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -14.9  dx=  +9.5  response=0.506  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -13.3  dx= +10.1  response=0.526  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -14.4  dx= +14.0  response=0.524  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -20.6  dx= +12.1  response=0.538  → ずれ (|dy|=20.6 > 20)
[ALIGN ] dy= -22.8  dx= +12.0  response=0.540  → ずれ (|dy|=22.8 > 20)
[ALIGN ] dy= -24.8  dx= +13.5  response=0.490  → ずれ (|dy|=24.8 > 20)
[ALIGN ] dy= -26.9  dx= +11.8  response=0.496  → ずれ (|dy|=26.9 > 20)
[ALIGN ] dy= -25.0  dx= +12.6  response=0.491  → ずれ (|dy|=25.0 > 20)
[ALIGN ] dy= -19.5  dx= +15.0  response=0.527  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -14.1  dx= +21.1  response=0.513  → ずれ (|dx|=21.1 > 20)
[ALIGN ] dy=  -9.0  dx= +28.0  response=0.390  → ずれ (|dx|=28.0 > 20)
[ALIGN ] dy= -17.1  dx= +42.9  response=0.011  → 測れない (相関が弱く dx/dy が当てにならない (response=0.011 < 0.20))
[ALIGN ] dy=  -1.4  dx= +23.4  response=0.359  → ずれ (|dx|=23.4 > 20)
[ALIGN ] dy=  +2.1  dx= +20.6  response=0.439  → ずれ (|dx|=20.6 > 20)
[ALIGN ] dy=  +5.2  dx= +20.2  response=0.494  → ずれ (|dx|=20.2 > 20)
[ALIGN ] dy=  +2.8  dx= +18.7  response=0.454  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -1.4  dx= +14.3  response=0.507  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -3.5  dx= +12.5  response=0.533  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -2.5  dx= +14.0  response=0.543  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -1.4  dx= +13.2  response=0.523  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -3.7  dx= +12.6  response=0.526  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -2.4  dx=  +9.2  response=0.602  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -4.7  dx=  +8.4  response=0.558  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -3.0  dx=  +4.4  response=0.608  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -1.2  dx=  +3.0  response=0.603  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -0.0  dx=  +2.2  response=0.574  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +1.3  dx=  +1.7  response=0.548  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  -0.1  dx=  +4.3  response=0.571  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE  ] 終了 (何も書いていません)
```

#### 端末1-05 ドライラン（drag_v2_20221013_144348.json）

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

#### 端末1-06 再生 run_0001_20261109_093045（drag_v2_20221013_144348.json）

```
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_144348.json --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_144348.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_ba89j9e7/drag_v2_20221013_144348.json
[RTD   ] 入力ファイル: drag_v2_20221013_144348.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=240 (start=240 end=290, gap=14.76°)
                    angles = [ -36.12,  +65.83,  +16.78,   +4.39,  -86.74,  -29.61]
  PICK           <- gripper close mark idx=355（PICK phase 範囲内）
                    angles = [ -35.94,  +80.59,   +7.11,   +3.16,  -88.68,  -30.32]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=470 (start=470 end=512, gap=27.86°)
                    angles = [ +43.41,  +31.81,  +18.54,   +6.24,  -56.95,  -29.88]
  PLACE          <- gripper open mark idx=552（PLACE phase 範囲内）
                    angles = [ +44.20,  +59.67,   +6.15,  +10.54,  -74.88,  -30.84]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 162 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] [WARN] j4 の余裕が最小 1.32°（< 3.0°）です: APPROACH_PICK → PICK 経路上の点 8 j4=-88.68。実測が安全範囲の外に振れる可能性があります（実測では止めません。試行 JSON に WARN として残します）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.35,   +1.23,   +1.58,   +0.26,   -0.26,  -29.70]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.35,   +1.23,   +1.58,   +0.26,   -0.26,  -29.70]
            to HOME = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 1.58°  (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      = [ -36.12,  +65.83,  +16.78,   +4.39,  -86.74,  -29.61]
            max |Δ| = 86.74°  1 回送信 speed=20  (~ 4.3s @ 20°/s 目安・到達待ち 最大 15.0s)
  [STEP  4] MOVE → PICK  segment APPROACH_PICK → PICK  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage4_pick）]
            from    = [ -36.12,  +65.83,  +16.78,   +4.39,  -86.74,  -29.61]
            to      = [ -35.94,  +80.59,   +7.11,   +3.16,  -88.68,  -30.32]
            max |Δ| = 14.76°  1 回送信 speed=20  (~ 0.7s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  5] GRIPPER CLOSE  daemon_set_gripper_value(20, 50) + sleep(2.0s)
  [STEP  6] MOVE → APPROACH_PICK (lift)  segment PICK → APPROACH_PICK (lift)  tol=3.0°  [rpp.TOL_LIFT_BACK（lift の残差 2.19° を吸収）]
            from    = [ -35.94,  +80.59,   +7.11,   +3.16,  -88.68,  -30.32]
            to      = [ -36.12,  +65.83,  +16.78,   +4.39,  -86.74,  -29.61]
            max |Δ| = 14.76°  1 回送信 speed=20  (~ 0.7s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  tol=3.0°  [rpp.TOL_APPROACH_PLACE（stage7）]
            from    = [ -36.12,  +65.83,  +16.78,   +4.39,  -86.74,  -29.61]
            to      = [ +43.41,  +31.81,  +18.54,   +6.24,  -56.95,  -29.88]
            max |Δ| = 79.53°  1 回送信 speed=20  (~ 4.0s @ 20°/s 目安・到達待ち 最大 13.9s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +43.41,  +31.81,  +18.54,   +6.24,  -56.95,  -29.88]
            to      = [ +44.20,  +59.67,   +6.15,  +10.54,  -74.88,  -30.84]
            max |Δ| = 27.86°  1 回送信 speed=20  (~ 1.4s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP  9] GRIPPER OPEN  daemon_set_gripper(0, 50, wait=0) ×1 回（daemon 事前 2.0s + 事後 2.0s + 待ち 2.0s）= 計 6.0s
            開いたかは確認しません（gv を使わず・開始前の y/n も無し。判定は終了後の y/n と動画）
  [STEP 10] MOVE → APPROACH_PLACE (retreat)  segment PLACE → APPROACH_PLACE (retreat)  tol=3.0°  [rpp.TOL_LIFT_BACK（stage10_lift_back）]
            from    = [ +44.20,  +59.67,   +6.15,  +10.54,  -74.88,  -30.84]
            to      = [ +43.41,  +31.81,  +18.54,   +6.24,  -56.95,  -29.88]
            max |Δ| = 27.86°  1 回送信 speed=20  (~ 1.4s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +43.41,  +31.81,  +18.54,   +6.24,  -56.95,  -29.88]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 56.95°  1 回送信 speed=20  (~ 2.8s @ 20°/s 目安・到達待ち 最大 10.5s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 32.4s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 15.4s（max|Δ| 合計 308.5° @ 20°/s 目安） + gripper 14.0s
[RTD   ]   到達確認: 許容は区間ごと（本線 run_pick_place.py の stage 値）/ 最大は clamp(2.0 + max|Δ|/20*3.0, 8.0, 30.0) 秒
[RTD   ]   届かないとき: 送信前から 1.0° 未満しか動いていなければ 5.0s 待って**同じ目標へ 1 回だけ**再送（本線と同じ）。それでも届かなければ ABORT（HOME へ自動で戻らない）
[RTD   ]   実測 j4: [-90.0, +60.0] の外は WARN / [-98.0, +68.0] の外は ABORT
==============================================================================
[RTD   ] measure: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_092616.json
[RTD   ]   measured_at = 2026-11-09T09:26:18.245166  block = (+200.0, +191.4) mm  box = (-219.8, +188.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] [WARN] 再生直前: 四隅が最大 62.1px ずれています（1 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 62.5px ずれています（2 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 62.4px ずれています（3 回目 / 上限 15.0px）。やり直しの上限に達しました
[RTD   ] 再生直前: block = (+199.2, +201.6) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_092954.jpg
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_092954_rejected.json
[RTD   ] [WARN] マット四隅が measure 時から最大 62.4px ずれています（上限 15.0px・最大 3 回やり直しても収まらず）。カメラが動いた可能性があるので止めます。measure を取り直してください（各隅のずれ: 9.0, 1.0, 62.4, 42.4）（**止めません**・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_093045
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_093045/teach/drag_v2_20221013_144348.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_093045/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.58° / 到達待ち 最大 8.0s
[STEP  1] 3.0s 待ちます（settle）
[RTD   ] arrival OK (current → HOME, max|Δ|=1.58° <= 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 系）] / 最大 15.0s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=0.79° <= 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.037s）
[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.029s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=1.94° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 13.9s)
[RTD   ] 送信 OK（daemon 往復 1.048s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.19° <= 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.23° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.27° <= 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.030s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.02° <= 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.055s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.28° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 61/61 回, 実効 1.66 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.66 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.037s / p50 1.030s / 最大 1.056s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.056s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.47s / 最大 6.24s
[RECORD] 電流の記録終了 83 行 (2.26 行/秒. 本体が眠っている間だけ読む. 爪の間 14.058 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_093045/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_093045/run_0001_20261109_093045.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_093045 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-07 daemon を止めた（手で教える手順の名残り。ゲームパッドでは不要だった）

```
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && tools/daemon_ctl.sh stop
--- process
(なし)
--- 5555
(LISTEN なし)
--- systemd
enabled: enabled
active:  inactive
```

#### 端末1-08 ゲームパッド（daemon を止めたままで、つながらずに終わった）

```
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/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[10160]: Class SDLApplication is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc52c8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0890). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDLAppDelegate is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc5318) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c08e0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDLTranslatorResponder is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc5390) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0958). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDLMessageBoxPresenter is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc53b8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0980). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDL_cocoametalview is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc5408) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c09d0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDLOpenGLContext is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc5458) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0a20). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDL_ShapeData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc54d0) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0a98). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDL_CocoaClosure is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc5520) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0ae8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDL_VideoData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc5570) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0b38). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDL_WindowData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc55c0) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0b88). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDLWindow is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc55e8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0bb0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class Cocoa_WindowListener is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc5610) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0bd8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDLView is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc5688) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0c50). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class METAL_RenderData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc5700) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0cc8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class METAL_TextureData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc5750) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0d18). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDL_RumbleMotor is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc5778) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0d40). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDL_RumbleContext is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc57c8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0d90). 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_093534
[終了] アームは動かしていません。記録: /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261109_093534
Traceback (most recent call last):
  File "/Users/shimazueiichi/r2r2r-scripts/tools/gamepad_teleop.py", line 1676, in <module>
    sys.exit(main())
             ^^^^^^
  File "/Users/shimazueiichi/r2r2r-scripts/tools/gamepad_teleop.py", line 1579, in main
    get_daemon_socket()
  File "/Users/shimazueiichi/r2r2r-scripts/visual_servo_pick.py", line 528, in get_daemon_socket
    s.connect((DAEMON_HOST, DAEMON_PORT))
ConnectionRefusedError: [Errno 61] Connection refused
```

#### 端末1-09 daemon を起動 → HOME → ゲームパッドで姿勢を作る（teleop_20261109_093620）

```
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && tools/daemon_ctl.sh start && python3 dynamic_tracking_limits/place/place_modules/08_home_from_anywhere.py && python3 tools/gamepad_teleop.py --execute
--- process
19535 /usr/bin/python3 -u /home/ubuntu/mecharm_daemon.py
--- 5555
LISTEN   0         1                   0.0.0.0:5555             0.0.0.0:*       
--- systemd
enabled: enabled
active:  active
[INIT] daemon 接続中...
  [Pi] fresh_mode=1
[INIT] fresh_mode=1
[PRE]  現在姿勢: [0.00, 1.49, 1.75, 0.26, -0.26, -30.23]
[SEND] HOME へ移動指令
[WAIT] t=0.7s  max_err=1.75°
[DONE] HOME 到達 max_err=1.75°
[POST] 最終姿勢: [0.00, 1.49, 1.75, 0.26, -0.26, -30.23]
  [Pi] fresh_mode=0
[EXIT] fresh_mode=0, socket close
/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[10176]: Class SDLApplication is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d2c8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe4890). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class SDLAppDelegate is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d318) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe48e0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class SDLTranslatorResponder is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d390) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe4958). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class SDLMessageBoxPresenter is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d3b8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe4980). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class SDL_cocoametalview is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d408) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe49d0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class SDLOpenGLContext is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d458) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe4a20). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class SDL_ShapeData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d4d0) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe4a98). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class SDL_CocoaClosure is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d520) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe4ae8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class SDL_VideoData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d570) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe4b38). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class SDL_WindowData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d5c0) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe4b88). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class SDLWindow is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d5e8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe4bb0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class Cocoa_WindowListener is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d610) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe4bd8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class SDLView is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d688) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe4c50). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class METAL_RenderData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d700) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe4cc8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class METAL_TextureData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d750) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe4d18). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class SDL_RumbleMotor is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d778) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe4d40). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10176]: Class SDL_RumbleContext is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x10209d7c8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10abe4d90). 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_093620
[実機] daemon に送ります。起動したときの姿勢: +0.00 +1.49 +1.75 +0.26 -0.26 -30.23
コントローラーを待っています（つないでいなければ、今つないでください）
[接続] PS4 Controller  GUID=03008fe54c050000cc09000000016800  軸=6  ボタン=16
[長押し] j0 を +0.00° → -14.85° まで（目標を 2 回送信。止めます）
[送信] j0 -1.0° → -30.53 +1.49 +1.75 +0.26 -0.26 -30.23  届いた（ずれ 0.88°）  届いた角度 -30.93 +2.37 +2.63 +0.00 -0.26 -30.23
[長押し] j0 を -30.23° → -30.67° まで（目標を 1 回送信。止めます）
[送信] j1 +1.0° → -42.62 +2.49 +1.75 +0.26 -0.26 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 2.02°）  届いた角度 -44.64 +3.33 +3.60 -0.08 -1.05 -30.23
[送信] j0 +1.0° → -41.62 +2.49 +1.75 +0.26 -0.26 -30.23  届いた（ずれ 1.85°）  届いた角度 -42.01 +3.33 +3.60 -0.08 -1.05 -30.23
[送信] j1 -1.0° → -41.62 +1.49 +1.75 +0.26 -0.26 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 1.85°）  届いた角度 -41.30 +2.72 +3.60 -0.08 -1.05 -30.23
[止める] stop（released_while_sending）  止まった角度 -41.22 -0.79 +3.60 -0.08 -1.05 -30.23
[送信] j1 -1.0° → -41.62 -1.79 +1.75 +0.26 -0.26 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 1.85°）  届いた角度 -41.30 -0.79 +3.60 -0.08 -1.05 -30.23
[関節] 上下で動かす関節を j2 にしました
[長押し] j2 を +3.60° → +3.60° まで（目標を 1 回送信。止めます）
[長押し] j2 を +0.61° → -1.23° まで（目標を 1 回送信。止めます）
[長押し] j2 を +3.95° → +9.93° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[長押し] j4 を +0.96° → -20.74° まで（目標を 3 回送信。止めます）
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[関節] 上下で動かす関節を j2 にしました
[長押し] j2 を +19.86° → +29.61° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[長押し] j1 を +0.00° → +8.52° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j2 にしました
[長押し] j2 を +36.65° → +27.86° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[長押し] j4 を -31.20° → -31.28° まで（目標を 1 回送信。止めます）
[長押し] j4 を -36.03° → -37.44° まで（目標を 1 回送信。止めます）
[長押し] j4 を -48.60° → -56.86° まで（目標を 1 回送信。止めます）
[長押し] j4 を -60.64° → -60.73° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[長押し] j1 を +17.05° → +22.50° まで（目標を 1 回送信。止めます）
[長押し] j1 を +28.38° → +34.45° まで（目標を 1 回送信。止めます）
[送信] j0 +1.0° → -40.62 +41.57 +23.02 +0.26 -65.21 -30.23  届いた（ずれ 2.99°）  届いた角度 -40.34 +42.53 +23.02 +0.43 -68.20 -30.23
[長押し] j1 を +42.53° → +44.47° まで（目標を 1 回送信。止めます）
[送信] j1 +1.0° → -40.62 +55.31 +23.02 +0.26 -65.21 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 3.87°）  届いた角度 -40.42 +54.31 +23.11 +0.61 -69.08 -30.23
[送信] j1 +1.0° → -40.62 +56.31 +23.02 +0.26 -65.21 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 4.04°）  届いた角度 -40.42 +57.30 +22.93 +0.61 -69.25 -30.23
[送信] j1 +1.0° → -40.62 +57.31 +23.02 +0.26 -65.21 -30.23  届いた（ずれ 4.04°）  届いた角度 -40.42 +57.30 +22.93 +0.61 -69.25 -30.23
[関節] 上下で動かす関節を j2 にしました
[送信] j2 -1.0° → -40.62 +57.31 +22.02 +0.26 -65.21 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 5.8°）  届いた角度 -40.42 +58.35 +22.85 +0.61 -71.01 -30.23
[長押し] j2 を +22.85° → +22.85° まで（目標を 1 回送信。止めます）
[長押し] j2 を +18.63° → +18.54° まで（目標を 1 回送信。止めます）
[送信] j2 -1.0° → -40.62 +57.31 +13.85 +0.26 -65.21 -30.23  届いた（ずれ 2.81°）  届いた角度 -40.51 +59.41 +13.97 +0.79 -68.02 -30.23
[送信] j2 -1.0° → -40.62 +57.31 +12.85 +0.26 -65.21 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 2.9°）  届いた角度 -40.51 +59.41 +14.23 +0.79 -68.11 -30.23
[止める] stop（released_while_sending）  止まった角度 -40.51 +60.46 +14.41 +0.79 -68.11 -30.23
[長押し] j2 を +14.67° → +11.68° まで（目標を 1 回送信。止めます）
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[送信] j1 +1.0° → -40.62 +61.64 +4.30 +0.26 -65.21 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 5.27°）  届いた角度 -40.51 +62.92 +1.23 +0.79 -70.48 -30.23
[止める] stop（released_while_sending）  止まった角度 -40.51 +64.16 +1.31 +0.79 -68.90 -30.23
[止める] stop（released_while_sending）  止まった角度 -40.51 +67.50 +1.75 +0.79 -68.90 -30.23
[関節] 上下で動かす関節を j2 にしました
[送信] j2 -1.0° → -40.62 +79.27 -0.83 +0.26 -65.21 -30.23  届いた（ずれ 5.54°）  届いた角度 -40.51 +79.27 -0.96 +0.61 -70.75 -29.97
[送信] j2 -1.0° → -40.62 +79.27 -1.83 +0.26 -65.21 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 5.27°）  届いた角度 -40.51 +79.27 -1.31 +0.61 -70.48 -29.97
[送信] j2 -1.0° → -40.62 +79.27 -2.83 +0.26 -65.21 -30.23  届いた（ずれ 3.95°）  届いた角度 -40.51 +79.54 -3.07 +0.61 -69.16 -29.97
[送信] j2 -1.0° → -40.62 +79.27 -3.83 +0.26 -65.21 -30.23  届いた（ずれ 3.87°）  届いた角度 -40.51 +79.62 -3.42 +0.61 -69.08 -29.97
[送信] j2 -1.0° → -40.62 +79.27 -4.83 +0.26 -65.21 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 3.43°）  届いた角度 -40.51 +79.80 -4.30 +0.61 -68.64 -30.05
[送信] j2 -1.0° → -40.62 +79.27 -5.83 +0.26 -65.21 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 2.64°）  届いた角度 -40.51 +79.80 -5.27 +0.61 -67.85 -30.14
[送信] j2 -1.0° → -40.62 +79.27 -6.83 +0.26 -65.21 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 2.64°）  届いた角度 -40.51 +79.80 -5.27 +0.61 -67.85 -30.14
[送信] j2 -1.0° → -40.62 +79.27 -7.83 +0.26 -65.21 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 2.72°）  届いた角度 -40.51 +79.98 -6.94 +0.52 -67.93 -30.05
  [Pi] GRIPPER: VALUE=20 speed=100 result= None
[爪] 爪を閉じる（待ち 0.8 秒のあと受付）
  [Pi] GRIPPER: OPEN result= None
[爪] 爪を開く（待ち 0.8 秒のあと受付）
[送信] j2 +1.0° → -40.62 +79.27 -6.83 +0.26 -65.21 -30.23  届いた（ずれ 5.45°）  届いた角度 -40.51 +79.98 -6.94 +0.52 -70.66 -30.14
[送信] j2 +1.0° → -40.62 +79.27 -5.83 +0.26 -65.21 -30.23  届いた（ずれ 5.45°）  届いた角度 -40.51 +79.98 -5.97 +0.52 -70.66 -30.14
[送信] j2 +1.0° → -40.62 +79.27 -4.83 +0.26 -65.21 -30.23  届いた（ずれ 5.45°）  届いた角度 -40.51 +79.98 -4.74 +0.52 -70.66 -30.14
[送信] j2 +1.0° → -40.62 +79.27 -3.83 +0.26 -65.21 -30.23  届いた（ずれ 5.45°）  届いた角度 -40.51 +79.98 -4.30 +0.52 -70.66 -30.14
[送信] j2 +1.0° → -40.62 +79.27 -2.83 +0.26 -65.21 -30.23  届いた（ずれ 6.5°）  届いた角度 -40.51 +79.98 -2.81 +0.52 -71.71 -30.14
[送信] j2 +1.0° → -40.62 +79.27 -1.83 +0.26 -65.21 -30.23  届いた（ずれ 7.12°）  届いた角度 -40.51 +79.98 -2.02 +0.52 -72.33 -30.05
[送信] j2 +1.0° → -40.62 +79.27 -0.83 +0.26 -65.21 -30.23  届いた（ずれ 7.56°）  届いた角度 -40.51 +79.98 -1.23 +0.52 -72.77 -30.05
[送信] j2 +1.0° → -40.62 +79.27 +0.17 +0.26 -65.21 -30.23  手前で止まった（次の押しは この目標の先から）（ずれ 8.26°）  届いた角度 -40.51 +79.98 -0.43 +0.43 -73.47 -29.97
  [Pi] GRIPPER: VALUE=20 speed=100 result= None
[爪] 爪を閉じる（待ち 0.8 秒のあと受付）
[関節] 上下で動かす関節を j3 にしました
[関節] 上下で動かす関節を j4 にしました
[関節] 上下で動かす関節を j5 にしました
[関節] 上下で動かす関節を j1 にしました
[長押し] j1 を +79.71° → +79.71° まで（目標を 1 回送信。止めます）
[長押し] j1 を +80.24° → +80.24° まで（目標を 1 回送信。止めます）
  [Pi] GRIPPER: VALUE=20 speed=100 result= None
[爪] 爪を閉じる（待ち 0.8 秒のあと受付）
[送信] j1 -1.0° → -40.62 +67.90 +0.17 +0.26 -65.21 -30.23  動かなかった（次の押しは この目標の先から）・無視されたので 2 回送り直した（ずれ 6.33°）  届いた角度 -40.60 +68.90 +1.40 +0.61 -71.54 -29.88
[長押し] j1 を +68.90° → +68.90° まで（目標を 1 回送信。止めます）
  [Pi] GRIPPER: OPEN result= None
[爪] 爪を開く（待ち 0.8 秒のあと受付）
^C
[終了] Ctrl+C
[終了] アームは動かしていません。記録: /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261109_093620
```

#### 端末1-10 新しい教えた記録を Pi に送る（鍵なしでパスワードを聞かれ、止めた）

```
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % scp /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/drag_v2_20261109_094222.json ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/
ubuntu@192.168.2.1's password:
```

#### 端末1-11 新しい教えた記録を Pi に送る（鍵つき）

```
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % scp -i ~/.ssh/id_rsa_pi /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/drag_v2_20261109_094222.json ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/
drag_v2_20261109_094222.json                  100%   54KB   5.2MB/s   00:00
```

#### 端末1-12 HOME に戻す → 爪を開く → 位置合わせ（--episode 183454）

```
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 dynamic_tracking_limits/place/place_modules/08_home_from_anywhere.py && python3 -c "from visual_servo_pick import get_daemon_socket, daemon_set_gripper, close_daemon_socket; get_daemon_socket(); daemon_set_gripper(0); close_daemon_socket()" && 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
[INIT] daemon 接続中...
  [Pi] fresh_mode=1
[INIT] fresh_mode=1
[PRE]  現在姿勢: [-40.86, 66.35, 2.10, 0.87, -71.36, -29.97]
[SEND] HOME へ移動指令
[WAIT] t=0.6s  max_err=56.95°
[WAIT] t=1.1s  max_err=41.22°
[WAIT] t=1.6s  max_err=25.13°
[WAIT] t=2.1s  max_err=9.84°
[WAIT] t=2.6s  max_err=1.49°
[DONE] HOME 到達 max_err=1.49°
[POST] 最終姿勢: [-0.26, 1.23, 1.49, -0.87, -0.08, -29.88]
  [Pi] fresh_mode=0
[EXIT] fresh_mode=0, socket close
  [Pi] GRIPPER: OPEN result= None
[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=  +0.6  dx=  +2.9  response=0.680  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE  ] 終了 (何も書いていません)
```

#### 端末1-13 ドライラン（drag_v2_20261109_094222.json）

```
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.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_094222.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_vqaoucfr/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 経由・区間ごとに 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      = [ -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_092616.json
[RTD   ]   measured_at = 2026-11-09T09:26:18.245166  block = (+200.0, +191.4) mm  box = (-219.8, +188.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] [WARN] 再生直前: 四隅が最大 63.4px ずれています（1 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 63.2px ずれています（2 回目 / 上限 15.0px）。測り直します
[RTD   ] [WARN] 再生直前: 四隅が最大 63.1px ずれています（3 回目 / 上限 15.0px）。やり直しの上限に達しました
[RTD   ] 再生直前: block = (+203.2, +200.1) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_094651.jpg
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_094651_rejected.json
[RTD   ] [WARN] マット四隅が measure 時から最大 63.1px ずれています（上限 15.0px・最大 3 回やり直しても収まらず）。カメラが動いた可能性があるので止めます。measure を取り直してください（各隅のずれ: 10.0, 2.0, 63.1, 43.3）（**止めません**・WARN のみ）
[RTD   ] ドライランなので、ここで終了します（アームには何も送っていません）
[RTD   ] Pi 版と比べる点: 抽出ウェイポイント 4 姿勢と各区間の max|Δ| は同じ。送り方は単発（Pi 版は 0.1s 補間ストリーミング）なので n_steps / ticks は比較対象外。送信 8 回 / 想定所要 ≈ 31.8s
```

#### 端末1-14 measure → 再生 run_0001_20261109_094839（drag_v2_20261109_094222.json）

```
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/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_094222.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   ] 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=[296, 1693] Y=[0, 955]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.657 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.16s)
[DETECT][1/5] box Unity=(-0.213,+0.186) score=0.657405436038971
  赤ブロック pixel=(578, 589) → Unity=(0.1863, 0.1940)
[DETECT][1/5] block Unity=(+0.186,+0.194) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=92.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1474,579) source=template_fallback score=0.657 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.20s)
[DETECT][2/5] box Unity=(-0.214,+0.186) score=0.6569926738739014
  赤ブロック pixel=(577, 589) → Unity=(0.1868, 0.1940)
[DETECT][2/5] block Unity=(+0.187,+0.194) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][3/5] box Unity=(-0.213,+0.186) score=0.6578432321548462
  赤ブロック pixel=(577, 589) → Unity=(0.1868, 0.1940)
[DETECT][3/5] block Unity=(+0.187,+0.194) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.18s)
[DETECT][4/5] box Unity=(-0.213,+0.186) score=0.6576859354972839
  赤ブロック pixel=(578, 589) → Unity=(0.1863, 0.1940)
[DETECT][4/5] block Unity=(+0.186,+0.194) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.18s)
[DETECT][5/5] box Unity=(-0.213,+0.186) score=0.6575878262519836
  赤ブロック pixel=(578, 580) → Unity=(0.1864, 0.1897)
[DETECT][5/5] block Unity=(+0.186,+0.190) score=null
[RTD   ] measure: block = (+186.4, +194.0) mm
[RTD   ] measure: box   = (-213.3, +186.5) mm  score=0.6575878262519836
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_094827.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 1.0px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 9.8px = 4.62mm（5 枚・上限 4.0mm）
[RTD   ] [WARN] 検出が不安定です: ブロックのばらつきが 9.8px = 4.62mm（上限 4.0mm）。（WARN のみ・保存します）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_094827.jpg
[RTD   ] 元の検出と測り直しの差: 0.61mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_094827.json
[RTD   ] [WARN] この measure には WARN が 1 件あります: 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   ] モード: 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_whc5leii/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.23,   +1.49,   -0.26,   +0.00,  -29.88]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.26,   +1.23,   +1.49,   -0.26,   +0.00,  -29.88]
            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      = [ -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_094827.json
[RTD   ]   measured_at = 2026-11-09T09:48:29.550123  block = (+186.4, +194.0) mm  box = (-213.3, +186.5) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+186.8, +194.0) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_094831.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 0.8px <= 許容 10.5px = 5.0mm / mm 換算の差 0.37mm）
[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_094839
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_094839/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_094839/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.6s)
[RTD   ] 送信 OK（daemon 往復 1.041s）
[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.029s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.20° <= 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.044s）
[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）] / 最大 14.6s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=1.85° <= 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.58° <= 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.040s）
[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 復帰）] / 最大 10.5s)
[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 66/66 回, 実効 1.72 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.72 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.035s / p50 1.030s / 最大 1.044s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.044s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.67s / 最大 5.30s
[RECORD] 電流の記録終了 93 行 (2.42 行/秒. 本体が眠っている間だけ読む. 爪の間 14.062 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_094839/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_094839/run_0001_20261109_094839.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_094839 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-15 誤って端末の出力を貼り付けた（zsh: parse error。何も動いていない）

```
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % >....          
い）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.67s / 最大 5.30s
[RECORD] 電流の記録終了 93 行 (2.42 行/秒. 本体が眠っている間だけ読む. 爪の間 14.062 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_094839/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_094839/run_0001_20261109_094839.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_094839 --dataset mecharm_redblock_box_teach_v1
(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
zsh: parse error near `shimazueiichi@shimad...'
```

#### 端末1-16 位置合わせ（183454）→ measure → 再生 run_0001_20261109_095308（drag_v2_20261109_094222.json）

```
(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=  +0.8  dx=  +1.9  response=0.686  → 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=[296, 1694] Y=[0, 954]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.14s)
[DETECT][1/5] box Unity=(-0.213,+0.187) score=0.6583369970321655
  赤ブロック pixel=(572, 589) → Unity=(0.1892, 0.1938)
[DETECT][1/5] block Unity=(+0.189,+0.194) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=92.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.15s)
[DETECT][2/5] box Unity=(-0.213,+0.187) score=0.6583242416381836
  赤ブロック pixel=(570, 589) → Unity=(0.1901, 0.1938)
[DETECT][2/5] block Unity=(+0.190,+0.194) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][3/5] box Unity=(-0.213,+0.187) score=0.6580415964126587
  赤ブロック pixel=(564, 588) → Unity=(0.1928, 0.1933)
[DETECT][3/5] block Unity=(+0.193,+0.193) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.6px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1472,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][4/5] box Unity=(-0.212,+0.187) score=0.6580570936203003
  赤ブロック pixel=(565, 588) → Unity=(0.1924, 0.1933)
[DETECT][4/5] block Unity=(+0.192,+0.193) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=92.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][5/5] box Unity=(-0.213,+0.187) score=0.6578023433685303
  赤ブロック pixel=(566, 587) → Unity=(0.1919, 0.1928)
[DETECT][5/5] block Unity=(+0.192,+0.193) score=null
[RTD   ] measure: block = (+191.9, +193.3) mm
[RTD   ] measure: box   = (-212.9, +186.6) mm  score=0.6580570936203003
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_095251.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 1.1px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 0.0px = 0.00mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.01mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_095251.json
[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_nqgb4yjf/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.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      = [ -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_095251.json
[RTD   ]   measured_at = 2026-11-09T09:52:53.636417  block = (+191.9, +193.3) mm  box = (-212.9, +186.6) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+191.9, +193.3) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_095256.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 0.0px <= 許容 10.5px = 5.0mm / mm 換算の差 0.01mm）
[RTD   ] マット四隅のずれ 最大 1.8px（上限 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_095308
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_095308/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_095308/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.6s)
[RTD   ] 送信 OK（daemon 往復 1.034s）
[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.044s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.11° <= 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.037s）
[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）] / 最大 14.6s)
[RTD   ] 送信 OK（daemon 往復 1.048s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=1.94° <= 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.55° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.71° <= 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.051s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.20° <= 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.029s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.28° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 63/63 回, 実効 1.69 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.69 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.039s / p50 1.037s / 最大 1.051s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.051s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.54s / 最大 4.92s
[RECORD] 電流の記録終了 87 行 (2.33 行/秒. 本体が眠っている間だけ読む. 爪の間 14.062 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_095308/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_095308/run_0001_20261109_095308.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_095308 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-17 位置合わせ（183454）→ measure → 再生 run_0001_20261109_095452（drag_v2_20261109_094222.json）

```
(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=  +0.4  dx=  +2.8  response=0.615  → 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=[295, 1693] Y=[0, 953]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=92.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][1/5] box Unity=(-0.213,+0.187) score=0.6577462553977966
  赤ブロック pixel=(547, 606) → Unity=(0.2001, 0.2021)
[DETECT][1/5] block Unity=(+0.200,+0.202) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=92.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.657 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.20s)
[DETECT][2/5] box Unity=(-0.213,+0.187) score=0.6573586463928223
  赤ブロック pixel=(548, 606) → Unity=(0.1997, 0.2021)
[DETECT][2/5] block Unity=(+0.200,+0.202) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=92.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.20s)
[DETECT][3/5] box Unity=(-0.213,+0.187) score=0.6578812599182129
  赤ブロック pixel=(548, 607) → Unity=(0.1997, 0.2025)
[DETECT][3/5] block Unity=(+0.200,+0.203) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=92.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.19s)
[DETECT][4/5] box Unity=(-0.213,+0.187) score=0.658078670501709
  赤ブロック pixel=(548, 607) → Unity=(0.1997, 0.2025)
[DETECT][4/5] block Unity=(+0.200,+0.203) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=92.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.20s)
[DETECT][5/5] box Unity=(-0.213,+0.187) score=0.6578689217567444
  赤ブロック pixel=(548, 606) → Unity=(0.1997, 0.2021)
[DETECT][5/5] block Unity=(+0.200,+0.202) score=null
[RTD   ] measure: block = (+199.7, +202.1) mm
[RTD   ] measure: box   = (-213.1, +186.7) mm  score=0.6578689217567444
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_095441.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.51px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 1.4px = 0.66mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.00mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_095441.json
[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_l9m2v6dv/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.58,   +1.93,   +0.17,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.26,   +1.58,   +1.93,   +0.17,   -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      = [ -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_095441.json
[RTD   ]   measured_at = 2026-11-09T09:54:42.949704  block = (+199.7, +202.1) mm  box = (-213.1, +186.7) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+199.7, +202.1) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_095445.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 0.0px <= 許容 10.5px = 5.0mm / mm 換算の差 0.00mm）
[RTD   ] マット四隅のずれ 最大 0.5px（上限 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_095452
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_095452/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_095452/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.005s
[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.033s）
[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.11° <= 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.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.032s）
[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）] / 最大 14.6s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[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.034s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.99° <= 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.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.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 復帰）] / 最大 10.5s)
[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 62/62 回, 実効 1.67 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.67 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.031s / p50 1.031s / 最大 1.034s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.034s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.51s / 最大 4.94s
[RECORD] 電流の記録終了 85 行 (2.29 行/秒. 本体が眠っている間だけ読む. 爪の間 14.039 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_095452/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_095452/run_0001_20261109_095452.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_095452 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-18 位置合わせ（183454）→ measure → 再生 run_0001_20261109_095630（drag_v2_20261109_094222.json）

```
(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=  +0.6  dx=  +1.9  response=0.654  → 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=[295, 1693] Y=[0, 954]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.19s)
[DETECT][1/5] box Unity=(-0.213,+0.187) score=0.6580485701560974
  赤ブロック pixel=(902, 125) → Unity=(0.0434, -0.0286)
[DETECT][1/5] block Unity=(+0.043,-0.029) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.6px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.20s)
[DETECT][2/5] box Unity=(-0.213,+0.187) score=0.6582283973693848
  赤ブロック pixel=(902, 126) → Unity=(0.0434, -0.0281)
[DETECT][2/5] block Unity=(+0.043,-0.028) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.6px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.21s)
[DETECT][3/5] box Unity=(-0.213,+0.187) score=0.6580819487571716
  赤ブロック pixel=(901, 139) → Unity=(0.0437, -0.0219)
[DETECT][3/5] block Unity=(+0.044,-0.022) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.21s)
[DETECT][4/5] box Unity=(-0.213,+0.187) score=0.658021867275238
  赤ブロック pixel=(901, 139) → Unity=(0.0437, -0.0219)
[DETECT][4/5] block Unity=(+0.044,-0.022) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.20s)
[DETECT][5/5] box Unity=(-0.213,+0.187) score=0.6581321358680725
  赤ブロック pixel=(901, 144) → Unity=(0.0437, -0.0195)
[DETECT][5/5] block Unity=(+0.044,-0.019) score=null
[RTD   ] measure: block = (+43.7, -21.9) mm
[RTD   ] measure: box   = (-213.2, +186.6) mm  score=0.6580819487571716
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_095620.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.71px（上限 15.0px・やり直し 1 回）
[RTD   ] [WARN] 検出したブロックがアームの根元から 48.9mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+43.7, -21.9) mm（WARN のみ・保存します）
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_095620.jpg
[RTD   ] ブロックのばらつき: 26.0px = 12.53mm（5 枚・上限 4.0mm）
[RTD   ] [WARN] 検出が不安定です: ブロックのばらつきが 26.0px = 12.53mm（上限 4.0mm）。（WARN のみ・保存します）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_095620.jpg
[RTD   ] 元の検出と測り直しの差: 0.48mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_095620.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   ] モード: 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_9w4w9i2e/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.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      = [ -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_095620.json
[RTD   ]   measured_at = 2026-11-09T09:56:22.654880  block = (+43.7, -21.9) mm  box = (-213.2, +186.6) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+43.7, -15.6) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_095625.jpg
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_095625.jpg
[RTD   ] [WARN] 検出したブロックがアームの根元から 46.4mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+43.7, -15.6) mm（**止めません**・WARN のみ）
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 13.0px（≒6.3mm）動いています（許容 10.4px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 13.0px（許容 10.4px = 5.0mm）/ mm 換算の差 6.26mm
[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_095630
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_095630/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_095630/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.6s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[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.032s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.11° <= 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.032s）
[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）] / 最大 14.6s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[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.032s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.46° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 0.62° <= 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.030s）
[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.5s)
[RTD   ] 送信 OK（daemon 往復 1.033s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 64/64 回, 実効 1.70 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.70 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.031s / p50 1.032s / 最大 1.033s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.033s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.58s / 最大 4.95s
[RECORD] 電流の記録終了 89 行 (2.36 行/秒. 本体が眠っている間だけ読む. 爪の間 14.058 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_095630/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_095630/run_0001_20261109_095630.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_095630 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-19 位置合わせ（183454）→ measure → 再生 run_0001_20261109_095810（drag_v2_20261109_094222.json）

```
(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=  +0.4  dx=  +2.1  response=0.612  → 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=[296, 1694] Y=[0, 954]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.6px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.18s)
[DETECT][1/5] box Unity=(-0.213,+0.187) score=0.6580707430839539
  赤ブロック pixel=(583, 593) → Unity=(0.1842, 0.1957)
[DETECT][1/5] block Unity=(+0.184,+0.196) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.6px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.21s)
[DETECT][2/5] box Unity=(-0.213,+0.187) score=0.6577411890029907
  赤ブロック pixel=(583, 593) → Unity=(0.1842, 0.1957)
[DETECT][2/5] block Unity=(+0.184,+0.196) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.6px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.19s)
[DETECT][3/5] box Unity=(-0.213,+0.187) score=0.6578583717346191
  赤ブロック pixel=(583, 593) → Unity=(0.1842, 0.1957)
[DETECT][3/5] block Unity=(+0.184,+0.196) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.6px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.30s)
[DETECT][4/5] box Unity=(-0.213,+0.187) score=0.6578198671340942
  赤ブロック pixel=(583, 593) → Unity=(0.1842, 0.1957)
[DETECT][4/5] block Unity=(+0.184,+0.196) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.6px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.14s)
[DETECT][5/5] box Unity=(-0.213,+0.187) score=0.657885730266571
  赤ブロック pixel=(582, 593) → Unity=(0.1846, 0.1957)
[DETECT][5/5] block Unity=(+0.185,+0.196) score=null
[RTD   ] measure: block = (+184.2, +195.7) mm
[RTD   ] measure: box   = (-212.9, +186.7) mm  score=0.6578583717346191
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_095801.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.14px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 0.0px = 0.00mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.00mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_095801.json
[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_ma6n255o/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.43,   +1.58,   +1.93,   +0.17,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.58,   +1.93,   +0.17,   -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      = [ -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_095801.json
[RTD   ]   measured_at = 2026-11-09T09:58:03.100208  block = (+184.2, +195.7) mm  box = (-212.9, +186.7) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+184.2, +195.7) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_095805.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 0.0px <= 許容 10.5px = 5.0mm / mm 換算の差 0.00mm）
[RTD   ] マット四隅のずれ 最大 0.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_095810
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_095810/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_095810/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.6s)
[RTD   ] 送信 OK（daemon 往復 1.038s）
[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.029s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.02° <= 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.046s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.20° <= 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.030s）
[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.032s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.67° <= 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.032s）
[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.5s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.10° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 63/63 回, 実効 1.69 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.69 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.034s / p50 1.032s / 最大 1.046s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.046s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.54s / 最大 4.62s
[RECORD] 電流の記録終了 87 行 (2.33 行/秒. 本体が眠っている間だけ読む. 爪の間 14.061 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_095810/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_095810/run_0001_20261109_095810.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_095810 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-20 位置合わせ（183454）→ measure → 再生 run_0001_20261109_095948（drag_v2_20261109_094222.json）

```
(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=  +0.4  dx=  +2.0  response=0.647  → 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=[296, 1694] Y=[0, 954]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.0px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.16s)
[DETECT][1/5] box Unity=(-0.213,+0.187) score=0.6578174233436584
  赤ブロック pixel=(573, 586) → Unity=(0.1887, 0.1924)
[DETECT][1/5] block Unity=(+0.189,+0.192) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.6px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][2/5] box Unity=(-0.213,+0.187) score=0.6576898097991943
  赤ブロック pixel=(574, 586) → Unity=(0.1883, 0.1924)
[DETECT][2/5] block Unity=(+0.188,+0.192) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=94.0px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.657 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][3/5] box Unity=(-0.213,+0.187) score=0.6574801802635193
  赤ブロック pixel=(573, 586) → Unity=(0.1887, 0.1924)
[DETECT][3/5] block Unity=(+0.189,+0.192) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=94.0px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][4/5] box Unity=(-0.213,+0.187) score=0.6575645208358765
  赤ブロック pixel=(574, 587) → Unity=(0.1883, 0.1929)
[DETECT][4/5] block Unity=(+0.188,+0.193) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=94.0px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.20s)
[DETECT][5/5] box Unity=(-0.213,+0.187) score=0.6578072905540466
  赤ブロック pixel=(574, 587) → Unity=(0.1883, 0.1929)
[DETECT][5/5] block Unity=(+0.188,+0.193) score=null
[RTD   ] measure: block = (+188.3, +192.4) mm
[RTD   ] measure: box   = (-212.9, +186.7) mm  score=0.6576898097991943
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_095940.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.0px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 2.0px = 0.90mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.47mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_095940.json
[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_d7efpqwf/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.43,   +1.49,   +1.93,   +0.00,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.93,   +0.00,   -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      = [ -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_095940.json
[RTD   ]   measured_at = 2026-11-09T09:59:42.355896  block = (+188.3, +192.4) mm  box = (-212.9, +186.7) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+187.8, +192.9) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_095944.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 1.4px <= 許容 10.5px = 5.0mm / mm 換算の差 0.66mm）
[RTD   ] マット四隅のずれ 最大 0.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_095948
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_095948/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_095948/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.6s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[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.044s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.11° <= 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.030s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.20° <= 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.033s）
[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.032s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.67° <= 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.049s）
[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 復帰）] / 最大 10.5s)
[RTD   ] 送信 OK（daemon 往復 1.036s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.37° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 65/65 回, 実効 1.71 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.71 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.036s / p50 1.033s / 最大 1.049s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.049s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.62s / 最大 4.92s
[RECORD] 電流の記録終了 91 行 (2.39 行/秒. 本体が眠っている間だけ読む. 爪の間 14.055 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_095948/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_095948/run_0001_20261109_095948.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_095948 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-21 位置合わせ（183454）→ measure → 再生 run_0001_20261109_100126（drag_v2_20261109_094222.json）

```
(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=  +0.8  dx=  +2.0  response=0.694  → 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=[296, 1694] Y=[0, 954]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.9px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.29s)
[DETECT][1/5] box Unity=(-0.213,+0.187) score=0.658983588218689
  赤ブロック pixel=(554, 582) → Unity=(0.1973, 0.1905)
[DETECT][1/5] block Unity=(+0.197,+0.191) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=94.2px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.19s)
[DETECT][2/5] box Unity=(-0.213,+0.187) score=0.6587685942649841
  赤ブロック pixel=(554, 587) → Unity=(0.1973, 0.1929)
[DETECT][2/5] block Unity=(+0.197,+0.193) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.9px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.19s)
[DETECT][3/5] box Unity=(-0.213,+0.187) score=0.6587606072425842
  赤ブロック pixel=(553, 588) → Unity=(0.1977, 0.1934)
[DETECT][3/5] block Unity=(+0.198,+0.193) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.9px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][4/5] box Unity=(-0.213,+0.187) score=0.6589679718017578
  赤ブロック pixel=(547, 581) → Unity=(0.2005, 0.1901)
[DETECT][4/5] block Unity=(+0.200,+0.190) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=94.2px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][5/5] box Unity=(-0.213,+0.187) score=0.6589428186416626
  赤ブロック pixel=(556, 588) → Unity=(0.1964, 0.1934)
[DETECT][5/5] block Unity=(+0.196,+0.193) score=null
[RTD   ] measure: block = (+197.3, +192.9) mm
[RTD   ] measure: box   = (-212.9, +186.7) mm  score=0.6589428186416626
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_100116.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 1.13px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 2.8px = 1.32mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 1.06mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_100116.json
[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_fve28n8b/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.43,   +1.58,   +1.93,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.58,   +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      = [ -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_100116.json
[RTD   ]   measured_at = 2026-11-09T10:01:18.126478  block = (+197.3, +192.9) mm  box = (-212.9, +186.7) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+196.8, +192.9) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_100120.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 1.1px <= 許容 10.5px = 5.0mm / mm 換算の差 0.49mm）
[RTD   ] マット四隅のずれ 最大 0.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_100126
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_100126/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_100126/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.6s)
[RTD   ] 送信 OK（daemon 往復 1.031s）
[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.033s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.11° <= 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   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.20° <= 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.031s）
[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.054s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.94° <= 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.034s）
[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.5s)
[RTD   ] 送信 OK（daemon 往復 1.028s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 64/64 回, 実効 1.70 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.70 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 区間): 平均 2.58s / 最大 4.93s
[RECORD] 電流の記録終了 89 行 (2.36 行/秒. 本体が眠っている間だけ読む. 爪の間 14.06 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_100126/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_100126/run_0001_20261109_100126.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_100126 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-22 位置合わせ（183454）→ measure → 再生 run_0001_20261109_100307（drag_v2_20261109_094222.json）

```
(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=  +0.5  dx=  +2.1  response=0.630  → 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=[295, 1693] Y=[0, 954]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.9px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.13s)
[DETECT][1/5] box Unity=(-0.213,+0.187) score=0.6587597131729126
  赤ブロック pixel=(577, 587) → Unity=(0.1868, 0.1929)
[DETECT][1/5] block Unity=(+0.187,+0.193) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=94.2px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.19s)
[DETECT][2/5] box Unity=(-0.213,+0.187) score=0.6586676239967346
  赤ブロック pixel=(577, 588) → Unity=(0.1868, 0.1934)
[DETECT][2/5] block Unity=(+0.187,+0.193) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.9px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.19s)
[DETECT][3/5] box Unity=(-0.213,+0.187) score=0.6587637662887573
  赤ブロック pixel=(577, 588) → Unity=(0.1868, 0.1934)
[DETECT][3/5] block Unity=(+0.187,+0.193) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.9px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.31s)
[DETECT][4/5] box Unity=(-0.213,+0.187) score=0.658864438533783
  赤ブロック pixel=(578, 587) → Unity=(0.1864, 0.1929)
[DETECT][4/5] block Unity=(+0.186,+0.193) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.9px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.19s)
[DETECT][5/5] box Unity=(-0.213,+0.187) score=0.6588751673698425
  赤ブロック pixel=(577, 588) → Unity=(0.1868, 0.1934)
[DETECT][5/5] block Unity=(+0.187,+0.193) score=null
[RTD   ] measure: block = (+186.8, +193.4) mm
[RTD   ] measure: box   = (-213.0, +186.6) mm  score=0.6587637662887573
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_100300.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 1.13px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 2.0px = 0.95mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.00mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_100300.json
[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_udmy3xzs/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.43,   +1.58,   +1.93,   +0.17,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.58,   +1.93,   +0.17,   -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      = [ -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_100300.json
[RTD   ]   measured_at = 2026-11-09T10:03:02.213615  block = (+186.8, +193.4) mm  box = (-213.0, +186.6) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+186.8, +193.4) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_100304.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 0.0px <= 許容 10.5px = 5.0mm / mm 換算の差 0.00mm）
[RTD   ] マット四隅のずれ 最大 0.6px（上限 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_100307
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_100307/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_100307/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.6s)
[RTD   ] 送信 OK（daemon 往復 1.053s）
[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.032s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.20° <= 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.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.028s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.20° <= 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.032s）
[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.031s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.99° <= 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.034s）
[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 復帰）] / 最大 10.5s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.37° <= 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.053s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.053s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.42s / 最大 4.96s
[RECORD] 電流の記録終了 81 行 (2.22 行/秒. 本体が眠っている間だけ読む. 爪の間 14.05 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_100307/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_100307/run_0001_20261109_100307.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_100307 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-23 位置合わせ（183454）→ measure → 再生 run_0001_20261109_100444（drag_v2_20261109_094222.json）

```
(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=  +0.7  dx=  +1.9  response=0.686  → 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=[295, 1693] Y=[0, 955]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=94.2px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.12s)
[DETECT][1/5] box Unity=(-0.213,+0.186) score=0.6583411693572998
  赤ブロック pixel=(902, 126) → Unity=(0.0432, -0.0281)
[DETECT][1/5] block Unity=(+0.043,-0.028) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.9px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.15s)
[DETECT][2/5] box Unity=(-0.213,+0.186) score=0.6587986946105957
  赤ブロック pixel=(901, 141) → Unity=(0.0435, -0.0209)
[DETECT][2/5] block Unity=(+0.044,-0.021) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.9px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.16s)
[DETECT][3/5] box Unity=(-0.213,+0.186) score=0.658930242061615
  赤ブロック pixel=(901, 152) → Unity=(0.0435, -0.0156)
[DETECT][3/5] block Unity=(+0.043,-0.016) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.9px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][4/5] box Unity=(-0.213,+0.186) score=0.658618688583374
  赤ブロック pixel=(901, 140) → Unity=(0.0435, -0.0214)
[DETECT][4/5] block Unity=(+0.044,-0.021) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=94.2px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.660 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.16s)
[DETECT][5/5] box Unity=(-0.213,+0.186) score=0.659500002861023
  赤ブロック pixel=(900, 148) → Unity=(0.0439, -0.0175)
[DETECT][5/5] block Unity=(+0.044,-0.018) score=null
[RTD   ] measure: block = (+43.5, -20.9) mm
[RTD   ] measure: box   = (-213.4, +186.5) mm  score=0.6587986946105957
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_100436.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.85px（上限 15.0px・やり直し 1 回）
[RTD   ] [WARN] 検出したブロックがアームの根元から 48.3mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+43.5, -20.9) mm（WARN のみ・保存します）
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_100436.jpg
[RTD   ] ブロックのばらつき: 2.2px = 1.06mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 6.26mm（上限 3.0mm）
[RTD   ] [WARN] 元の検出 (+43.5, -20.9) mm と測り直し (+43.6, -27.2) mm が 6.26mm 食い違います（上限 3.0mm）。元の検出が外れている可能性があります（WARN のみ・保存します）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_100436.jpg
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_100436.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
[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_7kbgoxva/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.43,   +1.58,   +1.93,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.58,   +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      = [ -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_100436.json
[RTD   ]   measured_at = 2026-11-09T10:04:37.970418  block = (+43.5, -20.9) mm  box = (-213.4, +186.5) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+43.9, -17.5) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_100440.jpg
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_100440.jpg
[RTD   ] [WARN] 検出したブロックがアームの根元から 47.3mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+43.9, -17.5) mm（**止めません**・WARN のみ）
[RTD   ] ブロック位置の照合 OK（画素の差 7.1px <= 許容 10.4px = 5.0mm / mm 換算の差 3.40mm）
[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_100444
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_100444/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_100444/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.6s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[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.029s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.02° <= 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.20° <= 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.031s）
[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.033s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.99° <= tol 3.0°)
[STEP  9] GRIPPER OPEN → daemon_set_gripper(0, 50, wait=0)
[RTD   ] 静止確認 OK（step9_open: 連続 3 回・連続差 最大 1.41° <= 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.031s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.28° <= 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.040s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.19° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 64/64 回, 実効 1.70 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.70 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.55s / 最大 4.63s
[RECORD] 電流の記録終了 89 行 (2.36 行/秒. 本体が眠っている間だけ読む. 爪の間 14.067 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_100444/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_100444/run_0001_20261109_100444.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_100444 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-24 位置合わせ（183454）→ measure → 再生 run_0001_20261109_100716（drag_v2_20261109_094222.json）

```
(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=  +0.6  dx=  +1.9  response=0.703  → 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=[296, 1694] Y=[0, 954]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.18s)
[DETECT][1/5] box Unity=(-0.213,+0.187) score=0.6588532328605652
  赤ブロック pixel=(568, 583) → Unity=(0.1910, 0.1910)
[DETECT][1/5] block Unity=(+0.191,+0.191) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.6px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.25s)
[DETECT][2/5] box Unity=(-0.213,+0.187) score=0.6587164402008057
  赤ブロック pixel=(568, 586) → Unity=(0.1910, 0.1924)
[DETECT][2/5] block Unity=(+0.191,+0.192) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.6px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.20s)
[DETECT][3/5] box Unity=(-0.213,+0.187) score=0.6585840582847595
  赤ブロック pixel=(568, 584) → Unity=(0.1910, 0.1915)
[DETECT][3/5] block Unity=(+0.191,+0.191) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.6px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.18s)
[DETECT][4/5] box Unity=(-0.213,+0.187) score=0.6590473651885986
  赤ブロック pixel=(568, 584) → Unity=(0.1910, 0.1915)
[DETECT][4/5] block Unity=(+0.191,+0.191) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=93.6px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.659 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.21s)
[DETECT][5/5] box Unity=(-0.213,+0.187) score=0.6589676737785339
  赤ブロック pixel=(568, 585) → Unity=(0.1910, 0.1919)
[DETECT][5/5] block Unity=(+0.191,+0.192) score=null
[RTD   ] measure: block = (+191.0, +191.5) mm
[RTD   ] measure: box   = (-212.9, +187.1) mm  score=0.6588532328605652
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_100710.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 1.41px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 8.1px = 3.83mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.47mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_100710.json
[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_yj5ohcom/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.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      = [ -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_100710.json
[RTD   ]   measured_at = 2026-11-09T10:07:11.728244  block = (+191.0, +191.5) mm  box = (-212.9, +187.1) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+191.0, +191.5) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_100714.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 0.0px <= 許容 10.5px = 5.0mm / mm 換算の差 0.00mm）
[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_100716
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_100716/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_100716/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.6s)
[RTD   ] 送信 OK（daemon 往復 1.038s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.75° <= 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|Δ|=2.02° <= 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.028s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.20° <= 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.047s）
[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.99° <= 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.72° <= 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.055s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 60/60 回, 実効 1.64 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.64 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.040s / p50 1.038s / 最大 1.055s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.055s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.44s / 最大 4.66s
[RECORD] 電流の記録終了 81 行 (2.21 行/秒. 本体が眠っている間だけ読む. 爪の間 14.054 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_100716/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_100716/run_0001_20261109_100716.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_100716 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-25 位置合わせ（183454）→ measure → 再生 run_0001_20261109_100852（drag_v2_20261109_094222.json）

```
(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=  +0.7  dx=  +1.7  response=0.675  → 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=[295, 1693] Y=[0, 955]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=98.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.15s)
[DETECT][1/5] box Unity=(-0.213,+0.186) score=0.6576671004295349
  赤ブロック pixel=(573, 603) → Unity=(0.1881, 0.2006)
[DETECT][1/5] block Unity=(+0.188,+0.201) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=98.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.23s)
[DETECT][2/5] box Unity=(-0.213,+0.186) score=0.6580837965011597
  赤ブロック pixel=(573, 602) → Unity=(0.1881, 0.2001)
[DETECT][2/5] block Unity=(+0.188,+0.200) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=98.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.657 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.20s)
[DETECT][3/5] box Unity=(-0.213,+0.186) score=0.6572675704956055
  赤ブロック pixel=(573, 603) → Unity=(0.1881, 0.2006)
[DETECT][3/5] block Unity=(+0.188,+0.201) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=98.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.23s)
[DETECT][4/5] box Unity=(-0.213,+0.186) score=0.6581308245658875
  赤ブロック pixel=(571, 603) → Unity=(0.1890, 0.2006)
[DETECT][4/5] block Unity=(+0.189,+0.201) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=98.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.22s)
[DETECT][5/5] box Unity=(-0.213,+0.186) score=0.6575151681900024
  赤ブロック pixel=(573, 603) → Unity=(0.1881, 0.2006)
[DETECT][5/5] block Unity=(+0.188,+0.201) score=null
[RTD   ] measure: block = (+188.1, +200.6) mm
[RTD   ] measure: box   = (-213.4, +186.4) mm  score=0.6576671004295349
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_100844.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 1.13px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 3.2px = 1.43mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.00mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_100844.json
[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_l1ctr0tb/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.43,   +1.58,   +1.93,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.58,   +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      = [ -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_100844.json
[RTD   ]   measured_at = 2026-11-09T10:08:46.608024  block = (+188.1, +200.6) mm  box = (-213.4, +186.4) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+188.1, +200.6) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_100848.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 0.0px <= 許容 10.5px = 5.0mm / mm 換算の差 0.00mm）
[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_100852
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_100852/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_100852/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.6s)
[RTD   ] 送信 OK（daemon 往復 1.039s）
[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.20° <= 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.046s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.20° <= 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.030s）
[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.99° <= 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 復帰）] / 最大 10.5s)
[RTD   ] 送信 OK（daemon 往復 1.032s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.37° <= 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.046s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.046s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.42s / 最大 4.93s
[RECORD] 電流の記録終了 81 行 (2.22 行/秒. 本体が眠っている間だけ読む. 爪の間 14.059 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_100852/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_100852/run_0001_20261109_100852.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_100852 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-26 位置合わせ（183454）→ measure → 再生 run_0001_20261109_101023（drag_v2_20261109_094222.json）

```
(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=  +0.5  dx=  +2.0  response=0.636  → 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=[296, 1694] Y=[0, 953]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=98.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.657 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.30s)
[DETECT][1/5] box Unity=(-0.213,+0.187) score=0.6571207046508789
  赤ブロック pixel=(564, 604) → Unity=(0.1926, 0.2010)
[DETECT][1/5] block Unity=(+0.193,+0.201) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=98.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.657 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][2/5] box Unity=(-0.213,+0.187) score=0.6573553681373596
  赤ブロック pixel=(565, 604) → Unity=(0.1922, 0.2010)
[DETECT][2/5] block Unity=(+0.192,+0.201) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=98.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.657 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][3/5] box Unity=(-0.213,+0.187) score=0.6574556231498718
  赤ブロック pixel=(564, 604) → Unity=(0.1926, 0.2010)
[DETECT][3/5] block Unity=(+0.193,+0.201) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=98.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.16s)
[DETECT][4/5] box Unity=(-0.213,+0.187) score=0.6575424671173096
  赤ブロック pixel=(564, 604) → Unity=(0.1926, 0.2010)
[DETECT][4/5] block Unity=(+0.193,+0.201) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=98.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.657 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.16s)
[DETECT][5/5] box Unity=(-0.213,+0.187) score=0.6574698090553284
  赤ブロック pixel=(564, 604) → Unity=(0.1926, 0.2010)
[DETECT][5/5] block Unity=(+0.193,+0.201) score=null
[RTD   ] measure: block = (+192.6, +201.0) mm
[RTD   ] measure: box   = (-212.9, +186.7) mm  score=0.6574556231498718
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_101016.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.41px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 1.0px = 0.45mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.45mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_101016.json
[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_mj5mm250/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.43,   +1.58,   +1.93,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.58,   +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      = [ -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_101016.json
[RTD   ]   measured_at = 2026-11-09T10:10:18.381512  block = (+192.6, +201.0) mm  box = (-212.9, +186.7) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+192.6, +201.4) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_101020.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 1.0px <= 許容 10.5px = 5.0mm / mm 換算の差 0.47mm）
[RTD   ] マット四隅のずれ 最大 1.5px（上限 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_101023
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_101023/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_101023/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.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.6s)
[RTD   ] 送信 OK（daemon 往復 1.055s）
[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.041s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.55° <= 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.20° <= 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.032s）
[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.035s）
[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.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.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 復帰）] / 最大 10.5s)
[RTD   ] 送信 OK（daemon 往復 1.062s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 63/63 回, 実効 1.68 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.68 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.040s / p50 1.035s / 最大 1.062s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.062s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.55s / 最大 4.62s
[RECORD] 電流の記録終了 87 行 (2.32 行/秒. 本体が眠っている間だけ読む. 爪の間 14.046 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_101023/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_101023/run_0001_20261109_101023.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_101023 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-27 位置合わせ（183454）→ measure → 再生 run_0001_20261109_101157（drag_v2_20261109_094222.json）

```
(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=  +0.8  dx=  +1.8  response=0.657  → 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=[296, 1693] Y=[0, 954]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=98.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.10s)
[DETECT][1/5] box Unity=(-0.213,+0.187) score=0.6575878858566284
  赤ブロック pixel=(589, 592) → Unity=(0.1813, 0.1951)
[DETECT][1/5] block Unity=(+0.181,+0.195) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.3px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.16s)
[DETECT][2/5] box Unity=(-0.213,+0.186) score=0.657660186290741
  赤ブロック pixel=(589, 591) → Unity=(0.1813, 0.1946)
[DETECT][2/5] block Unity=(+0.181,+0.195) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=99.6px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.658 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.17s)
[DETECT][3/5] box Unity=(-0.213,+0.186) score=0.6578900814056396
  赤ブロック pixel=(589, 592) → Unity=(0.1813, 0.1951)
[DETECT][3/5] block Unity=(+0.181,+0.195) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=98.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.657 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.15s)
[DETECT][4/5] box Unity=(-0.213,+0.187) score=0.6574811339378357
  赤ブロック pixel=(589, 592) → Unity=(0.1813, 0.1951)
[DETECT][4/5] block Unity=(+0.181,+0.195) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=98.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.657 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.16s)
[DETECT][5/5] box Unity=(-0.213,+0.187) score=0.6574426293373108
  赤ブロック pixel=(589, 592) → Unity=(0.1813, 0.1951)
[DETECT][5/5] block Unity=(+0.181,+0.195) score=null
[RTD   ] measure: block = (+181.3, +195.1) mm
[RTD   ] measure: box   = (-213.2, +186.8) mm  score=0.6575878858566284
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_101149.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.22px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 0.0px = 0.00mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.00mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_101149.json
[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_jy9t5ndp/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.43,   +1.49,   +1.84,   +0.00,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.49,   +1.84,   +0.00,   -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      = [ -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_101149.json
[RTD   ]   measured_at = 2026-11-09T10:11:51.656864  block = (+181.3, +195.1) mm  box = (-213.2, +186.8) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+181.3, +195.1) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_101153.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 0.0px <= 許容 10.5px = 5.0mm / mm 換算の差 0.00mm）
[RTD   ] マット四隅のずれ 最大 0.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_101157
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_101157/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_101157/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.6s)
[RTD   ] 送信 OK（daemon 往復 1.056s）
[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.040s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.20° <= 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.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.042s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.20° <= 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.032s）
[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.028s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.67° <= 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.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 復帰）] / 最大 10.5s)
[RTD   ] 送信 OK（daemon 往復 1.046s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.37° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 65/65 回, 実効 1.71 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.71 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.039s / p50 1.040s / 最大 1.056s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.056s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.63s / 最大 4.96s
[RECORD] 電流の記録終了 91 行 (2.39 行/秒. 本体が眠っている間だけ読む. 爪の間 14.039 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_101157/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_101157/run_0001_20261109_101157.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_101157 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-28 位置合わせ（183454）→ measure → 再生 run_0001_20261109_101434（drag_v2_20261109_094222.json）

```
(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=  +0.8  dx=  +1.9  response=0.697  → 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=[295, 1693] Y=[0, 954]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.654 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.16s)
[DETECT][1/5] box Unity=(-0.213,+0.187) score=0.6536651253700256
  赤ブロック pixel=(607, 584) → Unity=(0.1733, 0.1913)
[DETECT][1/5] block Unity=(+0.173,+0.191) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.654 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.20s)
[DETECT][2/5] box Unity=(-0.213,+0.187) score=0.6537135243415833
  赤ブロック pixel=(902, 131) → Unity=(0.0434, -0.0258)
[DETECT][2/5] block Unity=(+0.043,-0.026) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.654 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.21s)
[DETECT][3/5] box Unity=(-0.213,+0.187) score=0.6535080075263977
  赤ブロック pixel=(902, 128) → Unity=(0.0434, -0.0272)
[DETECT][3/5] block Unity=(+0.043,-0.027) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.654 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.22s)
[DETECT][4/5] box Unity=(-0.213,+0.187) score=0.6535629034042358
  赤ブロック pixel=(606, 583) → Unity=(0.1737, 0.1908)
[DETECT][4/5] block Unity=(+0.174,+0.191) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.8px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,579) source=template_fallback score=0.653 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.21s)
[DETECT][5/5] box Unity=(-0.213,+0.186) score=0.6534576416015625
  赤ブロック pixel=(596, 592) → Unity=(0.1782, 0.1951)
[DETECT][5/5] block Unity=(+0.178,+0.195) score=null
[RTD   ] measure: block = (+173.3, +190.8) mm
[RTD   ] measure: box   = (-213.2, +186.9) mm  score=0.6535629034042358
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_101426.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 1.32px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 560.0px = 262.03mm（5 枚・上限 4.0mm）
[RTD   ] [WARN] 検出が不安定です: ブロックのばらつきが 560.0px = 262.03mm（上限 4.0mm）。（WARN のみ・保存します）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_101426.jpg
[RTD   ] 元の検出と測り直しの差: 6.83mm（上限 3.0mm）
[RTD   ] [WARN] 元の検出 (+173.3, +190.8) mm と測り直し (+178.1, +195.6) mm が 6.83mm 食い違います（上限 3.0mm）。元の検出が外れている可能性があります（WARN のみ・保存します）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_101426.jpg
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_101426.json
[RTD   ] [WARN] この measure には WARN が 2 件あります: block_spread_over, vs_recheck_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   ] モード: 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_aoh9nji8/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.43,   +1.58,   +1.93,   +0.17,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.58,   +1.93,   +0.17,   -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      = [ -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_101426.json
[RTD   ]   measured_at = 2026-11-09T10:14:28.610812  block = (+173.3, +190.8) mm  box = (-213.2, +186.9) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+177.7, +195.6) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_101431.jpg
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 14.2px（≒6.5mm）動いています（許容 10.5px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 14.2px（許容 10.5px = 5.0mm）/ mm 換算の差 6.51mm
[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_101434
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_101434/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_101434/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.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.6s)
[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.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 回・連続差 最大 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.19° <= 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.030s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.11° <= 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.029s）
[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.17° <= 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.053s）
[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.029s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.37° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 93/93 回, 実効 1.97 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.97 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.033s / p50 1.030s / 最大 1.053s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.053s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 3.77s / 最大 7.87s
[RECORD] 電流の記録終了 147 行 (3.12 行/秒. 本体が眠っている間だけ読む. 爪の間 14.062 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_101434/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_101434/run_0001_20261109_101434.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_101434 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-29 位置合わせ（183454）→ measure → 再生 run_0001_20261109_101615（drag_v2_20261109_094222.json）

```
(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=  +1.0  dx=  +1.8  response=0.660  → 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=[296, 1693] Y=[0, 954]
[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.9px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.653 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.47s)
[DETECT][1/5] box Unity=(-0.213,+0.187) score=0.6531690359115601
  赤ブロック pixel=(569, 589) → Unity=(0.1904, 0.1938)
[DETECT][1/5] block Unity=(+0.190,+0.194) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.8px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.654 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.25s)
[DETECT][2/5] box Unity=(-0.213,+0.187) score=0.6535621881484985
  赤ブロック pixel=(569, 589) → Unity=(0.1904, 0.1938)
[DETECT][2/5] block Unity=(+0.190,+0.194) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.8px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.653 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.39s)
[DETECT][3/5] box Unity=(-0.213,+0.187) score=0.6531739234924316
  赤ブロック pixel=(570, 589) → Unity=(0.1900, 0.1938)
[DETECT][3/5] block Unity=(+0.190,+0.194) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.654 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.31s)
[DETECT][4/5] box Unity=(-0.213,+0.187) score=0.6535281538963318
  赤ブロック pixel=(569, 589) → Unity=(0.1904, 0.1938)
[DETECT][4/5] block Unity=(+0.190,+0.194) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.8px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1473,580) source=template_fallback score=0.653 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.25s)
[DETECT][5/5] box Unity=(-0.213,+0.187) score=0.6534122228622437
  赤ブロック pixel=(569, 589) → Unity=(0.1904, 0.1938)
[DETECT][5/5] block Unity=(+0.190,+0.194) score=null
[RTD   ] measure: block = (+190.4, +193.8) mm
[RTD   ] measure: box   = (-213.0, +187.0) mm  score=0.6534122228622437
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_101607.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.85px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 1.4px = 0.66mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.00mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_101607.json
[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_wtf8njw6/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.43,   +1.58,   +1.93,   +0.26,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.58,   +1.93,   +0.26,   -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      = [ -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_101607.json
[RTD   ]   measured_at = 2026-11-09T10:16:09.415084  block = (+190.4, +193.8) mm  box = (-213.0, +187.0) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+190.4, +193.8) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_101611.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 0.0px <= 許容 10.5px = 5.0mm / mm 換算の差 0.00mm）
[RTD   ] マット四隅のずれ 最大 0.8px（上限 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_101615
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_101615/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_101615/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.6s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.67° <= 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.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.016s
[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.051s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.28° <= 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.029s）
[RTD   ] arrival OK (APPROACH_PICK → APPROACH_PLACE, max|Δ|=2.11° <= 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.67° <= 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.030s）
[RTD   ] arrival OK (PLACE → APPROACH_PLACE (retreat), max|Δ|=2.20° <= 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.031s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.10° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 62/62 回, 実効 1.68 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.68 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.033s / p50 1.030s / 最大 1.051s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.051s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.49s / 最大 4.43s
[RECORD] 電流の記録終了 85 行 (2.3 行/秒. 本体が眠っている間だけ読む. 爪の間 14.064 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_101615/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_101615/run_0001_20261109_101615.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_101615 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-30 位置合わせ（183454）→ measure → 再生 run_0001_20261109_102715（drag_v2_20261109_094222.json）

```
(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
```

#### 端末1-31 位置合わせ（183454）→ measure → 再生 run_0001_20261109_102903（drag_v2_20261109_094222.json）

```
(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.8  dx=  -2.6  response=0.565  → 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=[278, 1690] Y=[0, 951]
[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.0px > 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.16s)
[DETECT][1/5] box Unity=(-0.210,+0.191) score=0.6466633081436157
  赤ブロック pixel=(857, 162) → Unity=(0.0569, -0.0102)
[DETECT][1/5] block Unity=(+0.057,-0.010) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.0px > 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][2/5] box Unity=(-0.210,+0.191) score=0.646782636642456
  赤ブロック pixel=(858, 168) → Unity=(0.0565, -0.0073)
[DETECT][2/5] block Unity=(+0.056,-0.007) 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.24s)
[DETECT][3/5] box Unity=(-0.210,+0.191) score=0.6466386318206787
[DETECT][3/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.23s)
[DETECT][4/5] box Unity=(-0.210,+0.191) score=0.6465700268745422
  赤ブロック pixel=(858, 168) → Unity=(0.0565, -0.0073)
[DETECT][4/5] block Unity=(+0.056,-0.007) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.0px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1460,572) source=template_fallback score=0.646 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.30s)
[DETECT][5/5] box Unity=(-0.210,+0.191) score=0.6464079022407532
  赤ブロック pixel=(853, 292) → Unity=(0.0598, 0.0526)
[DETECT][5/5] block Unity=(+0.060,+0.053) score=null
[RTD   ] measure: block = (+56.7, -7.3) mm
[RTD   ] measure: box   = (-209.9, +191.4) mm  score=0.6466386318206787
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_102856.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 2.24px（上限 15.0px・やり直し 1 回）
[RTD   ] [WARN] 検出したブロックがアームの根元から 57.1mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+56.7, -7.3) mm（WARN のみ・保存します）
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_102856.jpg
[RTD   ] ブロックのばらつき: 129.0px = 62.47mm（5 枚・上限 4.0mm）
[RTD   ] [WARN] 検出が不安定です: ブロックのばらつきが 129.0px = 62.47mm（上限 4.0mm）。（WARN のみ・保存します）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_102856.jpg
[RTD   ] 元の検出と測り直しの差: 26.22mm（上限 3.0mm）
[RTD   ] [WARN] 元の検出 (+56.7, -7.3) mm と測り直し (+58.7, +18.8) mm が 26.22mm 食い違います（上限 3.0mm）。元の検出が外れている可能性があります（WARN のみ・保存します）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_102856.jpg
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_102856.json
[RTD   ] [WARN] この measure には WARN が 3 件あります: block_too_close_to_base, block_spread_over, vs_recheck_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   ] モード: 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_bi6g6a74/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.43,   +1.58,   +1.93,   +0.26,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.58,   +1.93,   +0.26,   -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      = [ -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_102856.json
[RTD   ]   measured_at = 2026-11-09T10:28:58.609697  block = (+56.7, -7.3) mm  box = (-209.9, +191.4) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+59.2, +46.9) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_102901.jpg
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_102901.jpg
[RTD   ] [WARN] 検出したブロックがアームの根元から 75.5mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+59.2, +46.9) mm（**止めません**・WARN のみ）
[RTD   ] [WARN] ブロックが measure 時から動いています（止めません・項目8）: ブロックが measure 時から 112.1px（≒54.2mm）動いています（許容 10.3px = 5.0mm）。ブロックを戻すか measure をやり直してください
[RTD   ] [WARN]   画素の差 112.0px（許容 10.3px = 5.0mm）/ mm 換算の差 54.24mm
[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_102903
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_102903/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_102903/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.6s)
[RTD   ] 送信 OK（daemon 往復 1.030s）
[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.031s）
[RTD   ] [WARN] arrival timeout (APPROACH_PICK → PICK, max|Δ|=3.52° > tol 3.0°, 8.0s)
[RTD   ] [WARN] 到達確認タイムアウト（max|Δ|=3.52° > tol 3.0°）ですが pre→last max|Δ| 11.96° >= 1.0°（動いているので再送しない）。**止めずに次の区間へ進みます**
[STEP  5] GRIPPER CLOSE → daemon_set_gripper_value(20, 50)
[RTD   ] 静止確認 OK（step5_close: 連続 3 回・連続差 最大 1.67° <= 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.055s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.98° <= 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.035s）
[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.035s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=2.64° <= 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.72° <= 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.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 98/98 回, 実効 2.00 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（2.00 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.038s / p50 1.034s / 最大 1.055s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.055s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 3.95s / 最大 9.12s
[RECORD] 電流の記録終了 159 行 (3.25 行/秒. 本体が眠っている間だけ読む. 爪の間 14.062 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_102903/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_102903/run_0001_20261109_102903.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_102903 --dataset mecharm_redblock_box_teach_v1
```

#### 端末1-32 位置合わせ（183454）→ measure → 再生 run_0001_20261109_103049（drag_v2_20261109_094222.json）

```
(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.8  dx=  -2.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   ] 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=[278, 1689] Y=[0, 951]
[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.6466503739356995
[DETECT][1/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.0px > 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][2/5] box Unity=(-0.210,+0.191) score=0.646745502948761
  赤ブロック pixel=(858, 167) → Unity=(0.0564, -0.0078)
[DETECT][2/5] block Unity=(+0.056,-0.008) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.0px > 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][3/5] box Unity=(-0.210,+0.191) score=0.6467356085777283
[DETECT][3/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.0px > 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.20s)
[DETECT][4/5] box Unity=(-0.210,+0.191) score=0.6466956734657288
  赤ブロック pixel=(858, 168) → Unity=(0.0565, -0.0073)
[DETECT][4/5] block Unity=(+0.056,-0.007) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=100.0px > 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.18s)
[DETECT][5/5] box Unity=(-0.210,+0.191) score=0.6465780138969421
  赤ブロック pixel=(857, 145) → Unity=(0.0567, -0.0185)
[DETECT][5/5] block Unity=(+0.057,-0.018) score=null
[RTD   ] measure: block = (+56.5, -7.8) mm
[RTD   ] measure: box   = (-210.0, +191.4) mm  score=0.6466956734657288
[RTD   ] [WARN] ブロックの検出サンプルが 1 件（最低 3 件）。ばらつきを判定できません（WARN のみ・保存します）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_103041.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.14px（上限 15.0px・やり直し 1 回）
[RTD   ] [WARN] 検出したブロックがアームの根元から 57.0mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+56.5, -7.8) mm（WARN のみ・保存します）
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_103041.jpg
[RTD   ] ブロックのばらつき: 0.0px = 0.00mm（1 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.49mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_103041.json
[RTD   ] [WARN] この measure には WARN が 2 件あります: too_few_samples, 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_d8ypjhky/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.43,   +1.58,   +1.93,   +0.26,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.58,   +1.93,   +0.26,   -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      = [ -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_103041.json
[RTD   ]   measured_at = 2026-11-09T10:30:43.117243  block = (+56.5, -7.8) mm  box = (-210.0, +191.4) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = None（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_103045.jpg
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_103045_rejected.json
[RTD   ] [WARN] 再生直前にブロックを検出できません（画素位置が取れない）。動いていないかを確認できないので止めます（**止めません**・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_103049
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_103049/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_103049/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.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.6s)
[RTD   ] 送信 OK（daemon 往復 1.054s）
[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.038s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.02° <= 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.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.030s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.28° <= 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.031s）
[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.029s）
[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.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.051s）
[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 復帰）] / 最大 10.5s)
[RTD   ] 送信 OK（daemon 往復 1.048s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.46° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 64/64 回, 実効 1.70 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.70 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.040s / p50 1.038s / 最大 1.054s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.054s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.59s / 最大 4.64s
[RECORD] 電流の記録終了 89 行 (2.36 行/秒. 本体が眠っている間だけ読む. 爪の間 14.043 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_103049/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_103049/run_0001_20261109_103049.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_103049 --dataset mecharm_redblock_box_teach_v1
```

### 端末2（位置2）

```
Last login: Mon Nov  9 09:24:56 on ttys002
```

#### 端末2-01 位置合わせ（191541）→ measure → 再生 run_0001_20261109_102109（drag_v2_20221013_230205.json）

```
(base) shimazueiichi@shimadzueiichinoMacBook-Pro ~ % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 191541 --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_20221013_230205.json --execute
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF   ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  +8.1  dx=  -3.0  response=0.671  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +9.9  dx=  -7.1  response=0.738  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= +11.3  dx=  -7.3  response=0.739  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +9.2  dx=  -2.0  response=0.852  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= +10.7  dx=  +2.3  response=0.420  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +8.9  dx=  -4.0  response=0.765  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +7.8  dx=  -5.0  response=0.748  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +6.4  dx=  -6.5  response=0.768  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +5.4  dx=  -6.8  response=0.771  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +4.1  dx=  -7.3  response=0.742  → 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=[303, 1706] 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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.8px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1497,554) source=template_fallback score=0.648 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.27s)
[DETECT][1/5] box Unity=(-0.219,+0.182) score=0.6479768753051758
  赤ブロック pixel=(891, 131) → Unity=(0.0501, -0.0252)
[DETECT][1/5] block Unity=(+0.050,-0.025) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.8px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1497,554) 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.219,+0.182) score=0.6478016376495361
  赤ブロック pixel=(558, 676) → Unity=(0.2006, 0.2349)
[DETECT][2/5] block Unity=(+0.201,+0.235) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.8px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1497,554) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.23s)
[DETECT][3/5] box Unity=(-0.219,+0.182) score=0.6474870443344116
  赤ブロック pixel=(558, 675) → Unity=(0.2006, 0.2344)
[DETECT][3/5] block Unity=(+0.201,+0.234) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1497,553) source=template_fallback score=0.648 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.13s)
[DETECT][4/5] box Unity=(-0.219,+0.181) score=0.6477974057197571
  赤ブロック pixel=(559, 676) → Unity=(0.2002, 0.2349)
[DETECT][4/5] block Unity=(+0.200,+0.235) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1496,554) source=template_fallback score=0.648 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.18s)
[DETECT][5/5] box Unity=(-0.219,+0.182) score=0.6476736664772034
  赤ブロック pixel=(557, 676) → Unity=(0.2010, 0.2349)
[DETECT][5/5] block Unity=(+0.201,+0.235) score=null
[RTD   ] measure: block = (+200.6, +234.9) mm
[RTD   ] measure: box   = (-219.3, +181.9) mm  score=0.6477974057197571
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_102049.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.22px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 639.2px = 300.69mm（5 枚・上限 4.0mm）
[RTD   ] [WARN] 検出が不安定です: ブロックのばらつきが 639.2px = 300.69mm（上限 4.0mm）。（WARN のみ・保存します）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_102049.jpg
[RTD   ] 元の検出と測り直しの差: 0.01mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_102049.json
[RTD   ] [WARN] この measure には WARN が 1 件あります: 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   ] モード: EXECUTE（実機）  記録: ON
[RTD   ] Pi から教えた記録を取得します: ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/drag_v2_20221013_230205.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_1c0pbaob/drag_v2_20221013_230205.json
[RTD   ] 入力ファイル: drag_v2_20221013_230205.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=197 (start=197 end=282, gap=20.48°)
                    angles = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
  PICK           <- gripper close mark idx=309（PICK phase 範囲内）
                    angles = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=388 (start=388 end=424, gap=21.97°)
                    angles = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
  PLACE          <- gripper open mark idx=452（PLACE phase 範囲内）
                    angles = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 148 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 23.12°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.58,   +1.93,   +0.08,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.58,   +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      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 66.79°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            max |Δ| = 20.48°  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    = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            to      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 20.48°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 80.76°  1 回送信 speed=20  (~ 4.0s @ 20°/s 目安・到達待ち 最大 14.1s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 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    = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 47.46°  1 回送信 speed=20  (~ 2.4s @ 20°/s 目安・到達待ち 最大 9.1s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 31.0s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 14.0s（max|Δ| 合計 279.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_102049.json
[RTD   ]   measured_at = 2026-11-09T10:20:51.402480  block = (+200.6, +234.9) mm  box = (-219.3, +181.9) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+200.2, +234.4) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_102053.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 1.4px <= 許容 10.6px = 5.0mm / mm 換算の差 0.64mm）
[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_102109
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_102109/teach/drag_v2_20221013_230205.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_102109/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.031s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.67° <= 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.045s）
[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.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.82° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 14.1s)
[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.057s）
[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.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.041s）
[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.1s)
[RTD   ] 送信 OK（daemon 往復 1.033s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.10° <= 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.038s / p50 1.033s / 最大 1.057s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.057s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.44s / 最大 4.65s
[RECORD] 電流の記録終了 81 行 (2.22 行/秒. 本体が眠っている間だけ読む. 爪の間 14.046 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_102109/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_102109/run_0001_20261109_102109.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_102109 --dataset mecharm_redblock_box_teach_v1
```

#### 端末2-02 位置合わせ（191541）→ measure → 再生 run_0001_20261109_102248（drag_v2_20221013_230205.json）

```
(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 191541 --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_20221013_230205.json --execute
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF   ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  +4.8  dx=  -0.3  response=0.863  → 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=[303, 1707] Y=[0, 950]
[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=(1497,553) 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.219,+0.181) score=0.6468372344970703
[DETECT][1/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.8px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1497,553) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.18s)
[DETECT][2/5] box Unity=(-0.219,+0.181) score=0.6468321681022644
[DETECT][2/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.8px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1497,553) source=template_fallback score=0.646 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.35s)
[DETECT][3/5] box Unity=(-0.219,+0.181) score=0.6463598012924194
[DETECT][3/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.8px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1497,553) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.18s)
[DETECT][4/5] box Unity=(-0.219,+0.181) score=0.6468881964683533
[DETECT][4/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.8px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1497,553) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.20s)
[DETECT][5/5] box Unity=(-0.219,+0.181) score=0.6468064188957214
[DETECT][5/5] block 未検出
[RTD   ] measure: block = None
[RTD   ] measure: box   = (-219.0, +181.2) mm  score=0.6468321681022644
[RTD   ] [WARN] ブロックが検出できませんでした。この measure では run の位置照合（ブロックが動いていないかの確認）が通りません
[RTD   ] [WARN] ブロックの検出サンプルが 0 件（最低 3 件）。ばらつきを判定できません（WARN のみ・保存します）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_102239.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 2.24px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 0.0px = 0.00mm（0 枚・上限 4.0mm）
[RTD   ] [WARN] ブロックを検出できていません（None）。位置は null で保存します
[RTD   ] [WARN] ブロックの測り直しができていません（元の検出と突き合わせ不可）。（WARN のみ・保存します）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_102239.json
[RTD   ] [WARN] この measure には WARN が 3 件あります: too_few_samples, block_not_detected, block_recheck_missing
[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_20221013_230205.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_vcw3slru/drag_v2_20221013_230205.json
[RTD   ] 入力ファイル: drag_v2_20221013_230205.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=197 (start=197 end=282, gap=20.48°)
                    angles = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
  PICK           <- gripper close mark idx=309（PICK phase 範囲内）
                    angles = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=388 (start=388 end=424, gap=21.97°)
                    angles = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
  PLACE          <- gripper open mark idx=452（PLACE phase 範囲内）
                    angles = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 148 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 23.12°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  +0.26,   +1.40,   +0.87,   -0.26,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  +0.26,   +1.40,   +0.87,   -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      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 66.79°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            max |Δ| = 20.48°  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    = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            to      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 20.48°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 80.76°  1 回送信 speed=20  (~ 4.0s @ 20°/s 目安・到達待ち 最大 14.1s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 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    = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 47.46°  1 回送信 speed=20  (~ 2.4s @ 20°/s 目安・到達待ち 最大 9.1s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 31.0s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 14.0s（max|Δ| 合計 279.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_102239.json
[RTD   ]   measured_at = 2026-11-09T10:22:40.932334  block = None  box = (-219.0, +181.2) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = None（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_102243.jpg
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_102243_rejected.json
[RTD   ] [WARN] measure に homography / ブロックの画素位置がありません（古い形式の measure です）。measure を取り直してください（**止めません**・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_102248
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_102248/teach/drag_v2_20221013_230205.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_102248/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.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.0s)
[RTD   ] 送信 OK（daemon 往復 1.040s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.58° <= 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|Δ|=2.90° <= 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.99° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 14.1s)
[RTD   ] 送信 OK（daemon 往復 1.041s）
[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.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.72° <= tol 3.0°)
[STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  (1 回送信 speed=20 → 到達待ち 許容 2.5°[TOL_HOME（stage1_to_home / HOME 復帰）] / 最大 9.1s)
[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 62/62 回, 実効 1.67 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.67 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.034s / p50 1.031s / 最大 1.041s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.041s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.50s / 最大 4.97s
[RECORD] 電流の記録終了 85 行 (2.29 行/秒. 本体が眠っている間だけ読む. 爪の間 14.06 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_102248/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_102248/run_0001_20261109_102248.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_102248 --dataset mecharm_redblock_box_teach_v1
```

#### 端末2-03 位置合わせ（191541）→ measure → 再生 run_0001_20261109_102431（drag_v2_20221013_230205.json）

```
(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 191541 --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_20221013_230205.json --execute
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF   ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  +4.9  dx=  -0.5  response=0.867  → 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=[303, 1707] Y=[0, 950]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.9px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1498,554) source=template_fallback score=0.648 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.32s)
[DETECT][1/5] box Unity=(-0.219,+0.182) score=0.6483623385429382
  赤ブロック pixel=(546, 669) → Unity=(0.2062, 0.2309)
[DETECT][1/5] block Unity=(+0.206,+0.231) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1497,554) source=template_fallback score=0.648 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.15s)
[DETECT][2/5] box Unity=(-0.219,+0.182) score=0.6482501029968262
  赤ブロック pixel=(547, 669) → Unity=(0.2057, 0.2309)
[DETECT][2/5] block Unity=(+0.206,+0.231) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1497,554) source=template_fallback score=0.648 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.42s)
[DETECT][3/5] box Unity=(-0.219,+0.182) score=0.6477387547492981
  赤ブロック pixel=(547, 669) → Unity=(0.2057, 0.2309)
[DETECT][3/5] block Unity=(+0.206,+0.231) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1497,554) source=template_fallback score=0.648 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.25s)
[DETECT][4/5] box Unity=(-0.219,+0.182) score=0.6482484936714172
  赤ブロック pixel=(546, 670) → Unity=(0.2062, 0.2314)
[DETECT][4/5] block Unity=(+0.206,+0.231) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.7px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1497,554) source=template_fallback score=0.648 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.23s)
[DETECT][5/5] box Unity=(-0.219,+0.182) score=0.6479676961898804
  赤ブロック pixel=(547, 669) → Unity=(0.2057, 0.2309)
[DETECT][5/5] block Unity=(+0.206,+0.231) score=null
[RTD   ] measure: block = (+205.7, +230.9) mm
[RTD   ] measure: box   = (-218.9, +181.6) mm  score=0.6482484936714172
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_102418.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 2.24px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 2.2px = 1.04mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.00mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_102418.json
[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_20221013_230205.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_zrwigkj2/drag_v2_20221013_230205.json
[RTD   ] 入力ファイル: drag_v2_20221013_230205.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=197 (start=197 end=282, gap=20.48°)
                    angles = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
  PICK           <- gripper close mark idx=309（PICK phase 範囲内）
                    angles = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=388 (start=388 end=424, gap=21.97°)
                    angles = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
  PLACE          <- gripper open mark idx=452（PLACE phase 範囲内）
                    angles = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 148 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 23.12°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  +0.26,   +1.40,   +0.87,   -0.26,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  +0.26,   +1.40,   +0.87,   -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      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 66.79°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            max |Δ| = 20.48°  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    = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            to      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 20.48°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 80.76°  1 回送信 speed=20  (~ 4.0s @ 20°/s 目安・到達待ち 最大 14.1s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 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    = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 47.46°  1 回送信 speed=20  (~ 2.4s @ 20°/s 目安・到達待ち 最大 9.1s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 31.0s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 14.0s（max|Δ| 合計 279.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_102418.json
[RTD   ]   measured_at = 2026-11-09T10:24:20.000594  block = (+205.7, +230.9) mm  box = (-218.9, +181.6) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+206.2, +230.9) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_102422.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 1.0px <= 許容 10.6px = 5.0mm / mm 換算の差 0.44mm）
[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_102431
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_102431/teach/drag_v2_20221013_230205.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_102431/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.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.055s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.58° <= 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.036s）
[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.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.027s）
[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）] / 最大 14.1s)
[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.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.047s）
[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.1s)
[RTD   ] 送信 OK（daemon 往復 1.036s）
[RTD   ] arrival OK (APPROACH_PLACE → HOME, max|Δ|=2.19° <= tol 2.5°)
  [Pi] fresh_mode=0
[RTD   ] daemon_set_fresh_mode(0) 完了
[RTD   ] 実測角の読み取り: ok 63/63 回, 実効 1.69 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.69 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.039s / p50 1.036s / 最大 1.055s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.055s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.55s / 最大 4.95s
[RECORD] 電流の記録終了 87 行 (2.33 行/秒. 本体が眠っている間だけ読む. 爪の間 14.055 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_102431/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_102431/run_0001_20261109_102431.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_102431 --dataset mecharm_redblock_box_teach_v1
```

#### 端末2-04 位置合わせ（191541）→ measure → 再生 run_0001_20261109_103504（drag_v2_20221013_230205.json）

```
(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 191541 --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_20221013_230205.json --execute
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF   ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  +4.2  dx=  -7.9  response=0.859  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +3.0  dx=  -3.2  response=0.860  → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy=  +1.9  dx=  +0.0  response=0.907  → 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=[300, 1702] Y=[0, 943]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=103.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.18s)
[DETECT][1/5] box Unity=(-0.219,+0.181) score=0.6469163298606873
  赤ブロック pixel=(545, 689) → Unity=(0.2053, 0.2430)
[DETECT][1/5] block Unity=(+0.205,+0.243) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=103.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) 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.219,+0.181) score=0.6465428471565247
  赤ブロック pixel=(545, 681) → Unity=(0.2053, 0.2391)
[DETECT][2/5] block Unity=(+0.205,+0.239) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=103.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.646 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.19s)
[DETECT][3/5] box Unity=(-0.219,+0.181) score=0.6463620662689209
  赤ブロック pixel=(545, 681) → Unity=(0.2053, 0.2391)
[DETECT][3/5] block Unity=(+0.205,+0.239) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=103.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.18s)
[DETECT][4/5] box Unity=(-0.219,+0.181) score=0.6466255187988281
  赤ブロック pixel=(545, 681) → Unity=(0.2053, 0.2391)
[DETECT][4/5] block Unity=(+0.205,+0.239) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=103.4px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.647 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.15s)
[DETECT][5/5] box Unity=(-0.219,+0.181) score=0.6468006372451782
  赤ブロック pixel=(545, 689) → Unity=(0.2053, 0.2430)
[DETECT][5/5] block Unity=(+0.205,+0.243) score=null
[RTD   ] measure: block = (+205.3, +239.1) mm
[RTD   ] measure: box   = (-219.0, +180.6) mm  score=0.6466255187988281
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_103445.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.81px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 7.0px = 3.33mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.95mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_103445.json
[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_20221013_230205.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_4jphu09x/drag_v2_20221013_230205.json
[RTD   ] 入力ファイル: drag_v2_20221013_230205.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=197 (start=197 end=282, gap=20.48°)
                    angles = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
  PICK           <- gripper close mark idx=309（PICK phase 範囲内）
                    angles = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=388 (start=388 end=424, gap=21.97°)
                    angles = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
  PLACE          <- gripper open mark idx=452（PLACE phase 範囲内）
                    angles = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 148 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 23.12°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  -0.43,   +1.58,   +1.93,   +0.17,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  -0.43,   +1.58,   +1.93,   +0.17,   -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      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 66.79°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            max |Δ| = 20.48°  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    = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            to      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 20.48°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 80.76°  1 回送信 speed=20  (~ 4.0s @ 20°/s 目安・到達待ち 最大 14.1s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 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    = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 47.46°  1 回送信 speed=20  (~ 2.4s @ 20°/s 目安・到達待ち 最大 9.1s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 31.0s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 14.0s（max|Δ| 合計 279.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_103445.json
[RTD   ]   measured_at = 2026-11-09T10:34:47.075907  block = (+205.3, +239.1) mm  box = (-219.0, +180.6) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+205.3, +240.1) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_103449.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 2.0px <= 許容 10.5px = 5.0mm / mm 換算の差 0.95mm）
[RTD   ] マット四隅のずれ 最大 0.6px（上限 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_103504
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_103504/teach/drag_v2_20221013_230205.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_103504/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.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.030s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.58° <= 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|Δ|=2.55° <= 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.035s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.55° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 14.1s)
[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.030s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.85° <= 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.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 復帰）] / 最大 9.1s)
[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 94/94 回, 実効 1.98 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.98 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 区間): 平均 3.80s / 最大 7.86s
[RECORD] 電流の記録終了 149 行 (3.14 行/秒. 本体が眠っている間だけ読む. 爪の間 14.058 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_103504/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_103504/run_0001_20261109_103504.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_103504 --dataset mecharm_redblock_box_teach_v1
```

#### 端末2-05 位置合わせ（191541）→ measure → 再生 run_0001_20261109_103804（drag_v2_20221013_230205.json）

```
(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 191541 --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_20221013_230205.json --execute
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF   ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  +2.8  dx=  -1.2  response=0.830  → 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=[300, 1701] Y=[0, 942]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1493,547) source=template_fallback score=0.651 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.10s)
[DETECT][1/5] box Unity=(-0.220,+0.181) score=0.6506764888763428
[DETECT][1/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.2px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.651 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.12s)
[DETECT][2/5] box Unity=(-0.219,+0.181) score=0.6506078243255615
  赤ブロック pixel=(890, 118) → Unity=(0.0489, -0.0311)
[DETECT][2/5] block Unity=(+0.049,-0.031) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.2px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.650 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.13s)
[DETECT][3/5] box Unity=(-0.219,+0.181) score=0.6503243446350098
  赤ブロック pixel=(890, 117) → Unity=(0.0489, -0.0316)
[DETECT][3/5] block Unity=(+0.049,-0.032) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.0px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.651 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.15s)
[DETECT][4/5] box Unity=(-0.219,+0.181) score=0.6506612300872803
[DETECT][4/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1493,547) source=template_fallback score=0.651 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.27s)
[DETECT][5/5] box Unity=(-0.220,+0.181) score=0.651165783405304
[DETECT][5/5] block 未検出
[RTD   ] measure: block = (+48.9, -31.3) mm
[RTD   ] measure: box   = (-219.1, +180.6) mm  score=0.6506612300872803
[RTD   ] [WARN] ブロックの検出サンプルが 0 件（最低 3 件）。ばらつきを判定できません（WARN のみ・保存します）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_103755.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.14px（上限 15.0px・やり直し 1 回）
[RTD   ] [WARN] 検出したブロックがアームの根元から 58.1mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+48.9, -31.3) mm（WARN のみ・保存します）
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_103755.jpg
[RTD   ] ブロックのばらつき: 0.0px = 0.00mm（0 枚・上限 4.0mm）
[RTD   ] [WARN] ブロックの測り直しができていません（元の検出と突き合わせ不可）。（WARN のみ・保存します）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_103755.json
[RTD   ] [WARN] この measure には WARN が 3 件あります: too_few_samples, block_too_close_to_base, block_recheck_missing
[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_20221013_230205.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_elj3qgy9/drag_v2_20221013_230205.json
[RTD   ] 入力ファイル: drag_v2_20221013_230205.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=197 (start=197 end=282, gap=20.48°)
                    angles = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
  PICK           <- gripper close mark idx=309（PICK phase 範囲内）
                    angles = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=388 (start=388 end=424, gap=21.97°)
                    angles = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
  PLACE          <- gripper open mark idx=452（PLACE phase 範囲内）
                    angles = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 148 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 23.12°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  +0.26,   +1.49,   +0.87,   -0.17,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  +0.26,   +1.49,   +0.87,   -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      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 66.79°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            max |Δ| = 20.48°  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    = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            to      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 20.48°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 80.76°  1 回送信 speed=20  (~ 4.0s @ 20°/s 目安・到達待ち 最大 14.1s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 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    = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 47.46°  1 回送信 speed=20  (~ 2.4s @ 20°/s 目安・到達待ち 最大 9.1s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 31.0s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 14.0s（max|Δ| 合計 279.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_103755.json
[RTD   ]   measured_at = 2026-11-09T10:37:56.762830  block = (+48.9, -31.3) mm  box = (-219.1, +180.6) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+48.9, -30.1) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_103759.jpg
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_103759.jpg
[RTD   ] [WARN] 検出したブロックがアームの根元から 57.4mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+48.9, -30.1) mm（**止めません**・WARN のみ）
[RTD   ] ブロック位置の照合 OK（画素の差 2.5px <= 許容 10.2px = 5.0mm / mm 換算の差 1.22mm）
[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_103804
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_103804/teach/drag_v2_20221013_230205.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_103804/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.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.054s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.67° <= 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.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.038s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.99° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 14.1s)
[RTD   ] 送信 OK（daemon 往復 1.029s）
[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.46° <= 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.028s）
[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 復帰）] / 最大 9.1s)
[RTD   ] 送信 OK（daemon 往復 1.038s）
[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.031s / 最大 1.054s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.054s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.34s / 最大 4.44s
[RECORD] 電流の記録終了 77 行 (2.15 行/秒. 本体が眠っている間だけ読む. 爪の間 14.055 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_103804/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_103804/run_0001_20261109_103804.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_103804 --dataset mecharm_redblock_box_teach_v1
```

#### 端末2-06 位置合わせ（191541）→ measure → 再生 run_0001_20261109_103943（drag_v2_20221013_230205.json）

```
(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 191541 --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_20221013_230205.json --execute
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF   ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  +2.9  dx=  -1.1  response=0.814  → 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=[300, 1701] Y=[0, 942]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1493,547) source=template_fallback score=0.649 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.09s)
[DETECT][1/5] box Unity=(-0.220,+0.181) score=0.6492615342140198
[DETECT][1/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1493,547) source=template_fallback score=0.650 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.13s)
[DETECT][2/5] box Unity=(-0.220,+0.181) score=0.6502159237861633
[DETECT][2/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.2px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.650 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.12s)
[DETECT][3/5] box Unity=(-0.219,+0.181) score=0.6496396064758301
[DETECT][3/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.2px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1493,547) source=template_fallback score=0.650 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.13s)
[DETECT][4/5] box Unity=(-0.220,+0.181) score=0.6499977111816406
[DETECT][4/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1493,547) source=template_fallback score=0.650 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.15s)
[DETECT][5/5] box Unity=(-0.220,+0.181) score=0.6499218344688416
[DETECT][5/5] block 未検出
[RTD   ] measure: block = None
[RTD   ] measure: box   = (-219.6, +180.5) mm  score=0.6499218344688416
[RTD   ] [WARN] ブロックが検出できませんでした。この measure では run の位置照合（ブロックが動いていないかの確認）が通りません
[RTD   ] [WARN] ブロックの検出サンプルが 0 件（最低 3 件）。ばらつきを判定できません（WARN のみ・保存します）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_103935.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.57px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 0.0px = 0.00mm（0 枚・上限 4.0mm）
[RTD   ] [WARN] ブロックを検出できていません（None）。位置は null で保存します
[RTD   ] [WARN] ブロックの測り直しができていません（元の検出と突き合わせ不可）。（WARN のみ・保存します）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_103935.json
[RTD   ] [WARN] この measure には WARN が 3 件あります: too_few_samples, block_not_detected, block_recheck_missing
[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_20221013_230205.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_aw97p9mm/drag_v2_20221013_230205.json
[RTD   ] 入力ファイル: drag_v2_20221013_230205.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=197 (start=197 end=282, gap=20.48°)
                    angles = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
  PICK           <- gripper close mark idx=309（PICK phase 範囲内）
                    angles = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=388 (start=388 end=424, gap=21.97°)
                    angles = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
  PLACE          <- gripper open mark idx=452（PLACE phase 範囲内）
                    angles = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 148 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 23.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      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 66.79°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            max |Δ| = 20.48°  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    = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            to      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 20.48°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 80.76°  1 回送信 speed=20  (~ 4.0s @ 20°/s 目安・到達待ち 最大 14.1s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 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    = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 47.46°  1 回送信 speed=20  (~ 2.4s @ 20°/s 目安・到達待ち 最大 9.1s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 31.0s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 14.0s（max|Δ| 合計 279.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_103935.json
[RTD   ]   measured_at = 2026-11-09T10:39:37.349447  block = None  box = (-219.6, +180.5) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+48.5, -24.8) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_103939.jpg
[RTD   ] 何を拾ったかは確認画像で見てください: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_103939.jpg
[RTD   ] [WARN] 検出したブロックがアームの根元から 54.5mm しか離れていません（120.0mm 以内は不可）。教示で使う位置は 200mm 以上離れているので、赤いケーブル等の別のものを拾っている可能性が高いです: (+48.5, -24.8) mm（**止めません**・WARN のみ）
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_103939_rejected.json
[RTD   ] [WARN] measure に homography / ブロックの画素位置がありません（古い形式の measure です）。measure を取り直してください（**止めません**・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_103943
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_103943/teach/drag_v2_20221013_230205.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_103943/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.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.032s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.58° <= 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.034s）
[RTD   ] arrival OK (APPROACH_PICK → PICK, max|Δ|=2.81° <= 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.032s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.82° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 14.1s)
[RTD   ] 送信 OK（daemon 往復 1.035s）
[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.029s）
[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.035s）
[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 復帰）] / 最大 9.1s)
[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 61/61 回, 実効 1.66 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.66 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.034s / p50 1.034s / 最大 1.039s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.039s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.46s / 最大 4.62s
[RECORD] 電流の記録終了 83 行 (2.26 行/秒. 本体が眠っている間だけ読む. 爪の間 14.049 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_103943/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_103943/run_0001_20261109_103943.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_103943 --dataset mecharm_redblock_box_teach_v1
```

#### 端末2-07 位置合わせ（191541）→ measure → 再生 run_0001_20261109_104110（drag_v2_20221013_230205.json）

```
(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 191541 --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_20221013_230205.json --execute
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF   ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  +3.0  dx=  -1.2  response=0.816  → 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=[300, 1701] Y=[0, 942]
[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: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=101.2px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.649 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.12s)
[DETECT][1/5] box Unity=(-0.219,+0.181) score=0.6489354968070984
  赤ブロック pixel=(557, 684) → Unity=(0.1997, 0.2410)
[DETECT][1/5] block Unity=(+0.200,+0.241) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.2px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.649 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.18s)
[DETECT][2/5] box Unity=(-0.219,+0.181) score=0.6487984657287598
  赤ブロック pixel=(557, 684) → Unity=(0.1997, 0.2410)
[DETECT][2/5] block Unity=(+0.200,+0.241) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.2px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.649 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.19s)
[DETECT][3/5] box Unity=(-0.219,+0.181) score=0.6491749882698059
  赤ブロック pixel=(557, 684) → Unity=(0.1997, 0.2410)
[DETECT][3/5] block Unity=(+0.200,+0.241) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.2px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.649 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.27s)
[DETECT][4/5] box Unity=(-0.219,+0.181) score=0.6490935683250427
  赤ブロック pixel=(557, 684) → Unity=(0.1997, 0.2410)
[DETECT][4/5] block Unity=(+0.200,+0.241) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1493,547) source=template_fallback score=0.649 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.12s)
[DETECT][5/5] box Unity=(-0.220,+0.181) score=0.6491795778274536
  赤ブロック pixel=(558, 684) → Unity=(0.1993, 0.2410)
[DETECT][5/5] block Unity=(+0.199,+0.241) score=null
[RTD   ] measure: block = (+199.7, +241.0) mm
[RTD   ] measure: box   = (-219.1, +180.7) mm  score=0.6490935683250427
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_104102.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.92px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 1.0px = 0.44mm（5 枚・上限 4.0mm）
[RTD   ] 元の検出と測り直しの差: 0.44mm（上限 3.0mm）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_104102.json
[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_20221013_230205.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_a18i7785/drag_v2_20221013_230205.json
[RTD   ] 入力ファイル: drag_v2_20221013_230205.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=197 (start=197 end=282, gap=20.48°)
                    angles = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
  PICK           <- gripper close mark idx=309（PICK phase 範囲内）
                    angles = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=388 (start=388 end=424, gap=21.97°)
                    angles = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
  PLACE          <- gripper open mark idx=452（PLACE phase 範囲内）
                    angles = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 148 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 23.12°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  +0.26,   +1.49,   +0.87,   -0.26,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  +0.26,   +1.49,   +0.87,   -0.26,   -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      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 66.79°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            max |Δ| = 20.48°  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    = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            to      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 20.48°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 80.76°  1 回送信 speed=20  (~ 4.0s @ 20°/s 目安・到達待ち 最大 14.1s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 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    = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 47.46°  1 回送信 speed=20  (~ 2.4s @ 20°/s 目安・到達待ち 最大 9.1s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 31.0s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 14.0s（max|Δ| 合計 279.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_104102.json
[RTD   ]   measured_at = 2026-11-09T10:41:03.928317  block = (+199.7, +241.0) mm  box = (-219.1, +180.7) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = (+199.7, +241.0) mm（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_104106.jpg
[RTD   ] ブロック位置の照合 OK（画素の差 0.0px <= 許容 10.5px = 5.0mm / mm 換算の差 0.00mm）
[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_104110
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_104110/teach/drag_v2_20221013_230205.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_104110/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.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.58° <= 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.81° <= 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.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.030s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.55° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 14.1s)
[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.030s）
[RTD   ] arrival OK (APPROACH_PLACE → PLACE, max|Δ|=1.85° <= 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.030s）
[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 復帰）] / 最大 9.1s)
[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 64/64 回, 実効 1.70 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.70 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.031s / p50 1.031s / 最大 1.032s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.032s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.58s / 最大 4.61s
[RECORD] 電流の記録終了 89 行 (2.36 行/秒. 本体が眠っている間だけ読む. 爪の間 14.057 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_104110/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_104110/run_0001_20261109_104110.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_104110 --dataset mecharm_redblock_box_teach_v1
```

#### 端末2-08 位置合わせ（191541）→ measure → 再生 run_0001_20261109_104517（drag_v2_20221013_230205.json）

```
(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 191541 --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_20221013_230205.json --execute
[REF   ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF   ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF   ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy=  +2.7  dx=  -1.1  response=0.835  → 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=[300, 1701] Y=[0, 942]
[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=(1492,547) source=template_fallback score=0.648 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.08s)
[DETECT][1/5] box Unity=(-0.219,+0.180) score=0.6483528017997742
[DETECT][1/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.649 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.11s)
[DETECT][2/5] box Unity=(-0.219,+0.180) score=0.6485284566879272
[DETECT][2/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.648 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.12s)
[DETECT][3/5] box Unity=(-0.219,+0.180) score=0.6484250426292419
  赤ブロック pixel=(575, 662) → Unity=(0.1918, 0.2303)
[DETECT][3/5] block Unity=(+0.192,+0.230) score=null
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.649 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.12s)
[DETECT][4/5] box Unity=(-0.219,+0.180) score=0.6488037109375
[DETECT][4/5] block 未検出
[06f] WARN: 輪郭中心とテンプレ中心の距離が閾値超 |Δ|=102.5px > 60px → 輪郭捨てて fallback
[06f] DETECT: center=(1492,547) source=template_fallback score=0.649 angle=0° scale=1.15 size=(226x211) template=white_box_20260520_163838_005.png (eval 5.12s)
[DETECT][5/5] box Unity=(-0.219,+0.180) score=0.6488063931465149
  赤ブロック pixel=(890, 117) → Unity=(0.0489, -0.0317)
[DETECT][5/5] block Unity=(+0.049,-0.032) score=null
[RTD   ] measure: block = (+120.4, +99.3) mm
[RTD   ] measure: box   = (-219.2, +180.4) mm  score=0.6485284566879272
[RTD   ] [WARN] ブロックの検出サンプルが 0 件（最低 3 件）。ばらつきを判定できません（WARN のみ・保存します）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_104447.jpg
[RTD   ] homography のもとになった四隅と、測り直した四隅の差: 最大 0.72px（上限 15.0px・やり直し 1 回）
[RTD   ] ブロックのばらつき: 0.0px = 0.00mm（0 枚・上限 4.0mm）
[RTD   ] [WARN] ブロックの測り直しができていません（元の検出と突き合わせ不可）。（WARN のみ・保存します）
[RTD   ] 保存しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/measure_20261109_104447.json
[RTD   ] [WARN] この measure には WARN が 2 件あります: too_few_samples, block_recheck_missing
[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_20221013_230205.json
[RTD   ] 取得しました → /var/folders/5w/2q2mc64n6yv63gfh31h34w6h0000gn/T/record_teach_demo_akzlejy8/drag_v2_20221013_230205.json
[RTD   ] 入力ファイル: drag_v2_20221013_230205.json
[RTD   ] 抽出ウェイポイント:
  APPROACH_PICK  <- phase APPROACH_PICK argmax_idx=197 (start=197 end=282, gap=20.48°)
                    angles = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
  PICK           <- gripper close mark idx=309（PICK phase 範囲内）
                    angles = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
  APPROACH_PLACE <- phase APPROACH_PLACE argmax_idx=388 (start=388 end=424, gap=21.97°)
                    angles = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
  PLACE          <- gripper open mark idx=452（PLACE phase 範囲内）
                    angles = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
[RTD   ] JOINT_LIMITS 一括検証 OK（全 endpoint + HOME）
[RTD   ] 姿勢検査 OK（全 148 姿勢が 有限値 + JOINT_LIMITS + J4_SAFE [-90.0, +60.0] 内）
[RTD   ] j4 の余裕は最小 23.12°（しきい値 3.0° 以上）
[RTD   ] 現在姿勢を daemon から取得します
[RTD   ] 現在姿勢 = [  +0.26,   +1.49,   +0.87,   -0.26,   -0.26,  -30.23]
==============================================================================
[RTD   ] 実行プラン（daemon 経由・区間ごとに 1 回送信 → 到達待ち）
==============================================================================
  [STEP  1] MOVE → HOME (single send + settle)  speed=20
            current = [  +0.26,   +1.49,   +0.87,   -0.26,   -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      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 66.79°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            max |Δ| = 20.48°  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    = [ -35.15,  +87.27,  -34.80,   +6.41,  -43.59,  -35.24]
            to      = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            max |Δ| = 20.48°  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    = [ -35.94,  +66.79,  -15.73,   +6.41,  -58.27,  -33.83]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 80.76°  1 回送信 speed=20  (~ 4.0s @ 20°/s 目安・到達待ち 最大 14.1s)
  [STEP  8] MOVE → PLACE  segment APPROACH_PLACE → PLACE  [critical]  tol=3.0°  [rpp.TOL_PICK_PLACE（stage8_place）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 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    = [ +45.00,  +69.16,   -9.22,  +11.07,  -66.88,  -38.40]
            to      = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            max |Δ| = 21.97°  1 回送信 speed=20  (~ 1.1s @ 20°/s 目安・到達待ち 最大 8.0s)
  [STEP 11] MOVE → HOME  segment APPROACH_PLACE → HOME  tol=2.5°  [rpp.TOL_HOME（stage1_to_home / HOME 復帰）]
            from    = [ +44.82,  +47.19,   -9.05,  +16.34,  -47.46,  -41.22]
            to      = [  +0.00,   +0.00,   +0.00,   +0.00,   +0.00,  -30.00]
            max |Δ| = 47.46°  1 回送信 speed=20  (~ 2.4s @ 20°/s 目安・到達待ち 最大 9.1s)
==============================================================================
[RTD   ] 送信 = 8 回（STEP 1 + move 7 区間）, 想定所要時間 ≈ 31.0s（最悪 73.0s）
[RTD   ]   内訳: 先頭 settle 3.0s + 移動 14.0s（max|Δ| 合計 279.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_104447.json
[RTD   ]   measured_at = 2026-11-09T10:44:48.938755  block = (+120.4, +99.3) mm  box = (-219.2, +180.4) mm
[RTD   ] 再生直前: 上カメラでマット四隅とブロック画素を確認します
[RTD   ] 再生直前: block = None（measure の homography で換算）
[RTD   ] 確認画像: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_104451.jpg
[RTD   ] 弾いた理由と各回の記録を残しました: /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/prerun_20261109_104451_rejected.json
[RTD   ] [WARN] 再生直前にブロックを検出できません（画素位置が取れない）。動いていないかを確認できないので止めます（**止めません**・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_104517
[RTD   ] 教えた記録のコピー: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_104517/teach/drag_v2_20221013_230205.json
[RTD   ] recorder に trial_start を送りました。1.0s 待ってから動き出します（mp4 writer が開くまで）
[RTD   ] 爪と肩の電流を 1 秒 10 回で記録します（爪を動かしている間は読みません）→ /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_104517/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.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.030s）
[RTD   ] arrival OK (HOME → APPROACH_PICK, max|Δ|=1.67° <= 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|Δ|=2.90° <= 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.054s）
[RTD   ] arrival OK (PICK → APPROACH_PICK (lift), max|Δ|=2.99° <= tol 3.0°)
[STEP  7] MOVE → APPROACH_PLACE  segment APPROACH_PICK → APPROACH_PLACE  (1 回送信 speed=20 → 到達待ち 許容 3.0°[TOL_APPROACH_PLACE（stage7）] / 最大 14.1s)
[RTD   ] 送信 OK（daemon 往復 1.041s）
[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.051s）
[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.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.031s）
[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.1s)
[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 59/59 回, 実効 1.64 Hz（目標 3.0 Hz 以上）
[RTD   ] [WARN] 実測角の読み取りが目標 3.0 Hz を下回りました（1.64 Hz）。学習データの state 密度が 19 本より薄くなります
[RTD   ] send_angles の daemon 往復 (7 回): 平均 1.039s / p50 1.040s / 最大 1.054s（timeout 6.0s）
[RTD   ] [WARN] 送信 1 回に 1.054s かかった回があります。daemon は送信後に角度を読み直すので、動き始めで読めないと伸びます（単発送信なので試行全体への影響は小さい）
[RTD   ] 区間の所要（送信→到達確認まで）(8 区間): 平均 2.38s / 最大 4.48s
[RECORD] 電流の記録終了 79 行 (2.19 行/秒. 本体が眠っている間だけ読む. 爪の間 14.055 秒は読まない. 見込み超え 0 回. read_servo)  → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_104517/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_104517/run_0001_20261109_104517.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_104517 --dataset mecharm_redblock_box_teach_v1
```


## サムネイルの描き方（p2m-site の tools/lab_thumbs/）

この回のサムネイルは、27本の肩 j1 の動きを、下ろし始めを0秒にした時間で描いています。爪がブロックに乗った4本だけを青にし、閉じた時刻に赤の点を置きました。普段の本は1秒ほどで閉じ、乗った本だけが8秒前後まで横に伸びます。描くための値は、extract.py に足した log463_runs() で KIOXIA の記録から書き出しています。

```python
# LOG463: 2026-11-09 のお手本 27 本。「ブロックの上」から閉じたあと 1.5 秒までの肩 j1 を、時間（PICK の段階に入った時刻を0）で
#  [t, j1, つかんでいるか, 爪が乗った本か, 使う本か] の点にする。乗った本 = PICK の区間が 5 秒より長い（lab/Log25/log25_runs_table.py と同じ線）
def log463_runs(root='runs/run_pick_place'):
    out = []
    for d in sorted(glob.glob(root + '/run_0001_20261109_*')):
        s = os.path.basename(d)
        tj = json.load(open(f'{d}/{s}.json'))
        seg = [g for g in tj['segments'] if g.get('to_name') == 'PICK'][0]
        st = list(csv.DictReader(open(d + '/recording/states.csv')))
        t0 = [float(r['ts']) for r in st if r['event_type'] == 'stage' and r['stage'] == 'PICK'][0]
        tc = [float(r['ts']) for r in st if r['event_type'] == 'gripper_cmd' and r['gripper_state'] == '1'][0]
        snag = seg['segment_elapsed_sec'] > 5.0
        pts = [[round(float(r['ts']) - t0, 2), R(r['j1']), 1 if float(r['ts']) >= tc else 0]
               for r in st if r['event_type'] == 'actual' and t0 - 1.5 <= float(r['ts']) <= tc + 1.5]
        out.append({'run': s, 'snag': snag, 'p': pts})
    return out
o['LOG463'] = log463_runs()
```

```python
def time_draw(runs, t_lo, t_hi, v_lo, v_hi, w=4):
    """横を時間（秒）にした線。爪が乗った本（snag）を主役の青に、ほかは人の色を薄く。閉じた時刻に赤の点。"""
    def f(box, pal):
        x0, y0, x1, y1 = box
        X = lambda t: x0 + (t - t_lo) / (t_hi - t_lo) * (x1 - x0)
        Y = lambda v: y1 - (v - v_lo) / (v_hi - v_lo) * (y1 - y0)
        out = []
        for r in sorted(runs, key=lambda r: r['snag']):
            pts = [(X(p[0]), Y(p[1])) for p in r['p']]
            col, op = (pal['m'][0], '.95') if r['snag'] else (pal['c'][0], '.35')
            out.append(poly(pts, col, op, w=w * (1.4 if r['snag'] else 1)))
            ex, ey = pts[-1]
            out.append(f'<circle cx="{ex:.1f}" cy="{ey:.1f}" r="{11 if r["snag"] else 7}" fill="{RED}"/>')
        return '\n'.join(out)
    return f


463 dark    461 paper   460 split   450 dark    446 paper   436 dark    422 photo_l 419 photo_r 417 dark
    if n == 463:
        # 下ろし始め（PICK の段階）を0秒に、肩 j1 の動き。爪がブロックに乗った4本だけ青で長く伸びる。赤の点は閉じた所
        return dark('27 DEMONSTRATIONS', 'SNAG → 8 S', time_draw(d['LOG463'], -1.5, 11, 60, 92))
```


## 次にやること：位置3・4を撮り、位置1の新しい記録を数える表に足す

- 位置3 は、あと8本。前に撮った4本のうち2本が浅かったので、1本目で深さと下ろす時間を見てから続ける。浅ければ、位置1 と同じようにゲームパッドでつかむ姿勢を作り直す
- 位置4 は、あと5本
- drag_v2_20261109_094222.json を、count_by_position.py の TEACH_FILES に位置1 として足す（Claude Code に依頼する）。足さないと、この回の位置1 の10本が「分からない」に数えられる
- 5か所が10本ずつそろったら、浅い本・指の写った本・爪が乗った本を外して学習データを作り直し、π0.5 を学習し直す
- 爪が乗った瞬間を電流で見たいなら、下ろしている間も読む形に変える必要がある。今は下ろす時間と肩の角度で足りているので、急がない
