OpenDuckMini强化学习框架入门教程-环境架构
纠错,疑问,交流: 请进入讨论区或 请点击进入页面,扫码加入微信群或Q群进行交流
获取最新文章: 扫一扫加入“创客智造”公众号
欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流
环境架构
- 进一步理解软件环境架构
分层架构概览
Open Duck Playground 的环境系统采用分层设计,基于 MuJoCo (MJX) 物理引擎构建。这种分层结构将通用机器人仿真逻辑与任务特定逻辑清晰地分离。
┌────────────────────────────────────────────────────────────┐
│ 任务环境 (Task Environments) │
│ ┌─────────────────────┐ ┌──────────────────────────┐ │
│ │ Joystick (行动控制) │ │ Standing (站立平衡) │ │
│ │ - 摇杆命令跟踪 │ │ - 姿态保持 │ │
│ │ - 速度控制 │ │ - 平衡恢复 │ │
│ │ - 运动生成 │ │ - 头部控制 │ │
│ └──────────┬──────────┘ └────────────┬─────────────┘ │
└─────────────┼────────────────────────────┼─────────────────┘
│ │
▼ ▼
┌────────────────────────────────────────────────────────────┐
│ 基础环境 (Base Environment) │
│ OpenDuckMiniV2Env (base.py) │
│ ┌────────────────────────────────────────────────────┐ │
│ │ MJCF 加载 关节管理 传感器读取 状态处理 │ │
│ └────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────┐
│ MuJoCo / MJX 物理引擎 │
│ - 前向动力学 - 碰撞检测 - 约束求解 │
│ - 状态更新 - 传感器仿真 - 渲染 │
└────────────────────────────────────────────────────────────┘
基础环境层:OpenDuckMiniV2Env
OpenDuckMiniV2Env 是所有 Open Duck Mini V2 环境的基类,继承自 mjx_env.MjxEnv。它负责:
- 模型加载:从 MJCF XML 文件加载 MuJoCo 模型,包括机器人定义和资产
- 关节管理:区分不同类型的关节(浮动基座、执行器、回差关节)
- 传感器读取:提供重力、线速度、角速度、加速度计、陀螺仪等传感器访问
- 状态处理:获取和设置浮动基座位置/速度、执行器关节位置/速度等
核心功能:
class OpenDuckMiniV2Env(mjx_env.MjxEnv):
def __init__(self, xml_path, config, config_overrides=None):
# 加载 MJCF 模型
self._mj_model = mujoco.MjModel.from_xml_string(...)
self._mjx_model = mjx.put_model(self._mj_model)
# 自动识别关节类型
self.floating_base_name = ... # 浮动基座
self.actuator_names = ... # 执行器关节
self.backlash_joint_names = ... # 回差虚拟关节
任务环境层
任务环境继承基础环境,添加任务特定的逻辑:
Joystick(摇杆环境)
专注于运动跟踪,接收摇杆命令(前进速度、横向速度、旋转速度)并引导机器人执行相应运动。
- 命令空间:7 维(3 个运动命令 + 4 个头部姿态命令)
- 奖励:速度跟踪 + 能量效率 + 姿态保持 + 模仿奖励(可选)
- 终止条件:跌倒检测、NaN 状态检测
Standing(站立环境)
专注于稳定站立,无需运动命令,而是保持身体姿态和平衡。
- 命令空间:7 维(运动命令始终为零 + 4 个头部姿态命令)
- 奖励:姿态保持 + 能量效率 + 力矩最小化 + 头部位置控制
- 终止条件:同 Joystick
与环境交互流程图
reset(rng)
│
▼
初始化状态:qpos, qvel, cmd
│
▼
构造 info dict(步数、命令历史、推送参数等)
│
▼
获取初始观测 obs = _get_obs(data, info, contact)
│
▼
返回初始 State
│
┌───────┴───────┐
│ │
▼ │
step(state, action)│ (循环)
│ │
▼ │
动作延迟模拟 │
动作组成为: │
motor_targets = │
default_actuator│
+ action * scale│
│ │
▼ │
物理仿真步进 │
data = mjx_env.step│
(mjx_model, │
state.data, │
motor_targets, │
n_substeps) │
│ │
▼ │
计算接触状态 │
检测终止条件 │
│ │
▼ │
计算奖励 = _get_reward(...)
│ │
▼ │
更新 info │
(步数、命令等) │
│ │
▼ │
返回新的 State────┘
标准接口
所有环境统一实现以下方法:
| 方法 | 签名 | 说明 |
|---|---|---|
reset() |
(rng) → State |
重置环境到初始状态,随机化初始位置 |
step() |
(state, action) → State |
执行一步仿真,返回新状态 |
_get_obs() |
(data, info, contact) → Observation |
构建观测空间 |
_get_reward() |
(data, action, info, ...) → dict |
计算各奖励分量 |
_get_termination() |
(data) → bool |
判断是否终止 |
观测空间与动作空间
观测空间(Joystick 环境)
标准观测(46 维):
[gyro(3), accelerometer(3), command(3),
joint_angles - default(10), joint_vel * scale(10),
last_act(10), last_last_act(10), last_last_last_act(10),
motor_targets(10), contact(2), imitation_phase(2)]
特权观测(额外维度,用于教师-学生训练):
[standard_obs, gyro(3), accelerometer(3), gravity(3),
linvel(3), global_angvel(3), joint_angles - default(10),
joint_vel(10), root_height(1), actuator_force(10),
contact(2), feet_vel(12), feet_air_time(2),
reference_motion(40), imitation_i(1), imitation_phase(2)]
动作空间
10 维动作向量,对应于 10 个执行器关节的位置偏移量:
[left_hip_yaw, left_hip_roll, left_hip_pitch, left_knee, left_ankle,
neck_pitch, head_pitch, head_yaw, head_roll,
right_hip_yaw, right_hip_roll, right_hip_pitch, right_knee, right_ankle]
动作乘以 action_scale(默认 0.25)后加到默认关节位置。
扩展性
基础环境通过接收 xml_path 参数支持不同机器人模型和场景配置。添加新任务环境只需要:
- 继承
OpenDuckMiniV2Env - 实现
reset(),step(),_get_obs(),_get_reward(),_get_termination()方法 - 通过
constants.py配置机器人特定参数
纠错,疑问,交流: 请进入讨论区或 请点击进入页面,扫码加入微信群或Q群进行交流
获取最新文章: 扫一扫加入“创客智造”公众号
欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流


















