You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drake碰撞过滤:非碰撞几何体的穿透查询技术问询

关于pyDrake中非碰撞几何体的属性检测问题

问题背景

我正在pyDrake中开展机器人操作仿真工作,需要设置若干非碰撞几何体用于属性检测——例如在目标区域放置一个箱体,希望在仿真运行数秒后检测是否有物体进入该箱体。由于需要在执行过程中快速便捷地移动和旋转该箱体,因此直接检测物体位置并非理想方案。

核心疑问

  • 是否可以在Drake的MultibodyPlant中设置非碰撞几何体,同时仍能检测其与场景中其他物体的穿透或SDF距离?
  • Diagram构建后是否无法修改碰撞过滤规则?

尝试的方案及遇到的问题

我最初的思路是为该几何体设置碰撞过滤,再通过MultibodyPlant的几何查询端口检查箱体与相关物体的SDF,代码示例如下:

### Assemble system with a MultibodyPlant and SceneGraph, add relevant models, extract body poses
# geometry_set_all - a GeometrySet object with the BodyIndex's of all bodies in the plant

# Make box non-colliding
box_exclude_declaration = CollisionFilterDeclaration().ExcludeBetween(GeometrySet(box_id), geometry_set_all)
box_exlcude_filter_ID = scene_graph.collision_filter_manager().ApplyTransient(box_exclude_declaration)

### Set up visualization, build diagram, run simulation

# Create query object to check penetration with geometry
query_object = plant.get_geometry_query_input_port().Eval(plant_context)
penetrating_pairs = query_object.ComputePointPairPenetration()

但该方案无效,为箱体设置的碰撞过滤似乎也会作用于点对穿透检测(仿真中物体进入箱体,但penetrating_pairs未包含该箱体)。

随后我尝试在仿真结束、创建query_object前移除临时过滤:

removed = scene_graph.collision_filter_manager().RemoveDeclaration(box_exlcude_filter_ID)

尽管返回值removed为True,但penetrating_pairs仍未包含箱体,且恢复仿真后箱体仍处于碰撞过滤状态。而在构建diagram后添加过滤时,箱体被视为碰撞几何体。

当前考虑的替代方案

目前我考虑构建两个独立系统:一个不含箱体用于仿真,一个含箱体用于碰撞检测并传递仿真状态,但该方案过于繁琐。此外,我也希望能在其他场景中便捷开关碰撞,例如检测物体A与其他物体的碰撞,但忽略其与物体B的碰撞。

内容的提问来源于stack exchange,提问作者SGollob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:43:27