BubbleRob 教程—金土石科技CoppeliaSim
为了完成模型定义,我们选择视觉传感器、两个轮子、滑块和图形,然后启用项目 选择模型基础:如果我们现在尝试在场景中的模型中选择一个对象,则将选择整个模型,这是一种将整个模型作为单个对象进行处理和作的便捷方式。我们再次打开模型层次结构,然后点击 [Add > Vision sensor > Perspective type],然后将视觉传感器连接到接近传感器,并将视觉传感器的局部姿态设置为 (0,0,
本教程介绍了设计简单的移动机器人 BubbleRob 时的各种功能。与本教程相关的CoppeliaSim场景文件位于 scenes/tutorials/BubbleRob 中。下图说明了我们将设计的模拟场景:
由于本教程将介绍许多不同的方面,因此请务必同时查看其他教程,主要是有关构建仿真模型的教程。首先,重新启动 CoppeliaSim。模拟器将显示默认场景。我们将从 BubbleRob 的主体开始。
我们使用 [Add > Primitive shape > Sphere] 将直径为 0.2 的原始球体添加到场景中。我们将 X 大小的项目调整为 0.2,然后单击 OK(确定)。默认情况下,创建的球体将出现在可见性图层 1 中,并且是动态且可响应的(因为我们启用了项目 Create dynamic and respondable shape)。这意味着 BubbleRob 的身体将下落,并能够对与其他可响应形状(即由物理引擎模拟)的碰撞做出反应。我们可以看到这是形状动力学对话框:启用了 Body is respondable 和 Body is dynamic 项目。我们开始模拟(通过工具栏按钮,或在场景窗口中按 <control-space>),然后复制并粘贴创建的球体(使用 [Edit > Copy object(s)] 然后 [Edit -> Paste buffer],或使用 <control-c>然后 <control-v>):两个球体将对碰撞做出反应并滚动离开。我们停止模拟:复制的球体将自动删除。可以在 simulation 对话框中修改此默认行为。
我们还希望 BubbleRob 的 body to 可以被其他计算模块使用(例如距离计算)。因此,我们在该形状的常规场景对象属性对话框中启用 Collidable、Measurable 和 Detectable(如果尚未启用)。如果需要,我们现在还可以在形状对话框中更改球体的视觉外观。
现在我们打开平移选项卡上的位置对话框,选择代表 BubbleRob 身体的球体,然后输入 0.02 作为 Along Z。我们确保 Relative to-item 设置为 World。然后我们单击 Translate selection(翻译所选内容)。这会沿绝对 Z轴将所有选定的对象平移 2 厘米,并有效地将我们的球体抬高一点。在场景层次结构中,双击球体的别名,以便对其进行编辑。我们输入 bubbleRob 并按 Enter。
接下来,我们将添加一个接近传感器,以便 BubbleRob 知道它何时接近障碍物:我们选择 [添加>接近传感器>锥型]。在方向选项卡上的定向对话框中,我们为 Around Y 和 Around Z 输入 90,然后单击 Rotate selection。在位置对话框的 位置 选项卡上,我们输入 0.1 表示 X 坐标。输入 0.12 表示 Z 坐标。接近传感器现在相对于 BubbleRob 的身体正确定位。双击场景层次结构中接近传感器的图标以打开其属性对话框。单击 Show volume parameter 打开接近传感器体积对话框。我们将项目 Offset 调整为 0.005,Angle 调整为 30,Range 调整为 0.15。然后,在接近传感器对话框中,单击 Show detection parameters(显示检测参数)。这将打开 Proximity sensor detection parameter 对话框。我们取消选中项目 如果距离小于,则不允许检测,然后再次关闭该对话框。在场景层次结构中,双击接近传感器的别名以对其进行编辑。我们输入 sensingNose 并按 Enter。
我们选择 sensingNose,然后按住 Ctrl 键选择 bubbleRob,然后单击 [编辑 > 设置父项,保持姿势]。这会将传感器连接到机器人的身体上。我们还可以将 sensingNose 拖到场景层次结构中的 bubbleRob 上。这就是我们现在拥有的:
接下来我们将处理 BubbleRob 的轮子。我们使用 [File > New scene] 创建一个新场景。跨多个场景工作通常非常方便,以便仅对特定元素进行可视化和工作。我们添加一个尺寸为 (0.08,0.08,0.02) 的原始圆柱体。对于 BubbleRob 的主体,我们在该圆柱体的常规场景对象属性对话框中启用 Collidable、Measurable 和 Detectable(如果尚未启用)。然后,我们将圆柱体的绝对位置设置为 (0.05,0.1,0.04),将其绝对方向设置为 (-90,0,0)。我们将别名更改为 leftWheel。我们复制并粘贴 wheel,并将副本的绝对 Y 坐标设置为 -0.1。我们将副本重命名为 rightWheel。我们选择两个轮子,复制它们,然后切换回场景 1,然后粘贴轮子。
我们现在需要为车轮添加关节(或电机)。我们点击 [Add > Joint > Revolute] 将旋转关节添加到场景中。大多数情况下,在向场景中添加新对象时,该对象将出现在世界的原点处。我们保持关节处于选中状态,然后按住 Ctrl 键并选择 leftWheel。在位置对话框的 position 选项卡上,单击 Apply to selection 按钮:这会将关节定位在左轮的中心。然后,在方向对话框的 方向 选项卡上,我们做同样的事情:以与左轮相同的方式确定关节的方向。我们将关节重命名为 leftMotor。现在,双击场景层次结构中的关节图标以打开关节对话框。然后,单击 Show dynamic parameters (显示动态参数) 以打开关节动力学对话框。我们选择速度控制模式。现在,我们对右侧电机重复相同的过程,并将其重命名为 rightMotor。现在我们将左轮连接到左电机,将右轮连接到右电机,然后将两个电机连接到 bubbleRob。这就是我们所拥有的:
我们运行模拟并注意到机器人正在向后坠落。我们仍然缺少第三个接触点。我们现在添加一个小滑块(或脚轮)。在新场景中,我们添加一个直径为 0.05 的原始球体,并使球体 Collidable、Measurable 和 Detectable (如果尚未启用),然后将其重命名为 slider。我们在 shape dynamics 对话框中将 Material 设置为 noFrictionMaterial。为了将滑块与机器人的其余部分刚性连接,我们使用 [添加 > 力传感器] 添加一个力传感器对象。我们将其重命名为 connection 并将其向上移动 0.05。我们将滑块附加到力传感器上,然后复制两个对象,切换回场景 1 并粘贴它们。然后,我们将力传感器沿绝对 X 轴移动 -0.07,然后将其连接到机器人本体上。如果我们现在运行模拟,我们可以注意到滑块相对于机器人身体略微移动:这是因为两个对象(即 slider 和 bubbleRob)正在相互碰撞。为了避免在动态模拟过程中出现奇怪的效果,我们必须通知 CoppeliaSim两个对象不会相互碰撞,我们按以下方式执行此作:在形状动力学对话框中,对于 Slider,我们将局部可响应蒙版设置为 00001111,对于 bubbleRob,我们将局部可响应蒙版设置为 11110000。如果我们再次运行仿真,我们会注意到两个对象不再干涉。这就是我们现在拥有的:
我们再次运行模拟,注意到 BubbleRob 会轻微移动,即使电机被锁定也是如此。我们还尝试使用不同的物理引擎运行模拟:结果会有所不同。动态仿真的稳定性与所涉及的非静态形状的质量和惯性矩阵紧密相关。有关此效果的解释,请务必仔细阅读此部分和该部分。现在,我们尝试纠正这种不需要的效果。我们选择两个轮子和滑块,并通过 [编辑 > 形状质量和惯性>缩放质量...] 将质量增加 8 倍。我们对 3 个选定形状的惯性矩阵执行相同的作([编辑>形状质量和惯性>缩放惯性...]),然后再次运行模拟:稳定性得到了提高。在 joint dynamics(关节动力学)对话框中,我们将两个电动机的 Target velocity(目标速度)设置为 50。我们运行模拟:BubbleRob 现在向前移动并最终从地板上掉下来。我们将两个电机的 Target velocity 项重置为零。
对象 bubbleRob 位于稍后将形成 BubbleRob 模型的所有对象的基础。我们稍后将定义模型。接下来,我们将向 BubbleRob 添加一个图形对象,以显示其间隙距离。我们点击 [添加> Graph] 并将其重命名为 graph。我们将图形附加到 bubbleRob,并将图形的绝对坐标设置为 (0,0,0.005)。
现在我们将一个电机的目标速度设置为 50,运行模拟,并将看到 BubbleRob 的轨迹显示在场景中。然后,我们停止仿真并将电机目标速度重置为零。
我们添加一个具有以下尺寸的原始圆柱体:(0.1, 0.1, 0.2)。我们希望这个圆柱体是静态的(即不受重力或碰撞的影响),但仍对非静态可响应形状施加一些碰撞响应。为此,我们在 shape dynamics 对话框中禁用 Body is dynamic。我们还希望我们的圆柱体是可碰撞的、可测量的和可检测的。我们在 General scene object properties(常规场景对象属性)对话框中执行此作。现在,当圆柱体仍处于选中状态时,我们单击 object translation 工具栏按钮:
现在我们可以拖动场景中的任意点:圆柱体将跟随移动,同时始终被约束以保持相同的 Z 坐标。我们复制并粘贴圆柱体几次,然后将它们移动到 BubbleRob 周围的位置(从顶部查看场景时执行此作最方便)。在对象移动过程中,按住 shift 键可以执行较小的 shift 步骤。按住 ctrl 键允许在正交方向上移动到常规方向。完成后,再次选择摄像机平移工具栏按钮:
我们将左侧电机的目标速度设置为 50 并运行模拟:图形视图现在显示到最近障碍物的距离,并且距离段在场景中也可见。我们停止模拟并将目标速度重置为零。
我们现在需要完成 BubbleRob 作为模型定义。我们选择模型基础(即对象 bubbleRob),然后在常规场景对象属性对话框中选中 Object is model base:现在有一个点画边界框,它包含模型层次结构中的所有对象。我们选择两个关节、接近传感器和图形,然后启用项目 Ignored by model bounding box(被模型边界框忽略),并在同一对话框中单击 Apply to selection(应用于选择):模型边界框现在忽略两个关节和接近传感器。仍然在同一对话框中,我们禁用相机可见性层 2,并为两个关节和力传感器启用相机可见性层 10:这有效地隐藏了两个关节和力传感器,因为默认情况下层 9-16 处于禁用状态。我们可以随时修改整个场景的可见性图层。为了完成模型定义,我们选择视觉传感器、两个轮子、滑块和图形,然后启用项目 选择模型基础:如果我们现在尝试在场景中的模型中选择一个对象,则将选择整个模型,这是一种将整个模型作为单个对象进行处理和作的便捷方式。此外,这还可以保护模型免受意外修改。模型中的单个对象仍然可以在场景中选择,方法是使用 Ctrl-Shift 单击选择它们,或者通常在场景层次结构中选择它们。最后,我们折叠场景层次结构中的模型树。
接下来,我们将添加一个视觉传感器,其姿势与 BubbleRob 的接近传感器相同。我们再次打开模型层次结构,然后点击 [Add > Vision sensor > Perspective type],然后将视觉传感器连接到接近传感器,并将视觉传感器的局部姿态设置为 (0,0,0)。我们还确保视觉传感器不是不可见的,不是模型边界框的一部分,如果单击,模型将被选中。为了自定义视觉传感器,我们打开其属性对话框。我们将 Far clipping plane 项设置为 1,并将 Resolution x 和 Resolution y 项设置为 256 和 256。我们在场景中添加一个浮动视图,在新添加的浮动视图上,右键单击 [弹出菜单 > View > Associate view with selected vision sensor](我们确保在此过程中选择了视觉传感器)。
我们通过单击 [添加>脚本>模拟脚本 > Non threaded > Lua] 将模拟脚本附加到视觉传感器。双击场景层次结构中的 New script 图标:这将打开我们刚刚添加的模拟脚本。我们将以下代码复制并粘贴到脚本编辑器中,然后将其关闭:
为了能够看到视觉传感器的图像,我们开始模拟,然后再次停止模拟。
我们的场景需要的最后一件事是控制 BubbleRob 行为的模拟脚本。我们选择 bubbleRob 并点击 [添加 > 脚本 >模拟脚本 > Non threaded > Lua]。我们双击场景层次结构中的新脚本图标,将以下代码复制并粘贴到脚本编辑器中,然后将其关闭:
我们运行模拟。BubbleRob 现在在尝试避开障碍物的同时向前移动(以非常基本的方式)。当模拟仍在运行时,更改 BubbleRob 的速度,然后复制/粘贴几次。请注意,最小距离计算功能可能会严重减慢模拟速度,具体取决于环境。
使用脚本控制机器人或模型只是其中一种方法。CoppeliaSim 提供了许多不同的方法(也组合了),请查看外部控制器教程。
更多推荐
所有评论(0)