turtlebot3-burger_150.png
turtlebot3-waffle-pi_150.png
turtlebot3-arm_150.png
walking-y2_150.png
turbot3-multi_150.png
turbot3-dl-ros1_150.png
turbot3-ai.png
turbot3-dl-ros2_150.png
turbot3-slam_150.png
turbot3-arm_150.png
turtlebot4-lite_150.png
turtlebot4-pro_150.png
turbot4-dl_150.png
turbot4-ai_150.png
aidriving-racebot_150.png
aidriving-autodrive_150.png
turtlebot-arm_150.png
openmanipulator-x_150.png
Home » OpenDuckMini强化学习框架入门教程 » OpenDuckMini强化学习框架入门教程-基础环境

OpenDuckMini强化学习框架入门教程-基础环境

纠错,疑问,交流: 请进入讨论区请点击进入页面,扫码加入微信群或Q群进行交流

获取最新文章: 扫一扫加入“创客智造”公众号

欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流

群二维码

基础环境

  • 进一步理解基础环境相关内容,包含类定义,关节管理系统,观测空间,动作空间等

OpenDuckMiniV2Env 类

OpenDuckMiniV2Envbase.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 模型 →
自动识别关节类型 → 计算关节地址映射

关键初始化步骤:

  1. 模型加载:从 MJCF XML 文件加载完整模型,包括所有 STL 网格资源
  2. MJX 转换:将 MuJoCo 模型转换为 MJX 格式(JAX 兼容的 GPU 加速仿真)
  3. 关节分类:自动识别三类关节:
    • 浮动基座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),基础环境不直接实现。其标准流程包括:

  1. 初始化 qposqvel 为零(或从 keyframe 加载)
  2. 添加随机初始偏移(位置、偏航角、关节角度)
  3. 设置初始控制器输出
  4. 初始化 MJX 数据
  5. 采样初始命令
  6. 构建初始观测
  7. 返回 mjx_env.State

step() — 仿真步进

同样由任务环境实现,标准流程:

  1. 处理动作延迟模拟(真实硬件的通信延迟)
  2. 应用外部推力(域随机化的一部分)
  3. 合成电机目标位置 = default_actuator + action * action_scale
  4. 应用电机速度限制(限制每步最大位置变化)
  5. 执行 MJX 仿真步进
  6. 检测接触状态
  7. 构建观测
  8. 判断终止条件
  9. 计算奖励
  10. 更新命令(每 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)建模是框架的特色功能之一。基础环境通过以下方式支持:

  1. 虚拟回差关节:在每个实际关节旁边添加一个小范围的虚拟关节
  2. 关节隔离:通过 exclude_backlash_joints_addr() 等方法过滤回差关节
  3. 观测融合:在观测构建过程中,将回差偏移叠加到关节位置

纠错,疑问,交流: 请进入讨论区请点击进入页面,扫码加入微信群或Q群进行交流

获取最新文章: 扫一扫加入“创客智造”公众号

欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流

群二维码

标签: OpenDuckMini强化学习框架