Skip to content

Updates deprecated extensions in Isaac Sim#5293

Merged
kellyguo11 merged 35 commits into
isaac-sim:developfrom
kellyguo11:fix/prebundle-and-deprecation
Apr 26, 2026
Merged

Updates deprecated extensions in Isaac Sim#5293
kellyguo11 merged 35 commits into
isaac-sim:developfrom
kellyguo11:fix/prebundle-and-deprecation

Conversation

@kellyguo11
Copy link
Copy Markdown
Contributor

@kellyguo11 kellyguo11 commented Apr 16, 2026

Description

Migrates Isaac Lab off deprecated Isaac Sim API surfaces in preparation for their removal in a future Isaac Sim release. This PR is intentionally scoped to the API migration only — installation, prebundle, and extension-exclusion fixes are tracked separately on kellyg/fix-installation.

What changes

Kit experience (apps/*.kit):

  • Stopped registering deprecated Isaac Sim extension search paths (extsDeprecated) in Isaac Lab Kit experiences (headless, rendering, XR variants).
  • Switched explicit Isaac Sim extension dependencies to their non-deprecated equivalents:
    • isaacsim.core.*isaacsim.core.experimental.*
    • isaacsim.robot.wheeled_robotsisaacsim.robot.experimental.wheeled_robots (+ isaacsim.robot.wheeled_robots.nodes for OmniGraph nodes)
    • isaacsim.sensors.*isaacsim.sensors.experimental.*
  • Removed unused Isaac Sim extensions that pulled in isaacsim.core.api.
  • Migrated isaacsim.core.cloner usage to the in-tree Lab cloner.

Python source migrations (across isaaclab, isaaclab_physx, isaaclab_tasks, isaaclab_teleop, isaaclab_visualizers, isaaclab_mimic):

  • Migrated remaining imports off deprecated isaacsim.core.utils.* / prim Python paths to isaacsim.core.experimental.* replacements (controllers, env mdp events, sim utils/converters, terrain importer, RMP flow, etc.).
  • Updated Kit perspective capture helpers to use isaacsim.core.rendering_manager.
  • Updated optional-extension enablement (e.g. enable_extension) to use isaacsim.core.experimental.utils.app.
  • Updated XR anchor utilities to use isaacsim.core.experimental.prims / isaacsim.core.experimental.utils.
  • Updated mobility-gen path utilities (isaaclab_mimic) to import from isaacsim.replicator.experimental.mobility_gen.
  • Migrated kit_visualizer.py from isaacsim.core.utils.viewports.set_camera_view to omni.kit.viewport.utility.camera_state.ViewportCameraState.

SimulationManager decoupling:

  • Migrated the PhysX scene data provider, PhysX asset micro-benchmarks, and cross-backend asset interface tests off isaacsim.core.simulation_manager.SimulationManager. They now import isaaclab_physx.physics.PhysxManager aliased as SimulationManager, mirroring the Newton backend's NewtonManager as SimulationManager convention. No new public alias is exported from isaaclab_physx.physics.

Test deps cleanup:

  • Retired several source/isaaclab/test/deps/isaacsim standalone reproducers that depended on deprecated Isaac Sim core extensions (check_camera.py, check_floating_base_made_fixed.py, check_legged_robot_clone.py, check_rep_texture_randomizer.py, check_ref_count.py). Use isaaclab.sim and isaacsim.core.experimental.* for similar debugging workflows.

Docs:

  • Updated tutorials, sensor docs, migration guide, release notes, and verification snippets to reference the non-deprecated APIs.

Motivation

Isaac Sim has marked isaacsim.core.*, isaacsim.sensors.*, and isaacsim.robot.wheeled_robots modules as deprecated, with isaacsim.core.experimental.* as the supported replacement. Without this migration, Isaac Lab will break when those modules are removed and currently emits deprecation warnings on every launch. Splitting the migration off from the installation/prebundle work keeps each PR small and reviewable.

Fixes # (issue)

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (existing functionality will not work without user modification) — only for users that imported deprecated Isaac Sim symbols re-exported through Isaac Lab Kit experiences; user-facing Isaac Lab Python APIs are unchanged.
  • Documentation update

Screenshots

N/A — no UI changes.

Checklist

  • I have read and understood the contribution guidelines
  • I have run the pre-commit checks 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
    • isaaclab 4.6.10 → 4.6.11
    • isaaclab_physx 0.5.20 → 0.5.21
    • isaaclab_tasks 1.5.23 → 1.5.24
    • isaaclab_teleop 0.3.6 → 0.3.7
    • isaaclab_mimic 1.2.4 → 1.2.5
  • I have added my name to the CONTRIBUTORS.md or my name already exists there

@kellyguo11 kellyguo11 marked this pull request as draft April 16, 2026 16:15
@github-actions github-actions Bot added bug Something isn't working documentation Improvements or additions to documentation isaac-sim Related to Isaac Sim team isaac-mimic Related to Isaac Mimic team infrastructure labels Apr 16, 2026
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 16, 2026

Greptile Summary

This PR migrates Isaac Lab off deprecated isaacsim.core.*, isaacsim.sensors.*, and isaacsim.robot.wheeled_robots APIs onto their isaacsim.core.experimental.* replacements, removes deprecated extsDeprecated search paths from all Kit experiences, decouples benchmarks and tests from isaacsim.core.simulation_manager.SimulationManager, and replaces all GridCloner usages with the in-tree isaaclab.cloner utilities. The change set is large but mechanical — most files are straightforward symbol renames with no logic changes.

Confidence Score: 5/5

Safe to merge — all findings are P2 cleanup items that do not affect runtime correctness.

The migration is a broad but mechanical API rename. No P0/P1 issues were found. The two flagged items are both P2: a redundant enable_extension call that became dead code after an import was hoisted, and an unused helper function left behind after its call site was refactored. Neither affects simulation behaviour.

scripts/benchmarks/benchmark_xform_prim_view.py (enable_extension ordering) and source/isaaclab/test/terrains/test_terrain_importer.py (dead helper function).

Important Files Changed

Filename Overview
apps/isaaclab.python.kit Migrates Kit experience dependencies from deprecated isaacsim.core.api/utils to isaacsim.core.experimental.*; removes deprecated extsDeprecated search paths; upgrades sensor/robot extensions to experimental variants.
scripts/benchmarks/benchmark_xform_prim_view.py Drops legacy XFormPrim import; consolidates isaacsim-usd, isaacsim-fabric, and isaacsim-exp CLI modes onto the single experimental API — but enable_extension is now called after the top-level import it was meant to guard.
source/isaaclab_teleop/isaaclab_teleop/xr_anchor_manager.py Replaces SingleXFormPrim with XformPrim (experimental); adapts positional/orientation args to batch shape [1,3]/[1,4] per the new API contract.
source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer.py Replaces isaacsim.core.utils.viewports.set_camera_view with omni.kit.viewport.utility.camera_state.ViewportCameraState; early-returns cleanly when _viewport_api is None.
source/isaaclab_physx/isaaclab_physx/video_recording/isaacsim_kit_perspective_video.py Replaces isaacsim.core.utils.viewports.set_camera_view with ViewportManager.set_camera_view; argument order and keyword names updated to match new API.
source/isaaclab_physx/isaaclab_physx/scene_data_providers/physx_scene_data_provider.py Decouples from isaacsim.core.simulation_manager.SimulationManager; now imports PhysxManager as SimulationManager from the in-tree isaaclab_physx.physics module.
source/isaaclab/test/sim/test_urdf_converter.py Rewrites test_config_drive_type and test_target_type_none_zeros_gains to validate DriveAPI values directly from the USD stage instead of going through isaacsim.core.prims.Articulation + PhysX sim, removing the deprecated dependency entirely.
source/isaaclab/test/terrains/test_terrain_importer.py Migrates GridCloner usages to isaaclab.cloner; leaves _obtain_grid_cloner_env_origins as dead code after its call site was replaced inline.
source/isaaclab/test/sim/test_simulation_stage_in_memory.py Replaces isaacsim.core.cloner.GridCloner with isaaclab.cloner.usd_replicate + grid_transforms for the in-memory stage clone test.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Kit Experience *.kit] -->|was| B[isaacsim.core.api\nisaacsim.core.utils\nisaacsim.core.cloner\nextsDeprecated paths]
    A -->|now| C[isaacsim.core.experimental.*\nisaacsim.core.simulation_manager\nisaacsim.core.rendering_manager]

    D[Python Source] -->|was| E[isaacsim.core.utils.extensions.enable_extension\nisaacsim.core.utils.viewports.set_camera_view\nisaacsim.core.simulation_manager.SimulationManager\nisaacsim.core.cloner.GridCloner\nisaacsim.core.prims.SingleXFormPrim]
    D -->|now| F[isaacsim.core.experimental.utils.app.enable_extension\nomni.kit.viewport.utility.camera_state.ViewportCameraState\nisaacsim.core.rendering_manager.ViewportManager\nisaaclab_physx.physics.PhysxManager\nisaaclab.cloner.usd_replicate\nisaacsim.core.experimental.prims.XformPrim]
Loading

Reviews (2): Last reviewed commit: "fix urdf importer tests" | Re-trigger Greptile

Comment on lines +12 to +30
def _deprioritize_prebundle_paths():
"""Move Isaac Sim ``pip_prebundle`` directories to the end of ``sys.path``.

Isaac Sim's ``setup_python_env.sh`` injects ``pip_prebundle`` directories
(e.g. ``omni.isaac.ml_archive/pip_prebundle``) onto ``PYTHONPATH``. These
contain older copies of packages like torch, warp, and nvidia-cudnn that
shadow the versions installed by Isaac Lab, causing CUDA runtime errors.

Rather than removing these paths entirely (which would break packages like
``sympy`` that only exist in the prebundle), this function moves them to
the **end** of ``sys.path`` so that pip-installed packages in
``site-packages`` take priority.

The ``PYTHONPATH`` environment variable is also rewritten so that child
processes inherit the corrected ordering.
"""
# Extensions whose prebundled packages conflict with Isaac Lab deps.
_CONFLICTING_EXTS = (
"omni.isaac.ml_archive",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Docstring example out-of-date after adding isaacsim.pip.newton

The docstring example still references only omni.isaac.ml_archive/pip_prebundle, but _CONFLICTING_EXTS now also targets isaacsim.pip.newton. The inline comment and example path should mention both extension names so future readers understand the full scope of what is being deprioritised.

@kellyguo11 kellyguo11 force-pushed the fix/prebundle-and-deprecation branch from d85dc00 to 0d3a539 Compare April 16, 2026 16:37
@AntoineRichard
Copy link
Copy Markdown
Collaborator

@kellyguo11 closing this at it looks like a mistake?

Copy link
Copy Markdown

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Choose a reason for hiding this comment

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

🤖 Isaac Lab Review Bot

Summary

This PR migrates Isaac Lab off deprecated Isaac Sim core extension paths (isaacsim.core.*, isaacsim.sensors.*, isaacsim.robot.*) to their isaacsim.core.experimental.* equivalents, and fixes prebundle path conflicts where Isaac Sim's pip_prebundle directories shadow pip-installed packages (torch, warp, nvidia-cudnn). The approach is well-structured: Kit files drop deprecated extension search paths, Python imports are updated consistently, and a new _deprioritize_prebundle_paths() function in isaaclab/__init__.py handles the sys.path ordering at import time.

Design Assessment

Design is sound. The two-pronged strategy is correct:

  1. Kit-level: Removing deprecated extension search paths and excluding conflicting prebundle extensions (omni.isaac.ml_archive, isaacsim.pip.newton, omni.warp.core) from loading prevents Kit from injecting stale packages.
  2. Python-level: _deprioritize_prebundle_paths() demotes (rather than removes) prebundle paths on sys.path, preserving access to prebundle-only packages like sympy while ensuring pip-installed packages take priority. This is a pragmatic choice that avoids breaking edge cases.

The SimulationManager = PhysxManager alias in isaaclab_physx.physics is a clean abstraction that decouples Isaac Lab code from isaacsim.core.simulation_manager without changing any runtime behavior.

Findings

🟡 Warning: Stale blank lines in isaaclab.python.headless.kitapps/isaaclab.python.headless.kit:191-192

After removing four [dependencies] entries (isaacsim.simulation_app, isaacsim.core.api, isaacsim.core.cloner, isaacsim.core.utils), two empty lines remain before "isaacsim.core.version". The other Kit files don't have this artifact.

[dependencies]
"isaacsim.core.version" = {}

🟡 Warning: XformPrim constructor API change in xr_anchor_manager.pysource/isaaclab_teleop/isaaclab_teleop/xr_anchor_manager.py:88

The migration from SingleXFormPrim(path, position=..., orientation=...) to XformPrim(path, positions=..., orientations=...) correctly reshapes to batched (1, 3) / (1, 4) arrays. However, the old SingleXFormPrim would create the prim if it didn't exist, while the experimental XformPrim may behave differently (it wraps existing prims). Verify that XformPrim with positions= and orientations= constructor args still creates the USD prim at the given path, or add an explicit prim_utils.create_prim() call before instantiation.

🔵 Suggestion: _deprioritize_prebundle_paths() lacks a testsource/isaaclab/isaaclab/__init__.py:12-57

The new _deprioritize_prebundle_paths() function is a critical piece of the fix—it runs at isaaclab import time and modifies both sys.path and os.environ["PYTHONPATH"]. While the _torch_first_on_sys_path_is_prebundle probe and the install commands have thorough test coverage (786-line test_install_commands.py), the _deprioritize_prebundle_paths() function itself has no unit tests. A focused test that sets up sys.path with prebundle entries and verifies the reordering would add confidence, especially for edge cases like:

  • No prebundle paths (no-op)
  • All paths are prebundle
  • PYTHONPATH not set

🔵 Suggestion: Consistent camera API across filessource/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer.py:320-331

The kit_visualizer.py migrates from isaacsim.core.utils.viewports.set_camera_view() to the lower-level ViewportCameraState API (set_position_world + set_target_world), while isaacsim_kit_perspective_video.py and check_pva_sensor.py use the higher-level ViewportManager.set_camera_view(). Both work, but using the same ViewportManager API consistently would reduce maintenance surface. The ViewportCameraState approach requires two separate calls and manual Gf.Vec3d construction.

Test Coverage

This PR includes strong test coverage for the new install logic:

  • test_install_commands.py (786 lines): Comprehensive tests covering _torch_first_on_sys_path_is_prebundle, _maybe_uninstall_prebundled_torch, _ensure_cuda_torch across x86/ARM architectures and environment types (uv, pip, conda, kit), and _repoint_prebundle_packages with extensive edge cases (idempotency, stale symlinks, Windows copy fallback, nvidia namespace handling, error recovery).
  • test_install_prebundle.py (81 lines): Tests for _split_install_items and probe script content verification.

Gaps:

  • No unit test for _deprioritize_prebundle_paths() (runs at import time, modifies sys.path)
  • The Kit file changes and import migrations are structural and primarily validated by CI integration tests, which is appropriate

Verdict:

  • Bug fix PR: Has regression tests — Yes (the prebundle probe and torch-uninstall logic are well-tested)
  • Test quality: Good — tests use proper mocking, cover edge cases, and verify error recovery

CI Status

Only the labeler check has completed (passed). No integration or build checks have run yet. The PR unpins the Docker image from a specific SHA to latest-develop, so CI results will be important to verify the prebundle fixes work against the current nightly.

Verdict

Minor fixes needed

Solid, well-structured migration that addresses a real and painful prebundle shadowing problem. The approach of demoting rather than removing prebundle paths is pragmatic. The test coverage for the install logic is excellent. Two items to verify: (1) the XformPrim constructor behavior for prim creation in the teleop anchor manager, and (2) the cosmetic blank lines in the headless Kit file. Overall this is ready to ship with minor polish.

@kellyguo11 kellyguo11 force-pushed the fix/prebundle-and-deprecation branch 2 times, most recently from f7a6ab5 to 0636bb8 Compare April 17, 2026 02:23
Copy link
Copy Markdown

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Choose a reason for hiding this comment

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

🤖 Isaac Lab Review Bot — Follow-up

New commits (ae98069→1b37be8): removes omni.warp.core from extension exclusions in non-headless kit files and migrates all remaining isaacsim.core.cloner.GridCloner usages in tests to isaaclab.cloner utilities. Two new issues noted below.

Comment thread apps/isaaclab.python.headless.kit
# return as tensor
return torch.tensor(env_origins, dtype=torch.float32, device=device)
lab_cloner.usd_replicate(stage, [env_fmt.format(0)], [env_fmt], env_ids, positions=env_origins)
return env_origins
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔵 Dead code: _obtain_grid_cloner_env_origins is now unused

test_grid_clone_env_origins was refactored to call lab_cloner.grid_transforms directly (line 53), so this helper function is no longer called anywhere. It can be removed to avoid confusion.

@kellyguo11 kellyguo11 force-pushed the fix/prebundle-and-deprecation branch 2 times, most recently from ba7a70a to 5c7ea45 Compare April 17, 2026 17:32
@kellyguo11 kellyguo11 moved this to In progress in Isaac Lab Apr 17, 2026
kellyguo11 and others added 5 commits April 22, 2026 11:24
Switch Kit experience files, Python imports, and test helpers from
deprecated isaacsim.core.* / isaacsim.sensors.* / isaacsim.robot.*
module paths to their isaacsim.core.experimental.* equivalents:

- Remove deprecated extsDeprecated extension search paths from all
  Kit experience files (.kit)
- Migrate Python imports across isaaclab, isaaclab_physx, isaaclab_tasks,
  isaaclab_teleop, isaaclab_mimic, and isaaclab_visualizers to
  isaacsim.core.experimental.utils.app, isaacsim.core.experimental.prims,
  isaacsim.core.experimental.utils.stage, etc.
- Expose SimulationManager as a public alias of PhysxManager in
  isaaclab_physx.physics so callers avoid the deprecated
  isaacsim.core.simulation_manager import
- Retire standalone reproducers in test/deps/isaacsim that depended on
  deprecated Isaac Sim core extensions
- Update benchmark scripts and docs to reflect the new API paths
Remove deprecated extsDeprecated extension search paths from all Isaac
Lab Kit experience files; these belong with the API migration work.
…ation

The deprecation migration commit removed isaacsim.core.api, cloner, utils,
and simulation_app from the headless kit's [dependencies] without adding
the experimental replacements. This caused 'isaacsim.core.api: (none found)'
errors during pytest collection in CI.

Replace the removed deps with their experimental equivalents, matching
the non-headless kit (isaaclab.python.kit). The headless.rendering and
rendering kits inherit from these base kits, so they get the fix
automatically.
…on-headless kits

Replace all isaacsim.core.cloner.GridCloner usage with Isaac Lab's own
cloner utilities (grid_transforms, usd_replicate, filter_collisions).
This removes the dependency on isaacsim.core.api for cloning, which was
failing in CI because isaacsim.core.api depends on omni.warp.core.

Remove omni.warp.core from the exclusion list in non-headless kit files
(isaaclab.python.kit, rendering.kit, xr.openxr.kit) since the extension
dependency chain requires it: isaacsim.robot.manipulators -> isaacsim.core.api
-> omni.warp.core. The path sanitization in __init__.py + app_launcher.py
ensures pip-installed warp-lang still takes priority at the Python level.

Headless kit files keep omni.warp.core excluded (no dependency chain issue).

Files migrated:
- test_operational_space.py
- test_differential_ik.py
- test_simulation_stage_in_memory.py
- test_terrain_importer.py
- check_pva_sensor.py, check_contact_sensor.py
- check_ray_caster.py, check_multi_mesh_ray_caster.py
- check_terrain_importer.py
Remove isaacsim.gui.menu, isaacsim.robot.manipulators, and
isaacsim.sensors.physx from the non-headless kit. None are imported by
Isaac Lab code, and their transitive dependency on isaacsim.core.api
pulls in omni.pip.compute -> omni.kit.pip_archive which conflicts with
our prebundle archive exclusions.

Removing the source extensions is cleaner than un-excluding the archives:
the prebundle exclusions stay intact, and we don't load extensions Isaac
Lab doesn't need.

Restore omni.kit.pip_archive and omni.isaac.ml_archive exclusions in all
three non-headless kit files (rendering, xr.openxr).
Copy link
Copy Markdown

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Choose a reason for hiding this comment

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

🤖 Isaac Lab Review Bot

Summary

This PR migrates Isaac Lab off deprecated Isaac Sim API surfaces (isaacsim.core.*, isaacsim.sensors.*, isaacsim.robot.wheeled_robots) to their isaacsim.core.experimental.* replacements. The changes are extensive (68 files) but largely mechanical: import path updates, Kit experience dependency swaps, and replacing GridCloner usage with Isaac Lab's in-tree cloner utilities. The migration is well-documented and the architectural direction is sound.

Architecture Impact

  • Kit experiences (apps/*.kit): Removed deprecated extension search paths and switched to non-deprecated extension IDs. Users with custom Kit experiences derived from these will need to mirror these changes.
  • SimulationManager decoupling: Tests and benchmarks now import PhysxManager as SimulationManager from isaaclab_physx.physics instead of isaacsim.core.simulation_manager. This creates a clean pattern for backend-agnostic code.
  • Cloner migration: All tests migrated from isaacsim.core.cloner.GridCloner to isaaclab.cloner utilities (grid_transforms, usd_replicate, filter_collisions).
  • Retired test reproducers: Several standalone debug scripts under test/deps/isaacsim/ now raise RuntimeError at import time, directing users to the new APIs.

Implementation Verdict

Minor fixes needed — The migration is correct and well-executed, but there are a few issues that should be addressed.

Test Coverage

The PR updates tests to use the new APIs (good), but relies on existing test coverage rather than adding new regression tests for the migration itself. This is acceptable since the migration is largely mechanical import updates. The retired reproducers are appropriately documented with clear error messages.

CI Status

  • pre-commit: ✅ passed
  • Build Wheel: ✅ passed
  • Check for Broken Links: ✅ passed
  • Several jobs still pending (Installation Tests, license-check, Build Latest Docs)

Findings

🟡 Warning: source/isaaclab_tasks/test/test_rendering_correctness.py:842-860 — Test fixture inlining loses isolation guarantees

The refactoring of dexsuite_kuka_allegro_lift_env from a fixture to inline code is well-intentioned (to make @pytest.mark.flaky work properly), but the try/finally pattern doesn't guarantee env.close() runs if ManagerBasedRLEnv(env_cfg) itself raises. The comment is correct about the flaky behavior, but consider using a context manager pattern:

env = ManagerBasedRLEnv(env_cfg)
try:
    # ... test code ...
finally:
    env.close()

The current code has env = None before the try, which is correct, but the actual env = ManagerBasedRLEnv(...) is inside the try block. This is fine, but a note: if _maybe_save_stage or _validate_camera_outputs raises before env.close(), resources will still be cleaned up properly since env will be non-None. The pattern is actually correct.

🟡 Warning: source/isaaclab_teleop/isaaclab_teleop/xr_anchor_manager.py:84-87 — API change may break XR anchor behavior

The migration from SingleXFormPrim to XformPrim changes the API signature:

  • Old: SingleXFormPrim(..., position=..., orientation=...)
  • New: XformPrim(..., positions=pos.reshape(1,3), orientations=quat_wxyz.reshape(1,4))

The new XformPrim from isaacsim.core.experimental.prims expects batch inputs (note the plural positions/orientations). Verify that the prim is actually created at self._xr_anchor_headset_path and not at a batched path. The experimental API may have different semantics.

🔵 Improvement: source/isaaclab/test/terrains/test_terrain_importer.py:243-249 — Dead code in _obtain_grid_cloner_env_origins

The function _obtain_grid_cloner_env_origins is still defined but is no longer called anywhere in the test file. The test test_grid_clone_env_origins was updated to use lab_cloner.grid_transforms directly instead of calling this helper. This function should be removed:

# This entire function is now dead code and can be deleted
def _obtain_grid_cloner_env_origins(num_envs: int, env_spacing: float, stage: Usd.Stage, device: str) -> torch.Tensor:

🟡 Warning: source/isaaclab/test/deps/isaacsim/check_ref_count.py:88 — Changed Articulation API usage

The migration changes from Isaac Sim's Articulation(path, name="ANYMAL") to isaacsim.core.experimental.prims.Articulation(path). The new API drops the name parameter. Verify that the experimental Articulation API doesn't require the name parameter and that removing initialize() call (line 127 in old code, removed in new) doesn't affect the test's purpose of checking reference counts.

🔵 Improvement: source/isaaclab/isaaclab/cloner/cloner_cfg.py:37 — Docstring example uses correct API

Good catch updating the docstring example to use from isaaclab.sim.utils.stage import get_current_stage instead of isaacsim.core.experimental.utils.stage. This aligns with Isaac Lab's public API preference.

🟡 Warning: apps/isaaclab.python.headless.kit:193-194 — Significant dependency reduction

The headless kit experience now only declares:

"isaacsim.simulation_app" = {}
"isaacsim.core.simulation_manager" = {}
"isaacsim.core.version" = {}

Where before it also included isaacsim.core.api, isaacsim.core.cloner, and isaacsim.core.utils. This is correct for the migration, but ensure that transitive dependencies still load properly. The isaacsim.core.simulation_manager extension should pull in necessary experimental APIs.

🔵 Improvement: source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer.py:343-354 — Clean camera state migration

The migration from isaacsim.core.utils.viewports.set_camera_view to omni.kit.viewport.utility.camera_state.ViewportCameraState is well-implemented. The code correctly handles the case where viewport_api is None and falls back to the default perspective camera.

🟡 Warning: source/isaaclab_teleop/config/extension.toml:4 — Version jump inconsistency

The version jumps from 0.3.6 to 0.3.8, skipping 0.3.7. The changelog has entries for both 0.3.7 and 0.3.8, which is correct, but typically a single PR should only bump one minor/patch version. Consider whether this is intentional (consolidating two separate changes).

Copy link
Copy Markdown

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Choose a reason for hiding this comment

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

🤖 Isaac Lab Review Bot

Summary

This PR migrates Isaac Lab off deprecated Isaac Sim API surfaces (isaacsim.core.*, isaacsim.sensors.*, isaacsim.robot.wheeled_robots) to their isaacsim.core.experimental.* equivalents. The migration is comprehensive, touching 68 files across Kit experiences, Python sources, tests, and documentation. The changes are mechanically straightforward — mostly import path updates — but the scope is large enough that careful validation is warranted.

Architecture Impact

This is a significant cross-cutting change affecting:

  • Kit experiences: All .kit files now exclude deprecated extension search paths and depend on non-deprecated extensions
  • Core framework: isaaclab.sim, isaaclab.controllers, isaaclab.envs.mdp now import from experimental paths
  • Test infrastructure: Interface tests, benchmarks, and check scripts migrated to use PhysxManager instead of SimulationManager
  • Multiple extensions: isaaclab_physx, isaaclab_tasks, isaaclab_teleop, isaaclab_mimic, isaaclab_visualizers

The pattern of importing PhysxManager as SimulationManager for backend symmetry is sound and well-documented in the migration guide.

Implementation Verdict

Minor fixes needed — One API change appears incorrect, and there are a few documentation inconsistencies.

Test Coverage

The retired standalone reproducers (check_camera.py, check_floating_base_made_fixed.py, check_legged_robot_clone.py, check_rep_texture_randomizer.py) now raise RuntimeError immediately, which is appropriate for deprecation. The migration of cloner usage in tests from GridCloner to Isaac Lab's in-tree lab_cloner utilities is consistent. However, no new tests were added to verify the migrated import paths work correctly — this is acceptable given CI should catch import failures.

CI Status

Most checks are pending/skipped. Pre-commit passed, wheel builds succeeded. Full validation awaits Installation Tests and Doc builds.

Findings

🔴 Critical: source/isaaclab_teleop/isaaclab_teleop/xr_anchor_manager.py:88-90 — Incorrect API usage for XformPrim

The migration from SingleXFormPrim to isaacsim.core.experimental.prims.XformPrim appears to change the constructor signature incorrectly. The old SingleXFormPrim accepted position (1D) and orientation (1D), but the new code passes positions (2D with shape (1,3)) and orientations (2D with shape (1,4)). Looking at the experimental API, XformPrim likely expects different initialization — typically it wraps an existing prim path and you set poses via methods, not constructor args. Verify this actually works at runtime.

# Old code (conceptual):
SingleXFormPrim(path, position=np.array([x,y,z]), orientation=np.array([w,x,y,z]))

# New code:
pos = np.asarray(...).reshape(1, 3)  # 2D
quat_wxyz = np.asarray(...).reshape(1, 4)  # 2D
SingleXFormPrim(path, positions=pos, orientations=quat_wxyz)

This needs validation that XformPrim accepts positions/orientations kwargs at construction.

🟡 Warning: source/isaaclab_teleop/config/extension.toml:4 — Version jump from 0.3.6 to 0.3.8

The extension.toml shows version 0.3.8, but the CHANGELOG only documents up to 0.3.8 with an entry for 0.3.7. However, the PR description states the target version is 0.3.7. This inconsistency should be resolved — either the TOML should be 0.3.7 or there's a missing intermediate release.

🟡 Warning: source/isaaclab/test/terrains/test_terrain_importer.py:240-245 — Dead helper function

The function _obtain_grid_cloner_env_origins is defined but never called after the migration. The test test_grid_clone_env_origins now uses lab_cloner.grid_transforms directly (lines 50-51). This helper should be removed as dead code.

def _obtain_grid_cloner_env_origins(num_envs: int, env_spacing: float, stage: Usd.Stage, device: str) -> torch.Tensor:
    """Obtain the env origins generated by Lab's grid_transforms."""
    # ... this entire function is now unused

🟡 Warning: apps/isaaclab.python.kit:17-32 — Missing isaacsim.gui.menu dependency

The diff shows removal of "isaacsim.gui.menu" = {} from dependencies. If this was intentionally removed because it pulled in deprecated APIs, that's fine. But if it was accidental, the GUI menu functionality may be missing. Verify this was intentional.

🔵 Improvement: source/isaaclab/docs/CHANGELOG.rst:16-17 — Changelog entry references wrong migration section

The changelog entry says "see :ref:migrating-to-isaaclab-3-0" with a different anchor format than what's used elsewhere in the documentation. The migration guide section added is titled "Migration off Deprecated Isaac Sim APIs" and should have a consistent ref target. The actual RST anchor should be verified to match.

🔵 Improvement: source/isaaclab_tasks/test/env_test_utils.py:29 — Removed xfail without explanation

The XFAIL_TASKS dict was emptied, removing the xfail for Isaac-Cartpole-RGB-TheiaTiny-v0. The PR description doesn't mention fixing the TheiaTiny environment. Either this was fixed as a side effect of the migration (if so, good!), or this removal is premature. Verify TheiaTiny tests pass in CI.

🔵 Improvement: docs/source/migration/migrating_to_isaaclab_3-0.rst:1731-1737 — Docstring inconsistency in cloner example

The migration guide states to use isaaclab.sim.utils.stage.get_current_stage, but the docstring example in source/isaaclab/isaaclab/cloner/cloner_cfg.py:37 already shows the correct import. Good that it's consistent, but the migration guide table at line 1715 lists isaacsim.core.utils.stageisaaclab.sim.utils.stage which is correct. No action needed, just noting the alignment is good.

🔵 Improvement: source/isaaclab_tasks/test/test_rendering_correctness.py:812-846 — Test refactored to inline fixture

The test_dexsuite_kuka_allegro_lift test was refactored to inline the fixture setup (with good justification in the docstring about @pytest.mark.flaky behavior). However, the dexsuite_kuka_allegro_lift_env fixture (which would have been parameterized) is now gone. This is correct — just noting the pattern change is intentional for flaky test support.

The function was no longer called after test_grid_clone_env_origins was
updated to call lab_cloner.grid_transforms directly. Remove it and drop
the now-unused Usd import.

Made-with: Cursor
Resolves conflict in source/isaaclab_tasks/docs/CHANGELOG.rst: merge
both 1.5.25 entries (enable_extension migration + golden images LFS)
under a single heading dated 2026-04-25.

Made-with: Cursor
Copy link
Copy Markdown

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Choose a reason for hiding this comment

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

🤖 Isaac Lab Review Bot

Summary

This PR migrates Isaac Lab off deprecated Isaac Sim API surfaces (isaacsim.core.*, isaacsim.sensors.*, isaacsim.robot.wheeled_robots) to their isaacsim.core.experimental.* equivalents. The changes are extensive across Kit experiences, Python modules, and tests. The migration is technically correct but introduces one subtle behavioral change in the XR anchor manager that warrants attention.

Architecture Impact

Cross-module impact is significant but well-contained:

  • Kit experiences (.kit files) now exclude deprecated extension search paths and depend on experimental equivalents
  • SimulationManager imports throughout benchmarks/tests now use isaaclab_physx.physics.PhysxManager aliased as SimulationManager
  • Cloner usage migrated from isaacsim.core.cloner.GridCloner to in-tree isaaclab.cloner utilities
  • XR anchor utilities switched from SingleXFormPrim to XformPrim with different API semantics
  • Camera view setting migrated from isaacsim.core.utils.viewports.set_camera_view to ViewportCameraState or ViewportManager.set_camera_view

The retired test reproducers (check_camera.py, check_floating_base_made_fixed.py, etc.) are replaced with raise RuntimeError stubs, which is an appropriate deprecation pattern.

Implementation Verdict

Minor fixes needed — One API mismatch in the XR anchor manager needs correction before merge.

Test Coverage

  • The PR removes 5 standalone reproducers that depended on deprecated APIs, replacing them with stubs that raise RuntimeError. This is acceptable as these were debugging scripts, not automated tests.
  • Existing tests (test_differential_ik.py, test_operational_space.py, test_terrain_importer.py, etc.) are updated to use the in-tree cloner, maintaining coverage.
  • The test_rendering_correctness.py refactoring of test_dexsuite_kuka_allegro_lift to inline the fixture is a good pattern for @pytest.mark.flaky effectiveness.
  • No new regression tests added for the API migration itself, but this is acceptable given the nature of the change (import path swaps).

CI Status

Several CI jobs are still pending (Installation Tests, license-check, Build Latest Docs). Core checks (pre-commit, Build Wheel, Check for Broken Links) have passed.

Findings

🔴 Critical: source/isaaclab_teleop/isaaclab_teleop/xr_anchor_manager.py:86-88 — XformPrim API mismatch

The migration from SingleXFormPrim to XformPrim incorrectly assumes the new API accepts positions and orientations as constructor kwargs. Looking at the code:

_ = SingleXFormPrim(self._xr_anchor_headset_path, positions=pos, orientations=quat_wxyz)

However, isaacsim.core.experimental.prims.XformPrim is a batched view class that takes a prim_path regex and reads existing prims, not a spawner. The old SingleXFormPrim was a convenience class that both created and wrapped a single prim. This will fail at runtime because:

  1. The prim doesn't exist yet at this path
  2. XformPrim doesn't create prims, it wraps existing ones
  3. The constructor signature is different (prim_path, not positional args with positions/orientations)

The fix should either:

  • Use isaaclab.sim.utils.prims.create_prim to create the Xform, then wrap with XformPrim
  • Or use isaaclab.sim.views.FrameView which is the Isaac Lab equivalent

🟡 Warning: source/isaaclab_physx/isaaclab_physx/renderers/kit_viewport_utils.py:29-36 — Inconsistent camera API between modules

The PR uses two different camera-setting APIs:

  • ViewportManager.set_camera_view(camera_prim_path, eye=..., target=...) in kit_viewport_utils.py
  • ViewportCameraState(...).set_position_world().set_target_world() in kit_visualizer.py

While both work, the argument order for ViewportManager.set_camera_view has camera_prim_path as the first positional arg (line 31-35), which is correct, but isaacsim_kit_perspective_video.py:37-40 passes them as kwargs which should also work. Verify this is the actual API signature in the experimental module.

🟡 Warning: source/isaaclab/test/terrains/test_terrain_importer.py:256 — Redundant variable assignment

num_balls = terrain_importer_cfg.num_envs

This reassigns num_balls which was already passed as a parameter to _populate_scene. While not a bug (the value is the same), it's confusing and suggests the parameter should be removed or the logic clarified.

🔵 Improvement: source/isaaclab_teleop/config/extension.toml:4 — Version bump inconsistency

The version jumped from 0.3.6 to 0.3.8, skipping 0.3.7. The changelog shows entries for both 0.3.7 and 0.3.8, but the TOML only reflects 0.3.8. This is minor but could cause confusion in tracking releases.

🔵 Improvement: apps/isaaclab.python.kit:17-35 — Missing deprecation_manager ordering comment

The isaacsim.core.deprecation_manager is loaded with order = -100 but there's no comment explaining why this specific ordering is required. Adding a brief comment would help future maintainers understand this is intentional for suppressing deprecation warnings from other extensions during load.

🔵 Improvement: source/isaaclab/isaaclab/sim/utils/stage.py:126 — Import path in try block should match migration

The fallback import still references isaacsim.core.utils.stage in the comment context, but the actual import was changed to isaacsim.core.experimental.utils.stage. The surrounding context could benefit from a comment noting this is for singleton compatibility with Isaac Sim internals.

🔵 Improvement: Multiple files — Inconsistent cloner function calls

In test_simulation_stage_in_memory.py:212, the call uses:

cloner.usd_replicate(stage_in_memory, [env_fmt.format(0)], [env_fmt], env_ids, positions=env_origins)

While in test_terrain_importer.py:305:

lab_cloner.usd_replicate(sim.stage, [env_fmt.format(0)], [env_fmt], env_ids, positions=env_origins)

The import alias varies (cloner vs lab_cloner). Consider standardizing to lab_cloner throughout for clarity that this is the Isaac Lab cloner, not the Isaac Sim one.

Replace isaacsim.core.experimental.prims.XformPrim with
isaaclab.sim.utils.prims.create_prim for XR anchor prim creation.
XformPrim is a batched view that wraps existing prims; it does not
create them. create_prim both creates the Xform prim and sets its
world-space position and orientation in one call.

Also remove the redundant num_balls = terrain_importer_cfg.num_envs
reassignment in _populate_scene; num_balls was already the parameter.

Made-with: Cursor
…/IsaacLab-public into fix/prebundle-and-deprecation
Keep the XR anchor creation fix in the code, but avoid adding another
isaaclab_teleop version entry for this review follow-up.

Made-with: Cursor
Copy link
Copy Markdown

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Choose a reason for hiding this comment

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

🤖 Isaac Lab Review Bot

Summary

This PR migrates Isaac Lab off deprecated Isaac Sim API surfaces (isaacsim.core.*, isaacsim.sensors.*, isaacsim.robot.wheeled_robots) to their isaacsim.core.experimental.* equivalents. The changes span 67 files across Kit experiences, Python imports, cloner usage, and test infrastructure. The migration is mechanically sound, but there are a few issues that need attention before merging.

Architecture Impact

Cross-module impact is significant but well-contained:

  • Kit experiences (apps/*.kit) now depend on isaacsim.core.experimental.* extensions instead of deprecated ones
  • All internal Isaac Lab cloner usages now use the in-tree isaaclab.cloner module instead of isaacsim.core.cloner.GridCloner
  • SimulationManager imports throughout PhysX benchmarks and tests now use isaaclab_physx.physics.PhysxManager aliased as SimulationManager
  • XR anchor utilities and viewport camera helpers migrated to new Isaac Sim APIs

Potential breakage for users:

  • Users with custom Kit experiences derived from Isaac Lab apps must update their extension dependencies
  • Users directly importing deprecated Isaac Sim symbols will need to update their code
  • The SimulationManager alias is NOT exported from isaaclab_physx.physics (per PR description) — users must use the local-alias pattern

Implementation Verdict

Minor fixes needed — One correctness issue in the visualizer and some documentation inconsistencies.

Test Coverage

  • Retired reproducers (check_camera.py, check_floating_base_made_fixed.py, check_legged_robot_clone.py, check_rep_texture_randomizer.py) now raise RuntimeError with guidance — appropriate for deprecated test fixtures
  • check_ref_count.py was updated to use new APIs and remains functional
  • Controller tests, terrain tests, and sensor tests migrated from GridCloner to lab_cloner utilities
  • Missing: No new tests specifically validating the migration doesn't break existing functionality — relies on existing test suite passing

CI Status

Multiple CI jobs still pending (Installation Tests, license-check, Build Latest Docs). Pre-commit passed. Key validation jobs not yet complete.

Findings

🔴 Critical: source/isaaclab_teleop/config/extension.toml:4 — Version mismatch with CHANGELOG
The extension.toml shows version 0.3.8 but the CHANGELOG documents both 0.3.7 and 0.3.8 releases. However, the CHANGELOG for 0.3.7 states it was released on 2026-04-22 and 0.3.8 on 2026-04-24. The version should be 0.3.7 if this PR is meant to be the first migration commit, or the CHANGELOG entries need to be consolidated.

version = "0.3.8"  # But PR description says 0.3.6 → 0.3.7

🔴 Critical: source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer.py:343-350 — Missing import handling for ViewportCameraState
The _set_viewport_camera method imports ViewportCameraState from omni.kit.viewport.utility.camera_state without try/except protection. In headless or Kit-less environments, this will raise ImportError. Other similar imports in the codebase are wrapped:

def _set_viewport_camera(self, position: tuple[float, float, float], target: tuple[float, float, float]) -> None:
    """Apply eye/target camera view to the active viewport."""
    from omni.kit.viewport.utility.camera_state import ViewportCameraState  # No protection!

The method is only called when _viewport_api is not None, but the import happens before that check can short-circuit.

🟡 Warning: source/isaaclab/test/terrains/test_terrain_importer.py:38 — Docstring still references GridCloner
The test docstring was updated to mention "Lab's grid_transforms" but the original function name test_grid_clone_env_origins still implies GridCloner:

def test_grid_clone_env_origins(device, env_spacing, num_envs):
    """Tests that env origins are consistent when computed using the TerrainImporter and Lab's grid_transforms."""

Consider renaming to test_terrain_importer_env_origins for clarity.

🟡 Warning: source/isaaclab/isaaclab/cloner/cloner_cfg.py:37 — Docstring example import inconsistency
The docstring example imports get_current_stage from isaaclab.sim.utils.stage, but this function is actually a re-export. While it works, the CHANGELOG mentions this update but the migration guide table (line 71-86 in migrating_to_isaaclab_3-0.rst) lists isaacsim.core.utils.stageisaaclab.sim.utils.stage which is correct. The code is fine, but ensure documentation consistency.

🟡 Warning: apps/isaaclab.python.kit:17-34 — Extension dependency ordering
The new experimental extensions are listed but isaacsim.core.deprecation_manager has order = -100. This is correct for ensuring deprecation warnings are captured early, but other extensions don't have explicit ordering. Verify that the implicit load order doesn't cause issues:

"isaacsim.core.deprecation_manager" = { order = -100 }
"isaacsim.core.experimental.materials" = {}
"isaacsim.core.experimental.objects" = {}

🔵 Improvement: source/isaaclab/test/deps/isaacsim/check_ref_count.py:44-45 — Unnecessary carb import location
The carb import was moved but the settings call could be made more robust:

import carb
# ...
carb.settings.get_settings().set_bool("/persistent/omnihydra/useSceneGraphInstancing", True)

Consider wrapping this in a try/except for environments where carb isn't available, or move to after SimulationContext is created.

🔵 Improvement: source/isaaclab_physx/isaaclab_physx/renderers/kit_viewport_utils.py:29-35 — API change in ViewportManager.set_camera_view
The parameter order changed from the deprecated API. The new signature puts camera_prim_path first:

ViewportManager.set_camera_view(
    str(camera_prim_path),  # Now first positional arg
    eye=list(eye),
    target=list(target),
)

This is correct per the new API, but worth noting in code comments for maintainability.

🔵 Improvement: source/isaaclab_tasks/test/test_rendering_correctness.py:812-858 — Test refactoring for flaky mark
The inline comment explains why the fixture was removed, which is good practice. However, the params variable shadows a potential builtin concern. Consider renaming to test_params for clarity:

@pytest.mark.parametrize("params", _PHYSICS_RENDERER_AOV_COMBINATIONS)
def test_dexsuite_kuka_allegro_lift(params):

Copy link
Copy Markdown

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Choose a reason for hiding this comment

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

🤖 Isaac Lab Review Bot

Summary

This PR migrates Isaac Lab off deprecated Isaac Sim API surfaces (isaacsim.core.*, isaacsim.sensors.*, isaacsim.robot.wheeled_robots) to their isaacsim.core.experimental.* equivalents in preparation for removal in a future Isaac Sim release. The migration touches Kit experiences, Python imports, test files, and documentation. The changes are structurally sound but there are a few issues that need attention.

Architecture Impact

This is a wide-reaching migration affecting:

  • Kit experiences: 6 .kit files updated to remove deprecated extension paths and switch dependencies
  • Python modules: Import path changes across isaaclab, isaaclab_physx, isaaclab_tasks, isaaclab_teleop, isaaclab_mimic, isaaclab_visualizers
  • Tests: Several deprecated standalone reproducers retired, test files migrated from GridCloner to Lab's in-tree cloner
  • Benchmarks: PhysX asset benchmarks now use PhysxManager instead of isaacsim.core.simulation_manager.SimulationManager

The SimulationManager aliasing pattern (from isaaclab_physx.physics import PhysxManager as SimulationManager) is consistent and follows the Newton backend convention.

Implementation Verdict

Minor fixes needed

Test Coverage

  • Several standalone reproducers were intentionally retired (they now raise RuntimeError with migration guidance)
  • Existing tests migrated to use Lab's cloner utilities instead of deprecated GridCloner
  • No new regression tests added, but this is acceptable given the PR is purely a migration with no behavioral changes
  • The test_terrain_importer.py test rename from test_grid_clone_env_origins to test_terrain_importer_env_origins correctly reflects the change

CI Status

Pre-commit and build checks passed. Several jobs still pending but no blocking failures observed.

Findings

🔴 Critical: source/isaaclab_tasks/test/test_rendering_correctness.py:844 — Incomplete variable assignment

The truncated file shows env_cfg.feature_extractor.enabled = Fal which appears to be cut off. Looking at the diff context around the shadow_hand fixture, this is likely False but the file was truncated in the review context. Verify this isn't actually broken in the source.

🟡 Warning: source/isaaclab_teleop/config/extension.toml:4 — Version jump inconsistency

The changelog shows versions 0.3.7 and 0.3.8 but the PR description says version bump is 0.3.6 → 0.3.7. The extension.toml shows version = "0.3.8". This creates confusion about what version is actually being released. The PR description should be updated or the version sequence clarified.

🟡 Warning: source/isaaclab_teleop/isaaclab_teleop/xr_anchor_manager.py:79-83 — Behavioral change in XR anchor creation

# Old: SingleXFormPrim with wxyz orientation
# New: create_prim with xyzw orientation

The comment says "create_prim orientation expects xyzw" but the original code converted xyzw to wxyz. The new code passes [x, y, z, w] (xyzw format). Verify that isaaclab.sim.utils.prims.create_prim actually expects xyzw — if it expects wxyz like the Isaac Sim convention, this would silently corrupt orientations. Cross-reference with isaaclab/sim/spawners/spawner_base.py to confirm the expected format.

🟡 Warning: source/isaaclab/test/deps/isaacsim/check_ref_count.py:87 — Articulation constructor signature change

# Old: self.view = Articulation(root_prim_path, name="ANYMAL")
# New: self.view = Articulation(root_prim_path)

The name parameter was dropped. While isaacsim.core.experimental.prims.Articulation may not accept name, this changes test behavior. If the test was verifying named articulation handling, this change could mask issues.

🔵 Improvement: source/isaaclab/docs/CHANGELOG.rst:34-57 — Changelog entry duplication

The changelog entries for 4.6.13 contain both the migration changes AND the existing fixes. The "Changed" section under 4.6.13 appears to describe the same migration work as the new section under 4.6.14. Consider consolidating these into a single version bump to avoid confusion.

🔵 Improvement: docs/source/migration/migrating_to_isaaclab_3-0.rst:1694-1792 — Missing import statement in code example

The local-alias pattern example shows:

from isaaclab_physx.physics import PhysxManager as SimulationManager

But doesn't show the necessary setup (e.g., that this requires isaaclab_physx to be installed). Consider adding a brief note that this import requires the PhysX backend package.

🔵 Improvement: source/isaaclab_physx/isaaclab_physx/renderers/kit_viewport_utils.py:29-35 — Signature change verification needed

# Old: set_camera_view(eye=..., target=..., camera_prim_path=...)
# New: ViewportManager.set_camera_view(camera_prim_path, eye=..., target=...)

The parameter order changed with camera_prim_path becoming the first positional argument. This is correct per the new API, but ensure all call sites (there may be others not in this PR) are updated.

🔵 Improvement: source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer.py:343-357 — Redundant import

The Gf import was added at line 14 but was already being used elsewhere. The new camera state code correctly uses ViewportCameraState which is the non-deprecated approach. However, consider adding a fallback or warning if omni.kit.viewport.utility.camera_state is unavailable rather than silently returning.

Surface the unavailable viewport camera API at warning level so review and
runtime logs make the fallback visible without changing camera setup logic.

Made-with: Cursor
Copy link
Copy Markdown

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Choose a reason for hiding this comment

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

🤖 Isaac Lab Review Bot

Summary

This PR migrates Isaac Lab off deprecated Isaac Sim API surfaces (isaacsim.core.*, isaacsim.sensors.*, isaacsim.robot.wheeled_robots) in preparation for their removal. The changes include updating Kit experiences to use non-deprecated extension paths, migrating Python imports to isaacsim.core.experimental.* equivalents, decoupling from SimulationManager by using PhysxManager, and retiring standalone reproducers that depended on deprecated extensions. The migration is largely mechanical and correct, with comprehensive documentation updates.

Architecture Impact

  • Kit experiences: All .kit files now exclude extsDeprecated search paths and depend on isaacsim.core.experimental.* extensions
  • SimulationManager decoupling: Tests and benchmarks now import PhysxManager as SimulationManager from isaaclab_physx.physics, creating a clean abstraction layer
  • Cloner migration: Multiple test files migrated from isaacsim.core.cloner.GridCloner to Isaac Lab's in-tree isaaclab.cloner utilities
  • Cross-module consistency: The as SimulationManager alias pattern mirrors Newton backend's convention, enabling future backend-agnostic code

Implementation Verdict

Ship it — The migration is thorough and correctly executed. Minor documentation improvements noted below.

Test Coverage

  • ✅ Existing tests updated to use new import paths
  • ✅ Controller tests (test_differential_ik.py, test_operational_space.py) migrated to Lab cloner
  • ✅ Terrain tests migrated and renamed (test_grid_clone_env_originstest_terrain_importer_env_origins)
  • ✅ Asset interface tests updated to mock PhysxManager instead of deprecated SimulationManager
  • ⚠️ Retired reproducers replaced with RuntimeError stubs — acceptable since these were debugging scripts, not regression tests

CI Status

Pre-commit passed ✅, Build Wheel passed ✅. Pending jobs (Installation Tests, license-check) should be monitored.

Findings

🔵 Improvement: source/isaaclab/test/deps/isaacsim/check_ref_count.py:16 — Docstring references deprecated API
The docstring at line 16 still references isaacsim.core.prims.Articulation (the deprecated path) even though the import at line 41 correctly uses isaacsim.core.experimental.prims.Articulation. Update the docstring for consistency:

# Line 16: "Use :class:`~isaaclab.sim.SimulationContext` and ``isaacsim.core.experimental.prims.Articulation``"

This is already correct in the file — no issue here after re-reading.

🔵 Improvement: source/isaaclab/docs/CHANGELOG.rst:34-57 — Version ordering inconsistency
The changelog entry for version 4.6.13 (lines 36-57) contains "Changed" and "Removed" sections that describe the deprecated API migration, but these sections are placed after the "Fixed" section that was already present. This is technically correct per semver, but the "Changed" content at line 40-47 appears to duplicate content from 4.6.14. Verify this is intentional — the migration work spans multiple patch versions.

🔵 Improvement: source/isaaclab_teleop/config/extension.toml:4 — Version jump from 0.3.6 to 0.3.8
The extension.toml shows version 0.3.8, but the CHANGELOG shows 0.3.8 and 0.3.7 as separate entries. The PR description states 0.3.6 → 0.3.7, but the file shows 0.3.8. Verify the version is intentionally 0.3.8 (perhaps due to a prior unreleased 0.3.7).

🔵 Improvement: source/isaaclab_tasks/test/test_rendering_correctness.py:812-860 — Fixture refactored to inline function
The dexsuite_kuka_allegro_lift_env fixture was intentionally inlined into the test function to make @pytest.mark.flaky effective. The comment explains this well (lines 817-822). However, the test is now marked both @pytest.mark.flaky(max_runs=3, min_passes=1) and uses @pytest.mark.parametrize. This is correct behavior — flaky will retry each parameter combination independently.

🔵 Improvement: source/isaaclab_tasks/test/env_test_utils.py:29-30 — XFAIL_TASKS emptied
The XFAIL_TASKS dict was cleared (line 29), removing the entry for Isaac-Cartpole-RGB-TheiaTiny-v0. Verify this environment is now fixed, or this could cause test failures if the environment is still broken.

🔵 Improvement: source/isaaclab_teleop/isaaclab_teleop/xr_anchor_manager.py:79-84 — Quaternion convention change
The comment at line 79 was updated from "SingleXFormPrim expects wxyz" to "create_prim orientation expects xyzw". The code correctly passes [x, y, z, w] to create_prim. However, verify that isaaclab.sim.utils.prims.create_prim actually expects xyzw — checking the Isaac Lab codebase, create_prim does use xyzw convention, so this is correct.

🔵 Improvement: source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer.py:14 — New import added
The Gf import from pxr was added to support ViewportCameraState. This is used correctly at lines 355-356 for Gf.Vec3d construction.

🟡 Warning: source/isaaclab/test/terrains/test_terrain_importer.py:37-38 — Test function renamed
The test test_grid_clone_env_origins was renamed to test_terrain_importer_env_origins (line 37). This is semantically correct since the test no longer uses GridCloner, but any external test selection patterns (e.g., CI scripts using -k test_grid_clone) will silently skip this test. Document this rename in the migration guide or release notes.

Resolve the isaaclab_tasks changelog version conflict by preserving the
upstream 1.5.26 entry and moving this branch's task migration entry to
1.5.27 with the matching extension version.

Made-with: Cursor

with contextlib.suppress(ModuleNotFoundError):
from isaacsim.core.prims import SingleXFormPrim
from isaaclab.sim.utils.prims import create_prim as _create_prim
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.

@rwiltz fyi hope this change is ok - the previous isaacsim.core.prims was being deprecated in isaac sim

Copy link
Copy Markdown

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Choose a reason for hiding this comment

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

🤖 Isaac Lab Review Bot

Summary

This PR migrates Isaac Lab off deprecated Isaac Sim API surfaces (isaacsim.core.*, isaacsim.sensors.*, isaacsim.robot.wheeled_robots) to their isaacsim.core.experimental.* equivalents. The migration is well-scoped and correctly updates Kit experience files, Python imports, and test infrastructure. The changes are largely mechanical import path updates, with a few more substantive changes to cloner usage and camera view APIs.

Architecture Impact

Cross-module migration scope:

  • Kit experiences (apps/*.kit): Removes deprecated extension search paths and dependencies
  • Core isaaclab module: Updates enable_extension, prim utilities, and cloner imports
  • isaaclab_physx: Migrates SimulationManager import to PhysxManager alias pattern
  • isaaclab_tasks, isaaclab_teleop, isaaclab_mimic: Various import path updates
  • isaaclab_visualizers: Switches from isaacsim.core.utils.viewports.set_camera_view to ViewportCameraState
  • Test infrastructure: Retires deprecated reproducers, migrates from GridCloner to Lab's in-tree cloner

Blast radius: The SimulationManager import change in asset interface tests and benchmarks could affect downstream users who import from isaacsim.core.simulation_manager. The Kit experience changes will affect anyone with custom .kit files derived from Isaac Lab's.

Implementation Verdict

Minor fixes needed — One functional bug in XR anchor creation, and a few documentation/consistency issues.

Test Coverage

  • Tests are updated to use the new Isaac Lab cloner APIs instead of GridCloner
  • Retired standalone reproducers are replaced with informative error messages pointing users to alternatives
  • The test_terrain_importer.py function rename from test_grid_clone_env_origins to test_terrain_importer_env_origins is appropriate
  • Missing: No new tests for the ViewportCameraState migration in kit_visualizer.py

CI Status

Pre-commit and build checks pass. Docker/installation tests are pending, which is expected for this type of migration PR.

Findings

🔴 Critical: source/isaaclab_teleop/isaaclab_teleop/xr_anchor_manager.py:83-86 — Incorrect quaternion convention for create_prim

The PR comment states create_prim orientation expects xyzw, but then constructs the quaternion as [x, y, z, w]. Looking at isaaclab.sim.utils.prims.create_prim, the orientation parameter expects wxyz format (consistent with USD conventions). The original code converted xyzw to wxyz with [w, x, y, z] for SingleXFormPrim, which was correct. The new code passes [x, y, z, w], which will result in incorrect anchor rotations.

# Current (incorrect):
quat_xyzw = np.asarray([x, y, z, w], dtype=np.float64)
_create_prim(..., orientation=quat_xyzw)

# Should be:
quat_wxyz = np.asarray([w, x, y, z], dtype=np.float64)
_create_prim(..., orientation=quat_wxyz)

🟡 Warning: source/isaaclab_teleop/config/extension.toml:4 — Version jump inconsistency

The version jumps from 0.3.6 to 0.3.8, skipping 0.3.7. The CHANGELOG documents both versions, but one is listed as 0.3.7 (2026-04-22) and the current as 0.3.8 (2026-04-24). This suggests two releases were intended but the toml only has one version bump. Verify this is intentional.

🟡 Warning: source/isaaclab/test/deps/isaacsim/check_ref_count.py:85 — Incomplete migration of reproducer

Unlike the other retired reproducers that just raise RuntimeError, check_ref_count.py was migrated to use the new APIs and still functions. However, the file still imports Articulation from isaacsim.core.experimental.prims directly rather than going through Isaac Lab's asset wrapper. This is inconsistent with the PR's stated goal of preferring Isaac Lab APIs. Consider either fully retiring this script or updating the docstring to reflect that it's a valid debugging tool.

🟡 Warning: apps/isaaclab.python.kit:17-29 — Missing isaacsim.gui.menu dependency

The diff shows isaacsim.gui.menu was removed from dependencies but it's not clear if this was intentional or accidental. The original file had it; the new file doesn't. Verify the GUI menu extension isn't needed for the interactive Python experience.

🔵 Improvement: source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer.py:340-355 — Missing error handling for camera state setting

The _set_viewport_camera method catches ImportError for ViewportCameraState but doesn't handle potential exceptions from set_position_world or set_target_world. Consider wrapping the state-setting calls:

try:
    camera_state.set_position_world(Gf.Vec3d(...), True)
    camera_state.set_target_world(Gf.Vec3d(...), True)
except Exception as exc:
    logger.warning("[KitVisualizer] Camera state update failed: %s", exc)

🔵 Improvement: source/isaaclab/isaaclab/cloner/cloner_cfg.py:37 — Documentation example uses correct import

Good catch updating the docstring example to use isaaclab.sim.utils.stage.get_current_stage — this aligns with the migration guide's recommendation to prefer Isaac Lab APIs.

🔵 Improvement: source/isaaclab_tasks/test/env_test_utils.py:29 — Empty XFAIL_TASKS dict

The Isaac-Cartpole-RGB-TheiaTiny-v0 entry was removed from XFAIL_TASKS. This suggests the TheiaTiny environment is now working. Confirm this is intentional and the environment passes reliably before merging.

🔵 Improvement: docs/source/migration/migrating_to_isaaclab_3-0.rst:1675-1793 — Comprehensive migration documentation

The new "Migration off Deprecated Isaac Sim APIs" section is well-written with clear mapping tables and code examples. The local-alias pattern for SimulationManager is documented correctly.

Copy link
Copy Markdown

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Choose a reason for hiding this comment

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

🤖 Isaac Lab Review Bot

Summary

This PR migrates Isaac Lab off deprecated Isaac Sim API surfaces (isaacsim.core.*, isaacsim.sensors.*, isaacsim.robot.wheeled_robots) in preparation for their removal in a future Isaac Sim release. The migration updates Kit experience files, Python imports, and replaces isaacsim.core.cloner.GridCloner usage with Isaac Lab's in-tree cloner. The changes are largely mechanical import path updates with a few architectural decisions around the SimulationManager alias pattern.

Architecture Impact

  • Kit experiences: All .kit files no longer register extsDeprecated search paths and switch to isaacsim.core.experimental.* extensions. This affects app startup for anyone using Isaac Lab's Kit experiences.
  • Cloner migration: Tests and check scripts migrate from isaacsim.core.cloner.GridCloner to isaaclab.cloner utilities. This is the intended direction per Isaac Lab's architecture.
  • SimulationManager decoupling: Tests now import PhysxManager as SimulationManager from isaaclab_physx.physics instead of isaacsim.core.simulation_manager. This follows the Newton backend's pattern and keeps tests backend-agnostic at call sites.
  • Camera/viewport utilities: Migrated to ViewportCameraState API and ViewportManager.set_camera_view which is the recommended replacement.
  • Retired test scripts: Several test/deps/isaacsim/check_*.py scripts are now stubs that raise RuntimeError, which is a breaking change for anyone who was running them directly.

Implementation Verdict

Ship it — The migration is correct and well-documented. A few minor observations below but nothing blocking.

Test Coverage

  • The PR updates existing tests to use the new APIs but does not add new regression tests for the migration itself. This is acceptable since the migration is about import paths, not behavior changes.
  • The retired test scripts (check_camera.py, check_floating_base_made_fixed.py, etc.) now raise RuntimeError immediately, which will correctly fail if CI tries to run them.
  • Test test_terrain_importer_env_origins was renamed from test_grid_clone_env_origins to reflect the migration — good practice.

CI Status

Several CI jobs are still pending (Installation Tests, license-check, Docker builds). Pre-commit, wheel build, and broken link checks have passed. Recommend waiting for full CI green before merge.

Findings

🔵 Improvement: source/isaaclab/test/deps/isaacsim/check_ref_count.py:85-86 — Docstring references outdated class
The docstring in AnymalArticulation.__init__ mentions self.view = Articulation(root_prim_path, name="ANYMAL") but the code now uses Articulation(root_prim_path) without the name parameter. The isaacsim.core.experimental.prims.Articulation class may not accept name the same way. This is fine for the code but the class-level docstring could clarify the change for future readers.

🔵 Improvement: source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer.py:343-357 — Import inside method could be hoisted
The from omni.kit.viewport.utility.camera_state import ViewportCameraState import is inside _set_viewport_camera() which gets called potentially every frame via set_camera_view(). While Python caches imports, hoisting to module-level with a try/except (like the existing TYPE_CHECKING pattern) would be cleaner and marginally faster.

🔵 Improvement: source/isaaclab_teleop/isaaclab_teleop/xr_anchor_manager.py:79-84 — Comment says xyzw but should clarify the change
The comment says XrCfg.anchor_rot is xyzw; create_prim orientation expects xyzw but the original code had SingleXFormPrim expecting wxyz (hence the reorder). The new code passes [x, y, z, w] to create_prim. Verify that isaaclab.sim.utils.prims.create_prim indeed expects xyzw (it does per the codebase), but the comment could be clearer that the reordering is no longer needed.

🔵 Improvement: source/isaaclab_tasks/test/test_rendering_correctness.py:813-858 — Fixture refactored to inline function
The dexsuite_kuka_allegro_lift_env fixture was converted to an inline test function to make @pytest.mark.flaky work correctly. The rationale in the docstring is excellent. However, the test now has a large try/finally block that could benefit from a context manager pattern for consistency with other tests. This is minor.

🔵 Improvement: source/isaaclab_tasks/test/env_test_utils.py:29 — XFAIL_TASKS now empty
The XFAIL_TASKS dict was cleared, removing Isaac-Cartpole-RGB-TheiaTiny-v0. Verify this task is actually fixed before merging, or this could cause CI failures.

🔵 Improvement: source/isaaclab_physx/isaaclab_physx/renderers/kit_viewport_utils.py:29-35 — API signature changed
The call signature changed from set_camera_view(eye=..., target=..., camera_prim_path=...) to ViewportManager.set_camera_view(camera_path, eye=..., target=...). The new API puts camera_prim_path as the first positional argument. This is correct per the Isaac Sim experimental API, just noting the interface change.

🔵 Improvement: docs/source/migration/migrating_to_isaaclab_3-0.rst:1751-1768 — Documentation references removed alias
The migration docs mention that isaaclab_physx.physics.SimulationManager alias "has been removed" but the PR description says no public alias is exported. The docs are correct and helpful for users who might have been using preview builds.

🟡 Warning: apps/isaaclab.python.kit:17-41 — Extension dependency changes may affect downstream users
The removal of isaacsim.core.api, isaacsim.core.utils, isaacsim.gui.menu, isaacsim.robot.manipulators, and the sensor extensions could break users who depend on these being loaded by Isaac Lab's Kit experience. The PR description correctly notes this as a breaking change, but users who import from these modules in their own code after loading Isaac Lab's Kit app will now need to enable those extensions explicitly.

Copy link
Copy Markdown

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Choose a reason for hiding this comment

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

🤖 Isaac Lab Review Bot

Summary

This PR migrates Isaac Lab off deprecated Isaac Sim API surfaces (isaacsim.core.*, isaacsim.sensors.*, isaacsim.robot.wheeled_robots) to their isaacsim.core.experimental.* equivalents. The migration is comprehensive, touching Kit experiences, Python imports, test utilities, and documentation. The changes are mechanically sound and well-documented in the migration guide.

Architecture Impact

Moderate cross-module impact with careful containment:

  1. Kit experiences (apps/*.kit): Removal of extsDeprecated search paths and switching extension dependencies affects app startup. Any downstream custom Kit experiences derived from these will need similar updates.

  2. SimulationManager decoupling: Tests and benchmarks now import PhysxManager as SimulationManager from isaaclab_physx.physics instead of isaacsim.core.simulation_manager. This creates a backend-specific alias pattern that's documented but could cause confusion.

  3. Cloner migration: Multiple test files migrate from isaacsim.core.cloner.GridCloner to isaaclab.cloner utilities (grid_transforms, usd_replicate, filter_collisions). The API surface is different but the test logic adapts correctly.

  4. Retired test reproducers: Five standalone debug scripts under test/deps/isaacsim/ now raise RuntimeError instead of executing. This is intentional but could break any automation that ran these scripts.

Implementation Verdict

Ship it — The migration is thorough and correct. Minor documentation/comment improvements are suggested but not blocking.

Test Coverage

  • ✅ Existing tests are updated to use new APIs
  • ✅ Test files migrate from GridCloner to Lab's cloner utilities consistently
  • ⚠️ No new tests added for the migration itself, but this is appropriate since the migration maintains existing behavior
  • ⚠️ Retired reproducers (check_camera.py, etc.) now only raise errors — ensure CI doesn't invoke these directly

CI Status

Many jobs are still pending. The passing jobs (pre-commit, Build Wheel, isaaclab_assets, environments_training) suggest the basic structure is sound. Wait for isaaclab (core) and isaaclab_physx jobs before merging to confirm the import changes don't break runtime.

Findings

🔵 Improvement: source/isaaclab/test/deps/isaacsim/check_ref_count.py:42 — Inconsistent import style
The file imports Articulation from the new experimental path but the docstring still references the old pattern. More importantly, this file should either be fully retired (like the other four) or fully migrated. Currently it's a hybrid that still runs:

from isaacsim.core.experimental.prims import Articulation

If this script is kept functional, the class docstring at line 85 references isaacsim.core.cloner.GridCloner which is inconsistent with the migration narrative.

🔵 Improvement: source/isaaclab/test/terrains/test_terrain_importer.py:37-38 — Test function renamed but docstring not updated

def test_terrain_importer_env_origins(device, env_spacing, num_envs):
    """Tests that env origins are consistent when computed using the TerrainImporter and Lab's grid_transforms."""

The function was renamed from test_grid_clone_env_origins to test_terrain_importer_env_origins which is good, but the helper function _obtain_grid_cloner_env_origins was removed without updating the test's overall structure comments. This is cosmetic but aids maintainability.

🔵 Improvement: source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer.py:12 — Missing import for Gf
The diff adds Gf to the import line:

from pxr import Gf, Usd, UsdGeom, Vt

This is correct — Gf.Vec3d is now used in _set_viewport_camera. No issue here, just confirming correctness.

🔵 Improvement: source/isaaclab_teleop/config/extension.toml:4 — Version jump inconsistency
The CHANGELOG shows versions 0.3.6 → 0.3.7 → 0.3.8 but the extension.toml jumps directly to 0.3.8. This is fine if both 0.3.7 and 0.3.8 changes are in this PR, but verify that the intermediate version wasn't meant to be a separate release.

🟡 Warning: source/isaaclab_tasks/test/test_rendering_correctness.py:814-858 — Test restructured to inline fixture
The test_dexsuite_kuka_allegro_lift test was refactored from using a yield fixture to inline setup. The comment explains this is for @pytest.mark.flaky compatibility. This is correct behavior, but the test now has a larger blast radius on failure (env creation errors will appear as test failures, not fixture errors). The try/finally ensures cleanup, which is good.

🔵 Improvement: docs/source/migration/migrating_to_isaaclab_3-0.rst:1675+ — Excellent migration documentation
The new "Migration off Deprecated Isaac Sim APIs" section is thorough with a clear table mapping deprecated paths to replacements. This is high-quality documentation that will help users.

🔵 Improvement: source/isaaclab/isaaclab/cloner/cloner_cfg.py:37 — Docstring example updated
The example now imports from isaaclab.sim.utils.stage instead of isaacsim.core.experimental.utils.stage, which aligns with the Isaac Lab API preference documented in the migration guide. Good consistency.

🟡 Warning: source/isaaclab_tasks/test/env_test_utils.py:29 — XFAIL_TASKS emptied

XFAIL_TASKS: dict[str, str] = {}

The Isaac-Cartpole-RGB-TheiaTiny-v0 entry was removed. Verify this environment is now functional, or this could cause CI failures.

@kellyguo11 kellyguo11 dismissed AntoineRichard’s stale review April 26, 2026 03:59

Reverted changes in previous docs and updated cloner cfg import

@kellyguo11 kellyguo11 merged commit 080898f into isaac-sim:develop Apr 26, 2026
32 checks passed
@github-project-automation github-project-automation Bot moved this from In progress to Done in Isaac Lab Apr 26, 2026
mmichelis pushed a commit to mmichelis/IsaacLab that referenced this pull request Apr 29, 2026
# Description

Migrates Isaac Lab off deprecated Isaac Sim API surfaces in preparation
for their removal in a future Isaac Sim release. This PR is
intentionally scoped to the API migration only — installation,
prebundle, and extension-exclusion fixes are tracked separately on
`kellyg/fix-installation`.

## What changes

**Kit experience (`apps/*.kit`):**
- Stopped registering deprecated Isaac Sim extension search paths
(`extsDeprecated`) in Isaac Lab Kit experiences (headless, rendering, XR
variants).
- Switched explicit Isaac Sim extension dependencies to their
non-deprecated equivalents:
  - `isaacsim.core.*` → `isaacsim.core.experimental.*`
- `isaacsim.robot.wheeled_robots` →
`isaacsim.robot.experimental.wheeled_robots` (+
`isaacsim.robot.wheeled_robots.nodes` for OmniGraph nodes)
  - `isaacsim.sensors.*` → `isaacsim.sensors.experimental.*`
- Removed unused Isaac Sim extensions that pulled in
`isaacsim.core.api`.
- Migrated `isaacsim.core.cloner` usage to the in-tree Lab cloner.

**Python source migrations (across `isaaclab`, `isaaclab_physx`,
`isaaclab_tasks`, `isaaclab_teleop`, `isaaclab_visualizers`,
`isaaclab_mimic`):**
- Migrated remaining imports off deprecated `isaacsim.core.utils.*` /
prim Python paths to `isaacsim.core.experimental.*` replacements
(controllers, env mdp events, sim utils/converters, terrain importer,
RMP flow, etc.).
- Updated Kit perspective capture helpers to use
`isaacsim.core.rendering_manager`.
- Updated optional-extension enablement (e.g. `enable_extension`) to use
`isaacsim.core.experimental.utils.app`.
- Updated XR anchor utilities to use `isaacsim.core.experimental.prims`
/ `isaacsim.core.experimental.utils`.
- Updated mobility-gen path utilities (`isaaclab_mimic`) to import from
`isaacsim.replicator.experimental.mobility_gen`.
- Migrated `kit_visualizer.py` from
`isaacsim.core.utils.viewports.set_camera_view` to
`omni.kit.viewport.utility.camera_state.ViewportCameraState`.

**`SimulationManager` decoupling:**
- Migrated the PhysX scene data provider, PhysX asset micro-benchmarks,
and cross-backend asset interface tests off
`isaacsim.core.simulation_manager.SimulationManager`. They now import
`isaaclab_physx.physics.PhysxManager` aliased as `SimulationManager`,
mirroring the Newton backend's `NewtonManager as SimulationManager`
convention. No new public alias is exported from
`isaaclab_physx.physics`.

**Test deps cleanup:**
- Retired several `source/isaaclab/test/deps/isaacsim` standalone
reproducers that depended on deprecated Isaac Sim core extensions
(`check_camera.py`, `check_floating_base_made_fixed.py`,
`check_legged_robot_clone.py`, `check_rep_texture_randomizer.py`,
`check_ref_count.py`). Use `isaaclab.sim` and
`isaacsim.core.experimental.*` for similar debugging workflows.

**Docs:**
- Updated tutorials, sensor docs, migration guide, release notes, and
verification snippets to reference the non-deprecated APIs.

## Motivation

Isaac Sim has marked `isaacsim.core.*`, `isaacsim.sensors.*`, and
`isaacsim.robot.wheeled_robots` modules as deprecated, with
`isaacsim.core.experimental.*` as the supported replacement. Without
this migration, Isaac Lab will break when those modules are removed and
currently emits deprecation warnings on every launch. Splitting the
migration off from the installation/prebundle work keeps each PR small
and reviewable.

Fixes # (issue)

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- New feature (non-breaking change which adds functionality)
- **Breaking change (existing functionality will not work without user
modification)** — only for users that imported deprecated Isaac Sim
symbols re-exported through Isaac Lab Kit experiences; user-facing Isaac
Lab Python APIs are unchanged.
- Documentation update

## Screenshots

N/A — no UI changes.

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
  - `isaaclab` 4.6.10 → 4.6.11
  - `isaaclab_physx` 0.5.20 → 0.5.21
  - `isaaclab_tasks` 1.5.23 → 1.5.24
  - `isaaclab_teleop` 0.3.6 → 0.3.7
  - `isaaclab_mimic` 1.2.4 → 1.2.5
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

---------

Signed-off-by: Kelly Guo <kellyg@nvidia.com>
Signed-off-by: Kelly Guo <kellyguo123@hotmail.com>
Co-authored-by: Kelly Guo <kelly@nvidia.com>
hujc7 added a commit to hujc7/IsaacLab that referenced this pull request May 12, 2026
…saaclab.python.kit

The `apps/isaaclab.python.kit` experience declared three Isaac Sim
extensions as hard dependencies that don't exist in publicly-released
`isaacsim 6.0.x`:

    isaacsim.core.experimental.primdata
    isaacsim.robot.wheeled_robots.nodes
    isaacsim.sensors.experimental.rtx

These were introduced in PR isaac-sim#5293 as part of the deprecated-extension
migration ahead of an upstream Isaac Sim release, but the renamed
targets ship only in unreleased Isaac Sim builds. When Kit's resolver
can't satisfy a hard dep locally it falls back to a remote registry
sync that walks 10k+ packages across 4 registries -- which silently
burns ~55s on a fast network and reaches per-test timeouts of
1000s/1700s on the IsaacLab CI runners, where the registry endpoints
appear to be slow or rate-limited.

That timeout cascade has been hitting `isaaclab (core) [1/3]` for
~7 days, blowing up `test_non_headless_launch.py`,
`test_outdated_sensor.py`, and `test_color_randomization.py` -- all
three import `AppLauncher` at module top and share the same kit-load
boot path. CI then retries each test 3x, burning ~150 min of
wall-time per run.

Marking the three as `{ optional = true }` lets Kit skip them if
absent (matching the convention used elsewhere, e.g.
`omni.kit.notification_manager = { optional = true }` in
`isaacsim.app.compatibility_check`). When the upstream extensions
eventually ship publicly, they auto-load -- no further change needed.

Verified locally: `test_non_headless_launch` goes from 57s exit-1
to 13.82s PASSED.

Refs: isaac-sim/IsaacLab-Internal#... (CI slowness tracking)
hujc7 added a commit to hujc7/IsaacLab that referenced this pull request May 12, 2026
…saaclab.python.kit

The `apps/isaaclab.python.kit` experience declared three Isaac Sim
extensions as hard dependencies that don't exist in publicly-released
`isaacsim 6.0.x`:

    isaacsim.core.experimental.primdata
    isaacsim.robot.wheeled_robots.nodes
    isaacsim.sensors.experimental.rtx

These were introduced in PR isaac-sim#5293 as part of the deprecated-extension
migration ahead of an upstream Isaac Sim release, but the renamed
targets ship only in unreleased Isaac Sim builds. When Kit's resolver
can't satisfy a hard dep locally it falls back to a remote registry
sync that walks 10k+ packages across 4 registries -- which silently
burns ~55s on a fast network and reaches per-test timeouts of
1000s/1700s on the IsaacLab CI runners, where the registry endpoints
appear to be slow or rate-limited.

That timeout cascade has been hitting `isaaclab (core) [1/3]` for
~7 days, blowing up `test_non_headless_launch.py`,
`test_outdated_sensor.py`, and `test_color_randomization.py` -- all
three import `AppLauncher` at module top and share the same kit-load
boot path. CI then retries each test 3x, burning ~150 min of
wall-time per run.

Marking the three as `{ optional = true }` lets Kit skip them if
absent (matching the convention used elsewhere, e.g.
`omni.kit.notification_manager = { optional = true }` in
`isaacsim.app.compatibility_check`). When the upstream extensions
eventually ship publicly, they auto-load -- no further change needed.

Verified locally: `test_non_headless_launch` goes from 57s exit-1
to 13.82s PASSED.

Refs: isaac-sim/IsaacLab-Internal#... (CI slowness tracking)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working documentation Improvements or additions to documentation infrastructure isaac-mimic Related to Isaac Mimic team isaac-sim Related to Isaac Sim team

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants