
引言
视频对机器人强化学习(RL)全流程的讲解非常清晰——从 CAD 建模一路到硬件部署。作者一开始就点明了一个重要事实:这个流程并不是一条直线,而是需要在建模、训练、部署三个阶段之间反复迭代调试,才能找出控制器表现异常的根本原因。视频以旋转倒立摆(rotary inverted pendulum)这一经典的低维基准系统作为演示对象,但作者明确指出,这些概念完全可以扩展到四足机器人和人形机器人等更复杂的系统。
视频围绕三个阶段展开:建模(MuJoCo、CAD/STL、XML/MJCF、坐标系、电机参数、力矩控制 vs 位置控制)、训练(Gymnasium、PPO 策略网络、域随机化、奖励/观测/终止条件)、部署(ONNX 导出、传感器、控制回路、真实硬件安全性)。真正有价值的地方在于理解这些术语以及各模块之间的关联——这决定了你是在盲目猜测,还是能够诊断出控制器为什么无法收敛或无法迁移到硬件上。
MuJoCo 与 Gymnasium 安装配置指南:从零开始搭建机器人强化学习环境
在开始训练任何强化学习(RL)策略之前,第一步永远是把仿真环境正确搭建起来。对于机器人强化学习而言,MuJoCo 负责物理仿真(刚体动力学、接触力、执行器建模),而 Gymnasium(原 OpenAI Gym 的继任项目)则负责把仿真包装成标准化的 RL 训练接口(观测、动作、奖励、终止条件)。这两者的组合几乎是目前机器人 RL 领域最主流的基础设施之一。
本文将带你完成安装、基础配置,以及第一个可运行的示例,帮助你在开始建模和训练之前,先把地基打牢。
一、环境准备
1. 推荐的系统环境
- 操作系统:Linux(Ubuntu 20.04/22.04 最为稳定),macOS 和 Windows(WSL2)也可运行,但部分渲染功能在原生 Windows 上支持有限。
- Python 版本:建议使用 Python 3.9–3.11。
- 虚拟环境:强烈建议使用
venv或conda创建独立环境,避免依赖冲突。
bash
# 使用 venv 创建虚拟环境
python3 -m venv mujoco-rl-env
source mujoco-rl-env/bin/activate
# 或使用 conda
conda create -n mujoco-rl-env python=3.10
conda activate mujoco-rl-env
二、安装 MuJoCo
自 MuJoCo 2.1.0 版本起,DeepMind 已将其开源并发布了官方 Python 绑定,安装过程比早期版本简化了很多,不再需要单独申请授权文件。
1. 通过 pip 安装
bash
pip install mujoco
安装完成后,可以快速验证是否成功:
python
import mujoco
print(mujoco.__version__)
2. 验证渲染功能(可选但推荐)
MuJoCo 自带一个简单的交互式查看器,用于验证模型加载与渲染是否正常:
python
import mujoco
import mujoco.viewer
# 加载官方自带的示例模型
model = mujoco.MjModel.from_xml_path("model.xml")
data = mujoco.MjData(model)
with mujoco.viewer.launch_passive(model, data) as viewer:
while viewer.is_running():
mujoco.mj_step(model, data)
viewer.sync()
如果你在无显示器的服务器(如云端 GPU 实例)上运行,需要额外配置 EGL 或 OSMesa 作为无头渲染后端:
bash
export MUJOCO_GL=egl
# 或者
export MUJOCO_GL=osmesa
3. 官方文档
建议在遇到版本相关问题时优先查阅 MuJoCo 官方文档,而不是完全依赖 ChatGPT 或其他 AI 工具——因为很多 AI 模型的训练数据可能对应的是旧版本 API,容易给出过时或不兼容的代码。
三、安装 Gymnasium
1. 基础安装
bash
pip install gymnasium
如果需要用到 MuJoCo 相关的官方内置环境(如 HalfCheetah、Humanoid 等经典基准任务),需要额外安装:
bash
pip install "gymnasium[mujoco]"
2. 验证安装
python
import gymnasium as gym
env = gym.make("HalfCheetah-v5")
observation, info = env.reset()
print("观测空间:", env.observation_space)
print("动作空间:", env.action_space)
env.close()
如果这段代码没有报错并正确打印出观测空间和动作空间的维度,说明 Gymnasium 与 MuJoCo 的集成已经安装成功。
四、搭建自定义强化学习环境
对于自建机器人(如视频中提到的旋转倒立摆),通常不会直接使用 Gymnasium 内置环境,而是需要自己继承 gym.Env 编写一个自定义环境类,用来包装自己的 MuJoCo XML 模型。
1. 基本框架
python
import gymnasium as gym
from gymnasium import spaces
import mujoco
import numpy as np
class CustomRobotEnv(gym.Env):
def __init__(self, xml_path):
super().__init__()
self.model = mujoco.MjModel.from_xml_path(xml_path)
self.data = mujoco.MjData(self.model)
# 定义观测空间与动作空间的维度,需根据实际模型调整
self.observation_space = spaces.Box(
low=-np.inf, high=np.inf, shape=(4,), dtype=np.float32
)
self.action_space = spaces.Box(
low=-1.0, high=1.0, shape=(1,), dtype=np.float32
)
def get_observation(self):
# 例如:位置与速度
return np.concatenate([self.data.qpos, self.data.qvel]).astype(np.float32)
def get_reward(self):
# 根据任务自行设计奖励函数
return 0.0
def reset(self, seed=None, options=None):
super().reset(seed=seed)
mujoco.mj_resetData(self.model, self.data)
mujoco.mj_forward(self.model, self.data)
return self.get_observation(), {}
def step(self, action):
scaled_action = action * 10.0 # 力矩缩放示例
self.data.ctrl[:] = scaled_action
mujoco.mj_step(self.model, self.data)
obs = self.get_observation()
reward = self.get_reward()
terminated = False # 根据终止条件自行设置
truncated = False
return obs, reward, terminated, truncated, {}
def render(self):
pass
def close(self):
pass
2. 配置要点
- 观测空间与动作空间的维度必须与你实际返回的数组严格一致,否则在训练时会报错。
- 动作缩放(
scaled_action)非常关键——策略网络输出通常是[-1, 1]区间内的归一化数值,需要根据电机实际的力矩/位置范围进行映射。 - 终止条件(
terminated)建议单独写成一个函数,方便后续调试和调整。
五、配合 Stable-Baselines3 进行训练
安装训练库:
bash
pip install stable-baselines3
一个最简训练脚本示例:
python
from stable_baselines3 import PPO
env = CustomRobotEnv(xml_path="model.xml")
model = PPO("MlpPolicy", env, verbose=1, learning_rate=3e-4)
model.learn(total_timesteps=1_000_000)
model.save("trained_policy")
训练过程中,终端会持续输出评估指标(如 ep_rew_mean、fps、time_elapsed 等),可以借此初步判断训练是否在收敛。
六、常见配置问题排查
| 问题现象 | 可能原因 | 建议排查方向 |
|---|---|---|
| 查看器无法打开 / 黑屏 | 缺少图形驱动或在无头服务器运行 | 设置 MUJOCO_GL=egl 或 osmesa |
mujoco.FatalError: XML Error | XML/MJCF 文件语法或路径错误 | 检查 STL 文件路径、标签是否闭合 |
| 训练后模型行为异常 | 观测/动作缩放不匹配、奖励设计问题 | 优先排查奖励函数,而非训练超参数 |
| Gymnasium 找不到 MuJoCo 环境 | 未安装 gymnasium[mujoco] extras | 重新执行 pip install "gymnasium[mujoco]" |
MuJoCo 和 Gymnasium 的关键技巧
- MuJoCo 自开源以来安装门槛大幅降低,
pip install mujoco即可完成基础安装,无需单独申请授权文件。 - Gymnasium 是连接仿真物理引擎与强化学习训练算法(如 PPO)之间的标准化接口层,自定义机器人环境需要手动继承
gym.Env并实现核心方法。 - 无头服务器环境下渲染问题多与
MUJOCO_GL环境变量配置有关,是最容易被忽略的排查点。 - 动作缩放与观测空间维度的一致性,是自定义环境中最常见的报错来源,建议在开发早期就用简单的打印语句反复验证。
- 环境搭建只是第一步,真正决定训练效果的往往是后续的奖励设计与域随机化——但一个配置正确、稳定运行的基础环境,是一切后续工作的前提。
关于机器人强化学习的视频
功能特点与核心概念
1. 建模——搭建数字孪生体
- CAD → STL → XML/MJCF 流程:机器人在 CAD 软件(作者使用 SolidWorks,也可用 Onshape 或 FreeCAD)中设计,导出为 STL 用于可视化,再接入 MuJoCo 的 XML(MJCF)格式文件。
- XML 结构:MuJoCo 模型文件有固定的骨架结构——模型名称、重力设置、
<asset>(STL 网格)、<worldbody>(连杆)、<actuator>(电机)。 - 连杆与关节:连杆在
worldbody中定义;关节(通常为type="hinge")位于连杆之间,定义旋转轴——方向设置错误会直接导致仿真结果出错,因此必须仔细核对。 - 控制模式:MuJoCo 执行器支持力矩控制和位置控制两种模式,也可以在力矩输出上叠加自定义控制器。
- 坐标系对齐:需要通过 body 的位置(position)和四元数(quaternion)来核对坐标系是否与真实机器人一致——这是一个容易被忽视但很常见的错误来源。
- 电机参数:摩擦损耗(frictionloss)、阻尼(damping)、电枢惯量(armature)最好参考电机数据手册,但很多时候需要通过实测调试获得。几何体的密度设置也会影响连杆的质量与惯量属性。
- MuJoCo 与 Isaac Sim 的对比:作者选择 MuJoCo 是因为其轻量化、易于上手;NVIDIA 的 Isaac Sim 是另一个较重量级的可选方案。
2. 训练——让策略学会任务
- Gymnasium 环境:自定义环境类继承自
gym.Env,并实现get_observation、get_reward、reset、step、render、close等函数。 - 观测量(Observations):可组合关节数据(位置、速度、电流、力矩)、IMU 数据(姿态、角速度、线加速度)、末端执行器数据(位姿、速度、力/力矩),以及其他信号(物体位置、误差、时间、图像)。
- 奖励设计(Reward Shaping):由多个加权的奖励项(位置跟踪、直立姿态、速度跟踪、存活/平衡、任务完成)与惩罚项(控制力度、速度、动作平滑度、碰撞、关节限位)组合而成。作者坦言,奖励设计是一个反复试错的过程,很多时候”奖励曲线看起来不错,但推理阶段表现很差”的根本原因其实出在奖励结构设计本身。
- 重置逻辑(Reset):在回合终止时触发,用于设定机器人的起始状态(随机或固定的位置/速度),随后调用
mj_forward。 - Step 函数:应用(缩放后的)力矩指令,推进 MuJoCo 物理引擎一步,再返回更新后的观测量、奖励和终止标志。
- 域随机化(Domain Randomization):在训练过程中随机化质量、惯量、摩擦、阻尼、执行器强度、传感器噪声和延迟,是实现**零样本仿真到真实迁移(zero-shot sim-to-real)**的关键手段,且完全可以通过代码实现,无需修改 CAD 模型。
- PPO 训练流程:使用 Stable-Baselines3,将环境包装后实例化一个 MLP 策略的 PPO 模型,训练核心其实只需要一行代码:
model.learn(total_timesteps=...)。奖励-时间步曲线用于评估是否收敛,但作者特别强调:曲线好看不代表推理表现好,必须结合可视化/硬件验证。
3. 部署——从仿真走向硬件
- “哑”gym 环境(Dummy Gym Environment):在部署端复用,用于处理观测量格式化以及动作缩放/裁剪,因为真实执行器接受的单位(如电流而非力矩)可能与仿真不同。
- ONNX 转换:对于需要在 MCU 或轻量级硬件上部署的场景,训练好的 PyTorch 策略通过
torch.onnx.export导出为 ONNX 格式,并需仔细验证转换前后的缩放行为是否一致。 - 真实世界传感器处理:编码器、IMU、力/力矩传感器、摄像头都需要校准、噪声滤波和正确的单位转换。通信协议(EtherCAT、SPI、CAN)以及时序/同步/延迟问题,都是仿真中从未出现、但在硬件上必然遇到的挑战。
- 安全第一:急停开关(E-stop)和软件安全限位被明确列为不可省略的步骤——硬件出错可能造成实际伤害,这与仿真环境完全不同。
- 成果:旋转倒立摆在外部扰动(包括加水和手动敲击)下持续运行了近四分钟,而作者对质量的域随机化其实做得并不多——这有力证明了该仿真到真实的流程是有效的。
环境搭建、配置与示例
以下是根据视频内容整理的简化复现步骤:
1. 建模阶段
- 在 CAD 软件中设计机器人(SolidWorks / Onshape / FreeCAD)
- 将各连杆导出为 STL 文件
- 构建 MJCF(XML):<asset>、<worldbody>(连杆+关节)、<actuator>
- 选择控制模式:力矩("motor")或位置("position")
- 通过 body 的位置与四元数核对坐标系是否对齐
- 调试电机参数:frictionloss、damping、armature、geom density
2. 训练阶段(Gymnasium + Stable-Baselines3 + PPO)
class RotaryPendulumEnv(gym.Env):
def get_observation(self): ... # 读取 self.data.qpos, qvel
def get_reward(self): ... # height - velocity_penalty 等
def reset(self): ... # 随机/初始状态 + mj_forward
def step(self, action): ... # 缩放力矩,mj_step,返回观测/奖励/终止
env = RotaryPendulumEnv(xml_path="model.xml")
model = PPO("MlpPolicy", env, learning_rate=..., ...)
model.learn(total_timesteps=1_000_000)
model.save("trained_policy")
# 在 reset() 中加入域随机化:
# 随机化质量、阻尼、力矩缩放、传感器噪声
3. 部署阶段
- 导出模型:torch.onnx.export(policy, dummy_input, "policy.onnx")
- 为真实硬件 I/O 构建一个"哑"gym 包装器
- 控制回路:读取传感器 -> 构建观测量 -> 预测动作
-> 缩放/裁剪 -> 发送至执行器(力矩/电流)
- 在真实硬件运行前,务必加入急停开关与软件安全限位
来自视频的一个重要调试经验:如果奖励曲线看起来不错,但真实/推理表现却很差,问题几乎总是出在奖励结构设计上,而不是训练算法本身——应优先迭代奖励设计,而非急于调整超参数。
结论与要点总结
- 机器人强化学习流程(建模 → 训练 → 部署)不是线性的,需要持续在各阶段之间循环迭代;理解每个阶段的术语,是高效诊断问题的关键。
- 建模的准确性(坐标系对齐、电机参数、控制模式)是整个流程的基础,微小的偏差会在后续环节被放大,难以追溯。
- 奖励设计才是训练环节真正的瓶颈——好看的学习曲线不代表真实表现好,必须结合可视化验证。
- 域随机化是一种低成本、纯代码层面的技术,能显著提升零样本仿真到真实的迁移效果。
- 硬件部署会带来全新的问题类别:单位转换、传感器噪声、通信协议、时序/延迟问题,尤其是安全性(急停、软件限位)必须被视为强制项,而非可选项。
- 这些核心概念(建模 → gym 环境 → PPO → ONNX → 硬件控制回路)可以直接推广到四足机器人、人形机器人等更复杂的系统——旋转倒立摆只是一个刻意简化的教学示例。
参考资料
- MuJoCo 官方文档
- MuJoCo – GitHub 仓库
- Gymnasium(OpenAI Gym 的继任项目)— https://gymnasium.farama.org/
- Gymnasium GitHub — https://github.com/Farama-Foundation/Gymnasium
- Stable-Baselines3(PPO 实现库)— https://stable-baselines3.readthedocs.io/
- NVIDIA Isaac Sim(视频中提及的替代仿真器)— https://developer.nvidia.com/isaac/sim

