#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, вы увидите, что даже интеграция с контролем ошибок будет жаловаться. У вас определенно жесткая система (инерция основного корпуса — это>> инерция ссылок), но я подозреваю, что есть что-то более неправильное, чем это. Я позволю вам отлаживать!