自动生成演示的SkillGen#

SkillGen是一种先进的演示生成系统,通过集成运动规划来增强Isaac Lab Mimic。它通过将人提供的子任务段与自动运动规划相结合,生成高质量、自适应、无碰撞的机器人演示。

什么是SkillGen?#

SkillGen解决了传统演示生成中的关键限制:

  • 运动质量: 使用cuRobo的GPU加速运动规划器生成平滑、无碰撞的轨迹

  • 有效性: 在技能段之间生成运动学可行的计划

  • 多样性: 通过可配置的采样和规划参数生成各种演示

  • 适应性: 生成演示,可以在数据生成过程中适应新的物体放置和场景配置

该系统通过手动注释的人类演示,提取本地化子任务技能(见 SkillGen中的子任务 ),并使用cuRobo在这些技能段之间规划可行的动作,并尊重机器人的运动学和碰撞约束来运行。

先决条件#

在使用SkillGen之前,您必须了解:

  1. 远程操作: 如何使用键盘、SpaceMouse或手动跟踪来控制机器人和记录演示

  2. Isaac Lab Mimic: 包括数据收集、注释、生成和策略训练在内的完整工作流程

重要

在继续使用SkillGen之前,请仔细阅读 ​​Isaac Lab Mimic 中的遥操作与模仿学习​ 文档。

安装#

SkillGen需要Isaac Lab、Isaac Sim和cuRobo。在您的Isaac Lab conda环境中按照以下步骤操作。

步骤1: 安装并验证Isaac Sim和Isaac Lab#

请按照官方Isaac Sim和Isaac Lab安装指南 here

步骤2: 安装cuRobo#

cuRobo为SkillGen提供运动规划功能。此安装已经通过与Isaac Lab的PyTorch和CUDA要求兼容进行测试:

# One line installation of cuRobo (formatted for readability)
conda install -c nvidia cuda-toolkit=12.8 -y && \
export CUDA_HOME="$CONDA_PREFIX" && \
export PATH="$CUDA_HOME/bin:$PATH" && \
export LD_LIBRARY_PATH="$CUDA_HOME/lib:$LD_LIBRARY_PATH" && \
export TORCH_CUDA_ARCH_LIST="8.0+PTX" && \
pip install -e "git+https://github.com/NVlabs/curobo.git@ebb71702f3f70e767f40fd8e050674af0288abe8#egg=nvidia-curobo" --no-build-isolation

备注

  • commit hash ebb71702f3f70e767f40fd8e050674af0288abe8 已通过Isaac Lab的测试-使用其他版本可能会导致兼容性问题。此提交支持四面体网格三角化,cuRobo需要将usds解析为碰撞物体。

  • cuRobo是从源代码安装的,可以进行编辑安装。这意味着cuRobo源代码将克隆到当前目录下的 src/nvidia-curobo 。用户可以选择将cuRobo安装到他们的工作目录中。

步骤3: 安装Rerun#

用于开发中的轨迹可视化:

pip install rerun-sdk==0.23

备注

重新运行可视化设置:

  • Rerun是可选的,但强烈建议用于调试和验证开发过程中计划的轨迹

  • 通过在cuRobo规划器配置中设置 visualize_plan = True 来启用轨迹可视化

  • 启用后,cuRobo规划器接口将向Rerun进行计划的末端执行器轨迹、路径点以及碰撞数据的实时传输,以进行交互式检查

  • 可视化有助于在生成完整数据集之前识别规划问题、碰撞问题和轨迹平滑性

  • 还可以通过 --headless 运行以禁用isaacsim可视化,但仍可可视化和调试末端执行器轨迹

步骤4: 验证安装#

测试cuRobo与Isaac Lab的配合情况:

# This should run without import errors
python -c "import curobo; print('cuRobo installed successfully')"

小技巧

如果出现 libstdc++.so.6: version 'GLIBCXX_3.4.30' not found 错误,您可以尝试使用以下命令来修复它:

conda config --env --set channel_priority strict
conda config --env --add channels conda-forge
conda install -y -c conda-forge "libstdcxx-ng>=12" "libgcc-ng>=12"

下载SkillGen数据集#

我们提供一个预注释的数据集,以帮助您快速开始使用SkillGen。

数据集内容#

数据集包括:

  • Franka臂的人类演示立方体堆叠

  • 每个演示的手动注释的子任务边界

  • 与基本堆叠和自适应箱堆叠任务兼容

下载并设置#

  1. 点击 此处 下载预注释数据集。

  2. 准备数据集目录并移动下载的文件:

# Make sure you are in the root directory of your Isaac Lab workspace
cd /path/to/your/IsaacLab

# Create the datasets directory if it does not exist
mkdir -p datasets

# Move the downloaded dataset into the datasets directory
mv /path/to/annotated_dataset_skillgen.hdf5 datasets/annotated_dataset_skillgen.hdf5

小技巧

SkillGen的一个重要优势是同一个已注释的数据集可以在多个相关任务(例如基本堆叠和自适应箱堆叠)之间重复使用。这避免了为每个变体收集和注释新数据的需求。

{本教程中的任务可选} 收集一个新数据集(源和注释)

如果您想收集新的源数据集,然后为SkillGen创建一个已注释的数据集,请按照以下命令进行操作。用户需要了解Isaac Lab Mimic工作流程。

开始之前的重要提示

  • 使用提供的已注释数据集是在本教程中开始使用SkillGen任务的最快途径。

  • 如果您创建自己的数据集,SkillGen需要手动注释子任务的起始和终止边界(无自动注释)。

  • 对于SkillGen,起始边界信号是必需的;在注释或数据生成过程中使用 --annotate_subtask_start_signals 将会导致失败。

  • 保持您的子任务定义( object_ref , subtask_term_signal )与SkillGen环境配置一致。

记录演示 (任何远程操作设备都受支持; 必要时替换 spacemouse ):

./isaaclab.sh -p scripts/tools/record_demos.py \
--task Isaac-Stack-Cube-Franka-IK-Rel-Skillgen-v0 \
--teleop_device spacemouse \
--dataset_file ./datasets/dataset_skillgen.hdf5 \
--num_demos 10

为SkillGen注释演示 (编写term和开始边界):

./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/annotate_demos.py \
--device cpu \
--task Isaac-Stack-Cube-Franka-IK-Rel-Skillgen-v0 \
--input_file ./datasets/dataset_skillgen.hdf5 \
--output_file ./datasets/annotated_dataset_skillgen.hdf5 \
--annotate_subtask_start_signals

理解数据集标注#

SkillGen需要具有标注子任务开始和结束边界的数据集。不支持自动注释。

SkillGen中的子任务#

技术定义: 子任务是通过 SubTaskConfig 定义的实现操作目标的连续演示段:

  • object_ref: 用作此子任务的空间参考的对象(或 None

  • subtask_term_signal: 二进制终止信号名称(在子任务完成时从0变为1)

  • subtask_start_signal: 二进制开始信号名称(在子任务开始时从0变为1; SkillGen需要)

子任务本地化过程执行:

  • 检测信号转换点(从0到1)以识别子任务边界 [t_start, t_end];

  • 在边界之间提取子任务段;

  • 在对象或任务相关帧中计算末端执行器轨迹和关键姿势(使用 object_ref 如果提供);

这将绝对的、特定于场景的运动转换为对象相对技能段,可以在数据生成过程中适应新的对象放置和场景配置。

手动注释工作流程#

与Isaac Lab Mimic工作流程相反,SkillGen需要手动注释子任务开始和结束边界。例如,为了抓取一个立方体,开始信号是在夹具关闭之前,终止信号是在物体被抓取之后。您可以调整开始和终止信号以符合您的子任务定义。

小技巧

手动注释控件:

  • N 开始/继续播放

  • B 暂停

  • S 标记子任务边界

  • Q 跳过当前演示

在为技能段(例如抓取、堆叠等)标注开始和结束信号时,使用 B 在技能前几步暂停播放,使用 S 注释开始信号,然后使用 N 恢复播放。技能完成后,再次在技能后几步暂停并使用 S 注释结束信号。

使用SkillGen进行数据生成#

SkillGen使用运动规划将标注的演示转换为多样化、高质量的数据集。

SkillGen的工作原理#

SkillGen管道使用您的标注数据集和环境的Mimic API合成新的演示:

  1. 子任务边界使用: 从标注数据集中读取每个子任务的开始和终止索引

  2. 目标采样: 根据任务约束和数据生成配置对每个子任务采样目标姿势

  3. 轨迹规划: 使用cuRobo在子任务段之间规划无碰撞运动(当 --use_skillgen 时)

  4. 轨迹拼接: 将技能段和规划的轨迹拼接成完整的演示。

  5. 成功评估: 验证任务成功条件; 只有成功的试验才会被写入输出数据集

使用参数#

SkillGen数据生成的关键参数:

  • --use_skillgen: 启用SkillGen规划器(必需)

  • --generation_num_trials: 要生成的演示次数

  • --num_envs: 并行环境(根据GPU内存调整)

  • --device: 计算设备(cpu/cuda)。使用cpu可获得稳定的物理效果

  • --headless: 禁用可视化以加快生成速度

任务1: 基本立方体堆叠#

为标准Isaac Lab Mimic立方体堆叠任务生成演示。在这个任务中,Franka机器人必须:

  1. 拿起红色立方体并将其放在蓝色立方体上

  2. 拿起绿色立方体并将其放在红色立方体上

  3. 最终堆叠顺序: 蓝色(底部)、红色(中部)、绿色(顶部)。

使用SkillGen生成的立方体堆叠任务

立方体堆叠数据集示例。#

小规模生成#

从一个小数据集开始验证一切是否正常:

./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
--device cpu \
--num_envs 1 \
--generation_num_trials 10 \
--input_file ./datasets/annotated_dataset_skillgen.hdf5 \
--output_file ./datasets/generated_dataset_small_skillgen_cube_stack.hdf5 \
--task Isaac-Stack-Cube-Franka-IK-Rel-Skillgen-v0 \
--use_skillgen

大规模生成#

一旦对小规模结果满意,生成一个完整的训练数据集:

./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
--device cpu \
--headless \
--num_envs 1 \
--generation_num_trials 1000 \
--input_file ./datasets/annotated_dataset_skillgen.hdf5 \
--output_file ./datasets/generated_dataset_skillgen_cube_stack.hdf5 \
--task Isaac-Stack-Cube-Franka-IK-Rel-Skillgen-v0 \
--use_skillgen \
--headless

备注

  • 使用 --headless 来禁用可视化以加快生成速度。重新运行可视化可以通过在启用 --headless 的情况下将 visualize_plan = True 设置为cuRobo planner配置来启用调试。

  • 根据您的GPU内存调整 --num_envs (从1开始,逐渐增加)。当num_envs大于1时,性能提升并不十分明显。5是大多数GPU之间性能和内存使用之间平衡的最佳值。

  • 生成时间: 对于现代GPU上的1000个演示环境,一个环境需要大约90到120分钟。时间取决于GPU、环境数量以及演示的成功率(取决于注释数据集的质量)。

  • cuRobo规划接口和配置在 cuRobo接口特性 中描述。

任务2: 垃圾箱中的自适应立方体堆叠#

SkillGen也可用于生成自适应任务的数据集。在这个例子中,我们为在狭窄垃圾箱中的自适应立方体堆叠生成数据集。垃圾箱放置在工作区的固定位置和方向,并且一个蓝色立方体放置在垃圾箱的中心。机器人必须成功生成用于将红色和绿色立方体堆叠在蓝色立方体上的演示,而不与垃圾箱发生碰撞。

使用SkillGen生成自适应垃圾箱立方体堆叠任务

自适应垃圾箱堆叠数据生成示例。#

小规模生成#

测试自适应堆叠设置:

./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
--device cpu \
--num_envs 1 \
--generation_num_trials 10 \
--input_file ./datasets/annotated_dataset_skillgen.hdf5 \
--output_file ./datasets/generated_dataset_small_skillgen_bin_cube_stack.hdf5 \
--task Isaac-Stack-Cube-Bin-Franka-IK-Rel-Mimic-v0 \
--use_skillgen

大规模生成#

生成完整的自适应堆叠数据集:

./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
--device cpu \
--headless \
--num_envs 1 \
--generation_num_trials 1000 \
--input_file ./datasets/annotated_dataset_skillgen.hdf5 \
--output_file ./datasets/generated_dataset_skillgen_bin_cube_stack.hdf5 \
--task Isaac-Stack-Cube-Bin-Franka-IK-Rel-Mimic-v0 \
--use_skillgen

警告

由于复杂性增加,自适应任务通常具有较低的成功率和较长的数据生成时间。由于成功率较低以及计划问题较困难,生成数据集所用的时间也较长。

从SkillGen数据中学习策略#

类似于Isaac Lab Mimic工作流程,您可以使用生成的SkillGen数据集来训练模仿学习策略,也可以使用Robomimic。

基础立方体堆叠策略#

为基本立方体叠放任务训练基于状态的策略:

./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py \
--task Isaac-Stack-Cube-Franka-IK-Rel-Skillgen-v0 \
--algo bc \
--dataset ./datasets/generated_dataset_skillgen_cube_stack.hdf5

自适应垃圾箱堆叠策略#

为更复杂的自适应垃圾箱堆叠任务训练策略:

./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py \
--task Isaac-Stack-Cube-Bin-Franka-IK-Rel-Mimic-v0 \
--algo bc \
--dataset ./datasets/generated_dataset_skillgen_bin_cube_stack.hdf5

备注

训练脚本将在“IssacLab/logs/robomimic”目录下保存模型检查点。

评估训练好的策略#

测试您训练好的策略:

# Basic cube stacking evaluation
./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py \
--device cpu \
--task Isaac-Stack-Cube-Franka-IK-Rel-Skillgen-v0 \
--num_rollouts 50 \
--checkpoint /path/to/model_checkpoint.pth
# Adaptive bin stacking evaluation
./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py \
--device cpu \
--task Isaac-Stack-Cube-Bin-Franka-IK-Rel-Mimic-v0 \
--num_rollouts 50 \
--checkpoint /path/to/model_checkpoint.pth

cuRobo接口特性#

本节总结了cuRobo规划器接口和特性。SkillGen流水线使用cuRobo规划器为子任务段之间生成无碰撞运动。然而,用户可以将cuRobo用作自己任务的独立运动规划器。用户也可以通过继承基本运动规划器和实现相同API来实现自己的运动规划器。

基本运动规划器(可扩展)#

  • 位置: isaaclab_mimic/motion_planners/base_motion_planner.py

  • 目的: SkillGen使用的所有运动规划器的统一接口

  • 可扩展性: 可通过继承和实现相同API来添加新的规划器;SkillGen在不改变代码的情况下消耗API

cuRobo规划器(GPU,具有碰撞感知)#

  • 位置: isaaclab_mimic/motion_planners/curobo

  • 多阶段规划:

    • 接近 → 接触 → 撤退子任务阶段

    • 可配置的接触阶段碰撞过滤

    • 对于SkillGen,接近和撤退阶段是无碰撞的。转移阶段进行碰撞检查。

  • 世界同步:

    • 每次试验更新机器人状态、附加对象和碰撞球从Isaac Lab场景

    • 在抓取/放置期间动态附加/分离对象

  • 碰撞表示:

    • 具有每个阶段启用/过滤器的接触感知球集合

  • 输出:

    • 时间参数化,经过碰撞检查的用于拼接的轨迹

  • 测试:

    • source/isaaclab_mimic/test/test_curobo_planner_cube_stack.py

    • source/isaaclab_mimic/test/test_curobo_planner_franka.py

    • source/isaaclab_mimic/test/test_generate_dataset_skillgen.py

使用Franka Panda机器人进行立方体堆叠的cuRobo规划器测试

立方体堆叠规划器测试。#

使用Franka Panda机器人进行障碍物避让的cuRobo规划器测试

Franka规划器测试。#

这些测试也可以作为如何将cuRobo用作独立运动规划器的参考。

备注

有关详细的cuRobo配置创建和参数,请参阅文件 isaaclab_mimic/motion_planners/curobo/curobo_planner_config.py

生成流水线集成#

--use_skillgengenerate_dataset.py 中启用时,将执行以下流程:

  1. 随机化子任务边界: 使用任务配置的偏移范围为每个子任务随机化启动和终止索引。

  2. 构建每个子任务的轨迹: 对于每个末端执行器和子任务:

    • 选择一个源演示片段(基于策略驱动;遵守协调/顺序约束)

    • 将该片段转换到当前场景(对象相对或协调增量;可选首姿插值)

    • 将转换后的片段包装成路径点轨迹

  3. 在子任务之间过渡: - 与 cuRobo 计划一次与子任务的第一个路径点(世界同步,可选附加/卸载)的避碰过渡执行计划路径点,然后恢复子任务轨迹

  4. 带约束执行: 沿着执行轨迹步进执行末端执行器,同时强制执行子任务约束(顺序、协调与同步步骤); 如果启用,可以选择更新计划可视化

  5. 记录和导出: - 积累状态/观测/动作,设置剧集成功标志,并导出剧集(外部流程过滤/捕获成功)

可视化和调试#

用户可以使用基于重运行的计划可视化器可视化计划轨迹并进行碰撞调试。可以通过在 cuRobo 计划器配置中设置 visualize_plan = True 来启用此功能。请注意,需要安装 rerun 才能可视化计划轨迹。有关安装说明,请参阅 安装 中的第3步。

重运行可视化计划的轨迹和碰撞

重运行集成: 计划轨迹与碰撞球体。#

备注

docs/licenses/dependencies/cuRobo-license.txt 中检查 cuRobo 使用许可证