Angehu/perf smoke integration - #13
Closed
angehu-nv wants to merge 96 commits into
Closed
Conversation
# Description Stabilizes the Reach environment smoke cases that intermittently terminated inside the bundled OpenUSD 25.11 physics parser. The current Kit runtime starts OpenUSD with multiple workers, where concurrent physics descriptor collection can corrupt native state and terminate pytest without a Python traceback. `SimulationApp` already exposes `limit_cpu_threads`, but `AppLauncher` previously filtered that option out. This change: - forwards `limit_cpu_threads` through `AppLauncher`; - launches the regular, Newton, and stage-in-memory environment smoke suites with one CPU worker; and - gives `Isaac-Reach-Franka-OSC` a valid reachable absolute-pose action with nominal stiffness instead of sampling an unbounded Gaussian pose and non-unit quaternion. ## Drawback `limit_cpu_threads=1` is broader than an OpenUSD-only switch. For the lifetime of these three test processes it also limits Kit/Carbonite tasking, TBB, and OpenBLAS. GPU physics and rendering remain parallel, but CPU-heavy stage parsing, asset loading, and cloning may be slower for every environment in these suites, and these jobs no longer exercise multithreaded CPU paths. This draft PR is intended to expose that CI wall-time tradeoff before the approach is finalized. The workaround can be removed once the bundled OpenUSD runtime contains the parser fix. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Screenshots Not applicable. ## Validation - `uv run --frozen python -m pytest source/isaaclab/test/app/test_kwarg_launch.py::test_limit_cpu_threads_forwarded_to_simulation_app -q` - CUDA:1 regular Reach/OSC smoke selection: 4 passed - CUDA:1 explicit-Newton Reach/OSC smoke selection: 4 passed - CUDA:1 stage-in-memory Reach/OSC smoke selection: 2 passed - Five fresh combined stage-in-memory processes: 10/10 selected cases passed - `uv run --frozen isaaclab -f` - Changelog gate evaluated against `upstream/develop` ## 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 test stabilization - [x] 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 package - [x] My name is already present in `CONTRIBUTORS.md` --------- Co-authored-by: Antoine RICHARD <antoiner@nvidia.com>
## Description Adds first-class cable authoring and runtime support for Newton. - Adds `CableObjectCfg`, the `CableCfg` spawner, and `CableMaterialCfg` for authoring open, linear, nonperiodic `UsdGeom.BasisCurves` cables, with validated thickness, density, and the four stiffness moduli (finite/positive geometry, finite/nonnegative stiffness). - Adds a backend-dispatched `CableObject` and `CableObjectData` API exposing per-segment world pose and velocity, with indexed and masked pose/velocity writes, default-state capture for restoration, interactive-scene integration, and model-rebuild rebinding on `PHYSICS_READY`. - Implements the Newton VBD backend for cables. Cables run under a standalone `NewtonVBDManager` and under `CouplerProxyCfg` when a named VBD entry owns the cable segments. Other backends are not registered, so selecting PhysX or OpenUSD PhysX raises the generic factory import error; PhysX non-support is documented in the supported-features tables. - Adds opt-in cable collision (`collision_props`) with adjacent-segment-only collision filtering, so connected segments are filtered while the cable still collides with the ground and with other cables, matching Newton's cable-pile behavior. - Adds a runnable Newton VBD cable-pile demo (`scripts/demos/cables.py`) with configurable cable and segment counts and periodic state resets, plus a showroom gallery entry. - Supports imported and replicated cables, colors VBD-integrated cable bodies at simulation start, and skips particle-BVH rebuilds in cable-only (particle-less) scenes. - Allows physics materials to bind to deformable curves (`PhysicsCurvesDeformableSimAPI`) while preserving existing deformable-body query semantics. - Adds the `Using Cables` guide covering authoring, materials, collision, runtime state, USD import, and limitations. - Adds authoring, importer, runtime, state, proxy-coupler, render-sync, and callback-lifetime test coverage, plus public API documentation. All four stiffness moduli are exposed. `shear_stiffness` and `twist_stiffness` default to `None` and are then left unauthored, so Newton keeps applying its stretch and bend fallbacks and existing cables are unchanged. An authored zero is kept as zero rather than treated as unset. Cable curve points are synchronized to the render delegate through CPU Fabric because the RTX Hydra delegate does not read GPU-backed Fabric arrays for `BasisCurves` (NVBug 6502662). The on-device sync path can be restored once that bug is fixed. VBD builder coloring is unified into `NewtonVBDManager.start_simulation`, which colors any VBD builder (cables and deformables) on the clone path while the USD-import path is colored during builder instantiation. This supersedes the `post_replicate_hooks` / `color_registered_deformables` post-replication coloring, which is removed. Deformable coloring is preserved through the unified path. ## Known limitations These are documented in the guide's Limitations section rather than worked around. - **Uniform point spacing is assumed.** Newton derives one stiffness pair from the mean segment length, so uneven control-point spacing mistunes the outlier segments. Tracked upstream as newton-physics/newton#3722. This cannot be corrected on the Isaac Lab side: `joint_penalty_k` is snapshotted once during initialization, so post-finalize writes to `joint_target_ke` have no effect. - **Contact properties are not per-cable.** The Newton cable importer derives each cable's `ShapeConfig` from the import-wide default and carries over only density and the collision flags, so friction, contact stiffness/damping, margin, and gap fall back to solver-global values. Tracked upstream as newton-physics/newton#3734. `collision_props` is therefore honored for enabling collision, not for tuning it. ## Type of change - New feature (non-breaking change which adds functionality) - Documentation update ## Screenshots N/A. This change adds backend API and simulation behavior without a user-interface change. ## Validation - The cable authoring, USD import (including adjacent collision filtering and the shear/twist fallback semantics), runtime/state, proxy-coupler, and render-sync test suites pass. - The cable-pile demo runs under standalone Newton VBD with periodic resets on CPU and CUDA, and renders under the Kit/RTX visualizer (`--visualizer kit`, 250 steps) with the reset firing and no missing-curve-point warnings. - Masked segment writes are verified CUDA-graph capturable. - Full pre-commit checks passed. - Changelog validation passed for every touched package. - Documentation built successfully without warnings. ## 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; CI handles changelog compilation and version bumps - [x] I have added my name to `CONTRIBUTORS.md` or my name already exists there --------- Signed-off-by: Kelly Guo <kellyg@nvidia.com> Co-authored-by: Kelly Guo <kellyg@nvidia.com>
# Description Fixes isaac-sim#5302. Fixes isaac-sim#6853. Manual direct workflows call the cloner after spawning their assets, but most of them only authored per-environment collision groups on CPU—or did not author them at all. The PhysX replication path currently uses USD collision filtering instead of PhysX environment IDs, so CUDA replicas could collide across environments and constrain articulated joints despite valid effort targets. This change: - applies collision filtering on every PhysX simulation device for all affected in-repo tasks and standalone scripts using the manual direct-workflow cloning path; - preserves each affected workflow's global ground or terrain collision paths; - guards the filtering by backend so Newton behavior is unchanged. The deterministic 4,096-environment reproduction now reports identical cart velocity in every environment after 20 steps at 100 N: ```text min=6.7209768 m/s, max=6.7209768 m/s, mean=6.7209768 m/s ``` ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## Screenshots Not applicable. ## Validation - Audited standalone cloning scripts and updated the two affected direct-workflow paths. - Confirmed the original 4,096-environment constant-effort diagnostic produces identical velocities across replicas. - Confirmed the Newton MJWarp control remains consistent across four replicas. - `uv run isaaclab -f` - `uv run --no-sync python tools/changelog/cli.py check issue-5302-base` - Confirmed Cartpole rendering correctness passes for the PhysX/Isaac Sim RTX and PhysX/Newton renderer combinations (2 passed). - Confirmed the registered Cartpole and Shadow Hand camera tasks match their updated collision-group stage goldens. ## 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 behavior-only fix. - [x] My changes generate no new warnings. - [x] Existing environment tests cover the affected behavior. - [x] I have added a changelog fragment for the touched package. - [x] My name already exists in `CONTRIBUTORS.md`.
…6728) # Description Disable Isaac Sim's default simulation-manager callbacks before extension startup using its new `enable_default_callbacks` setting. On Isaac Sim versions that support the setting, Isaac Lab now preserves the native `SimulationManager` instead of replacing its module exports. Older versions continue to use the existing callback-disable and manager-takeover fallback for backward compatibility. This prevents Isaac Sim's timeline and stage callbacks from invalidating the PhysX tensor view owned by `PhysxManager`, while allowing the compatibility patch to be removed once older Isaac Sim versions are no longer supported. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Testing - `uv run isaaclab -f` - `uv run python tools/changelog/cli.py check develop` - `uv run --extra test python -m pytest source/isaaclab/test/app/test_env_var_launch.py -k 'not livestream'` - Legacy Isaac Sim ownership integration test: 1 passed - New Isaac Sim setting runtime smoke: - verified the extension remained disabled until explicitly enabled - verified all five default callbacks were disabled - verified the native `SimulationManager` remained exported - reset and stepped `Isaac-Reach-Franka` - stepped successfully after a timeline stop/play cycle ## 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 have added tests that prove the fix is effective - [x] I have added a changelog fragment for every touched package - [x] My name already exists in `CONTRIBUTORS.md`
…im#6849) # Description Make task configurations whose existing default aliased `PhysxAutoCfg` use concrete `isaacsim_physx` instead. Tasks with an explicit Newton or other backend default retain that default. The explicit `physics=physx` selector remains automatic, so users can still request runtime-dependent selection between Isaac Sim PhysX and OvPhysX. This also fixes optional backend, visualizer, and RL framework installation guidance. Runtime errors and documentation use complete `uv run --extra ...` commands only when an optional dependency is required; RSL-RL commands retain plain `uv run` because RSL-RL is included in the base environment. Manual pip fallbacks install published wheels directly instead of using invalid editable extras. The OvPhysX fallback intentionally omits a version so the diagnostic does not become stale when the runtime dependency changes. Previously, task defaults that aliased `PhysxAutoCfg` could resolve to OvPhysX when no explicit Kit signal was present, even though suffixless PhysX tasks were expected to retain Isaac Sim PhysX behavior. Separately, several failure messages suggested incomplete `uv run` invocations or editable package commands that did not install the missing runtime into the active environment. No new dependencies are required. ## Type of change - Bug fix - Breaking change for tasks that previously defaulted to automatic PhysX selection - Documentation update ## Screenshots Not applicable. ## Validation - `uv run python -m pytest source/isaaclab_ov/test/test_ovrtx_renderer_contract.py source/isaaclab_tasks/test/contrib/stack/test_so101_stack_physics_cfg.py source/isaaclab_tasks/test/core/test_dr_legs_physics_presets.py source/isaaclab_tasks/test/core/test_preset_kit_decision.py source/isaaclab_tasks/test/core/test_reach_franka_presets.py source/isaaclab_tasks/test/core/test_runtime_compatibility.py` (78 passed, 17 skipped) - Explicit config assertions for the preserved DR Legs, Handover, Franka Soft, Reach, Allegro Hand, and Shadow Hand Newton defaults - Root dependency audit confirming RSL-RL is a base dependency while RL-Games, SKRL, SB3, RLinf dependencies, and video are optional - `uv run --isolated --extra test -- make -C docs current-docs` - `uv run python tools/update_environments_rst.py --check` (127 training environments) - `uv run python tools/changelog/cli.py check changelog-upstream-develop` - `uv run --no-project python tools/skills/cli.py check` - `uv run isaaclab -f` ## Checklist - [x] I have read and understood the contribution guidelines - [x] I have run the pre-commit checks - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have updated tests to prove the changed behavior - [x] I have added a changelog fragment for every touched package - [x] My name already exists in `CONTRIBUTORS.md`
# Description
Replaying demonstrations for an absolute task-space (IK) task crashed
*after* all
episodes had replayed successfully, with a `torch.linalg.solve ... input
matrix is
singular` error from the differential IK controller instead of exiting
cleanly.
Root cause is a trailing step past the end of the recorded data. In
`replay_episodes_loop`, `env.step(actions)` sat outside the
`has_next_action`
check, so once every environment had exhausted its episodes the loop
applied the
untouched `idle_action` one last time before terminating. No task
defines
`idle_action`, so it falls back to `torch.zeros(env.action_space.shape)`
— and for
an absolute-pose action (`[pos_xyz, quat_xyzw, gripper]`) a zeros action
carries a
**zero-norm quaternion**.
`DifferentialIKController.set_command` renormalized it as `quat /
norm(quat)`,
i.e. `0/0`, producing a NaN target orientation. The NaN propagated into
the joint
position targets, diverged the articulation, and only surfaced on the
next
decimation sub-step as an unrelated "singular matrix" failure — which is
why the
traceback points at the solver rather than at the defect.
Fixes:
- `scripts/tools/replay_demos.py`: stop before stepping once every
environment is
exhausted, so the replay terminates without applying the idle action or
running
another IK solve.
- `DifferentialIKController.set_command`: a degenerate (zero-norm)
commanded
quaternion now holds the current end-effector orientation (identity when
none was
supplied) instead of emitting NaN. Applied per-environment via a
branchless
`torch.where`, so there is no added host sync on the training hot path.
- `adaptive_dls`: a non-finite Jacobian is reported by its actual cause
instead of
the opaque LAPACK singular-matrix / convergence failure. The check runs
only on
the failure path, so the happy path is unchanged.
The controller change is not redundant with the script change: with
`--num_envs > 1`,
an environment that finishes early keeps receiving the zero-quaternion
idle action
every step while the others replay, which would diverge that environment
and take
down the whole batch.
Reproduced and verified with `IsaacContrib-Stack-Cube-SO101-IK-Abs-v0`.
On the
unfixed code the QA command produces a byte-for-byte identical
traceback; with the
fix it prints `Finished replaying 1 episode.` and exits 0.
Note (out of scope): `idle_action` defaulting to zeros is unsound for
*any*
absolute-pose task, since a zero quaternion is never a valid
orientation. Seeding
the quaternion to identity would be a broader change affecting every
task using the
replay script, so it is left for a separate PR.
Fixes # (issue)
## Type of change
- Bug fix (non-breaking change which fixes an issue)
-
## Checklist
- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [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
…lision pipeline estimate (isaac-sim#6850) # Description `Isaac-Velocity-Rough-G1` with `presets=newton_mjwarp` and `--rl_library rsl_rl` crashes at `sim.reset()`: ``` ValueError: MuJoCo naconmax (25600) exceeds contacts.rigid_contact_max (3840). Create Contacts with at least rigid_contact_max=25600. ``` ``` naconmax = nconmax(100) x num_envs(256) = 25600 solver internal buffer rigid_contact_max = ~15/env auto-estimate x 256 = 3840 collision-pipeline buffer ``` **Root cause.** On the `use_mujoco_contacts=False` (RSL-RL sensor) path, the base `_initialize_contacts` in `newton_manager.py` sizes `NewtonManager._contacts` from the collision pipeline alone and never consults the solver's `naconmax`. `_update_sensors -> solver.update_contacts()` then requires `buffer >= naconmax`, so `3840 < 25600` raises. The `mjwarp_manager.py` override already sizes to `solver.get_max_contact_count()` for the `use_mujoco_contacts=True` path; the base path was missing the same logic. This is a buffer-sizing bug, not a Newton/mujoco_warp version regression. **Fix.** Grow `_contacts` to `solver.get_max_contact_count()` when the solver demands more. The buffer only grows, so the allocation is unchanged wherever the pipeline estimate is already large enough. No linked issue. ## Verification Reproduced and fixed on an NVIDIA L40 at 256 envs with the exact failing invocation. Before: crash at iteration 0. After: the run completes its iterations with no `naconmax` error. To confirm the larger buffer is genuinely populated rather than silently empty, `CollisionPipeline.collide` and the Newton contact sensor were instrumented and compared against an unpatched control run made legal by lowering `nconmax`: | at reset | unpatched (buffer 3840) | patched (buffer 25600) | | --- | --- | --- | | `rigid_contact_count` | 4535 (118% of capacity) | 4530 (17.7%) | | bodies reporting >1 N | 421 | 421 | | max contact force | 2369.5 N | 2432.3 N | Contact counts and sensor forces track the control run, so the patch changes buffer capacity only, not contact generation. Note that the unpatched buffer was itself overflowing at reset (4535 contacts into 3840 slots), so contacts were being dropped even in configurations where the guard does not fire. A config-level `gap=0.0` workaround was ruled out: `naconmax` stayed at 25600 and the crash was unchanged. **Known limitation.** This sizes the buffer to `naconmax` only. Where `naconmax` is smaller than the number of contacts the pipeline actually generates, the pipeline's own ~15/env auto-estimate can still under-allocate. That pre-existing sizing question is out of scope here. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Screenshots N/A ## 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 Note on the two unchecked boxes: no documentation pages are affected, and the fix is verified by the instrumented before/after runs above rather than by an added unit test — happy to add a regression test if maintainers would like one. Co-authored-by: Kelly Guo <kellyg@nvidia.com> Co-authored-by: Antoine RICHARD <antoiner@nvidia.com>
# Description The CI credential no longer has access to `nvcr.io/nvidian/isaac-lab`, so the nightly image publish fails on push. That repository is unreachable even anonymously: | Image | Anonymous | With `NGC_API_KEY` | |---|---|---| | `nvcr.io/nvidian/isaac-lab:latest-develop` | denied | denied | | `nvcr.io/0947644777160149/internal/isaac-lab:latest-develop` | — | **ok** | This points `isaaclab_image_name` at the org Isaac Sim already publishes from, which is the same org this branch pulls its base image from after isaac-sim#6815. Reading and publishing now happen in one place instead of straddling a mirror that no longer receives builds. `isaacsim_image_name` and `isaacsim_image_tag` are untouched; every workflow already resolves the publish target through `config.yaml`, so no workflow changes are needed. Follow-up to isaac-sim#6815. ## Type of change - Bug fix (non-breaking change which fixes an issue) - This change requires a documentation update ## Screenshots None. ## 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 - [ ] 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 Push access to the new repository is unverified — only pull was probed. The first scheduled publish after this merges is the real confirmation. `docs/source/features/include/docker_details.inc` still points readers at `nvcr.io/nvidian/isaac-lab:latest-develop-kitless`, which is both an unreachable org and a tag that does not exist. Left for a separate docs change. --------- Co-authored-by: Kelly Guo <kellyg@nvidia.com>
# Description The cable demo used the common visualizer launcher arguments but hard-coded its Newton VBD configuration, so it did not accept the explicit `--physics` selector used by other demo scripts. This change: - exposes `--physics newton_vbd` as the demo's single supported physics option; - resolves the backend through `launch_simulation()` and then reapplies the demo-specific VBD tuning; - preserves the Kit default and the standard `kit`, `newton`, `rerun`, `viser`, and `none` visualizer choices; - documents the available physics, visualizer, and cable-demo options; - removes the fixed-backend test override and adds a regression assertion for the explicit selector. The default launch behavior is unchanged. ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) - [x] Documentation update ## Screenshots Not applicable; the demo's rendered output is unchanged. ## Validation - `uv run --extra test python -m pytest source/isaaclab/test/app/test_standalone_scripts.py` — 40 passed, 295 runtime cases skipped - `uv run python scripts/demos/cables.py --physics newton_vbd --visualizer none --num_cables 1 --num_segments 2 --max_steps 1` - `uv run isaaclab -d` — warning-free documentation build - `uv run --frozen isaaclab -f` - `uv run --extra test python tools/changelog/cli.py check cable-demo-pr-base` against `upstream/develop` The regression test was also verified to fail against the pre-fix cable script. ## Checklist - [x] I have read and understood the contribution guidelines - [x] I have run the pre-commit checks - [x] I have made corresponding changes to the documentation - [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 for every touched package - [x] My name already exists in `CONTRIBUTORS.md`
# Description Synchronize the environment documentation with the physics, renderer, and domain presets exposed by the registered task implementations. The curated tables and interactive environment browser were maintained separately from the generated comprehensive list, which allowed task capabilities to drift between sections. The per-environment rows also exposed the automatic `physx` and `rtx` family aliases where concrete backend names are more actionable. This change: - regenerates the comprehensive table for all 127 training environments; - synchronizes curated-table preset cells from the same registry data, using the union for rows that group multiple task IDs; - generates the interactive browser's core-task rows from the registry-backed documentation rows; - documents `physics=physx` and `renderer=rtx` as valid automatic aliases in the selector overview while omitting them from per-environment rows, which retain concrete selectors such as `isaacsim_physx`, `ovphysx`, `isaacsim_rtx`, and `ovrtx`; - adds regression coverage for curated tables, browser generation, marker safety, and concrete selector filtering. No new dependencies are required. ## Type of change - Documentation update ## Screenshots Not applicable; this updates table data and its generation tooling without changing the page layout. ## Validation - `uv run python -m pytest --noconftest tools/test/test_environ_docs.py` — 21 passed - `uv run isaaclab -f` — passed all hooks - `uv run --isolated --extra test -- sphinx-build -W --keep-going -j 1 docs docs/_build/codex-pr-check-serial` — warning-free build passed (direct equivalent of `make -C docs current-docs` on Windows) - environment generator `--check` — 127 training environments up to date - JavaScript syntax check — passed ## 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 `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 - [x] No package changelog fragment is required because no `source/<package>/` files are changed - [x] My name already exists in `CONTRIBUTORS.md`
Bumped packages: - isaaclab: 15.1.1 → 15.2.0 - isaaclab_contrib: 1.0.0 → 1.1.0 - isaaclab_newton: 2.4.3 → 2.5.0 - isaaclab_ov: 0.10.1 → 0.10.2 - isaaclab_ovphysx: 8.2.2 → 8.2.3 - isaaclab_physx: 4.0.0 → 4.0.1 - isaaclab_tasks: 10.2.0 → 11.0.0
# Description The bin packing demo previously spawned every grocery object in every environment and parked the unused ones in an off-screen cache. This PR reworks the demo on top of heterogeneous cloning: it samples a per-environment object count, declares each bin layout as a clone combination, and lets the clone plan spawn genuinely different object sets per environment. Which grocery slots fill each bin is drawn with `randperm`, so layouts vary in both object count and composition, with small per-reset drop noise, and reset target poses read from the asset default root pose. - disable Newton_mjwarp physics backend for now since it does not support heterogeneous worlds. ## Screenshots Physx From: <img width="1729" height="1143" alt="Screenshot from 2026-07-17 08-46-10" src="https://github.com/user-attachments/assets/8b4d68d3-4e41-45cc-a053-a0a0ddf7db93" /> To: <img width="1620" height="1040" alt="Screenshot from 2026-07-15 19-18-03" src="https://github.com/user-attachments/assets/7b901d99-c152-464e-809b-86004e9835ea" /> ## Type of change - New feature (non-breaking change which adds functionality) ## 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 --------- Co-authored-by: Octi Zhang <zhengyuz@nvidia.com>
) # Description Drop the xfail mark so all seven Newton Warp AOV cases per suite (on every kitless Franka soft and cloth run) gate normally. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [ ] 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
…ing feature. (isaac-sim#6598) ## Summary This PR refactors visualizer and video-recording related classes and expands & cleans-up the video-recording feature. ViewerCfg is deprecated. instead we can use Visualizer eye and look_at fields. ViewportControllerCfg is deprecated and combined with KitVisualizer Two VideoRecording Config Classes are removed Video recording is redesigned - replaced gym RecordVIdeo wrapper with an internal method from VideoRecorder - eliminated eye and lookat fields from VideoRecorderCfg. the idea now is the video recorder either records a visualizer or sensor (renderer), and doesn't have any camera based fields - those fields should just live with visualizer or renderer configs - now multiple video recordings can be launched - can now record tiled camera views in visualziers - can now specify which sensor to record - also added a few more VideoRecorderCfg fields, like to keep the last n clips and start recording only after n steps Added video recorder tutorial script and separated out the video recorder docs from visualizer into its own docs page Fixed an live plots issue in Rerun Fixes isaac-sim#6605 ## Screenshots Example captures from 1 cmd with 4 VideoRecordingCfgs. These examples are from the new docs page. Kit Visualizer <img width="640" height="360" alt="example_kit_viewport" src="https://github.com/user-attachments/assets/37d161a0-fd20-44be-a7b0-52c6753bdf46" /> Newton Visualizer <img width="640" height="360" alt="example_newton_viewport" src="https://github.com/user-attachments/assets/253dabbb-c8e8-4d4d-9537-6fc6caf4081e" /> Kit Visualizer Tiled View <img width="640" height="640" alt="example_tiled_kit_viewport" src="https://github.com/user-attachments/assets/bbbd7463-0044-46d7-8df4-cc8606fc4204" /> Kit Sensor (Renderer) <img width="640" height="640" alt="example_sensor" src="https://github.com/user-attachments/assets/97f9cd6b-8a18-4a0b-ae57-c411c7024392" /> ## Test plan - [ ] `source/isaaclab/test/envs/test_video_recorder.py` — 17/17 unit tests pass (covers all `_select_video_backend` dispatch paths including new Newton fallback) - [ ] `source/isaaclab/test/sim/test_simulation_context.py` — 29 passed before pre-existing hang on `test_timeline_callbacks_with_weakref` (unrelated) - [ ] `source/isaaclab/test/envs/test_env_rendering_logic.py` — 17/17 pass - [ ] `source/isaaclab/test/sim/test_simulation_context_visualizers.py` — 28/28 pass - [ ] `source/isaaclab_tasks/test/core/test_recording_backends.py` — **5/5 integration tests pass** (Kit/PhysX, Kit/Newton fallback, Newton GL, PhysX renderer, Newton renderer) 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Kelly Guo <kellyg@nvidia.com>
# Description > [!IMPORTANT] > Confirm the pull request base before submitting. Target `develop` for all > contributions. The `release/3.0.0-beta2` branch is a frozen stable landing > snapshot and is not used for ongoing maintenance. <!-- Thank you for your interest in sending a pull request. Please make sure to check the contribution guidelines. Link: https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html 💡 Please try to keep PRs small and focused. Large PRs are harder to review and merge. --> Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. Fixes # (issue) <!-- As a practice, it is recommended to open an issue to have discussions on the proposed pull request. This makes it easier for the community to keep track of what is being developed or added, and if a given feature is demanded by more than one party. --> ## Type of change <!-- As you go through the list, delete the ones that are not applicable. --> - Bug fix (non-breaking change which fixes an issue) - New feature (non-breaking change which adds functionality) - Breaking change (existing functionality will not work without user modification) - Documentation update ## Screenshots Please attach before and after screenshots of the change if applicable. <!-- Example: | Before | After | | ------ | ----- | | _gif/png before_ | _gif/png after_ | To upload images to a PR -- simply drag and drop an image while in edit mode and it should upload the image directly. You can then paste that source into the above before/after sections. --> ## Checklist - [ ] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have 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 -->
… lazily (isaac-sim#6759) # Description Fixes a `SIGSEGV` on shutdown after training a camera task with the RTX renderer (nvbug 6492483). Not a rendering bug: `PhysicsEvent.STOP` is never dispatched, so **no sensor or asset is ever told to release its resources**. ## Root cause A physics config may declare its manager lazily (`class_type = "{DIR}.mjwarp_manager:NewtonMJWarpManager"`) so that reading the config does not import the backend. `configclass` wraps that as a `ResolvableString` — a `str` subclass that proxies attribute access. `initialize(...)` therefore works, but the shutdown gate is an identity check: ```python is_active_manager = sim is not None and sim.physics_manager is cls # str is class -> always False if is_active_manager: cls.dispatch_event(PhysicsEvent.STOP) # never runs ``` The guard exists to stop a *non-active* manager from clearing shared state; written with `is`, "skip when non-active" became "skip always" for every backend (since isaac-sim#6193, 2026-06-15). The failure is silent by construction — skipping every listener looks exactly like having none. PhysX was masked because `physx_manager.py:70` maps `PhysicsEvent.STOP → IsaacEvents.TIMELINE_STOP`, so its listeners kept receiving `STOP` through Kit's timeline. `Camera._invalidate_initialize_callback` is registered on that event, so render products stayed registered at stage teardown: 8 leaked UJITSO processors, `pipelineLayouts: 151`, `descriptorSetLayouts: 119`, then `-11`. Assets subscribe to the same event, so their invalidation was skipped too. ## The fix `PhysicsManager.close` compares against the lazily declared form as well as the class, so the dispatch no longer depends on how a caller stored the value. Restoring it exposed teardown code that had not been executing. Also fixed here: - **`OVRTXRenderer.cleanup(render_data)` ignored its argument** and tore down state shared by every camera on that backend. It now releases what `OVRTXRenderData` owns, matching `BaseRenderer.cleanup` and both sibling renderers. - **Renderer-owned state had nowhere to be released from.** A renderer is shared by every camera whose config resolves to it, so its lifetime belongs to `RenderContext`, which had no teardown counterpart to `get_renderer`. `__del__` is not one — it runs under the collector, where the ovrtx objects it touches may already be gone. New `BaseRenderer.close()` (no-op by default, so other backends and out-of-tree subclasses are unaffected) and `RenderContext.close()`, called from `clear_instance()` after `STOP` and before `close_stage()`, while the stage is still alive. - **Two Newton RTX goldens captured leaked state.** Render products are now released at teardown rather than at collection, so each environment renders from its own. Both recaptured. ## Scope 145 config fields use the lazy `"{DIR}..."` form. Exactly **one** identity comparison exists against them, the one fixed here; every other is `is None` / `is not None`, which behaves correctly on a `str`. Fixes # (not provided -- tracked internally as nvbug 6492483) ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Testing Reproduced on Isaac Sim `6.1.0rc1+release.44589`, single RTX A6000, driver 570.211.01: ``` ./isaaclab.sh train --rl_library skrl --task Isaac-Cartpole-Camera-Direct \ renderer=rtx physics=newton_mjwarp ``` | | Baseline | With this fix | |---|---|---| | exit code | `-11` | `0` | | leaked UJITSO processors | 8 | 0 | | `pipelineLayouts` / `descriptorSetLayouts` | 151 / 119 | none | | `GeometryStreaming` at shutdown | present | none | The bug requires a **non-headless** run: `--headless` never creates the viewport render path. Regression tests, each verified to fail without its fix: - `test_simulation_context.py::test_stop_is_dispatched_for_lazy_class_type` — `2 passed` (physx + newton); `2 failed` with the guard reverted. - `test_ovrtx_renderer_contract.py` — **22 passed**; the cleanup and close release cases fail against their previous implementations. - `test_simulation_render_context.py` — **11 passed**; 2 fail with the `close()` dispatch removed. - Kitless `dexsuite_kuka_homo` `legacy-ovphysx-ovrtx`: **12/12**; without the fix the 4th test fails and the process dies. - `test_rendering_lift_kuka_hetero_kitless.py` is identical with and without the renderer close, and all 54 environment teardowns complete without the process dying. --------- Co-authored-by: Kelly Guo <kellyg@nvidia.com>
…6870) # Description Adds skills and documentation to correctly identify and solve multi-gpu issues. Fixes console duplicate logging during multi-gpu training. ## Checklist - [ ] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have 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 -->
# Clean up ant and humanoid locomotion, and make the direct and manager
workflows identical
## Summary
Cleans up the ant and humanoid locomotion tasks against the conventions
used by `core/cartpole`, and
makes the direct-workflow and manager-based environments define the same
MDP so both converge to the
same reward.
The cleanup surfaced four genuine bugs, one of which was already
breaking humanoid training on
`main` before this branch existed.
## Motivation
`Isaac-Ant` / `Isaac-Ant-Direct` and `Isaac-Humanoid` /
`Isaac-Humanoid-Direct` are meant to be two
presentations of the same task, but they had drifted into two different
problems. The direct
environments were not scaling rewards by `step_dt` the way
`RewardManager` does, so the two
workflows were not even on a common reward scale — 9641 versus 91 on the
same task.
The direct environments also carried a fair amount of dead machinery
inherited from the IsaacGym
port, and encoded joint gears as backend-ordered lists that had to be
duplicated per physics
backend.
## Changes
### Direct/manager parity
The manager-based environments were the better-specified MDP, so they
are the basis. The direct
environments gained:
- feet joint wrench observations (`observation_space` 36 → 60 for ant,
75 → 87 for humanoid)
- reset joint randomization (±0.2 rad, ±0.1 rad/s, clamped into the
joint limits)
- `step_dt`-scaled rewards, matching `RewardManager.compute()`
- the gear-weighted energy and joint-limit penalties
- `episode_length_s` 15.0 → 16.0 and `env_spacing` 4.0 → 5.0
Where the direct environments were the better-specified side, the
manager-based tasks were changed
instead rather than copying the weaker behaviour:
- the terminal death cost is now a `terminating` reward term on both
workflows
- the joint effort action is now clipped on both workflows
### Cleanup
- `joint_gears` is now a dict keyed by joint name expression instead of
a backend-ordered list, so a
single table is correct for every physics backend and the
`isinstance(cfg.sim.physics, ...)`
branch is gone
- removed dead IsaacGym-era machinery from `LocomotionDirectEnv`: the
start rotation was the identity
quaternion, so `inv_start_rot`, `basis_vec0/1` and the `quat_mul` inside
`compute_heading_and_up`
were all no-ops; `motor_effort_ratio` was hardcoded to ones; `up_vec`,
`heading_vec` and `pitch`
were computed but never read
- replaced the local `normalize_angle` helper with
`isaaclab.utils.math.wrap_to_pi`, and used it in
the manager MDP terms too so both workflows wrap angles identically
- dropped a redundant `self.robot.reset()` (the base `_reset_idx`
already calls `scene.reset`) and a
private `_ALL_INDICES` access
- absolute imports in `mdp/rewards.py` and `mdp/__init__.pyi`, two stray
`# isort: skip` markers
removed, and the humanoid gear table hoisted to a single `JOINT_GEARS`
constant instead of being
written out three times
- split the `Metrics/success_rate` logging out of `progress_reward` into
a `survival_success_rate`
term, matching the cartpole convention
- removed the pass-through `__init__` on `AntEnv` / `HumanoidEnv` and an
unused `contact_force_scale`
field (later reintroduced as the feet wrench observation scale)
## Bugs fixed
**Unbounded joint efforts drove the MJWarp solver to `NaN`.** Humanoid
training aborted partway
through a run with `The observation group 'policy' ... contains NaN
values`. Reproduced in 10 steps
with large actions; the corruption originates in the raw articulation
state (`joint_pos`,
`joint_vel`, `root_lin_vel_w` all non-finite while the quaternion is
still unit-norm), not in any
observation or reward math.
| action scale | clamped | result |
|---|---|---|
| 3.0 | no | NaN at step 10 |
| 1.0 | no | clean 6000 steps |
| 3.0 | yes | clean 6000 steps |
| 5.0 | yes | clean 6000 steps |
This is **pre-existing on `main`** — confirmed by stashing this entire
branch and reproducing on
unmodified code, where `Isaac-Humanoid` failed at iteration 872. The
manager-based tasks never
clipped their joint efforts. Fixed by clipping on both workflows.
**The humanoid direct agent trained at a different rate.**
`HumanoidDirectPPORunnerCfg` overrode
`learning_rate` (1.0e-4 versus 5.0e-4), `desired_kl` and
`value_loss_coef`, so the two workflows
trained differently despite sharing an MDP. It now inherits the
algorithm settings and overrides only
the experiment name, as the ant and cartpole configs do. This closed a
10.4% reward gap to 0.4%.
**The manager-based tasks could not run on OvPhysX.** `presets=ovphysx`
failed with
`Unknown preset(s): ovphysx` because their physics preset configurations
were missing the `ovphysx`
entry the direct configurations already declared. Also pre-existing.
**`progress_reward` was inconsistent across reset.** `reset()` computed
the distance to the target
without zeroing the vertical component, while `__call__` zeroed it, so
the potential recorded at
reset did not match any subsequent step.
**The manager-based walk target was an absolute world position.**
`(1000, 0, 0)` was shared by every
environment, so robots in different grid cells aimed along measurably
different directions. It is now
offset by each environment origin, matching the direct environments.
## Verification
Parity was checked by driving both workflows from identical states and
comparing tensors directly,
which is independent of RL seed noise:
| | ant | humanoid |
|---|---|---|
| observation dimension | 60 = 60 | 87 = 87 |
| step-0 observation max abs difference | 0.0 | 0.0 |
| reward max abs difference, 60 steps | 0.0 | 4e-9 |
The humanoid comparison was repeated with actions large enough that the
new effort clip binds on
every joint, to exercise that path.
Training, `newton_mjwarp`, seed 42, 1000 iterations:
| task | manager | direct |
|---|---|---|
| ant | 80.36 | 74.68 |
| humanoid | 142.11 | 141.54 |
The ant difference sits inside its own run-to-run spread: the same
config and seed produced 81.98 and
74.68 on two separate runs, so roughly 9% of nondeterminism between
runs.
Smoke tested (3 iterations, all four tasks) on `newton_mjwarp`,
`isaacsim_physx` and `ovphysx` —
12/12 pass. `uv run isaaclab -f` is clean.
## Breaking changes
- `observation_space` for the direct tasks changed from 36 to 60 (ant)
and 75 to 87 (humanoid), and
`episode_length_s` from 15.0 to 16.0. **Existing direct-workflow
checkpoints will not load.**
- `joint_gears` changed from an ordered list (or a `{"physx": [...],
"newton": [...]}` dict) to a dict
keyed by joint name expression. Migrate by replacing the list with regex
entries, e.g.
`joint_gears = [15, 15, 15, 15, 15, 15, 15, 15]` becomes `joint_gears =
{".*": 15.0}`.
- Reward magnitudes for the direct tasks changed by roughly 60x because
they are now `step_dt`-scaled
like the manager-based tasks. Logged reward curves are not comparable
across this change.
- The joint effort clip changes the reachable effort envelope for the
manager-based tasks, so
manager-based checkpoints will behave differently even though they still
load.
## Known gaps
- **The experimental warp frontend is not ported.** Its observation
kernel writes a fixed 36/75-value
layout with no wrench block and unscaled rewards. Rather than let it
silently zero-fill the tail of
a 60/87 buffer, it now raises with an explicit message. `--frontend
warp` on these tasks does not
run until it is ported.
- **Convergence is only established on `newton_mjwarp`.** PhysX and
OvPhysX are smoke tested but not
trained to convergence.
- The direct configurations now set `bounce_threshold_velocity=0.2` on
the Isaac Sim PhysX preset to
match the manager-based tasks, instead of leaving the 0.5 default. This
changes PhysX behaviour for
the direct tasks and has not been validated by a convergence run.
- The `NaN` fix addresses the trigger, not the solver behaviour. Whether
MJWarp should emit `NaN`
rather than erroring on a diverging articulation is a separate question,
and a sufficiently bad
contact could still diverge inside the clipped envelope.
## Checklist
- [ ] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] I have 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: AntoineRichard <antoiner@nvidia.com>
# Description Isaac Lab's cluster tooling currently only covers SLURM and PBS via singularity. Both paths require converting the Docker image to a `.sif` and copying the source tree to the cluster on every submission. This PR adds an [NVIDIA OSMO](https://developer.nvidia.com/osmo) workflow spec at `docker/cluster/multi_gpu.yaml`. OSMO runs the published Isaac Lab container image directly, so there is no singularity conversion and no code copy step — the image is the unit of deployment. The workflow requests a single node and scales training across that node's GPUs through the existing `train_multigpu` command. Everything site-specific is a submission-time parameter (`image`, `rl_library`, `num_gpu`, `num_cpu`, `memory`, `storage`, `platform`, `master_port`, `args`), so the file carries no cluster- or user-specific defaults. When `num_gpu` is `1` it falls back to the single-process `train` entry point, so one file covers both cases. Submitting a 4-GPU run: ```bash osmo workflow submit docker/cluster/multi_gpu.yaml \ --set num_gpu=4 \ --set args="--task Isaac-Reorient-KukaAllegro --num_envs 4096" ``` The container startup script does two things beyond launching training: - Hides the system Vulkan ICDs when the image ships its own, which otherwise makes the loader pick up a conflicting driver on the compute node. - Splits the allocated CPUs across the per-GPU workers via `OMP_NUM_THREADS`, so each worker does not size its thread pool for the whole node. The spec is a Jinja template and only becomes valid YAML after parameter substitution, so it is excluded from the `check-yaml` pre-commit hook. Rendering was verified for both the `num_gpu=1` and `num_gpu>1` branches. Fixes # (issue) ## Type of change - New feature (non-breaking change which adds functionality) - Documentation update ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [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 <sub>No changelog fragment is included because this PR does not touch any package under `source/`; `tools/changelog/cli.py check` passes as-is. No tests are included because the change is a cluster job spec plus documentation.</sub>
## Summary - Use corrected USD-authored Franka drive gains while retaining solver velocity limits. - Enable absolute DiffIK on Isaac Sim PhysX, Newton MJWarp, and OVPhysX. - Reduce the NewtonIK rotational action scale for more reliable MJWarp training. The corrected `franka_panda.usda` and `payloads/Physics/physics.usda` must be promoted to production before merge. ## Validation - Franka preset tests: 25 passed - Absolute DiffIK: train/play on PhysX, Newton MJWarp, and OVPhysX - OVPhysX: stable 1,000-iteration training and exact play - Targeted pre-commit checks passed ## Type of change - Bug fix (non-breaking change)
# Description Makes legacy kitless rendering failures fail PR checks while preserving full test execution; merge after OVPhysX wheelhouse parity is restored. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have 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 Co-authored-by: Antoine RICHARD <antoiner@nvidia.com>
## Summary This PR completes the latest Newton `main` dependency update by aligning Isaac Lab with Newton global-world contracts. - synchronize wheel-builder and installation-test overrides with the root Newton, MuJoCo, MJWarp, and USD-schema pins - expose the zero-copy local-world slice of `model.gravity` through per-environment asset data - use the canonical `world_count + 1` solver reset mask while leaving the global entry unselected - import Newton USD schema resolvers from the public `newton.usd` API - give the Kamino internal-contact fixture the collidable geometry required by the current pipeline - align shared asset-interface and benchmark mocks with the local-plus-global world layout This is stacked on isaac-sim#6882. If isaac-sim#6882 merges first, its dependency commits become part of `develop` and this PR narrows to the compatibility fixes. ## Scope and compatibility This PR changes only latest-Newton compatibility. It contains no MPM task, coupling, visualizer, RSL-RL, camera, teleoperation, or golden-image change. No Isaac Lab API is renamed or removed. Existing per-environment gravity views remain live zero-copy bindings, ordinary resets select only local environments, and the new global Newton entry remains untouched by environment reset masks. ## Regression evidence - the dependency bump alone reproduces gravity/compensation failures because `model.gravity` is now shaped `(world_count + 1, 3)` - the old N-entry reset mask uses Newton legacy behavior rather than the current global-world contract - the former Kamino internal-contact fixture has no collision pipeline - wheel override files otherwise retain stale Newton-stack metadata - the shared Newton benchmark model otherwise lacks the world layout needed by real asset-data construction The focused fixes make each of these regressions pass. ## Validation - full isolated `isaaclab_newton` package suite passed - shared articulation, rigid-object, and collection interface matrices passed - Newton manager abstraction coverage passed for every solver configuration, including Kamino internal contacts - articulation, rigid-object, and collection gravity coverage passed on CPU and CUDA - canonical reset-mask regression passed without Newton legacy-mask warnings - wheel metadata, packaging, benchmark, and shared mock coverage passed - full pre-commit passed before commit and push The compatibility work remains one focused commit, `1f7511c55c23f4534e2dc9fe399d82e274edc327`, on top of Kelly Guo exact isaac-sim#6882 commits and current `develop`. The pushed branch head is `ca6dd9f1b914ca4e393daf1f2acfaaa717e365de`. ## Current CI triage The branch-specific Newton, core, task, PhysX, RL, installation, documentation, packaging, and lint suites pass. Three image/demo jobs currently fail for reasons outside this diff: - rendering correctness reproduces on current upstream `develop`, including the same PhysX and registered Cartpole camera comparisons - visualizer failures are image-golden and pause-frame drift; this PR has no visualizer or golden diff - the standalone demo failure is PhysX `bin_packing.py` clone planning; this PR does not touch that demo or clone planner Per scope, this PR does not modify goldens or unrelated shared code to mask those failures. --------- Co-authored-by: Kelly Guo <kellyg@nvidia.com>
…im#6894) # Description --xr aborted at startup with a dependency solver failure wherever the Kit extension registry was unreachable — reported by QA in the Isaac Sim 6.1 container: No versions of omni.kit.xr.bundle.generic that satisfies: isaaclab.python.xr.openxr-3.0.0 Available packages for omni.kit.xr.bundle.generic version *: (none found) [Error] [omni.kit.app.plugin] Exiting app because of dependency solver failure... apps/isaaclab.python.xr.openxr.kit depended on omni.kit.xr.bundle.generic, a meta-extension Isaac Sim does not ship (0 copies on disk in any install). It resolved only by downloading from the Kit SDK registry, so every XR run required registry reachability. The 2.3 line declared omni.kit.xr.system.openxr + omni.kit.xr.profile.ar. Kit 110 removed profile.ar; its successor is omni.kit.xr.ui.window.profile, which is shipped. The Isaac Sim 6.0 update (0049bb5) pointed at the bundle instead — a one-line change — so the migration to discrete XR extensions stalled halfway. This PR completes it, matching what isaacsim.exp.base.xr.vr.kit declares. This is latent since Isaac Sim 6.0, not a regression on develop — release/3.0.0-beta2 carries the identical line. A workstation that reaches the registry caches the bundle on first use and loads it locally forever after, which is why it only ever surfaced in containers. Two related fixes: - --xr without --visualizer kit now always resolves headless. Previously a task config declaring a Kit visualizer left XR non-headless, selecting the GUI experience and leaving /isaaclab/xr/auto_start false — so the session waited for a Start XR click that headless users cannot make. This wires up _xr_auto_start, which was computed but never read. - AttributeError: 'Namespace' object has no attribute 'headless' in record_demos.py and teleop_se3_agent.py, which still read the --headless flag removed in isaac-sim#6656. Fixed by exposing a public AppLauncher.headless. Fixes # (issue) ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [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
## Summary - add `init_at_random_ep_len` to the RSL-RL runner configuration - preserve randomized initial episode progress as the default - honor the same setting in normal and benchmark training ## Motivation Reset-dataset curricula need the first sampled states to complete a real episode before they contribute outcomes. Tasks can now opt out of randomized initial episode progress without an environment wrapper or rollout-boundary synchronization hook. The MPM Pour and Push tasks in isaac-sim#6875 are the initial consumers. ## Scope and compatibility This PR contains one commit and only changes RSL-RL configuration and its two Isaac Lab entrypoints. It adds no distributed collective, training-state synchronization, environment wrapper, or MPM-specific behavior. Existing tasks remain unchanged unless they explicitly set `init_at_random_ep_len = False`. ## Validation - focused RSL-RL configuration and entrypoint tests passed - benchmark configuration coverage passed - full pre-commit passed on head `0bb84af6d571d61491f898c3a5b08384f3262088`
## Summary - add a context-managed `newton_builder_world_hook` for temporary per-world Newton builder authoring - restore the previous hook safely for nested contexts and exceptions - expose and document the single scoped API ## Motivation Solver-specific scenes such as coupled MPM tasks need to augment each replicated Newton world during construction. A scoped hook provides that extension point without task-local mutation of retained clone sources or permanent global hook state. ## Scope and compatibility This PR contains one commit and is limited to the Newton cloner API, its documentation, one focused lifecycle test, and a changelog fragment. It does not add a clone-source helper and does not change existing replication unless a caller explicitly enters the context. ## Validation - focused nested-context, exception-cleanup, and lifecycle coverage passed - documentation built without warnings - full pre-commit passed on head `3550028fd1439779876c46c3ac762f885d385b96`
## Description Follow-up to isaac-sim#6562, which merged with a red `standalone demos (headless, Kit)` check. The bin-packing demo crashes when it runs with fewer environments than it declares layouts: ``` RuntimeError: Clone planning did not assign spawn_path for '/World/envs/env_.*/Groceries/Grocery_02'. [ERROR] Command failed with code 1: "... scripts/demos/bin_packing.py --num_envs 2 --physics isaacsim_physx --visualizer none" ``` Environments cycle through the declared layouts in order (`sequential` gives env *i* layout `i % NUM_LAYOUTS`), so a run with two environments only ever activates layouts 0 and 1. The remaining grocery slots are claimed by some layout but active in none of the used ones, so clone planning leaves their `spawn_path` unset and `InteractiveScene._add_entities_from_cfg` rejects them. The bin itself is unaffected because an asset named by no combination at all stays active in every row — only *claimed* assets can end up orphaned. This is user-facing, not just a CI artifact. Driving the layout construction through `make_valid_clone_combinations` and `sequential` over 200 random draws per environment count, the merged code leaves slots unspawned in: | `--num_envs` | runs with an unspawned slot | |---|---| | 1 | 194/200 | | 2 | 177/200 | | 4 | 96/200 | | 8 | 17/200 | | 16 (default) | 0/200 | | 64 | 0/200 | The default of 16 passed only because sixteen random subsets happen to cover all 24 slots; nothing guarantees it. Declaring the first layout as the full set of slots keeps every slot active in env 0 for any environment count, and leaves the remaining random draws unconstrained. Because `sequential` always hands layout 0 to env 0, this holds even at `--num_envs 1`. Env 0 now always shows a full bin; envs 1..N-1 keep their random subsets. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Screenshots None; the demo renders as before apart from env 0 always being full. ## 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 - [x] I have added tests that prove my fix is effective or that my feature works - [x] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there ### Notes on the checklist - **Tests:** no new test is added. The existing `test_standalone_scripts.py` launch matrix already covers this — `demos-bin_packing-isaacsim_physx-default-none` is the check that failed on isaac-sim#6562. I verified it fails without this change (reproducing the identical `RuntimeError` locally) and passes with it. The three runnable visualizer cases (`none`, `kit`, `newton`) pass locally; `rerun` and `viser` skip, as they do in CI. - **Changelog:** no fragment is required. This touches only `scripts/demos/`, so no package under `source/` is affected and the changelog gate passes.
…m#6813) ## Summary - The two startup log lines \`[INFO]: Created new renderer for simulation: <name>\` and \`[INFO]: Using renderer: <name>\` were silenced on kitless backends (Newton, OvPhysX) because the root logger defaults to \`WARNING\` and no Kit logging bridge is present - Add \`force_log_level(level)\` context manager to \`logging_utils\` that saves the root logger and handler levels, lowers them for the duration of the block, then restores them — no permanent change to any logger or handler - Wrap the two \`logger.info()\` call sites in \`RenderContext\` and \`Camera\` with \`force_log_level(logging.INFO)\` so the messages always reach the console regardless of backend ## Test plan - [ ] Run with a kitless backend (e.g. \`physics=newton_mjwarp\`) and confirm \`[INFO]: Created new renderer for simulation: OVRTXRenderer\` and \`[INFO]: Using renderer: OVRTXRenderer\` appear in stdout - [ ] Run with a Kit-based backend (default) and confirm the same lines still appear and no other INFO output is added - [ ] Run with \`--verbose\` / \`--info\` and confirm no duplicate or missing log lines
Bumped packages: - isaaclab: 15.2.0 → 15.3.0 - isaaclab_assets: 0.6.2 → 0.6.3 - isaaclab_newton: 2.5.0 → 2.6.0 - isaaclab_ov: 0.10.2 → 0.10.3 - isaaclab_physx: 4.0.1 → 4.1.0 - isaaclab_rl: 0.12.0 → 0.13.0 - isaaclab_tasks: 11.0.0 → 12.0.0 - isaaclab_visualizers: 1.3.1 → 1.4.0
# Description The SO-101 leader-arm example assumed `so101_leader_plugin` was already available. It is produced only by building [Isaac Teleop](https://github.com/NVIDIA/IsaacTeleop) from source, so users hit a missing-binary error with no indication of the required setup, then hit build failures (commonly a missing `clang-format-14`) with no troubleshooting guidance. In `docs/source/features/isaac_teleop.rst`: - State that the plugin is built from Isaac Teleop source, and give the build prerequisites, install location (`<IsaacTeleop>/install/plugins/so101_leader/so101_leader_plugin`), and a hardware-free synthetic run to verify it. - Add a **Start the plugin** section: Isaac Lab does not spawn it — launch the sim, then `source ~/.cloudxr/run/cloudxr.env` and run the plugin in a second terminal. - Link to the Isaac Teleop build-from-source and data-collection-in-sim pages for the full walkthrough and build/runtime troubleshooting tables. - Drop the incorrect `uv pip install lerobot` prerequisite — the plugin speaks the FEETECH wire protocol directly and calibrates with its own `calibrate` subcommand. - Add the missing `--visualizer kit` to the "local viewport only" commands (headless is the default). Fixes # (issue) ## Type of change - Documentation update ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] I have 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 --------- Signed-off-by: Rafael Wiltz <rwiltz@nvidia.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
# Description Standalone demo smoke tests had two independent flaky failure modes: 1. The supervisor kept classifying fatal-looking output after it intentionally sent `SIGTERM`. Kit can emit Material Library, USD caching, and Replicator asyncio tracebacks during that forced teardown, after the demo reached readiness and completed its healthy soak. 2. The first camera-enabled Kit/RTX process consistently needs roughly 526?558 seconds to initialize on CI, but the camera case had a fixed 600-second startup budget. That left only 42?74 seconds for runner, cache, and service variation. In the timeout example, approximately 10 seconds of failed OmniHub launch retries contributed to the case crossing the limit at 605.8 seconds. A CI experiment that disabled image saving and deferred the camera demo's Matplotlib import still took 526 seconds. That rules out optional plotting and confirms the long phase belongs to cold camera-enabled Kit/RTX initialization; the experimental demo change has been removed from the final diff. This change fixes both test boundaries: - Fatal-pattern detection stops immediately before intentional teardown, while shutdown output remains captured for diagnostics. Fatal output during startup or the soak still fails the test. - The camera case receives a 900-second startup timeout, providing headroom for its known cold initialization while preserving the 300-second default hang detector for other demos. Example failures: - Intentional-teardown traceback: https://github.com/isaac-sim/IsaacLab/actions/runs/31243355943/job/93068486798?pr=6831 - Same teardown race on another unrelated PR: https://github.com/isaac-sim/IsaacLab/actions/runs/31230902685/job/93048260426 - Same teardown race on PR 6979: https://github.com/isaac-sim/IsaacLab/actions/runs/31247096260/job/93077436474?pr=6979 - Camera startup budget exhausted: https://github.com/isaac-sim/IsaacLab/actions/runs/31243047225/job/93069642023?pr=6979 No new dependencies are required. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Screenshots Not applicable; this changes headless smoke-test supervision and a case-specific timeout. ## Validation - Teardown regression confirmed failing before the fix and passing after it: `uv run --frozen python -m pytest source/isaaclab/test/app/test_standalone_scripts.py::test_subprocess_supervisor_ignores_fatal_output_after_intentional_teardown -q` - Camera timeout contract confirmed failing at the previous 600-second value and passing at 900 seconds: `uv run --frozen python -m pytest source/isaaclab/test/app/test_standalone_scripts.py::test_commands_respect_script_launcher_capabilities -q` - Buffered pre-teardown output regression confirmed failing before the drain fix and passing after it: `uv run --frozen python -m pytest source/isaaclab/test/app/test_standalone_scripts.py::test_subprocess_supervisor_classifies_buffered_fatal_output_before_intentional_teardown -q` - Platform-independent standalone harness subset: 35 passed, 298 simulator launches skipped, and 7 POSIX process-control tests deselected on Windows. - Linux standalone Kit CI passed with the teardown boundary; the camera case took 526 seconds, providing the direct timing evidence used for the final timeout fix: https://github.com/isaac-sim/IsaacLab/actions/runs/31247940912/job/93079622769 - Changelog fragment gate against current upstream `develop`: passed. - `uv run --frozen isaaclab -f`: passed after staging and again after commit. ## 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 `uv run isaaclab -f` - [x] Documentation changes are not applicable to this test stabilization - [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
Bumped packages: - isaaclab: 15.5.0 → 15.6.0 - isaaclab_contrib: 1.2.0 → 1.3.0 - isaaclab_newton: 3.1.0 → 3.2.0 - isaaclab_ov: 0.10.4 → 0.10.5 - isaaclab_ovphysx: 8.2.4 → 8.3.0 - isaaclab_physx: 4.2.0 → 4.2.1 - isaaclab_tasks: 14.0.0 → 15.0.0 - isaaclab_visualizers: 1.5.0 → 1.5.1
# Description There is a small bug with garbage collection corrupting the environment such that the test scripts crash. ## Checklist - [ ] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have 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 -->
…im#6959) # Description Disable backface culling by default for newton warp renderer. User can opt out if needed by setting `NewtonWarpRendererCfg.enable_backface_culling`. Fixes OMPE-103486 ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Screenshots Please attach before and after screenshots of the change if applicable. | State | Screenshot | | ------ | ----- | | Before | <img width="1030" height="1030" alt="franka_cloth-ovphysx-newton_renderer-rgb-before" src="https://github.com/user-attachments/assets/77e1ac3a-88a4-4580-8303-53c696a5a2ef" /> | | After | <img width="1030" height="1030" alt="franka_cloth-ovphysx-newton_renderer-rgb-after" src="https://github.com/user-attachments/assets/44e15c0d-eff2-462d-8566-cd16d273126c" /> | ## Dexsuite runtime benchmark Performance and memory impact of disabling Newton Warp backface culling by default (`NewtonWarpRendererCfg.enable_backface_culling: True → False`). ### Comparison — before vs. after Δ = after (`afc3ebd9`) − before (`50a244ec` / develop). Positive FPS Δ% means after is faster; negative GPU-mem / RAM Δ% means after uses less memory. | Variant | Envs | FPS Δ% | Env create Δ% | First step Δ% | GPU mem peak Δ% | RAM peak Δ% | | ------------- | ---: | -----: | ------------: | ------------: | --------------: | ----------: | | homogeneous | 4096 | +2.98% | -1.14% | -2.87% | +4.15% | -0.24% | **Takeaways:** - FPS change is within typical run-to-run noise for this single-config sample. - GPU memory peak and host RAM peak are essentially unchanged. - Env-creation / first-step times are also within noise for this setup. ### Before — `50a244ec70a` (develop) Baseline with `enable_backface_culling=True` (previous default). | Item | Value | | ----------- | ----- | | Commit | `50a244ec70a Handle single-world coupled MPM resets (isaac-sim#6955)` | | Setting | `NewtonWarpRendererCfg.enable_backface_culling = True` | | Results dir | `huidongc/benchmarks/20260807_newton_bfc_before_develop/` | | Variant | Envs | FPS mean | FPS peak | Iter s mean | GPU mem mean (GB) | GPU mem peak (GB) | RAM mean (GB) | RAM peak (GB) | GPU util % | Env create s | First step s | | ------------- | ---: | -------: | -------: | ----------: | ----------------: | ----------------: | ------------: | ------------: | ---------: | -----------: | -----------: | | homogeneous | 4096 | 42192.8 | 48652.8 | 0.0971 | 4.82 | 4.82 | 4.14 | 4.14 | 87.9 | 35.9 | 0.8 | ### After — `afc3ebd9` (`enable_backface_culling=False`) Same benchmark after disabling backface culling by default. | Item | Value | | ----------- | ----- | | Commit | `afc3ebd9 Disable Newton Warp backface culling by default` | | Setting | `NewtonWarpRendererCfg.enable_backface_culling = False` | | Results dir | `huidongc/benchmarks/20260807_newton_bfc_after_7a64e7b/` | | Variant | Envs | FPS mean | FPS peak | Iter s mean | GPU mem mean (GB) | GPU mem peak (GB) | RAM mean (GB) | RAM peak (GB) | GPU util % | Env create s | First step s | | ------------- | ---: | -------: | -------: | ----------: | ----------------: | ----------------: | ------------: | ------------: | ---------: | -----------: | -----------: | | homogeneous | 4096 | 43450.7 | 49929.3 | 0.0943 | 4.93 | 5.02 | 4.13 | 4.13 | 87.2 | 35.5 | 0.8 | ### Setup | Item | Value | | ------------------- | ------------------------------- | | GPU | NVIDIA RTX A6000 | | Task | `Isaac-Lift-KukaAllegro-Camera` | | Physics | `newton_mjwarp` | | Renderer | `newton_renderer` | | Homogeneous presets | `rgb64,single_camera,cube` | | Seed | `42` | | Iterations | `1000` (after warmup) | | Command | `huidongc/benchmark_dexsuite.sh` | ## 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
Bumped packages: - isaaclab_newton: 3.2.0 → 3.2.1
Require every authoritative baseline to cover throughput and both memory metrics so missing data cannot silently pass. Reject non-finite inputs and drop the unsupported Newton and Isaac RTX camera combination.
Add total startup timing to the required performance metrics. Qualify FPS regressions with coherent iteration-time statistics and reject malformed or inconsistent benchmark data. Use provider-qualified runtime identities so kit-less Newton runs compare correctly.
Write benchmark JSON to container-local storage while Isaac Sim is running, then copy the completed result to the host artifact mount. This avoids the reproducible RTX finalization failure on the bind-mounted path without changing benchmark behavior.
## Summary - compute PhysX IMU and PVA finite-difference acceleration from the elapsed time between sensor samples - keep timestamp inputs stable inside the recorded Warp launches from isaac-sim#6390 - remove mutable scalar inverse-dt launch parameters - add lazy-read and nonzero-update-period regressions for IMU linear acceleration and PVA linear/angular acceleration This PR is stacked on isaac-sim#6390. Until isaac-sim#6390 merges, its commits are included in this comparison against develop. ## Root cause IMU and PVA cached velocity only when their buffers were recomputed, but divided the next velocity delta by the most recent physics-step dt. With four lazy physics updates or an update period of four physics steps, both sensors reported 4x acceleration. The kernels now derive a per-environment interval from timestamp minus timestamp_last_update. ## Validation - Unmodified isaac-sim#6390 base: 4 regressions failed with the expected 4x acceleration error - Fixed targeted regressions: 4 passed - Complete PhysX IMU suite: 11 passed - Complete PhysX PVA suite: 11 passed - Final pre-commit hooks: passed - Existing recorded-launch assertions remain enabled and pass ## Performance Benchmarking is deferred until the test machine is connected to AC power. The change removes scalar launch-parameter updates and retains the recorded-launch path; this PR makes no performance claims. --------- Co-authored-by: Kelly Guo <kellyg@nvidia.com>
Keep benchmark results in container-local storage and use host-side docker cp after the run. This removes the non-root bind-mount write that consistently fails for the RTX workload while preserving the normal container user.
# Description Descendants of an instanceable prim are instance proxies, which USD does not allow editing. A recursive override such as `physics_material` therefore cannot reach the colliders inside an instanceable asset: spawning the asset with a physics material appears to succeed, but the colliders stay bound to whatever the source layer specified. This is easy to hit with converted assets, where the collision geometry is commonly authored under an instanceable scope. This adds an opt-in `make_uninstanceable` flag to `UsdFileCfg`. When enabled, instancing is disabled below the spawned prim immediately after variant selection and before any override runs, so the recursive overrides apply to the descendants as intended. It defaults to `False` because making descendants editable increases stage memory, so users only pay for it when an override needs it. The `make_uninstanceable` helper it calls already exists in `isaaclab.sim.utils`. One incidental change: the new branch takes `_spawn_from_usd_file` one point over the repo `C901` complexity limit (31 > 30), so the adjacent material-path `if/else` is collapsed into an equivalent ternary to stay within budget. No behavior change there. ## Type of change - Bug fix (non-breaking change which fixes an issue) - New feature (non-breaking change which adds functionality) ## Screenshots None. ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] I have updated the changelog and the corresponding version in the extension `config/extension.toml` file - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there
# Description Update the multi-arch latest-develop digest from 307e5486 (Aug 7) to 0d707bba (Aug 9) for reproducible CI. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] I have added a changelog fragment under `source/<pkg>/changelog.d/` for every touched package (do **not** edit `CHANGELOG.rst` or bump `extension.toml` — CI handles that) - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there
# Description Multi-gpu benchmarks: `uv run isaaclab benchmark startup-multigpu --task <>` Similarly:` runtime-multigpu`, `training-multigpu` ## Checklist - [ ] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have 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 -->
# Description Remove unused functions and empty video recording submodule ## Checklist - [ ] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have 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
…6991) # Description Remove the massive amount of code in isaaclab around mock fixtures for mock tests. Many of the mocks were not used, others were overdesigned and overengineering and creating large technical debt. The few useful/required fixtures are still there, just maintained as small, lean, minimal fixtures. ## Checklist - [ ] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have added a changelog fragment under `source/<pkg>/changelog.d/` for every touched package (do **not** edit `CHANGELOG.rst` or bump `extension.toml` — CI handles that) - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there
) # Description update export docs to use Isaac-Humanoid for sb3 compatibility. update direct notes to specify that the export_method is not available. ## 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
Keep runtime benchmarks aligned with the established arithmetic FPS semantics by default while allowing callers to opt into effective aggregate throughput. Compare performance baselines using the matching per-step FPS statistics.
Keep the machine-readable JSON and workflow summary while removing unused JUnit and Markdown artifacts. Reduce duplicate significance fields and repetitive validation tests without changing gate semantics.
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
Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context.
List any dependencies that are required for this change.
Fixes # (issue)
Type of change
Screenshots
Please attach before and after screenshots of the change if applicable.
Checklist
pre-commitchecks with./isaaclab.sh --formatsource/<pkg>/changelog.d/for every touched package (do not editCHANGELOG.rstor bumpextension.toml— CI handles that)CONTRIBUTORS.mdor my name already exists there