主要内容

检测物体碰撞

您可以使用碰撞检测来精确地模拟现实世界中对象的物理约束,以避免同时在同一位置有两个对象。您可以使用碰撞检测节点输出到:

  • 更改其他虚拟世界节点的状态。

  • 应用MATLAB®碰撞数据的算法。

  • 驱动模型金宝app®模型。

例如,可以使用几何传感器进行机器人建模。有关使用碰撞检测的示例,请参见使用线传感器的碰撞检测而且迷宫中的差动轮式机器人

设置碰撞检测

要设置碰撞检测,定义碰撞(拾取)传感器,当它们与目标周围场景物体碰撞时进行检测。虚拟世界的传感器类似于真实世界的传感器,如超声波、激光雷达和触摸传感器。的金宝appSimulink 3D动画传感器基于X3D传感器(也支持VRML),如中所述金宝appX3D拾取组件规范.有关可访问的拾取传感器输出属性的描述虚拟现实来源而且VR水槽块,看到在模型中使用碰撞检测数据

  • PointPickSensor-点云,检测哪些点在碰撞几何图形内

  • LinePickSensor-射线风扇或其他检测碰撞几何距离的线集

  • PrimitivePickSensor-检测碰撞几何图形的原始几何图形(如圆锥、球体或盒子)

要添加碰撞检测传感器,请使用以下常规步骤。有关反映此工作流的示例,请参见使用线传感器的碰撞检测

  1. 在“3D World Editor”树结构窗格中,选择孩子们节点变换要向其添加拾取传感器的节点。

  2. 若要创建与传感器一起使用的拾取几何图形,请添加几何节点。选择节点>添加>几何并选择适合pick传感器类型的几何形状(例如,点集).

  3. 通过选择添加拾取传感器节点节点>添加>传感器节点

  4. 在传感器节点中,右键单击pickingGeometry属性并选择使用.指定几何为传感器创建的节点。

  5. 同样在传感器节点中,右键单击pickingTarget属性并选择使用.指定希望传感器检测碰撞的目标对象。

    而不是指定拾取几何与使用,可以直接定义拾取几何。然而,直接定义的几何是不可见的。

  6. 可选地,更改默认属性值或为传感器属性指定其他值。有关intersectionType,请参阅传感器碰撞与多个对象选择目标.控件访问的输出属性的描述虚拟现实来源块,看在模型中使用碰撞检测数据

中为机器人定义碰撞检测传感器的关键节点示例vrcollisions虚拟世界:

  • Robot_Body节点具有Line_Set节点作为其子节点之一。的Line_Set节点定义传感器的拾取几何形状。

  • Collision_Sensor定义机器人的碰撞检测传感器。传感器节点pickingGeometry指定使用Line_Set节点作为拾取几何图形Walls_Obstacles节点作为碰撞检测的目标。

传感器碰撞与多个对象选择目标

若要控制拾取传感器在与由多个对象组成的拾取目标几何结构碰撞时的行为,请使用intersectionType财产。可能取值为:

  • 几何中定义的所有对象的单独包围框的联合与传感器碰撞pickTarget字段。通常,这种设置会产生更精确的结果。

  • 界限中定义的所有对象周围的一个大边界框与传感器碰撞(默认值)pickTarget字段。

vrcollisions的例子中,LinePickSensorintersectionType字段设置为几何.这一设置意味着位于碰撞几何结构(由房间墙壁组成)内部的传感器不会与墙壁的联合发生碰撞。只有当传感器射线接触到任何墙壁时,才会发生碰撞。如果intersectionType设置为界限在美国,碰撞检测仅适用于从外部接近房间的传感器。整个房间被包裹在一个与传感器相互作用的大包围盒中。

透明几何体

您可以在虚拟世界中使用于拾取传感器的拾取几何图形不可见。对于拾取几何,在其材料节点,设置透明度财产1.例如,在使用线传感器的碰撞检测虚拟世界,为之Collision_Sensor选取几何节点(Line_Set),在材料节点,更改透明度财产1

避免即将发生的碰撞

为了避免即将发生的碰撞(在碰撞实际发生之前),您可以使用pickedRange属性的输出。LinePickSensor.作为线集选取几何图形的一部分,定义一条或多条长线,以反映您对即将发生的碰撞的预期提前通知量。你可以让这些线透明。的基础上创建逻辑pickedRange价值。

在模型中使用碰撞检测数据

isActive传感器的输出属性变为真正的当碰撞发生时。要将模型与虚拟现实场景相关联,可以使用虚拟现实来源块读取传感器isActive属性和为其定义传感器的对象的当前位置。你可以使用VR水槽块来定义虚拟世界对象的行为,例如它的位置、旋转或颜色。

例如,虚拟现实来源块的左上方使用线传感器的碰撞检测金宝appSimulink模型从相关的虚拟世界获取数据。

在模型中,选择虚拟现实来源块,然后在金宝appSimulink 3D动画查看器中,选择模拟>块的参数.此图像显示了一些关键的选定属性。

LinePickSensorPointPickSensor,PrimitivePickSensor的输出属性虚拟现实来源布洛克:

  • 启用—启用节点操作。

    请注意

    属性可以选择的唯一属性是enabled属性VR水槽块。

  • isActive-指示相交对象何时被拾取几何图形拾取。

  • pickedPoint-显示底层表面上的点PickGeometry在局部坐标系中被选中。

  • pickedRange-指示从拾取开始的范围读数。详细信息请参见避免即将发生的碰撞

对于一个PointPickSensor,您可以选择启用isActive,pickedPoint输出。为PrimitivePickSensor,您可以选择启用而且isActive输出。

机器人控制子系统块包括改变机器人颜色和位置的逻辑。

基于机器人控制子系统输出,VR水槽Block更新虚拟世界,以反映机器人的颜色和位置。

提示

考虑调整块的采样时间,以提高碰撞检测的精度。

使用碰撞检测MATLAB

您可以在MATLAB中定义的虚拟世界中使用碰撞检测。本例基于vrcollisions虚拟世界。它不使用Simulink模型。金宝app

  1. 打开并查看vrcollisions虚拟世界。

    W = vrworld(“vrcollisions”);开放(w);FIG = view(w,“内部”);
  2. 获取虚拟世界的碰撞传感器和机器人节点。

    Col = vrnode(w,“Collision_Sensor”) rob = vrnode(w,“机器人”) color = vrnode(w,“Robot_color”
  3. 移动机器人,基于碰撞检测(当isActive属性是真正的).在默认位置,没有检测到碰撞。

    col.isActiveIi = 1:30移动机器人抢劫翻译=抢劫。翻译+ [0.05 0 0];vrdrawnow%如果检测到碰撞,将颜色更改为红色。如果col.isActive颜色。diffuseColor = [1 0 0];结束结束

在虚拟世界中使用碰撞检测数据

您可以使用碰撞检测来操作虚拟世界对象,独立于Simulink模型或MATLAB中的虚拟世界对象。金宝app

迷宫中的差动轮式机器人虚拟世界定义二绿IndexedLineSet拾取传感器(Sensor1而且Sensor2)为紫色机器人(机器人节点)。

VRML代码包括路线每个拾取传感器的节点。

路线类中定义的逻辑脚本节点称为ChangeColor

另请参阅

相关的话题