Getting Contact Map between Two Objects

Isaac Sim Version

4.2.0
4.1.0
4.0.0
2023.1.1
2023.1.0-hotfix.1
Other (please specify):

Isaac Lab Version (if applicable)

1.2
1.1
1.0
Other (please specify):

Operating System

Ubuntu 22.04
Ubuntu 20.04
Windows 11
Windows 10
Other (please specify):

GPU Information

  • Model: RTX 4090
  • Driver Version: 535.183.01

Topic Description

I am working on in hand manipulation and want to extract contact map between the hand and the object, I looked into the contact sensor but I don’t believe it gives a map in any way. The contact map can honestly be in any format, a discrete representation of evenly spaced points, or even a convex hull of some sort that contains the regions between hand and object that are in contact. Are there any predefined methods to do this?

Screenshots or Videos

Current Setup:

Associated code:

import argparse
from omni.isaac.lab.app import AppLauncher
parser = argparse.ArgumentParser(description="Contact Prior Data Collection")
AppLauncher.add_app_launcher_args(parser)
args_cli = parser.parse_args()
app_launcher = AppLauncher(args_cli)
simulation_app = app_launcher.app


import os
import torch
import omni.isaac.core.utils.prims as prim_utils
import omni.isaac.lab.sim as sim_utils
from omni.isaac.lab.actuators import ImplicitActuatorCfg
from omni.isaac.lab.assets import ArticulationCfg, AssetBaseCfg
from omni.isaac.lab.scene import InteractiveScene, InteractiveSceneCfg
from omni.isaac.lab.sim import SimulationCfg, SimulationContext
from omni.isaac.lab.sensors import CameraCfg, ContactSensorCfg, patterns
from omni.isaac.core.utils.rotations import euler_angles_to_quat
from omni.isaac.lab.utils import configclass

CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))

LEAP_HAND_CFG = ArticulationCfg(
    spawn=sim_utils.UsdFileCfg(
        activate_contact_sensors = True,
        usd_path=f"{CURRENT_DIR}/assets/right_hand.usd",
        rigid_props=sim_utils.RigidBodyPropertiesCfg(
            rigid_body_enabled=True,
            max_linear_velocity=1000.0,
            max_angular_velocity=1000.0,
            max_depenetration_velocity=100.0,
            enable_gyroscopic_forces=True,
        ),
        articulation_props=sim_utils.ArticulationRootPropertiesCfg(
            enabled_self_collisions=False,
            solver_position_iteration_count=4,
            solver_velocity_iteration_count=0,
            sleep_threshold=0.005,
            stabilization_threshold=0.001,
        ),
    ),
    init_state=ArticulationCfg.InitialStateCfg(
        pos=(0.0, 0.0, 1.0),
        rot=(0.0, 0.0, 1.0, 0.0)
    ),
    actuators={
    "all_joints": ImplicitActuatorCfg(
        joint_names_expr=[".*"],
        effort_limit=0.91,
        velocity_limit=8.48,
        stiffness=None,
        damping=None,
    ),
},
)

qx, qy, qz, qw = euler_angles_to_quat((0.0, 0.0, torch.pi/2))
@configclass
class LeapHandSceneCfg(InteractiveSceneCfg):
    ground = AssetBaseCfg(prim_path="/World/defaultGroundPlane", spawn=sim_utils.GroundPlaneCfg(color=(0.5, 0.5, 0.5)))
    
    dome_light = AssetBaseCfg(
        prim_path="/World/Light", spawn=sim_utils.DomeLightCfg(intensity=3000.0, color=(0.75, 0.75, 0.75))
    )
    leap_hand: ArticulationCfg = LEAP_HAND_CFG.replace(prim_path="/World/Robot")

    cube = AssetBaseCfg(
        prim_path="/World/Cube",
        init_state=AssetBaseCfg.InitialStateCfg(
            pos=(0.0, 0.0, 1.25),
            rot=(0.0, 0.0, 0.0, 1.0)
        ),
        spawn=sim_utils.MeshCuboidCfg(
            activate_contact_sensors = True,
            size=(0.075, 0.075, 0.075),
            rigid_props=sim_utils.RigidBodyPropertiesCfg(),
            mass_props=sim_utils.MassPropertiesCfg(mass=0.05),
            collision_props=sim_utils.CollisionPropertiesCfg(),
            visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 0.0, 1.0))
        )
    )
    camera = CameraCfg(
        prim_path="/World/Robot/palm_lower/front_cam",
        update_period=0.1,
        height=480,
        width=640,
        data_types=["rgb", "distance_to_image_plane"],
        spawn=sim_utils.PinholeCameraCfg(
            focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 1.0e5)
        ),
        offset=CameraCfg.OffsetCfg(pos=(0.0, 0.0, -0.65),  rot=(qx.item(), qy.item(), qz.item(), qw.item()), convention="ros"),
    )

    contact_forces = ContactSensorCfg(
        prim_path="/World/Cube", update_period=0.0, history_length=6, debug_vis=True,
    )

def main():
    sim_cfg = SimulationCfg(device=args_cli.device)
    sim = SimulationContext(sim_cfg)
    sim.set_camera_view([0.25, -0.25, 1.40], [0.0, 0.0, torch.pi * 0.325])

    scene_cfg = LeapHandSceneCfg(num_envs=1, env_spacing=2.0)
    scene = InteractiveScene(scene_cfg)

    sim.reset()
    print("[INFO]: Setup complete...")

    robot = scene["leap_hand"]
    sim_dt = sim.get_physics_dt()

    while simulation_app.is_running():
        target_position = torch.tensor([
            torch.pi * 0.0,  #1
            torch.pi * 0.0,  #0
            torch.pi * 0.0,  #2
            torch.pi * 0.0,  #3
            torch.pi * 0.0,  #9
            torch.pi * 0.0,  #8
            torch.pi * 0.0,  #10
            torch.pi * 0.0,  #11
            torch.pi * 0.0,  #13
            torch.pi * 0.0,  #12
            torch.pi * 0.0,  #14
            torch.pi * 0.0,  #15
            torch.pi * 0.0,  #4
            torch.pi * 0.0,  #5
            torch.pi * 0.0,  #6
            torch.pi * 0.0,  #7
        ], device=robot.data.joint_pos.device)

        joint_pos = target_position * torch.ones_like(robot.data.joint_pos)
        robot.set_joint_position_target(joint_pos)
        scene.write_data_to_sim()

        sim.step()
        scene.update(sim_dt)

if __name__ == "__main__":
    main()
    simulation_app.close()

Thank you for your interest in Isaac Lab. To ensure efficient support and collaboration, please submit your topic to its GitHub repo following the instructions provided on Isaac Lab’s Contributing Guidelines regarding discussions, submitting issues, feature requests, and contributing to the project.

We appreciate your understanding and look forward to assisting you.