diff --git a/source/isaaclab/config/extension.toml b/source/isaaclab/config/extension.toml index 267d138c6f7..ed7c2997613 100644 --- a/source/isaaclab/config/extension.toml +++ b/source/isaaclab/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.40.4" +version = "0.40.5" # Description title = "Isaac Lab framework for Robot Learning" diff --git a/source/isaaclab/docs/CHANGELOG.rst b/source/isaaclab/docs/CHANGELOG.rst index c6d2e2721be..f515d3411ae 100644 --- a/source/isaaclab/docs/CHANGELOG.rst +++ b/source/isaaclab/docs/CHANGELOG.rst @@ -1,6 +1,16 @@ Changelog --------- +0.40.5 (2025-05-22) +~~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Fixed collision filtering logic for CPU simulation. The automatic collision filtering feature + currently has limitations for CPU simulation. Collision filtering needs to be manually enabled when using CPU simulation. + + 0.40.4 (2025-06-03) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab/isaaclab/scene/interactive_scene.py b/source/isaaclab/isaaclab/scene/interactive_scene.py index 9f21f673996..a8d016a6ee3 100644 --- a/source/isaaclab/isaaclab/scene/interactive_scene.py +++ b/source/isaaclab/isaaclab/scene/interactive_scene.py @@ -171,7 +171,8 @@ def __init__(self, cfg: InteractiveSceneCfg): # since env_ids is only applicable when replicating physics, we have to fallback to the previous method # to filter collisions if replicate_physics is not enabled - if not self.cfg.replicate_physics and self.cfg.filter_collisions: + # additionally, env_ids is only supported in GPU simulation + if (not self.cfg.replicate_physics and self.cfg.filter_collisions) or self.device == "cpu": self.filter_collisions(self._global_prim_paths) def clone_environments(self, copy_from_source: bool = False): @@ -204,9 +205,10 @@ def clone_environments(self, copy_from_source: bool = False): # since env_ids is only applicable when replicating physics, we have to fallback to the previous method # to filter collisions if replicate_physics is not enabled - if not self.cfg.replicate_physics and self.cfg.filter_collisions: + # additionally, env_ids is only supported in GPU simulation + if (not self.cfg.replicate_physics and self.cfg.filter_collisions) or self.device == "cpu": omni.log.warn( - "Collision filtering can only be automatically enabled when replicate_physics=True." + "Collision filtering can only be automatically enabled when replicate_physics=True and GPU simulation." " Please call scene.filter_collisions(global_prim_paths) to filter collisions across environments." ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/direct/anymal_c/anymal_c_env.py b/source/isaaclab_tasks/isaaclab_tasks/direct/anymal_c/anymal_c_env.py index 7d4aec17e6d..f9a5e5ecb5c 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/direct/anymal_c/anymal_c_env.py +++ b/source/isaaclab_tasks/isaaclab_tasks/direct/anymal_c/anymal_c_env.py @@ -71,6 +71,9 @@ def _setup_scene(self): self._terrain = self.cfg.terrain.class_type(self.cfg.terrain) # clone and replicate self.scene.clone_environments(copy_from_source=False) + # we need to explicitly filter collisions for CPU simulation + if self.device == "cpu": + self.scene.filter_collisions(global_prim_paths=[self.cfg.terrain.prim_path]) # add lights light_cfg = sim_utils.DomeLightCfg(intensity=2000.0, color=(0.75, 0.75, 0.75)) light_cfg.func("/World/Light", light_cfg) diff --git a/source/isaaclab_tasks/isaaclab_tasks/direct/cart_double_pendulum/cart_double_pendulum_env.py b/source/isaaclab_tasks/isaaclab_tasks/direct/cart_double_pendulum/cart_double_pendulum_env.py index c4dcdfb5280..78be600d323 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/direct/cart_double_pendulum/cart_double_pendulum_env.py +++ b/source/isaaclab_tasks/isaaclab_tasks/direct/cart_double_pendulum/cart_double_pendulum_env.py @@ -87,6 +87,9 @@ def _setup_scene(self): spawn_ground_plane(prim_path="/World/ground", cfg=GroundPlaneCfg()) # clone and replicate self.scene.clone_environments(copy_from_source=False) + # we need to explicitly filter collisions for CPU simulation + if self.device == "cpu": + self.scene.filter_collisions(global_prim_paths=[]) # add articulation to scene self.scene.articulations["robot"] = self.robot # add lights diff --git a/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/cartpole_camera_env.py b/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/cartpole_camera_env.py index 0d65c71fb23..0c89e6684c1 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/cartpole_camera_env.py +++ b/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/cartpole_camera_env.py @@ -128,6 +128,9 @@ def _setup_scene(self): # clone and replicate self.scene.clone_environments(copy_from_source=False) + if self.device == "cpu": + # we need to explicitly filter collisions for CPU simulation + self.scene.filter_collisions(global_prim_paths=[]) # add articulation and sensors to scene self.scene.articulations["cartpole"] = self._cartpole diff --git a/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/cartpole_env.py b/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/cartpole_env.py index 10a2fde99b2..7c17b5ae287 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/cartpole_env.py +++ b/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/cartpole_env.py @@ -78,6 +78,9 @@ def _setup_scene(self): spawn_ground_plane(prim_path="/World/ground", cfg=GroundPlaneCfg()) # clone and replicate self.scene.clone_environments(copy_from_source=False) + # we need to explicitly filter collisions for CPU simulation + if self.device == "cpu": + self.scene.filter_collisions(global_prim_paths=[]) # add articulation to scene self.scene.articulations["cartpole"] = self.cartpole # add lights diff --git a/source/isaaclab_tasks/isaaclab_tasks/direct/factory/factory_env.py b/source/isaaclab_tasks/isaaclab_tasks/direct/factory/factory_env.py index 5abab283b81..272a860396c 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/direct/factory/factory_env.py +++ b/source/isaaclab_tasks/isaaclab_tasks/direct/factory/factory_env.py @@ -178,6 +178,9 @@ def _setup_scene(self): self._large_gear_asset = Articulation(self.cfg_task.large_gear_cfg) self.scene.clone_environments(copy_from_source=False) + if self.device == "cpu": + # we need to explicitly filter collisions for CPU simulation + self.scene.filter_collisions() self.scene.articulations["robot"] = self._robot self.scene.articulations["fixed_asset"] = self._fixed_asset diff --git a/source/isaaclab_tasks/isaaclab_tasks/direct/franka_cabinet/franka_cabinet_env.py b/source/isaaclab_tasks/isaaclab_tasks/direct/franka_cabinet/franka_cabinet_env.py index a71fa18f960..ced957409ba 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/direct/franka_cabinet/franka_cabinet_env.py +++ b/source/isaaclab_tasks/isaaclab_tasks/direct/franka_cabinet/franka_cabinet_env.py @@ -277,6 +277,9 @@ def _setup_scene(self): # clone and replicate self.scene.clone_environments(copy_from_source=False) + # we need to explicitly filter collisions for CPU simulation + if self.device == "cpu": + self.scene.filter_collisions(global_prim_paths=[self.cfg.terrain.prim_path]) # add lights light_cfg = sim_utils.DomeLightCfg(intensity=2000.0, color=(0.75, 0.75, 0.75)) diff --git a/source/isaaclab_tasks/isaaclab_tasks/direct/humanoid_amp/humanoid_amp_env.py b/source/isaaclab_tasks/isaaclab_tasks/direct/humanoid_amp/humanoid_amp_env.py index 8ab9139e917..6a59a06646f 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/direct/humanoid_amp/humanoid_amp_env.py +++ b/source/isaaclab_tasks/isaaclab_tasks/direct/humanoid_amp/humanoid_amp_env.py @@ -69,6 +69,10 @@ def _setup_scene(self): ) # clone and replicate self.scene.clone_environments(copy_from_source=False) + # we need to explicitly filter collisions for CPU simulation + if self.device == "cpu": + self.scene.filter_collisions(global_prim_paths=["/World/ground"]) + # add articulation to scene self.scene.articulations["robot"] = self.robot # add lights diff --git a/source/isaaclab_tasks/isaaclab_tasks/direct/locomotion/locomotion_env.py b/source/isaaclab_tasks/isaaclab_tasks/direct/locomotion/locomotion_env.py index 24cd9ae3800..277db7072e8 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/direct/locomotion/locomotion_env.py +++ b/source/isaaclab_tasks/isaaclab_tasks/direct/locomotion/locomotion_env.py @@ -58,6 +58,9 @@ def _setup_scene(self): self.terrain = self.cfg.terrain.class_type(self.cfg.terrain) # clone and replicate self.scene.clone_environments(copy_from_source=False) + # we need to explicitly filter collisions for CPU simulation + if self.device == "cpu": + self.scene.filter_collisions(global_prim_paths=[self.cfg.terrain.prim_path]) # add articulation to scene self.scene.articulations["robot"] = self.robot # add lights diff --git a/source/isaaclab_tasks/isaaclab_tasks/direct/quadcopter/quadcopter_env.py b/source/isaaclab_tasks/isaaclab_tasks/direct/quadcopter/quadcopter_env.py index cebfc66a211..7ecbcd80286 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/direct/quadcopter/quadcopter_env.py +++ b/source/isaaclab_tasks/isaaclab_tasks/direct/quadcopter/quadcopter_env.py @@ -143,6 +143,9 @@ def _setup_scene(self): self._terrain = self.cfg.terrain.class_type(self.cfg.terrain) # clone and replicate self.scene.clone_environments(copy_from_source=False) + # we need to explicitly filter collisions for CPU simulation + if self.device == "cpu": + self.scene.filter_collisions(global_prim_paths=[self.cfg.terrain.prim_path]) # add lights light_cfg = sim_utils.DomeLightCfg(intensity=2000.0, color=(0.75, 0.75, 0.75)) light_cfg.func("/World/Light", light_cfg) diff --git a/tools/template/templates/tasks/direct_multi-agent/env b/tools/template/templates/tasks/direct_multi-agent/env index 18664ac1535..1875b7b8d52 100644 --- a/tools/template/templates/tasks/direct_multi-agent/env +++ b/tools/template/templates/tasks/direct_multi-agent/env @@ -37,6 +37,9 @@ class {{ task.classname }}Env(DirectMARLEnv): spawn_ground_plane(prim_path="/World/ground", cfg=GroundPlaneCfg()) # clone and replicate self.scene.clone_environments(copy_from_source=False) + # we need to explicitly filter collisions for CPU simulation + if self.device == "cpu": + self.scene.filter_collisions(global_prim_paths=[]) # add articulation to scene self.scene.articulations["robot"] = self.robot # add lights diff --git a/tools/template/templates/tasks/direct_single-agent/env b/tools/template/templates/tasks/direct_single-agent/env index b07e33a4e1b..c38a75fe4f6 100644 --- a/tools/template/templates/tasks/direct_single-agent/env +++ b/tools/template/templates/tasks/direct_single-agent/env @@ -36,6 +36,9 @@ class {{ task.classname }}Env(DirectRLEnv): spawn_ground_plane(prim_path="/World/ground", cfg=GroundPlaneCfg()) # clone and replicate self.scene.clone_environments(copy_from_source=False) + # we need to explicitly filter collisions for CPU simulation + if self.device == "cpu": + self.scene.filter_collisions(global_prim_paths=[]) # add articulation to scene self.scene.articulations["robot"] = self.robot # add lights