rsl_rl 是由 ETH Zurich 与 NVIDIA 联合开发的开源强化学习训练框架,专为机器人仿真(尤其是足式机器人)中的大规模向量化环境而设计。它基于 PyTorch 构建,以 PPO(Proximal Policy Optimization) 为核心算法,同时集成了 AMP(Adversarial Motion Prior)对抗动作先验、策略蒸馏(Distillation)、RND 随机网络蒸馏探索、对称性增强等高级训练特性。对于刚接触机器人强化学习的开发者而言,rsl_rl 的最大价值在于:它提供了一套经过工业验证的模块化架构,让你可以用极少的胶水代码,将自定义的向量化仿真环境接入到生产级的训练管线中。
Sources: init.py
为什么需要 rsl_rl
在机器人仿真领域,一个典型的训练任务往往需要同时并行运行数千个环境实例来收集经验。与通用的强化学习库不同,rsl_rl 从设计之初就围绕 向量化环境(Vectorized Environment) 这一前提展开。它通过 TensorDict 统一观测数据的表达,通过 RolloutStorage 高效管理并行轨迹,并通过 Runner 将环境交互、策略更新、日志记录编排为清晰的训练循环。这意味着你无需从零实现优势估计、小批量采样、学习率调度、多 GPU 同步等繁琐机制,可以将精力集中在环境设计与奖励塑造上。
Sources: env/vec_env.py, storage/rollout_storage.py, runners/on_policy_runner.py
架构全景与模块职责
rsl_rl 的代码库按职责划分为六个核心层级。最底层是网络基元(networks/),向上依次是策略模块(modules/)、算法实现(algorithms/)、数据存储(storage/)、训练运行器(runners/),最外层则是环境抽象(env/)与工具(utils/)。这种分层设计保证了你可以单独替换某一层的实现——例如用自定义的 CNN 替换默认的 MLP 观测编码器,或在不改变训练循环的前提下切换 PPO 与 AMP 算法。
flowchart TB
subgraph 外部接口层
E[VecEnv<br/>向量化环境接口]
U[Logger / WandB / Neptune<br/>日志与监控]
end
subgraph 编排层
R[OnPolicyRunner / AMPRunner / DistillationRunner<br/>训练运行器]
end
subgraph 算法层
A[PPO / PPOAMP / Distillation<br/>核心算法]
end
subgraph 策略与数据层
M[ActorCritic / RND / StudentTeacher / AMPDiscriminator<br/>策略与辅助模块]
S[RolloutStorage / CircularBuffer<br/>经验存储]
end
subgraph 网络基元层
N[MLP / CNN / AttnEncoder / Memory / Normalization<br/>网络组件]
end
E -->|obs, rewards, dones| R
R -->|actions| E
R -->|配置与调度| A
A -->|前向/反向传播| M
M -->|构建计算图| N
A -->|读写经验| S
R -->|记录指标| U
Sources: algorithms/init.py, modules/init.py, runners/on_policy_runner.py
核心能力矩阵
下表展示了 rsl_rl 目前支持的主要训练范式与特性,帮助你快速判断该框架是否匹配自己的研究或工程需求。
| 能力类别 | 具体特性 | 适用场景 |
|---|---|---|
| 基础算法 | PPO(Clipped Surrogate + GAE) | 通用 on-policy 强化学习 |
| 动作先验 | AMP / PPOAMP(GAN / LSGAN 判别器) | 模仿参考运动数据,生成自然步态 |
| 策略迁移 | Distillation(师生框架,MSE/Huber) | 将 privileged teacher 蒸馏为纯视觉 student |
| 网络架构 | MLP、CNN、Recurrent、Attention Encoder | 处理不同模态与记忆需求的观测 |
| 探索增强 | RND(随机网络蒸馏) | 稀疏奖励环境下的内在激励探索 |
| 先验约束 | Symmetry(数据增强 + 镜像损失) | 利用左右对称性提升样本效率 |
| 分布式 | 多 GPU 分布式训练(DDP) | 大规模集群训练加速 |
| 可观测性 | WandB / Neptune / 本地 TensorBoard | 实验追踪与超参对比 |
Sources: algorithms/ppo.py, algorithms/ppo_amp.py, algorithms/distillation.py, modules/rnd.py
典型训练循环的工作方式
理解 rsl_rl 的最佳切入点,是看清一次学习迭代中数据与控制流的完整路径。在 OnPolicyRunner.learn() 的驱动下,训练循环由两个交替阶段构成:Rollout 阶段(在推理模式下并行收集经验)和 Update 阶段(基于收集到的轨迹优化策略)。这种 on-policy 特性决定了策略每更新一次,旧的经验就会被丢弃,从而保证数据分布与当前策略的一致性。
sequenceDiagram
participant Runner as OnPolicyRunner
participant Env as VecEnv
participant Alg as PPO
participant Store as RolloutStorage
participant Logger as Logger
loop 每个学习迭代
Runner->>Alg: train_mode()
loop num_steps_per_env 次环境步
Runner->>Alg: act(obs)
Alg->>Store: 记录 transition
Runner->>Env: step(actions)
Env-->>Runner: obs, rewards, dones, extras
Runner->>Alg: process_env_step(...)
Alg->>Store: add_transition()
Runner->>Logger: process_env_step(rewards, dones)
end
Runner->>Alg: compute_returns(last_obs)
Alg->>Store: GAE 计算 + advantage 归一化
Runner->>Alg: update()
Alg->>Store: mini_batch_generator()
Store-->>Alg: 小批量数据
Alg->>Alg: 反向传播 + 梯度裁剪 + 优化器步进
Alg-->>Runner: loss_dict
Runner->>Logger: log(it, loss_dict, lr, ...)
opt Runner: it % save_interval == 0
Runner->>Runner: save(model.pt)
end
end
Sources: runners/on_policy_runner.py, algorithms/ppo.py, storage/rollout_storage.py
模块化设计的扩展点
rsl_rl 对初学者友好的另一个原因,是它明确定义了若干可插拔的扩展点。你不需要深入修改核心训练循环,只需按照约定实现特定接口即可:
- 接入新环境:继承
VecEnv抽象类,实现get_observations()与step()两个方法,返回TensorDict形式的观测字典。环境配置通过cfg属性暴露给运行器。 - 替换策略网络:在
modules/中新建继承自ActorCritic的类,然后在配置文件的policy.class_name中指定完整类路径。运行器会通过resolve_callable动态解析并实例化。 - 引入新算法:继承
OnPolicyRunner并重写_construct_algorithm()与learn(),即可在保持环境交互与日志逻辑不变的前提下,替换核心优化目标。
Sources: env/vec_env.py, modules/actor_critic.py, utils/utils.py
从入门到精通的阅读路径
作为初学者,建议你按照以下顺序阅读本 Wiki,逐步从“跑通训练”过渡到“定制算法”:
- 快速开始与安装配置 —— 完成环境搭建,运行第一个训练脚本。
- 配置文件与参数体系 —— 理解 YAML/JSON 配置如何映射到代码中的各个模块。
- 向量化环境接入指南 —— 学习如何将 Isaac Gym、Isaac Sim 或自定义仿真后端接入 rsl_rl。
- PPO 算法实现与训练流程 —— 深入理解
PPO.act()、compute_returns()与update()的实现细节。 - Actor-Critic 基础架构设计 —— 掌握策略网络的结构、动作分布的构建与观测归一化机制。
当你完成上述五步后,即可根据实际需求深入 AMP 对抗动作先验、策略蒸馏 或 RND 探索 等高级主题。