Skip to content

Ashwinvk/leapp observation term inputs#2

Open
ashwinvkNV wants to merge 40 commits into
frlai/fix_rnn_leapp_tracingfrom
ashwinvk/leapp-observation-term-inputs
Open

Ashwinvk/leapp observation term inputs#2
ashwinvkNV wants to merge 40 commits into
frlai/fix_rnn_leapp_tracingfrom
ashwinvk/leapp-observation-term-inputs

Conversation

@ashwinvkNV

Copy link
Copy Markdown
Collaborator

Description

Adds LEAPP observation-term input boundaries so selected policy observations can be exported as runtime inputs using observation:{group}:{term} metadata. This supports workflows like gear assembly where deployment provides final shaft pose observations directly, instead of exposing simulator-only bookkeeping.

Also updates LEAPP deployment env support, marks gear shaft pose observations, adds docs, and adds focused unit tests.

Fixes # N/A

Type of change

  • New feature (non-breaking change which adds functionality)
  • Documentation update

Screenshots

N/A

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 corresponding version, if required
  • I have added my name to CONTRIBUTORS.md or my name already exists there

pbarejko and others added 17 commits June 5, 2026 14:02
…w to install ovrtx (isaac-sim#5991)

# Description

Documentation was out of date.

Fixes # (issue)

<!-- As a practice, it is recommended to open an issue to have
discussions on the proposed pull request.
This makes it easier for the community to keep track of what is being
developed or added, and if a given feature
is demanded by more than one party. -->

## Type of change

<!-- As you go through the list, delete the ones that are not
applicable. -->

- 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)
- Documentation update

## Screenshots

Please attach before and after screenshots of the change if applicable.

<!--
Example:

| Before | After |
| ------ | ----- |
| _gif/png before_ | _gif/png after_ |

To upload images to a PR -- simply drag and drop an image while in edit
mode and it should upload the image directly. You can then paste that
source into the above before/after sections.
-->

## Checklist

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

<!--
As you go through the checklist above, you can mark something as done by
putting an x character in it

For example,
- [x] I have done this task
- [ ] I have not done this task
-->
…tion (isaac-sim#5996)

## 1. Summary

* The ``create_cube_base_env`` tutorial crashed at startup with
``RuntimeError: Scene replication is enabled ...`` from the event
manager: the scene was constructed with ``replicate_physics=True`` while
declaring two ``prestartup`` USD-level randomization terms
(``randomize_scale``, ``randomize_color``).
* One-line fix: ``replicate_physics=True`` → ``False`` on the scene cfg
— matching the tutorial's docstring and the comment directly above the
line, both of which already state it should be ``False``.
* Regression from isaac-sim#4649 (cloner refactor), which flipped this line
without updating the comment or accounting for the prestartup guard.

## 2. Verification (Isaac Sim 6.0.0.1, headless)

* Before (``True``): ``RuntimeError`` raised in
``EventManager._prepare_terms``; 0 simulation steps.
* After (``False``): both prestartup terms active; the env runs 64,588
steps with the cube-tracking error converging 63.5 → 0.19.

## 3. Test plan

* [x] Reproduced the crash on develop as-is
* [x] Verified the fix runs the tutorial headless with USD-level
randomization active

Refs: NVBug 6269154
# Description

<!--
Thank you for your interest in sending a pull request. Please make sure
to check the contribution guidelines.

Link:
https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html

💡 Please try to keep PRs small and focused. Large PRs are harder to
review and merge.
-->

Fixes
- remove legacy isaaclab_visualizers/setup.py
- fix too small ground plane mesh in Rerun and Viser visualizers in some
envs
- fix flickering ground in Viser visualizer
- fix library conflict with imgui_bundle, which broke Newton viewer's
HUD
- expand viz test to include a specific check for imgui_bundle failure
to load (this often occurs due to new conflict libraries which causes
Newton visualizer HUD to break)
- prevent log spam from [Warning] [omni.physx.tensors.plugin] Failed to
find rigid body...
- add contact arrows to newton visualizer with a limitation note to the
visualization docs
- fix an edgecase where wrong viz marker prototype is used when marker
count equals number of prototype
- move the xr visualization test from test/visualization ->
test/xr_visualization to separate it more from test/visualizers

<!-- As a practice, it is recommended to open an issue to have
discussions on the proposed pull request.
This makes it easier for the community to keep track of what is being
developed or added, and if a given feature
is demanded by more than one party. -->

## Type of change

<!-- As you go through the list, delete the ones that are not
applicable. -->

- Bug fix (non-breaking change which fixes an issue)

## Screenshots

Please attach before and after screenshots of the change if applicable.

<!--
Example:

| Before | After |
| ------ | ----- |
| _gif/png before_ | _gif/png after_ |

To upload images to a PR -- simply drag and drop an image while in edit
mode and it should upload the image directly. You can then paste that
source into the above before/after sections.
-->

## Checklist

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

<!--
As you go through the checklist above, you can mark something as done by
putting an x character in it

For example,
- [x] I have done this task
- [ ] I have not done this task
-->
…olution (isaac-sim#5944)

## Summary

alternative to isaac-sim#5939

- Selecting a typed preset (e.g. `presets=newton_mjwarp`) on a task that
does **not** declare that name on a `PhysicsCfg`/`RendererCfg`
previously created a silent mixed configuration: the name would match an
unrelated scalar/sensor preset that happens to share the name, tuning
those fields while leaving the real backend (e.g. PhysX) untouched. This
adds a post-resolution check that a selected *reserved* typed name
actually landed on a config of its own type at least once, and raises a
clear `ValueError` otherwise.
- The set of reserved canonical names is declared per typed target in
`PresetTarget` (`preset_target.py`) — `PHYSICS = {newton_mjwarp,
newton_kamino}`, plus the known renderer backends. New solvers/renderers
opt in by adding their name there; the resolver hardcodes nothing.
`physx`/`ovphysx` are intentionally **not** reserved (PhysX is the
default backend, so selecting it on a task without a physics preset is
harmless rather than a silent mismatch).
- Implementation is minimal: one `typed_hits: set[str]` threaded through
`_pick_alternative`/`_resolve_active_presets` records when a reserved
name resolves to a value of its target type; `_validate_typed_presets`
then flags `reserved-selected ∩ consumed − typed_hits`. Truly-unknown
names continue to flow to the existing "Unknown preset(s)" error path.

## Behavior

| Invocation | Result |
|---|---|
| `Isaac-Velocity-Flat-Anymal-C-v0 presets=newton_mjwarp` | resolves
(lands on `NewtonCfg`) |
| `Isaac-Navigation-Flat-Anymal-C-v0 presets=newton_mjwarp` |
`ValueError` (no Newton physics; only matched a sensor/scalar) |
| `Isaac-Navigation-Flat-Anymal-C-v0 presets=physx` | resolves (PhysX
not reserved, benign) |
| `Isaac-Navigation-Flat-Anymal-C-v0 presets=newton_kamino` | "Unknown
preset(s)" (unchanged path) |
| legacy alias `presets=newton` on navigation | `ValueError`
(canonicalized to `newton_mjwarp`) |

## Test plan

- [x] `./isaaclab.sh -p -m pytest
source/isaaclab_tasks/test/core/test_hydra.py` (added 7 regression tests
for the validator + end-to-end resolution; full file passes)
- [x] `test_preset_cli.py`, `test_newton_solver_preset_names.py`,
`test_preset_kit_decision.py` pass
- [x] Config-resolution probes for the table above
- [x] `pre-commit` (ruff/format/codespell/rst/license) green
- [ ] CI

A changelog fragment is included under
`source/isaaclab_tasks/changelog.d/`.
Bumped packages:
- isaaclab: 6.3.1 → 6.4.0
- isaaclab_contrib: 0.4.3 → 0.4.4
- isaaclab_newton: 0.15.1 → 0.15.2
- isaaclab_ov: 0.4.2 → 0.4.3
- isaaclab_physx: 1.1.3 → 1.1.4
- isaaclab_tasks: 2.0.3 → 3.0.0
- isaaclab_visualizers: 0.1.2 → 0.1.3
# Description

Cleans up and migrates the core `reach` tasks in `isaaclab_tasks`,
following the cartpole/ant/humanoid migration pattern. Also promotes the
reach pose-tracking rewards into the shared `isaaclab.envs.mdp` terms.

**Affected packages:** `isaaclab_tasks`, `isaaclab`. **Breaking** — see
changelog fragments for migration.

#### Task ID renames (Breaking)

- Dropped the `-v0` suffix from all reach Gym IDs (manager-based, robot
name retained):
- `Isaac-Reach-Franka-v0` → `Isaac-Reach-Franka` (+ `-Play`, `-OSC`,
`-OSC-Play`)
  - `Isaac-Reach-UR10-v0` → `Isaac-Reach-UR10` (+ `-Play`)

#### Pose-tracking rewards centralized (Breaking)

- Moved `position_command_error`, `position_command_error_tanh`,
`orientation_command_error` to `isaaclab.envs.mdp.rewards` (alongside
the existing velocity-tracking terms), with SI-unit docstrings.
- Removed the `isaaclab_tasks.core.reach.mdp` package entirely.
- Repointed all consumers (core reach, contrib OpenArm reach, contrib
Digit loco-manip) to `import isaaclab.envs.mdp as mdp` — no task reaches
into another task's package for these anymore.

#### Code cleanup (no behavior change)

- `position_command_error_tanh` now reuses `position_command_error`
instead of duplicating the position computation.
- `osc_env_cfg`: dropped redundant robot re-creation + duplicate import;
mutates the parent's actuators in place.
- `reach_env_cfg`: `ReachPhysicsCfg` references `default = physx` (no
duplicate `PhysxCfg`); unified sim-config imports under `sim_utils`.
- Standardized the Franka RSL-RL experiment name `franka_reach` →
`reach_franka` (matches sibling configs + UR10).

#### References updated

- Tests (`test_rsl_rl_export_flow`, benchmarking `configs.yaml`),
benchmark scripts, hydra docstring, and docs (`hydra`, `wrap_rl_env`,
`environments`, `rl_existing_scripts`, leapp export).

## 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
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
Bumped packages:
- isaaclab: 6.4.0 → 6.5.0
- isaaclab_tasks: 3.0.0 → 4.0.0
…#6015)

# Description

Updates references of Isaac Sim pip wheel to point to the latest release
6.0.0.1 build.
Updates staging S3 path to production.
Updates Newton 1.2.1 to released pip wheel.


## Type of change

<!-- As you go through the list, delete the ones that are not
applicable. -->

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## 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
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] I have updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [ ] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

<!--
As you go through the checklist above, you can mark something as done by
putting an x character in it

For example,
- [x] I have done this task
- [ ] I have not done this task
-->
# Description

Fix the multi-doc build, the new -j argument is not getting parsed
correctly.


## Checklist

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

Fixes local mirroring of remote USD assets that reference MDL materials
with texture defaults. The previous recursive download path discovered
USD dependencies, including MDL files, but did not discover texture
resources referenced from inside those MDL files. When the mirrored MDL
files were loaded locally, RTX attempted to resolve their relative
texture defaults from the local mirror and emitted unresolved texture
warnings.

This generalizes the dependency discovery helper so the download loop
asks for dependencies from each mirrored asset. USD files continue to
use OpenUSD dependency discovery, and MDL files now contribute quoted
texture resource paths for the same mirror-download path.

Fixes # N/A

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Screenshots

N/A

## Testing

- `PYTHONPATH=/tmp/isaaclab-pr-mdl/source/isaaclab python -m pytest
source/isaaclab/test/utils/test_assets.py -q`
  - `4 passed`
- Re-ran the locomanipulation scene repro with a fresh `TMPDIR` asset
mirror.
  - `texture_warnings 0`
  - PackingTable MDL textures were downloaded into the fresh mirror.

## Checklist

- [ ] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [ ] I have made corresponding changes to the documentation
- [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 added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [ ] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
# Description

<!--
Thank you for your interest in sending a pull request. Please make sure
to check the contribution guidelines.

Link:
https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html

💡 Please try to keep PRs small and focused. Large PRs are harder to
review and merge.
-->

This PR updates the demo scripts to support running across the default
KitViz/PhysX path and NewtonViz/Newton-MJWarp backend combinations.

The affected demos now use consistent CLI parsing, import ordering,
usage comments, default Kit visualizer behavior, and visualizer-aware
simulation loops. It also tunes selected Newton MJWarp solver parameters
for demos that need more stable articulation/contact behavior, avoids
resolving `InteractiveScene` before simulation launch in
`bin_packing.py`, and adds Newton visualizer support for
`SimulationContext.set_camera_view()`.

**Dependencies**

 - isaac-sim#5826
 - isaac-sim#5892

<!-- As a practice, it is recommended to open an issue to have
discussions on the proposed pull request.
This makes it easier for the community to keep track of what is being
developed or added, and if a given feature
is demanded by more than one party. -->

## Type of change

<!-- As you go through the list, delete the ones that are not
applicable. -->

 - Bug fix (non-breaking change which fixes an issue)
 -  New feature (non-breaking change which adds functionality)
 - Documentation update

## Validation
Validated the demo matrix for:
  - `scripts/demos/arl_robot_1.py`
  - `scripts/demos/arms.py`
  - `scripts/demos/bin_packing.py`
  - `scripts/demos/bipeds.py`
  - `scripts/demos/hands.py`
  - `scripts/demos/quadcopter.py`
  - `scripts/demos/quadrupeds.py`

with:

  - default Kit visualizer + PhysX
  - Newton visualizer + PhysX
  - default Kit visualizer + Newton MJWarp
  - Newton visualizer + Newton MJWarp

## Screenshots

<img width="960" height="540" alt="arms"
src="https://github.com/user-attachments/assets/cdc8916d-f6b3-4f23-b41e-dd977e97f1c5"
/>
<img width="960" height="540" alt="bin_packing"
src="https://github.com/user-attachments/assets/c3ce3d93-af55-4538-b776-3826ab19cd42"
/>
<img width="960" height="540" alt="bipeds"
src="https://github.com/user-attachments/assets/686df89f-5926-4002-aafe-16c4d325c3ff"
/>
<img width="960" height="540" alt="hands_fixed"
src="https://github.com/user-attachments/assets/ebc62ee0-37c5-44d8-9d8b-84584f8dca74"
/>
<img width="960" height="540" alt="quadcopter"
src="https://github.com/user-attachments/assets/6d954b80-3946-4ca3-befd-35a1499e6427"
/>
<img width="960" height="540" alt="quadrupeds"
src="https://github.com/user-attachments/assets/eda177b3-02fb-4393-940e-39de9aca249f"
/>


<!--
Example:

| Before | After |
| ------ | ----- |
| _gif/png before_ | _gif/png after_ |

To upload images to a PR -- simply drag and drop an image while in edit
mode and it should upload the image directly. You can then paste that
source into the above before/after sections.
-->

## 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
- [ ] 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
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

<!--
As you go through the checklist above, you can mark something as done by
putting an x character in it

For example,
- [x] I have done this task
- [ ] I have not done this task
-->

---------

Signed-off-by: Yize Wang <yizew@nvidia.com>
Co-authored-by: Yize Wang <yizew@nvidia.com>
## Summary

This PR removes backend-specific cloning logic from `InteractiveScene`
and
replaces the previous implicit `replicate_session_defaults` /
`replicate_session` machinery with three orthogonal, explicit primitives
that
compose identically whether you drive cloning through `InteractiveScene`
or
by hand in a `DirectRLEnv` or standalone script.

The result is that `InteractiveScene` no longer knows anything about USD
vs.
PhysX vs. Newton — it just enters a `ReplicateSession` and lets each
asset's
constructor register the backend(s) it needs. This is foundational for
two
follow-on capabilities the project has wanted for a while: **flexible
backend
cloning** and **skip-cloning workflows**.

## What changed

### New core primitives in `isaaclab.cloner`

- **`REPLICATION_QUEUE`** — module-level list that asset constructors
append
  `(cfg, BackendCtxCls)` pairs to via tiny per-backend helpers
  (`queue_usd_replication`, `queue_physx_replication`,
`queue_newton_replication`). Backends are no longer special-cased inside
  `InteractiveScene`; each one self-registers.
- **`ClonePlan`** — self-contained dataclass describing the world layout
  (`sources`, `destinations`, `clone_mask`, `env_ids`, `positions`,
  `cfg_rows`). Stage-agnostic by design; the USD stage is now passed
explicitly to consumers so the same plan can be replayed, inspected, or
  serialized.
- **`replicate(plan, *, stage)`** — free function that drains
`REPLICATION_QUEUE` against a plan, groups queued cfgs by backend
context
class, runs each context in ascending `replicate_priority` order
(physics
  before USD), publishes the plan to `SimulationContext`, and clears the
queue. The queue is snapshotted and cleared up front so a backend
failure
  cannot leak stale entries into the next call.
- **`ReplicateSession`** is now a thin context manager that calls
  `make_clone_plan` in `__enter__` and `replicate` in `__exit__`. The
  state-bag version with `plan` / `stage` / `cfg_rows` /
  `replicate_on_exit` fields is gone.
- **`ClonePlan.from_env_0`** — classmethod that builds the single-source
  homogeneous plan most direct envs need by auto-populating `cfg_rows`
  from `REPLICATION_QUEUE` filtered by env-root prefix.
- **`CloneCfg.clone_regex`** (default `"/World/envs/env_.*"`) — single
  source of truth for the env-namespace convention. `InteractiveScene`
  reads it directly when expanding `{ENV_REGEX_NS}` cfg macros.

### Two equivalent invocation paths

```python
# InteractiveScene path (what the scene runs under the hood)
with cloner.ReplicateSession(cfgs, num_clones=N, env_spacing=2.0,
                             device=device, stage=stage):
    for cfg in cfgs:
        cfg.class_type(cfg)

# Direct env / script path
plan = cloner.ClonePlan.from_env_0(src, dest, num_envs, device, positions)
cloner.replicate(plan, stage=scene.stage)
```

Both end in the same `cloner.replicate(plan, stage=...)` call. The only
difference is how the plan was built and how asset construction was
interleaved.

### What got removed from `InteractiveScene`

- `clone_environments(...)` deprecated shim. The scene now replicates
  inside `__init__` via `ReplicateSession`.
- `env_ns` / `env_regex_ns` properties (used only internally).
- `_build_clone_plan_from_cfg` and `_default_env_origins` internals.
  Cfg-driven plan construction now lives in `make_clone_plan`; per-env
  positions are read from the published `ClonePlan`.
- `InteractiveScene.env_origins` now reads from the plan published to
  `SimulationContext`, making the plan the single source of truth for
  env placement.

### Why this matters (the actual point of the PR)

This refactor is foundational for two capabilities the current scene
coupling blocks:

- **Flexible backend cloning.** Backends now plug in by shipping a
  `<Backend>ReplicateContext` class + a one-line queue helper. Swapping
  PhysX ↔ Newton no longer requires `InteractiveScene` to change; cfgs
  and user code stay untouched, and a third-party backend can register
  itself without modifying core.
- **Skip-cloning workflows.** Because plan construction, asset
  registration, and drain are three independent primitives, callers
  that want to author env-0 prims by hand and skip the cloner — or
  drive replication out-of-band from a visualizer, replay tool, or
  test fixture — can do so without fighting `InteractiveScene`.

## Migration notes

- `with cloner.ReplicateSession():` (no-arg) →
  `cloner.replicate(cloner.ClonePlan.from_env_0(...), stage=...)`.
- `InteractiveScene.clone_environments(...)` → removed; the scene
  replicates inside `__init__`.
- `make_clone_plan(sources, destinations, ...)` →
  `make_clone_plan(cfgs, num_clones, env_spacing, device, ...)`.
- Pass `stage=...` explicitly to `replicate()` and `ReplicateSession()`.
- Read `CloneCfg.clone_regex` if you previously used
  `InteractiveScene.env_ns` / `env_regex_ns`.

About 17 direct envs were migrated to the new pattern in this PR.

## Test plan

- [ ] `./isaaclab.sh -p -m pytest
source/isaaclab/test/sim/test_cloner.py`
- [ ] `./isaaclab.sh -p -m pytest
source/isaaclab/test/scene/test_interactive_scene.py`
- [ ] `./isaaclab.sh -p -m pytest
source/isaaclab_physx/test/sim/test_cloner.py`
- [ ] Migrated direct envs (`cartpole`, `anymal_c`, `franka_cabinet`,
      `factory`, `humanoid_amp`, `inhand_manipulation`, `locomotion`,
`quadcopter`, `shadow_hand_*`, `automate/*`, `cart_double_pendulum`,
      `cartpole_warp`, `inhand_manipulation_warp`, `locomotion_warp`)
      spawn and step on PhysX
- [ ] Same envs spawn and step on Newton
- [ ] `./isaaclab.sh -f` passes
- [ ] Docs build (`cd docs && make html`)
Bumped packages:
- isaaclab: 6.5.0 → 6.6.0
- isaaclab_contrib: 0.4.4 → 0.4.5
- isaaclab_newton: 0.15.2 → 0.15.3
- isaaclab_visualizers: 0.1.3 → 0.1.4
# Description

Adds an OvPhysX runtime import helper so missing optional `ovphysx`
wheel failures report the supported install command instead of a raw `No
module named ovphysx` error.

This routes `isaaclab_ovphysx.tensor_types` and `OvPhysxManager`
bootstrap imports through the helper, preserves nested
missing-dependency errors, updates the OvPhysX backend docs, and adds a
focused regression test.

Related to isaac-sim#5991.

Fixes: N/A

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## Screenshots

N/A

## Validation

- `./isaaclab.sh -p -m pytest
source/isaaclab_ovphysx/test/test_runtime_imports.py` -> 2 passed
- `SKIP=check-git-lfs-pointers ./isaaclab.sh -f` -> passed
- `./isaaclab.sh -f` was attempted before commit and before push; it
fails only at `check-git-lfs-pointers` because `git-lfs` is not
installed in this local environment.

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [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 added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
# Description

Updates applicable commands in documentation to use python instead of
platform specific isaaclab.sh/.bat scripts. Include windows commands
where needed.


## Type of change

- Documentation update

## 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
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] I have updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [ ] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

<!--
As you go through the checklist above, you can mark something as done by
putting an x character in it

For example,
- [x] I have done this task
- [ ] I have not done this task
-->

---------

Signed-off-by: Kelly Guo <kellyg@nvidia.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
# Description

This PR fixes dependency resolution for non-camera Newton/PhysX/OV
workflows by making isaaclab_ppisp a peer IsaacLab extension instead of
a hard dependency of isaaclab_newton,
  isaaclab_physx, and isaaclab_ov.

Previously, installing or resolving isaaclab-newton[all] could fail when
isaaclab-ppisp was unavailable from the package registry, even for
workloads that do not use camera ISP. This
change keeps PPISP available through isaaclab[all], while renderer code
imports it only when CameraCfg.isp_cfg is set. If PPISP is missing and
ISP is requested, the renderer now raises an
  actionable install error.

Dependencies required: none beyond existing IsaacLab extension
dependencies. isaaclab_ppisp remains required only when using camera
isp_cfg.

  Fixes # (issue)

  ## Type of change

  - Bug fix (non-breaking change which fixes an issue)

  ## Screenshots

  Not applicable.

  ## 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
  - [ ] 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
- [ ] I have added my name to the CONTRIBUTORS.md or my name already
exists there
@github-actions github-actions Bot added documentation Improvements or additions to documentation isaac-lab labels Jun 8, 2026
lgulich and others added 11 commits June 8, 2026 20:42
## Summary
The current LEAPP export exports projected_gravity as an input instead
of root_quat_w.
The reason is that with the change to use warp for observation terms
LEAPP can no longer automatically trace projected gravity back to
root_quat_w. For new we fix this manually, once we have warp support in
LEAPP this will no longer be needed.

## Changes
- Export `mdp.projected_gravity` through `root_quat_w` for LEAPP graphs.
- Keep the policy observation as projected gravity by computing it
inside the exported graph.
- Add regression coverage and a changelog fragment.

## Test Plan
- `uv run --with pytest --with leapp python -m pytest
source/isaaclab_rl/test/export/test_leapp_proxy.py -q`
- `uv run --with ruff --with leapp ruff check
source/isaaclab/isaaclab/utils/leapp/export_annotator.py
source/isaaclab/isaaclab/utils/leapp/proxy.py
source/isaaclab_rl/test/export/test_leapp_proxy.py`
- `./isaaclab.sh -f`
- Exported `Isaac-Velocity-Flat-G1-v0` checkpoint `model_1499.pt` and
verified YAML uses `state/body/rotation` for `robot_root_quat_w`.

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…m#5735)

# Description

<!--
Thank you for your interest in sending a pull request. Please make sure
to check the contribution guidelines.

Link:
https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html

💡 Please try to keep PRs small and focused. Large PRs are harder to
review and merge.
-->

Please include a summary of the change and which issue is fixed. Please
also include relevant motivation and context.
List any dependencies that are required for this change.

Fixes # (issue)

<!-- As a practice, it is recommended to open an issue to have
discussions on the proposed pull request.
This makes it easier for the community to keep track of what is being
developed or added, and if a given feature
is demanded by more than one party. -->

## Type of change

<!-- As you go through the list, delete the ones that are not
applicable. -->

- 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)
- Documentation update

## Screenshots

Please attach before and after screenshots of the change if applicable.

<!--
Example:

| Before | After |
| ------ | ----- |
| _gif/png before_ | _gif/png after_ |

To upload images to a PR -- simply drag and drop an image while in edit
mode and it should upload the image directly. You can then paste that
source into the above before/after sections.
-->

## Checklist

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

<!--
As you go through the checklist above, you can mark something as done by
putting an x character in it

For example,
- [x] I have done this task
- [ ] I have not done this task
-->
## Summary
- Update the quadruped base tutorial to import UniformNoiseCfg, which is
the current noise config API used elsewhere in the repo.
- Preserve behavior: UniformNoiseCfg defaults to additive noise,
matching the tutorial usage.

## Validation
- python3 -m py_compile
scripts/tutorials/03_envs/create_quadruped_base_env.py
- pre-commit run --files
scripts/tutorials/03_envs/create_quadruped_base_env.py
- python3 tools/changelog/cli.py check develop

Full Kit launch was not run locally; this environment does not have the
prepared Isaac Lab runtime dependencies installed.
## Summary
- Collect relative MDL module imports when mirroring remote assets
locally.
- Covers ordinary `import` and `[export] using ... import ...` forms,
including current-package `.::` imports and parent-package `..::`
imports.
- Leaves global/built-in MDL modules to the renderer module path while
preserving existing MDL texture dependency handling.

## Validation
- `python3 -m py_compile source/isaaclab/isaaclab/utils/assets.py
source/isaaclab/test/utils/test_assets.py`
- direct importlib check for `_find_mdl_dependencies` with
Hospital-style relative imports, using-imports, and parent-relative
imports
- `python3 tools/changelog/cli.py check develop`
- `pre-commit run --files source/isaaclab/isaaclab/utils/assets.py
source/isaaclab/test/utils/test_assets.py
source/isaaclab/changelog.d/fix-mdl-module-dependencies.rst`

Focused pytest was not runnable in this shell because the local Python
environment is missing `lazy_loader`. Full Kit/Hospital viewport repro
was not run locally.
# Description

Move compass training tutorial doc to COMPASS repo
## Summary
- increase AutoMate assembly/disassembly PhysX GPU collision stack size
from the default 2**26 to 2**27
- reject placeholder/non-5-digit AutoMate assembly IDs in the run
helpers before they mutate config or launch simulation
- update AutoMate docs to use a concrete runnable assembly ID example
- add a lightweight config/helper regression test and an isaaclab_tasks
changelog fragment

## Rationale
The reported Windows beta2 disassembly run for assembly_id 00032 asks
PhysX for a collision stack of roughly 75-86 MB, above the default 2**26
bytes. This keeps the memory change scoped to AutoMate's high-contact
128-env tasks instead of raising the global PhysX default for unrelated
environments.

A second reported DGX Spark command passed the literal docs placeholder
`ASSEMBLY_ID`, which was written into the task config and only failed
later as a missing remote USD path. The helpers now fail fast with an
argparse message before launching Kit.

## Validation
- `python3 tools/changelog/cli.py check develop`
- `python3 -m py_compile
source/isaaclab_tasks/isaaclab_tasks/contrib/automate/run_w_id.py
source/isaaclab_tasks/isaaclab_tasks/contrib/automate/run_disassembly_w_id.py
source/isaaclab_tasks/test/contrib/test_automate_cfg.py
source/isaaclab_tasks/isaaclab_tasks/contrib/automate/disassembly_env_cfg.py
source/isaaclab_tasks/isaaclab_tasks/contrib/automate/assembly_env_cfg.py`
- `.venv/bin/python -m pytest
source/isaaclab_tasks/test/contrib/test_automate_cfg.py`
- `uvx ruff==0.14.10 check --fix
source/isaaclab_tasks/test/contrib/test_automate_cfg.py
source/isaaclab_tasks/isaaclab_tasks/contrib/automate/run_w_id.py
source/isaaclab_tasks/isaaclab_tasks/contrib/automate/run_disassembly_w_id.py
source/isaaclab_tasks/isaaclab_tasks/contrib/automate/disassembly_env_cfg.py
source/isaaclab_tasks/isaaclab_tasks/contrib/automate/assembly_env_cfg.py`
- `uvx ruff==0.14.10 format
source/isaaclab_tasks/test/contrib/test_automate_cfg.py
source/isaaclab_tasks/isaaclab_tasks/contrib/automate/run_w_id.py
source/isaaclab_tasks/isaaclab_tasks/contrib/automate/run_disassembly_w_id.py
source/isaaclab_tasks/isaaclab_tasks/contrib/automate/disassembly_env_cfg.py
source/isaaclab_tasks/isaaclab_tasks/contrib/automate/assembly_env_cfg.py`
- `git diff --check`
- `.venv/bin/python
source/isaaclab_tasks/isaaclab_tasks/contrib/automate/run_w_id.py
--assembly_id=ASSEMBLY_ID --train --max_iterations 10` exits at argparse
with the placeholder-specific message and does not mutate the task
config

Could not run the full PhysX/Kit repro locally because this machine's uv
environment does not have Isaac Sim/Kit on PYTHONPATH; the command fails
before simulation with Isaac Sim not installed.
## Summary
- Skip environment destructor cleanup once Python import shutdown has
started (`sys.meta_path is None`).
- Apply the guard consistently to `DirectRLEnv`, `DirectMARLEnv`, and
`ManagerBasedEnv`.
- Add regression coverage that verifies destructors still close during
normal runtime but do not call `close()` after import shutdown begins.

## Validation
- `PYTHONPATH=/tmp/isaaclab-directrl-del/source/isaaclab
/home/zhengyuz/Projects/IsaacLab.wt/decouple-physics-events/env_isaaclab/bin/python
-m pytest source/isaaclab/test/envs/test_env_destructors.py -q`
- `git diff --check`
- `python -m py_compile source/isaaclab/isaaclab/envs/direct_rl_env.py
source/isaaclab/isaaclab/envs/direct_marl_env.py
source/isaaclab/isaaclab/envs/manager_based_env.py
source/isaaclab/test/envs/test_env_destructors.py`
- `python3 tools/changelog/cli.py check _tmp-upstream-develop`
- Shortened Newton RL-Games repro completed with no `Exception ignored`,
`sys.meta_path is None`, `ImportError`, or shutdown traceback:
`Isaac-Repose-Cube-Allegro-Direct-v0`, `presets=newton`, `--headless`,
`--max_iterations 1`, `--num_envs 2048`
# Description

Fixes a skrl error where jax experimental is not imported and must be
imported manually

## Checklist

- [ ] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] I have updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [ ] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
Fix for failure to load the following command:

`python -u scripts/reinforcement_learning/skrl/play.py --task
Isaac-Velocity-Rough-Anymal-C-Direct-v0 --visualizer kit `

Due to missing extensions

## 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
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
# Description

Consolidates the rigid and soft Franka lifting tasks into a single
`isaaclab_tasks.core.lift` package, eliminating the duplicated
`lift_franka_soft` task and its parallel `mdp` module. Soft and cloth
variants
now live as configs alongside the rigid one and share a common MDP
package.

#### Changes

#### Package consolidation (breaking)
- Moved `isaaclab_tasks.core.lift_franka_soft` under
`isaaclab_tasks.core.lift.config.franka_soft`, next to the rigid
`franka`
  config.
- Merged the deformable MDP terms (observations, rewards, terminations)
into the
shared `isaaclab_tasks.core.lift.mdp` package instead of a separate
per-variant
  `mdp`. The old `lift_franka_soft/mdp` module is removed.

#### Environment IDs (breaking)
- Dropped the `-v0` version suffix from all lift Gym environment IDs:
  - `Isaac-Lift-Cube-Franka-v0` → `Isaac-Lift-Cube-Franka`
  - `Isaac-Lift-Cube-Franka-Play-v0` → `Isaac-Lift-Cube-Franka-Play`
  - `Isaac-Lift-Soft-Franka-v0` → `Isaac-Lift-Soft-Franka`
  - `Isaac-Lift-Cloth-Franka-v0` → `Isaac-Lift-Cloth-Franka`

#### Fixes
- Renamed the `Isaac-Lift-Cloth-Franka` physics preset from the
misspelled
`newton_mjwarp_vdb` to `newton_mjwarp_vbd`, matching the soft-body task
and the
  underlying VBD solver.
- The cloth `RewardsCfg`, which duplicated the soft task's rewards
verbatim, now
  inherits them instead of redefining.

#### Misc
- Updated imports, docs, benchmarks, and tests to reference the new
module paths
  and environment IDs.
- Minor docstring/comment cleanup in `lift_env_cfg.py`.

#### Migration

```python
# Before
from isaaclab_tasks.core.lift_franka_soft.franka_soft_env_cfg import FrankaSoftEnvCfg
# After
from isaaclab_tasks.core.lift.config.franka_soft.franka_soft_env_cfg import FrankaSoftEnvCfg

# Deformable MDP terms now come from the shared package
from isaaclab_tasks.core.lift.mdp import deformable_lifted
```

Update any `gym.make(...)` / `--task` calls to use the unversioned
environment
IDs listed above.


## Checklist

- [ ] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] I have updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [ ] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
…tonSiteFrameView` (isaac-sim#6047)

# Description

Fixed incorrect camera pose in
:class:`~isaaclab_newton.sim.views.NewtonSiteFrameView`.

The code change is cherry-picked from isaac-sim#5979 .

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## 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
- [ ] 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
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
ooctipus and others added 12 commits June 8, 2026 20:12
## Summary
- Remove `numba` from `isaaclab_tasks` dependencies.
- Replace AutoMate's Numba CUDA/CPU-JIT SoftDTW helper with a Torch
implementation that runs on the input tensor device.
- Add a no-grad anti-diagonal SoftDTW path plus
`forward_with_lengths(...)` so the AutoMate reward evaluates padded
variable-length reference segments in one batched call instead of one
SoftDTW call per environment.
- Clean up the autograd SoftDTW path to use a Torch DP table instead of
Python row lists, with a clearer docstring.
- Remove the Numba CUDA warning environment variable from `run_w_id.py`.
- Add focused SoftDTW tests for the no-Numba path, hard DTW, normalized
SoftDTW, variable-length padded SoftDTW, and finite backward gradients.

## Rationale
The original failure is not a sustainable place to solve with a NumPy
pin. AutoMate only needs SoftDTW values for reward computation; it does
not require the copied differentiable Numba implementation as a
package-level dependency. Keeping Numba also exposes a second failure
mode on RTX 5090: the old Numba CUDA kernel can fail at compile time
with `CUDA_ERROR_UNSUPPORTED_PTX_VERSION` / unsupported PTX version.

This removes the dependency instead of constraining global NumPy
resolution.

## Verification
- Focused tests pass in the develop venv: `python -m pytest
source/isaaclab_tasks/test/contrib/test_automate_soft_dtw.py -q` (`5
passed`).
- Focused tests pass in the beta2 venv where Numba import is broken (`5
passed`).
- `git diff --check` passes.
- `py_compile` passes for the touched Python files.
- Old-vs-new SoftDTW CPU forward parity: 594 finite cases across
`gamma={0.01,0.1,1.0}`, normalized/non-normalized valid cases, bandwidth
`{None,2,20}`, and sequence lengths up to `B=8,N=10,M=100`; max absolute
difference was `1.526e-04`.
- Mustafa's row/column Torch DP variant matched the current no-grad
implementation exactly in direct forward checks; for `B=128,N=10,M=100`,
it measured `82.497 ms` on CUDA versus `14.038 ms` for the anti-diagonal
no-grad SoftDTW path, so this PR keeps the anti-diagonal path for reward
inference while using the cleaner Torch DP-table style for autograd.
- For `gamma=0`, the old implementation returns `nan` on a simple
hard-DTW case; the new implementation returns the expected hard-DTW
value `1.0`.
- New SoftDTW autograd smoke test produces finite gradients.
- AutoMate reward parity: optimized length-aware reward path matches the
original per-env reward loop on synthetic AutoMate-shaped data (`128`
envs, `10` robot waypoints, `ref_len=100`, `gamma=0.01`); max absolute
error was `0.0` on CPU and CUDA.

## Performance
Synthetic AutoMate-shaped reward benchmark on RTX 5090 with Torch
`2.10.0+cu128`, `128` envs, `10` robot waypoints, `ref_len=100`,
`gamma=0.01`, `no_grad`:

| Path | CPU median | CUDA median | CUDA peak allocated delta |
| --- | ---: | ---: | ---: |
| Per-env Torch reward loop | `141.617 ms` | `355.131 ms` | `15.372 MB`
|
| Batched length-aware Torch reward | `13.483 ms` | `25.824 ms` |
`15.372 MB` |

The peak CUDA allocation in this reward benchmark is dominated by the
closest-state `torch.cdist` calculation, not by the SoftDTW table.

The previous Numba CUDA path could not be timed on this RTX 5090 because
it fails locally with `CUDA_ERROR_UNSUPPORTED_PTX_VERSION`; the
performance comparison above is against the direct per-env Torch
replacement path that this PR would otherwise have used.
# Description
Fixes leapp lstm policy export. Previously it hooked onto structures in
rslrl=3.1.2. The update now makes it work for rslrl=5.0.1, same version
as the one in the pyproject.toml. Added a regression test to test if
rslrl rnns work new test generates a dummy policy with rnn and tests the
export. Previous it was assumed that there was one policy with a
pretrained checkpoint that had an rnn but turns out there isn't any that
by default run rnns so this error slipped through.

## Type of change

<!-- As you go through the list, delete the ones that are not
applicable. -->

- Bug fix (non-breaking change which fixes an issue)


## 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
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

<!--
As you go through the checklist above, you can mark something as done by
putting an x character in it

For example,
- [x] I have done this task
- [ ] I have not done this task
-->
Bumped packages:
- isaaclab: 6.6.0 → 6.6.1
- isaaclab_newton: 0.15.3 → 0.15.4
- isaaclab_ov: 0.4.3 → 0.4.4
- isaaclab_ovphysx: 3.0.2 → 3.0.3
- isaaclab_physx: 1.1.4 → 1.1.5
- isaaclab_rl: 0.6.0 → 0.6.1
- isaaclab_tasks: 4.0.0 → 5.0.0
## Summary
- call Newton rigid-object pose and velocity helper methods with
explicit keyword arguments from deprecated root-state writer wrappers
- align the Newton rigid-object wrappers with the keyword-only helper
signatures and the other physics backends
- add a Newton changelog fragment

## Tests
- `git diff --cached --check` before commit
- syntax parsed modified Python file with `ast.parse`
- Not run: Isaac Sim tests in this local environment are missing Python
dependency `lazy_loader`
…6060)

# Description

Since the non-root Docker migration (isaac-sim#5618, first shipped in
3.0.0-beta2), the
container runs as user `isaaclab` (uid/gid 1000) with `HOME=/root`.
Persistent
mounts at `/root/.local/share/ov/data` that were created by an older
root-based
image (stale named volumes) or by Docker as auto-created bind-mount dirs
are
owned by `root`, so the runtime user cannot write the extension-registry
cache.
For XR teleop this aborts startup with a confusing, seemingly-unrelated
error:
PermissionError: [Errno 13] Permission denied:
'/root/.local/share/ov/data/exts'
    ...
No versions of omni.kit.xr.bundle.generic that satisfies:
isaaclab.python.xr.openxr-3.0.0 ...
    Exiting app because of dependency solver failure...
The XR bundle isn't actually missing — the registry never synced because
its
cache dir couldn't be created. This PR documents the cause and fix:
- **`docs/source/how-to/cloudxr_teleoperation.rst`**: adds an admonition
to the
"Run with Docker" section explaining the failure and the fix
(recreate/chown
  volumes for Compose, pre-create/chown host dirs for single-container).
- **`docs/source/deployment/docker.rst`**: warns that non-root prebuilt
images
need bind-mount host dirs pre-created and chowned to uid/gid 1000, with
a
  copy-paste snippet.
Docs-only; no code changes and no changelog fragment (no `source/<pkg>/`
package
touched).

Fixes # (issue)

## Type of change

- Documentation update

## 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
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
# Description

Promote the publicly available `ovphysx` PyPI wheel out of the manual
`ov[ovphysx]` extra and into the default `./isaaclab.sh --install` flow,
mirroring how the newton wheel is treated. The OVRTX renderer wheel
stays opt-in via `--install 'ov[ovrtx]'` or `--install 'ov[all]'`.

Concretely:

- `MANUAL_EXTRA_FEATURES` drops `"ov"` (it now only contains
`"contrib"`), so the `ov` feature is part of the automatic `-i` / `-i
all` set alongside `newton`, `rl`, and `visualizer`.
- `_install_ov_extra_dependencies("")` no longer prints a help message
and returns; it now installs `isaaclab_ovphysx[ovphysx]`. Explicit
`ov[ovrtx]`, `ov[ovphysx]`, and `ov[all]` behavior is unchanged.
- CLI `--install` help text and the `command_install` docstring are
updated to reflect the new default.
- With the wheel guaranteed in every standard install, the
`pytest.importorskip("ovphysx.types", reason="ovphysx wheel not
installed")` guards (9 sites) and one inner
`importorskip("isaaclab_ovphysx.tensor_types")` call are removed from
the `isaaclab_ovphysx` test suite. The `isaaclab_ov` CI job (whose
`filter-pattern: "isaaclab_ov"` already collects these tests) now
exercises them for real instead of silently skipping.

No new required dependency is added; `source/isaaclab_ovphysx/setup.py`
already declared `EXTRAS_REQUIRE = {"ovphysx": ["ovphysx"]}`. The extra
remains unpinned for now — pinning a minimum version is a sensible
follow-up once we lock in a release.

Fixes # (n/a)

## Type of change

- New feature (non-breaking change which adds functionality)

Strictly, the default install footprint grows by one PyPI wheel and
previously-skipped tests now run, so downstream consumers of `--install`
see new behavior — but no public API is removed or renamed and all
existing `ov[...]` selectors continue to work as before.

## Screenshots

N/A — install-CLI and test-gating change.

## 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 (CLI
`--help` text and `command_install` docstring updated)
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works (new `test_all_installs_ov_with_default_ovphysx_selector`
plus updates to `test_manual_extra_features` and
`test_all_does_not_install_manual_extra_dependencies`; 51/51 pass in
`test_install_command_parsing.py`)
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package —
`source/isaaclab/changelog.d/antoiner-ovphysx-default-install.rst` and
`source/isaaclab_ovphysx/changelog.d/antoiner-ovphysx-default-install.rst`
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
# Description

Fixes rigid-body ancestor expression resolution for sensors mounted
under a
non-rigid child when the terminal child suffix also appears earlier in
the path.
The old implementation used an unbounded ``str.replace()``, which could
remove
more than the sensor-relative suffix.

Simple example:

```text
target_expr   = /World/envs/env_.*/Robot/link/link
relative_path = link
old result    = /World/envs/env_.*/Robot
new result    = /World/envs/env_.*/Robot/link
```

The fix verifies that the relative path is a terminal suffix and slices
only that
end segment.

No issue filed.

Validation:

- `./isaaclab.sh -p -m pytest
source/isaaclab/test/sensors/test_sensor_base.py::test_rigid_body_ancestor_expr_trims_only_terminal_suffix
-q`
- `PATH=/tmp/git-lfs-v3.7.1:$PATH ./isaaclab.sh -f`

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Screenshots

Not applicable.

## 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, or
documentation is not required for this change
- [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 added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
…n_context (isaac-sim#5881)

## Summary

- `build_simulation_context(device="cuda:N", sim_cfg=...)` silently
dropped the explicit `device` kwarg when a `sim_cfg` was passed, falling
back to `sim_cfg.device` (default `cuda:0`).
- The multi-GPU CI lane sets `ISAACLAB_SIM_DEVICE=cuda:N` per shard, so
tests that pass `device="cuda:N"` got `cuda:0` instead. Downstream Warp
kernels then ran on `cuda:0` while the rest of the test believed it was
on `cuda:N`:
  ```
RuntimeError: Error launching kernel 'set_root_link_pose_to_sim_index',
  trying to launch on device='cuda:0',
  but input array for argument 'env_ids' is on device=cuda:2.
  ```
- Fix: make `device`'s default `None` (sentinel) and apply it as an
override after `sim_cfg` is resolved, so an explicit kwarg wins whether
or not a `sim_cfg` was supplied.

## 1. The bug

```python
def build_simulation_context(..., device: str = "cuda:0", sim_cfg=None, ...):
    if sim_cfg is None:
        sim_cfg = SimulationCfg(device=device, ...)
    # ^^ explicit `device` only used in the no-sim_cfg path; otherwise ignored
```

When a caller passed both `sim_cfg=<built with default device>` and
`device="cuda:2"`, the kwarg was thrown away. Code that pulled the
active device from `sim_cfg.device` saw `cuda:0`; Warp arrays allocated
against the cfg device landed on `cuda:0` while torch ops driven by the
kwarg ran on `cuda:2` — the cross-device kernel-launch error above.

## 2. Fix

```python
def build_simulation_context(..., device: str | None = None, sim_cfg=None, ...):
    if sim_cfg is None:
        gravity = (0.0, 0.0, -9.81) if gravity_enabled else (0.0, 0.0, 0.0)
        sim_cfg = SimulationCfg(dt=dt, gravity=gravity)
    if device is not None:
        sim_cfg.device = device   # explicit kwarg wins in both branches
```

`device=None` (default) means "use whatever the cfg already has".
`device="cuda:N"` is honored even when a cfg is also passed.

## 3. Validation


`source/isaaclab/test/sim/test_build_simulation_context_{headless,nonheadless}.py::test_build_simulation_context_cfg`
is updated to assert the new override semantics (explicit `device` wins
over `sim_cfg.device`). On local multi-GPU/MIG hardware,
`build_simulation_context(sim_cfg=cfg, device="cuda:N")` previously hit
the kernel-launch assertion; with the fix it runs on the requested
device. Consumed by the multi-GPU CI lane (isaac-sim#5823).
# Description

  This PR adds particle visualization controls to `NewtonVisualizerCfg`.

  It exposes:
  - `show_particles` to enable Newton particle rendering through config.
- `particle_color` to optionally override the Newton viewer particle
color for `/model/particles`.

Motivation: MPM and particle-based demos currently need to reach into
the private Newton viewer instance to show particles
or customize particle appearance. This keeps that behavior on the public
visualizer config surface and preserves Newton’s
  default behavior when `particle_color=None`.

  Fixes # N/A

  ## Type of change

  - New feature (non-breaking change which adds functionality)

  ## Screenshots

  Not applicable.

  ## Checklist

  - [x] I have added tests that prove my feature works
  - [x] I have run the `pre-commit` checks with `./isaaclab.sh --format`
# Description

OVPhysX can run kitless in a state where Carbonite exposes the Fabric
USD notice interface but the Python `usdrt` module is not importable. In
that state, `disabled_fabric_change_notifies()` should fall back to its
intended no-op behavior instead of failing during scene cloning.

This PR keeps Fabric notice suspension active when `usdrt` is available,
but treats only a missing top-level `usdrt` module as unavailable Fabric
notice suspension. It also removes redundant
`queue_usd_replication(...)` calls from the OVPhysX `RigidObject`,
`Articulation`, and `RigidObjectCollection` constructors. OVPhysX assets
continue to enqueue `queue_ovphysx_replication(...)` for backend runtime
cloning.

Fixes #

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Screenshots

Not applicable.

## 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 -f`
- [x] I have made corresponding changes to the documentation, or no
documentation update is required
- [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 added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

## Testing

- `./isaaclab.sh -p -m pytest -q
source/isaaclab/test/sim/test_cloner.py::test_disabled_fabric_change_notifies_noops_when_usdrt_unavailable`
(`1 passed`)
- `./isaaclab.sh -p -m pytest -q
source/isaaclab_physx/test/sim/test_cloner.py::test_disabled_fabric_change_notifies_toggles_ifabricusd_flag`
(`2 passed`)
- `./isaaclab.sh -p -m pytest -q
source/isaaclab_ovphysx/test/sim/test_views_xform_prim_ovphysx.py::test_world_pose_equals_parent_plus_offset
-k cpu` (`1 passed, 1 deselected`)
- `./isaaclab.sh -p -m pytest -q
source/isaaclab_ovphysx/test/sim/test_views_xform_prim_ovphysx.py::test_world_pose_equals_parent_plus_offset
-k cuda` (`1 passed, 1 deselected`)
- `PATH=/tmp/git-lfs-v3.7.1:$PATH ./isaaclab.sh -f`
@ashwinvkNV ashwinvkNV force-pushed the ashwinvk/leapp-observation-term-inputs branch from 8e5fb30 to 4fc0d6e Compare June 9, 2026 18:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation infrastructure isaac-lab isaac-sim

Projects

None yet

Development

Successfully merging this pull request may close these issues.