【问题标题】:Why is loading my SDF causing Mobilizer creating a closed loop error为什么加载我的 SDF 会导致 Mobilizer 创建闭环错误
【发布时间】:2020-07-11 06:06:15
【问题描述】:

我正在尝试将 SDF 加载到 drake,但我的程序抛出了 std::runtime_error

terminate called after throwing an instance of 'std::runtime_error'
  what():  This mobilizer is creating a closed loop since the outboard body already has an inboard mobilizer connected to it. If a physical loop is really needed, consider using a constraint instead.
Aborted (core dumped)

这是我正在运行的代码

  MultibodyPlant<double>* dp =
      builder.AddSystem<MultibodyPlant<double>>(max_time_step);
  dp->set_name("plant");
  dp->RegisterAsSourceForSceneGraph(&scene_graph);

  drake::multibody::Parser parser(dp);
  const std::string sdf_path = kDoublePendulumSdfPath;

  parser.AddModelFromFile(sdf_path);

  dp->Finalize();

这是我的自卫队

<sdf version="1.4">
<model name="t-wrecks">

<link name="left_foot"><pose>0 0 0 0 0 0</pose><collision name="collision"><geometry><box><size>1 1 1</size></box></geometry></collision><visual name="visual"><geometry><box><size>1 1 1</size></box></geometry></visual></link>

<link name="right_foot"><pose>2 0 0 0 0 0</pose><collision name="collision"><geometry><box><size>1 1 1</size></box></geometry></collision><visual name="visual"><geometry><box><size>1 1 1</size></box></geometry></visual></link>

<link name="left_leg"><pose>0 0 1.5 0 0 0</pose><collision name="collision"><geometry><box><size>0.5 0.5 2</size></box></geometry></collision><visual name="visual"><geometry><box><size>0.5 0.5 2</size></box></geometry></visual></link>

<link name="right_leg"><pose>2 0 1.5 0 0 0 0</pose><collision name="collision"><geometry><box><size>0.5 0.5 2</size></box></geometry></collision><visual name="visual"><geometry><box><size>0.5 0.5 2</size></box></geometry></visual></link>

<link name="left_thigh"><pose>0 -0.4 3 0.5 0 0</pose><collision name="collision"><geometry><box><size>0.5 0.5 2</size></box></geometry></collision><visual name="visual"><geometry><box><size>0.5 0.5 2</size></box></geometry></visual></link>

<link name="right_thigh"><pose>2 -0.4 3 0.5 0 0</pose><collision name="collision"><geometry><box><size>0.5 0.5 2</size></box></geometry></collision><visual name="visual"><geometry><box><size>0.5 0.5 2</size></box></geometry></visual></link>

<link name="pelvis"><pose>1.0 -0.75 3.75 0 0 0</pose><collision name="collision"><geometry><box><size>2.5 1 0.25</size></box></geometry></collision><visual name="visual"><geometry><box><size>2.5 1 0.25</size></box></geometry></visual></link>

<joint name="left_leg_foot" type="revolute"><pose>0 0 0 0 0 0</pose><child>left_foot</child><parent>left_leg</parent><axis><xyz>1 0 0</xyz></axis></joint>

<joint name="right_leg_foot" type="revolute"><pose>0 0 0 0 0 0</pose><child>right_foot</child><parent>right_leg</parent><axis><xyz>1 0 0</xyz></axis></joint><joint name="left_knee" type="revolute"><pose>0 0 1.0 0 0 0</pose><child>left_leg</child><parent>left_thigh</parent><axis><xyz>1 0 0</xyz></axis></joint><joint name="right_knee" type="revolute"><pose>0 0 1 0 0 0</pose><child>right_leg</child><parent>right_thigh</parent><axis><xyz>1 0 0</xyz></axis></joint>

<joint name="left_hip" type="revolute"><pose>0 0 1 0 0 0</pose><child>pelvis</child><parent>right_thigh</parent><axis><xyz>1 0 0</xyz></axis></joint><joint name="right_hip" type="revolute"><pose>0 0 1 0 0 0</pose><child>pelvis</child><parent>left_thigh</parent><axis><xyz>1 0 0</xyz></axis></joint>

</model>
<static>true</static>
</sdf>

【问题讨论】:

    标签: c++ drake


    【解决方案1】:

    这是因为目前我们只支持具有严格树结构的模型。从 SDF 文件中,这个树结构是从 &lt;parent&gt;&lt;child&gt; 标记推断出来的,由于这个限制,Drake 理解为树结构中的 inboardoutboard 主体(我们最终会解除这个限制,但可能不会很快)。

    在您的情况下,我看到您提供了 pelvis 正文作为其他两个链接的子链接; right_thighleft_thigh,目前不支持。

    要解决此问题,请在 left_hipright_hip 的关节中交换子/父。

    顺便说一句,我在您的文件中没有看到惯性属性,只有视觉效果和碰撞。因此,您将无法模拟或计算任何有用的动态信息。我想这只是因为这项工作正在进行中。

    祝你好运。

    【讨论】:

    • 是的,绝对是 WIP。感谢您对内侧和外侧机身的提醒:-)
    • 太棒了,我很高兴它有帮助。
    • FTR 顺便说一句:会有惯性属性——不幸的是,它们来自非物理默认值:P sdformat.org/spec?ver=1.7&elem=link#link_inertial(在 Drake 中慢慢修复,然后最终在 SDFormat 中修复)。一般来说,你应该避免依赖那些有用的模型的默认值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2022-09-16
    • 2017-04-24
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多