首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在drake中模拟弹性碰撞

在drake中模拟弹性碰撞
EN

Stack Overflow用户
提问于 2020-04-27 23:28:45
回答 1查看 112关注 0票数 1

我正在尝试在drake中模拟一个弹性弹跳球。然而,我还没有想出如何为我加载的urdf模型设置恢复系数之类的东西。drake是否支持点接触模型的弹性碰撞?如果是,我如何设置相应的参数?

编辑:我已经尝试过用plant.set_penetration_allowance(0.0001)设置渗透限制,但我得到了以下错误:AttributeError: 'MultibodyPlant_[float]' object has no attribute 'set_penetration_allowance'。但由于它模拟了一个严重阻尼的系统,我认为它无论如何都不会对我的问题有所帮助。

我当前的代码如下所示:

代码语言:javascript
复制
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文件如下所示:

代码语言:javascript
复制
<?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>
EN

回答 1

Stack Overflow用户

发布于 2020-04-29 04:16:10

尼古拉斯

不,目前我们不支持弹性碰撞,因为我们将精力集中在慢慢接近接触面上,因为这是操纵应用程序的情况。当我们的contact solver成熟时,我们肯定会支持这一点。

也就是说,目前还不支持为您的模型指定恢复系数。

最好的解决方案将取决于您的特定问题。这是一个垂直弹跳的球吗?摩擦重要吗?(例如,球也可以水平移动吗?)这是2D还是3D情况?

从简单到复杂,我建议:

如果是一个垂直弹跳的球,1个自由度,那么我建议用手在LeafSystem中写一个动力学。

连接所施加的力

我希望这能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61462409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档