tl;dr
- 前回(実機で動かないポリシーをデバッグして 60% まで動かした全記録)の続き。最後に「掴める範囲を広げるにはデータ量」と書いたので、実際に50 → 102 エピソードに増やして再学習した
- 増やす時は失敗していた位置を狙って追加(
--resumeで既存データセットに追記) - できた 102 本 100k step のポリシーを、机を 3×3 に区切って各マスで実機テストし、成功/失敗を1枚に可視化した
- 結果、境界がきれいに出た。左+中央 = 7/7(100%)、右(アーム土台側)= 0/4(0%)
- 教訓:ACT は「データを置いた場所」でしか動かない。カバレッジマップを描くと、次にどこを録ればいいかが一目でわかる
前回のあらすじ
前回の記事は「実機で動かない ACT を、モデルではなくデータと運用のバグを潰して 60% まで動かした」話でした。最後に切り分けた原因が キューブ位置の学習分布外(out-of-distribution) で、こう締めていました。
50 本は「実証」には十分でしたが、掴める範囲を広げるにはデータ量です。キューブ位置をもっと広く振って 100〜200 エピソード収集する。
今回はそれをやって、「本当にデータを足した範囲だけ動くようになるのか」を実機で検証しました。
データ拡張:50 → 102 エピソード
やったことはシンプルで、前回 50 本で失敗していた位置(特に机の奥・端)にキューブを置いたエピソードを 52 本追加しただけです。ゼロから録り直さず、既存データセットに追記しました。
lerobot 0.5.1 の lerobot-record は --resume=true で既存データセットに追記できます。ただし1つ落とし穴があって、resume 先は Hub のキャッシュ(read-only スナップショット)には書けないので、書き込み可能なローカル実体を --dataset.root で明示する必要があります。
# 既存50本 + 追加 → 合計102本を目標に追記
RESUME=true \
DATASET_ROOT=~/lerobot_data/so101-cube-in-case-v2 \
NUM_EPISODES=102 \
./scripts/record.sh
収集の作法は前回確立したものをそのまま踏襲:
- フロントカメラに操作者を写さない(前回 0/10 静止の主犯)
- リセット中は動かさず、
go_home.pyで毎回同じ開始姿勢へ - キューブは毎回少し位置を変える(今回は特にこれまで手薄だった領域を意識的に厚く)
これを RTX A6000 で 100k step まで学習しました。
「動く範囲」を実機で測る:3×3 カバレッジマップ
問題は「範囲が広がったか」をどう客観的に測るか、です。前回は「特定位置で外す」を定性的に確認しただけでした。今回は机を 3×3 のゾーンに区切り、各ゾーンにキューブを置いて実機で自律実行し、掴めたか/外したかを記録しました。
判定は簡単で、eval.sh の各エピソードで最終フレームのフロント映像にブロックがカップに入っていれば成功です。1試行の手順はこれだけ:
# 1) 開始姿勢を毎回そろえる(手で戻すと手首カメラの見え方が変わり数cm外す)
uv run python scripts/go_home.py
# 2) 対象ゾーンにキューブを置いて、1エピソードだけ自律実行
EVAL_POLICY=abePclWaseda/so101-act-cube-in-case-v2-102ep \
NUM_EVAL_EPISODES=1 \
./scripts/eval.sh
各ゾーンを数回ずつ回した結果がこれです。緑=成功、赤=失敗、灰=未計測。
| 領域 | 成功率 |
|---|---|
| 左+中央(データを厚く置いた側) | 7/7 = 100% |
| 右(アーム土台側) | 0/4 = 0% |
| 全体 | 7/11 ≈ 64% |
そして、成功した自律実行がこれ(前回と同じく、学習済み ACT が自分でブロックを掴んでカップに入れています):
わかったこと:ポリシーはデータの地図をそのまま反映する
この地図、左・中央が縦に全部緑、右が縦に全部赤で、境界がくっきり分かれました。そしてこの境界はモデルの良し悪しではなく、テレオペ収集時にキューブを置いた場所でそのまま決まっています。
- 収集時、キューブを 左〜中央中心に置いていた → その領域は 100% 掴める
- 右(アーム土台側)にはほとんど置いていなかった → まったく掴めない
前回「特定位置だけ外す = 学習データの位置カバレッジ不足」と結論づけましたが、今回それを面で可視化できました。ACT は本質的に「学習した中で一番近い軌跡」を引っ張ってくるので、データが無い領域には内挿も外挿もしてくれない。手薄な位置で数 cm 外すのではなく、そもそもデータが無い右側は 0%、という形で出ます。
裏を返すと、このカバレッジマップは「次にどこを録ればいいか」を直接教えてくれる指示書になります。右列を緑にしたければ、モデルをいじる必要はなく、右側にキューブを置いたエピソードを足して録るだけ。imitation learning のデータ収集は、こうやって地図の赤いマスを塗り潰していく作業なんだと腹落ちしました。
教訓
-
「範囲を広げる」は resume で追記できる。 ゼロから録り直さなくていい。ただし resume 先は書き込み可能なローカル実体を
--dataset.rootで渡す(Hub キャッシュは read-only)。 - カバレッジマップはデータ収集のTODOリスト。 赤いマスがそのまま「次に録るべき場所」。
次にやること
- 右列(アーム土台側)にキューブを置いたエピソードを追加収集して、地図の赤を塗り潰す
- 向き・照明もゾーン化して、位置以外の分布も地図にする
前回は「模倣学習が動かない時、原因はモデルではなくデータと運用にいる」でした。今回はその続きで、動く範囲を広げる時も、いじるのはモデルではなくデータの地図。ロボットに「どこで動いてほしいか」は、コードではなく録画の中で教えるしかない、という学びを、実機で確かめました。

