专栏首页小白VREPBuilding a clean model tutorial

Building a clean model tutorial

今天介绍如何进行模型的简化,往下看吧!

本教程将逐步指导您构建机器人或任何其他物品的清晰仿真模型。这是一个非常重要的课题,为了有一个漂亮的外观,快速显示,快速模拟和稳定的仿真模型。

为了说明建模过程,我们将构建以下机械手:

01

Building the visible shapes

当我们建立一个新的模型时,首先,我们只处理它的视觉方面:动态方面(它的undelying甚至更简化/优化的模型),关节,传感器等将在后期处理。

我们现在可以通过 [Menu bar --> Add --> Primitive shape --> ...]在V-REP中直接创建原始形状。当这样做时,我们可以选择创建纯形状,或规则形状。纯形状将被优化为动态交互,也可以直接动态启用(例如,坠落,碰撞,但这可以禁用在后面的阶段)。原始形状将是简单的网格,它可能不会为我们的应用程序包含足够的细节或几何精度。在这种情况下,我们的另一种选择是从外部应用程序导入网格。

当从外部应用程序导入CAD数据时,最重要的是确保CAD模型不是太重,即不包含太多三角形。这个要求很重要,因为一个重的模型在显示时会很慢,同时也会减慢以后可能会用到的各种计算模块(例如最小距离计算,或者动力学)。下面的例子通常是不可行的(即使,正如我们稍后将看到的,有方法简化V-REP中的数据):

上面的CAD数据很重:它包含了很多三角形(超过47000个),如果我们只在一个空场景中使用它的一个实例,这就可以了。但大多数时候,我们希望模拟同一个机器人的多个实例,附加各种类型的钳子,并可能让这些机器人与其他机器人、设备或环境交互。在这种情况下,模拟场景很快就会变得太慢。一般来说,我们建议一个机器人模型的三角形总数不要超过20000个,但大多数情况下5000 - 10000个三角形也可以。记住:在几乎所有方面,越少越好。

是什么让上面的模型那么重?首先,包含孔和小细节的模型需要更多的三角形面来进行正确的表征。所以,如果可能的话,尽量从原始模型数据中删除所有的孔、螺丝、对象内部等等。如果原始模型数据表示为参数化的表面/对象,那么在大多数情况下,选择项目并删除它们是一个简单的问题(例如在Solidworks中)。第二个重要的步骤是以有限的精度导出原始数据:大多数CAD应用程序允许指定导出网格的细节级别。当绘图由大对象和小对象组成时,按几个步骤导出对象可能也很重要;这是为了避免把大对象定义得太精确(三角形太多)和小对象定义得太粗略(三角形太少):简单地首先导出大对象(通过调整所需的精度设置),然后导出小对象(通过调整精度设置)。

V-REP目前支持以下CAD数据格式:OBJ, STL, DXF, 3DS (Windows only)和Collada。也支持URDF,但这里不提,因为它不是纯粹的基于网格的文件格式。

现在假设我们已经应用了上一节所描述的所有可能的简化。我们仍然可能在导入后以一个太重的网格结束:

可以注意到整个机器人被导入为一个单一的网格。稍后我们将看到如何适当地划分它。还要注意导入的错误方向网格:最好是保持方向,直到整个模型建立,因为,如果在稍后的阶段中,我们想导入相关的其他项目相同的机器人,他们会自动有正确的位置/方向相对于原来的划分。

在这种情况下,我们有几个功能以简化网格:

  • Automatic mesh division自动网格划分:允许为所有没有通过公共边连接在一起的元素生成一个新的形状。这并不总是适用于选择的网格,但值得一试,因为处理网格元素比同时处理所有元素给我们更多的控制。可通过[Menu bar --> Edit --> Grouping/Merging --> Divide selected shapes]访问。有时候,一个网格会划分的比预期的多。在这种情况下,只需简单地将逻辑上属于一起的元素(即具有相同视觉属性且属于同一链接的一部分)合并为一个单一形状[Menu bar --> Edit -> Grouping/Merging --> Merge selected shapes]。
  • Extract the convex hull提取凸包:允许简化网格转换成凸包。可通过【菜单栏->编辑->变形选择为凸形】访问该功能。
  • Decimate the mesh允许减少网格中包含的三角形的数量。可通过 [Menu bar --> Edit --> Morph selection into convex shapes]访问该功能。
  • Remove the inside of the mesh移除网格的内部:通过移除网格的内部来简化网格。此功能是基于视觉传感器,取决于选择的设置并可能提供或多或少令人满意的结果。可通过 [Menu bar --> Edit --> Extract inside of selected shape]访问该功能。

上面功能可以/应该被应用并且没有预定义的顺序,(除了列表中的第一项,它应该总是首先尝试),它严重依赖于我们试图简化的网格的几何形状。下面的图片说明了上述应用到导入网格的函数(假设列表中的第一项不适合我们):

注意到在这个阶段凸包并不能帮助我们。我们决定首先使用网格抽取函数,并运行两次函数以将三角形数除以50。一旦完成,我们提取简化形状的内部并丢弃它。我们结束了一个网格包含总共2'660个三角形(原来的进口网格包含超过136000个三角形)一个形状包含的三角形/顶点的数量可以在形状几何对话框中看到。对于整个机器人模型来说,2660个三角形是非常少的三角形,视觉外观可能会因此受到一些影响。

在这一阶段,我们可以开始将机器人划分为不同的连杆(目前整个机器人只有一个形状)。你可以通过两种不同的方式做到这一点:

Automatic mesh division自动网格划分:这个功能,在前面已经描述过,将检查形状,并为所有没有通过公共边连接在一起的元素生成一个新的形状。这并不总是有效,但值得一试。可通过 [Menu bar --> Edit --> Grouping/merging --> Divide selected shapes]访问。

Manual mesh division手动划分网格:通过三角形编辑模式,手动选择逻辑上属于一起的三角形,然后点击提取形状。这将在场景中生成一个新的形状。在此操作之后删除选定的三角形。

在我们的网格中,第一种方法工作得很好:

现在,我们可以进一步细化/简化单个形状。有时,如果用凸壳代替,形状看起来会更好。其他时候,为了获得期望的结果,我们将不得不迭代地使用上面描述的几种技术。以以下网格为例:

上面的形状的问题是我们不能很好地简化它,因为它包含了洞。因此,我们必须通过形状编辑模式采用更复杂的方式,我们可以提取逻辑上属于同一凸实体的单个元素。这个过程可以进行多次迭代:我们首先提取3个近似凸元素。现在,我们忽略两个洞中的三角形。当在形状编辑模式下编辑一个形状时,可以很方便地切换可见层,以查看其他场景项目覆盖了什么。

我们最终得到了三种形状的,但其中两种需要进一步改进。现在我们可以擦掉洞里的三角形。最后,我们分别提取3个形状的凸壳,然后用 [Menu bar --> Edit --> Grouping/Merging --> merge selected shapes]将它们合并在一起:

在V-REP中,我们可以为每个形状启用/禁用边缘显示。我们还可以指定一个将被考虑到边缘显示的角度。一个类似的参数是阴影角度,它决定了形状将如何显示切面。这些参数以及其他一些参数,如形状颜色,可以在形状属性中进行调整。在本教程中,到目前为止我们只处理了简单的形状:一个简单的形状有一组视觉属性(例如,一个颜色,一个阴影角度,等等)。如果你合并两个形状,那么结果将是一个简单的形状。还可以对形状进行分组,在这种情况下,每个形状将保留其可视化属性。

下一步,我们可以合并逻辑上属于一起的元素(如果它们是同一刚性元素的一部分,如果它们有相同的视觉属性)。然后我们改变各个元素的视觉属性。最简单的方法是调整一些具有不同颜色和视觉属性的形状,如果我们用特定的字符串命名该颜色,稍后我们可以通过编程轻松地更改该颜色,如果该形状是复合形状的一部分也是如此。然后,我们选择所有的形状相同的视觉属性,然后control-select已经调整的形状,然后单击应用到选择,一次颜色,一次其他属性,在形状属性:这将所有视觉属性转移到所选形状(包括颜色名称)。我们最终得到了17个独立的形状:

现在,我们可以使用[Menu bar --> Edit --> Grouping/merging -> Group selected shapes].对同一链接的形状进行分组。我们最终得到了7个形状:机器人的基底(或机器人层次树的基底)和6个移动链接。正确地命名你的对象也很重要:我们在场景层次结构中双击对象名称来做这件事。基对象应该始终是机器人或模型名,其他对象应该始终包含基对象名,如:robot (base)、robot_link1、robot_proximitySensor等。通过defaut,形状将被分配到可见层1,但可以改变对象的公共属性。默认情况下,场景中只有1-8个可见层被激活。我们现在有以下(模型ResizableFloor_5_25暂时在模型属性对话框中不可见):

当创建或修改形状时,V-REP将自动设置其参考帧的位置和方向。一个图形的参考框架总是位于图形的几何中心。框架的方向将被选择,以使形状的包围框保持尽可能小。这并不总是看起来很好,但我们总是可以在任何时候重新定位一个形状的参考框架。我们现在用h [Menu bar --> Edit --> Reorient bounding box --> with reference frame of world]对所有创建的形状进行重定向。在形状几何对话框中,有更多的选择来重新定位参考框架。

02

Building the joints

现在我们来处理关节/马达。大多数时候,我们知道每个关节的确切位置和方向。在这种情况下,我们只需使用 [Menu bar --> Add --> Joints --> ...],然后我们可以通过位置对话框和方向对话框改变它们的位置和方向。在其他情况下,我们只有Denavit-Hartenberg(即D-H)参数。在这种情况下,我们可以通过位于Models/tools/Denavit-Hartenberg joint creator中的工具模型来建立我们的关节。在模型浏览器中,其他时候,我们没有关于关节位置和方向的信息。然后,我们需要从导入的网格中提取它们。我们打开一个新的场景,再次导入原始的CAD数据,而不是进行修改以及更近似网格。大多数情况下,我们可以从原始网格中提取网格或原始形状。第一步是细分原始网格。如果这不起作用,我们通过三角形编辑模式来做。假设我们可以划分原始网格,现在有更小的物体让我们可以检查。我们正在寻找转动的形状,可以用来作为参考在他们的位置创建关节,具有相同的方向。首先,删除所有不需要的对象。有时跨多个打开的场景工作也很有用,这样更容易可视化/操作。在我们的例子中,我们首先关注机器人的基座:它包含一个圆柱体,这个圆柱体与第一个关节的位置一致。在三角形编辑模式下,我们有:

我们通过页面选择器工具栏按钮改变相机视图,以便从侧面观察对象。在edition中,适合查看的工具栏按钮可以方便地正确框住对象。然后我们切换到顶点编辑模式,选择所有属于上面圆盘的顶点。记住,通过打开/关闭一些图层,我们可以在场景中隐藏其他物体。然后我们切换回三角形编辑模式:

现在我们点击提取圆柱体(提取形状在这种情况下也可以工作),这只是在场景中创建了一个圆柱体形状,基于选择的三角形。我们将保留编辑模式并放弃更改。现在添加一个带有olu [Menu bar --> Add --> Joint --> Revolute]的转动关节,保持选中状态,然后控制选择提取的圆柱体形状。在位置对话框的位置选项卡,我们点击应用到选择:这基本上复制了圆柱体的x/y/z位置到关节。这两种立场现在是相同的。在方向对话框的方向选项卡上,我们也点击应用到选择:我们选择的对象的方向现在也是相同的。有时,为了获得正确的方向或旋转方向,我们需要额外地将关节围绕其自身的参考系旋转90/180度。如果需要的话,我们可以在对话框的旋转选项卡上这样做(在这种情况下,不要忘记点击自己的帧按钮)。用同样的方法我们也可以让关节沿着它的轴移动,或者做更复杂的操作。这是我们所拥有的:

现在我们将关节复制回原始场景,并保存。我们对机器人中的所有关节重复上述步骤,然后重命名它们。在关节属性中,我们还把所有的关节都做得更长一些,以便观察它们。通过defaut,关节将被分配到可见层2,但可以改变对象的公共属性。我们现在将所有的关节分配到可见层10,然后临时启用场景的可见层10来可视化这些关节(默认情况下,场景中只有1-8个可见层被激活)。这是我们所拥有的(模型ResizableFloor_5_25在模型属性对话框中暂时不可见):

此时,我们可以开始构建模型层次结构并完成模型定义。但如果我们想要opur robot是动态启用的,那么还有一个额外的中间步骤,这些步骤将会在下次介绍。

本文分享自微信公众号 - 小白VREP(XiaobaiVREP),作者:六四零

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于Shape 的两个问题

    “ 我独处时最轻松,因为我不觉得自己乏味,即使乏味,也自己承受,不累及他人,也无需感到不安。”

    六四零
  • Script(一)

    V-REP是一个高度可定制的仿真器:仿真的每个方面都可以定制。此外,可以通过一个复杂的应用程序编程接口(API)对仿真器本身进行定制和定制,使其行为完全符合预期...

    六四零
  • Distance calculation

    V-REP可以以一种非常灵活的方式测量两个可测量实体之间的最小距离。这个计算是精确的最小距离计算。距离计算模块只测量距离;但是它不会直接对它们做出反应。下图展示...

    六四零
  • 颤抖的抖音,不知悔改的头条系

    腾讯 VS 头条系(字节跳动),大战刚刚正式开打,感觉就要一触即发,腾讯刚刚举起刀,还没来得及冲过去,可是,就在这时,说时迟那时快,头条系下的抖音就自己开枪自杀...

    非著名程序员
  • webpack快速构建项目

    webpack是什么我在这里就不多说了,实在不知道的可以直接在去搜一下,都一大堆答案。关于用webpack怎么构建项目,方法也是多种多样,五花八门。今天,我就写...

    守候i
  • SAP最佳业务实践:SD–贷项凭证处理(204)-2业务处理

    1.1 VA01输入销售订单 客户将收到仅税收贷项,或用于错误收费的贷项。 1. 在 创建销售订单:初始屏幕屏幕上,输入以下内容: 字段名称用户操作和值...

    SAP最佳业务实践
  • 第十一节:讲述类的继承,数据库,文件的读写,图形绘制

    大家好,我是 Vic,今天给大家带来第十一节:讲述类的继承,数据库,文件的读写,图形绘制的概述,希望你们喜欢

    达达前端
  • Ibatis in action 电子书

    电子书 ? 是ibatis 项目组写的ibatis开发的权威书籍.现在只有电子版,目前使用Java作为描述的平台,这个书对于.NET和Ruby一样适用.    ...

    张善友
  • Spark Core源码精读计划 22 | BlockInfoManager与其实现的块锁机制

    在上一篇文章中,我们对与块相关的BlockId、BlockData和BlockInfo有了比较全面的理解。前面已经提到过,块在读写时有锁机制,并且委托给Bloc...

    暴走大数据

扫码关注云+社区

领取腾讯云代金券