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

人形机器人运控部署框架解析:RSL-RL 与 Unitree RL Gym 源码解读

梳理了人形机器人运动控制中经典的强化学习框架 RSL-RL。重点解析了其核心组件 Runner、Algorithm 和 Network 的结构设计,深入剖析 PPO 算法在 ppo.py 中的具体实现,包括初始化、环境步处理、回报计算及策略更新逻辑。同时探讨了 Actor-Critic 网络的不同变体,如 Transformer、CNN 及循环神经网络架构,为基于 PyTorch 的强化学习部署提供工程参考。

SqlMaster发布于 2026/3/15更新于 2026/7/1739 浏览
人形机器人运控部署框架解析:RSL-RL 与 Unitree RL Gym 源码解读

前言

在人形机器人运动控制领域,强化学习(RL)已成为核心方案之一。而将算法落地到仿真或真机,则是一个完整的工程体系。其中,经典强化学习框架 RSL-RL 因其模块化设计和高效性,被广泛引用和复用。

本文将系统梳理 RSL-RL 的架构设计,并深入其 PPO 算法实现细节,同时对比分析宇树开源的 unitree_rl_gym 及 unitree_sdk2_python 在部署中的角色,帮助开发者理解从算法训练到工程部署的关键路径。

RSL-RL 框架架构概览

RSL-RL 主要包含三大组件:Runners、Algorithms 和 Networks。

文章配图

  • Runner:管理环境步进和智能体学习的调度器,如 on_policy_runner.py。
  • Networks:供算法使用的网络结构,包括 MLP、Transformer 等变体。
  • Algorithms:具体的强化学习算法实现,目前主要支持 PPO 和类似 DAgger 的 BC 算法。

此外,框架还封装了环境接口(env)和模型模块(modules),支持多种输入数据格式,如关节状态、深度图像等。

代码结构

rsl_rl/
├── config/          # 配置文件
├── algorithms/      # 强化学习算法实现,如 PPO
├── env/             # 环境封装
├── modules/         # 模型组件
│   ├── actor_critic.py       # 基础 Actor-Critic 网络
│   ├── actor_critic_recurrent.py # 循环神经网络版
│   └── ... 
├── runners/         # 训练运行器
├── storage/         # 数据存储
└── utils/           # 工具函数

这个模块定义了强化学习的核心组件,包括不同版本的 Actor-Critic 网络架构、PPO 算法实现以及训练运行器。

PPO 算法核心实现

RSL-RL 的核心在于 algorithms/ppo.py。这里实现了近端策略优化(Proximal Policy Optimization)算法。

初始化配置

构造函数接收网络模型及一系列超参数,如学习周期、小批量数量、裁剪参数、折扣因子等。

import torch
import torch.nn as nn
import torch.optim as optim
from rsl_rl.modules import ActorCriticTransformer
from rsl_rl.storage import RolloutStorage

class PPO:
    def __init__(self,
                 actor_critic,
                 num_learning_epochs=1,
                 num_mini_batches=,
                 clip_param=,
                 gamma=,
                 lam=,
                 value_loss_coef=,
                 entropy_coef=,
                 learning_rate=,
                 max_grad_norm=,
                 use_clipped_value_loss=,
                 schedule=,
                 desired_kl=,
                 device=):
        .device = device
        .desired_kl = desired_kl
        .schedule = schedule
        .learning_rate = learning_rate
        
        .storage = 
        .optimizer = optim.Adam(actor_critic.parameters(), lr=.learning_rate)
1
0.2
0.998
0.95
1.0
0.0
1e-3
1.0
True
"fixed"
0.01
'cpu'
self
self
self
self
# 初始化存储器和优化器
self
None
self
self

这里需要注意 KL 散度惩罚项的设置,用于自适应调整学习率,防止策略更新过大导致训练不稳定。

环境交互与数据收集

智能体与环境交互是训练的基础。act 方法负责根据当前观察计算动作,process_env_step 处理环境反馈。

def act(self, obs, critic_obs):
    if self.actor_critic.is_recurrent:
        self.transition.hidden_states = self.actor_critic.get_hidden_states()
    
    # 计算动作分布
    self.transition.actions = self.actor_critic.act(obs).detach()
    self.transition.values = self.actor_critic.evaluate(critic_obs).detach()
    self.transition.actions_log_prob = self.actor_critic.get_actions_log_prob(self.transition.actions).detach()
    return self.transition.actions

def process_env_step(self, rewards, dones, infos):
    self.transition.rewards = rewards.clone()
    self.transition.dones = dones
    
    # 超时引导 (Bootstrapping on time outs)
    if 'time_outs' in infos:
        self.transition.rewards += self.gamma * torch.squeeze(
            self.transition.values * infos['time_outs'].unsqueeze(1).to(self.device), 1
        )
    
    self.storage.add_transitions(self.transition)
    self.transition.clear()

这里的'超时引导'非常关键。如果一个 episode 因达到时间限制而非失败状态结束,会将最后一步的估计价值加到奖励中,避免智能体受到不公平的惩罚。

回报计算与优势估计

收集足够数据后,调用 compute_returns 计算回报和 GAE 优势。

def compute_returns(self, last_critic_obs):
    last_values = self.actor_critic.evaluate(last_critic_obs).detach()
    self.storage.compute_returns(last_values, self.gamma, self.lam)

GAE(广义优势估计)结合了不同时间步长的价值估计,有效减少了方差。对于全长为 T 的轨迹,优势函数通常基于 TD-error 并结合 MC 方法。

策略更新

这是训练的核心循环。遍历 mini-batch,计算损失并更新参数。

def update(self):
    mean_value_loss = 0
    mean_surrogate_loss = 0
    
    # 选择生成器
    if self.actor_critic.is_recurrent:
        generator = self.storage.reccurent_mini_batch_generator(...)
    else:
        generator = self.storage.mini_batch_generator(...)

    for (obs_batch, actions_batch, advantages_batch, ...) in generator:
        # 计算重要性采样比率
        ratio = torch.exp(actions_log_prob_batch - torch.squeeze(old_actions_log_prob_batch))
        
        # 代理损失 (Surrogate Loss)
        surrogate = -torch.squeeze(advantages_batch) * ratio
        surrogate_clipped = -torch.squeeze(advantages_batch) * torch.clamp(
            ratio, 1.0 - self.clip_param, 1.0 + self.clip_param
        )
        surrogate_loss = torch.max(surrogate, surrogate_clipped).mean()
        
        # 价值损失 (Value Function Loss)
        if self.use_clipped_value_loss:
            value_clipped = target_values_batch + (value_batch - target_values_batch).clamp(
                -self.clip_param, self.clip_param
            )
            value_loss = torch.max(
                (value_batch - returns_batch).pow(2),
                (value_clipped - returns_batch).pow(2)
            ).mean()
        else:
            value_loss = (returns_batch - value_batch).pow(2).mean()
        
        # 总损失与梯度更新
        loss = surrogate_loss + self.value_loss_coef * value_loss - self.entropy_coef * entropy_batch.mean()
        
        self.optimizer.zero_grad()
        loss.backward()
        nn.utils.clip_grad_norm_(self.actor_critic.parameters(), self.max_grad_norm)
        self.optimizer.step()

自适应学习率机制

如果启用了自适应学习率 (schedule == "adaptive"),会根据 KL 散度动态调整。

if self.desired_kl is not None and self.schedule == "adaptive":
    with torch.inference_mode():
        kl = torch.sum(torch.log(sigma_batch / old_sigma_batch + 1.0e-5) + ...
    kl_mean = torch.mean(kl)
    
    if kl_mean > self.desired_kl * 2.0:
        self.learning_rate = max(1e-5, self.learning_rate / 1.5)
    elif kl_mean < self.desired_kl / 2.0 and kl_mean > 0.0:
        self.learning_rate = min(1e-2, self.learning_rate * 1.5)

当策略变化过大(KL 散度高)时降低学习率,反之则提高,这是一种典型的自适应 KL 惩罚过程。

网络架构变体

RSL-RL 支持多种 Actor-Critic 网络实现,以适应不同的观测空间。

Transformer 架构

针对序列数据,可以使用基于 BERT 风格的 Transformer 模型。

class Transformer(nn.Module):
    def __init__(self, input_dim, output_dim, context_len, latent_dim=128, num_head=4, num_layer=4):
        super().__init__()
        self.input_layer = nn.Sequential(nn.Linear(input_dim, latent_dim), nn.Dropout(0.1))
        self.weight_pos_embed = nn.Embedding(context_len, latent_dim)
        self.attention_blocks = nn.Sequential(*[
            Transformer_Block(latent_dim, num_head, 0.1) for _ in range(num_layer)
        ])
        self.output_layer = nn.Sequential(nn.LayerNorm(latent_dim), nn.Linear(latent_dim, output_dim))

    def forward(self, x):
        x = self.input_layer(x)
        x = x + self.weight_pos_embed(torch.arange(x.shape[1], device=x.device))
        x = self.attention_blocks(x)
        x = x[:, -1, :]
        return self.output_layer(x)

基础 MLP 架构

对于常规状态输入,标准的 MLP 依然高效。

class ActorCritic(nn.Module):
    def __init__(self, num_actor_obs, num_critic_obs, num_actions, ...):
        super().__init__()
        activation = get_activation('elu')
        
        # Policy Network
        actor_layers = []
        actor_layers.append(nn.Linear(mlp_input_dim_a, actor_hidden_dims[0]))
        actor_layers.append(activation)
        # ... 构建多层感知机 ...
        self.actor = nn.Sequential(*actor_layers)
        
        # Value Network
        critic_layers = []
        critic_layers.append(nn.Linear(mlp_input_dim_c, critic_hidden_dims[0]))
        critic_layers.append(activation)
        # ... 构建价值网络 ...
        self.critic = nn.Sequential(*critic_layers)

总结

RSL-RL 通过清晰的模块化设计,降低了强化学习在机器人控制领域的部署门槛。从 PPO 算法的稳定性保障(如裁剪、KL 惩罚),到网络结构的灵活性(Transformer、CNN、RNN),都为开发者提供了坚实的工程基础。在实际应用中,结合 Unitree SDK 等硬件接口,可快速完成从仿真到真机的闭环验证。

目录

  1. 前言
  2. RSL-RL 框架架构概览
  3. 代码结构
  4. PPO 算法核心实现
  5. 初始化配置
  6. 环境交互与数据收集
  7. 回报计算与优势估计
  8. 策略更新
  9. 自适应学习率机制
  10. 网络架构变体
  11. Transformer 架构
  12. 基础 MLP 架构
  13. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Spatial Joy 2025 全球 AR&AI 开发大赛参赛指南与资源详解
  • WebSocket 实战:基于 Spring Boot 构建实时通信系统
  • 企业级供应商管理系统开发实践与技术选型总结
  • MySQL 核心原理与性能优化实战指南
  • Elasticsearch + Kibana 实战指南:从安装部署到 C++ 客户端封装
  • Python 经典面试题与核心知识点详解
  • DeepSeek-R1-Distill-Llama-8B 本地部署与 Docker Compose 服务化
  • AIGC 时代如何利用 DeepSeek 辅助孩子系统学习编程
  • 大模型应用开发指南:LangChain 核心概念与实战解析
  • Git 版本控制核心原理与常用操作指南
  • Flutter 鸿蒙版 WalletConnect 集成:Web3 钱包连接与签名实战
  • AI 绘画风格融合技术指南与参数配置
  • AI 编程工具深度对比:Trae、Cursor、Copilot 与 Windsurf
  • 基于 C++11 手写前端 Promise 实现
  • 基于Realsense相机的机器人动态避障与路径优化实战
  • C语言结构体、共用体与链表基础
  • C++ 红黑树原理与实现详解
  • Flutter for OpenHarmony 通义万相 AIGC 联调与相册持久化
  • 基于 Claude MCP 协议的智能体落地示例
  • Meta 提出多 token 模型训练新方法,有望提升生成速度与智能性

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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