メインコンテンツまでスキップ
ステージ 3 · 第 16 章 · 理論と実践

16. 実機推論・評価・データイテレーション

実機 SO-ARM での推論の仕組み、訓練済み ACT ポリシーの実行(lerobot-record / lerobot-rollout)、成功率による評価、失敗の分析と分類、失敗駆動のデータイテレーションを学びます。

⚠️
実行前の安全確認

推論中、実機アームは人の関与なしに全力トルクで動きます。作業領域を清空し、手を離し、いつでも電源を切れる態勢でいてください。

16.1 推論データフロー​

データフロー

16.1 推論データフロー

第 9 章の復習:推論はデータ収集の鏡像です。フレームごとのループ:

  1. 2 台のカメラを読む → 観測;
  2. フォロワーの 6 関節を読む → 状態;
  3. データセットに保存済みの統計で正規化;
  4. ポリシーがアクションチャンク(k × 6)を予測;
  5. チャンクの先頭数アクションをサーボへ開ループ実行;
  6. 実行分を使い切ったら再観測・再予測。

リーダーアームはもう使いません — モデルが人に代わって意思決定者になりました。それ以外(カメラ、シリアルバス、安全制限)は録画時と同一です。だからこそカメラキーと --robot.id は録画セッションと厳密に一致させる必要があります。

16.2 前処理と逆正規化​

前処理

16.2 前処理と逆正規化

データセットは特徴量ごとの統計(平均 / 標準偏差)を meta/stats に保存しています(第 13 章)。推論時:

  • 入力側:画像と関節状態は訓練統計で正規化されてからネットワークへ;
  • 出力側:ネットワークの正規化アクションは実関節値へ逆正規化されてからサーボへ送られます。

だから評価コマンドは録画時と同じカメラキー(front、side)を使わなければなりません — キーの不一致は統計の欠落を意味し、次のようなエラーが出ます:

mean is infinity. You should either initialize with stats as an argument or use a pretrained model

16.3 実機推論の開始​

推論

16.3 実機推論の開始

方法 A:ポリシー付き lerobot-record(初心者推奨)​

record ツールはポリシーのチェックポイントを受け取れます。ポリシーがアームを動かしながら評価データセットを録ります — 10 Episode の評価:

lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \
--robot.id=my_awesome_follower_arm \
--display_data=false \
--dataset.repo_id=seeedstudio123/eval_test123 \
--dataset.single_task="Put the object from Point A into Point B" \
--policy.path=outputs/train/act_so101_test/checkpoints/last/pretrained_model

注意:

  1. --policy.path は第 15 章のチェックポイントのパス。Hub にアップロード済みなら repo id(例:${HF_USER}/act_so101_test)でも構いません;
  2. 評価の dataset.repo_id は慣例で eval_ から始めます — 評価動画とデータは別保存されます(例:seeedstudio123/eval_test123);
  3. File exists: '.../eval_xxxx' が出たら、古い評価フォルダを先に削除して再実行;
  4. カメラキー(front、side)はデータセット録画時と厳密に一致させてください(16.2 参照)。

方法 B:lerobot-rollout のリアルタイム実行​

録画なしのライブ実行(SmolVLA / ACT などが対応):

lerobot-rollout \
--strategy.type=base \
--policy.path=${HF_USER}/act_policy \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.cameras="{ front: {type: opencv, index_or_path: 8, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \
--display_data=true \
--task="Your task description" \
--duration=60

16.4 アクションチャンクの実行​

実行

16.4 アクションチャンクの実行

第 14 章のチャンク / ホライズンの区別がここで目に見えます:

  • モデルは順伝播ごとに k=100 のアクションを予測;
  • 先頭の一部だけ開ループ実行してからループは再観測;
  • 古いチャンクの末尾と新しいチャンクの先頭の重なりは平滑化(時間的アンサンブル)され、動作は段階的ではなく連続に見えます。

アームが「一気に動いて止まる」— 0.5 秒ごとの強い停止 — 場合、有効ホライズンか推論速度が問題です:GPU 使用率、カメラ fps を確認し、非同期推論(ポリシーを別サーバプロセスで走らせる。考え方は第 4 ステージの展開章を参照)を検討してください。

16.5 安全:リミット・速度制限・非常停止​

安全

16.5 安全:リミット・速度制限・非常停止

  • キャリブレーション由来の関節リミットがすべてのコマンドを制約します;
  • 新しいチェックポイントの初回実行時は手を電源スイッチに — 電源切断が最速の停止です(サーボは脱力します);
  • lerobot-record 評価セッション中の ESC はエピソードをクリーンに停止します;
  • 人・ケーブル・机の縁の近くでアームを無人運転にしないでください。

16.6 評価:成功率と所要時間​

評価

16.6 評価:成功率と所要時間

第 11 章の成功基準を使います — 客観判定可能で「なんとなく」ではない:

  1. 成功を定義:「物体が B 点のマーク内に収まっている」;
  2. 開始を変える:物体を 5 つのマーク点に置き、各点 N 回繰り返す;
  3. 集計:成功 / 総数 = 成功率。平均所要時間も記録 — 遅かったり試行錯誤しながら成功するポリシーも、何かを教えてくれます。

チェックポイントごとに残す結果表の例:

開始点実行成功率
中央44100%
上4375%
左4250%
...

16.7 汎化テスト​

汎化

16.7 汎化テスト

分布内テスト合格後、意図的に境界を探ります(一度に 1 変化だけ):

  • 物体をマーク領域の少し外へ移動;
  • 物体を変更(同カテゴリで別サイズ);
  • 環境光を変更(日光 vs 夜の卓上灯)。

データ分布内では優雅な劣化、分布外では硬い失敗が期待されます — 第 8 章の分布原理が実機で姿を現すところです。直したい汎化失敗はすべて、その状況をカバーするデータで答えます。訓練ステップの追加ではありません。

16.8 失敗タイプの分析​

失敗

16.8 失敗タイプの分析

失敗 Episode はすべて 4 バケットのどれかに分類します — バケットが修正方法を決めます:

失敗タイプ症状修正
知覚失敗物体の左 3 cm を掴み空振りその位置 / 光照のカバーがデータに不足 → そこを補採
戦略失敗常に間違った側から接近デモが不一致 → 1 つの戦略で再録
実行失敗接近は正しいが物体が滑るデータの把持力 / 速度が不一致。グリッパのキャリブレーション確認
システム失敗アームがカクつく・停止・カメラ遅延モデルの問題ではない:fps、USB 帯域、キャリブレーション、サーボ温度

16.9 データイテレーション:失敗駆動のデータ収集​

イテレーション

16.9 データイテレーション:失敗駆動のデータ収集

ステージ 3 の本筋を締めるループ:

  1. 評価(16.6)し失敗を分類(16.8);
  2. 知覚 / 戦略系の各失敗バケットに対し、まさにその状況をカバーするエピソードを 10〜20 本追加採集(第 12 章のフロー);
  3. 第 13 章のツールでデータセットに清洗・統合;
  4. 再訓練(第 15 章)— 再開でも新規でも;
  5. 再評価。成功率があなたの「完成」の定義を満たすまで繰り返す。

この失敗駆動ループこそ — どの 1 回の訓練でもなく — 実際のロボット学習プロジェクトの日常です。

Loading Comments...