Drake仿真iiwa乒乓球机器人球拍接触触发IndexError: _Map_base::at求助
问题根因
你遇到的IndexError: _Map_base::at报错是因为代码将iiwa机器人、球拍、乒乓球拆分到了两个独立的MultibodyPlant实例中。Drake的接触求解器仅会处理同一MultibodyPlant内部各模型的碰撞交互,SceneGraph检测到跨Plant的碰撞对后,无法在任意一个Plant的碰撞映射表中找到对应条目,就会触发索引越界。
修复方案
- 移除单独定义的
plant_ball实例,将乒乓球模型加载到已有的plant_iiwa中,所有参与碰撞的物体统一放在同一个MultibodyPlant里:
# 删掉原有plant_ball相关的创建、端口连接代码,直接在iiwa对应的plant中加载球模型 parser_ball = Parser(plant_iiwa, scene_graph) ball = parser_ball.AddModelFromFile("notebooks/models/ball.sdf", model_name="ball") # 无需单独为球执行Finalize,使用原有plant_iiwa.Finalize()即可
- 同步调整球的状态设置逻辑,从
plant_iiwa中操作球的初始位姿:
# 球的上下文从iiwa所在的plant获取 ball_context = plant_iiwa.GetMyMutableContextFromRoot(diagram_context) plant_iiwa.SetPositions(ball_context, ball, np.array(ball_q0))
补充调试建议
如果修复后仍有问题,可以按以下步骤排查:
- 适当调小仿真时间步,比如从0.001改为0.0001,避免高速运动的乒乓球出现穿模导致接触计算异常
- 显式指定接触模型:调用
plant_iiwa.set_contact_model(ContactModel.kPoint),指定点接触模型减少兼容性问题 - 先移除控制器,直接固定球拍位姿,简化场景验证接触逻辑是否正常,排除控制器输出异常导致的碰撞计算问题
- 开启Drake调试日志,运行代码前设置环境变量
DRAKE_LOG_LEVEL=debug,可以获取更详细的接触计算报错信息
内容的提问来源于stack exchange,提问作者Cameron Pittman
相关产品推荐
相关产品推荐

