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
相关产品推荐
相关产品推荐

