基于 tron1-rl-isaaclab · Isaac Lab · RSL-RL · PPO

双足机器人
强化学习训练
解析

给定速度指令 (vx, vy, ωz),在 Isaac Lab 仿真器中训练 Tron1 机器人跟随该速度行走。本文拆解训练系统的每个核心要素。

4096
并行环境
48
观测维度
15,000
训练迭代
50Hz
控制频率
Tron1 SoleFoot bipedal robot
Tron1 · SoleFoot (SF_TRON1A)
by LimX Dynamics
强化学习训练循环↻ 重复 15,000 次迭代
速度指令(vx, vy, ωz)
策略网络Actor MLP
关节动作6~8 DOF
仿真环境Isaac Lab
奖励信号r_t
更新策略PPO
向下滚动开始阅读
§ 0

强化学习基础

在看训练流程之前,先搞清楚几个核心概念。每个卡片都有一个直觉类比——先理解类比,再看定义。

🐕
强化学习是什么?
类比: 训狗类比
🧠
策略网络是什么?
类比: 象棋棋谱类比
🏆
奖励函数是什么?
类比: 成绩单类比
🖥️
仿真器是什么?
类比: 飞行模拟器类比
🌉
Sim-to-Real 是什么难题?
类比: 室内篮球转露天球场
⚙️
PPO 算法是什么?
类比: 骑自行车调整类比
§ 1

任务定义

Tron1 是 LimX Dynamics 的双足机器人,有三种足型变体。目标:给定速度指令,训练出能跟随行走的控制策略。

三种足型对比 — 点击切换

SoleFoot

SF_TRON1A

面足,有踝关节,支撑面积大,稳定性好,最常用的训练配置

关节列表
abad_Labad_Rhip_Lhip_Rknee_Lknee_R

仓库结构 — 每个目录对应一个 RL 概念

策略网络
仿真环境
观测/奖励
训练脚本
tron1-rl-isaaclab/
├── exts/bipedal_locomotion/Isaac Lab 扩展包,环境定义主体
│ ├── assets/机器人 USD 模型 + 物理配置
│ ├── tasks/locomotion/agents/PPO 超参数 + 网络结构配置
│ ├── tasks/locomotion/cfg/PF / SF / WF 基础环境配置
│ ├── tasks/locomotion/mdp/观测、奖励、事件函数定义
│ ├── tasks/locomotion/robots/具体任务配置 (Flat/Rough/Stairs)
│ └── utils/wrappers/RSL-RL 接口封装 + ONNX 导出
├── rsl_rl/PPO 算法实现 (Actor-Critic, Runner)
└── scripts/rsl_rl/训练入口
├── train.py推理 + 模型导出入口
└── play.py
Isaac Lab物理仿真器
RSL-RL训练框架
PPORL 算法
PyTorch深度学习
§ 2

训练循环

点击任意节点查看详细参数。一次迭代 = 收集 98,304 个样本 → PPO 更新 20 次。

obs [48]actionreward + next_obs批满更新策略权重终止检测(碰地/超时)仿真环境Isaac Lab · 4096 envs策略网络Actor MLP [512→256→128]Rollout Buffer4096 × 24 stepsPPO 更新5 epochs × 4 mini-batch模型存档每 500 iter → .pt / ONNX↻ 每次迭代 ≈ 98,304 样本 → 20 次梯度更新

数据维度追踪

obs_history:[4096, 10, 48]→ Encoder →[4096, 3]
obs:[4096, 48]
commands:[4096, 3]
actor_in:[4096, 54]→ Actor MLP →action [4096, 6~8]

关键参数速查

参数含义
num_envs4096并行仿真环境数量
num_steps_per_env24每次收集多少步再更新
max_iterations15000总训练迭代次数 (SF)
num_learning_epochs5每批数据重复学习次数
num_mini_batches4每次更新切分的小批数
sim.dt0.005s物理仿真步长
decimation4控制频率 = 1 / (dt × 4) = 50Hz
save_interval500每隔多少次迭代保存
§ 3

仿真环境

环境定义了机器人的“世界”:场景、地形、随机化扰动和终止条件。

场景组成

scene.robot
Articulation
物理机器人本体,受 PD 控制
scene.terrain
TerrainImporter
地形网格,支持多种地形类型
scene.contact_forces
ContactSensor
足部接触力传感器
scene.height_scanner
RayCaster
向下打射线扫描地形高度(Rough/Stairs 启用)

地形类型 — 从易到难

Flat平地(基础)SFBlindFlatEnvCfg

最简单的起点配置,关闭 curriculum,机器人在完全平坦地面上学走路。

高度扫描器 Curriculum

Domain Randomization

仿真与实机之间存在不可避免的偏差(sim-to-real gap)。随机化让策略在“参数分布”上训练,而非在“单一参数点”过拟合,在实机上也能泛化。

base_mass
−1 ~ +2 kg
link_mass
× 0.8 ~ 1.2
inertia
× 0.8 ~ 1.2
friction
μ: 0.4 ~ 1.2
stiffness/damping
Kp: 32~48, Kd: 2~3
center_of_mass
±7.5cm X, ±5cm Y/Z
push_robot
±500N, 0.2% 概率/步
reset_joints
± 0.5× 默认值

终止条件

time_out
超过 max_episode_length = 20s
💥
base_contact
躯干 base_Link 接触地面 (F > 1N)
§ 4

观测与动作

策略网络的输入(观测向量)和输出(动作)。hover 观测段查看详情。

Policy 观测向量32

hover 各段查看详情
3
3
3
6
6
6
3
hover 上方色块查看详情

观测历史 → Encoder → Latent

obs_history
[4096, 10, 48]
MLP Encoder
[256 → 128]
latent z
[4096, 3]
output_detach=TrueEncoder 梯度与 PPO 解耦,避免策略更新干扰历史编码学习,训练更稳定。历史序列让 Encoder 隐式学会从关节角/速度变化中估计机身速度(无直接速度传感器)。

Policy obs vs Critic obs

动作空间

输出 = 各关节目标位置偏移量,实际目标 = default_pos + action × 0.25 rad
abad_L_Jointabad_R_Jointhip_L_Jointhip_R_Jointknee_L_Jointknee_R_Joint+ wheel_L/R (WF only)
控制模式:PD 位置控制,Kp(刚度)和 Kd(阻尼)在物理配置中定义,随机化范围 Kp: 32~48, Kd: 2~3
§ 5

奖励函数

奖励函数定义了机器人“想要做什么”。点击任意项查看公式和调参说明。

设计思路

主目标
线速度跟踪
角速度跟踪
+
+ 行为塑造
存活
步态节律
+
+ 消除副作用
15 个惩罚项
+
= 自然步态
稳定、节能
可泛化

GaitReward 原理:冯·米塞斯分布

步态奖励用周期函数描述“期望接触状态”,在 stance 相期望脚在地,swing 相期望脚抬起:

frequency
1.5 ~ 2.5 Hz
步频,控制迈步速度
offset
0.5
两腿相位差 = 对步行走
duration
0.5
每步 stance 占空比
swing_height
0.1 ~ 0.2m
抬腿高度
§ 6

策略网络与算法

点击网络中的任意节点查看详情。Actor 和 Critic 共享 Encoder,但梯度路径不同。

网络结构图 — 点击节点
训练时数据流Actor 路径Critic 路径(仅训练)obs_history[4096, 10, 48]MLP Encoder480 → 256 → 128 → 3latent z[4096, 3]obs + commands[4096, 51]actor_in[4096, 54]Actor MLP54 → 512 → 256 → 128action[4096, 6~8]critic_in[4096, 54+N]Critic MLP→ 512 → 256 → 128V(s)[4096, 1]

PPO 超参数 — 点击查看调参影响

参数作用
clip_param0.2信任域约束
entropy_coef0.01探索鼓励
num_learning_epochs5数据重用次数
num_mini_batches4batch 切割数
learning_rate1e-3(自适应)梯度下降步长
gamma0.99折扣因子
lam0.95GAE λ,偏差-方差权衡
desired_kl0.01目标 KL 散度
value_loss_coef1.0Critic 损失权重
max_grad_norm1.0梯度裁剪

训练 → 部署

训练
model_N.pt
ONNX 导出
policy.onnx
encoder.onnx
实机控制
50Hz 循环
推理时:obs_history → encoder → latent z,obs + commands + z → policy → action,50Hz 发送关节目标位置。
附录

快速上手

常用命令和文件查找速查。

常用命令

平地训练(SF,最常用)
export ROBOT_TYPE=SF
python scripts/rsl_rl/train.py \
  --task LimX-SF-TRON1A-Flat-v0 \
  --num_envs 4096
断点续训
python scripts/rsl_rl/train.py \
  --task LimX-SF-TRON1A-Flat-v0 \
  --resume \
  --checkpoint_path logs/rsl_rl/.../model_1000.pt
低显存快速验证
python scripts/rsl_rl/train.py \
  --task LimX-SF-TRON1A-Flat-v0 \
  --num_envs 256 \
  --max_iterations 300
运行已训练策略
export ROBOT_TYPE=SF
python scripts/rsl_rl/play.py \
  --task LimX-SF-TRON1A-Flat-PLAY-v0 \
  --num_envs 32

任务名称速查

足型地形--task 参数
SF平地(盲走)LimX-SF-TRON1A-Flat-v0
SF崎岖(盲走)LimX-SF-TRON1A-BlindRough-v0
SF楼梯(盲走)LimX-SF-TRON1A-BlindStair-v0
PF平地(盲走)LimX-PF-TRON1A-Flat-v0
WF平地(盲走)LimX-WF-TRON1A-Flat-v0

关键文件索引

想改什么找哪个文件
改奖励权重tasks/locomotion/robots/limx_solefoot_env_cfg.py
改网络结构tasks/locomotion/agents/limx_rsl_rl_ppo_cfg.py
改 PPO 超参tasks/locomotion/agents/limx_rsl_rl_ppo_cfg.py
改观测定义tasks/locomotion/mdp/observations.py
改奖励函数实现tasks/locomotion/mdp/rewards.py
改地形配置tasks/locomotion/cfg/SF/terrains_cfg.py
改随机化事件tasks/locomotion/mdp/events.py
训练入口scripts/rsl_rl/train.py
推理 + 导出scripts/rsl_rl/play.py
基于 limxdynamics/tron1-rl-isaaclab · Isaac Lab · RSL-RL · PPO