【XML模型】Mujoco代码解读-1(humanoid.xml)
文章基于Mujoco210中model下的humanoid.xml文件作为历程
目录
例程代码
该代码在/mujoco/model/humanoid下
<mujoco model="Humanoid">
<compiler inertiafromgeom="true" angle="degree"/>
<default>
<joint limited="true" damping="1" armature="0"/>
<geom condim="1" material="matgeom"/>
<motor ctrlrange="-.4 .4" ctrllimited="true"/>
</default>
<option timestep="0.005" iterations="50" tolerance="1e-10" solver="Newton" jacobian="dense" cone="pyramidal"/>
<size nconmax="50" njmax="200" nstack="10000"/>
<visual>
<map force="0.1" zfar="30"/>
<rgba haze="0.15 0.25 0.35 1"/>
<quality shadowsize="2048"/>
<global offwidth="800" offheight="800"/>
</visual>
<asset>
<texture type="skybox" builtin="gradient" rgb1="0.3 0.5 0.7" rgb2="0 0 0" width="512" height="512"/>
<texture name="texplane" type="2d" builtin="checker" rgb1=".2 .3 .4" rgb2=".1 0.15 0.2" width="512" height="512" mark="cross" markrgb=".8 .8 .8"/>
<texture name="texgeom" type="cube" builtin="flat" mark="cross" width="127" height="1278"
rgb1="0.8 0.6 0.4" rgb2="0.8 0.6 0.4" markrgb="1 1 1" random="0.01"/>
<material name="matplane" reflectance="0.3" texture="texplane" texrepeat="1 1" texuniform="true"/>
<material name="matgeom" texture="texgeom" texuniform="true" rgba="0.8 0.6 .4 1"/>
</asset>
<worldbody>
<geom name="floor" pos="0 0 0" size="0 0 .25" type="plane" material="matplane" condim="3"/>
<light directional="false" diffuse=".2 .2 .2" specular="0 0 0" pos="0 0 5" dir="0 0 -1" castshadow="false"/>
<light mode="targetbodycom" target="torso" directional="false" diffuse=".8 .8 .8" specular="0.3 0.3 0.3" pos="0 0 4.0" dir="0 0 -1"/>
<body name="torso" pos="0 0 1.4">
<freejoint name="root"/>
<geom name="torso1" type="capsule" fromto="0 -.07 0 0 .07 0" size="0.07"/>
<geom name="head" type="sphere" pos="0 0 .19" size=".09"/>
<geom name="uwaist" type="capsule" fromto="-.01 -.06 -.12 -.01 .06 -.12" size="0.06"/>
<body name="lwaist" pos="-.01 0 -0.260" quat="1.000 0 -0.002 0" >
<geom name="lwaist" type="capsule" fromto="0 -.06 0 0 .06 0" size="0.06" />
<joint name="abdomen_z" type="hinge" pos="0 0 0.065" axis="0 0 1" range="-45 45" damping="5" stiffness="20" armature="0.02" />
<joint name="abdomen_y" type="hinge" pos="0 0 0.065" axis="0 1 0" range="-75 30" damping="5" stiffness="10" armature="0.02" />
<body name="pelvis" pos="0 0 -0.165" quat="1.000 0 -0.002 0" >
<joint name="abdomen_x" type="hinge" pos="0 0 0.1" axis="1 0 0" range="-35 35" damping="5" stiffness="10" armature="0.02" />
<geom name="butt" type="capsule" fromto="-.02 -.07 0 -.02 .07 0" size="0.09" />
<body name="right_thigh" pos="0 -0.1 -0.04" >
<joint name="right_hip_x" type="hinge" pos="0 0 0" axis="1 0 0" range="-25 5" damping="5" stiffness="10" armature="0.01" />
<joint name="right_hip_z" type="hinge" pos="0 0 0" axis="0 0 1" range="-60 35" damping="5" stiffness="10" armature="0.01" />
<joint name="right_hip_y" type="hinge" pos="0 0 0" axis="0 1 0" range="-120 20" damping="5" stiffness="20" armature="0.01" />
<geom name="right_thigh1" type="capsule" fromto="0 0 0 0 0.01 -.34" size="0.06" />
<body name="right_shin" pos="0 0.01 -0.403" >
<joint name="right_knee" type="hinge" pos="0 0 .02" axis="0 -1 0" range="-160 -2" stiffness="1" armature="0.0060" />
<geom name="right_shin1" type="capsule" fromto="0 0 0 0 0 -.3" size="0.049" />
<body name="right_foot" pos="0 0 -.39" >
<joint name="right_ankle_y" type="hinge" pos="0 0 0.08" axis="0 1 0" range="-50 50" stiffness="4" armature="0.0008" />
<joint name="right_ankle_x" type="hinge" pos="0 0 0.04" axis="1 0 0.5" range="-50 50" stiffness="1" armature="0.0006" />
<geom name="right_foot_cap1" type="capsule" fromto="-.07 -0.02 0 0.14 -0.04 0" size="0.027" />
<geom name="right_foot_cap2" type="capsule" fromto="-.07 0 0 0.14 0.02 0" size="0.027" />
</body>
</body>
</body>
<body name="left_thigh" pos="0 0.1 -0.04" >
<joint name="left_hip_x" type="hinge" pos="0 0 0" axis="-1 0 0" range="-25 5" damping="5" stiffness="10" armature="0.01" />
<joint name="left_hip_z" type="hinge" pos="0 0 0" axis="0 0 -1" range="-60 35" damping="5" stiffness="10" armature="0.01" />
<joint name="left_hip_y" type="hinge" pos="0 0 0" axis="0 1 0" range="-120 20" damping="5" stiffness="20" armature="0.01" />
<geom name="left_thigh1" type="capsule" fromto="0 0 0 0 -0.01 -.34" size="0.06" />
<body name="left_shin" pos="0 -0.01 -0.403" >
<joint name="left_knee" type="hinge" pos="0 0 .02" axis="0 -1 0" range="-160 -2" stiffness="1" armature="0.0060" />
<geom name="left_shin1" type="capsule" fromto="0 0 0 0 0 -.3" size="0.049" />
<body name="left_foot" pos="0 0 -.39" >
<joint name="left_ankle_y" type="hinge" pos="0 0 0.08" axis="0 1 0" range="-50 50" stiffness="4" armature="0.0008" />
<joint name="left_ankle_x" type="hinge" pos="0 0 0.04" axis="1 0 0.5" range="-50 50" stiffness="1" armature="0.0006" />
<geom name="left_foot_cap1" type="capsule" fromto="-.07 0.02 0 0.14 0.04 0" size="0.027" />
<geom name="left_foot_cap2" type="capsule" fromto="-.07 0 0 0.14 -0.02 0" size="0.027" />
</body>
</body>
</body>
</body>
</body>
<body name="right_upper_arm" pos="0 -0.17 0.06" >
<joint name="right_shoulder1" type="hinge" pos="0 0 0" axis="2 1 1" range="-85 60" stiffness="1" armature="0.0068" />
<joint name="right_shoulder2" type="hinge" pos="0 0 0" axis="0 -1 1" range="-85 60" stiffness="1" armature="0.0051" />
<geom name="right_uarm1" type="capsule" fromto="0 0 0 .16 -.16 -.16" size="0.04 0.16" />
<body name="right_lower_arm" pos=".18 -.18 -.18" >
<joint name="right_elbow" type="hinge" pos="0 0 0" axis="0 -1 1" range="-90 50" stiffness="0" armature="0.0028" />
<geom name="right_larm" type="capsule" fromto="0.01 0.01 0.01 .17 .17 .17" size="0.031" />
<geom name="right_hand" type="sphere" pos=".18 .18 .18" size="0.04"/>
</body>
</body>
<body name="left_upper_arm" pos="0 0.17 0.06" >
<joint name="left_shoulder1" type="hinge" pos="0 0 0" axis="2 -1 1" range="-60 85" stiffness="1" armature="0.0068" />
<joint name="left_shoulder2" type="hinge" pos="0 0 0" axis="0 1 1" range="-60 85" stiffness="1" armature="0.0051" />
<geom name="left_uarm1" type="capsule" fromto="0 0 0 .16 .16 -.16" size="0.04 0.16" />
<body name="left_lower_arm" pos=".18 .18 -.18" >
<joint name="left_elbow" type="hinge" pos="0 0 0" axis="0 -1 -1" range="-90 50" stiffness="0" armature="0.0028" />
<geom name="left_larm" type="capsule" fromto="0.01 -0.01 0.01 .17 -.17 .17" size="0.031" />
<geom name="left_hand" type="sphere" pos=".18 -.18 .18" size="0.04"/>
</body>
</body>
</body>
</worldbody>
<actuator>
<motor name="abdomen_y" gear="200" joint="abdomen_y" />
<motor name="abdomen_z" gear="200" joint="abdomen_z" />
<motor name="abdomen_x" gear="200" joint="abdomen_x" />
<motor name="right_hip_x" gear="200" joint="right_hip_x" />
<motor name="right_hip_z" gear="200" joint="right_hip_z" />
<motor name="right_hip_y" gear="600" joint="right_hip_y" />
<motor name="right_knee" gear="400" joint="right_knee" />
<motor name="right_ankle_x" gear="100" joint="right_ankle_x" />
<motor name="right_ankle_y" gear="100" joint="right_ankle_y" />
<motor name="left_hip_x" gear="200" joint="left_hip_x" />
<motor name="left_hip_z" gear="200" joint="left_hip_z" />
<motor name="left_hip_y" gear="600" joint="left_hip_y" />
<motor name="left_knee" gear="400" joint="left_knee" />
<motor name="left_ankle_x" gear="100" joint="left_ankle_x" />
<motor name="left_ankle_y" gear="100" joint="left_ankle_y" />
<motor name="right_shoulder1" gear="100" joint="right_shoulder1" />
<motor name="right_shoulder2" gear="100" joint="right_shoulder2" />
<motor name="right_elbow" gear="200" joint="right_elbow" />
<motor name="left_shoulder1" gear="100" joint="left_shoulder1" />
<motor name="left_shoulder2" gear="100" joint="left_shoulder2" />
<motor name="left_elbow" gear="200" joint="left_elbow" />
</actuator>
</mujoco>
内容解读
以下部分基于改代码进行环境解释。
compiler
<compiler inertiafromgeom="true" angle="degree"/>
inertiafromgeom
是MuJoCo XML配置文件中的一个属性,它用于指定模型的惯性属性是否应该从其几何形状自动计算。这个属性可以在compiler
标签中设置,影响整个模型的编译方式。当设置为true
时,MuJoCo会根据每个几何体(geom)的形状、尺寸和密度自动计算质心(center of mass)、质量(mass)和惯性矩(moment of inertia)。
作用和好处
- 自动计算:
inertiafromgeom="true"
允许用户省去手动计算复杂几何形状的质量和惯性矩的麻烦。这对于形状复杂或由多个几何体组成的模型特别有用。 - 简化模型定义:它简化了模型定义过程,特别是在几何形状和尺寸频繁变动的原型设计阶段。
- 提高准确性:通过直接从几何形状计算得出的质量和惯性矩,可以提高模型物理属性的准确性,因为这些计算基于几何形状的实际参数。
注意事项
- 密度设置:为了正确使用
inertiafromgeom
功能,需要为每个几何体设置合适的材料密度。密度可以通过material
标签中的density
属性定义,或者在定义几何体时直接指定。 - 复杂几何形状的影响:虽然
inertiafromgeom
可以自动计算质量和惯性矩,但对于非常复杂的几何形状,自动计算得到的值可能不如手动精确计算或实验测量的结果准确。 - 性能考虑:在某些情况下,自动计算质量和惯性矩可能会对仿真的初始化时间有轻微影响,特别是对于包含大量复杂几何体的大型模型。
inertiafromgeom="true"
是一个非常有用的属性,可以帮助自动化和简化仿真模型的准备工作,尤其是在模型的开发和测试阶段。然而,对于最终仿真,特别是那些对精度有高要求的应用,仍然推荐进行详细的质量和惯性矩校验,必要时进行手动调整。
default
<default>
<joint limited="true" damping="1" armature="0"/>
<geom condim="1" material="matgeom"/>
<motor ctrlrange="-.4 .4" ctrllimited="true"/>
</default>
这段代码是MuJoCo模型文件的一部分,使用了<default>
标签来设置模型中各种元素的默认属性。在MuJoCo中,<default>
标签非常有用,它可以简化XML文件的复杂度,允许您为模型中重复出现的元素类型指定一组共通的默认属性。这些默认设置将应用于之后在模型定义中出现的相应元素,除非在具体元素上明确指定了不同的属性值。下面是这段代码各部分的含义:
<joint>
标签
limited="true"
:这意味着在模型中,默认情况下,所有关节都被设置为有限制的。这通常指的是关节的运动范围被限制在某个特定的范围内,防止关节转动过度。damping="1"
:为所有关节设置了默认的阻尼系数为1。阻尼是减少关节运动(特别是振荡)的一种机制,模拟真实世界中的能量损失。armature="0"
:设置了关节的惯性增量(装甲质量)为0。装甲质量是增加到关节旋转轴惯性的额外质量,用于模拟电机轴承等的质量效应,这里默认设置为没有额外增加。
<geom>
标签
condim="1"
:设置了几何体的接触维度为1。在MuJoCo中,condim
用于定义接触面的特性,如何计算接触力。condim=1
意味着使用最简单的接触模型,通常用于模拟滑动摩擦。material="matgeom"
:指定了几何体默认使用的材料为matgeom
。这意味着除非另外指定,模型中的所有几何体都将使用这个材料属性,包括其视觉和物理特性。
<motor>
标签
ctrlrange="-.4 .4"
:为电机设置了控制范围从-0.4到0.4。这定义了电机输出力矩的最小和最大值,限制了电机可以施加的力量的范围。ctrllimited="true"
:指示电机的控制是有限制的,即电机输出将被限制在上面指定的ctrlrange
内。
这段代码通过<default>
标签为模型中的关节、几何体和电机元素设置了一系列默认属性,简化了后续模型元素定义的需要,使得模型的创建更加高效和一致。
option
<option timestep="0.005" iterations="50" tolerance="1e-10" solver="Newton" jacobian="dense" cone="pyramidal"/>
这行代码是MuJoCo仿真环境配置的一部分,使用了<option>
标签来指定整个仿真的全局设置。每个属性都对仿真的运行方式有着重要的影响。下面是每个属性的详细解释:
<option>
标签属性
-
timestep="0.005"
:设置仿真的时间步长为0.005秒。这意味着仿真在每秒中会前进200步(1秒/0.005秒 = 200步)。时间步长决定了仿真的精细程度和运行速度,较小的时间步长可以提高仿真精度,但同时也会增加计算量。 -
iterations="50"
:指定求解器在每个时间步中尝试解决动力学方程的最大迭代次数为50。增加迭代次数可以提高仿真的稳定性和精度,但也会增加每个时间步的计算成本。 -
tolerance="1e-10"
:设置求解器在认为方程解已经足够接近真实解时的容忍误差为(1 \times 10^{-10})。这是一个非常小的值,意味着求解器会尽可能精确地解决动力学方程,以确保高精度的仿真结果。 -
solver="Newton"
:选择使用牛顿(Newton)方法作为动力学方程的求解器。牛顿方法是一种强大的求解非线性方程的方法,通常能提供良好的收敛性能和精度。这一设置影响了如何计算仿真中的力和运动。 -
jacobian="dense"
:指定在计算过程中使用密集(dense)雅可比矩阵。雅可比矩阵是一个数学表达式,描述了系统状态变量的微小变化如何影响系统输出的变化。选择“dense”表明系统会使用完整的矩阵表示,适合于复杂度较高或者紧密耦合的动力学系统。 -
cone="pyramidal"
:设置在处理摩擦和接触时使用的摩擦锥模型为“pyramidal”(金字塔形)。摩擦锥模型用于仿真接触时物体之间的摩擦行为,金字塔模型是一种简化的表示方法,它通过将摩擦分解成几个主要方向上的分量来近似实际的摩擦效应。
这些设置共同定义了MuJoCo仿真的基本参数,包括时间进度、求解器的选择和配置、以及接触和摩擦处理方式,这些都是确保仿真既精确又高效的关键因素。
size
<size nconmax="50" njmax="200" nstack="10000"/>
这行代码使用了<size>
标签,它在MuJoCo模型的配置中指定了几个重要的内存分配参数。这些参数对于仿真的性能和能够模拟的系统复杂度有直接影响。下面是每个属性的解释:
<size>
标签属性
-
nconmax="50"
:设置仿真中允许的最大接触数为50。这个值定义了仿真环境中在任何给定时间点可以处理的接触点的最大数量。如果模型的交互可能导致大量接触(例如,一个复杂的多体系统或者粒子系统),这个值需要足够大以容纳所有潜在的接触点。设置得过小可能导致一些接触被忽略,从而影响仿真的准确性。 -
njmax="200"
:指定仿真中允许的最大关节和自由度数为200。这个值决定了模型中可以包含的关节(包括旋转关节、滑动关节等)的最大数量。对于大型或复杂的机械系统,需要确保这个值足够高,以便能够模拟所有的动态行为。 -
nstack="10000"
:设置仿真使用的最大堆栈大小为10000(这个值通常以字节为单位)。堆栈是MuJoCo用来存储临时计算数据的内存区域,包括但不限于变量、中间计算结果等。较大的堆栈允许执行更复杂的计算和函数调用,但也会增加内存的使用量。适当调整这个值可以在性能和资源使用之间找到平衡。
这三个参数共同决定了MuJoCo仿真环境的规模和能力,通过调整这些参数,可以优化仿真的性能,确保模型能够在给定的资源限制下正确运行。在设计大型或复杂模型时,根据模型的具体需求调整这些参数非常重要。
visual
<visual>
<map force="0.1" zfar="30"/>
<rgba haze="0.15 0.25 0.35 1"/>
<quality shadowsize="2048"/>
<global offwidth="800" offheight="800"/>
</visual>
这段代码是MuJoCo模型文件中的一部分,用于配置仿真环境的视觉效果。它位于<visual>
标签内,指定了视觉渲染的各种参数。以下是每个子标签和属性的解释:
<map>
标签
force="0.1"
:设置接触力的可视化强度。这个值控制在视觉上表示接触力时的强度或大小,有助于在进行仿真时直观地观察到接触力的作用。zfar="30"
:定义了摄像机的远裁剪平面,即在此距离之后的对象不会被渲染。这个值决定了视觉场景的深度范围,设置得过大可能会影响渲染性能,设置得过小可能会导致远处的对象意外地消失。
<rgba>
标签
haze="0.15 0.25 0.35 1"
:指定了环境雾的颜色和不透明度,这里使用了RGBA(红、绿、蓝、透明度)格式。雾效果可以增加场景的深度感和真实感,模拟远处对象与雾或空气中悬浮颗粒相互作用的视觉效果。
<quality>
标签
shadowsize="2048"
:设置阴影贴图的分辨率。这个值越大,阴影的细节就越清晰,但渲染阴影的性能成本也越高。适当的阴影分辨率可以提高场景的视觉质量,同时保持良好的渲染性能。
<global>
标签
offwidth="800"
和offheight="800"
:指定了离屏渲染缓冲区的宽度和高度。离屏渲染是指渲染操作不直接输出到屏幕,而是渲染到一个离屏缓冲区中,这在进行视频录制或高质量截图时非常有用。这两个参数决定了离屏渲染图像的分辨率。
总体来说,这段代码通过设置一系列视觉参数,控制了MuJoCo仿真环境的视觉呈现方式,包括接触力的可视化、场景深度、阴影质量以及离屏渲染的分辨率,从而提高了仿真的视觉效果和实用性。
asset
<asset>
<texture type="skybox" builtin="gradient" rgb1="0.3 0.5 0.7" rgb2="0 0 0" width="512" height="512"/>
<texture name="texplane" type="2d" builtin="checker" rgb1=".2 .3 .4" rgb2=".1 0.15 0.2" width="512" height="512" mark="cross" markrgb=".8 .8 .8"/>
<texture name="texgeom" type="cube" builtin="flat" mark="cross" width="127" height="1278"
rgb1="0.8 0.6 0.4" rgb2="0.8 0.6 0.4" markrgb="1 1 1" random="0.01"/>
<material name="matplane" reflectance="0.3" texture="texplane" texrepeat="1 1" texuniform="true"/>
<material name="matgeom" texture="texgeom" texuniform="true" rgba="0.8 0.6 .4 1"/>
</asset>
这段代码位于MuJoCo模型文件的<asset>
部分,用于定义仿真环境中使用的资源,如纹理和材料。这些资源可以被应用到模型的各个部分,以增强视觉效果。以下是各个子标签和属性的详细解释:
<texture>
标签
-
Skybox Texture:
type="skybox"
:指定这是一个天空盒纹理,用于渲染环境的背景。builtin="gradient"
:使用内置的渐变纹理。rgb1="0.3 0.5 0.7"
与rgb2="0 0 0"
:定义渐变的起始和结束颜色。从淡蓝色渐变到黑色。width="512"
和height="512"
:指定纹理图像的尺寸。
-
Checker Texture for Plane:
name="texplane"
:纹理的名称,用于引用。type="2d"
:二维纹理。builtin="checker"
:使用内置的棋盘格纹理。rgb1
和rgb2
:定义棋盘格的两种颜色。mark="cross"
和markrgb=".8 .8 .8"
:在棋盘格上加上交叉标记的颜色。
-
Cube Texture for Geometry:
name="texgeom"
:纹理的名称,用于引用。type="cube"
:立方体纹理,适用于3D对象。builtin="flat"
:使用单一颜色填充的纹理。random="0.01"
:在纹理颜色中加入一定程度的随机性。
<material>
标签
-
Material for Plane:
name="matplane"
:材料的名称,用于引用。reflectance="0.3"
:反射率,影响材料的光泽度。texture="texplane"
:引用名为texplane
的纹理。texrepeat="1 1"
:纹理重复的次数,此处设置为不重复。texuniform="true"
:确保纹理在各个方向上均匀分布。
-
Material for Geometry:
name="matgeom"
:材料的名称,用于引用。texture="texgeom"
:引用名为texgeom
的纹理。rgba="0.8 0.6 .4 1"
:定义材料的颜色和透明度。
这些定义允许仿真模型具有更加丰富和真实的视觉效果,通过精心设计的纹理和材料属性来增强场景的视觉深度和细节。
总结
以上是worldbody外的xml文件定义,主要是对整个world及仿真背景的定义。后续将继续解读worldbody内的部分。