Почему загрузка моего SDF приводит к тому, что Mobilizer создает закрытую ошибку l oop - PullRequest
2 голосов
/ 11 июля 2020

Я пытаюсь загрузить 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

<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>

1 Ответ

3 голосов
/ 11 июля 2020

Это потому, что в настоящее время мы поддерживаем только модели со строгой древовидной структурой. Из файла SDF эта древовидная структура выводится из тегов <parent> и <child>, которые из-за этого ограничения Дрейк понимает как тела inboard и outboard в древовидной структуре (в конечном итоге мы снимем это ограничение. , но, вероятно, не скоро).

В вашем случае, я вижу, что вы предоставили тело pelvis как дочерний элемент двух других ссылок; right_thigh и left_thigh, который сегодня не поддерживается.

Чтобы решить проблему, поменяйте местами дочерний / родительский в ваших суставах left_hip и right_hip.

Кстати, я вижу никаких свойств инерции в вашем файле, только визуальные эффекты и столкновения. Поэтому вы не сможете ни моделировать, ни вычислять какую-либо полезную динамическую информацию. Думаю, это только потому, что работа еще не завершена.

Удачи.

...