面向客户和初学者的完整实践指南
文档版本:1.0
适用系统:Ubuntu 22.04 LTS + NVIDIA GPU
适用项目:Unitree Go2 /
unitree_rl_gym文档验证日期:2026-08-05
本项目验证版本:Python 3.8、PyTorch 2.3.1、CUDA 12.1、Isaac Gym Preview 4、
rsl_rl v1.0.2
1. 这篇文章解决什么问题
本文以宇树 Go2 四足机器人为例,介绍如何从一台普通的 NVIDIA 显卡电脑开始,完成:
- 理解深度学习和深度强化学习的作用。
- 选择合适的训练电脑和操作系统。
- 安装可复现、相互隔离的软件环境。
- 在 Isaac Gym 中开展 Go2 策略训练。
- 使用训练曲线和仿真回放判断模型质量。
- 导出策略,并逐步进入 Sim2Sim 和真实机器人验证。
本文不假设读者具有人工智能或机器人专业背景。文中的命令可以直接在本项目目录执行。
需要特别说明:环境安装成功、仿真训练成功和真实机器人可安全运行,是三个不同阶段。 不能因为模型能在 Isaac Gym 中运行,就直接把它部署到真实 Go2。
给客户和初学者的核心结论:
- Go2 运动控制使用的是深度强化学习,它属于深度学习,但训练数据主要来自仿真试错。
- 一台配有 NVIDIA RTX 3060 6GB 的电脑可以入门和训练常规策略,12GB 以上显存更适合持续开发。
- 训练交付物不只是一个模型,还应包括任务配置、训练日志、评估结果和部署接口说明。
- 仿真模型在完成 Sim2Sim、安全控制和保护测试前,不能直接运行在真实 Go2 上。
- 新手推荐先完成行走和原地转向,再逐步开展抗扰动、复杂地形和高动态动作。
2. 什么是深度学习
传统程序通常由工程师明确编写规则。例如,当机器人向左倾斜时,增加哪些关节的力矩, 每个关节增加多少,都需要人工设计。
深度学习使用多层神经网络从数据中自动拟合输入和输出之间的关系。对于机器人控制, 神经网络可以把机器人当前状态映射成下一时刻的关节动作:
机器人状态 -> 神经网络策略 -> 关节动作
这里的机器人状态可以包含机身速度、姿态、关节角度和目标速度;输出则可以是关节位置、 关节速度或电机力矩。
3. 什么是深度强化学习
深度强化学习是深度学习的一种使用方式。它不要求人工为每一个状态准备正确答案,而是让 智能体在环境中反复尝试,根据奖励判断行为好坏。
以 Go2 学习行走为例:
- 走得接近目标速度,得到正奖励。
- 保持机身稳定,得到正奖励。
- 动作平滑、能耗较低,得到正奖励或较少惩罚。
- 摔倒、身体碰地或关节越界,得到惩罚并重新开始。
经过大量并行尝试,神经网络逐渐学会哪些关节动作更容易获得高奖励。本项目使用 PPO 算法训练策略网络。
3.1 常用名词
| 名词 | 初学者解释 |
|---|---|
| 环境 Environment | 机器人活动的仿真世界 |
| 智能体 Agent | 被训练的机器人和控制策略 |
| 观测 Observation | 策略能够读取的机器人状态 |
| 动作 Action | 策略输出的关节控制量 |
| 奖励 Reward | 对当前行为好坏的数值评价 |
| 回合 Episode | 从机器人初始化到摔倒或超时的一段过程 |
| 策略 Policy | 根据观测生成动作的神经网络 |
| 检查点 Checkpoint | 训练中定期保存的模型文件 |
| 推理 Inference | 使用训练好的模型计算动作,不再更新模型 |
| PPO | 常用于机器人控制的强化学习算法 |
| Sim2Sim | 把策略放到另一种仿真器中验证 |
| Sim2Real | 把仿真策略迁移到真实机器人 |
4. 为什么机器人项目需要深度强化学习
四足机器人的控制难点来自高维度、强耦合和频繁接触。Go2 有 12 个腿部关节,任意一个 关节动作都会影响机身姿态、足端接触和其他关节。地面碰撞、摩擦、打滑和电机响应又具有 明显的非线性,很难完全依靠手写规则覆盖。
深度强化学习的主要价值包括:
4.1 降低复杂动作的人工设计成本
工程师定义目标、约束和奖励后,算法可以在仿真中自动搜索动作组合。对于行走、转向、 抗扰动和复杂地形适应,这通常比逐关节调试状态机更高效。
4.2 在仿真中完成大规模试错
真实机器人无法承受数百万次摔倒。Isaac Gym 可以在一张 GPU 上并行运行数千台虚拟 机器人,让策略在不损坏硬件的情况下积累大量经验。
4.3 提高环境适应能力
训练时可以随机改变摩擦、机器人质量、初始状态、传感器噪声和外部推力。策略如果能在 这些条件下稳定工作,通常比只针对单一理想模型设计的控制器更有鲁棒性。
4.4 建立可复用的技能生产流程
同一套环境可以逐步开发站立、速度跟踪、原地转向、坡面行走和其他技能。每个策略都可以 保存、对比、回归测试和版本管理。
4.5 深度强化学习不能替代什么
深度强化学习不是一键生成真实机器人动作。它不能替代:
- 正确的机器人模型和电机参数。
- 明确且可测量的任务目标。
- 合理的奖励和终止条件。
- 传统安全控制、限位、急停和异常检测。
- Sim2Sim 与真实机器人测试流程。
- 工程师对失败案例的分析和迭代。
它的意义是提供一种自动优化复杂策略的工具,而不是取消机器人控制工程。
5. 完整工作流程
flowchart LR
A[确定动作目标] --> B[建立仿真任务]
B --> C[定义观测动作奖励]
C --> D[小规模可视化调试]
D --> E[GPU并行正式训练]
E --> F[曲线与检查点评估]
F --> G[Isaac Gym回放]
G --> H[Sim2Sim验证]
H --> I[安全状态机与保护]
I --> J[真实Go2低风险测试]
任何新动作都应按这个顺序推进。后面的阶段发现问题时,应回到任务配置或训练阶段修正, 不能跳过中间验证。
6. 训练前需要准备什么
6.1 硬件
必需硬件:
- x86_64 架构电脑。
- NVIDIA 独立显卡。
- 足够的系统内存和 SSD 空间。
- 稳定网络,用于下载 PyTorch、Isaac Gym 和 Python 依赖。
可选硬件:
- Go2 EDU 或其他允许底层开发的型号。
- 有线网卡,用于后续与机器人通信。
- 实机测试保护架、吊装装置和物理急停。
6.2 软件和账号
- Ubuntu 22.04 LTS。
- NVIDIA 显卡驱动。
- Git、curl 和基础编译工具。
- 本项目代码。
- NVIDIA Isaac Gym Preview 4。
- 需要实机部署时,再安装
unitree_sdk2_python。
6.3 开展项目前应明确的信息
- 要训练的是站立、行走、转向还是一个有限时长的特技动作。
- 动作成功的量化标准是什么。
- 策略只用于演示,还是最终要运行在真实机器人上。
- Go2 的具体型号、固件、关节参数和可用控制接口。
- 项目是否具备实机测试场地、保护架和安全负责人。
7. 推荐电脑配置
Isaac Gym 依赖 NVIDIA CUDA,因此不推荐使用 AMD 或 Intel 集成显卡作为训练设备。
| 档位 | CPU | 内存 | GPU | 磁盘 | 适用范围 |
|---|---|---|---|---|---|
| 入门验证 | 6 核以上 i5/Ryzen 5 | 16GB | RTX 2060/3060 6GB | 50GB 可用 | 安装、学习、小规模训练 |
| 推荐开发 | 8 核以上 i7/Ryzen 7 | 32GB | RTX 4070 12GB 或更高 | 100GB 可用 NVMe | 4096 环境、日常任务开发 |
| 专业训练 | 12 核以上 i9/Ryzen 9 | 64GB | RTX 4090 24GB 或同级 | 1TB NVMe | 更大环境、快速迭代、多任务 |
7.1 为什么显存重要
每个并行环境都会占用物理状态、接触信息、观测、动作和 PPO 采样缓存。显存越大,通常
可以同时运行越多机器人。显存不足时可能出现 CUDA out of memory,需要降低
--num_envs。
常见环境数建议:
| 显存 | 建议起始环境数 |
|---|---|
| 6GB | 1024 至 4096 |
| 8GB | 2048 至 4096 |
| 12GB | 4096 或更多 |
| 24GB | 4096 至 8192,仍需按任务验证 |
环境数不是越大越好。复杂地形、更多观测和更大的网络都会提高显存占用,必须通过短训练 实际验证。
7.2 本项目电脑的实测结果
本项目完成训练验证时的电脑配置:
- Ubuntu 22.04.5 LTS。
- Intel Core i7-12700H,20 个逻辑 CPU。
- 23.3GiB 系统内存。
- NVIDIA GeForce RTX 3060 Laptop,6GB 显存。
- NVIDIA 580.173.02 驱动。
- 安装后项目磁盘剩余约 81GiB。
实测 4096 个 Go2 环境完成 GPU PhysX 和 PPO 更新,吞吐约 74,000 至 79,000 steps/s。这台电脑可以完成 Go2 入门和常规策略训练。笔记本长时间训练时应连接电源、 开启性能模式并保证散热。
8. 软件环境为什么要隔离
Isaac Gym Preview 4 是较早发布的仿真框架,依赖 Python 3.8。当前 Ubuntu 系统和 ROS 2 通常使用 Python 3.10。如果把所有依赖安装到系统 Python,容易出现版本冲突、ROS 包被 错误加载或 Isaac Gym 动态库找不到等问题。
本项目采用项目内隔离:
.tools/miniconda3/ Miniconda 工具
.venv/unitree-rl/ Python 3.8 训练环境
third_party/isaacgym/ Isaac Gym Preview 4
third_party/rsl_rl/ PPO 算法库 v1.0.2
这些目录与系统 Python、ROS 2 和其他项目互不干扰。
9. 软件版本说明
| 组件 | 本项目版本 | 用途 |
|---|---|---|
| Ubuntu | 22.04 LTS | 操作系统 |
| NVIDIA Driver | 525 以上,验证时为 580.173.02 | 驱动 GPU |
| Python | 3.8.20 | Isaac Gym 兼容环境 |
| PyTorch | 2.3.1 + CUDA 12.1 | 神经网络训练和 GPU 计算 |
| Isaac Gym | Preview 4 / 1.0rc4 | GPU 并行物理仿真 |
| rsl_rl | v1.0.2 | PPO 强化学习实现 |
| MuJoCo | 3.2.3 | 后续 Sim2Sim 仿真工具 |
| unitree_rl_gym | 官方主分支 276801e |
Go2 环境和训练代码 |
安装 PyTorch 的 CUDA 运行库后,不要求系统单独安装 CUDA Toolkit 或 nvcc。NVIDIA
驱动需要支持 CUDA 12.1,较新的驱动通常向后兼容。
10. 安装前检查
打开终端,确认系统和 GPU:
lsb_release -a
nvidia-smi
free -h
df -h
正常情况下,nvidia-smi 应显示显卡名称、驱动版本和显存容量。若该命令失败,应先修复
驱动,再安装训练环境。
推荐至少保留 15GB 空闲空间,完整环境和下载缓存通常会占用 8GB 至 15GB。
11. 一键安装方法
先下载代码包:
git clone https://gitee.com/superCS/go2_deep_rl.git
本交付项目已经包含安装脚本。进入项目目录:
cd /home/shawn/go2_rl_gym
chmod +x scripts/setup_go2_env.sh scripts/go2.sh scripts/go2_doctor.py
./scripts/setup_go2_env.sh
脚本会自动完成:
- 在项目内安装 Miniconda。
- 创建 Python 3.8 环境。
- 安装 PyTorch 2.3.1 和 CUDA 12.1 运行库。
- 下载并安装 Isaac Gym Preview 4。
- 下载并安装
rsl_rl v1.0.2。 - 安装
unitree_rl_gym、MuJoCo、TensorBoard 等依赖。 - 检查 GPU、动态库、Python 包和 Go2 模型。
首次安装需要下载数 GB 文件,耗时取决于网络速度。脚本可以重复执行,已完成的部分会被 复用。
12. 验证环境是否成功
12.1 完整诊断
./scripts/go2.sh doctor
需要看到以下项目均为 OK:
- NVIDIA GPU。
- Python 3.8。
- Isaac Gym。
- PyTorch CUDA。
rsl_rl。gymtorch扩展。- MuJoCo。
- Go2 URDF 资源。
最后一行应为:
Result: ready
12.2 GPU 冒烟训练
./scripts/go2.sh smoke
该命令使用 64 个环境执行两次 PPO 更新。看到 Using GPU PhysX、GPU Pipeline: enabled 和 Learning iteration,说明仿真、神经网络和训练链路已经接通。
冒烟模型保存在 logs/smoke_go2/,不能作为正式策略使用。
13. 手动安装方法
一键脚本失败时,可以参考以下手动步骤。正常交付优先使用一键脚本,以减少版本差异。
13.1 创建 Python 3.8 环境
conda create -n unitree-rl python=3.8
conda activate unitree-rl
13.2 安装 PyTorch CUDA 版本
pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 \
--index-url https://download.pytorch.org/whl/cu121
验证:
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
13.3 安装 Isaac Gym Preview 4
从 NVIDIA 官方地址下载并解压 Isaac Gym Preview 4,然后执行:
cd isaacgym/python
pip install -e .
Isaac Gym 要求在 Python 代码中先导入 isaacgym,再导入 torch。
13.4 安装 rsl_rl
git clone --branch v1.0.2 https://github.com/leggedrobotics/rsl_rl.git
cd rsl_rl
pip install -e .
13.5 安装 unitree_rl_gym
cd /home/shawn/go2_rl_gym
pip install -e .
14. 项目目录说明
| 路径 | 作用 |
|---|---|
legged_gym/envs/go2/go2_config.py |
Go2 姿态、控制和奖励配置 |
legged_gym/envs/base/legged_robot_config.py |
公共环境和 PPO 参数 |
legged_gym/envs/base/legged_robot.py |
观测、奖励、终止和物理逻辑 |
legged_gym/scripts/train.py |
训练入口 |
legged_gym/scripts/play.py |
回放和策略导出入口 |
legged_gym/envs/go2/go2_spin_config.py |
本项目新增的原地转向任务 |
scripts/go2.sh |
统一诊断、训练和回放入口 |
logs/ |
TensorBoard 日志、检查点和导出策略 |
新动作应创建独立任务,不建议直接修改公共 LeggedRobot,否则可能破坏已经工作的行走
任务。
15. 一个训练任务由什么组成
15.1 目标 Commands
目标告诉策略当前要完成什么。例如:
lin_vel_x = [-1.0, 1.0]
lin_vel_y = [-1.0, 1.0]
ang_vel_yaw = [-1.0, 1.0]
表示训练前后移动、左右移动和转向。原地转向任务则把前后、左右速度固定为零,只保留 偏航速度。
15.2 观测 Observations
当前 Go2 策略接收 48 维观测:
- 3 维机身线速度。
- 3 维机身角速度。
- 3 维重力方向,用于表示机身姿态。
- 3 维目标速度命令。
- 12 维关节位置误差。
- 12 维关节速度。
- 12 维上一次动作。
15.3 动作 Actions
策略输出 12 个动作,对应 Go2 的 12 个腿部关节。当前使用位置控制:
目标关节角 = 默认关节角 + 0.25 × 策略动作
PD 参数为刚度 20、阻尼 0.5。仿真步长为 0.005 秒,每 4 个物理步更新一次动作,因此 策略控制频率为 50Hz。
15.4 奖励 Rewards
奖励决定策略最终学到什么。常见奖励包括:
- 线速度和角速度跟踪。
- 机身保持水平。
- 适当的足端腾空时间。
- 较低的扭矩和能耗。
- 平滑动作。
- 避免身体、腿部异常碰撞。
- 避免关节位置越界。
奖励设计错误时,机器人可能找到“数值上得分高、实际不符合需求”的取巧行为。因此奖励 必须结合回放画面和指标共同调整。
15.5 终止条件 Termination
当前行走任务在以下情况重置:
- 机身底座接触地面。
- 横滚角超过约 0.8 rad。
- 俯仰角超过约 1.0 rad。
- 单个回合达到 20 秒。
训练后空翻等大角度动作时,必须创建独立环境并修改终止条件,否则策略在完成旋转前就会 被重置。
15.6 随机化 Domain Randomization
当前环境可以随机改变摩擦,并定期给机器人外部推力。新任务的推荐顺序是:
- 关闭大部分随机化,先确认动作能够学会。
- 逐步加入摩擦、质量、噪声和推力随机化。
- 比较随机化前后的成功率和动作质量。
不要在任务尚未收敛时一次加入全部困难条件。
16. 如何开展第一次训练
16.1 先明确成功标准
以原地转向为例,可以定义:
- 目标角速度误差小于 0.2 rad/s。
- 平移速度小于 0.15 m/s。
- 20 秒内不摔倒。
- 机身横滚和俯仰保持在允许范围。
- 左转、右转和停止命令均能完成。
没有量化标准,就无法客观判断新模型是否优于旧模型。
16.2 小规模可视化调试
普通行走任务:
./scripts/go2.sh train-viewer \
--task=go2 \
--num_envs=64 \
--max_iterations=100 \
--run_name=walk_debug
原地转向任务:
./scripts/go2.sh train-viewer \
--task=go2_spin \
--num_envs=64 \
--max_iterations=100 \
--run_name=spin_debug
可视化训练主要用于检查:
- 机器人模型和关节方向是否正确。
- 摔倒后是否正常重置。
- 奖励是否鼓励了预期行为。
- 是否出现明显异常碰撞或数值爆炸。
早期策略会探索随机动作,机器人摔倒属于正常现象。关闭 viewer 会终止训练。
16.3 正式无界面训练
普通速度跟踪:
./scripts/go2.sh train \
--task=go2 \
--num_envs=4096 \
--max_iterations=1500 \
--run_name=walk_v1
原地左右转向:
./scripts/go2.sh train \
--task=go2_spin \
--num_envs=4096 \
--max_iterations=1000 \
--run_name=spin_v1
无界面模式使用 --headless,训练速度远高于 viewer。正式训练应使用无界面模式,
TensorBoard 负责显示曲线。
17. 如何查看训练过程
另开一个终端:
cd /home/shawn/go2_rl_gym
./scripts/go2.sh shell
tensorboard --logdir logs --port 6006
浏览器打开:
http://localhost:6006
17.1 重点指标
| 指标 | 如何理解 |
|---|---|
Train/mean_reward |
平均回合奖励,整体趋势通常应上升 |
Train/mean_episode_length |
平均存活步数,当前最大约 1000 步 |
Episode/rew_tracking_lin_vel |
线速度跟踪质量 |
Episode/rew_tracking_ang_vel |
转向跟踪质量 |
Episode/rew_torques |
扭矩惩罚 |
Episode/rew_action_rate |
动作变化惩罚 |
Loss/value_function |
价值网络误差 |
Loss/surrogate |
PPO 策略更新目标 |
Perf/total_fps |
每秒仿真步数 |
PPO 的 Loss 不一定持续下降。判断训练质量时,应优先结合平均奖励、存活时间、任务指标和 实际回放,而不是只看 Loss。
17.2 检查点保存
模型默认每 50 次更新保存一次:
logs/<实验名>/<时间>_<运行名>/model_0.pt
logs/<实验名>/<时间>_<运行名>/model_50.pt
logs/<实验名>/<时间>_<运行名>/model_100.pt
...
关闭终端或 viewer 前,尚未到达下一个保存间隔的更新可能不会保存。
17.3 中断后继续训练
./scripts/go2.sh train \
--task=go2_spin \
--resume \
--load_run=Aug05_12-00-00_spin_v1 \
--checkpoint=500 \
--run_name=spin_v1_resume
上面的 Aug05_12-00-00_spin_v1 是示例,应替换为 logs/spin_go2/ 下自己的训练目录名。
建议明确填写目录和检查点,避免误加载其他实验。续训的 --max_iterations 表示本次还要增加
多少次更新,而不是训练结束时的总编号。
18. 如何查看训练结果
18.1 查找检查点
find logs -maxdepth 3 -name 'model_*.pt' | sort -V
普通行走实验位于 logs/rough_go2/,原地转向实验位于 logs/spin_go2/。训练目录名类似
Aug05_12-00-00_spin_v1,由启动时间和 --run_name 组成。
18.2 回放普通行走模型
./scripts/go2.sh play \
--task=go2 \
--load_run=Aug05_12-00-00_walk_v1 \
--checkpoint=-1
请把示例目录替换为自己的目录。--checkpoint=-1 表示加载该目录中编号最大的检查点。
18.3 回放原地转向模型
左转:
./scripts/go2.sh play \
--task=go2_spin \
--load_run=Aug05_12-00-00_spin_v1 \
--checkpoint=-1 \
--command_yaw=0.8
右转:
./scripts/go2.sh play \
--task=go2_spin \
--load_run=Aug05_12-00-00_spin_v1 \
--checkpoint=-1 \
--command_yaw=-0.8
停止转向:
./scripts/go2.sh play \
--task=go2_spin \
--load_run=Aug05_12-00-00_spin_v1 \
--checkpoint=-1 \
--command_yaw=0.0
同样需要把示例目录替换为自己的转向训练目录。正负号对应的视觉方向与预期相反时,交换 命令符号即可。
19. 模型文件分别是什么
19.1 训练检查点
model_*.pt 包含:
- Actor/Critic 网络参数。
- PPO 优化器状态。
- 训练迭代信息。
它用于继续训练和在 Isaac Gym 中回放。
19.2 导出的策略
运行 play.py 时,项目会导出 Actor 网络:
logs/<实验名>/exported/policies/policy_1.pt
这是 TorchScript 推理模型,适合后续部署程序加载。它不包含仿真器,也不包含机器人安全 状态机。
19.3 TensorBoard 日志
events.out.tfevents.* 保存训练曲线。交付模型时应同时保留日志,否则无法复核训练过程。
20. 如何判断模型是否合格
不能只看机器人“偶尔成功一次”。建议对候选检查点进行批量评估:
| 测试项 | 示例验收要求 |
|---|---|
| 多随机种子 | 至少 5 个训练或评估种子 |
| 回合成功率 | 1000 次回合中达到项目定义的成功率 |
| 指令范围 | 最小、最大和中间命令均测试 |
| 摩擦变化 | 低、中、高摩擦分别测试 |
| 外部推力 | 不同方向和大小的扰动 |
| 观测噪声 | IMU 和关节状态加入噪声 |
| 控制延迟 | 加入通信和执行延迟 |
| 长时间稳定性 | 连续运行而不是只看单回合 |
| 异常接触 | 检查腿部、机身碰撞和关节越界 |
最终选择的模型不一定是编号最大的模型。应对多个检查点使用同一套评价脚本,选择成功率、 稳定性和动作质量综合最好的版本。
21. 训练完成后应该做什么
21.1 第一步:Isaac Gym 回放
在训练仿真器中确认策略能重复完成任务,检查足端打滑、关节抖动、异常碰撞和重置行为。
21.2 第二步:增加鲁棒性测试
逐步加入摩擦、质量、噪声、推力和延迟随机化,重新训练或微调,并记录成功率变化。
21.3 第三步:导出推理策略
通过 play 导出 policy_1.pt,记录与模型配套的观测顺序、缩放系数、默认关节角、PD
参数、动作缩放和控制频率。
21.4 第四步:Sim2Sim
把策略放到 MuJoCo 等另一种物理仿真器中。只有策略不依赖 Isaac Gym 的特定接触和数值 特性,才有更大机会迁移到真实机器人。
本项目锁定的官方仓库版本 276801e 没有提供 Go2 的 MuJoCo 部署配置,只有 G1、H1
和 H1_2。Go2 在进入 Sim2Sim 前还需要补充 MuJoCo 模型、配置和策略接口。这是当前项目
的待实施环节,不能把其他机器人配置直接替换名称后使用。未来升级仓库版本时,应重新
检查官方是否已经增加 Go2 支持。
21.5 第五步:构建实机控制状态机
真实机器人不能只运行一个神经网络。至少需要:
初始化 -> 零力矩/阻尼 -> 默认站姿 -> 策略待机 -> 用户触发
-> 策略运行 -> 异常检测 -> 恢复站立或阻尼急停
应检查:
- 12 个关节的名称、顺序和正负方向。
- 观测顺序和训练时完全一致。
- 观测归一化和动作缩放一致。
- PD 刚度、阻尼和力矩限幅一致。
- 训练与实机控制周期一致,当前策略为 50Hz。
- IMU 四元数坐标系一致。
- 遥控器触发、退出和急停有效。
- 数据超时、网络中断和异常姿态能够进入安全状态。
21.6 第六步:低风险实机测试
推荐顺序:
- 不连接真实机器人,离线回放日志验证输入输出。
- Go2 悬空,低刚度、低动作缩放测试关节方向。
- 使用保护架,限制命令范围和力矩。
- 平整、空旷、无人员靠近的场地进行低速测试。
- 逐步扩大命令范围和随机条件。
- 保存每次测试的传感器、命令和异常日志。
高动态动作必须使用保护架,并由能够立即触发物理急停的人员现场监护。
22. 如何开发一个新动作
新手应从低风险、容易衡量的动作开始:
- 原地稳定站立。
- 前后速度跟踪。
- 原地左右转向。
- 抗推保持平衡。
- 坡面或轻度不平地形。
- 坐下、起立等有限时长动作。
- 最后才考虑跳跃、翻转等高动态动作。
22.1 推荐创建独立任务
例如原地转向任务使用:
legged_gym/envs/go2/go2_spin_config.py
它继承 Go2 基础配置,只覆盖命令、奖励、随机化和训练次数。这样不会破坏普通行走任务, 也便于比较不同技能。
22.2 原地转向配置示例
class ranges:
lin_vel_x = [0.0, 0.0]
lin_vel_y = [0.0, 0.0]
ang_vel_yaw = [-1.0, 1.0]
常见修改:
ang_vel_yaw = [-0.6, 0.6] # 慢速左右转
ang_vel_yaw = [0.5, 1.0] # 只训练一个方向
22.3 为什么不建议新手直接做后空翻
后空翻需要完整的起跳、腾空旋转、落地和恢复阶段。当前行走环境的大角度终止条件会直接 阻止该动作,而且普通 48 维观测没有动作阶段信息。
可靠的后空翻项目通常还需要:
- 参考动作轨迹或轨迹优化结果。
- 相位观测。
- 四元数姿态误差。
- 累计旋转角度。
- 足端接触时序。
- 分阶段课程学习。
- 专用落地和恢复策略。
- 保护架和严格的实机安全流程。
因此后空翻适合作为团队具备稳定行走、Sim2Sim 和实机保护经验后的高级项目。
23. 常见问题
23.1 为什么训练时只有终端,没有场景
正式训练使用无界面的 headless 模式,以获得更高吞吐。需要画面时运行:
./scripts/go2.sh train-viewer --task=go2 --num_envs=64
23.2 为什么机器人一开始总摔倒
初始策略接近随机动作,必须通过探索逐步学习。应结合奖励和存活时间的长期趋势判断,不能 只看训练最初几分钟。
23.3 为什么关闭窗口后训练停止
viewer 和训练进程属于同一个程序。关闭窗口会结束训练。正式训练应使用 train,并通过
TensorBoard 查看进度。
23.4 为什么 nvidia-smi 失败
可能原因包括驱动未安装、驱动模块和用户态库版本不一致、系统重启未完成,或当前终端位于
没有映射 GPU 设备的容器中。先在 Ubuntu 普通终端运行 nvidia-smi 判断宿主是否正常。
23.5 CUDA 显存不足怎么办
降低并行环境数:
./scripts/go2.sh train --task=go2 --num_envs=2048
./scripts/go2.sh train --task=go2 --num_envs=1024
同时关闭浏览器、远程桌面和其他占用 GPU 的程序。
23.6 为什么不能使用系统 Python 3.10
Isaac Gym Preview 4 的二进制扩展对应 Python 3.8。使用不匹配的 Python 会导致模块或 动态库加载失败。本项目已通过启动脚本隔离环境。
23.7 为什么最新模型不一定最好
强化学习曲线存在波动,后期也可能出现策略退化。应在固定测试集上比较多个检查点,选择 综合表现最好的模型。
23.8 为什么仿真成功但真实机器人失败
仿真和真实世界在质量、摩擦、电机响应、延迟、传感器噪声和接触模型上存在差异,这称为 Sim2Real gap。需要系统辨识、随机化、Sim2Sim 和实机保护逐步缩小差异。
24. 项目周期预期
下面是常见项目的粗略时间范围,实际取决于动作难度和验收要求:
| 阶段 | 典型时间 |
|---|---|
| 环境安装和冒烟验证 | 30 分钟至半天 |
| 普通行走基线训练 | 单次约 30 至 60 分钟,另需调参 |
| 原地转向等简单技能 | 1 至 3 天,包括评估和修改 |
| 复杂地形和鲁棒性 | 数天至数周 |
| 新的有限时长动态动作 | 数周,通常需要参考轨迹 |
| Sim2Sim 和实机接入 | 数天至数周 |
训练命令运行结束不等于项目结束。多数开发时间花在目标定义、奖励调整、失败分析、评估和 迁移验证上。
25. 建议交付给客户的材料
一个可复现的强化学习项目至少应交付:
- 源代码和明确的 Git 版本。
- 环境安装脚本和依赖版本。
- 任务配置、奖励说明和终止条件。
- 随机化范围和训练命令。
- 训练检查点和导出的 TorchScript 策略。
- TensorBoard 日志。
- 仿真评估脚本和量化结果。
- Sim2Sim 配置与测试报告。
- 实机观测、动作和关节映射文档。
- 启动、停止、急停和异常处理 SOP。
- 已知限制、失败案例和适用范围。
只有模型文件而没有配置、日志和接口说明,不属于可复现交付。
26. 安全边界
强化学习策略可能输出不可预测动作。真实 Go2 测试必须遵守以下原则:
- 未完成 Sim2Sim,不进入实机测试。
- 未核对关节顺序和方向,不使能电机策略控制。
- 首次测试使用保护架并限制动作、刚度和力矩。
- 操作人员与机器人保持安全距离。
- 现场必须有物理急停和明确的安全负责人。
- 网络超时、状态异常或姿态超限时立即进入阻尼或零力矩安全状态。
- 不在人员密集、地面湿滑或存在易损物品的环境测试。
- 高动态特技动作不能直接从单一仿真器部署到真实机器人。
27. 新手推荐的实际起步顺序
第一步,确认环境:
./scripts/go2.sh doctor
./scripts/go2.sh smoke
第二步,理解已有行走策略:
./scripts/go2.sh train-viewer --task=go2 --num_envs=64 --max_iterations=100
第三步,训练本项目准备好的原地转向任务:
./scripts/go2.sh train --task=go2_spin --run_name=spin_v1 --max_iterations=1000
第四步,回放 +0.8、-0.8 和 0.0 rad/s 三种命令,记录成功率和漂移。
第五步,在转向策略稳定后加入随机推力,训练抗扰动版本。
第六步,补齐 Go2 MuJoCo Sim2Sim 和安全状态机,再评估真实机器人测试。
按这个顺序推进,可以把环境、算法、任务设计和部署风险分开验证,适合初学者建立第一套 完整、可复现的 Go2 深度强化学习工作流。
28. 官方资料与版本边界
本文的命令和结论以本项目固定的代码与依赖版本为准。官方仓库、驱动和 Python 包后续可能
变化;升级任何核心组件后,都应重新执行 doctor、冒烟训练和模型回放,不能默认旧模型
与新环境完全兼容。