PBD deformable cloth manipulation

Hi,

I’m currently working on a simulation in Isaac Sim 4.1.0 in Windows Server 2022 where a Franka Emika robot needs to perform a pick-and-place task with a piece of fabric (plane). However, the robot is unable to grasp the fabric properly.

I would appreciate any help on how to fix this issue. I can provide a video of my current simulation for reference.

I don’t use any code, just action graph (pick & place controller) from IsaacSim 4.1 similar than this tutorial OmniGraph: Pick-and-Place Controller Node — Isaac Sim 4.2.0 (OLD)


simulation.zip (18.7 KB)

1 Like

Hi Isabella, Thank you for your question and welcome to the developers community! I will look into this shortly. Have you tried to grasp the cloth from its edge? It seems to be from the video that it is having trouble pinching the cloth.

1 Like

Yes, I have tried grasping the cloth from its edge, but unfortunately, it has not been successful. I have attached a folder named simulation.zip to the post, where you can see what I have done so far.

1 Like

Hi @isabella.herrarte,

Sorry for the delay. Technically you should be able to grasp the cloth. I am trying to reproduce the task but it will take me a bit of time. In the meantime, have you tried:

  1. Setting gravity to 0 so it is a bit easier to grasp the cloth?
my_world = World(stage_units_in_meters=1.0, backend="torch", device="cuda")
my_world.get_physics_context().set_gravity(0)
  1. Increasing friction in the ParticleMaterial?
# Create cloth mesh (10x10 grid)
tri_points, tri_indices = deformableUtils.create_triangle_mesh_square(dimx=10, dimy=10, scale=1.0)
# tri_points, tri_indices = deformableMeshUtils.createTriangleMeshCube(dim=10)

init_loc = Gf.Vec3f(0.0, 0.0, 0.5)
physicsUtils.set_or_add_translate_op(cloth_mesh, init_loc)
# physicsUtils.set_or_add_orient_op(cloth_mesh, Gf.Rotation(Gf.Vec3d([1, 0, 0]), 15 * i).GetQuat())

# Set mesh attributes
cloth_mesh.GetPointsAttr().Set(tri_points)
cloth_mesh.GetFaceVertexIndicesAttr().Set(tri_indices)
cloth_mesh.GetFaceVertexCountsAttr().Set([3] * (len(tri_indices) // 3))

# Create particle material and system
particle_material = ParticleMaterial(
    prim_path=cloth_path + "/particleMaterial",
    drag=0.3,
    lift=0.3,
    friction=0.8
)

radius = 0.5 * (0.6 / 5.0)
restOffset = radius
contactOffset = restOffset * 1.5

particle_system = SingleParticleSystem(
    prim_path=cloth_path + "/particleSystem",
    simulation_owner=my_world.get_physics_context().prim_path,
    rest_offset=restOffset,
    contact_offset=contactOffset,
    solid_rest_offset=restOffset,
    fluid_rest_offset=restOffset,
    particle_contact_offset=contactOffset
)

# Create deformable prim
cloth = SingleClothPrim(
    name="cloth",
    prim_path=mesh_path,
    particle_system=particle_system,
    particle_material=particle_material
)
  1. Decreasing the time-step size of the simulator?
# Set simulation timesteps - 120Hz physics
simulation_app.context.set_simulation_dt(physics_dt=1.0/120.0)