моделирование эластичности c столкновений в селезне - PullRequest
1 голос
/ 27 апреля 2020

Я пытаюсь смоделировать эластичный c прыгающий мяч в драке. Однако я не понял, как установить что-то вроде коэффициента реституции для загружаемой мной модели urdf. Поддерживает ли Дрейк elasti c столкновения для модели точечного контакта? Если да, как я могу установить соответствующие параметры?

Редактировать: я уже пытался установить допуск на проникновение с помощью plant.set_penetration_allowance(0.0001), но получил следующую ошибку: AttributeError: 'MultibodyPlant_[float]' object has no attribute 'set_penetration_allowance'. Но так как он моделирует критически затухшую систему, я полагаю, что это в любом случае не поможет с моей проблемой.

Мой текущий код выглядит следующим образом:

plane_friction_coef = CoulombFriction(static_friction=1.0, dynamic_friction=1.0)

# generate the diagram of the system
builder = DiagramBuilder()
plant, scene_graph = AddMultibodyPlantSceneGraph(builder, time_step=0.0)
parser = Parser(plant=plant)

# connect to Drake Visualizer
lcm = DrakeLcm()
ConnectDrakeVisualizer(builder, scene_graph, lcm=lcm)

# add plane to plant
X_WP = xyz_rpy_deg(xyz=[0, 0, 0], rpy_deg=[0,0,0])  # offset and orientation of plane wrt. 
world frame
plant.RegisterVisualGeometry(plant.world_body(), X_BG=X_WP, shape=HalfSpace(),
                             name='InclinedPlaneVisualGeometry', 
                             diffuse_color=np.array([1, 1, 1, 0.999]))
plant.RegisterCollisionGeometry(plant.world_body(), X_BG=X_WP, shape=HalfSpace(),
                                name='InclinedPlaneCollisionGeometry',
                                coulomb_friction=plane_friction_coef)
# set gravity in world
plant.mutable_gravity_field().set_gravity_vector(gravity_vec)

# add object from sdf or urdf file
my_object = parser.AddModelFromFile(obj_file_path, model_name='my_object')

plant.Finalize()

# add a logger
logger = LogOutput(plant.get_state_output_port(), builder)
logger.set_name('logger')
logger.set_publish_period(1 / recording_rate)

# build diagram and set its context
diagram = builder.Build()
diagram_context = diagram.CreateDefaultContext()
plant_context = diagram.GetMutableSubsystemContext(plant, diagram_context)
plant.SetPositionsAndVelocities(plant_context, gen_pos)

# start simulation
simulator = Simulator(diagram, diagram_context)
simulator.Initialize()
simulator.set_target_realtime_rate(1)
simulator.AdvanceTo(sim_time)
time_log = logger.sample_times()
state_log = logger.data()

Загружаемый мной файл urdf выглядит так:

<?xml version="1.0"?>
<robot name="my_ball">
  <material name="Black">
    <color rgba="0.0 0.0 0.0 1.0"/>
  </material>
  <link name="base_link">
    <inertial>
      <origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
      <mass value="5"/>
      <inertia ixx="0.05" ixy="0" ixz="0" iyy="0.05" iyz="0" izz="0.05"/>
    </inertial>
    <visual>
      <geometry>
        <sphere radius="0.2"/>
      </geometry>
      <material name="Black"/>
    </visual>

    <collision name='collision'>
     <geometry>
       <sphere radius="0.2"/>
     </geometry>

    <drake:proximity_properties>
     <drake:mu_dynamic value="1.0" />
     <drake:mu_static value="1.0" />
    </drake:proximity_properties>
   </collision>
  </link>
</robot>

1 Ответ

0 голосов
/ 28 апреля 2020

Николас,

Нет, в настоящее время мы не поддерживаем эластичные c столкновения, учитывая, что мы сосредоточили свои усилия на медленно приближающихся контактных поверхностях, как в случае с манипуляциями. Мы обязательно поддержим это по мере развития нашего контактного решения.

Тем не менее, в настоящее время нет поддержки для определения коэффициента реституции для вашей модели.

Лучшее решение будет зависеть от вашей конкретной ситуации. проблема. Это прыгающий мяч? важно трение? (т. е. может ли шар также двигаться горизонтально?) Это 2D или 3D случай?

От более простого к более сложному, я бы предложил:

  1. Если прыгающий вертикально шар, 1DOF Тогда я бы предложил написать динамику вручную в LeafSystem.
  2. Гибридная модель, управляемая событиями, также возможна. И у вас есть пример в Drake здесь , хотя, вероятно, это расширенный вариант Drake.
  3. Вы можете создать свою собственную систему LeafSystem, которая задает состояние MBP в качестве входных данных, вычисляет силу контакта как его вывод (например, используя что-то вроде модели Герца с диссипацией Ханта-Кроссли). Затем вы подключите приложенное усилие через порт MBP MBP::get_applied_spatial_force_input_port().

Надеюсь, это поможет вам.

...