Datawhale 算法笔记 AI硬件与机器人大模型 (五) Isaac Sim 入门
创建世界# 导入 URDF# 配置导入选项import_config.merge_fixed_joints = False # 不合并固定关节import_config.fix_base = True # 固定基座import_config.import_inertia_tensor = True # 导入惯性张量# 执行导入urdf_path,print(f"机器人导入成功: {robot_pr
学习内容:
- Isaac Sim仿真环境
- 前沿具身智能项目复现
Isaac Sim
教程主要讲了
- 三种安装方式(工作站、Docker容器、云部署)
- 基础的 Python 和 ROS/ROS2 集成
- 简单的快速入门步骤(类似上篇教程的maniskill,原理相似)
- 常见问题解答
教程比较简略这里做些补充
Isaac sim是英伟达开发的仿真环境,能高效利用gpu,场景逼真
基本的软件界面如下(存储不够,还没安装)
-
用户界面概览
- 左侧:舞台树(Stage Tree)显示场景层次结构
- 中间:视口(Viewport)显示3D场景
- 右侧:属性面板(Property Panel)显示选中对象的属性
- 底部:时间轴和控制面板
-
添加简单对象
- 点击Create > Mesh > Cube添加一个立方体
- 使用控制柄调整位置、旋转和缩放
-
添加机器人
- 点击Isaac Examples > Robots查看可用机器人
- 选择一个机器人(如UR10)添加到场景中
-
运行模拟
- 点击底部工具栏中的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 服务器
学习建议
- 先把官方 standalone examples 跑一遍
- 尝试修改参数,看效果变化
- 导入自己的机器人模型
- 实现简单的控制算法
- 集成 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+ |
推荐学习路径
- 新手:直接上 SpatialVLA,跑通整个流程
- 进阶:尝试 LeRobot 框架,学习完整训练管线
- 研究:探索 BitVLA 量化技术,优化部署效率
参考资源
记住:先跑通 SpatialVLA,再折腾其他的! 训练模型就像做饭,先学会煮泡面,再研究满汉全席。
更多推荐
所有评论(0)