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"引入机器人模型
这种模块化结构使得:
- 传感器配置可在不同模型版本间复用
- 关节属性(如舵机参数)可在模型间共享
- 场景文件只需关注地形和渲染配置
纠错,疑问,交流: 请进入讨论区或 请点击进入页面,扫码加入微信群或Q群进行交流
获取最新文章: 扫一扫加入“创客智造”公众号
欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流


















