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

简介: MuJoCo 入门教程(四)建模

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

2.9.1 组禁用

       执行器组禁用属性(可在运行时通过设置 mjOption.disableactuator 整数位域进行更改)允许用户根据执行器组禁用执行器组。当用户希望在同一运动学树中使用多种类型的执行器时,这一功能非常方便。例如,考虑到机器人的固件支持多种控制模式,如扭矩控制和位置控制。在这种情况下,可以在同一个 MJCF 模型中定义这两种类型的执行器,将其中一种类型的执行器分配到组 0,另一种类型的执行器分配到组 1。

       执行器组禁用 MJCF 属性选择了默认禁用的执行器组,可在运行时设置 mjOption.disableactuator 以切换活动执行器组。请注意,执行器总数 mjModel.nu 和执行器指数都保持不变,因此用户需要知道禁用执行器的 mjData.ctrl 值将被忽略,并且不会产生力。本示例模型有三个执行器组,可以在运行时在仿真交互式查看器中进行切换。请参见右侧的示例模型和相关屏幕截图。

2.9.2 快捷方式

       如计算一章的执行模型部分所述,MuJoCo 提供了一个灵活的执行器模型,其中的传动、激活 动力学和力生成组件可以独立指定。用户可通过 XML 通用元素访问全部功能,从而创建各种自定义致动器。此外,MJCF 还提供了配置常用执行器的快捷方式。这可通过 XML 元素电机、位置、速度、速度内、阻尼器、气缸、肌肉和附着力来实现。这些都不是单独的模型元素。在内部,MuJoCo 只支持一种执行器类型 —— 这就是为什么在保存 MJCF 模型时,所有执行器都被写为通用执行器的原因。快捷方式隐式地创建通用执行器,将其属性设置为合适的值,并以可能不同的名称公开属性子集。例如,位置创建了一个位置伺服,其属性 kp 是伺服增益。然而,general 没有 kp 属性。相反,解析器会以协调的方式调整通用执行器的增益和偏置参数,以模仿位置伺服。如果直接使用 general 执行器,并将其属性设置为下文所述的特定值,也可以达到同样的效果。

       执行器快捷方式还与默认设置相互影响。记得默认设置机制涉及到类,每个类都有一个完整的虚拟元素集合(每种元素类型一个),用于初始化实际模型元素的属性。特别是,每个默认类只有一个通用执行器元素。如果我们在同一个默认设置类中先指定位置,然后再指定速度,会发生什么情况?XML 元素是按顺序处理的,每次遇到与执行器相关的元素时,都会设置单个通用执行器的属性。因此速度优先。然而,如果我们在缺省值类中指定 general,那么它只会设置明确给出的属性,而其他属性则保持不变。在创建实际模型元素时也会出现类似的复杂情况。假设活动缺省值类指定了 position,而现在我们使用 general 创建了一个执行器,并省略了它的某些属性。缺失的属性将被设置为用于位置伺服建模的任何值,尽管这个执行器可能并不打算用作位置伺服。

       鉴于这些潜在的复杂性,我们建议采用一种简单的方法:在默认类和实际模型元素的创建 中使用相同的执行器快捷方式。如果给定模型需要不同的致动器,要么创建多个默认类,要么避免使用致动器默认类,而是明确指定其所有属性。

2.9.3 力限制

       执行器的力通常受下限和上限的限制。这些限制可通过三种方式实现:

使用 ctrlrange 控制箝位:

       如果设置了该执行器属性,输入控制值将被箝位。对于简单的电机,控制输入的箝位等同于力输出的箝位。

通过 forcerange 在执行机构输出端进行力箝位:

       如果设置了该执行机构属性,执行机构的输出力将被箝位。该属性对位置执行器等非常有用,可以将力控制在一定范围内。需要注意的是,位置执行器通常也需要控制范围夹紧,以避免触及关节限制。

使用 joint/actuatorfrcrange 在关节输入处夹紧力:

       该关节属性可在通过传动装置后,夹紧作用在关节上的所有执行器的输入力。如果传动是微不足道的(传动装置和关节之间是一对一的关系),那么在关节处夹紧作动器的力就等同于在作动器处夹紧力。然而,在多个执行器作用于一个关节或一个执行器作用于多个关节,但实际扭矩是由关节处的单个物理执行器施加的情况下,最好将力夹紧在关节本身。下面举三个例子,说明在关节而不是作动器上夹紧作动器的力是可取的:

  • 在这个示例模型中,两个执行器(一个电机和一个阻尼器)作用在一个关节上。
  • 在本示例模型(类似于 "杜宾车")中,两个致动器通过一个固定的腱传动装置作用于两个车轮,以施加对称(向前/向后滚动)和非对称(向右/向左转弯)扭矩。
  • 在这个示例模型中,一个场地传动装置实现了手臂末端执行器的笛卡尔控制器。为了使计算出的扭矩能够通过单个扭矩受限的关节电机实现,需要在关节处夹紧扭矩。

       需要注意的是,在这种情况下,如果力/力矩由传动装置合成,则应使用 jointactuatorfrc 传感器来报告作用在关节上的总致动器力。标准致动器 frc 传感器将继续报告预夹紧的致动器力。

       上述三种夹紧方式并不完全相同,可以根据需要进行组合。

2.9.4 长度范围

       字段 mjModel.actuator_lengthrange 包含可行的致动器长度范围(或更准确地说,致动器传动装置的长度)。这是仿真肌肉推杆所必需的。这里我们将重点讨论 actuator_lengthrange 的含义和设置方法。

       mjModel 的所有其他字段都是精确的物理或几何量,而 actuator_lengthrange 则不同,它是一个近似值。直观地说,它对应于在模型的所有 "可行 "配置中,执行器传输所能达到的最小和最大长度。然而,MuJoCo 约束是柔性的,因此原则上任何配置都是可行的。然而,我们需要一个明确定义的肌肉建模范围。有三种方法可以设置这个范围:(1)使用所有执行器都有的新属性 lengthrange 明确提供;(2)从执行器所连接的关节或肌腱的极限中复制;(3)自动计算,如本节其余部分所解释的。这里有很多选择,可以用新的 XML 元素 lengthrange 来控制。

       推杆长度范围的自动计算在编译时完成,计算结果存储在编译模型的 mjModel.actuator_lengthrange 中。如果模型被保存(XML 或 MJB),下次加载时就不需要重复计算。这一点非常重要,因为在使用大型肌肉骨骼模型时,计算会减慢模型编译器的运行速度。事实上,我们将编译器设置为多线程,就是为了加速这一操作(不同的执行器在不同的线程中并行处理)。顺便提一下,这也是为什么在 Linux 和 macOS 上将用户代码与 MuJoCo 库链接时需要使用"-pthread "标记的原因。

       自动计算依赖于修改后的物理仿真。对于每个执行器,我们通过执行器的传动装置施加力(计算最小值时施加负力,计算最大值时施加正力),在避免不稳定性的阻尼状态下推进仿真,给它足够的时间稳定下来并记录结果。这与带动量的梯度下降有关,事实上,我们已经尝试过基于梯度的显式优化,但问题是,我们不清楚应该优化什么目标(考虑到软性约束的混合)。通过仿真,我们基本上可以让物理学告诉我们应该优化什么。但请记住,这仍然是一个优化过程,因此它的参数可能需要调整。我们提供了保守的默认值,这些默认值应适用于大多数模型,但如果不适用,可使用 lengthrange 的属性进行微调。

       在使用这一功能时,必须牢记模型的几何形状。这里隐含的假设是可行的推杆长度确实有限。此外,我们并不认为接触是限制因素(事实上,在本仿真中我们在内部禁用了接触,同时禁用的还有被动力、重力、摩擦损耗和推杆力)。这是因为带有接触的模型会纠结在一起,产生许多局部极小值。因此,推杆应受到限制,要么是由于模型中定义的关节或肌腱限制(在本次仿真中启用),要么是由于几何限制。为了说明后者,请考虑一条一端与世界相连,另一端与围绕与世界相连的铰链接头旋转的物体相连的肌腱。在这种情况下,肌腱的最小长度和最大长度是明确定义的,并且取决于连接点在空间中划出的圆的大小,即使关节和肌腱都没有用户定义的限制。但是,如果推杆连接到关节上,或者连接到与关节等长的固定腱上,那么它的长度就是无限的。在这种情况下,编译器会返回错误,但它无法判断错误是由于收敛性不足,还是因为执行器长度不受限制。所有这一切听起来都过于复杂,因为我们在这里考虑了所有可能的角情况。在实际应用中,长度范围几乎总是与连接到空间肌腱上的肌肉致动器一起使用,模型中会定义关节限制,从而有效限制肌肉执行器的长度。如果在这样的模型中出现收敛错误,最有可能的解释是你忘了包含关节限制。

2.9.5 状态执行器

       正如 "计算 "一章的 "执行器模型 "部分所述,MuJoCo 支持具有内部动力学的致动器,其状态称为 "激活"。

2.9.5.1 激活限制

       有状态执行器的一个有用应用是 "综合速度 "执行器,由 intvelocity 快捷键实现。与直接反馈传输目标速度的纯速度执行器不同,综合速度执行器将积分器与位置反馈执行器结合在一起。在这种情况下,激活状态的语义是 "位置执行器的设定点",而控制信号的语义是 "位置执行器设定点的速度"。请注意,在实际的机器人系统中,这种集成速度致动器是最常见的具有速度语义的致动器实现方式,而不是纯粹的速度反馈,后者往往相当不稳定(无论是在现实生活中还是在仿真中)。

       在集成速度致动器的情况下,通常需要对激活状态进行箝位,否则位置目标会不断积分,超出关节极限,从而导致失控。要了解激活箝位的效果,请加载下面的示例模型:

       带激活限制的示例模型

<mujoco>
<default>
   <joint axis="0 0 1" limited="true" range="-90 90" damping="0.3"/>
   <geom size=".1 .1 .1" type="box"/>
</default>
<worldbody>
   <body>
      <joint name="joint1"/>
      <geom/>
   </body>
   <body pos=".3 0 0">
      <joint name="joint2"/>
      <geom/>
   </body>
</worldbody>
<actuator>
   <general name="unclamped" joint="joint1" gainprm="1" biastype="affine"
      biasprm="0 -1" dyntype="integrator"/>
   <intvelocity name="clamped" joint="joint2" actrange="-1.57 1.57"/>
</actuator>
</mujoco>

       请注意,尽管关节范围可以是度(默认)或弧度(取决于编译器/角度属性),但 actrange 属性始终以本地单位(弧度)指定。

2.9.5.2 肌肉

       我们提供了一套生物肌肉建模工具。如果用户想添加肌肉,只需在执行器部分添加一行 XML 即可:

<actuator>
    <muscle name="mymuscle" tendon="mytendon">
</actuator>

       生物肌肉的外观大相径庭,但一旦应用了一定的缩放比例,它们的表现却极为相似。我们的默认设置就采用了这种缩放比例,因此无需调整任何参数就能获得合理的肌肉模型。当然,要构建更详细的模型则需要调整参数,本节将对此进行说明。

       请记住,尽管肌肉模型相当精细,但它仍然是 MuJoCo 执行器的一种类型,与所有其他执行器一样遵守相同的约定。肌肉的定义可以使用一般定义,但快捷键 "肌肉 "更为方便。与所有其他致动器一样,力的产生机制和传递是独立定义的。然而,肌肉只有在与肌腱或关节传动装置相连时才具有(生物)物理意义。为具体起见,我们在此假定为肌腱传动。

       首先,我们讨论长度和长度缩放。传动装置(即 MuJoCo 肌腱)的可行长度范围将起到重要作用;请参见上文的长度范围部分。在生物力学中,肌肉和肌腱串联在一起,形成肌肉-肌腱致动器。我们的习惯略有不同:在 MuJoCo 中,具有空间属性(尤其是长度和速度)的实体是肌腱,而肌肉是一种抽象的发力机制,对肌腱产生拉力。因此,MuJoCo 中的肌腱长度对应于生物力学中的肌肉+肌腱长度。我们假设生物肌腱是无弹性的,长度 L T 保持不变,而生物肌肉长度 L M 则随时间变化。MuJoCo 的肌腱长度是生物肌肉和肌腱长度的总和:

eq?eq?

       另一个重要的常数是肌肉的最佳静止长度,用 L 0 表示,它等于肌肉在零速度下产生最大主动力的长度 L M。我们不要求用户直接指定 L 0 和 L T,因为考虑到肌腱布线和缠绕的空间复杂性,很难知道它们的数值。相反,我们会自动计算 L 0 和 L T 如下。上述长度范围计算已经提供了 L T+L M 的工作范围。此外,我们还要求用户指定肌肉长度 L M 的工作范围,该范围由常数 L 0(仍然未知)缩放。现在我们可以利用实际范围和缩放范围必须相互映射这一事实来计算这两个常数:

L0L0

       在运行时,我们按以下方式计算按比例缩放的肌肉长度和速度:

L0L0

       缩放量的优势在于所有肌肉在该表示法中的表现相似。许多实验论文中测得的力-长度-速度(FLV)函数可以捕捉到这种行为。我们将该函数近似如下:

       函数的形式是

eq?eq?

       与 MuJoCo 激励器的一般形式相比,我们发现 F L⋅F V 是激励器增益,F P 是激励器偏置。FL 是作为长度函数的主动力,而 F V 是作为速度函数的主动力。二者相乘即可得到总的主动力(注意按 act 缩放,act 是致动器的激活力)。F P 是被动力,无论启动与否都始终存在。FLV 函数的输出是缩放肌力。我们将缩放力乘以肌肉特定常数 F 0,以获得实际力:

eq?eq?

       负号是因为正向肌肉激活会产生拉力。常数 F 0 是零速度时的峰值作用力。它与肌肉厚度(即生理横截面积或 PCSA)有关。如果已知,可通过元素肌肉的属性力进行设置。如果不知道,我们将其默认设置为-1。在这种情况下,我们所依赖的事实是,较大的肌肉往往作用于移动重量较大的关节。属性标度将这种关系定义为

actuatoractuator

。。。。。。省略(肌肉因为暂时用不到,眼花了,暂时不翻译了)

2.10 传感器

       MuJoCo 可仿真各种传感器,如下文传感器元素所述。也可定义用户传感器类型,并通过回调 mjcb_sensor 进行评估。传感器不会影响仿真。相反,它们的输出会复制到数组 mjData.sensordata 中,供用户处理。

       在此,我们将描述所有传感器类型共有的 XML 属性,以避免以后重复。

name:字符串,可选

       传感器名称。

noise:实数,"0"

       启用传感器噪声属性标志后,添加到传感器输出中的零均值高斯噪声的标准偏差。传感器噪声尊重传感器数据类型:四元数和单位矢量保持归一化,非负量保持非负。

截止值:实数,"0

       当此值为正时,它将限制传感器输出的绝对值。它也用于对 simulate.cc 中传感器数据图中的传感器输出进行归一化处理。

user:real(nuser_sensor), "0 0 ..."

       请参阅用户参数。

2.11 摄像机

       除了默认的、用户可控的自由摄像机外,"固定 "摄像机也可附加到运动学树上。

外在参数

       默认情况下,摄像机坐标系会附加到包含的主体上。可选的模式和目标属性可用于指定摄像机跟踪(与主体一起移动)或瞄准(观察)主体或子树。摄像机朝向摄像机坐标系的负 Z 轴,而正 X 轴和正 Y 轴分别对应图像平面的右侧和上侧。

内在参数

       摄像机本征使用 ipd(瞳孔间距,立体渲染和 VR 所需的距离)和 fovy(垂直视场角,单位为度)来指定。

       上述规范意味着完美的点阵相机没有像差。然而,在校准实际相机时,可以使用标准渲染管道表达两种线性像差。第一种是垂直和水平方向的焦距不同(轴对齐散光)。第二种是非中心主点。这些都可以使用焦点和主点属性来指定。使用这些校准相关属性时,还必须指定物理传感器尺寸和摄像机分辨率。在这种情况下,可以直观地看到渲染球面。

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

目录
相关文章
|
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 入门教程(四)建模
67 0
|
1月前
|
XML 数据可视化 编译器
MuJoCo 入门教程(四)建模(三)
MuJoCo 入门教程(四)建模
25 0
|
4月前
|
机器学习/深度学习 Python
【Python 机器学习专栏】堆叠(Stacking)集成策略详解
【4月更文挑战第30天】堆叠(Stacking)是机器学习中的集成学习策略,通过多层模型组合提升预测性能。该方法包含基础学习器和元学习器两个阶段:基础学习器使用多种模型(如决策树、SVM、神经网络)学习并产生预测;元学习器则利用这些预测结果作为新特征进行学习,生成最终预测。在Python中实现堆叠集成,需划分数据集、训练基础模型、构建新训练集、训练元学习器。堆叠集成的优势在于提高性能和灵活性,但可能增加计算复杂度和过拟合风险。
526 0
|
4月前
|
机器学习/深度学习 自然语言处理 算法
【Python机器学习】隐马尔可夫模型讲解及在中文分词中的实战(附源码和数据集)
【Python机器学习】隐马尔可夫模型讲解及在中文分词中的实战(附源码和数据集)
81 0