OpenDuckMini强化学习框架入门教程-基础环境
纠错,疑问,交流: 请进入讨论区或 请点击进入页面,扫码加入微信群或Q群进行交流
获取最新文章: 扫一扫加入“创客智造”公众号
欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流
基础环境
- 进一步理解基础环境相关内容,包含类定义,关节管理系统,观测空间,动作空间等
OpenDuckMiniV2Env 类
OpenDuckMiniV2Env 是 base.py 中定义的核心类,是所有 Open Duck Mini V2 环境的基类。它继承自 mjx_env.MjxEnv,提供了 MuJoCo MJX 环境下机器人仿真的完整基础功能。
类定义
class OpenDuckMiniV2Env(mjx_env.MjxEnv):
"""Base class for Open Duck Mini V2 environments."""
def __init__(
self,
xml_path: str,
config: config_dict.ConfigDict,
config_overrides: Optional[Dict[str, Union[str, int, list[Any]]]] = None,
) -> None:
初始化流程
初始化 → 调用 MJX 父类初始化 → 加载 MJCF XML →
获取资产 → 设置仿真步长 → 创建 MJX 模型 →
自动识别关节类型 → 计算关节地址映射
关键初始化步骤:
- 模型加载:从 MJCF XML 文件加载完整模型,包括所有 STL 网格资源
- MJX 转换:将 MuJoCo 模型转换为 MJX 格式(JAX 兼容的 GPU 加速仿真)
- 关节分类:自动识别三类关节:
- 浮动基座:
floating_base_name(1 个 freejoint) - 执行器关节:
actuator_names(14 个舵机驱动的关节) - 回差关节:
backlash_joint_names(用于回差建模的虚拟关节)
- 浮动基座:
关节管理系统
基础环境实现了完整的关节管理机制,这对正确处理回差建模至关重要:
关节层级:
┌────────────────────────────────────────────────┐
│ 浮动基座 (floating) │
│ - 7 DOF: xyz(3) + quat(4) │
├────────────────────────────────────────────────┤
│ 执行器关节 (10 个主动关节 + 4 个头部关节 = 14) │
│ - 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 │
├────────────────────────────────────────────────┤
│ 回差关节 (backlash joints, 仅在 backlash 模式下) │
│ - 每个执行器关节对应一个回差虚拟关节 │
│ - 范围: ±0.5° (±0.00873 rad) │
└────────────────────────────────────────────────┘
关节地址映射:
# 关节 ID 与地址
self.actuator_joint_ids # 执行器关节 ID 列表
self.actuator_joint_qpos_addr # 执行器关节 qpos 地址
self.backlash_joint_ids # 回差关节 ID 列表
self.backlash_joint_qpos_addr # 回差关节 qpos 地址
# 速度地址
self.all_qvel_addr # 所有关节的速度地址
self.actuator_qvel_addr # 执行器关节的速度地址
核心方法
reset() — 环境重置
reset() 方法在各任务环境中具体实现(Joystick 或 Standing),基础环境不直接实现。其标准流程包括:
- 初始化
qpos和qvel为零(或从 keyframe 加载) - 添加随机初始偏移(位置、偏航角、关节角度)
- 设置初始控制器输出
- 初始化 MJX 数据
- 采样初始命令
- 构建初始观测
- 返回
mjx_env.State
step() — 仿真步进
同样由任务环境实现,标准流程:
- 处理动作延迟模拟(真实硬件的通信延迟)
- 应用外部推力(域随机化的一部分)
- 合成电机目标位置 =
default_actuator + action * action_scale - 应用电机速度限制(限制每步最大位置变化)
- 执行 MJX 仿真步进
- 检测接触状态
- 构建观测
- 判断终止条件
- 计算奖励
- 更新命令(每 500 步重新采样)
观测空间
基础环境不直接定义观测空间,而是提供传感器读取方法来构建观测:
传感器读取方法:
def get_gravity(self, data) # 重力向量(局部帧)
def get_global_linvel(self, data) # 全局线速度
def get_global_angvel(self, data) # 全局角速度
def get_local_linvel(self, data) # 局部线速度
def get_accelerometer(self, data) # 加速度计读数
def get_gyro(self, data) # 陀螺仪读数
def get_feet_pos(self, data) # 足部位置
动作空间
基础环境的动作空间维度由 mjx_model.nu 决定,即执行器的数量:
@property
def action_size(self) -> int:
return self._mjx_model.nu # Open Duck Mini V2: 14
状态操作工具
基础环境提供了一套完整的状态操作工具方法:
# 浮动基座操作
get_floating_base_qpos(data) # 获取浮动基座位置 (7: xyz + quat)
get_floating_base_qvel(data) # 获取浮动基座速度 (6: lin + ang)
set_floating_base_qpos(new, qpos) # 设置浮动基座位置
set_floating_base_qvel(new, qvel) # 设置浮动基座速度
# 执行器关节操作
get_actuator_joints_qpos(data) # 获取执行器关节位置
get_actuator_joints_qvel(data) # 获取执行器关节速度
set_actuator_joints_qpos(new, qpos) # 设置执行器关节位置
set_actuator_joints_qvel(new, qvel) # 设置执行器关节速度
# 回差关节操作
get_actuator_backlash_qpos(data) # 获取回差关节位置
# 关节查询
get_joint_id_from_name(name) # 通过名称获取关节 ID
get_joint_addr_from_name(name) # 通过名称获取关节地址
get_actuator_id_from_name(name) # 通过名称获取执行器 ID
与 MJX 的集成
基础环境通过 MJX 实现 GPU 加速的批量仿真,这对强化学习的训练效率至关重要:
mj_model:标准 MuJoCo 模型(用于单次仿真和查询)mjx_model:MJX 模型(用于 JAX 兼容的批量仿真)mjx_env.init():初始化 MJX 数据mjx_env.step():执行 MJX 仿真步进
这种双模型设计使得环境既能用于训练(通过 MJX 的向量化能力),也能用于单次推理(通过标准 MuJoCo)。
回差建模支持
回差(backlash)建模是框架的特色功能之一。基础环境通过以下方式支持:
- 虚拟回差关节:在每个实际关节旁边添加一个小范围的虚拟关节
- 关节隔离:通过
exclude_backlash_joints_addr()等方法过滤回差关节 - 观测融合:在观测构建过程中,将回差偏移叠加到关节位置
纠错,疑问,交流: 请进入讨论区或 请点击进入页面,扫码加入微信群或Q群进行交流
获取最新文章: 扫一扫加入“创客智造”公众号
欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流


















