智元 D1 强化学习sim-to-real系列 | Robot Lab 基于 Isaac Lab 的机器人强化学习使用(四)

智元 D1 强化学习sim-to-real系列 | Robot Lab 基于 Isaac Lab 的机器人强化学习使用(四)

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)。其核心任务是构建和模拟一个精确、逼真的虚拟环境,包括机器人模型、传感器数据和物理交互。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到强化学习训练: 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_envs4096# 或者使用 GUI 模式(适合本地开发) python scripts/reinforcement_learning/rsl_rl/train.py \--task=RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \--num_envs512

参数说明:

  • --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_envs64# 使用键盘控制单个机器人 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_envs1\--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_envs4\--video\--video_length200

视频保存在 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_fps60\--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_envs2

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_envs32

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 装饰器标记这是一个配置类classMyRobotRoughEnvCfg(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 装饰器classMyRobotFlatEnvCfg(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 装饰器标记这是一个配置类classMyRobotRoughPPORunnerCfg(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 装饰器classMyRobotFlatPPORunnerCfg(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-v0id="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,并设置环境变量:

exportISAAC_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_envs1024# 从 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. 参考链接

Read more

医疗AI多智能体资源调度:用Python构建高性能MCU资源池

医疗AI多智能体资源调度:用Python构建高性能MCU资源池

作者 | Allen_lyb 发布时间 | 2026年1月 标签 | #Python #异步编程 #医疗AI #资源调度 #系统架构 引言 最近在重构我们的医疗AI服务平台时,遇到了一个典型的多智能体资源争用问题。想象一下这样的场景: * 急诊风险预警智能体检测到患者可能发生脓毒症,需要立即调用GPU进行推理 * 同时,影像分析智能体正在处理一批CT扫描,也需要GPU资源 * 质控智能体要分析医嘱合规性,需要调用大语言模型接口 * 病历总结智能体正在为出院患者生成报告 所有智能体都在"抢"有限的GPU卡、模型并发槽位、API调用额度。如果让每个智能体自己管理资源抢占,结果就是: 1. 资源利用不均:有的GPU卡空闲,有的被排队挤爆 2. 优先级混乱:急诊任务可能被常规任务阻塞 3. 无法审计:谁占用了什么资源?为什么失败?说不清楚 这就是我们需要一个中央调度器的原因。在多方会议系统中,这类组件被称为MCU(多点控制单元)

要成为AI的主人,而不是被它所绑架

要成为AI的主人,而不是被它所绑架

这两年,AI 编码工具确实给开发效率带来了很大提升。写脚本更快了,补测试更轻松了,搭原型更顺手了,连很多文档工作都被大幅压缩。笔者自己在持续使用 GPT-5.4 和 Claude 一段时间后,也真切感受到了这种效率红利。与此同时,随着使用越来越深入,笔者也开始经常在架构师论坛和技术社区里,围绕 AI 开发的安全性、保密性、稳定性、可控性等问题,与多位大厂架构师持续交流。讨论得越多、实践得越久,我越认同一个判断:小项目、低敏项目、单人维护项目,AI 基本没有大问题;但一旦进入多人协作、长期演进、涉及核心资产和生产责任的项目,AI 如果没有边界、规范和审计,就很容易从“效率工具”变成“失控放大器”。 很多人讨论 AI,还停留在“能不能更快把功能做出来”这个层面。但架构师的关注点从来不只是“能不能开发出来”,而是“

Obsidian AI Agent 配置指南:Claudian + Obsidian

Obsidian AI Agent 配置指南:Claudian + Obsidian Skills 📋 概述 Claudian 是一个将 Claude Code 集成到 Obsidian 的第三方插件,配合 Obsidian Skills 可以在 Obsidian 中获得强大的 AI 能力。 核心组件 组件说明ClaudianObsidian 第三方插件,适配 Claude Code API,提供 AI 聊天界面Obsidian Skills由 Obsidian CEO (Kepano) 发布的 Skill 包,赋予 AI 处理 Canvas、Markdown、Bases 等能力 🚀 快速开始 环境要求 * ✅ 已安装