背景
我正在尝试模拟安装在推车上的双摆。我以examples/multibody/cart_pole/cart_pole_simulation.cc
为起点。
我创建了一个新.sdf
的基于cart_pole.sdf
并添加了我的双摆车。我已经验证(通过 drake-visualizer 在视觉上)该sdf
文件看起来正确(更改关节值会按预期移动模型)
由于添加了一个新的关节,我在我的源文件中添加了以下行(其中mid_joint
是摆的第一个链接和钟摆的第二个链接之间的关节的名称。
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()));