跳到主要内容
基于 Isaac Lab 的 Robot Lab 机器人强化学习实战指南 | 极客日志
Python AI 算法
基于 Isaac Lab 的 Robot Lab 机器人强化学习实战指南 基于 Isaac Lab 的 Robot Lab 库提供标准化机器人强化学习训练环境。内容涵盖环境搭建、支持的四足与人形机器人列表、快速训练与测试流程。深入解析并行环境原理、配置文件结构(Rough/Flat)、多 GPU 训练及自定义机器人添加步骤。包含奖励函数设计、超参数调优技巧及常见部署问题解决方案,辅助实现从仿真到实物的策略迁移。
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 删除选中的物体
视野操作 类型 键位 效果 视野操作 鼠标左键点击目标 + 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-v0ANYbotics Unitree Go2 RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0Unitree Unitree B2 RobotLab-Isaac-Velocity-Rough-Unitree-B2-v0Unitree Unitree A1 RobotLab-Isaac-Velocity-Rough-Unitree-A1-v0Unitree Deeprobotics Lite3 RobotLab-Isaac-Velocity-Rough-Deeprobotics-Lite3-v0Deeprobotics Zsibot ZSL1 RobotLab-Isaac-Velocity-Rough-Zsibot-ZSL1-v0Zsibot MagicLab Dog RobotLab-Isaac-Velocity-Rough-MagicLab-Dog-v0MagicLab
2.2 轮式机器人 (Wheeled) 机器人 环境 ID 制造商 Unitree Go2W RobotLab-Isaac-Velocity-Rough-Unitree-Go2W-v0Unitree Unitree B2W RobotLab-Isaac-Velocity-Rough-Unitree-B2W-v0Unitree Deeprobotics M20 RobotLab-Isaac-Velocity-Rough-Deeprobotics-M20-v0Deeprobotics DDTRobot Tita RobotLab-Isaac-Velocity-Rough-DDTRobot-Tita-v0DDTRobot Zsibot ZSL1W RobotLab-Isaac-Velocity-Rough-Zsibot-ZSL1W-v0Zsibot MagicLab Dog-W RobotLab-Isaac-Velocity-Rough-MagicLab-Dog-W-v0MagicLab
2.3 人形机器人 (Humanoid) 机器人 环境 ID 制造商 Unitree G1 RobotLab-Isaac-Velocity-Rough-Unitree-G1-v0Unitree Unitree H1 RobotLab-Isaac-Velocity-Rough-Unitree-H1-v0Unitree FFTAI GR1T1 RobotLab-Isaac-Velocity-Rough-FFTAI-GR1T1-v0FFTAI FFTAI GR1T2 RobotLab-Isaac-Velocity-Rough-FFTAI-GR1T2-v0FFTAI Booster T1 RobotLab-Isaac-Velocity-Rough-Booster-T1-v0Booster RobotEra Xbot RobotLab-Isaac-Velocity-Rough-RobotEra-Xbot-v0RobotEra Openloong Loong RobotLab-Isaac-Velocity-Rough-Openloong-Loong-v0Openloong RoboParty ATOM01 RobotLab-Isaac-Velocity-Rough-RoboParty-ATOM01-v0RoboParty MagicLab Bot-Gen1 RobotLab-Isaac-Velocity-Rough-MagicLab-Bot-Gen1-v0MagicLab MagicLab Bot-Z1 RobotLab-Isaac-Velocity-Rough-MagicLab-Bot-Z1-v0MagicLab
提示 : 所有环境都支持 Rough(崎岖地形)和 Flat(平地)两种地形配置
3. 环境准备
3.1 步骤 1: 安装 Isaac Lab
3.2 步骤 2: 安装 Robot Lab
cd ~
git clone https://github.com/fan-ziqi/robot_lab.git
cd robot_lab
conda activate isaaclab
python -m pip install -e source /robot_lab
python scripts/tools/list_envs.py
深入理解:安装配置详解 当你运行 python -m pip install -e source/robot_lab 时,实际上是在执行一个可编辑模式安装 (editable install)。让我们深入分析安装过程中涉及的关键配置文件。
setup.py - 安装脚本 source/robot_lab/setup.py 是 Python 包的安装脚本,负责定义包的元数据和依赖关系:
"""Installation script for the 'robot_lab' python package."""
import os
import toml
from setuptools import setup
EXTENSION_PATH = os.path.dirname(os.path.realpath(__file__))
EXTENSION_TOML_DATA = toml.load(os.path.join(
EXTENSION_PATH,
"config" ,
"extension.toml"
))
INSTALL_REQUIRES=[
"psutil" ,
"colorama" ,
"xacrodoc" ,
"numpy" ,
"pandas" ,
"pinocchio" ,
"cusrl[all]" ,
]
setup(
name="robot_lab" ,
packages=["robot_lab" ],
author=EXTENSION_TOML_DATA["package" ]["author" ],
maintainer=EXTENSION_TOML_DATA["package" ]["maintainer" ],
url=EXTENSION_TOML_DATA["package" ]["repository" ],
version=EXTENSION_TOML_DATA["package" ]["version" ],
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 ,
python_requires=">=3.10" ,
classifiers=[
"Natural Language :: English" ,
"Programming Language :: Python :: 3.10" ,
"Programming Language :: Python :: 3.11" ,
"Isaac Sim :: 4.5.0" ,
"Isaac Sim :: 5.0.0" ,
"Isaac Sim :: 5.1.0" ,
],
zip_safe=False ,
)
配置项 说明 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
基于 C++ 实现,性能极高
支持 URDF、USD 等多种格式
提供正向/逆向运动学、动力学计算
在 BeyondMimic 中用于将人类动作映射到机器人
强化学习框架 包名 版本要求 用途 安装大小 cusrl[all] 最新 自定义强化学习框架 提供 PPO、SAC 等算法实现 ~10 MB
# [all] 会安装以下所有可选依赖:
# - torch # PyTorch 深度学习框架(通常已由 Isaac Lab 安装)
# - tensorboard # 训练可视化
# - wandb # 实验跟踪(可选)
# - gym # 环境接口(已被 gymnasium 替代)
3. 快速开始
3.1 示例 1: 训练四足机器人(Unitree Go2)
3.1.1 训练
conda activate isaaclab
cd ~/robot_lab
python scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \
--headless \
--num_envs 4096
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 监控训练 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 录制视频
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 模仿策略学习
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
python scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-BeyondMimic-Flat-Unitree-G1-v0 \
--headless
python scripts/reinforcement_learning/rsl_rl/play.py \
--task=RobotLab-Isaac-BeyondMimic-Flat-Unitree-G1-v0 \
--num_envs 2
3.3 示例 3: AMP 舞蹈动作学习 对抗性运动先验(AMP)可以学习更自然的运动模式。
python scripts/reinforcement_learning/skrl/train.py \
--task=RobotLab-Isaac-G1-AMP-Dance-Direct-v0 \
--algorithm AMP \
--headless
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 单机多卡
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 多机多卡 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
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 对称性数据增强
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 教师 - 学生蒸馏
python scripts/reinforcement_learning/rsl_rl/train.py \
--task=RobotLab-Isaac-Velocity-Flat-Anymal-D-v0 \
--headless \
--run_name=teacher
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
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 特技动作训练
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
│ ├── 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_path="/path/to/my_robot.usd" ,
activate_contact_sensors=True ,
rigid_props=sim_utils.RigidBodyPropertiesCfg(
disable_gravity=False ,
retain_accelerations=False ,
linear_damping=0.0 ,
angular_damping=0.0 ,
max_linear_velocity=1000.0 ,
max_angular_velocity=1000.0 ,
max_depenetration_velocity=1.0 ,
),
articulation_props=sim_utils.ArticulationRootPropertiesCfg(
enabled_self_collisions=False ,
solver_position_iteration_count=4 ,
solver_velocity_iteration_count=0 ,
),
),
init_state=ArticulationCfg.InitialStateCfg(
pos=(0.0 , 0.0 , 0.6 ),
joint_pos={
".*_hip_joint" : 0.0 ,
".*_thigh_joint" : 0.7 ,
".*_calf_joint" : -1.4 ,
},
joint_vel={".*" : 0.0 },
),
actuators={
"legs" : DCMotorCfg(
joint_names_expr=[".*_hip_joint" , ".*_thigh_joint" , ".*_calf_joint" ],
effort_limit=33.5 ,
saturation_effort=33.5 ,
velocity_limit=21.0 ,
stiffness=25.0 ,
damping=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 是 Isaac Lab 提供的场景管理器,它的核心功能是:
定义一次,自动克隆 :你只需定义一次场景配置(包括机器人、地面、传感器等),Scene 会自动将这些资产复制到成千上万个环境中
智能命名 :每个环境都有独立的命名空间(namespace),确保不同环境的物体互不干扰
并行仿真 :所有环境同时运行,充分利用 GPU 的并行计算能力
{ENV_REGEX_NS} 魔法变量:实现自动克隆的关键在配置文件中,你会频繁看到 {ENV_REGEX_NS} 这个特殊的占位符。这是 Isaac Lab 中最重要的概念之一。
当你写下 prim_path="{ENV_REGEX_NS}/Robot" 时,Isaac Lab 会在创建环境时自动将它替换为每个环境的唯一路径:
prim_path="{ENV_REGEX_NS}/Robot"
资产类型 是否需要 {ENV_REGEX_NS} 原因 机器人 ✅ 必须使用 每个环境的机器人需要独立控制、独立状态(位置、速度、关节角度) 传感器 (如高度扫描器)✅ 必须使用 每个环境的传感器需要独立读取数据 地面 ❌ 不需要 所有环境共享同一个无限大的平面 灯光 ❌ 不需要 所有环境共享同一个光源
/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 (包含完整配置):
from isaaclab.utils import configclass
from robot_lab.assets import MY_ROBOT_CFG
from robot_lab.tasks.manager_based.locomotion.velocity.velocity_env_cfg import (
LocomotionVelocityRoughEnvCfg,
)
@configclass
class MyRobotRoughEnvCfg (LocomotionVelocityRoughEnvCfg ):
"""
自定义机器人的崎岖地形速度跟踪环境配置
继承自 LocomotionVelocityRoughEnvCfg 基类
注意:在 Robot Lab 中,Rough 配置是基础配置,包含所有功能
Flat 配置继承自 Rough,然后禁用一些不需要的功能
"""
base_link_name = "base"
foot_link_name = ".*_foot"
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__()
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
self .observations.policy.base_lin_vel.scale = 2.0
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
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
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
self .rewards.ang_vel_xy_l2.weight = -0.05
self .rewards.flat_orientation_l2.weight = 0
self .rewards.base_height_l2.weight = 0
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 )
self .commands.base_velocity.ranges.lin_vel_y = (-0.5 , 0.5 )
self .commands.base_velocity.ranges.ang_vel_z = (-1.0 , 1.0 )
然后创建 flat_env_cfg.py (继承 rough 并禁用某些功能):
from isaaclab.utils import configclass
from .rough_env_cfg import MyRobotRoughEnvCfg
@configclass
class MyRobotFlatEnvCfg (MyRobotRoughEnvCfg ):
"""
自定义机器人的平地速度跟踪环境配置
继承自 MyRobotRoughEnvCfg,禁用崎岖地形相关功能
在 Robot Lab 中,Flat 配置通过继承 Rough 配置,
然后禁用不需要的功能(如地形生成器、高度扫描器等)
"""
def __post_init__ (self ):
"""
后初始化方法,在配置对象创建后自动调用
禁用 Rough 环境中的地形相关功能
"""
super ().__post_init__()
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
self .rewards.base_height_l2.params["sensor_cfg" ] = None
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:
from isaaclab.utils import configclass
from isaaclab_rl.rsl_rl import (
RslRlOnPolicyRunnerCfg,
RslRlPpoActorCriticCfg,
RslRlPpoAlgorithmCfg,
)
@configclass
class MyRobotRoughPPORunnerCfg (RslRlOnPolicyRunnerCfg ):
"""
自定义机器人崎岖地形环境的 PPO 训练器配置
注意:与环境配置一致,Rough 配置是基础配置
Flat 配置继承自 Rough 配置
"""
num_steps_per_env = 24
max_iterations = 20000
save_interval = 100
experiment_name = "my_robot_rough"
policy = RslRlPpoActorCriticCfg(
init_noise_std=1.0 ,
actor_obs_normalization=False ,
critic_obs_normalization=False ,
actor_hidden_dims=[512 , 256 , 128 ],
critic_hidden_dims=[512 , 256 , 128 ],
activation="elu" ,
)
algorithm = RslRlPpoAlgorithmCfg(
value_loss_coef=1.0 ,
use_clipped_value_loss=True ,
clip_param=0.2 ,
entropy_coef=0.01 ,
num_learning_epochs=5 ,
num_mini_batches=4 ,
learning_rate=1.0e-3 ,
schedule="adaptive" ,
gamma=0.99 ,
lam=0.95 ,
desired_kl=0.01 ,
max_grad_norm=1.0 ,
)
@configclass
class MyRobotFlatPPORunnerCfg (MyRobotRoughPPORunnerCfg ):
"""
平地环境的训练配置
继承自 MyRobotRoughPPORunnerCfg,只修改迭代次数和实验名称
与环境配置的继承关系保持一致:
- Rough 是基础配置(包含所有参数)
- Flat 继承并修改部分参数
"""
def __post_init__ (self ):
"""
后初始化方法,在配置对象创建后自动调用
修改平地环境特定的参数
"""
super ().__post_init__()
self .max_iterations = 5000
self .experiment_name = "my_robot_flat"
RslRlOnPolicyRunnerCfg (RSL-RL 基类)
↑
│ 继承
│
MyRobotRoughPPORunnerCfg (完整配置:所有超参数)
↑
│ 继承并修改部分参数
│
MyRobotFlatPPORunnerCfg (简化配置:更少迭代次数)
与环境配置一致 :Rough 是基础,Flat 是简化
代码复用 :避免重复定义相同的超参数
易于维护 :修改共同参数只需改 Rough 配置
符合项目规范 :与 robot_lab 中所有机器人的配置方式一致
5.2.4 步骤 4: 注册环境 在 config/my_robot/__init__.py 注册环境:
import gymnasium as gym
from . import agents
gym.register(
id ="RobotLab-Isaac-Velocity-Flat-My-Robot-v0" ,
entry_point="isaaclab.envs:ManagerBasedRLEnv" ,
disable_env_checker=True ,
kwargs={
"env_cfg_entry_point" : f"{__name__} .flat_env_cfg:MyRobotFlatEnvCfg" ,
"rsl_rl_cfg_entry_point" : f"{agents.__name__} .rsl_rl_ppo_cfg:MyRobotFlatPPORunnerCfg" ,
},
)
gym.register(
id ="RobotLab-Isaac-Velocity-Rough-My-Robot-v0" ,
entry_point="isaaclab.envs:ManagerBasedRLEnv" ,
disable_env_checker=True ,
kwargs={
"env_cfg_entry_point" : f"{__name__} .rough_env_cfg:MyRobotRoughEnvCfg" ,
"rsl_rl_cfg_entry_point" : f"{agents.__name__} .rsl_rl_ppo_cfg:MyRobotRoughPPORunnerCfg" ,
},
)
在 Robot Lab 中,通常先注册 Flat 环境,再注册 Rough 环境。这是因为:
Flat 环境更简单,适合初期测试
用户通常先在平地训练,再迁移到崎岖地形
保持与项目其他机器人配置的一致性
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
调优技巧
观察空间调整
增加关键传感器信息(IMU、关节状态)
使用历史缓冲提供时序信息
适当的归一化和缩放
奖励函数设计
平衡任务目标(速度跟踪)和约束(能耗、稳定性)
使用指数奖励处理非线性目标
避免奖励稀疏或过于密集
超参数调整
根据任务复杂度调整网络大小
增加环境数量加速训练(受 GPU 限制)
调整学习率和 PPO clip 范围
域随机化
添加质量、摩擦力、电机参数的随机化
模拟传感器噪声
提升 Sim2Real 迁移性能
6. 常见问题
6.1 安装问题 A: 确保已正确安装 Isaac Sim,并设置环境变量:
export ISAAC_SIM_PATH="/path/to/isaac-sim"
A: 尝试升级 pip 和 setuptools:
python -m pip install --upgrade pip setuptools wheel
python -m pip install -e source /robot_lab
6.2 训练问题 python scripts/reinforcement_learning/rsl_rl/train.py \
--task=<ENV_NAME> \
--num_envs 1024
使用无头模式(--headless)
增加并行环境数
使用更强的 GPU
检查 CPU 瓶颈(增加 worker 数量)
奖励函数设计不合理
超参数需要调整
观察空间不足
任务过于复杂(尝试简化任务)
6.3 仿真问题 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 ,
),
6.4 部署问题
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 缓存
rm -rf /tmp/IsaacLab/usd_*
rm -rf /tmp/IsaacLab/usd_2024*
7. 参考链接 相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online