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

【Tools-Mujoco】创建自定义的Mujoco模型相关推荐

  1. oak深度相机入门教程-创建自定义模型

      系列文章目录: oak深度相机入门教程-识别眼睛的凝视方向 oak深度相机入门教程-检测是否佩戴口罩 oak深度相机入门教程-文本检测+光学字符识别(OCR)管道 oak深度相机入门教程-识别人的 ...

  2. java闪屏怎么制作,Java Swing创建自定义闪屏:在闪屏下画进度条(一)

    Java Swing创建自定义闪屏:在闪屏上画进度条(一) 由于本人十分热爱Java Swing,所以平时闲暇之余总是喜欢极尽所能去搜藏一些自认为比较"酷"的Swing代码来研究揣 ...

  3. ASP.NET Core 配置 - 创建自定义配置提供程序

    ASP.NET Core 配置 - 创建自定义配置提供程序 在本文中,我们将创建一个自定义配置提供程序,从数据库读取我们的配置.我们已经了解了默认配置提供程序的工作方式,现在我们将实现我们自己的自定义 ...

  4. NI Multisim元件库:在Multisim中创建自定义元器件

    转载于: http://www.ni.com/tutorial/3173/zhs/ 概览 「在Multisim中创建自定义元器件」与「在 NI Ultiboard中创建自定义元器件」为您提供了关于如何 ...

  5. 独家 | 使用TensorFlow 2创建自定义损失函数

    作者:Arjun Sarkar 翻译:陈之炎 校对:欧阳锦 本文约1900字,建议阅读8分钟 本文带你学习使用Python中的wrapper函数和OOP来编写自定义损失函数. 标签:TensorFlo ...

  6. 使用tolua++编译pkg,从而创建自定义类让Lua脚本使用

    2019独角兽企业重金招聘Python工程师标准>>> 在Lua第三篇中介绍了,如何在cocos2dx中使用Lua创建自定义类供Lua脚本调用使用,当时出于Himi对Lua研究不够深 ...

  7. 为SharePoint网站创建自定义导航菜单

    相信不少人都希望把SharePoint网站内置的那个顶部导航菜单,换成自己希望的样式.由于SharePoint 2007/2010的网站导航基本上基于标准的ASP.NET SiteMap模型,所以只要 ...

  8. [转]利用ASP.NET 2.0创建自定义Web控件(1)

    原址:http://hi.baidu.com/sjbh/blog/item/cc58fd1bd35d3ad2ad6e7593.html   简介 从使用基本的文本编辑器到创作标记页面,Web 开发已经 ...

  9. Qt Creator创建自定义效果和材质

    Qt Creator创建自定义效果和材质 创建自定义效果和材质 创建自定义效果 创建自定义材料 创建着色器文件 创建自定义效果和材质 " Qt Quick 3D效果"和" ...

最新文章

  1. 机器视觉边缘检测算法详解
  2. pte模拟考试_【PTE懒人攻略】如何在7天内通过PTE考试
  3. Vue + webpack 项目实践
  4. Hystrix简介及简单代码示例
  5. mac系统更新后code .命令打不开vs code
  6. linux开发操作系统,Linux 操作系统应用与开发
  7. jsp中out.println()报红
  8. 敏捷开发绩效管理之四:为团队设立外部绩效目标(目标管理,外向型绩效)...
  9. Apache Prefork、Worker和Event三种MPM简单分析
  10. php获取蓝凑云文件列表,php调用蓝奏云下载接口
  11. AJAX的 contentType
  12. Java开发笔记(一百三十四)Swing的基本对话框
  13. Fiddler环境配置、抓包、手机代理
  14. 数字图像处理matlab蔡利梅,数字图像处理:使用MATLAB分析与实现:using MATLAB
  15. 【已解决】Magisk提示需要修复运行环境怎么办? | 面具提示需要修复运行环境怎么办?
  16. 我爱淘冲刺阶段站立会议每天任务4
  17. mysql创建联合主键
  18. 重电计算机学院李明建,【i小T有话说 | 第8期】风里雨里,我在上电计算机学院等你!...
  19. golang:context介绍
  20. Java生成与解析二维码

热门文章

  1. 数据库设计说明书——机房收费系统
  2. 静态与非静态区别及调用(达内培训课程内容)
  3. 其实很简单,单反相机轻松捕捉动态场景的方法
  4. 这个人好厉害,几张图就讲清楚了华为为什么弄不了OKR?
  5. BootStrap框架的使用及响应式网页布局
  6. 使用Java连接Elasticsearch数据库(验证用户/不验证用户)
  7. 计算机网络专业单招考试科目,2018年辽宁交专单独招生对口升学类招生计算机网络专业综合课考试大纲...
  8. Unity矩阵平移旋转缩放Matrix4x4
  9. 华为、飞腾、海光、兆芯、龙芯、申威这六大国产CPU发展得怎么样?
  10. java 给时间增加几个小时方法