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强化学习框架入门教程-机器人模型XML结构

OpenDuckMini强化学习框架入门教程-机器人模型XML结构

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

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

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

群二维码

机器人模型XML结构

  • 理解机器人模型XML结构,包含MJCF 格式,Body/Joint 层级,主要 XML 元素,场景 XML 结构和include 机制等

MJCF 格式

MuJoCo 使用 MJCF(MuJoCo XML Format)定义机器人模型。它是一种声明式格式,包含运动学、动力学、传感器、渲染等多方面信息。Open Duck Mini V2 的 MJCF 遵循以下顶层结构:

<mujoco model="open_duck_mini_v2">
    <option>           ← 物理引擎选项
    <compiler>         ← 编译器设置
    <default>          ← 默认类定义
    <worldbody>        ← 机器人 body 层级树
    <actuator>         ← 执行器定义
    <sensor>           ← 传感器定义
    <asset>            ← 网格和材质资源
    <equality>         ← 等式约束
</mujoco>

Body/Joint 层级

机器人通过 Body/Joint 树形结构定义运动学链:

<worldbody>
  <body name="base" pos="0 0 0.22">
    <freejoint name="floating_base"/>
    <site name="imu" pos="-0.08 -0.0 0.05"/>
    
    <body name="trunk_assembly" childclass="open_duck_mini_v2">
      <inertial pos="..." mass="0.698526" fullinertia="..."/>
      <geom type="mesh" class="visual" mesh="body_front".../>
      
      <!-- 左腿链 -->
      <body name="hip_roll_assembly">
        <joint name="left_hip_yaw" type="hinge" range="..." class="sts3215"/>
        <inertial .../>
        
        <body name="left_roll_to_pitch_assembly">
          <joint name="left_hip_roll" type="hinge" range="..." class="sts3215"/>
          ...
          
          <body name="knee_and_ankle_assembly">
            <joint name="left_hip_pitch" type="hinge" range="..." class="sts3215"/>
            ...
            
            <body name="knee_and_ankle_assembly_2">
              <joint name="left_knee" type="hinge" range="..." class="sts3215"/>
              ...
              
              <body name="foot_assembly">
                <joint name="left_ankle" type="hinge" range="..." class="sts3215"/>
                ...
              </body>
            </body>
          </body>
        </body>
      </body>
      
      <!-- 右腿链 (对称) -->
      <body name="hip_roll_assembly_2">...</body>
      
      <!-- 颈部+头部链 -->
      <body name="neck_pitch_assembly">...</body>
      
    </body>
  </body>
</worldbody>

主要 XML 元素

<compiler> — 编译器设置

<compiler angle="radian" meshdir="assets"/>
属性 说明
angle radian 所有角度使用弧度
meshdir assets STL 网格文件目录

<option> — 物理引擎选项

<option iterations="1" ls_iterations="5">
    <flag eulerdamp="disable"/>
</option>
属性 说明
iterations 1 CG 求解器迭代次数
ls_iterations 5 线搜索迭代次数
eulerdamp disable 禁用欧拉阻尼

<default> — 默认类

定义可复用的类属性,通过 class 属性引用:

<default>
    <default class="open_duck_mini_v2">
        <joint frictionloss="0.1" armature="0.005"/>
        <position kp="50" dampratio="1"/>
        <default class="visual">
            <geom type="mesh" contype="0" conaffinity="0" group="2"/>
        </default>
        <default class="collision">
            <geom group="3"/>
        </default>
    </default>
</default>

类继承层级:

open_duck_mini_v2 (最通用)
    ├── visual (可视化几何,group=2)
    ├── collision (碰撞几何,group=3)
    └── sts3215 (舵机关节属性)
    └── backlash (回差关节属性)

<body> — 运动链节点

每个 body 代表一个刚体:

<body name="trunk_assembly" pos="0 0 0.0" quat="1 0 0 0" childclass="open_duck_mini_v2">
    <inertial pos="-0.048 -9.9e-05 0.038" mass="0.698526" 
              fullinertia="0.00168 0.00344 0.00293 -1.3e-05 -3.2e-05 -2.2e-06"/>
    <geom type="mesh" class="visual" mesh="body_front" material="body_front_material"/>
    ...
</body>
属性 说明
name 唯一标识符
pos 相对于父 body 的位置
quat 相对于父 body 的姿态四元数
childclass 子元素默认使用的 class

<joint> — 关节

<joint name="left_hip_yaw" type="hinge" range="-0.524 0.524" class="sts3215"/>
属性 说明
name 关节名称
type 关节类型(hinge=转动, free=自由)
range 运动范围 [min, max] (弧度)
class 引用的默认类(定义阻尼、摩擦等)

<freejoint> — 浮动基座

定义机器人在世界坐标系中的 6 自由度运动:

<freejoint name="floating_base"/>

浮动基座自动提供 7 个状态变量(位置 xyz + 姿态四元数)和 6 个速度变量(线速度 xyz + 角速度 xyz)。

<geom> — 几何体

<geom type="mesh" class="visual" mesh="body_front" material="body_front_material"/>
<geom type="mesh" class="collision" mesh="foot_bottom_tpu" name="left_foot_bottom_tpu"/>
属性 说明
type 几何类型(mesh=网格, plane=平面)
class 几何类(visual=可视化, collision=碰撞)
mesh 引用的网格名称
material 引用的材质名称
contype/conaffinity 碰撞类型和碰撞亲和性
group 几何分组(2=视觉, 3=碰撞)

<site> — 参考点

用于传感器定位和参考帧:

<site name="imu" pos="-0.08 -0.0 0.05"/>
<site name="left_foot" pos="0.0005 -0.036225 0.01955" 
      quat="0.707107 -0.707107 -0 1.72494e-18"/>

<actuator> — 执行器

<position class="sts3215" name="left_hip_yaw" joint="left_hip_yaw" inheritrange="1"/>
属性 说明
类型 position(位置控制模式)
class 引用舵机属性类
name 执行器名称
joint 控制的关节名称
inheritrange 是否继承关节范围

<asset> — 资产

定义网格文件和材质:

<asset>
    <mesh file="body_back.stl"/>
    <mesh file="foot_bottom_tpu.stl"/>
    <!-- ... 共 28 个 STL 网格 -->
    
    <material name="body_front_material" rgba="0.918 0.918 0.918 1"/>
    <material name="foot_bottom_tpu_material" rgba="0.306 0.298 0.278 1"/>
    <!-- ... 材质定义 -->
</asset>

场景 XML 结构

场景文件(如 scene_flat_terrain.xml)包含机器人模型和场景定义:

<mujoco model="scene">
    <!-- 包含机器人模型 -->
    <include file="open_duck_mini_v2.xml"/>
    
    <!-- 场景渲染设置 -->
    <visual>
        <headlight diffuse="0.6 0.6 0.6" ambient="0.3 0.3 0.3" specular="0 0 0"/>
        <global azimuth="160" elevation="-20"/>
    </visual>
    
    <!-- 地面材质 -->
    <asset>
        <texture type="skybox" builtin="gradient" .../>
        <texture type="2d" name="groundplane" builtin="checker" .../>
        <material name="groundplane" texture="groundplane" .../>
    </asset>
    
    <!-- 地面几何体 -->
    <worldbody>
        <body name="floor">
            <geom name="floor" type="plane" material="groundplane" 
                  contype="1" conaffinity="0" friction="0.6"/>
        </body>
    </worldbody>
    
    <!-- 初始姿态 -->
    <keyframe>
        <key name="home" qpos="..." ctrl="..."/>
    </keyframe>
</mujoco>

include 机制

Open Duck Playground 使用 XML include 机制分离关注点:

  • 主模型open_duck_mini_v2.xml 通过 include 引入传感器和关节属性定义的 XML 文件
  • 场景文件:通过 include file="open_duck_mini_v2.xml" 引入机器人模型

这种模块化结构使得:

  1. 传感器配置可在不同模型版本间复用
  2. 关节属性(如舵机参数)可在模型间共享
  3. 场景文件只需关注地形和渲染配置

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

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

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

群二维码

标签: OpenDuckMini强化学习框架