为什么加载我的 SDF 会导致 Mobilizer 产生闭环错误
Why is loading my SDF causing Mobilizer creating a closed loop error
我正在尝试将 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>
这是因为目前我们只支持具有严格树结构的模型。从一个 SDF 文件中,这个树结构是从 <parent>
和 <child>
标签推断出来的,由于这个限制,Drake 将其理解为树结构中的 inboard
和 outboard
主体(我们最终会取消此限制,但可能不会很快)。
在您的情况下,我看到您提供了 pelvis
正文作为其他两个链接的子链接; right_thigh
和 left_thigh
,目前不支持。
要解决此问题,请交换关节 left_hip
和 right_hip
中的 child/parent。
顺便说一句,我在你的文件中没有看到惯性属性,只有视觉效果和碰撞。因此,您将无法模拟或计算任何有用的动力学信息。我想这只是因为这项工作正在进行中。
祝你好运。
我正在尝试将 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>
这是因为目前我们只支持具有严格树结构的模型。从一个 SDF 文件中,这个树结构是从 <parent>
和 <child>
标签推断出来的,由于这个限制,Drake 将其理解为树结构中的 inboard
和 outboard
主体(我们最终会取消此限制,但可能不会很快)。
在您的情况下,我看到您提供了 pelvis
正文作为其他两个链接的子链接; right_thigh
和 left_thigh
,目前不支持。
要解决此问题,请交换关节 left_hip
和 right_hip
中的 child/parent。
顺便说一句,我在你的文件中没有看到惯性属性,只有视觉效果和碰撞。因此,您将无法模拟或计算任何有用的动力学信息。我想这只是因为这项工作正在进行中。
祝你好运。