微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何跨模型实例定义碰撞过滤器组?

如何解决如何跨模型实例定义碰撞过滤器组?

当从多个 MultiBodyPlant 构建 ModelInstances 时,每个 <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 加载,有没有办法定义碰撞过滤器组以排除模型实例之间的碰撞?在 multibody URDF parser 中,加载碰撞过滤器组仅限于存在于同一模型实例中的那些。

我想做的是在 URDF A 中指定:

  <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>

并在 URDF B 中指定:

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.

但目前尝试这样做会导致以下错误

sh Configure -Dusethreads

解决方法

drake:collision_filter_group 的作用域仅限于文件的作用域。所以,这足以防止机器人关节处的“假”碰撞,但不足以防止两个独立解析的机器人发生碰撞。

为了实现这一目标,您必须解析两个机器人,然后通过算法声明碰撞过滤器。

我现在没有很多时间,所以我会粗略地概述一下它的样子,然后等我有空的时候再提供代码:

方法。

  1. 解析两个 URDF (SDF)。
  2. 抓取模型实例“a”(link1 和 link2)的实体,同样抓取模型实例“b”(link4 和 link5)的实体。
  3. 使用 MBP 接口获取与每个主体关联的 geometry::FrameId。 (我们将分别称它们为 frameA1、frameA2、frameB4、frameB5。
  4. 创建 geometry::GeometrySet 的两个实例。 geometry_set_A = {frameA1,frameA2}geometry_set_B = {frameB4,frameB5}
  5. 调用 SceneGraph::ExcludeCollisionsBetween(geometry_set_A,geometry_set_b)

完成

这应该让您初步了解如何进行。稍后我会再来一遍,给出具体的代码来完成任务。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。