MuJoCo 入门教程(四)建模(一)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: MuJoCo 入门教程(四)建模

系列文章目录

 


前言

 


 

一、简介

       MuJoCo 可以加载本地 MJCF 格式的 XML 模型文件,也可以加载流行但较为有限的 URDF 格式的 XML 模型文件。本章是 MJCF 建模指南。参考手册可在 XML 参考一章中找到。URDF 文档可以在其他地方找到;这里我们只描述 MuJoCo 特有的 URDF 扩展。

       MJCF 模型可以表示具有多种特征和模型元素的复杂动力系统。访问所有这些特征需要丰富的建模格式,如果在设计时没有考虑到可用性,这种格式就会变得繁琐。因此,我们努力将 MJCF 设计成一种可扩展的格式,允许用户从小规模开始,以后再建立更详细的模型。在这方面特别有用的是广泛的默认设置机制,其灵感来自 HTML 中的层叠样式表(CSS)。它使用户能够快速创建新模型并进行实验。大量选项可用于重新配置仿真流水线,而快速重新加载则使模型编辑成为一个交互式过程,从而为实验提供了进一步帮助。

       我们可以将 MJCF 视为建模格式和编程语言的混合体。它有一个内置编译器,这是一个通常与编程语言相关的概念。虽然 MJCF 不具备通用编程语言的功能,但会根据模型的设计自动调用许多复杂的编译时计算。

1.1 加载模型

       正如 "概述 "一章的 "模型实例 "中所解释的,MuJoCo 模型可以从 MJCF 或 URDF 格式的纯文本 XML 文件加载,然后编译成底层 mjModel。另外,也可以直接从二进制 MJB 文件加载先前保存的 mjModel,该文件的格式没有记录,但基本上是 mjModel 内存缓冲区的副本。MJCF 和 URDF 文件通过 mj_loadXML 加载,而 MJB 文件则通过 mj_loadModel 加载。

       加载 XML 文件时,首先使用 TinyXML 内部解析器将其解析为文档对象模型(DOM)。然后对 DOM 进行处理,并将其转换为高级 mjCModel 对象。转换取决于模型格式--它是根据 XML 文件中的顶级元素而不是文件扩展名推断出来的。回想一下,一个有效的 XML 文件有一个唯一的顶层元素。对于 MJCF,该元素必须是 mujoco;对于 URDF,该元素必须是 robot。

1.2 编译模型

       一旦创建了高级 mjCModel(通过加载 MJCF 文件或 URDF 文件,或在此类功能可用时通过编程创建),它就会被编译到 mjModel 中。尽管加载和编译目前合并为一个步骤,但编译独立于加载,这意味着无论 mjCModel 是如何创建的,编译器都以相同的方式工作。解析器和编译器都会执行大量的错误检查,并在遇到第一个错误时终止。产生的错误消息包含 XML 文件中的行和列编号,不言自明,因此我们不在此记录。解析器使用自定义模式确保文件结构、元素和属性有效。然后,编译器会进行许多额外的语义检查。最后,对编译后的模型进行一次仿真,并拦截任何运行时错误。后者是通过(临时)设置 mju_user_error,使其指向一个抛出 C++ 异常的函数来实现的;如果需要,用户可以在运行时实现类似的错误拦截功能。

       整个解析和编译过程非常快,如果模型不包含需要通过仿真计算的大型网格或执行器长度范围,则整个过程不到一秒。这使得通过经常重新加载和可视化变化来交互式设计模型成为可能。请注意,simulate.cc 代码示例有一个重新加载当前模型的快捷键(Ctrl+L)。

1.3 保存模型

       一个 MJCF 模型可以由多个(包含的)XML 文件以及从 XML 引用的网格、高度域和纹理组成。编译后,所有这些文件的内容都会合并到 mjModel 中,然后可以使用 mj_saveModel 将其保存为二进制 MJB 文件。MJB 是一个独立文件,不会引用任何其他文件。它的加载速度也更快。因此我们建议将常用模型保存为 MJB 文件,并在需要仿真时加载。

       也可以使用 mj_saveLastXML 将编译后的 mjCModel 保存为 MJCF。如果相应 mjModel 中的任何实值字段在编译后被修改(这种情况并不常见,但在系统识别应用中可能会发生),则会在保存前自动将修改复制回 mjCModel。请注意,不能在编译后的模型中进行结构更改。XML 编写器会尝试生成最小的 MJCF 文件,以保证编译成相同的模型,其中不包括因纯文本表示实值而造成的可忽略的数字差异。生成的文件可能与原始文件结构不同,因为 MJCF 有许多方便用户的功能,允许以不同方式指定同一模型。XML 写入器使用的是 MJCF 的 "规范 "子集,其中所有坐标都是本地坐标,所有身体位置、方向和惯性属性都是明确指定的。在计算一章中,我们展示了一个 MJCF 文件示例和相应的保存示例。

二、MJCF 机制

       MJCF 使用多种机制来创建模型,这些机制跨越多个模型元素。为了避免重复,我们在本节中只详细描述一次。除了在 "计算 "一章中介绍的概念外,这些机制并不对应新的仿真概念。它们的作用是简化 MJCF 模型的创建,并使不同数据格式的使用无需手动转换为统一格式。

2.1 运动树

       MJCF 文件的主要部分是由嵌套的主体元素创建的 XML 树。顶层的主体是特殊的,称为 worldbody。这种树状结构与 URDF 形成鲜明对比,后者先创建链接集合,然后用指定子链接和父链接的连接点将它们连接起来。在 MJCF 中,从 XML 的意义上讲,子体就是父体的子体。

       当一个关节被定义在一个体内部时,它的功能不是连接父体和子体,而是在它们之间创建运动自由度如果给定的体内部没有定义关节,则该体将被焊接到其父体上。在 MJCF 中,一个体可以包含多个关节,因此无需引入虚拟体来创建复合关节。相反,只需在同一主体中定义构成所需复合关节的所有原始关节即可。例如,可以使用两个滑块和一个铰链来模拟在平面内运动的肢体。

       其他 MJCF 元素可以在嵌套的主体元素所创建的树中定义,特别是关节、几何体、场地、摄像机、灯光。当一个元素被定义在一个肢体内时,它就固定在该肢体的局部坐标系上,并始终随其移动。涉及多个机构或根本不涉及机构的元素,将在运动树之外的单独部分中定义。

2.2 默认设置

       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 值的设置感兴趣。由于采用了默认设置机制,上述创建的四个 geom 最终将具有以下 rgba 值:

geom type

geom rgba

box

1 0 0 1

ellipsoid

0 1 0 1

sphere

0 0 1 1

cylinder

1 0 0 1

        由于没有指定其他类,方框使用顶层默认类 "main "来设置其未定义属性的值。正文指定了子类 "sub",除非另有说明,否则该正文的所有子类(及其所有子类等)都将使用子类 "sub"。因此,椭圆体使用 "sub "类。球体明确定义了 rgba,可以覆盖默认设置。圆柱体指定的默认类是 "main",因此它使用的是 "main "而不是 "sub",尽管后者是在包含 geom 的 body 的 childclass 属性中指定的。

       现在我们来描述一下一般规则。MuJoCo 支持数量不限的默认类,这些默认类由 XML 中可能嵌套的默认元素创建。每个类都有一个唯一的名称  —— 这是一个必备属性,但顶层类除外,其名称如果未定义,则为 "main"。每个类还有一个完整的虚拟模型元素集合,其属性设置如下。当一个默认类被定义在另一个默认类中时,子类会自动继承父类的所有属性值。然后,子类可以通过定义相应的属性来覆盖部分或全部属性。顶层默认值类没有父类,因此其属性被初始化为内部默认值,参见参考章节。

       默认类中包含的虚拟元素并不是模型的一部分;它们只是用来初始化实际模型元素的属性值。当首次创建实际元素时,它的所有属性都会从默认类中当前处于活动状态的相应哑元素中复制。默认类总是处于活动状态,可以通过以下三种方式之一来确定。如果当前元素或其任何父体中没有指定类,则使用顶层类(无论其名称是 "main "还是其他)。如果当前元素中没有指定类,但它的一个或多个祖先体指定了一个子类,则使用离它最近的祖先体的子类。如果当前元素指定了一个类,那么无论其祖先主体中是否有任何子类属性,都会使用该类。

       某些属性,如主体惯性,可以处于特殊的未定义状态。这将指示编译器从其他信息中推断出相应的值,在这种情况下,编译器会推断出附着在主体上的 geoms 的惯性。未定义状态不能在 XML 文件中输入。因此,一旦给定类中定义了属性,该类或其任何子类中都不能对其进行未定义。因此,如果我们的目标是在给定的模型元素中不定义某个属性,那么它就必须在活动默认类中不被定义。

       最后一个转折点是执行器。它们之所以不同,是因为一些与执行器相关的元素实际上是快捷方式,而快捷方式与默认设置机制的交互方式并不明显。下文的执行器快捷方式部分将对此进行解释。

2.3 坐标系

       运动学树中定义的所有元素的位置和方向都用局部坐标表示,对于体来说是相对于父体的坐标,而对于geoms、关节、场地、摄像机和灯光来说,是相对于包含该元素的体的坐标

       编译器/角度是一个相关属性。它指定 MJCF 文件中的角度是用度还是弧度表示(编译后,角度始终用弧度表示)。

       位置用

pos: real(3), "0 0 0"

相对于父体的位置。

2.3.1 坐标系方向

       有几个模型元素具有与之相关的右手空间坐标系。除了关节之外,这些都是运动学树中定义的元素。空间坐标系由其位置和方向定义。指定三维位置非常简单,但指定三维方向则具有挑战性。因此,MJCF 提供了几种可供选择的机制。无论用户选择哪种机制,坐标系的方向总是在内部转换为单位四元数。回想一下,围绕单位向量 eq?eq? 给出的轴旋转一个角度的三维旋转对应于四元数 22 。还请注意,每个三维方位都可以通过绕某个轴旋转某个角度来唯一指定。

       所有具有空间坐标系的 MJCF 元素都允许使用下面列出的五个属性。坐标系的方向最多使用其中一个属性指定。quat 属性有一个与空旋转相对应的默认值,而其他属性则在特殊的未定义状态下初始化。因此,如果用户没有指定这些属性,坐标系就不会旋转。

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

       如果已知四元数,这是指定坐标系方向的首选方法,因为它不涉及转换。相反,它被归一化为单位长度,并在编译时复制到 mjModel 中。当模型保存为 MJCF 时,所有坐标系的方向都将使用此属性以四元数表示。

axisangle: real(4), optional

       这些数字就是上文提到的 eq?eq?。最后一个数字是旋转角度,单位为度或弧度,由编译器的角度属性指定。前三个数字决定了一个三维向量,即旋转轴。在编译过程中,该向量被归一化为单位长度,因此用户可以指定任何非零长度的向量。请记住,旋转是右旋的;如果向量(x,y,z)的方向相反,则旋转结果也会相反。改变 a 的符号也可以用来指定相反的旋转。

euler: real(3), optional

       围绕三个坐标轴的旋转角度。围绕这些坐标轴旋转的顺序由编译器的 eulerseq 属性决定,并且对整个模型都是一样的。

xyaxes: real(6), optional

       前 3 个数字是坐标系的 X 轴。接下来的 3 个数字是坐标系的 Y 轴,它会自动与 X 轴正交。然后将 Z 轴定义为 X 轴和 Y 轴的交叉积。

zaxis: real(3), optional

       坐标系的 Z 轴。编译器会找到最小的旋转,将向量 (0,0,1) 映射到此处指定的向量。这样就隐式地确定了坐标系的 X 轴和 Y 轴。这对于以 Z 轴为旋转对称轴的几何体以及沿其坐标系 Z 轴定向的灯光都很有用。

2.4 求解器参数

       计算一章中的求解器参数部分解释了 eq?deq?d 这些决定 MuJoCo 中约束行为的量的数学和算法含义。这里我们将解释如何设置它们。设置是通过属性 solref 和 solimp 间接完成的,所有涉及约束的 MJCF 元素都有这两个属性。这些参数可以根据每个约束或每个缺省值类进行调整,也可以保持未定义 —— 在这种情况下,MuJoCo 使用下图所示的内部缺省值。还请注意选项中提供的覆盖机制;它可用于在运行时更改所有与接触相关的求解器参数,以便对参数设置进行交互式试验或实施数值优化的延续方法。

       在这里,我们只关注一个标量约束。使用与 "计算 "一章略有不同的符号,让 表示加速度,eq?veq?v 表示速度,eq?req?r 表示位置或残差(在摩擦维度中定义为 0),eq?keq?keq?beq?b 表示虚拟弹簧的刚度和阻尼,用于定义参考加速度 eq?a_%7B%5Cmathrm%7Bref%7D%7D%3D-bv-kreq?a_%7B%5Cmathrm%7Bref%7D%7D%3D-bv-kreq?deq?d是约束阻抗,eq?a0eq?a0 表示没有约束力时的加速度。我们之前的分析表明,约束空间中的动力学近似于

eq?a_1+d%5Ccdot%28bv+kr%29%3D%281-d%29%5Ccdot%20a_0eq?a_1+d%5Ccdot%28bv+kr%29%3D%281-d%29%5Ccdot%20a_0

       同样,用户可控制的参数有 eq?deq?d。其余量是系统状态的函数,在每个时间步长自动计算。

2.4.1 阻抗

       我们首先解释一下约束阻抗 eq?deq?d.

阻抗的直观描述

       阻抗 d∈(0,1) 与约束产生力的能力相对应。d 值越小,约束越弱;d 值越大,约束越强。阻抗在任何时候都会对约束产生影响,尤其是当系统处于静止状态时。阻抗使用 solimp 属性设置。

       回想一下,eq?deq?d 必须介于 0 和 1 之间;MuJoCo 内部将其限制在 [mjMINIMP mjMAXIMP] 范围内,目前设置为 [0.0001 0.9999]。它使求解器在非强制加速度 eq?a0eq?a0 和参考加速度 eq?a_%7Bref%7Deq?a_%7Bref%7D 之间进行内插。用户可以将 eq?deq?d 设为常量,也可以利用其插值特性,使其与位置相关,即与约束违反 eq?req?r 相关的函数。与位置相关的阻抗可用于对物体周围的柔性接触层进行建模,或定义随着违反程度的增大而变得更强的相等约束(例如用于近似反向间隙)。函数 eq?deq?d 的形状由元素特定参数向量 solimp 决定。

solimp : real(5), "0.9 0.95 0.001 0.5 2"

这五个数字(eq?d0eq?d0)是 eq?deq?d  的参数,即阻抗 eq?deq?d 与违反约束条件 eq?req?r 的函数关系。

前 3 个数值表明,当 eq?req?r 从 0 到  eq?widtheq?width 变化时,阻抗将平滑变化:

eq?deq?d

如下图所示,第 4 和第 5 个值,即中点和功率,控制着在 d 0 和 widthd 宽度之间插值的正余弦函数的形状。由于阻抗 d(r) 取决于 r 的绝对值,因此图中显示的是两个反射的四边形。

用于生成函数的多项式样条曲线的幂必须大于等于 1。中点(指定拐点)必须介于 0 和 1 之间,并以宽度单位表示。请注意,当幂次为 1 时,无论中点在哪里,函数都是线性的。

这些图显示了纵轴上的阻抗 d(r)与横轴上的违反约束条件 r 的函数关系。

对于相等约束,r 即为违反约束。对于极限、椭圆锥体的法线方向和金字塔锥体的所有方向,r 是(极限或接触)距离减去约束生效的边距;对于接触,这个边距就是边距。当 r<0(穿透)时,极限约束和接触约束生效。

对于椭圆锥体的摩擦损耗或摩擦尺寸,违规 r 同等于零,因此只有 d(0) 会影响这些约束,所有其他 solimp 值都会被忽略。

提示

对于完全平滑的动力学,极限和接触应为 =0。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.5 接触参数

       计算章节的 "接触 "部分介绍了每个接触的参数。下面我们将解释如何设置这些参数。如果使用 XML 元素对明确定义了几何体对,则其属性可直接指定所有触点参数。在这种情况下,单个 geom 的参数将被忽略。另一方面,如果触点是由动态机制生成的,则其参数需要从触点对中的两个 geoms 中推断出来。如果两个几何体的参数完全相同,则无需做任何处理,但如果它们的参数不同呢?在这种情况下,我们将使用几何体属性 solmix 和优先级来决定如何组合它们。每个接触参数的组合规则如下:

2.5.1 condim

       如果两个 geom 中的一个优先级更高,则使用其 condim。如果两个 geom 的优先级相同,则使用两个 condim 中的最大值。通过这种方式,除非无摩擦geom的优先级更高,否则无摩擦geom和有摩擦geom会形成摩擦接触。例如,在粒子系统中,我们可能不希望粒子粘在任何物体上,而后者则是理想的选择。

2.5.2 friction

       请注意,接触点最多可以有 5 个摩擦系数:两个切向摩擦系数、一个扭转摩擦系数和两个滚动摩擦系数。实际上,mjData.contact 中的每个触点都有全部 5 个摩擦系数,即使 condim 小于 6 并且没有使用所有系数。相比之下,geoms 只有 3 个摩擦系数:切向(两轴相同)、扭转、滚动(两轴相同)。通过复制切向分量和滚动分量,每个摩擦系数的三维矢量都会扩展成一个摩擦系数的五维矢量。然后根据以下规则计算接触摩擦系数:如果两个几何体中的一个具有更高的优先级,则使用其摩擦系数。否则,将使用两个地基上每个摩擦系数的元素最大值。其原理类似于在 condim 上取最大值:我们希望摩擦力更大的地基获胜。每个接触点有 5 个摩擦系数,而每个几何点只有 3 个摩擦系数的原因如下。对于一对接触件,我们希望求解器能够处理最灵活的模型。如前所述,各向异性摩擦可以用来模拟滑行等效果。不过,这需要知道接触切平面的两个轴线是如何定向的。对于一对预定义的接触,我们事先知道两个几何体的类型,相应的碰撞函数总是以相同的方式生成接触坐标系--我们在此不做描述,但可以在可视化工具中看到。但是,对于单个几何体来说,我们不知道它们可能会与哪些其他几何体碰撞,也不知道它们的几何体类型是什么,因此在指定单个几何体时无法知道接触切平面的方向。这就是 MuJoCo 不允许在单个 geom 规范中使用各向异性摩擦力,而只允许在显式接触对规范中使用的原因。

2.5.3 边距,间隙 margin, gap

       使用两个几何边距(或间隙)的最大值。这里忽略了几何优先级,因为边距和间隙都是距离属性,单边规范意义不大。

2.5.4 solref, solimp

       如果两个 geom 中的一个优先级更高,则使用其 solref 和 solimp 参数。如果两个地理坐标的优先级相同,则使用加权平均值。权重与 solmix 属性成正比,即 weight1 = solmix1 / (solmix1 + solmix2),类似地 weight2 也是如此。这一加权平均规则有一个重要的例外。如果任一地理坐标的 solref 为非正值,即依赖于直接格式,那么无论 solmix 如何,都将使用元素最小值。这是因为对不同格式的 solref 参数进行平均是毫无意义的。

2.6 接触覆盖

       MuJoCo 使用了一个精心设计的新颖约束模型,该模型在 "计算 "一章中有所描述。要直观了解该模型的工作原理,需要进行一些实验。为了方便这一过程,我们提供了一种机制,可以在不更改实际模型的情况下覆盖部分求解器参数。一旦覆盖被禁用,仿真就会恢复到模型中指定的参数。这种机制还可用于在数值优化(如最优控制或状态估计)的背景下实施延续方法。具体做法是,在优化的早期阶段,允许接触从远处起作用,以帮助优化器找到梯度并接近好的解 决方案,并在后期减少这种影响,使最终解决方案符合物理实际。

       这里的相关设置包括:flag 的覆盖属性,用于启用或禁用这一机制;option 的 o_margin、o_solref、o_solimp 属性,用于指定新的求解器参数。请注意,覆盖仅适用于接触,而不适用于其他类型的约束。原则上,MuJoCo 模型中有许多实值参数可以从类似的覆盖机制中受益。然而,我们必须在某个地方划出一条界线,而接触是自然的选择,因为它们会产生最丰富但最难调整的行为。此外,接触动力学通常会给数值优化带来挑战,而经验表明,接触参数的持续性有助于避免局部最小值。

2.7 用户参数

       一些 MJCF 元素具有可选属性 user,它定义了一个自定义元素特定参数数组。它与 size 元素的相应 "nuser_XXX "属性交互。例如,如果我们将 nuser_geom 设置为 5,那么 mjModel 中的每个 geom 都会有一个由 5 个实值参数组成的自定义数组。在 MJCF 文件中,可以通过 geom 的用户属性定义这些特定于 geom 的参数,如果省略该属性,则编译器会将这些参数设置为 0。所有 "nuser_XXX "属性的默认值都是-1,它指示编译器自动将该值设置为模型中定义的最大相关用户属性的长度。MuJoCo 不会在任何内部计算中使用这些参数;相反,它们可用于自定义计算。解析器允许在 XML 中使用任意长度的数组,编译器随后会将这些数组的长度调整为 nuser_XXX。

       一些通常用于内部计算的特定元素参数也可用于自定义计算。这可以通过安装用户回调来实现,用户回调可以覆盖仿真管道的部分功能。例如,一般执行器元素具有 dyntype 和 dynprm 属性。如果 dyntype 被设置为 "用户",那么 MuJoCo 将调用 mjcb_act_dyn 来计算执行器的动力学,而不是调用其内部函数。mjcb_act_dyn 指向的用户函数可以任意解释 dynprm 中定义的参数。不过,这个参数数组的长度不能改变(与前面描述的自定义数组不同,后者的长度是在 MJCF 文件中定义的)。这一点同样适用于其他回调。

       除了上述特定于元素的用户参数外,我们还可以通过自定义元素在模型中包含全局数据。对于在仿真过程中发生变化的数据,还有数组 mjData.userdata,其大小由 size 元素的 nuserdata 属性决定。

2.8 求解器设置

       计算约束力和约束加速度需要数值求解一个优化问题。MuJoCo 有三种求解优化问题的算法:CG、牛顿和 PGS。每种算法都可以应用于摩擦锥的金字塔模型或椭圆模型,以及密集或稀疏的约束雅各布。此外,用户还可以指定最大迭代次数和控制提前终止的容差水平。此外,还有第二个 Noslip 求解器,这是一个后处理步骤,通过指定正数的 Noslip 迭代次数即可启用。所有这些算法设置都可以在选项元素中指定。

       默认设置适用于大多数模型,但在某些情况下有必要调整算法。最好的方法是试验相关设置,并使用 simulate.cc 中的可视化剖析器,它可以显示不同计算的时间以及每次迭代的求解器统计数据。我们可以提供以下一般指导和意见:

  • 对于小型模型,约束雅各比应该是密集的,而对于大型模型,约束雅各比应该是稀疏的。默认设置为 "自动";当自由度数不超过 60 时,它解析为密集,超过 60 时则解析为稀疏。但请注意,阈值最好根据活动约束的数量来定义,这与模型和行为有关。
  • 在金字塔形摩擦锥和椭圆形摩擦锥之间进行选择是一种建模选择,而不是算法选择,也就是说,它导致了用相同算法求解的不同优化问题。椭圆锥更贴近物理现实。不过,金字塔锥可以提高算法的性能,但不一定。虽然默认值为金字塔形,但我们建议尝试椭圆锥形。当接触滑移成为一个问题时,抑制它的最佳方法是使用椭圆锥、大的印迹率和公差极小的牛顿算法。如果这还不够,可以启用 Noslip 求解器。
  • 牛顿算法是大多数模型的最佳选择。它在全局最小值附近具有二次收敛性,迭代次数少得惊人--通常在 5 次左右,很少超过 20 次。在使用时,应尽量使用公差值,如 1e-10,因为它能够在不增加延迟的情况下实现高精度(由于最后的二次收敛)。我们只在具有椭圆锥和许多滑动接触的大型模型中见过它减速的情况。在这种情况下,Hessian 因式分解需要大量更新。在某些大型模型中,由于模型元素的排序不理想,导致高填充(计算最优消除顺序是 NP 难的,因此我们依靠启发式),计算速度也会减慢。请注意,可以在剖析器中监测因式分解赫塞斯中的非零点数。
  • CG 算法在上述牛顿减慢的情况下运行良好。一般来说,CG 算法具有良好的线性收敛性,但在迭代次数上无法与牛顿算法相提并论,尤其是在需要高精度的情况下。不过,CG 的迭代速度要快得多,而且不会受到填充或椭圆锥复杂性增加的影响。如果牛顿太慢,可以尝试 CG。
  • 当自由度数大于约束数时,PGS 求解器效果最佳。PGS 求解的是一个约束优化问题,根据我们的经验,它的收敛性是亚线性的,但通常在最初的几次迭代中进展迅速。因此,在可以容忍不精确解的情况下,它是一个不错的选择。对于具有大质量比或其他导致调节能力差的模型特性的系统,PGS 的收敛速度往往相当缓慢。请记住,PGS 执行的是顺序更新,因此会破坏物理本应对称的系统的对称性。相比之下,CG 和牛顿则执行并行更新并保持对称性。
  • Noslip 求解器是一种改进的 PGS 求解器。它在主求解器(可以是牛顿、CG 或 PGS)之后作为后处理步骤执行。主求解器更新所有未知数。相比之下,Noslip 求解器只更新摩擦维的约束力,而忽略约束正则化。这样做的效果是抑制由柔性约束模型引起的漂移或滑移。然而,这一连串的优化步骤不再是解决一个定义明确的优化问题(或任何其他问题),而只是一种临时机制。虽然它通常都能完成任务,但我们发现,在具有更复杂的多触点相互作用的模型中,它也会出现一些不稳定的情况。
  • PGS 在计算约束空间中的反惯性时需要设置成本(CPU 时间)。类似地,牛顿计算 Hessian 的初始因式分解也需要设置成本,而且根据以后需要更新多少因式分解,还会产生额外的因式分解成本。CG 没有任何设置成本。由于 Noslip 求解器也是一个 PGS 求解器,因此只要启用 Noslip,即使主求解器是 CG 或牛顿,也要支付 PGS 设置成本。主 PGS 和 Noslip PGS 的设置操作是相同的,因此当两者都启用时,只需支付一次设置费用。

2.9 执行器

       本节介绍在 MuJoCo 中使用执行器的各个方面。有关计算模型,请参阅执行模型。

MuJoCo 入门教程(四)建模(二)+https://developer.aliyun.com/article/1585356


目录
相关文章
|
9月前
|
机器学习/深度学习 缓存 自然语言处理
义无反顾马督工,Bert-vits2V210复刻马督工实践(Python3.10)
Bert-vits2更新了版本V210,修正了日/英的bert对齐问题,效果进一步优化;对底模使用的数据进行优化和加量,减少finetune失败以及电音的可能性;日语bert更换了模型,完善了多语言推理。
义无反顾马督工,Bert-vits2V210复刻马督工实践(Python3.10)
|
1月前
|
传感器 XML 存储
MuJoCo 入门教程(一)(下)
MuJoCo 入门教程(一)(上)
116 3
|
机器学习/深度学习 并行计算 计算机视觉
YOLOv5入门实践(5)——从零开始,手把手教你训练自己的目标检测模型(包含pyqt5界面)
YOLOv5入门实践(5)——从零开始,手把手教你训练自己的目标检测模型(包含pyqt5界面)
5798 1
YOLOv5入门实践(5)——从零开始,手把手教你训练自己的目标检测模型(包含pyqt5界面)
|
1月前
|
XML 数据可视化 机器人
MuJoCo 入门教程(四)建模(四)
MuJoCo 入门教程(四)建模(四)
75 2
|
1月前
|
XML 数据可视化 编译器
MuJoCo 入门教程(一)(上)
MuJoCo 入门教程(一)
127 2
|
1月前
|
XML 数据可视化 编译器
MuJoCo 入门教程(四)建模(三)
MuJoCo 入门教程(四)建模
25 0
|
1月前
|
传感器 XML 机器人
MuJoCo 入门教程(四)建模(二)
MuJoCo 入门教程(四)建模
47 0
|
4月前
|
机器学习/深度学习 Python
【Python 机器学习专栏】堆叠(Stacking)集成策略详解
【4月更文挑战第30天】堆叠(Stacking)是机器学习中的集成学习策略,通过多层模型组合提升预测性能。该方法包含基础学习器和元学习器两个阶段:基础学习器使用多种模型(如决策树、SVM、神经网络)学习并产生预测;元学习器则利用这些预测结果作为新特征进行学习,生成最终预测。在Python中实现堆叠集成,需划分数据集、训练基础模型、构建新训练集、训练元学习器。堆叠集成的优势在于提高性能和灵活性,但可能增加计算复杂度和过拟合风险。
526 0
|
4月前
|
机器学习/深度学习 自然语言处理 算法
【Python机器学习】隐马尔可夫模型讲解及在中文分词中的实战(附源码和数据集)
【Python机器学习】隐马尔可夫模型讲解及在中文分词中的实战(附源码和数据集)
81 0