From c91c6e290fe391f5e1239d20ee5dc1008dbdb4cb Mon Sep 17 00:00:00 2001 From: Pascal Roth Date: Mon, 3 Nov 2025 09:44:28 +0100 Subject: [PATCH 1/4] remove carb utils --- source/isaaclab/isaaclab/app/app_launcher.py | 10 ++- .../isaaclab/sim/simulation_context.py | 62 +++++++++++++------ .../test/deps/isaacsim/check_camera.py | 3 +- .../check_floating_base_made_fixed.py | 3 +- .../deps/isaacsim/check_legged_robot_clone.py | 3 +- .../test/deps/isaacsim/check_ref_count.py | 3 +- .../test/sensors/check_contact_sensor.py | 3 +- .../test/sim/test_simulation_render_config.py | 3 +- 8 files changed, 53 insertions(+), 37 deletions(-) diff --git a/source/isaaclab/isaaclab/app/app_launcher.py b/source/isaaclab/isaaclab/app/app_launcher.py index 1ecfbdd8642..153bfa74bfd 100644 --- a/source/isaaclab/isaaclab/app/app_launcher.py +++ b/source/isaaclab/isaaclab/app/app_launcher.py @@ -883,7 +883,6 @@ def _hide_stop_button(self): def _set_rendering_mode_settings(self, launcher_args: dict) -> None: """Store RTX rendering mode in carb settings.""" import carb - from isaacsim.core.utils.carb import set_carb_setting rendering_mode = launcher_args.get("rendering_mode") @@ -895,12 +894,11 @@ def _set_rendering_mode_settings(self, launcher_args: dict) -> None: # store rendering mode in carb settings carb_settings = carb.settings.get_settings() - set_carb_setting(carb_settings, "/isaaclab/rendering/rendering_mode", rendering_mode) + carb_settings.set_string("/isaaclab/rendering/rendering_mode", rendering_mode) def _set_animation_recording_settings(self, launcher_args: dict) -> None: """Store animation recording settings in carb settings.""" import carb - from isaacsim.core.utils.carb import set_carb_setting # check if recording is enabled recording_enabled = launcher_args.get("anim_recording_enabled", False) @@ -920,9 +918,9 @@ def _set_animation_recording_settings(self, launcher_args: dict) -> None: # store config in carb settings carb_settings = carb.settings.get_settings() - set_carb_setting(carb_settings, "/isaaclab/anim_recording/enabled", recording_enabled) - set_carb_setting(carb_settings, "/isaaclab/anim_recording/start_time", start_time) - set_carb_setting(carb_settings, "/isaaclab/anim_recording/stop_time", stop_time) + carb_settings.set_bool("/isaaclab/anim_recording/enabled", recording_enabled) + carb_settings.set_float("/isaaclab/anim_recording/start_time", start_time) + carb_settings.set_float("/isaaclab/anim_recording/stop_time", stop_time) def _interrupt_signal_handle_callback(self, signal, frame): """Handle the interrupt signal from the keyboard.""" diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index fb260421f99..9f19ce0386c 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -29,7 +29,6 @@ import omni.usd from isaacsim.core.api.simulation_context import SimulationContext as _SimulationContext from isaacsim.core.simulation_manager import SimulationManager -from isaacsim.core.utils.carb import get_carb_setting, set_carb_setting from isaacsim.core.utils.viewports import set_camera_view from isaacsim.core.version import get_version from pxr import Gf, PhysxSchema, Sdf, Usd, UsdPhysics @@ -658,10 +657,10 @@ def _apply_physics_settings(self): """Sets various carb physics settings.""" # enable hydra scene-graph instancing # note: this allows rendering of instanceable assets on the GUI - set_carb_setting(self.carb_settings, "/persistent/omnihydra/useSceneGraphInstancing", True) + self.carb_settings.set_bool("/persistent/omnihydra/useSceneGraphInstancing", True) # change dispatcher to use the default dispatcher in PhysX SDK instead of carb tasking # note: dispatcher handles how threads are launched for multi-threaded physics - set_carb_setting(self.carb_settings, "/physics/physxDispatcher", True) + self.carb_settings.set_bool("/physics/physxDispatcher", True) # disable contact processing in omni.physx # note: we disable it by default to avoid the overhead of contact processing when it isn't needed. # The physics flag gets enabled when a contact sensor is created. @@ -673,14 +672,14 @@ def _apply_physics_settings(self): ) # FIXME: From investigation, it seems this flag only affects CPU physics. For GPU physics, contacts # are always processed. The issue is reported to the PhysX team by @mmittal. - set_carb_setting(self.carb_settings, "/physics/disableContactProcessing", True) + self.carb_settings.set_bool("/physics/disableContactProcessing", True) # disable custom geometry for cylinder and cone collision shapes to allow contact reporting for them # reason: cylinders and cones aren't natively supported by PhysX so we need to use custom geometry flags # reference: https://nvidia-omniverse.github.io/PhysX/physx/5.4.1/docs/Geometry.html?highlight=capsule#geometry - set_carb_setting(self.carb_settings, "/physics/collisionConeCustomGeometry", False) - set_carb_setting(self.carb_settings, "/physics/collisionCylinderCustomGeometry", False) + self.carb_settings.set_bool("/physics/collisionConeCustomGeometry", False) + self.carb_settings.set_bool("/physics/collisionCylinderCustomGeometry", False) # hide the Simulation Settings window - set_carb_setting(self.carb_settings, "/physics/autoPopupSimulationOutputWindow", False) + self.carb_settings.set_bool("/physics/autoPopupSimulationOutputWindow", False) def _apply_render_settings_from_cfg(self): """Sets rtx settings specified in the RenderCfg.""" @@ -706,7 +705,7 @@ def _apply_render_settings_from_cfg(self): # 1. command line argument --rendering_mode, if provided # 2. rendering_mode from Render Config, if set # 3. lastly, default to "balanced" mode, if neither is specified - rendering_mode = get_carb_setting(self.carb_settings, "/isaaclab/rendering/rendering_mode") + rendering_mode = self.carb_settings.get("/isaaclab/rendering/rendering_mode") if not rendering_mode: rendering_mode = self.cfg.render.rendering_mode if not rendering_mode: @@ -736,7 +735,16 @@ def _apply_render_settings_from_cfg(self): # set presets for key, value in preset_dict.items(): key = "/" + key.replace(".", "/") # convert to carb setting format - set_carb_setting(self.carb_settings, key, value) + if isinstance(value, bool): + self.carb_settings.set_bool(key, value) + elif isinstance(value, int): + self.carb_settings.set_int(key, value) + elif isinstance(value, float): + self.carb_settings.set_float(key, value) + elif isinstance(value, str): + self.carb_settings.set_string(key, value) + else: + raise ValueError(f"Unsupported value type: {type(value)}") # set user-friendly named settings for key, value in vars(self.cfg.render).items(): @@ -749,7 +757,16 @@ def _apply_render_settings_from_cfg(self): " need to be updated." ) key = rendering_setting_name_mapping[key] - set_carb_setting(self.carb_settings, key, value) + if isinstance(value, bool): + self.carb_settings.set_bool(key, value) + elif isinstance(value, int): + self.carb_settings.set_int(key, value) + elif isinstance(value, float): + self.carb_settings.set_float(key, value) + elif isinstance(value, str): + self.carb_settings.set_string(key, value) + else: + raise ValueError(f"Unsupported value type: {type(value)}") # set general carb settings carb_settings = self.cfg.render.carb_settings @@ -759,9 +776,18 @@ def _apply_render_settings_from_cfg(self): key = "/" + key.replace("_", "/") # convert from python variable style string elif "." in key: key = "/" + key.replace(".", "/") # convert from .kit file style string - if get_carb_setting(self.carb_settings, key) is None: + if self.carb_settings.get(key) is None: raise ValueError(f"'{key}' in RenderCfg.general_parameters does not map to a carb setting.") - set_carb_setting(self.carb_settings, key, value) + if isinstance(value, bool): + self.carb_settings.set_bool(key, value) + elif isinstance(value, int): + self.carb_settings.set_int(key, value) + elif isinstance(value, float): + self.carb_settings.set_float(key, value) + elif isinstance(value, str): + self.carb_settings.set_string(key, value) + else: + raise ValueError(f"Unsupported value type: {type(value)}") # set denoiser mode if self.cfg.render.antialiasing_mode is not None: @@ -773,8 +799,8 @@ def _apply_render_settings_from_cfg(self): pass # WAR: Ensure /rtx/renderMode RaytracedLighting is correctly cased. - if get_carb_setting(self.carb_settings, "/rtx/rendermode").lower() == "raytracedlighting": - set_carb_setting(self.carb_settings, "/rtx/rendermode", "RaytracedLighting") + if self.carb_settings.get("/rtx/rendermode").lower() == "raytracedlighting": + self.carb_settings.set_string("/rtx/rendermode", "RaytracedLighting") def _set_additional_physx_params(self): """Sets additional PhysX parameters that are not directly supported by the parent class.""" @@ -886,10 +912,8 @@ def _setup_anim_recording(self): self._physxPvdInterface = _physxPvd.acquire_physx_pvd_interface() # Set carb settings for the output path and enabling pvd recording - set_carb_setting( - self.carb_settings, "/persistent/physics/omniPvdOvdRecordingDirectory", self._anim_recording_output_dir - ) - set_carb_setting(self.carb_settings, "/physics/omniPvdOutputEnabled", True) + self.carb_settings.set_string("/persistent/physics/omniPvdOvdRecordingDirectory", self._anim_recording_output_dir) + self.carb_settings.set_bool("/physics/omniPvdOutputEnabled", True) def _update_usda_start_time(self, file_path, start_time): """Updates the start time of the USDA baked anim recordingfile.""" @@ -954,7 +978,7 @@ def _finish_anim_recording(self): ) # Disable recording - set_carb_setting(self.carb_settings, "/physics/omniPvdOutputEnabled", False) + self.carb_settings.set_bool("/physics/omniPvdOutputEnabled", False) return result diff --git a/source/isaaclab/test/deps/isaacsim/check_camera.py b/source/isaaclab/test/deps/isaacsim/check_camera.py index c9e0374fc92..ee3deca7a8a 100644 --- a/source/isaaclab/test/deps/isaacsim/check_camera.py +++ b/source/isaaclab/test/deps/isaacsim/check_camera.py @@ -54,7 +54,6 @@ import omni.replicator.core as rep from isaacsim.core.api.world import World from isaacsim.core.prims import Articulation, RigidPrim, SingleGeometryPrim, SingleRigidPrim -from isaacsim.core.utils.carb import set_carb_setting from isaacsim.core.utils.viewports import set_camera_view from PIL import Image, ImageChops from pxr import Gf, UsdGeom @@ -85,7 +84,7 @@ def main(): world.get_physics_context().enable_flatcache(True) # Enable hydra scene-graph instancing # this is needed to visualize the scene when flatcache is enabled - set_carb_setting(world._settings, "/persistent/omnihydra/useSceneGraphInstancing", True) + world._settings.set_bool("/persistent/omnihydra/useSceneGraphInstancing", True) # Populate scene # Ground diff --git a/source/isaaclab/test/deps/isaacsim/check_floating_base_made_fixed.py b/source/isaaclab/test/deps/isaacsim/check_floating_base_made_fixed.py index 8d3535c1b7c..cd7893b1c91 100644 --- a/source/isaaclab/test/deps/isaacsim/check_floating_base_made_fixed.py +++ b/source/isaaclab/test/deps/isaacsim/check_floating_base_made_fixed.py @@ -40,7 +40,6 @@ import omni.physx from isaacsim.core.api.world import World from isaacsim.core.prims import Articulation -from isaacsim.core.utils.carb import set_carb_setting from isaacsim.core.utils.viewports import set_camera_view from pxr import PhysxSchema, UsdPhysics @@ -78,7 +77,7 @@ def main(): # Enable hydra scene-graph instancing # this is needed to visualize the scene when flatcache is enabled - set_carb_setting(world._settings, "/persistent/omnihydra/useSceneGraphInstancing", True) + world._settings.set_bool("/persistent/omnihydra/useSceneGraphInstancing", True) # Spawn things into stage # Ground-plane diff --git a/source/isaaclab/test/deps/isaacsim/check_legged_robot_clone.py b/source/isaaclab/test/deps/isaacsim/check_legged_robot_clone.py index 3231001efcc..951b7419796 100644 --- a/source/isaaclab/test/deps/isaacsim/check_legged_robot_clone.py +++ b/source/isaaclab/test/deps/isaacsim/check_legged_robot_clone.py @@ -53,7 +53,6 @@ from isaacsim.core.api.world import World from isaacsim.core.cloner import GridCloner from isaacsim.core.prims import Articulation -from isaacsim.core.utils.carb import set_carb_setting from isaacsim.core.utils.viewports import set_camera_view # import logger @@ -91,7 +90,7 @@ def main(): # Enable hydra scene-graph instancing # this is needed to visualize the scene when flatcache is enabled - set_carb_setting(world._settings, "/persistent/omnihydra/useSceneGraphInstancing", True) + world._settings.set_bool("/persistent/omnihydra/useSceneGraphInstancing", True) # Create interface to clone the scene cloner = GridCloner(spacing=2.0) diff --git a/source/isaaclab/test/deps/isaacsim/check_ref_count.py b/source/isaaclab/test/deps/isaacsim/check_ref_count.py index a3d13331942..75e0d64c1a0 100644 --- a/source/isaaclab/test/deps/isaacsim/check_ref_count.py +++ b/source/isaaclab/test/deps/isaacsim/check_ref_count.py @@ -46,7 +46,6 @@ import isaacsim.core.utils.prims as prim_utils from isaacsim.core.api.simulation_context import SimulationContext from isaacsim.core.prims import Articulation -from isaacsim.core.utils.carb import set_carb_setting # import logger logger = logging.getLogger(__name__) @@ -112,7 +111,7 @@ def main(): # Enable hydra scene-graph instancing # this is needed to visualize the scene when flatcache is enabled - set_carb_setting(sim._settings, "/persistent/omnihydra/useSceneGraphInstancing", True) + sim._settings.set_bool("/persistent/omnihydra/useSceneGraphInstancing", True) # Create a dummy tensor for testing # Uncommenting the following line will yield a reference count of 1 for the robot (as desired) diff --git a/source/isaaclab/test/sensors/check_contact_sensor.py b/source/isaaclab/test/sensors/check_contact_sensor.py index 30d2c9be437..190e94ebe78 100644 --- a/source/isaaclab/test/sensors/check_contact_sensor.py +++ b/source/isaaclab/test/sensors/check_contact_sensor.py @@ -39,7 +39,6 @@ import isaacsim.core.utils.prims as prim_utils from isaacsim.core.api.simulation_context import SimulationContext from isaacsim.core.cloner import GridCloner -from isaacsim.core.utils.carb import set_carb_setting from isaacsim.core.utils.viewports import set_camera_view import isaaclab.sim as sim_utils @@ -83,7 +82,7 @@ def main(): # Enable hydra scene-graph instancing # this is needed to visualize the scene when flatcache is enabled - set_carb_setting(sim._settings, "/persistent/omnihydra/useSceneGraphInstancing", True) + sim._settings.set_bool("/persistent/omnihydra/useSceneGraphInstancing", True) # Create interface to clone the scene cloner = GridCloner(spacing=2.0) diff --git a/source/isaaclab/test/sim/test_simulation_render_config.py b/source/isaaclab/test/sim/test_simulation_render_config.py index 67b96e9754c..650cff46765 100644 --- a/source/isaaclab/test/sim/test_simulation_render_config.py +++ b/source/isaaclab/test/sim/test_simulation_render_config.py @@ -20,7 +20,6 @@ import carb import flatdict import pytest -from isaacsim.core.utils.carb import get_carb_setting from isaacsim.core.version import get_version from isaaclab.sim.simulation_cfg import RenderCfg, SimulationCfg @@ -142,7 +141,7 @@ def test_render_cfg_presets(): # grab groundtruth from preset setting_gt = val - setting_val = get_carb_setting(carb_settings_iface, setting_name) + setting_val = carb_settings_iface.get(setting_name) assert setting_gt == setting_val From bc1b1cbe01e80709f1aefb9d117febc72a717da6 Mon Sep 17 00:00:00 2001 From: Pascal Roth Date: Mon, 3 Nov 2025 09:49:44 +0100 Subject: [PATCH 2/4] formatter --- source/isaaclab/isaaclab/sim/simulation_context.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index 9f19ce0386c..f52b6ffea3a 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -681,7 +681,7 @@ def _apply_physics_settings(self): # hide the Simulation Settings window self.carb_settings.set_bool("/physics/autoPopupSimulationOutputWindow", False) - def _apply_render_settings_from_cfg(self): + def _apply_render_settings_from_cfg(self): # noqa: C901 """Sets rtx settings specified in the RenderCfg.""" # define mapping of user-friendly RenderCfg names to native carb names @@ -912,7 +912,9 @@ def _setup_anim_recording(self): self._physxPvdInterface = _physxPvd.acquire_physx_pvd_interface() # Set carb settings for the output path and enabling pvd recording - self.carb_settings.set_string("/persistent/physics/omniPvdOvdRecordingDirectory", self._anim_recording_output_dir) + self.carb_settings.set_string( + "/persistent/physics/omniPvdOvdRecordingDirectory", self._anim_recording_output_dir + ) self.carb_settings.set_bool("/physics/omniPvdOutputEnabled", True) def _update_usda_start_time(self, file_path, start_time): From 44783059be971a2501fc680567d4668673cc0f3a Mon Sep 17 00:00:00 2001 From: Octi Zhang Date: Mon, 10 Nov 2025 12:23:26 -0800 Subject: [PATCH 3/4] refactor to use set_setting for carb in simulation_context --- .../isaaclab/sim/simulation_context.py | 49 ++++++------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index f52b6ffea3a..ed28c1973d6 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -454,7 +454,17 @@ def set_setting(self, name: str, value: Any): name: The name of the setting. value: The value of the setting. """ - self._settings.set(name, value) + # Route through typed setters for correctness and consistency. + if isinstance(value, bool): + self.carb_settings.set_bool(name, value) + elif isinstance(value, int): + self.carb_settings.set_int(name, value) + elif isinstance(value, float): + self.carb_settings.set_float(name, value) + elif isinstance(value, str): + self.carb_settings.set_string(name, value) + else: + raise ValueError(f"Unsupported value type for setting '{name}': {type(value)}") def get_setting(self, name: str) -> Any: """Read the simulation setting using the Carbonite SDK. @@ -465,7 +475,7 @@ def get_setting(self, name: str) -> Any: Returns: The value of the setting. """ - return self._settings.get(name) + return self.carb_settings.get(name) def forward(self) -> None: """Updates articulation kinematics and fabric for rendering.""" @@ -735,16 +745,7 @@ def _apply_render_settings_from_cfg(self): # noqa: C901 # set presets for key, value in preset_dict.items(): key = "/" + key.replace(".", "/") # convert to carb setting format - if isinstance(value, bool): - self.carb_settings.set_bool(key, value) - elif isinstance(value, int): - self.carb_settings.set_int(key, value) - elif isinstance(value, float): - self.carb_settings.set_float(key, value) - elif isinstance(value, str): - self.carb_settings.set_string(key, value) - else: - raise ValueError(f"Unsupported value type: {type(value)}") + self.set_setting(key, value) # set user-friendly named settings for key, value in vars(self.cfg.render).items(): @@ -757,16 +758,7 @@ def _apply_render_settings_from_cfg(self): # noqa: C901 " need to be updated." ) key = rendering_setting_name_mapping[key] - if isinstance(value, bool): - self.carb_settings.set_bool(key, value) - elif isinstance(value, int): - self.carb_settings.set_int(key, value) - elif isinstance(value, float): - self.carb_settings.set_float(key, value) - elif isinstance(value, str): - self.carb_settings.set_string(key, value) - else: - raise ValueError(f"Unsupported value type: {type(value)}") + self.set_setting(key, value) # set general carb settings carb_settings = self.cfg.render.carb_settings @@ -776,18 +768,9 @@ def _apply_render_settings_from_cfg(self): # noqa: C901 key = "/" + key.replace("_", "/") # convert from python variable style string elif "." in key: key = "/" + key.replace(".", "/") # convert from .kit file style string - if self.carb_settings.get(key) is None: + if self.get_setting(key) is None: raise ValueError(f"'{key}' in RenderCfg.general_parameters does not map to a carb setting.") - if isinstance(value, bool): - self.carb_settings.set_bool(key, value) - elif isinstance(value, int): - self.carb_settings.set_int(key, value) - elif isinstance(value, float): - self.carb_settings.set_float(key, value) - elif isinstance(value, str): - self.carb_settings.set_string(key, value) - else: - raise ValueError(f"Unsupported value type: {type(value)}") + self.set_setting(key, value) # set denoiser mode if self.cfg.render.antialiasing_mode is not None: From 2d42472ac5bea26dc7c4f86fe64b08c1522d56e8 Mon Sep 17 00:00:00 2001 From: Octi Zhang Date: Wed, 12 Nov 2025 12:48:32 -0800 Subject: [PATCH 4/4] add cases for tuple and list --- source/isaaclab/isaaclab/sim/simulation_context.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index ed28c1973d6..cc7623abd5d 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -454,7 +454,7 @@ def set_setting(self, name: str, value: Any): name: The name of the setting. value: The value of the setting. """ - # Route through typed setters for correctness and consistency. + # Route through typed setters for correctness and consistency for common scalar types. if isinstance(value, bool): self.carb_settings.set_bool(name, value) elif isinstance(value, int): @@ -463,6 +463,8 @@ def set_setting(self, name: str, value: Any): self.carb_settings.set_float(name, value) elif isinstance(value, str): self.carb_settings.set_string(name, value) + elif isinstance(value, (list, tuple)): + self.carb_settings.set(name, value) else: raise ValueError(f"Unsupported value type for setting '{name}': {type(value)}")