创建自己的项目或任务#
模板生成器可搭建包结构,并按需生成 Isaac Lab 任务的注册代码和智能体配置。它既可创建 Isaac Lab 之外的独立项目,也可创建准备贡献给 Isaac Lab 仓库的任务。外部项目可从可运行的 Cartpole 示例、待实现的任务框架或空任务包开始;内部任务则从 Cartpole 示例开始。
选择要生成的内容#
第一个提示让你选择新任务放在哪里。
类型 |
适用情况 |
生成结果 |
|---|---|---|
External(外部,推荐) |
在 Isaac Lab 仓库之外创建应用、实验或可复用项目。 |
使用 |
Internal(内部) |
准备将任务贡献给 Isaac Lab 仓库。 |
位于 |
通过 wheel 安装的 Isaac Lab 只提供外部项目选项。内部选项会直接写入源码检出目录,因此只在源码安装中可用。
对于外部项目,填写一位或多位作者,并选择初始内容:
内容 |
生成结果 |
|---|---|
杆车 |
可运行示例,包含所选工作流、任务注册和智能体配置。 |
Stubbed(待实现框架) |
相同的任务结构与智能体配置,但任务函数抛出 |
Blank(空白) |
包结构、项目资产路径、任务发现、测试和开发工具,不包含示例任务或智能体文件。 |
所填作者会写入 pyproject.toml 、按需生成的项目扩展元数据,以及 Isaac Lab 采用的 BSD-3-Clause LICENSE 。Blank 项目跳过任务系列、机器人、工作流和强化学习相关提示。Cartpole 和 Stubbed 项目接下来会询问一个或多个任务工作流。完整比较见 任务设计工作流程 。
工作流程 |
适合场景 |
|---|---|
Manager-based | single-agent(基于管理器,单智能体) |
多数新任务。观测、动作、奖励、事件和终止条件保持模块化,便于替换。 |
Direct | single-agent(直接工作流,单智能体) |
需要自定义步进与重置控制,或希望环境实现紧凑的任务。 |
Direct | multi-agent(直接工作流,多智能体) |
包含多个策略,或具有各智能体专用观测、动作空间的任务。 |
对于 Cartpole 和 Stubbed 内容,最后选择要生成配置文件的强化学习库和算法。提示会根据所选工作流调整可用选项。框架比较见 强化学习 。
创建并运行外部项目#
首先 安装 Isaac Lab 。从 Isaac Lab 源码检出目录,或已安装 Isaac Lab 包的 uv 项目中运行生成器:
uv run isaaclab --new
命令使用当前 Isaac Lab 环境的依赖,不调用 pip ,也不另装一套模板依赖,因此可在 uv 创建的不含 pip 的虚拟环境中运行。从已安装 wheel 调用时,生成的 pyproject.toml 会将 Isaac Lab 及其可选依赖锁定到该确切版本,避免 uv sync 悄然解析到旧版本。从源码检出目录调用时,则记录该目录及其工作区包的可编辑安装路径。这使开发分支和发布分支在版本发布前即可使用,同时保留生成项目时使用的代码。源码路径相对于生成项目记录;如果任一目录移动,应重新生成项目或更新 [tool.uv.sources] 。
以下简写等价:
uv run isaaclab -n
首次创建小项目时,可选择以下选项:
External (外部)项目
位于 Isaac Lab 仓库之外的父目录
符合 Python 命名规则的项目名,例如
my_robot_project以个人或组织名称作为作者
Cartpole 初始内容
任务系列名称,例如
balance机器人或配置名称,例如
cartpole无界面任务包不需要 Isaac Sim UI 扩展,选择 No
Manager-based | single-agent (基于管理器、单智能体)工作流
rsl_rl 库与 PPO 算法
提示会显示有效选项;允许多选时,输入以逗号分隔的选项编号。生成器在 <parent-directory>/<project-name> 下创建项目,并初始化 Git 仓库。
任务模板源码#
每种初始内容的任务模块分别保存在一个 Jinja 模板中: tools/template/templates/tasks/cartpole.jinja 或 tools/template/templates/tasks/stubbed.jinja 。每个文件包含所有受支持工作流的环境、配置及基于管理器的 MDP 模块,包括 AMP 变体。Jinja 宏渲染模块, files 映射将相对任务系列的路径与内容关联。生成器将这些文件写入生成的包结构。
共享项目基础设施、任务注册和智能体配置仍采用独立模板。Blank 项目使用共享基础设施,但不生成任务模块。
自动生成项目#
默认仍采用交互式提示。脚本或持续集成中,可传入 --non_interactive ,改用参数驱动的生成方式。最简的外部 Cartpole 命令如下:
uv run isaaclab --new --non_interactive \
--project_path /work/projects \
--name my_robot_project \
--author "Example Author"
它默认使用 cartpole 内容、 balance 任务系列、 cartpole 机器人配置、基于管理器的单智能体工作流、RSL-RL 和 PPO。添加 --initial_content stubbed 可创建 Stubbed 项目;添加 --initial_content blank 可创建 Blank 项目。Blank 项目不含示例任务,因此不接受任务、工作流、库或算法选项。
通过以下参数覆盖默认值:
参数 |
含义 |
|---|---|
|
默认生成外部项目,也可从源码检出目录生成内部任务。 |
|
外部项目的父目录,非交互模式下必需。 |
|
外部项目名或内部任务目录名,非交互模式下必需。 |
|
外部项目作者,必需。多位作者可重复传入此参数。 |
|
外部项目内容,默认为 |
|
任务系列和机器人或配置名称,默认为 |
|
包含通过 Isaac Sim Extension Manager 加载项目所需的文件。 |
|
可重复选择 |
|
可重复选择 |
|
可重复选择 |
例如,创建直接工作流的单智能体与多智能体变体,并选择 SKRL 算法:
uv run isaaclab --new --non_interactive \
--project_path /work/projects \
--name multi_workflow_project \
--author "Example Author" \
--workflow direct:single-agent \
--workflow direct:multi-agent \
--rl_library skrl \
--rl_algorithm skrl:ppo \
--rl_algorithm skrl:ippo
如果未提供 --non_interactive ,配置项目内容的参数会被拒绝,避免意外参数悄然改变交互流程。运行 uv run isaaclab --new --help 查看完整命令参考。
在源码检出目录中,也可不经提示创建内部任务:
uv run isaaclab --new --non_interactive \
--task_type internal \
--name my_internal_task
进入生成的项目并创建环境:
cd <parent-directory>/my_robot_project
uv sync
默认环境包含所选强化学习库和不依赖 Kit 的 Newton 后端, 不会 安装 Isaac Sim。
对于 Cartpole 内容,列出任务名及其可用预设:
uv run isaaclab list_envs --show_presets
Blank 项目在你向 src/<project-name>/tasks 添加并导入 Gymnasium 注册代码之前,不会列出任何项目任务。
从输出中复制任务名,再运行快速冒烟测试:
uv run isaaclab random_agent --task <TASK_NAME> --num_envs 16 --viz newton_gl
如果环境启动且小车移动,项目就可以开始编辑。随后可使用与 Isaac Lab 相同的命令接口训练、回放策略:
uv run isaaclab train --rl_library rsl_rl --task <TASK_NAME>
uv run isaaclab play --rl_library rsl_rl --task <TASK_NAME> --checkpoint latest --viz newton_gl
选择可选功能与仿真后端#
默认 uv sync 安装不依赖 Kit 的 Newton 后端,不安装 Isaac Sim。生成项目的 [project.optional-dependencies] 表对应创建它时所用 Isaac Lab 包声明的所有可选依赖组,使后端、可视化器、强化学习、遥操作等功能依赖与该 Isaac Lab 版本保持一致。当前 Isaac Lab 包提供 rerun 、 viser 或 all 时,也会包含这些依赖组。
传入命令所需的各个可选依赖组。例如:
uv run --extra isaacsim isaaclab random_agent \
--task <TASK_NAME> physics=isaacsim_physx
uv run --extra isaacsim --extra rerun isaaclab play \
--rl_library skrl --task <TASK_NAME> --viz rerun
将 --extra 放在 isaaclab 前;命令需要多种功能时,重复传入。生成的 all 依赖组转交到 Isaac Lab 自身的 all ,其具体内容仍由对应版本定义。完整的版本专用列表见生成的 pyproject.toml 。后端与预设模型见 后端与预设 ;受支持的物理、渲染器、可视化器组合见 快速入门 。
理解生成的项目#
外部项目是一个可安装的 Python 包,采用持续维护的下游示例所用的标准 uv src 布局。根 pyproject.toml 声明包、开发工具、后端可选依赖和 isaaclab.tasks 入口。
项目名标识仓库和 Python 包。任务通用的 MDP 项位于单独命名的任务系列下;机器人专用场景、注册和智能体配置位于 config/<robot-name> 。这样,项目可以添加机器人配置而不复制任务 MDP,也可以添加任务系列而不新建仓库。
项目自己的 USD 文件和相关数据位于 src/<project-name>/assets/data 。项目的 assets 模块提供相对于包的 <PROJECT_NAME>_ASSETS_DIR 路径,使任务和资产配置无论在可编辑安装还是已安装 wheel 中,都能找到这些文件。生成的 .gitattributes 将 USD 文件交给 Git LFS 管理。
多个任务系列共享的代码可放在 tasks/mdp 等包中。生成的任务导入器在寻找任务注册时跳过名为 mdp 的包,因此共享模块不会被注册为任务系列。
Cartpole 项目结构如下:
my_robot_project/
├── LICENSE
├── pyproject.toml
├── README.md
├── scripts/
│ └── list_envs.py
├── src/
│ └── my_robot_project/
│ ├── __init__.py
│ ├── assets/
│ │ ├── __init__.py
│ │ └── data/
│ └── tasks/
│ ├── __init__.py
│ └── balance/
│ ├── mdp/
│ └── config/
│ └── cartpole/
│ ├── agents/
│ └── env_cfg.py
└── tests/
└── test_registration.py
生成的包 __init__.py 有意不主动执行注册。安装项目后,通过 isaaclab.tasks 入口提供 my_robot_project.tasks ,因此仅为使用工具而导入包时,不会立即注册任务。对于 Blank 内容,在添加并导入任务包之前, tasks 目录只包含 __init__.py 。
选择 Isaac Sim UI 扩展时,生成器还会创建 config/extension.toml 和 src/my_robot_project/ui_extension_example.py 。使用时,选择生成的 isaacsim 可选依赖组启动 Isaac Sim。默认是无界面任务包,不包含这些文件。
从项目根目录运行命令,使 uv 能找到包和任务入口。将 pyproject.toml 与 uv.lock 提交到版本控制,让协作者使用同一依赖解析结果。对于关联源码检出目录的项目,协作者还必须把该目录放在所记录的相对路径,或更新源码条目。
开发生成的任务#
训练前,先运行简单智能体。零动作智能体有助于检查重置与被动动力学;随机动作智能体还会运行动作和观测路径:
uv run isaaclab zero_agent --task <TASK_NAME> --num_envs 16
uv run isaaclab random_agent --task <TASK_NAME> --num_envs 16
两个命令都会运行到达到步数上限、可视化器关闭或按下 Ctrl+C。Ctrl+C 会关闭环境并退出,不打印异常堆栈。
编辑 src/<project-name>/tasks 下生成的环境配置和任务项。生成的包采用可编辑安装,无需每次修改后重新安装。
任务逐步完善后,可使用其余项目命令:
uv run isaaclab train_multigpu --rl_library <RL_LIBRARY> \
--task <TASK_NAME> --num_gpus 2
uv run isaaclab benchmark runtime --task <TASK_NAME> \
--num_envs 16 --num_steps 1000
uv run pre-commit run --all-files
生成器提供 tests/test_registration.py ,验证任务 ID、环境入口和默认智能体。 pyproject.toml 为开发安装 pytest,并注册 unit 、 integration 、 smoke 和 kitless 标记。在 tests 下添加项目自己的行为测试,再通过以下命令运行:
uv run pytest tests
source/isaaclab_tasks/test 下看似可复用的辅助工具属于 Isaac Lab 仓库测试套件,不随 isaaclab_tasks 安装。外部项目应使用公共 API 构建环境测试框架,并维护本地测试夹具。将 env_test_utils.py 复制到项目属于内置第三方代码,项目必须跟踪该副本对应的上游变更。
配置 VS Code 或 Cursor 时,运行生成的配置任务,或直接调用:
uv run isaaclab --editor
命令选择当前解释器,并创建由 Git 忽略的 pyrightconfig.json 。这个子配置继承 pyproject.toml 中已纳入版本控制的 Pyright 配置,并添加项目 src 导入根目录、已安装 Isaac Lab 包及发现的 Isaac Sim 扩展。使用 isaacsim 可选依赖组时,生成配置也应包含它:
uv run --extra isaacsim isaaclab --editor
VS Code 使用 Pylance,并选择执行配置命令的解释器。Cursor 则安装 detachhead.basedpyright 扩展替代 Pylance,选择同一解释器并重新加载窗口。两个语言服务器都读取生成的 pyrightconfig.json 。
创建内部任务#
只有在 Isaac Lab 源码检出目录中工作时,才选择 Internal 。生成器将新任务写入 source/isaaclab_tasks ,而不是创建独立项目。从 Isaac Lab 仓库根目录列出并测试任务:
uv run isaaclab list_envs --show_presets
uv run isaaclab random_agent --task <TASK_NAME> --num_envs 16
uv run isaaclab train --rl_library <RL_LIBRARY> --task <TASK_NAME>
如果生成任务对某个强化学习库只有一个入口,训练命令会自动选择对应智能体配置。如果生成了多个算法,或希望显式选择配置,则传入其注册的入口名称。非 PPO 入口包含算法名,例如:
uv run isaaclab train --rl_library rsl_rl --task <TASK_NAME> \
--agent rsl_rl_distillation_cfg_entry_point
故障排除#
- 项目路径被拒绝
外部项目必须位于 Isaac Lab 仓库之外。输入父目录即可,生成器会自动追加项目名。
- 项目名被拒绝
使用由字母、数字和下划线组成的有效 Python 标识,不含空格或连字符,且不能以数字开头。
- 任务系列或机器人、配置名称被拒绝
每个名称都必须是有效 Python 标识,它们会成为
src/<project-name>/tasks下的包目录。- 命令行找不到生成的任务
运行
uv sync,并从生成项目的根目录调用命令。确认任务出现在uv run isaaclab list_envs中。传入--all可包含所有已安装任务包中的任务,而不只列出当前项目isaaclab.tasks入口中的任务。- 非交互参数被拒绝
在
--new后加入--non_interactive。默认初始内容为 Cartpole;Blank 内容不接受任务、工作流、库和算法选项。错误消息会指出缺失的必需参数或不兼容的选择。- 缺少可选后端模块
在命令前添加对应可选依赖组,例如
uv run --extra ovphysx isaaclab ...或uv run --extra isaacsim --extra rerun isaaclab ...。当前 Isaac Lab 包提供的每个依赖组,都会复制到生成项目的可选依赖中。- 生成器报告缺少模板依赖
当前版本从 Isaac Lab 环境获取模板渲染器和提示组件,无需手动
pip install。更新 Isaac Lab 检出目录或已安装包,再次运行生成器。
生成的 README.md 包含同样的项目本地命令,应随项目发展保持更新。