XML 参考#

引言#

本章是 MuJoCo 中使用的 MJCF 建模语言的参考手册。

XML schema#

下表总结了 MJCF 中的 XML 元素及其属性。请注意,MJCF 中的所有信息都是通过元素和属性输入的。元素中的文本内容不使用;如果存在,解析器会忽略它。

折叠 schema 表

表中第二列的符号具有以下含义

!

必需元素,只能出现一次

?

可选元素,只能出现一次

*

可选元素,可以出现多次

R

可选元素,可以递归出现多次

mujoco

!

mujoco
↳ option

*

  option
  ↳ flag

?

mujoco
↳ compiler

*

  compiler
  ↳ lengthrange

?

mujoco
↳ size

*

mujoco
↳ statistic

*

mujoco
↳ asset

无属性

  asset
  ↳ mesh

*

    mesh
    ↳ plugin

*

      plugin
      ↳ config

*

  asset
  ↳ hfield

*

  asset
  ↳ skin

*

    skin
    ↳ bone

*

  asset
  ↳ texture

*

  asset
  ↳ material

*

    material
    ↳ layer

*

  asset
  ↳ model

*

mujoco
↳ body

R

  body
  ↳ inertial

?

  body
  ↳ joint

*

  body
  ↳ freejoint

*

  body
  ↳ geom

*

    geom
    ↳ plugin

*

      plugin
      ↳ config

*

  body
  ↳ attach

*

  body
  ↳ site

*

  body
  ↳ camera

*

  body
  ↳ light

*

  body
  ↳ plugin

*

    plugin
    ↳ config

*

  body
  ↳ composite

*

    composite
    ↳ joint

*

    composite
    ↳ skin

?

    composite
    ↳ geom

?

    composite
    ↳ site

?

    composite
    ↳ plugin

*

      plugin
      ↳ config

*

  body
  ↳ flexcomp

*

    flexcomp
    ↳ edge

?

    flexcomp
    ↳ elasticity

?

    flexcomp
    ↳ contact

?

    flexcomp
    ↳ pin

*

    flexcomp
    ↳ plugin

*

      plugin
      ↳ config

*

mujoco
↳ deformable

无属性

  deformable
  ↳ flex

*

    flex
    ↳ contact

?

    flex
    ↳ edge

?

    flex
    ↳ elasticity

?

  deformable
  ↳ skin

*

    skin
    ↳ bone

*

mujoco
↳ contact

无属性

  contact
  ↳ pair

*

  contact
  ↳ exclude

*

mujoco
↳ equality

无属性

  equality
  ↳ connect

*

  equality
  ↳ weld

*

  equality
  ↳ joint

*

  equality
  ↳ tendon

*

  equality
  ↳ flex

*

mujoco
↳ tendon

无属性

  tendon
  ↳ spatial

*

    spatial
    ↳ site

*

    spatial
    ↳ geom

*

    spatial
    ↳ pulley

*

  tendon
  ↳ fixed

*

    fixed
    ↳ joint

*

mujoco
↳ actuator

无属性

  actuator
  ↳ general

*

  actuator
  ↳ motor

*

  actuator
  ↳ position

*

  actuator
  ↳ velocity

*

  actuator
  ↳ intvelocity

*

  actuator
  ↳ damper

*

  actuator
  ↳ cylinder

*

  actuator
  ↳ muscle

*

  actuator
  ↳ adhesion

*

  actuator
  ↳ plugin

*

    plugin
    ↳ config

*

mujoco
↳ sensor

无属性

  sensor
  ↳ touch

*

  sensor
  ↳ accelerometer

*

  sensor
  ↳ velocimeter

*

  sensor
  ↳ gyro

*

  sensor
  ↳ force

*

  sensor
  ↳ torque

*

  sensor
  ↳ magnetometer

*

  sensor
  ↳ camprojection

*

  sensor
  ↳ rangefinder

*

  sensor
  ↳ jointpos

*

  sensor
  ↳ jointvel

*

  sensor
  ↳ tendonpos

*

  sensor
  ↳ tendonvel

*

  sensor
  ↳ actuatorpos

*

  sensor
  ↳ actuatorvel

*

  sensor
  ↳ actuatorfrc

*

  sensor
  ↳ jointactuatorfrc

*

  sensor
  ↳ tendonactuatorfrc

*

  sensor
  ↳ ballquat

*

  sensor
  ↳ ballangvel

*

  sensor
  ↳ jointlimitpos

*

  sensor
  ↳ jointlimitvel

*

  sensor
  ↳ jointlimitfrc

*

  sensor
  ↳ tendonlimitpos

*

  sensor
  ↳ tendonlimitvel

*

  sensor
  ↳ tendonlimitfrc

*

  sensor
  ↳ framepos

*

  sensor
  ↳ framequat

*

  sensor
  ↳ framexaxis

*

  sensor
  ↳ frameyaxis

*

  sensor
  ↳ framezaxis

*

  sensor
  ↳ framelinvel

*

  sensor
  ↳ frameangvel

*

  sensor
  ↳ framelinacc

*

  sensor
  ↳ frameangacc

*

  sensor
  ↳ subtreecom

*

  sensor
  ↳ subtreelinvel

*

  sensor
  ↳ subtreeangmom

*

  sensor
  ↳ distance

*

  sensor
  ↳ normal

*

  sensor
  ↳ fromto

*

  sensor
  ↳ e_potential

*

  sensor
  ↳ e_kinetic

*

  sensor
  ↳ clock

*

  sensor
  ↳ user

*

  sensor
  ↳ plugin

*

    plugin
    ↳ config

*

mujoco
↳ keyframe

无属性

  keyframe
  ↳ key

*

mujoco
↳ visual

无属性

  visual
  ↳ global

?

  visual
  ↳ quality

?

  visual
  ↳ headlight

?

  visual
  ↳ map

?

  visual
  ↳ scale

?

  visual
  ↳ rgba

?

mujoco
↳ default

R

  default
  ↳ mesh

?

  default
  ↳ material

?

  default
  ↳ joint

?

  default
  ↳ geom

?

  default
  ↳ site

?

  default
  ↳ camera

?

  default
  ↳ light

?

  default
  ↳ pair

?

  default
  ↳ equality

?

  default
  ↳ tendon

?

  default
  ↳ general

?

  default
  ↳ motor

?

  default
  ↳ position

?

  default
  ↳ velocity

?

  default
  ↳ intvelocity

?

  default
  ↳ damper

?

  default
  ↳ cylinder

?

  default
  ↳ muscle

?

  default
  ↳ adhesion

?

mujoco
↳ custom

无属性

  custom
  ↳ numeric

*

  custom
  ↳ text

*

  custom
  ↳ tuple

*

    tuple
    ↳ element

*

mujoco
↳ extension

无属性

  extension
  ↳ plugin

*

    plugin
    ↳ instance

*

      instance
      ↳ config

*

属性类型#

每个属性都有解析器强制执行的数据类型。可用数据类型包括

string

任意字符串,通常指定文件名或模型元素的自定义名称。

int(N)

包含 N 个整数的数组。如果省略 N,则等于 1。

real(N)

包含 N 个实数值的数组。如果省略 N,则等于 1。

[…]

关键字属性。有效关键字列表在方括号中给出。


对于数组类型属性,数组长度由解析器强制执行,除非下面的参考文档中另有说明。
除了具有数据类型外,属性可以是必需的或可选的。可选属性可以具有内部默认值,也可以不具有。没有内部默认值的可选属性会初始化为特殊的未定义状态。此状态与 XML 中可以输入的任何有效设置都不同。此机制使编译器能够确定属性是否已由用户“触碰”,无论是显式地还是通过默认值,并采取适当的操作。某些属性具有内部默认值(通常为 0),而这些值实际上不被编译器允许。当此类属性在给定上下文中变得相关时,必须将其设置为允许的值。

required

此属性为解析器所必需。如果不存在,解析器将生成错误。

optional

此属性为可选。没有内部默认值。属性初始化为未定义状态。

“…”

此属性为可选。内部默认值在引号中给出。

在下面的参考文档中,属性名称以粗体显示,后跟其数据类型,再后跟必需/可选状态(包括任何内部默认值)。例如,angle 属性是一个关键字属性,其值可以是“radian”或“degree”。它是一个可选属性,内部默认值为“degree”。因此,它在参考文档中将显示为

angle: [radian, degree], “degree”

MJCF 参考#

MJCF 文件具有唯一的顶级元素 mujoco。下一级元素称为 sections(节)。它们都是可选的。某些节仅用于分组且没有属性。节可以重复,以通过 include 元素促进模型的合并。元素内属性的 order(顺序)可以是任意的。父元素内子元素的顺序也可以是任意的,但有四个例外:

  • 在一个 body 内,joint 元素的顺序很重要,因为关节变换是按顺序执行的。

  • 在一个 spatial 肌腱中,元素的顺序很重要,因为它决定了肌腱穿过或缠绕的对象的序列。

  • 当同一属性被多次设置为不同值时,重复节的顺序很重要。在这种情况下,最后的设置对整个模型生效。

  • 同一默认类别中多个促动器快捷方式的顺序很重要,因为每个快捷方式设置了该默认类别中单个 general 元素的属性,覆盖了之前的设置。

在本章的其余部分,我们将描述所有有效的 MJCF 元素及其属性。有些元素可以在多种上下文中使用,在这种情况下,它们的含义取决于父元素。这就是为什么我们在下面的文档中始终将父元素显示为前缀的原因。

元元素#

这些元素不严格属于低级 MJCF 格式定义的一部分,而是指示编译器对模型执行某些操作。元元素的一个普遍属性是它们在保存 XML 后会从模型中消失。MJCF 中目前有六个元元素

frame (R)#

frame 元元素是一个纯粹的坐标变换,可以包装运动学树中(在 worldbody 下)的任何元素组。编译后,frame 元素会消失,其变换会累积到其直接子元素中。frame 元元素的属性已在下方文档中列出。

frame 使用示例

加载此模型并保存它

<mujoco>
  <worldbody>
    <frame quat="0 0 1 0">
       <geom name="Alice" quat="0 1 0 0" size="1"/>
    </frame>

    <frame pos="0 1 0">
      <geom name="Bob" pos="0 1 0" size="1"/>
      <body name="Carl" pos="1 0 0">
        ...
      </body>
    </frame>
  </worldbody>
</mujoco>

生成此模型

<mujoco>
  <worldbody>
    <geom name="Alice" quat="0 0 0 1" size="1"/>
    <geom name="Bob" pos="0 2 0" size="1"/>
    <body name="Carl" pos="1 1 0">
      ...
    </body>
  </worldbody>
</mujoco>

请注意,在保存的模型中,frame 元素已消失,但它们的变换已累积到其子元素的变换中。

replicate (R)#

replicate 元素复制包含的运动学树元素,并增加平移和旋转偏移量,同时添加命名空间后缀以避免名称冲突。附加的后缀字符串是范围 [0...count-1] 内的整数,使用表示元素总数所需的最少位数(即,如果复制 200 次,后缀将是 000, 001, ... 等)。所有引用的元素都会自动复制并进行适当的命名空间处理。使用 replicate 的详细模型示例可以在 model/replicate/ 目录中找到。

使用 replicate 时,关于 keyframes 有一个注意事项。由于 mjs_attach 用于多次自附着包含的运动学树,如果此树包含进一步的 attach 元素,keyframes 将不会被 replicate 复制或命名空间处理,但它们将被最内层的 mjs_attach 调用一次附着和命名空间处理。请参阅 attach 中讨论的限制。

count: int, required

副本数量。必须为正。

sep: string, optional

命名空间分隔符。此可选字符串会前置到命名空间后缀字符串。请注意,对于嵌套的 replicate 元素,最内层的命名空间后缀会首先附加。

offset: real(3), optional

沿三个坐标轴的平移偏移量。通常,偏移量的框架相对于上一个副本,但第一个副本除外,它相对于 replicate 元素的父级。如果没有旋转,这些值始终位于 replicate 元素的父级框架中。

euler: real(3), optional

两个连续副本之间绕三个坐标轴的旋转角度。角度单位和旋转顺序遵循全局 angleeulerseq 设置。旋转始终相对于上一个副本的框架,因此总旋转是累积的。

replicate 使用示例

加载此模型并保存它

<mujoco>
  <worldbody>
    <replicate count="2" offset="0 1 0" euler="90 0 0">
      <replicate count="2" sep="-" offset="1 0 0" euler="0 90 0">
        <geom name="Alice" size=".1"/>
      </replicate>
    </replicate>
  </worldbody>

  <sensor>
    <accelerometer name="Bob" site="Alice"/>
  </sensor>
</mujoco>

生成此模型

<mujoco>
  <worldbody>
    <geom name="Alice-00" size="0.1"/>
    <geom name="Alice-10" size="0.1" pos="1 0 0" quat="1 0 1 0"/>
    <geom name="Alice-01" size="0.1" pos="0 1 0" quat="1 1 0 0"/>
    <geom name="Alice-11" size="0.1" pos="1 1 0" quat="0.5 0.5 0.5 0.5"/>
  </worldbody>

  <sensor>
    <accelerometer name="Bob-00" site="Alice-00"/>
    <accelerometer name="Bob-10" site="Alice-10"/>
    <accelerometer name="Bob-01" site="Alice-01"/>
    <accelerometer name="Bob-11" site="Alice-11"/>
  </sensor>
</mujoco>

include (*)#

此元素不严格属于 MJCF。它是一个元元素,用于在解析之前将多个 XML 文件组装到单个文档对象模型 (DOM) 中。包含的文件必须是具有唯一顶级元素的有效 XML 文件。此顶级元素会被解析器移除,其下方的元素会插入到 include 元素所在的位置。此过程必须至少插入一个元素。include 元素可以在 MJCF 文件中期望出现 XML 元素的任何地方使用。允许嵌套包含,但给定的 XML 文件在整个模型中最多只能包含一次。所有包含的 XML 文件组装到单个 DOM 后,它必须对应一个有效的 MJCF 模型。除此之外,用户可以自行决定如何使用 include 以及如何模块化大型文件。

file: string, required

要包含的 XML 文件名。文件位置相对于主 MJCF 文件所在的目录。如果文件不在同一目录中,应使用相对路径作为前缀。

优先使用 attach 而非 include

虽然 include 的某些用例仍然有效,但在适用情况下,建议改用 attach 元素。

mujoco (!)#

唯一的顶级元素,用于标识 XML 文件为 MJCF 模型文件。

model: string, “MuJoCo Model”

模型的名称。此名称显示在 simulate.cc 的标题栏中。

option (*)#

此元素与 mjModel 结构的 mjModel.opt 字段中包含的低级结构 mjOption 一一对应。这些是仿真选项,不会以任何方式影响编译过程;它们只是简单地复制到低级模型中。即使 mjOption 可以在运行时由用户修改,通过 XML 正确调整它仍然是个好主意。

timestep: real, “0.002”

以秒为单位的仿真时间步长。这是影响每个物理仿真固有的速度-精度权衡的唯一最重要的参数。值越小,精度和稳定性越好。要实现实时性能,时间步长必须大于每步的 CPU 时间(或使用 RK4 积分器时大 4 倍)。CPU 时间使用内部计时器测量。调整时间步长时应监测此值。MuJoCo 可以在比实时快得多的速度下仿真大多数机器人系统,但包含许多浮动物体(导致许多接触)的模型计算要求更高。请记住,稳定性不仅由时间步长决定,还由 求解器参数 决定;特别是较软的约束可以使用较大的时间步长进行仿真。在微调有挑战性的模型时,建议同时尝试调整这两个设置。在优化相关的应用中,实时性已不足够,更希望以尽可能快的速度运行仿真。在这种情况下,应将时间步长设得尽可能大。

apirate: real, “100”

此参数确定外部 API 允许执行更新函数的速率(赫兹)。此机制用于仿真通信带宽受限的设备。它仅影响 socket API,不影响物理仿真。

impratio: real, “1”

此属性确定椭圆摩擦锥的摩擦与法向约束阻抗之比。solimp 的设置决定了所有接触维度的单个阻抗值,然后由该属性进行调制。大于 1 的设置会导致摩擦力比法向力“更硬”,其普遍效果是防止滑动,而无需增加实际摩擦系数。对于金字塔形摩擦锥,情况更复杂,因为金字塔形近似在每个基向量内混合了法向和摩擦维度;不建议在金字塔形锥中使用高 impratio 值。

gravity: real(3), “0 0 -9.81”

重力加速度向量。在默认世界方向中,Z 轴向上。MuJoCo GUI 是围绕此约定组织的(相机和扰动命令都基于此),因此我们不建议偏离此约定。

wind: real(3), “0 0 0”

介质(即风)的速度向量。此向量会从每个物体的 3D 平移速度中减去,结果用于计算作用在物体上的粘性力、升力和阻力;回想 Computation 章中的 Passive forces(被动力)。这些力的大小会随接下来两个属性的值进行缩放。

magnetic: real(3), “0 -0.5 0”

全局磁通量。此向量由磁力计传感器使用,磁力计传感器定义为站点,并返回以站点框架表示的站点位置处的磁通量。

density: real, “0”

介质的密度,不要与用于推断质量和惯性的几何体 (geom) 密度混淆。此参数用于仿真升力和阻力,其大小与速度的平方成比例。在 SI 单位中,空气密度约为 1.2,水的密度约为 1000,具体取决于温度。将 density 设置为 0 会禁用升力和阻力。

viscosity: real, “0”

介质的粘度。此参数用于仿真粘性力,其大小与速度线性相关。在 SI 单位中,空气粘度约为 0.00002,水的粘度约为 0.0009,具体取决于温度。将 viscosity 设置为 0 会禁用粘性力。请注意,默认的 Euler integrator(积分器)会隐式处理关节中的阻尼——这提高了稳定性和准确性。目前它不会对物体粘度执行此操作。因此,如果目标仅仅是创建阻尼仿真(而不是模拟粘度的特定效果),我们建议使用关节阻尼而不是物体粘度,或者切换到 implicitimplicitfast 积分器。

o_margin: real, “0”

启用 Contact override(接触覆盖)时,此属性会替换所有活动接触对的 margin 参数。否则,MuJoCo 会根据接触对的生成方式使用 geompair 的特定元素 margin 属性。另请参阅 Computation 章中的 Collision detection(碰撞检测)。相关的 gap 参数没有全局覆盖。

o_solref, o_solimp, o_friction

启用接触覆盖时,这些属性会替换所有活动接触对的 solref、solimp 和 friction 参数。有关详细信息,请参阅 Solver parameters(求解器参数)。

integrator: [Euler, RK4, implicit, implicitfast], “Euler”

此属性选择要使用的数值 integrator(积分器)。当前可用的积分器有半隐式欧拉法、固定步长四阶龙格-库塔法、速度隐式欧拉法以及 implicitfast,后者舍去了科里奥利力和离心力项。有关更多详细信息,请参阅 Numerical Integration(数值积分)。

cone: [pyramidal, elliptic], “pyramidal”

接触摩擦锥的类型。椭圆锥是物理现实更好的模型,但金字塔形锥有时会使求解器更快、更稳健。

jacobian: [dense, sparse, auto], “auto”

约束 Jacobian 及其计算出的矩阵类型。当自由度数量达到 60 时,Auto 解析为 dense,超过 60 时解析为 sparse。

solver: [PGS, CG, Newton], “Newton”

此属性选择 Computation 章中描述的约束求解器 algorithms(算法)之一。求解器选择和参数调整的指南可在上面的 Algorithms(算法)部分找到。

iterations: int, “100”

约束求解器的最大迭代次数。当 flag 的 warmstart 属性启用(默认情况下是启用)时,可以通过较少的迭代获得准确结果。具有许多相互作用约束的更大、更复杂的系统需要更多迭代。请注意,mjData.solver 包含有关求解器收敛的统计信息,也在 profiler 中显示。

tolerance: real, “1e-8”

用于迭代求解器提前终止的容差阈值。对于 PGS,阈值应用于两次迭代之间的成本改进。对于 CG 和 Newton,应用于成本改进和梯度范数中的较小者。将容差设为 0 可禁用提前终止。

ls_iterations: int, “50”

CG/Newton 约束求解器执行的最大线搜索迭代次数。确保在每次约束求解期间最多执行 iterations 乘以 ls_iterations 次线搜索迭代。

ls_tolerance: real, “0.01”

用于线搜索算法提前终止的容差阈值。

noslip_iterations: int, “0”

Noslip 求解器的最大迭代次数。这是在主求解器之后执行的后处理步骤。它使用改进的 PGS 方法来抑制软约束模型导致的摩擦维度中的滑动/漂移。默认设置 0 会禁用此后处理步骤。

noslip_tolerance: real, “1e-6”

用于 Noslip 求解器提前终止的容差阈值。

ccd_iterations: int, “50”

用于凸碰撞算法的最大迭代次数。这很少需要调整,除非在某些几何体具有非常大的长宽比的情况下。

ccd_tolerance: real, “1e-6”

用于凸碰撞算法提前终止的容差阈值。

sdf_iterations: int, “10”

用于 Signed Distance Field 碰撞的迭代次数(每个初始点)。

sdf_initpoints: int, “40”

用于查找 Signed Distance Field 碰撞接触的起始点数量。

actuatorgroupdisable: int(31), optional

要禁用的促动器组列表。其 group 位于此列表中的促动器将不产生力。如果它们是有状态的,它们的激活状态将不会被积分。在内部,此列表实现为整数位域,因此值必须在 0 <= group <= 30 范围内。如果未设置,则启用所有促动器组。请参阅 示例模型 和右侧的相关屏幕截图。

option/flag (?)#

此元素设置启用和禁用仿真管道不同部分的标志。运行时使用的实际标志表示为两个整数的位,即 mjModel.opt.disableflags 和 mjModel.opt.enableflags,分别用于禁用标准功能和启用可选功能。这样分开的原因是,将这两个整数都设置为 0 可以恢复默认设置。在 XML 中,我们没有明确区分这一点,但默认属性值除外——对应于标准功能的标志默认值为“enable”,对应于可选功能的标志默认值为“disable”。在下面的文档中,我们将解释当设置与默认值不同时会发生什么。

constraint: [disable, enable], “enable”

此标志禁用所有与约束求解器相关的标准计算。因此,不施加任何约束力。请注意,接下来的四个标志会禁用与特定约束类型相关的计算。此标志和类型特定的标志都必须设置为“enable”,才能执行给定的计算。

equality: [disable, enable], “enable”

此标志禁用所有与相等约束相关的标准计算。

frictionloss: [disable, enable], “enable”

此标志禁用所有与摩擦损失约束相关的标准计算。

limit: [disable, enable], “enable”

此标志禁用所有与关节和肌腱限制约束相关的标准计算。

contact: [disable, enable], “enable”

此标志禁用碰撞检测以及所有与接触约束相关的标准计算。

passive: [disable, enable], “enable”

此标志禁用关节和肌腱弹簧阻尼器、流体动力以及通过 mjcb_passive 回调计算的自定义被动力仿真。因此,不施加任何被动力。

gravity: [disable, enable], “enable”

此标志会在运行时将 mjOption 中的重力加速度向量替换为 (0 0 0),而不改变 mjOption 中的值。一旦重新启用此标志,将使用 mjOption 中的值。

clampctrl: [disable, enable], “enable”

此标志禁用对所有促动器控制输入的钳位,即使促动器特定的属性设置为启用钳位。

warmstart: [disable, enable], “enable”

此标志禁用约束求解器的热启动。默认情况下,求解器使用上一个时间步的解(即约束力)来初始化迭代优化。当评估不形成轨迹的状态集合的动力学时,应禁用此功能——在这种情况下,热启动没有意义,并且可能会减慢求解器速度。

filterparent: [disable, enable], “enable”

此标志禁用过滤两个几何体属于父体和子体的接触对;回顾 Computation 章中的接触 selection(选择)。

actuation: [disable, enable], “enable”

此标志禁用所有与促动器力相关的标准计算,包括促动器动力学。因此,不对仿真施加任何促动器力。

refsafe: [disable, enable], “enable”

此标志启用一种安全机制,防止由于 solref[0] 相对于仿真时间步长过小而导致不稳定。回想一下,solref[0] 是用于约束稳定的虚拟弹簧阻尼器的刚度。如果此设置启用,求解器将针对每个活动约束分别使用 max(solref[0], 2*timestep) 代替 solref[0]。

sensor: [disable, enable], “enable”

此标志禁用所有与传感器相关的计算。禁用后,传感器值将保持不变,如果在仿真开始时禁用,则为零;如果在运行时禁用,则为最后计算的值。

midphase: [disable, enable], “enable”

此标志禁用使用静态 AABB 边界体积层次结构(BVH 二叉树)进行的中间阶段碰撞过滤。如果禁用,则检查所有允许碰撞的几何体对是否发生碰撞。

nativeccd: [disable, enable], “enable”

此标志启用原生凸碰撞检测管道,而不是使用 libccd 库,有关详细信息,请参阅 convex collisions(凸碰撞)。

eulerdamp: [disable, enable], “enable”

此标志禁用 Euler 积分器中关于关节阻尼的隐式积分。有关详细信息,请参阅 Numerical Integration(数值积分)部分。

autoreset: [disable, enable], “enable”

此标志禁用在检测到数值问题时自动重置仿真状态。

override: [disable, enable], “disable”

此标志启用上述 Contact override(接触覆盖)机制。

energy: [disable, enable], “disable”

此标志启用计算 mjData.energy[0, 1] 中的势能和动能,并在 simulate GUI 信息叠加层中显示。势能包括对所有物体求和的重力分量 \(\sum_b m_b g h\) 以及储存在关节、肌腱和柔性体中被动弹簧内的能量 \(\tfrac{1}{2} k x^2\),其中 \(x\) 是位移,\(k\) 是弹簧常数。动能由 \(\tfrac{1}{2} v^T M v\) 给出,其中 \(v\) 是速度,\(M\) 是质量矩阵。请注意,不计算约束中的势能和动能。

额外的计算(也由 potential(势能)和 kinetic(动能)传感器触发)会增加一些 CPU 时间,但通常可以忽略不计。对于应该能量守恒的系统,监测能量是评估复杂仿真准确性的最佳方法之一。

fwdinv: [disable, enable], “disable”

此标志启用正向动力学和逆向动力学的自动比较。启用后,在 mj_forward(或在 mj_step 内部)之后调用逆向动力学,并将施加力之间的差异记录在 mjData.solver_fwdinv[2] 中。第一个值是关节空间差异的相对范数,下一个是约束空间差异的相对范数。

invdiscrete: [disable, enable], “disable”

此标志对除 RK4 之外的所有 integrators(积分器)启用离散时间逆向动力学与 mj_inverse。回顾 numerical integration(数值积分)部分,一步积分器(Eulerimplicitimplicitfast)会修改质量矩阵 \(M \rightarrow M-hD\)。这意味着有限差分加速度 \((v_{t+h} - v_t)/h\) 将不对应于连续时间加速度 mjData.qacc。启用此标志后,mj_inverse 会将 qacc 解释为由两个连续速度的差计算而来,并撤销上述修改。

multiccd: [disable, enable], “disable”

此标志对使用通用凸-凸碰撞器(例如,网格-网格碰撞)的几何体对启用多点接触碰撞检测。当接触几何体具有平坦表面,并且凸-凸碰撞器生成的单个接触点无法准确捕捉表面接触时,此功能会很有用,否则可能导致通常表现为滑动或晃动的不稳定性。此功能的实现取决于所选的凸碰撞管道,有关详细信息,请参阅 convex collisions(凸碰撞)。

island: [disable, enable], “disable”

此标志启用约束岛的发现:不相互作用的约束和自由度的不相交集合。此标志目前对物理管道没有影响,但启用它可以实现 island visualization(约束岛可视化)。在未来版本中,约束求解器将利用约束岛的不相交特性。

compiler (*)#

此元素用于设置内置解析器和编译器的选项。解析和编译后,它不再有任何作用。此处的设置是全局的,适用于整个模型。

autolimits: [false, true], “true”

此属性影响“limited”(在 <body-joint> 或 <tendon> 上)、“forcelimited”、“ctrllimited”和“actlimited”(在 <actuator> 上)等属性的行为。如果为“true”,则这些属性是不必要的,它们的值将从是否存在其相应的“range”属性中推断出来。如果为“false”,则不会发生此类推断:对于受限关节,必须同时指定 limited=”true” 和 range=”min max”。在此模式下,在没有限制的情况下指定 range 是错误的。

boundmass: real, “0”

此属性对除世界体之外的每个物体的质量施加下限。将此属性设置为大于 0 的值可以快速修复包含无质量运动物体(例如 URDF 模型中常用于连接传感器的虚拟体)的设计不良模型。请注意,在 MuJoCo 中无需创建虚拟体。

boundinertia: real, “0”

此属性对除世界体之外的每个物体的对角惯性分量施加下限。其用法与上面的 boundmass 类似。

settotalmass: real, “-1”

如果此值为正,编译器将按比例缩放模型中所有物体的质量和惯性,使总质量等于此处指定的值。世界体质量为 0,不参与任何与质量相关的计算。此缩放操作最后执行,在所有其他影响物体质量和惯性的操作之后。相同的缩放操作可以在运行时通过函数 mj_setTotalmass 应用于编译后的 mjModel。

balanceinertia: [false, true], “false”

有效的对角惯性矩阵必须对三个对角元素的所有排列满足 A+B>=C。一些设计不良的模型违反此约束,通常会导致编译错误。如果此属性设置为“true”,编译器将在违反上述条件时静默地将所有三个对角元素设置为它们的平均值。

strippath: [false, true], “false” for MJCF, “true” for URDF

当此属性为“true”时,解析器将移除模型中指定文件名中的任何路径信息。这对于加载在不同系统上使用不同目录结构创建的模型非常有用。

coordinate: [local, global], “local”

在以前的版本中,此属性可用于指定框架位置和方向是以局部坐标还是全局坐标表示,但“global”选项现已移除,并将生成错误。为了转换使用“global”选项的旧模型,请在 MuJoCo 2.3.3 或更早版本中加载并保存它们。

angle: [radian, degree], “degree” for MJCF, always “radian” for URDF

此属性指定 MJCF 模型中的角度是以度为单位还是以弧度为单位表示。编译器会将度转换为弧度,mjModel 始终使用弧度。对于 URDF 模型,解析器在内部将此属性设置为“radian”,无论 XML 设置如何。

fitaabb: [false, true], “false”

编译器能够将网格替换为拟合该网格的几何图元;请参阅下面的 geom。如果此属性为“true”,则拟合过程使用网格的轴对齐边界框 (aabb)。否则,它使用网格的等效惯性框。用于拟合的几何图元类型是为每个 geom 单独指定的。

eulerseq: string, “xyz”

此属性指定具有空间框架的元素所有 euler 属性的欧拉旋转序列,如 Frame orientations(框架方向)中所述。这必须是一个由 {x, y, z, X, Y, Z} 集合中恰好 3 个字符组成的字符串。位置 n 的字符决定了执行第 n 次旋转的轴。小写字母表示随框架旋转的轴(内旋),而大写字母表示在父框架中保持固定的轴(外旋)。URDF 中使用的“rpy”约定对应于 MJCF 中的“XYZ”。

meshdir: string, optional

此属性指示编译器在哪里查找网格和高度场地文件。文件的完整路径确定如下。如果上述 strippath 属性为“true”,则会删除文件名中的所有路径信息。然后按顺序应用以下检查:(1) 如果文件名包含绝对路径,则直接使用,不再更改;(2) 如果设置了此属性且包含绝对路径,则完整路径为此处给定的字符串后附加文件名;(3) 完整路径为主 MJCF 模型文件的路径,如果指定了此属性的值,则在其后附加此值,然后再附加文件名。

texturedir: string, optional

此属性用于指示编译器在哪里查找纹理文件。其工作方式与上面的 meshdir 相同。

assetdir: string, optional

此属性设置上述 meshdirtexturedir 的值。后两个属性中的值优先于 assetdir

discardvisual: [false, true], “false” for MJCF, “true” for URDF

此属性指示编译器丢弃所有纯粹用于可视化且对物理没有影响的模型元素(有一个例外,见下文)。这通常可以生成更小的 mjModel 结构体并加快仿真速度。

  • 所有材质都被丢弃。

  • 所有纹理都被丢弃。

  • 所有 contype⁠=⁠conaffinity⁠=0 的几何体如果未在其他 MJCF 元素中引用,则被丢弃。如果丢弃的几何体曾用于推断物体惯性,则会向该物体添加一个显式的 inertial 元素。

  • 未被任何几何体(特别是上面丢弃的那些)引用的所有网格都将被丢弃。

最终编译的模型将具有与原始模型完全相同的动力学。唯一可能改变的引擎级计算是光线投射计算的输出,例如测距传感器使用的,因为光线投射报告与可视几何体的距离。使用此标志编译的模型进行可视化时,请务必记住碰撞几何体通常放置在默认不可见的中。

usethread: [false, true], “true”

如果此属性为“true”,模型编译器将以多线程模式运行。目前多线程用于计算执行器的长度范围以及并行加载网格。

fusestatic: [false, true], MJCF 默认为“false”,URDF 默认为“true”

此属性控制一个编译器优化功能,其中静态物体与其父级融合,并且在这些物体中定义的任何元素都被重新分配给父级。此功能只能用于运动学树内部没有能够进行命名引用元素的模型,即皮肤、接触对、排除项、肌腱、执行器、传感器、元组、相机、光照。如果模型包含任何这些元素,即使启用 fusestatic 也不会执行任何操作。此优化在导入通常有许多虚拟物体的 URDF 模型时特别有用,但也可用于优化 MJCF 模型。优化后,新模型具有与原始模型相同的运动学和动力学,但仿真速度更快。

inertiafromgeom: [false, true, auto], “auto”

此属性控制从附加到物体的几何体自动推断物体质量和惯量。如果此设置是“false”,则不执行自动推断。在这种情况下,每个物体必须使用inertial元素显式定义质量和惯量,否则将生成编译错误。如果此设置是“true”,则每个物体的质量和惯量将从附加到它的几何体推断,覆盖使用inertial元素指定的任何值。默认设置“auto”意味着只有在物体定义中缺失inertial元素时才会自动推断质量和惯量。将此属性设置为“true”而非“auto”的一个原因是覆盖从设计不良模型导入的惯性数据。特别是在许多公开可用的 URDF 模型中,惯量看似任意,与质量相比过大。这导致等效惯量框远超模型的几何边界。注意,内置的 OpenGL 可视化器可以渲染等效惯量框。

alignfree: [false, true], “false”

此属性切换适用于带有自由关节且没有子物体的物体的优化的默认行为。当为 true 时,物体坐标系和自由关节将自动与惯性坐标系对齐,从而实现更快更稳定的仿真。详情请参见freejoint/align

inertiagrouprange: int(2), “0 5”

此属性指定用于推断物体质量和惯量(当此类推断启用时)的几何体组范围。geom 的 group 属性是一个整数。如果此整数落在此处指定的范围内,该几何体将用于惯量计算,否则将被忽略。此功能在具有用于碰撞和可视化的冗余几何体集合的模型中很有用。注意,世界物体不参与惯量计算,因此附加到它的任何几何体都会被自动忽略。因此,不需要调整此属性和几何体特定组,以便将世界几何体排除在惯量计算之外。

saveinertial: [false, true], “false”

如果设置为“true”,编译器将为所有物体保存显式的inertial子句。

compiler/lengthrange (?)#

此元素控制执行器长度范围的计算。有关此功能的概述,请参见长度范围部分。注意,如果省略此元素,下面显示的默认值仍然适用。为了完全禁用长度范围计算,请包含此元素并将 mode=”none”设置。

mode: [none, muscle, muscleuser, all], “muscle”

确定应用长度范围计算的执行器类型。“none”禁用此功能。“all”将其应用于所有执行器。“muscle”将其应用于 gaintype 或 biastype 设置为“muscle”的执行器。“muscleuser”将其应用于 gaintype 或 biastype 设置为“muscle”或“user”的执行器。默认值为“muscle”,因为 MuJoCo 的肌肉模型需要定义执行器长度范围。

useexisting: [false, true], “true”

如果此属性为“true”,并且给定执行器的长度范围已在模型中定义,则将使用现有值,并跳过自动计算。如果第一个数字小于第二个数字,则该范围被视为已定义。将此属性设置为“false”的唯一原因是强制重新计算执行器长度范围 - 当模型几何体被修改时需要这样做。注意,自动计算依赖于仿真,可能很慢,因此建议在可能的情况下保存模型并使用现有值。

uselimit: [false, true], “false”

如果此属性为“true”,并且执行器附加到具有定义限制的关节或肌腱上,则这些限制将被复制到执行器长度范围,并跳过自动计算。这可能看起来是个好主意,但请注意,在复杂模型中,肌腱执行器的可行范围取决于整个模型,并且可能小于该肌腱的用户定义限制。因此,更安全的方法是将其设置为“false”,让自动计算发现可行范围。

accel: 实数, “20”

此属性缩放应用于仿真的力,以便将每个执行器推向其最小和最大长度。计算力的大小,使得产生的关节空间加速度向量的范数等于此属性。

maxforce: 实数, “0”

当执行器力矩非常小时,通过上述 accel 属性计算出的力可能非常大。这样的力仍然会产生合理的加速度(根据构造),但大数值可能导致数值问题。尽管我们从未观察到此类问题,但提供此属性作为保障。将其设置为大于 0 的值会限制在仿真过程中施加的力的范数。默认设置 0 禁用此保障。

timeconst: 实数, “1”

仿真以非物理方式阻尼,以便将执行器推向其极限而没有不稳定风险。这是通过在每个时间步简单地缩减关节速度来完成的。在没有新的加速度的情况下,这种缩放将使速度指数衰减。timeconst 属性指定此指数衰减的时间常数,以秒为单位。

timestep: 实数, “0.01”

内部仿真使用的时间步长。将其设置为 0 将导致使用模型的步长。后者不是默认值,因为容易变得不稳定的模型通常具有小的时间步长,而此处仿真被人为阻尼且非常稳定。为了加快长度范围计算,用户可以尝试增加此值。

inttotal: 实数, “10”

运行内部仿真的总时间间隔(以秒为单位),适用于每个执行器和执行器方向。每个仿真都在 qpos0 初始化。预期在 inttotal 时间经过后稳定。

interval: 实数, “2”

仿真结束时用于收集和分析长度数据的时间间隔。记录在此间隔内达到的最大(或相应地最小)长度。最大值和最小值之间的差异也被记录,并用作发散度量。如果仿真稳定,此差异将很小。如果它不大,可能是因为仿真尚未稳定(在这种情况下应调整上述属性),或者因为模型没有足够的关节和肌腱限制,因此执行器范围实际无限。这两种情况都会导致相同的编译错误。回想一下,在此仿真中接触被禁用,因此关节和肌腱限制以及整体几何体是唯一能阻止执行器具有无限长度的事物。

tolrange: 实数, “0.05”

这决定了检测发散和生成编译错误的阈值。在 interval 期间观察到的执行器长度范围除以通过仿真计算的总范围。如果该值大于 tolrange,则生成编译错误。因此,抑制编译错误的一种方法是简单地增大此属性,但在那种情况下结果可能不准确。

size (*)#

此元素指定无法从模型中元素数量推断的大小参数。与可在运行时修改的 mjOption 字段不同,大小是结构参数,不应在编译后修改。

memory: string, “-1”

此属性指定在 mjData.arena 内存空间中为动态数组分配的内存大小,以字节为单位。-1 的默认设置指示编译器猜测应分配多少空间。在数字后附加字母 {K, M, G, T, P, E} 之一,将单位分别设置为千字节、兆字节、吉字节、太字节、拍字节、艾字节。因此,“16M”表示“分配 16 兆字节的 arena 内存”。参见内存分配部分了解详情。

njmax: int, “-1”       (传统属性)

这是弃用的传统属性。在 2.3.0 之前的版本中,它决定了允许的最大约束数量。当前表示“分配与之前此数量约束所需的内存一样多”。同时指定 njmaxmemory 会导致错误。

nconmax: int, “-1”       (传统属性)

此属性指定运行时将生成的最大接触数量。如果活动接触数量即将超过此值,多余的接触将被丢弃并生成警告。这是弃用的传统属性,在 2.3.0 版本之前影响内存分配。保留用于向后兼容性和调试目的。

nstack: int, “-1”       (传统属性)

这是弃用的传统属性。在 2.3.0 之前的版本中,它决定了堆栈的最大大小。在 2.3.0 版本之后,如果指定了 nstack,则 mjData.narena 的大小是 nstack * sizeof(mjtNum) 字节,再加上用于约束求解器的额外空间。同时指定 nstackmemory 会导致错误。

nuserdata: int, “0”

mjData 的 mjData.userdata 字段的大小。此字段应用于存储自定义动态变量。另请参见用户参数

nkey: int, “0”

在 mjModel 中分配的关键帧数量是此值和下方key元素数量中的较大者。注意,交互式模拟器能够捕获系统状态的快照并将其保存为关键帧。

nuser_body: int, “-1”

添加到每个物体定义中的自定义用户参数数量。另请参见用户参数。参数值通过body元素的 user 属性设置。这些值不被 MuJoCo 访问。它们可用于定义用户回调和其他自定义代码所需的元素属性。

nuser_jnt: int, “-1”

添加到每个关节定义中的自定义用户参数数量。

nuser_geom: int, “-1”

添加到每个几何体定义中的自定义用户参数数量。

nuser_site: int, “-1”

添加到每个site定义中的自定义用户参数数量。

nuser_cam: int, “-1”

添加到每个相机定义中的自定义用户参数数量。

nuser_tendon: int, “-1”

添加到每条肌腱定义中的自定义用户参数数量。

nuser_actuator: int, “-1”

添加到每个执行器定义中的自定义用户参数数量。

nuser_sensor: int, “-1”

添加到每个传感器定义中的自定义用户参数数量。

statistic (*)#

此元素用于覆盖编译器计算的模型统计数据。这些统计数据不仅提供信息,还用于缩放渲染和扰动的各种组件。我们在 XML 中提供覆盖机制,因为有时调整少量模型统计数据比调整大量可视参数更容易。

meanmass: 实数, 可选

如果指定此属性,它将替换编译器计算的 mjModel.stat.meanmass 的值。计算值是平均物体质量,不计入无质量的世界物体。在运行时,此值缩放扰动力。

meaninertia: 实数, 可选

如果指定此属性,它将替换编译器计算的 mjModel.stat.meaninertia 的值。计算值是模型处于 qpos0 时关节空间惯量矩阵的平均对角线元素。在运行时,此值缩放用于提前终止的求解器成本和梯度。

meansize: 实数, 可选

如果指定此属性,它将替换编译器计算的 mjModel.stat.meansize 的值。在运行时,此值乘以上面scale元素的属性,并作为其长度单位。如果需要特定长度,将meansize设置为像 1 或 0.01 这样的整数会很方便,以便scale值以可识别的长度单位表示。这是meansize的唯一语义,设置它没有其他副作用。自动计算的值是启发式的,代表平均物体半径。启发式基于存在时的几何体大小、存在时的关节间距离以及物体等效惯量框的大小。

extent: 实数, 可选

如果指定此属性,它将替换编译器计算的 mjModel.stat.extent 的值。计算值是模型在初始配置中边界框的半边长。在运行时,此值乘以上面map元素的一些属性。模型首次加载时,自由相机与center(见下文)的初始距离是 extent 的 1.5 倍。必须为严格正数。

center: 实数(3), 可选

如果指定此属性,它将替换编译器计算的 mjModel.stat.center 的值。计算值是整个模型在初始配置中边界框的中心。此 3D 向量用于在模型首次加载时使自由相机的视图居中。

asset (*)#

这是用于定义资源的分组元素。它没有属性。资源在模型中创建,以便可以从其他模型元素中引用它们;回顾概述章节中关于资源的讨论。从文件打开的资源可以通过两种不同的方式识别:文件名扩展名或 content_type 属性。MuJoCo 将尝试打开由提供的内容类型指定的文件,只有在未指定 content_type 属性时才默认使用文件名扩展名。如果资源不是从文件加载的,则忽略内容类型。

asset/mesh (*)#

此元素创建一个网格资源,然后可以从几何体中引用它。如果引用几何体类型是mesh,则在模型中实例化该网格,否则会自动拟合一个几何基本体;参见下面的geom元素。

MuJoCo 使用三角网格。它们可以从二进制 STL 文件、OBJ 文件或具有下面描述的自定义格式的 MSH 文件加载,或者直接在 XML 中指定顶点和面数据。可以使用 MeshLab 等软件将其他网格格式转换为 STL 或 OBJ。虽然任何三角形集合都可以作为网格加载和渲染,但碰撞检测使用网格的凸包,如碰撞检测中解释的那样。另请参见compiler元素的 convexhull 属性,它控制凸包的自动生成。网格外形(包括纹理映射)由引用几何体的materialrgba属性控制,类似于高度场。

网格可以具有显式纹理坐标,而不依赖于自动化纹理映射机制。提供时,这些显式坐标具有优先权。注意,纹理坐标可以通过 OBJ 文件和 MSH 文件指定,也可以通过 XML 中的texcoord属性显式指定,但不能通过 STL 文件指定。这些机制不能混用。因此,如果您有 STL 网格,添加纹理坐标的唯一方法是将其转换为其他支持的格式之一。

传统 MSH 文件格式

二进制 MSH 文件以 4 个整数开头,指定顶点位置数 (nvertex)、顶点法线数 (nnormal)、顶点纹理坐标数 (ntexcoord) 和构成面的顶点索引数 (nface),后面跟着数值数据。nvertex 必须至少为 4。nnormal 和 ntexcoord 可以为零(在这种情况下,相应数据未定义)或等于 nvertex。nface 也可以为零,在这种情况下,面会从顶点位置的凸包自动构造。文件大小(以字节为单位)必须正好是:16 + 12*(nvertex + nnormal + nface) + 8*ntexcoord。文件内容必须如下所示

(int32)   nvertex
(int32)   nnormal
(int32)   ntexcoord
(int32)   nface
(float)   vertex_positions[3*nvertex]
(float)   vertex_normals[3*nnormal]
(float)   vertex_texcoords[2*ntexcoord]
(int32)   face_vertex_indices[3*nface]

设计不良的网格可能显示渲染瑕疵。特别是,阴影映射机制依赖于前后三角形面之间存在一定距离。如果面重复,且法线方向与每个三角形中顶点顺序确定的方向相反,则会导致阴影锯齿。解决方案是移除重复的面(这可以在 MeshLab 中完成)或使用设计更好的网格。MuJoCo 会检查指定为 OBJ 或 XML 的网格是否包含翻转的面,并返回错误消息。

网格的大小由网格文件中顶点数据的 3D 坐标决定,并乘以以下scale属性的分量。缩放分别应用于每个坐标轴。注意,负缩放值可用于翻转网格;这是合法操作。引用几何体的大小参数被忽略,类似于高度场。我们还提供使用refposrefquat属性来平移和旋转 3D 坐标的机制。

网格也可以在没有面的情况下定义(本质上是一个点云)。在那种情况下,即使编译器属性convexhull为 false,也会自动构造凸包。这使得在 XML 中直接构造简单形状变得容易。例如,金字塔可以如下创建

<asset>
  <mesh name="tetrahedron" vertex="0 0 0  1 0 0  0 1 0  0 0 1"/>
</asset>

定位和定向很复杂,因为源资源中的顶点数据通常相对于原点不在网格内部的坐标系。相反,MuJoCo 期望几何体局部坐标系的原点与形状的几何中心重合。我们通过在编译器中预处理网格来解决这种差异,使其以 (0,0,0) 为中心,并且其惯性主轴与坐标轴对齐。我们将应用于源资源的平移和旋转偏移保存在mjModel.mesh_posmjModel.mesh_quat中;如果从源读取顶点数据并需要重新应用变换,则需要这些偏移。这些偏移随后与引用几何体的位置和方向复合;也请参见下方geommesh属性。幸运的是,机器人模型中使用的大多数网格都设计在以关节为中心的坐标系中。这使得相应的 MJCF 模型直观:我们将物体坐标系设置在关节处,使得关节位置在物体坐标系中是 (0,0,0),然后简单地引用网格。下面是一个前臂的 MJCF 模型片段,包含将网格放置在预期位置所需的所有信息。物体位置相对于父物体指定,即上臂(未显示)。它偏移了 35 厘米,这是人类上臂的典型长度。如果网格顶点数据不是按照上述约定设计的,我们将不得不使用几何体位置和方向(或refpos,refquat机制)进行补偿,但实际上这很少需要。

<asset>
  <mesh file="forearm.stl"/>
</asset>

<body pos="0 0 0.35"/>
  <joint type="hinge" axis="1 0 0"/>
  <geom type="mesh" mesh="forearm"/>
</body>

上述惯量计算是用于不仅使网格居中和对齐,还用于推断其所附加物体的质量和惯量的算法的一部分。这是通过计算三角形面的质心,将每个面与质心连接形成三角锥体,计算所有锥体(视为实体,如果shellinertia为 true 则视为空心)的质量和带符号惯量,然后进行累加来完成的。符号确保减去表面外部的锥体,这可能发生在凹面几何体中。此算法可在 Joseph O’Rourke 撰写的《C 语言计算几何》(第二版)第 1.3.8 节找到。

编译器应用于每个网格的全部处理步骤列表如下

  1. 对于 STL 网格,移除任何重复顶点,并根据需要重新索引面。如果网格不是 STL,我们假设所需的顶点和面已经生成,不应用移除或重新索引;

  2. 如果未提供顶点法线,则使用周围面法线的加权平均自动生成法线。如果遇到尖锐边缘,渲染器使用面法线来保留关于边缘的可视信息,除非smoothnormal为 true。注意,STL 网格不能提供法线;

  3. 缩放、平移和旋转顶点和法线,如果缩放,则重新规范化法线。将这些变换保存在 mjModel.mesh_{pos, quat, scale} 中。

  4. 如果指定,构造凸包;

  5. 找到所有三角形面的质心,并构造锥体联合表示。面积过小的三角形(低于mjMINVAL值 1E-14)会导致编译错误;

  6. 计算锥体联合的质量中心和惯量矩阵。使用特征值分解找到惯性主轴。使网格居中并对齐,保存平移和旋转偏移供随后的几何体相关计算使用。

name: string, 可选

网格名称,用于引用。如果省略,网格名称等于不带路径和扩展名的文件名。

class: string, 可选

用于设置未指定属性的默认类(在这种情况下只有 scale)。

content_type: string, 可选

如果指定了 file 属性,则此项设置要加载文件的媒体类型(之前称为 MIME 类型)。任何文件名扩展名将被覆盖。目前支持 model/vnd.mujoco.mshmodel/objmodel/stl

file: string, 可选

网格将从中加载的文件。路径按照compiler的 meshdir 属性中的描述确定。文件扩展名必须是“stl”、“msh”或“obj”(不区分大小写),指定文件类型。如果省略文件名,则 vertex 属性变为必需。

scale: 实数(3), “1 1 1”

此属性指定将应用于顶点数据沿每个坐标轴的缩放。允许负值,导致网格沿对应轴翻转。

inertia: [convex, exact, legacy, shell], “legacy”

此属性控制当质量和惯量从几何体推断时,网格如何使用。当前默认值legacy将在未来版本中更改为convex

convex: 使用网格的凸包计算体积和惯量,假设均匀密度。

exact: 精确计算体积和惯量,即使对于非凸网格。此算法需要定向良好、水密的网格,否则将出错。

legacy: 使用传统算法,对于非凸网格会导致体积重复计数。尽管目前为避免中断而设为默认值,但不推荐使用。

shell: 假设质量集中在网格表面。使用网格表面计算惯量,假设均匀表面密度。

smoothnormal: [false, true], “false”

控制未显式给出法线时顶点法线的自动生成。如果为 true,则通过平均每个顶点处的面法线生成平滑法线,权重与面面积成比例。如果为 false,则角度相对于平均法线较大的面被排除在平均之外。这样,尖锐边缘(如立方体边缘)不会被平滑。

maxhullvert: int, “-1”

网格凸包中的最大顶点数。目前这通过要求 qhull maxhullvert个顶点后终止来实现。默认值 -1 表示“无限制”。正值必须大于 3。

vertex: 实数(3*nvert), 可选

顶点 3D 位置数据。您可以使用此属性在 XML 中指定位置数据,或使用二进制文件,但不能两者都使用。

normal: 实数(3*nvert), 可选

顶点 3D 法线数据。如果指定,法线数量必须等于顶点数量。模型编译器自动规范化法线。

texcoord: 实数(2*nvert), 可选

顶点 2D 纹理坐标,其数值介于 0 和 1 之间。如果指定,纹理坐标对的数量必须等于顶点数量。

face: int(3*nface), 可选

网格的面。每个面是 3 个顶点索引的序列,按逆时针顺序。索引必须是 0 到 nvert-1 之间的整数。

refpos: 实数(3), “0 0 0”

定义 3D 顶点坐标的参考位置。此向量从位置中减去。

refquat: 实数(4), “1 0 0 0”

定义 3D 顶点坐标和法线的参考方向。此四元数的共轭用于旋转位置和法线。模型编译器自动规范化四元数。

mesh/plugin (?)#

将此网格与引擎插件关联。plugininstance之一是必需的。

plugin: string, 可选

插件标识符,用于隐式插件实例化。

instance: string, 可选

实例名称,用于显式插件实例化。

asset/hfield (*)#

此元素创建一个高度场资源,然后可以从类型为“hfield”的几何体中引用它。高度场,也称为地形图,是高程数据的 2D 矩阵。数据可以用三种方式指定

  1. 高程数据可以从 PNG 文件加载。图像在内部转换为灰度,每个像素的强度用于定义高程;白色表示高,黑色表示低。

  2. 高程数据可以从下面描述的自定义格式的二进制文件加载。与 MuJoCo 中使用的所有其他矩阵一样,数据顺序为行优先,如同图像中的像素。如果数据大小为 nrow x ncol,则文件必须有 4*(2+nrow*ncol) 字节

    (int32)   nrow
    (int32)   ncol
    (float32) data[nrow*ncol]
    
  3. 高程数据在编译时可以未定义。这是通过指定 nrow 和 ncol 属性来完成的。编译器在 mjModel 中为高度场数据分配空间并将其设置为 0。用户随后可以在运行时生成自定义高度场,无论是通过编程方式还是使用传感器数据。

无论使用哪种方法指定高程数据,编译器总是将其归一化到 [0 1] 范围。然而,如果数据在编译时未定义且稍后在运行时生成,则用户有责任对其进行归一化。
高度场的位置和方向由引用它的几何体决定。另一方面,空间范围由高度场资源本身通过 size 属性指定,并且不能被引用几何体修改(在这种情况下,几何体大小参数被忽略)。下面的网格使用相同的方法:定位由几何体完成,而大小由资源完成。这是因为高度场和网格涉及其他几何体不常见的尺寸操作。
对于碰撞检测,高度场被视为三角柱体的联合。高度场与其他几何体之间的碰撞(除了不受支持的平面和其他高度场之外)通过首先选择可能与几何体发生碰撞的棱柱体子网格(基于其边界框),然后使用通用凸碰撞体来计算。高度场与几何体之间可能的接触数量限制为 50(mjMAXCONPAIR);超出此数量的任何接触都将被丢弃。为了避免因丢弃的接触导致的穿透,高度场的空间特征应相对于与之碰撞的几何体较大。
name: string, 可选

高度场名称,用于引用。如果省略名称并指定了文件名,则高度场名称等于不带路径和扩展名的文件名。

content_type: string, 可选

如果指定了 file 属性,则此项设置要加载文件的媒体类型(之前称为 MIME 类型)。任何文件名扩展名将被覆盖。目前支持 image/pngimage/vnd.mujoco.hfield

file: string, 可选

如果指定此属性,高程数据将从给定文件加载。如果文件扩展名是“.png”(不区分大小写),则文件被视为 PNG 文件。否则,它被视为上述自定义格式的二进制文件。数据中的行数和列数从文件内容确定。从文件加载数据并同时将下方 nrow 或 ncol 设置为非零值会导致编译错误,即使这些设置与文件内容一致。

nrow: int, “0”

此属性和下一个属性用于在 mjModel 中分配高度场。如果未设置elevation属性,高程数据将设置为 0。此属性指定高程数据矩阵的行数。默认值 0 表示数据将从文件加载,文件将用于推断矩阵的大小。

ncol: int, “0”

此属性指定高程数据矩阵的列数。

elevation: 实数(nrow*ncol), 可选

此属性指定高程数据矩阵。值通过先减去最小值,然后除以(最大值-最小值)的差值(如果不为 0)自动归一化到 0 到 1 之间。如果未提供,值将设置为 0。

size: 实数(4), 必需
_images/peaks.png

这里的四个数字是 (radius_x, radius_y, elevation_z, base_z)。高度场中心位于引用几何体的局部坐标系。高程沿 +Z 方向。前两个数字指定定义高度场的矩形在 X 和 Y 方向的范围(或“半径”)。这对于矩形来说可能看起来不自然,但对于球体和其他几何体类型来说是自然的,我们倾向于在整个模型中使用相同的约定。第三个数字是最大高程;它缩放归一化到 [0-1] 的高程数据。因此,最小高程点在 Z=0,最大高程点在 Z=elevation_z。最后一个数字是沿 -Z 方向的一个箱体的深度,用作高度场的“基底”。没有这个自动生成的箱体,高度场在归一化高程数据为零的地方厚度将为零。与施加全局单侧约束的平面不同,高度场被视为常规几何体的联合,因此没有“在高度场下方”的概念。相反,一个几何体要么在高度场内部要么在外部 - 这就是为什么内部部分必须具有非零厚度的原因。右侧示例是 MATLAB “peaks” 曲面,以我们的自定义高度场格式保存,并作为 size = “1 1 1 0.1” 的资源加载。箱体的水平尺寸为 2,最大高程与最小高程之差为 1,在最小高程点下方添加的基底深度为 0.1。

asset/skin (*)#

皮肤已移至新的分组元素deformable下方。它们仍然可以在此处指定,但此功能现已弃用,将来将被移除。

asset/texture (*)#

此元素创建一个纹理资源,然后从material资源中引用,最后从需要应用纹理的模型元素中引用。MuJoCo 提供访问 OpenGL 纹理映射机制的途径。纹理坐标在 GL_OBJECT_PLANE 模式下自动生成,使用 2D 或立方体映射。MIP 贴图在 GL_LINEAR_MIPMAP_LINEAR 模式下总是启用。纹理颜色在 GL_MODULATE 模式下与物体颜色结合。纹理数据可以从 PNG 文件加载,并提供加载立方体和天空盒纹理的功能。或者,数据可以由编译器生成为程序纹理。由于不同的纹理类型需要不同的参数,因此对于任何给定纹理,仅使用以下属性的一个子集。
除了 PNG 之外,还支持第二种文件格式用于加载纹理。如果文件名扩展名与 .png 或 .PNG 不同,或者如果 content_type 属性设置为 image/vnd.mujoco.texture,则 MuJoCo 假定纹理采用此格式。这是一种自定义二进制文件格式,包含以下数据
(int32)   width
(int32)   height
(byte)    rgb_data[3*width*height]
name: string, 可选

与所有其他资源一样,纹理必须具有名称才能被引用。然而,如果纹理是使用 file 属性从单个文件加载的,可以省略显式名称,文件名(不带路径和扩展名)将成为纹理名称。如果解析后的名称为空且纹理类型不是“skybox”,编译器将生成错误。

type: [2d, cube, skybox], “cube”

此属性决定纹理如何表示并映射到对象。它还决定了哪些剩余属性是相关的。关键字含义如下

cube 类型具有将纹理立方体收缩包裹到对象上的效果。除了material的 texuniform 属性提供的调整之外,该过程是自动的。内部,GPU 构造一条从对象中心到每个像素(或更确切地说,片段)的光线,找到此光线与立方体表面的交点(立方体和对象具有相同的中心),并使用相应的纹理颜色。定义立方体的六个方形图像可以相同或不同;如果它们相同,则在 mjModel 中只存储一份副本。指定纹理数据的四种机制

  1. 使用 file 属性指定的单个文件(PNG 或自定义),包含一个方形图像,该图像在立方体的每边重复。这是最常见的方法。例如,如果目标是创建木材的外观,在所有侧面重复同一图像就足够了。

  2. 包含复合图像的单个文件,编译器从中提取六个方形。复合图像的布局由 gridsize 和 gridlayout 属性确定。

  3. 使用 fileright, fileleft 等属性指定的六个单独文件,每个文件包含一个方形图像。

  4. 内部生成的程序纹理。程序纹理的类型由 builtin 属性确定。纹理数据还取决于许多下面有文档说明的参数。

skybox 类型与立方体映射非常相似,实际上纹理数据的指定方式完全相同。唯一区别是可视化器使用模型中定义的第一个此类纹理来渲染天空盒。这是一个以相机为中心且始终随其移动的大箱体,其大小根据远剪裁平面自动确定。其理念是天空盒上的图像看起来是静止的,仿佛它们无限远。如果此类纹理从应用于常规对象的 material 引用,其效果等同于立方体贴图。然而请注意,适合天空盒的图像很少适合用于纹理化对象。

2d 类型使用纹理坐标(又称 UV 坐标)将 2D 图像映射到 3D 对象。然而,UV 坐标仅适用于网格。对于基本体几何体,纹理使用几何体的局部 XY 坐标映射到对象表面,有效地沿 Z 轴投影纹理。这种映射仅适用于平面和高度场,因为它们的顶面总是面向 Z 轴。2d 纹理可以是矩形,与必须是方形的立方体纹理的侧面不同。缩放可以通过materialtexrepeat属性控制。数据可以从单个文件加载或程序生成。

content_type: string, 可选

content_type string, 可选

file: string, 可选

如果指定了 file 属性,则此项设置要加载文件的媒体类型(之前称为 MIME 类型)。任何文件名扩展名将被忽略。目前支持 image/pngimage/vnd.mujoco.texture

gridsize: int(2), “1 1”

当立方体或天空盒纹理从单个文件加载时,此属性和下一个属性指定如何从单个图像中获取纹理立方体的六个方形侧面。默认设置“1 1”表示同一图像在立方体的所有侧面重复。否则,图像被解释为一个网格,从中提取六个侧面。这里的两个整数对应于网格的行数和列数。每个整数必须为正,且两者的乘积不能超过 12。图像中的行数和列数必须是网格行数和列数的整数倍,且这两个倍数必须相等,以便提取的图像是方形的。

gridlayout: string, “…………”
_images/skybox.png

当立方体或天空盒纹理从单个文件加载且网格大小不同于“1 1”时,此属性指定使用哪些网格单元格以及它们对应立方体的哪一面。网上有许多可用的天空盒纹理是复合图像,但它们不使用相同的约定,这就是我们设计灵活机制来解码它们的原因。此处指定的字符串必须由集合 {‘.’, ‘R’, ‘L’, ‘U’, ‘D’, ‘F’, ‘B’} 中的字符组成。字符数必须等于两个网格大小的乘积。网格按行优先顺序扫描。字符‘.’表示未使用的单元格。其他字符是 Right, Left, Up, Down, Front, Back 的首字母;坐标系描述见下文。如果某个侧面的符号出现多次,则使用最后一次定义。如果省略了某个侧面,则用 rgb1 属性指定的颜色填充。例如,下面的沙漠景观可以使用 gridsize = “3 4” 和 gridlayout = “.U..LFRB.D..” 加载为天空盒或立方体贴图。不带标记的全分辨率图像文件可以在此处下载。

fileright, fileleft, fileup, filedown, filefront, filebackstring, 可选

这些属性用于从单独文件中加载立方体或天空盒纹理的六个侧面,但仅当 file 属性被省略且 builtin 属性设置为“none”时。如果省略了这些属性中的任何一个,则相应的侧面将填充 rgb1 属性指定的颜色。这里的坐标系不寻常。当使用初始配置中的默认自由相机查看天空盒时,Right、Left、Up、Down 侧面会出现在预期位置。Back 侧面出现在观察者前面,因为观察者在箱体中间,并且面向箱体的背面。然而存在一个复杂之处。在 MuJoCo 中,+Z 轴向上,而现有的天空盒纹理(设计起来不简单)倾向于假定 +Y 轴向上。更改坐标不能仅通过重命名文件来实现;相反,必须对某些图像进行转置和/或镜像。为了避免这种复杂情况,我们将天空盒绕 +X 轴旋转 90 度进行渲染,这违反了我们的约定。但是我们不能对常规对象这样做。因此,天空盒和立方体纹理在常规对象上的映射(在对象的局部坐标系中表示)如下:Right = +X, Left = -X, Up = +Y, Down = -Y, Front = +Z, Back = -Z。

builtin: [none, gradient, checker, flat], “none”

此属性和剩余属性控制程序纹理的生成。如果此属性的值不同于“none”,则纹理被视为程序纹理,并且忽略任何文件名。关键字含义如下

gradient (渐变)

生成从 rgb1 到 rgb2 的颜色渐变。颜色空间的插值通过 Sigmoid 函数完成。对于立方体和天空盒纹理,渐变沿 +Y 轴方向,即对于天空盒渲染,从上到下。

checker (棋盘格)

生成一个 2x2 棋盘格图案,颜色由 rgb1 和 rgb2 交替。这适用于渲染地面平面以及标记具有旋转对称性的对象。注意,2d 纹理可以缩放,以便根据需要重复图案任意多次。对于立方体和天空盒纹理,棋盘格图案绘制在立方体的每边。

flat (平面色)

用 rgb1 填充整个纹理,除了立方体和天空盒纹理的底面,底面用 rgb2 填充。

rgb1: 实数(3), “0.8 0.8 0.8”

用于程序纹理生成的第一个颜色。此颜色也用于填充从文件加载的立方体和天空盒纹理的缺失侧面。此向量和所有其他 RGB(A) 向量的分量应在 [0 1] 范围内。

rgb2: 实数(3), “0.5 0.5 0.5”

用于程序纹理生成的第二个颜色。

mark: [none, edge, cross, random], “none”

程序纹理可以使用 markrgb 颜色进行标记,叠加在由 builtin 类型确定的颜色之上。“edge”表示标记所有纹理图像的边缘。“cross”表示在每个图像中间标记一个交叉。“random”表示随机选择的像素被标记。所有标记宽度为一个像素,因此在较小的纹理上标记显得更大、更弥漫。

markrgb: 实数(3), “0 0 0”

用于程序纹理标记的颜色。

random: 实数, “0.01”

当 mark 属性设置为“random”时,此属性确定打开每个像素的概率。注意,较大的纹理有更多像素,此处概率独立应用于每个像素 – 因此纹理大小和概率需要共同调整。与渐变天空盒纹理一起,这可以创建带有星星的夜空外观。随机数生成器使用固定种子初始化。

width: int, “0”

程序纹理的宽度,即图像中的列数。较大的值通常产生更高质量的图像,尽管在某些情况下(例如棋盘格图案)小值就足够了。对于从文件加载的纹理,此属性被忽略。

height: int, “0”

程序纹理的高度,即图像中的行数。对于立方体和天空盒纹理,此属性被忽略,高度设置为宽度的 6 倍。对于从文件加载的纹理,此属性被忽略。

hflip: [false, true], “false”

如果为 true,则从文件加载的图像在水平方向翻转。不影响程序纹理。

vflip: [false, true], “false”

如果为 true,则从文件加载的图像在垂直方向翻转。不影响程序纹理。

nchannel: int, “3”

纹理图像文件中的通道数量。这允许加载 4 通道纹理 (RGBA) 或单通道纹理(例如,用于基于物理渲染的属性,如粗糙度或金属度)。

asset/material (*)#

此元素创建了一个材质资产。它可以被 skinsgeomssitestendons 引用,以设置它们的外观。请注意,所有这些元素也都有一个本地 rgba 属性,当只需要调整颜色时,它更方便,因为它不需要创建材质并引用它们。材质对于调整颜色之外的外观属性很有用。然而,一旦创建了材质,更自然的做法是使用材质指定颜色,这样所有外观属性都被组合在一起。

name: string, 必需

材质的名称,用于引用。

class: string, 可选

用于设置未指定属性的默认类。

texture: string, 可选

如果指定了此属性,则材质将与纹理关联。从模型元素引用该材质将导致该纹理应用于该元素。请注意,此属性的值是纹理资产的名称,而不是纹理文件名。纹理不能在材质定义中加载;相反,它们必须通过 texture 元素显式加载,然后在此处引用。此处引用的纹理用于指定 RGB 值。对于高级渲染(例如,基于物理的渲染),需要指定更多纹理类型(例如,粗糙度、金属度)。在这种情况下,应省略此 texture 属性,并应使用 layer 子元素指定纹理类型。然而请注意,内置渲染器不支持 PBR 属性,因此这些高级渲染功能仅在使用外部渲染器时可用。

texrepeat: real(2), “1 1”

此属性适用于类型为“2d”的纹理。它指定纹理图像重复的次数,相对于对象大小或空间单位,由下一个属性确定。

texuniform: [false, true], “false”

对于立方体纹理,此属性控制立方体映射的应用方式。默认值“false”表示直接应用立方体映射,使用对象的实际大小。值“true”表示在将纹理缩放至实际大小之前,将其映射到单位对象上(渲染器创建的几何图元是单位对象,然后进行缩放)。在某些情况下,这会导致更均匀的纹理外观,但一般来说,哪种设置效果更好取决于纹理和对象。对于 2d 纹理,此属性与上面的 texrepeat 属性交互。设 texrepeat 为 N。默认值“false”表示 2d 纹理在对象(面向 Z 轴的一侧)上重复 N 次。值“true”表示 2d 纹理在一个空间单位上重复 N 次,无论对象大小如何。

emission: real, “0”

OpenGL 中的发射(emission)采用 RGBA 格式,但我们只提供一个标量设置。OpenGL 发射向量的 RGB 分量是材质颜色的 RGB 分量乘以此处指定的值。Alpha 分量为 1。

specular: real, “0.5”

OpenGL 中的镜面反射(specularity)采用 RGBA 格式,但我们只提供一个标量设置。OpenGL 镜面反射向量的 RGB 分量都等于此处指定的值。Alpha 分量为 1。此值应在 [0 1] 范围内。

shininess: real, “0.5”

OpenGL 中的光泽度(shininess)是一个介于 0 和 128 之间的数字。此处给定的值在传递给 OpenGL 之前乘以 128,因此它应在 [0 1] 范围内。值越大,镜面高光越紧凑(从而减少高光的总量,但使其在视觉上更突出)。这与镜面反射设置交互;详细信息请参阅 OpenGL 文档。

reflectance: real, “0”

此属性应在 [0 1] 范围内。如果该值大于 0,并且该材质应用于平面或盒状几何体,渲染器将模拟反射。值越大,反射越强。对于盒子,只有局部 +Z 轴方向上的面是反射的。正确模拟反射需要光线追踪,这(目前)无法实时完成。我们转而使用模板缓冲区和合适的投影。模型中只有第一个反射几何体会以此方式渲染。除了每个投射阴影的光源增加的额外渲染通道外,这还会增加一个遍历所有几何体的额外渲染通道。

metallic: real, “0”

此属性对应于应用于整个材质的统一金属度系数。此属性在 MuJoCo 的原生渲染器中无效,但在使用外部渲染器渲染场景时可能有用。

roughness: real, “1”

此属性对应于应用于整个材质的统一粗糙度系数。此属性在 MuJoCo 的原生渲染器中无效,但在使用外部渲染器渲染场景时可能有用。

rgba: real(4), “1 1 1 1”

材质的颜色和透明度。所有分量都应在 [0 1] 范围内。请注意,纹理以 GL_MODULATE 模式应用,这意味着纹理颜色和此处指定的颜色将按分量相乘。因此,“1 1 1 1”的默认值会使纹理保持不变。当材质应用于定义了其自身本地 rgba 属性的模型元素时,本地定义具有优先权。请注意,这个“本地”定义实际上可能来自默认类。剩余的材质属性始终适用。

material/layer (?)#

如果需要多个纹理来指定材质的外观,则不能使用 texture 属性,而必须使用 layer 子元素。同时指定 texture 属性和 layer 子元素是一个错误。

texture: string, 必需

纹理的名称,类似于 texture 属性。

role: string, 必需

纹理的角色。有效值、期望的通道数和角色语义如下:

value

通道数

描述

rgb

3

基础色 / 反照率 [红, 绿, 蓝]

normal

3

bump map (表面法线)

occlusion

1

环境光遮蔽

roughness

1

roughness

metallic

1

metallicity

opacity

1

不透明度 (Alpha 通道)

emissive

4

RGB 光照发射强度,曝光权重在第 4 通道

orm

3

打包的 3 通道 [遮蔽, 粗糙度, 金属度]

rgba

4

packed 4 channel [红, 绿, 蓝, Alpha]

asset/model (*)#

此元素指定了可在当前模型中用于 attachment 的其他 MJCF 模型。

name: string, 可选

子模型的名称,用于在 attach 中引用。如果未指定,则使用 模型名称

file: string, required

将从中加载子模型的文件。请注意,子模型必须是有效的 MJCF 模型。

content_type string, 可选

将要加载到模型中的文件类型。目前仅支持 text/xml。

(world)body (R)#

此元素用于通过嵌套构造 运动学树worldbody 元素用于顶层刚体,而 body 元素用于所有其他刚体。顶层刚体是一种受限类型的刚体:它不能有子元素 inertialjoint,也不能有任何属性。它对应于世界坐标系的原点,其余运动学树都在其中定义。其刚体名称自动定义为“world”。

name: string, 可选

刚体的名称。

childclass: string, 可选

如果存在此属性,则所有接受默认类的后代元素都将使用此处指定的类,除非它们指定了自己的类,或者在嵌套的刚体和帧链中遇到另一个具有 childclass 属性的刚体或帧。回顾 默认设置

mocap: [false, true], “false”

如果此属性为“true”,则该刚体被标记为 mocap 刚体。这只允许用于作为世界刚体的子元素且没有关节的刚体。从动力学的角度来看,此类刚体是固定的,但前向运动学会根据每个时间步的 mjData.mocap_{pos,quat} 字段设置它们的位置和方向。编译器会调整这些数组的大小,以匹配模型中的 mocap 刚体数量。此机制可用于将运动捕捉数据流式传输到仿真中。Mocap 刚体也可以在交互式可视化工具中通过鼠标扰动移动,即使在动态仿真模式下也是如此。这对于创建具有可调整位置和方向的道具很有用。

pos: real(3), 可选

刚体坐标系在父坐标系中的三维位置。如果未定义,则默认为 (0,0,0)。

quat, axisangle, xyaxes, zaxis, euler

参见 坐标系方向

gravcomp: real, “0”

重力补偿力,以刚体重量的比例指定。此属性创建一个向上作用于刚体质心的力,抵消重力。例如,值 1 会创建一个等于刚体重量的向上力,并完全补偿重力。大于 1 的值将产生净向上力或浮力效应。

user: real(nbody_user), “0 0 …”

参见 用户参数

body/inertial (?)#

此元素指定刚体的质量和惯性属性。如果给定的刚体中未包含此元素,则从附着到该刚体的几何体推断惯性属性。当编译后的 MJCF 模型被保存时,XML 写入器会使用此元素明确保存惯性属性,即使它们是从几何体推断出来的。惯性坐标系是这样的:其中心与刚体的质心重合,其坐标轴与刚体的主惯性轴重合。因此,在该坐标系中,惯性矩阵是对角的。

pos: real(3), 必需

惯性坐标系的位置。即使惯性属性可以从几何体推断出来,此属性也是必需的。这是因为 inertial 元素本身的存在会禁用自动推断机制。

quat, axisangle, xyaxes, zaxis, euler

惯性坐标系的方向。参见 坐标系方向

mass: real, 必需

刚体的质量。不允许负值。MuJoCo 要求广义坐标中的惯性矩阵是正定的,即使某些刚体质量为零,有时也可以实现这一点。然而一般来说,没有理由使用无质量刚体。在其他引擎中,此类刚体常用于绕过关节不能组合的限制,或用于附着传感器和相机。在 MuJoCo 中,基本关节类型可以组合,并且我们有站点(sites),这是一种更有效的附着机制。

diaginertia: real(3), 可选

对角惯性矩阵,表示刚体相对于惯性坐标系的惯性。如果省略此属性,则下一个属性成为必需。

fullinertia: real(6), 可选

完整惯性矩阵 M。由于 M 是 3×3 的对称矩阵,仅使用以下顺序的 6 个数字来指定:M(1,1), M(2,2), M(3,3), M(1,2), M(1,3), M(2,3)。编译器计算 M 的特征值分解,并相应地设置坐标系方向和对角惯性。如果遇到非正特征值(即,如果 M 不是正定的),则会生成编译错误。

body/joint (*)#

此元素创建一个关节。如 运动学树 中所述,关节在其定义的刚体与刚体的父刚体之间创建运动自由度。如果在同一刚体中定义了多个关节,则相应的空间变换(刚体坐标系相对于父坐标系)会按顺序应用。如果未定义关节,则刚体与其父刚体焊接在一起。不能在世界刚体中定义关节。在运行时,模型中定义的所有关节的位置和方向存储在向量 mjData.qpos 中,顺序与它们在运动学树中出现的顺序相同。线性速度和角速度存储在向量 mjData.qvel 中。当使用 free(自由)或 ball(球)关节时,这两个向量具有不同的维度,因为这些关节将旋转表示为单位四元数。

name: string, 可选

关节的名称。

class: string, 可选

用于设置未指定属性的默认类。

type: [free, ball, slide, hinge], “hinge”

关节的类型。关键字具有以下含义:free(自由)类型创建一个具有三个平移自由度后跟三个旋转自由度的自由“关节”。换句话说,它使刚体浮动。旋转表示为单位四元数。此关节类型仅允许在作为世界刚体的子元素且其中没有定义其他关节的刚体中使用。与其余关节类型不同,自由关节在刚体坐标系内没有位置。相反,假定关节位置与刚体坐标系的中心重合。因此,在运行时,自由关节的位置和方向数据对应于刚体坐标系的全局位置和方向。自由关节不能有范围限制。

ball(球)类型创建一个具有三个旋转自由度的球关节。旋转表示为单位四元数。四元数 (1,0,0,0) 对应于模型定义的初始配置。任何其他四元数都被解释为相对于此初始配置的三维旋转。旋转围绕 pos 属性定义的点。如果一个刚体有一个球关节,它不能有其他旋转关节(球或铰链)。允许在同一刚体中组合球关节和 slide(滑动)关节。

slide(滑动)类型创建一个具有一个平移自由度的滑动或棱柱形关节。此类关节由一个位置和一个滑动方向定义。出于仿真目的只需要方向;关节位置用于渲染目的。

hinge(铰链)类型创建一个具有一个旋转自由度的铰链关节。旋转发生在一个指定的位置,围绕一个指定的轴进行。这是最常见的关节类型,因此是默认类型。大多数模型只包含铰链关节和自由关节。

group: int, “0”

关节所属的整数组。此属性可用于自定义标签。它也被可视化工具用于启用和禁用整个关节组的渲染。

pos: real(3), “0 0 0”

关节的位置,在定义关节的刚体坐标系中指定。对于自由关节,此属性被忽略。

axis: real(3), “0 0 1”

此属性指定铰链关节的旋转轴和滑动关节的平移方向。对于自由关节和球关节,此属性被忽略。只要此处指定的向量长度大于 10E-14,就会自动归一化为单位长度;否则会生成编译错误。

springdamper: real(2), “0 0”

当两个数字都为正时,编译器将覆盖下方属性指定的任何刚度和阻尼值,而是自动设置它们,以便此关节产生的质量-弹簧-阻尼器具有期望的时间常数(第一个值)和阻尼比(第二个值)。这是通过考虑模型参考配置中的关节惯性来完成的。请注意,格式与约束求解器的 solref 参数相同。

solreflimit, solimplimit

用于模拟关节限制的约束求解器参数。参见 求解器参数

solreffriction, solimpfriction

用于模拟干摩擦的约束求解器参数。参见 求解器参数

stiffness: real, “0”

关节刚度。如果此值为正,将创建一个弹簧,其平衡位置由下面的 springref 给出。弹簧力与其他被动力一起计算。

range: real(2), “0 0”

关节范围限制。除自由关节外,所有关节类型都可以施加限制。对于铰链关节和球关节,范围以度或弧度指定,具体取决于 compiler 的 angle 属性。对于球关节,无论旋转轴如何,限制都施加在旋转角度上(相对于参考配置)。球关节只使用第二个 range 参数;第一个 range 参数应设置为 0。有关更多信息,请参见 Computation 章中的 限制 部分。
如果 compiler 中的 autolimits 为“false”,则设置此属性而不指定 limited 是一个错误。

limited: [false, true, auto], “auto”

此属性指定关节是否有范围限制。它与 range 属性交互。如果此属性为“false”,关节范围限制将被禁用。如果此属性为“true”,关节范围限制将被启用。如果此属性为“auto”,并且在 compiler 中设置了 autolimits,则如果在 range 定义了范围,关节范围限制将被启用。

actuatorfrcrange: real(2), “0 0”

用于钳制作用在此关节上的总执行器力的范围。详细信息请参见 力限制。仅适用于标量关节(铰链和滑块),对于球关节和自由关节则忽略。
编译器要求第一个值小于第二个值。
如果 compiler-autolimits 为“false”,则设置此属性而不指定 actuatorfrclimited 是一个错误。

actuatorfrclimited: [false, true, auto], “auto”

此属性指定是否应钳制作用在关节上的执行器力。详细信息请参见 力限制。仅适用于标量关节(铰链和滑块),对于球关节和自由关节则忽略。
此属性与 actuatorfrcrange 属性交互。如果此属性为“false”,则禁用执行器力钳制。如果为“true”,则启用执行器力钳制。如果此属性为“auto”,并且在 compiler 中设置了 autolimits,则如果在 actuatorfrcrange 定义了范围,将启用执行器力钳制。

actuatorgravcomp: [false, true], “false”

如果此标志启用,应用于此关节的重力补偿将添加到执行器力(mjData.qfrc_actuator)中,而不是被动力(mjData.qfrc_passive)中。从概念上讲,这意味着重力补偿是控制系统的结果,而不是自然浮力。实际上,当使用关节级别的执行器力钳制时,启用此标志很有用。在这种情况下,作用在关节上的总驱动力(包括重力补偿)保证不超过指定的限制。有关此类力限制的更多详细信息,请参见 力限制actuatorfrcrange

margin: real, “0”

限制激活的距离阈值。回顾 约束求解器 通常会在约束激活时立即生成力,即使 margin 参数使其在一定距离处发生。此属性与 solreflimit 和 solimplimit 一起可用于模拟软关节限制。

ref: real, “0”

关节的参考位置或角度。此属性仅用于滑动关节和铰链关节。它定义了与初始模型配置相对应的关节值。关节在运行时应用的空间变换量等于存储在 mjData.qpos 中的当前关节值减去存储在 mjModel.qpos0 中的此参考值。这些向量的含义在 Overview 章的 独立 部分中进行了讨论。

springref: real, “0”

关节弹簧(如果存在)达到平衡的关节位置或角度。与上面使用 ref 属性指定并存储在向量 mjModel.qpos0 中的所有关节参考值类似,使用此属性指定的所有弹簧参考值都存储在向量 mjModel.qpos_spring 中。与 mjModel.qpos_spring 相对应的模型配置也用于计算所有肌腱的弹簧参考长度,存储在 mjModel.tendon_lengthspring 中。这是因为 tendons(肌腱)也可以有弹簧。

_images/armature.gif _images/armature_dark.gif
armature: real, “0”

与关节运动相关的额外惯性,非由刚体质量引起。这种额外惯性通常是由于转子(也称为 armature)通过齿轮传动比关节本身旋转得更快而引起的。在插图中,我们比较了(左)一个带有 armature 刚体(紫色框)的两自由度系统,使用 关节相等性 约束以 \(3\) 的齿轮比耦合到摆上,以及(右)一个带有等效 armature 的简单一自由度摆。由于齿轮比出现两次,同时影响力和长度,这种效应被称为“反射惯性”,等效值是旋转刚体的惯性乘以齿轮比的平方,在此例中为 \(9=3^2\)。该值适用于此关节创建的所有自由度。

除了提高带有齿轮传动的关节的真实感外,正值的 armature 即使对于小值也能显著提高仿真稳定性,是遇到稳定性问题时推荐的一种可能解决方案。

damping: real, “0”

应用于此关节创建的所有自由度的阻尼。与由约束求解器计算的摩擦损失不同,阻尼只是一个与速度呈线性关系的力。它包含在被动力中。尽管如此简单,较大的阻尼值会使数值积分器不稳定,这就是我们的欧拉积分器隐式处理阻尼的原因。参见 Computation 章的 积分

frictionloss: real, “0”

干摩擦引起的摩擦损失。对于此关节创建的所有自由度,此值相同。从语义上讲,摩擦损失对于自由关节没有意义,但编译器允许这样做。要启用摩擦损失,请将此属性设置为正值。

user: real(njnt_user), “0 0 …”

参见 用户参数

body/freejoint (*)#

此元素创建一个自由关节,其唯一属性是 namegroupfreejoint 元素是以下内容的 XML 快捷方式:

<joint type="free" stiffness="0" damping="0" frictionloss="0" armature="0"/>

虽然此关节显然可以使用 joint 元素创建,但默认的关节设置可能会影响它。这通常是不希望的,因为物理上的自由刚体没有非零的刚度、阻尼、摩擦或 armature。为了避免这种复杂性,引入了 freejoint 元素,确保不会继承关节的默认设置。如果保存 XML 模型,它将显示为类型为 free 的常规关节。

name: string, 可选

关节的名称。

group: int, “0”

关节所属的整数组。此属性可用于自定义标签。它也被可视化工具用于启用和禁用整个关节组的渲染。

align: [false, true, auto], “auto”

当设置为 true 时,刚体坐标系和自由关节将自动与惯性坐标系对齐。当设置为 false 时,不会发生对齐。当设置为 auto 时,将遵循编译器的 alignfree 全局属性。

惯性坐标系对齐是一项优化,仅适用于带有自由关节且没有子刚体的刚体(“简单自由刚体”)。对齐将 6x6 惯性矩阵对角化并最小化偏置力,从而带来更快、更稳定的仿真。虽然这种行为是一个严格的改进,但它改变了自由关节的语义,使得旧版本中保存的 qposqvel 值(例如,在 关键帧 中)无效。

请注意,align 属性永远不会保存到 XML 中。相反,简单自由刚体及其子刚体的姿态将被修改,以使刚体坐标系和惯性坐标系对齐。

body/geom (*)#

此元素创建一个几何体(geom),并将其刚性地附着在其定义的刚体上。同一个刚体可以附着多个几何体。在运行时,它们决定了刚体的外观和碰撞属性。在编译时,它们也可以决定刚体的惯性属性,具体取决于 inertial 元素是否存在以及 compiler 的 inertiafromgeom 属性的设置。这是通过汇总附着到刚体上、且其 geom 组在 compiler 的 inertiagrouprange 属性指定范围内的所有几何体的质量和惯性来完成的。几何体的质量和惯性是使用几何体形状、指定的密度或隐含密度的几何体质量,以及均匀密度的假设来计算的。

几何体对于物理仿真不是严格必需的。可以创建和仿真一个只有刚体和关节的模型。这样的模型甚至可以可视化,使用等效惯性框来表示刚体。从这样的仿真中只会缺失接触力。我们不建议使用此类模型,但了解这是可能的有助于阐明刚体和几何体在 MuJoCo 中的作用。

name: string, 可选

几何体的名称。

class: string, 可选

用于设置未指定属性的默认类。

type: [plane, hfield, sphere, capsule, ellipsoid, cylinder, box, mesh, sdf], “sphere”

几何体形状的类型。关键字具有以下含义:plane(平面)类型定义了一个用于碰撞检测目的的无限平面。它只能附着到世界刚体或世界的静态子刚体上。平面通过 pos 属性指定的点。它垂直于几何体局部坐标系的 Z 轴。+Z 方向对应于空空间。因此,位置和方向默认值 (0,0,0) 和 (1,0,0,0) 将在 Z=0 高度创建一个地面平面,+Z 是世界中的垂直方向(这是 MuJoCo 的约定)。由于平面是无限的,它可以使用平面中的任何其他点来定义。然而,指定的位置对于渲染有额外的含义。如果前两个 size 参数中的任何一个为正,则平面将被渲染为有限大小的矩形(在正尺寸方向上)。此矩形以指定位置为中心。需要三个 size 参数。前两个指定矩形沿 X 轴和 Y 轴的半尺寸。第三个 size 参数不寻常:它指定用于渲染目的的平面网格细分之间的间距。在线框渲染模式下会显示细分,但通常不应使用它们在地面平面上绘制网格(应使用纹理实现此目的)。相反,它们的作用是改善光照和阴影,类似于用于渲染盒子的细分。从背面观察平面时,它们会自动变为半透明。平面和盒子面向 +Z 轴的面是唯一可以显示反射的表面,如果应用于几何体的 material 具有正反射率。要渲染无限平面,请将前两个 size 参数设置为零。

hfield(高度场)类型定义一个高度场几何体。该几何体必须使用下方的 hfield 属性引用所需的高度场资产。几何体的位置和方向设置高度场的位置和方向。几何体的大小被忽略,而使用高度场资产的大小参数。参见 hfield 元素的描述。与平面类似,高度场几何体只能附着到世界刚体或世界的静态子刚体上。

sphere(球体)类型定义一个球体。此类型和接下来的四种类型对应于内置几何图元。出于碰撞检测目的,这些图元被视为解析曲面,在许多情况下依赖于自定义的成对碰撞例程。仅包含平面、球体、胶囊体和盒子的模型在碰撞检测方面效率最高。其他几何体类型则调用通用凸体碰撞器。球体以几何体的位置为中心。只使用一个 size 参数,指定球体的半径。几何图元的渲染使用自动生成的网格进行,其密度可通过 quality 进行调整。球体网格沿纬线和经线进行三角剖分,Z 轴穿过北极和南极。这在线框模式下可用于可视化坐标系方向。

capsule(胶囊体)类型定义一个胶囊体,它是用两个半球体封闭的圆柱体。它沿几何体坐标系的 Z 轴定向。当以常规方式指定几何体坐标系时,需要两个 size 参数:胶囊体的半径后跟圆柱体部分的半高。然而,胶囊体和圆柱体也可以被视为连接器,允许使用下面的 fromto 属性进行替代指定。在这种情况下,只需要一个 size 参数,即胶囊体的半径。

ellipsoid(椭球体)类型定义一个椭球体。它是在局部坐标系的 X、Y 和 Z 轴上分别缩放的球体。它需要三个 size 参数,分别对应三个半径。请注意,尽管椭球体是光滑的,但其碰撞是通过通用凸体碰撞器处理的。唯一的例外是平面-椭球体碰撞,它是解析计算的。

cylinder(圆柱体)类型定义一个圆柱体。它需要两个 size 参数:圆柱体的半径和半高。圆柱体沿几何体坐标系的 Z 轴定向。它也可以使用下面的 fromto 属性进行替代指定。

box(盒子)类型定义一个盒子。需要三个 size 参数,分别对应盒子沿几何体坐标系的 X、Y 和 Z 轴的半尺寸。请注意,盒子-盒子碰撞是唯一可以生成大量接触点(最多 8 个,取决于配置)的成对碰撞类型。接触生成本身很快,但这会减慢约束求解器的速度。作为替代方案,我们在 flag 中提供了 boxconvex 属性,它会导致使用通用凸体碰撞器,从而每对几何体最多产生一个接触点。

mesh(网格)类型定义一个网格。该几何体必须使用 mesh 属性引用所需的网格资产。请注意,网格资产也可以从其他几何体类型引用,导致原始形状被拟合;参见下方。大小由网格资产决定,几何体 size 参数被忽略。与所有其他几何体不同,编译后网格几何体的位置和方向不等于此处相应属性的设置。相反,它们会根据使网格资产在其自身坐标系中居中和对齐所需的平移和旋转进行偏移。回顾 mesh 元素中居中和对齐的讨论。

sdf(有符号距离场)类型定义一个有符号距离场(SDF,也称为有符号距离函数)。为了可视化 SDF,必须使用 mesh/plugin 属性指定自定义网格。有关带有 SDF 几何体的示例模型,请参阅 model/plugin/sdf/ 目录。有关 SDF 插件的更多详细信息,请参阅 扩展章

contype: int, “1”

此属性和下一个属性指定用于动态生成的接触对的接触过滤的 32 位整数位掩码。参见 Computation 章的 碰撞检测。如果一个几何体的 contype 与另一个几何体的 conaffinity 兼容,反之亦然,则两个几何体可以发生碰撞。兼容意味着两个位掩码都有一个共同的位设置为 1。

conaffinity: int, “1”

用于接触过滤的位掩码;参见上面的 contype。

condim: int, “3”

动态生成的接触对的接触空间的维度设置为两个参与几何体的 condim 值的最大值。参见 Computation 章的 接触。允许的值及其含义是:

condim

描述

1

无摩擦接触。

3

常规摩擦接触,抵抗切平面上的滑动。

4

摩擦接触,抵抗切平面上的滑动和围绕接触法线的旋转。这对于模拟软接触(独立于接触穿透)很有用。

6

摩擦接触,抵抗切平面上的滑动,围绕接触法线的旋转以及围绕切平面两个轴的旋转。后者的摩擦效应对于防止物体无限滚动很有用。

group: int, “0”

此属性指定几何体所属的整数组。对物理效果的唯一影响是在编译时,当刚体质量和惯性根据其组别选择的几何体进行推断时;参见 compiler 的 inertiagrouprange 属性。在运行时,此属性由可视化工具用于启用和禁用整个几何体组的渲染。默认情况下,组 0、1 和 2 是可见的,而所有其他组都是不可见的。group 属性也可以用作自定义计算的标签。

priority: int, “0”

几何体优先级决定了两个碰撞几何体的属性如何组合形成接触的属性。这与 solmix 属性交互。参见 接触参数

size: real(3), “0 0 0”

几何体尺寸参数。所需参数的数量及其含义取决于 type 属性下记录的几何体类型。此处仅提供摘要。所有必需的尺寸参数必须为正值;内部默认值对应于无效设置。请注意,当非网格几何体类型引用网格时,该类型的几何图元将拟合到网格上。在这种情况下,尺寸从网格获取,几何体 size 参数被忽略。因此,下表中必需尺寸参数的数量和描述仅适用于不引用网格的几何体。

类型

数量

描述

plane(平面)

3

X 半尺寸;Y 半尺寸;用于渲染的方形网格线之间的间距。如果 X 或 Y 半尺寸为 0,则平面在该尺寸为 0 的维度上渲染为无限大。

hfield

0

几何体尺寸被忽略,转而使用高度场尺寸。

sphere(球体)

1

球体的半径。

capsule(胶囊体)

1 或 2

胶囊体的半径;不使用 fromto 指定时的圆柱体部分半长。

ellipsoid(椭球体)

3

X 半径;Y 半径;Z 半径。

cylinder(圆柱体)

1 或 2

圆柱体的半径;不使用 fromto 指定时的圆柱体半长。

box(盒子)

3

X 半尺寸;Y 半尺寸;Z 半尺寸。

mesh

0

几何体尺寸被忽略,转而使用网格尺寸。

material: string, 可选

如果指定,此属性将材质应用于几何体。材质决定了几何体的视觉属性。唯一的例外是颜色:如果下面的 rgba 属性与内部默认值不同,它将优先,而其余材质属性仍然适用。请注意,如果同一个材质被多个几何体(以及站点和肌腱)引用,并且用户在运行时更改其某些属性,这些更改将立即对所有引用该材质的模型元素生效。这是因为编译器将材质及其属性作为 mjModel 中的一个独立元素保存,而使用此材质的元素只保留对其的引用。

rgba: real(4), “0.5 0.5 0.5 1”

除了创建材质资产并引用它们之外,还可以使用此属性仅设置颜色和透明度。这不如材质机制灵活,但更方便,并且通常足够用。如果此属性的值与内部默认值不同,它将优先于材质。

friction: real(3), “1 0.005 0.0001”

动态生成的接触对的接触摩擦参数。第一个数字是滑动摩擦,作用于切平面的两个轴方向。第二个数字是扭转摩擦,作用于接触法线周围。第三个数字是滚动摩擦,作用于切平面的两个轴周围。接触对的摩擦参数根据 solmix 和 priority 属性进行组合,如 接触参数 中所述。有关此属性语义的描述,请参见通用的 接触 部分。

mass: real, 可选

如果指定了此属性,则下面的 density 属性将被忽略,并使用几何体形状和均匀密度的假设,根据给定的质量计算几何体密度。然后使用计算出的密度来获取几何体惯性。回顾一下,几何体质量和惯性仅在编译期间使用,以在必要时推断刚体质量和惯性。在运行时,只有刚体惯性属性影响仿真;几何体质量和惯性不保存在 mjModel 中。

density: real, “1000”

用于计算几何体质量和惯性的材质密度。计算基于几何体形状和均匀密度的假设。内部默认值 1000 是国际单位制(SI units)下水的密度。仅当上面的 mass 属性未指定时才使用此属性。如果 shellinertia 为“false”(默认值),density 的语义为质量/体积;如果为“true”,则其语义为质量/面积。

shellinertia [false, true], “false”

如果为 true,则假定所有质量都集中在表面上计算几何体的惯性。在这种情况下,density 被解释为表面密度而不是体积密度。此属性仅适用于基本几何体,对于网格则忽略。网格的表面惯性可以通过将 asset/mesh/inertia 属性设置为 “shell” 来指定。

solmix: real, “1”

此属性指定用于接触参数平均的权重,并与 priority 属性交互。参见 接触参数

solref, solimp

用于接触仿真的约束求解器参数。参见 求解器参数

margin: real, “0”

检测到接触并将其包含在全局数组 mjData.contact 中的距离阈值。然而这并不意味着会生成接触力。只有当两个几何体表面之间的距离小于 margin-gap 时,接触才被视为活动。回顾一下,约束阻抗可以是距离的函数,如 求解器参数 中所解释。应用此函数的量是两个几何体之间的距离减去 margin 加上 gap。

gap: real, “0”

此属性用于启用非活动接触的生成,即被约束求解器忽略但出于自定义计算目的包含在 mjData.contact 中的接触。当此值为正时,几何体距离介于 margin 和 margin-gap 之间的情况对应于此类非活动接触。

fromto: real(6), 可选
_images/fromto.png

此属性只能用于胶囊体、盒子、圆柱体和椭球体几何体。它提供了几何体长度以及坐标系位置和方向的替代指定方式。这六个数字是一个点的三维坐标后跟另一个点的三维坐标。几何体的伸长部分连接这两个点,几何体坐标系的 +Z 轴从第一个点指向第二个点,而在垂直方向上,几何体尺寸都等于 size 属性的第一个值。坐标系方向使用与 坐标系方向 中描述的 zaxis 属性相同的过程获得。坐标系位置在两端点之间。如果指定了此属性,则其余位置和方向相关的属性将被忽略。右侧图像展示了在四个支持的几何体上使用 fromto 的情况,使用了相同的 Z 值。模型在此。请注意,capsule 的 fromto 语义是独一无二的:两个端点指定了半径定义胶囊体表面的线段。

pos: real(3), “0 0 0”

几何体的位置,在定义几何体的刚体坐标系中指定。

quat, axisangle, xyaxes, zaxis, euler

几何体坐标系的方向。参见 坐标系方向

hfield: string, 可选

仅当几何体类型为“hfield”时才必须指定此属性。它引用了将在几何体坐标系的位置和方向处实例化的高度场资产。

mesh: string, 可选

如果几何体类型为“mesh”,则此属性为必需。它引用将要实例化的网格资产。如果几何体类型对应于几何图元,即“sphere”、“capsule”、“cylinder”、“ellipsoid”、“box”中的一种,也可以指定此属性。在这种情况下,图元将自动拟合到此处引用的网格资产。拟合过程使用网格的等效惯性框或轴对齐边界框,具体取决于 compiler 的 fitaabb 属性。拟合后的几何体尺寸通常是期望的,但如果不是,可以使用下面的 fitscale 属性进一步调整。在编译后的 mjModel 中,几何体表示为指定图元类型的常规几何体,并且没有引用用于拟合的网格。

fitscale: real, “1”

此属性仅在将基本几何体类型拟合到网格资产时使用。此处指定的比例是相对于自动拟合过程输出的。默认值 1 使结果保持不变,值为 2 则使拟合几何体的所有尺寸变大两倍。

fluidshape: [none, ellipsoid], “none”

“ellipsoid”基于几何体形状的椭球体近似激活几何体级别的流体相互作用模型。激活时,基于 刚体惯性尺寸 的模型将在定义该几何体的刚体中禁用。详细信息请参阅 基于椭球体 的流体相互作用模型部分。

fluidcoef: real(5), “0.5 0.25 1.5 1.0 1.0”

流体相互作用模型的无量纲系数如下。详细信息请参阅 基于椭球体 的流体相互作用模型部分。

索引

描述

符号

默认值

0

钝体阻力系数

0.5

0.5

1

细长体阻力系数

0.25

0.25

2

角阻力系数

1.5

1.5

3

库塔升力系数

1.0

1.0

4

马格努斯升力系数

1.0

1.0

user: real(nuser_geom), “0 0 …”

参见 用户参数

geom/plugin (?)#

将此几何体与 引擎插件 相关联。plugininstance 之一是必需的。

plugin: string, 可选

插件标识符,用于隐式插件实例化。

instance: string, 可选

实例名称,用于显式插件实例化。

body/site (*)#

此元素创建一个站点(site),它是一种简化和受限的几何体类型。此处提供了一小部分几何体属性;详细文档请参见 geom 元素。语义上,站点代表相对于刚体坐标系的感兴趣位置。站点不参与碰撞和刚体质量与惯性的计算。可用于渲染站点的几何形状仅限于可用几何体类型的一个子集。然而,站点可以用在一些不允许使用几何体的地方:安装传感器,指定空间肌腱的中间点,构建执行器的滑块曲柄传动。

name: string, 可选

站点的名称。

class: string, 可选

用于设置未指定属性的默认类。

type: [sphere, capsule, ellipsoid, cylinder, box], “sphere”

几何形状的类型。此类型用于渲染,也决定了 触摸传感器 的活动传感器区域。

group: int, “0”

站点所属的整数组。此属性可用于自定义标签。它也被可视化工具用于启用和禁用整个站点组的渲染。

material: string, 可选

用于指定站点视觉属性的材质。

rgba: real(4), “0.5 0.5 0.5 1”

颜色和透明度。如果此值与内部默认值不同,它将覆盖相应的材质属性。

size: real(3), “0.005 0.005 0.005”

代表站点的几何形状的尺寸。

fromto: real(6), 可选

此属性只能用于胶囊体、圆柱体、椭球体和盒子站点。它提供了站点长度以及坐标系位置和方向的替代指定方式。这六个数字是一个点的三维坐标后跟另一个点的三维坐标。站点的伸长部分连接这两个点,站点坐标系的 +Z 轴从第一个点指向第二个点。坐标系方向使用与 坐标系方向 中描述的 zaxis 属性相同的过程获得。坐标系位置在两点之间。如果指定了此属性,则其余位置和方向相关的属性将被忽略。

pos: real(3), “0 0 0”

站点坐标系的位置。

quat, axisangle, xyaxes, zaxis, euler

站点坐标系的方向。参见 坐标系方向

user: real(nuser_site), “0 0 …”

参见 用户参数

body/camera (*)#

此元素创建一个相机,它随其定义的刚体移动。要创建固定相机,请在世界刚体中定义它。此处创建的相机是默认自由相机的补充,默认自由相机始终定义,并通过 visual 元素进行调整。在内部,MuJoCo 使用灵活的相机模型,其中视点和投影表面可以独立调整,以获得虚拟环境所需的斜投影。然而,通过 MJCF 无法访问此功能。相反,使用此元素创建的相机(以及自由相机)具有始终位于投影表面前方中心的视点。视点与相机坐标系的中心重合。相机沿其坐标系的 -Z 轴方向看。+X 轴指向右侧,+Y 轴指向上方。因此,坐标系位置和方向是此处需要进行的关键调整。

name: string, 可选

相机的名称。

class: string, 可选

用于设置未指定属性的默认类。

mode: [fixed, track, trackcom, targetbody, targetbodycom], “fixed”

此属性指定在正向运动学中如何计算相机在世界坐标系中的位置和方向(进而决定相机看到的内容)。“fixed”表示下面指定的位置和方向相对于定义相机的刚体是固定的。“track”表示相机位置在世界坐标系中与刚体保持恒定偏移,而相机方向在世界坐标系中保持不变。这些常量是通过在 qpos0 中应用正向运动学并将相机视为固定来确定的。跟踪可用于例如将相机放置在刚体上方,向下指向以看到刚体,并使其始终保持在刚体上方,无论刚体如何平移和旋转。“trackcom”类似于“track”,但恒定空间偏移是相对于定义相机所在的刚体开始的运动学子树的质心定义的。这可用于保持整个机构在视野中。请注意,世界刚体的子树质心是整个模型的质心。因此,如果相机在世界刚体中以“trackcom”模式定义,它将跟踪整个模型。“targetbody”表示相机位置固定在刚体坐标系中,同时相机方向进行调整,使其始终指向目标刚体(目标刚体由下面的 target 属性指定)。这可用于例如模拟固定移动物体的眼睛;物体将是目标,而相机/眼睛将在对应于头部的刚体中定义。“targetbodycom”与“targetbody”相同,但相机朝向目标刚体开始的子树的质心。

target: string, 可选

当相机模式为“targetbody”或“targetbodycom”时,此属性变为必需。它指定相机应该以哪个刚体为目标。在所有其他模式下,此属性被忽略。

orthographic: [false, true], “false”

相机使用透视投影(默认)还是正交投影。设置此属性会改变 fovy 属性的语义,参见下方。

fovy: real, “45”

相机的垂直视野(field-of-view)。如果相机使用透视投影,视野以度为单位表示,无论全局 compiler/angle 设置如何。如果相机使用正交投影,视野以长度单位表示;请注意,在这种情况下,默认值 45 对于大多数场景来说太大了,可能应该减小。在任何一种情况下,水平视野都会根据窗口大小和垂直视野自动计算。

resolution: int(2), “1 1”

相机分辨率,以像素为单位 [宽度 高度]。请注意,这些值不用于渲染,因为那些尺寸由渲染上下文的大小决定。此属性作为创建上下文时保存所需分辨率的便捷位置。

focal: real(2), “0 0”

相机在长度单位下的焦距。它与 fovy 互斥。详情请参阅 Cameras

focalpixel: int(2), “0 0”

相机在像素单位下的焦距。如果同时指定了 focal: 和 focalpixel:,则前者将被忽略。

principal: real(2), “0 0”

相机在长度单位下的主点。它与 fovy 互斥。

principalpixel: real(2), “0 0”

相机在像素单位下的主点。如果同时指定了 principal: 和 principalpixel:,则前者将被忽略。

sensorsize: real(2), “0 0”

相机传感器在长度单位下的尺寸。它与 fovy 互斥。如果指定,则必须指定 resolutionfocal

ipd: real, “0.068”

瞳距。此属性仅在立体渲染期间生效。它指定了左右视点之间的距离。每个视点沿相机坐标系的 X 轴方向移动指定距离的 +/- 一半。

pos: real(3), “0 0 0”

相机坐标系的位置。

quat, axisangle, xyaxes, zaxis, euler

相机坐标系的方向。详情请参阅 Frame orientations。请注意,特别是对于相机,xyaxes 属性在语义上很方便,因为 X 轴和 Y 轴分别对应于像素空间中的“右”方向和“上”方向。

user: real(nuser_cam), “0 0 …”

参见 用户参数

body/light (*)#

此元素创建一个灯光,该灯光随其定义的物体移动。要创建固定灯光,请在世界物体中定义它。这里创建的灯光是在默认头灯之外的,默认头灯总是被定义并通过 visual 元素进行调整。MuJoCo 依赖于 OpenGL 中的标准照明模型(固定功能),并增强了阴影映射。灯光效果是叠加的,因此添加一个灯光总是会使场景更亮。可同时激活的灯光最大数量为 8 个,包括头灯。灯光沿 dir 属性指定的方向照射。它没有具有三个正交轴的完整空间坐标系。

name: string, 可选

灯光的名称。

class: string, 可选

用于设置未指定属性的默认类。

mode: [fixed, track, trackcom, targetbody, targetbodycom], “fixed”

这与上面 camera 的 mode 属性相同。它指定了灯光在世界坐标系中的位置和方向如何在正向运动学中计算(这反过来决定了灯光照亮的内容)。

target: string, 可选

这与上面 camera 的 target 属性相同。它指定了在“targetbody”和“targetbodycom”模式下应以哪个物体为目标。

directional: [false, true], “false”

如果此属性为“true”,则灯光为方向光,否则为聚光灯。

castshadow: [false, true], “true”

如果此属性为“true”,则灯光将投射阴影。更准确地说,被灯光照亮的几何体将投射阴影,但这属于灯光的属性而非几何体。由于每个投射阴影的灯光都会导致对所有几何体进行一次额外的渲染过程,因此应谨慎使用此属性。通过增加 quality 的 shadowsize 属性值,以及将聚光灯放置在离阴影出现表面更近的位置,并限制投射阴影的体积,可以获得更高质量的阴影。对于聚光灯,该体积是一个锥体,其角度是下面的 cutoff 属性乘以 map 的 shadowscale 属性。对于方向光,该体积是一个盒子,其垂直于灯光方向的半尺寸是模型范围乘以 map 的 shadowclip 属性。模型范围由编译器计算,但也可以通过指定 statistic 的 extent 属性来覆盖。在内部,阴影映射机制从灯光视角(如同相机)渲染场景到深度纹理中,然后再次从相机视角渲染,使用深度纹理创建阴影。内部渲染过程使用与常规渲染相同的近裁剪平面和远裁剪平面,即这些裁剪平面在灯光方向上限制了锥体或盒子的阴影体积。因此,一些阴影(特别是那些非常靠近灯光的阴影)可能会被裁剪。

radius: real, “0.02”

灯光半径,影响阴影柔和度。此属性在 MuJoCo 的原生渲染器中没有效果,但在使用外部渲染器渲染场景时可能有用。

active: [false, true], “true”

如果此属性为“true”,则灯光处于活动状态。这可以在运行时用于打开和关闭灯光。

pos: real(3), “0 0 0”

灯光位置。此属性仅影响聚光灯的渲染,但对于方向光也应定义,因为我们将相机渲染为装饰元素。

dir: real(3), “0 0 -1”

灯光方向。

attenuation: real(3), “1 0 0”

这些是 OpenGL 中的常量、线性和二次衰减系数。默认值对应于无衰减。有关此属性和所有其他 OpenGL 相关属性的更多信息,请参阅 OpenGL 文档。

cutoff: real, “45”

聚光灯的截止角,始终以度为单位,无论全局角度设置如何。

exponent: real, “10”

聚光灯的指数。此设置控制聚光灯截止的柔和度。

ambient: real(3), “0 0 0”

灯光的环境光颜色。

diffuse: real(3), “0.7 0.7 0.7”

灯光的漫反射颜色。

specular: real(3), “0.3 0.3 0.3”

灯光的高光颜色。

body/composite (*)#

这不是一个模型元素,而是一个宏,它展开为多个代表复合对象的模型元素。这些元素是物体(拥有自己的关节和几何体),它们成为包含该宏的父物体的子物体。宏展开由模型编译器完成。如果随后保存结果模型,该宏将被实际的模型元素替换。MJCF 其余部分使用的默认机制在此不适用,即使父物体定义了 childclass 属性也是如此。相反,对于每种复合对象类型都有内部默认值进行自动调整。有关更详细的解释,请参阅建模指南中的 Composite objects。请注意,过去有几种复合类型,但它们已被 replicate(用于重复对象)和 flexcomp(用于软对象)逐步取代。因此,目前唯一支持的复合类型是 cable,它生成由球关节连接的不可伸展的物体链。

prefix: string, optional

所有自动生成的模型元素都具有指示元素类型和索引的名称。例如,2D 网格中坐标为 (2, 0) 的物体默认为“B2_0”。如果指定 prefix=”C”,则同一个物体被命名为“CB2_0”。当同一模型中使用多个复合对象时,需要使用前缀以避免名称冲突。

type: [cable], required

此属性确定复合对象的类型。唯一支持的类型是 cable。

cable 类型创建一个由球关节连接的 1D 物体链,每个物体都有一个用户定义的几何体类型(cylinder、capsule 或 box)。几何形状可以通过 3D 顶点坐标数组 vertex 或通过带有 curve 选项的预设函数来定义。目前仅支持线性和三角函数。例如,可以使用 curve=”cos(s) sin(s) s” 来创建螺旋线。尺寸通过 size 选项设置,得到 \(f(s)=\{\text{size}[1]\cdot\cos(2\pi\cdot\text{size}[2]),\; \text{size}[1]\cdot\sin(2\pi\cdot\text{size}[2]),\; \text{size}[0]\cdot s\}\)

count: int(3), required

网格在每个维度上的元素数量。这可以有 1、2 或 3 个数字,指定父物体坐标系内沿 X、Y 和 Z 轴的元素数量。任何缺失的数字默认为 1。如果其中任何数字是 1,则所有后续数字也必须是 1,以便使用网格的前导维度。例如,这意味着 1D 网格将始终沿 X 轴延伸。要获得不同的方向,请旋转父物体的坐标系。请注意,某些类型隐含了特定维度的网格,因此此属性的要求取决于指定的类型。

offset: real(3), “0 0 0”

它指定了从父物体中心到 cable 中第一个物体中心的 3D 偏移量。该偏移量以父物体的局部坐标系表示。

quat: real(4), “1 0 0 0”

它指定了一个四元数,用于旋转第一个物体的坐标系。该四元数以父物体坐标系表示。

vertex: 实数(3*nvert), 可选

全局坐标系中的顶点 3D 位置。

initial: [free, ball, none], “0”

第一个点的行为。Free: 自由关节。Ball: 球关节。None: 无自由度。

curve: string(3), optional

指定顶点位置的函数。可用的函数是 scos(s)sin(s),其中 s 是弧长参数。

size: int(3), optional

曲线函数的缩放。size[0]s 的缩放因子,size[1]cos(s)sin(s) 的半径,而 size[2] 是参数的速度(即 cos(2*pi*size[2]*s))。

composite/joint (*)#

根据复合类型,一些关节会自动创建(例如 rope 中的万向关节),而其他关节是可选的(例如 rope 中的拉伸关节和扭转关节)。此子元素用于指定应创建哪些可选关节,并调整自动创建关节和可选关节的属性。

kind: [main], required

此处的关节种类与 MJCF 其余部分的关节类型是正交的。关节种类指的是关节在复合物体构成机构中的功能,而关节类型(铰链或滑动)由关节种类和复合物体类型隐含。

main 种类对应于构成每种复合类型的主要关节。即使 joint 子元素缺失,这些关节也会自动包含在模型中。主要关节包括:particle 和 grid 的 3D 滑动关节;box、cylinder 和 rope 的 1D 滑动关节;cloth、rope 和 loop 的万向关节。尽管主要关节会自动包含,此子元素仍然可用于调整它们的属性。

solreffix, solimpfix

这些是用于等式约束关节的 solref 和 solimp 属性。给定关节是否受质量约束取决于上面解释的关节种类和复合对象类型。对于不受等式约束的关节,此属性无效。默认值根据复合类型进行调整。否则,这些属性遵循 MJCF 中所有其他 solref 和 solimp 属性的相同规则。详情请参阅 Solver parameters

axis, group, stiffness, damping, armature, limited, range, margin, solreflimit, solimplimit, frictionloss, solreffriction, solimpfriction, type

与常规 joint 属性的含义相同。

composite/geom (?)#

此子元素调整复合对象中几何体的属性。默认属性与 MJCF 其余部分相同(用户定义的默认值在此无效)。请注意,geom 子元素只能出现一次,不像 joint 和 tendon 子元素可以出现多次。这是因为不同种类的关节和肌腱具有不同的属性集,而复合对象中的所有几何体都是相同的。

type, contype, conaffinity, condim, group, priority, size, material, rgba, friction, mass, density, solmix, solref, solimp, margin, gap

与常规 geom 属性的含义相同。

composite/site (?)#

此子元素调整复合对象中站点的属性。其他方面与上面的 geom 相同。

group, size, material, rgba

与常规 site 属性的含义相同。

composite/skin (?)#

如果包含此元素,模型编译器将生成一个蒙皮网格资源并将其附加到复合对象的元素物体上。蒙皮可以附加到 2D grid、cloth、box、cylinder 和 ellipsoid。对于其他复合类型,它没有效果。请注意,此处创建的蒙皮等同于直接在 XML 中指定的蒙皮,而不是从文件加载的蒙皮。因此,如果将模型保存为 XML,它将包含一个大段落描述自动生成的蒙皮。

texcoord: [false, true], “false”

如果为 true,将生成显式的纹理坐标,将蒙皮映射到纹理空间中的单位正方形。当材质指定纹理时需要此操作。如果 texcoord 为 false 且蒙皮有纹理,则纹理将显示为固定在世界中而非蒙皮上。设置此属性的原因是,即使稍后不应用纹理,具有纹理坐标的蒙皮也会将这些坐标上传到 GPU。因此,在使用 material 属性不应用纹理的情况下,应将此属性设置为 false。

material, rgba, group

geom 中的含义相同。

inflate: real, “0”

默认值 0 意味着自动生成的蒙皮穿过构成复合对象的物体元素的中心。正值会沿该顶点处(未膨胀的)蒙皮的法线方向,将每个蒙皮顶点偏移指定的量。这有两个用途。首先,在 2D 对象中,需要一个小的正 inflate 因子来避免锯齿伪影。其次,碰撞是使用具有一定厚度的几何体进行的,即使对于 2D 对象也是如此。使用等于几何体尺寸的值来膨胀蒙皮,将把蒙皮渲染成一个“垫子”,更好地代表实际的碰撞几何形状。此属性的值将被复制到正在创建的 skin 资源的相应属性中。

subgrid: int, “0”

此属性仅适用于 cloth 和 2D grid 类型,对任何其他复合类型无效。默认值 0 意味着蒙皮的顶点数量与元素物体的数量相同。正值会导致细分,并指定数量的(额外)网格线。在这种情况下,模型编译器使用双三次插值生成更致密的蒙皮。这提高了渲染质量(特别是在没有纹理的情况下),但也降低了渲染器的速度,因此请谨慎使用。大于 3 的值不太可能需要。

composite/plugin (?)#

将此复合对象与 engine plugin 关联。需要指定 plugininstance 中的一个。

plugin: string, 可选

插件标识符,用于隐式插件实例化。

instance: string, 可选

实例名称,用于显式插件实例化。

body/flexcomp (*)#

composite 类似,此元素(MuJoCo 3.0 新增)不是一个模型元素,而是一个宏,它展开为多个代表可变形实体的模型元素。特别是,此宏创建一个 flex 元素,以及在其中定义 flexcomp 的物体的多个子物体,并可选地创建一个 flex equality,将所有 flex 边缘约束为其初始长度。此处指定了多个属性,然后传递给自动构建的 flex。 flexcomp 的主要作用是自动化创建(可能很大)的、具有相应关节的可移动物体集合,并用可拉伸的 flex 元素连接它们。有关 flex 如何工作的详细信息,请参阅 flexdeformable objects 文档。这里我们仅描述自动化构建过程。

flexflexcomp 之间的一个重要区别是,flex 引用物体并在这些物体的坐标系中指定顶点坐标,而 flexcomp 定义的是。每个 flexcomp 点对应于底层 flex 中的一个物体和一个顶点。如果 flexcomp 点被固定(pinned),则对应的 flex 物体是 flexcomp 的父物体,而对应的 flex 顶点坐标等于 flexcomp 点的坐标。如果 flexcomp 点未固定,则会在 flexcomp 点的坐标处(在 flexcomp 父物体内)创建一个新的子物体,然后该新物体内的 flex 顶点坐标为 (0,0,0)。下面解释了 固定(pinning) flexcomp 点的机制。

复合对象(MuJoCo 3.0 之前可用)需要带有几何体用于碰撞的物体,以及用于连接肌腱以产生形状保持力的站点。相比之下,flex 产生自己的碰撞和形状保持力(以及渲染),因此此处创建的物体要简单得多:不需要几何体、站点或肌腱。此处创建的大多数物体都有 3 个正交滑动关节,对应于自由移动的质点。在某些情况下,我们生成径向滑动关节,仅允许膨胀和收缩。由于没有生成几何体,物体需要有显式的惯性参数。

下面是一个 flexcomp 的简单示例,模拟了一个(略微灵活的)一端固定在世界上的双摆。

<mujoco>
  <worldbody>
    <flexcomp name="FL" type="grid" dim="1" count="3 1 1" mass="3" spacing="0.2 0.2 0.2">
      <pin id="0"/>
    </flexcomp>
  </worldbody>
</mujoco>

这个 flexcomp 有 3 个点,但是第一个点固定在世界(即 flexcomp 的父物体)上,因此只自动创建了两个物体,即 FL_1 和 FL_2。这是加载和保存 XML 后此 flexcomp 生成的内容。

<mujoco>
  <worldbody>
    <body name="FL_1">
      <inertial pos="0 0 0" mass="1" diaginertia="1.66667e-05 1.66667e-05 1.66667e-05"/>
      <joint pos="0 0 0" axis="1 0 0" type="slide"/>
      <joint pos="0 0 0" axis="0 1 0" type="slide"/>
      <joint pos="0 0 0" axis="0 0 1" type="slide"/>
    </body>
    <body name="FL_2" pos="0.2 0 0">
      <inertial pos="0 0 0" mass="1" diaginertia="1.66667e-05 1.66667e-05 1.66667e-05"/>
      <joint pos="0 0 0" axis="1 0 0" type="slide"/>
      <joint pos="0 0 0" axis="0 1 0" type="slide"/>
      <joint pos="0 0 0" axis="0 0 1" type="slide"/>
    </body>
  </worldbody>
  <deformable>
    <flex name="FL" dim="1" body="world FL_1 FL_2" vertex="-0.2 0 0 0 0 0 0 0 0" element="0 1 1 2"/>
  </deformable>
  <equality>
    <flex flex="FL"/>
  </equality>
</mujoco>
name: string, 必需

自动生成的 flex 元素的名称。此名称用作此处所有自动生成物体的名称前缀,并且也被相应的 flex 等式约束(如果适用)引用。

dim: int(1), “2”

flex 对象的维度。此值必须是 1、2 或 3。flex 元素在 1D 中是胶囊体,在 2D 中是带半径的三角形,在 3D 中是带半径的四面体。某些 flexcomp 类型隐含了维度,在这种情况下,此处指定的值将被忽略。

dof: [full, radial, trilinear], “full”

flex 自由度(dofs)的参数化。请观看右侧视频,其中展示了使用可变形球体进行的不同参数化。视频中的三个模型分别是 sphere_fullsphere_radialsphere_trilinear

full

每个顶点三个平移自由度。这是最具表达力但也是最昂贵的选项。

radial

每个顶点一个径向平移自由度。请注意,与“full”情况不同,径向参数化要求在 flex 的父物体处有一个自由关节,以便实现自由物体运动。这种参数化适用于相对球形的形状。

trilinear

flex 包围盒的每个角有三个平移自由度,整个 flex 共有 24 个自由度,与顶点数量无关。使用包围盒上的三线性插值更新顶点位置。

三线性 flex 比前两种选项快得多,如果预期的变形可以通过简化参数化捕获,则是首选。例如,请观看右侧视频,比较 fulltrilinear flex 在模拟可变形抓取器垫中的效果。

请注意,自由度参数化的选择会影响 flex 的变形模式,但对碰撞几何体的准确性没有影响,碰撞几何体始终考虑 flex 的高分辨率网格。

type: [grid, box, cylinder, ellipsoid, disc, circle, mesh, gmsh, direct], “grid”

此属性确定 flexcomp 对象的类型。然后根据类型解释其余属性和子元素。默认设置也根据类型进行调整。不同类型对应于指定 flexcomp 点和连接它们的可拉伸元素的不同方法。它们分为三类:直接在 XML 中输入的规范、从文件加载的直接规范,以及从更高级别规范自动生成。

grid 根据 dim 生成 1D、2D 或 3D 的矩形点网格。每个维度上的点数由 count 确定,而每个维度上的网格间距由 spacing 确定。确保间距相对于 radius 足够大,以避免永久接触。在 2D 和 3D 中,网格会自动三角化,并创建相应的 flex 元素(三角形或四面体)。在 1D 中,元素是连接连续点对的胶囊体。

box 生成一个 3D 盒子对象,但 flex 物体仅在外壳上生成。每个 flex 物体都有一个径向滑动关节,允许它从盒子中心向内或向外移动。父物体通常是一个浮动物体。盒子表面被三角化,每个 flex 元素都是一个连接盒子中心与一个三角形面的四面体。countspacing 确定 flex 物体的数量和间距,类似于 3D 中的 grid 类型。请注意,生成的 flex 具有与 composite 生成的盒子相同的拓扑结构。

cylinderbox 相同,只是点投影到圆柱体表面。

ellipsoidbox 相同,只是点投影到椭球体表面。

discbox 相同,只是点投影到圆盘表面。它仅与 dim=2 兼容。

circlegrid 相同,只是点沿圆周采样,使得第一个点和最后一个点相同。计算圆的半径,使得每个线段具有请求的间距。它仅与 dim=1 兼容。

mesh 从网格文件中加载 flexcomp 点和元素(即三角形),文件格式与网格资源相同,但不包括旧版 .msh 格式。实际上并未将网格资源添加到模型中。而是使用网格文件中的顶点和面数据来填充 flexcomp 的点和元素数据。dim 自动设置为 2。回想一下,MuJoCo 中的网格资源可以用作附加到单个物体的刚性几何体。相比之下,此处生成的 flex 对应于具有相同初始形状的软网格,其中每个顶点都是一个单独的移动物体(除非被固定)。

gmsh 类似于 mesh,但它加载 format 4.1format 2.2 格式(ascii 或 binary)的 GMSH 文件。文件扩展名可以是任意的;解析器通过检查文件头来识别格式。这是一种非常丰富的文件格式,允许各种不同维度和拓扑结构的元素。MuJoCo 仅支持 GMSH 元素类型 1、2、4,这些恰好对应于我们的 1D、2D 和 3D flex,并假定节点在一个块中指定。仅处理 GMSH 文件中的 Nodes 和 Elements 部分,并用于填充 flexcomp 的点和元素数据。如果 GMSH 文件包含 MuJoCo 不支持的网格,解析器将生成错误。dim 自动设置为 GMSH 文件中指定的维度。目前,这是在 MuJoCo 中加载大型四面体网格并生成相应软实体的唯一机制。如果这种网格以其他文件格式可用,请使用免费的 GMSH 软件将其转换为支持的 GMSH 版本之一。

direct 允许用户直接在 XML 中指定 flexcomp 的点和元素数据。请注意,flexcomp 仍然会自动生成移动物体,并自动化其他设置;因此与直接指定相应的 flex 相比,它仍然提供了便利。

count: int(3), “10 10 10”

每个维度上自动生成的点数。此属性和下一个属性仅适用于 grid、box、cylinder、ellipsoid 类型。

spacing: real(3), “0.02 0.02 0.02”

每个维度上自动生成的点之间的间距。间距应相对于半径足够大,以避免永久接触。

point: real(3*npoint), optional

点的 3D 坐标。此属性仅用于 direct 类型。所有其他 flexcomp 类型都会生成自己的点。这些点用于构建物体和顶点,如前所述。

element: int((dim+1)*npoint), optional

构成每个 flex 元素的基于零的点 ID。此属性仅用于 direct 类型。所有其他 flexcomp 类型都会生成自己的元素。此数据传递给自动生成的 flex。

texcoord: real(2*npoint), optional

每个点的纹理坐标,传递给自动生成的 flex。请注意,除了 2D grid、box、cylinder 和 ellipsoid 之外,flexcomp 不会自动生成纹理坐标。对于所有其他类型,即使点本身是自动生成的,用户也可以在此处指定显式纹理坐标。这需要了解自动生成的点的布局以及它们如何对应于材质引用的纹理。

mass: real(1), “1”

每个自动生成物体的质量等于此值除以点数。请注意,固定某些点不影响其他物体的质量。

inertiabox: real(1), “0.005”

尽管自动生成的物体具有质点的物理特性和滑动关节,MuJoCo 仍然要求每个物体具有转动惯量。此处生成的惯量是对角的,并且计算得出的相应等效惯量盒子的边长等于此值。

file: string, 可选

加载表面(三角形)或体积(四面体)网格的文件名。对于表面网格,使用文件扩展名确定文件格式。支持的格式包括 GMSH 和 mesh assets 中指定的格式,但不包括旧版 .msh 格式。体积网格仅支持 GMSH 格式。有关 GMSH 文件的更多信息,请参阅 此处

rigid: [true, false], “false”

如果为 true,所有点都对应于父物体内的顶点,并且不创建新物体。这相当于固定所有点。请注意,如果所有点都被固定,模型编译器将检测到 flex 是刚性的(在碰撞检测中表现为非凸网格)。

pos: real(3), “0 0 0”

此 3D 向量将所有点相对于父物体的坐标系进行平移。

quat: real(4), “1 0 0 0”

这是所有点绕上面指定的 pos 向量的四元数旋转。这两个向量共同定义了一个姿态变换,用于根据需要定位和定向这些点。

axisangle, xyaxes, zaxis, euler

替代旋转指定方式,可以用来替代 quat

scale: 实数(3), “1 1 1”

对于显式指定坐标的类型,所有点坐标的缩放。缩放应用于姿态变换之后。

radius, material, rgba, group, flatskin

这些属性直接传递给自动生成的 flex 对象,并具有相同的含义。

origin: real(3), “0 0 0”

flexcomp 的原点。用于从 OBJ 表面网格生成体积网格。每个表面三角形都连接到原点以创建四面体,因此生成的体积网格仅对凸形形状保证格式正确。

flexcomp/contact (*)#
internal, selfcollide, activelayers, contype, conaffinity, condim, priority, friction, solmix, solimp, margin, gap

flex/contact 中的相同。所有属性都传递给自动生成的 flex。

flexcomp/edge (*)#

每个 flex 元素在 1D 中有一条边(与胶囊元素重合),在 2D 中有三条边,在 3D 中有六条边。边缘在 flex 元素编译时自动生成,用户无法直接指定。此元素用于调整 flex 中所有边缘的属性。

equality: [true, false], “false”

启用时,将一个 type flex 的等式约束添加到模型中,通过名称引用自动生成的 flex。

solref, solimp

标准约束参数,传递给自动生成的等式约束。

stiffness, damping

边缘刚度和阻尼,传递给自动生成的 flex。

flexcomp/elasticity (*)#
young, poisson, damping, thickness

flex/elasticity 中的相同。所有属性都传递给自动生成的 flex。

flexcomp/pin (*)#

每个点要么被固定,要么未被固定。前面解释了固定的效果。此元素用于指定哪些点被固定。请注意,下面的每个属性都可以用于指定多个固定点,此外,pin 元素本身也可以重复使用,以方便用户。效果是累积的;允许多次固定同一点。

id: int(n), required

要固定的点的基于零的 ID。当点是自动生成时,用户需要了解其布局才能决定要固定哪些点。这可以通过首先创建一个没有任何固定点的 flexcomp,在模拟器中加载它,并显示物体标签来实现。

range: int(2*n), required

要固定的点的范围。每个范围由两个整数指定。

grid: int(dim*n), required

要固定的点的网格坐标。这仅适用于 grid 类型。

gridrange: int(2*dim*n), required

要固定的点网格坐标范围。每个范围由 (dim) 个整数指定范围的最小值,后跟 (dim) 个整数指定范围的最大值。这仅适用于 grid 类型。

flexcomp/plugin (?)#

将此 flexcomp 与 engine plugin 关联。需要指定 plugininstance 中的一个。

plugin: string, 可选

插件标识符,用于隐式插件实例化。

instance: string, 可选

实例名称,用于显式插件实例化。

body/plugin (?)#

将此物体与 engine plugin 关联。需要指定 plugininstance 中的一个。

plugin: string, 可选

插件标识符,用于隐式插件实例化。

instance: string, 可选

实例名称,用于显式插件实例化。

body/attach (*)#

The attach element is used to insert a sub-tree of bodies from another model into this model’s kinematic tree. Unlike include, which is implemented in the parser and is equivalent to copying and pasting XML from one file into another, attach is implemented in the model compiler. In order to use this element, the sub-model must first be defined as an asset. When creating an attachment, the top body of the attached subtree is specified, and all referencing elements outside the kinematic tree (e.g., sensors and actuators), are also copied into the top-level model. Additionally, any elements referenced from within the attached subtree (e.g. defaults and assets) will be copied in to the top-level model. attach is a Meta elements, so upon saving all attachments will appear in the saved XML file.

已知问题

存在以下已知限制,将在未来版本中解决

  • 无法附加整个模型(即,包括所有元素,无论是否被引用)。

  • 子模型中的所有资产都会被复制进来,无论它们是否被引用。

  • 不会检查循环引用,这会导致无限循环。

  • 附加包含 关键帧 (keyframe) 的模型时,需要进行模型编译才能完成重新索引。如果未编译而进行第二次附加,第一次附加的关键帧将会丢失。

model: 字符串,必需

要从中附加子树的子模型。

body: 字符串,可选

要附加到此处的子模型中的身体名称。该身体及其子树将被附加。如果未指定此属性,世界身体的内容将以一个新的 坐标系 (frame) 的形式附加。

prefix: 字符串,必需

要添加到子模型中元素名称前的词头。需要此属性以防止与父模型或多次附加同一子树时发生名称冲突。

body/坐标系 (frame) (*)#

坐标系指定一个坐标变换,此变换应用于所有子元素。它们在编译期间消失,其编码的变换会累积到其直接子元素中。有关示例,请参阅 坐标系 (frame)

name: string, 可选

坐标系的名称。

childclass: string, 可选

如果此属性存在,所有接受默认设置类的后代元素将使用此处指定的类,除非它们指定自己的类或在嵌套身体和坐标系链中遇到带有 childclass 属性的其他坐标系或身体。回顾 默认设置 (Default settings)

pos: real(3), “0 0 0”

坐标系的三维位置,在父坐标系中。

quat, axisangle, xyaxes, zaxis, euler

参见 坐标系方向

接触 (contact) (*)#

这是一个分组元素,没有属性。它对用于调整碰撞检测的候选接触对生成的元素进行分组。碰撞检测 (Collision detection) 在“计算”章节中有详细描述,因此这里的描述很简略。

contact/对 (pair) (*)#

此元素创建一个预定义的几何体对,该对将用于碰撞检查。与属性从相应几何体属性推断出来的动态生成对不同,此处创建的对通过显式或默认设置指定其所有属性,并且不使用单个几何体的属性。各向异性摩擦只能通过此元素创建。

name: string, 可选

此接触对的名称。

class: string, 可选

用于设置未指定属性的默认类。

geom1: 字符串,必需

对中第一个几何体的名称。

geom2: 字符串,必需

对中第二个几何体的名称。求解器计算并存储在 mjData.efc_force 中的接触力向量根据约定从第一个几何体指向第二个几何体。施加到系统的力当然是相等且方向相反的,因此几何体的顺序不影响物理效果。

condim: int, “3”

此几何体对生成的接触的维度。

friction: 实数(5),“1 1 0.005 0.0001 0.0001”

此几何体对生成的接触的摩擦系数。将前两个系数设为不同会导致各向异性切向摩擦。将后两个系数设为不同会导致各向异性滚动摩擦。此数组的长度不由解析器强制执行,可以小于 5。这是因为某些系数可能不被使用,具体取决于接触的维度。未指定的系数保持其默认值。

solref, solimp

用于接触仿真的约束求解器参数。参见 求解器参数

solreffriction: 实数,“0 0”

接触参考加速度,在摩擦维度上。此属性与其它 solref 属性(在 求解器参数 (Solver parameters) 中描述)具有相同的语义,但有两个重要区别

注意,与其它 solreffriction 属性一样,约束违反量始终为 0。因此,在使用正向语义时,solreffriction[1] 被忽略,而对于负向语义时,solreffriction[0] 被忽略。有关更多详细信息,请参阅 求解器参数 (Solver parameters)

margin: real, “0”

距离阈值,低于此阈值将检测到接触并将其包含在全局数组 mjData.contact 中。

gap: real, “0”

此属性用于启用非活动接触的生成,即被约束求解器忽略但出于自定义计算目的包含在 mjData.contact 中的接触。当此值为正时,几何体距离介于 margin 和 margin-gap 之间的情况对应于此类非活动接触。

contact/排除 (exclude) (*)#

此元素用于将一对身体从碰撞检查中排除。与所有其他引用几何体的接触相关元素不同,此元素引用身体。经验表明,在身体层面进行排除更有用。第一个身体中定义的任何几何体与第二个身体中定义的任何几何体之间的碰撞都被排除。

name: string, 可选

此排除对的名称。

body1: 字符串,必需

对中第一个身体的名称。

body2: 字符串,必需

对中第二个身体的名称。

可变形体 (deformable) (*)#

这是一个分组元素,没有属性。它对指定可变形对象的元素进行分组,即 flexes 和 skins。

deformable/flex (*)#

柔性对象(或 flexes)在 MuJoCo 3.0 中添加。它们是连接在不同运动身体坐标系内定义的顶点的无质量可伸展几何元素(胶囊体、三角形或四面体)的集合。这些可伸展元素支持碰撞和接触力,然后这些力被分配到所有相互连接的身体。Flexes 还会根据需要生成被动力和约束力,以模拟具有所需材料特性的可变形实体。flexes 的建模通过 flexcomp 元素实现自动化和简化。在大多数情况下,用户会指定一个 flexcomp,然后它会自动构建相应的低级 flex。有关更多信息,请参阅 可变形体 (deformable objects)

name: string, 可选

flex 的名称。

dim: 整型,“2”

flex 的维度。允许的值为 1、2 和 3。在 1D 中,元素是胶囊体;在 2D 中,元素是带半径的三角形;在 3D 中,元素是带(可选)半径的四面体。

radius: 实数,“0.005”

所有 flex 元素的半径。在 3D 中可以为零,但在 1D 和 2D 中必须为正。半径影响碰撞检测和渲染。在 1D 和 2D 中,需要半径使元素具有体积。

body: 字符串(nvert 或 1),必需

一个 MuJoCo 身体名称数组(用空格分隔),每个顶点都属于其中一个身体。身体名称的数量应等于顶点数量 (nvert),或者只有一个身体。如果指定一个身体,所有顶点都在该身体内定义 - 在这种情况下,flex 变成了一个刚体。后者功能实际上创建了一个通用的非凸网格(与用于碰撞检测目的而被凸化的网格几何体不同)。

vertex: 实数(3*nvert), 可选

顶点在相应身体坐标系内的局部坐标。如果省略此属性,所有坐标都为 (0,0,0),换句话说,顶点与身体坐标系的中心重合。

texcoord: 实数(2*vert 或 ntexcoord),可选

纹理坐标。如果省略,即使在材质中指定了纹理,此 flex 的纹理映射也会被禁用。

elemtexcoord: 整型((dim+1)*nelem),可选

每个面的纹理索引。如果省略,则假定纹理是基于顶点的。

element: 整型((dim+1)*nelem),必需

对于 flex 的每个元素,这列出了组成该 flex 元素的顶点的零基索引。我们需要两个顶点指定一个胶囊体,三个顶点指定一个三角形,四个顶点指定一个四面体 - 这就是为什么索引数量等于 (dim+1) 乘以元素数量。在 2D 中,顶点应按逆时针顺序列出。在 1D 和 3D 中,顺序无关紧要;在 3D 中,模型编译器会根据需要重新排列顶点。在 flex 元素中不允许重复的顶点索引。不强制执行 flex 的拓扑结构;它可以对应于一个连续的软体,或一组断开的可伸展元素,或介于两者之间的任何东西。

flatskin: [真,假],“假”

此属性决定在 flexskin 模式下渲染的 2D 和 3D flexes 是使用平滑着色还是平面着色。默认的平滑着色在大多数情况下是合适的,但是如果对象的目的是具有可见的锐利边缘(例如立方体),则平面着色更自然。

material: string, 可选

如果指定,此属性将 材质 (material) 应用于 flex。请注意,材质中指定的纹理仅在 flex 具有显式纹理坐标时才会被应用。

rgba: real(4), “0.5 0.5 0.5 1”

除了创建材质资产并引用它们之外,还可以使用此属性仅设置颜色和透明度。这不如材质机制灵活,但更方便,并且通常足够用。如果此属性的值与内部默认值不同,它将优先于材质。

group: int, “0”

flex 所属的整数组。此属性可用于自定义标签。可视化器也使用它来启用或禁用整组 flexes 的渲染。

node: 字符串(nnode),可选

flex 的自由度。一个 MuJoCo 身体名称数组(用空格分隔),每个节点都属于其中一个身体。身体名称的数量应等于节点数量 (nnode)。有关更多详细信息,请参阅 flexcomp 的 dof 属性。

flex/边 (edge) (?)#

此元素调整 flex 所有边的被动或约束属性。flex 的边可以具有阻尼被动力和一个与之相关的 等式约束 (equality constraint),从而产生边约束力。在后一种情况下,通常不需要被动力。对于 1D flex,边也可以具有被动刚度,而对于 2D 和 3D 情况,可以使用 SolidMembrane 第一方插件。这通常会使边约束变得不必要。然而,这些建模选择取决于用户。MuJoCo 允许根据需要组合所有这些机制。

stiffness: 实数(1),“0”

所有边的刚度。仅适用于 1D flex。对于 2D 和 3D,必须使用插件。

damping: 实数(1),“0”

所有边的阻尼。

flex/弹性 (elasticity) (?)#

弹性模型是使用分段线性有限元离散化的 Saint Venant-Kirchhoff 模型,旨在模拟受到大位移(有限旋转)和小应变下的超弹性材料的压缩或拉伸,因为它使用非线性应变-位移关系但线性应力-应变关系。另请参阅 可变形体 (deformable)

young: 实数(1),“0”

杨氏弹性模量,衡量连续弹性材料抗拉伸和压缩刚度的量。单位是 \(\textrm{压力}=\textrm{力}/\textrm{面积}\)

poisson: 实数(1),“0”

泊松比,衡量横向形变与纵向应变之比的量。这个无量纲的量在 \([0, 0.5)\) 范围内。小值或大值分别表示可压缩性或不可压缩性。

damping: 实数(1),“0”

瑞利阻尼系数,单位是时间。此量根据杨氏模量定义的刚度进行缩放,以产生阻尼矩阵。

thickness: 实数(1),“-1”

壳厚度,单位是长度;仅用于 2D flexes。用于缩放拉伸刚度。此厚度可以设置为 半径 (radius) 的 2 倍,以便与几何形状匹配,但它是单独暴露的,因为半径可能受到碰撞检测相关考虑因素的限制。

flex/接触 (contact) (?)#

此元素调整 flex 的接触属性。它与几何体接触属性大部分相同,但有一些特定于 flexes 的扩展。

internal: [真,假],“假”

启用或禁用内部碰撞,以防止 flex 自穿透和元素倒置。请注意,具有共享顶点的 flex 元素不能发生碰撞(否则会产生永久接触)。在 1D 和 2D 中,内部碰撞检查依赖于预定义的顶点-元素对,其中顶点被视为与 flex 具有相同半径的球体。这些球体对应于 flex 周边相邻元素的非共享顶点。预定义的顶点-元素对由模型编译器自动生成。在 3D 中,内部碰撞检查在每个四面体内部进行:每个顶点与对应于对面三角形面的平面碰撞(再次使用 flex 半径)。生成的接触总是以 condim 1、gap 0、margin 0 创建。请注意,内部接触会修改 弹性参数 (elasticity parameters) 所暗示的行为,并且仅建议用于无法防止元素倒置的 flexes。此属性的默认值在 3.3.1 版本中从“true”更改为“false”。

selfcollide: [无,窄相,BVH,SAP,自动],“自动”

这决定了属于同一 flex 的元素对进行中相碰撞剔除的策略。无 (none) 意味着 flex 元素之间不能发生碰撞。窄相 (narrow) 意味着仅进行窄相(即检查所有对)。这是一个诊断工具,在实践中绝不是一个好主意。BVH (bvh)SAP (sap) 指边界体积层级树和扫描-修剪(这是两种不同的中相碰撞剔除策略)。自动 (auto) 在 1D 和 2D 中选择 SAP (sap),在 3D 中选择 BVH (bvh)。哪种策略表现更好取决于模型的具体情况。自动设置只是我们发现通常表现良好的一个简单规则。

activelayers: 整型(1),“1”

这仅对 3D flexes 有影响。模型编译器为每个四面体标记一个整数,对应于距 flex 外表面(图论)距离。因此,朝外的元素在第 0 层,它们的邻居在第 1 层,依此类推。此属性指定允许多少层参与碰撞。默认设置 1 意味着只有一层(即第 0 层)可以与自身以及与世界上的其他物体碰撞。这通常足够了,但是如果外层由小的四面体组成,另一个身体可能会“刺穿”它并被卡住。在这种情况下,应增加此值。

contype, conaffinity, condim, priority, friction, solmix, solref, solimp, margin, gap

与常规 geom 属性的含义相同。

deformable/皮肤 (skin) (*)#

这些是可变形网格,其顶点位置和法线在每次渲染模型时计算。MuJoCo skin 仅用于可视化,不影响物理效果。特别是,碰撞涉及 skin 所附加的身体的几何体,而不是 skin 本身。与从几何体引用并参与碰撞的常规网格不同,skin 在模型中不被其他任何地方引用。它是一个独立元素,由渲染器使用,而不是由模拟器使用。

skin 具有在运行时更新的顶点位置和法线,以及预定义的三角形面和可选纹理坐标。它还有用于更新的“骨骼 (bones)”。骨骼是使用 bone 子元素引用的常规 MuJoCo 身体。每根骨骼都有一个顶点索引列表和相应的实数值权重,这些权重指定骨骼位置和方向对相应顶点的影响程度。顶点对于影响它的每根骨骼都具有局部坐标。局部坐标由模型编译器计算,给定全局顶点坐标和每个身体的全局绑定姿势。绑定姿势不必与模型参考配置 qpos0 对应。请注意,即使模型本身是在局部坐标中定义的,skin 定义中提供的顶点位置和骨骼绑定姿势也始终是全局的。

在运行时,将每个顶点相对于影响它的每根骨骼的局部坐标转换为全局坐标,并按相应权重进行平均,以获得每个顶点的一组三维坐标。然后,根据生成的全局顶点位置和面信息自动计算法线。最后,可以通过沿着其(计算出的)法线方向对每个顶点位置应用偏移来膨胀 skin。Skins 在渲染时是单面的;这是因为需要背面剔除以避免着色和锯齿伪影。当 skin 是一个闭合的三维形状时,这无关紧要,因为看不到背面。但如果 skin 是一个二维对象,我们必须指定两面并稍微偏移它们以避免伪影。请注意,复合对象会自动生成 skins。因此,可以保存包含复合对象的 XML 模型,并获得关于如何在 XML 中指定 skin 的详细示例。

与网格类似,skins 可以通过稍后文档中描述的属性直接在 XML 中指定,或从自定义格式的二进制 SKN 文件加载。由于 bone 子元素,skin 的规格比网格更复杂。文件格式以包含 4 个整数的头部开始:nvertex, ntexcoord, nface, nbone。前三个与网格中的相同,指定 skin 中顶点总数、纹理坐标对总数和三角形面总数。ntexcoord 可以为零或等于 nvertex。nbone 指定将在 skin 中用作骨骼的 MuJoCo 身体数量。头部之后是顶点、纹理坐标和面数据,然后是每根骨骼的规格。骨骼规格包含相应模型身体的名称、三维绑定位置、四维绑定四元数、受骨骼影响的顶点数量,以及顶点索引数组和权重数组。身体名称表示为固定长度的字符数组,应以 0 终止。第一个 0 之后的字符将被忽略。SKN 文件的内容是

(int32)   nvertex
(int32)   ntexcoord
(int32)   nface
(int32)   nbone
(float)   vertex_positions[3*nvertex]
(float)   vertex_texcoords[2*ntexcoord]
(int32)   face_vertex_indices[3*nface]
for each bone:
    (char)    body_name[40]
    (float)   bind_position[3]
    (float)   bind_quaternion[4]
    (int32)   vertex_count
    (int32)   vertex_index[vertex_count]
    (float)   vertex_weight[vertex_count]

与 MuJoCo 中使用的其他自定义二进制格式类似,模型编译器严格强制执行文件大小(以字节为单位)。skin 文件格式有子元素,因此总文件大小公式难以写出,但应从上述规格中清晰可见。

name: string, 可选

skin 的名称。

file: string, 可选

将从中加载 skin 的 SKN 文件。路径根据 编译器 (compiler) 的 meshdir 属性描述的方式确定。如果省略该文件,必须使用以下属性在 XML 中提供 skin 规格。

vertex: 实数(3*nvert), 可选

顶点三维位置,在定义 skin 的全局绑定姿势中。

texcoord: 实数(2*nvert), 可选

顶点二维纹理坐标,介于 0 和 1 之间。请注意,skin 和几何体的纹理处理有些不同。几何体可以使用自动纹理坐标生成,而 skins 不能。这是因为 skin 数据是直接在全局坐标中计算的。因此,如果材质引用了纹理,应使用此属性为 skin 指定显式纹理坐标。否则,纹理会看起来在世界中静止不动,而 skin 四处移动(产生一个有趣的效果,但可能不是预期的)。

face: int(3*nface), 可选

三角形 skin 面。每个面是一个顶点索引的三元组,索引是介于零和 nvert-1 之间的整数。

inflate: real, “0”

如果此数字不为零,更新期间顶点的位置将沿着顶点法线偏移,偏移距离为此属性指定的值。这对于表示柔性二维形状的 skins 特别有用。

material: string, 可选

如果指定,此属性将材质应用于 skin。

rgba: real(4), “0.5 0.5 0.5 1”

除了创建材质资产并引用它们之外,还可以使用此属性仅设置颜色和透明度。这不如材质机制灵活,但更方便,并且通常足够用。如果此属性的值与内部默认值不同,它将优先于材质。

group: int, “0”

skin 所属的整数组。此属性可用于自定义标签。可视化器也使用它来启用或禁用整组 skins 的渲染。

skin/骨骼 (bone) (*)#

此元素定义 skin 的骨骼。骨骼是一个常规的 MuJoCo 身体,在此处按名称引用。

body: 字符串,必需

与此骨骼对应的身体名称。

bindpos: 实数(3),必需

对应于绑定姿势的全局身体位置。

bindquat: 实数(4),必需

对应于绑定姿势的全局身体方向。

vertid: 整型(nvert),必需

受此骨骼影响的顶点的整数索引。顶点索引对应于顶点在 skin 网格中的顺序。此处指定的顶点索引数量 (nvert) 必须等于使用下一个属性指定的顶点权重数量。同一个顶点可能受到多根骨骼的影响,并且每个顶点必须至少受到一根骨骼的影响。

vertweight: 实数(nvert),必需

受此骨骼影响的顶点的权重,顺序与顶点索引相同。允许使用负权重(例如,三次插值需要),但给定顶点的所有骨骼权重之和必须为正。

等式约束 (equality) (*)#

这是一个等式约束的分组元素。它没有属性。有关等式约束的详细描述,请参阅“计算”章节的 等式 (Equality) 部分。有几个属性是所有等式约束类型共有的,因此我们只在 连接 (connect) 元素下文档化一次。

equality/连接 (connect) (*)#

此元素创建连接两个身体于一点的等式约束。该约束有效地在运动学树之外定义了一个球关节。连接约束可以通过以下两种方式之一指定:

  • 使用 body1anchor(两者均必需)以及可选的 body2。使用此规格时,假定约束在模型定义配置 (mjData.qpos0) 下得到满足。

  • site1site2(两者均必需)。使用此规格时,无论两个站点的默认配置位置如何,约束都会将它们拉到一起。此模型 显示了此规格的一个示例。

name: string, 可选

等式约束的名称。

class: string, 可选

用于设置未指定属性的默认类。

active: [false, true], “true”

如果此属性设置为“true”,则约束处于活动状态,约束求解器将尝试强制执行它。字段 mjModel.eq_active0 对应此值,并用于初始化 mjData.eq_active,后者在运行时可由用户设置。

solref, solimp

等式约束模拟的约束求解器参数。请参阅 求解器参数 (Solver parameters)

body1: 字符串,可选

参与约束的第一个身体的名称。必须指定此属性和 anchor,或者必须指定 site1site2

body2: 字符串,可选

参与约束的第二个身体的名称。如果省略此属性,第二个身体是世界身体。

anchor: 实数(3),可选

两个身体连接的三维锚点的坐标,在 body1 的局部坐标系中。假定约束在模型定义的配置 (mjData.qpos0) 下得到满足,这使得编译器能够计算与 body2 相关的锚点。

site1: 字符串,可选

属于参与约束的第一个身体的站点的名称。指定时,也必须指定 site2。(site1, site2) 规格是基于身体规格的更灵活替代方案,并且在两个方面有所不同。首先,站点在默认配置下不需要重叠;如果它们不重叠,模拟开始时站点将“迅速靠拢 (snap together)”。其次,在运行时更改 mjModel.site_pos 中的站点位置将正确更改约束的位置(即,使用此语义时,mjModel.eq_data 的内容无效)。

site2: 字符串,可选

属于参与约束的第二个身体的站点的名称。指定时,也必须指定 site1。有关更多详细信息,请参阅 site1 的描述。

equality/焊接 (weld) (*)#

此元素创建焊接等式约束。它将两个身体相互连接,去除它们之间的所有相对自由度(当然是“软连接”,像 MuJoCo 中的所有其他约束一样)。这两个身体不需要彼此靠近。约束求解器强制执行的相对身体位置和方向是模型定义时的位置和方向。请注意,也可以通过将一个身体定义为另一个身体的子身体,并且子身体中不包含任何关节元素来刚性地将两个身体焊接在一起。焊接约束可以通过以下两种方式之一指定:

  • 使用 body1(以及可选的 anchorrelposebody2)。使用此规格时,假定约束在模型定义的配置下得到满足。

  • site1site2(两者均必需)。使用此规格时,无论两个站点的默认配置位置如何,约束都会使它们的坐标系对齐。此模型 显示了此规格的一个示例。

name, class, active, solref, solimp

连接 (connect) 元素中的相同。

body1: 字符串,可选

参与约束的第一个身体的名称。必须指定此属性和,或者必须指定 site1site2

body2: 字符串,可选

第二个身体的名称。如果省略此属性,第二个身体是世界身体。将一个身体焊接到世界,并在运行时更改 mjData.eq_active 的相应分量,可用于临时固定身体。

relpose: 实数(7),“0 1 0 0 0 0 0”

此属性指定 body2 相对于 body1 的相对姿态(三维位置后跟四维四元数方向)。如果四元数部分(即向量的最后 4 个分量)全部为零,如默认设置所示,则忽略此属性,并且相对姿态为模型参考姿态 qpos0 中对应的姿态。不寻常的默认值是因为所有等式约束类型共享其数值参数的相同默认值。

anchor: 实数(3),“0 0 0”

相对于 body2 的焊接点坐标。如果未指定 relpose,则此参数的含义与连接约束相同,只是它是相对于 body2 的。如果指定了 relpose,body1 将使用该姿态计算其锚点。

site1: 字符串,可选

属于参与约束的第一个身体的站点的名称。指定时,也必须指定 site2。(site1, site2) 规格是基于身体规格的更灵活替代方案,并且在两个方面有所不同。首先,站点在默认配置下不需要重叠;如果它们不重叠,模拟开始时站点将“迅速靠拢 (snap together)”。其次,在运行时更改 mjModel.site_posmjModel.site_quat 中的站点位置和方向将正确更改约束的位置和方向(即,使用此语义时,mjModel.eq_data 的内容无效,扭矩比例 (torquescale) 除外)。

site2: 字符串,可选

属于参与约束的第二个身体的站点的名称。指定时,也必须指定 site1。有关更多详细信息,请参阅 site1 的描述。

torquescale: 实数,“1”

一个常数,用于缩放角残差(角约束违反量)。概念上单位是 \(\textrm{扭矩}/\textrm{力}=\textrm{长度}\)。直观地讲,此系数定义了焊接对旋转位移与平移位移的“重视”程度。将此值设为 0 会使 焊接 (weld) 的行为类似于 连接 (connect) 约束。请注意,此值的单位是长度,因此可以理解如下。想象焊接是由一块将两个身体粘在一起的平整胶水实现的,torquescale 可以解释为这块胶水层的直径。

equality/关节 (joint) (*)#

此元素约束一个关节的位置或角度为另一个关节的四次多项式。只能使用标量关节类型(滑动和铰链)。

name, class, active, solref, solimp

连接 (connect) 元素中的相同。

joint1: 字符串,必需

第一个关节的名称。

joint2: 字符串,可选

第二个关节的名称。如果省略此属性,第一个关节被固定为一个常数。

polycoef: 实数(5),“0 1 0 0 0”

四次多项式的系数 \(a_0 \ldots a_4\)。如果 joint1joint2 的关节值分别为 \(y\)\(x\),并且它们的参考位置(对应于初始模型配置中的关节值)为 \(y_0\)\(x_0\),则约束为:

\[y-y_0 = a_0 + a_1(x-x_0) + a_2(x-x_0)^2 + a_3(x-x_0)^3 + a_4(x-x-0)^4 \]

省略 joint2 等同于设置 \(x = x_0\),在这种情况下约束为 \(y = y_0 + a_0\)

equality/肌腱 (tendon) (*)#

此元素约束一个肌腱的长度为另一个肌腱的四次多项式。

name, class, active, solref, solimp

连接 (connect) 元素中的相同。

tendon1: 字符串,必需

第一个肌腱的名称。

tendon2: 字符串,可选

第二个肌腱的名称。如果省略此属性,第一个肌腱被固定为一个常数。

polycoef: 实数(5),“0 1 0 0 0”

与上面的 equality/joint 元素中的相同,但应用于肌腱长度而非关节位置。

equality/flex (*)#

此元素约束指定 flex 所有边的长度为其在初始模型配置中的相应长度。通过这种方式,边被用于维持可变形实体的形状。请注意,所有其他等式约束类型都添加固定数量的标量约束,而此元素添加的标量约束数量等于指定 flex 中的边数。

name, class, active, solref, solimp

连接 (connect) 元素中的相同。

flex: 字符串,必需

正在被约束其边的 flex 的名称。

equality/距离 (distance) (*)#

距离等式约束已在 MuJoCo 2.2.2 版本中移除。如果您使用的是早期版本,请切换到相应版本的文档。

肌腱 (tendon) (*)#

肌腱定义的分组元素。固定肌腱的属性是空间肌腱属性的子集,因此我们只在空间肌腱下文档化一次。肌腱可用于施加长度限制,模拟弹簧力、阻尼力和干摩擦力,以及将执行器附加到其上。在等式约束中使用时,肌腱还可以表示不同形式的机械耦合。

tendon/空间肌腱 (spatial) (*)#

_images/tendon.png

此元素创建空间肌腱,它是穿过指定中间点并绕过指定障碍物几何体的最短路径。路径上的对象由下面的子元素 站点 (site)几何体 (geom) 定义。还可以定义 滑轮 (pulleys),将路径分成多个分支。肌腱路径的每个分支必须以站点开始和结束,并且如果它有多个障碍物几何体,它们必须由站点分隔 - 以避免在肌腱级别需要迭代求解器。此示例展示了一个多分支肌腱作为手指伸肌的作用,带有配重而非执行器:tendon.xml

第二种绕法是肌腱被约束穿过几何体,而不是绕过它。当指定了一个 sidesite 并且其位置在障碍物几何体的体积内部时,此功能会自动启用。

可视化:肌腱路径如下所示进行可视化,遵循下面的 宽度 (width)材质 (material)RGBA (rgba) 属性。对于未驱动的 2 点肌腱,如果其 范围 (range)弹簧长度 (springlength) 的形式为 [0 X](X 为正),则使用一种特殊的可视化方式。这种肌腱就像一根绳索,只有在拉伸时才施加力。因此,当未拉伸时,它们被绘制成长度为 X 的悬链线,如 此示例模型 右侧片段所示。

name: string, 可选

肌腱的名称。

class: string, 可选

用于设置未指定属性的默认类。

group: int, “0”

肌腱所属的整数组。此属性可用于自定义标签。可视化器也使用它来启用或禁用整组肌腱的渲染。

limited: [false, true, auto], “auto”

如果此属性设置为“true”,约束求解器将强制执行下方 range 属性定义的长度限制。如果此属性设置为“auto”,并且在 编译器 (compiler) 中设置了 autolimits,则如果定义了 range,将启用长度限制。

actuatorfrclimited: [false, true, auto], “auto”

此属性指定作用在肌腱上的执行器力是否应被钳制。有关详细信息,请参阅 力限制 (Force limits)。此属性与 actuatorfrcrange 属性相互作用。如果此属性为“false”,则禁用执行器力钳制。如果为“true”,则启用执行器力钳制。如果此属性为“auto”,并且在 编译器 (compiler) 中设置了 autolimits,则如果定义了 actuatorfrcrange 且未明确将此属性设置为“true”,将启用执行器力钳制。

range: real(2), “0 0”

允许的肌腱长度范围。未指定 limited 同时设置此属性是错误的,除非在 编译器 (compiler) 中设置了 autolimits

actuatorfrcrange: real(2), “0 0”

钳制作用在此肌腱上的总执行器力的范围。有关详细信息,请参阅 力限制 (Force limits)。编译器要求下界非正,上界非负。
如果 compiler-autolimits 为“false”,则设置此属性而不指定 actuatorfrclimited 是一个错误。

solreflimit, solimplimit

模拟肌腱限制的约束求解器参数。请参阅 求解器参数 (Solver parameters)

solreffriction, solimpfriction

模拟肌腱中干摩擦的约束求解器参数。请参阅 求解器参数 (Solver parameters)

margin: real, “0”

当肌腱长度与指定范围的任一限值之差的绝对值小于此 margin 时,限值约束变为活动状态。与接触类似,margin 参数从范围限值与肌腱长度之间的差值中减去。当约束处于活动状态时,生成的约束距离始终为负。此量用于计算作为距离函数的约束阻抗,如 求解器参数 (Solver parameters) 中所述。

frictionloss: real, “0”

干摩擦引起的摩擦损失。要启用摩擦损失,请将此属性设置为正值。

width: 实数,“0.003”

空间肌腱横截面积的半径,用于渲染。绕过几何体障碍物的肌腱部分以减小的宽度渲染。

material: string, 可选

用于设置肌腱外观的材质。

rgba: real(4), “0.5 0.5 0.5 1”

肌腱的颜色和透明度。当此值与内部默认值不同时,它会覆盖相应的材质属性。

springlength: 实数(2),“-1 -1”

弹簧静止位置,可以取一个或两个值。如果给出一个值,它对应于肌腱在静止时的长度。如果是 -1,肌腱静止长度由 mjModel.qpos0 中的模型参考配置确定。
请注意,默认值 -1 调用自动长度计算,它是针对 空间 (spatial) 肌腱设计的,后者只能具有非负长度。为了将 固定 (fixed) 肌腱的 springlength 设置为 -1,请使用接近的值,例如 -0.99999
如果给出两个非递减值,它们定义一个 死区 (dead-band) 范围。如果肌腱长度介于两个值之间,力为 0。如果超出此范围,力的行为类似于普通弹簧,静止点对应于最近的 springlength 值。死区可用于定义其限制由弹簧而非约束强制执行的肌腱。

stiffness: real, “0”

刚度系数。正值会产生沿肌腱作用的弹簧力(位置的线性函数)。

damping: real, “0”

阻尼系数。正值会产生沿肌腱作用的阻尼力(速度的线性函数)。与通过欧拉方法隐式积分的关节阻尼不同,肌腱阻尼不是隐式积分的,因此如果可能,应使用关节阻尼。

_images/tendon_armature.gif _images/tendon_armature_dark.gif
armature: real, “0”

与肌腱长度变化相关的惯量。将此属性设置为正值 \(m\) 会增加一个动能项 \(\frac{1}{2}mv^2\),其中 \(v\) 是肌腱速度。在线性执行器中包含旋转元件或线性液压执行器中流体惯性运动时,肌腱惯量在建模 电枢 (armature) 惯量时最有价值。在图示中,我们比较()一个 3-dof 系统,其“肌腱”通过旋转关节和带有 电枢 (armature) 的滑动关节实现,并通过 连接 (connect) 约束连接到世界;以及()一个等效的 1-dof 模型,该模型具有带电枢的肌腱。与关节 电枢 (armature) 类似,此附加惯量仅与肌腱长度变化相关,不会影响移动的固定长度肌腱的动力学。由于肌腱雅可比矩阵 \(J\) 取决于位置,肌腱电枢会导致一个附加的偏置力项 \(c = m J \dot{J}^T \dot{q}\)

user: 实数(nuser_tendon),“0 0 …”

参见 用户参数

spatial/站点 (site) (*)#

此属性指定肌腱路径必须穿过的站点。回顾一下,站点是刚性地附加到身体上的。

site: 字符串,必需

肌腱必须穿过的站点的名称。

spatial/几何体 (geom) (*)#

此元素指定作为肌腱路径障碍物的几何体。如果最短路径不触碰几何体,则它没有影响;否则,路径会绕着几何体的表面缠绕。缠绕是解析计算的,这就是为什么我们在此处允许的几何体类型仅限于球体和圆柱体。对于肌腱缠绕目的,后者被视为具有无限长度。如果定义了 sidesite 并且其位置在障碍物几何体的体积内部,则肌腱被约束穿过几何体内部。

geom: 字符串,必需

作为肌腱路径障碍物的几何体的名称。在此处只能引用球体和圆柱体几何体。

sidesite: 字符串,可选

为防止肌腱路径随着模型配置变化从几何体的一侧突然切换到另一侧,用户可以定义几何体的首选“侧”。在运行时,会自动选择更靠近指定站点的缠绕方式。在实践中通常需要指定一个 side site。如果 side site 在几何体内部,肌腱被约束穿过几何体内部。

spatial/滑轮 (pulley) (*)#

此元素在肌腱路径中开始一个新的分支。分支不需要在空间上连接。与“计算”章节的 驱动模型 (Actuation model) 部分描述的传动类似,影响模拟的量是肌腱长度及其相对于关节位置的梯度。如果空间肌腱有多个分支,每个分支的长度除以启动该分支的滑轮元素的 divisor 属性值,然后相加以获得总肌腱长度。这就是为什么分支之间的空间关系与模拟无关。上面的 tendon.xml 示例说明了滑轮的使用。

divisor: 实数,必需

由滑轮元素启动的肌腱分支的长度除以此处指定的值。对于将单个分支分成两个平行分支的物理滑轮,共同分支的 divisor 值为 1,滑轮后的两个分支的 divisor 值为 2。如果其中一个分支被另一个滑轮进一步分割,每个新分支的 divisor 值将为 4,依此类推。请注意,在 MJCF 中,每个分支都以滑轮开始,因此一个物理滑轮用两个 MJCF 滑轮建模。如果肌腱路径中不包含滑轮元素,则第一个也是唯一一个分支的 divisor 值为 1。

tendon/固定肌腱 (fixed) (*)#

此元素创建一个抽象肌腱,其长度定义为关节位置的线性组合。回顾一下,肌腱长度及其梯度是模拟所需的唯一量。因此,我们可以定义关节位置的任何标量函数,称之为“肌腱”,并将其插入 MuJoCo。目前,唯一的此类函数是固定的线性组合。固定肌腱的属性是空间肌腱属性的子集,并且与上面具有相同的含义。

name, class, group, limited, range, solreflimit, solimplimit, solreffriction, solimpfriction, frictionloss, margin, springlength, stiffness, damping, user

空间 (spatial) 元素中的相同。

fixed/关节 (joint) (*)#

此元素将关节添加到固定肌腱长度的计算中。每个包含关节的位置或角度乘以相应的 coef 值,然后相加得到肌腱长度。

joint: 字符串,必需

要添加到固定肌腱中的关节名称。在此处只能引用标量关节(滑动和铰链)。

coef: 实数,必需

乘以指定关节位置或角度的标量系数。

执行器 (actuator) (*)#

这是一个执行器定义的分组元素。回顾一下“计算”章节中 MuJoCo 的 驱动模型 (Actuation model) 的讨论,以及本章前面讨论的 执行器快捷方式 (Actuator shortcuts)。下面所有与执行器相关的元素的前 13 个属性是相同的,因此我们只在 通用 (general) 执行器下文档化一次。

actuator/通用 (general) (*)#

此元素创建一个通用执行器,提供对所有执行器组件的完全访问,并允许用户独立指定它们。

name: string, 可选

元素名称。请参阅 元素命名 (Naming elements)

class: string, 可选

活动默认设置类。请参阅 默认设置 (Default settings)

group: int, “0”

执行器所属的整数组。此属性可用于自定义标签。可视化器也使用它来启用或禁用整组执行器的渲染。

ctrllimited: [假,真,自动],“自动”

如果为 true,此执行器的控制输入在运行时会自动钳制到 ctrlrange。如果为 false,禁用控制输入钳制。如果为“auto”并且在 编译器 (compiler) 中设置了 autolimits,则如果定义了 ctrlrange 且未明确将此属性设置为“true”,控制钳制将自动设置为 true。请注意,控制输入钳制也可以通过 option/flagclampctrl 属性全局禁用。

forcelimited: [假,真,自动],“自动”

如果为 true,此执行器的力输出在运行时会自动钳制到 forcerange。如果为 false,禁用力钳制。如果为“auto”并且在 编译器 (compiler) 中设置了 autolimits,则如果定义了 forcerange 且未明确将此属性设置为“true”,力钳制将自动设置为 true。

actlimited: [假,真,自动],“自动”

如果为 true,与此执行器相关的内部状态(激活)在运行时会自动钳制到 actrange。如果为 false,禁用激活钳制。如果为“auto”并且在 编译器 (compiler) 中设置了 autolimits,则如果定义了 actrange 且未明确将此属性设置为“true”,激活钳制将自动设置为 true。有关更多详细信息,请参阅 激活钳制 (Activation clamping) 部分。

ctrlrange: 实数(2),“0 0”

钳制控制输入的范围。第一个值必须小于第二个值。
如果在 编译器 (compiler)autolimits 为“false”,则未指定 ctrllimited 同时设置此属性是错误的。

forcerange: 实数(2),“0 0”

钳制力输出的范围。第一个值必须不大于第二个值。
如果在 编译器 (compiler)autolimits 为“false”,则未指定 forcelimited 同时设置此属性是错误的。

actrange: 实数(2),“0 0”

钳制激活状态的范围。第一个值必须不大于第二个值。有关更多详细信息,请参阅 激活钳制 (Activation clamping) 部分。
如果在 编译器 (compiler)autolimits 为“false”,则未指定 actlimited 同时设置此属性是错误的。

lengthrange: 实数(2),“0 0”

执行器传动的可行长度范围。参见长度范围

gear: real(6), “1 0 0 0 0 0”

此属性按比例缩放所有传动类型的执行器的长度(以及随之而来的力臂、速度和力)。它不同于力生成机制中的增益,因为增益只缩放力的输出,不影响长度、力臂和速度。对于标量传动的执行器,仅使用此向量的第一个元素。其余元素用于 joint、jointinparent 和 site 传动,其中此属性用于指定 3D 力和扭矩轴。

cranklength: real, “0”

仅用于滑块曲柄传动类型。指定连杆的长度。当存在滑块曲柄传动时,编译器要求此值为正。

joint: string, optional

此属性以及接下来的四个属性决定了执行器传动的类型。它们都是可选的,且必须指定其中恰好一个。如果指定了此属性,执行器将作用于给定的关节。对于 hingeslide 关节,执行器长度等于关节位置/角度乘以 gear 的第一个元素。对于 ball 关节,gear 的前三个元素定义了子框架中执行器产生扭矩绕行的 3D 旋转轴。执行器长度定义为此 gear 轴与关节四元数的角轴表示之间的点积,如果 gear 被归一化(通常按 gear 的范数缩放),则单位为弧度。请注意,总旋转超过 \(\pi\) 后,长度将回绕到 \(- \pi\),反之亦然。因此,用于 ball 关节的 position 伺服通常应使用更严格的限制以防止这种回绕。对于 free 关节,gear 定义了世界框架中的 3D 平移轴,后跟子框架中的 3D 旋转轴。执行器相对于指定的轴生成力和扭矩。free 关节的执行器长度定义为零(因此不应与 position 伺服一起使用)。

jointinparent: string, optional

与 joint 相同,但对于 ball 和 free 关节,由 gear 给定的 3D 旋转轴定义在父框架(对于 free 关节是世界框架)中,而不是子框架中。

site: string, optional

此传动可以在一个 site 上施加力和扭矩。gear 向量定义了一个 3D 平移轴,后跟一个 3D 旋转轴。两者都定义在 site 的框架中。这可用于建模喷射器和螺旋桨。效果类似于驱动 free 关节,除非定义了 refsite(见下文),否则执行器长度定义为零。与上面的 jointjointinparent 传动的一个区别是,这里的执行器作用于 site 而不是关节,但当 site 定义在自由浮动体框架原点时,这种区别就消失了。另一个区别是,对于 site 传动,平移轴和旋转轴都定义在局部坐标中。相比之下,对于 joint 传动,平移是全局的,旋转是局部的;对于 jointinparent 传动,平移和旋转都是全局的。

refsite: string, optional

使用 site 传动时,测量相对于 refsite 框架的平移和旋转。在这种情况下,执行器*确实*具有长度,并且可以使用 position 执行器直接控制末端执行器,参见 refsite.xml 示例模型。如上所述,长度是 gear 向量与框架差异的点积。因此,gear="0 1 0 0 0 0" 表示“site 在 refsite 框架中的 Y 偏移”,而 gear="0 0 0 0 0 1" 表示旋转“site 在 refsite 框架中的 Z 旋转”。建议使用归一化的 gear 向量,且非零元素仅出现在 gear 的前 3 个*或*后 3 个元素中,这样执行器长度将分别以长度单位或弧度为单位。与 ball 关节一样(参见上面的 joint),对于总角度超过 \(\pi\) 的旋转会回绕,因此建议使用更严格的限制。

body: 字符串,可选

此传动可在接触点处沿接触法线方向施加线性力。接触点集合是所有属于指定 body 的接触点。这可用于模拟壁虎和昆虫足部的自然主动粘附机制。执行器长度同样定义为零。更多信息,请参见下文的 adhesion 快捷方式。

tendon: string, optional

如果指定,执行器将作用于给定的肌腱。执行器长度等于肌腱长度乘以传动比。可以使用空间肌腱和固定肌腱。

cranksite: string, optional

如果指定,执行器将作用于一个滑块曲柄机构,该机构由执行器隐式确定(即,它不是独立的模型元素)。指定的 site 对应于连接曲柄和连杆的销。执行器长度等于滑块曲柄机构的位置乘以传动比。

slidersite: string, required for slider-crank transmission

仅用于滑块曲柄传动类型。指定的 site 是连接滑块和连杆的销。滑块沿着 slidersite 框架的 z 轴移动。因此,在运动学树中定义 site 时应按需定向;其方向无法在执行器定义中更改。

user: real(nuser_actuator), “0 … 0”

参见 用户参数

actdim: real, “-1”

激活状态的维度。默认值 -1 指示编译器根据 dyntype 设置维度。只有用户定义的激活动力学允许大于 1 的值,因为原生类型只需要维度为 0 或 1。对于大于 1 的激活维度,使用*最后一个元素*来生成力。

dyntype: [none, integrator, filter, filterexact, muscle, user], “none”

执行器的激活动力学类型。可用的动力学类型已在执行器模型部分描述。以下是该描述以略有不同记法(对应于相关的 mjModel 和 mjData 字段)的重复:

关键词

描述

none

无内部状态

integrator

act_dot = ctrl

integrator

act_dot = ctrl

filter

act_dot = (ctrl - act) / dynprm[0]

filterexact

类似于 filter,但采用精确积分

user

muscle

act_dot = mju_muscleDynamics(...)

user

关键词

描述

act_dot = mjcb_act_dyn(...)

gaintype: [fixed, affine, muscle, user], “fixed”

增益和偏置共同决定力生成机制的输出,目前假定其为仿射。正如执行器模型中所解释的,通用公式为:标量力 = gain_term * (act 或 ctrl) + bias_term。该公式在使用激活状态时使用激活状态,否则使用控制。关键词具有以下含义:

fixed

filterexact

gain_term = gainprm[0]

user

affine

gain_term = gain_prm[0] + gain_prm[1]*length + gain_prm[2]*velocity

muscle

关键词

描述

none

gain_term = mju_muscleGain(...)

增益和偏置共同决定力生成机制的输出,目前假定其为仿射。正如执行器模型中所解释的,通用公式为:标量力 = gain_term * (act 或 ctrl) + bias_term。该公式在使用激活状态时使用激活状态,否则使用控制。关键词具有以下含义:

user

filterexact

gain_term = mjcb_act_gain(...)

user

biastype: [none, affine, muscle, user], “none”

关键词具有以下含义:

none

bias_term = 0

affine

bias_term = biasprm[0] + biasprm[1]*length + biasprm[2]*velocity

muscle

bias_term = mju_muscleBias(...)

user

bias_term = mjcb_act_bias(...)

dynprm: real(10), “1 0 … 0”

激活动力学参数。内置的激活类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

dyntype

none

dynprm

1 0 0

gaintype

act_dot = mjcb_act_dyn(...)

gainprm

1 0 0

biastype

none

biasprm

0 0 0

biasprm: real(10), “0 … 0”

偏置参数。affine 偏置类型使用三个参数。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

actearly: [false, true], “false”

如果为 true,力计算将使用激活变量的下一个值,而不是当前值。设置此标志可以将控制和加速度之间的延迟减少一个时间步长。

actuator/motor (*)#

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

dyntype

此元素以及接下来的三个元素是前面讨论的执行器快捷方式。当遇到此类快捷方式时,解析器会创建一个general执行器,并将其 dynprm、gainprm 和 biasprm 属性设置为上面显示的内部默认值,无论任何默认设置如何。然后,它根据快捷方式调整 dyntype、gaintype 和 biastype,解析任何自定义属性(除通用属性外),并按此处解释的方式将其转换为常规属性(即 general 执行器类型的属性)。

dynprm

此元素创建一个直接驱动执行器。底层 general 属性设置如下:

gaintype

act_dot = mjcb_act_dyn(...)

gainprm

属性

biastype

增益和偏置共同决定力生成机制的输出,目前假定其为仿射。正如执行器模型中所解释的,通用公式为:标量力 = gain_term * (act 或 ctrl) + bias_term。该公式在使用激活状态时使用激活状态,否则使用控制。关键词具有以下含义:

biasprm

设置

此元素没有自定义属性。它只有通用属性,如下所示:

偏置参数。affine 偏置类型使用三个参数。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

actearly: [false, true], “false”

name, class, group, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, tendon, cranksite, slidersite, site, refsite, user

与 actuator/general 中的相同。

actuator/position (*)#

此元素创建一个带有可选一阶滤波器的位置伺服。底层 general 属性设置如下:

属性

设置

dyntype

none or filterexact

gaintype

fixed

biastype

affine

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

dyntype

none

dynprm

1 0 0

gaintype

act_dot = mjcb_act_dyn(...)

gainprm

dynprm

biastype

增益和偏置共同决定力生成机制的输出,目前假定其为仿射。正如执行器模型中所解释的,通用公式为:标量力 = gain_term * (act 或 ctrl) + bias_term。该公式在使用激活状态时使用激活状态,否则使用控制。关键词具有以下含义:

biasprm

timeconst 0 0

此元素没有自定义属性。它只有通用属性,如下所示:

偏置参数。affine 偏置类型使用三个参数。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

actearly: [false, true], “false”

gainprm

kp 0 0

biasprm

0 -kp -kv

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

dyntype

integrator

dynprm

1 0 0

gaintype

act_dot = mjcb_act_dyn(...)

gainprm

属性

biastype

增益和偏置共同决定力生成机制的输出,目前假定其为仿射。正如执行器模型中所解释的,通用公式为:标量力 = gain_term * (act 或 ctrl) + bias_term。该公式在使用激活状态时使用激活状态,否则使用控制。关键词具有以下含义:

biasprm

设置

actlimited

此元素除了通用属性外,还有一个自定义属性:

此元素没有自定义属性。它只有通用属性,如下所示:

kp: real, “1”

actearly: [false, true], “false”

name, class, group, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, tendon, cranksite, slidersite, site, refsite, user

与 actuator/general 中的相同。

actuator/position (*)#

此元素创建一个带有可选一阶滤波器的位置伺服。底层 general 属性设置如下:

属性

位置反馈增益。

gaintype

kv: real, “0”

执行器施加的阻尼。使用此属性时,建议使用 implicitfast 或 implicit 积分器

dampratio: real, “0”

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

dyntype

none

dynprm

1 0 0

gaintype

增益和偏置共同决定力生成机制的输出,目前假定其为仿射。正如执行器模型中所解释的,通用公式为:标量力 = gain_term * (act 或 ctrl) + bias_term。该公式在使用激活状态时使用激活状态,否则使用控制。关键词具有以下含义:

gainprm

timeconst 0 0

biastype

none

biasprm

0 0 0

ctrllimited

此元素除了通用属性外,还有一个自定义属性:

此元素没有自定义属性。它只有通用属性,如下所示:

偏置参数。affine 偏置类型使用三个参数。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

actearly: [false, true], “false”

gainprm

kp 0 0

执行器施加的阻尼,使用阻尼比单位。此属性与 kv 互斥,含义相似,但单位不是力/速度,而是 \(2 \sqrt{k_p \cdot m}\),对应于谐振子的阻尼比。值为 1 对应于*临界阻尼*振荡器,这通常会产生理想的行为。小于或大于 1 的值分别对应于欠阻尼和过阻尼振荡。质量 \(m\) 在参考配置 mjModel.qpos0 处计算,考虑了关节电枢。但是,未考虑受影响关节的被动阻尼摩擦损耗;如果它们不可忽略,可能需要小于 1 的 dampratio 值才能达到理想运动。使用此属性时,建议使用 implicitfast 或 implicit 积分器

timeconst: real, “0”

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

dyntype

integrator

dynprm

此元素创建一个直接驱动执行器。底层 general 属性设置如下:

gaintype

act_dot = mjcb_act_dyn(...)

gainprm

可选一阶滤波器的时间常数。如果大于零,则执行器使用 filterexact 动力学类型;如果为零(默认值),则不使用滤波器。

biastype

增益和偏置共同决定力生成机制的输出,目前假定其为仿射。正如执行器模型中所解释的,通用公式为:标量力 = gain_term * (act 或 ctrl) + bias_term。该公式在使用激活状态时使用激活状态,否则使用控制。关键词具有以下含义:

biasprm

inheritrange: real, “0”

自动设置执行器的 ctrlrange 以匹配传动目标的 range。默认值表示“禁用”。正值 Xctrlrange 设置在目标范围的中点周围,并按 X 缩放。例如,如果目标关节的 range[0, 1],则值 1.0ctrlrange 设置为 [0, 1];值 0.81.2ctrlrange 分别设置为 [0.1, 0.9][-0.1, 1.1]。小于 1 的值有助于避免触碰限制;大于 1 的值有助于在限制处保持控制能力(能够推动它们)。此属性与 ctrlrange 互斥,仅适用于定义了 range 的关节和肌腱传动。请注意,虽然 inheritrangeposition属性和default class中都可用,但保存的 XML 总是将其转换为执行器上的显式 ctrlrange

偏置参数。affine 偏置类型使用三个参数。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

actearly: [false, true], “false”

timeconst: 实数, “1”

actuator/velocity (*)#

此元素创建一个速度伺服。请注意,为了创建 PD 控制器,必须定义两个执行器:一个位置伺服和一个速度伺服。这是因为 MuJoCo 执行器是 SISO 的,而 PD 控制器接收两个控制输入(参考位置和参考速度)。使用此执行器时,建议使用 implicitfast 或 implicit 积分器。底层 general 属性设置如下:

属性

设置

dyntype

none

gaintype

fixed

biastype

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

dyntype

filterexact

dynprm

affine

gaintype

filterexact

gainprm

dynprm

biastype

filterexact

biasprm

0 0 0

gainprm

kv 0 0

actearly: [false, true], “false”

biasprm

0 0 -kv

kv: real, “1”

速度反馈增益。

actuator/intvelocity (*)#

此元素创建一个积分速度伺服。更多信息,请参见建模章节的激活限制部分。底层 general 属性设置如下:

属性

设置

dyntype

integrator

gaintype

fixed

biastype

none

dynprm

0 0 0

gainprm

1 0 0

biasprm

0 0 0

actearly

true

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

gainprm: real(10), “1 0 … 0”

增益参数。内置的增益类型(muscle 除外)仅使用第一个参数,但我们提供了额外的参数,以备用户回调实现更精细的模型。解析器不强制限制此数组的长度,因此用户可以输入所需的任意数量的参数。这些默认值与 muscle 执行器不兼容;参见下文的muscle

dyntype

none

dynprm

1 0 0

gaintype

act_dot = mjcb_act_dyn(...)

gainprm

此元素拥有通用属性的子集和两个自定义属性。

biastype

none

biasprm

0 0 0

name, class, group, ctrllimited, forcelimited, ctrlrange, forcerange, actrange, lengthrange, gear, cranklength, joint, jointinparent, tendon, cranksite, slidersite, site, refsite, user

body

ctrllimited

此元素除了通用属性外,还有一个自定义属性:

dampratio: real, “0”

参见position/dampratio

actearly: [false, true], “false”

body: 字符串,必需

inheritrange: real, “0”

position/inheritrange相同,但设置 actrange(其长度语义与传动目标相同)而不是 ctrlrange(其具有速度语义)。

actuator/damper (*)#

此元素是一个主动阻尼器,产生与速度和控制成比例的力:F = - kv * velocity * control,其中 kv 必须非负。ctrlrange 是必需的,且也必须非负。使用此执行器时,建议使用 implicitfast 或 implicit 积分器。底层 general 属性设置如下:

属性

plugin: string, 可选

插件标识符,用于隐式插件实例化。

instance: string, 可选

实例名称,用于显式插件实例化。

dyntype: [none, integrator, filter, filterexact, muscle, user], “none”

设置

actrange: 实数(2),“0 0”

dyntype

none

actearly: [false, true], “false”

gaintype

affine

biastype

none

dynprm

0 0 0

gainprm

site: 字符串,必需

0 0 -kv

biasprm

0 0 0

actuator/cylinder (*)#

0 0 0

gainprm

site: 字符串,必需

此元素适合用于建模气缸或液压缸。底层 general 属性设置如下:

属性

设置

0 0 0

gainprm

site: 字符串,必需

dyntype

filter

gaintype

0 0 0

gainprm

site: 字符串,必需

fixed

biastype

affine

actuator/cylinder (*)#

0 0 0

gainprm

site: 字符串,必需

dynprm

timeconst

gainprm

actuator/cylinder (*)#

0 0 0

gainprm

site: 字符串,必需

area 0 0

biasprm

bias(3)

0 0 0

gainprm

site: 字符串,必需

此元素除了通用属性外,还有四个自定义属性:

timeconst: real, “0.1”

激活动力学的时间常数。

0 0 0

gainprm

site: 字符串,必需

此元素除了通用属性外,还有四个自定义属性:

area: real, “1”

气缸的面积。此属性在内部用作执行器增益。

site: 字符串,必需

diameter: real, optional

除了 area,用户也可以指定 diameter。如果两者都指定,则 diameter 优先。

bias: real(3), “0 0 0”

0 0 0

gainprm

偏置参数,内部复制到 biasprm。

actuator/muscle (*)#

0 0 0

gainprm

joint: 字符串,必需

此元素用于建模肌肉执行器,如肌肉执行器部分所述。底层 general 属性设置如下:

属性

设置

0 0 0

gainprm

joint: 字符串,必需

dyntype

muscle

gaintype

0 0 0

gainprm

muscle

biastype

muscle

dynprm

0 0 0

gainprm

muscle

timeconst(2) tausmooth

gainprm

range(2), force, scale, lmin, lmax, vmax, fpmax, fvmax

0 0 0

gainprm

biasprm

same as gainprm

此元素除了通用属性外,还有九个自定义属性:

name, class, group, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, tendon, cranksite, slidersite, user

0 0 0

gainprm

biasprm

timeconst: real(2), “0.01 0.04”

激活和去激活动力学的时间常数。

tausmooth: real, “0”

0 0 0

gainprm

biasprm

激活和去激活时间常数之间平滑过渡的宽度。单位为 ctrl,必须非负。

range: real(2), “0.75 1.05”

肌肉的工作长度范围,以 L0 为单位。

0 0 0

gainprm

joint: 字符串,必需

force: real, “-1”

静止时的峰值主动力。如果此值为负,则峰值力会使用下面的 scale 属性自动确定。

scale: real, “200”

0 0 0

gainprm

muscle

如果 force 属性为负,则肌肉的峰值主动力设置为此值除以 mjModel.actuator_acc0。后者是在 qpos0 中执行器传动单元力引起的关节空间加速度向量的范数。换句话说,对于拉动更多重量的肌肉,缩放会产生更高的峰值力。

lmin: real, “0.5”

归一化 FLV 曲线的下限位置范围,以 L0 为单位。

0 0 0

gainprm

joint: 字符串,必需

lmax: real, “1.6”

归一化 FLV 曲线的上限位置范围,以 L0 为单位。

vmax: real, “1.5”

0 0 0

gainprm

joint: 字符串,必需

肌肉力降至零时的缩短速度,以 L0 每秒为单位。

fpmax: real, “1.3”

在 lmax 处产生的被动力,相对于峰值静止力。

0 0 0

gainprm

joint: 字符串,必需

fvmax: real, “1.2”

在饱和伸长速度下产生的主动力,相对于峰值静止力。

actuator/adhesion (*)#

0 0 0

gainprm

joint: 字符串,必需

此元素定义了一个主动粘附执行器,它在接触点处沿法线方向注入力,参见演示视频。视频中显示的模型可在此处找到,包含内嵌注释。传动目标是一个 body,粘附力被注入到涉及该 body 所属 geom 的所有接触点中。力在多个接触点之间平均分配。当不使用 gap 属性时,此执行器需要活动接触,并且不能在远距离施加力,更像壁虎和昆虫足部的主动粘附,而不是工业真空夹具。为了实现“远距离吸附”,将 body 的 geoms“膨胀”margin 距离,并添加相应的 gap,该 gap 仅在穿透 gap 距离后才激活接触点。这将在 geom 周围创建一个接触点被检测到但非活动的层,可用于施加粘附力。在上面的视频中,此类非活动接触点为蓝色,而活动接触点为橙色。粘附执行器的长度始终为 0。ctrlrange 是必需的,且也必须非负(不允许斥力)。底层 general 属性设置如下:

属性

设置

0 0 0

gainprm

joint: 字符串,必需

dyntype

none

gaintype

0 0 0

gainprm

muscle

fixed

gainprm

gain 0 0

0 0 0

gainprm

muscle

biastype

none

biasprm

0 0 0

gainprm

muscle

0 0 0

trntype

adhesion

0 0 0

gainprm

此元素拥有通用属性的子集和两个自定义属性。

name, class, group, forcelimited, ctrlrange, forcerange, user

body: string, required

执行器作用于所有涉及此 body 的 geoms 的接触点。

gain: real, “1”

粘附执行器的增益,以力为单位。执行器施加的总粘附力是控制值乘以增益。此力在涉及目标 body 所属 geom 的所有接触点之间平均分配。

actuator/plugin (?)#

将此执行器与引擎插件关联。plugin 或 instance 之一是必需的。

执行器的激活动力学类型。可用的动力学类型已在执行器模型部分描述。如果dyntype不是“none”,则会向执行器添加一个激活变量。此变量将添加在插件计算的任何激活状态之后(参见执行器插件激活)。

用于限制与此执行器的 dyntype 关联的激活状态的范围。限制不适用于插件计算的激活。第一个值必须不大于第二个值。更多详细信息,请参见激活限制部分。

0 0 0

gainprm

此元素拥有通用属性的子集和两个自定义属性。

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

body: string, required

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

gain: real, “1”

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

actuator/plugin (?)#

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

sensor (*)#

这是传感器定义的编组元素。它没有属性。所有传感器的输出连接在 mjData.sensordata 字段中,其大小为 mjModel.nsensordata。此数据不用于任何内部计算。

0 0 0

gainprm

此元素拥有通用属性的子集和两个自定义属性。

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

body: string, required

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

gain: real, “1”

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

actuator/plugin (?)#

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

除了使用下面的元素创建的传感器外,顶层函数mj_step会计算 mjData.cacc、mjData.cfrc_int 和 mjData.crfc_ext 这些对应于 body 加速度和相互作用力的量。其中一些量用于计算某些传感器(力、加速度等)的输出,但即使模型中没有定义此类传感器,这些量本身也是可能用户感兴趣的“特征”。

sensor/touch (*)#

0 0 0

gainprm

此元素拥有通用属性的子集和两个自定义属性。

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

body: string, required

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

gain: real, “1”

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

actuator/plugin (?)#

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

此元素创建一个触摸传感器。主动传感器区域由 site 定义。如果接触点落在 site 的体积内,并涉及连接到与 site 相同 body 的 geom,则相应的接触力会包含在传感器读数中。如果接触点落在传感器区域外,但法线射线与传感器区域相交,也会包含在内。需要此重投影功能,因为否则接触点可能从背面离开传感器区域(由于软接触)并导致错误的力读数。此传感器的输出是非负标量。它是通过累加所有包含接触点的(标量)法向力计算得出的。

此元素拥有通用属性的子集和两个自定义属性。

0 0 0

gainprm

此元素拥有通用属性的子集和两个自定义属性。

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

body: string, required

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

gain: real, “1”

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

actuator/plugin (?)#

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

name, noise, cutoff, user

参见传感器

0 0 0

gainprm

此元素拥有通用属性的子集和两个自定义属性。

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

body: string, required

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

gain: real, “1”

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

actuator/plugin (?)#

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

site: string, required

定义主动传感器区域的 Site。

0 0 0

gainprm

此元素拥有通用属性的子集和两个自定义属性。

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

body: string, required

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

gain: real, “1”

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

actuator/plugin (?)#

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

sensor/accelerometer (*)#

此元素创建一个 3 轴加速度计。传感器安装在一个 site 上,与 site 框架具有相同的位置和方向。此传感器输出三个数字,即 site 的线性加速度(包括重力),以局部坐标表示。

actuator/cylinder (*)#

0 0 0

gainprm

此元素拥有通用属性的子集和两个自定义属性。

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

body: string, required

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

模型中存在此传感器会在传感器计算期间触发对mj_rnePostConstraint的调用。

site: string, required

actuator/cylinder (*)#

0 0 0

gainprm

此元素拥有通用属性的子集和两个自定义属性。

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

body: string, required

name, class, group, actlimited, ctrllimited, forcelimited, ctrlrange, forcerange, lengthrange, gear, cranklength, joint, jointinparent, site, tendon, cranksite, slidersite, user, actdim, dynprm, actearly

传感器安装的 Site。加速度计居中并与 site 局部框架对齐。

sensor/velocimeter (*)#

0 0 0

gainprm

body: 字符串,必需

此元素创建一个 3 轴速度计。传感器安装在一个 site 上,与 site 框架具有相同的位置和方向。此传感器输出三个数字,即 site 的线性速度,以局部坐标表示。

site: string, required

传感器安装的 Site。速度计居中并与 site 局部框架对齐。

sensor/gyro (*)#

0 0 0

gainprm

body: 字符串,必需

此元素创建一个 3 轴速度计。传感器安装在一个 site 上,与 site 框架具有相同的位置和方向。此传感器输出三个数字,即 site 的线性速度,以局部坐标表示。

此元素创建一个 3 轴陀螺仪。传感器安装在一个 site 上,与 site 框架具有相同的位置和方向。此传感器输出三个数字,即 site 的角速度,以局部坐标表示。此传感器通常与安装在同一 site 的加速度计结合使用,以模拟惯性测量单元 (IMU)。

site: string, required

sensor/gyro (*)#

0 0 0

gainprm

body: 字符串,必需

此元素创建一个 3 轴速度计。传感器安装在一个 site 上,与 site 框架具有相同的位置和方向。此传感器输出三个数字,即 site 的线性速度,以局部坐标表示。

传感器安装的 Site。陀螺仪居中并与 site 局部框架对齐。

sensor/force (*)#

cutoff

此元素创建一个 3 轴力传感器。传感器输出三个数字,即子 body 和父 body 之间的相互作用力,在定义传感器的 site 框架中表示。约定是 site 连接到子 body,力从子指向父。这里的计算考虑了作用在系统上的所有力,包括接触力和外部扰动。使用此传感器通常需要创建一个焊接到其父 body 的虚拟 body(即没有 joint 元素)。

site: string, required

传感器安装的 Site。测量的相互作用力是定义 site 的 body 及其父 body 之间的力,并从子指向父。被建模的物理传感器当然也可以连接到父 body,在这种情况下,传感器数据将具有相反的符号。请注意,每个 body 都有唯一的父 body,但可以有多个子 body,这就是为什么我们在这一对中通过子 body 而不是父 body 定义此传感器的原因。

sensor/torque (*)#

此元素创建一个 3 轴扭矩传感器。这类似于上面的force传感器,但测量的是扭矩而不是力。

site: string, required

传感器安装的 Site。测量的相互作用扭矩是定义 site 的 body 及其父 body 之间的扭矩。

sensor/magnetometer (*)#

此元素创建一个磁力计。它测量传感器 site 位置处的磁通量,在传感器 site 框架中表示。输出是一个 3D 向量。

cutoff

site: string, required

传感器连接的 Site。

sensor/rangefinder (*)#

此元素创建一个测距仪。它测量沿传感器 site 的正 Z 轴定义的射线到最近的 geom 表面的距离。如果射线不与任何 geom 表面相交,传感器输出为 -1。如果射线原点在 geom 内部,表面仍然会被感知(但不是内部体积)。与传感器 site 连接到同一 body 的 geoms 被排除。不可见的 geoms,定义为 rgba(或其材质 rgba)alpha=0 的 geoms,也排除在外。但是请注意,通过禁用其 geom 组在可视化器中设置为不可见的 geoms 不会排除在外;这是因为传感器计算独立于可视化器。

此元素拥有通用属性的子集和两个自定义属性。

body1: 字符串,可选

name, noise, cutoff, user

body2: 字符串,可选

site: string, required

定义测距仪射线源和方向的 Site。

gainprm

sensor/camprojection (*)#

此元素创建一个相机投影传感器:目标 site 的位置,投影到相机图像中,以像素坐标表示。像素原点 (0, 0) 位于左上角。值不进行裁剪,因此落在相机图像外的目标将超出像素范围限制。此外,相机后面的点也会投影到图像上,因此如果需要,用户需要过滤掉这些点。这可以通过使用参考框架为相机的framepos传感器来实现:z 坐标中的负/正值分别表示在相机平面前方/后方的位置。

cutoff

此元素拥有通用属性的子集和两个自定义属性。

传感器连接的 Site。

sensor/rangefinder (*)#

此元素创建一个测距仪。它测量沿传感器 site 的正 Z 轴定义的射线到最近的 geom 表面的距离。如果射线不与任何 geom 表面相交,传感器输出为 -1。如果射线原点在 geom 内部,表面仍然会被感知(但不是内部体积)。与传感器 site 连接到同一 body 的 geoms 被排除。不可见的 geoms,定义为 rgba(或其材质 rgba)alpha=0 的 geoms,也排除在外。但是请注意,通过禁用其 geom 组在可视化器中设置为不可见的 geoms 不会排除在外;这是因为传感器计算独立于可视化器。

此元素拥有通用属性的子集和两个自定义属性。

body1: 字符串,可选

name, noise, cutoff, user

body2: 字符串,可选

site: string, required

定义测距仪射线源和方向的 Site。

gainprm

name, noise, cutoff, user

site: string, required

cutoff

投影到相机图像上的 Site。

传感器连接的 Site。

sensor/rangefinder (*)#

此元素创建一个测距仪。它测量沿传感器 site 的正 Z 轴定义的射线到最近的 geom 表面的距离。如果射线不与任何 geom 表面相交,传感器输出为 -1。如果射线原点在 geom 内部,表面仍然会被感知(但不是内部体积)。与传感器 site 连接到同一 body 的 geoms 被排除。不可见的 geoms,定义为 rgba(或其材质 rgba)alpha=0 的 geoms,也排除在外。但是请注意,通过禁用其 geom 组在可视化器中设置为不可见的 geoms 不会排除在外;这是因为传感器计算独立于可视化器。

此元素拥有通用属性的子集和两个自定义属性。

body1: 字符串,可选

name, noise, cutoff, user

body2: 字符串,可选

site: string, required

定义测距仪射线源和方向的 Site。

gainprm

camera: string, required

用于投影的相机,其resolution属性必须为正。

0 0 0

gainprm

sensor/jointpos (*)#

此元素和其余传感器元素不涉及传感器特定的计算。它们只是将已计算的量复制到 mjData.sensordata 数组中。此元素创建一个关节位置或角度传感器。它可以连接到标量关节(slide 或 hinge)。其输出是标量。

0 0 0

gainprm

此元素拥有通用属性的子集和两个自定义属性。

name, noise, cutoff, user

0 0 0

gainprm

joint: string, required

将要感知的关节位置或角度。此处只能引用标量关节。传感器输出从 mjData.qpos 复制。

sensor/jointvel (*)#

0 0 0

gainprm

此元素创建一个关节速度传感器。它可以连接到标量关节(slide 或 hinge)。其输出是标量。

此元素拥有通用属性的子集和两个自定义属性。

name, noise, cutoff, user

joint: string, required

将要感知的关节速度。此处只能引用标量关节。传感器输出从 mjData.qvel 复制。

sensor/tendonpos (*)#

此元素创建一个肌腱长度传感器。它可以连接到空间肌腱和固定肌腱。其输出是标量。

此元素拥有通用属性的子集和两个自定义属性。

name, noise, cutoff, user

tendon: string, required

将要感知的肌腱长度。传感器输出从 mjData.ten_length 复制。

sensor/tendonvel (*)#

plugin: string, 可选

插件标识符,用于隐式插件实例化。

instance: string, 可选

实例名称,用于显式插件实例化。

此元素创建一个肌腱速度传感器。它可以连接到空间肌腱和固定肌腱。其输出是标量。

gainprm

此元素拥有通用属性的子集和两个自定义属性。

name, noise, cutoff, user

tendon: string, required

将要感知的肌腱速度。传感器输出从 mjData.ten_velocity 复制。

name: string, 可选

sensor/actuatorpos (*)#

此元素创建一个执行器长度传感器。回想一下,每个执行器都有一个具有长度的传动。此传感器可以连接到任何执行器。其输出是标量。

此元素拥有通用属性的子集和两个自定义属性。

name, noise, cutoff, user

actuator: string, required

将要感知其传动长度的执行器。传感器输出从 mjData.actuator_length 复制。

关节速度向量,当仿真状态设置为此关键帧时,会复制到 mjData.qvel 中。

act: 实数(mjModel.na), “0 0 …”

执行器激活向量,当仿真状态设置为此关键帧时,会复制到 mjData.act 中。

ctrl: 实数(mjModel.nu), “0 0 …”

控制向量,当仿真状态设置为此关键帧时,会复制到 mjData.ctrl 中。

mpos: 实数(3*mjModel.nmocap), 默认值 = mjModel.body_pos

动捕体位置向量,当仿真状态设置为此关键帧时,会复制到 mjData.mocap_pos 中。

mquat: 实数(4*mjModel.nmocap), 默认值 = mjModel.body_quat

动捕体四元数向量,当仿真状态设置为此关键帧时,会复制到 mjData.mocap_quat 中。

visual (*)#

此元素与 mjModel 中 mjModel.vis 字段包含的低级结构 mjVisual 一一对应。此处的设置会影响可视化器,更准确地说,会影响产生几何实体列表供后续渲染的可视化抽象阶段。此处的设置为全局设置,与元素特定的可视化设置形成对比。全局设置和元素特定设置涉及不重叠的属性。一些全局设置影响无法按元素设置的几何图元三角剖分等属性。其他全局设置影响装饰对象的属性,即,不对应于模型元素的接触点和力箭头等对象。可视化设置按语义分组为几个小节。
此元素是文件包含机制的良好候选。可以创建一个包含协调的可视化设置(对应于一个“主题”)的 XML 文件,然后将此文件包含到多个模型中。

visual/global (?)#

尽管 mjVisual 中的所有设置都是全局的,但此处的设置无法归入任何其他小节。因此,这实际上是一个杂项小节。

orthographic: [false, true], “false”

自由相机是使用透视投影(默认)还是正交投影。设置此属性会更改global/fovy属性的语义,详见下文。

fovy: real, “45”

此属性指定自由相机的垂直视野,即,即使模型中未显式定义相机,该相机也始终在可视化器中可用。如果相机使用透视投影,则视野以度为单位表示,与全局compiler/angle设置无关。如果相机使用正交投影,则视野以长度单位表示;请注意,在这种情况下,默认值 45 对于大多数场景来说太大,可能应该减小。无论哪种情况,都会根据窗口大小和垂直视野自动计算水平视野。相同的约定也适用于camera/fovy属性。

ipd: real, “0.068”

此属性指定自由相机的瞳距。它仅影响立体模式下的渲染。左右视点会沿相应方向偏移此值的一半。

azimuth: 实数, “90”

此属性指定自由相机围绕垂直 z 轴的初始方位角,以度为单位。值为 0 对应于沿正 x 方向看,而默认值 90 对应于沿正 y 方向看。凝视点本身由statistic/center属性指定,而与凝视点的距离由statistic/extent属性控制。

elevation: 实数, “-45”

此属性指定自由相机相对于凝视点的初始仰角。请注意,由于这是围绕平行于相机 X 轴(像素空间中的右侧)的向量进行的旋转,因此负数对应于将相机从水平面向上移动,反之亦然。凝视点本身由statistic/center属性指定,而与凝视点的距离由statistic/extent属性控制。

linewidth: 实数, “1”

此属性指定 OpenGL 意义上的线宽。它影响线框模式下的渲染。

glow: 实数, “0.3”

此属性的值会添加到附加到选定身体的所有几何体的发射系数中。因此,选定的身体会显得发光。

realtime: 实数, “1”

此值设置模型加载到 simulate 中时的初始实时因子。1: 实时。小于 1: 慢于实时。必须大于 0。

offwidth: 整数, “640”

此属性和下一个属性指定离屏 OpenGL 渲染缓冲区的大小(以像素为单位)。此属性指定缓冲区的宽度。缓冲区的大小也可以在运行时调整,但在 XML 中设置通常更方便。

offheight: 整数, “480”

此属性指定 OpenGL 离屏渲染缓冲区的高度(以像素为单位)。

ellipsoidinertia: [false, true], “false”

此属性指定等效惯量如何可视化。“false”:使用盒子,“true”:使用椭球体。

bvactive: [false, true], “true”

此属性指定碰撞和光线投射代码是否应将边界体积层次结构中的元素标记为相交,以进行可视化。将此属性设置为“false”可以加快具有高分辨率网格的模型的仿真速度。

visual/quality (?)#

此元素指定影响渲染质量的设置。较大的值会带来更高的质量,但也可能导致速度变慢。请注意,simulate.cc 会显示每秒帧数 (FPS)。目标 FPS 为 60 Hz;如果可视化器中显示的数字明显低于此值,则表示 GPU 过载,应在某种程度上简化可视化。

shadowsize: 整数, “4096”

此属性指定用于阴影映射的方形纹理的大小。值越高,阴影越平滑。light 可以投射阴影的区域大小也会影响平滑度,因此应同时调整这些设置。此处的默认值有些保守。大多数现代 GPU 能够处理大得多的纹理而不会减慢速度。

offsamples: 整数, “4”

此属性指定离屏渲染的多重采样数。值越大,抗锯齿效果越好,但也可能减慢 GPU 速度。将其设置为 0 可禁用多重采样。请注意,此属性仅影响离屏渲染。对于常规窗口渲染,多重采样在首次创建窗口的 OpenGL 上下文时以依赖于操作系统的方式指定,无法在 MuJoCo 内部更改。
渲染分割图像时,会自动禁用多重采样,以免平均分割索引。但是,某些渲染后端会忽略自动禁用。如果您的分割图像包含错误的索引,请尝试手动将此属性设置为 0。

numslices: 整数, “28”

此属性以及接下来的三个属性指定几何图元内部生成网格的密度。此类网格仅用于渲染,而碰撞检测器使用底层的解析表面。此值作为 GLU 中使用的“slices”参数传递给各种可视化器函数。它指定围绕 Z 轴的细分数,类似于经线。

numstacks: 整数, “16”

此属性的值作为 GLU 中使用的“stacks”参数传递给各种可视化函数。它指定沿 Z 轴的细分数,类似于纬线。

numquads: 整数, “4”

此属性指定用于渲染盒子面、自动生成的平面(与具有相同功能的元素特定属性的几何平面不同)以及高度场地侧面的矩形数量。尽管将此值设置为 1 可以获得几何上正确的渲染,但较大的值会获得更好的光照效果,因为我们使用逐顶点光照(而不是逐片段光照)。

visual/headlight (?)#

此元素用于调整头灯的属性。除了模型中显式定义的任何光源外,始终存在内置头灯。头灯是一种定向光源,位于当前相机中心并指向相机正在看的方向。它不投射阴影(反正也看不见)。请注意,光源是叠加的,因此如果模型中定义了显式光源,头灯的强度通常需要降低。

ambient: 实数(3), “0.1 0.1 0.1”

OpenGL 意义上的头灯环境光分量。此处和接下来两个属性中的 Alpha 分量设置为 1,无法调整。

diffuse: 实数(3), “0.4 0.4 0.4”

OpenGL 意义上的头灯漫反射分量。

specular: 实数(3), “0.5 0.5 0.5”

OpenGL 意义上的头灯镜面反射分量。

active: 整数, “1”

此属性启用和禁用头灯。值为 0 表示禁用,任何其他值表示启用。

visual/map (?)#

此元素用于指定影响可视化和内置鼠标扰动的缩放量。与下一元素中专门用于空间范围的缩放量不同,此处的量是杂项。

stiffness: 实数, “100”

此属性控制鼠标扰动的强度。内部扰动机制模拟具有临界阻尼、单位质量和此处给定的刚度的质量-弹簧-阻尼器。值越大,意味着选定身体与鼠标控制目标之间发生相同位移时施加的力越大。

stiffnessrot: 实数, “500”

与上文相同,但适用于旋转扰动而非平移扰动。根据经验,旋转刚度需要更大才能使旋转鼠标扰动产生效果。

force: 实数, “0.005”

此属性控制接触力和扰动力的可视化。渲染力向量的长度等于力的大小乘以该属性的值,再除以模型的平均身体质量(参见statistic元素)。

torque: 实数, “0.1”

与上文相同,但控制接触扭矩和扰动扭矩的渲染而不是力(当前已禁用)。

alpha: 实数, “0.3”

在可视化器中开启透明度时,附加到所有移动身体的几何体将变得更透明。这是通过将几何体特定的 Alpha 值乘以该值来实现的。

fogstart: 实数, “3”

可视化器可以模拟 OpenGL 意义上的线性雾。雾的起始位置是模型范围(参见statistic元素)乘以该属性的值。

fogend: 实数, “10”

雾的结束位置是模型范围乘以该属性的值。

znear: 实数, “0.01”

此属性和下一个属性确定 OpenGL 投影的裁剪平面。近裁剪平面尤为重要:设置得太近会导致深度缓冲区分辨率损失(通常很严重),而设置得太远会导致感兴趣的对象被裁剪,从而无法放大。到近裁剪平面的距离是模型extent乘以该属性的值。必须是严格正数。

zfar: 实数, “50”

到远裁剪平面的距离是模型extent乘以该属性的值。

haze: 实数, “0.3”

地平线距离中被雾霾覆盖的比例(当启用雾霾渲染且存在天空盒时)。

shadowclip: 实数, “1”

如上所述,阴影质量取决于阴影纹理的大小以及给定光源可以投射阴影的区域。对于定向光源,如果不对其进行限制,区域将是无限的。此属性指定限制,即模型范围的 +/- 值乘以当前值。这些限制定义了一个垂直于光源方向的平面上的正方形。如果阴影穿过此虚拟正方形的边界,它将突然消失,露出正方形的边缘。

shadowscale: 实数, “0.6”

此属性的作用与上一个属性类似,但适用于聚光灯而非定向光源。聚光灯有一个截止角,内部限制为 80 度。然而,这个角度通常太大,无法获得高质量阴影,因此需要将阴影限制在较小的锥形范围内。可以投射阴影的锥形角度是光源截止角乘以当前值。

actuatortendon: 实数, “2”

用于渲染连接到肌腱的执行器时,执行器宽度与肌腱宽度的比率。

visual/scale (?)#

此元素中的设置控制各种装饰对象的空间范围。在所有情况下,渲染大小都等于平均身体大小(参见statistic元素)乘以以下记录的属性值。

forcewidth: 实数, “0.1”

用于渲染接触力和扰动力的箭头的半径。

contactwidth: 实数, “0.3”

用于渲染接触点的圆柱体半径。圆柱体的法向方向与接触法向对齐。将圆柱体做得又短又宽可以得到切平面的“煎饼”表示。

contactheight: 实数, “0.1”

用于渲染接触点的圆柱体高度。

connect: 实数, “0.2”

用于连接身体和关节的胶囊体的半径,从而生成自动骨骼。

com: 实数, “0.4”

用于渲染运动学子树质心的球体半径。

camera: 实数, “0.3”

用于在渲染中表示模型相机的装饰对象的大小。

light: 实数, “0.3”

用于在渲染中表示模型光源的装饰对象的大小。

selectpoint: 实数, “0.2”

用于渲染选择点(即用户双击左键选择身体的点)的球体半径。请注意,通过激活相应的渲染标志,可以在 3D 视图中打印该点的局部和全局坐标。这样就可以找到感兴趣点的坐标。

jointlength: 实数, “1.0”

用于渲染关节轴箭头的长度。

jointwidth: 实数, “0.1”

用于渲染关节轴箭头的半径。

actuatorlength: 实数, “0.7”

用于渲染仅作用于标量关节的执行器箭头的长度。

actuatorwidth: 实数, “0.2”

用于渲染仅作用于标量关节的执行器箭头的半径。

framelength: 实数, “1.0”

用于渲染坐标系的圆柱体长度。世界坐标系会相对于此设置自动缩放。

framewidth: 实数, “0.1”

用于渲染坐标系的圆柱体半径。

constraint: 实数, “0.1”

用于渲染空间约束违规的胶囊体半径。

slidercrank: 实数, “0.2”

用于渲染滑块曲柄机构的胶囊体半径。机构的第二部分会相对于此设置自动缩放。

frustum: 实数, “10”

渲染视锥体时,远裁剪平面到相机针孔的距离。

visual/rgba (?)#

此元素中的设置控制各种装饰对象的颜色和透明度 (rgba)。为了简化下面的术语,我们将此组合属性称为“颜色”。所有值应在 [0 1] 范围内。Alpha 值为 0 会禁用相应对象的渲染。

fog: 实数(4), “0 0 0 1”

启用雾时,所有像素的颜色都会向此处指定的颜色渐变。渐变的空间范围由上方map元素的 fogstart 和 fogend 属性控制。

haze: 实数(4), “1 1 1 1”

地平线处的雾霾颜色,用于在无限平面和天空盒之间平滑过渡。默认值创建白色雾霾。要创建无缝过渡,请确保天空盒靠近地平线的颜色与平面颜色/纹理相似,并将雾霾颜色设置为该颜色范围内的某个值。

force: 实数(4), “1 0.5 0.5 1”

用于渲染扰动力的箭头的颜色。

inertia: 实数(4), “0.8 0.2 0.2 0.6”

用于渲染等效身体惯量的盒子的颜色。这是唯一默认具有透明度的 rgba 设置,因为通常希望看到惯量盒子内部的几何体。

joint: 实数(4), “0.2 0.6 0.8 1”

用于渲染关节轴的箭头的颜色。

actuator: 实数(4), “0.2 0.25 0.2 1”

控制中性值时的执行器颜色。

actuatornegative: 实数(4), “0.2 0.6 0.9 1”

控制最负值时的执行器颜色。

actuatorpositive: 实数(4), “0.9 0.4 0.2 1”

控制最正值时的执行器颜色。

com: 实数(4), “0.9 0.9 0.9 1”

用于渲染子树质心的球体颜色。

camera: 实数(4), “0.6 0.9 0.6 1”

用于在渲染中表示模型相机的装饰对象的颜色。

light: 实数(4), “0.6 0.6 0.9 1”

用于在渲染中表示模型光源的装饰对象的颜色。

selectpoint: 实数(4), “0.9 0.9 0.1 1”

用于渲染选择点的球体颜色。

connect: 实数(4), “0.2 0.2 0.8 1”

用于连接身体和关节的胶囊体颜色,从而生成自动骨骼。

contactpoint: 实数(4), “0.9 0.6 0.2 1”

用于渲染接触点的圆柱体颜色。

contactforce: 实数(4), “0.7 0.9 0.9 1”

用于渲染接触力的箭头的颜色。启用接触力分解为法向分量和切向分量时,此颜色用于渲染法向分量。

contactfriction: 实数(4), “0.9 0.8 0.4 1”

仅在启用分解时,用于渲染接触切向力的箭头的颜色。

contacttorque: 实数(4), “0.9 0.7 0.9 1”

用于渲染接触扭矩的箭头的颜色(当前已禁用)。

contactgap: 实数(4), “0.5, 0.8, 0.9, 1”

落在接触间隙中(从而排除在接触力计算之外)的接触点的颜色。

rangefinder: 实数(4), “1 1 0.1 1”

用于渲染测距传感器线几何体的颜色。

constraint: 实数(4), “0.9 0 0 1”

对应于空间约束违规的胶囊体颜色。

slidercrank: 实数(4), “0.5 0.3 0.8 1”

滑块曲柄机构的颜色。

crankbroken: 实数(4), “0.9 0 0 1”

在无法维持指定连杆长度(即“断裂”)的模型配置中,用于渲染滑块曲柄机构的曲柄颜色。

frustum: 实数(4), “1 1 0 0.2”

用于渲染相机视锥体的颜色。

bv: 实数(4), “0 1 0 0.5”

用于渲染边界体积的颜色。

bvactive: 实数(4), “1 0 0 0.5”

如果bvactive标志为“true”,则用于渲染活动边界体积的颜色。

default (R)#

此元素用于创建新的默认类;详见上方Default settings。默认类可以嵌套,继承其父类的所有属性值。顶层默认类始终定义;如果省略,则称为“main”。

class: 字符串, 必需 (顶层除外)

默认类的名称。它必须在所有默认类中唯一。创建实际模型元素时,使用此名称来激活该类。

default/mesh (?)#

此元素设置默认类中虚拟mesh元素的属性。
可用的属性是:scalescale

default/material (?)#

此元素设置默认类中虚拟material元素的属性。
此处所有 material 属性都可用,除了:name, class。

default/joint (?)#

此元素设置默认类中虚拟joint元素的属性。
此处所有 joint 属性都可用,除了:name, class。

default/geom (?)#

此元素设置默认类中虚拟geom元素的属性。
此处所有 geom 属性都可用,除了:name, class。

default/site (?)#

此元素设置默认类中虚拟site元素的属性。
此处所有 site 属性都可用,除了:name, class。

default/camera (?)#

此元素设置默认类中虚拟camera元素的属性。
此处所有 camera 属性都可用,除了:name, class, mode, target。

default/light (?)#

此元素设置默认类中虚拟light元素的属性。
此处所有 light 属性都可用,除了:name, class。

default/pair (?)#

此元素设置默认类中虚拟pair元素的属性。
此处所有 pair 属性都可用,除了:name, class, geom1, geom2。

default/equality (?)#

此元素设置默认类中虚拟equality元素的属性。实际的相等约束根据用于定义它们的子元素具有不同的类型。然而,此处我们设置的是所有相等约束类型共有的属性,因此我们不对类型进行区分。
此处可用的 equality 子元素属性是:active, solref, solimp

default/tendon (?)#

此元素设置默认类中虚拟tendon元素的属性。与相等约束类似,实际肌腱有类型,但此处我们设置的是所有类型共有的属性。
此处所有 tendon 子元素属性都可用,除了:name, class。

default/general (?)#

此元素设置默认类中虚拟general元素的属性。
此处所有 general 属性都可用,除了:name, class, joint, jointinparent, site, refsite, tendon, slidersite, cranksite。

default/motor (?)#

此元素以及接下来的三个元素使用Actuator shortcuts设置general元素的属性。在同一默认类中使用多个此类快捷方式没有意义,因为它们设置相同的底层属性,会替换任何先前的设置。此处所有motor属性都可用,除了:name, class, joint, jointinparent, site, refsite, tendon, slidersite, cranksite。

default/position (?)#

此处所有position属性都可用,除了:name, class, joint, jointinparent, site, refsite, tendon, slidersite, cranksite。

default/velocity (?)#

此处所有velocity属性都可用,除了:name, class, joint, jointinparent, site, refsite, tendon, slidersite, cranksite。

default/intvelocity (?)#

此处所有intvelocity属性都可用,除了:name, class, joint, jointinparent, site, refsite, tendon, slidersite, cranksite。

default/damper (?)#

此处所有damper属性都可用,除了:name, class, joint, jointinparent, site, refsite, tendon, slidersite, cranksite。

default/cylinder (?)#

此处所有cylinder属性都可用,除了:name, class, joint, jointinparent, site, refsite, tendon, slidersite, cranksite。

default/muscle (?)#

此处所有muscle属性都可用,除了:name, class, joint, jointinparent, site, refsite, tendon, slidersite, cranksite。

default/adhesion (?)#

此处所有adhesion属性都可用,除了:name, class, body。

custom (*)#

这是一个用于自定义数值和文本元素的分组元素。它没有属性。

custom/numeric (*)#

此元素在 mjModel 中创建一个自定义数值数组。

name: string, 必需

数组的名称。此属性是必需的,因为在运行时查找感兴趣的自定义元素的唯一方法是通过其名称。

size: 整数, 可选

如果指定,此属性设置数据数组的大小(以双精度浮点数计算)。如果未指定此属性,则大小将从下面的实际数据数组推断。

data: 实数(size), “0 0 …”

要复制到 mjModel 中的数值数据。如果指定了 size,则此处给定的数组长度不能超过指定的大小。如果数组长度较小,则缺失的分量设置为 0。请注意,可以创建自定义数组以在运行时存储信息——这就是数据初始化是可选的原因。仅当省略数组大小时才成为必需。

custom/text (*)#

此元素在 mjModel 中创建一个自定义文本字段。它可用于存储用户回调和其他自定义计算的关键字命令。

name: string, 必需

自定义文本字段的名称。

data: 字符串, 必需

要复制到 mjModel 中的自定义文本。

custom/tuple (*)#

此元素创建一个自定义元组,它是 MuJoCo 对象的列表。通过按名称引用所需对象来创建列表。

name: string, 必需

自定义元组的名称。

tuple/element (*)#

这会向元组添加一个元素。

objtype: (任何可以命名的元素类型), 必需

要添加的对象的类型。

body: string, required

要添加的对象的名称。类型和名称必须引用模型中某处定义的命名 MuJoCo 元素。元组也可以被引用(包括自引用)。

prm: 实数, “0”

与元组此元素关联的实数值参数。其用途取决于用户。

extension (*)#

这是一个用于 MuJoCo 扩展的分组元素。扩展允许用户使用自定义代码扩展 MuJoCo 的功能,并在编程章节的Extensions页面中详细描述。目前,唯一可用的扩展类型是Engine plugins

extension/plugin (*)#

此元素指定模拟此模型需要引擎插件。详见Engine plugins

plugin: 字符串, 必需

插件标识符。

plugin/instance (*)#

声明一个插件实例。当多个元素由同一插件支持时,或需要全局插件配置时,需要显式声明实例。详见插件declarationconfiguration

name: string, 必需

插件实例的名称。

instance/config (*)#

插件实例的配置。在模型元素下隐式声明插件时,使用 element/plugin/config 以相同的语义执行配置。目前支持插件的元素有 body, composite, actuatorsensor

key: 字符串, 可选

用于插件配置的键。

value: 字符串, 可选

与键关联的值。