1. 项目简介

Robot Lab 是一个基于 NVIDIA Isaac Lab 构建的机器人强化学习扩展库,专注于为各类机器人提供标准化的强化学习训练环境。该项目允许开发者在独立的环境中进行开发,而无需修改核心 Isaac Lab 仓库。对应ISaac lab 使用需要你参考并学习。然后可以参考Isaac Sim|操作界面指南ISAAC SIM安装与软件实践学习(二)—用户界面与工作流程Nvidia Isaac Sim图形界面 入门教程 2024(3)学习操作。最全的资料还是我们之前讲到的isaacsim官方教程以及isaaclab翻译版本

NVIDIA的机器人平台主要由两大核心组件构成,它们之间是层级关系:基础仿真平台Isaac Sim,以及构建于其上的机器人学习应用框架Isaac Lab。要精通 Isaac Sim,必须理解其分层架构中的五个核心概念。

  • Isaac Sim 是什么? 它是一个通用的机器人模拟器,提供了高保真的物理引擎(PhysX)和照片级的渲染技术(RTX)。其核心任务是构建和模拟一个精确、逼真的虚拟环境,包括机器人模型、传感器数据和物理交互。
  • Isaac Lab 是什么? 它是一个专为机器人学习(特别是强化学习)设计的开源框架。它本身不是一个模拟器,而是利用Isaac Sim提供的环境来进行大规模的AI模型训练。
    在这里插入图片描述
  1. Application (App):这是最高层级的管理者,负责所有资源的生命周期,包括启动和销毁仿真进程。即使用户在无头模式(headless)下运行,App 依然是整个程序的总控制器。
  2. Simulation (Sim):Sim 负责定义虚拟世界的“规则”,例如物理定律(如重力方向)、时间步长(dt)以及渲染频率。它将时间的每一步划分为不同的子步骤(如physics_step和render_step),并掌管着 World 对象。
  3. World:World 为仿真提供了空间背景,定义了笛卡尔坐标系的原点和单位。所有关于尺寸和距离的问题都在 World 的参考系内得以解答。
  4. Stage:Stage 是世界的“组成结构”。它以通用场景描述(Universal Scene Description, USD)为基础,将仿真中的所有元素(如机器人、灯光、摄像机)表示为一个层级化的树状结构。这个结构中的每一个节点都是一个图元(Prim)。
    在这里插入图片描述
  • USD 图元(Prim):Prim 是 USD 场景的基本构建块,可以理解为一个容器。每个 Prim 都有一个唯一的路径(例如/World/MyRobot/Gripper),并包含定义其特性的属性(Attributes)(如颜色、大小)和与其他 Prim 的关系(Relationships)(如材质指定)。例如,一个“树”的 Prim 可以有“高度”和“颜色”等属性,同时与一个“地面”Prim 建立关系,以表明其种植位置。父级 Prim 的属性可以被其子级继承,从而实现复杂的场景组合。
  1. Scene:Scene 是 Isaac Lab 中一个至关重要的概念,它管理着 Stage 上所有与向量化(vectorization)相关的图元。这些被管理的图元(如机器人、桌子、待抓取物体)被称为仿真实体(simulation entities)。当用户指定需要创建多个环境副本时,Scene 会自动在 Stage 上克隆这些实体,并将它们放置在不同的坐标位置,从而实现在单一世界和舞台上进行大规模并行训练。

1.1 Isaac Sim 操作快捷键参考

以下是 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 显示/隐藏速度矢量
Layer(层)操作
类型 键位 效果
层操作 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 快速导入文件

提示

  • 不同操作系统和配置可能略有差异(Mac 上 Ctrl 通常对应 Cmd 键)
  • 在 Isaac Sim 的 Edit > Preferences > Keyboard Shortcuts 中可以查看和自定义所有快捷键
  • 建议在训练前熟悉这些快捷键,可以显著提升工作效率
  • 使用 F1 键可以随时访问官方帮助文档
  • **Numpad(数字小键盘)**在视角切换中非常重要,如果笔记本没有数字小键盘,可以在设置中重新映射这些快捷键
  • 某些快捷键可能需要在特定上下文(如3D视口激活状态)下才能使用

2. 支持的机器人

2.1 四足机器人 (Quadruped)

机器人 环境 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

2.2 轮式机器人 (Wheeled)

机器人 环境 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

2.3 人形机器人 (Humanoid)

机器人 环境 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(平地)两种地形配置


3. 环境准备

3.1 步骤 1: 安装 Isaac Lab

参考我之前的文章从Isaac到强化学习训练: Isaac Sim 与 Isaac Lab 安装指南(2025年12月 · 全系显卡适配)

3.2 步骤 2: 安装 Robot 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)。让我们深入分析安装过程中涉及的关键配置文件。

setup.py - 安装脚本

source/robot_lab/setup.py 是 Python 包的安装脚本,负责定义包的元数据和依赖关系:

# Copyright (c) 2024-2025 Ziqi Fan
# 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 文件

    # -------------------- AMP 运动模仿相关 --------------------
    "numpy",         # 数值计算基础库
                     # 用途:数组运算、矩阵计算、处理运动数据

    "pandas",        # 数据分析和处理库
                     # 用途:读取和处理 CSV 格式的运动捕捉数据

    "pinocchio",     # 高性能机器人动力学库(C++ + Python 绑定)
                     # 用途:正向/逆向运动学计算、动力学仿真、运动重定向
                     # 在 BeyondMimic 中用于将人类动作映射到机器人

    # -------------------- 强化学习框架 --------------------
    "cusrl[all]",    # 自定义强化学习框架
                     # [all] 表示安装所有可选依赖(torch, tensorboard, wandb 等)
                     # 用途:提供 PPO、SAC 等强化学习算法实现
]

# ============================================================
# 执行包安装配置
# ============================================================
setup(
    # -------------------- 基本信息 --------------------
    name="robot_lab",              # 包名,安装后可通过 import robot_lab 导入
    packages=["robot_lab"],        # 要安装的 Python 包列表

    # -------------------- 作者和维护者信息 --------------------
    # 从 extension.toml 中读取
    author=EXTENSION_TOML_DATA["package"]["author"],           # 作者名
    maintainer=EXTENSION_TOML_DATA["package"]["maintainer"],   # 维护者名
    url=EXTENSION_TOML_DATA["package"]["repository"],          # 项目主页 URL

    # -------------------- 版本和描述 --------------------
    version=EXTENSION_TOML_DATA["package"]["version"],         # 版本号 (如 2.3.0)
    description=EXTENSION_TOML_DATA["package"]["description"], # 简短描述
    keywords=EXTENSION_TOML_DATA["package"]["keywords"],       # 关键词列表

    # -------------------- 依赖和许可 --------------------
    install_requires=INSTALL_REQUIRES,  # 安装时自动安装的依赖列表
    license="Apache License 2.0",       # 开源许可证类型

    # -------------------- 包配置选项 --------------------
    include_package_data=True,   # 包含 MANIFEST.in 中指定的非 .py 文件
                                 # 如配置文件 (.yaml, .toml)、模型文件 (.usd, .urdf) 等

    python_requires=">=3.10",    # 要求 Python 版本至少为 3.10
                                 # Isaac Lab 需要 Python 3.10 或更高版本

    # -------------------- 分类标签 --------------------
    # 用于在 PyPI 上分类和搜索
    classifiers=[
        "Natural Language :: English",        # 自然语言:英语
        "Programming Language :: Python :: 3.10",  # 支持 Python 3.10
        "Programming Language :: Python :: 3.11",  # 支持 Python 3.11
        "Isaac Sim :: 4.5.0",                 # 兼容 Isaac Sim 4.5.0
        "Isaac Sim :: 5.0.0",                 # 兼容 Isaac Sim 5.0.0
        "Isaac Sim :: 5.1.0",                 # 兼容 Isaac Sim 5.1.0
    ],

    # -------------------- 打包选项 --------------------
    zip_safe=False,              # 不要将包压缩为 .egg zip 文件
                                 # False 表示以目录形式安装,保持文件结构
                                 # 这对于包含非 Python 文件(如 USD 模型)的包很重要
)

关键要点分析

| 配置项 | 说明 |
|--------|------|--------|
| 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
运动模仿依赖(BeyondMimic)
包名 版本要求 用途 安装大小
numpy 最新 数值计算基础库
处理运动数据、张量操作
~20 MB
pandas 最新 数据处理和分析
读取/处理 CSV 格式的运动数据
~40 MB
pinocchio 最新 高性能机器人动力学库
用于运动重定向、正/逆运动学计算
~50 MB

Pinocchio 特别说明

  • 基于 C++ 实现,性能极高
  • 支持 URDF、USD 等多种格式
  • 提供正向/逆向运动学、动力学计算
  • 在 BeyondMimic 中用于将人类动作映射到机器人
强化学习框架
包名 版本要求 用途 安装大小
cusrl[all] 最新 自定义强化学习框架
提供 PPO、SAC 等算法实现
~10 MB

cusrl 的可选依赖

# [all] 会安装以下所有可选依赖:
- torch          # PyTorch 深度学习框架(通常已由 Isaac Lab 安装)
- tensorboard    # 训练可视化
- wandb          # 实验跟踪(可选)
- gym            # 环境接口(已被 gymnasium 替代)

3. 快速开始

3.1 示例 1: 训练四足机器人(Unitree Go2)

3.1.1 训练
# 激活环境
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> 目录。
在这里插入图片描述

3.1.2 监控训练

在新终端中启动 TensorBoard:

cd ~/robot_lab
tensorboard --logdir=logs

在浏览器中打开 http://localhost:6006 查看训练曲线。
在这里插入图片描述

3.1.3 测试策略
# 测试训练好的策略
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
====================== ========================= ========================
3.1.4 录制视频
# 录制 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/ 目录。

在这里插入图片描述

3.2 示例 2: 训练人形机器人(Unitree G1)

3.2.1 基础速度控制
# 训练
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:把策略部署到实物机器人(需调试模式/安全防护)

3.2.2 模仿策略学习
# 下载 LAFAN1 数据集(已重定向到 Unitree G1)
# 从 HuggingFace 下载:https://huggingface.co/datasets/lvhaidong/LAFAN1_Retargeting_Dataset

# 或使用自己的 .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

3.3 示例 3: AMP 舞蹈动作学习

对抗性运动先验(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

4. 高级功能

4.1 多 GPU 训练

4.1.1 单机多卡
# 使用 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
4.1.2 多机多卡

主节点(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

4.2 对称性数据增强

利用机器人的对称性提升训练效率:

# 训练 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

4.3 教师-学生蒸馏

将复杂策略压缩到轻量级网络:

# 步骤 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

4.4 恢复训练

# 从最新的检查点恢复训练
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

4.5 特技动作训练

训练 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

5. 自定义机器人

5.1 项目结构

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/

5.2 添加新机器人的步骤

5.2.1 步骤 1: 定义机器人资产

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=1000.0,

            # 最大角速度限制 (rad/s)
            # 1000.0 = 实际上不限制
            max_angular_velocity=1000.0,

            # 最大穿透恢复速度 (m/s)
            # 当物体穿透时,物理引擎用此速度将其推出
            # 较小的值 (1.0) = 更稳定但可能有轻微穿透
            # 较大的值 (10.0) = 快速恢复但可能不稳定
            max_depenetration_velocity=1.0,
        ),

        # ========== 关节机器人根属性 ==========
        articulation_props=sim_utils.ArticulationRootPropertiesCfg(
            # 是否启用自碰撞检测
            # False = 机器人的不同部分可以穿透(更快但不真实)
            # True = 检测并阻止自碰撞(更真实但更慢)
            enabled_self_collisions=False,

            # 位置求解器迭代次数
            # 更多迭代 = 更精确的物理模拟,但更慢
            # 4 = 默认值,适合大多数情况
            # 增加到 8-16 可以提高精度(但降低性能)
            solver_position_iteration_count=4,

            # 速度求解器迭代次数
            # 0 = 只求解位置,不单独求解速度
            # 1-4 = 更精确的速度计算
            solver_velocity_iteration_count=0,
        ),
    ),

    # ========== 初始状态配置 ==========
    init_state=ArticulationCfg.InitialStateCfg(
        # 机器人初始位置 (x, y, z) 单位:米
        # (0.0, 0.0, 0.6) = 原点上方 0.6 米
        # z 值通常设置为机器人站立时的高度
        pos=(0.0, 0.0, 0.6),

        # 关节初始位置(弧度)
        # 使用正则表达式匹配关节名称
        joint_pos={
            # 髋关节(hip)= 0.0 rad(伸直)
            ".*_hip_joint": 0.0,

            # 大腿关节(thigh)= 0.7 rad(约 40 度)
            # 正值 = 向前弯曲
            ".*_thigh_joint": 0.7,

            # 小腿关节(calf)= -1.4 rad(约 -80 度)
            # 负值 = 向后弯曲
            # 0.7 + (-1.4) = -0.7,形成站立姿态
            ".*_calf_joint": -1.4,
        },

        # 关节初始速度(rad/s)
        # ".*" = 匹配所有关节
        # 0.0 = 静止状态
        joint_vel={".*": 0.0},
    ),

    # ========== 执行器配置 ==========
    actuators={
        # 定义一个名为 "legs" 的执行器组
        # 可以有多个组,如 {"legs": ..., "arms": ...}
        "legs": DCMotorCfg(
            # 使用正则表达式指定该执行器控制的关节
            # 列表中的所有关节将使用相同的执行器参数
            joint_names_expr=[".*_hip_joint", ".*_thigh_joint", ".*_calf_joint"],

            # 力矩限制 (N·m)
            # 33.5 = 最大输出力矩
            # 应根据真实电机规格设置
            effort_limit=33.5,

            # 力矩饱和值 (N·m)
            # 通常与 effort_limit 相同
            # 超过此值将被截断
            saturation_effort=33.5,

            # 速度限制 (rad/s)
            # 21.0 rad/s ≈ 201 RPM
            # 应根据真实电机规格设置
            velocity_limit=21.0,

            # PD 控制器刚度(比例增益)
            # 25.0 = 中等刚度
            # 更大的值 = 更硬(快速响应但可能震荡)
            # 更小的值 = 更软(缓慢响应但更稳定)
            stiffness=25.0,

            # PD 控制器阻尼(微分增益)
            # 0.5 = 轻度阻尼
            # 用于减少震荡,提供平滑运动
            damping=0.5,

            # 摩擦力系数
            # 0.0 = 无摩擦(理想情况)
            # 可以设置为 0.1-0.5 来模拟真实摩擦
            friction=0.0,
        ),
    },
)
5.2.2 步骤 2: 创建任务配置

source/robot_lab/tasks/manager_based/locomotion/velocity/config/ 创建机器人配置目录:

mkdir -p source/robot_lab/tasks/manager_based/locomotion/velocity/config/my_robot/agent
理解并行环境与 Interactive Scene

在开始编写配置之前,我们需要理解一个核心概念:强化学习训练需要大量的并行环境来加速学习

想象一下,如果只有一个机器人在学习走路,它每走一步、摔倒、爬起来,都需要时间。但如果有 4096 个机器人同时在 4096 个独立的环境中练习,AI 就能同时从 4096 个机器人的经验中学习,训练速度提升 4096 倍!这就是 Isaac Lab 中 Interactive Scene(交互式场景)的作用。

Interactive Scene 是什么?

Interactive Scene 是 Isaac Lab 提供的场景管理器,它的核心功能是:

  1. 定义一次,自动克隆:你只需定义一次场景配置(包括机器人、地面、传感器等),Scene 会自动将这些资产复制到成千上万个环境中
  2. 智能命名:每个环境都有独立的命名空间(namespace),确保不同环境的物体互不干扰
  3. 并行仿真:所有环境同时运行,充分利用 GPU 的并行计算能力
{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", "RR_thigh_joint", "RR_calf_joint",  # 右后腿
        "RL_hip_joint", "RL_thigh_joint", "RL_calf_joint",  # 左后腿
    ]

    def __post_init__(self):
        """
        后初始化方法,在配置对象创建后自动调用
        用于设置机器人特定的配置
        """
        # ========== 调用父类的初始化 ==========
        # 必须先调用父类初始化,加载默认配置
        super().__post_init__()

        # ========== 场景配置 ==========
        # 设置机器人资产
        # replace() 创建配置的副本并修改 prim_path
        # {ENV_REGEX_NS} 会被替换为 env_0, env_1, ... env_N
        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

        # ========== 观察空间配置 ==========
        # 调整观察值的缩放,使其在合适的范围内

        # 基座线速度缩放
        # 2.0 = 放大 2 倍,使网络更容易学习速度信息
        self.observations.policy.base_lin_vel.scale = 2.0

        # 基座角速度缩放
        # 0.25 = 缩小到 1/4,因为角速度通常比线速度大
        self.observations.policy.base_ang_vel.scale = 0.25

        # 关节位置和速度缩放
        self.observations.policy.joint_pos.scale = 1.0    # 不缩放
        self.observations.policy.joint_vel.scale = 0.05   # 缩小到 1/20

        # 指定观察的关节
        self.observations.policy.joint_pos.params["asset_cfg"].joint_names = self.joint_names
        self.observations.policy.joint_vel.params["asset_cfg"].joint_names = self.joint_names

        # ========== 动作空间配置 ==========
        # 减小动作缩放,使控制更精细
        # hip 关节使用更小的缩放(0.125)
        # 其他关节使用 0.25
        self.actions.joint_pos.scale = {
            ".*_hip_joint": 0.125,           # 髋关节缩放
            "^(?!.*_hip_joint).*": 0.25      # 其他关节缩放(使用负向前瞻正则)
        }
        # 动作裁剪范围
        self.actions.joint_pos.clip = {".*": (-100.0, 100.0)}
        # 指定控制的关节
        self.actions.joint_pos.joint_names = self.joint_names

        # ========== 奖励权重配置 ==========
        # 调整各项奖励的权重,平衡不同目标

        # 根部惩罚
        self.rewards.lin_vel_z_l2.weight = -2.0         # 惩罚 Z 方向速度(防止跳跃)
        self.rewards.ang_vel_xy_l2.weight = -0.05       # 惩罚俯仰/滚转角速度
        self.rewards.flat_orientation_l2.weight = 0     # 不惩罚方向偏差
        self.rewards.base_height_l2.weight = 0          # 不惩罚高度偏差(Rough地形下)

        # 关节惩罚
        self.rewards.joint_torques_l2.weight = -2.5e-5  # 惩罚关节力矩(降低能耗)
        self.rewards.joint_acc_l2.weight = -2.5e-7      # 惩罚关节加速度(平滑运动)

        # ========== 命令范围配置 ==========
        # 定义训练时随机生成的目标速度范围
        # 根据机器人的能力调整这些范围
        self.commands.base_velocity.ranges.lin_vel_x = (-1.0, 1.5)   # X方向: -1~1.5 m/s
        self.commands.base_velocity.ranges.lin_vel_y = (-0.5, 0.5)   # Y方向: -0.5~0.5 m/s
        self.commands.base_velocity.ranges.ang_vel_z = (-1.0, 1.0)   # 旋转: -1~1 rad/s

在这里插入图片描述

然后创建 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

        # ========== 禁用地形课程学习 ==========
        # 平地不需要课程学习
        self.curriculum.terrain_levels = None

        # ========== 调整奖励配置 ==========
        # 在平地上,可以启用基座高度奖励
        # 将传感器配置设为 None(使用真实高度而非扫描高度)
        self.rewards.base_height_l2.params["sensor_cfg"] = None

        # ========== 自动禁用权重为0的奖励 ==========
        # 如果是 MyRobotFlatEnvCfg 类(而非子类),
        # 自动禁用所有权重为 0 的奖励项以提高性能
        if self.__class__.__name__ == "MyRobotFlatEnvCfg":
            self.disable_zero_weight_rewards()

配置继承关系说明

LocomotionVelocityRoughEnvCfg  (Isaac Lab 基类)
        ↑
        │ 继承
        │
MyRobotRoughEnvCfg  (完整配置:地形生成、高度扫描、所有传感器)
        ↑
        │ 继承并禁用部分功能
        │
MyRobotFlatEnvCfg  (简化配置:平地、无高度扫描)
5.2.3 步骤 3: 配置训练参数

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"

    # ========== Actor-Critic 神经网络配置 ==========
    policy = RslRlPpoActorCriticCfg(
        # 初始化噪声标准差
        # 1.0 = 在训练初期为动作添加较大噪声,促进探索
        # 随着训练进行,噪声会逐渐减小
        init_noise_std=1.0,

        # Actor 观察归一化
        # False = 不对 actor 的输入观察进行归一化
        # 如果观察已经在环境中缩放过,通常设为 False
        actor_obs_normalization=False,

        # Critic 观察归一化
        # False = 不对 critic 的输入观察进行归一化
        critic_obs_normalization=False,

        # Actor(策略网络)隐藏层维度
        # [512, 256, 128] = 三层隐藏层,从512逐渐降到128
        # 输入: 观察空间 → 512 → 256 → 128 → 输出: 动作空间
        # 更大的网络 = 更强的表达能力,但训练更慢
        actor_hidden_dims=[512, 256, 128],

        # Critic(价值网络)隐藏层维度
        # 通常与 Actor 保持相同或相似的结构
        # 输入: 观察空间 → 512 → 256 → 128 → 输出: 状态价值
        critic_hidden_dims=[512, 256, 128],

        # 激活函数
        # "elu" = Exponential Linear Unit,比 ReLU 更平滑
        # 其他选项: "relu", "tanh", "leaky_relu"
        activation="elu",
    )

    # ========== PPO 算法超参数配置 ==========
    algorithm = RslRlPpoAlgorithmCfg(
        # 价值损失系数
        # 1.0 = 价值损失和策略损失同等重要
        # total_loss = policy_loss + value_loss_coef × value_loss - entropy_coef × entropy
        value_loss_coef=1.0,

        # 是否使用截断的价值损失
        # True = 使用 PPO 的 clipped value loss,更稳定
        # False = 使用普通的 MSE loss
        use_clipped_value_loss=True,

        # PPO 截断参数(epsilon)
        # 0.2 = 限制策略更新幅度在 [1-0.2, 1+0.2] = [0.8, 1.2]
        # 防止策略更新过大导致性能崩溃
        # 较小的值 (0.1) = 更保守的更新
        # 较大的值 (0.3) = 更激进的更新
        clip_param=0.2,

        # 熵正则化系数
        # 0.01 = 鼓励策略保持一定随机性,促进探索
        # 较大的值 (0.1) = 更多探索
        # 较小的值 (0.001) = 更少探索,更确定的策略
        entropy_coef=0.01,

        # 每次更新的学习轮数
        # 5 = 每次收集数据后,用这批数据训练 5 个 epoch
        # 更多轮次 = 更充分利用数据,但可能过拟合
        num_learning_epochs=5,

        # Mini-batch 数量
        # 4 = 将收集的数据分成 4 个 mini-batch 进行训练
        # batch_size = (num_envs × num_steps_per_env) / num_mini_batches
        # 例如:(4096 × 24) / 4 = 24,576
        num_mini_batches=4,

        # 学习率
        # 1.0e-3 = 0.001,Adam 优化器的学习率
        # 较大的值 (1e-2) = 更快学习,但可能不稳定
        # 较小的值 (1e-4) = 更稳定,但学习较慢
        learning_rate=1.0e-3,

        # 学习率调度策略
        # "adaptive" = 根据 KL 散度自动调整学习率
        # "linear" = 线性衰减
        # "constant" = 保持不变
        schedule="adaptive",

        # 折扣因子(gamma)
        # 0.99 = 非常重视未来奖励
        # 决定了算法的"远见"程度
        # 较大 (0.999) = 更长远的规划
        # 较小 (0.9) = 更注重短期奖励
        gamma=0.99,

        # GAE lambda 参数
        # 0.95 = 在偏差和方差之间取得平衡
        # 用于计算优势函数(Advantage function)
        # 较大 (0.99) = 更低偏差,更高方差
        # 较小 (0.9) = 更高偏差,更低方差
        lam=0.95,

        # 期望的 KL 散度
        # 0.01 = 当 KL 散度超过此值时,降低学习率
        # KL 散度衡量新旧策略的差异
        # 用于自适应学习率调度
        desired_kl=0.01,

        # 梯度裁剪阈值
        # 1.0 = 当梯度范数超过 1.0 时进行裁剪
        # 防止梯度爆炸,提高训练稳定性
        max_grad_norm=1.0,
    )


# ============================================================
# 定义平地环境的 PPO 训练配置(继承自 Rough)
# ============================================================
@configclass  # 使用 @configclass 装饰器
class MyRobotFlatPPORunnerCfg(MyRobotRoughPPORunnerCfg):
    """
    平地环境的训练配置
    继承自 MyRobotRoughPPORunnerCfg,只修改迭代次数和实验名称

    与环境配置的继承关系保持一致:
    - Rough 是基础配置(包含所有参数)
    - Flat 继承并修改部分参数
    """

    def __post_init__(self):
        """
        后初始化方法,在配置对象创建后自动调用
        修改平地环境特定的参数
        """
        # ========== 调用父类的初始化 ==========
        # 先执行 Rough 配置的所有设置
        super().__post_init__()

        # ========== 修改训练迭代次数 ==========
        # 减少迭代次数
        # 5000 = 平地环境更简单,不需要太多训练
        # 相比 Rough 的 20000 次,减少了 75%
        self.max_iterations = 5000

        # ========== 修改实验名称 ==========
        self.experiment_name = "my_robot_flat"

配置继承关系说明

RslRlOnPolicyRunnerCfg  (RSL-RL 基类)
        ↑
        │ 继承
        │
MyRobotRoughPPORunnerCfg  (完整配置:所有超参数)
        ↑
        │ 继承并修改部分参数
        │
MyRobotFlatPPORunnerCfg  (简化配置:更少迭代次数)

为什么这样设计?

  1. 与环境配置一致:Rough 是基础,Flat 是简化
  2. 代码复用:避免重复定义相同的超参数
  3. 易于维护:修改共同参数只需改 Rough 配置
  4. 符合项目规范:与 robot_lab 中所有机器人的配置方式一致
5.2.4 步骤 4: 注册环境

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 训练配置入口点 ==========
        # agents.__name__ = agents 子模块的名称
        # 指向我们定义的 PPO 训练配置类
        # 训练脚本会使用这个配置来初始化 RSL-RL 训练器
        "rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:MyRobotFlatPPORunnerCfg",

        # ========== CusRL 训练配置入口点(可选)==========
        # 如果你实现了 CusRL 配置,可以添加这个入口点
        # CusRL 是一个实验性的强化学习框架
        # "cusrl_cfg_entry_point": f"{agents.__name__}.cusrl_ppo_cfg:MyRobotFlatTrainerCfg",
    },
)

# ========== 注册崎岖地形环境 ==========
gym.register(
    # 环境 ID(包含 "Rough" 表示崎岖地形)
    id="RobotLab-Isaac-Velocity-Rough-My-Robot-v0",

    # 使用相同的环境类
    entry_point="isaaclab.envs:ManagerBasedRLEnv",

    # 禁用环境检查器
    disable_env_checker=True,

    # 指向崎岖地形的配置
    kwargs={
        # 崎岖地形的环境配置
        # 使用 MyRobotRoughEnvCfg(启用程序化地形生成)
        "env_cfg_entry_point": f"{__name__}.rough_env_cfg:MyRobotRoughEnvCfg",

        # 崎岖地形的 RSL-RL 训练配置
        # 使用 MyRobotRoughPPORunnerCfg(更多迭代次数)
        "rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:MyRobotRoughPPORunnerCfg",

        # 崎岖地形的 CusRL 训练配置(可选)
        # "cusrl_cfg_entry_point": f"{agents.__name__}.cusrl_ppo_cfg:MyRobotRoughTrainerCfg",
    },
)

# ============================================================
# 使用方法
# ============================================================
# 注册后,可以通过以下方式创建环境:
#
# 1. 在 Python 代码中:
#    import gymnasium as gym
#    env = gym.make("RobotLab-Isaac-Velocity-Flat-My-Robot-v0")
#
# 2. 使用命令行训练(RSL-RL):
#    python scripts/reinforcement_learning/rsl_rl/train.py \
#        --task=RobotLab-Isaac-Velocity-Flat-My-Robot-v0
#
# 3. 使用命令行训练(CusRL,如果实现了):
#    python scripts/reinforcement_learning/cusrl/train.py \
#        --task=RobotLab-Isaac-Velocity-Flat-My-Robot-v0

注册顺序说明

在 Robot Lab 中,通常先注册 Flat 环境,再注册 Rough 环境。这是因为:

  1. Flat 环境更简单,适合初期测试
  2. 用户通常先在平地训练,再迁移到崎岖地形
  3. 保持与项目其他机器人配置的一致性

多框架支持

Robot Lab 支持多个强化学习框架:

  • RSL-RL(推荐):ETH Zurich 的 PPO 实现,性能稳定
  • CusRL(实验性):自定义强化学习框架
  • skrl(高级):支持 AMP 等高级算法

每个框架都需要相应的配置入口点。如果你只使用 RSL-RL,可以省略其他框架的入口点。

5.2.5 步骤 5: 验证和训练
# 验证环境已注册
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

调优技巧

  1. 观察空间调整

    • 增加关键传感器信息(IMU、关节状态)
    • 使用历史缓冲提供时序信息
    • 适当的归一化和缩放
  2. 奖励函数设计

    • 平衡任务目标(速度跟踪)和约束(能耗、稳定性)
    • 使用指数奖励处理非线性目标
    • 避免奖励稀疏或过于密集
  3. 超参数调整

    • 根据任务复杂度调整网络大小
    • 增加环境数量加速训练(受 GPU 限制)
    • 调整学习率和 PPO clip 范围
  4. 域随机化

    • 添加质量、摩擦力、电机参数的随机化
    • 模拟传感器噪声
    • 提升 Sim2Real 迁移性能

6. 常见问题

6.1 安装问题

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

6.2 训练问题

Q: GPU 内存不足(OOM)

A: 减少并行环境数量:

python scripts/reinforcement_learning/rsl_rl/train.py \
    --task=<ENV_NAME> \
    --num_envs 1024  # 从 4096 减少到 1024

Q: 训练速度慢

A: 检查以下几点:

  • 使用无头模式(--headless
  • 增加并行环境数
  • 使用更强的 GPU
  • 检查 CPU 瓶颈(增加 worker 数量)

Q: 奖励不收敛

A: 常见原因:

  • 奖励函数设计不合理
  • 超参数需要调整
  • 观察空间不足
  • 任务过于复杂(尝试简化任务)

6.3 仿真问题

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

6.4 部署问题

Q: 如何部署到真实机器人?

A: 使用 rl_sar 项目,它提供:

  • Gazebo 仿真验证
  • 真实机器人部署接口
  • ROS/ROS2 集成

6.5 Pylance 找不到模块

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"
    ]
}

6.6 清理 USD 缓存

仿真会在 /tmp 生成大量临时文件:

# 清理所有 USD 缓存
rm -rf /tmp/IsaacLab/usd_*

# 清理特定日期的缓存
rm -rf /tmp/IsaacLab/usd_2024*

7. 参考链接

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐