本教程将指导你逐步建立一个简洁的机器人或其他项目的仿真模型。想要得到一个美观,显示速度和模拟速度快并且稳定的仿真模型,这是一个非常重要的专题,可能也是最重要的一个方面。

为了说明建模过程,要创建下图中的机械臂:

构建可见形状

当建立新的模型时,首先,我们只用处理它的视觉方面:动态方面(其潜在的简化/优化模型)、关节、传感器等,这些将在后面阶段处理。

我们现在可以点击 [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)和Collada。也支持URDF,但是这里没提到,因为它不是一个基于网格的纯理论的文件格式。

现在假设我们已经应用了上节所述的所有可能的简化格式。在导入后,可能还会出现密集的网格:

可以注意到整个机器人被导入为单个网格。稍后我们会看到如何对其进行适当分割。还要注意导入网格的错误方向:最好是让方向保持原样,直到构建好整个模型为止,因为在稍后阶段,如果我们要导入与同一个机器人相关的其他项目,涉及到原始网格时,他们就会自动保持正确的位置/方向。

在这一阶段,我们可以任意使用一些功能来简化网格:

自动网格划分:允许为所有元素生成新的形状,这些元素没有通过公共边缘链接在一起。这对于所选择的网格并不总是有效,但值得一试,因为在网格元素上工作可以让我们得到更多的控制权,而不是同时处理所有元素。可以点击 [Menu bar --> Edit --> Grouping/Merging --> Divide selected shapes] 来访问该功能。有时候,网格会比预期的多。在这种情况下,只需将逻辑上同属一体的元素(即将具有相同的视觉属性并且是相同链接的一部分)合并成一个单一形状即可([Menu bar --> Edit -> Grouping/Merging --> Merge selected shapes])。

提取凸包:允许通过将网格转换为凸包来简化网格。可以点击 [Menu bar --> Edit --> Morph selection into convex shapes] 来访问该功能。

筛选网格:允许减少网格中包含的三角形数量。可以点击 [Menu bar --> Edit --> Decimate selected shape...] 来访问该功能。

删除网格内部:允许通过删除网格内部来简化网格。该功能基于视觉传感器,并且可能会根据所选设置给出或多或少令人满意的结果。可以点击 [Menu bar --> Edit --> Extract inside of selected shape] 访问该功能。

以上可应用的功能没有预定义顺序(除了列表中的第一个项目,总是先用于尝试),它很大程度上取决于我们正在尝试简化的网格的几何形状。以下图片说明了应用于上述导入网格的功能(假设列表中的第一个项目对我们来说无效):

注意在这一阶段,凸包没法帮助我们。首先我们决定使用网格筛选功能,并运行该功能两次,以便将三角形数量除以总数 50。这一步一旦完成,我们就将其简化形状的内部提取出来并删除。最终剩下一个包含有 2660 个三角形的网格(最开始导入的网格含有136000 个三角形)。我们可以在形状几何对话框中看到三角形/顶点数包含的形状数量。对于整个机器人模型来说,2660 个三角形已经非常少了,只是视觉呈现可能会受到一点点影响。

在这个阶段,我们可以开始将机器人划分成不同的连接块(请记住,我们目前只有整个机器人的一个简单的形状)。你可以通过两种不同的方法来划分:

自动划分网格:此功能已经在上一节中介绍过,它会检查形状,并为所有未通过公共边缘连接在一起的元素生成新的形状。这并不总是奏效,但总是值得一试。可以点击 [Menu bar --> Edit --> Grouping/merging --> Divide selected shapes] 来访问该功能。

手动网格分割:通过三角形编辑模式,可以手动选择逻辑上不属一体的三角形,然后单击 Extract shape。这将在场景中生成一个新的形状。然后删除所选三角形。

在这种情况下时,第一种方法对于我们的模型会奏效:

现在,我们可以进一步细化/简化个体形状。有时,如果使用其凸包,形状可能会更好看。其他时候,你就不得不重复使用上述几种技术,以获得想要的结果。以网格为例:

上面的形状存在的问题是,它含有很多孔,所有我们不能很好地对其进行简化。所以我们必须通过形状编辑模式使用更复杂的方式,在这里我们可以提取逻辑上属于同一个凸子实体的各个元素。这个过程可能需要反复好几次:首先提取3 个近似的凸元素。现在,我们忽略掉两个孔的一部分,即三角形。在形状编辑模式下编辑形状时,方便切换可见层,以便查看其他场景项目所覆盖的内容。

我们最终得到了三种形状,但其中两个还需进一步改进。现在我们可以删除掉孔中的三角形。最后,我们分别提取3 个形状的凸包,然后点击 [Menu bar --> Edit --> Grouping/Merging --> merge selected shapes] 把它们合并起来:

在V-REP 中,我们可以启用/禁用每个形状的边缘显示。还可以指定边缘显示需要计算的角。类似于阴影角度这样的参数,它表明形状会显示出来的多面体。这些参数和其他一些如形状颜色等参数,可以在形状属性中进行调整。要记住,形状有不同的类型。在本教程中,迄今为止我们只处理了一些简单的形状:简单的形状具有单一视觉属性(即一种颜色,一种阴影角度等)。如果将两个形状合并,那么结果还会是一个简单的形状。你也可以对形状进行分组,在这种情况下,每个形状将保留其视觉属性。

在下一步中,我们可以合并逻辑上同属的元素(如果它们是同一刚性元素的一部分,并且具有相同的视觉属性)。然后我们改变各个元素的视觉属性。最简单的方法不是调整一些具有不同颜色和视觉属性的形状,而是我们使用特定的字符串命名颜色,稍后可以通过编程方式更改颜色,同样地,如果形状是复合形状的一部分,也采用同样的方式。然后,我们就选择所有具有相同视觉属性的形状,然后 ctrl 选择已调整的形状,接下来单击 Apply to selection,一次是颜色,一次是其他属性,在形状属性中:这会将所有的视觉属性传输到所选形状(包括颜色名称,如果你提供了的话)。我们最终得到17 个独立形状:

现在我们可以点击 [Menu bar --> Edit --> Grouping/merging -> Group selected shapes] 将与之有相同链接的一部分的形状分组。我们最终得到了 7 个形状:机器人的底座(或机器人层次结构树的底座)和 6 个移动连接。正确命名你的对象也很重要:我们可以双击场景层次结构中的对象名称来命名对象。底座应该始终是机器人或模型的名称,其他对象应始终包含底座对象得名称,如 robot (base) , robot_link1 ,robot_proximitySensor 等。默认情况下,形状将被分配到可见性层1,但是可以在对象的共同属性中进行更改。默认情况下,只有可见层1-8 可以激活场景。现在可以得到以下场景(在模型属性对话框中临时让模型 ResizableFloor_5_25 隐藏起来):

当创建或修改形状时,V-REP 将自动设置其参考框架的位置和方向。形状的参考框架将始终位于形状的几何中心。选择框架方向,使形状的边框尽可能小。这样看起来不一定很美观,但我们可以随时重新调整形状的参考框架。现在重新调整我们所创建的所有形状的参考框架,点击 [Menu bar --> Edit --> Reorient bounding box --> with reference frame of world]。在形状几何对话框中,你有更多的选择去重新调整参考框架。

构建关节

现在我们要处理关节/驱动。大多数时候,我们知道每个关节的确切位置和方向。在这种情况下,我们只需点击 [Menu bar --> Add --> Joints --> ...] 添加关节,然后我们可以使用坐标和变换对话框来更改位置和方向。在其他情况下,我们只有 Denavit-Hartenberg(即D-H)参数。在那种情况下,我们可以在模型浏览器中的 Models/tools/Denavit-Hartenberg joint creator.ttm 中的工具模型构建关节。有时候,我们没有关节位置和方向的相关信息。然后,我们需要从导入的网格中提取它们。我们假设这是目前的情况。在近似于网格,而非改良的条件下工作,我们打开一个新的场景,再次导入原始的CAD数据。大多数时候,我们可以从原始网格中提取网格或源形状。第一步是细分原始网格。如果不起作用,就使用三角形编辑模式来编辑。假设我们可以划分原始网格。我们现在就拥有更小的物体,即我们可以对其进行检查的物体。我们正在寻找旋转形状,它可以用作在相同位置和相同方向创建关节的一种参考。首先,删除所有不需要的对象。有时为了使可视化或操作更简单,可以同时打开多个场景。对我们来说,我们首先要关注机器人的底座:它包含有一个圆柱体,对于第一个关节来说,这个圆柱体处于正确的位置。在三角形编辑模式下,我们可以看到以下场景:

我们通过页面选择器工具栏按钮更改摄像机视图,以便从侧面查看对象。 布满视图工具栏按钮可以方便地在编辑模式下中正确构建对象。 然后我们切换到顶点编辑模式并选择属于上部盘的所有顶点。 请记住,通过打开/关闭某些图层,我们可以隐藏场景中的其他对象。 然后我们切换回三角形编辑模式:

现在我们点击 Extract cylinderExtract shape 也可以在那种情况下工作),这只是基于所选的三角形在场景中创建一个圆柱形。我们退出编辑模式并放弃更改。现在我们单击 [Menu bar --> Add --> Joint --> Revolute] 添加一个旋转关节,保持选中,然后 ctrl 选择所提取的圆柱体形状。在坐标和变换对话框中,单击 position 按钮,然后在“对象/项目方向”部分中单击 Apply to selection:这基本上将圆柱体的 x / y / z 位置复制到关节上了。现在两个位置是一样的。单击 orientation 按钮,单击 Apply to selection:现在我们所选对象的方向也一样了。有时,为了得到正确的方位或旋转方向,我们还要围绕其自身的参考框架另外将关节旋转约90/180度。如果有必要,我们可以在对象/项目旋转操作部分执行此操作(在这种情况下,请勿忘记单击 Own frame 按钮)。按照同样的方式,我们也可以沿着它的轴移动关节,甚至进行更复杂的操作。这就是我们所拥现在所看到的:

现在我们将关节复制到原始场景中,并保存(要记得定期保存工作!撤消/重做功能很有用,但不能保护你免受其他故障的影响)。我们对机器人中的所有关节重复上述步骤,然后重新命名。为了看到他们全部,我们还要使所有关节在关节属性中稍长一点。在默认情况下,关节将被指派到可见性层2,但可以在对象的共同属性中对其进行改变。我们现在将所有关节指派给可见性层10,然后暂时使场景的可见性层10 也可以显现这些关节(在默认情况下,仅为场景激活可见层1-8)。这是我们现在看到的(在模型属性对话框中暂时将模型ResizableFloor_5_25 隐藏起来):

在这一点上,我们可以开始构建模型层次结构并且完成模型定义。但是如果我们希望我们的机器人能够动态启用,那么就还需要一个中间步骤:

构建动态形状

如果我们想让我们的机器人能够动态启用,即对碰撞,跌倒等做出反应,那么我们需要适当地创建/配置形状:这种形状可以是:

动态或静态:动态(或非静态)形状将下降并受外力或扭矩的影响。另一方面,静态(或非动态)形状会在场景中静止不动,或者在场景层次结构中跟随其上层(即本体)移动。

可响应的或不可响应的:可响应的形状将与其他可响应形状的发生碰撞反应。它们(和/或)他们的对撞机,如果它们是动态,它们的运动将会受到影响。另一方面,如果不可响应形状与其他形状相碰撞,那么他们将不会计算碰撞响应。

以上两点会在这里进行说明。为了进行快速稳定的模拟,可响应的形状要尽可能简单。物理引擎将能够模拟以下 5 种速度和稳定性各具差异的形状:

纯形状:纯形状稳定,且物理引擎可以对其进行有效地处理。简单的说,纯形状在几何方面是有限的:主要是立方体,圆柱体和球体。如果可能,其他项接触时间较长的物体(例如人形机器人的脚,串联式机器人的底座,夹具的手指等)可以使用纯形状。可以点击 [Menu bar --> Add --> Primitive shape] 创建纯形状。

纯复合形状:纯复合形状是几种纯形状的组合。它的性能几乎和纯形状一样,并且有着相似的属性。可以将几个纯形状分组,点击[Menu bar --> Edit --> Grouping/Merging --> Group selected shapes] 来生成纯复合形状。

凸形:凸形会有一点不稳定,用物理引擎对其进行处理时也会多花费一点计算时间。相比较纯形状,凸形考虑到更多的通用几何(唯一的要求是,它只需是凸起的就行)。如果可以,对于那些偶尔会与其他项目接触的项目使用凸形(例如机器人的各种链接)。可以点击 [Menu bar --> Add --> Convex hull of selection][Menu bar --> Edit --> Morph selection into convex shapes] 生成凸形。

复合凸形或凸分解形状:凸分解形状是几个凸形的分组。它的性能几乎和凸形相似,并具有相似的性质。凸分解的形状可以通过点击 [Menu bar --> Edit --> Grouping/Merging --> Group selected shapes],使用 [Menu bar --> Add --> Convex decomposition of selection...][Menu bar --> Edit --> Morph selection into its convex decomposition...] 来生成。

随机形状:随机形状既非凸面也不是纯形状。它的性能通常较差(即计算速度和稳定性)。尽量不用随机形状。

所以它们的优先顺序为:纯形状,纯复合形状,凸形,复合凸形,最后是随机形状。请务必阅读本页。假如我们想要创建机器人,就使用纯圆柱体作为机器人的底座,用其他连接作为凸形或凸分解形状。

我们可以使用动态形状作为机器人的可见部分,但这可能看起来不够好。反之,我们将会为教程第一部分中创建的每个可见形状构建一个动态启用的对等体,然后将其隐藏:隐藏部分将表示动态模型,并由专门的物理引擎使用,而可视部分将用于可视化,还可用于计算最小距离,检测近距离传感器等。

选择对象 robot,将其复制并粘贴到新场景中(以保持原始模型不变)并启动三角形编辑模式。如果该对象是复合形状,我们首先必须取消分组([Menu bar --> Edit --> Grouping/Merging --> Ungroup selected shapes]),然后合并各个独立的形状([Menu bar --> Edit --> Grouping/Merging --> Merge selected shapes]),然后才能启动三角形编辑模式。现在选择代表电源线的几个三角形,将其删除。然后我们选择该形状中的所有三角形,然后单击 Extract cylinder。现在可以离开编辑模式,并且我们的底座是纯圆柱体:

重新命名新形状(在场景层次结构中双击其名称)为 robot_dyn,将其指派给可见层 9,然后将其复制到原始场景中。其余的连接杆将被做成凸形或复合凸形模型。现在选择第一个移动连杆(即对象 robot_link1),并点击 [Menu bar --> Add --> Convex hull of selection] 从中生成凸形。我们将它重命名为 robot_link_dyn1,并将其指派给可见层 9。当提取凸包没有保留原始形状的足够的细节时,你仍然可以从其组成元素中手动提取几个凸包,然后点击 [Menu bar --> Edit --> Grouping/Merging --> Group selected shapes] 将所有凸包组合起来。如果这很棘手或耗时,那么可以点击 [Menu bar --> Add --> Convex decomposition of selection...] 自动提取凸分解形状:

原始形状,凸形状

原始形状,凸分解形状

现在对所有剩余的机器人连杆重复相同的步骤。该步骤一完成,就将每个可见的形状与相应的不可见动态装饰连接在一起。选择第一个可见的形状,然后点击Ctrl 键选择其动态装饰,然后点击 [Menu bar --> Edit --> Make last selected object parent] 。想要获得相同的结果可以将可见形状拖动到其层级中的动态装饰上:

我们仍需要注意以下几点:首先,由于我们希望动态形状只对物理引擎可见,而非其他计算模块,因此我们将在对象共同属性中取消选中动态形状的 object special properties

然后,我们仍须将动态形状设置为动态和可回复的。在形状动力学属性中我们会做到这一点。首先选择基本的动态形状(即robot_dyn),然后选择 Body is respondable。启用前 4 个 Local respondable mask 标志,并禁用最后 4 个 Local respondable mask标志:对于连续的可响应连杆来说,最重要的是它们不会相互冲突。对于机器人中的第一个移动动态连杆(即 robot_link_dyn1 ),我们还启用了 Body is respondable,但是这次我们禁用前 4 个 Local respondable mask标志,并启用最后4 个 Local respondable mask 标志。让所有的其他动态连杆重复上述过程,同时始终让 Local respondable mask 标志交替启用:一旦定义了模型,机器人的连续动态形状将在彼此交互时不产生任何碰撞响应。尽量以机器人的动态底座结构结束,并且机器人最后的动态连杆只启用前 4 个 Local respondable mask 标志,这样我们就可以将机器人与移动平台连接在一起,或者将夹具和机器人的最后一个动态连杆连接在一起,且不受动态碰撞干扰。

最后,我们仍需将我们的动态形状标记为 Body is dynamic。我们在形状动力学属性中也会做到这一点。然后,我们可以手动输入质量和惯性张量属性,或单击 Compute mass & inertia properties for selected convex shapes 来自动计算那些值(推荐)。还要记住这一动态设计和那一动态设计的注意事项。机器人的这种动态底座是一种特殊情况:大部分情况下我们希望机器人的底座(即 robot_dyn)是非动态的(即静态的),否则,在单独使用的情况下,机器人可能会在运动过程中掉落。但是,只要我们将机器人的底座连接到移动平台,我们就希望底座变成动态的(即非静态的)。启用 Set to dynamic if gets parent 来做到这一点,然后禁用Body is dynamic。现在运行模拟:除了机器人的底座之外,所有的动态形状都会掉落。附带的视觉形状会和他们的动态装饰动作一致而掉落。

模型定义

现在我们准备定义我们的模型。我们首先建立模型层级结构: 选择最后一个动态机器人连杆(robot_link_dyn6) ,将与其对应的关节(robot_joint6)连接起来,然后点击 ctr 选择 robot_joint6,然后点击 [Menu bar --> Edit --> Make last selected object parent]。我们也可以将对象 robot_link_dyn6 拖放到场景层次结构中的 robot_link6 上来完成此步骤。现在继续将robot_joint6 与 robot_link_dyn5 连接起来,然后是其他的,直到到达机器人的底座。现在的场景层次结构如下图所示:

因为模型底座也代表模型本身,因此为模型底座取个简单的名称就更合乎逻辑。所以我们将机器人重命名为 robot_visibleBase,将 robot_dyn 重命名为 robot。现在我们选择层次结构树(即对象 robot)的底座,并且在对象共同属性中启用 Object is model base。我们还可以启动 Object/model can transfer or accept DNA。这时出现了一个包围着整个机器人的模型边框。然而,这个边框看起来太大:这是因为边界框还包含不可见的项目,例如关节。我们现在为所有关节启用 Don't show as inside model selection 来排除模型边界框中的关节。我们可以对模型中所有的不可视项目进行同样的步骤。想要从模型边界框中排除大型传感器或其他项,这是一个有用的选择。目前情况如下:

现在要保护我们的模型免受意外的修改。选择机器人中的所有可见对象,然后启用 Select base of model instead:如果现在单击场景中的可见连杆,就会选中机器人的底座。这样我们可以像操纵一个单一对象那样来操纵模型。我们也可以在场景中点击 Ctrl+Shift 键来选择机器人中的可见对象,或在场景层次结构中选择对象。现在将机器人置于正确的默认位置/方位。首先,我们保存当前场景作为参考(例如,如果在稍后阶段,我们需要在当前机器人中导入具有相同方向的CAD 数据)。然后我们选择模型并适当修改其位置/方向。将模型(即其底座)定位在 X = 0 和 Y = 0 这个位置是就很好。

我们现在运行模拟:机器人会崩溃,因为关节默认为不受控制。在前一阶段添加关节时,我们在力/扭矩模式下创建了关节,但是在默认情况下,它们的驱动或控制器被禁用。我们现在可以根据我们的要求来调整关节。对我们而言,每一个关节都需要一个简单的PID 控制器。在关节动态属性中,单击启动 Motor enabled 并调整 maximum torque。接着点击 Control loop enabled, 然后选择 Position control (PID)。现在再次运行模拟:机器人位置应该会保持不变。试着切换到当前的物理引擎,查看所有被支持的物理引擎的行为是否一致。你可以通过相应的工具栏按钮或通用的动态属性来执行此操作。

在模拟期间,我们通过动态内容可视化和验证工具栏按钮验证场景动态内容。现在,仅物理引擎内的项目能显示出来,并且用不同的颜色对显示器进行编码。始终这样做非常重要,特别是当动态模型不按预期运转时,这样可以快速调试模型。同样地,在模拟期间始终盯紧场景层次结构:动态启用的对象会在其名称右侧显示一个球状图标。

最后,我们需要布置好机器人,便于我们能轻松地将夹具连接到机器人上,或者轻松地将机器人连接到移动平台上(举例来说)。两个动态启用的形状可以以两种不同的方式牢牢相连:

通过分组连接:选择形状,然后点击 [Menu bar --> Edit --> Grouping/Merging --> Group selected shapes]

通过力/扭矩传感器将它们连接起来:力矩传感器也可以作为两个分离的动态启用形状之间的刚性连接。

对我们而言,只有选项 2 是有意义的。我们点击 [Menu bar --> Add --> Force sensor] 创建力/扭矩传感器,然后将其移动到机器人的齿棱, 然后将其与 robot_link_dyn6 连接起来。适当改变其尺寸和视觉外观(红色力/扭矩传感器通常被当做可选附件点,检查各种可用的机器人模型)。我们将其名变更为 robot_attachment:

现在我们将一个夹子模型拖到场景中,保持选中状态,然后按 Ctrl 键单击附件力传感器,然后单击组装/拆卸工具栏按钮。夹具就到位了:

因为在模型定义期间,它已经有过相应配置了,所以夹具知道如何连接自己。现在还需要正确配置机器人模型,这样它就会知道如何将自己连接到移动底座上。我们选择机器人模型,然后在对象共同属性中单击 Assembling。为 'Parent' match values 设置空字符串,然后单击 Set matrix。这会记忆当前的底座对象的局部转关矩阵,并使用它来对相关的移动机器人的附着点来定位或调整自己。想要验证我们的做法是正确的,就将 Models/robots/mobile/KUKA Omnirob.ttm 等模型拖到场景中。然后选择我们的机器人模型,接下来按Ctrl 键单击移动平台上的一个附着点,然后单击组装或拆卸工具栏按钮。正确地将我们的机器人放置在移动机器人的顶部:

现在可以在我们的机器人上添加其他项目,例如传感器。在某些时候,我们也可能希望将嵌入式脚本连接到我们的模型中,以便于控制其行为或将其配置为各种用途。在这种情况下,请确保了解如何从嵌入式脚本访问对象句柄。我们还可以从插件,从远程API客户端,从ROS 平台或附加组件控制/访问/连接我们的模型。

现在我们要确保已经恢复了机器人和夹具附件中进行的更改,我们折叠了机器人模型的层次结构树,选择了模型的底座,然后点击[Menu bar --> File --> Save model as...] 进行保存。如果我们将其保存在模型文件夹中,那就可以在模型浏览器中使用模型。

参考资料

1.V-REP官方文档:http://www.coppeliarobotics.com/helpFiles/

V-REP 建立简洁模型教程相关推荐

  1. 【教程】利用libsvm-mat建立分类模型model参数解密【by faruto】

    原文地址:http://www.matlabsky.com/thread-12649-1-1.html 建议大家看这篇帖子之前先看一下以下几篇帖子: 如何使用libsvm进行分类[by faruto] ...

  2. 筑算高程点提取插件_「教程」原来利用高程数据点建立地形模型,只需要一个键...

    ©版权申明 本文由大地老周原创,如有转载请联系我们 各位同学经过前几期的学习,有没有对地形模型这一块的知识有更深的理解,和自己的解读呢~ 小编休息了几期,好好沉淀了一番,精心为大家准备了第四期的课程 ...

  3. 切割图形_模型教程丨切割机使用——结合实例

    点击这里查看上一期教程哦~ 半平米工坊:模型教程丨切割机操作手册​zhuanlan.zhihu.com 不知道大家看了上期的切割教程有没有去实际操作呢~有没有发现一些切割时不知道该如何处理的小问题~ ...

  4. oracle 建立一个游戏库,Power Designer怎么新建Oracle数据?建立Oracle数据教程分享

    powerdesigner是一款开发人员常用的数据库建模工具.最近许多小伙伴在使用Power Designer的时候,不知道怎么建立Oracle数据?下面游戏爱好者小编就分享了Power Design ...

  5. 3Dmax制作锁模型教程

    3Dmax制作锁模型教程 3Dmax如何制作锁模型?今天小编就和大家讲解一下3Dmax软件的实用知识点之锁模型,其实利用放样工具.切角长方体组合完成的.方法简单易懂,但愿你未来的项目中有所借鉴,那么以 ...

  6. Python建立线性回归模型进行房价预测

    Python建立线性回归模型进行房价预测 前期准备 多因子房价预测 实战流程 1.数据加载 2.数据可视化 3.数据预处理 4.模型建立与训练 5.模型预测 6.模型评估 7.房价预测 数据与代码 前 ...

  7. R语言建立决策树模型(movie数据集)

    导入数据集 将movie.MPAA.competition.star.genre.TechEffect按字符型读入其他变量按数值型读入 learn<- read.csv("E:\\RH ...

  8. Solidwork三维模型填充原子建立MD模型

    Solidwork三维模型填充原子建立MD模型 前言 一.atomsk软件下载 二.3D模型导入 1.Solidwork建立模型 2.建立铝块 3.铝块切割 4.补充 总结 前言 使用软件: Soli ...

  9. 【从零开始的ROS四轴机械臂控制】(三) - 为机械臂添加摄像头和夹爪、解决gazebo模型抖动、使用gazebo建立sdf模型

    [从零开始的ROS四轴机械臂控制(三)] 五.在gazebo中添加摄像头 1.修改arm1.gazebo.xacro文件 2.修改arm1.urdf.xacro文件 3.查看摄像头图像 六.为模型添加 ...

最新文章

  1. 纹身电极: 一种新型的可以进行脑信号测量的电极
  2. java 反序列化工具 marshalsec改造 加入dubbo-hessian2 exploit
  3. localstorage的应用,对js进行缓存
  4. SpringBoot中在配置文件中限制文件上传的大小
  5. 成功,要“借力”,不要“尽力”(深刻!)
  6. 圣诞素材ae模板-圣诞节日聚会派对视频素材ae模板
  7. centos6.5 tomcat开机启动
  8. Linux下maven安装
  9. atitit.基于  Commons CLI 的命令行原理与 开发
  10. CoType: Joint Extraction of Typed Entities and Relations with Knowledge Bases阅读笔记
  11. 调用MYSQL存储过程实例
  12. 10个可以为你的网页设计提供创造灵感的设计资源网站
  13. nmos导通流向_MOS管类型-MOS管4种类型与工作原理解析
  14. java音乐播放器代码_java 音乐播放器 示例源码(亲测可用)
  15. python中一般使用几个空格表示缩进_python中使用空格还是使用 Tab键缩进的建议...
  16. WMS系统(二)盘点之“核对库存”
  17. 2000-2020年上市公司常用指标数据集
  18. Linux GIC代码分析
  19. 计算机word图文混编实训报告,实训五 Word 图文混排
  20. 约瑟夫环问题(丢手绢问题)

热门文章

  1. html语言中空行标记,HTML代码中的空格和空行的实例操作
  2. python qt5 增加文本框_PyQt5 文本输入框自动补全 QLineEdit
  3. CorelDRAW版本限制使用关闭永久禁止联网登录弹窗口错误修复教程
  4. Kubernetes集群环境搭建全过程
  5. 李开复写给中国大学生的七封信(6/7)
  6. Freemarker 模板导出(带图片)
  7. acer 4750 Fn+亮度键(左右方向键亮度调节)无效问题的解决办法
  8. MPB:原核微生物群落随机性和确定性装配过程的计算方法
  9. 腾讯、新浪、淘宝、搜狐的IP库接口,根据IP显示当地的天气功能
  10. PDFBox加密和解密PDF文件