< >
Home » ROS2与Gazebo11入门教程 » ROS2与Gazebo11入门教程-碰撞位掩码(Collision bitmask)

ROS2与Gazebo11入门教程-碰撞位掩码(Collision bitmask)

说明:

  • 介绍碰撞位掩码(Collision bitmask)

简介

  • 从Gazebo 6开始,就可以控制哪些几何体发生碰撞。可以将位掩码应用于SDF“碰撞(collision)”元素,两个碰撞的位掩码的按位与(bitwise-and)运算结果决定它们是否可能发生碰撞

碰撞位掩码的工作原理

  • 位掩码是一个通常以十六进制指定的数值,它会关联到某个对象上。本例中的对象就是碰撞几何体。当通过按位与运算对两个位掩码进行比较时,运算结果将用于控制要应用什么样的逻辑。本例中的逻辑就是碰撞是否可能发生。

  • 以一个由三个方盒boxA,boxB和boxC组成的示例为例来说明。方盒boxA、boxB和boxC的位掩码分别为0x01、0x02和0x03。这些位掩码的二进制数值分别是:

    • boxA:01

    • boxB:10

    • boxC:11

  • 假设这三个方盒都在一个仿真世界中,其中boxA在boxB的正下方,而boxC则在boxB的正上方。这样就组成了一个方盒堆栈,其中boxA在最下面,boxC在最上面。同时还假设所有方盒都可以与地平面发生碰撞。

  • 一旦仿真开始运行,boxA和boxB将会发生碰撞。但是,它们的位掩码的按位与运算会生成零值。这会向仿真引擎指示应该忽略该碰撞,其结果就是boxB会直接穿过boxA而不发生碰撞。

  • 此时,boxA和boxB都位于同一地点并落在地平面上。同时,boxC会从其起始位置掉下来。BoxC最终会击中boxA和boxB。 boxC的位掩码和同时属于boxA和boxB的位掩码之间的按位与运算将会生成一个大于零的值。这个非0的结果,也被编程语言认为其值为“true”,会向仿真引擎指示应该产生碰撞。其结果就是boxC将会停在boxA和boxB的上面。

  • 此示例是一个可运行的Gazebo演示。

  • 运行该演示仿真世界,并以暂停状态启动Gazebo,命令为:

gazebo -u worlds/shapes_bitmask.world
  • 按下“play”按钮来观察这些方盒掉落下来的情形。

请输入图片描述

如何设置碰撞位掩码

  • 可以使用SDF(一种用于描述仿真属性和实体的XML文件格式)来设置碰撞位掩码。“位掩码(bitmask)”XML元素是“表面(surface)”XML元素的子元素。可以使用十进制或者十六进制数值来指定位掩码值。下面是一个简单的示例,请注意,为清楚起见已删除了一些必要的SDF元素。
<model name="box">

<link name="link">

<collision name="collision">

<geometry> ... </geometry>



<surface>

<contact>

<collide_bitmask>0x01</collide_bitmask>

</contact>

</surface>



</collision>

<visual name="visual"> ... </visual>

</link>

</model>
  • 默认值

  • 每个几何体(包括地平面)的碰撞位掩码的默认值均为0xffff。 可以为那些不想让其与地平面发生碰撞的对象以及其他默认对象的位掩码设置成十六进制的较大值。

参考:

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与gazebo11入门教程