使用PyDrake中ComputeSignedDistancePairClosestPoints时的异常不一致问题
以下是可能触发该RuntimeError的几个常见原因:
几何角色未设置为Proximity
Drake中只有标记为proximity角色的几何才能参与有符号距离查询。如果ID63对应的几何(无论足部mesh还是地面box)被注册为visual或旧版的collision角色,就会触发这个错误。而ComputeSignedDistancePairwiseClosestPoints会自动忽略不支持proximity查询的几何对,因此能正常运行。
检查URDF中几何的<role>标签,确保碰撞几何都设置为<role>proximity</role>;或者在代码中调用AddCollisionGeometry时明确指定proximity角色(Drake新版本中该接口默认使用proximity角色,但旧版本可能有差异)。几何ID对应错误
你遍历的足部ID可能混入了非目标几何(比如视觉部件、连杆的其他碰撞体),ID63可能根本不是你预期的足部mesh或地面box。可以通过SceneGraphInspector打印所有几何ID的对应信息来确认:const auto& inspector = scene_graph.model_inspector(); inspector.GetName(geometry_id); // 查看几何名称 inspector.GetShape(geometry_id); // 查看几何类型Mesh文件存在拓扑问题
即使是obj格式,如果mesh存在非流形结构(比如面重叠、顶点未闭合、法线方向混乱),Drake可能无法生成有效的有符号距离场,导致该几何不支持查询。而批量查询函数可能会跳过有问题的几何,或采用兼容的碰撞检测 fallback 逻辑。可以用MeshLab等工具检查并修复obj文件的拓扑错误。API调用的参数兼容性差异
ComputeSignedDistancePairClosestPoints要求传入的两个几何都必须支持有符号距离计算,否则直接报错;而ComputeSignedDistancePairwiseClosestPoints会对每一对几何做兼容性检查,自动跳过不支持的组合。如果你的单对查询代码中不小心传入了不兼容的几何对(比如视觉几何和proximity几何配对),就会触发错误,而批量函数会自动过滤这类无效配对。
内容的提问来源于stack exchange,提问作者Remi Makinwa

