実機学習ポリシーのデプロイ(ACT / SmolVLA)¶
実機テレオペで学習した ACT(port_pick_align.training.train_act)および
lerobot/smolvla_base を fine-tune した SmolVLA を、SO-101 Follower 上で
dry-run → live する手順。Bring-up 共通は real_robot_bringup.md。
sim 学習 ACT の rad↔deg 変換ラッパーは 使わない(こちらは sim_to_real_act.md)。
前提¶
| 項目 | 値 |
|---|---|
| ホスト | Apple Silicon Mac / LeRobot 0.6.1 / MPS |
| 実機 venv | $LEROBOT_HW_ROOT(既定 $HOME/work/lerobot-hw) |
| カメラ | top=OpenCV index 1、wrist=index 0、640×480@30(2026-10-25 のケーブル交換後も同じ) |
| テーブル | 現行配置(140×70 cm)。旧寸法配置は使用しない |
| タスク文 | Pick up the yellow sponge and place it on the white paper |
パスは環境変数で上書きする(絶対 /Users/... は使わない)。
| 変数 | 用途 |
|---|---|
LEROBOT_HW_ROOT |
データセット・出力・venv のルート |
PORT_FOLLOWER |
Follower シリアルポート |
ACT_REAL_CHECKPOINT / ACT_REAL_DATASET |
ACT 用 |
SMOLVLA_CHECKPOINT / SMOLVLA_DATASET / SMOLVLA_TASK |
SmolVLA 用 |
source "$HOME/work/lerobot-hw/.venv/bin/activate"
cd "/path/to/lerobot-so101-pick-and-place"
pip install -e "port_pick_align/[training,feetech]"
export PORT_FOLLOWER=/dev/tty.usbmodem5B8E1163071 # lerobot-find-port の結果
事前点検(Preflight)¶
デプロイや収録の実行前に scripts/preflight_real_so101.sh を実行し、ポート接続およびカメラ 2 系統の疎通を確認する:
収録データの品質検証(欠損・外れ値・持続時間の点検)には scripts/qc_teleop_dataset.py を利用する。詳細は real_robot_bringup.md を参照。
安全モデル¶
| モード | 接続 | send_action |
終了時 |
|---|---|---|---|
| dry-run(既定) | バス read-only + カメラ。connect()/configure()/トルク書き込みなし |
呼ばない | バス切断時も disable_torque=False |
--live |
通常の robot.connect() + max_relative_target |
クランプ後に送る | disconnect() → トルク OFF。腕を手で支える |
追加クランプ(両モード):
--max-delta-deg(既定 3): アーム 5 軸の 1 ステップ上限(度)--max-delta-gripper(既定 5): グリッパ 0–100 の 1 ステップ上限--max-relative-target(既定 5、live のみ): LeRobot 側の相対目標上限
Ctrl-C / SIGTERM でループを中断する。非常時は Follower の 12V を抜く。
dry-run から live までの順序¶
- Bring-up 済み(ポート・キャリブ・カメラ index)を確認する。
- offline-check(任意・ロボット不要): データセットフレーム vs 予測の MAE。
- dry-run(必須): アームは動かさない。ログで state / target / safe を確認。
- live(初回は短時間・小さめ delta): 12V スイッチに手を置き、終了時は腕を支える。
ACT(実機学習・単位変換なし)¶
チェックポイントは train_act の best_model.pt(正規化なし、度 / グリッパ 0–100)。
run_sim_policy_on_real の rad↔deg 変換は 適用しない。
# Offline MAE(ロボット不要)
./scripts/run_act_real.sh --offline-check --device mps
# Dry-run
./scripts/run_act_real.sh --device mps --episode-time-s 15
# 推奨の初回 live
./scripts/run_act_real.sh --live --device mps \
--max-delta-deg 2 --max-delta-gripper 3 \
--n-action-steps 10 --episode-time-s 15
同等の Python モジュール呼び出し:
SmolVLA(fine-tune)¶
学習時の pre/post-processor を読み、top→camera1、wrist→camera2 にリネームする。
empty_cameras=0 のため camera3 は渡さない(学習時もスキップされていた)。
# Offline
./scripts/run_smolvla_real.sh --offline-check --device mps
# Dry-run
./scripts/run_smolvla_real.sh --device mps --episode-time-s 15
# 推奨の初回 live(chunk 50 のうち 25 ステップ実行して replan)
./scripts/run_smolvla_real.sh --live --device mps \
--n-action-steps 25 --episode-time-s 15 \
--max-delta-deg 2 --max-delta-gripper 3
SmolVLA fine-tune 起動¶
macOS 向け。caffeinate + start_new_session で離脱する。
./scripts/train_smolvla.sh 10000 8
# ログ: $LEROBOT_HW_ROOT/outputs/logs/smolvla_so101_clean28_<TS>.log
rename_map と dataset.video_backend=pyav はスクリプト内に固定。データセット root / repo id は環境変数で変更可。
Mac 上での検証メモ(2026-10-23 時点)¶
以下は Mac / MPS 上の offline / dry-run 計測(2026-10-23)である。実機 live の評価手順・チェックポイント選定は real_eval_protocol.ja.md を参照。
| 項目 | ACT | SmolVLA |
|---|---|---|
| Offline MAE(先頭ステップ) | 約 0.57 deg | 約 1.09 deg |
| 推論レイテンシ | 約 24 ms/inference | 約 335 ms/chunk |
収録スクリプトとの整合¶
ポート・カメラ index・タスク文は scripts/record_real_so101.sh および real_robot_bringup.md と本デプロイ既定を一致させる:
| 項目 | 値 |
|---|---|
| Follower ポート例 | /dev/tty.usbmodem5B8E1163071 |
| Leader ポート例 | /dev/tty.usbmodem5B790143611 |
| top / wrist index | 1 / 0 |
| タスク | Pick up the yellow sponge and place it on the white paper |
収録手順は real_robot_bringup.md / scripts/record_real_so101.sh(#75)に置く。デモの前はそのページの収録前チェックを使い、収録後は同じページの scripts/qc_teleop_dataset.py で root を採点する。
参照¶
- real_robot_bringup.md
- sim_to_real_act.md: sim ACT のみ(本手順とは別系統)
- units.md
- 実装:
port_pick_align.deploy.real_common/act_real/smolvla_real