Robot Lab 基于 Isaac Lab 的机器人强化学习实战指南
介绍基于 NVIDIA Isaac Lab 构建的 Robot Lab 扩展库在机器人强化学习中的应用。涵盖 Isaac Sim 架构概念、支持的多种机器人类型(四足、轮式、人形)、环境安装配置、训练流程(速度控制、模仿学习、AMP 舞蹈)、高级功能(多 GPU、蒸馏、特技动作)及自定义机器人开发步骤。提供常见问题解决方案,旨在帮助开发者利用仿真环境进行高效的机器人运动控制策略训练与 Sim2Real 迁移。

介绍基于 NVIDIA Isaac Lab 构建的 Robot Lab 扩展库在机器人强化学习中的应用。涵盖 Isaac Sim 架构概念、支持的多种机器人类型(四足、轮式、人形)、环境安装配置、训练流程(速度控制、模仿学习、AMP 舞蹈)、高级功能(多 GPU、蒸馏、特技动作)及自定义机器人开发步骤。提供常见问题解决方案,旨在帮助开发者利用仿真环境进行高效的机器人运动控制策略训练与 Sim2Real 迁移。

Robot Lab 是一个基于 NVIDIA Isaac Lab 构建的机器人强化学习扩展库,专注于为各类机器人提供标准化的强化学习训练环境。该项目允许开发者在独立的环境中进行开发,而无需修改核心 Isaac Lab 仓库。
NVIDIA 的机器人平台主要由两大核心组件构成,它们之间是层级关系:基础仿真平台 Isaac Sim,以及构建于其上的机器人学习应用框架 Isaac Lab。要精通 Isaac Sim,必须理解其分层架构中的五个核心概念。
Isaac Sim 是什么?它是一个通用的机器人模拟器,提供了高保真的物理引擎(PhysX)和照片级的渲染技术(RTX)。其核心任务是构建和模拟一个精确、逼真的虚拟环境,包括机器人模型、传感器数据和物理交互。

Isaac Lab 是什么?它是一个专为机器人学习(特别是强化学习)设计的开源框架。它本身不是一个模拟器,而是利用 Isaac Sim 提供的环境来进行大规模的 AI 模型训练。

以下是 Isaac Sim 中常用的操作快捷键,帮助您更高效地使用仿真环境:
| 类型 | 键位 | 效果 |
|---|---|---|
| 基本操作 | 鼠标左键 | 选中物体 |
| 基本操作 | ESC | 取消选中 |
| 基本操作 | Ctrl + Z | 撤销上一步操作 |
| 基本操作 | Ctrl + Y / Ctrl + Shift + Z | 重做操作 |
| 基本操作 | Ctrl + S | 保存当前场景 |
| 基本操作 | Ctrl + O | 打开场景 |
| 基本操作 | Ctrl + N | 新建场景 |
| 基本操作 | Delete | 删除选中的物体 |
| 基本操作 | Ctrl + D | 复制选中的物体 |
| 基本操作 | Ctrl + C | 复制 |
| 基本操作 | Ctrl + V | 粘贴 |
| 基本操作 | Ctrl + X | 剪切 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 视野操作 | 鼠标左键点击目标 + F | 聚焦于选中的物体(Frame Selected) |
| 视野操作 | 不选中目标 + F | 聚焦于整个场景(Frame All) |
| 视野操作 | 鼠标左键 + Alt(或鼠标中键) | 旋转视野(绕选中物体或场景中心) |
| 视野操作 | 鼠标右键 + Alt | 缩放视野(Zoom) |
| 视野操作 | 鼠标中键(滚轮按下) | 平移视野(Pan) |
| 视野操作 | 鼠标滚轮 | 放大/缩小视野 |
| 视野操作 | 鼠标右键 + W | 镜头向前移动(第一人称模式) |
| 视野操作 | 鼠标右键 + S | 镜头向后移动(第一人称模式) |
| 视野操作 | 鼠标右键 + A | 镜头向左移动(第一人称模式) |
| 视野操作 | 鼠标右键 + D | 镜头向右移动(第一人称模式) |
| 视野操作 | 鼠标右键 + Q | 镜头向下移动(第一人称模式) |
| 视野操作 | 鼠标右键 + E | 镜头向上移动(第一人称模式) |
| 视野操作 | Numpad 0-9 | 切换预设视角 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 变换操作 | W(或 T) | 切换到平移模式(Translate) |
| 变换操作 | E(或 R) | 切换到旋转模式(Rotate) |
| 变换操作 | R(或 Y) | 切换到缩放模式(Scale) |
| 变换操作 | Q | 切换到选择模式(取消变换工具) |
| 变换操作 | Shift + 拖拽 | 在特定轴上进行精确移动 |
| 变换操作 | Ctrl + 拖拽 | 启用吸附功能(Snap) |
| 变换操作 | Ctrl + Shift + 鼠标左键拖拽 | 对物体施加力(Apply Force,用于物理交互测试) |
| 变换操作 | Alt + 拖拽 | 复制并移动物体 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 选择操作 | Ctrl + 鼠标左键 | 多选/取消选择单个物体(Add/Remove from Selection) |
| 选择操作 | Shift + 鼠标左键 | 范围选择(连续选择) |
| 选择操作 | Ctrl + A | 全选当前层级的所有物体 |
| 选择操作 | Ctrl + Shift + A | 取消全选 |
| 选择操作 | 双击物体 | 选择物体及其所有子物体 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 层级操作 | Ctrl + G | 将选中物体组合成组(Group) |
| 层级操作 | Ctrl + Shift + G | 取消组合(Ungroup) |
| 层级操作 | Ctrl + P | 设置父级(Parent) |
| 层级操作 | Alt + P | 清除父级(Unparent) |
| 层级操作 | H | 隐藏选中的物体 |
| 层级操作 | Alt + H | 显示所有隐藏的物体 |
| 层级操作 | Ctrl + H | 隐藏未选中的物体 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 仿真控制 | 空格键 | 播放/暂停仿真 |
| 仿真控制 | Ctrl + 空格 | 单步执行仿真(Step) |
| 仿真控制 | Ctrl + Shift + 空格 | 停止仿真并重置 |
| 仿真控制 | . (句号) | 前进一帧 |
| 仿真控制 | , (逗号) | 后退一帧 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 界面操作 | Ctrl + Shift + Space | 最大化/还原当前视口 |
| 界面操作 | Ctrl + Tab | 在打开的标签页之间切换 |
| 界面操作 | F1 | 打开帮助文档 |
| 界面操作 | F11 | 全屏模式 |
| 界面操作 | ` (反引号/波浪线键) | 打开/关闭控制台(Console) |
| 类型 | 键位 | 效果 |
|---|---|---|
| 调试操作 | Ctrl + Shift + D | 切换调试绘制(Debug Draw) |
| 调试操作 | Ctrl + Shift + C | 显示/隐藏碰撞体(Collision Meshes) |
| 调试操作 | Ctrl + Shift + B | 显示/隐藏边界框(Bounding Boxes) |
| 调试操作 | Ctrl + Shift + W | 显示/隐藏线框模式(Wireframe) |
| 调试操作 | Ctrl + Shift + L | 切换照明模式 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 相机操作 | Ctrl + Shift + C | 从当前视角创建相机 |
| 相机操作 | Ctrl + [ | 切换到上一个相机 |
| 相机操作 | Ctrl + ] | 切换到下一个相机 |
| 相机操作 | Shift + F | 进入飞行模式(Fly Mode) |
| 类型 | 键位 | 效果 |
|---|---|---|
| 脚本编辑 | Ctrl + Shift + P | 打开命令面板(Command Palette) |
| 脚本编辑 | Ctrl + Shift + E | 打开脚本编辑器(Script Editor) |
| 脚本编辑 | Ctrl + Enter | 执行选中的脚本代码 |
| 脚本编辑 | Ctrl + / | 注释/取消注释代码行 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 搜索操作 | Ctrl + F | 在场景中搜索物体 |
| 搜索操作 | Ctrl + Shift + F | 在整个项目中搜索 |
| 搜索操作 | Ctrl + L | 跳转到指定行 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 视口模式 | Numpad 1 | 前视图(Front View) |
| 视口模式 | Numpad 3 | 右视图(Right View) |
| 视口模式 | Numpad 7 | 顶视图(Top View) |
| 视口模式 | Numpad 0 | 切换到相机视图 |
| 视口模式 | Numpad . | 聚焦到选中物体 |
| 视口模式 | Numpad / | 隔离选中物体(只显示选中对象) |
| 视口模式 | Numpad 5 | 切换正交/透视投影模式 |
| 显示模式 | Z | 切换渲染模式(线框/实体/材质预览) |
| 显示模式 | Alt + Z | 切换透明显示模式 |
| 显示模式 | Shift + Z | 切换材质预览/渲染视图 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 网格操作 | G | 显示/隐藏网格(Grid) |
| 网格操作 | Ctrl + G(长按) | 显示网格设置 |
| 对齐操作 | Alt + X | 对齐到 X 轴 |
| 对齐操作 | Alt + Y | 对齐到 Y 轴 |
| 对齐操作 | Alt + Z | 对齐到 Z 轴(与透明显示不同,需查看上下文) |
| 吸附操作 | Shift + Tab | 切换吸附模式(顶点/边/面) |
| 类型 | 键位 | 效果 |
|---|---|---|
| 时间轴 | Home | 跳转到时间轴起始帧 |
| 时间轴 | End | 跳转到时间轴结束帧 |
| 时间轴 | 左箭头 | 上一帧 |
| 时间轴 | 右箭头 | 下一帧 |
| 时间轴 | Shift + 左箭头 | 快退(10 帧) |
| 时间轴 | Shift + 右箭头 | 快进(10 帧) |
| 动画 | I | 插入关键帧(Insert Keyframe) |
| 动画 | K | 删除关键帧 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 面板操作 | N | 显示/隐藏属性面板(Properties Panel) |
| 面板操作 | T | 显示/隐藏工具栏 |
| 面板操作 | Ctrl + Shift + T | 打开/关闭所有面板 |
| 属性编辑 | Tab | 在属性字段间切换焦点 |
| 属性编辑 | Enter | 确认属性值修改 |
| 属性编辑 | Esc | 取消属性值修改 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 截图 | F12 | 截取当前视口(保存到默认路径) |
| 截图 | Ctrl + F12 | 截图并选择保存位置 |
| 截图 | Alt + F12 | 截取整个窗口 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 性能监控 | Shift + ~ | 显示/隐藏帧率(FPS)和性能统计 |
| 性能监控 | Ctrl + Shift + I | 显示/隐藏统计信息面板 |
| 性能监控 | Ctrl + Alt + P | 性能分析器(Profiler) |
| 类型 | 键位 | 效果 |
|---|---|---|
| 物理调试 | Ctrl + Shift + P(长按) | 显示物理调试信息 |
| 物理调试 | P | 暂停/恢复物理模拟(不影响渲染) |
| 物理调试 | Ctrl + R | 重置物理场景 |
| 碰撞检测 | Ctrl + Shift + V | 显示/隐藏速度矢量 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 层操作 | M | 移动到图层(Move to Layer) |
| 层操作 | Shift + M | 添加到图层(Add to Layer) |
| 层操作 | Ctrl + M | 管理图层 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 测量工具 | Ctrl + Shift + M | 激活测量工具(Measure Tool) |
| 标注工具 | Ctrl + Shift + N | 添加注释/标注 |
| 类型 | 键位 | 效果 |
|---|---|---|
| 刷新 | F5 | 刷新视口/重新加载资源 |
| 刷新 | Ctrl + F5 | 强制刷新并清除缓存 |
| 聚焦 | . (句号,在 3D 视口中) | 聚焦到鼠标位置 |
| 重复操作 | Shift + R | 重复上一次操作 |
| 快速保存 | Ctrl + Shift + S | 另存为(Save As) |
| 导出 | Ctrl + E | 快速导出选中内容 |
| 导入 | Ctrl + I | 快速导入文件 |
提示:
Edit > Preferences > Keyboard Shortcuts 中可以查看和自定义所有快捷键F1 键可以随时访问官方帮助文档| 机器人 | 环境 ID | 制造商 |
|---|---|---|
| ANYmal D | RobotLab-Isaac-Velocity-Rough-Anymal-D-v0 | ANYbotics |
| Unitree Go2 | RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 | Unitree |
| Unitree B2 | RobotLab-Isaac-Velocity-Rough-Unitree-B2-v0 | Unitree |
| Unitree A1 | RobotLab-Isaac-Velocity-Rough-Unitree-A1-v0 | Unitree |
| Deeprobotics Lite3 | RobotLab-Isaac-Velocity-Rough-Deeprobotics-Lite3-v0 | Deeprobotics |
| Zsibot ZSL1 | RobotLab-Isaac-Velocity-Rough-Zsibot-ZSL1-v0 | Zsibot |
| MagicLab Dog | RobotLab-Isaac-Velocity-Rough-MagicLab-Dog-v0 | MagicLab |
| 机器人 | 环境 ID | 制造商 |
|---|---|---|
| Unitree Go2W | RobotLab-Isaac-Velocity-Rough-Unitree-Go2W-v0 | Unitree |
| Unitree B2W | RobotLab-Isaac-Velocity-Rough-Unitree-B2W-v0 | Unitree |
| Deeprobotics M20 | RobotLab-Isaac-Velocity-Rough-Deeprobotics-M20-v0 | Deeprobotics |
| DDTRobot Tita | RobotLab-Isaac-Velocity-Rough-DDTRobot-Tita-v0 | DDTRobot |
| Zsibot ZSL1W | RobotLab-Isaac-Velocity-Rough-Zsibot-ZSL1W-v0 | Zsibot |
| MagicLab Dog-W | RobotLab-Isaac-Velocity-Rough-MagicLab-Dog-W-v0 | MagicLab |
| 机器人 | 环境 ID | 制造商 |
|---|---|---|
| Unitree G1 | RobotLab-Isaac-Velocity-Rough-Unitree-G1-v0 | Unitree |
| Unitree H1 | RobotLab-Isaac-Velocity-Rough-Unitree-H1-v0 | Unitree |
| FFTAI GR1T1 | RobotLab-Isaac-Velocity-Rough-FFTAI-GR1T1-v0 | FFTAI |
| FFTAI GR1T2 | RobotLab-Isaac-Velocity-Rough-FFTAI-GR1T2-v0 | FFTAI |
| Booster T1 | RobotLab-Isaac-Velocity-Rough-Booster-T1-v0 | Booster |
| RobotEra Xbot | RobotLab-Isaac-Velocity-Rough-RobotEra-Xbot-v0 | RobotEra |
| Openloong Loong | RobotLab-Isaac-Velocity-Rough-Openloong-Loong-v0 | Openloong |
| RoboParty ATOM01 | RobotLab-Isaac-Velocity-Rough-RoboParty-ATOM01-v0 | RoboParty |
| MagicLab Bot-Gen1 | RobotLab-Isaac-Velocity-Rough-MagicLab-Bot-Gen1-v0 | MagicLab |
| MagicLab Bot-Z1 | RobotLab-Isaac-Velocity-Rough-MagicLab-Bot-Z1-v0 | MagicLab |
提示: 所有环境都支持
Rough(崎岖地形)和Flat(平地)两种地形配置
请参考 Isaac Lab 官方文档进行安装。
# 1. 克隆 Robot Lab(在 IsaacLab 目录外)
cd ~
git clone https://github.com/fan-ziqi/robot_lab.git
cd robot_lab
# 2. 激活 Isaac Lab 环境
conda activate isaaclab
# 3. 安装 Robot Lab 扩展
python -m pip install-e source/robot_lab
# 4. 验证安装
python scripts/tools/list_envs.py
如果安装成功,你会看到所有可用环境的列表。

当你运行 python -m pip install -e source/robot_lab 时,实际上是在执行一个可编辑模式安装(editable install)。让我们深入分析安装过程中涉及的关键配置文件。
source/robot_lab/setup.py 是 Python 包的安装脚本,负责定义包的元数据和依赖关系:
# Copyright (c) 2024-2025 Your Name
# SPDX-License-Identifier: Apache-2.0
"""Installation script for the 'robot_lab' python package."""
# ============================================================
# 导入必要的模块
# ============================================================
import os
import toml # 用于读取 TOML 格式的配置文件
from setuptools import setup # Python 包的安装工具
# ============================================================
# 获取当前脚本(setup.py)所在的目录路径
# ============================================================
# __file__ 是当前脚本的文件路径
# os.path.realpath() 解析符号链接,获取真实路径
# os.path.dirname() 获取文件所在的目录
EXTENSION_PATH = os.path.dirname(os.path.realpath(__file__))
# ============================================================
# 读取 extension.toml 文件中的元数据
# ============================================================
# extension.toml 包含包的版本、作者、描述等信息
# 使用 toml.load() 解析 TOML 文件并返回字典
EXTENSION_TOML_DATA = toml.load(os.path.join(
EXTENSION_PATH,
"config",
"extension.toml"
))
# ============================================================
# 定义安装时需要自动安装的依赖包列表
# ============================================================
INSTALL_REQUIRES=[
# -------------------- 基础依赖 --------------------
"psutil", # 系统和进程监控工具
# 用途:监控 CPU、内存、GPU 使用情况,训练时显示资源占用
"colorama", # 跨平台终端彩色输出库
# 用途:美化命令行输出,为日志添加颜色(错误红色、警告黄色等)
"xacrodoc", # URDF/Xacro 机器人描述文件处理工具
# 用途:解析和处理机器人模型的 URDF/Xacro 文件
,
,
,
,
]
setup(
name=,
packages=[],
author=EXTENSION_TOML_DATA[][],
maintainer=EXTENSION_TOML_DATA[][],
url=EXTENSION_TOML_DATA[][],
version=EXTENSION_TOML_DATA[][],
description=EXTENSION_TOML_DATA[][],
keywords=EXTENSION_TOML_DATA[][],
install_requires=INSTALL_REQUIRES,
license=,
include_package_data=,
python_requires=,
classifiers=[
,
,
,
,
,
,
],
zip_safe=,
)
关键要点分析:
| 配置项 | 说明 |
|---|---|
name="robot_lab" | 包名,安装后可通过 import robot_lab 导入 |
install_requires | 自动安装的依赖列表 |
python_requires=">=3.10" | 要求 Python 3.10+ |
include_package_data=True | 包含非 .py 文件(如配置文件、模型文件) |
zip_safe=False | 不打包为 zip,保持文件结构(重要!) |
让我们深入了解每个依赖项的作用:
| 包名 | 版本要求 | 用途 | 安装大小 |
|---|---|---|---|
| psutil | 最新 | 监控系统资源(CPU、内存、GPU) 在训练时显示资源使用情况 | ~500 KB |
| colorama | 最新 | 跨平台终端彩色输出 美化日志和错误信息 | ~30 KB |
| xacrodoc | 最新 | 解析和处理 URDF/Xacro 机器人描述文件 用于机器人模型加载 | ~100 KB |
| 包名 | 版本要求 | 用途 | 安装大小 |
|---|---|---|---|
| numpy | 最新 | 数值计算基础库 处理运动数据、张量操作 | ~20 MB |
| pandas | 最新 | 数据处理和分析 读取/处理 CSV 格式的运动数据 | ~40 MB |
| pinocchio | 最新 | 高性能机器人动力学库 用于运动重定向、正/逆运动学计算 | ~50 MB |
Pinocchio 特别说明:
| 包名 | 版本要求 | 用途 | 安装大小 |
|---|---|---|---|
| cusrl[all] | 最新 | 自定义强化学习框架 提供 PPO、SAC 等算法实现 | ~10 MB |
cusrl 的可选依赖:
# [all] 会安装以下所有可选依赖:
# - torch # PyTorch 深度学习框架(通常已由 Isaac Lab 安装)
# - tensorboard # 训练可视化
# - wandb # 实验跟踪(可选)
# - gym # 环境接口(已被 gymnasium 替代)
# 激活环境
conda activate isaaclab
# 进入 robot_lab 目录
cd ~/robot_lab
# 开始训练(无头模式,适合服务器)
python scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \
--headless \
--num_envs 4096
# 或者使用 GUI 模式(适合本地开发)
python scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \
--num_envs 512
参数说明:
--task: 环境 ID--headless: 无头模式(不显示 GUI)--num_envs: 并行环境数量(根据 GPU 显存调整)训练日志保存在 logs/rsl_rl/<task_name>/<timestamp> 目录。

在新终端中启动 TensorBoard:
cd ~/robot_lab
tensorboard --logdir=logs
在浏览器中打开 http://localhost:6006 查看训练曲线。

# 测试训练好的策略
python scripts/reinforcement_learning/rsl_rl/play.py \
--task=RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \
--checkpoint /media/bigdisk/robot_lab/logs/rsl_rl/unitree_go2_rough/2025-12-10_16-33-55/model_2400.pt \
--num_envs 64
# 使用键盘控制单个机器人
python scripts/reinforcement_learning/rsl_rl/play.py \
--task=RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \
--checkpoint /media/bigdisk/robot_lab/logs/rsl_rl/unitree_go2_rough/2025-12-10_16-33-55/model_2400.pt \
--num_envs 1 \
--keyboard
键盘控制按键:
====================== ========================= ========================
命令 正向按键 反向按键
===================== ========================= ========================
X 轴移动 Numpad 8 / Arrow Up Numpad 2 / Arrow Down
Y 轴移动 Numpad 4 / Arrow Right Numpad 6 / Arrow Left
Z 轴旋转 Numpad 7 / Z Numpad 9 / X
===================== ========================= ========================
# 录制 200 帧的视频(需要安装 ffmpeg)
python scripts/reinforcement_learning/rsl_rl/play.py \
--task=RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \
--num_envs 4 \
--video \
--video_length 200
视频保存在 logs/rsl_rl/<task_name>/videos/ 目录。

# 训练
python scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-Velocity-Rough-Unitree-G1-v0 \
--headless
# 测试
python scripts/reinforcement_learning/rsl_rl/play.py \
--task=RobotLab-Isaac-Velocity-Rough-Unitree-G1-v0

强化学习实现运动控制的基本流程为: Train → Play → Sim2Sim → Sim2Real
Train:在 Isaac Lab 任务上并行仿真训练策略(默认无界面更快)
Play:加载训练好的 checkpoint 在仿真中回放/可视化
Sim2Sim:把导出的策略放到其它仿真器(例如 Mujoco)验证迁移
Sim2Real:把策略部署到实物机器人(需调试模式/安全防护)
# 下载 LAFAN1 数据集(已重定向到 Unitree G1)
# 或使用自己的 .csv 运动数据
步骤 2: 转换运动数据
# 将 CSV 转换为 NPZ 格式
python scripts/tools/beyondmimic/csv_to_npz.py \
-f path/to/motion.csv \
--input_fps 60 \
--headless
# 预览运动
python scripts/tools/beyondmimic/replay_npz.py \
-f path/to/motion.npz
步骤 3: 训练模仿策略
# 训练
python scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-BeyondMimic-Flat-Unitree-G1-v0 \
--headless
# 测试(同时播放 2 个不同的动作)
python scripts/reinforcement_learning/rsl_rl/play.py \
--task=RobotLab-Isaac-BeyondMimic-Flat-Unitree-G1-v0 \
--num_envs 2
对抗性运动先验(AMP)可以学习更自然的运动模式。
# 训练(使用 skrl 框架)
python scripts/reinforcement_learning/skrl/train.py \
--task=RobotLab-Isaac-G1-AMP-Dance-Direct-v0 \
--algorithm AMP \
--headless
# 测试(32 个机器人同时跳舞)
python scripts/reinforcement_learning/skrl/play.py \
--task=RobotLab-Isaac-G1-AMP-Dance-Direct-v0 \
--algorithm AMP \
--num_envs 32
# 使用 2 个 GPU 训练
python -m torch.distributed.run \
--nnodes=1 \
--nproc_per_node=2 \
scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \
--headless \
--distributed
主节点(IP: 192.168.1.100):
python -m torch.distributed.run \
--nproc_per_node=2 \
--nnodes=2 \
--node_rank=0 \
--rdzv_id=123 \
--rdzv_backend=c10d \
--rdzv_endpoint=localhost:5555 \
scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \
--headless \
--distributed
从节点(IP: 192.168.1.101):
python -m torch.distributed.run \
--nproc_per_node=2 \
--nnodes=2 \
--node_rank=1 \
--rdzv_id=123 \
--rdzv_backend=c10d \
--rdzv_endpoint=192.168.1.100:5555 \
scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \
--headless \
--distributed
利用机器人的对称性提升训练效率:
# 训练 ANYmal D(使用对称性增强)
python scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-Velocity-Rough-Anymal-D-v0 \
--headless \
--agent=rsl_rl_with_symmetry_cfg_entry_point \
--run_name=ppo_with_symmetry \
--agent.algorithm.symmetry_cfg.use_data_augmentation=true
# 测试
python scripts/reinforcement_learning/rsl_rl/play.py \
--task=RobotLab-Isaac-Velocity-Rough-Anymal-D-v0 \
--agent=rsl_rl_with_symmetry_cfg_entry_point \
--run_name=ppo_with_symmetry
将复杂策略压缩到轻量级网络:
# 步骤 1: 训练教师网络
python scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-Velocity-Flat-Anymal-D-v0 \
--headless \
--run_name=teacher
# 步骤 2: 蒸馏到学生网络
python scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-Velocity-Flat-Anymal-D-v0 \
--headless \
--agent=rsl_rl_distillation_cfg_entry_point \
--load_run teacher \
--run_name=student
# 步骤 3: 测试学生网络
python scripts/reinforcement_learning/rsl_rl/play.py \
--task=RobotLab-Isaac-Velocity-Flat-Anymal-D-v0 \
--agent=rsl_rl_distillation_cfg_entry_point \
--load_run student
# 从最新的检查点恢复训练
python scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \
--headless \
--resume \
--load_run <run_folder_name>
# 从指定检查点恢复
python scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \
--headless \
--resume \
--load_run <run_folder_name> \
--checkpoint /path/to/model_5000.pt
训练 Unitree A1 倒立:
# 训练
python scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-Velocity-Flat-HandStand-Unitree-A1-v0 \
--headless
# 测试
python scripts/reinforcement_learning/rsl_rl/play.py \
--task=RobotLab-Isaac-Velocity-Flat-HandStand-Unitree-A1-v0
robot_lab/
├── source/
│ └── robot_lab/
│ ├── assets/ # 机器人资产定义
│ │ ├── __init__.py
│ │ └── unitree.py # Unitree 机器人定义
│ ├── tasks/ # 任务环境
│ │ └── manager_based/
│ │ └── locomotion/
│ │ └── velocity/
│ │ ├── velocity_env_cfg.py # 基础任务配置
│ │ └── config/
│ │ └── unitree_a1/
│ │ ├── __init__.py # 环境注册
│ │ ├── flat_env_cfg.py
│ │ ├── rough_env_cfg.py
│ │ └── agent/ # 训练配置
│ │ ├── rsl_rl_ppo_cfg.py
│ │ └── cusrl_ppo_cfg.py
│ └── ui_extension_example.py
└── scripts/
├── reinforcement_learning/
│ ├── rsl_rl/
│ │ ├── train.py
│ │ └── play.py
│ ├── cusrl/
│ └── skrl/
└── tools/
在 source/robot_lab/assets/ 创建机器人定义文件(例如 my_robot.py):
# ============================================================
# 导入必要的模块
# ============================================================
from omni.isaac.lab.actuators import ActuatorNetMLPCfg, DCMotorCfg # 执行器配置
from omni.isaac.lab.assets.articulation import ArticulationCfg # 关节机器人配置
import omni.isaac.lab.sim as sim_utils # 仿真工具
# ============================================================
# 定义机器人配置
# ============================================================
MY_ROBOT_CFG = ArticulationCfg(
# ========== 生成/加载配置 ==========
spawn=sim_utils.UsdFileCfg(
# USD 文件路径(Universal Scene Description)
# USD 是 NVIDIA Omniverse 的场景描述格式
# 包含机器人的几何形状、质量、惯性等信息
usd_path="/path/to/my_robot.usd",
# 是否激活接触传感器
# True = 机器人可以检测与环境的接触(如脚接触地面)
# 用于计算奖励(如脚接触地面奖励)和终止条件
activate_contact_sensors=True,
# ========== 刚体物理属性 ==========
rigid_props=sim_utils.RigidBodyPropertiesCfg(
# 是否禁用重力
# False = 启用重力(机器人会受到重力影响)
disable_gravity=False,
# 是否保留加速度信息
# False = 不保留(节省内存和计算)
# True = 保留加速度信息(某些高级功能需要)
retain_accelerations=False,
# 线性阻尼系数(空气阻力等)
# 0.0 = 无阻尼
linear_damping=0.0,
# 角阻尼系数(旋转阻力)
# 0.0 = 无阻尼
angular_damping=0.0,
# 最大线速度限制 (m/s)
# 1000.0 = 实际上不限制(非常大的值)
# 可以设置为合理值(如 10.0)以防止物理爆炸
max_linear_velocity=,
max_angular_velocity=,
max_depenetration_velocity=,
),
articulation_props=sim_utils.ArticulationRootPropertiesCfg(
enabled_self_collisions=,
solver_position_iteration_count=,
solver_velocity_iteration_count=,
),
),
init_state=ArticulationCfg.InitialStateCfg(
pos=(,,),
joint_pos={
:,
:,
:-,
},
joint_vel={:},
),
actuators={
: DCMotorCfg(
joint_names_expr=[,,],
effort_limit=,
saturation_effort=,
velocity_limit=,
stiffness=,
damping=,
friction=,
),
},
)
在 source/robot_lab/tasks/manager_based/locomotion/velocity/config/ 创建机器人配置目录:
mkdir-p source/robot_lab/tasks/manager_based/locomotion/velocity/config/my_robot/agent
在开始编写配置之前,我们需要理解一个核心概念:强化学习训练需要大量的并行环境来加速学习。
想象一下,如果只有一个机器人在学习走路,它每走一步、摔倒、爬起来,都需要时间。但如果有 4096 个机器人同时在 4096 个独立的环境中练习,AI 就能同时从 4096 个机器人的经验中学习,训练速度提升 4096 倍!这就是 Isaac Lab 中 Interactive Scene(交互式场景)的作用。
Interactive Scene 是什么?
Interactive Scene 是 Isaac Lab 提供的场景管理器,它的核心功能是:
{ENV_REGEX_NS} 魔法变量:实现自动克隆的关键在配置文件中,你会频繁看到 {ENV_REGEX_NS} 这个特殊的占位符。这是 Isaac Lab 中最重要的概念之一。
{ENV_REGEX_NS} 的作用:
当你写下 prim_path="{ENV_REGEX_NS}/Robot" 时,Isaac Lab 会在创建环境时自动将它替换为每个环境的唯一路径:
# 你写的配置
prim_path="{ENV_REGEX_NS}/Robot"
# Isaac Lab 自动替换(假设创建 4 个环境)
# 环境 0: prim_path="/World/envs/env_0/Robot"
# 环境 1: prim_path="/World/envs/env_1/Robot"
# 环境 2: prim_path="/World/envs/env_2/Robot"
# 环境 3: prim_path="/World/envs/env_3/Robot"
为什么需要 {ENV_REGEX_NS}?
| 资产类型 | 是否需要 {ENV_REGEX_NS} | 原因 |
|---|---|---|
| 机器人 | ✅ 必须使用 | 每个环境的机器人需要独立控制、独立状态(位置、速度、关节角度) |
| 传感器(如高度扫描器) | ✅ 必须使用 | 每个环境的传感器需要独立读取数据 |
| 地面 | ❌ 不需要 | 所有环境共享同一个无限大的平面 |
| 灯光 | ❌ 不需要 | 所有环境共享同一个光源 |
可视化理解(以 4 个环境为例):
/World/ ← USD Stage 根节点
│ ├── defaultGroundPlane ← 共享:所有环境使用同一个地面
│ ├── Light ← 共享:所有环境使用同一个灯光
│ └── envs/ ← 环境容器
│ ├── env_0/ ← 环境 0 的命名空间
│ │ └── Robot ← 环境 0 的机器人(独立)
│ │ ├── base
│ │ ├── FR_hip_joint
│ │ └── ...
│ ├── env_1/ ← 环境 1 的命名空间
│ │ └── Robot ← 环境 1 的机器人(独立)
│ ├── env_2/ ← 环境 2 的命名空间
│ │ └── Robot ← 环境 2 的机器人(独立)
│ └── env_3/ ← 环境 3 的命名空间
│ └── Robot ← 环境 3 的机器人(独立)
在下面的配置代码中,你会看到:
self.scene.robot = MY_ROBOT_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") - 为每个环境创建独立的机器人self.scene.height_scanner.prim_path = "{ENV_REGEX_NS}/Robot/" + self.base_link_name - 为每个环境的机器人安装独立的高度扫描器这种设计使得我们可以用一份配置轻松创建成千上万个并行环境,大幅加速强化学习训练!这个具体的申明,包含 ContactSensorCfg 都在 source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py

首先创建 rough_env_cfg.py(包含完整配置):
# Copyright (c) 2024-2025 Your Name
# SPDX-License-Identifier: Apache-2.0
# ============================================================
# 导入必要的模块
# ============================================================
from isaaclab.utils import configclass # Isaac Lab 的配置类装饰器
from robot_lab.assets import MY_ROBOT_CFG # 导入我们定义的机器人配置
from robot_lab.tasks.manager_based.locomotion.velocity.velocity_env_cfg import(
LocomotionVelocityRoughEnvCfg,# 导入基础的速度跟踪环境配置
)
# ============================================================
# 定义崎岖地形环境配置类
# ============================================================
@configclass
# 使用 @configclass 装饰器标记这是一个配置类
class MyRobotRoughEnvCfg(LocomotionVelocityRoughEnvCfg):
"""
自定义机器人的崎岖地形速度跟踪环境配置
继承自 LocomotionVelocityRoughEnvCfg 基类
注意:在 Robot Lab 中,Rough 配置是基础配置,包含所有功能
Flat 配置继承自 Rough,然后禁用一些不需要的功能
"""
# ========== 定义关键链接名称 ==========
# 这些名称必须与 USD 文件中的链接名称匹配
base_link_name = "base" # 机器人基座链接名称
foot_link_name = ".*_foot" # 脚部链接名称(使用正则表达式匹配所有脚)
# ========== 定义关节名称列表 ==========
# 四足机器人的 12 个关节(4 条腿 × 3 个关节/腿)
# FR = 右前腿,FL = 左前腿,RR = 右后腿,RL = 左后腿
joint_names = [
"FR_hip_joint","FR_thigh_joint","FR_calf_joint", # 右前腿
"FL_hip_joint","FL_thigh_joint","FL_calf_joint", # 左前腿
"RR_hip_joint",,,
,,,
]
def__post_init__():
().__post_init__()
.scene.robot = MY_ROBOT_CFG.replace(prim_path=)
.scene.height_scanner.prim_path = + .base_link_name
.observations.policy.base_lin_vel.scale =
.observations.policy.base_ang_vel.scale =
.observations.policy.joint_pos.scale =
.observations.policy.joint_vel.scale =
.observations.policy.joint_pos.params[].joint_names = .joint_names
.observations.policy.joint_vel.params[].joint_names = .joint_names
.actions.joint_pos.scale = {
:,
:
}
.actions.joint_pos.clip = {:(-,)}
.actions.joint_pos.joint_names = .joint_names
.rewards.lin_vel_z_l2.weight = -
.rewards.ang_vel_xy_l2.weight = -
.rewards.flat_orientation_l2.weight =
.rewards.base_height_l2.weight =
.rewards.joint_torques_l2.weight = -
.rewards.joint_acc_l2.weight = -
.commands.base_velocity.ranges.lin_vel_x = (-,)
.commands.base_velocity.ranges.lin_vel_y = (-,)
.commands.base_velocity.ranges.ang_vel_z = (-,)

然后创建 flat_env_cfg.py(继承 rough 并禁用某些功能):
# Copyright (c) 2024-2025 Your Name
# SPDX-License-Identifier: Apache-2.0
# ============================================================
# 导入必要的模块
# ============================================================
from isaaclab.utils import configclass # Isaac Lab 的配置类装饰器
from .rough_env_cfg import MyRobotRoughEnvCfg # 导入 Rough 环境配置
# ============================================================
# 定义平地环境配置类
# ============================================================
@configclass
# 使用 @configclass 装饰器标记这是一个配置类
class MyRobotFlatEnvCfg(MyRobotRoughEnvCfg):
"""
自定义机器人的平地速度跟踪环境配置
继承自 MyRobotRoughEnvCfg,禁用崎岖地形相关功能
在 Robot Lab 中,Flat 配置通过继承 Rough 配置,
然后禁用不需要的功能(如地形生成器、高度扫描器等)
"""
def__post_init__(self):
"""
后初始化方法,在配置对象创建后自动调用
禁用 Rough 环境中的地形相关功能
"""
# ========== 调用父类的初始化 ==========
# 先执行 Rough 配置的所有设置
super().__post_init__()
# ========== 修改地形为平地 ==========
# "plane" = 平坦的无限平面
self.scene.terrain.terrain_type = "plane"
# 禁用地形生成器(不需要生成崎岖地形)
self.scene.terrain.terrain_generator = None
# ========== 禁用高度扫描器 ==========
# 平地不需要扫描地形高度
self.scene.height_scanner = None
# 从观察空间中移除高度扫描数据
self.observations.policy.height_scan = None
self.observations.critic.height_scan = None
# ========== 禁用地形课程学习 ==========
.curriculum.terrain_levels =
.rewards.base_height_l2.params[] =
.__class__.__name__ == :
.disable_zero_weight_rewards()
配置继承关系说明:
LocomotionVelocityRoughEnvCfg (Isaac Lab 基类)
↑
│ 继承
│
MyRobotRoughEnvCfg (完整配置:地形生成、高度扫描、所有传感器)
↑
│ 继承并禁用部分功能
│
MyRobotFlatEnvCfg (简化配置:平地、无高度扫描)
在 agent/ 目录创建 rsl_rl_ppo_cfg.py:
# Copyright (c) 2024-2025 Your Name
# SPDX-License-Identifier: Apache-2.0
# ============================================================
# 导入必要的模块
# ============================================================
from isaaclab.utils import configclass # Isaac Lab 的配置类装饰器
from isaaclab_rl.rsl_rl import(
RslRlOnPolicyRunnerCfg,# 在线策略训练器配置(PPO 是在线策略算法)
RslRlPpoActorCriticCfg,# Actor-Critic 神经网络配置
RslRlPpoAlgorithmCfg,# PPO 算法超参数配置
)
# ============================================================
# 定义崎岖地形环境的 PPO 训练配置(基础配置)
# ============================================================
@configclass
# 使用 @configclass 装饰器标记这是一个配置类
class MyRobotRoughPPORunnerCfg(RslRlOnPolicyRunnerCfg):
"""
自定义机器人崎岖地形环境的 PPO 训练器配置
注意:与环境配置一致,Rough 配置是基础配置
Flat 配置继承自 Rough 配置
"""
# ========== 训练器基本参数 ==========
# 每个环境的采样步数
# 24 = 每次收集 24 步数据后进行一次策略更新
# 总样本数 = num_steps_per_env × 环境数量
# 例如:24 × 4096 = 98,304 个样本/次更新
num_steps_per_env = 24
# 最大训练迭代次数
# 20000 = 训练 20000 次策略更新(崎岖地形需要更多训练)
# 总训练步数 = max_iterations × num_steps_per_env × 环境数量
# 例如:20000 × 24 × 4096 ≈ 1.97B 步
max_iterations = 20000
# 模型保存间隔
# 100 = 每 100 次迭代保存一次模型检查点
save_interval = 100
# 实验名称
# 用于组织日志和保存的模型
# 格式:logs/rsl_rl/{experiment_name}/{timestamp}/
experiment_name = "my_robot_rough"
policy = RslRlPpoActorCriticCfg(
init_noise_std=,
actor_obs_normalization=,
critic_obs_normalization=,
actor_hidden_dims=[,,],
critic_hidden_dims=[,,],
activation=,
)
algorithm = RslRlPpoAlgorithmCfg(
value_loss_coef=,
use_clipped_value_loss=,
clip_param=,
entropy_coef=,
num_learning_epochs=,
num_mini_batches=,
learning_rate=,
schedule=,
gamma=,
lam=,
desired_kl=,
max_grad_norm=,
)
():
def__post_init__():
().__post_init__()
.max_iterations =
.experiment_name =
配置继承关系说明:
RslRlOnPolicyRunnerCfg (RSL-RL 基类)
↑
│ 继承
│
MyRobotRoughPPORunnerCfg (完整配置:所有超参数)
↑
│ 继承并修改部分参数
│
MyRobotFlatPPORunnerCfg (简化配置:更少迭代次数)
为什么这样设计?
在 config/my_robot/__init__.py 注册环境:
# Copyright (c) 2024-2025 Your Name
# SPDX-License-Identifier: Apache-2.0
# ============================================================
# 导入必要的模块
# ============================================================
import gymnasium as gym # Gymnasium 是 OpenAI Gym 的升级版,用于注册和管理环境
from . import agents # 导入 agents 子模块(包含训练配置)
# ============================================================
# 注册 Gym 环境
# ============================================================
# ========== 注册平地环境 ==========
gym.register(
# 环境 ID(唯一标识符)
# 命名规则:项目名 - 仿真器 - 任务 - 地形 - 机器人 - 版本
# 例如:RobotLab-Isaac-Velocity-Flat-My-Robot-v0
id="RobotLab-Isaac-Velocity-Flat-My-Robot-v0",
# 入口点:指定环境类的位置
# "isaaclab.envs:ManagerBasedRLEnv" 表示:
# - 模块:isaaclab.envs
# - 类:ManagerBasedRLEnv(基于管理器的强化学习环境)
entry_point="isaaclab.envs:ManagerBasedRLEnv",
# 禁用环境检查器
# True = 跳过 Gymnasium 的环境合规性检查
# Isaac Lab 环境已经过充分测试,跳过检查可以加快启动速度
disable_env_checker=True,
# 关键字参数:传递给环境构造函数的参数
kwargs={
# ========== 环境配置入口点 ==========
# __name__ = 当前模块名(如:robot_lab.tasks....config.my_robot)
# f"{__name__}.flat_env_cfg" = robot_lab....my_robot.flat_env_cfg
# :MyRobotFlatEnvCfg = 导入该模块中的 MyRobotFlatEnvCfg 类
## 格式:模块路径:类名
# 这样可以延迟导入(lazy import),提高启动速度
"env_cfg_entry_point":f"{__name__}.flat_env_cfg:MyRobotFlatEnvCfg",
# ========== RSL-RL 训练配置入口点 ==========
:,
},
)
gym.register(
=,
entry_point=,
disable_env_checker=,
kwargs={
:,
:,
},
)
注册顺序说明:
在 Robot Lab 中,通常先注册 Flat 环境,再注册 Rough 环境。这是因为:
多框架支持:
Robot Lab 支持多个强化学习框架:
每个框架都需要相应的配置入口点。如果你只使用 RSL-RL,可以省略其他框架的入口点。
# 验证环境已注册
python scripts/tools/list_envs.py |grep "My-Robot"
# 开始训练
python scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-Velocity-Flat-My-Robot-v0 \
--headless
Q: 提示找不到 Isaac Sim
A: 确保已正确安装 Isaac Sim,并设置环境变量:
export ISAAC_SIM_PATH="/path/to/isaac-sim"
Q: pip 安装失败
A: 尝试升级 pip 和 setuptools:
python -m pip install--upgrade pip setuptools wheel
python -m pip install-e source/robot_lab
Q: GPU 内存不足(OOM)
A: 减少并行环境数量:
python scripts/reinforcement_learning/rsl_rl/train.py \
--task=<ENV_NAME> \
--num_envs 1024
# 从 4096 减少到 1024
Q: 训练速度慢
A: 检查以下几点:
--headless)Q: 奖励不收敛
A: 常见原因:
Q: 机器人穿透地面或抖动
A: 调整物理参数:
rigid_props=sim_utils.RigidBodyPropertiesCfg(
max_depenetration_velocity=1.0, # 减小此值
),
articulation_props=sim_utils.ArticulationRootPropertiesCfg(
solver_position_iteration_count=8, # 增加迭代次数
solver_velocity_iteration_count=2,
),
Q: 仿真不稳定
A: 降低时间步长:
self.sim.dt = 0.005 # 从 0.01 降低到 0.005
Q: 如何部署到真实机器人?
A: 使用 rl_sar 项目,它提供:
A: 在 .vscode/settings.json 添加路径:
{"python.analysis.extraPaths":["${workspaceFolder}/source/robot_lab","/path/to/IsaacLab/source/isaaclab","/path/to/IsaacLab/source/isaaclab_assets","/path/to/IsaacLab/source/isaaclab_tasks"]}
仿真会在 /tmp 生成大量临时文件:
# 清理所有 USD 缓存
rm-rf /tmp/IsaacLab/usd_*
# 清理特定日期的缓存
rm-rf /tmp/IsaacLab/usd_2024*

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online