0

背景

我正在尝试模拟安装在推车上的双摆。我以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()));
4

1 回答 1

2

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

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

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

于 2019-03-09T08:46:40.597 回答