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交流群,微信扫描右侧二维码立即进群交流

群二维码

环境架构

  • 进一步理解软件环境架构

分层架构概览

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 参数支持不同机器人模型和场景配置。添加新任务环境只需要:

  1. 继承 OpenDuckMiniV2Env
  2. 实现 reset(), step(), _get_obs(), _get_reward(), _get_termination() 方法
  3. 通过 constants.py 配置机器人特定参数

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

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

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

群二维码

标签: OpenDuckMini强化学习框架