如何调试“InputPort::Eval(): 所需的 InputPort[0] 未连接”

How to debug `InputPort::Eval(): required InputPort[0] is not connected`

背景

我正在尝试模拟安装在手推车上的双摆。我使用 examples/multibody/cart_pole/cart_pole_simulation.cc 作为起点。

我在 cart_pole.sdf 的基础上创建了一个新的 .sdf 并添加到我的双摆手推车中。我已经验证(通过 drake-visualizer 在视觉上)sdf 文件显示正确(更改关节值按预期移动模型)

由于添加了一个新关节,我在我的源文件中添加了以下行(其中 mid_joint 是摆的第一个 link 和第二个之间的关节名称link的摆。

  const RevoluteJoint<double>& mid_joint = tribot.GetJointByName<RevoluteJoint>("mid_joint");

  mid_joint.set_angle(&tribot_context, 0.0);

问题

我的程序编译正确,但是当我尝试 运行 我的系统时出现以下错误。

terminate called after throwing an instance of 'std::logic_error'
  what():  InputPort::Eval(): required InputPort[0] (geometry_query) of System ::_::drake/multibody/MultibodyPlant@0000560ea69178f0 (MultibodyPlant<double>) is not connected

任何关于此错误所指内容的指示都将不胜感激。

提前致谢

(PS:: 如果有人能告诉我如何更正式地验证 sdf 文件,那将很有帮助)

解决方案(感谢

以下是修复错误所需的更改

-    SceneGraph<double>& scene_graph = *builder.AddSystem<SceneGraph>();
+    auto pair = AddMultibodyPlantSceneGraph(&builder, std::make_unique<MultibodyPlant<double>>(FLAGS_time_step));
+    MultibodyPlant<double>& plant = pair.plant;
+
+    SceneGraph<double>& scene_graph = pair.scene_graph;
-    MultibodyPlant<double>& plant =
-        *builder.AddSystem<MultibodyPlant>(FLAGS_time_step);
-    builder.Connect(
-            plant.get_geometry_poses_output_port(),
-            scene_graph.get_source_pose_port(plant.get_source_id().value()));

我认为你很接近。您的代码偏离 examples/multibody/cart_pole/cart_pole_simulation.cc 起点的原因是您的 cartpole.sdf 几乎肯定添加了一些碰撞几何体,这在原始示例中是不存在的。因此,您的 MultibodyPlant 系统也需要在另一个方向连接到您的 SceneGraph 对象......以便 MultibodyPlant 可以提出有关碰撞的几何问题。

简单的解决方案是更改创建 MultibodyPlant/SceneGraph 的几行,使其看起来更像示例中的示例examples/multibody/inclined_plant/inclined_plane_run_dynamics.cc.

我想我们想要改善可能使用您的工作流程的人的体验,并且已经打开 https://github.com/RobotLocomotion/drake/issues/10874