要进行机器人仿真首先需要得到机器人的几何模型。我们可以直接通过VREP中提供的基本几何体来搭建一个简易的机器人[Menu bar --> Add --> Primitive shape --> ...],如下图所示的两轮差动机器人就是由球和圆柱体搭建而成。这种形状简单的几何体称为Primitive shape:best suited for dynamics collision response calculation, since it will perform much faster and more stable than non-pure shapes(e.g. random or convex meshes). Primitive shapes will be simple meshes, which might not contain enough details or geometric accuracy for our application. For that reason, pure shapes are often hidden in an invisible layer (e.g. layer 9).

  使用基本几何体来搭建抽象的机器人虽然有计算量小等诸多优点,但是却无法模拟机器人真实形状。为了模型更真实我们可以导入外部三维模型文件。但如果我们导入的文件过大(三角面片太多),就会严重影响图形显示和运动学、动力学计算的实时性。下面的图片中导入的CAD模型就不是一个很好的例子,它包含多达47000个三角面片,而这仅仅只是一个机械手爪。如果场景中有多台机器人装有这种手爪,那么当机器人与其它机器人、设备或外界环境接触时物理引擎的计算量会非常大,仿真会变得很慢,因此我们需要简化模型。Remember: less is better, in almost every aspect.

[Complex CAD data (in solid and wireframe)]

  可以从上面左图中看出,模型包含了很多孔和小细节,而这些特征在导出为网格模型时会生成很多不必要的三角面片。所以首先需要删除这些孔、螺纹和CAD模型内部的一些特征(比如轴承、外壳内部的加强筋板等结构)。其次,在输出网格文件时要限制输出的精度,避免产生过大的文件(export the original data with a limited precision: most CAD applications let you specify the level of details of exported meshes)。同时还要注意当场景中模型的大小差别很大时要分别输出,避免同时输出时大模型细节过多,和小模型的细节过少。

  VREP支持多种格式的导入文件:OBJ,STL,DXF,3DS,Collada,URDF。假设上面提到的几点我们都考虑进去了,在删除一系列不必要的细节后我们可能依然会得到如下图所示的网格文件,这个模型文件还是很大,并且还存在许多问题(模型作为一个整体被导入,没有可动部件;导入的姿态和位置不是我们想要的...)。

[Imported CAD data]

  VREP为我们提供了几种方法来进一步简化模型:   

  • Automatic mesh division(自动分割网格):allows to generate a new shape for all elements that are not linked together via a common edge
  • Extract the convex hull(提取凸壳):allows to simplify the mesh by transforming it into a convex hull.
  • Decimate the mesh(缩减网格数量):allows to reduce the number of triangles contained in the mesh.
  • Remove the inside of the mesh(移除内部网格):allows to simplify the mesh by removing its inside.

  下面的图片分别显示了凸壳提取、缩减网格数、移除内部网格后的结果:

  为了控制机构运动,我们接下来要将一个整体的机器人模型分割为几个可动的部分(Two elements are distinct if they don't share any common edge),有如下两种方法:

  • Automatic mesh division(自动分割网格): This does not always work, but is always worth a try. The function can be accessed with [Menu bar --> Edit --> Grouping/merging --> Divide selected shapes]
  • Manual mesh division(手动分割网格): via the the triangle edit mode, you can manually select the triangles than logically belong together, then click Extract shape. This will generate a new shape in the scene. Delete the selected triangles after that operation.

  下图中最左边的是导入VREP中的虎克铰STL文件,它是一个整体。选中它进行自动分割后将生成4个新的网格模型,如中间图片所示。这几个新生成的模型可以随意拖动改变位置,如最右边的图所示,这样我们就将一个整体模型拆分为可动的部分。

  当然我们可以在SolidWorks等软件导出STL文件时就设置好将装配体的各零部件单独输出,然后在VREP中将其同时导入。如下图所示,机器人共有11个零部件模型文件,将其同时导入到场景中就不需要使用自动/手动分割网格的功能了。

  至于手动分割网格以下面一个简单的连杆机构为例进行说明。有时自动分割生成的新几何体可能不是我们想要的,这时先选中要编辑的网格模型,然后打开shape edit模式,手动选择属于同一个部件的三角面片。如下图所示Triangle1~Triangle76都属于同一个连杆,则同时选中这些面(按住Shift键同时用鼠标左键进行框选可以提高效率),然后点击Extract shape生成新的几何体,之前选中的面可以删掉。

  有时用提取的凸壳代替几何体会很好,但更多时候需要综合使用到上面提到的几种方法来获得满意的结果。兼顾物理引擎计算效率和机器人外观真实性简化网格后,为了区分不同的零部件或者为了达到良好的显示效果,我们需要改变几何体的颜色等外观属性。可以通过双击模型图标弹出形状属性对话框:

  Adjust color选项可以更改几何体的外观颜色。勾选Show edges with angle时会显示轮廓曲线,后面的角度控制显示效果:角度越大,轮廓线越少;角度越小,轮廓线越多(A small angle makes a shape appear sharp, with many edges, a large angle makes a shape appear smooth and with less edges)。勾选Wireframe则几何体会始终以线框模型显示。

  由于很多零部件作为一个整体导入,要给不同表面赋予不同的颜色需要先将模型拆分,调整颜色外观后再将其组合。下面以UR3的基座为例进行说明:

  进入shape edit模式,切换到正视图,按住Shift键,同时用鼠标左键框选下图中的一圈三角面片。A shift-selection will select all triangles under the selection area, also hidden triangles. If you wish to only select visible triangles via a shift-selection, hold down the ctrl-key in addition to the shift-key. 即按住Shift框选时可以选中隐藏的面,提高选取效率(注意这里切换到正视图可以避免误选其它三角面片;释放鼠标前要按住Shift键不要放,否则会选不上),如果只需要选取可见的面可以同时按Shift+Ctrl键。确认没有多选或少选后点击Extract cylinder就可以将其提取为基本的圆柱体(之后就可以单独调整这一部分的颜色),大量减少了网格数量。之后可以按Delete键将选中的三角面片删掉,效果如下面右图所示:

  更改了部分面的颜色后我们要将其与其它部分组合成一个整体(虽然表面颜色不同但属于同一可动部件)。We can group the shapes that are part of the same link with [Menu bar --> Edit --> Grouping/merging -> Group selected shapes]. Simple shapes can also be merged ([Menu bar --> Edit --> Grouping/Merging --> Merge selected shapes] in which case the visual properties become same for all composing elements. 如下图所示,将蓝色的端盖,灰色的外壳和黑色的环状垫圈组合成为一个整体,后续控制过程中这个整体将作为连杆相对于底下的固定基座旋转。

参考:

Building a clean model tutorial

Triangle edit mode

V-rep学习笔记:机器人模型创建1—模型简化的更多相关文章

  1. V-rep学习笔记:机器人模型创建2—添加关节

    下面接着之前经过简化并调整好视觉效果的模型继续工作流,为了使模型能受控制运动起来必须在合适的位置上添加相应的运动副/关节.一般情况下我们可以查阅手册或根据设计图纸获得这些关节的准确位置和姿态,知道这些 ...

  2. V-rep学习笔记:机器人模型创建3—搭建动力学模型

    接着之前写的V-rep学习笔记:机器人模型创建2—添加关节继续机器人创建流程.如果已经添加好关节,那么就可以进入流程的最后一步:搭建层次结构模型和模型定义(build the model hierar ...

  3. JUC学习笔记——共享模型之管程

    JUC学习笔记--共享模型之管程 在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的管程部分 我们会分为以下几部分进行介绍: 共享问题 共享问题解决方案 线程安全分析 Monitor ...

  4. JUC学习笔记——共享模型之内存

    JUC学习笔记--共享模型之内存 在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的内存部分 我们会分为以下几部分进行介绍: Java内存模型 可见性 模式之两阶段终止 模式之Balk ...

  5. Django:学习笔记(7)——模型进阶

    Django:学习笔记(7)——模型进阶 模型的继承 我们在面向对象的编程中,一个很重要的的版块,就是类的继承.父类保存了所有子类共有的内容,子类通过继承它来减少冗余代码并进行灵活扩展. 在Djang ...

  6. Django:学习笔记(6)——模型

    Django:学习笔记(6)——模型 快速上手 模型到底是什么呢?我们可以想,如果一张数据表的各个字段可以自动映射到一个类的各个属性,则每条记录对应这个类的一个对象.那我们通过类方法来操作对象(即表记 ...

  7. JVM学习笔记——内存模型篇

    JVM学习笔记--内存模型篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存模型部分 我们会分为以下几部分进行介绍: 内存模型 乐观锁与悲观锁 synchronized优化 内 ...

  8. ArcGIS案例学习笔记2_2_模型构建器和山顶点提取批处理

    ArcGIS案例学习笔记2_2_模型构建器和山顶点提取批处理 计划时间:第二天下午 背景:数据量大,工程大 目的:自动化,批处理,定制业务流程,不写程序 教程:Pdf/343 数据:chap8/ex5 ...

  9. InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移

    系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...

随机推荐

  1. [Android Pro] 跨平台反编译工具 jadx (ubuntu亲测 可用)

    github :  https://github.com/skylot/jadx 输入: .dex, .apk, .jar or .class 输出: 资源文件 和  class文件 不支持重新打包, ...

  2. SVG Stroke属性

    一.stroke属性介绍 SVG提供了一个范围广泛stroke属性,用于描述轮廓,其中包括 stroke 指定颜色 stroke-width 指定宽度 stroke-linecap 指定端点样式 st ...

  3. [转]mysql dual虚拟表

    From : http://thobian.info/?p=1035 虚拟表dual 其实我是今天第一次听说,虽然以前有过它的应用.说不定你也用过哦,看这条sql:select sysdate(); ...

  4. Netty端口被占用问题

    问题:   最近发现Netty项目每次发布的时候Netty在重启时都会报端口被占用的异常, 需要过十几秒左右手动重启一遍, Netty才能恢复正常 目前猜测是由于Tomcat_restart的时候Ne ...

  5. Andriod源码搜集

    1.一个左侧抽屉式导航NavigationDraw 教程:http://developer.android.com/training/implementing-navigation/nav-drawe ...

  6. 不用中间变量交换两个数 swap(a,b);

    #include <iostream> using namespace std; int main () { ; ; cout<<"a="<<a ...

  7. go语言之进阶篇Ticker的使用

    Ticker是一个定时触发的计时器,它会以一个间隔(interval)往channel发送一个事件(当前时间),而channel的接收者可以以固定的时间间隔从channel中读取事件. 1.Ticke ...

  8. go语言之进阶篇通过switch实现类型断言

    1.通过switch实现类型断言 示例: package main import "fmt" type Student struct { name string id int } ...

  9. [leetcode]Jump Game @ Python

    原题地址:https://oj.leetcode.com/problems/jump-game/ 题意: Given an array of non-negative integers, you ar ...

  10. Java设计模式(六)合成模式 享元模式

    (十一)合成模式 Composite 合成模式是一组对象的组合,这些对象能够是容器对象,也能够是单对象.组对象同意包括单对象,也能够包括其它组对象,要为组合对象和单对象定义共同的行为.合成模式的意义是 ...