学习内容:

  •  Isaac Sim仿真环境
  • 前沿具身智能项目复现

Isaac Sim

教程主要讲了

  • 三种安装方式(工作站、Docker容器、云部署)
  • 基础的 Python 和 ROS/ROS2 集成
  • 简单的快速入门步骤(类似上篇教程的maniskill,原理相似)
  • 常见问题解答

链接:ai-hardware-robotics/07-机器人仿真和benchmark/03issac-sim配置.md at main · datawhalechina/ai-hardware-robotics

教程比较简略这里做些补充

Isaac sim是英伟达开发的仿真环境,能高效利用gpu,场景逼真

基本的软件界面如下(存储不够,还没安装)

  1. 用户界面概览

    • 左侧:舞台树(Stage Tree)显示场景层次结构
    • 中间:视口(Viewport)显示3D场景
    • 右侧:属性面板(Property Panel)显示选中对象的属性
    • 底部:时间轴和控制面板
  2. 添加简单对象

    • 点击Create > Mesh > Cube添加一个立方体
    • 使用控制柄调整位置、旋转和缩放
  3. 添加机器人

    • 点击Isaac Examples > Robots查看可用机器人
    • 选择一个机器人(如UR10)添加到场景中
  4. 运行模拟

    • 点击底部工具栏中的Play按钮开始模拟
    • 使用控制面板调整模拟参数

Isaac Sim 实战补充教程

1. 版本选择和许可

  • 最新稳定版:适合生产环境(目前是 2023.1.x 系列)

许可证说明

  • 个人学习和研究:完全免费
  • 学术机构:有专门的学术许可

2. Python 开发实战

方式一:使用 Isaac Sim 内置 Python(推荐新手)

# Linux
~/.local/share/ov/pkg/isaac_sim-*/python.sh your_script.py

# Windows
C:\Users\你的用户名\AppData\Local\ov\pkg\isaac_sim-*\python.bat your_script.py

方式二:使用独立 Python 环境

# 1. 创建环境
conda create -n isaacsim python=3.10
conda activate isaacsim

# 2. 安装 Isaac Sim Python 包
pip install isaacsim-*-py3-none-any.whl  # 在 Isaac Sim 安装目录找这个文件

# 3. 测试是否成功
python -c "from omni.isaac.kit import SimulationApp"

创建第一个环境的脚本示例 第一个 Python 脚本示例

from omni.isaac.kit import SimulationApp

# 启动仿真环境
simulation_app = SimulationApp({"headless": False})  # headless=True 无界面模式

from omni.isaac.core import World
from omni.isaac.core.objects import DynamicCuboid

# 创建世界
world = World()
world.scene.add_default_ground_plane()

# 添加一个会掉落的方块
cube = world.scene.add(
    DynamicCuboid(
        prim_path="/World/Cube",
        position=[0, 0, 1.0],
        size=0.5,
        color=[1, 0, 0]  # 红色
    )
)

# 重置世界(初始化物理)
world.reset()

# 运行 100 步仿真
for i in range(100):
    world.step(render=True)  # 每步都渲染

# 关闭
simulation_app.close()

3. ROS2 集成实战

完整的 ROS2 发布示例

Isaac Sim 端(Python 脚本):

from omni.isaac.kit import SimulationApp
simulation_app = SimulationApp({"headless": False})

from omni.isaac.core import World
from omni.isaac.core.utils.extensions import enable_extension

# 启用 ROS2 桥接
enable_extension("omni.isaac.ros2_bridge")

import rclpy
from std_msgs.msg import String

# 创建世界
world = World()

# 初始化 ROS2
rclpy.init()
node = rclpy.create_node('isaac_publisher')
pub = node.create_publisher(String, 'isaac_topic', 10)

world.reset()

# 循环发布消息
for i in range(100):
    msg = String()
    msg.data = f'Hello from Isaac Sim: {i}'
    pub.publish(msg)
    world.step(render=True)
    
simulation_app.close()

ROS2 端(订阅测试):

# 打开新终端
source /opt/ros/humble/setup.bash
ros2 topic echo /isaac_topic

4. 导入自定义机器人

从 URDF 导入(最常用)

from omni.isaac.kit import SimulationApp
simulation_app = SimulationApp({"headless": False})

from omni.isaac.core import World
from omni.isaac.core.utils.stage import add_reference_to_stage
from omni.isaac.urdf import _urdf

# 创建世界
world = World()

# 导入 URDF
urdf_path = "/path/to/your/robot.urdf"
imported_robot = _urdf.acquire_urdf_interface()

# 配置导入选项
import_config = _urdf.ImportConfig()
import_config.merge_fixed_joints = False  # 不合并固定关节
import_config.fix_base = True  # 固定基座
import_config.import_inertia_tensor = True  # 导入惯性张量

# 执行导入
success, robot_prim_path = imported_robot.parse_urdf(
    urdf_path, 
    "/World/MyRobot",
    import_config
)

if success:
    print(f"机器人导入成功: {robot_prim_path}")
else:
    print("导入失败")

world.reset()
simulation_app.close()

导入注意事项

  • 网格文件路径:URDF 里的 STL/DAE 文件路径要正确
  • 单位统一:确保模型是米制单位
  • 材质问题:有时候材质需要手动调整
  • 碰撞体简化:复杂模型建议用简化的碰撞体

5. 传感器配置实战

添加 RGB 相机

from omni.isaac.sensor import Camera
import numpy as np

# 创建相机
camera = Camera(
    prim_path="/World/Camera",
    position=[2.0, 2.0, 1.5],
    frequency=30,  # 30 FPS
    resolution=(1920, 1080),
)

# 让相机看向原点
camera.set_world_pose(position=[2, 2, 1.5])
camera.set_focal_length(24.0)  # 焦距 mm

# 初始化相机
camera.initialize()

# 获取图像数据
world.reset()
for i in range(10):
    world.step(render=True)
    
# 拿到 RGB 数据
rgb_data = camera.get_rgba()[:, :, :3]  # 去掉 alpha 通道
print(f"图像形状: {rgb_data.shape}")

# 保存图像
from PIL import Image
img = Image.fromarray(rgb_data.astype(np.uint8))
img.save("output.png")

添加激光雷达

from omni.isaac.range_sensor import _range_sensor

# 创建激光雷达配置
lidar_config = _range_sensor.acquire_lidar_sensor_interface()

# 在场景中创建激光雷达
lidar_path = "/World/Lidar"
lidar_config.add_lidar_sensor(
    lidar_path,
    parent_prim="/World/Robot/base_link",
    min_range=0.4,
    max_range=100.0,
    draw_points=True,  # 可视化点云
    draw_lines=False,
    horizontal_fov=360.0,
    vertical_fov=30.0,
    horizontal_resolution=0.4,  # 度
    vertical_resolution=4.0,
    rotation_rate=20.0,  # Hz
    high_lod=True,
    yaw_offset=0.0
)

6. 性能优化技巧

图形设置优化可以关闭不需要的功能

# 在启动时配置
config = {
    "headless": False,
    "width": 1280,
    "height": 720,
    # 降低渲染质量
    "renderer": "RayTracedLighting",  # 或 "PathTracing"
    "samples_per_pixel_per_frame": 1,
    "denoiser": False,
    # 关闭不需要的功能
    "anti_aliasing": False,
}
simulation_app = SimulationApp(config)

物理仿真优化

  • 时间步长:降低 physics_dt(比如 1/120 改成 1/60)
  • 子步数:减少 physics_substeps
  • 简化碰撞体:用胶囊体、盒子代替复杂网格
  • 禁用不需要的物理:静态物体设置为 static_collider

场景优化

# 使用实例化(多个相同物体)
from omni.isaac.core.prims import XFormPrim

# 别这样做(低效)
for i in range(100):
    cube = world.scene.add(DynamicCuboid(
        prim_path=f"/World/Cube_{i}",
        position=[i*0.5, 0, 0.5]
    ))

# 应该这样(使用实例化)
from pxr import Usd, UsdGeom
stage = simulation_app.context.get_stage()
# 创建原型
prototype = UsdGeom.Cube.Define(stage, "/World/Prototypes/Cube")
# 创建实例
for i in range(100):
    instance = stage.DefinePrim(f"/World/Cube_{i}")
    instance.GetReferences().AddReference(prototype.GetPath().pathString)

7. 调试技巧

查看日志

# Linux
tail -f ~/.nvidia-omniverse/logs/Kit/Isaac-Sim/*/kit.log

# Windows
# 在日志文件夹中打开最新的 kit.log
# C:\Users\你的用户名\.nvidia-omniverse\logs\

Python 调试

# 在代码中添加断点
import pdb; pdb.set_trace()

# 或使用 VSCode 调试
# 在 launch.json 中配置:
{
    "name": "Isaac Sim Python",
    "type": "python",
    "request": "launch",
    "program": "${file}",
    "python": "/path/to/isaac-sim/python.sh"
}

常见报错解决

1. "Failed to load extension"

# 清理缓存
rm -rf ~/.cache/ov
rm -rf ~/.nvidia-omniverse/cache

2. "CUDA out of memory"

  • 减小场景复杂度
  • 降低分辨率
  • 关闭不用的传感器
  • 使用 headless 模式

3. "Physics simulation unstable"

  • 增加物理子步数
  • 减小时间步长
  • 检查碰撞体是否穿模
  • 增加阻尼系数

8. 实用资源

官方示例代码

# 示例代码位置
~/.local/share/ov/pkg/isaac_sim-*/standalone_examples/

推荐先跑这几个:

  • api/omni.isaac.core/add_cube.py - 基础操作
  • api/omni.isaac.sensor/camera.py - 相机使用
  • api/omni.isaac.wheeled_robots/ - 轮式机器人

社区资源

  • GitHub:搜索 "isaac sim examples"
  • 论坛:forums.developer.nvidia.com
  • Discord:NVIDIA Omniverse 服务器

学习建议

  1. 先把官方 standalone examples 跑一遍
  2. 尝试修改参数,看效果变化
  3. 导入自己的机器人模型
  4. 实现简单的控制算法
  5. 集成 ROS2 做实际项目

记住:Isaac Sim 很强大,但也很复杂。慢慢来,遇到问题多看文档、多搜索、多试验。

前沿VLA 具身智能复现

教程里提到三个项目

  • LeRobot SmolVLA 训练记录 - 用 LeRobot 框架训练 SmolVLA 模型
  • BitVLA 训练记录 - BitVLA 模型的微调和评估流程
  •  SpatialVLA 快速上手 - 是最简化的 LIBERO 微调方案

LIBERO 机器人 VLA 模型训练实战指南

快速选择:三种方案对比

方案 训练时间 显存需求 性能 推荐指数
SpatialVLA(推荐) ~2小时 24GB 最优 ⭐⭐⭐⭐⭐
LeRobot SmolVLA ~10小时 32GB+ 约50% ⭐⭐⭐
BitVLA ~1.5小时 36GB 待测试 ⭐⭐⭐⭐

方案一:SpatialVLA(最简单,强烈推荐)

为什么选 SpatialVLA?

  • 环境最简单:一键安装,无需折腾依赖
  • 速度最快:ModelScope 下载比 HuggingFace 快 5-10 倍
  • 开箱即用:作者整合好了 LIBERO 微调环境

完整流程

1. 克隆项目
git clone https://github.com/hope5hope/SpatialVLA-Libero
cd SpatialVLA-Libero
2. 下载预训练模型(国内推荐)
# 使用 ModelScope 镜像(快!)
git clone https://www.modelscope.cn/Koorye/spatialvla-4b-224-pt.git

# 或者用 HuggingFace(慢)
# git clone https://huggingface.co/Koorye/spatialvla-4b-224-pt
3. 修改配置

编辑训练脚本,找到模型路径配置处:

# 修改为你的模型路径
pretrained_model_path = "/path/to/spatialvla-4b-224-pt"
4. 开始训练
# 按项目 README 运行即可
python train.py  # 具体命令看项目文档

问题

Q: ModelScope 下载失败?

# 设置镜像源
export HF_ENDPOINT=https://hf-mirror.com

Q: 显存不够?

  • 降低 batch_size
  • 使用梯度累积:--gradient_accumulation_steps=4

方案二:LeRobot SmolVLA

找到了官方的教程:

微调 SmolVLA - Hugging Face 机器学习平台

优势

能完整监控训练流程

环境准备

# 1. 克隆 LeRobot
git clone https://github.com/huggingface/lerobot
cd lerobot

# 2. 安装依赖
pip install -e .

# 3. 下载数据集
git clone https://huggingface.co/datasets/aopolin-lv/libero_spatial_no_noops_lerobot_v21

训练脚本(在datawhale教程基础上优化了些)

TOKENIZERS_PARALLELISM=false python lerobot/scripts/train.py \
  --policy.type=smolvla \
  --dataset.repo_id=/path/to/libero_spatial_no_noops_lerobot_v21 \
  --batch_size=128 \
  --steps=15000 \  # 原文档 20000 步其实 15000 就收敛了
  --policy.push_to_hub=false \
  --policy.use_amp=false \
  --num_workers=8 \  # 系统建议值
  --eval_freq=2000 \
  --eval.n_episodes=5 \
  --eval.batch_size=1 \
  --save_freq=2000 \
  --save_checkpoint=true \
  --log_freq=200 \
  --wandb.enable=false \
  --output_dir=/your/output/path

训练监控增强(可选)

如果想要 CSV 日志和进度条,替换 lerobot/scripts/train.py 中的训练循环部分:

核心修改点:

# 1. 添加 CSV 日志
import csv
csv_log_file = cfg.output_dir / "training_metrics.csv"
csv_writer = csv.DictWriter(csv_file, fieldnames=['step', 'loss', 'lr', ...])

# 2. 添加 tqdm 进度条
from tqdm import tqdm
progress_bar = tqdm(range(step, cfg.steps), desc="Training")

# 3. 在训练循环中更新
for current_step in progress_bar:
    # ... 训练代码 ...
    progress_bar.set_postfix({'loss': f"{loss:.3f}", 'lr': f"{lr:.1e}"})
    csv_writer.writerow({'step': step, 'loss': loss, ...})

完整代码见文档二,但建议先用默认的跑通再考虑修改。

性能参考

  • 训练时间:RTX 3090 约 10 小时
  • 最终 Loss:约 0.018-0.020
  • 收敛步数:约 15000 步
  • 测试性能:LIBERO-Spatial 上约 50%(小样本测试)

评估

python lerobot/scripts/eval_LIBERO.py \
  --policy_path=/your/output/path/checkpoints/last/pretrained_model/

方案三:BitVLA(量化模型)

特点

  • 模型大小:使用 1-bit 量化,显存效率高但需要 36GB
  • 训练速度:快(1.5小时),但性能未充分验证

环境配置

# 创建环境
conda create -n bitvla python=3.10 -y
conda activate bitvla

# 安装 PyTorch
pip install torch==2.5.0 torchvision==0.20.0 --index-url https://download.pytorch.org/whl/cu124

# 克隆项目
cd BitVLA
pip install -e openvla-oft/
pip install -e transformers

# 安装 LIBERO
git clone https://github.com/Lifelong-Robot-Learning/LIBERO.git
pip install -e LIBERO/
pip install -r experiments/robot/libero/libero_requirements.txt

# 安装 BitVLA
pip install -e bitvla/

解决 NumPy 冲突(重要!)

# 如果遇到 "module compiled against API version 0x10" 错误
pip install "numpy>=1.23.5,<2.0"

下载模型

git clone https://huggingface.co/hongyuw/bitvla-bitsiglipL-224px-bf16
python convert_ckpt.py /path/to/bitvla-bitsiglipL-224px-bf16

微调训练

bash ft_bitvla_libero_spatial.sh
# 或手动运行
python experiments/robot/libero/train.py \
  --pretrained_checkpoint /path/to/model \
  --task_suite_name libero_spatial

训练监控

  • 显存占用:36GB(batch_size=1)
  • 训练时间:~1.5小时(10000步)
  • 参数量:28亿可训练参数

评估前准备

创建符号链接(重要步骤,很多人漏掉):

cd /path/to/checkpoint/
ln -s . pretrained_model

运行评估

python experiments/robot/libero/run_libero_eval_bitnet.py \
  --pretrained_checkpoint /path/to/checkpoint/ \
  --task_suite_name libero_spatial \
  --model_family "bitnet"

通用调试技巧

显存不足

# 方法1:减小 batch size
--batch_size=64  # 或更小

# 方法2:梯度累积
--gradient_accumulation_steps=4

# 方法3:减少 num_workers
--num_workers=4

训练速度慢

# 使用混合精度(如果模型支持)
--policy.use_amp=true

# 减少评估频率
--eval_freq=5000

检查点管理

# 只保存最近 3 个检查点
--save_total_limit=3

# 定期清理
rm -rf output_dir/checkpoints/step_*

日志分析

# 读取 CSV 日志(如果使用了增强版训练脚本)
import pandas as pd
df = pd.read_csv('training_metrics.csv')
df[['step', 'loss', 'lr']].plot(x='step', subplots=True, figsize=(10,6))

性能对比参考

指标 SpatialVLA SmolVLA BitVLA OpenVLA(基线)
LIBERO-Spatial 85%+ 50% 待测 90%
训练时间 2h 10h 1.5h -
显存需求 24GB 32GB 36GB 40GB+

推荐学习路径

  1. 新手:直接上 SpatialVLA,跑通整个流程
  2. 进阶:尝试 LeRobot 框架,学习完整训练管线
  3. 研究:探索 BitVLA 量化技术,优化部署效率

参考资源


记住:先跑通 SpatialVLA,再折腾其他的! 训练模型就像做饭,先学会煮泡面,再研究满汉全席。

Logo

更多推荐