From 26605dddf40f9ca9e35c50b1b59059bced4d8126 Mon Sep 17 00:00:00 2001 From: Pascal Roth <57946385+pascal-roth@users.noreply.github.com> Date: Wed, 28 Jan 2026 16:57:27 +0100 Subject: [PATCH 1/2] Removes usage of IsaacSim `SimulationContext` inside tests (#4046) Cleans up new util functions - Bug fix (non-breaking change which fixes an issue) - [ ] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there --------- Signed-off-by: Mayank Mittal <12863862+Mayankm96@users.noreply.github.com> Co-authored-by: Mayank Mittal <12863862+Mayankm96@users.noreply.github.com> --- scripts/tools/check_instanceable.py | 6 ++---- source/isaaclab/isaaclab/sim/utils/stage.py | 2 +- .../isaaclab/isaaclab/ui/widgets/line_plot.py | 3 ++- .../ui/widgets/manager_live_visualizer.py | 2 +- .../isaacsim/check_rep_texture_randomizer.py | 13 ++----------- source/isaaclab/test/devices/check_keyboard.py | 5 ++--- .../test/markers/test_visualization_markers.py | 6 +++--- .../test/sensors/check_contact_sensor.py | 7 +++---- .../isaaclab/test/sensors/check_imu_sensor.py | 13 ++----------- .../isaaclab/test/sensors/check_ray_caster.py | 17 +++-------------- source/isaaclab/test/sim/test_mesh_converter.py | 4 ++-- source/isaaclab/test/sim/test_mjcf_converter.py | 4 ++-- source/isaaclab/test/sim/test_schemas.py | 5 +++-- .../test/sim/test_simulation_context.py | 7 ------- .../isaaclab/test/sim/test_spawn_from_files.py | 4 ++-- source/isaaclab/test/sim/test_spawn_lights.py | 4 ++-- .../isaaclab/test/sim/test_spawn_materials.py | 4 ++-- source/isaaclab/test/sim/test_spawn_meshes.py | 6 +++--- source/isaaclab/test/sim/test_spawn_sensors.py | 4 ++-- source/isaaclab/test/sim/test_spawn_shapes.py | 6 +++--- source/isaaclab/test/sim/test_spawn_wrappers.py | 5 ++--- source/isaaclab/test/sim/test_urdf_converter.py | 5 +++-- .../test/terrains/check_terrain_importer.py | 16 +++------------- 23 files changed, 50 insertions(+), 98 deletions(-) diff --git a/scripts/tools/check_instanceable.py b/scripts/tools/check_instanceable.py index fedb771f611..d9ce51497d1 100644 --- a/scripts/tools/check_instanceable.py +++ b/scripts/tools/check_instanceable.py @@ -64,10 +64,10 @@ """Rest everything follows.""" -from isaacsim.core.api.simulation_context import SimulationContext from isaacsim.core.cloner import GridCloner import isaaclab.sim as sim_utils +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.utils import Timer from isaaclab.utils.assets import check_file_path @@ -78,9 +78,7 @@ def main(): if not check_file_path(args_cli.input): raise ValueError(f"Invalid file path: {args_cli.input}") # Load kit helper - sim = SimulationContext( - stage_units_in_meters=1.0, physics_dt=0.01, rendering_dt=0.01, backend="torch", device="cuda:0" - ) + sim = SimulationContext(SimulationCfg(dt=0.01)) # get stage handle stage = sim_utils.get_current_stage() diff --git a/source/isaaclab/isaaclab/sim/utils/stage.py b/source/isaaclab/isaaclab/sim/utils/stage.py index 461f07deea3..88c61744e7d 100644 --- a/source/isaaclab/isaaclab/sim/utils/stage.py +++ b/source/isaaclab/isaaclab/sim/utils/stage.py @@ -354,7 +354,7 @@ def is_stage_loading() -> bool: """Convenience function to see if any files are being loaded. Returns: - bool: True if loading, False otherwise + True if loading, False otherwise Example: >>> import isaaclab.sim as sim_utils diff --git a/source/isaaclab/isaaclab/ui/widgets/line_plot.py b/source/isaaclab/isaaclab/ui/widgets/line_plot.py index e9914b35503..1f5e315a07c 100644 --- a/source/isaaclab/isaaclab/ui/widgets/line_plot.py +++ b/source/isaaclab/isaaclab/ui/widgets/line_plot.py @@ -12,7 +12,8 @@ import numpy as np import omni -from isaacsim.core.api.simulation_context import SimulationContext + +from isaaclab.sim import SimulationContext with suppress(ImportError): # isaacsim.gui is not available when running in headless mode. diff --git a/source/isaaclab/isaaclab/ui/widgets/manager_live_visualizer.py b/source/isaaclab/isaaclab/ui/widgets/manager_live_visualizer.py index 763443dbbfd..0b20b10dabc 100644 --- a/source/isaaclab/isaaclab/ui/widgets/manager_live_visualizer.py +++ b/source/isaaclab/isaaclab/ui/widgets/manager_live_visualizer.py @@ -13,9 +13,9 @@ import numpy import omni.kit.app -from isaacsim.core.api.simulation_context import SimulationContext from isaaclab.managers import ManagerBase +from isaaclab.sim import SimulationContext from isaaclab.utils import configclass from .image_plot import ImagePlot diff --git a/source/isaaclab/test/deps/isaacsim/check_rep_texture_randomizer.py b/source/isaaclab/test/deps/isaacsim/check_rep_texture_randomizer.py index e6d43b00f9f..086939e6cde 100644 --- a/source/isaaclab/test/deps/isaacsim/check_rep_texture_randomizer.py +++ b/source/isaaclab/test/deps/isaacsim/check_rep_texture_randomizer.py @@ -46,29 +46,20 @@ import torch import omni.replicator.core as rep -from isaacsim.core.api.simulation_context import SimulationContext from isaacsim.core.cloner import GridCloner from isaacsim.core.objects import DynamicSphere from isaacsim.core.prims import RigidPrim from isaacsim.core.utils.viewports import set_camera_view import isaaclab.sim.utils.prims as prim_utils +from isaaclab.sim import SimulationCfg, SimulationContext def main(): """Spawn a bunch of balls and randomly change their textures.""" # Load kit helper - sim_params = { - "use_gpu": True, - "use_gpu_pipeline": True, - "use_flatcache": True, # deprecated from Isaac Sim 2023.1 onwards - "use_fabric": True, # used from Isaac Sim 2023.1 onwards - "enable_scene_query_support": True, - } - sim = SimulationContext( - physics_dt=1.0 / 60.0, rendering_dt=1.0 / 60.0, sim_params=sim_params, backend="torch", device="cuda:0" - ) + sim = SimulationContext(SimulationCfg()) # Set main camera set_camera_view([0.0, 30.0, 25.0], [0.0, 0.0, -2.5]) diff --git a/source/isaaclab/test/devices/check_keyboard.py b/source/isaaclab/test/devices/check_keyboard.py index 4b821bfb113..c1a8b07bef8 100644 --- a/source/isaaclab/test/devices/check_keyboard.py +++ b/source/isaaclab/test/devices/check_keyboard.py @@ -23,9 +23,8 @@ import ctypes -from isaacsim.core.api.simulation_context import SimulationContext - from isaaclab.devices import Se3Keyboard, Se3KeyboardCfg +from isaaclab.sim import SimulationCfg, SimulationContext def print_cb(): @@ -41,7 +40,7 @@ def quit_cb(): def main(): # Load kit helper - sim = SimulationContext(physics_dt=0.01, rendering_dt=0.01) + sim = SimulationContext(SimulationCfg(dt=0.01)) # Create teleoperation interface teleop_interface = Se3Keyboard(Se3KeyboardCfg(pos_sensitivity=0.1, rot_sensitivity=0.1)) diff --git a/source/isaaclab/test/markers/test_visualization_markers.py b/source/isaaclab/test/markers/test_visualization_markers.py index 7183eb15a03..ebc183b804b 100644 --- a/source/isaaclab/test/markers/test_visualization_markers.py +++ b/source/isaaclab/test/markers/test_visualization_markers.py @@ -15,11 +15,10 @@ import pytest import torch -from isaacsim.core.api.simulation_context import SimulationContext - import isaaclab.sim as sim_utils from isaaclab.markers import VisualizationMarkers, VisualizationMarkersCfg from isaaclab.markers.config import FRAME_MARKER_CFG, POSITION_GOAL_MARKER_CFG +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.utils.math import random_orientation from isaaclab.utils.timer import Timer @@ -32,9 +31,10 @@ def sim(): # Open a new stage sim_utils.create_new_stage() # Load kit helper - sim_context = SimulationContext(physics_dt=dt, rendering_dt=dt, backend="torch", device="cuda:0") + sim_context = SimulationContext(SimulationCfg(dt=dt)) yield sim_context # Cleanup + sim_context._disable_app_control_on_stop_handle = True # prevent timeout sim_context.stop() sim_context.clear_instance() sim_utils.close_stage() diff --git a/source/isaaclab/test/sensors/check_contact_sensor.py b/source/isaaclab/test/sensors/check_contact_sensor.py index c556e732658..b4fe5f555dc 100644 --- a/source/isaaclab/test/sensors/check_contact_sensor.py +++ b/source/isaaclab/test/sensors/check_contact_sensor.py @@ -36,13 +36,12 @@ import torch -from isaacsim.core.api.simulation_context import SimulationContext from isaacsim.core.cloner import GridCloner -from isaacsim.core.utils.viewports import set_camera_view import isaaclab.sim as sim_utils from isaaclab.assets import Articulation from isaaclab.sensors.contact_sensor import ContactSensor, ContactSensorCfg +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.utils.timer import Timer ## @@ -75,9 +74,9 @@ def main(): """Spawns the ANYmal robot and clones it using Isaac Sim Cloner API.""" # Load kit helper - sim = SimulationContext(physics_dt=0.005, rendering_dt=0.005, backend="torch", device="cuda:0") + sim = SimulationContext(SimulationCfg(dt=0.005)) # Set main camera - set_camera_view([2.5, 2.5, 2.5], [0.0, 0.0, 0.0]) + sim.set_camera_view([2.5, 2.5, 2.5], [0.0, 0.0, 0.0]) # Enable hydra scene-graph instancing # this is needed to visualize the scene when flatcache is enabled diff --git a/source/isaaclab/test/sensors/check_imu_sensor.py b/source/isaaclab/test/sensors/check_imu_sensor.py index 73204f58698..8a8c048ed62 100644 --- a/source/isaaclab/test/sensors/check_imu_sensor.py +++ b/source/isaaclab/test/sensors/check_imu_sensor.py @@ -41,7 +41,6 @@ import torch import omni -from isaacsim.core.api.simulation_context import SimulationContext from isaacsim.core.cloner import GridCloner from isaacsim.core.utils.viewports import set_camera_view from pxr import PhysxSchema @@ -50,6 +49,7 @@ import isaaclab.terrains as terrain_gen from isaaclab.assets import RigidObject, RigidObjectCfg from isaaclab.sensors.imu import Imu, ImuCfg +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.terrains.config.rough import ROUGH_TERRAINS_CFG from isaaclab.terrains.terrain_importer import TerrainImporter from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR @@ -119,16 +119,7 @@ def main(): """Main function.""" # Load kit helper - sim_params = { - "use_gpu": True, - "use_gpu_pipeline": True, - "use_flatcache": True, # deprecated from Isaac Sim 2023.1 onwards - "use_fabric": True, # used from Isaac Sim 2023.1 onwards - "enable_scene_query_support": True, - } - sim = SimulationContext( - physics_dt=1.0 / 60.0, rendering_dt=1.0 / 60.0, sim_params=sim_params, backend="torch", device="cuda:0" - ) + sim = SimulationContext(SimulationCfg()) # Set main camera set_camera_view([0.0, 30.0, 25.0], [0.0, 0.0, -2.5]) diff --git a/source/isaaclab/test/sensors/check_ray_caster.py b/source/isaaclab/test/sensors/check_ray_caster.py index c2e12da4ea6..51ddec3e97c 100644 --- a/source/isaaclab/test/sensors/check_ray_caster.py +++ b/source/isaaclab/test/sensors/check_ray_caster.py @@ -41,14 +41,13 @@ import torch -from isaacsim.core.api.simulation_context import SimulationContext from isaacsim.core.cloner import GridCloner from isaacsim.core.prims import RigidPrim -from isaacsim.core.utils.viewports import set_camera_view import isaaclab.sim as sim_utils import isaaclab.terrains as terrain_gen from isaaclab.sensors.ray_caster import RayCaster, RayCasterCfg, patterns +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.terrains.config.rough import ROUGH_TERRAINS_CFG from isaaclab.terrains.terrain_importer import TerrainImporter from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR @@ -88,19 +87,9 @@ def design_scene(sim: SimulationContext, num_envs: int = 2048): def main(): """Main function.""" - # Load kit helper - sim_params = { - "use_gpu": True, - "use_gpu_pipeline": True, - "use_flatcache": True, # deprecated from Isaac Sim 2023.1 onwards - "use_fabric": True, # used from Isaac Sim 2023.1 onwards - "enable_scene_query_support": True, - } - sim = SimulationContext( - physics_dt=1.0 / 60.0, rendering_dt=1.0 / 60.0, sim_params=sim_params, backend="torch", device="cuda:0" - ) + sim = SimulationContext(SimulationCfg()) # Set main camera - set_camera_view([0.0, 30.0, 25.0], [0.0, 0.0, -2.5]) + sim.set_camera_view([0.0, 30.0, 25.0], [0.0, 0.0, -2.5]) # Parameters num_envs = args_cli.num_envs diff --git a/source/isaaclab/test/sim/test_mesh_converter.py b/source/isaaclab/test/sim/test_mesh_converter.py index 5a986cc0328..ea4529d293c 100644 --- a/source/isaaclab/test/sim/test_mesh_converter.py +++ b/source/isaaclab/test/sim/test_mesh_converter.py @@ -20,10 +20,10 @@ import pytest import omni -from isaacsim.core.api.simulation_context import SimulationContext from pxr import UsdGeom, UsdPhysics import isaaclab.sim as sim_utils +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.sim.converters import MeshConverter, MeshConverterCfg from isaaclab.sim.schemas import MESH_APPROXIMATION_TOKENS, schemas_cfg from isaaclab.utils.assets import ISAACLAB_NUCLEUS_DIR, retrieve_file_path @@ -66,7 +66,7 @@ def sim(): # Simulation time-step dt = 0.01 # Load kit helper - sim = SimulationContext(physics_dt=dt, rendering_dt=dt, backend="numpy") + sim = SimulationContext(SimulationCfg(dt=dt)) yield sim # stop simulation sim.stop() diff --git a/source/isaaclab/test/sim/test_mjcf_converter.py b/source/isaaclab/test/sim/test_mjcf_converter.py index 9d6499d554f..8ce098b4a51 100644 --- a/source/isaaclab/test/sim/test_mjcf_converter.py +++ b/source/isaaclab/test/sim/test_mjcf_converter.py @@ -16,10 +16,10 @@ import pytest -from isaacsim.core.api.simulation_context import SimulationContext from isaacsim.core.utils.extensions import enable_extension, get_extension_path_from_name import isaaclab.sim as sim_utils +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.sim.converters import MjcfConverter, MjcfConverterCfg @@ -31,7 +31,7 @@ def test_setup_teardown(): # Setup: Create simulation context dt = 0.01 - sim = SimulationContext(physics_dt=dt, rendering_dt=dt, backend="numpy") + sim = SimulationContext(SimulationCfg(dt=dt)) # Setup: Create MJCF config enable_extension("isaacsim.asset.importer.mjcf") diff --git a/source/isaaclab/test/sim/test_schemas.py b/source/isaaclab/test/sim/test_schemas.py index 3d2b5b61e82..05710bd9228 100644 --- a/source/isaaclab/test/sim/test_schemas.py +++ b/source/isaaclab/test/sim/test_schemas.py @@ -16,11 +16,11 @@ import pytest -from isaacsim.core.api.simulation_context import SimulationContext from pxr import UsdPhysics import isaaclab.sim as sim_utils import isaaclab.sim.schemas as schemas +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR from isaaclab.utils.string import to_camel_case @@ -33,7 +33,7 @@ def setup_simulation(): # Simulation time-step dt = 0.1 # Load kit helper - sim = SimulationContext(physics_dt=dt, rendering_dt=dt, backend="numpy") + sim = SimulationContext(SimulationCfg(dt=dt)) # Set some default values for test arti_cfg = schemas.ArticulationRootPropertiesCfg( enabled_self_collisions=False, @@ -74,6 +74,7 @@ def setup_simulation(): ) yield sim, arti_cfg, rigid_cfg, collision_cfg, mass_cfg, joint_cfg # Teardown + sim._disable_app_control_on_stop_handle = True # prevent timeout sim.stop() sim.clear() sim.clear_all_callbacks() diff --git a/source/isaaclab/test/sim/test_simulation_context.py b/source/isaaclab/test/sim/test_simulation_context.py index 88544c2f842..4244b36ff8e 100644 --- a/source/isaaclab/test/sim/test_simulation_context.py +++ b/source/isaaclab/test/sim/test_simulation_context.py @@ -18,7 +18,6 @@ import pytest import omni.physx -from isaacsim.core.api.simulation_context import SimulationContext as IsaacSimulationContext import isaaclab.sim as sim_utils from isaaclab.sim import SimulationCfg, SimulationContext @@ -61,9 +60,7 @@ def test_singleton(): """Tests that the singleton is working.""" sim1 = SimulationContext() sim2 = SimulationContext() - sim3 = IsaacSimulationContext() assert sim1 is sim2 - assert sim1 is sim3 # try to delete the singleton sim2.clear_instance() @@ -71,11 +68,7 @@ def test_singleton(): # create new instance sim4 = SimulationContext() assert sim1 is not sim4 - assert sim3 is not sim4 assert sim1.instance() is sim4.instance() - assert sim3.instance() is sim4.instance() - # clear instance - sim3.clear_instance() @pytest.mark.isaacsim_ci diff --git a/source/isaaclab/test/sim/test_spawn_from_files.py b/source/isaaclab/test/sim/test_spawn_from_files.py index 530cc4b99cd..9edf535ac91 100644 --- a/source/isaaclab/test/sim/test_spawn_from_files.py +++ b/source/isaaclab/test/sim/test_spawn_from_files.py @@ -16,9 +16,9 @@ from packaging.version import Version import omni.kit.app -from isaacsim.core.api.simulation_context import SimulationContext import isaaclab.sim as sim_utils +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.utils.assets import ISAACLAB_NUCLEUS_DIR from isaaclab.utils.version import get_isaac_sim_version @@ -31,7 +31,7 @@ def sim(): # Simulation time-step dt = 0.1 # Load kit helper - sim = SimulationContext(physics_dt=dt, rendering_dt=dt, backend="numpy") + sim = SimulationContext(SimulationCfg(dt=dt)) # Wait for spawning sim_utils.update_stage() diff --git a/source/isaaclab/test/sim/test_spawn_lights.py b/source/isaaclab/test/sim/test_spawn_lights.py index 325cd06866e..9dbbd98cf7a 100644 --- a/source/isaaclab/test/sim/test_spawn_lights.py +++ b/source/isaaclab/test/sim/test_spawn_lights.py @@ -15,10 +15,10 @@ import pytest -from isaacsim.core.api.simulation_context import SimulationContext from pxr import Usd, UsdLux import isaaclab.sim as sim_utils +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.utils.string import to_camel_case @@ -30,7 +30,7 @@ def sim(): # Simulation time-step dt = 0.1 # Load kit helper - sim = SimulationContext(physics_dt=dt, rendering_dt=dt, backend="numpy") + sim = SimulationContext(SimulationCfg(dt=dt)) # Wait for spawning sim_utils.update_stage() diff --git a/source/isaaclab/test/sim/test_spawn_materials.py b/source/isaaclab/test/sim/test_spawn_materials.py index ee8cb38f90a..e5c3b14f50d 100644 --- a/source/isaaclab/test/sim/test_spawn_materials.py +++ b/source/isaaclab/test/sim/test_spawn_materials.py @@ -15,10 +15,10 @@ import pytest -from isaacsim.core.api.simulation_context import SimulationContext from pxr import UsdPhysics, UsdShade import isaaclab.sim as sim_utils +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.utils.assets import NVIDIA_NUCLEUS_DIR @@ -27,7 +27,7 @@ def sim(): """Create a simulation context.""" sim_utils.create_new_stage() dt = 0.1 - sim = SimulationContext(physics_dt=dt, rendering_dt=dt, backend="numpy") + sim = SimulationContext(SimulationCfg(dt=dt)) sim_utils.update_stage() yield sim sim.stop() diff --git a/source/isaaclab/test/sim/test_spawn_meshes.py b/source/isaaclab/test/sim/test_spawn_meshes.py index 66a48422c0c..43fbc7852c2 100644 --- a/source/isaaclab/test/sim/test_spawn_meshes.py +++ b/source/isaaclab/test/sim/test_spawn_meshes.py @@ -15,9 +15,8 @@ import pytest -from isaacsim.core.api.simulation_context import SimulationContext - import isaaclab.sim as sim_utils +from isaaclab.sim import SimulationCfg, SimulationContext @pytest.fixture @@ -28,11 +27,12 @@ def sim(): # Simulation time-step dt = 0.1 # Load kit helper - sim = SimulationContext(physics_dt=dt, rendering_dt=dt, device="cuda:0") + sim = SimulationContext(SimulationCfg(dt=dt)) # Wait for spawning sim_utils.update_stage() yield sim # Cleanup + sim._disable_app_control_on_stop_handle = True # prevent timeout sim.stop() sim.clear() sim.clear_all_callbacks() diff --git a/source/isaaclab/test/sim/test_spawn_sensors.py b/source/isaaclab/test/sim/test_spawn_sensors.py index 320a47b3336..63f29af7830 100644 --- a/source/isaaclab/test/sim/test_spawn_sensors.py +++ b/source/isaaclab/test/sim/test_spawn_sensors.py @@ -15,10 +15,10 @@ import pytest -from isaacsim.core.api.simulation_context import SimulationContext from pxr import Usd import isaaclab.sim as sim_utils +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.sim.spawners.sensors.sensors import CUSTOM_FISHEYE_CAMERA_ATTRIBUTES, CUSTOM_PINHOLE_CAMERA_ATTRIBUTES from isaaclab.utils.string import to_camel_case @@ -28,7 +28,7 @@ def sim(): """Create a simulation context.""" sim_utils.create_new_stage() dt = 0.1 - sim = SimulationContext(physics_dt=dt, rendering_dt=dt, backend="numpy") + sim = SimulationContext(SimulationCfg(dt=dt)) sim_utils.update_stage() yield sim sim.stop() diff --git a/source/isaaclab/test/sim/test_spawn_shapes.py b/source/isaaclab/test/sim/test_spawn_shapes.py index ed7ba68f89b..4c18753d52e 100644 --- a/source/isaaclab/test/sim/test_spawn_shapes.py +++ b/source/isaaclab/test/sim/test_spawn_shapes.py @@ -14,9 +14,8 @@ import pytest -from isaacsim.core.api.simulation_context import SimulationContext - import isaaclab.sim as sim_utils +from isaaclab.sim import SimulationCfg, SimulationContext @pytest.fixture @@ -24,9 +23,10 @@ def sim(): """Create a simulation context.""" sim_utils.create_new_stage() dt = 0.1 - sim = SimulationContext(physics_dt=dt, rendering_dt=dt, backend="numpy") + sim = SimulationContext(SimulationCfg(dt=dt)) sim_utils.update_stage() yield sim + sim._disable_app_control_on_stop_handle = True # prevent timeout sim.stop() sim.clear() sim.clear_all_callbacks() diff --git a/source/isaaclab/test/sim/test_spawn_wrappers.py b/source/isaaclab/test/sim/test_spawn_wrappers.py index 3dd07a54e6f..1571bb62bdc 100644 --- a/source/isaaclab/test/sim/test_spawn_wrappers.py +++ b/source/isaaclab/test/sim/test_spawn_wrappers.py @@ -15,9 +15,8 @@ import pytest -from isaacsim.core.api.simulation_context import SimulationContext - import isaaclab.sim as sim_utils +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.utils.assets import ISAACLAB_NUCLEUS_DIR @@ -26,7 +25,7 @@ def sim(): """Create a simulation context.""" sim_utils.create_new_stage() dt = 0.1 - sim = SimulationContext(physics_dt=dt, rendering_dt=dt, backend="numpy") + sim = SimulationContext(SimulationCfg(dt=dt)) sim_utils.update_stage() yield sim sim.stop() diff --git a/source/isaaclab/test/sim/test_urdf_converter.py b/source/isaaclab/test/sim/test_urdf_converter.py index f350ace9a5b..6512b4fc633 100644 --- a/source/isaaclab/test/sim/test_urdf_converter.py +++ b/source/isaaclab/test/sim/test_urdf_converter.py @@ -19,10 +19,10 @@ from packaging.version import Version import omni.kit.app -from isaacsim.core.api.simulation_context import SimulationContext from isaacsim.core.prims import Articulation import isaaclab.sim as sim_utils +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.sim.converters import UrdfConverter, UrdfConverterCfg from isaaclab.utils.version import get_isaac_sim_version @@ -53,9 +53,10 @@ def sim_config(): # Simulation time-step dt = 0.01 # Load kit helper - sim = SimulationContext(physics_dt=dt, rendering_dt=dt, stage_units_in_meters=1.0, backend="numpy") + sim = SimulationContext(SimulationCfg(dt=dt)) yield sim, config # Teardown + sim._disable_app_control_on_stop_handle = True # prevent timeout sim.stop() sim.clear() sim.clear_all_callbacks() diff --git a/source/isaaclab/test/terrains/check_terrain_importer.py b/source/isaaclab/test/terrains/check_terrain_importer.py index fdc305a07af..d88ec65c86d 100644 --- a/source/isaaclab/test/terrains/check_terrain_importer.py +++ b/source/isaaclab/test/terrains/check_terrain_importer.py @@ -69,14 +69,13 @@ from isaacsim.core.api.materials import PhysicsMaterial from isaacsim.core.api.materials.preview_surface import PreviewSurface from isaacsim.core.api.objects import DynamicSphere -from isaacsim.core.api.simulation_context import SimulationContext from isaacsim.core.cloner import GridCloner from isaacsim.core.prims import RigidPrim, SingleGeometryPrim, SingleRigidPrim from isaacsim.core.utils.extensions import enable_extension -from isaacsim.core.utils.viewports import set_camera_view import isaaclab.sim as sim_utils import isaaclab.terrains as terrain_gen +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.terrains.config.rough import ROUGH_TERRAINS_CFG from isaaclab.terrains.terrain_importer import TerrainImporter from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR @@ -88,18 +87,9 @@ def main(): """Generates a terrain from isaaclab.""" # Load kit helper - sim_params = { - "use_gpu": True, - "use_gpu_pipeline": True, - "use_flatcache": True, - "use_fabric": True, - "enable_scene_query_support": True, - } - sim = SimulationContext( - physics_dt=1.0 / 60.0, rendering_dt=1.0 / 60.0, sim_params=sim_params, backend="torch", device="cuda:0" - ) + sim = SimulationContext(SimulationCfg()) # Set main camera - set_camera_view([0.0, 30.0, 25.0], [0.0, 0.0, -2.5]) + sim.set_camera_view(eye=(0.0, 30.0, 25.0), target=(0.0, 0.0, -2.5)) # Parameters num_balls = 2048 From ebca6f2dbff607f0a65bcaf24ce3d551ec0555e7 Mon Sep 17 00:00:00 2001 From: Pascal Roth Date: Thu, 29 Jan 2026 09:32:11 +0100 Subject: [PATCH 2/2] add demos --- .../sensors/check_multi_mesh_ray_caster.py | 4 +- ...eck_multi_mesh_ray_caster_h1_locomotion.py | 239 ++++++++++++++++++ 2 files changed, 241 insertions(+), 2 deletions(-) create mode 100644 source/isaaclab/test/sensors/check_multi_mesh_ray_caster_h1_locomotion.py diff --git a/source/isaaclab/test/sensors/check_multi_mesh_ray_caster.py b/source/isaaclab/test/sensors/check_multi_mesh_ray_caster.py index 11e175408df..48576981da1 100644 --- a/source/isaaclab/test/sensors/check_multi_mesh_ray_caster.py +++ b/source/isaaclab/test/sensors/check_multi_mesh_ray_caster.py @@ -23,7 +23,7 @@ # add argparse arguments parser = argparse.ArgumentParser(description="Ray Caster Test Script") parser.add_argument("--num_envs", type=int, default=16, help="Number of environments to clone.") -parser.add_argument("--num_objects", type=int, default=0, help="Number of additional objects to clone.") +parser.add_argument("--num_objects", type=int, default=20, help="Number of additional objects to clone.") parser.add_argument( "--terrain_type", type=str, @@ -96,7 +96,7 @@ def design_scene(sim: SimulationContext, num_envs: int = 2048): f"/World/envs/env_0/object_{i}", object, translation=(0.0 + random.random(), 0.0 + random.random(), 1.0), - orientation=quat_from_euler_xyz(torch.Tensor(0), torch.Tensor(0), torch.rand(1) * torch.pi).numpy(), + orientation=quat_from_euler_xyz(torch.zeros(1), torch.zeros(1), torch.rand(1) * torch.pi).numpy(), ) # Clone the scene diff --git a/source/isaaclab/test/sensors/check_multi_mesh_ray_caster_h1_locomotion.py b/source/isaaclab/test/sensors/check_multi_mesh_ray_caster_h1_locomotion.py new file mode 100644 index 00000000000..73427d85cec --- /dev/null +++ b/source/isaaclab/test/sensors/check_multi_mesh_ray_caster_h1_locomotion.py @@ -0,0 +1,239 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +""" +The script uses a custom H1 environment configuration that includes: +- A 5x5m grid pattern ray caster attached to the H1 robot +- Multiple obstacle objects spawned in each environment for ray casting demonstration + +.. code-block:: bash + + # Usage + ./isaaclab.sh -p source/isaaclab/test/sensors/check_multi_mesh_ray_caster_h1_locomotion.py --num_objects 10 + +""" + +"""Launch Isaac Sim Simulator first.""" + +import argparse +import os +import sys + +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../../../..")) +import scripts.reinforcement_learning.rsl_rl.cli_args as cli_args # isort: skip + + +from isaaclab.app import AppLauncher + +# add argparse arguments +parser = argparse.ArgumentParser( + description="This script demonstrates a test with the H1 rough terrain environment with ray caster." +) +parser.add_argument("--num_objects", type=int, default=10, help="Number of obstacle objects to spawn per environment.") +# append RSL-RL cli arguments +cli_args.add_rsl_rl_args(parser) +# append AppLauncher cli args +AppLauncher.add_app_launcher_args(parser) +# parse the arguments +args_cli = parser.parse_args() + +# launch omniverse app +app_launcher = AppLauncher(args_cli) +simulation_app = app_launcher.app + +"""Rest everything follows.""" + +import random + +import cv2 +import torch +from rsl_rl.runners import OnPolicyRunner + +from isaacsim.sensors.camera import Camera + +import isaaclab.sim as sim_utils +from isaaclab.assets import RigidObjectCfg +from isaaclab.envs import ManagerBasedRLEnv +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.managers import SceneEntityCfg +from isaaclab.sensors.ray_caster import MultiMeshRayCasterCfg, patterns +from isaaclab.utils import configclass + +from isaaclab_rl.rsl_rl import RslRlOnPolicyRunnerCfg, RslRlVecEnvWrapper +from isaaclab_rl.utils.pretrained_checkpoint import get_published_pretrained_checkpoint + +import isaaclab_tasks.manager_based.locomotion.velocity.mdp as mdp +from isaaclab_tasks.manager_based.locomotion.velocity.config.h1.rough_env_cfg import H1RoughEnvCfg_PLAY + +TASK = "Isaac-Velocity-Rough-H1-v0" +RL_LIBRARY = "rsl_rl" + + +@configclass +class H1RoughEnvCfg_PLAY_WITH_RAYCASTER(H1RoughEnvCfg_PLAY): + """H1 rough environment configuration for interactive play with obstacles and multi-mesh ray caster.""" + + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Add obstacles individually to the scene + # Default number of obstacles + num_obstacles = 10 + + for i in range(num_obstacles): + # Add each obstacle as an individual attribute to the scene + setattr( + self.scene, + f"obstacle_{i}", + RigidObjectCfg( + prim_path=f"{{ENV_REGEX_NS}}/obstacle_{i}", + spawn=sim_utils.CuboidCfg( + size=(0.1 + random.random() * 0.5, 0.5 + random.random() * 0.5, 0.5 + random.random() * 0.05), + rigid_props=sim_utils.RigidBodyPropertiesCfg(), + mass_props=sim_utils.MassPropertiesCfg(mass=0.5), + collision_props=sim_utils.CollisionPropertiesCfg(), + visual_material=sim_utils.PreviewSurfaceCfg( + diffuse_color=(0.0, 0.0 + i / num_obstacles, 1.0 - i / num_obstacles) + ), + ), + init_state=RigidObjectCfg.InitialStateCfg((0.0 + random.random(), 0.0 + random.random(), 1.0)), + ), + ) + + # Add multi-mesh ray caster with 5x5m grid pattern + self.scene.multi_mesh_ray_caster = MultiMeshRayCasterCfg( + prim_path="{ENV_REGEX_NS}/Robot/torso_link", + mesh_prim_paths=[ + MultiMeshRayCasterCfg.RaycastTargetCfg(prim_expr="/World/ground", track_mesh_transforms=False), + MultiMeshRayCasterCfg.RaycastTargetCfg( + prim_expr="/World/envs/env_.*/obstacle_.*", track_mesh_transforms=True + ), + ], + pattern_cfg=patterns.GridPatternCfg( + resolution=0.1, # 10cm resolution + size=(5.0, 5.0), # 5x5 meter grid + ), + attach_yaw_only=True, + debug_vis=True, + update_period=0.02, # Update at 50Hz + ) + + # Add events to reset obstacles + for i in range(num_obstacles): + setattr( + self.events, + f"reset_obstacle_{i}", + EventTerm( + func=mdp.reset_root_state_uniform, + mode="reset", + params={ + "pose_range": { + "x": (-0.5, 0.5), + "y": (-0.5, 0.5), + "z": (0.0, 0.0), + "roll": (-3.14, 3.14), + "pitch": (-3.14, 3.14), + "yaw": (-3.14, 3.14), + }, + "velocity_range": { + "x": (-0.0, 0.0), + "y": (-0.0, 0.0), + "z": (-0.0, 0.0), + }, + "asset_cfg": SceneEntityCfg(f"obstacle_{i}"), + }, + ), + ) + + # change the visualizer to follow env 1 + self.viewer.origin_type = "asset_root" + self.viewer.asset_name = "robot" + + # turn off the velocity marker + self.commands.base_velocity.debug_vis = False + + +class H1RoughDemoWithRayCaster: + def __init__(self): + agent_cfg: RslRlOnPolicyRunnerCfg = cli_args.parse_rsl_rl_cfg(TASK, args_cli) + # load the trained jit policy + checkpoint = get_published_pretrained_checkpoint(RL_LIBRARY, TASK) + + # Create environment with ray caster and obstacles + env_cfg = H1RoughEnvCfg_PLAY_WITH_RAYCASTER() + + # Configure scene for interactive demo + env_cfg.scene.num_envs = 10 + env_cfg.episode_length_s = 1000000 + env_cfg.curriculum = None + env_cfg.commands.base_velocity.ranges.lin_vel_x = (0.0, 1.0) + env_cfg.commands.base_velocity.ranges.heading = (-1.0, 1.0) + + # Update ray caster debug visualization based on headless mode + if hasattr(env_cfg.scene, "multi_mesh_ray_caster"): + env_cfg.scene.multi_mesh_ray_caster.debug_vis = not args_cli.headless + + # wrap around environment for rsl-rl + self.env = RslRlVecEnvWrapper(ManagerBasedRLEnv(cfg=env_cfg)) + self.device = self.env.unwrapped.device + self.num_envs = env_cfg.scene.num_envs + + # Access the ray caster from the scene + if "multi_mesh_ray_caster" in self.env.unwrapped.scene.sensors: + self.ray_caster = self.env.unwrapped.scene.sensors["multi_mesh_ray_caster"] + print(f"Ray caster loaded from scene with {self.ray_caster.num_rays} rays per robot") + else: + self.ray_caster = None + print("Warning: Ray caster not found in scene") + + # load previously trained model + ppo_runner = OnPolicyRunner(self.env, agent_cfg.to_dict(), log_dir=None, device=self.device) + ppo_runner.load(checkpoint) + # obtain the trained policy for inference + self.policy = ppo_runner.get_inference_policy(device=self.device) + + self.commands = torch.zeros(self.num_envs, 4, device=self.device) + self.commands[:, 0:3] = self.env.unwrapped.command_manager.get_command("base_velocity") + + +def main(): + """Main function.""" + demo_h1 = H1RoughDemoWithRayCaster() + obs, _ = demo_h1.env.reset() + + camera = Camera(prim_path="/World/floating_camera", resolution=(3600, 2430)) + camera.set_world_pose( + position=demo_h1.env.unwrapped.scene["robot"].data.root_pos_w[0, :].cpu().numpy() + [-20, 0.0, 15], + orientation=[0.9396926, 0.0, 0.3420201, 0.0], + ) + camera.initialize() + os.makedirs("images", exist_ok=True) + + # Simulation step counter for periodic updates + step_count = 0 + + while simulation_app.is_running(): + # check for selected robots + + with torch.inference_mode(): + action = demo_h1.policy(obs) + obs, _, _, _ = demo_h1.env.step(action) + # overwrite command based on keyboard input + obs[:, 9:13] = demo_h1.commands + + if step_count > 10: + camera.get_current_frame() + # Convert RGB to BGR for OpenCV + image_bgr = cv2.cvtColor(camera.get_rgba()[:, :, :3], cv2.COLOR_RGB2BGR) + # Save the image as PNG + assert cv2.imwrite(f"images/img_{str(step_count - 10).zfill(4)}.png", image_bgr) + + step_count += 1 + + +if __name__ == "__main__": + main() + simulation_app.close()