如何在pydrake中使用minDistanceConstraint

时间:2018-11-15 01:11:14

标签: drake

在此repo中,@ Gizatt使用以下命令为kuka iiwa组合碰撞约束:
ik.MinDistanceConstraint(tree,crash_tol,list(),set())

在这里,list()和set()表示什么。两者在这里似乎都是空的。

让我们说我的RigidBodyTree中有一个项目(项目1)由6个实体(在一个urdf内)和另一个对象(项目2)组成,其中一个主体(在一个urdf中),我只想检查组成项目1和项目2的6个实体中的任何一个之间的碰撞。是否可以设置此功能,以便它不检查项目1中所有实体内的碰撞,而仅检查项目1之间的碰撞。和项目2?

最后,当我使用此功能时,当前出现以下错误: [2018-11-14 19:39:20.812] [控制台] [警告]试图计算两个碰撞元素之间的距离,其中至少一个是非凸的。 我接受了@gizatt的建议,并使用meshlab将项目1中每个链接的网格转换为凸包,当我使用可视化工具查看每个网格时,它们对我来说都是凸的。但是我仍然收到此错误。还有其他原因会弹出此错误吗?

2 个答案:

答案 0 :(得分:0)

该方法的文档在这里: https://drake.mit.edu/pydrake/pydrake.solvers.ik.html?highlight=mindistanceconstraint#pydrake.solvers.ik.MinDistanceConstraint

greg使用的最后两个参数是关于“活动”主体的。如果您想完全忽略碰撞计算中的某些物体,这将对您有帮助。

如果要忽略某些碰撞对,请使用碰撞过滤器组: https://drake.mit.edu/pydrake/pydrake.multibody.rigid_body_tree.html?highlight=collision%20filter#pydrake.multibody.rigid_body_tree.RigidBodyTree.DefineCollisionFilterGroup

我们的RBT / Bullet包装器假定每个网格都是凸形,但静态/锚定几何除外。您似乎正在收到该警告,因为您正在针对静态/固定几何进行碰撞检查?

FWIW-关于multibodytree和刚性bodytree的文档要完整得多,但是对于这个特定的查询,我认为您使用RBT是正确的-多体还不存在。

答案 1 :(得分:0)

  

在这里,list()和set()表示什么。两者在这里似乎都是空的。

这些参数是历史工件,几乎绝不是您要使用的参数。我建议像您提供的示例一样将它们保留为空。第一个将约束限制为仅考虑由active_bodies_idx指定的主体。第二个方法将约束条件限制为仅考虑名称包含在active_group_names中的冲突组。请注意,active_group_names参数的“冲突组”概念与“冲突过滤器组”概念 相同。

  

有没有办法设置此功能,以便不检查   用于项目1中所有物体之间的碰撞,但仅用于   项目1和项目2之间发生碰撞?

您在正确的轨道上。您要添加一个包含项目1中所有实体的碰撞过滤器组,然后将该碰撞组设置为忽略自身。以下代码要求PR #10085添加的AddCollisionFilterIgnoreTarget()绑定。

tree.DefineCollisionFilterGroup("1_filtergroup")

tree.AddCollisionFilterGroupMember("1_filtergroup", "base_link", 1_model_id)
# Repeat the previous line for all bodies in item 1.

tree.AddCollisionFilterIgnoreTarget("1_filtergroup", "1_filtergroup")

然后您可以通过调用ik.MinDistanceConstraint(tree, collision_tol, list(), set())创建具有所需行为的约束。

  

最后,当我使用此命令时,当前出现以下错误   功能:[2018-11-14 19:39:20.812] [控制台] [警告]尝试   计算两个碰撞元素之间的距离,其中至少一个   是非凸的。 ...还有其他原因导致此错误   会弹出吗?

@Russ Tedrake mentioned一样,所有附加到锚定的(焊接到世界)物体上的网格碰撞元素都将转换为Bullet后端中的非凸网格物体,无论其凸度如何。原始网格。不幸的是,但由于所有与RigidBodyTree相关的代码都快要寿终正寝了,因此很可能无法解决。出于IK目的,您可以通过将网格附加到通过上下限均为0的棱​​柱形或旋转关节连接到世界的虚拟物体上来解决此问题。这将迫使后端与凸包一起使用提供网格的数量。然后,您需要从IK返回的配置中删除与虚拟关节相对应的元素。