unitree_rl_gym_新手教程_第5章_训练师手册
第 5 章:训练师手册 — 所有训练操作详解
这是你的训练操作速查手册。每个命令都会解释清楚:什么时候用、为什么这样写、注意什么。
5.1 训练前必做:激活环境
每次打开新终端,第一步永远是:
conda activate unitree_rl
cd /workspace_project/g1_robot/unitree_rl_gym_study/unitree_rl_gym
⚠️ 终端提示符必须显示
(unitree_rl)。如果显示(base),说明环境没切过来,后面的 pip/python 都会装错地方。
5.2 训练命令大全
5.2.1 基础训练
# 无头训练(推荐,速度快)
python legged_gym/scripts/train.py --task=g1 --headless --num_envs=512
# 有头训练(看过程,慢)
python legged_gym/scripts/train.py --task=g1 --num_envs=64
| 参数 | 作用 | RTX 4060 8GB 建议值 |
|---|---|---|
--task=g1 |
选机器人(g1/h1/h1_2/go2) | 必填 |
--headless |
不渲染窗口,纯计算 | 正式训练加上 |
--num_envs=N |
同时模拟 N 个机器人 | 无头 512 / 有头 64 |
--max_iterations=N |
跑 N 轮自动停 | 测试用 200,正式用 2000~10000 |
--seed=N |
随机种子(同样的种子=同样的结果) | 需要复现实验时指定 |
--run_name=xxx |
给这次训练起个名字 | 方便区分不同实验 |
--experiment_name=xxx |
实验组名 | 默认 g1,不改也行 |
自定义参数说明:
--task: 指定任务名称(默认 'go2')
--resume: 是否恢复训练
--experiment_name: 实验名称
--run_name: 运行名称
--load_run: 要加载的运行名称(-1 表示加载最后一个)
--checkpoint: 要加载的检查点编号(-1 表示加载最后一个)
--headless: 无头模式运行(不显示图形界面)
--horovod: 使用 horovod 进行多GPU训练
--rl_device: RL算法使用的设备(如 'cuda:0', 'cpu')
--num_envs: 环境数量
--seed: 随机种子
--max_iterations: 最大训练迭代次数
5.2.2 选对 num_envs:显存规则
RTX 4060 8GB 实测:
--num_envs=64 有头模式 ✅
--num_envs=128 有头模式 ❌ 会卡
--num_envs=512 无头模式 ✅
--num_envs=1024 无头模式 ⚠️ 可能OOM
经验:训练用无头 512 最快;想看过程就用有头 64,看完关掉换无头正式跑。
5.2.3 训练时你会看到的输出
Learning iteration 100/10000 ← 当前第 100 轮 / 总共 10000 轮
Computation: 15000 steps/s ← 每秒算 15000 步
Mean reward: 0.04 ← ★ 总奖励(最重要)
Mean episode length: 300 ← ★ 平均存活步数(越久越好)
Mean action noise std: 0.80 ← 探索噪声(慢慢变小 = AI 有把握了)
Value function loss: 0.0011 ← Critic 的预测误差
看两个数就够了:
Mean reward在涨 → AI 在进步Mean episode length在涨 → 越来越久不摔倒
5.3 停掉训练、接着跑
5.3.1 正常停止
在训练终端按 Ctrl+C。模型会自动保存当前最新的 checkpoint。
5.3.2 从上次停止的地方继续
# 继续最近一次训练
python legged_gym/scripts/train.py --task=g1 --headless --num_envs=512 --resume
# 从指定训练继续
python legged_gym/scripts/train.py --task=g1 --headless --num_envs=512 \
--resume --load_run=Jul26_21-25-34_
# 从指定轮数的模型继续(比如从第 3100 轮继续跑到 5000)
python legged_gym/scripts/train.py --task=g1 --headless --num_envs=512 \
--resume --load_run=Jul26_21-25-34_ --checkpoint=3100 --max_iterations=5000
| 参数 | 作用 |
|---|---|
--resume |
告诉程序"接着训,别从头来" |
--load_run=文件夹名 |
指定用哪次训练的模型(写文件夹名,不写完整路径) |
--checkpoint=N |
从第 N 轮的模型开始(不写就用最新的) |
--max_iterations=N |
新的目标轮数(要大于当前已跑的轮数) |
⚠️ 重要:
--load_run只写文件夹名,比如Jul26_21-25-34_,不要写logs/g1/Jul26_21-25-34_。
5.4 模型存在哪?
unitree_rl_gym/logs/g1/
├── Jul26_21-25-34_/ ← 一次训练 =
│ ├── model_0.pt ← 初始化模型
│ ├── model_50.pt ← 第 50 轮
│ ├── model_100.pt ← 第 100 轮
│ ├── ... 每 50 轮存一个
│ ├── model_3100.pt ← 你上次停在这
│ └── events.out.tfevents.xxx ← TensorBoard 数据文件
├── Jul26_20-56-14_/ ← 更早的训练
└── exported/ ← play.py 导出的 JIT 模型
| 知识点 | 说明 |
|---|---|
| 保存频率 | 每 50 轮 自动存一次 |
| 文件夹命名 | 月日_时-分-秒_(run_name 为空时) |
| 文件大小 | ~777KB 每个,不占空间 |
| 旧模型能删吗 | 可以,训练完了只保留最后一个和最好的 |
5.5 看训练结果
5.5.1 用 play.py 可视化
# 看最新训练的模型(1 个机器人)
python legged_gym/scripts/play.py --task=g1 --num_envs=1
# 看指定训练的指定轮数
python legged_gym/scripts/play.py --task=g1 --num_envs=1 \
--load_run=Jul26_21-25-34_ --checkpoint=3100
# 对比不同阶段(同一训练、不同轮数)
python legged_gym/scripts/play.py --task=g1 --num_envs=1 \
--load_run=Jul26_21-25-34_ --checkpoint=500 # 早期
python legged_gym/scripts/play.py --task=g1 --num_envs=1 \
--load_run=Jul26_21-25-34_ --checkpoint=1500 # 中期
python legged_gym/scripts/play.py --task=g1 --num_envs=1 \
--load_run=Jul26_21-25-34_ --checkpoint=3100 # 最新
窗口操作:
| 按键 | 功能 |
|---|---|
| ESC | 退出 |
| V | 切换视角追踪模式 |
| 鼠标左键拖拽 | 旋转视角 |
| 鼠标滚轮 | 缩放 |
| 鼠标中键拖拽 | 平移视角 |
5.5.2 play.py 的地形限制
play.py 默认用一个 5×5 的小地形,不是训练时的无限平面。G1 走到边界会被墙卡住。这是正常行为,看个十几步够判断策略效果就行。
5.6 用 TensorBoard 看训练曲线
5.6.1 启动
# 新终端
conda activate unitree_rl
cd /workspace_project/g1_robot/unitree_rl_gym_study/unitree_rl_gym
tensorboard --logdir=logs/g1/ --reload_interval=5
浏览器打开 http://localhost:6006
5.6.2 关键曲线速查
| 曲线名(SCALARS 页) | 好信号 | 坏信号 |
|---|---|---|
Train/mean_reward 或类似含 reward 的 |
📈 上升 | 📉 下降或完全不涨 |
Train/mean_episode_length |
📈 从 20 → 300+ | 📉 越跑越短 |
Policy/mean_noise_std |
📉 从 0.8 → 0.3 | 📈 反弹或卡在 0.8 |
Loss/value_function |
📉 稳步下降 | 📈 爆炸式上升 |
Episode/rew_alive |
📈 上升 | ➡️ 不涨(一直在摔) |
Episode/rew_base_height |
➡️ 接近 0 | 📉 越来越负(老摔) |
Episode/rew_tracking_lin_vel |
📈 上升 | 📉 不跟指令走 |
5.6.3 常见问题
曲线没动? → 检查 TensorBoard 启动时 --logdir 指向的文件夹是不是最新的训练目录。
报 protobuf 错误? → 降级过 protobuf 了(protobuf==3.20.3),不会再出现。
多个训练混在一起? → logs/g1/ 会显示所有训练记录。勾选左下角 Runs 面板中对应的训练来筛选。
5.7 训练实战流程
新手推荐的标准流程
第 1 步:跑一个测试看看链路通不通
python legged_gym/scripts/train.py --task=g1 --headless --num_envs=512 --max_iterations=200
第 2 步:看测试效果
python legged_gym/scripts/play.py --task=g1 --num_envs=1
→ 能站着不摔 = 正常
第 3 步:正式训练
python legged_gym/scripts/train.py --task=g1 --headless --num_envs=512 --max_iterations=2000
→ 约 30 分钟
第 4 步:观察中期效果
python legged_gym/scripts/play.py --task=g1 --num_envs=1
→ 能走几步了 = 方向正确
第 5 步:继续训练
python legged_gym/scripts/train.py --task=g1 --headless --num_envs=512 --resume --max_iterations=5000
→ 再接再厉
第 6 步:评估最终效果
python legged_gym/scripts/play.py --task=g1 --num_envs=1
→ 能稳定走不摔 = 达成目标
一次成功的训练长什么样
训练轮数 机器人行为
0-100 乱动、频繁摔倒、reward 很低
100-500 开始能站几秒了
500-1000 会迈步了但不稳
1000-2000 走路越来越稳、有点方向感
2000-4000 基本能走直线、偶尔摔倒
4000+ 走得流畅、很少摔倒
5.8 调参入门
5.8.1 能不能边跑边调?
不能。 必须停掉训练 → 改参数 → 重新启动。不存在"跑着跑着中途改一下"这种操作。
标准流程:
Ctrl+C 停训练 → 改参数 → 决定从头训还是接跑 → 重新启动
5.8.2 改了参数后,从头训还是接跑?
这个很重要,搞错了等于白训:
| 你改了什么 | 怎么重启 . | 为什么 |
|---|---|---|
奖励权重(rewards.scales) |
从头训 | 改变了"游戏规则",旧模型是按老规则练的,不能混用 |
action_scale、stiffness、damping |
从头训 | 改变了"行为方式",旧模型不会新玩法 |
域随机化(domain_rand) |
从头训 | 改变了"训练环境",旧模型没见过 |
只改 max_iterations |
可以接跑 | 只是说"再多跑几轮",模型本身没变 |
| 学习率、网络结构 | 从头训 | 改变了"学习方法",旧模型不适用 |
简单记法:改了配置文件(
g1_config.py)里的东西 → 从头训。只改命令行参数(max_iterations、num_envs)→ 可以接跑。(不推荐新手改参数后接着训练,其实微调也行,但要注意参数突变带来的震荡,极有可能导致训练失败)
5.8.3 实际操作演示
假设你觉得机器人抬脚不够高(拖地走),想加大 feet_swing_height 惩罚:
# 第 1 步:Ctrl+C 停掉正在跑的训练
# 第 2 步:打开配置文件
# legged_gym/envs/g1/g1_config.py
# 找到 feet_swing_height = -20.0
# 改成 feet_swing_height = -30.0 (更重的惩罚)
# 第 3 步:因为改了奖励(游戏规则变了),必须从头训
# 给这次实验起个名字,方便以后在 TensorBoard 里对比
python legged_gym/scripts/train.py --task=g1 --headless --num_envs=512 \
--max_iterations=500 --run_name=high_step_test
# 第 4 步:看效果
python legged_gym/scripts/play.py --task=g1 --num_envs=1 \
--load_run=<high_step_test的文件夹名>
5.8.4 对比新旧实验
这就是为什么调参原则里说 给每个实验起名字:
logs/g1/
├── Jul26_21-25-34_/ ← 默认参数,跑了 3100 轮
├── Jul27_10-30-15_high_step/ ← feet_swing_height = -30
└── Jul27_11-00-00_faster/ ← tracking_lin_vel = 2.0
TensorBoard 启动时会同时显示所有三个实验,你可以在左下角 Runs 面板里勾选两条叠在一起看同一张图表里谁更优。
5.8.5 什么时候该调
- 训了 500 轮 reward 完全不涨 → 可能学习率有问题
- 机器人走路抽搐 → 加大
action_rate惩罚的绝对值 - 总往一边歪 → 加大
orientation惩罚的绝对值 - 抬脚拖地 → 加大
feet_swing_height惩罚的绝对值 - 走得太慢 / 不走 → 加大
tracking_lin_vel奖励
5.8.6 调参原则
- 一次只改一个参数:改多个你没法判断是哪个起的作用
- 给每个实验起名字:
--run_name=test_faster,方便 TensorBoard 对比 - 先少跑几轮测试:改参数后先跑
--max_iterations=500,方向对了再正式跑 - 对比要公平:同样的随机种子、同样的训练轮数
- 记录你改了什么:开一个笔记记下:日期、改了哪个参数、从多少改成多少、效果怎样
5.9 命令速查卡
| 你想做什么 | 命令 |
|---|---|
| 从头训练 | train.py --task=g1 --headless --num_envs=512 |
| 测试 200 轮 | train.py --task=g1 --headless --num_envs=512 --max_iterations=200 |
| 接着上次跑 | train.py --task=g1 --headless --num_envs=512 --resume |
| 从第 N 轮接跑 | train.py --task=g1 --headless --num_envs=512 --resume --checkpoint=N |
| 有头看过程 | train.py --task=g1 --num_envs=64 |
| 看策略效果 | play.py --task=g1 --num_envs=1 |
| 看指定模型 | play.py --task=g1 --num_envs=1 --load_run=文件夹名 --checkpoint=N |
| 看训练曲线 | tensorboard --logdir=logs/g1/ → 浏览器 localhost:6006 |
| 列出模型文件 | ls -la logs/g1/文件夹名/ |
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)