Datawhale 算法笔记 AI硬件与机器人大模型 (五) Isaac Sim 入门

学习内容:

  • 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/ - 轮式机器人

社区资源

学习建议

  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,再折腾其他的! 训练模型就像做饭,先学会煮泡面,再研究满汉全席。

相关推荐
小毅&Nora9 分钟前
【AI微服务】【Spring AI Alibaba】② Agent 深度实战:构建可记忆、可拦截、可流式的智能体系统
人工智能·微服务·spring-ai
陈天伟教授35 分钟前
基于学习的人工智能(7)机器学习基本框架
人工智能·学习
Ccjf酷儿40 分钟前
操作系统 蒋炎岩 3.硬件视角的操作系统
笔记
千里念行客2401 小时前
昂瑞微正式启动科创板IPO发行
人工智能·科技·信息与通信·射频工程
习习.y1 小时前
python笔记梳理以及一些题目整理
开发语言·笔记·python
撸码猿1 小时前
《Python AI入门》第10章 拥抱AIGC——OpenAI API调用与Prompt工程实战
人工智能·python·aigc
在逃热干面2 小时前
(笔记)自定义 systemd 服务
笔记
双翌视觉2 小时前
双翌全自动影像测量仪:以微米精度打造智能化制造
人工智能·机器学习·制造
编程小白_正在努力中3 小时前
神经网络深度解析:从神经元到深度学习的进化之路
人工智能·深度学习·神经网络·机器学习
无风听海3 小时前
神经网络之经验风险最小化
人工智能·深度学习·神经网络