前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Building a clean model tutorial

Building a clean model tutorial

作者头像
六四零
发布2020-08-04 17:23:28
1.4K0
发布2020-08-04 17:23:28
举报
文章被收录于专栏:小白VREP

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

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

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

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是动态启用的,那么还有一个额外的中间步骤,这些步骤将会在下次介绍。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白VREP 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档