如何调试“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。
背景
我正在尝试模拟安装在手推车上的双摆。我使用 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。