PyDrake: Meshcat не визуализирует URDF с помощью (псевдо) сферического соединения

#drake

#drake

Вопрос:

Я пытаюсь добавить реактивные колеса к модели космического корабля-робота в drake. Для этого я добавляю 3 шарнира вращения к основанию космического корабля, чтобы имитировать крутящие моменты, прикладываемые к основанию реактивными колесами. Поскольку спецификация URDF не допускает прямого использования сферических соединений, я использую (псевдо) промежуточные ссылки для создания сферического соединения. Соответствующая часть файла urdf показана ниже:

 <link name="Base"/>

  <link name="Base_roll"/>

  <!-- S/C Roll Joint -->
  <joint name="Joint_base_roll" type="continuous">
    <parent link="Base"/>
    <child link="Base_roll"/>
    <origin rpy="0 0 0" xyz="0 0 0"/>
    <axis xyz="1 0 0"/>
  </joint>

  <transmission name="Joint_base_roll_trans">
    <type>transmission_interface/SimpleTransmission</type>
    <actuator name="$Joint_base_roll_motor">
      <mechanicalReduction>1</mechanicalReduction>
    </actuator>
    <joint name="Joint_base_roll">
      <hardwareInterface>PositionJointInterface</hardwareInterface>
    </joint>
  </transmission>

  <link name="Base_pitch"/>

  <!-- S/C Pitch Joint -->
  <joint name="Joint_base_pitch" type="continuous">
    <parent link="Base_roll"/>
    <child link="Base_pitch"/>
    <origin rpy="0 0 0" xyz="0 0 0"/>
    <axis xyz="0 1 0"/>
  </joint>

  <transmission name="Joint_base_pitch_trans">
    <type>transmission_interface/SimpleTransmission</type>
    <actuator name="$Joint_base_pitch_motor">
      <mechanicalReduction>1</mechanicalReduction>
    </actuator>
    <joint name="Joint_base_pitch">
      <hardwareInterface>PositionJointInterface</hardwareInterface>
    </joint>
  </transmission>

  <!-- S/C Yaw Joint -->
  <joint name="Joint_base_yaw" type="continuous">
    <parent link="Base_pitch"/>
    <child link="Spacecraft"/>
    <origin rpy="0 0 0" xyz="0 0 0"/>
    <axis xyz="0 0 1"/>
  </joint>

  <transmission name="Joint_base_yaw_trans">
    <type>transmission_interface/SimpleTransmission</type>
    <actuator name="$Joint_base_yaw_motor">
      <mechanicalReduction>1</mechanicalReduction>
    </actuator>
    <joint name="Joint_base_yaw">
      <hardwareInterface>PositionJointInterface</hardwareInterface>
    </joint>
  </transmission>

  <!--Spacecraft-->
  <link name="Spacecraft">
    <inertial>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <mass value="2550"/>
      <inertia ixx="6200" ixy="48.2" ixz="78.5" iyy="3540" iyz="-29.2" izz="7090"/>
    </inertial>
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <box size="2.2 2.1 2" />
      </geometry>
      <material name="Grey"/>
    </visual>
  </link>
  

Полный urdf для космического корабля рука робота с реактивными колесами можно найти здесь: https: //pastebin.com/0G1GSeqk и без реактивных колес можно найти здесь: https: //pastebin.com/v9Ne8Nv8

Я использую это для запуска следующего скрипта для приложения крутящего момента к основанию и соответствующей имитации вращения системы:

 builder = DiagramBuilder()

# Adds both MultibodyPlant and the SceneGraph, and wires them together.
plant, scene_graph = AddMultibodyPlantSceneGraph(builder, time_step=1e-4)
# Note that we parse into both the plant and the scene_graph here.
Parser(plant, scene_graph).AddModelFromFile(SCpath)
# Remove gravity
plantGravityField = plant.gravity_field()
plantGravityField.set_gravity_vector([0,0,0])
plant.Finalize()

# Adds the MeshcatVisualizer and wires it to the SceneGraph.
meshcat = ConnectMeshcatVisualizer(builder, scene_graph, zmq_url=zmq_url, delete_prefix_on_load=True)

diagram = builder.Build()
context = diagram.CreateDefaultContext()
plant_context = plant.GetMyMutableContextFromRoot(context)
jointAcutation =  np.zeros((plant.num_actuators(),1))
jointAcutation[3] = 1
plant.get_actuation_input_port().FixValue(plant_context, jointAcutation)

simulator = Simulator(diagram, context)

meshcat.load()

simulator.AdvanceTo(30.0 if running_as_notebook else 0.1)
  

Однако визуализация Meshcat работает только без части реактивных колес в urdf. Когда я добавляю (псевдо) ссылки и соединения, визуализация полностью пуста. Правильно ли я предполагаю, что это связано с (псевдо) ссылками в urdf? Если да, является ли формат sdf лучшим способом создания сферических соединений, чтобы их также можно было визуализировать?

P.S Я пытаюсь контролировать положение космического корабля, прикладывая крутящие моменты к основанию при перемещении руки робота для имитации реактивных колес. Я предполагаю, что добавление сферического соединения было бы самым простым способом добавить «контроллер соединения» для достижения этой цели. Может быть, есть лучший способ сделать это.

Обновление: эту проблему можно воспроизвести, используя следующую записную книжку в Google Colab: https://colab.research.google.com/github/vyas-shubham/DrakeTests/blob/main/freeFloating/FreeFloatingTumbleTest.ipynb

Комментарии:

1. Файлы urdf выглядят нормально. Я проверил, что могу просматривать их в meshcat с помощью ./bazel-bin/manipulation/util/geometry_inspector ~/Downloads/reaction.urdf --meshcat . И да — можно добавить эти фиктивные соединения, если вам нужно добавить приводы к «плавающим» соединениям.

2. Это интересно. Я не вижу модель с помощью meshcat.load() при использовании версии reaction wheel, но вижу модель без reaction wheels в моем ноутбуке python. Кроме того, затем я запускаю симуляцию и пытаюсь записать ее с помощью meshcat.start_recording() Я сталкиваюсь со следующей ошибкой в meshcat: pastebin.com/jia2ynUp

3. Я думаю, вы правы в том, что файл geometry_inspector py не поставляется с двоичными файлами drake. Но вы можете сделать что-то очень похожее в pydrake / jupyter. Смотрите этот пример: manipulation.csail.mit.edu/robot.html#example1

4. я только что запустил ваш код. Если вы добавите print(context) к последней строке, вы увидите, что вы получаете nan из своего моделирования (в то время как запись meshcat по-прежнему отключена). Meshcat потенциально мог бы обрабатывать nan более изящно, но это не источник вашей проблемы.

5. Кроме того, он немедленно взрывается. Мне пришлось запускать его с меньшим временным интервалом, чтобы даже видеть не-nan в чрезвычайно малое время. И если вы установите time_step=0 в конструкторе multibodyplant, вы увидите, что даже интеграция с контролем ошибок будет жаловаться. У вас определенно жесткая система (инерция основного корпуса — это>> инерция ссылок), но я подозреваю, что есть что-то более неправильное, чем это. Я позволю вам отлаживать!