XML主要分为以下三个部分:
mujoco官方文档给了xml文件能写的内容
XML Reference
<mujoco model="example">
<compiler angle="radian" meshdir="meshes"/>
<asset>
<mesh file="base.STL" />
<mesh file="link1.STL" />
<mesh file="link2.STL" />
asset>
<worldbody>
<light directional="true" pos="-0.5 0.5 3" dir="0 0 -1" />
<geom name="floor" pos="0 0 0" size="1 1 1" type="plane" rgba="1 0.83 0.61 0.5"/>
<body name="hand" pos="0 0 0" mocap="true">
<geom type="box" size=".01 .02 .03" rgba="0 .9 0 .5" contype="2"/>
body>
<body name="base" pos="0 0 0">
<geom name="link0" type="mesh" mesh="base" pos="0 0 0"/>
<inertial pos="0 0 0" mass="0" diaginertia="0 0 0"/>
<body name="link1" pos="0 0 1">
<joint name="joint0" axis="0 0 1" pos="0 0 0"/>
<geom name="link1" type="mesh" mesh="link1" pos="0 0 0" euler="0 3.14 0"/>
<inertial pos="0 0 0" mass="0.75" diaginertia="1 1 1"/>
<body name="link2" pos="0 0 1">
<joint name="joint1" axis="0 0 1" pos="0 0 0"/>
<geom name="link2" type="mesh" mesh="link2" pos="0 0 0" euler="0 3.14 0"/>
<inertial pos="0 0 0" mass="0.75" diaginertia="1 1 1"/>
<body name="EE" pos="0 0.2 0.2">
<inertial pos="0 0 0" mass="0" diaginertia="0 0 0" />
body>
body>
body>
body>
worldbody>
<actuator>
<motor name="joint0_motor" joint="joint0"/>
<motor name="joint1_motor" joint="joint1"/>
actuator>
mujoco>
<mesh name="base_link" file="base_link.obj"/>
<geom type="mesh" mesh="base_link"/>
< default> 定义的属性模板通过 class 属性 在后续的 < body>, < joint>, < geom> 等元素中引用。
基本引用规则:
<default>
<default class="robot">
<geom friction="0.6" margin="0.001"/>
<joint damping="2"/>
<motor ctrlrange="-23.7 23.7"/>
<default class="abduction">
<joint axis="1 0 0" range="-1.0472 1.0472"/>
default>
<default class="knee">
<joint range="-2.7227 -0.83776"/>
<motor ctrlrange="-45.43 45.43"/>
default>
default>
default>
根类使用
<body name="base" childclass="robot">
<geom type="box" size="0.1 0.1 0.1"/>
<joint name="free_joint"/>
body>
子类abduction使用
<body name="FL_hip">
<joint name="FL_hip_joint" class="abduction"/>
body>
所以也就是说使用了 < joint class=“abduction”>的,有damping=“2"属性,也有axis=“1 0 0” range=”-1.0472 1.0472"属性。
显式覆盖
<default>
<default class="aa">
<geom rgba="1 0 0 1" friction="0.8"/>
<joint damping="3"/>
default>
default>
<body name="parent" childclass="aa">
<body name="child1">
<geom type="box"/>
<joint type="hinge"/>
body>
<body name="child2">
<geom type="sphere" rgba="0 1 0 1"/>
<joint type="slide" damping="1"/>
body>
body>
childclass 的作用范围仅作用于 < body> 标签内直接嵌套的子 < body>,当前刚体不使用这个属性,子刚体的子刚体(孙子级)不会自动继承该 childclass,除非它们也被显式设置。
<body name="parent" childclass="aa">
<geom/>
<body name="child1">
<geom/>
<body name="grandchild">
<geom/>
body>
body>
body>
<body name="parent" childclass="aa">
<body name="child1" childclass="aa">
<body name="grandchild">
<geom/>
body>
body>
body>
class仅作用于当前 < body> 自身,不会自动传递给任何子刚体,子刚体若需继承,必须显式设置自己的 class 或 childclass。
<default>
<default class="robot_part">
<geom rgba="1 0 0 1"/>
<joint damping="5"/>
default>
default>
<body name="parent" class="robot_part">
<geom type="box"/>
<body name="child">
<geom type="sphere"/>
body>
body>
类名是要唯一的
同级 < default> 类名不能重复:在相同嵌套层级下,class 名称必须唯一。
<default>
<default class="a">...default>
<default class="b">...default>
<default class="a">...default>
default>
子类只是会继承父类的属性,并不是嵌套使用的关系,body能直接使用aa和bb,所以aa和bb不能同名
<default class="a">
<default class="aa">...default>
default>
<default class="b">
<default class="bb">...default>
default>
跟urdf的link和joint写法不一样,但是逻辑是一样的。
两个 < body>(刚体)通过 关节(< joint>) 实现物理连接,关节定义了它们之间的运动约束关系。
父子结构:子 < body> 必须嵌套在父 < body> 内,嵌套关系表达了父子关节,joint就不用写父子关节了。
关节定义位置:关节 < joint> 必须定义在 子 < body> 内部。
默认行为:若无关节,子刚体会与父刚体刚性固定。
关节作用:添加关节后,子刚体可相对父刚体运动(旋转或平移)。
<body name="parent_body" pos="0 0 0">
body>
<body name="parent_body">
<body name="child_body" pos="0 0 0.1">
body>
body>
<body name="parent_body">
<body name="child_body" pos="0 0 0.1">
<joint name="child_joint" type="hinge" axis="0 1 0"/>
<geom type="box" size="0.1 0.1 0.1"/>
body>
body>
类似下面的urdf
<link name="parent_link"/>
<joint name="child_joint" type="revolute">
<parent link="parent_link"/>
<child link="child_link"/>
<axis xyz="0 1 0"/>
joint>
<link name="child_link"/>
特性 | URDF | MuJoCo |
---|---|---|
连接方式 | 显式通过 < parent> 和 标签 | 隐式通过 < body> 嵌套层级 |
关节位置 | 独立于 < link> 之外 | 必须定义在子 < body> 内部 |
初始偏移 | 在 < joint> 的 中定义 | 在子 < body> 的 pos 属性中定义 |
几何体定义 | 在 < link> 内通过 < visual>/< collision> | 直接在 < body> 内通过 < geom> |
能写的属性
属性 | 类型 | 描述 |
---|---|---|
name | 字符串 | 关节的唯一标识符。 |
type | 字符串 | 关节的类型(如hinge、slide、ball等),决定了关节的运动方式。 |
pos | 数组 | 关节相对于其父体的位置,默认为(0,0,0)。 |
axis | 数组 | 运动轴向量,对于hinge和slide关节类型,这是旋转或滑动发生的方向。 |
range | 数组 | 关节运动的范围,通常为一个最小值和一个最大值的数组。限制了关节可以达到的最小和最大位置。 |
damping | 浮点数 | 关节的阻尼系数,用于模拟运动中的能量损失。 |
stiffness | 浮点数 | 关节的刚度,用于模拟弹簧效果,影响关节回到初始位置的力度。 |
armature | 浮点数 | 附加到关节轴上的虚拟质量,用于稳定仿真。可以认为是增加关节惯性的一种方式,有助于防止数值问题。 |
limited | 布尔值 | 指示关节是否受到range属性定义的范围限制。默认为true,表示受限。 |
关节类型:Hinge(铰链关节),Slide(滑动关节),Ball(球形关节),free(自由关节)