第 3 章:动手实践 — 训练、查看、调试

开始真正跑模型!每个命令都会解释清楚。

3.1 每次工作前:激活环境

conda activate unitree_rl
cd /workspace_project/g1_robot/unitree_rl_gym_study/unitree_rl_gym

⚠️ 必须看到终端提示符显示 (unitree_rl)。如果显示 (base),说明没切过来。

3.2 开始训练

基础命令

python legged_gym/scripts/train.py --task=g1 --headless --num_envs=512
参数 含义 建议
--task=g1 训练 G1 机器人 必填,可选 go2/h1/h1_2
--headless 不弹窗口(训练快 30%) 训练时推荐加
--num_envs=512 同时 512 个环境 无头模式 512,有头模式 64
--seed=1 随机种子 不指定则用 1
--max_iterations=10000 训练轮数上限 先设 200 测试,确认无误再跑正式

RTX 4060 8GB 显存规则

模式 num_envs 说明
有头(看过程) 64 GUI 渲染吃显存,高了会卡
无头(--headless 512 释放渲染后 GPU 能跑满

训练时你会看到的输出

Learning iteration 100/10000
  Computation: 15000 steps/s (collection: 0.3s, learning: 0.07s)
  Value function loss: 0.0011        ← 价值函数损失(越小越好)
  Surrogate loss: -0.0221            ← 策略损失(不要管正负,看它变化)
  Mean action noise std: 0.80        ← 探索噪声(慢慢减小=网络变自信)
  Mean reward: 0.04                  ← ★ 最重要的是这个 —— 平均奖励
  Mean episode length: 300           ← ★ 机器人能活几步(越久越好)

看懂两个关键指标就够了:

  • Mean reward 持续上升 → 训练正常 ✅
  • Mean episode length 持续增长 → 机器人站得越来越久 ✅

什么时候停止训练?

  • reward 不再上升(收敛)→ 可以停了
  • 达到 max_iterations → 自动停
  • 显存爆了(OOM Error)→ 减少 --num_envs
  • episode_length 接近上限值(~1000 步 = 20 秒)→ 快要练好了

3.3 查看训练效果

方法 1:Isaac Gym 可视化

python legged_gym/scripts/play.py --task=g1 --load_run=<文件夹名>

会弹出一个窗口,显示 G1 在走路。不加 --load_run 则加载最近一次训练的模型。

键盘控制:ESC 退出,V 切换同步模式。

方法 2:TensorBoard(更推荐)

# 新开一个终端
tensorboard --logdir=logs/

然后在浏览器打开 http://localhost:6006,能看到:

图表 简要含义
mean_total_reward 总奖励;持续上升并趋于稳定,通常表示训练收敛
rew_tracking_lin_vel 线速度跟踪;越高表示越能按照指令行走
mean_episode_length 平均存活步数;越高通常表示步态越稳定
rew_lin_vel_z / rew_orientation 机身稳定性惩罚;负值绝对值越小越好
policy_loss / value_loss PPO 策略与价值网络损失;重点观察是否剧烈发散
entropy 策略探索程度;过快降到 0 可能表示探索不足

具体使用方法看:TensorBoard 使用教程

3.4 从上次中断继续训练

# 从上一次中断的位置继续
python legged_gym/scripts/train.py --task=g1 --headless --resume

# 从指定的 run 继续
python legged_gym/scripts/train.py --task=g1 --headless --resume --load_run=<文件夹名>

# 从第 500 轮的检查点继续
python legged_gym/scripts/train.py --task=g1 --headless --resume --checkpoint=500

模型检查点位置:logs/g1/<日期>_<run_name>/model_<迭代次数>.pt

3.5 常见调试场景

场景 1:训练半天 reward 不涨

可能原因和排查:

  1. 学习率太高/太低g1_config.pyalgorithm.learning_rate(默认 1e-3 一般OK)
  2. 探索不够 → 调大 policy.init_noise_std(默认 0.8)
  3. 奖励设计有问题 → 检查 rewards.scales 各项权重是否合理
  4. 域随机化太强 → 关掉试试,domain_rand.randomize_friction = False

场景 2:机器人学会了但走路抽搐

关节抖动 → 调大 rewards.scales.action_rate(变更负),惩罚动作变化。

场景 3:机器人总是前倾摔倒

  • 检查 default_joint_angles 是否合理(当前默认姿态应该微坐)
  • 增大 rewards.scales.orientation(更负的绝对值)
  • 增大 rewards.scales.base_height(更负的绝对值)

场景 4:显存不够-CUDA out of memory

# 无头:降低到 256
python legged_gym/scripts/train.py --task=g1 --headless --num_envs=256

# 有头:降低到 32
python legged_gym/scripts/train.py --task=g1 --num_envs=32

3.6 导出模型给 MuJoCo 验证(目标 2)

# 1. 用 play.py 导出 JIT 模型
python legged_gym/scripts/play.py --task=g1 --load_run=<文件夹名>

# play.py 默认导出到 logs/g1/exported/policies/

# 2. 用 MuJoCo 跑导出的模型
cd deploy/deploy_mujoco
python deploy_mujoco.py g1.yaml

这是学习目标 2(deploy_mujoco)的核心内容。详见 部署计划 - 目标 2

3.7 训练建议和技巧

新手推荐的实验顺序

  1. 先用默认配置跑 200 轮,看 reward 有没有增长趋势
  2. 看 TensorBoard,了解各项奖励的变化
  3. 调一个参数(比如 tracking_lin_vel 的权重),重新跑 200 轮对比
  4. 记录每次实验:改了哪个参数、效果怎样
  5. 积累经验:反复 3-4 次就能培养直觉

一次典型训练的时间线

0-100 轮:    机器人基本在乱动,频繁摔倒,reward 很低
100-500 轮:  开始能站几秒了,reward 上升
500-1000 轮: 开始迈步了但不太稳,episode length 达到几百步
1000-3000 轮:走得越来越稳,reward 接近收敛
3000-5000 轮:基本收敛,可以停了
5000-10000 轮:微调优化(如果还有上升空间就继续)

以上是经验估计,实际取决于你的奖励设计和硬件速度。256 环境 ~15k steps/s,1 轮 = 24×256=6144 steps,约 0.4 秒/轮,1000 轮约 7 分钟。

训练过程中不要做的事

  • ❌ 训练中不要开 GUI(会拖慢 30-50%),用 --headless + TensorBoard 看曲线就够了
  • ❌ 不要每跑几轮就改参数,让同一配置至少跑 500 轮再看效果
  • ❌ 不要同时训练和 Play(显存不够)

→ 下一章:04unitree_rl_gym新手教程第4章深入理解

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐