机器人强化学习环境mujoco官方文档学习记录(一)——XML

mujoco 文档学习记录(一)——XML

鉴于研究生课题需要,开始在mujoco中配置仿真环境。而官方文档中各种对象参数纷繁复杂,且涉及mujoco底层计算,不便于初学者进行开发设计。因此本文将MJCF模型的常用对象参数进行总结。
本文档仅供学习参考,如有问题欢迎大家学习交流。

XML 参照

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

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

MJCF文件有一个独特的顶级元素mujoco。下一级元素称为节。它们都是可选的。某些部分仅用于分组,没有属性。部分可以重复,以便于通过包含元素合并模型。元素中属性的顺序可以是任意的。父元素中子元素的顺序也可以是任意的,但有四个例外

身体内关节元素的顺序很重要,因为关节变换是按顺序进行的。

空间肌腱中元素的顺序很重要,因为它决定了肌腱穿过或环绕的物体顺序。

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

同一默认类中多个执行器快捷方式的顺序很重要,因为每个快捷方式都设置该默认类中单个常规元素的属性,覆盖以前的设置。

mujoco(!)

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

​ $\textcolor{Red}{model: string, “MuJoCo Model”} $ :模型名称

compiler (*)

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

a u t o l i m i t s : [ f a l s e , t r u e ] , “ f a l s e ” \textcolor{Red}{autolimits: [false, true], “false”} autolimits:[false,true],false​: 影响限制属性包括”limited“(body-joint中),“forcelimited”,“ctrllimited"和"actlimited”,如果指定为True,则上述属性没有必要,其值通过其对应的"range"属性中推导得出;如果为false则不会发生上述推导,对于要限制的关节,必须同时指定 limit=“true” 和 range=“min max”。在此模式下,指定没有限制的范围是错误的。

c o o r d i n a t e : [ l o c a l , g l o b a l ] , “ l o c a l ” \textcolor{Red}{coordinate: [local, global], “local”} coordinate:[local,global],local:选择全局还是局部坐标系

a n g l e : [ r a d i a n , d e g r e e ] , “ d e g r e e ” f o r M J C F , a l w a y s “ r a d i a n ” f o r U R D F \textcolor{Red}{angle: [radian, degree], “degree” for MJCF, always “radian” for URDF} angle:[radian,degree],degreeforMJCF,alwaysradianforURDF:角度单位,编译器将度数转换为弧度,而mjModel总是使用弧度

i n e r t i a f r o m g e o m : [ f a l s e , t r u e , a u t o ] , “ a u t o ” \textcolor{Red}{inertiafromgeom: [false, true, auto], “auto”} inertiafromgeom:[false,true,auto],auto:该属性控制从附着在物体上的几何体自动推断物体质量和惯性。如果此设置为“false”,则不执行自动推理。在这种情况下,每个物体必须具有明确定义的质量和惯性与惯性元素,否则将产生编译错误。如果此设置为“true”,则每个物体的质量和惯性将从附着在其上的几何体中推断出来,覆盖惯性元素指定的任何值。默认设置“auto”意味着只有在物体定义中缺少惯性元素时才会自动推断质量和惯性。将该属性设置为“true”而不是“auto”的一个原因是为了覆盖从设计不良的模型导入的惯性数据。特别是,一些公开的URDF模型似乎具有任意的惯性,与质量相比太大了。这就产生了等效惯性盒,它远远超出了模型的几何边界。请注意,内置的OpenGL可视化器可以呈现等效的惯性框。

option(*)

​ 该元素与字段mjModel中包含的低层结构mjOption是一对一对应的。选择mjModel。这些都是模拟选项,不会以任何方式影响编译过程;它们被简单地复制到低级模型中。尽管用户可以在运行时修改mjOption,但最好还是通过XML对其进行适当调整。

t i m e s t e p : r e a l , “ 0.002 ” \textcolor{Red}{timestep: real, “0.002”} timestep:real,“0.002”:模拟时间步长,以秒为单位。

i t e r a t i o n s : i n t , “ 100 ” \textcolor{Red}{iterations: int, “100”} iterations:int,“100”:约束求解器的最大迭代次数。

t o l e r a n c e : r e a l , “ 1 e − 8 ” \textcolor{Red}{tolerance: real, “1e-8”} tolerance:real,“1e8”:用于迭代求解器早期终止的容差阈值。

j a c o b i a n : [ d e n s e , s p a r s e , a u t o ] , “ a u t o ” \textcolor{Red}{jacobian: [dense, sparse, auto], “auto”} jacobian:[dense,sparse,auto],auto:约束雅可比矩阵的类型及其计算矩阵。当自由度达到60时,自动分解为密集,超过60时,自动分解为稀疏。

s o l v e r : [ P G S , C G , N e w t o n ] , “ N e w t o n ” \textcolor{Red}{solver: [PGS, CG, Newton], “Newton”} solver:[PGS,CG,Newton],Newton:约束求解器

option/flag(?)

e n e r g y : [ d i s a b l e , e n a b l e ] , “ d i s a b l e ” \textcolor{Red}{energy: [disable, enable], “disable”} energy:[disable,enable],disable:这个标志可以计算动能和势能,存储在mjData中。

s e n s o r n o i s e : [ d i s a b l e , e n a b l e ] , “ d i s a b l e ” \textcolor{Red}{sensornoise: [disable, enable], “disable”} sensornoise:[disable,enable],disable:此标志启用传感器噪声模拟。当禁用(这是默认值)时,即使传感器指定非零噪声幅度,噪声也不会添加到传感器数据中。启用后,零均值高斯噪声被添加到底层确定性传感器数据中。其标准差由各传感器的噪声参数决定。

size(*)

​ 该元素指定了不能从模型中的元素数量推断出来的大小参数。与mjOption可以在运行时修改的字段不同,大小是结构参数,编译后不应该修改。

n j m a x : i n t , “ − 1 ” ( 遗弃 ) \textcolor{Red}{njmax: int, “-1” (遗弃)} njmax:int,1”(遗弃):这是一个已弃用的遗留属性。在2.3.0之前的版本中,它决定了约束的最大允许数量。目前,它的意思是“分配尽可能多的内存,这将是以前需要的约束数量”。同时指定njmax和内存会导致错误。

n c o n m a x : i n t , “ − 1 ” ( 遗弃 ) \textcolor{Red}{nconmax: int, “-1” (遗弃)} nconmax:int,1”(遗弃):此属性指定将在运行时生成的最大接触数。如果接触的数量即将超过该值,多余的将被丢弃并产生警告。这是一个已弃用的遗留属性,在2.3.0版本之前会影响内存分配。保留它是为了向后兼容和调试目的。

visual(*)

​ 这里的设置会影响可视化工具,或者更准确地说,会影响可视化的抽象阶段,该阶段会生成一个几何实体列表,供后续呈现。这里的设置是全局的,与特定于元素的视觉设置形成对比。全局和特定于元素的设置指的是不重叠的属性。一些全局设置会影响一些属性,比如不能对每个元素设置的几何基元的三角剖分。其他全局设置会影响装饰性对象的属性,例如,不对应于模型元素的接触点和力箭头等对象。视觉设置在语义上分为几个小节。

visual/global(?)

​ 虽然mjVisual中的所有设置都是全局的,但这里的设置不适合任何其他子部分。这实际上是一个杂项小节。

f o v y : r e a l , “ 45 ” \textcolor{Red}{fovy: real, “45”} fovy:real,“45”:此属性指定自由相机的垂直视场,即即使模型中没有显式定义相机,可视工具中始终可用的相机。无论编译器的angle属性是否设置,它始终以度数表示,在低层模型中也以度数表示。

a z i m u t h : r e a l , “ 90 ” \textcolor{Red}{azimuth: real, “90”} azimuth:real,“90”:此属性指定自由相机围绕垂直z轴的初始方位角(以度为单位)。0表示向x正方向看,而默认值90表示向y正方向看。

o f f w i d t h : i n t , “ 640 ” \textcolor{Red}{offwidth: int, “640”} offwidth:int,“640”:指定屏幕外OpenGL渲染缓冲区的像素大小。此属性指定缓冲区的宽度。这个缓冲区的大小也可以在运行时调整,但是在XML中设置它通常更方便。

o f f h e i g h t : i n t , “ 480 ” \textcolor{Red}{offheight: int, “480”} offheight:int,“480”:该属性指定OpenGL屏幕外渲染缓冲区的高度(以像素为单位)。

visual/quality(?)

​ 此元素指定影响呈现质量的设置。较大的值会导致更高的质量,但可能会减慢速度。注意模拟。cc显示每秒帧数(FPS)。目标FPS为60hz;如果可视化器中显示的数字明显较低,这意味着GPU超载,可视化应该以某种方式简化。

s h a d o w s i z e : i n t , “ 4096 ” \textcolor{Red}{shadowsize: int, “4096”} shadowsize:int,“4096”:此属性指定用于阴影映射的正方形纹理的大小。数值越高,阴影越平滑。光线投射阴影的区域大小也会影响平滑度,所以这些设置应该共同调整。这里的默认值有些保守。大多数现代gpu能够处理更大的纹理而不会减慢速度。

o f f s a m p l e s : i n t , “ 4 ” \textcolor{Red}{offsamples: int, “4” } offsamples:int,“4”:此属性指定用于屏幕外呈现的多样本数量。较大的值会产生更好的抗混叠,但会减慢GPU的速度。将此设置为0以禁用多采样。注意,这个属性只影响屏幕外呈现。

visual/headlight(?)

​ 此元素用于调整前照灯的属性。除了在模型中明确定义的任何灯之外,总是有一个内置的前灯。前照灯是一种定向光,以当前相机为中心,并指向相机正在查看的方向。它不会投射阴影(反正是看不见的)。注意,灯光是附加的,所以如果在模型中定义了明确的灯光,通常需要降低前照灯的强度。

a c t i v e : i n t , “ 1 ” \textcolor{Red}{active: int, “1”} active:int,“1”:启用和禁用前照灯

visual/map(?)

​ 此元素用于指定影响可视化和内置鼠标扰动的缩放量。与下一个元素中特定于空间范围的缩放量不同,这里的数量是杂项的。

f o r c e : r e a l , “ 0.005 ” \textcolor{Red}{force: real, “0.005”} force:real,“0.005”:这个属性控制着接触力和摄动力的可视化。渲染的力向量的长度等于力的大小乘以这个属性的值,然后除以模型的平均身体质量

a l p h a : r e a l , “ 0.3 ” \textcolor{Red}{alpha: real, “0.3”} alpha:real,“0.3”:同上,但控制接触扭矩和扰动扭矩的呈现,而不是力(目前禁用)。

f o g s t a r t : r e a l , “ 3 ” \textcolor{Red}{fogstart: real, “3”} fogstart:real,“3”:可视化工具可以模拟线性雾,在OpenGL的意义上。雾的起始位置是模型范围(参见下面的统计元素)乘以该属性的值。

f o g e n d : r e a l , “ 10 ” \textcolor{Red}{fogend: real, “10”} fogend:real,“10”:雾的结束位置是模型范围乘以该属性的值。

z n e a r : r e a l , “ 0.01 ” \textcolor{Red}{znear: real, “0.01”} znear:real,“0.01”:这个和下一个属性决定了OpenGL投影的裁剪平面。近裁剪平面尤其重要:将其设置得太近会导致(通常是严重的)深度缓冲中的分辨率损失,而将其设置得太远则会导致感兴趣的对象被裁剪,使其无法放大。到近裁剪平面的距离是模型范围乘以此属性的值。必须是严格的正数。

z f a r : r e a l , “ 50 ” \textcolor{Red}{zfar: real, “50”} zfar:real,“50”:到远裁剪平面的距离是模型范围乘以此属性的值。

statistic(*)

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

defalult®

​ 此元素用于创建一个新的defaults类。默认类可以嵌套,从它们的父类继承所有属性值。总是定义顶级默认类;如果省略,则称为“main”。

c l a s s : s t r i n g , r e q u i r e d \textcolor{Red}{class: string, required } class:string,required(except at the top level)

​ 默认类的名称。它在所有默认类中必须是唯一的。这个名称用于在创建实际的模型元素时使类处于活动状态。

​ MJCF有一个精细的机制来设置默认属性值。这允许我们拥有大量的元素和属性,以显示软件的丰富功能,同时编写简短且可读的模型文件。该机制进一步允许用户在一个地方引入更改,并将其传播到整个模型。我们从一个例子开始。

<mujoco>
    <default class="main">
        <geom rgba="1 0 0 1"/>
        <default class="sub">
            <geom rgba="0 1 0 1"/>
        </default>
    </default>

    <worldbody>
        <geom type="box"/>
        <body childclass="sub">
            <geom type="ellipsoid"/>
            <geom type="sphere" rgba="0 0 1 1"/>
            <geom type="cylinder" class="main"/>
        </body>
    </worldbody>
</mujoco>

​ 这个示例实际上不会编译,因为缺少一些必需的信息,但是这里我们只对geom rgba值的设置感兴趣。由于默认设置机制,上面创建的四个几何体将以以下rgba值结束:

geom typegeom rgba
box1001
ellipsoid0101
sphere0011
cylinder1001

​ 该框使用顶级默认类“main”来设置其未定义属性的值,因为没有指定其他类。主体指定了子类" sub “,导致该主体的所有子类(以及它们的所有子类等)都使用类” sub “,除非另有指定。所以椭球体使用类” sub "。球体显式地定义了rgba,它覆盖了默认设置。柱体指定默认类“main”,因此它使用“main”而不是“sub”,尽管后者是在包含geom的主体的子类属性中指定的。

​ MuJoCo支持无限数量的默认类,这些类可能是由XML中嵌套的默认元素创建的。每个类都有一个唯一的名称——这是必需的属性,除非顶级类的名称是“main”(如果未定义)。每个类还具有虚拟模型元素的完整集合,其属性设置如下。当一个默认类在另一个默认类中定义时,子类会自动继承父类的所有属性值。然后,它可以通过定义相应的属性来覆盖部分或全部属性。顶级默认类没有父类,因此它的属性被初始化为内部默认值。

​ 默认类中包含的虚拟元素不是模型的一部分;它们仅用于初始化实际模型元素的属性值。当一个实际的元素第一次被创建时,它的所有属性都是从当前活动的默认类中对应的虚拟元素中复制的。总是有一个活动的缺省类,可以通过以下三种方式之一来确定。如果在当前元素或它的任何祖先体中没有指定类,则使用顶级类(不管它是称为“main”还是其他什么)。如果在当前元素中没有指定类,但它的一个或多个祖先体指定了子类,则使用最近的祖先体的子类。如果当前元素指定了一个类,则不管其祖先体中的任何子类属性如何,都将使用该类。

defalt/material(?)

​ 所有的material属性都是可用的,除了: name, class.

default/⁠joint (?)

​ 所有的joint属性都是可用的,除了: name, class.

defalt/geom(?)

​ 所有的geom属性都是可用的,除了: name, class.

asset (*)

​ 这是一个用于定义资产的分组元素。它没有属性。在模型中创建资产,以便可以从其他模型元素中引用它们

asset/⁠texture (*)

​ 这个元素创建一个纹理资源,然后从一个材料资源中引用,最后从需要纹理的模型元素中引用。纹理数据可以从PNG文件加载,并规定加载立方体和天空盒纹理。或者,数据可以由编译器作为过程纹理生成。因为不同的纹理类型需要不同的参数,所以对于任何给定的纹理,只使用下面属性的一个子集。

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

type: [2d, cube, skybox], “cube”:此属性决定纹理如何表示并映射到对象。它还确定哪些剩余属性是相关的。

​ cube类型是最常见的。它具有在对象上收缩包装纹理立方体的效果。除了材料的texuniform属性提供的调整外,该过程是自动的。定义立方体的六个正方形图像可以相同,也可以不同;如果它们是相同的,则在mjModel中只存储一个副本。有四种机制可以指定纹理数据:

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

​ 2、单个文件,包含一个合成图像,编译器从中提取六个正方形。合成图像的布局由gridsize和gridlayout属性决定。

​ 3、六个独立的文件指定属性fileright, filelleft等,每个包含一个方形图像。

​ 4、内部生成的程序纹理。过程纹理的类型由内置属性决定。纹理数据也取决于下面记录的一些参数。

​ skybox类型与立方体映射非常相似,实际上纹理数据是以完全相同的方式指定的。唯一的区别是可视化工具使用模型中定义的第一个这样的纹理来渲染天空盒。这是一个位于摄像机中心的大框,并且总是随着它移动,其大小从远剪辑平面自动确定。这个想法是,天空盒上的图像看起来是静止的,好像它们是无限遥远的。如果这样的纹理是从应用于规则对象的材料引用的,则效果相当于立方体映射。但是要注意,适合天空盒的图像很少适合纹理对象。

​ 2d类型可能是用户最熟悉的,但是它只适用于plane和high field。2d纹理可以是矩形的,不像立方体纹理的边必须是方形的。可以通过material的texrepeat属性来控制缩放。

file: string, optional:如果指定了此属性,并且下面的builtin属性设置为“none”,则纹理数据从单个文件加载。

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

gridlayout: string, “…………”:当从单个文件加载立方体或天空盒纹理时,且gridsize与“1 1”不同,此属性指定使用哪些网格单元以及它们对应于立方体的哪一侧。这里指定的字符串必须由集合{‘.’, ’ R ', ’ L ', ’ U ', ’ D ', ’ F ‘, ’ B’}中的字符组成。字符数必须等于两个网格大小的乘积。网格按行主顺序扫描。“.”字符表示未使用的单元格。其他字符是Right, Left, Up, Down, Front, Back的首字母。如果给定边的符号出现多次,则使用最后一次定义。如果省略给定的一面,则用rgb1属性指定的颜色填充。例如,可以使用gridsize = " 3 4 "和gridlayout = ".U…LFRB.D…"将下面的沙漠景观加载为天空盒或立方体地图。

builtin: [none, gradient, checker, flat], “none”:这个和其他属性控制程序纹理的生成。如果此属性的值与" none "不同,则纹理被视为生成的,并且忽略任何文件名。

​ gradient类型生成从rgb1到rgb2的颜色渐变。色彩空间的插值是通过一个sigmoid函数完成的。对于立方体和天空盒纹理,梯度沿着+Y轴,即从上到下的天空盒渲染。

​ checker类型生成一个2 × 2方格图案,其颜色由rgb1到rgb2交替给出。这适用于渲染地面平面,也适用于标记具有旋转对称性的对象。请注意,2d纹理可以缩放,以便根据需要重复图案多次。对于立方体和天空盒纹理,方格图案绘制在立方体的每一面。

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

rgb1: real(3), “0.8 0.8 0.8”:用于过程纹理生成的第一种颜色。这种颜色也用于填充从文件中加载的立方体和天空盒纹理缺失的侧面。这个和所有其他RGB(A)向量的分量应该在[0 1]范围内。

rgb2: real(3), “0.5 0.5 0.5”:用于过程纹理生成的第二种颜色。

mark: [none, edge, cross, random], “none”:过程纹理可以在builtin类型确定的颜色之上使用markrgb color进行标记。“edge”表示标记所有纹理图像的边缘。“cross”是指在每个图像的中间标记一个十字。“random”表示随机选择的像素被标记。所有标记都是1像素宽,因此标记在较小的纹理上看起来更大,更分散。

markrgb: real(3), “0 0 0”:用于过程纹理标记的颜色。

random: real, “0.01”:当mark属性设置为“random”时,该属性决定每个像素被选中的概率。注意,更大的纹理有更多的像素,这里的概率是独立应用于每个像素的——因此纹理大小和概率需要联合调整。与渐变skybox纹理一起,这可以创建一个带有星星的夜空的外观。

width: int, “0”:过程纹理的宽度,即图像中的列数。对于立方体和天空盒程序纹理,宽度和高度必须相等。较大的值通常会产生更高质量的图像,尽管在某些情况下(例如,检查器模式),较小的值就足够了。

height: int, “0”:程序纹理的高度,即图像中的行数。

hflip: [false, true], “false”:如果为true,从文件中加载的图像将在水平方向上翻转。影响过程纹理。

vflip: [false, true], “false”:如果为true,从文件中加载的图像将在垂直方向上翻转。不影响过程纹理。

asset/⁠hfield (*)

​ 这个元素创建一个height gield资源,然后可以从类型为“hfield”的geom几何体中引用它。高程场,也称为地形图,是表征高程数据的二维矩阵。数据可以用三种方式指定:

​ 1、高程数据可以从PNG文件加载。图像内部转换为灰度,并使用每个像素的强度来定义高程;白色代表高,黑色代表低。

​ 2、提升数据可以从下面描述的自定义格式的二进制文件中加载。与MuJoCo中使用的所有其他矩阵一样,数据排序是行为主的,就像图像中的像素一样。如果数据大小为nrow-by-ncol,则文件必须有4*(2+nrow*ncol)字节:

​ (int32) nrow
​ (int32) ncol
​ (float32) data[nrow*ncol]

​ 3、可以在编译时不定义elevation高度数据。这可以通过指定属性nrow和ncol来实现。编译器为mjModel中的height field数据分配空间,并将其设置为0。然后,用户可以在运行时以编程方式或使用传感器数据生成自定义高度字段。

​ 无论使用哪种方法来指定elevation数据,编译器总是将其规范化到[0 - 1]的范围。但是,如果数据在编译时未定义,并在以后的运行时生成,则用户有责任对其进行规范化。

​ 高度场的位置和方向由引用它的几何体决定。另一方面,空间范围是通过height field字段本身的size属性指定的,不能通过引用的geom进行修改(在这种情况下忽略了geom size参数)。同样的方法用于下面的mesh:定位是由geom完成的,而大小是由其本身完成的。

name: string, optional:height field的名称,用于引用。如果省略该名称并指定了文件名,则名称等于不包含路径和扩展名的文件名。

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

size: real(4), required:这里的四个数字是(radius_x, radius_y, elevation_z, base_z)。高度场以参考几何体的局部框架为中心。elevation在+Z方向。

​ 前两个数字指定定义高度字段的矩形的X和Y范围(或“半径”)。

​ 第三个数字是最大海拔;它对归一化为[0-1]的高程数据进行缩放。因此,最小高度在Z=0,最大高度在Z=elevation_z。

​ 最后一个数字是-Z方向的框的深度,作为高度字段的“基数”,必须具有非零厚度。

asset/⁠mesh (*)

​ 这个元素创建一个mesh资源,然后可以从geom几何体中引用。如果引用几何类型为mesh,则在模型中实例化mesh,否则将自动拟合几何原语;请参阅geom元素。

​ MuJoCo使用三角网格。它们可以从二进制STL文件、OBJ文件或MSH文件中加载,或者直接在XML中指定顶点和面数据。

​ 由于顶点数据通常相对于原点不在mesh内的坐标而设计,定位和定向变得复杂。相反,MuJoCo希望geom局部框架的原点与形状的几何中心一致。我们在编译器中对mesh进行预处理,使其以(0,0,0)为中心,其惯性主轴为坐标轴,从而解决了这种差异。我们还保存了实现这种对齐所需的平移和旋转偏移量。然后将这些偏移量应用于参考geom的位置和方向;参见geom的mesh属性。幸运的是,机器人模型中使用的大多数mesh都是在以关节为中心的坐标系中设计的。这使得相应的MJCF模型更加直观:我们将身体框架设置在关节处,使关节在身体框架中的位置为(0,0,0),从而简单地引用mesh。

​ 下面是前臂的MJCF模型片段,包含将mesh放置在预期位置所需的所有信息。身体位置是相对于父身体指定的,即上臂(未显示)。它被35厘米偏移,这是人类上臂的典型长度。如果mesh顶点数据没有按照上述约定设计,我们将不得不使用geom位置和方向(或新的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>

name: string, optional:mesh的名称,用于引用。如果省略,mesh名称等于不包含路径和扩展名的文件名。

class: string, optional:用于设置未指定属性的默认类(在这种情况下只有缩放)。

file: string, optional:将从中加载mesh网格的文件。路径由编译器的meshdir属性决定。文件扩展名必须为“stl”或“msh”(不区分大小写),指定文件类型。如果省略文件名,则需要vertex属性。

scale: real(3), “1 1 1”:此属性指定将沿每个坐标轴应用于顶点数据的缩放。允许负值,导致网格沿相应轴翻转。

asset/⁠material (*)

​ 这个元素创建了一个material材料对象。它可以参考skins、sites、geoms和tendons来设定它们的外观。请注意,所有这些元素都有一个本地rgba属性,当只需要调整颜色时,这更方便,因为它不需要创建材料并引用它们。除了颜色之外,材料还可以用于调整外观特性。然而,一旦创建了材质,使用材质指定颜色是更自然的,这样所有的外观属性都被组合在一起。

name: string, required:材质名称

class: string, optional:用于设置未指定属性的默认类。

texture: string, optional:如果指定了此属性,则材质具有与之关联的纹理。从模型元素中引用材质将导致纹理应用于该元素。注意,这个属性的值是纹理资源的名称,而不是纹理文件名。材质定义中不能加载纹理;相反,它们必须通过纹理元素显式加载,然后在这里引用。

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

texuniform: [false, true], “false”:对于立方体cube纹理,此属性控制立方体映射的应用方式。默认值“false”表示使用对象的实际大小直接应用多维数据集映射。值“true”将纹理映射到单位对象,然后将其缩放到实际大小(几何原语由渲染器创建为单位对象,然后缩放)。在某些情况下,这会导致更均匀的纹理外观,但一般来说,哪种设置产生更好的结果取决于纹理和对象。

reflectance: real, “0”:该属性应该在[0 1]的范围内。如果该值大于0,并且材质被应用到一个平面或一个几何体上,渲染器将模拟反射率。该值越大,反射率越强。对于盒子,只有局部+Z轴方向的面是反射的。

rgba: real(4), “1 1 1 1”:材料的颜色和透明度。所有组件应在[0 - 1]范围内。纹理颜色和这里指定的颜色是按组件方式相乘的。因此,默认值“1 1 1 1”具有保持纹理不变的效果。

(world)body ®

​ 该元素用于通过嵌套构造运动树。worldbody元素作为顶级主体,而body用于所有其他身体。顶级主体是一种受限制的身体类型:它不能有joint和inertial,也不能有任何属性。它对应于世界框架的原点,在这个原点内定义了运动树的其余部分。它的主体名称被自动定义为“world”。

name: string, optional:body的名称

childclass: string, optional:如果这个属性存在,所有接受default类的元素都将使用这里指定的类,除非它们指定了自己的类,或在嵌套body链中遇到具有childclass属性的另一个body。

pos: real(3), optional:body框架在父坐标框架中的3D位置。如果未定义,则默认为(0,0,0)。

body/⁠inertial (?)

​ 这个元素规定了body的质量和惯性特性。如果该元素不包含在给定body中,则从附着在body上的geoms推断惯性特性。惯性系的中心与物体的质心重合,它的轴与物体的惯性主轴重合。因此惯性矩阵在这个坐标系中是对角的。

pos: real(3), required:惯性系的位置。这个属性是必需的,即使惯性属性可以从geoms中推断出来。

mass: real, required:身体的质量。不允许使用负值。MuJoCo要求广义坐标下的惯性矩阵是正定的,即使某些物体的质量为零,也可以实现正定。但是一般来说,没有理由使用无质量的物体。这种机构通常用于其他发动机,以绕过关节不能组合的限制,或连接传感器和摄像头。在MuJoCo中,primitive joint types可以组合,我们有一个更有效的附着机制sites。

diaginertia: real(3), optional:对角惯性矩阵,表示相对于惯性系的物体惯性。

body/⁠joint (*)

​ 这个元素创建一个关节。正如在运动学树中所解释的那样,关节在定义它的身体和身体的父体之间创建运动自由度。如果在同一主体中定义了多个关节,则依次应用相应的空间转换(主体框架相对于父框架的空间转换)。如果没有定义关节,则将其焊接到其父节点。关节在world body中无法定义。在运行时,模型中定义的所有关节的位置和方向都按照在运动树中出现的顺序存储在矢量mjData.qpos,线速度和角速度存储在矢量mjData.qvel中。当使用自由关节或球关节时,这两个向量具有不同的维数,因为这样的关节将旋转表示为单位四元数。

name: string, required:关节名称

class: string, optional:用于设置未指定属性的默认类。

type: [free, ball, slide, hinge], “hinge”:关节类型。

​ free创建一个自由关节,具有三个平移自由度和三个旋转自由度。换句话说,它使身体漂浮。旋转用单位四元数表示。这种关节类型只允许在作为world body的子body中使用。如果定义了一个自由关节,则不能定义体内的其他关节。与其他关节类型不同,自由关节在身体框架内没有位置。相反,假设关节位置与身体框架的中心重合。因此,在运行时,自由关节的位置和方向数据对应于身体框架的全局位置和方向。自由关节不能有限制limit。

​ 球型创建一个球关节与三个旋转自由度。旋转用单位四元数表示。四元数(1,0,0,0)对应于定义模型的初始配置。任何其他四元数都被解释为相对于这个初始配置的3D旋转。旋转是围绕下面由pos属性定义的点。如果一个物体有一个球关节,它不能有其他旋转关节(球或铰链)。允许将球接头与滑动接头结合在同一body内。

​ 滑动类型创建具有一个平移自由度的滑动或移动关节。这样的关节由位置和滑动方向来定义。为了模拟的目的,只需要方向;关节位置用于渲染目的。

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

pos: real(3), “0 0 0”:在父主体的框架中指定的关节位置。对于自由关节,此属性被忽略。

axis: real(3), “0 0 1”:此属性指定铰链关节的旋转轴和滑动关节的平移方向。对于自由关节和球形关节则忽略不计。这里指定的向量,只要长度大于10E-14,就自动归一化为单位长度;否则将生成编译错误。

limited: [false, true, auto], “auto”:这个属性指定关节是否有限制。它与下面的range属性交互。如果此属性为“false”,则禁用关节限制。如果此属性为“true”,则启用关节限制。如果此属性为" auto ",并且在compiler中设置了autollimits,则如果定义了range,则会启用关节限制。

stiffness: real, “0”:关节僵硬。如果该值为正,则将创建一个弹簧,其平衡位置由下面的springref给出。弹簧力与其他被动力一起计算。

range: real(2), “0 0”:关节极限。除自由关节外,所有类型的关节都可以施加限制。对于铰链和球关节,根据编译器的角度属性,范围以度或弧度指定。对于球关节,限制施加于旋转角度(相对于参考配置),而不考虑旋转轴。只有第二个范围参数用于球接头;第一个范围参数应该设置为0。

​ 设置此属性而不指定limited是错误的,除非在编译器中设置了自动限制。

ref: real, “0”:关节的参考位置或角度此属性仅用于滑动和铰链连接。它定义了与初始模型配置相对应的关节值。关节在运行时应用的空间变换量等于存储在mjData.qpos中的当前关节值减去存储在mjModel.qpos0中的这个参考值。

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

armature: real, “0”:由这个关节产生的所有自由度的电枢惯性(或转子惯性,或反射惯性)。这些是在广义坐标系中加入惯性矩阵对角线的常数。它们使模拟更加稳定,并且经常增加物理真实感。这是因为当一个电机与一个将电机力放大c的传动装置连接到系统上时,转子(即电机的运动部分)的惯性被放大c*c。这同样适用于齿轮在行星齿轮箱的早期阶段。这些额外的惯量通常支配着模型中显式表示的机器人部件的惯量,而电枢属性是对它们进行建模的方法。

damping: real, “0”:应用于由这个关节产生的所有自由度的阻尼。与约束解算器计算的摩擦损失不同,阻尼只是一种与速度线性的力。较大的阻尼值会使数值积分器不稳定 。、

frictionloss: real, “0”:干摩擦造成的摩擦损失。这个值对于这个关节产生的所有自由度都是一样的。

body/⁠freejoint (*)

​ 这个元素创建一个free joint,其唯一的属性是name和group。

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

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

body/⁠geom (*)

​ 此元素创建一个几何体,并将其刚性地附加到几何体中。多个几何体可以连接到同一个物体上。在运行时,它们决定了物体的外观和碰撞属性。在编译时,它们还可以确定物体的惯性属性,这取决于惯性元素的存在和编译器的inertiafromgeom属性的设置。这是通过在编译器的inertiagrouprange属性指定的范围内,对附着在物体上的所有几何体的质量和惯性进行总和来完成的。利用几何形状、指定密度或含有密度的几何质量和均匀密度的假设来计算几何体的质量和惯量。

​ 物理模拟并不严格要求几何。人们可以创建和模拟一个只有身体和关节的模型。这样的模型甚至可以可视化,使用等效惯性盒来表示物体。这样的模拟只会遗漏接触力。我们不建议使用这样的模型,但知道这是可能的。

name: string, required:关节名称

class: string, optional:用于设置未指定属性的默认类。

type: [plane, hfield, sphere, capsule, ellipsoid, cylinder, box, mesh], “sphere”:几何形状的类型。

​ plane类型定义了一个平面,该平面是无限的,用于碰撞检测。它只能附属于world body或静态的子body。平面经过pos属性指定的点。它垂直于几何体局部坐标系的Z轴。+Z方向对应于空白空间。因此,位置和方向默认值(0,0,0)和(1,0,0,0)将创建Z=0海拔的地平面,其中+Z是世界中的垂直方向(这是MuJoCo的惯例)。由于平面是无限的,它可以用平面上的任何其他点来定义。然而,指定的位置具有关于呈现的附加含义。如果前两个尺寸参数中的任何一个为正,则平面将呈现为有限尺寸的矩形(在正维度中)。此矩形居中于指定位置。需要三个尺寸参数。前两个指定矩形沿X和Y轴的半尺寸。第三个尺寸参数是不寻常的:它指定了用于渲染目的的平面网格细分之间的间距。细分是在线框渲染模式下显示的,但一般来说,它们不应该用于在地平面上绘制网格(纹理应该用于此目的)。相反,它们的作用是改善光照和阴影,类似于用于渲染盒子的细分。当从后面看平面时,平面会自动变成半透明。如果应用于几何体的材料具有正反射,则平面和盒子的+Z面是唯一可以显示反射的表面。要渲染无限平面,请将前两个尺寸参数设置为零。

​ hfield类型定义了一个高度域几何。几何体必须使用下面的hfield属性引用所需的高度场资源。几何体的位置和方向设置高度场的位置和方向。几何体的大小被忽略,取而代之使用高度场资源的大小参数。请参阅hfield元素的描述。与平面类似,高度场几何体只能附加到world body或世界的静态子对象。

contype: int, “1”:该属性和下一个属性指定用于动态生成的接触对的接触过滤的32位掩码。如果一个几何体的contype与另一个几何体的conaffinity”兼容“,则两个几何体可以碰撞,反之亦然。“兼容”表示两个位掩码有一个公共位被设置为1。

conaffinity: int, “1”:接触过滤的位掩码;参见上面的类型。

condim: int, “3”:动态生成的接触对的接触空间维数被设置为两个参与几何体的condim的最大值。请参阅“计算”章节中的“接触”。允许的值及其含义是:

condimDescription
1无摩擦接触。
3规则的摩擦接触,在切平面内相对滑动。
4摩擦接触时,对方在切平面内滑动并围绕接触法向旋转。这对于建模软接触(与接触渗透无关)是有用的。
6摩擦接触,在切平面内相对滑动,绕接触法线旋转,绕切平面两轴旋转。后一种摩擦效应对防止物体无限滚动是有用的。

size: real(3), “0 0 0”:几何尺寸参数。所需参数的数量及其含义取决于在type属性下记录的geom类型。这里我们只提供一个摘要。所有要求的尺寸参数必须为正;内部默认值对应于无效的设置。请注意,当非mesh几何类型引用mesh时,该类型的几何原语将被拟合到mesh中。在这种情况下,尺寸是从mesh中获得的,几何体尺寸参数被忽略。因此,下表中所需尺寸参数的数量和描述仅适用于不引用mesh的几何体。

TypeNumberDescription
plane3X半尺寸;Y半尺寸;用于渲染的正方形网格线之间的间距。如果X或Y半尺寸中的任何一个为0,则平面在尺寸为0的维度中呈现为无限大。
hfield0几何大小将被忽略,而使用高度字段大小。
mesh0几何尺寸被忽略,取而代之的是网格尺寸。

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

rgba: real(4), “0.5 0.5 0.5 1”:这个属性可以用来设置颜色和透明度,而不是创建材料资源并引用它们。这不如材料机制灵活,但更方便,而且往往是足够的。如果此属性的值与内部默认值不同,则优先于材质。

friction: real(3), “1 0.005 0.0001”:动态生成的接触对的接触摩擦参数。第一个数字是滑动摩擦力,作用在切平面的两个轴上。第二个数字是扭转摩擦力,作用在接触法线周围。第三个数字是滚动摩擦力,作用在切平面的两个轴上。

mass: real, optional:如果指定此属性,则忽略下面的密度属性,并使用几何形状和均匀密度假设从给定质量计算几何密度。

density: real, “1000”:用于计算geom质量和惯性的材料密度。计算基于几何形状和均匀密度假设。内部默认值1000是以SI为单位表示的水的密度。此属性仅在未指定上面的mass属性时使用。

solref, solimp:接触仿真约束求解器参数。

margin: real, “0”:距离阈值,低于此阈值的接触被检测并包含在全局数组mjData.contact中。然而,这并不意味着会产生接触力。只有当两个几何表面之间的距离低于边缘间隙时,接触才被认为是有效的。

pos: real(3), “0 0 0”:几何体的位置,在父主体的框架中指定。

hfield: string, optional:当且仅当geom类型为“hfield”时,必须指定此属性。它引用要在几何体框架的位置和方向上实例化的高度场资源。

mesh: string, optional:如果几何体类型是“mesh”,这个属性是必需的。它引用要实例化的网格资源。如果几何类型对应于一个几何原语,即“球体”、“胶囊”、“圆柱体”、“椭球”、“盒子”之一,也可以指定此属性。在这种情况下,原语会自动匹配到这里引用的网格资源。拟合过程由编译器的属性fitaabb决定,要么使用等效惯性盒,要么使用网格的轴向包围盒。拟合几何体的最终大小通常是人们所期望的,但如果不是,它可以用下面的fitscale属性进一步调整。

fitscale: real, “1”:此属性仅在原始几何类型被用于网格资源时使用。这里指定的刻度是相对于自动拟合程序的输出。默认值1使结果保持不变,值2使拟合几何体的所有尺寸增大两倍。

body/⁠site (*)

​ 这个元素创建了一个场地,这是一种简化和限制的geom。geom属性的一小部分在这里可用。语义上,site代表了与body框架相关的感兴趣的位置。site不参与碰撞和计算物体质量和惯性。可用于呈现site的几何形状仅限于可用geom类型的一个子集。然而,在一些不允许使用geom的地方,可以使用site:安装传感器,指定空间肌腱的过点,构造执行器的滑块曲柄传动。

name: string, required:场地名称

class: string, optional:用于设置未指定属性的默认类。

type: [sphere, capsule, ellipsoid, cylinder, box], “sphere”:几何形状的类型。这用于渲染,并且还确定触摸传感器的主动传感器区域。

material: string, optional:用于指定site视觉属性的材料。

rgba: real(4), “0.5 0.5 0.5 1”:颜色和透明度。如果这个值与内部默认值不同,它将覆盖相应的材质属性。

size: real(3), “0.005 0.005 0.005”:代表场地的几何形状的大小。

fromto: real(6), optional:此属性只能用于胶囊、圆柱体、椭球和盒状场地(capsule, ellipsoid, cylinder, box)。它提供了场地长度以及框架位置和方向的另一种规范。这六个数字是一个点的三维坐标,后面跟着另一个点的三维坐标。场地的细长部分连接了这两个点,场地框架的+Z轴从第一个点指向第二个点。获取框架方向的过程与在帧方向中描述的zaxis属性相同。框架位置在两点之间的中间。如果指定了此属性,则忽略其余与位置和方向相关的属性。

pos: real(3), “0 0 0”:场地框架的位置。

quat, axisangle, xyaxes, zaxis, euler:场地框架的旋转方向。

body/⁠camera (*)

​ 这个元素创建了一个相机,它随着定义的物体移动。要创建固定摄像机,请在world body中定义它。这里创建的相机是默认自由相机的补充,默认自由相机是通过visual定义和调整的。MuJoCo内部使用灵活的相机模型,视点和投影面可以独立调整,从而获得虚拟环境所需的倾斜投影。但是,这个功能不能通过MJCF访问。相反,用这个元素创建的相机(以及自由相机)有一个视点,它总是在投影表面的前面居中。视点与照相机的中心重合。照相机沿着它的框架的-Z轴看。+X轴向右,+Y轴向上。因此,框架的位置和方向是这里需要做的关键调整。

name: string, required:相机名称

class: string, optional:用于设置未指定属性的默认类。

mode: [fixed, track, trackcom, targetbody, targetbodycom], “fixed”:这个属性指定了相机在世界坐标中的位置和方向如何在正运动学中计算(这反过来决定了相机看到的内容)。

​ “fixed”意味着下面指定的位置和方向相对于父对象(即定义摄像机的主体)是固定的。

​ “track”意味着摄像机的位置在世界坐标中与父节点有一个恒定的偏移,而摄像机的方向在世界坐标中是恒定的。这些常数是通过在qpos0中应用正运动学并将摄像机视为固定来确定的。例如,track可以用于将摄像机放置在身体上方,将其向下指向,以便看到身体,并且无论身体如何转换和旋转,它都始终保持在身体上方。

​ “trackcom”类似于“track”,但恒定的空间偏移量是相对于从母体开始的运动学子树的质心定义的。这可以用来保持对整个机制的关注。注意,world body的子树质心是整个模型的质心。因此,如果相机在世界体中被定义为“trackcom”模式,它将跟踪整个模型。

​ “targetbody”意味着摄像机的位置固定在父主体中,而摄像机的方向被调整,因此它总是指向目标主体(这是用下面的target属性指定的)。例如,这可以用来模拟一只盯着移动物体的眼睛;物体将成为目标,相机/眼睛将被定义在与头部相对应的身体中。

​ “targetbodycom”与“targetbody”相同,但相机朝向从目标体开始的子树的质心。

target: string, optional:当摄像机模式为“targetbody”或“targetbodycom”时,该属性变为必需。它指定相机应该瞄准哪个身体。在所有其他模式中,此属性将被忽略。

fovy: real, “45”:相机的垂直视场,以度表示,无论全局角度设置如何。根据窗口大小和垂直视场自动计算水平视场。

pos: real(3), “0 0 0”:相机框架的位置。

quat, axisangle, xyaxes, zaxis, euler:相机框架的旋转方向。euler围绕三个坐标轴的旋转角度。

body/⁠light (*)

​ 这个元素产生光,它随着物体的移动而移动。要创建一个固定的光,在世界体中定义它。这里创建的灯是默认前照灯的补充,默认前照灯是通过visual元素定义和调整的。灯光的效果是可叠加的,因此增加一盏灯总是使场景更明亮。可以同时激活的灯的最大数量是8个,包括前灯。光线沿着dir属性指定的方向照射。它没有三个正交轴的完整空间框架。

name: string, required:光名称

class: string, optional:用于设置未指定属性的默认类。

mode: [fixed, track, trackcom, targetbody, targetbodycom], “fixed”:这与上面相机的mode属性相同。它指定了如何在正运动学中计算世界坐标中的光线位置和方向(这反过来决定了光线照亮的内容)。

target: string, optional:这与上面相机的target属性相同。

directional: [false, true], “false”:如果此属性为“true”,则光线是定向的,否则它是聚光灯。

castshadow: [false, true], “true”:如果此属性为“true”,则光线将投射阴影。更准确地说,被光照射的几何体会产生阴影,但这是光的属性,而不是几何体的属性。

active: [false, true], “true”:如果此属性为“true”,则灯是激活的。这可以在运行时用于打开和关闭灯。

pos: real(3), “0 0 0”:框架的位置。

dir: real(3), “0 0 -1”:光的方向。

diffuse: real(3), “0.7 0.7 0.7”:光的漫射色。

specular: real(3), “0.3 0.3 0.3”:光的反射颜色。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值