如何跨模型实例定义碰撞过滤器组?
How to define collision filter groups across model instances?
当从多个 ModelInstances
构建一个 MultiBodyPlant
时,每个 ModelInstances
从一个单独的 URDF 加载,有没有办法定义碰撞过滤器组来排除跨模型实例的碰撞?在 multibody URDF parser 中,加载碰撞过滤器组仅限于同一模型实例中存在的那些。
我想做的是在URDF A中指定:
<drake:collision_filter_group name="model_a_group">
<drake:member link="link1"/>
<drake:member link="link2"/>
<drake:ignored_collision_filter_group name="model_b_group"/>
</drake:collision_filter_group>
并在 URDF B 中指定:
<drake:collision_filter_group name="model_b_group">
<drake:member link="link4"/>
<drake:member link="link5"/>
<drake:ignored_collision_filter_group name="model_a_group"/>
</drake:collision_filter_group>
但目前尝试这样做会导致以下错误:
abort: Failure at multibody/parsing/detail_urdf_parser.cc:238 in abort:
Failure at multibody/parsing/detail_urdf_parser.cc:238 in ParseCollisionFilterGroup():
condition 'collision_filter_group_b != collision_filter_groups.end()' failed.
drake:collision_filter_group
的范围仅限于文件的范围。因此,这足以防止机器人关节处的“假”碰撞,但不足以防止两个独立解析的机器人发生碰撞。
为了实现这一目标,您必须解析这两个机器人,然后通过算法声明碰撞过滤器。
我现在没有太多时间,所以我会粗略地概述一下它的样子,稍后有空时再提供代码:
方法。
- 解析两个 URDF (SDF)。
- 获取模型实例“a”(link1 和 link2)的实体,类似地获取模型实例“b”(link4 和 link5)的实体。
- 使用 MBP 接口获取与每个主体关联的
geometry::FrameId
。 (我们分别称它们为frameA1、frameA2、frameB4、frameB5。
- 创建 geometry::GeometrySet 的两个实例。
geometry_set_A = {frameA1, frameA2}
和 geometry_set_B = {frameB4, frameB5}
.
- 调用
SceneGraph::ExcludeCollisionsBetween(geometry_set_A, geometry_set_b)
.
完成
这应该让您初步了解如何进行。稍后我会过来提供具体代码来完成任务。
当从多个 ModelInstances
构建一个 MultiBodyPlant
时,每个 ModelInstances
从一个单独的 URDF 加载,有没有办法定义碰撞过滤器组来排除跨模型实例的碰撞?在 multibody URDF parser 中,加载碰撞过滤器组仅限于同一模型实例中存在的那些。
我想做的是在URDF A中指定:
<drake:collision_filter_group name="model_a_group">
<drake:member link="link1"/>
<drake:member link="link2"/>
<drake:ignored_collision_filter_group name="model_b_group"/>
</drake:collision_filter_group>
并在 URDF B 中指定:
<drake:collision_filter_group name="model_b_group">
<drake:member link="link4"/>
<drake:member link="link5"/>
<drake:ignored_collision_filter_group name="model_a_group"/>
</drake:collision_filter_group>
但目前尝试这样做会导致以下错误:
abort: Failure at multibody/parsing/detail_urdf_parser.cc:238 in abort:
Failure at multibody/parsing/detail_urdf_parser.cc:238 in ParseCollisionFilterGroup():
condition 'collision_filter_group_b != collision_filter_groups.end()' failed.
drake:collision_filter_group
的范围仅限于文件的范围。因此,这足以防止机器人关节处的“假”碰撞,但不足以防止两个独立解析的机器人发生碰撞。
为了实现这一目标,您必须解析这两个机器人,然后通过算法声明碰撞过滤器。
我现在没有太多时间,所以我会粗略地概述一下它的样子,稍后有空时再提供代码:
方法。
- 解析两个 URDF (SDF)。
- 获取模型实例“a”(link1 和 link2)的实体,类似地获取模型实例“b”(link4 和 link5)的实体。
- 使用 MBP 接口获取与每个主体关联的
geometry::FrameId
。 (我们分别称它们为frameA1、frameA2、frameB4、frameB5。 - 创建 geometry::GeometrySet 的两个实例。
geometry_set_A = {frameA1, frameA2}
和geometry_set_B = {frameB4, frameB5}
. - 调用
SceneGraph::ExcludeCollisionsBetween(geometry_set_A, geometry_set_b)
.
完成
这应该让您初步了解如何进行。稍后我会过来提供具体代码来完成任务。