Skip to content

Commit a90707b

Browse files
committed
Use launcher runtime intent for clone decision
1 parent 7aefc99 commit a90707b

3 files changed

Lines changed: 30 additions & 27 deletions

File tree

source/isaaclab/isaaclab/scene/interactive_scene.py

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
from isaaclab.sim.utils.stage import get_current_stage, get_current_stage_id
3737
from isaaclab.sim.views import FrameView
3838
from isaaclab.terrains import TerrainImporter, TerrainImporterCfg
39-
from isaaclab.utils.version import has_kit
4039

4140
# Note: This is a temporary import for the VisuoTactileSensorCfg class.
4241
# It will be removed once the VisuoTactileSensor class is added to the core Isaac Lab framework.
@@ -146,7 +145,6 @@ def __init__(self, cfg: InteractiveSceneCfg):
146145
self.stage_id = get_current_stage_id()
147146
self.physics_backend = self.sim.physics_manager.__name__.lower()
148147
requested_viz_types = set(self.sim.resolve_visualizer_types())
149-
requested_renderer_types = set(self._cfg_renderer_types())
150148
if self.physics_backend.startswith("ovphysx"):
151149
from isaaclab_ovphysx.cloner import ovphysx_replicate
152150

@@ -166,13 +164,14 @@ def __init__(self, cfg: InteractiveSceneCfg):
166164
# prepare cloner for environment replication
167165
self.env_prim_paths = [f"{self.env_ns}/env_{i}" for i in range(self.cfg.num_envs)]
168166
is_newton_replicated_scene = self.cfg.replicate_physics and self.physics_backend.startswith("newton")
167+
has_ovrtx_renderer = self.sim.has_requested_renderer_type("ovrtx")
169168

170169
self.cloner_cfg = cloner.CloneCfg(
171170
clone_regex=self.env_regex_ns,
172171
clone_in_fabric=self.cfg.clone_in_fabric,
173172
device=self.device,
174173
physics_clone_fn=physics_clone_fn,
175-
clone_usd=not is_newton_replicated_scene or has_kit() or "ovrtx" in requested_renderer_types,
174+
clone_usd=not is_newton_replicated_scene or self.sim.runtime_needs_kit() or has_ovrtx_renderer,
176175
)
177176

178177
# create source prim
@@ -354,17 +353,6 @@ def _aggregate_scene_data_requirements(self, visualizer_types=()) -> None:
354353
if requirements != current_req:
355354
self.sim.update_scene_data_requirements(requirements)
356355

357-
def _cfg_renderer_types(self) -> list[str]:
358-
"""Return renderer type names declared by scene cfg entries before sensors are constructed."""
359-
cfg_fields = InteractiveSceneCfg.__dataclass_fields__
360-
renderer_types: list[str] = []
361-
for asset_cfg in (v for k, v in self.cfg.__dict__.items() if k not in cfg_fields and v is not None):
362-
cfgs = asset_cfg.rigid_objects.values() if isinstance(asset_cfg, RigidObjectCollectionCfg) else [asset_cfg]
363-
for cfg in cfgs:
364-
if (rcfg := getattr(cfg, "renderer_cfg", None)) is not None:
365-
renderer_types.append(getattr(rcfg, "renderer_type", "default"))
366-
return renderer_types
367-
368356
def _sensor_renderer_types(self) -> list[str]:
369357
"""Return renderer type names used by scene sensors (skipping any without a renderer cfg)."""
370358
return [

source/isaaclab/isaaclab/sim/simulation_context.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,15 @@ def resolve_visualizer_types(self) -> list[str]:
529529
visualizer_cfgs = [visualizer_cfgs]
530530
return [cfg.visualizer_type for cfg in visualizer_cfgs if getattr(cfg, "visualizer_type", None)]
531531

532+
def has_requested_renderer_type(self, renderer_type: str) -> bool:
533+
"""Return whether the launcher detected a requested renderer type."""
534+
return bool(self.get_setting(f"/isaaclab/runtime/has_{renderer_type}_renderer"))
535+
536+
def runtime_needs_kit(self) -> bool:
537+
"""Return the launcher-predetermined Kit requirement, falling back to active Kit state."""
538+
needs_kit = self.get_setting("/isaaclab/runtime/needs_kit")
539+
return has_kit() if needs_kit is None else bool(needs_kit)
540+
532541
def _resolve_visualizer_cfgs(self) -> list[Any]:
533542
"""Resolve final visualizer configs from cfg and optional CLI override.
534543

source/isaaclab_tasks/isaaclab_tasks/utils/sim_launcher.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from contextlib import contextmanager
1414
from typing import Any
1515

16+
from isaaclab.app.settings_manager import get_settings_manager
1617
from isaaclab.physics.physics_manager_cfg import PhysicsCfg
1718
from isaaclab.renderers.renderer_cfg import RendererCfg
1819
from isaaclab.sensors.camera.camera_cfg import CameraCfg
@@ -320,22 +321,20 @@ def launch_simulation(
320321
# loading both in the same process causes a dynamic-linker crash. Use
321322
# --visualizer newton instead, which is compatible with ovrtx presets.
322323
early_visualizer_types = _get_visualizer_types(launcher_args)
323-
if "kit" in early_visualizer_types:
324-
has_ovrtx = _scan_config(
325-
env_cfg, [lambda node: isinstance(node, RendererCfg) and getattr(node, "renderer_type", None) == "ovrtx"]
326-
)[0]
327-
if has_ovrtx:
328-
raise ValueError(
329-
"[launch_simulation] '--visualizer kit' is incompatible with 'ovrtx_renderer'. "
330-
"Both Kit (Isaac Sim) and ovrtx ship conflicting RTX hydra libraries "
331-
"(librtx.hydra.so, liblegacy.hydra.so) compiled against different USD namespaces, "
332-
"which causes a dynamic-linker crash when loaded into the same process. "
333-
"Use '--visualizer newton' instead, which is fully compatible with ovrtx presets."
334-
)
324+
has_ovrtx_renderer = _scan_config(env_cfg, [_is_ovrtx_renderer])[0]
325+
if "kit" in early_visualizer_types and has_ovrtx_renderer:
326+
raise ValueError(
327+
"[launch_simulation] '--visualizer kit' is incompatible with 'ovrtx_renderer'. "
328+
"Both Kit (Isaac Sim) and ovrtx ship conflicting RTX hydra libraries "
329+
"(librtx.hydra.so, liblegacy.hydra.so) compiled against different USD namespaces, "
330+
"which causes a dynamic-linker crash when loaded into the same process. "
331+
"Use '--visualizer newton' instead, which is fully compatible with ovrtx presets."
332+
)
335333

336334
validate_runtime_compatibility(env_cfg, launcher_args)
337335
needs_kit, has_kit_cameras, visualizer_types = compute_kit_requirements(env_cfg, launcher_args)
338336
visualizer_intent = _compute_visualizer_intent(env_cfg)
337+
has_kit_visualizer = "kit" in visualizer_types or visualizer_intent.get("has_kit_visualizer", False)
339338
_set_visualizer_intent_on_launcher_args(launcher_args, visualizer_intent)
340339

341340
if needs_kit and has_kit_cameras:
@@ -421,7 +420,14 @@ def launch_simulation(
421420
if sim_cfg is not None and hasattr(app_launcher, "device"):
422421
sim_cfg.device = app_launcher.device
423422
close_fn = app_launcher.app.close
424-
elif visualizer_types or visualizer_explicit_none:
423+
424+
settings = get_settings_manager()
425+
settings.set_bool("/isaaclab/runtime/needs_kit", bool(needs_kit))
426+
settings.set_bool("/isaaclab/runtime/has_kit_cameras", bool(has_kit_cameras))
427+
settings.set_bool("/isaaclab/runtime/has_kit_visualizer", bool(has_kit_visualizer))
428+
settings.set_bool("/isaaclab/runtime/has_ovrtx_renderer", bool(has_ovrtx_renderer))
429+
430+
if not needs_kit and (visualizer_types or visualizer_explicit_none):
425431
# Newton path without Kit: AppLauncher is skipped, so manually store the visualizer
426432
# selection in SettingsManager (works in standalone mode via plain dict) so that
427433
# SimulationContext._get_cli_visualizer_types() can find it.

0 commit comments

Comments
 (0)