本專案在 Isaac Lab 中為實體機器人 JetRover(5 軸手臂 + 夾爪)建立地面物體抓取任務, 訓練出能抓取 15 種不同材質物體的 PPO 專家策略,並將其成功軌跡自動轉換成 LeRobot v2 / NVIDIA GR00T 格式的 「腕部影像 + 語言指令 + 動作」資料集,用於訓練可部署到實體機器人的視覺-語言-動作(VLA)模型。
Isaac Lab 平行模擬 RL 專家策略 資料引擎 下游
┌──────────────────────┐ PPO ┌────────────────────┐ rollout ┌──────────────────────┐ ┌───────────────────┐
│ JetRover + 15 種物體 │ ──────▶ │ 任務空間 Delta IK │ ───────▶ │ 成功軌跡篩選 │──▶│ GR00T VLA 微調 │
│ 質量/摩擦域隨機化 │ │ privileged 狀態輸入 │ │ 腕部相機 + 語言標註 │ │ 實體 JetRover 部署 │
└──────────────────────┘ └────────────────────┘ │ → LeRobot v2 │ └───────────────────┘
└──────────────────────┘
1. 為 Sim2Real 設計的任務空間控制(0510 環境)
- 7 維動作空間:6D 末端執行器增量位姿(XYZ + RxRyRz)+ 1D 夾爪,透過 Differential IK 解算關節目標, 並限制單步最大位移與旋轉,讓策略輸出的動作在實體伺服機上安全可執行。
- 49 維觀測:關節相對位置/速度、物體位置與 3D bounding box 角點、目標位置、上一步動作。
- 嚴格的成功判定:物體需離地超過門檻、與夾爪保持在合理距離內、速度穩定,且連續維持 N 步才算成功, 避免物理穿透或彈飛造成的「假成功」污染資料集。
- 單一策略同時學習 15 種物體:塑膠杯/盆/瓶、不鏽鋼刀叉匙、玻璃瓶與調味罐、陶瓷盤、麥克筆、鍋鏟、玩具。
- 依真實材質為每種物體設定專屬摩擦係數範圍,並在每個 episode 隨機化質量與表面摩擦,提升遷移到真實世界的魯棒性。
- 針對細長、薄型物體(刀叉、盤子)調整 PhysX 求解器迭代次數與 rest offset,並強化凸分解碰撞網格以抑制夾爪穿透。
collect_groot_data_0510.py:播放專家策略,只保留成功 episode,同步記錄腕部相機影像、關節狀態與動作。collect_all_objects.sh:對 15 種物體批次收集,並自動配對英文語言指令(例:"Pick up the stainless steel fork from the floor")。convert_to_lerobot_v2.py:PNG → MP4、CSV → Parquet,產生 LeRobot v2 資料集; 搭配 GR00T modality 定義與資料集驗證腳本直接用於 GR00T 微調。play_ppo_0510.py:將推論出的關節目標軌跡匯出為 CSV / PT,供實體機器人重播驗證。
大規模平行 PPO 在接觸密集的抓取任務中容易出現 NaN 與策略標準差崩潰。本專案追查出兩個主要來源: 從 checkpoint 恢復訓練時 observation normalizer 的統計量與新環境分佈不匹配,導致方差計算失效; 以及 PhysX 穿透造成的觀測數值爆炸。對應實作:
- 觀測/動作截斷與物理合理範圍限制(關節位置 ±2π rad、速度 ±20 rad/s)
- 六層 NaN/Inf 防護(checkpoint 載入、optimizer 前後、act 前、update 前後)與 std 下限保護(
train_ppo_nan_recovery.py) - 訓練診斷探針與效能監控工具(
diagnostic_utils.py)
本專案以日期版本號保留每次迭代。從「讓策略直接看相機」逐步收斂到「狀態專家 + VLA 學生」的架構,每一步都有明確的動機:
| 階段 | 版本 | 做法 | 學到的事 / 為何前進 |
|---|---|---|---|
| 基線 | 0203 | Ground-truth 狀態 PPO,reach / lift 獎勵 | 驗證機器人模型、獎勵設計與物理參數 |
| 端到端視覺 RL | 0310 – 0318 | 非對稱 Actor-Critic:Actor 只看 RGB-D、PointNet 點雲與 YOLOv8 偵測;Critic 使用 privileged 狀態與接觸力。以行為複製(BC)預訓練編碼器後再接 PPO | 可行,但高維視覺輸入使取樣效率低、訓練不穩 |
| 抓取先驗 | 0403 | 每個 episode 以 FastSAM + Contact-GraspNet 預測 6-DoF 抓取位姿,加入位姿對齊獎勵 | 抓取姿勢更合理,但推論成本高 |
| 規模化與平滑化 | 0421 – 0426 | 2048 平行環境、適應性速度懲罰課程、關節 Delta 動作 + EMA 濾波 + Jerk 懲罰、Teacher-Student 蒸餾 | 動作平滑度與 Sim2Real 安全性大幅改善 |
| 最終架構 | 0510 | 任務空間 Delta IK、15 種物體、材質域隨機化;專家軌跡匯出給 GR00T | 由 RL 負責「會抓」、VLA 負責「看得懂與泛化」 |
各版本環境的細節見任務環境說明。
source/pickup_place_direct_0203/.../tasks/direct/pickup_place_direct_0203/
├── pickup_place_direct_0510_env.py / _env_cfg.py # 最終任務環境
├── pickup_place_vision_asym_03xx/0403_*.py # 視覺 RL 與 CGN 探索階段
├── mdp/ # rewards / observations / terminations / curriculum
├── agents/rsl_rl/ # PPO 設定、自訂 VisionAsymActorCritic
└── utils/ # JetRover 模型設定、視覺編碼器、YOLO、Grasp predictor、診斷工具
scripts/
├── rsl_rl/ # 訓練 / 播放、GR00T 資料收集與 LeRobot 轉換
└── isaac_sim_testing/ # 相機內外參校正、BC 訓練、抓取驗證、物理診斷
需求:Isaac Sim 4.5、Isaac Lab、Python 3.10+、NVIDIA GPU。
# 安裝(於已安裝 Isaac Lab 的 Python 環境中)
python -m pip install -e source/pickup_place_direct_0203
# 訓練最終版專家策略
python scripts/rsl_rl/train_ppo_0510.py --task Template-Pickup-Place-Direct-0510-v0 --headless
# 播放並匯出關節軌跡
python scripts/rsl_rl/play_ppo_0510.py --task Template-Pickup-Place-Direct-0510-v0 --checkpoint <model.pt>
# 收集單一物體的 GR00T 資料並轉為 LeRobot v2
python scripts/rsl_rl/collect_groot_data_0510.py --checkpoint <model.pt> --object_id 39 \
--task_description "Pick up the green plastic cup from the floor" --headless
python scripts/rsl_rl/convert_to_lerobot_v2.py --raw_dir groot_data_raw --out_dir groot_data_lerobotJetRover USD 模型、15 種物體資產與訓練好的 checkpoint 因檔案大小未包含在本 repo, 路徑設定於
utils/jetrover.py與pickup_place_direct_0510_env_cfg.py。
Isaac Sim / Isaac Lab · PhysX · RSL-RL (PPO, Distillation) · PyTorch · YOLOv8 · PointNet / ResNet · FastSAM · Contact-GraspNet · LeRobot v2 · NVIDIA GR00T
基於 Isaac Lab Extension Template 建立,並使用 RSL-RL、Ultralytics、 Contact-GraspNet、LeRobot 與 Isaac-GR00T。