[Isaac Lab] Remove Objects during simulation

Please provide all relevant details below before submitting your post. This will help the community provide more accurate and timely assistance. After submitting, you can check the appropriate boxes. Remember, you can always edit your post later to include additional information if needed.

Isaac Sim Version

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

Isaac Lab Version (if applicable)

1.2
[0] 1.1
1.0
Other (please specify):

Operating System

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

GPU Information

  • Model:
  • Driver Version:

Topic Description

Detailed Description

(Describe the issue in detail, including what you were trying to do, what you expected to happen, and what actually happened)

I am currently working on a bin picking task where I want to spawn multiple cubes inside a rectangular bin. However, when I spawn the cubes, they collide with each other and some of them end up outside the bin. I would like to remove the cubes that fall outside the bin during the simulation, I tried but I haven’t been able to find a way to do this yet. Is there a method for removing these cubes during simulation?

CODE

class BinPickingSceneCfg(InteractiveSceneCfg):
    def __init__(self,args,*other_args, **kwargs):
        super().__init__(*other_args, **kwargs)

        # ground plane
        self.ground = AssetBaseCfg(
            prim_path = "/World/defaultGroundPlane",
            spawn=sim_utils.GroundPlaneCfg(),
            init_state = AssetBaseCfg.InitialStateCfg(pos=(0.0,0.0,0.0)),
        )

        # lights
        self.dome_light = AssetBaseCfg(
            prim_path = "/World/Light", spawn=sim_utils.DomeLightCfg(intensity=3000.0, color=(0.75,0.75,0.75))
        )

        self.table = RigidObjectCfg(
            prim_path="{ENV_REGEX_NS}/Table",
            spawn=sim_utils.CuboidCfg(
                size=(1.0, 1.0, 0.4),
                rigid_props=sim_utils.RigidBodyPropertiesCfg(max_depenetration_velocity=1.0, disable_gravity=True,
                                                            kinematic_enabled=True),
                mass_props=sim_utils.MassPropertiesCfg(mass=1.0),
                collision_props=sim_utils.CollisionPropertiesCfg(collision_enabled=True),
                physics_material=sim_utils.RigidBodyMaterialCfg(),
                visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.3, 0.3, 0.3)),
                # visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.5, 0.0, 0.0),opacity=0.8),
            ),
            init_state=RigidObjectCfg.InitialStateCfg(pos=(0.5, 0.0, 0.5 * 0.4)),
        )
        self.plate1 = RigidObjectCfg(
            prim_path="/World/plate1",
            spawn=sim_utils.CuboidCfg(
                size=(1.0, 0.35, 0.0000001),
                rigid_props=sim_utils.RigidBodyPropertiesCfg(max_depenetration_velocity=1.0, disable_gravity=True,
                                                            kinematic_enabled=True),
                mass_props=sim_utils.MassPropertiesCfg(mass=1.0),
                collision_props=sim_utils.CollisionPropertiesCfg(collision_enabled=True),
                physics_material=sim_utils.RigidBodyMaterialCfg(),
                visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.6, 0.35, 0.05)),
                # visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.5, 0.0, 0.0),opacity=0.8),
            ),
            init_state=RigidObjectCfg.InitialStateCfg(pos=(0.5, -0.025, 0.4000001)),
        )
        self.plate2 = RigidObjectCfg(
            prim_path="/World/plate2",
            spawn=sim_utils.CuboidCfg(
                size=(1.0, 0.35, 0.0000001),
                rigid_props=sim_utils.RigidBodyPropertiesCfg(max_depenetration_velocity=1.0, disable_gravity=True,
                                                            kinematic_enabled=True),
                mass_props=sim_utils.MassPropertiesCfg(mass=1.0),
                collision_props=sim_utils.CollisionPropertiesCfg(collision_enabled=True),
                physics_material=sim_utils.RigidBodyMaterialCfg(),
                visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.1, 0.3, 0.8)),
                # visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.5, 0.0, 0.0),opacity=0.8),
            ),
            init_state=RigidObjectCfg.InitialStateCfg(pos=(0.5, 0.325, 0.4000001)),
        )

        self.camera = CameraCfg(
            # prim_path="/World/Objects/Camera",
            prim_path="/World/Camera",
            # update_period=0,
            height=args.camera_resolution_height,
            width=args.camera_resolution_width,
            data_types=["rgb", "distance_to_image_plane", "semantic_segmentation", "instance_id_segmentation_fast",
                        "instance_segmentation_fast"],
            spawn=sim_utils.PinholeCameraCfg(
                focal_length=15.0, focus_distance=400.0, horizontal_aperture=20.63, clipping_range=(0.1, 1.0e5),
                visible=True
            ),
            # w, x, y, z
            offset=CameraCfg.OffsetCfg(pos=(1.5, 0.0, 0.55), rot=(-0.5, 0.5, 0.5, -0.5), convention="ros")
        )

        self.bin = RigidObjectCfg(
            prim_path = "/World/Bin",
            spawn = sim_utils.UsdFileCfg(usd_path=f"./assets/bin.usd",
                                        semantic_tags=[("class", "bin")],
                                        visual_material_path=None),
            init_state=RigidObjectCfg.InitialStateCfg(pos=(0.55, -0.3, 0.4)),
        )
        
        self.create_cubes(num_cubes=50)

            # articulation
        if args.robot == "franka_panda":
            self.robot = FRANKA_PANDA_HIGH_PD_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot")
        elif args.robot == "ur10":
            self.robot = UR10_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot")
        elif args.robot == "kionva_gen3lite":
            self.robot = KINOVA_GEN3LITE_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot")
        else:
            raise ValueError(f"Robot {args.robot} is not supported. Valid: franka_panda, ur10")


    def create_cubes(self, num_cubes):
        base_position = np.array([0.5, -0.3, 0.62])
        
        for i in range(num_cubes):

            position = base_position + np.array([np.random.uniform(-0.05, 0.05), np.random.uniform(-0.03, 0.03), (i//5)*np.random.uniform(0, 0.1)])
            cube_name = f"cube{i}"
            setattr(self, cube_name, RigidObjectCfg(
                prim_path=f"/World/Objects/Cube{i}",
                spawn=sim_utils.CuboidCfg(
                    size=(0.045, 0.045, 0.045),
                    rigid_props=sim_utils.RigidBodyPropertiesCfg(max_depenetration_velocity=1.0, disable_gravity=False),
                    mass_props=sim_utils.MassPropertiesCfg(mass=0.01),
                    collision_props=sim_utils.CollisionPropertiesCfg(
                        collision_enabled=True,
                        # contact_offset=0.000001,
                        # rest_offset=0.0,
                    ),
                    # physics_material=sim_utils.RigidBodyMaterialCfg(),
                    physics_material=sim_utils.RigidBodyMaterialCfg(
                        # static_friction=0.8,
                        # dynamic_friction=0.6,
                        restitution=0.000001  
                    ),
                    visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.8, 0.3, 0.0)),
                ),
                # init_state=RigidObjectCfg.InitialStateCfg(pos=tuple(position)),
                init_state=RigidObjectCfg.InitialStateCfg(
                    pos=tuple(position),
                    rot=(1.0, 0.0, 0.0, 0.0)  
                ),
            ))

def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene):

    camera_target_position = [0.5,-0.35,0.4]
    camera_pos = [0.5,-0.15,0.6]
    camera_target_position= torch.tensor(camera_target_position,dtype=torch.float,device=sim.device).repeat((args.num_envs,1))
    camera_pos = torch.tensor(camera_pos,dtype=torch.float, device=sim.device).repeat((args.num_envs,1))
    camera.set_world_poses_from_view(camera_pos,camera_target_position)
    camera.reset()

    sim_dt = sim.get_physics_dt()
   

    bin_center = np.array([0.55,-0.3,0.4])
    bin_size = np.array([0.4,0.2,0.1])

    stability_counter = 0
    check_stability_after = 200
    print(dir(scene))
    while simulation_app.is_running():

        count += 1
        if count > check_stability_after:

            cubes_to_remove = []
            
            for i in range(50):
                cube_name = f"cube{i}"
                cube = scene[cube_name]
                if cube is not None:
                    cube_pos = cube.data.body_state_w[0, 0, 0:3].cpu().numpy()

                    outside_bin = (
                        abs(cube_pos[0] - bin_center[0]) > bin_size[0] or
                        abs(cube_pos[1] - bin_center[1]) > bin_size[1]
                    )

                    if outside_bin:
                        cubes_to_remove.append(cube_name)

            print(len(cubes_to_remove))
            for cube_name in cubes_to_remove:
               
                prim_path = f"/World/Objects/Cube{cube_name[4:]}"
                # prim_utils.delete_prim(prim_path)

                stage = stage_utils.get_current_stage()
                cube_prim = stage.GetPrimAtPath(prim_path)
                if cube_prim:
                    try:
                        stage.RemovePrim(prim_path)
                        scene.update(sim_dt)
                    except Exception as e:
                        print(f"Error removing prim {prim_path}: {e}")
                                    
                
                del scene[cube_name]

Error Messages

(If applicable, copy and paste any error messages you received)
Traceback (most recent call last):
File “/home/airlab/Robot_team/IsaacLab1.1/source/catkin_binpicking/src/binpicking/src/bin_picking_class.py”, line 764, in
main()
File “/home/airlab/Robot_team/IsaacLab1.1/source/catkin_binpicking/src/binpicking/src/bin_picking_class.py”, line 760, in main
run_simulator(sim, scene)
File “/home/airlab/Robot_team/IsaacLab1.1/source/catkin_binpicking/src/binpicking/src/bin_picking_class.py”, line 437, in run_simulator
del scene[cube_name]
TypeError: ‘InteractiveScene’ object does not support item deletion

Screenshots or Videos

(If applicable, add screenshots or links to videos that demonstrate the issue)