ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Gymnasium × MuJoCo 连续控制快速入门:从第一次运行到训练 HalfCheetah 的 6 个关键步骤

Gymnasium × MuJoCo 连续控制快速入门:从第一次运行到训练 HalfCheetah 的 6 个关键步骤 Gymnasium × MuJoCo 连续控制快速入门从第一次运行到训练 HalfCheetah 的 6 个关键步骤【免费下载链接】GymnasiumA standard API for single-agent reinforcement learning environments, with popular reference environments and related utilities (formerly Gym)项目地址: https://gitcode.com/GitHub_Trending/gy/Gymnasium教一个虚拟机器人跑起来是这篇指南要达成的目标。你会借助 Gymnasium 提供的连续控制环境和 MuJoCo 物理引擎先让窗口跑起来读懂环境的输入输出接口最后用 PPO 把 HalfCheetah 猎豹真正训到会跑。如果你在 Atari 上练过强化学习对离散动作的体感大概是这样的上、下、左、右、跳跃每一帧从一把按键里挑一个。连续控制是完全另一个世界——你要输出的不是按哪个键而是这一帧给每个关节施加多大扭矩一个 -1 到 1 之间的实数。没有按键组合可背只剩精度这一个指标。上图的 cart-pole 是最经典的连续玩具问题。Gymnasium 里的 MuJoCo 环境就是它的工业级版本6 到 17 个受控关节、真实的接触与摩擦动力学从一根摆杆一直覆盖到整个人形机器人。先跑起来3 分钟安装并选定渲染后端这一节解决第一个拦路虎gym.make不报错、窗口能画出来。三步走安装 mujoco 扩展pip install gymnasium[mujoco]。这个 extra 会带上mujoco 2.1.5、imageio、packaging等依赖注意 v5 环境对引擎版本要求更高mujoco 2.3.3v4 只需 mujoco 2.1.3。确认 Python 版本不低于 3.10这是 Gymnasium 的硬性下限。选定渲染后端。MuJoCo 通过环境变量MUJOCO_GL决定如何出图glfw默认需要显示器、egl无头 GPU 加速Linux 服务器的正确选择、osmesa纯 CPU兼容性最好但最慢。在服务器上先export MUJOCO_GLegl再跑脚本。提示需要源码对照时可执行git clone https://gitcode.com/GitHub_Trending/gy/Gymnasium然后在 mujoco 环境源码 下逐个查看 v5 实现——每个环境类的 docstring 都附了完整的观测/动作对照表。MuJoCo 环境家族速览按上手难度分三档这一节回答我该从哪个环境开始。不按机器人结构分类而按多久能玩明白排档。第一档 · 一小时内上手低维、低开销InvertedPendulum-v5观测只有 4 维任务是把摆杆立起来适合验证奖励函数有没有写对方向。InvertedDoublePendulum-v5观测 9 维双摆让非线性难度直接翻倍。Reacher-v5观测 10 维、动作 2 维让机械臂末端去够一个目标点最经典的操作类任务。第二档 · 连续控制主战场标准基准Swimmer-v5观测 8 维、动作 2 维作用于相邻链节的扭矩对水里向前游。Hopper-v5观测 11 维、动作 3 维单腿跳。Walker2d-v5动作 6 维双腿行走。HalfCheetah-v5观测 17 维、动作 6 维每回合上限 1000 步官方reward_threshold为 4800——第一个连续控制项目的最佳选择。Ant-v5观测 105 维、动作 8 维八条腿观测中还带接触项。Pusher-v5观测 17 维、动作 7 维动作范围是 -2 到 2用双关节臂把物体推到位。第三档 · 重量级评估一次就几千步没有 GPU 预算先别碰Humanoid-v5/HumanoidStandup-v5观测 348 维、动作 17 维动作范围 -0.4 到 0.4——范围不统一由 [-1, 1] 决定而是由模型 XML 里执行器的控制上限给出。版本选择三句话v5是当前推荐mujoco 2.3.3物理参数与 bug 修复最新v4为维护版本mujoco 2.1.3留作实验复现老v2/v3基于 mujoco-py 后端已迁移到gymnasium-robotics包当前 Gymnasium 里直接 make 会报错复现旧论文时先核对版本。每个环境的奖励构成与阈值明细见 MuJoCo 环境文档。状态、动作、奖励三件套机器人的输入输出接口这一节回答到底读什么、写什么、数字从哪来。把任何 MuJoCo 环境当成一个三口黑盒读什么观测一个Box类型向量前半是qpos位置关节角度、躯干坐标后半是qvel速度二者拼接——相当于GPS 坐标 速度表同时给到你。以HalfCheetah-v5为例默认观测 17 维 8 维qpos 9 维qvel。注意HalfCheetah默认刻意不把躯干 x 坐标rootx放进观测逼你的网络从速度里间接推断位置任务难度因此更高。创建时传exclude_current_positions_from_observationFalse即可把它加回来观测变为 18 维。无论开关与否info里每步都返回x_position与y_position画曲线时很顺手。写什么动作每一维对应一个执行器通常是扭矩归一化在类似 [-1, 1] 的区间内环境内部再映射成真实物理量。区间不是写死的而是取自模型 XML 的actuator_ctrlrange——比如Humanoid-v5是 [-0.4, 0.4]、Pusher-v5是 [-2, 2]。拿不准就直接看env.action_space。数字从哪来奖励一般是几项相加。HalfCheetah-v5是forward_reward - ctrl_cost前进速度奖励减控制能耗惩罚Hopper-v5多一项healthy_reward forward_reward - ctrl_cost其中healthy_reward默认 1、ctrl_cost_weight默认 1e-3且任一观测元素一旦超出healthy_state_range默认 (-100, 100)就判死结束。第一次完整交互reset → step → close 最小循环这一节给你一段可以直接照抄运行的骨架把随机动作换成自己的策略即可开工。import gymnasium as gym env gym.make(HalfCheetah-v5, render_modehuman, width800, height600) obs, info env.reset(seed42) total_reward, terminated, truncated 0.0, False, False while not (terminated or truncated): action env.action_space.sample() # 随机动作实际替换为你的策略 obs, reward, terminated, truncated, info env.step(action) total_reward reward print(f回合结束累计奖励: {total_reward:.2f}) env.close()几个细节值得记住reset(seed42)返回(observation, info)种子决定环境内部随机性同种子同起点step返回五元组(obs, reward, terminated, truncated, info)机器人摔倒是terminatedTrue跑满 1000 步上限是truncatedTrueinfo[episode][r]与info[episode][step]记录本回合累计奖励与步数打日志很方便render_mode在创建时定死None最快、human开窗、rgb_array让env.render()返回 (H, W, 3) 图像数组。窗口大小与相机同样走gym.make参数width、height、camera_name用模型内置相机或default_camera_config微调distance/azimuth/elevation。提速三板斧 向量化、渲染策略与预处理这一节回答训练比预期慢十倍时从哪下刀。其一向量化采样。PPO、SAC 这类算法要吃海量 rollout单环境就是瓶颈。向量环境 提供SyncVectorEnv多进程并行与AsyncVectorEnv异步步进也可以直接gym.make_vec(HalfCheetah-v5, num_envs8)。8 个并行的HalfCheetah-v5能让采样快出数倍普通 8 核机器上约 6 倍视硬件而定。from gymnasium.vector import SyncVectorEnv envs SyncVectorEnv([lambda: gym.make(HalfCheetah-v5) for _ in range(8)]) obs, infos envs.reset() print(obs.shape) # (8, 17)8 个环境 × 17 维观测 actions envs.action_space.sample() # (8, 6) obs, rewards, terminateds, truncateds, infos envs.step(actions)其二渲染策略。训练时开render_modehuman每帧都要走一遍窗口绘制步时会被吃掉一大截。习惯上训练用None评估才切human想给论文留视频就用RecordVideo包装器录rgb_array不必付实时渲染的代价。其三预处理。用 wrappers 把输入输出整理成网络友好的尺度NormalizeObservation滚动统计量归一化观测、RescaleAction把你的动作范围映射到环境动作范围奖励尺度则可以用ClipReward等同类包装器收拾。这两层包装只动观测与动作不碰物理本身。亲手训一个PPO HalfCheetah 浓缩实战这一节给出浓缩但完整的骨架选 PPO、搭 actor-critic、在HalfCheetah-v5上让它学会跑。为什么选 PPO稳定、不太挑超参是连续控制里最不容易翻车的选择之一。核心结构是两个网络——actor 输出高斯均值critic 估计状态价值动作的对数概率从Normal(mean, std)计算std通过log_std参数学习。几个经验值Adam 学习率 3e-4、梯度裁剪max_norm0.5、开观测归一化、向量环境采样。# actor-critic 骨架actor 输出均值log_std 为可学习参数 # 省略critic 价值网络与完整 forward约 10 行 obs, _ envs.reset() for t in range(total_timesteps): dist Normal(actor(obs), torch.exp(log_std)) action dist.sample() log_prob dist.log_prob(action).sum(-1) # 每个环境的对数概率 next_obs, rewards, terminated, truncated, _ envs.step( action.cpu().numpy()) # 省略缓存 (obs, action, reward) 轨迹每隔 N 步 # 执行 PPO 多轮截断目标梯度更新 obs next_obs跑起来之后盯三个数平均奖励生命线应稳步爬升、策略熵前期高、后期低代表探索收敛、梯度方差过大则曲线横跳。这个环境的官方reward_threshold是 4800是很好的收敛参照PPO 训好的 HalfCheetah 平均速度可到 10 m/s 量级已接近物理极限。提示别用单次训练判算法死刑。多种子各跑一遍取均值评估时改用确定性策略关闭采样噪声数字才可信。踩坑与排障几乎必现的三个症状这一节按现象 → 原因 → 解法给你速查表MuJoCo 环境的问题八成能对应上。现象一窗口卡顿训练蜗牛爬。原因render_modehuman每帧都绘制窗口系统在吃步时。 解法训练切None评估与录像才用rgb_array服务器上export MUJOCO_GLegl走无头渲染。现象二loss 尖刺、奖励曲线乱跳偶发 NaN。原因观测与奖励尺度跨环境差异大梯度几轮之后就跑飞。 解法套NormalizeObservation每步更新前torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm0.5)必要时对学习率做线性衰减。现象三种子固定了结果还是不一样。原因Python、NumPy、PyTorch、环境各有一套随机流只固定其一等于没固定。 解法全部固定且环境内部的种子要经reset(seed...)单独传入import random, numpy as np, torch seed 42 random.seed(seed); np.random.seed(seed); torch.manual_seed(seed) env gym.make(Hopper-v5) obs, info env.reset(seedseed) # 环境内部随机性需单独指定更进一步自定义环境与资源地图这一节回答标准环境玩熟之后去哪儿。自建 MuJoCo 环境分三步① 写 XML 模型——option设时间步与重力worldbody放刚体与关节geom描述碰撞与外观几何actuator定义控制接口② 继承 MujocoEnv实现reset_model、_get_obs、_get_reward与终止逻辑③ 用gymnasium.register注册一个id与entry_point之后就能像内置环境一样按名字make。拿 half_cheetah_v5.py 当最小模板最省事它把要求实现的方法都摆在那了。资源地图用法与调优创建自定义环境、训练智能体、环境提速环境与版本MuJoCo 环境文档代码入口mujoco 环境源码、向量环境、wrappers下一步方向单智能体连续控制打通后自然的延伸是多智能体协作/对抗、sim-to-real 的迁移差距研究以及给模型加入流体、柔性体等更多物理效应。一句话收尾连续控制的难在物理不在 API——一旦吃透 Gymnasium 与 MuJoCo 之间读 17 维状态、写 6 维扭矩、拿回一个奖励的输入输出契约剩下的都是工程问题。【免费下载链接】GymnasiumA standard API for single-agent reinforcement learning environments, with popular reference environments and related utilities (formerly Gym)项目地址: https://gitcode.com/GitHub_Trending/gy/Gymnasium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表