Mujoco是一个很好的仿真工具。你可能对它很熟悉,因为它强化学习领域受到众多学者的青睐,在OpenAI Gym中也有Mujoco的使用。 Mujoco提供了超快的动力学模拟,重点是接触动力学。它对于模拟机器人手臂和抓取任务特别有效,在模型预测控制和机器人模仿学习研究的文章中也颇具价值。
获取更多内容,请访问博主的个人博客 爱吃猫的小鱼干的Blog
Mujoco官网有一个常用的模型库,可以满足基本需求。但我们也可以针对特定的需求建立自己的模型,这在Mujoco中是比较容易的。定义一个模型有两个部分。
对于STL的操作,我们使用SketchUp(草图大师),它是免费提供的,并且操作简单容易上手。
这篇文章将从SketchUp中的一些基本设置开始,完成将机器人模型拆分,导出为各个关节组件的STL文件的任务(假设你已经完成了3D建模),最终生成Mujoco XML机器人描述文件的步骤。
如果你还没有完成3D建模,不妨在网上快速搜索一下,有很多免费的3D模型可供下载使用。例如在Github、https://www.traceparts.com/en等网站寻找3D模型。本文不打算涉及任何3D建模的内容。
导入你的STL模型之前,在打开文件窗口中中选择你的文件,然后点击导入旁边的选项按钮,选择模型所定义的单位。如果你导入模型却看不到它,很可能是导入过程中选择的单位不正确,模型实在是太小而无法看到。
Mujoco使用你的STL模型中指定的单位。当使用相同的单位时,事情通常是最简单的。要修改模型导出时的单位,请到窗口 > 模型信息 > 单位 > 长度。
在SketchUp中进行任何测量之前,请在 模型信息 中改变你的测量精度,精度为最大的数字,以确保你得到准确的测量结果(在建立Mujoco XML时需要)。
自动捕捉往往带来一些问题,要禁用它,请进入模型信息 > 单位,并取消点击 "长度捕捉 "和 “角度捕捉”。
将默认视图设置为X射线模式会很有帮助,这样在操作组件时就可以看到模型内部。请进入 样式 > 默认样式 > X射线。
一个常见的状况是你有一个完整的机器人3D模型(就像上面的示意图中的机器人一样)。在这种情况下,建立Mujoco模型的第一步是为机器人的每个组件生成单独的STL文件,你希望能够独立控制每一个组件的运动。对于这些组件的每个STL文件,我们希望它连接到关节的点在原点 ( 0 , 0 , 0 ) (0,0,0) (0,0,0) ,因为这样可以简化在XML中建立模型的过程,并使正确指定惯性属性变得更加容易。
如果你的3D模型已经被分解成每个独立的组件,那么你可以跳到以原点为中心的部分。
确保你已经解锁了模型。要做到这一点,请使用 选择工具 突出显示整个模型。右击模型,并选择炸开模型(或打散)。
要得到单独的组件。例如,选择整个手臂,然后删除其余部分。选择 文件 > 导出 > 三维模型 > STL。点击文件格式右侧的 选项 ,导出你的模型时,一定不要把你的模型保存为ASCII格式,选择二进制。重复此操作,直到将每个部件导出为自己的STL。
对于每个组件,需要确定它的哪个位置将会连接到其它组件,即连接机器人其它部分的关节点位置。我们要设置STL,使这个点在原点。通过这样做,我们可以简化以后构建XML文件的过程。
最简单的方法是用移动工具点击对象上的一个点,输入[0, 0, 0],然后按回车键。这将会把选定的点移动到原点。或者用移动工具点击对象上的一个点后,将其移动到坐标系原点。
当选择下一个关节点时,需要测量其坐标。我们需要知道每个组件关节点的所有偏移距离,以便建立XML文件,所以一定要记下来!
一个完整的Mujoco模拟器应该包含三部分:
当你在构建你的XML文件时,最好参考官方说明Mujoco XML Reference。它是超级详细和彻底的,你主要需要关注官方对XML中各个标签的解释和它包含的各个属性的作用。这些内容主要包含在文档的asset和(world)body目录下。
在标准定义标签里面,我们主要使用以下三个部分。
: 用
tag导入STL文件;
:用
tag定义了所有的模拟器组件,包括灯光、地板以及你的机器人;
:定义可以执行运动的关节。定义的顺序需要按照运动学顺序来,比如多关节串联机器人以工具坐标附近的最后一个关节为joint0,依此类推。以下是一个XML的示例结构:
<mujoco model="example">
<compiler angle="radian" meshdir="meshes"/>
<asset>
<mesh file="base.STL" />
<mesh file="link1.STL" />
<mesh file="link2.STL" />
asset>
<worldbody>
<light directional="true" pos="-0.5 0.5 3" dir="0 0 -1" />
<geom name="floor" pos="0 0 0" size="1 1 1" type="plane" rgba="1 0.83 0.61 0.5"/>
<body name="hand" pos="0 0 0" mocap="true">
<geom type="box" size=".01 .02 .03" rgba="0 .9 0 .5" contype="2"/>
body>
<body name="base" pos="0 0 0">
<geom name="link0" type="mesh" mesh="base" pos="0 0 0"/>
<inertial pos="0 0 0" mass="0" diaginertia="0 0 0"/>
<body name="link1" pos="0 0 1">
<joint name="joint0" axis="0 0 1" pos="0 0 0"/>
<geom name="link1" type="mesh" mesh="link1" pos="0 0 0" euler="0 3.14 0"/>
<inertial pos="0 0 0" mass="0.75" diaginertia="1 1 1"/>
<body name="link2" pos="0 0 1">
<joint name="joint1" axis="0 0 1" pos="0 0 0"/>
<geom name="link2" type="mesh" mesh="link2" pos="0 0 0" euler="0 3.14 0"/>
<inertial pos="0 0 0" mass="0.75" diaginertia="1 1 1"/>
<body name="EE" pos="0 0.2 0.2">
<inertial pos="0 0 0" mass="0" diaginertia="0 0 0" />
body>
body>
body>
body>
worldbody>
<actuator>
<motor name="joint0_motor" joint="joint0"/>
<motor name="joint1_motor" joint="joint1"/>
actuator>
mujoco>
**设置body position 和 geoms **
在标签上的pos属性中设置与前一个
body
的偏移量,而不是在geoms
上。在
上你就可以设置pos="0 0 0"
,这有助于简化后面的调试。
在每个主体部分,你可以有多个
和。在同一主体上定义的geom
将被融合在一起。如果你有几个融合在一起的geom的特定惯性属性,你必须为每个geom
创建一个,以便能够实例化它们自己的
标签。否则,建议将它们都放在同一个中,以优化仿真速度。
Orientation and inertia(方向和惯性)
你可能需要旋转STLs,以便在您构建时将它们与机器人的其余部分正确对齐。你可以在或
标签中进行。如果你使用
标签,那么建议使用
标签内的euler参数,而不是在标签内。如果你在
标签中指定了旋转,还需要将相同的旋转应用于
参数,这使得事情变得复杂。
如果您没有提供
标签,惯性属性将由 geom 推断。
Contype 和 conaffinity
如果你不想让模型中的geom与其他部件发生碰撞,可以在geom标签上设置contype和conaffinity参数。如果你有一个紧密贴合的3D模型,并且遇到摩擦的问题,这可以很方便。
ABR控制的End-effector tag(末端执行器)标签
如果你要使用ABR控制库操作空间控制器,你需要在你要控制的机器人的点上添加一个标签。通常是手。
这些设置在 Mujoco XML Reference 都有简洁明了的说明。
一旦你添加了你的机器人身体部分,保存XML并用Mujoco仿真器仿真测试,指令类似于这样(Mujoco simulate的路径和xml文件的路径) /.mujoco/mujoco200/bin/simulate file_path
。你可能需要通过反复调整参数和在Mujoco中查看模型来进行一些微调。在XML文件中除了感兴趣的关节,先注释掉所有其它的关节,会使测试更容易。
最后,希望这些经验能够对你有所帮助,建模愉快。
很可能是导入过程中选择的单位不正确,对象实在太小,看不清。打开STL文件时,在打开的文件窗口中选择你的文件,然后点击 "导入 "旁边的选项按钮来更改单位。
在这种情况下,你很可能有链接之间的碰撞。可以在链接之间添加一个小的间隙(确保在随后的链接和关节中考虑到这种转变),或者可以使用contype和conaffinity标签来设置模型,以便不计算两个组件之间的碰撞。
例如,上述示例XML中,将链接之间的接触geom设置为具有不同的contype和conaffinity值,这样它们就不会相互刮擦而阻止运动。
这通常是由于被实例化后与模型的另一部分接触而产生的。有时看起来不同的模型段之间显然没有接触,但实际上是有的,因为接触动力学是如此计算的。
只支持凸形。在模型运行时按 F1,可以查看用于计算接触动力学的形状。
为了解决这个问题,你需要分解成多个组件STL文件,然后在XML中把它们拼接起来。例如,在上面的骨架中,你需要把它分解成头骨和脊柱STL。
获取更多内容,请访问博主的个人博客 爱吃猫的小鱼干的Blog