【Tools-Mujoco】创建自定义的Mujoco模型

Mujoco是一个很好的仿真工具。你可能对它很熟悉,因为它强化学习领域受到众多学者的青睐,在OpenAI Gym中也有Mujoco的使用。 Mujoco提供了超快的动力学模拟,重点是接触动力学。它对于模拟机器人手臂和抓取任务特别有效,在模型预测控制和机器人模仿学习研究的文章中也颇具价值。

获取更多内容,请访问博主的个人博客 爱吃猫的小鱼干的Blog

前言

Mujoco官网有一个常用的模型库,可以满足基本需求。但我们也可以针对特定的需求建立自己的模型,这在Mujoco中是比较容易的。定义一个模型有两个部分。

  1. STL文件,这是机器人部件的3D模型(导入STL允许你创建个性化的Mujoco模型,如果你不打算这样做,那么可以直接从第二步开始,利用Mujoco中基本的几何图形——长方体、椭圆等快速建立简单的模型);
  2. XML文件,它规定了模型中的运动学和动态关系。

对于STL的操作,我们使用SketchUp(草图大师),它是免费提供的,并且操作简单容易上手。

这篇文章将从SketchUp中的一些基本设置开始,完成将机器人模型拆分,导出为各个关节组件的STL文件的任务(假设你已经完成了3D建模),最终生成Mujoco XML机器人描述文件的步骤。

如果你还没有完成3D建模,不妨在网上快速搜索一下,有很多免费的3D模型可供下载使用。例如在Github、https://www.traceparts.com/en等网站寻找3D模型。本文不打算涉及任何3D建模的内容。

Sketchup设置

  • 导入时设置模型单位

导入你的STL模型之前,在打开文件窗口中中选择你的文件,然后点击导入旁边的选项按钮,选择模型所定义的单位。如果你导入模型却看不到它,很可能是导入过程中选择的单位不正确,模型实在是太小而无法看到。


导入时设置模型单位
  • 设置导出的模型单位

Mujoco使用你的STL模型中指定的单位。当使用相同的单位时,事情通常是最简单的。要修改模型导出时的单位,请到窗口 > 模型信息 > 单位 > 长度。


设置导出时的模型单位
  • 测量精度

在SketchUp中进行任何测量之前,请在 模型信息 中改变你的测量精度,精度为最大的数字,以确保你得到准确的测量结果(在建立Mujoco XML时需要)。

  • 禁用捕捉

自动捕捉往往带来一些问题,要禁用它,请进入模型信息 > 单位,并取消点击 "长度捕捉 "和 “角度捕捉”。

  • Xray模式

将默认视图设置为X射线模式会很有帮助,这样在操作组件时就可以看到模型内部。请进入 样式 > 默认样式 > X射线。

如何从完整的机器人模型中保存一个单独的部件

一个常见的状况是你有一个完整的机器人3D模型(就像上面的示意图中的机器人一样)。在这种情况下,建立Mujoco模型的第一步是为机器人的每个组件生成单独的STL文件,你希望能够独立控制每一个组件的运动。对于这些组件的每个STL文件,我们希望它连接到关节的点在原点 ( 0 , 0 , 0 ) (0,0,0) (0,0,0) ,因为这样可以简化在XML中建立模型的过程,并使正确指定惯性属性变得更加容易。

如果你的3D模型已经被分解成每个独立的组件,那么你可以跳到以原点为中心的部分。

将各组件导出为单独的STL

确保你已经解锁了模型。要做到这一点,请使用 选择工具 突出显示整个模型。右击模型,并选择炸开模型(或打散)。


炸开模型

要得到单独的组件。例如,选择整个手臂,然后删除其余部分。选择 文件 > 导出 > 三维模型 > STL。点击文件格式右侧的 选项 ,导出你的模型时,一定不要把你的模型保存为ASCII格式,选择二进制。重复此操作,直到将每个部件导出为自己的STL。


导出各个组件的STL文件

将组件定位在原点

对于每个组件,需要确定它的哪个位置将会连接到其它组件,即连接机器人其它部分的关节点位置。我们要设置STL,使这个点在原点。通过这样做,我们可以简化以后构建XML文件的过程。

最简单的方法是用移动工具点击对象上的一个点,输入[0, 0, 0],然后按回车键。这将会把选定的点移动到原点。或者用移动工具点击对象上的一个点后,将其移动到坐标系原点。

当选择下一个关节点时,需要测量其坐标。我们需要知道每个组件关节点的所有偏移距离,以便建立XML文件,所以一定要记下来!

建立你的XML模型

一个完整的Mujoco模拟器应该包含三部分:

  • STL文件,即三维模型;
  • XML 文件,用于定义运动学和动力学关系;
  • 模拟器构建的py文件,使用mujoco-py将XML model创建成可交互的环境,供(强化学习)算法调用。

XML结构

当你在构建你的XML文件时,最好参考官方说明Mujoco XML Reference。它是超级详细和彻底的,你主要需要关注官方对XML中各个标签的解释和它包含的各个属性的作用。这些内容主要包含在文档的asset和(world)body目录下。

在标准定义标签里面,我们主要使用以下三个部分。

  • <asset> : 用<mesh> tag导入STL文件;
  • <worldbody>:用<body>tag定义了所有的模拟器组件,包括灯光、地板以及你的机器人;
  • <acutator>:定义可以执行运动的关节。定义的顺序需要按照运动学顺序来,比如多关节串联机器人以工具坐标附近的最后一个关节为joint0,依此类推。

以下是一个XML的示例结构:

<mujoco model="example">
    <!-- set some defaults for units and lighting -->
    <compiler angle="radian" meshdir="meshes"/>

    <!-- 导入STL文件 -->
    <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"/>
        <!-- the ABR Control Mujoco interface expects a hand mocap -->
        <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"/>

            <!-- nest each child piece inside the parent body tags -->
            <body name="link1" pos="0 0 1">
                <!-- this joint connects link1 to the base -->
                <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">
                    <!-- this joint connects link2 to link1 -->
                    <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"/>

                    <!-- the ABR Control Mujoco interface uses the EE body to -->
                    <!-- identify the end-effector point to control with OSC-->
                    <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 **

    <body>标签上的pos属性中设置与前一个body的偏移量,而不是在geoms上。在<joint>上你就可以设置pos="0 0 0",这有助于简化后面的调试。

    在每个主体部分,你可以有多个<joint>和。在同一主体上定义的geom将被融合在一起。如果你有几个融合在一起的geom的特定惯性属性,你必须为每个geom创建一个,以便能够实例化它们自己的<inertial>标签。否则,建议将它们都放在同一个中,以优化仿真速度。

  • Orientation and inertia(方向和惯性)

    你可能需要旋转STLs,以便在您构建时将它们与机器人的其余部分正确对齐。你可以在<body><geom>标签中进行。如果你使用<inertial>标签,那么建议使用<geom>标签内的euler参数,而不是在<body>标签内。如果你在 <body> 标签中指定了旋转,还需要将相同的旋转应用于 <inertia> 参数,这使得事情变得复杂。

    如果您没有提供 <inertial> 标签,惯性属性将由 geom 推断。

  • Contype 和 conaffinity

    如果你不想让模型中的geom与其他部件发生碰撞,可以在geom标签上设置contype和conaffinity参数。如果你有一个紧密贴合的3D模型,并且遇到摩擦的问题,这可以很方便。

  • ABR控制的End-effector tag(末端执行器)标签

    如果你要使用ABR控制库操作空间控制器,你需要在你要控制的机器人的点上添加一个标签<body name="EE" pos="0 0 0">。通常是手。

这些设置在 Mujoco XML Reference 都有简洁明了的说明。

一旦你添加了你的机器人身体部分,保存XML并用Mujoco仿真器仿真测试,指令类似于这样(Mujoco simulate的路径和xml文件的路径) /.mujoco/mujoco200/bin/simulate file_path 。你可能需要通过反复调整参数和在Mujoco中查看模型来进行一些微调。在XML文件中除了感兴趣的关节,先注释掉所有其它的关节,会使测试更容易。

最后,希望这些经验能够对你有所帮助,建模愉快。

一些问题和解决方法

  • SketchUp - 导入模型后看不到它

很可能是导入过程中选择的单位不正确,对象实在太小,看不清。打开STL文件时,在打开的文件窗口中选择你的文件,然后点击 "导入 "旁边的选项按钮来更改单位。

  • Mujoco - 我的手臂不动了,或者稍微移动一下就停止了。

在这种情况下,你很可能有链接之间的碰撞。可以在链接之间添加一个小的间隙(确保在随后的链接和关节中考虑到这种转变),或者可以使用contype和conaffinity标签来设置模型,以便不计算两个组件之间的碰撞。

例如,上述示例XML中,将链接之间的接触geom设置为具有不同的contype和conaffinity值,这样它们就不会相互刮擦而阻止运动。

  • Mujoco - 我的模型的一部分在疯狂地旋转。

这通常是由于被实例化后与模型的另一部分接触而产生的。有时看起来不同的模型段之间显然没有接触,但实际上是有的,因为接触动力学是如此计算的。

只支持凸形。在模型运行时按 F1,可以查看用于计算接触动力学的形状。

  • 脖子和下巴之间没有空间

为了解决这个问题,你需要分解成多个组件STL文件,然后在XML中把它们拼接起来。例如,在上面的骨架中,你需要把它分解成头骨和脊柱STL。

获取更多内容,请访问博主的个人博客 爱吃猫的小鱼干的Blog

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值