基于 tron1-rl-isaaclab · Isaac Lab · RSL-RL · PPO
双足机器人
强化学习训练
解析
给定速度指令 (vx, vy, ωz),在 Isaac Lab 仿真器中训练 Tron1 机器人跟随该速度行走。本文拆解训练系统的每个核心要素。
4096
并行环境
48
观测维度
15,000
训练迭代
50Hz
控制频率

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_history:[4096, 10, 48]→ Encoder →[4096, 3]
obs:[4096, 48]
commands:[4096, 3]
actor_in:[4096, 54]→ Actor MLP →action [4096, 6~8]
关键参数速查
| 参数 | 值 | 含义 |
|---|---|---|
| num_envs | 4096 | 并行仿真环境数量 |
| num_steps_per_env | 24 | 每次收集多少步再更新 |
| max_iterations | 15000 | 总训练迭代次数 (SF) |
| num_learning_epochs | 5 | 每批数据重复学习次数 |
| num_mini_batches | 4 | 每次更新切分的小批数 |
| sim.dt | 0.005s | 物理仿真步长 |
| decimation | 4 | 控制频率 = 1 / (dt × 4) = 50Hz |
| save_interval | 500 | 每隔多少次迭代保存 |
§ 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/dampingKp: 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=True— Encoder 梯度与 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 相期望脚抬起:
frequency1.5 ~ 2.5 Hz
步频,控制迈步速度
offset0.5
两腿相位差 = 对步行走
duration0.5
每步 stance 占空比
swing_height0.1 ~ 0.2m
抬腿高度
§ 6
策略网络与算法
点击网络中的任意节点查看详情。Actor 和 Critic 共享 Encoder,但梯度路径不同。
网络结构图 — 点击节点
PPO 超参数 — 点击查看调参影响
| 参数 | 值 | 作用 | 调大的效果 |
|---|---|---|---|
| clip_param | 0.2 | 信任域约束 | 点击展开 |
| entropy_coef | 0.01 | 探索鼓励 | 点击展开 |
| num_learning_epochs | 5 | 数据重用次数 | 点击展开 |
| num_mini_batches | 4 | batch 切割数 | 点击展开 |
| learning_rate | 1e-3(自适应) | 梯度下降步长 | 点击展开 |
| gamma | 0.99 | 折扣因子 | 点击展开 |
| lam | 0.95 | GAE λ,偏差-方差权衡 | 点击展开 |
| desired_kl | 0.01 | 目标 KL 散度 | 点击展开 |
| value_loss_coef | 1.0 | Critic 损失权重 | 点击展开 |
| max_grad_norm | 1.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