# G. π0.5 の学習データで、爪を閉じる時刻とつかみの深さを調べる（2026-11-07・依頼113。依頼110 E の続き）

**読むだけ。** 実機・Raspberry Pi・daemon・SSH・シリアルには触れていない。`datasets/`・`runs/` は読むだけで、書いたのはこのフォルダだけ。r2r2r-scripts のコードは変えていない（`pi05/build_demo_episodes.py`・`pi05/build_correction_episodes.py`・`record_teach_demo.py` は読むだけ。データと対のコードの写し `datasets/mecharm_redblock_box_corr_v5/code/` は、`python3 -B` で読み込んだだけで書いていない）。

対象: v3 の学習に使った `mecharm_redblock_box_teach_v1_trim2_corr_v5` の 30 本（教えた動きの再生 19 本・補正入り 11 本。どちらも元の `teach_v1_trim2` / `corr_v5` とファイルが同じことを確かめた）。比べるために `teach_v1`（詰める前の 19 本）と `scripted_v1`（20 本）、E の失敗 12 件・成功 4 件。

## 先に読むこと（結論）

| 問い | 答え |
|---|---|
| ラベルは早く切り替わっていたか | **いいえ。30 本とも、アームが止まってから閉じている。** 教えた 19 本: 爪の命令はアームが最後の姿勢に着いた実測の 0.98〜1.02 秒あと（その実測の前は 0.3〜1.1 秒の抜け）、ラベルは命令の 0.01〜0.10 秒あと（10Hz の次のコマ）。閉じる前の 0.5 秒の爪先の動きは伸び ±0.1mm・高さ −0.4〜+0.2mm、0.3 秒の速さ 0.02〜0.53°/s。`record_teach_demo.py` は止まったのを確かめてから閉じ、daemon が返ったあとにラベルの時刻を残す作りで（2862・2899 行）、scripted_v1 の開くラベルのような 2 秒のずれはない。補正入り 11 本も閉じたのは全部 π0.5（model）で、命令はアームが着いた実測の 0.11〜4.44 秒あと |
| 詰める処理でラベルがずれたか | **ずれていない。** 30 本とも、エピソードで最初に 1 になるコマの元の時刻は、詰める前の 10Hz の並びで最初に 1 になる時刻と同じ（差 0.0 秒）。閉じる前後のコマ（i−1, i, i+1）も残っている。**変わったのは「閉じる前に止まって待つ時間」が短くなったこと**: 教えた動きはラベルの前後 1.5 秒に 31 コマ → 10〜14 コマ、補正入りの 10/31〜11/01 は 16〜31 コマ → 2〜4 コマ。学習の並びでは、下ろし終えてから 2〜3 コマ（0.2〜0.3 秒ぶん）で閉じることになる |
| お手本は浅くつかんでいたか | **一部は浅い。** E の測り方（爪先の青い印の線からのブロックのはみ出し。ここでは爪の向きに沿って測った）で、閉じた 1.0 秒後のはみ出しは 教えた 19 本 4〜39px（中央値 16）・補正入り 11 本 −19〜49px（中央値 20）。π0.5 の成功 4 件は −19〜14px（中央値 6）、浅い失敗 7 件は 30〜38px。E と同じ線（成功の最大 14px＋10px = 24px）を超えるお手本が **30 本中 7 本**（教えた 3・補正入り 4）。うち 5 本は浅い失敗の幅（30px 以上）か、それより浅い |
| どこが浅いか | **π0.5 を試す置き場所（ブロックが画の中央・j0 +13° 前後）のお手本 15 本のうち 4 本が浅い。4 本とも補正入りの、π0.5 が自分で閉じたもの**（181946・192101・184452・184906。閉じたあと 33〜49px ≒ 13〜19mm）。同じ置き場所の教えた動き 4 本（194818〜195120）は 8〜15px で、π0.5 の成功と同じ深さ。教えた動きの浅い 3 本（183454・192343・192633）は別の置き場所 |
| 行動（0.1 秒あとの状態）は奥へ向いていたか | 教えた 19 本: 閉じる行動のコマ（i−1）で関節の変化 0.01〜0.06°（止まっている）。補正入りの 10/31〜11/01: 0.0〜1.2°・爪先の伸び 0〜2.1mm だが、これは閉じている間の実測の変化（上へ 1〜4mm）を抜けの埋め方（speed20）が閉じるコマへ前倒しで入れたもので、ブロックへ進む向きではない。**閉じるコマで「まだ奥へ進め」を示す行動は 0 本** |
| 人の補正は奥へ入れていたか | **入れていない。** 閉じる前の補正（11 本とも 2〜38 コマ）は j0 の横の位置合わせ（+1〜+6°）と少しの下げ（高さ −8〜+1mm）で、爪先の伸びは −3.5〜+0.1mm。閉じる位置を決めたのは補正のあとの π0.5 のかたまり |
| 学習データが「早く閉じる・浅く閉じる」を教えている証拠 | **「早く（時刻）」の証拠はない。「浅く」の証拠はある**: 試す置き場所の 15 本のうち 4 本（27%）が、失敗と同じくらい浅いところで閉じた π0.5 自身の動き（成功の判定だったので学習に入った）。とくに 11/06 の 184452・184906 は閉じる直前のはみ出しが 74〜75px で、E の空振り（63〜85px）と同じくらい手前で閉じる判断をしている |

## 1. ラベルの切り替わりとアームの動き

元の記録の時刻の戻し方: 教えた動きは `build_demo_episodes.build_one` と同じ `t0 = max(上カメラの最初, 実測の最初)` に `t_orig` を足した。補正入りは、データと対で残したコード（`corr_v5/code/`）の `select_steps` を同じ引数（`--gap-fill speed20 --trim-hold`）でもう一度計算した（ファイルは書かない）。**戻した時刻で作り直した state は、69 本（30＋teach_v1 19＋scripted 20）すべてでエピソードの state と一致（差 0.000°）**。

- 「止まった時刻」= 閉じる命令の直前の実測の姿勢から 0.5° の中に、命令までずっと入っていた最初の実測。実測は約 3Hz で、送信中は抜ける（教えた動き 約 1 秒・補正入りの 10/31〜11/01 約 1.6 秒）ので、着いたのはその実測より抜けの分だけ前のこともある（「抜け」の列）
- 爪先の伸び・高さは近似式（高さは E の `e_fk_fit.json`。伸び＝台の真上からの横の距離は、同じ B の Unity の値に同じ形の式を当てはめた `g_fit.json`。別に取り分けた 585 行で誤差の中央値 3.5mm・95% 10.6mm）。**差（どれだけ動いたか）を見るためだけに使う**

| 群 | ラベル − 命令 秒 | 命令 − 止まった実測 秒（その前の抜け 秒） | 閉じる前 0.3 秒 °/s | 前 1.5 秒の j1 / j2 / j4 ° | 前 1.5 秒の伸び / 高さ mm | 最後 0.5 秒の伸び / 高さ mm | 命令のあと 1.5 秒の動き ° |
|---|---|---|---|---|---|---|---|
| 教えた 19 本 | 0.01〜0.10 | 0.98〜1.02（0.3〜1.1） | 0.02〜0.53 | +0.7〜+8.6 / −8.6〜+0.5 / −0.9〜+6.9 | −8.5〜+3.8 / −31〜−14 | −0.1〜+0.1 / −0.4〜+0.2 | 実測なし（爪を待つ 2 秒は読まない） |
| 補正入り 10/31〜11/01（7 本） | 0.00〜0.09 | 1.61〜4.44（1.54〜1.66） | 0.0〜1.2 | −0.3〜0 / −0.6〜0 / −1.2〜+0.1 | 0〜+2.2 / 0〜+3.8 ※ | 0〜+2.2 / 0〜+3.8 ※ | 0.0（3 本。4 本は実測なし） |
| 補正入り 11/06（4 本） | 0.05〜0.08 | 0.11〜0.36（0.02〜0.30） | 0.0〜**5.4** | +0.8〜+10.9 / −7.1〜−1.0 / −1.6〜0 | +1.5〜+4.6 / −28〜−0.3 | −0.2〜+4.4 / −2.5〜−0.3 | 1.1〜1.8 |
| （比べる）scripted_v1 20 本 | 0.00〜0.09 | 0.59〜0.97（0.02〜2.7） | 0.06〜0.36 | −0.6〜+1.3 / −0.4〜+3.5 / +3.5〜+7.3 | −10〜−3 / −33〜−14 | 0〜+0.1 / −0.1〜+0.3 | 実測なし |

※ 10/31〜11/01 の伸び・高さの変化は、閉じたあと 1.6 秒の抜けのあとに読んだ姿勢（爪が閉じる間に j2 が −0.6° ほど動いた。上へ 1〜4mm）を、speed20 の埋め方が抜けの頭（＝ラベルのコマ）に置いたもの。例: 175527 は命令 078.52 → 次の実測 080.12 で j1 −0.17・j2 −0.62。ブロックへ進む動きではない。

読み取れること
- 教えた動きは下ろし終えてから約 1〜2 秒、scripted は 0.6 秒以上止まって待ち、そのあとで閉じている。閉じる前 0.5 秒にアームは動いていない
- 11/06 の補正入り 4 本は、送ったらすぐ返る daemon で記録したもので、**閉じる 0.1〜0.4 秒前まで動いていた**（183926・184452・184650 は閉じる前 0.3 秒に 3.2〜5.4°/s、184452・184906 は閉じる前の 1.5 秒で 22〜28mm 下げ、命令のあと 1.5 秒でも 1.1〜1.8° 動いた）。画でも 184452・184906 は閉じる 0.5 秒前から直前までにはみ出しが 8px（約 3mm）減っていて、閉じる直前までわずかに奥へ進んでいた。E の失敗 184312・185050（閉じる前 2.4〜2.6°/s）と同じ形
- 全体の表は `g_table.csv`（1 本 1 行）と `g_timing.csv`（細かい列）

## 2. 詰める処理でずれていないか

| データ | ラベルの前後 1.5 秒の元の 10Hz のコマ | エピソードに残ったコマ | エピソードの 15 コマ前は何秒前か | ラベルの位置のずれ |
|---|---|---|---|---|
| teach_v1（詰める前） | 31 | 30〜31 | 1.5〜3.1 秒 | 0.0 秒 |
| trim2（＝v3 の教えた 19 本） | 31 | **10〜14** | **2.2〜7.1 秒** | 0.0 秒 |
| corr_v5 10/31〜11/01（7 本） | 16〜31（model / correct のコマ） | **2〜4** | **16.5〜29.2 秒** | 0.0 秒 |
| corr_v5 11/06（4 本） | 22〜29 | 7〜14 | 3.0〜12.6 秒 | 0.0 秒 |

- **ラベルの位置は動いていない。** ラベルは 10Hz の並びを作った時点で、爪の命令の時刻から決まる（`build_demo_episodes.py` 318〜324 行・`build_correction_episodes.py` 372〜377 行の `np.searchsorted(gt, ti, side="right") - 1`）。そのあとの詰める処理はコマを抜くだけで、残ったコマの state[:,6] は変えない
- 閉じる前後のコマは必ず残る: `gripper_guard_mask`（`build_demo_episodes.py` 192 行。`GRIPPER_GUARD_STEPS = 1` は 64 行）で i−1, i, i+1 を守り、止まりの区間でも爪の切り替えの直前・直後の区間は先頭 2 コマを残す（`MID_IDLE_KEEP_STEPS = 2` 60 行、`mid_idle_keep_mask` 209 行・353 行、補正入りは `hold_keep_mask` の `keep_grip` 238・265 行、`HOLD_KEEP_GRIP` 79 行）
- **短くなったのは閉じる前の待ち。** 教えた動きの「着いてから約 1 秒待って閉じる」は、`mid_idle_keep_mask`（`--trim-mid-idle`。`build_demo_episodes.py` 352〜361 行）で 2 コマ＋守りの 1 コマになった。補正入りは送信の確かめを待つ止まりを `HOLD_KEEP_MODEL = 0`（77 行）で消すので、10/31〜11/01 は閉じるコマの 1 つ前（i−1）が実時刻で約 3 秒前のコマになっている（175527・184016 で i−2 が −3.1 秒）。止まりの抜けの埋め方は `fill_motion_gaps`（147 行。呼び出し 367 行）
- この結果、**学習の並びでは「下ろす動き → 2〜3 コマで閉じる」がつながる**。閉じる前の 10 コマの行動を足すと、trim2 では高さ −22〜−47mm（下ろす動きがまるごと入る）、詰める前の teach_v1 では −1.0〜+0.2mm（止まって待っているだけ）。1 秒（10 コマ）のかたまりの中で「下ろし切ってすぐ閉じる」を教えていることになる。ただし閉じるのはアームが止まった姿勢のコマで、**閉じる位置（深さ）そのものは変えていない**

## 3. お手本のつかみの深さ

測り方: E の `e_grasp_metrics.py` の `measure`（赤の塊の下の端 − 爪先の青い印 2 つの縦の平均）は、爪が画の真下を向いている 10/30 以降の記録のための測り方。10/15〜10/19 の記録はブロックが画の左寄りで、爪が斜め（−19〜−55°）を向いているので、**同じ量を爪の向きに沿って測る形**（`g_images.py` の `measure_axis`。爪の向き＝胴の青い印 → 爪先の印 2 つの中点。はみ出し＝赤の画素を爪の向きに投げた最大 − 爪先の印の中点）にした。E の 16 件もこの形で測り直した（E の値との差 0〜7px。E の「浅い 7 件」の分け方はこの形でも同じ 7 件になる）。

- 測ったコマ: 元の `top.mp4` の、爪の命令の 1.5 秒前・0.5 秒前・直前（E の before と同じ）・エピソードでラベルが 1 になったコマに使った画に近いコマ・命令の 1.0 秒後（E の after と同じ）。画素は元の 1920×1080 のまま（E と同じ大きさ）
- 10/19 の一部はブロックが薄いピンクに写り、E の赤の幅（彩度 120 以上）ではブロックの一部しか拾えないので、彩度 60 で拾った面積の半分未満なら彩度 60 の値を使った（`g_grasp_metrics.csv` の `*_axis_s_min`）。183454 は胴の印が写らないので、爪先の印 2 つを結ぶ線に直角な向きを使った（`axis_from=tips`）
- **人の手が写るコマがある**: 教えた 191347・191441 は閉じる直前〜ラベルのコマで人の指がブロックを爪の間へ押している。scripted は 182552・185536・175444 が閉じる直前まで、183310・184725・190925 は 1.5 秒前に手が写る。手（肌）を赤として拾うと 100px を超えるので、その値は使わない（表で「—」）
- 1.5 秒前・0.5 秒前の値は、爪の高さが違うと上からの見え方が変わるので、閉じる直前とは比べられない（奥へ進んだかは 1 の関節・近似式で見た）

| 本 | 種類 | 1.5 秒前 px | 直前 px | ラベルのコマ px | 1.0 秒後 px | 浅い（> 24px） |
|---|---|---|---|---|---|---|
| 20261031_175527 | 補正入り | 8.5 | 8.5 | 8.5 | −19.4 | |
| 20261031_180435 | 補正入り | 41.0 | 40.7 | 40.7 | 20.2 | |
| 20261031_181946 | 補正入り | 60.9 | 61.4 | 61.4 | 37.8 | **浅い** |
| 20261031_184016 | 補正入り | 44.0 | 44.0 | 44.0 | 15.9 | |
| 20261101_190347 | 補正入り | 43.7 | 44.7 | 44.7 | 14.1 | |
| 20261101_190854 | 補正入り | 47.0 | 47.0 | 47.0 | 21.4 | |
| 20261101_192101 | 補正入り | 57.5 | 57.4 | 57.4 | 33.4 | **浅い** |
| 20261106_183926 | 補正入り | 42.2 | 42.1 | 38.5 | 14.1 | |
| 20261106_184452 | 補正入り | 67.5 | 75.0 | 75.1 | 49.2 | **浅い** |
| 20261106_184650 | 補正入り | 54.9 | 50.3 | 50.3 | 19.8 | |
| 20261106_184906 | 補正入り | 73.4 | 73.8 | 73.8 | 47.1 | **浅い** |
| 20261019_183454 | 教えた（置き場所 A） | 59.0 | 67.2 | 67.2 | 38.9 | **浅い** |
| 20261019_191257 | 教えた（B） | 17.7 | 38.1 | 38.1 | 8.1 | |
| 20261019_191347 | 教えた（B） | — | —（手） | — | 19.7 | |
| 20261019_191441 | 教えた（B） | — | —（手） | — | 14.5 | |
| 20261019_191541 | 教えた（B） | 26.0 | 44.5 | 44.5 | 15.9 | |
| 20261019_191635 | 教えた（B） | 25.0 | 43.5 | 44.2 | 18.2 | |
| 20261019_192343 | 教えた（C） | 54.8 | 54.5 | 54.5 | 27.6 | **浅い** |
| 20261019_192438 | 教えた（C） | 47.6 | 47.9 | 47.9 | 17.9 | |
| 20261019_192539 | 教えた（C） | 43.5 | 43.6 | 43.6 | 12.7 | |
| 20261019_192633 | 教えた（C） | 59.1 | 59.0 | 59.0 | 28.9 | **浅い** |
| 20261019_193404 | 教えた（D） | 32.9 | 51.2 | 51.2 | 21.6 | |
| 20261019_193459 | 教えた（D） | 33.8 | 47.6 | 47.6 | 18.8 | |
| 20261019_193617 | 教えた（D） | 23.6 | 40.3 | 40.5 | 11.6 | |
| 20261019_193825 | 教えた（D） | 15.7 | 28.1 | 28.1 | 4.4 | |
| 20261019_193932 | 教えた（D） | 36.0 | 51.8 | 51.8 | 22.1 | |
| 20261019_194818 | 教えた（E＝試す置き場所） | 35.5 | 40.2 | 40.2 | 15.3 | |
| 20261019_194913 | 教えた（E） | 32.2 | 34.8 | 34.8 | 8.3 | |
| 20261019_195023 | 教えた（E） | 36.7 | 40.7 | 41.2 | 13.1 | |
| 20261019_195120 | 教えた（E） | 34.5 | 40.2 | 40.2 | 12.7 | |

置き場所 A〜E は教えたファイル（`teach/drag_v2_*.json`）の違い: A `20221013_144348`（1 本）・B `230205`（5 本）・C `231249`（4 本）・D `232345`（5 本）・E `233323`（4 本。PICK の j0 +13.1°。π0.5 を試すときのブロックの位置と同じ）。

E の値と並べる（閉じた 1.0 秒後。爪の向きに沿う測り方。px の目安 2.6px/mm は E と同じ）:

| 群 | 閉じる直前 px | 閉じた 1.0 秒後 px（中央値） | 浅い（> 24px） |
|---|---|---|---|
| E 成功 4 件（π0.5） | 8〜45 | −19〜14（6） | 0 |
| E 失敗 12 件（π0.5） | 33〜85 | 4〜76（32）。浅い 7 件は 30〜38、空振り 2 件は 75〜76（印の間 73〜75px） | 7 |
| 学習データ 教えた 19 本 | 28〜67 | 4〜39（16） | 3（183454・192343・192633） |
| 　うち試す置き場所 E の 4 本 | 35〜41 | 8〜15（13） | 0 |
| 学習データ 補正入り 11 本（試す置き場所） | 8〜75 | −19〜49（20） | 4（181946・192101・184452・184906） |
| （比べる）scripted_v1 20 本（開いた印の間を 137px にそろえた） | 26〜94 | 1〜41（21） | 7 |

- 閉じきった印の間は 30 本とも 97.7〜101px（ブロックを挟んでいる。空振りは 0 本）
- 補正入りの 175527 と 190347 は E の成功と同じ記録（値も E の測り直しと同じ）

画像
- **`g_grasp_main.jpg`**: 30 本のつかむ瞬間（1 行 1 本。上から補正入り 11 本・教えた 19 本。左から 命令の 1.5 秒前・直前・ラベルが 1 のコマ・1.0 秒後。字の `pr` が爪の向きに沿うはみ出し px・`gap` が爪先の印の間 px。名前の字の色は 補正入り＝水色・教えた＝緑）。E の `e_grasp_successes.jpg` と同じ切り出し（420×315px を 1.25 倍）
- `g_grasp_scripted.jpg`: scripted_v1 20 本（同じ形）
- `_check/`: 調べる途中で見た確認用の画（画の全体・手の写る行・191257 の元の画）

## 4. 行動のラベル

行動は「次のコマの state」なので、爪を閉じる行動は i−1 のコマ（`actions[i-1, 6] = 1`）に入る。

| 群 | i−1 の関節の変化 ° | i−1 の爪先の伸び mm | 閉じる前 10 コマの行動の合計 伸び / 高さ mm |
|---|---|---|---|
| 教えた 19 本（trim2） | 0.01〜0.06 | 0.0〜+0.1 | −8〜+7 / −47〜−22 |
| 　（詰める前 teach_v1） | 0.01〜0.06 | 0.0〜+0.1 | −0.3〜+0.1 / −1.0〜+0.2 |
| 補正入り 10/31〜11/01（7 本） | 0.0〜1.2 | 0.0〜+2.1（1 の ※ の前倒し。上向き） | −5〜+15 / −32〜−1 |
| 補正入り 11/06（4 本） | 0.0〜0.18 | −0.2〜0.0 | +1〜+12 / −28〜−6 |

- **閉じる行動のコマで、関節の目標がまだブロックへ進む向きを示している本はない。** 補正入りの 10/31〜11/01 の 0.5〜1.2° は爪が閉じる間の姿勢の変化（上向き）
- 閉じる前の 10 コマ（1 かたまりぶん）には、詰めたことで下ろす動き（−22〜−47mm）がまるごと入っている（2 の最後）
- 細かい値は `g_steps.csv`（ラベルの前後 ±15 コマ。`act_d_reach_mm`・`act_d_h_mm` が行動 − 状態）

## 5. 補正入り 11 本

- 11 本とも、**爪を閉じたのは π0.5（model のコマ）**。人の補正（10/31〜11/01 の 7 本はキーボード、11/06 の 4 本はゲームパッド）は閉じる前に 2〜38 コマあり、最後の補正から閉じるまで 5.2〜41.8 秒
- 補正の中身は j0 の横の位置合わせ（+1.0〜+6.1°）と少しの下げで、補正の間の爪先の伸び −3.5〜+0.1mm・高さ −8.2〜+0.6mm（近似式）。**奥へ押し込む補正はしていない**。閉じる位置を決めたのは、補正のあとの π0.5 のかたまり
- 深さ: 閉じた 1.0 秒後 −19〜49px（中央値 20）。同じ置き場所の教えた 4 本（8〜15px・中央値 13）より浅く、E の成功（中央値 6）より浅い。浅い 4 本（181946・192101・184452・184906）は 33〜49px で、E の浅い失敗（30〜38px）と同じか浅い。どれも人が「成功」とした run なので学習に入った
- 11/06 の 4 本は閉じる直前まで動いていて（1）、うち 184452・184906 は閉じる直前のはみ出しが 74〜75px（E の空振りの直前 63〜85px と同じくらい）

## 6. まとめ

**学習データが「早く閉じる」（時刻）を教えている証拠はない。「浅く閉じる」を教えている証拠はある。**

- 時刻: 30 本ともラベルはアームが止まってから切り替わり、詰める処理でも位置は動いていない（差 0.0 秒）。scripted_v1 の開くラベルのような時刻のずれはない
- 深さ: 30 本中 **7 本**が、π0.5 の成功の幅を 10px 以上超えて浅い（閉じた 1.0 秒後 28〜49px ≒ 11〜19mm 先へはみ出したまま）。とくに **π0.5 を試す置き場所のお手本 15 本のうち 4 本（27%）**が浅く、4 本とも π0.5 自身が閉じた補正入りの run（181946・192101・184452・184906。33〜49px ≒ 13〜19mm）。同じ置き場所の教えた動き 4 本は成功と同じ深さ（8〜15px）で、浅いお手本は補正入りから入っている
- 補正入りを学習に足すと、π0.5 が「浅いまま閉じても成功の扱い」になった動きを、そのまま次の学習が覚える形になっている。E で見た π0.5 の失敗の「閉じる直前のはみ出し 55〜64px（浅い）・58〜86px（空振り）」は、学習データの補正入り 184452・184906 の 74〜75px、181946・192101 の 57〜61px と重なる
- もう 1 つ: 詰めたことで、学習の並びでは「下ろし切って 0.2〜0.3 秒で閉じる」になり、閉じる前に止まって待つ時間（元は 1〜3 秒）がほぼ消えている。これが早く閉じる癖に効くかは、このデータだけでは言えない（閉じる位置そのものは止まった姿勢）

直し方の案（直すのは別の依頼）
1. **浅いお手本を外す（または撮り直す）**: 閉じた 1.0 秒後のはみ出しが 24px を超える 7 本（とくに試す置き場所の補正入り 4 本）を外した corr_v6 を作る。補正入りを足すときは、`build_correction_episodes.py` の採否に「閉じたときの深さ」を入れる（この G の `measure_axis` を使う）か、浅く閉じた run は「成功」でも使わない決まりにする
2. **試す置き場所の深いお手本を増やす**: 今は試す置き場所の教えた動きが 4 本しかなく、残り 11 本は π0.5 自身の動き。ブロックの奥まで入れてから閉じる教えた動き（または、閉じる前に人が奥へ押し込む補正）を足す

「ラベルの時刻を止まった時刻に合わせ直す」は、時刻のずれが見つからなかったので効かないと見た。

## 気をつけること

- 「浅い」の線（24px）は、E の成功 4 件の最大＋10px というこの調べでの目安。成功が 4 件しかない
- 上からの画なので、爪がブロックのどの高さをつかんだかは分からない（E と同じ）
- 爪先の伸び・高さは Unity から作った近似式。実機とのずれは測っていない
- 教えた動きの 191347・191441（と scripted の 3 本）は、閉じる瞬間に人の指がブロックを爪の間へ押している。閉じたあとの深さは測れるが、閉じる直前の画には手が写ったまま学習に入っている
- 補正入りで閉じる前後の実測が抜けている（約 1.6 秒）区間は、`fill_motion_gaps`（speed20）の埋め方しだいで行動の値が変わる（1 の ※）

## ファイル

| ファイル | 中身 |
|---|---|
| `g_analyze.py` | 1・2・4・5 の計算。出力 `g_timing.csv`（1 本 1 行。69 本）・`g_steps.csv`（ラベルの前後 ±15 コマ）・`g_fit.json`（爪先の伸びの近似式） |
| `g_images.py` | 3 の測りと画像。出力 `g_grasp_metrics.csv`（50 本＋E の 16 件）・`g_grasp_main.jpg`・`g_grasp_scripted.jpg` |
| `g_report.py` | `g_table.csv`（1 本 1 行のまとめ）と表を出す |

`g_timing.csv` の主な列: `t_cmd` 爪を閉じる命令の時刻／`t_label_minus_cmd_s` ラベル − 命令／`t_cmd_minus_stop_s` 命令 − 止まった実測／`stop_gap_before_s` 止まった実測の前の抜け／`speed_pre0p3_deg_s` 閉じる前 0.3 秒の速さ／`d_j*_pre`・`d_j*_post` ラベルの前・後 1.5 秒の関節の変化／`d_reach_*`・`d_h_*` 爪先の伸び・高さの変化／`grid_steps_pm1p5` 詰める前の前後 1.5 秒のコマ数／`ep_steps_pm1p5` エピソードに残ったコマ数／`t_label_minus_grid_first1_s` ラベルの位置のずれ／`act±k_*` 行動 − 状態／`correct_*` 閉じる前の人の補正。`g_grasp_metrics.csv`: `{tag}_protrude_px` 等は E の測り方そのまま、`{tag}_axis_*` は爪の向きに沿う測り方（tag = pre1p5 / pre0p5 / before / ep_label / after）。

## やり直し方

```bash
cd "/Volumes/KIOXIA/r2r2r-data/lab/twin/20261107_失敗の再生と置き場所/G_お手本の閉じる時刻"
python3 -I -B g_analyze.py   # g_timing.csv・g_steps.csv・g_fit.json（数秒）
python3 -I -B g_images.py    # g_grasp_metrics.csv・g_grasp_main.jpg・g_grasp_scripted.jpg（約 1 分）
python3 -I -B g_report.py    # g_table.csv と表
```

`-B` は、読み込む `datasets/mecharm_redblock_box_corr_v5/code/` と `E_つかみと持ち上げ/` に `__pycache__` を書かないため（必ず付ける）。
