Repository navigation
[Backport release/3.0.0] Complete develop backports - #7851
Merged
kellyguo11 merged 69 commits intoSep 17, 2026
Merged
kellyguo11 merged 69 commits into
kellyguo11 merged 69 commits into
Conversation
# Description This PR reduces the number of physics views created by `scripts/demos/bin_packing.py`. It keeps the existing scene configuration, clone combinations, and randomized layout flow, but changes each grocery slot to a spawn-only `AssetBaseCfg` and manages all spawned groceries through one flat PhysX `RigidBodyView`. This is a demo-only performance optimization and adds no dependencies. ## Type of change - Performance improvement (non-breaking change) ## Testing - `uv run isaaclab -f` - `uv run python -m py_compile scripts/demos/bin_packing.py` - `uv run isaaclab -p scripts/demos/bin_packing.py --num_envs 2 --visualizer none` The 2-environment PhysX smoke test completed scene setup, created one flat grocery view, and ran without errors. ## Screenshots Not applicable; the rendered scene and randomized layouts are unchanged. ## Checklist - [x] I have read and understood the contribution guidelines. - [x] I have run the pre-commit checks with `uv run isaaclab -f`. - [x] My changes generate no new warnings. - [x] I have tested the updated demo with the PhysX backend. - [x] Documentation changes are not required for this internal demo implementation update. - [x] A changelog fragment is not required because no source package is changed. - [x] My name already exists in `CONTRIBUTORS.md`. (cherry picked from commit 9c209c0)
…c-sim#7375) This PR adds `IsaacContrib-Multitask-Manipulation`, a contributed manager-based environment for training and evaluating one RSL-RL policy across three heterogeneous manipulation layouts: - OpenArm cube lifting - Franka drawer opening - UR10 end-effector reaching The environment uses selection-aware physics-view indexing so that each asset only exists in its task subset while observations and actions remain fixed-width in global environment order. - Adds `SceneEntitySelectionCfg` to resolve task-local assets and map physics-view indices into global environment order, enabling heterogeneous scene subsets across reset, observation, action, reward, command, and termination terms. - Supports multitask training, task-subset evaluation, and single-task evaluation. - Adds a shared observation backbone with task-specific Gaussian policy and value heads. - Masks inactive action dimensions in sampling, entropy, log-probability, KL, and last-action observations. - Adds bounded targets, task-specific timeouts, lift and cabinet success metrics, and playback visualization. The three tasks share manipulation structure but differ in robot state, action semantics, and reward scale. A fully shared policy with one padded action distribution would train irrelevant action dimensions and allow the task with the largest reward scale to dominate the update. The design therefore shares representations where transfer is useful while routing task-specific outputs and normalization where the contracts differ. | Challenge | Solution | Motivation | | --- | --- | --- | | Heterogeneous scene ownership | Add `SceneEntitySelectionCfg`, which maps global environment IDs to each asset's physics-view instance rows and scatters task-local values back into global environment order. | An asset exists only in its task subset, so global environment indices cannot directly index its compact physics view. Explicit mapping prevents incorrect or out-of-range indexing and zero-fills environments where the asset is absent. | | Varied observation dimensions | Concatenate a task ID and zero-filled task blocks into one 95-dimensional policy observation: `3 task ID + 28 lift + 23 cabinet + 19 reach + 22 last action`. Process it with a shared feature extractor. | Gives RSL-RL one fixed observation contract while allowing the backbone to reuse features across tasks. | | Varied action dimensions | Use task-specific Gaussian action heads with dimensions `(8, 8, 6)` and task-specific scalar value heads. Mask inactive action dimensions in actions, log-probability, entropy, KL, and last-action observations. | Prevents unrelated joints from contributing policy gradients while retaining shared actor and critic backbones. | | Varied reward scaling | Normalize PPO advantages independently for lift, cabinet, and reach rollouts. | Prevents a task with larger reward magnitudes from dominating the shared PPO update. | No new dependencies are required. Train: ```bash uv run isaaclab train \ --rl_library rsl_rl \ --task IsaacContrib-Multitask-Manipulation \ --num_envs 16384 \ --seed 42 \ --run_name multitask_manipulation ``` Evaluate a specific checkpoint: ```bash uv run isaaclab play \ --rl_library rsl_rl \ --task IsaacContrib-Multitask-Manipulation \ --num_envs 3 \ --checkpoint logs/rsl_rl/multitask_manipulation/<run-dir>/model_3000.pt \ --viz kit ``` <img width="768" height="432" alt="multitask_manipulation_eval_compressed" src="https://github.com/user-attachments/assets/c491e548-2eb2-4943-be75-5eb97099c964" /> - New feature (non-breaking change which adds functionality) - Documentation update  - `uv run isaaclab -f` - `uv run --extra test --frozen python -m pytest source/isaaclab_tasks/test/contrib/test_multitask_manipulation_env_cfg.py -q` (`18 passed`) - `uv run --extra test --frozen python -m pytest source/isaaclab_tasks/test/contrib/test_contrib_environments.py -q -k IsaacContrib-Multitask-Manipulation` (`1 passed`) - `uv run python scripts/environments/list_envs.py --keyword Multitask --show_presets` - `uv run --isolated --extra test -- make -C docs current-docs` - [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. - [x] I have made corresponding changes to the documentation. - [x] My changes generate no new task-local warnings. - [x] I have added tests that cover the new behavior. - [x] I have added a changelog fragment under `source/isaaclab_tasks/changelog.d/`. - [x] My name already exists in `CONTRIBUTORS.md`. (cherry picked from commit 13296b1)
…n run (isaac-sim#7433) # Description `DataGenConfig.max_num_failures` is documented as *"Maximum number of failures allowed before stopping generation"* and eighteen shipped Mimic environment configs set it to `25`. Nothing reads it. ```console $ git grep -c max_num_failures source/isaaclab/isaaclab/envs/mimic_env_cfg.py:1 # the definition source/isaaclab_mimic/isaaclab_mimic/envs/*.py:18 # eighteen assignments ``` No third entry: there is no read anywhere in the repository, and the field has been inert since Isaac Lab Mimic was introduced in isaac-sim#179. `env_loop` counts `num_failures` and then never consults it; its only termination is ```python check_val = num_success if generation_guarantee else num_attempts if check_val >= generation_num_trials: ``` With `generation_guarantee = True` (which those same eighteen configs also set), a task whose success rate is low retries without any bound, and the one knob that claims to stop that does nothing. On our own data generation this cost 337 attempts for 10 demos before we discovered the cap was not real. ### Reproduction, on a stock task ```bash ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \ --task Isaac-Stack-Cube-Franka-IK-Rel-Mimic-v0 \ --input_file ./datasets/annotated_dataset.hdf5 \ --output_file /tmp/out.hdf5 \ --generation_num_trials 30 --num_envs 10 --headless ``` `FrankaCubeStackIKRelMimicEnvCfg` sets `max_num_failures = 25`. Observed: | | successes | failures | attempts | |---|---|---|---| | before | 30 | **50** | 80 | | after (`max_num_failures = 25`) | 12 | **25** | 37 | Before the change the run passed the configured cap and kept going, ending at twice it. After, it stops on the attempt that reaches 25 failures and says so: ``` Reached 25 failures (max_num_failures=25) after 12/30 successes. Exiting. ``` ### On the default Wiring the field up exactly as written would abort the primary documented workflow. At the ~36% success rate measured above, `--generation_num_trials 1000` needs on the order of 1800 failures, so a cap of 25 would end the run after roughly forty attempts. Since the eighteen assignments were inert when they were written and no current behaviour depends on them, they are removed here and the default becomes `None`, meaning no limit. **Runs behave exactly as they do today unless a limit is explicitly requested.** If maintainers would rather the shipped configs keep an active cap, that is a one-line change per config and I am happy to make it — it just needs a value that suits large runs. ### Tests `source/isaaclab_mimic/test/test_generation_failure_cap.py` drives `env_loop` with a fake environment whose `step()` consumes scripted attempt outcomes and refills the action queue, so the loop's own termination logic runs unmodified with no simulator or dataset behind it; a step-count fuse turns an unbounded loop into a failed assertion. Six cases: the cap stops a run that never succeeds; `None` keeps the guarantee unbounded as before; enough successes still end the run first; a cap reached short of the target ends it; attempt-based termination with the guarantee off is untouched (×2). Against the unpatched loop the two cap-dependent cases fail (`'fuse' == 'exited'`, and `(3, 4) == (2, 4)` — the loop overran the cap and collected an extra success) and the four asserting unchanged behaviour pass. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Checklist - [x] I have read and understood the contribution guidelines - [ ] I have run the `pre-commit` checks 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 - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JFz91VMgmrjS4XR6f9Q9Z2 --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com> (cherry picked from commit 59df9b8)
## Description Remove backend-specific task and training changes from rough velocity configurations so physics selection no longer silently changes the comparison inputs. - Remove MJWarp-only actuator armature overrides from Anymal-C, Cassie, Go1, and Go2. - Use the same 5,000-iteration G1 PPO budget for every physics backend. - Replace the one-option base-COM PresetCfg with its owned EventTerm and update the robot-specific callers. - Remove tests whose only contract was the deleted G1 budget or Go2 armature special case. Keep the legacy Newton alias check tied to the selected solver instead of an actuator side effect. Downstream configurations that intentionally require different values can still set them explicitly. ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## Release backport - [ ] Backport this pull request to the active release branch after it merges into develop ## Testing - `uv run --extra test python -m pytest source/isaaclab_tasks/test/core/test_hydra.py source/isaaclab_tasks/test/core/test_velocity_newton_cfg.py` — 88 passed. - `uv run isaaclab -f` — passed. - No new tests were added. ## Checklist - [x] I have read and understood the contribution guidelines. - [x] I have run the pre-commit checks. - [x] Documentation changes are not required. - [x] My changes generate no new warnings. - [x] I removed tests that encoded the deleted backend-specific tuning. - [x] I added an isaaclab_tasks changelog fragment. - [x] My name already exists in CONTRIBUTORS.md. (cherry picked from commit b0c3941)
) # Description `test-contrib-environments` failed on isaac-sim#7610 (run [34042243157](https://github.com/isaac-sim/IsaacLab/actions/runs/34042243157/job/101511058208)) in `test_contrib_environments[IsaacContrib-DrLegs-Walk]` with `AssertionError: Invalid data` on the policy observation. The PR itself only touched `source/isaaclab/test/install_ci`, so this is unrelated to that change. **Root cause.** The first row of the failing observation is NaN across projected gravity, base angular velocity and joint positions, i.e. the robot state itself is non-finite, not a single observation term. Reproducing the test scenario locally (2 envs, 20 random-action steps, fresh env per seed) shows the Kamino P-ADMM solver diverging mid-episode: in 1 of 12 seeds the entire state of env 0 (root position, root quaternion, joint positions and velocities) turns NaN at step 6. The heading-driven velocity command then inherits the NaN through `heading_w`, and the `root_height` / `bad_orientation` termination terms cannot fire because every comparison against NaN is false, so the episode is never reset. The sibling `IsaacContrib-DrLegs-HoldPose` task (same robot, same solver preset, same random actions) stayed finite in 9 of 9 local trials and passed in the same CI job, as did the deprecated alias id of the Walk task, which is why the failure is intermittent rather than deterministic. **Change.** Add `DrLegs-Walk` to `_SKIPPED_TASK_SUBSTRINGS` in `test_contrib_environments.py` with the reason documented inline. The substring covers both `IsaacContrib-DrLegs-Walk` and its deprecated alias `Isaac-DrLegs-Walk-v0`, which the test also enumerates. HoldPose keeps running. This is a test-side skip; the solver instability itself needs to be addressed in Kamino/Newton (or by retuning the DR Legs solver preset), and the inline comment says to re-enable once that lands. ## Validation - Reproduction script (launches once, rebuilds the env per seed, mirrors `env_test_utils._run_environments`): Walk 1/12 seeds NaN at step 6 with root pose, joint state and the velocity command all non-finite; HoldPose 0/9. - `pytest source/isaaclab_tasks/test/contrib/test_contrib_environments.py -k DrLegs-Walk -rs`: both ids report `SKIPPED ... Kamino solver intermittently produces NaN robot state under random actions.`; HoldPose ids still collect as runnable. - Ruff and ruff-format pass; `isaaclab_tasks` changelog `.skip` fragment included. ## Type of change - Test fix (non-breaking) ## 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 - [ ] 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 (cherry picked from commit 63d579e)
# Description Use the default `GroundPlaneCfg` appearance in the granular, two-way coupling, and snowball MPM demos. This removes per-demo size and color overrides and keeps the examples aligned with the standard Isaac Lab ground plane. No new dependencies. ## Type of change - Documentation/example cleanup (non-breaking) ## Release backport - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## Screenshots Not applicable; this intentionally adopts the standard ground-plane appearance. ## 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/) on all changed files - [x] Documentation changes are not required - [x] My changes generate no new warnings - [x] Tests are not required for configuration-only demo cleanup - [x] Changelog fragments are not required because no source package is changed - [x] My name already exists in `CONTRIBUTORS.md` (cherry picked from commit bb3f366)
# Description Adds the perspective-camera visual regression requested as a follow-up to [isaac-sim#7053](isaac-sim#7053) and [NVBUG 6632117]. - Creates four spatially separated Cartpole environments for one PhysX + Kit viewport case. - Frames all four scene partitions in a single perspective-camera capture. - Rejects flat or missing-content captures before comparing against the new golden image. ## Type of change - Test update ## Release backport - [x] Backport this pull request to the active release branch after it merges into `develop` ## Screenshot  ## Validation - `uv run isaaclab -f` - The final candidate was captured twice against the current CI Isaac Sim image (`sha256:50d2491d...`, Isaac Sim 6.1.0-alpha.72); the repeat comparison passed. ## Checklist - [x] I have read and understood the contribution guidelines. - [x] I have run the pre-commit checks. - [x] Documentation changes are not applicable to this test-only update. - [x] My changes generate no new warnings. - [x] I have added a test that covers the requested behavior. - [x] I have added a test-only changelog `.skip` fragment for `isaaclab_visualizers`. - [x] My name already exists in `CONTRIBUTORS.md`. (cherry picked from commit 9be9102)
# Description Running a play script with `--checkpoint pretrained` on a machine whose `.pretrained_checkpoints` directory was left behind by a container run (owned by `root`) prints: ``` Fetching pre-trained checkpoint : https://.../rsl_rl/Isaac-Humanoid-Direct_newtonmjwarp_none_rsl_rl.pt A pre-trained checkpoint is currently unavailable for this task. ``` and exits. The checkpoint is published and reachable; the download failed with `PermissionError: [Errno 13] Permission denied: '.../.pretrained_checkpoints/rsl_rl/https'`. That error was discarded by a bare `except Exception` in `isaaclab_rl.utils.pretrained_checkpoint.get_published_pretrained_checkpoint`, which reported every failure — a missing checkpoint, an unreachable server, an unwritable cache, a full disk — with the same sentence and returned `None`, after which the play scripts return without further explanation. This separates the two cases: * **The asset server does not provide the checkpoint.** `None` is still returned and the message still starts with `A pre-trained checkpoint is currently unavailable for this task.`, so callers and tests matching on that line are unaffected. It now also names the location that was tried, the task and backends that location was derived from, and what to do instead: ``` A pre-trained checkpoint is currently unavailable for this task. The asset server does not provide 'https://.../Isaac-Not-A-Real-Task_newtonmjwarp_none_rsl_rl.pt'. Either no checkpoint is published for task 'Isaac-Not-A-Real-Task' with the 'newtonmjwarp' physics and 'none' render backends, or the asset server could not be reached. Train the task, or pass --checkpoint <path> to use a checkpoint of your own. ``` * **The checkpoint exists but could not be downloaded.** This is a local problem the user has to fix, so it raises `RuntimeError` naming the checkpoint, the cache directory and the originating error, which is chained as the cause: ``` RuntimeError: Failed to download the pre-trained checkpoint 'https://.../Isaac-Humanoid-Direct_newtonmjwarp_none_rsl_rl.pt' into '/home/user/IsaacLab/.pretrained_checkpoints/rsl_rl': PermissionError: [Errno 13] Permission denied: '/home/user/IsaacLab/.pretrained_checkpoints/rsl_rl/https'. Check that the cache directory is writable and that the disk is not full; a directory left behind by a container run is owned by root. ``` Note that `omni.client` reports a checkpoint that was never published and a server it cannot reach identically, so both remain covered by the "unavailable" message. Both paths were verified end to end against the live asset server, using a published checkpoint with a read-only cache directory and an unpublished checkpoint name. ## Type of change - Bug fix (non-breaking change which fixes an issue) Behaviour note: callers that relied on `None` to mask a local download failure now see a `RuntimeError`. Callers that treat `None` as "no checkpoint published for this task" — every caller in the repository — are unchanged. This is called out in the changelog fragment. ## Release backport - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## 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 added a changelog fragment under `source/<pkg>/changelog.d/` for every touched package - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there (cherry picked from commit 768c305)
# Description Restores the missing `torch` import in `test_ovrtx_clone_plan.py`. isaac-sim#7462 converted the existing clone-plan test inputs from Torch tensors to NumPy arrays and removed the then-unused import. isaac-sim#6308 subsequently added a new object-scale test using `torch.ones` and `torch.arange` without restoring the import, causing the repository-wide Ruff pre-commit check to fail with `F821 Undefined name torch`. This PR contains only the import repair and an `isaaclab_ov` `.skip` changelog fragment. It unblocks isaac-sim#7579 and other changes based on the current `develop` branch. ## Type of change - Bug fix (non-breaking test fix) ## Release backport - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` No release backport is required: `release/3.0.0` already imports `torch` in this test. ## Screenshots Not applicable. ## Testing - `uv run --no-project --with pre-commit python -m pre_commit run --all-files` - `uv run --no-project python tools/changelog/cli.py check --include-worktree` - `git diff --check upstream/develop...HEAD` ## Checklist - [x] I have read and understood the contribution guidelines - [x] I have run the full pre-commit checks - [x] Documentation changes are not required because no public API changed - [x] My changes generate no new warnings - [x] The fix directly covers the Ruff `F821` failure - [x] I have added an `isaaclab_ov` changelog fragment - [x] My name already exists in `CONTRIBUTORS.md` (cherry picked from commit 7bf6959)
## Description Adds two developer skills for issue work, split by scope: - **`isaaclab-auditing-an-issue`** — audits a single issue against current code and drafts the reply. Holds the reusable per-issue checks. - **`isaaclab-triaging-issue-backlog`** — batch sweeps. Requires the first as a sub-skill and adds only the orchestration: adversarial verification, approval bookkeeping, and the human review gate. The guidance is distilled from a full pass over the open backlog, where automated triage repeatedly produced comments that read well but asserted things that were not true. The skills encode the checks that caught those. ### Per-issue skill - **Mandatory checks table**, one row per claim shape. Grep `contrib/` before writing "Isaac Lab doesn't have X", since features move to contrib and absence claims go stale. Check the specific backend package rather than assuming parity. Run a script for behavioral claims instead of reading the raise site — a guard can be narrower than it looks. - **URL traps.** `blob/main/...` 404s for `isaaclab_newton`, `isaaclab_ov`, `isaaclab_ovphysx` and `isaaclab_contrib`, since those packages are not on `main`. `isaac-sim.github.io/IsaacLab/main/...` is the stale 2.x docs build. Both produced dead links during the triage pass. - **Do Not Close list.** Cases where the stated reason is defensible but closing still loses something: an open maintainer question, pre-merge feedback on an open PR, a duplicate of a bug that was itself closed without a fix, an unmet titled ask, and upstream-blocked work where nobody has filed upstream. - **Comment style.** Thank the reporter, cite a verified fix, invite a reopen, and do not assign fault to the reporter or to a sibling team. ### Batch skill - Adversarial verification that defaults to REFUTED or UNCERTAIN when evidence cannot be independently confirmed. - Approval bookkeeping: never infer approval, keep one plan file, re-show anything edited after approval, and report refuted and held counts alongside the reduction figure. - A failure-mode table observed in practice, so the next sweep expects them rather than rediscovering them. ## Type of change - New feature (non-breaking change which adds functionality) ## Checklist - [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 ## Notes `uv run --no-project python tools/skills/cli.py check` passes (23 skills validated). No changelog fragment: no source package changed, and the fragment check passes. The skills have not yet been pressure-tested against agents with and without them, which is the usual bar for discipline-enforcing guidance. Happy to do that before merge if reviewers would prefer. --------- Co-authored-by: Kelly Guo <kellyg@nvidia.com> (cherry picked from commit 3639364)
# Description NVBug: 6674420 Newton MJWarp configured for Isaac RTX Minimal Mode with Simple Shading Full MDL is substantially slower than Newton MJWarp with OVRTX. The Isaac RTX path is not enabling Minimal Mode as expected, preventing the intended performance gains. Investigate and fix the Isaac RTX configuration path so Minimal Mode is correctly enabled. 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 ## Release backport - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## 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 Docker and GPU tests run on demand. Push the commits you want tested, then comment `run-ci` on the pull request. - [ ] 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 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 <!-- 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 --> --------- Co-authored-by: nvsekkin <esekkin@nvidia.com> Co-authored-by: Ege Sekkin <72572910+nvsekkin@users.noreply.github.com> Co-authored-by: Kelly Guo <kellyg@nvidia.com> (cherry picked from commit c58715b)
…r.replicate()` (isaac-sim#7453) This depends on newton-physics/newton#4012 and pins the Newton 1.6 development build that first provides `ModelBuilder.replicate(..., label_prefixes=...)`. The homogeneous Newton cloning path previously replicated the model and then walked every replicated entity label to replace the prototype environment with its destination environment. It now rebases only the retained prototype labels, restores them after the call, and lets `ModelBuilder.replicate()` assign each copy's destination prefix while it is created. String-valued custom attributes still use the existing targeted rewrite because Newton cannot identify which strings are entity paths. The destination itself is the source of identity: prefixes are derived from the queued source/destination mapping. No clone-plan environment metadata, scene discovery, fallback clone path, or retained prototype mutation is introduced. Labels exactly at a directly cloned asset root, including Newton's `_free_joint` and `_articulation` companion labels, are expressed relative to the nearest templated destination ancestor and remain on the same fast path. The Newton commit pin is mirrored in workspace and wheel installation inputs so every supported install receives the API this path requires. The final PR is `+195/-218`, net **-23 LOC**. GPU 0, 4096 worlds, two samples per PR head. The targeted measurement uses one 48-body/48-shape Newton prototype and times replication plus all required label publication: | Head | Targeted path median | Versus develop | |---|---:|---:| | develop base (`3a31389a9`) | 1.428 s | — | | original PR (`cbb17ab6e`) | 1.160 s | -18.8% | | cleaned PR (`844f4c4db`) | 1.171 s | **-18.0%** | The cleanup is within 1.0% (11 ms) of the original PR result and preserves the removed-pass gain. The 257 ms reduction from develop is consistent with the original 215 ms observation on `Isaac-Velocity-Flat-G1`. Whole-workload check used: ```bash CUDA_VISIBLE_DEVICES=0 uv run --no-sync isaaclab zero_agent \ --task Isaac-Lift-KukaAllegro --num_envs 4096 --max_steps 1 \ --device cuda:0 --visualizer none physics=newton_mjwarp ``` | Head | Warm wall median | Scene creation median | |---|---:|---:| | original PR | 21.30 s | 6.324 s | | cleaned PR | 21.39 s | 6.345 s | That end-to-end difference is within startup noise; the cleanup introduces no measured workload regression. - Startup performance enhancement - 81 focused clone, Newton, visualization-state, wheel-metadata, and install tests passed. - Ruff formatting and lint checks passed. - Exact-root, sparse-environment, hook-authored-label, custom-attribute, and retained-prototype cases are covered. - The changelog fragment is present for the changed Newton package. - [x] I have read and understood the contribution guidelines - [x] My changes generate no new warnings - [x] I have added tests that prove the fix is effective - [x] I have added the required changelog fragment - [x] My name already exists in `CONTRIBUTORS.md` --------- Signed-off-by: Kelly Guo <kellyg@nvidia.com> Co-authored-by: Octi Zhang <zhengyuz@nvidia.com> Co-authored-by: Kelly Guo <kellyg@nvidia.com> (cherry picked from commit 0eb2589)
- Bumps Newton from `1.5.1` to `1.6.0rc1`, the first release carrying [newton#4017](newton-physics/newton#4017), unblocking the MuJoCo tendon adapter that PR isaac-sim#7161 needs. - `warp-lang` and `mujoco`/`mujoco-warp` move with it, because `1.6.0rc1` requires them. - Pins `newton[sim]` in `[project].dependencies` as well, so a wheel built from this metadata resolves the fix rather than falling back to the newest stable. - Updates test literals in `isaaclab` and `isaaclab_newton` for Newton's new actuator class names, and asks for a determinism guarantee in the manipulation determinism test. `resolve_fixed_tendon_actuator_columns` reads `mujoco.actuator_trntype` through an `ArticulationView`. Every Newton 1.5.x release rejects that with *"has custom frequency 'mujoco:actuator' which is not supported by ArticulationView"*; newton#4017 makes `ArticulationView` generic over custom frequencies. `1.6.0rc1` (published 2026-09-03) is the first release containing that fix — verified two ways: the merge commit `4055a159` is an ancestor of `v1.6.0rc1`, and `custom_frequency_label_attributes`, the symbol the fix introduces in `newton/_src/sim/model.py`, is present at `v1.6.0rc1` and absent at `v1.5.1`. No `1.6.0` final exists yet, and no 1.5.x backport carries the fix, so `1.6.0rc1` is the only released option. The release requires `warp-lang>=1.17.0` and `mujoco-warp~=3.12.0`, so those pins move too: | Package | Before | After | | --- | --- | --- | | `newton[sim]` | `1.5.1` | `1.6.0rc1` | | `warp-lang` | `1.16.0` | `1.17.0` | | `mujoco` | `3.11.0` | `3.12.0` | | `mujoco-warp` | `3.11.0` | `3.12.0` | `warp-lang` is pinned to the `1.17.0` release rather than left as `>=1.17.0`: Newton's prerelease enables prerelease resolution, and an unbounded bound then resolves to a nightly (`1.18.0.dev20260903`). `[tool.uv].override-dependencies` only reaches `uv sync`, so it does not constrain a wheel built from this metadata. `1.6.0rc1` is a prerelease, which a default resolve skips, so a loose bound resolved `newton 1.5.1` — without newton#4017, the fix this bump exists to deliver. Since `wheel.yml` builds on every push to `develop`, that would have shipped. `[project].dependencies` now pins `newton[sim]==1.6.0rc1`, matching the override. A default resolve of the new metadata returns `1.6.0rc1` under both `uv pip compile` and `pip download`, with no `--pre` flag. `isaacsim-core==6.0.1.0` requires `newton[sim]==1.2.1`, so installing the `isaacsim` extra still needs an override — exactly as on `develop`, which carries an equally exact pin in the same place. `1.6.0rc1` introduces `DrivePD` / `DriveNeuralMLP` / `DriveNeuralLSTM` alongside the existing `ControllerPD` / `ControllerNeural*`. Both names remain importable, so this is **not** a breaking API change and no production code changes. Tests in `isaaclab` and `isaaclab_newton` assert on the class name Newton *constructs with*, which switched to the `Drive*` form, so those literals are updated. `test_manipulation_env_determinism[cuda-Isaac-Open-Drawer-Franka]` failed on this branch in CI. Two separate questions: whether the bump caused it, and why it failed at all. **Not caused by the bump.** Each arm was run 5x on the same machine, because a single run of an intermittent test samples a coin rather than measuring it: | GPU | develop pins (`newton 1.5.1` / `warp 1.16.0` / `mujoco 3.11.0`) | this PR (`newton 1.6.0rc1` / `warp 1.17.0` / `mujoco 3.12.0`) | | --- | --- | --- | | RTX PRO 6000 Blackwell | 3 / 5 failed | 3 / 5 failed | | L40 | 3 / 3 passed | 4 / 4 passed | Both pin sets fail at the same rate on Blackwell and both are clean on L40, so the failure is hardware-dependent, not version-dependent. Intermediate Newton revisions (the commits before and at [newton#4119](newton-physics/newton#4119), the MuJoCo 3.12 bump) show the same behaviour, so neither Warp 1.17, MuJoCo 3.12, nor isaac-sim#4119 is implicated. **Why it failed.** The test asserted bit-reproducible rewards without ever asking for a determinism guarantee. Newton defaults to `wp.DeterministicMode.NOT_GUARANTEED`, under which Warp's atomics may accumulate in any order, so two runs of the same environment are not required to agree — the assertion was stricter than the configuration it ran under, and whether it held came down to GPU scheduling. The Newton-backed case now passes `deterministic_mode="run_to_run"`, which is exactly the guarantee this test asserts: one device, one process, run twice. `deterministic_mode` is a Newton setting, so the PhysX-backed `IsaacContrib-Lift-Cube-Franka` case leaves it unset and the helper keeps asserting that the mode is only applied to a `NewtonCfg` backend. This is a test-configuration fix, not a masking of the intermittency: the guarantee the assertion depends on is now actually requested. Related: [isaac-sim#7561](isaac-sim#7561) addresses the adjacent layer and does not overlap this PR. Newton's solvers take a per-module `deterministic` argument, which is what `deterministic_mode` reaches and what this PR sets; Newton's sensor and geometry kernels take no such argument and fall back to the `warp.config.deterministic` global, which isaac-sim#7561 raises from the same config field in the RL entrypoint. - Bug fix (non-breaking change which fixes an issue) - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` - `uv lock --check` — clean; the relock moves exactly the four packages above, and the `[project].dependencies` pin moves exactly one further lockfile line - Default resolve of the published metadata returns `newton==1.6.0rc1` under both `uv pip compile` and `pip download`, with no `--pre` flag - `uv run --frozen python -m pytest source/isaaclab/test/cli/test_wheel_builder_metadata.py source/isaaclab/test/cli/test_uv_run_pyproject.py` — 21 passed, which enforces that the two generated `uv-overrides.txt` files match the override table and that `[tool.isaaclab.versions]` mirrors the dependency pins - `uv run isaaclab -f` — passed - Full Docker + Tests suite — **48 passed / 0 failed** on `b184335e80b` (cherry picked from commit bc3ebea)
# Description Support both the released OVPhysX 0.5.11 lifecycle API and the OVPhysX 0.6 lifecycle API without changing Isaac Lab's dependency pins. This follows the existing OVRTX 0.4.1/0.5 compatibility pattern: - Detect the installed `ovphysx` distribution version once at import. - Resolve an immutable lifecycle mapping to `warmup_gpu()` / `release()` for OVPhysX 0.5.11 and to `warmup()` / `destroy()` for the OVPhysX 0.6 release line and later, including prerelease and development builds. - Default missing or unparsable metadata to the supported OVPhysX 0.5.11 path. - Keep the public `ov` and `ovphysx` extras pinned to `ovphysx==0.5.11`; OVPhysX 0.6 remains a manual internal-testing overlay. The lifecycle changes preserve existing 0.5.11 cleanup semantics. For OVPhysX 0.6 only, they also retain OVPhysX and OVStage ownership when `destroy()` fails before native teardown so cleanup can be retried; a terminal destroy error releases dead owners. The scope is limited to OVPhysX lifecycle compatibility code, tests, and the `isaaclab_ov` changelog fragment. No actuator changes or dependency updates are included. ## Type of change - Bug fix (non-breaking change which fixes an issue) - New feature (non-breaking change which adds functionality) ## Validation - `uv run --frozen --extra test --extra ovphysx python -m pytest source/isaaclab_ov/test/physics/test_ovphysx_compat.py source/isaaclab_ov/test/physics/test_ovphysx_scene_data_backend.py -q` — 50 passed against the pinned OVPhysX 0.5.11 environment. - The same 50-test suite passed with installed OVPhysX metadata simulated as 0.6.0, including the version-independent OVStage ownership test and version-selected 0.6 lifecycle doubles. - The 0.6 development-build regression fails on the prior PR head and passes with the release-line classifier. - `uv run --extra test --extra ovphysx python -m pytest source/isaaclab_ov/test/assets/test_rigid_object.py::test_warmup_attach_stage_not_called_for_cpu -q` — 1 passed against the real OVPhysX 0.5.11 CPU runtime. - `uv run --frozen --extra test --extra ov python -m pytest source/isaaclab_ov/test/test_ovrtx_clone_plan.py -q` — 17 passed after merging upstream fix isaac-sim#7582. - Changelog fragment validation against current `develop` — passed. - `uv run isaaclab -f` — passed. ## 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 with `uv run isaaclab -f` - [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 and that the feature works - [x] I have added a changelog fragment under `source/<pkg>/changelog.d/` for every touched package - [x] The contributors already exist in `CONTRIBUTORS.md` --------- Co-authored-by: marcodiiga <1969828+marcodiiga@users.noreply.github.com> Co-authored-by: hujc <jichuanh@nvidia.com> (cherry picked from commit b81afde)
This follows isaac-sim#7462 by making the simulation's `ClonePlan` available before cfg-owned scene construction. `ReplicateSession` now builds and publishes the plan on entry, constructs every participant at its planned source path, and dispatches that same object on exit. `SimulationContext` remains the canonical owner of the plan pointer; no secondary lifecycle state, constructor ownership heuristic, stage discovery, fallback context, or second clone mapping is introduced. `InteractiveScene` owns this lifecycle for cfg-declared scenes. An empty `InteractiveScene` authors only the env-0 prototype and leaves replication to direct task setup. That removes redundant environment-root authoring while preserving direct workflows with custom clone positions. Plan positions remain NumPy during scene construction and become a cached device tensor only when the public `env_origins` property is read. Kitless shadow visualization now takes its environment count and world positions from the same plan instead of rediscovering destination env transforms on USD. This lets OVPhysX feed Newton Renderer or OVRTX without requiring redundant destination prims. Custom cfg-owned composition roots should use the session around cfg construction: ```python with cloner.ReplicateSession(asset_cfgs, num_clones=num_envs, env_spacing=env_spacing): for cfg in asset_cfgs: cfg.class_type(cfg) ``` Homogeneous direct workflows construct env 0 first, then finish their one clone lifecycle explicitly: ```python plan = cloner.clone_plan_from_env_0(src, dest, num_envs, positions, global_paths=global_paths) cloner.replicate(plan) ``` | Scope | Added | Deleted | Net | | --- | ---: | ---: | ---: | | This PR | 180 | 143 | +37 | | Production | 79 | 79 | 0 | | isaac-sim#7462 + this PR | 1,413 | 1,813 | -400 | The earlier functional 3B head was performance-neutral in one matched warm sample on physical GPU 0 using `Isaac-Lift-KukaAllegro`, 4,096 environments, Newton MJWarp physics, and no visualizer: | Metric | This PR | merged develop | | --- | ---: | ---: | | Total startup | 42.58 s | 43.11 s | | Environment creation | 39.76 s | 39.24 s | | First step | 0.658 s | 0.637 s | The cleanup commits remove redundant empty-scene root authoring and eager environment-origin tensor creation. A current-head Kuka sample will replace this table when the shared physical GPU 0 is idle. - Breaking change - Bug fix - Documentation update - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` Not applicable. - 92 clone-plan and `ReplicateSession` tests passed - 3 focused `InteractiveScene` origin/lifecycle tests passed on CPU and CUDA - 16 Newton clone/visualization-builder tests passed - 22 Newton shadow-model lifecycle tests passed - The missing-destination regression test fails with `KeyError` before the fix and passes after it - OVPhysX → Newton Renderer completed creation, reset, and first rendered step with only the env-0 USD prototype - Former CI failures passed: visual-material scene (1), multi-mesh ray-caster camera (21), ray-caster integration (7), and Newton duplicate-body frame transforms (4) - PhysX and Newton visual-color-randomization demos reached setup and continued through repeated resets - Warning-free current documentation build passed - Repository formatting, lint, changelog, and LFS checks passed - `git diff --check` passed The prior `isaaclab_rl` failure is the independent LEAPP 0.7 regression fixed by isaac-sim#7592; this PR does not duplicate that dependency pin. - [x] I have read and understood the contribution guidelines - [x] I have run the pre-commit checks - [x] I have made corresponding documentation changes - [x] My changes generate no new warnings - [x] I have added focused lifecycle and regression tests - [x] I have added the required changelog fragments - [x] My name already exists in `CONTRIBUTORS.md` (cherry picked from commit ad83008)
…#7360) # Description Use the shared Isaac Lab environment creation path in all benchmark play adapters so `DirectMARLEnv` tasks follow the same backend-specific conversion rules as training. This also: - Adds the frontend argument required by the shared environment creator. - Preserves native SKRL multi-agent handling for IPPO and MAPPO while converting PPO. - Reports the rejected unwrapped environment type in RL wrapper validation errors. - Adds focused regression coverage and package changelog fragments. No new dependencies are required. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Release backport - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## Screenshots Not applicable. ## Validation - `uv run --isolated --frozen --extra test python -m pytest source/isaaclab/test/benchmark/test_api.py source/isaaclab_rl/test/test_rsl_rl_wrapper_observations.py -q --disable-warnings` (31 passed) - `uv run --frozen isaaclab -f` - One-step `Isaac-Shadow-Handover-Direct` RSL-RL play benchmark with Newton MJWarp completed successfully. - Isaac Sim PhysX smoke was not run because the optional installation requires interactive NVIDIA EULA acceptance. ## 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 repository formatting and pre-commit checks with `uv run isaaclab -f` - [x] No public documentation changes are required; the behavior changes are covered by changelog fragments - [x] My changes generate no new warnings - [x] I have added tests that prove the fix is effective - [x] I have added a changelog fragment under `source/<pkg>/changelog.d/` for every touched package - [x] My name already exists in `CONTRIBUTORS.md` (cherry picked from commit 632f197)
…c-sim#7468) # Description Removes the Newton 1.5 compatibility shim for the MuJoCo tendon adapter. The shim back-filled the `mujoco:actuator` custom-frequency surface that [newton#4017](newton-physics/newton#4017) adds, so the adapter could be written once against the 1.6 API while the repository was still pinned to 1.5. That pin moved to `newton[sim]==1.6.0rc1` in isaac-sim#7445, so the shim now returns both of its arguments unchanged on every call — dead code on the hot path of every Newton Shadow Hand run. The adapter now reads the API directly off the articulation view and model. Verified present in `newton 1.6.0rc1`: | Symbol | Location | | --- | --- | | `ArticulationView.custom_frequency_counts` | `newton/_src/utils/selection.py:1023` | | `ArticulationView.custom_frequency_labels` | `newton/_src/utils/selection.py:1024` | | `ArticulationView.tendon_count` | `newton/_src/utils/selection.py:1107` | | `Model.custom_frequency_articulation` | `newton/_src/sim/builder.py:2351` | `resolve_fixed_tendon_actuator_columns()` already consumed exactly these, so the only change at the call site is dropping the wrapper: ```diff - view, model = ensure_newton_custom_frequency_api(articulation.root_view, model) + view = articulation.root_view ``` Deletes `physics/_mjwarp_view_compat.py` (284 lines) and `test/physics/test_mjwarp_view_compat.py` (134 lines). Nothing else in the repository referenced the module, `ensure_newton_custom_frequency_api`, or `actuator_owner_rows`. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Validation `test_mjwarp_tendon_control.py` — **10 passed**, unchanged from before the removal. The adapter's own coverage is untouched by this PR; only the shim's own tests are deleted along with the shim. ``` uv run --frozen --extra test pytest source/isaaclab_newton/test/physics/test_mjwarp_tendon_control.py 10 passed in 5.49s ``` ## 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 added a changelog fragment under `source/<pkg>/changelog.d/` for every touched package - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there (cherry picked from commit 56c0fe6)
isaac-sim#7614) # Description On the PhysX and OVPhysX backends on GPU, a `ContactSensor` with the default `history_length=0` and the default `lazy_sensor_update=True` kept reporting the last in-contact force after the body had left contact, for as long as the body stayed in the air, whenever its data was read less often than every physics step (for example once per policy step with `decimation=4`). **Root cause.** PhysX zeroes a body's entry in `get_net_contact_forces()` only on the exact physics step where that body's contact is lost. With `history_length=0` the sensor only called the getter when `.data` was accessed, so a policy-rate reader skipped most contact-lost steps and never saw the zero. The Isaac Lab kernels and the CUDA-graph replay are not involved: the raw getter output, the cached Warp view, and the sensor output agree at every read, and disabling the graph changes nothing. CPU is unaffected. `history_length > 0` is unaffected because the base class already refreshes every physics step. The experiment table and a standalone reproduction are in isaac-sim#7613; OVPhysX reproduces identically through its contact binding. **Fix.** Both sensors override `update()` to fetch the physics-owned buffers on every physics step, skipping the fetch when the base class already refreshed on that step (history-bearing sensors, or `force_recompute`). The Warp kernels that turn the fetched buffers into sensor data still run lazily on data access, so the per-step cost is one getter call, which is exactly what history-bearing sensors already pay. The buffers are refreshed in place, so the cached views and the captured CUDA graph stay valid. On PhysX the outer-graph-capture guard moves into a helper shared by the eager fetch and the buffer update, so a capture is rejected on either path and the existing capture test keeps its "raise before touching PhysX" contract. **Tests.** `test_lazy_sensor_reports_contact_loss` in both the PhysX and OVPhysX contact sensor suites: settle a cube for six policy steps of four physics steps each, reading the sensor once per policy step, then hold it in the air for six more, and require every air read after the first to be below 0.1 N. On the unfixed code it fails on `cuda:0` with the force stuck at the resting value for all six reads, and passes on `cpu`; with the fix it passes on both. The PhysX `test_contact_history_updates_at_sensor_period` row for `history_length=0` asserted the old zero-fetch cadence and was updated to the new one; its history-bearing rows are unchanged. **Exposure.** Every shipped velocity task sets `history_length=3` and is unaffected. The Kuka Allegro and Franka lift tasks configure fingertip contact sensors with the default history length and feed the force matrix into observations, so on PhysX GPU those observations could hold a stale contact force after a finger released the object. Found while working on isaac-sim#7283 / isaac-sim#7574. Fixes isaac-sim#7613 ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Release backport - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## 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 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 (cherry picked from commit b342207)
…c-sim#7738) # Description Support OvPhysX 0.6 without changing the public 0.5.11 default or CI dependency sources. OvPhysX 0.6 already fixes reversed-joint Jacobians and mass matrices; applying Isaac Lab's legacy sign correction again produces incorrect dynamics. Gate that correction by the installed runtime's release line, including 0.6 development builds. Gravity compensation forces already use the public joint basis in both tested versions. Remove their extra sign correction while retaining joint ordering. Register the wheel's physics schemas with OVStage's independent registry when that API exists, including when host USD already supplies the schemas. Keep installation documentation limited to publicly available packages. The compatibility path is selected automatically when OvPhysX 0.6 is already installed; no internal-build installation support is added. Public package pins and CI workflows remain unchanged. The schema fix is adapted from `integration/ovphysx-next` and overlaps isaac-sim#7626. ## Type of change - Bug fix - Documentation update ## Release backport - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## Validation - [Public OV backend CI](https://github.com/isaac-sim/IsaacLab/actions/runs/34504247401/job/102962556513): **1,021 passing cases, 28 skipped**, including all eight CPU/CUDA dynamics regressions and all six version-boundary cases. The [full package CI run](https://github.com/isaac-sim/IsaacLab/actions/runs/34504247401), x86/ARM installation checks, wheel build, documentation, formatting, and changelog/link checks all passed. Both multi-GPU checks also passed. These CI results cover commit `1ac23b8fafa`; CI is being rerun for the review follow-up. - **16 native dynamics cases passed:** 0.5.11 and 0.6.2 on CPU and CUDA, with/without gravity and custom joint/body ordering. Checks compare Jacobian-predicted velocity with measured body velocity, generalized kinetic energy with body kinetic energy, and gravity compensation with summed body weights through the Jacobian. - Reproduced the 0.6 Jacobian failure before the version gate and the 0.5 gravity-force failure before removing its extra correction. - **76 tests passed:** shared ordering kernels, version boundaries, schema registration, and manager lifecycle; legacy resolver/cache tests also passed. - Review follow-up: **36 lifecycle and compatibility tests passed on each runtime** (0.5.11 and 0.6.2). The added missing-OVStage regression failed before the fix and passed afterward. - Full Sphinx HTML build passed with warnings treated as errors (15-second external inventory fetch timeout). Formatting and changelog checks passed. Full local suite intentionally not run; broader validation uses CI. The internally tested OVRTX 0.5/OVStage renderer still differs from existing Cartpole RGB goldens (2.02% pixels versus 1.50% allowed). Unchanged `develop` code with the same native stack reproduces it; the public renderer stack passes. Golden images and thresholds are unchanged. ## Checklist - [x] I have read and understood the contribution guidelines - [x] I have run the pre-commit checks with `uv run isaaclab -f` - [x] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [x] I have added tests that prove my fix is effective - [x] I have added a changelog fragment for every touched source package - [x] My name already exists in `CONTRIBUTORS.md` (cherry picked from commit 412fb31)
# Description `--video` enabled a headless Kit visualizer and continuous PhysX Fabric transform updates for the full training run, even though frames are only needed during capture windows. This caused a substantial FPS drop between recordings. This change treats headless visualizers as on-demand rather than continuous renderers, disables continuous Fabric synchronization after PhysX initialization, and synchronizes transforms immediately before each visualizer frame capture. RTX camera sensors explicitly retain continuous Fabric updates. ### RTX 5090 benchmark `Isaac-Humanoid-Direct`, PhysX, 4,096 environments, RSL-RL, 16 iterations. Idle results exclude iterations 0 and 10, which contain the two scheduled 32-frame capture windows. | Configuration | Mean idle FPS | Difference | | --- | ---: | ---: | | Plain headless | 360,635 | — | | Offscreen RTX enabled, no video recorder | 326,336 | -9.5% vs. plain headless | | Periodic `--video` with this fix | 315,966 | -3.2% vs. offscreen RTX control | The unfixed periodic-video run reproduced approximately 214,300 FPS between captures, about 34% below its plain-headless control. With this fix, most of that avoidable idle-window regression is removed. Capture iterations still drop as expected; the fixed periodic run measured 76,127 and 135,151 FPS during its two capture iterations, with 289,675 FPS overall including both captures. No new dependencies are required. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Release backport - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## Screenshots Not applicable; this is a performance fix. A frame probe on the RTX 5090 verified that all 20 captured frames were non-black and changed over time (`temporal_std=72.21`, mean consecutive delta `12.46`). ## Checklist Docker and GPU tests run on demand. Push the commits you want tested, then comment `run-ci` on the pull request. - [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 (not applicable; no public API or user workflow changed) - [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 ### Validation - `uv run --frozen --extra test --extra rerun python -m pytest source/isaaclab/test/sim/test_simulation_context_visualizers.py source/isaaclab/test/envs/test_video_recorder.py -q` — 74 passed - `uv run --frozen isaaclab -f` — all hooks passed - `source/isaaclab/test/sensors/test_camera.py::test_camera_init` — passed on RTX 5090 (cherry picked from commit 270ef40)
## Description Implicit actuators on the standard ovphysx path submitted their PD effort estimate as an additional joint force while native joint drives remained enabled. Submit the processed effort command so implicit joints receive only their feedforward effort, while explicit joints retain their computed motor output. This matches the existing PhysX adapter. Extend the existing tests to cover both actuator execution paths and reordered implicit joints, including force readback, native gains and effort telemetry. Refresh the Shadow Hand and Kuka motion-vector golden images to match the corrected implicit-actuator motion. ## Type of change - Bug fix ## Validation - The original selector fails the ordinary mixed-actuator GPU case and the reordered implicit CPU/GPU cases at the force assertions. The native actuator case already passes. - All four focused cases pass with the corrected selector, using separate CPU and GPU processes. - The base commit passes both motion-vector comparisons. With the corrected selector, both cases fail against the old goldens and pass against the refreshed images at the existing 3% pixel threshold. The refreshed images reproduce the CI outputs byte-for-byte. - Formatting and changelog checks pass. ## Release backport - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## Checklist - [x] I have read the contribution guidelines. - [x] I have run the pre-commit checks with `uv run isaaclab -f`. - [x] I have added regression coverage and a package changelog fragment. - [x] My name already appears in `CONTRIBUTORS.md`. --------- Co-authored-by: marcodiiga <1969828+marcodiiga@users.noreply.github.com> (cherry picked from commit e86463d)
…-sim#7438) Make the aggregate Isaac Lab package self-contained and directly installable from a Git revision. The wheel previously exposed the canonical core package through a nested `isaaclab/source/isaaclab/isaaclab` tree and a runtime `isaaclab.__path__` mutation. In addition, downstream projects could not use the repository as a normal Git dependency: pointing a package manager at `source/isaaclab` built only the dependency-free leaf package and omitted repository-level runtime resources such as `apps/isaaclab.python.kit`. This PR: - installs the canonical core modules directly in the top-level `isaaclab` package; - resolves bundled resources consistently in source checkouts and installed packages; - exposes `tools/wheel_builder` as a PEP 517 package source; - stages Git-source builds through the same aggregate package assembly used by release wheels; - preserves the aggregate wheel’s top-level `main()` and `bootstrap_kernel()` compatibility APIs; - routes the installed console command through the compatibility dispatcher, including `--generate-vscode-settings`; - retains the root `pyproject.toml` as the single source of truth for third-party dependencies and extras; - bundles the sibling `isaaclab_*` packages, Kit experience files, package data, and template resources; and - keeps the existing `tools/wheel_builder/build.sh` workflow by sharing its staging implementation. No dependencies are added to the individual Isaac Lab subpackage manifests, and no public Python API is changed. External task repositories and applications can now depend on one aggregate `isaaclab` package at an unreleased commit or tag. They no longer need: - a sibling Isaac Lab checkout at a fixed local path; - separate source declarations for every `isaaclab_*` package; - a copied list of Isaac Lab's transitive third-party dependencies; or - a downstream workaround for the missing `apps/isaaclab.python.kit` resource. A downstream uv project can declare: ```toml [project] dependencies = ["isaaclab"] [tool.uv.sources] isaaclab = { git = "https://github.com/isaac-sim/IsaacLab.git", rev = "<commit-or-tag>", subdirectory = "tools/wheel_builder", } ``` Pinning `rev` to a commit or tag makes the complete Isaac Lab code and dependency metadata reproducible in the downstream lockfile. A branch such as `develop` also works, with the usual behavior that a future lockfile update may select a newer revision. This is particularly useful for downstream task packages that need changes from `develop` before the next Isaac Lab wheel release, and for CI systems that should resolve the complete environment without provisioning a separate source checkout. - The aggregate wheel uses a conventional flat `isaaclab` package instead of extending `isaaclab.__path__` at runtime. The resource resolver lives in the conventionally named `isaaclab.paths` module. - The compatibility dispatcher now lives in the canonical package, so source and aggregate builds share `isaaclab.__main__`; the generated console entry point targets that dispatcher rather than bypassing legacy options. - A small PEP 517 backend implements wheel, sdist, and metadata hooks for Git-source consumers. - Package staging was moved from shell commands into a shared Python helper used by both the PEP 517 backend and the existing build script. - The generated aggregate metadata continues to read dependencies and extras from the repository root and removes only the `isaaclab_*` workspace self-references because those packages are bundled in the artifact. - The installed package includes `apps/*.kit`, so asset-root discovery and `AppLauncher` use the same experience files as a source checkout. - Bug fix (non-breaking change which fixes the installed package layout) - New feature (Git-source installation for downstream projects) - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` - Resolved and installed a fresh uv project whose only dependency was `isaaclab` from a pinned Git revision and the `tools/wheel_builder` subdirectory. - Verified imports for `isaaclab`, `isaaclab_assets`, `isaaclab_newton`, `isaaclab_rl`, and `isaaclab_tasks` from that fresh environment. - Verified the Git-built installation contains `apps/isaaclab.python.kit`, resolves the default asset root, and runs `isaaclab --help`. - Built both a wheel and an sdist through the new PEP 517 entry point. - Built the wheel through the existing `tools/wheel_builder/build.sh` entry point. - Ran focused CLI, wheel-metadata, and asset tests (77 passed), including regressions for the legacy VS Code option and top-level compatibility APIs. - Inspected the wheel to verify that core modules use the flat layout, `isaaclab/paths.py` replaces `_paths.py`, the console entry point targets `isaaclab.__main__:main`, and the Kit experience files are included. - Ruff, formatting, and all applicable pre-commit hooks passed. The repository-wide changelog hook reports pre-existing fragment differences on the branch; this PR includes the required `isaaclab` changelog fragments. Not applicable. - [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 applicable pre-commit checks - [x] I have documented the Git-source installation path - [x] My changes generate no new runtime warnings - [x] I have added tests that exercise the aggregate build and installed resource layout - [x] I have added a changelog fragment under `source/isaaclab/changelog.d/` - [x] My name already exists in `CONTRIBUTORS.md` (cherry picked from commit 360522d)
A handful of unit tests inspect repository artifacts that only exist in a source checkout (`apps`, `scripts`, the root `pyproject.toml`, `uv.lock`, `tools/wheel_builder`, and the workflow files). Run from an installed package they fail because those paths are absent. This gates them behind a shared `source_checkout_root` session fixture that locates the checkout and skips the test when it is not present, and returns the root path so the tests stop recomputing it by hand. The fixture lives in `source/isaaclab/test/conftest.py`. The affected tests now take `source_checkout_root` and drop their local `_repo_root()` helpers, so the gating is explicit at the test and the requirement is hard to forget: a checkout-only test needs the root anyway, so it asks for the fixture and gets the skip for free. - Bug fix (non-breaking change which fixes an issue) - [x] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` - [x] I have read and understood the contribution guidelines - [x] I have run the `pre-commit` checks 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 - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there (cherry picked from commit 9adf483)
# Description The `ovrtx-cache-warm` job selects its tests with `test-k-expr: (isaacsim_rtx or ovrtx) and (rgb or depth)`. That expression matches **zero** of the 33 collected items, so the job deselects everything and the shader-cache save step runs with nothing to publish: ``` collected 11 items / 11 deselected / 0 selected (test_rendering_cartpole.py) collected 22 items / 22 deselected / 0 selected (test_rendering_cartpole_kitless.py) ``` ## How isaac-sim#7114 made the AOV labels stale `pytest -k` matches against parametrize IDs, and isaac-sim#7114 ("[Test] Group rendering correctness AOVs") changed what those IDs are made of. Before isaac-sim#7114, `_make_sensor_data_type_params()` emitted one node per data type, and the data type was the last segment of the ID. After isaac-sim#7114, `group_rendering_params()` merges every AOV that can be captured from a single environment into one node, and the ID's last segment becomes the *capture group* name (`static`, `temporal`) rather than any individual data type: | | Before isaac-sim#7114 | After isaac-sim#7114 | | --- | --- | --- | | kit | `physx-isaacsim_rtx-rgb`<br>`physx-isaacsim_rtx-depth`<br>`physx-isaacsim_rtx-albedo`<br>… | `physx-isaacsim_rtx_renderer-static` | | kitless | `legacy-ovphysx-ovrtx-rgb`<br>`legacy-ovphysx-ovrtx-depth`<br>… | `legacy-ovphysx-ovrtx_renderer-static` | `rgb` and `depth` still run — they are two of the AOVs captured inside the `-static` node — but they are no longer *named* in any node ID. So the `(rgb or depth)` half of the expression, which selected 4 kit + 8 kitless nodes under the old scheme, now selects nothing. The `(isaacsim_rtx or ovrtx)` half still matches fine; only the AOV half went stale. The timeline is why this was never caught: isaac-sim#7114 merged 2026-08-21 and the cache-warm job was added in isaac-sim#6905 on 2026-09-03, so the expression was written against an ID scheme that had already been replaced two weeks earlier. The job has deselected everything for its entire life. Only this one expression was affected — the other `test-k-expr` values in the workflows (`legacy`, `ovstage`, `not ovphysx`, `test_environments and not (Soft or Cloth or Cable)`) match on segments isaac-sim#7114 did not touch. ## Impact * The warmer compiles no PSO blobs, so the `kit/` and `kitless/` shader-cache trees are never populated and the rendering-correctness jobs that restore them keep compiling shaders cold. * Nothing bad is *published*: the save steps in `.github/actions/ovrtx-shader-cache/action.yml` are gated on non-zero file counts, so an empty tree is never written back. * `verify.sh` does emit `::error::` for the empty trees, but the job is `continue-on-error: true`, so the failure never surfaced. ## Fix Pin the warmer to the RTX-renderer subset of the existing post-merge node lists (2 kit + 4 kitless nodes) via the `test-node-ids-file`/`test-node-ids-key` mechanism the sibling `rendering-correctness-kitless-*` jobs already use, and drop `test-k-expr`. The mechanism change is deliberate rather than repairing the expression to `(isaacsim_rtx or ovrtx) and static`. A `-k` expression that matches nothing is indistinguishable from one that legitimately matches nothing in a given file, so `tools/conftest.py` treats "0 selected with a k-expr" as a pass by design — which is exactly why this went unnoticed for the life of the job. An unknown node ID is passed to pytest as an explicit target and fails collection outright, so the next parametrize-ID rename cannot silently empty this job again. Verified by generating the parametrize IDs from `rendering_test_utils` at both `7b504e34df^` and `develop`, confirming the before/after IDs above, that the pre-fix 11/22 deselected counts reproduce exactly, and that all six configured node IDs resolve. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Release backport - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## 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 <!-- CI-only change; no source package is touched --> - [x] I have added a changelog fragment under `source/<pkg>/changelog.d/` for every touched package <!-- none touched: CI configuration only --> - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there (cherry picked from commit e80f5df)
…sim#7736) # Description Updates the scheduled changelog resolver to discover every remote `release/*` branch automatically instead of naming one release branch. `develop` remains a static target. A discovered release branch is included when it contains `tools/changelog/cli.py`. The historical 2.x release branches predate that compiler and are reported as skipped rather than creating permanently failing nightly jobs. The current resolved release set is `release/3.0.0` and `release/3.0.0-beta2`; future compiler-enabled release branches are picked up without another workflow edit. Manual dispatch still accepts exactly one explicit branch. Companion default-branch PR: isaac-sim#7737 ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Validation - Full `pre-commit run --all-files` passed, including changelog and Git LFS pointer checks. - YAML parsing passed. - The scheduled resolver produced `["develop","release/3.0.0","release/3.0.0-beta2"]`. - The manual resolver produced `["release/3.0.0"]`. - Unsupported `release/2.1.0`, `release/2.2.0`, and `release/2.3.0` refs were detected and skipped. - `git diff --check` passed. ## Release backport - [x] Backport automation is not requested; the default-branch companion PR applies the live scheduling fix directly. ## Checklist - [x] I have read and understood the contribution guidelines. - [x] I have run the repository pre-commit checks. - [x] My changes generate no new warnings. - [x] No source package changed, so no changelog fragment is required. - [x] Documentation and screenshots are not applicable to this workflow-only change. (cherry picked from commit e78aa3e)
## Description Updates the `rsl-rl-lib` pin from 5.4.1 to 5.5.1 and removes the redundant direct `onnxscript` dependency, which RSL-RL already provides. This is the dependency-only portion of isaac-sim#7784; no compatibility shims, tests, or runtime code are changed. ## Type of change - Dependency update ## Release backport - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## Screenshots Not applicable. ## Validation - `uv lock --check` - `uv run isaaclab -f` - `uv run python -m pytest source/isaaclab_rl/test/test_rsl_rl_cfg_deprecation.py -q` (39 passed) ## Checklist - [x] I have read and understood the contribution guidelines - [x] I have run the pre-commit checks with `uv run isaaclab -f` - [x] Documentation changes are not required for this dependency-only update - [x] My changes generate no new warnings - [x] Existing compatibility tests cover this dependency-only update - [x] A changelog fragment is not required because no source package is changed - [x] My name already exists in `CONTRIBUTORS.md` (cherry picked from commit 480398d)
…7821) ## Description Downstream projects do not inherit Isaac Lab's uv overrides. The published wheel's loose Torch requirements therefore allowed newer, untested builds from PyPI, as reported by the SO-101 tutorial with Torch 2.13.0. Pin torch/torchaudio 2.11.0 and torchvision 0.26.0 directly in the published dependencies, remove the redundant uv overrides and their generated copies, and refresh the lockfile metadata. The existing platform-specific PyTorch indexes remain unchanged: CUDA 12.8 on Linux x86_64 and Windows, and CUDA 13.0 on Linux aarch64. Normal `uv sync` and `uv run` commands require no CUDA selectors. Document that downstream uv projects must configure their own PyTorch indexes. The corresponding tutorial fix adds those indexes, keeps x86 on CUDA 12, and removes its obsolete Newton release-1.5 override. The pinned Warp 1.17.0 installation reports CUDA Toolkit 12.9. Isaac Lab already pins the compatible Newton 1.6.0rc1 release and documents the OpenUSD parser workaround. ## Validation - 22 focused metadata and wheel-builder tests passed, including the updated check that direct Torch pins match the central version table. - `uv lock --check` and `uv run isaaclab -f` passed. - Tutorial: 61 tests, Ruff, and the reported 8-environment/100-step zero-agent command passed with the default CUDA 12.8 build and `PXR_WORK_THREAD_LIMIT=1`. - Co-installation: `uv sync --locked --extra isaacsim --extra test` installed Isaac Sim 6.1.0.0 alongside Torch 2.11.0+cu128, matching Isaac Sim's Torch pin without an override. `uv run --extra isaacsim isaaclab train --rl_library rsl_rl --task Isaac-Cartpole-Direct --num_envs 16 --max_iterations 5` passed with both `physics=isaacsim_physx` and `presets=newton_mjwarp` in the same environment (exit 0 and `Training time:` for each). PhysX used the existing install-CI Carbonite environment shim preload; both runs set `PXR_WORK_THREAD_LIMIT=1`. - GPU validation used an RTX PRO 6000 Blackwell Workstation Edition with driver 580.159.03. No Windows or aarch64 hardware runs were performed. ## Type of change - Bug fix - Documentation update ## Release backport - [x] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## Checklist - [x] Ran pre-commit checks with `uv run isaaclab -f` - [x] Updated installation documentation - [x] Updated existing version-pin coverage - [x] Added an Isaac Lab changelog fragment (cherry picked from commit 538a409)
…saac-sim#7800) # Description Fixes the AnymalD / OVPhysX env-step regression introduced when isaac-sim#7713 made the native Newton actuator path the default (perf team repro: 16384 envs, 47 → 256 ms per env step, GPU utilization 65% → 12%; bisected to `cdb244d1`). **Root cause.** `PhysxActuatorRuntime._run_native_actuator_kernels` launches `sync_torque_telemetry` with `data.joint_stiffness`, `data.joint_damping` and `data.joint_effort_limits` every physics step. On OVPhysX those are CPU-only bindings whose getters were gated on the simulation timestamp, so each access was a blocking `TensorBinding.read` into pinned host staging plus an H2D copy — three host round-trips per physics step, re-fired every step because `update()` bumps the timestamp, with cost linear in the environment count (measured 0.35 ms at 256 envs, 1.07 ms at 1024; extrapolates to ~15 ms per physics step at 16384). PhysX returns cached views and the Isaac Lab actuator path only reads gains for implicit actuators, which is why only OVPhysX × native regressed. The LSTM itself is on the GPU throughout (`DriveNeuralLSTM` reports `warp_device=cuda:0 torch_device=cuda:0`); the regression is host-side. **Fix.** Joint properties (gains, limits, armature, friction) and body mass/inertia are static under stepping, and their `write_*` / `set_*` setters already update the data buffers in place before pushing to the wheel. They are now read through the existing `_read_static_binding_into_buf` gate — once after explicit invalidation — instead of once per step. Body state buffers (poses, velocities, accelerations) keep the per-step refresh. Tendon properties are left unchanged (GPU-resident; separate writers) and can follow in a later PR. **Measured (laptop RTX 5000 Ada, `isaaclab benchmark runtime`, `Isaac-Velocity-Flat-AnymalD`, `physics=ovphysx`, 1024 envs, 100 steps):** | | native actuators, before | native actuators, after | Isaac Lab actuators | | --- | --- | --- | --- | | env step | 22–30 ms (unstable) | **14 ms, std 0** | 14–15 ms | | actuator step / physics step (median) | 2.0–2.4 ms | **0.94 ms** | 0.75 ms | | gain/limit getters / physics step | 1.07 ms (3 blocking reads) | 0.01 ms | n/a | Regression test `test_static_property_reads_are_not_invalidated_by_simulation_steps` asserts one binding read across several steps for joint and body properties, one more after explicit invalidation, per-step refresh for state buffers, and the joint-ordering gather path. It fails on `develop` (`assert 3 == 1`) and passes with this change. Fixes # (perf team regression report; no issue filed yet) ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Release backport - [x] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## 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 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 (cherry picked from commit 416a1d1)
# Conflicts: # source/isaaclab/test/install_ci/uv_pip/uv-overrides.txt # tools/wheel_builder/uv-overrides.txt
# Fixed locomanipulation NuRec SDG generation Hugging Face NuRec assets were updated to v0.2. This PR updates locomanip_sdg to use the v0.2 assets and fixes several issues in the NuRec SDG workflow: - Fixed navigation pose projection and recorder initial-state capture after placement. - Synced randomized static fixture poses so downstream success checks use the placed table pose - Applied Isaac RTX Gaussian camera settings for NuRec camera capture. - Automatically enabled placement randomization when a NuRec scene is used. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Release backport - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## Screenshots <img width="692" height="437" alt="image" src="https://github.com/user-attachments/assets/5491a85a-cd94-4fa0-818e-66e4983cdd6c" /> ## Checklist Docker and GPU tests run on demand. Push the commits you want tested, then comment `run-ci` on the pull request. - [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 - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] 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 <!-- 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 --> (cherry picked from commit b9618b6)
Contributor
Author
|
run-ci |
# Description Pin the Franka Pour robot asset to its authored `Colliders=convex_hulls` variant. The primitive default omits the arm collision meshes (`link0_c` through `link7_c`) required by the task, preventing the current Newton MPM environment from starting correctly. This keeps the current 70% / 735-particle layout unchanged. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Release backport - [x] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## Screenshots Not applicable. ## Validation - `uv run --extra test python -m pytest -q source/isaaclab_tasks/test/contrib/test_franka_pour_env_cfg.py` (13 passed) - `uv run isaaclab -f` - Local Newton GL playback with the published `model_6997.pt` checkpoint and one current-layout environment ## Checklist - [x] I have read and understood the contribution guidelines - [x] I have run the pre-commit checks - [x] Documentation changes are not required for this task configuration fix - [x] My changes generate no new warnings - [x] I have added a test that proves the asset variant contract - [x] I have added a changelog fragment for `isaaclab_tasks` - [x] My name already exists in `CONTRIBUTORS.md` (cherry picked from commit ad8b371)
# Description Pin the Franka Pour robot asset to its authored `Colliders=convex_hulls` variant. The primitive default omits the arm collision meshes (`link0_c` through `link7_c`) required by the task, preventing the current Newton MPM environment from starting correctly. This keeps the current 70% / 735-particle layout unchanged. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Release backport - [x] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## Screenshots Not applicable. ## Validation - `uv run --extra test python -m pytest -q source/isaaclab_tasks/test/contrib/test_franka_pour_env_cfg.py` (13 passed) - `uv run isaaclab -f` - Local Newton GL playback with the published `model_6997.pt` checkpoint and one current-layout environment ## Checklist - [x] I have read and understood the contribution guidelines - [x] I have run the pre-commit checks - [x] Documentation changes are not required for this task configuration fix - [x] My changes generate no new warnings - [x] I have added a test that proves the asset variant contract - [x] I have added a changelog fragment for `isaaclab_tasks` - [x] My name already exists in `CONTRIBUTORS.md` (cherry picked from commit ad8b371)
…aac-sim#7870) Franka Lift can stall while filling its reset-state bank: the updated `franka_panda.usda` defaults to `Colliders=primitives`, whose first-link capsule extends 6 cm below the ground. The existing ground-clearance criterion rejects every candidate, leaving the RSL-RL export batch at `0/2048` until its 600-second timeout. This PR selects `Colliders=convex_hulls` on the robot configuration shared by rigid Franka Lift and Reorient, restoring the previous collision geometry and successful reset sampling. The affected asset and reset setup originated in [isaac-sim#6457](isaac-sim#6457) ([564a008](isaac-sim@564a008)), then moved into the current Lift tasks in [isaac-sim#6732](isaac-sim#6732) ([73106da](isaac-sim@73106da)). The triggering change is external: the production Franka asset's top layer now selects primitive colliders and reports `Last-Modified: 2026-09-15 22:49:27 GMT`. Controlled comparisons found 0 valid states in 128 draws with the new default; explicit convex hulls and the preserved old asset both produced 63 valid states from the same draws. The same reset hang appeared in CI for isaac-sim#7838, isaac-sim#7608, isaac-sim#7832, isaac-sim#7834, and isaac-sim#7866. [The isaac-sim#7866 RL log](https://github.com/isaac-sim/IsaacLab/actions/runs/35202342707/job/105139978507) shows the batch blocked on Franka Lift after environment setup. isaac-sim#7866 fixes the independently configured Franka Pour task; it does not change Lift's robot configuration. This change covers Lift/Reorient only. Validation: - Fresh regression check on this branch: both Lift/Reorient cases failed without the production fix; all 9 tests in `test_lift_env_cfg.py` passed with it. - `uv run isaaclab -f` passed. - Earlier GPU validation of the identical Lift change completed the original 2,048-state harvest and reset in 22.169 seconds; the existing four-task RSL-RL export batch passed in 107.92 seconds. - Local GPU validation used PyTorch 2.11+cu128, Newton 1.6rc1, and RSL-RL 5.4.1. The identical Lift fix also passed [the full locked-environment RL CI job in isaac-sim#7865](https://github.com/isaac-sim/IsaacLab/actions/runs/35207648168/job/105158711330). Reset-bank sizes, clearance criteria, export behavior, the global Franka defaults, and Pour remain unchanged. (cherry picked from commit c5d33ef)
…aac-sim#7870) Franka Lift can stall while filling its reset-state bank: the updated `franka_panda.usda` defaults to `Colliders=primitives`, whose first-link capsule extends 6 cm below the ground. The existing ground-clearance criterion rejects every candidate, leaving the RSL-RL export batch at `0/2048` until its 600-second timeout. This PR selects `Colliders=convex_hulls` on the robot configuration shared by rigid Franka Lift and Reorient, restoring the previous collision geometry and successful reset sampling. The affected asset and reset setup originated in [isaac-sim#6457](isaac-sim#6457) ([564a008](isaac-sim@564a008)), then moved into the current Lift tasks in [isaac-sim#6732](isaac-sim#6732) ([73106da](isaac-sim@73106da)). The triggering change is external: the production Franka asset's top layer now selects primitive colliders and reports `Last-Modified: 2026-09-15 22:49:27 GMT`. Controlled comparisons found 0 valid states in 128 draws with the new default; explicit convex hulls and the preserved old asset both produced 63 valid states from the same draws. The same reset hang appeared in CI for isaac-sim#7838, isaac-sim#7608, isaac-sim#7832, isaac-sim#7834, and isaac-sim#7866. [The isaac-sim#7866 RL log](https://github.com/isaac-sim/IsaacLab/actions/runs/35202342707/job/105139978507) shows the batch blocked on Franka Lift after environment setup. isaac-sim#7866 fixes the independently configured Franka Pour task; it does not change Lift's robot configuration. This change covers Lift/Reorient only. Validation: - Fresh regression check on this branch: both Lift/Reorient cases failed without the production fix; all 9 tests in `test_lift_env_cfg.py` passed with it. - `uv run isaaclab -f` passed. - Earlier GPU validation of the identical Lift change completed the original 2,048-state harvest and reset in 22.169 seconds; the existing four-task RSL-RL export batch passed in 107.92 seconds. - Local GPU validation used PyTorch 2.11+cu128, Newton 1.6rc1, and RSL-RL 5.4.1. The identical Lift fix also passed [the full locked-environment RL CI job in isaac-sim#7865](https://github.com/isaac-sim/IsaacLab/actions/runs/35207648168/job/105158711330). Reset-bank sizes, clearance criteria, export behavior, the global Franka defaults, and Pour remain unchanged. (cherry picked from commit c5d33ef)
…7868) `OperationalSpaceControllerAction` and the OSC integration-test helper used link-origin poses and Jacobians together with center-of-mass velocity feedback. When a link rotates with an offset center of mass, these quantities describe different points, producing incorrect velocity feedback. The task-frame test also copied rounded command quaternions directly into reference frames, producing inconsistent composed targets. Use `body_link_vel_w` and `root_link_vel_w` in both OSC callers, and normalize the test's cloned task-frame quaternion before coordinate conversion. Controller gains, raw command fixtures, convergence tolerances, and step budgets match the base branch; the nullspace damping ratio remains 1.0. Two direct regressions guard these contracts: a moving, fixed-base Franka checks each caller's velocity against its link Jacobian multiplied by measured joint velocity, and a numerical check verifies that the same rounded command resolves to the same absolute target through root and task frames without mutating its inputs. Provenance: - [isaac-sim#5400](isaac-sim#5400) migrated both OSC callers to `body_link_jacobian_w` while retaining the COM velocity accessors. - The rounded fixtures and unnormalized task-frame copy originated in [isaac-sim#913](isaac-sim#913). [isaac-sim#7624](isaac-sim#7624) later normalized absolute pose commands, while the separately supplied frame remained unnormalized. The exact change that first exposed the convergence failures has not been bisected; these references establish the input inconsistencies, not the first failing CI run. Validation: - Restoring COM feedback makes both velocity regression cases fail, with a maximum linear-velocity discrepancy of 0.01469 m/s versus the 1e-4 assertion tolerance. Both pass with link-origin feedback. - Removing frame normalization makes the target-equivalence regression fail with a quaternion-component discrepancy of 0.00010675 versus the 1e-6 tolerance. It passes with the correction. - The previously failing `test_franka_taskframe_pose_abs` and original `test_franka_pose_abs_with_nullspace_centering` both pass with damping 1.0. - Full OSC integration file: **21 passed** in 113 seconds, including all three new regression cases. - `uv run isaaclab -f` passes. The earlier RL, legacy-rendering, and contrib failures have matching failures and passing corresponding jobs in separate fixes: isaac-sim#7870, isaac-sim#7871, and isaac-sim#7866, respectively. Those fixes remain separate from these OSC corrections. --------- Co-authored-by: Kelly Guo <kellyg@nvidia.com> (cherry picked from commit e836331)
…7868) `OperationalSpaceControllerAction` and the OSC integration-test helper used link-origin poses and Jacobians together with center-of-mass velocity feedback. When a link rotates with an offset center of mass, these quantities describe different points, producing incorrect velocity feedback. The task-frame test also copied rounded command quaternions directly into reference frames, producing inconsistent composed targets. Use `body_link_vel_w` and `root_link_vel_w` in both OSC callers, and normalize the test's cloned task-frame quaternion before coordinate conversion. Controller gains, raw command fixtures, convergence tolerances, and step budgets match the base branch; the nullspace damping ratio remains 1.0. Two direct regressions guard these contracts: a moving, fixed-base Franka checks each caller's velocity against its link Jacobian multiplied by measured joint velocity, and a numerical check verifies that the same rounded command resolves to the same absolute target through root and task frames without mutating its inputs. Provenance: - [isaac-sim#5400](isaac-sim#5400) migrated both OSC callers to `body_link_jacobian_w` while retaining the COM velocity accessors. - The rounded fixtures and unnormalized task-frame copy originated in [isaac-sim#913](isaac-sim#913). [isaac-sim#7624](isaac-sim#7624) later normalized absolute pose commands, while the separately supplied frame remained unnormalized. The exact change that first exposed the convergence failures has not been bisected; these references establish the input inconsistencies, not the first failing CI run. Validation: - Restoring COM feedback makes both velocity regression cases fail, with a maximum linear-velocity discrepancy of 0.01469 m/s versus the 1e-4 assertion tolerance. Both pass with link-origin feedback. - Removing frame normalization makes the target-equivalence regression fail with a quaternion-component discrepancy of 0.00010675 versus the 1e-6 tolerance. It passes with the correction. - The previously failing `test_franka_taskframe_pose_abs` and original `test_franka_pose_abs_with_nullspace_centering` both pass with damping 1.0. - Full OSC integration file: **21 passed** in 113 seconds, including all three new regression cases. - `uv run isaaclab -f` passes. The earlier RL, legacy-rendering, and contrib failures have matching failures and passing corresponding jobs in separate fixes: isaac-sim#7870, isaac-sim#7871, and isaac-sim#7866, respectively. Those fixes remain separate from these OSC corrections. --------- Co-authored-by: Kelly Guo <kellyg@nvidia.com> (cherry picked from commit e836331)
…codex/backport-missing-runtime-deps-release-3.0.0
…o codex/backport-missing-runtime-deps-release-3.0.0
(cherry picked from commit 412cac4)
kellyguo11
requested review from
jaybdub,
peterd-NV and
r-schmitt
as code owners
September 17, 2026 18:15
This was referenced Sep 17, 2026
Contributor
Author
|
run-ci |
Contributor
Author
4 tasks done
kellyguo11
added a commit
that referenced
this pull request
Sep 18, 2026
## Summary - Revert the OVRTX source and test changes from open PR #7871 that were inadvertently included in release backport #7851. - Restore the four affected implementation/test files to the exact `develop` versions at `e8363313c1441788a4619157954b1842d3857759`. - Preserve the older release-only OVRTX mapping compatibility code and existing immutable changelog fragments. - Add a corrective `isaaclab_ov` changelog fragment for this release-only revert. ## Validation - `tools/changelog/cli.py check --include-worktree` against `release/3.0.0` - `ruff check` on the four affected Python files - `ruff format --check` on the four affected Python files - `python -m py_compile` on the four affected Python files - `git diff --check` - Confirmed no diff versus `develop` for the four reverted implementation/test files The OVRTX runtime tests and `uv run isaaclab -f` cannot resolve on this macOS arm64 host because the project lock supports Linux x86_64/aarch64 and Windows AMD64. Linux PR CI is the authoritative runtime validation. ## Type of change - Bug fix (release alignment) ## Checklist - [x] The reverted implementation and tests match `develop` - [x] No docs branch routing changes are included - [x] Existing changelog compilation/history differences are left untouched - [x] A new changelog fragment documents the release-only revert
4 tasks done
ooctipus
added a commit
that referenced
this pull request
Sep 20, 2026
…7904) ## Description Backports ten `develop` PRs to `release/3.0.0`, including the PyTorch 2.12/CUDA 13.0 upgrade, the near-singular OSC fix, and the complete cfg-first cloning and schema-fragment migrations. The audit covers September 17, 2026 00:00 UTC through `develop` commit `4269c29a39e463dd07c74a9704d890d7a5c01e08` (September 19, 23:55 UTC), against release base `970d21ef48057a2efc3d749c0f2abab8e7e0c30e`. | Source PR | Included change | | --- | --- | | #7777 | Refresh Newton solver transforms after fixed-root pose writes | | #7608 | Make direct cloning cfg-first, including assets, callers, templates, tests, and migration documentation | | #7895 | Apply the existing CI exclusion for Franka cable/cloth/soft kitless rendering tests | | #7872 | Load the CUDA runtime matching PyTorch for Newton graph capture | | #7831 | Check authored Newton mesh-collision schema tokens correctly | | #7834 | Build documentation with the extra that provides Sphinx | | #7838 | Migrate maintained consumers to physics schema fragments, including readers and overrides | | #7840 | Consistently name Isaac Lab 3.1 as the deprecation removal release | | #7903 | Handle near-singular operational-space control | | #7674 | Upgrade PyTorch to 2.12, TorchVision to 0.27, and the CUDA stack to 13.0, including installer, wheel, and cuRobo compatibility changes | All 305 changed non-lock files match the audited `develop` snapshot exactly. The remaining file, `uv.lock`, matches that snapshot after substituting the package versions from the release branch's existing manifests; all 418 package entries were checked. Existing release package versions, compiled changelogs, documentation routing, and OVRTX compatibility code remain intact, including the #7880 revert. Source commit hashes are recorded in the commit messages. ### Already present #7866, #7870, #7867, #7869, and #7868 were included in #7851; #7819 was backported by #7884; #7883, #7885, and #7887 were backported by #7889. #7874, #7888, #7773, #7886, and #7042 were also already present. The three automatic changelog/version compilation commits are excluded; the release branch compiles its own fragments and maintains its own versions. ## Type of change - Release integration/backport - Bug fixes and documentation updates - Breaking changes already accepted for the 3.0 cloning and schema migrations; their migration guidance and changelog fragments are included ## Validation - `uv run --no-sync isaaclab -f`: all checks passed using the existing shared environment and the release base for changelog validation. - Focused cloning, OSC feature, schema parity/shim, CLI, and task configuration suite: **283 passed**. - Newton fixed-root updates and CUDA runtime/capture regressions: **14 passed**. - Complete OSC simulation suite: **21 passed**. - Mesh-collision fragments: **17 passed**; cfg-first cloning integration: **16 passed**; scene construction/ownership: **7 passed**. - The above **358 tests passed with PyTorch 2.11**. - With **PyTorch 2.12/CUDA 13.0**: installer/metadata/Docker tests **91 passed**; CPU/GPU OSC feature tests **17 passed**; complete OSC simulation suite **21 passed**. - `uv lock --check`: passed; release package manifests match their lockfile entries. - Repository skill validation: **23 skills passed**. - File-by-file source audit, release-metadata preservation checks, and `git diff --check`: passed. Local simulation used RTX 5090 and Isaac Sim 6.0.1 with PyTorch 2.11 and 2.12. The full Docker image build and fresh installation matrix were not rerun locally for this backport. Release CI uses its pinned Isaac Sim 6.1 image and remains the authoritative full integration check. Kit-dependent suites run in separate processes to avoid loading standalone USD before Kit. ## Release backport Not applicable: this PR targets `release/3.0.0` directly. ## Checklist - [x] Ran the complete pre-commit command. - [x] Included the original migration documentation, regression tests, and changelog fragments for every changed package. - [x] Preserved source attribution and recorded every source commit. - [x] Preserved the release branch's versions and existing release-specific changes. --------- Co-authored-by: vidurv-nvidia <vidurv@nvidia.com> Co-authored-by: ooctipus <ooctipus@users.noreply.github.com>
2 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Consolidates the complete
developtorelease/3.0.0backport set previously split across #7851, #7852, and #7853. Keeping the changes together lets CI validate the runtime, task, tooling, dependency, and renderer prerequisites as one coherent release tree.The aggregate includes all audited develop changes through
e8363313c, including the latest #7866, #7867, #7868, #7869, and #7870 fixes. It also includes the exact net patch from #7871 (412cac434/ patch ID0f69afa6) because the externally updated Franka asset already breaks the release legacy-rendering matrix; #7871 is still pending merge todevelopat the time of this update.Release CI now uses the same immutable Isaac Sim
latest-developdigest asdevelop:This supersedes #7852 and #7853.
Type of change
Release backport
release/3.0.0directly.Screenshots
Not applicable.
Validation
.github/workflows/config.yamlmatchesdevelop.uv lock --check, and aggregategit diff --checkpassed.uv run isaaclab -fand local docs build cannot run on macOS ARM64 because the lock supports Linux x86_64/aarch64 and Windows AMD64; Linux CI is authoritative for those checks.Checklist
Aggregate CI result
The consolidated head
1b22248e6completed with 50 successful checks, 5 intentional skips, 0 pending, and 0 failures. This includes both installation platforms, docs, pre-commit, dependency licenses, Docker builds, all core/task shards, contrib, RL, standalone demos, legacy rendering, OVRTX, and multi-GPU tests. The initially intermittent DrLegs HoldPose failure passed on the focused job rerun without a code change.