先前完成了urdf文件转xml文件的操作【已该博客为例】:
Mujoco仿真【将urdf文件转化为xml文件】-CSDN博客
下面继续来学习关于mujoco仿真中的xml文件:
MuJoCo XML 文件是描述 MuJoCo(Multi-Joint dynamics with Contact)物理引擎模型的一种格式。这些文件定义了仿真环境、机器人模型、物体属性等,用于进行仿真实验。让我来解释一下 MuJoCo XML 文件的一般结构和一些常见的元素:
根元素
<mujoco>
:<mujoco>
是 XML 文件的根元素,包含了整个 MuJoCo 模型的描述。- 在
<mujoco>
元素内部可以包含模型的各种属性,如模拟选项、材质、几何体等。
模拟选项
<option>
:<option>
元素用于定义模拟器的一些选项,如积分器类型、时间步长等。
资源元素
<asset>
:<asset>
元素用于定义模型中使用的材质、纹理和网格等资源。- 可以在
<asset>
元素内部定义各种材质和纹理,并将它们应用到模型的几何体上。
世界主体
<worldbody>
:<worldbody>
元素用于定义模型中的世界主体,即仿真环境和物体的物理属性。- 在
<worldbody>
元素内部可以定义各种刚体、关节、接触关系等。
关节和连接
<joint>
、<geom>
等:<joint>
元素用于定义关节,描述了刚体之间的运动关系。<geom>
元素用于定义几何体,描述了刚体的形状和碰撞属性。- 其他可能的元素还包括
<body>
、<site>
、<camera>
等,用于定义模型的其他属性,如质量、碰撞检测、观察视角等。
接触参数
<contact>
:<contact>
元素用于定义刚体之间的接触关系。- 可以在
<contact>
元素内部指定哪些刚体之间允许接触,哪些不允许接触。
模型属性
<default>
:<default>
元素用于定义模型中元素的默认属性,如视觉属性、碰撞属性等。- 可以在
<default>
元素内部指定默认的视觉效果、碰撞属性等,以简化模型定义。
MuJoCo XML 文件的结构和元素可以根据具体的仿真任务和模型的需求进行定制和扩展,这使得 MuJoCo 成为一个非常灵活和强大的物理仿真工具。
下面结合一些xml代码案例来进行学习:
<mujoco model="aubo_i5">
<compiler angle="radian" meshdir="meshes" autolimits="true" />
<option integrator="implicitfast"/>
这段代码是 MuJoCo XML 文件的一部分,用于定义模型的一些基本属性和仿真选项。
<mujoco model="aubo_i5">
:<mujoco>
标签是 XML 文件的根元素,表示一个 MuJoCo 模型。model="aubo_i5"
指定了模型的名称为 "aubo_i5",用于标识该模型。
<compiler angle="radian" meshdir="meshes" autolimits="true" />
:<compiler>
元素用于指定编译器的一些选项,用于处理模型中的几何体和碰撞检测。angle="radian"
指定了角度单位为弧度,这意味着在模型中使用的角度单位是弧度而不是度。meshdir="meshes"
指定了网格文件的目录为 "meshes",这是指定模型中使用的网格文件的位置。autolimits="true"
表示开启了自动限制选项,MuJoCo 会自动对关节和连接的角度、速度等进行限制,以确保仿真的稳定性和准确性。
<option integrator="implicitfast"/>
:<option>
元素用于定义模拟器的选项,例如积分器类型、时间步长等。integrator="implicitfast"
指定了积分器类型为 "implicitfast",这是一种积分器,用于模拟系统的动力学行为。 "implicitfast" 是一种快速但准确的隐式积分器,适用于许多多体动力学系统的仿真。
<default>
<default class="visual">
<geom group="2" type="mesh" contype="0" conaffinity="0" density="0"/>
</default>
<default class="collision">
<geom group="3" type="mesh" density="2700"/>
</default>
</default>
这段代码是 MuJoCo XML 文件中的 <default>
元素,用于定义模型中几何体的默认属性,分为视觉(visual)和碰撞(collision)两个类别。
<default class="visual">
:- 这个部分定义了视觉几何体的默认属性。
<geom>
元素用于定义几何体的属性,其中包括:group="2"
:将几何体分组为 2。在 MuJoCo 中,可以为不同的几何体分配不同的组别,以便在后续定义接触时使用。通常,不同的组别表示不同的材质或物理属性。type="mesh"
:几何体的类型是网格,表示它由网格组成。contype="0"
:几何体的接触类型。在这里,设置为 0,表示这个几何体不会参与任何碰撞。conaffinity="0"
:几何体的接触亲和性。设置为 0 表示这个几何体不会与任何其他几何体发生接触。density="0"
:几何体的密度。在这里,设置为 0,表示这个几何体没有质量,通常用于视觉效果而不是物理模拟。
<default class="collision">
:- 这个部分定义了碰撞几何体的默认属性。
<geom>
元素用于定义碰撞几何体的属性,其中包括:group="3"
:将几何体分组为 3。和视觉几何体类似,这个组别用于定义接触时的物理特性。type="mesh"
:几何体的类型是网格,表示它由网格组成。density="2700"
:几何体的密度。在这里,设置为 2700,表示这个几何体具有密度,可以参与物理模拟。
<asset>
<material name="Opaque(63,63,63)" specular="0.5" shininess="0.5" rgba="0.250980 0.250980 0.250980 1.0"/>
<material name="Opaque(229,234,237)" specular="0.5" shininess="0.5" rgba="0.898039 0.917647 0.929412 1.0"/>
<material name="Opaque(232,133,0)" specular="0.5" shininess="0.5" rgba="0.909804 0.521569 0.000000 1.0"/>
<material name="Opaque(202,209,238)" specular="0.5" shininess="0.5" rgba="0.792157 0.819608 0.933333 1.0"/>
<material name="Opaque(255,255,255)" specular="0.5" shininess="0.5" rgba="1.000000 1.000000 1.000000 1.0"/>
<mesh file="visual/base_link_0.obj" scale="0.001 0.001 0.001"/>
<mesh file="visual/base_link_1.obj" scale="0.001 0.001 0.001"/>
<mesh file="visual/shoulder_link_0.obj" scale="0.001 0.001 0.001"/>
<mesh file="visual/shoulder_link_1.obj" scale="0.001 0.001 0.001"/>
<mesh file="visual/upper_arm_link_0.obj" scale="0.001 0.001 0.001"/>
<mesh file="visual/upper_arm_link_1.obj" scale="0.001 0.001 0.001"/>
<mesh file="visual/forearm_link_0.obj" scale="0.001 0.001 0.001"/>
<mesh file="visual/forearm_link_1.obj" scale="0.001 0.001 0.001"/>
<mesh file="visual/wrist_1_link_0.obj" scale="0.001 0.001 0.001"/>
<mesh file="visual/wrist_1_link_1.obj" scale="0.001 0.001 0.001"/>
<mesh file="visual/wrist_2_link_0.obj" scale="0.001 0.001 0.001"/>
<mesh file="visual/wrist_2_link_1.obj" scale="0.001 0.001 0.001"/>
<mesh file="visual/wrist_3_link_0.obj" scale="0.001 0.001 0.001"/>
<mesh file="visual/wrist_3_link_1.obj" scale="0.001 0.001 0.001"/>
<mesh file="visual/wrist_3_link_2.obj" scale="0.001 0.001 0.001"/>
<mesh file="visual/wrist_3_link_3.obj" scale="0.001 0.001 0.001"/>
<mesh file="collision/base_link_collision.stl" scale="0.001 0.001 0.001"/>
<mesh file="collision/shoulder_link_collision.stl" scale="0.001 0.001 0.001"/>
<mesh file="collision/upper_arm_link_collision_0.stl" scale="0.001 0.001 0.001"/>
<mesh file="collision/upper_arm_link_collision_1.stl" scale="0.001 0.001 0.001"/>
<mesh file="collision/upper_arm_link_collision_2.stl" scale="0.001 0.001 0.001"/>
<mesh file="collision/forearm_link_collision_0.stl" scale="0.001 0.001 0.001"/>
<mesh file="collision/forearm_link_collision_1.stl" scale="0.001 0.001 0.001"/>
<mesh file="collision/forearm_link_collision_2.stl" scale="0.001 0.001 0.001"/>
<mesh file="collision/wrist_1_link_collision.stl" scale="0.001 0.001 0.001"/>
<mesh file="collision/wrist_2_link_collision.stl" scale="0.001 0.001 0.001"/>
<mesh file="collision/wrist_3_link_collision.stl" scale="0.001 0.001 0.001"/>
</asset>
这段代码是 MuJoCo XML 文件中的 <asset>
元素,用于定义模型中使用的各种资源,包括材质和网格文件。
材质定义:
<material>
元素用于定义材质,其中包括:name
:材质的名称。specular
:材质的高光反射强度。shininess
:材质的高光反射锐度。rgba
:材质的颜色,以 RGBA 格式表示。
- 在这个例子中,定义了五种不同的材质,分别具有不同的名称、高光反射强度、高光反射锐度和颜色。
网格文件引用:
<mesh>
元素用于引用网格文件,其中包括:file
:网格文件的路径。scale
:网格的缩放比例。
- 这里列出了模型中使用的各种网格文件,并指定了它们的路径和缩放比例。
在 MuJoCo 模拟中,这些资源定义了模型的外观和物理属性。材质定义了物体表面的外观特性,而网格文件则定义了物体的形状。这些资源可以在模型中被引用和应用,从而实现视觉效果和物理模拟。
<worldbody>
<body name="base_link">
<inertial pos="5.28033e-09 0.00159669 0.0165705" quat="0.495398 0.50456 -0.50456 0.495398" mass="1.43822" diaginertia="0.0055319 0.003103 0.0028571"/>
<geom mesh="base_link_0" material="Opaque(229,234,237)" class="visual"/>
<geom mesh="base_link_1" material="Opaque(63,63,63)" class="visual"/>
<geom mesh="base_link_collision" class="collision"/>
<body name="shoulder_link" pos="0 0 0.0435">
<inertial pos="-4.18504e-07 -0.00538388 0.0698852" quat="0.997139 0.0755851 0 0" mass="3.99774" diaginertia="0.010612 0.0103292 0.00776575"/>
<joint name="shoulder_pan_joint" pos="0 0 0" axis="0 0 1" range="-3.04 3.04"/>
<geom mesh="shoulder_link_0" pos="0 0 -0.0435" material="Opaque(63,63,63)" class="visual"/>
<geom mesh="shoulder_link_1" pos="0 0 -0.0435" material="Opaque(232,133,0)" class="visual"/>
<geom mesh="shoulder_link_collision" pos="0 0 -0.0435" class="collision"/>
<body name="upper_arm_link" pos="0 -0.062 0.0785">
<inertial pos="4.51558e-10 -0.0717894 0.204" quat="1 0 -1.45662e-06 0" mass="10.2644" diaginertia="0.367413 0.361705 0.024156"/>
<joint name="shoulder_lift_joint" pos="0 0 0" axis="0 -1 0" range="-3.04 3.04"/>
<geom mesh="upper_arm_link_0" pos="0 0.062 -0.122" material="Opaque(63,63,63)" class="visual"/>
<geom mesh="upper_arm_link_1" pos="0 0.062 -0.122" material="Opaque(232,133,0)" class="visual"/>
<geom mesh="upper_arm_link_collision_0" pos="0 0.062 -0.122" class="collision"/>
<geom mesh="upper_arm_link_collision_1" pos="0 0.062 -0.122" class="collision"/>
<geom mesh="upper_arm_link_collision_2" pos="0 0.062 -0.122" class="collision"/>
<body name="forearm_link" pos="0 0 0.408">
<inertial pos="-8.5989e-08 0.0377796 0.186257" quat="0.999989 -0.00464387 0 0" mass="5.71706" diaginertia="0.110129 0.109714 0.00516198"/>
<joint name="elbow_joint" pos="0 0 0" axis="0 1 0" range="-3.04 3.04"/>
<geom mesh="forearm_link_0" pos="0 0.062 -0.53" material="Opaque(63,63,63)" class="visual"/>
<geom mesh="forearm_link_1" pos="0 0.062 -0.53" material="Opaque(232,133,0)" class="visual"/>
<geom mesh="forearm_link_collision_0" pos="0 0.062 -0.53" class="collision"/>
<geom mesh="forearm_link_collision_1" pos="0 0.062 -0.53" class="collision"/>
<geom mesh="forearm_link_collision_2" pos="0 0.062 -0.53" class="collision"/>
<body name="wrist_1_link" pos="0 -0.0175 0.376">
<inertial pos="4.04369e-07 -0.0378176 0.010378" quat="0.996128 0.0879183 0 0" mass="1.19598" diaginertia="0.001481 0.00143005 0.000971945"/>
<joint name="wrist_1_joint" pos="0 0 0" axis="0 -1 0" range="-3.04 3.04"/>
<geom mesh="wrist_1_link_0" pos="0 0.0795 -0.906" material="Opaque(63,63,63)" class="visual"/>
<geom mesh="wrist_1_link_1" pos="0 0.0795 -0.906" material="Opaque(232,133,0)" class="visual"/>
<geom mesh="wrist_1_link_collision" pos="0 0.0795 -0.906" class="collision"/>
<body name="wrist_2_link" pos="0 -0.042 0.06056">
<inertial pos="-3.83591e-07 -0.0103783 0.0378173" quat="0.766536 0.642201 0 0" mass="1.19598" diaginertia="0.001481 0.00143005 0.000971945"/>
<joint name="wrist_2_joint" pos="0 0 0" axis="0 0 1" range="-3.04 3.04"/>
<geom mesh="wrist_2_link_0" pos="0 0.1215 -0.96656" material="Opaque(63,63,63)" class="visual"/>
<geom mesh="wrist_2_link_1" pos="0 0.1215 -0.96656" material="Opaque(232,133,0)" class="visual"/>
<geom mesh="wrist_2_link_collision" pos="0 0.1215 -0.96656" class="collision"/>
<body name="wrist_3_link" pos="0 -0.06056 0.042">
<inertial pos="4.15409e-09 -0.0185535 0.000352259" quat="0.707088 -0.00519777 0.00519777 0.707088" mass="0.192478" diaginertia="0.000169015 0.000104 0.000100985"/>
<joint name="wrist_3_joint" pos="0 0 0" axis="0 -1 0" range="-3.04 3.04"/>
<geom mesh="wrist_3_link_0" pos="0 0.18206 -1.00856" material="Opaque(229,234,237)" class="visual"/>
<geom mesh="wrist_3_link_1" pos="0 0.18206 -1.00856" material="Opaque(63,63,63)" class="visual"/>
<geom mesh="wrist_3_link_2" pos="0 0.18206 -1.00856" material="Opaque(63,63,63)" class="visual"/>
<geom mesh="wrist_3_link_3" pos="0 0.18206 -1.00856" material="Opaque(63,63,63)" class="visual"/>
<geom mesh="wrist_3_link_collision" pos="0 0.18206 -1.00856" class="collision"/>
<body name="tool0_link" pos="0 -0.0335 0" quat="0.7071068 0.7071068 0 0">
<site name="attachment_site" pos="0 0 0" quat="1 0 0 0"/>
<site name="eef_site" pos="0 0 0.2" quat="0 -0.7071068 -0.7071068 0"/>
</body>
</body>
</body>
</body>
</body>
</body>
</body>
</body>
</worldbody>
这段代码是 MuJoCo XML 文件中的 <worldbody>
元素,用于定义仿真世界中的物体和它们之间的关系。以下是对其中内容的详细解释:
<body>
元素:<body>
元素用于定义仿真世界中的物体。- 每个
<body>
元素都有一个name
属性,用于指定物体的名称。 - 可以在一个
<body>
元素内部嵌套另一个<body>
元素,以实现层级结构。
<inertial>
元素:<inertial>
元素用于定义物体的惯性属性,包括位置、姿态、质量和惯性张量。pos
属性指定了惯性原点的位置。quat
属性指定了惯性原点的姿态,使用四元数表示。mass
属性指定了物体的质量。diaginertia
属性指定了物体的惯性张量的对角元素。
<joint>
元素:<joint>
元素用于定义连接两个物体的关节。name
属性指定了关节的名称。pos
属性指定了关节的位置。axis
属性指定了关节的旋转轴。range
属性指定了关节的旋转范围。
<geom>
元素:<geom>
元素用于定义物体的几何形状,用于视觉和碰撞检测。mesh
属性指定了几何形状的网格文件。material
属性指定了几何形状的材质。class
属性指定了几何形状的类别,如视觉 (visual
) 或碰撞 (collision
)。
嵌套结构:
- 在这个例子中,每个
<body>
元素都包含了其自身的惯性属性、关节和几何形状。 - 通过嵌套
<body>
元素,可以实现多级的物体层级结构,从而构建复杂的仿真世界。
- 在这个例子中,每个
通过这种方式,可以在 MuJoCo 中定义具有层级结构的复杂物体,并指定它们的惯性属性、关节连接和几何形状,以构建逼真的仿真场景。
<contact>
<exclude body1="base_link" body2="shoulder_link"/>
<!-- <exclude body1="shoulder_link" body2="upper_arm_link"/>
<exclude body1="upper_arm_link" body2="forearm_link"/>
<exclude body1="forearm_link" body2="wrist_1_link"/>
<exclude body1="wrist_1_link" body2="wrist_2_link"/>
<exclude body1="wrist_2_link" body2="wrist_3_link"/> -->
</contact>
这段代码是 MuJoCo XML 文件中的 <contact>
元素,用于定义物体之间的接触关系。在这里,通过 <exclude>
元素排除了一些物体之间的接触关系,使它们不会相互接触。以下是对其中内容的详细解释:
<exclude>
元素:<exclude>
元素用于排除指定物体之间的接触关系,使它们不会发生碰撞。body1
属性指定了第一个物体的名称。body2
属性指定了第二个物体的名称。- 通过排除不需要接触的物体,可以减少仿真过程中的计算负载,提高仿真效率。
在这个例子中,通过排除了一些物体之间的接触关系,从而在仿真过程中避免了它们之间的碰撞。这对于一些特定场景下的仿真是有用的,比如在机器人操作中,排除了某些部件之间的接触,以更准确地模拟实际情况。
通过这段xml文件的解析,可以在mujoco仿真环境中生成如下的机械臂模型: