跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Robot Lab 基于 Isaac Lab 的机器人强化学习使用指南

基于 NVIDIA Isaac Lab 的 Robot Lab 扩展库在机器人强化学习中的应用。内容涵盖 Isaac Sim 核心架构概念、常用操作快捷键、支持的四足及人形机器人列表、环境安装配置流程、典型训练案例(含速度控制与模仿学习)、高级功能如多 GPU 训练与策略蒸馏,以及自定义机器人资产与任务配置的完整步骤。旨在为开发者提供从仿真到训练的标准化实践指南。

心动瞬间发布于 2026/4/6更新于 2026/7/340 浏览
Robot Lab 基于 Isaac Lab 的机器人强化学习使用指南

1. 项目简介

Robot Lab 是一个基于 NVIDIA Isaac Lab 构建的机器人强化学习扩展库,专注于为各类机器人提供标准化的强化学习训练环境。该项目允许开发者在独立的环境中进行开发,而无需修改核心 Isaac Lab 仓库。

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

Isaac Sim 是什么?它是一个通用的机器人模拟器,提供了高保真的物理引擎(PhysX)和照片级的渲染技术(RTX)。其核心任务是构建和模拟一个精确、逼真的虚拟环境,包括机器人模型、传感器数据和物理交互。

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

[图片]

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

[图片]

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 DRobotLab-Isaac-Velocity-Rough-Anymal-D-v0ANYbotics
Unitree Go2RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0Unitree
Unitree B2RobotLab-Isaac-Velocity-Rough-Unitree-B2-v0Unitree
Unitree A1RobotLab-Isaac-Velocity-Rough-Unitree-A1-v0Unitree
Deeprobotics Lite3RobotLab-Isaac-Velocity-Rough-Deeprobotics-Lite3-v0Deeprobotics
Zsibot ZSL1RobotLab-Isaac-Velocity-Rough-Zsibot-ZSL1-v0Zsibot
MagicLab DogRobotLab-Isaac-Velocity-Rough-MagicLab-Dog-v0MagicLab
2.2 轮式机器人 (Wheeled)
机器人环境 ID制造商
Unitree Go2WRobotLab-Isaac-Velocity-Rough-Unitree-Go2W-v0Unitree
Unitree B2WRobotLab-Isaac-Velocity-Rough-Unitree-B2W-v0Unitree
Deeprobotics M20RobotLab-Isaac-Velocity-Rough-Deeprobotics-M20-v0Deeprobotics
DDTRobot TitaRobotLab-Isaac-Velocity-Rough-DDTRobot-Tita-v0DDTRobot
Zsibot ZSL1WRobotLab-Isaac-Velocity-Rough-Zsibot-ZSL1W-v0Zsibot
MagicLab Dog-WRobotLab-Isaac-Velocity-Rough-MagicLab-Dog-W-v0MagicLab
2.3 人形机器人 (Humanoid)
机器人环境 ID制造商
Unitree G1RobotLab-Isaac-Velocity-Rough-Unitree-G1-v0Unitree
Unitree H1RobotLab-Isaac-Velocity-Rough-Unitree-H1-v0Unitree
FFTAI GR1T1RobotLab-Isaac-Velocity-Rough-FFTAI-GR1T1-v0FFTAI
FFTAI GR1T2RobotLab-Isaac-Velocity-Rough-FFTAI-GR1T2-v0FFTAI
Booster T1RobotLab-Isaac-Velocity-Rough-Booster-T1-v0Booster
RobotEra XbotRobotLab-Isaac-Velocity-Rough-RobotEra-Xbot-v0RobotEra
Openloong LoongRobotLab-Isaac-Velocity-Rough-Openloong-Loong-v0Openloong
RoboParty ATOM01RobotLab-Isaac-Velocity-Rough-RoboParty-ATOM01-v0RoboParty
MagicLab Bot-Gen1RobotLab-Isaac-Velocity-Rough-MagicLab-Bot-Gen1-v0MagicLab
MagicLab Bot-Z1RobotLab-Isaac-Velocity-Rough-MagicLab-Bot-Z1-v0MagicLab

提示: 所有环境都支持 Rough(崎岖地形)和 Flat(平地)两种地形配置


3. 环境准备

3.1 步骤 1: 安装 Isaac Lab

请参考 Isaac Lab 官方文档进行安装。

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 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 文件
# -------------------- 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)
# 或使用自己的 .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. 参考链接

  • Isaac Lab 文档
  • Isaac Sim 文档

目录

  1. 1. 项目简介
  2. 1.1 Isaac Sim 操作快捷键参考
  3. 基本操作
  4. 视野操作
  5. 物体操作与变换
  6. 选择操作
  7. 场景层级操作
  8. 仿真控制
  9. 窗口与界面
  10. 调试与可视化
  11. 相机操作
  12. 脚本与编辑器
  13. 搜索与导航
  14. 视口与显示模式
  15. 网格与对齐
  16. 时间轴与动画
  17. 属性与面板
  18. 截图与录制
  19. 性能与统计
  20. 物理与仿真调试
  21. Layer(层)操作
  22. 测量与工具
  23. 其他实用快捷键
  24. 2. 支持的机器人
  25. 2.1 四足机器人 (Quadruped)
  26. 2.2 轮式机器人 (Wheeled)
  27. 2.3 人形机器人 (Humanoid)
  28. 3. 环境准备
  29. 3.1 步骤 1: 安装 Isaac Lab
  30. 3.2 步骤 2: 安装 Robot Lab
  31. 1. 克隆 Robot Lab(在 IsaacLab 目录外)
  32. 2. 激活 Isaac Lab 环境
  33. 3. 安装 Robot Lab 扩展
  34. 4. 验证安装
  35. 深入理解:安装配置详解
  36. setup.py - 安装脚本
  37. Copyright (c) 2024-2025 Your Name
  38. SPDX-License-Identifier: Apache-2.0
  39. ============================================================
  40. 导入必要的模块
  41. ============================================================
  42. ============================================================
  43. 获取当前脚本(setup.py)所在的目录路径
  44. ============================================================
  45. file 是当前脚本的文件路径
  46. os.path.realpath() 解析符号链接,获取真实路径
  47. os.path.dirname() 获取文件所在的目录
  48. ============================================================
  49. 读取 extension.toml 文件中的元数据
  50. ============================================================
  51. extension.toml 包含包的版本、作者、描述等信息
  52. 使用 toml.load() 解析 TOML 文件并返回字典
  53. ============================================================
  54. 定义安装时需要自动安装的依赖包列表
  55. ============================================================
  56. -------------------- 基础依赖 --------------------
  57. 用途:监控 CPU、内存、GPU 使用情况,训练时显示资源占用
  58. 用途:美化命令行输出,为日志添加颜色(错误红色、警告黄色等)
  59. 用途:解析和处理机器人模型的 URDF/Xacro 文件
  60. -------------------- AMP 运动模仿相关 --------------------
  61. 用途:数组运算、矩阵计算、处理运动数据
  62. 用途:读取和处理 CSV 格式的运动捕捉数据
  63. 用途:正向/逆向运动学计算、动力学仿真、运动重定向
  64. 在 BeyondMimic 中用于将人类动作映射到机器人
  65. -------------------- 强化学习框架 --------------------
  66. [all] 表示安装所有可选依赖(torch, tensorboard, wandb 等)
  67. 用途:提供 PPO、SAC 等强化学习算法实现
  68. ============================================================
  69. 执行包安装配置
  70. ============================================================
  71. -------------------- 基本信息 --------------------
  72. -------------------- 作者和维护者信息 --------------------
  73. 从 extension.toml 中读取
  74. -------------------- 版本和描述 --------------------
  75. -------------------- 依赖和许可 --------------------
  76. -------------------- 包配置选项 --------------------
  77. 如配置文件 (.yaml, .toml)、模型文件 (.usd, .urdf) 等
  78. Isaac Lab 需要 Python 3.10 或更高版本
  79. -------------------- 分类标签 --------------------
  80. 用于在 PyPI 上分类和搜索
  81. -------------------- 打包选项 --------------------
  82. False 表示以目录形式安装,保持文件结构
  83. 这对于包含非 Python 文件(如 USD 模型)的包很重要
  84. 基础依赖
  85. 运动模仿依赖(BeyondMimic)
  86. 强化学习框架
  87. [all] 会安装以下所有可选依赖:
  88. - torch # PyTorch 深度学习框架(通常已由 Isaac Lab 安装)
  89. - tensorboard # 训练可视化
  90. - wandb # 实验跟踪(可选)
  91. - gym # 环境接口(已被 gymnasium 替代)
  92. 3. 快速开始
  93. 3.1 示例 1: 训练四足机器人(Unitree Go2)
  94. 3.1.1 训练
  95. 激活环境
  96. 进入 robot_lab 目录
  97. 开始训练(无头模式,适合服务器)
  98. 或者使用 GUI 模式(适合本地开发)
  99. 3.1.2 监控训练
  100. 3.1.3 测试策略
  101. 测试训练好的策略
  102. 使用键盘控制单个机器人
  103. 3.1.4 录制视频
  104. 录制 200 帧的视频(需要安装 ffmpeg)
  105. 3.2 示例 2: 训练人形机器人(Unitree G1)
  106. 3.2.1 基础速度控制
  107. 训练
  108. 测试
  109. 3.2.2 模仿策略学习
  110. 下载 LAFAN1 数据集(已重定向到 Unitree G1)
  111. 或使用自己的 .csv 运动数据
  112. 将 CSV 转换为 NPZ 格式
  113. 预览运动
  114. 训练
  115. 测试(同时播放 2 个不同的动作)
  116. 3.3 示例 3: AMP 舞蹈动作学习
  117. 训练(使用 skrl 框架)
  118. 测试(32 个机器人同时跳舞)
  119. 4. 高级功能
  120. 4.1 多 GPU 训练
  121. 4.1.1 单机多卡
  122. 使用 2 个 GPU 训练
  123. 4.1.2 多机多卡
  124. 4.2 对称性数据增强
  125. 训练 ANYmal D(使用对称性增强)
  126. 测试
  127. 4.3 教师 - 学生蒸馏
  128. 步骤 1: 训练教师网络
  129. 步骤 2: 蒸馏到学生网络
  130. 步骤 3: 测试学生网络
  131. 4.4 恢复训练
  132. 从最新的检查点恢复训练
  133. 从指定检查点恢复
  134. 4.5 特技动作训练
  135. 训练
  136. 测试
  137. 5. 自定义机器人
  138. 5.1 项目结构
  139. 5.2 添加新机器人的步骤
  140. 5.2.1 步骤 1: 定义机器人资产
  141. ============================================================
  142. 导入必要的模块
  143. ============================================================
  144. ============================================================
  145. 定义机器人配置
  146. ============================================================
  147. ========== 生成/加载配置 ==========
  148. USD 文件路径(Universal Scene Description)
  149. USD 是 NVIDIA Omniverse 的场景描述格式
  150. 包含机器人的几何形状、质量、惯性等信息
  151. 是否激活接触传感器
  152. True = 机器人可以检测与环境的接触(如脚接触地面)
  153. 用于计算奖励(如脚接触地面奖励)和终止条件
  154. ========== 刚体物理属性 ==========
  155. 是否禁用重力
  156. False = 启用重力(机器人会受到重力影响)
  157. 是否保留加速度信息
  158. False = 不保留(节省内存和计算)
  159. True = 保留加速度信息(某些高级功能需要)
  160. 线性阻尼系数(空气阻力等)
  161. 0.0 = 无阻尼
  162. 角阻尼系数(旋转阻力)
  163. 0.0 = 无阻尼
  164. 最大线速度限制 (m/s)
  165. 1000.0 = 实际上不限制(非常大的值)
  166. 可以设置为合理值(如 10.0)以防止物理爆炸
  167. 最大角速度限制 (rad/s)
  168. 1000.0 = 实际上不限制
  169. 最大穿透恢复速度 (m/s)
  170. 当物体穿透时,物理引擎用此速度将其推出
  171. 较小的值 (1.0) = 更稳定但可能有轻微穿透
  172. 较大的值 (10.0) = 快速恢复但可能不稳定
  173. ========== 关节机器人根属性 ==========
  174. 是否启用自碰撞检测
  175. False = 机器人的不同部分可以穿透(更快但不真实)
  176. True = 检测并阻止自碰撞(更真实但更慢)
  177. 位置求解器迭代次数
  178. 更多迭代 = 更精确的物理模拟,但更慢
  179. 4 = 默认值,适合大多数情况
  180. 增加到 8-16 可以提高精度(但降低性能)
  181. 速度求解器迭代次数
  182. 0 = 只求解位置,不单独求解速度
  183. 1-4 = 更精确的速度计算
  184. ========== 初始状态配置 ==========
  185. 机器人初始位置 (x, y, z) 单位:米
  186. (0.0, 0.0, 0.6) = 原点上方 0.6 米
  187. z 值通常设置为机器人站立时的高度
  188. 关节初始位置(弧度)
  189. 使用正则表达式匹配关节名称
  190. 髋关节(hip)= 0.0 rad(伸直)
  191. 大腿关节(thigh)= 0.7 rad(约 40 度)
  192. 正值 = 向前弯曲
  193. 小腿关节(calf)= -1.4 rad(约 -80 度)
  194. 负值 = 向后弯曲
  195. 0.7 + (-1.4) = -0.7,形成站立姿态
  196. 关节初始速度(rad/s)
  197. ".*" = 匹配所有关节
  198. 0.0 = 静止状态
  199. ========== 执行器配置 ==========
  200. 定义一个名为 "legs" 的执行器组
  201. 可以有多个组,如 {"legs": ..., "arms": ...}
  202. 使用正则表达式指定该执行器控制的关节
  203. 列表中的所有关节将使用相同的执行器参数
  204. 力矩限制 (N·m)
  205. 33.5 = 最大输出力矩
  206. 应根据真实电机规格设置
  207. 力矩饱和值 (N·m)
  208. 通常与 effort_limit 相同
  209. 超过此值将被截断
  210. 速度限制 (rad/s)
  211. 21.0 rad/s ≈ 201 RPM
  212. 应根据真实电机规格设置
  213. PD 控制器刚度(比例增益)
  214. 25.0 = 中等刚度
  215. 更大的值 = 更硬(快速响应但可能震荡)
  216. 更小的值 = 更软(缓慢响应但更稳定)
  217. PD 控制器阻尼(微分增益)
  218. 0.5 = 轻度阻尼
  219. 用于减少震荡,提供平滑运动
  220. 摩擦力系数
  221. 0.0 = 无摩擦(理想情况)
  222. 可以设置为 0.1-0.5 来模拟真实摩擦
  223. 5.2.2 步骤 2: 创建任务配置
  224. 理解并行环境与 Interactive Scene
  225. {ENVREGEXNS} 魔法变量:实现自动克隆的关键
  226. 你写的配置
  227. Isaac Lab 自动替换(假设创建 4 个环境)
  228. 环境 0: primpath="/World/envs/env0/Robot"
  229. 环境 1: primpath="/World/envs/env1/Robot"
  230. 环境 2: primpath="/World/envs/env2/Robot"
  231. 环境 3: primpath="/World/envs/env3/Robot"
  232. Copyright (c) 2024-2025 Your Name
  233. SPDX-License-Identifier: Apache-2.0
  234. ============================================================
  235. 导入必要的模块
  236. ============================================================
  237. 定义崎岖地形环境配置类
  238. ============================================================
  239. 使用 @configclass 装饰器标记这是一个配置类
  240. ========== 定义关键链接名称 ==========
  241. 这些名称必须与 USD 文件中的链接名称匹配
  242. ========== 定义关节名称列表 ==========
  243. 四足机器人的 12 个关节(4 条腿 × 3 个关节/腿)
  244. FR = 右前腿,FL = 左前腿,RR = 右后腿,RL = 左后腿
  245. ========== 调用父类的初始化 ==========
  246. 必须先调用父类初始化,加载默认配置
  247. ========== 场景配置 ==========
  248. 设置机器人资产
  249. replace() 创建配置的副本并修改 prim_path
  250. {ENVREGEXNS} 会被替换为 env0, env1, ... env_N
  251. 配置高度扫描器的位置(用于检测地形高度)
  252. 安装在机器人基座上
  253. ========== 观察空间配置 ==========
  254. 调整观察值的缩放,使其在合适的范围内
  255. 基座线速度缩放
  256. 2.0 = 放大 2 倍,使网络更容易学习速度信息
  257. 基座角速度缩放
  258. 0.25 = 缩小到 1/4,因为角速度通常比线速度大
  259. 关节位置和速度缩放
  260. 指定观察的关节
  261. ========== 动作空间配置 ==========
  262. 减小动作缩放,使控制更精细
  263. hip 关节使用更小的缩放(0.125)
  264. 其他关节使用 0.25
  265. 动作裁剪范围
  266. 指定控制的关节
  267. ========== 奖励权重配置 ==========
  268. 调整各项奖励的权重,平衡不同目标
  269. 根部惩罚
  270. 关节惩罚
  271. ========== 命令范围配置 ==========
  272. 定义训练时随机生成的目标速度范围
  273. 根据机器人的能力调整这些范围
  274. Copyright (c) 2024-2025 Your Name
  275. SPDX-License-Identifier: Apache-2.0
  276. ============================================================
  277. 导入必要的模块
  278. ============================================================
  279. ============================================================
  280. 定义平地环境配置类
  281. ============================================================
  282. 使用 @configclass 装饰器标记这是一个配置类
  283. ========== 调用父类的初始化 ==========
  284. 先执行 Rough 配置的所有设置
  285. ========== 修改地形为平地 ==========
  286. "plane" = 平坦的无限平面
  287. 禁用地形生成器(不需要生成崎岖地形)
  288. ========== 禁用高度扫描器 ==========
  289. 平地不需要扫描地形高度
  290. 从观察空间中移除高度扫描数据
  291. ========== 禁用地形课程学习 ==========
  292. 平地不需要课程学习
  293. ========== 调整奖励配置 ==========
  294. 在平地上,可以启用基座高度奖励
  295. 将传感器配置设为 None(使用真实高度而非扫描高度)
  296. ========== 自动禁用权重为 0 的奖励 ==========
  297. 如果是 MyRobotFlatEnvCfg 类(而非子类),
  298. 自动禁用所有权重为 0 的奖励项以提高性能
  299. 5.2.3 步骤 3: 配置训练参数
  300. Copyright (c) 2024-2025 Your Name
  301. SPDX-License-Identifier: Apache-2.0
  302. ============================================================
  303. 导入必要的模块
  304. ============================================================
  305. 定义崎岖地形环境的 PPO 训练配置(基础配置)
  306. ============================================================
  307. 使用 @configclass 装饰器标记这是一个配置类
  308. ========== 训练器基本参数 ==========
  309. 每个环境的采样步数
  310. 24 = 每次收集 24 步数据后进行一次策略更新
  311. 总样本数 = numstepsper_env × 环境数量
  312. 例如:24 × 4096 = 98,304 个样本/次更新
  313. 最大训练迭代次数
  314. 20000 = 训练 20000 次策略更新(崎岖地形需要更多训练)
  315. 总训练步数 = maxiterations × numstepsperenv × 环境数量
  316. 例如:20000 × 24 × 4096 ≈ 1.97B 步
  317. 模型保存间隔
  318. 100 = 每 100 次迭代保存一次模型检查点
  319. 实验名称
  320. 用于组织日志和保存的模型
  321. 格式:logs/rslrl/{experimentname}/{timestamp}/
  322. ========== Actor-Critic 神经网络配置 ==========
  323. 初始化噪声标准差
  324. 1.0 = 在训练初期为动作添加较大噪声,促进探索
  325. 随着训练进行,噪声会逐渐减小
  326. Actor 观察归一化
  327. False = 不对 actor 的输入观察进行归一化
  328. 如果观察已经在环境中缩放过,通常设为 False
  329. Critic 观察归一化
  330. False = 不对 critic 的输入观察进行归一化
  331. Actor(策略网络)隐藏层维度
  332. [512, 256, 128] = 三层隐藏层,从 512 逐渐降到 128
  333. 输入:观察空间 → 512 → 256 → 128 → 输出:动作空间
  334. 更大的网络 = 更强的表达能力,但训练更慢
  335. Critic(价值网络)隐藏层维度
  336. 通常与 Actor 保持相同或相似的结构
  337. 输入:观察空间 → 512 → 256 → 128 → 输出:状态价值
  338. 激活函数
  339. "elu" = Exponential Linear Unit,比 ReLU 更平滑
  340. 其他选项:"relu", "tanh", "leaky_relu"
  341. ========== PPO 算法超参数配置 ==========
  342. 价值损失系数
  343. 1.0 = 价值损失和策略损失同等重要
  344. totalloss = policyloss + valuelosscoef × valueloss - entropycoef × entropy
  345. 是否使用截断的价值损失
  346. True = 使用 PPO 的 clipped value loss,更稳定
  347. False = 使用普通的 MSE loss
  348. PPO 截断参数(epsilon)
  349. 0.2 = 限制策略更新幅度在 [1-0.2, 1+0.2] = [0.8, 1.2]
  350. 防止策略更新过大导致性能崩溃
  351. 较小的值 (0.1) = 更保守的更新
  352. 较大的值 (0.3) = 更激进的更新
  353. 熵正则化系数
  354. 0.01 = 鼓励策略保持一定随机性,促进探索
  355. 较大的值 (0.1) = 更多探索
  356. 较小的值 (0.001) = 更少探索,更确定的策略
  357. 每次更新的学习轮数
  358. 5 = 每次收集数据后,用这批数据训练 5 个 epoch
  359. 更多轮次 = 更充分利用数据,但可能过拟合
  360. Mini-batch 数量
  361. 4 = 将收集的数据分成 4 个 mini-batch 进行训练
  362. batchsize = (numenvs × numstepsperenv) / nummini_batches
  363. 例如:(4096 × 24) / 4 = 24,576
  364. 学习率
  365. 1.0e-3 = 0.001,Adam 优化器的学习率
  366. 较大的值 (1e-2) = 更快学习,但可能不稳定
  367. 较小的值 (1e-4) = 更稳定,但学习较慢
  368. 学习率调度策略
  369. "adaptive" = 根据 KL 散度自动调整学习率
  370. "linear" = 线性衰减
  371. "constant" = 保持不变
  372. 折扣因子(gamma)
  373. 0.99 = 非常重视未来奖励
  374. 决定了算法的"远见"程度
  375. 较大 (0.999) = 更长远的规划
  376. 较小 (0.9) = 更注重短期奖励
  377. GAE lambda 参数
  378. 0.95 = 在偏差和方差之间取得平衡
  379. 用于计算优势函数(Advantage function)
  380. 较大 (0.99) = 更低偏差,更高方差
  381. 较小 (0.9) = 更高偏差,更低方差
  382. 期望的 KL 散度
  383. 0.01 = 当 KL 散度超过此值时,降低学习率
  384. KL 散度衡量新旧策略的差异
  385. 用于自适应学习率调度
  386. 梯度裁剪阈值
  387. 1.0 = 当梯度范数超过 1.0 时进行裁剪
  388. 防止梯度爆炸,提高训练稳定性
  389. ============================================================
  390. 定义平地环境的 PPO 训练配置(继承自 Rough)
  391. ============================================================
  392. 使用 @configclass 装饰器标记这是一个配置类
  393. ========== 调用父类的初始化 ==========
  394. 先执行 Rough 配置的所有设置
  395. ========== 修改训练迭代次数 ==========
  396. 减少迭代次数
  397. 5000 = 平地环境更简单,不需要太多训练
  398. 相比 Rough 的 20000 次,减少了 75%
  399. ========== 修改实验名称 ==========
  400. 5.2.4 步骤 4: 注册环境
  401. Copyright (c) 2024-2025 Your Name
  402. SPDX-License-Identifier: Apache-2.0
  403. ============================================================
  404. 导入必要的模块
  405. ============================================================
  406. ============================================================
  407. 注册 Gym 环境
  408. ============================================================
  409. ========== 注册平地环境 ==========
  410. 环境 ID(唯一标识符)
  411. 命名规则:项目名 - 仿真器 - 任务 - 地形 - 机器人 - 版本
  412. 例如:RobotLab-Isaac-Velocity-Flat-My-Robot-v0
  413. 入口点:指定环境类的位置
  414. "isaaclab.envs:ManagerBasedRLEnv" 表示:
  415. - 模块:isaaclab.envs
  416. - 类:ManagerBasedRLEnv(基于管理器的强化学习环境)
  417. 禁用环境检查器
  418. True = 跳过 Gymnasium 的环境合规性检查
  419. Isaac Lab 环境已经过充分测试,跳过检查可以加快启动速度
  420. 关键字参数:传递给环境构造函数的参数
  421. ========== 环境配置入口点 ==========
  422. name = 当前模块名(如:robotlab.tasks....config.myrobot)
  423. f"{name}.flatenvcfg" = robotlab....myrobot.flatenvcfg
  424. :MyRobotFlatEnvCfg = 导入该模块中的 MyRobotFlatEnvCfg 类
  425. 格式:模块路径:类名
  426. 这样可以延迟导入(lazy import),提高启动速度
  427. ========== RSL-RL 训练配置入口点 ==========
  428. agents.name = agents 子模块的名称
  429. 指向我们定义的 PPO 训练配置类
  430. 训练脚本会使用这个配置来初始化 RSL-RL 训练器
  431. ========== CusRL 训练配置入口点(可选)==========
  432. 如果你实现了 CusRL 配置,可以添加这个入口点
  433. CusRL 是一个实验性的强化学习框架
  434. "cusrlcfgentrypoint": f"{agents.name}.cusrlppo_cfg:MyRobotFlatTrainerCfg",
  435. 环境 ID(包含 "Rough" 表示崎岖地形)
  436. 使用相同的环境类
  437. 禁用环境检查器
  438. 指向崎岖地形的配置
  439. 崎岖地形的环境配置
  440. 使用 MyRobotRoughEnvCfg(启用程序化地形生成)
  441. 崎岖地形的 RSL-RL 训练配置
  442. 使用 MyRobotRoughPPORunnerCfg(更多迭代次数)
  443. 崎岖地形的 CusRL 训练配置(可选)
  444. "cusrlcfgentrypoint": f"{agents.name}.cusrlppo_cfg:MyRobotRoughTrainerCfg",
  445. 使用方法
  446. ============================================================
  447. 注册后,可以通过以下方式创建环境:
  448. 1. 在 Python 代码中:
  449. import gymnasium as gym
  450. env = gym.make("RobotLab-Isaac-Velocity-Flat-My-Robot-v0")
  451. 2. 使用命令行训练(RSL-RL):
  452. python scripts/reinforcementlearning/rslrl/train.py \
  453. --task=RobotLab-Isaac-Velocity-Flat-My-Robot-v0
  454. 3. 使用命令行训练(CusRL,如果实现了):
  455. python scripts/reinforcement_learning/cusrl/train.py \
  456. --task=RobotLab-Isaac-Velocity-Flat-My-Robot-v0
  457. 5.2.5 步骤 5: 验证和训练
  458. 验证环境已注册
  459. 开始训练
  460. 调优技巧
  461. 6. 常见问题
  462. 6.1 安装问题
  463. 6.2 训练问题
  464. 6.3 仿真问题
  465. 6.4 部署问题
  466. 6.5 Pylance 找不到模块
  467. 6.6 清理 USD 缓存
  468. 清理所有 USD 缓存
  469. 清理特定日期的缓存
  470. 7. 参考链接
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 高校 AIGC 检测新规解读:AI 率合格标准与应对策略
  • 微软发布 AutoDev AI 程序员,自主完成软件工程任务性能提升 30%
  • Seedance 2.0 重构 AIGC 工作流:语义理解与映射热更新实践
  • JavaScript 金额计算精度丢失与分摊方案
  • 前端实现 HTTPS 强制跳转与移动端域名自动适配
  • RabbitMQ 分布式系统实战:从安装部署到 C++ 调用
  • Flutter pathfinding 组件在 OpenHarmony 上的适配实战
  • 亲历者讲述程序员过度工作导致精神崩溃的原因
  • ik_llama.cpp 混合 GPU/CPU 推理与智能张量覆盖策略
  • IntelliJ IDEA 与 VS Code Git 标准操作规范
  • 解决 IDEA 运行 Maven 时出现的 JAVA_TOOL_OPTIONS 编码警告
  • 圣光艺苑:基于 Stable Diffusion 的鎏金画框艺术生成工具
  • 中文类 LLaMA 大语言模型资源整理与对比
  • OpenClaw 架构解析:从认知到行动的 AI 智能体实现
  • 面试高频缓存算法:LRU 与 LFU 原理及实现
  • Python 高性能编程中的缓存策略与实战
  • 华为 OD 技术面试真题:MySQL 核心原理与架构
  • 华为 OD 机试:停车场收入统计
  • 单核 CPU 可抢占优先级任务调度算法解析
  • AI 大模型行业应用面临的问题与挑战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online