Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
f0eaf24
Consolidate environment backend smoke tests
StafaH Aug 13, 2026
c3329cb
Default classic tasks to Newton
StafaH Aug 13, 2026
742fbf2
Collect environment objects before teardown
StafaH Aug 13, 2026
f416d9e
Update preset tests for Newton defaults
StafaH Aug 13, 2026
543ee34
Format environment test updates
StafaH Aug 13, 2026
0fddcfe
Pin registered rendering tests to Isaac Sim
StafaH Aug 13, 2026
c0e5f45
Release environments before simulation teardown
StafaH Aug 13, 2026
6c98c4f
Scope Newton renderer defaults to Cartpole
StafaH Aug 13, 2026
1e76a29
Clarify Cartpole renderer release note
StafaH Aug 13, 2026
20955dc
Fix Cartpole backend test baselines
StafaH Aug 13, 2026
3e5b9be
Split environment smoke tests by backend
StafaH Aug 14, 2026
9ad93dd
Retain stage-in-memory test utilities
StafaH Aug 14, 2026
ac93fbd
Test OV PhysX environment presets
StafaH Aug 14, 2026
d1f4ef9
Revert "Test OV PhysX environment presets"
StafaH Aug 14, 2026
d0a8017
Revert "Retain stage-in-memory test utilities"
StafaH Aug 14, 2026
e8cf939
Revert "Split environment smoke tests by backend"
StafaH Aug 14, 2026
1a7adb4
Merge remote-tracking branch 'origin/develop' into mh/default-newton-…
StafaH Aug 14, 2026
07000a9
Merge remote-tracking branch 'origin/develop' into mh/default-newton-…
StafaH Aug 14, 2026
5ffde71
Fix classic default backend tests
StafaH Aug 14, 2026
46d2aac
Use RTX renderer for PhysX video test
StafaH Aug 15, 2026
48065ef
Merge branch 'develop' into mh/default-newton-classic
ooctipus Aug 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -966,8 +966,7 @@ jobs:
# (dexterous, many contacts). Deformable/MPM kernels are not covered;
# widen if a test job reports large cache growth.
include-files: >-
test_environments.py,
test_environments_newton.py
test_environments.py
# No Soft/Cloth: the deformable envs depend on optional extras the CI
# image does not install (Soft needs pytetwild), so they only ever fail.
test-k-expr: "Cartpole or Drawer or AnymalD or Handover"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Changed
^^^^^^^

* **Breaking:** Changed the Cartpole task family and the default renderer preset

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This entry explicitly marks both default changes as breaking, but I could not find a prior deprecation for either the Cartpole backend default or the shared renderer default. Please reconcile this with the repository policy that breaking changes require a deprecation first, or document why these default changes are exempt.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is an intentional 3.0 breaking default change. The fragment now accurately scopes it to Cartpole and provides the explicit-preset migration path; we are not adding deprecation artifacts for this release.

to Newton MJWarp and the Newton renderer. Pass explicit physics and renderer
presets to retain an Isaac Sim PhysX configuration.
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ class CartpolePhysicsCfg(PresetCfg):
isaacsim_physx: PhysxCfg = PhysxCfg()
ovphysx: OvPhysxCfg = OvPhysxCfg()
physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx)
default = isaacsim_physx
newton_mjwarp: NewtonCfg = NewtonCfg(
solver_cfg=MJWarpSolverCfg(
njmax=5,
Expand All @@ -51,6 +50,7 @@ class CartpolePhysicsCfg(PresetCfg):
debug_mode=False,
use_cuda_graph=True,
)
default = newton_mjwarp


@configclass
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ class CartpolePhysicsCfg(PresetCfg):
isaacsim_physx: PhysxCfg = PhysxCfg()
ovphysx: OvPhysxCfg = OvPhysxCfg()
physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx)
default: PhysxCfg = isaacsim_physx
newton_mjwarp: NewtonCfg = NewtonCfg(
solver_cfg=MJWarpSolverCfg(
njmax=5,
Expand All @@ -56,6 +55,7 @@ class CartpolePhysicsCfg(PresetCfg):
debug_mode=False,
use_cuda_graph=True,
)
default: NewtonCfg = newton_mjwarp
newton_kamino: NewtonCfg = NewtonCfg(
solver_cfg=KaminoPADMMSolverCfg(sparse_jacobian=True),
debug_mode=False,
Expand Down
4 changes: 2 additions & 2 deletions source/isaaclab_tasks/isaaclab_tasks/utils/presets.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ class _AutoRtxRendererCfg(RendererCfg):

@configclass
class MultiBackendRendererCfg(PresetCfg):
default: IsaacRtxRendererCfg = IsaacRtxRendererCfg()
default: NewtonWarpRendererCfg = NewtonWarpRendererCfg()

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This changes the renderer default for every task that uses MultiBackendRendererCfg, not only the Cartpole family. The failures show that several existing consumers cannot use that default:

  • Mimic and contrib GR1T2 PickPlace now instantiate NewtonWarpRenderer and fail with ValueError: Failed to load texture: ...GR1T2_albedo.<UDIM>.png, so dataset generation never starts.
  • The XR-camera and Shadow Hand preset tests resolve default to NewtonWarpRendererCfg instead of their required IsaacRtxRendererCfg.
  • Registered-task rendering loses the Kit RenderProduct, and Newton returns no output for the MDL shading data types those tasks request.

Please keep the shared default unchanged and introduce a Cartpole-specific renderer preset/default, or migrate and explicitly pin every affected consumer while providing the missing Newton renderer support. The current shared change is a runtime regression outside the PR title scope.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 6c98c4f: MultiBackendRendererCfg retains its Isaac RTX default. Newton renderer defaults are now scoped to the Cartpole camera configurations, preserving contrib, Mimic, XR, and Shadow Hand behavior.

rtx: _AutoRtxRendererCfg = _AutoRtxRendererCfg()
newton_renderer: NewtonWarpRendererCfg = NewtonWarpRendererCfg()
ovrtx: OVRTXRendererCfg = OVRTXRendererCfg()
isaacsim_rtx = default
isaacsim_rtx: IsaacRtxRendererCfg = IsaacRtxRendererCfg()


def set_isaac_rtx_global_settings(renderer_cfg: Any, **settings: Any) -> None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,7 @@
@pytest.mark.parametrize("num_envs, device", [(2, "cuda"), (1, "cuda")])
@pytest.mark.parametrize(
"task_name",
setup_environment(
include_play=False, factory_envs=False, multi_agent=False, teleop_envs=False, cartpole_showcase_envs=True
),
setup_environment(factory_envs=False, multi_agent=False, teleop_envs=False, cartpole_showcase_envs=True),
)
@pytest.mark.isaacsim_ci
def test_cartpole_showcase_environments(task_name, num_envs, device):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,7 @@
@pytest.mark.parametrize("num_envs, device", [(2, "cuda")])
@pytest.mark.parametrize(
"task_name",
setup_environment(
include_play=False, factory_envs=False, multi_agent=False, teleop_envs=False, cartpole_showcase_envs=True
),
setup_environment(factory_envs=False, multi_agent=False, teleop_envs=False, cartpole_showcase_envs=True),
)
def test_cartpole_showcase_environments_with_stage_in_memory_and_clone_in_fabric_disabled(task_name, num_envs, device):
# skip test if stage in memory is not supported
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@
@pytest.mark.parametrize(
"task_name",
setup_environment(
include_play=False,
multi_agent=False,
factory_envs=False,
cartpole_showcase_envs=False,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
@pytest.mark.parametrize(
"task_name",
setup_environment(
include_play=False,
factory_envs=False,
multi_agent=False,
teleop_envs=False,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,7 @@


@pytest.mark.parametrize("num_envs, device", [(2, "cuda"), (1, "cuda")])
@pytest.mark.parametrize(
"task_name", setup_environment(include_play=False, factory_envs=False, multi_agent=False, teleop_envs=True)
)
@pytest.mark.parametrize("task_name", setup_environment(factory_envs=False, multi_agent=False, teleop_envs=True))
@pytest.mark.isaacsim_ci
def test_teleop_environments(task_name, num_envs, device):
# run teleop environments without stage in memory
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,7 @@


@pytest.mark.parametrize("num_envs, device", [(2, "cuda")])
@pytest.mark.parametrize(
"task_name", setup_environment(include_play=False, factory_envs=False, multi_agent=False, teleop_envs=True)
)
@pytest.mark.parametrize("task_name", setup_environment(factory_envs=False, multi_agent=False, teleop_envs=True))
def test_teleop_environments_with_stage_in_memory_and_clone_in_fabric_disabled(task_name, num_envs, device):
# skip test if stage in memory is not supported
if get_isaac_sim_version().major < 5:
Expand Down
8 changes: 5 additions & 3 deletions source/isaaclab_tasks/test/core/test_environments.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,18 @@
from env_test_utils import _run_environments, setup_environment # isort: skip


@pytest.mark.parametrize("physics_preset_name", ["newton_mjwarp", "physx", "isaacsim_physx"])

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This matrix does not guarantee the backend named in the test ID. Global preset resolution falls back to default when a task does not expose the requested name. The CI log demonstrates this directly: all three newton_mjwarp, physx, and isaacsim_physx Fourbar cases pass even though Fourbar only declares default/newton_kamino; the labels are therefore not evidence that those backends ran.

Please generate only supported (task, physics preset) pairs, or use a strict physics selector that errors when unavailable. Also restore include_play=False unless every Play variant is intentional: this change collected 252 cases here and 42 stage-in-memory cases, substantially increasing runtime and repeated teardown pressure.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 6c98c4f: the matrix now includes only task/backend pairs whose raw config explicitly exposes the requested physics preset. Play filtering remains removed because the current registry has no Play task variants.

@pytest.mark.parametrize("num_envs, device", [(2, "cuda"), (1, "cuda")])
@pytest.mark.parametrize(
"task_name",
setup_environment(
include_play=False,
multi_agent=False,
tier="core",
),
)
@pytest.mark.isaacsim_ci
def test_environments(task_name, num_envs, device):
def test_environments(task_name, physics_preset_name, num_envs, device):
# run environments without stage in memory
_run_environments(task_name, device, num_envs, create_stage_in_memory=False)
_run_environments(
task_name, device, num_envs, create_stage_in_memory=False, physics_preset_name=physics_preset_name
)
38 changes: 0 additions & 38 deletions source/isaaclab_tasks/test/core/test_environments_newton.py

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

# TODO(mtrepte): re-enable with fabric cloning fix
# @pytest.mark.parametrize("num_envs, device", [(2, "cuda")])
# @pytest.mark.parametrize("task_name", setup_environment(include_play=False,factory_envs=False, multi_agent=False))
# @pytest.mark.parametrize("task_name", setup_environment(factory_envs=False, multi_agent=False))
# def test_environments_with_stage_in_memory_and_clone_in_fabric_disabled(task_name, num_envs, device):
# # skip test if stage in memory is not supported
# if get_isaac_sim_version().major < 5:
Expand All @@ -43,7 +43,6 @@
@pytest.mark.parametrize(
"task_name",
setup_environment(
include_play=False,
multi_agent=False,
tier="core",
),
Expand Down
42 changes: 22 additions & 20 deletions source/isaaclab_tasks/test/core/test_preset_kit_decision.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

import gymnasium as gym
import pytest
from isaaclab_newton.physics import NewtonCfg
from isaaclab_ov.physics import OvPhysxCfg
from isaaclab_ov.renderers import OVRTXRendererCfg
from isaaclab_physx.physics import PhysxCfg
Expand Down Expand Up @@ -87,11 +88,12 @@ def test_isaacsim_physx_is_physics_selector():
assert "isaacsim_physx" in preset_map[PresetTarget.PHYSICS]


def test_registered_task_physx_presets_keep_auto_selection_explicit():
"""PhysX defaults are concrete while ``physx`` remains the automatic selector."""
def test_core_task_physx_presets_keep_auto_selection_explicit():
"""Core tasks retain explicit PhysX variants alongside automatic ``physx``."""

for task_id, task_spec in gym.registry.items():
if not task_id.startswith(("Isaac-", "IsaacContrib-")) or "env_cfg_entry_point" not in task_spec.kwargs:
entry_point = task_spec.kwargs.get("env_cfg_entry_point", "")
if not task_id.startswith("Isaac-") or "isaaclab_tasks.core" not in str(entry_point):
continue
env_cfg = load_cfg_from_registry(task_id, "env_cfg_entry_point")
presets = collect_presets(env_cfg)
Expand Down Expand Up @@ -137,24 +139,24 @@ def test_preset_mjwarp_ovrtx_does_not_need_kit():
assert needs_kit is False


def test_preset_rtx_with_default_physx_resolves_to_isaac_sim_backends():
"""Automatic RTX follows the default concrete Isaac Sim PhysX backend."""
def test_preset_rtx_with_default_newton_resolves_to_isaac_sim_backends():
"""Explicit RTX retains the default Newton physics while requiring Isaac Sim."""
env_cfg = _resolve_with_presets("rtx")
config_scan = _resolve_runtime_renderer(env_cfg)

assert isinstance(env_cfg.sim.physics, PhysxCfg)
assert isinstance(env_cfg.tiled_camera.renderer_cfg, IsaacRtxRendererCfg)
assert config_scan.needs_kit is True
assert isinstance(env_cfg.sim.physics, NewtonCfg)
assert isinstance(env_cfg.tiled_camera.renderer_cfg, OVRTXRendererCfg)
assert config_scan.needs_kit is False


def test_renderer_selector_rtx_with_default_physx_resolves_to_isaac_sim_backends():
"""The RTX selector follows the default concrete Isaac Sim PhysX backend."""
def test_renderer_selector_rtx_with_default_newton_resolves_to_isaac_sim_backends():
"""The RTX selector retains the default Newton physics while requiring Isaac Sim."""
env_cfg = _resolve_with_args("renderer=rtx")
config_scan = _resolve_runtime_renderer(env_cfg)

assert isinstance(env_cfg.sim.physics, PhysxCfg)
assert isinstance(env_cfg.tiled_camera.renderer_cfg, IsaacRtxRendererCfg)
assert config_scan.needs_kit is True
assert isinstance(env_cfg.sim.physics, NewtonCfg)
assert isinstance(env_cfg.tiled_camera.renderer_cfg, OVRTXRendererCfg)
assert config_scan.needs_kit is False


def test_renderer_selector_physx_rtx_resolves_to_ovphysx_without_kit():
Expand Down Expand Up @@ -227,20 +229,20 @@ def test_preset_mjwarp_newton_renderer_does_not_need_kit():
assert needs_kit is False


def test_preset_physx_with_default_kit_camera_resolves_to_physx():
"""Automatic PhysX resolves to Isaac Sim PhysX when the default camera requires Kit."""
def test_preset_physx_with_default_newton_camera_resolves_to_ovphysx():
"""Automatic PhysX resolves to OvPhysX when the default camera is kitless."""
env_cfg = _resolve_with_presets("physx")
config_scan = scan(env_cfg)

assert isinstance(env_cfg.sim.physics, PhysxCfg)
assert config_scan.needs_kit is True
assert isinstance(env_cfg.sim.physics, OvPhysxCfg)
assert config_scan.needs_kit is False


def test_preset_default_needs_kit():
"""Default concrete Isaac Sim PhysX plus Isaac RTX requires Kit."""
def test_preset_default_is_kitless():
"""Default Newton MJWarp plus Newton renderer does not require Kit."""
env_cfg = _resolve_with_presets("default")
needs_kit = scan(env_cfg).needs_kit
assert needs_kit is True
assert needs_kit is False


def test_preset_mjwarp_isaac_rtx_needs_kit():
Expand Down
2 changes: 1 addition & 1 deletion source/isaaclab_tasks/test/core/test_record_video.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ def setup_video_params():
return num_envs, device, video_length


@pytest.mark.parametrize("task_name", setup_environment(include_play=True, tier="core"))
@pytest.mark.parametrize("task_name", setup_environment(tier="core"))
def test_record_video(task_name, setup_video_params):
"""Run random actions agent with internal VideoRecorder capturing from the active visualizer."""
num_envs, device, video_length = setup_video_params
Expand Down
22 changes: 12 additions & 10 deletions source/isaaclab_tasks/test/core/test_runtime_compatibility.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import sys

import pytest
from isaaclab_newton.physics import NewtonCfg
from isaaclab_ov.physics import OvPhysxCfg
from isaaclab_ov.renderers import OVRTXRendererCfg
from isaaclab_physx.physics import PhysxCfg
Expand Down Expand Up @@ -226,13 +227,14 @@ def test_newton_plus_ovrtx_is_valid():
validate_runtime_compatibility(env_cfg)


def test_default_isaacsim_physx_plus_ovrtx_raises():
"""The concrete default Isaac Sim PhysX backend is incompatible with OVRTX."""
def test_default_newton_plus_ovrtx_is_valid():
"""The default Newton backend is compatible with OVRTX."""
env_cfg = _resolve_with_presets("ovrtx")

assert isinstance(env_cfg.sim.physics, PhysxCfg)
with pytest.raises(ValueError, match="PhysxCfg"):
validate_runtime_compatibility(env_cfg)
assert isinstance(env_cfg.sim.physics, NewtonCfg)
config_scan = validate_runtime_compatibility(env_cfg)
assert isinstance(env_cfg.tiled_camera.renderer_cfg, OVRTXRendererCfg)
assert config_scan.needs_kit is False


def test_explicit_auto_physx_plus_ovrtx_resolves_to_ovphysx():
Expand Down Expand Up @@ -302,14 +304,14 @@ def test_default_preset_is_valid():
validate_runtime_compatibility(env_cfg)


def test_rtx_with_default_physx_is_valid_and_resolves_to_isaac_sim_backends():
"""The RTX selector follows the default concrete Isaac Sim PhysX backend."""
def test_rtx_with_default_newton_is_valid_and_resolves_to_isaac_sim_backends():
"""The RTX selector retains default Newton physics and requires Isaac Sim."""
env_cfg = _resolve_with_presets("rtx")
config_scan = validate_runtime_compatibility(env_cfg)

assert isinstance(env_cfg.sim.physics, PhysxCfg)
assert isinstance(env_cfg.tiled_camera.renderer_cfg, IsaacRtxRendererCfg)
assert config_scan.needs_kit is True
assert isinstance(env_cfg.sim.physics, NewtonCfg)
assert isinstance(env_cfg.tiled_camera.renderer_cfg, OVRTXRendererCfg)
assert config_scan.needs_kit is False


def test_renderer_selector_physx_rtx_is_valid_and_resolves_to_ovphysx_and_ovrtx():
Expand Down
Loading
Loading