diff --git a/docs/source/concepts/coupled_solvers.rst b/docs/source/concepts/coupled_solvers.rst index f16fcddd3710..8f3863ab2c4d 100644 --- a/docs/source/concepts/coupled_solvers.rst +++ b/docs/source/concepts/coupled_solvers.rst @@ -224,6 +224,41 @@ can grow independently while retaining matching: ) +Rigid--MPM Comparison Recordings +-------------------------------- + +For proxy coupling, ``mass_scale`` changes a source body's effective mass and +inertia in the destination view; it does not change the authored rigid-body +mass. Start at ``1`` and increase it only when the rigid solver strongly +constrains the body during MPM contact. Check both supported and freely moving +cases, since a large scale can suppress legitimate motion. + +The G1 recordings show one policy walking across sand, snow, and clay. The +one-way recording uses lower-leg proxies, while the two-way recording uses +full-body proxies. They are presentation examples, **not** a controlled +single-variable comparison; keep the policy, seed, commands, and proxy geometry +identical when measuring a coupling effect. + +.. grid:: 1 1 2 2 + :gutter: 2 + + .. grid-item-card:: One-way, lower-leg proxies + + .. raw:: html + + + + .. grid-item-card:: Two-way, full-body proxies + + .. raw:: html + + + + Start from a maintained task ---------------------------- diff --git a/docs/source/concepts/solver-tuning/index.rst b/docs/source/concepts/solver-tuning/index.rst index dcd195a72380..a128f3399307 100644 --- a/docs/source/concepts/solver-tuning/index.rst +++ b/docs/source/concepts/solver-tuning/index.rst @@ -20,3 +20,4 @@ and defaults remain in the generated API reference. tune_mjwarp tune_kamino tune_vbd + tune_mpm diff --git a/docs/source/concepts/solver-tuning/tune_mpm.rst b/docs/source/concepts/solver-tuning/tune_mpm.rst new file mode 100644 index 000000000000..afc21b5ead26 --- /dev/null +++ b/docs/source/concepts/solver-tuning/tune_mpm.rst @@ -0,0 +1,278 @@ +.. Copyright (c) 2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +.. All rights reserved. +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. _newton-tuning-mpm: + +MPM Solver +========== + +Start with :ref:`newton-using-mpm` for scene construction. These experiments +help separate numerical accuracy from constitutive response. They are +qualitative examples, not calibrated material models or performance benchmarks. + +Tune Resolution, Time, Then Convergence +--------------------------------------- + +Tune one group at a time in this order: + +1. **Voxel and particle resolution.** ``MPMSolverCfg.voxel_size`` controls the + background grid. Smaller voxels resolve thinner geometry but increase active + cells and memory. ``MPMGridCfg.particles_per_cell`` controls particle density; + doubling it along each axis creates about eight times as many particles in + 3D. Start coarse, then refine until the measured behavior stops changing. +2. **Timestep and substeps.** Each Newton substep uses + ``SimulationCfg.dt / NewtonCfg.num_substeps``. Reduce ``dt`` or increase + ``num_substeps`` first when contacts tunnel, jitter, or become unstable. + Substeps do not change the policy period, which also includes environment + decimation. +3. **Iterations and tolerance.** ``MPMSolverCfg.max_iterations`` caps the + rheology solve; ``tolerance`` permits an earlier exit after convergence. + Increase the cap only when the solver reaches it, and lower the tolerance + only when tighter convergence improves a physical metric. These settings do + not repair an unstable timestep, invalid reset, or incorrect collider. + + +Material Comparisons +-------------------- + +The recordings below hold the scene and solver configuration fixed within +each comparison while varying one material parameter. The annotated values +are examples for observing different responses, not calibrated material +recommendations. + +.. list-table:: Values shown in the material recordings + :header-rows: 1 + :widths: 21 35 44 + + * - Preset + - Varied values + - Behavior to inspect + * - ``young_modulus`` + - 100 kPa, 300 kPa, 1 MPa + - Compression, recovery, and impact rebound + * - ``poisson_ratio`` + - 0.05, 0.30, 0.499 + - Volume loss versus near-incompressibility + * - ``friction`` + - 0, 0.68, 2.0 + - Runout and the final angle of repose + * - ``tensile_yield_ratio`` + - 0, 0.01, 0.05 + - Fragmentation versus tensile cohesion + * - ``yield_pressure`` + - 100 kPa, 1 MPa, 4 MPa + - Onset and amount of irreversible compression + * - ``hardening`` + - 0, 0.05, 5.0 + - Strength gained after plastic compaction + * - ``dilatancy`` + - 0, 0.1, 1.0 + - Compaction versus expansion under shear + * - ``yield_stress`` + - 0, 10 kPa, 20 kPa + - Cohesive flow and retained shape + * - ``viscosity`` + - 0, 10 Pa·s, 500 Pa·s + - Rate-dependent plastic flow + * - ``particle_jitter`` + - 0%, 30% of particle spacing + - Grid-alignment artifacts and packing symmetry + + +Design a Useful Parameter Study +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Use these practices when designing a comparison: + +* Change one physical quantity at a time. Use the same generated positions, + particle mass, collider, timestep, and camera for every variant. +* Choose values that bracket visibly different regimes. Geometric spacing is + usually more informative than small linear increments for stiffness, yield, + viscosity, and coupling mass scales. +* Preserve the feature the comparison is meant to explain. If a soft elastic + specimen loses its silhouette before rebound can be read, reduce the impact + energy or raise the lower end of the stiffness range. Do not shorten a clip + merely to hide later breakup. +* Use deterministic jitter for constitutive comparisons so lattice alignment + does not dominate the motion. Keep the no-jitter case as a separate packing + diagnostic. +* Run until impact, peak deformation, recovery or flow, and the final settled + state are all visible. A short clip can make different materials appear + identical. +* Tune numerical resolution and timestep before interpreting material values. + Record the voxel size, particles per voxel axis, particle count, physics + timestep, substeps, iterations, tolerance, random seed, and code revision. +* Check a quantitative signal alongside the video when possible: center of + mass, runout distance, rebound height, retained volume, or settled height. + +``particles_per_cell`` is the number of particles along one voxel axis. A value +of ``2`` therefore produces approximately eight particles per filled voxel in +3D, not two. Refining both voxel size and particle density can increase memory +and runtime rapidly. + + +Interpret the Comparisons +------------------------- + +* **Elastic response:** Poisson's ratio changes both bulk and shear moduli at + fixed Young's modulus. Values close to 0.5 approach incompressibility; this + is not an independent sweep of volume stiffness. The recording uses 50 kPa + Young's modulus and a gentler drop so the impact produces visible strain + without obscuring the comparison through loss of the specimen silhouette. +* **Plastic response:** yielding, hardening, friction, and dilatancy interact. + Keep the other fields fixed within a preset, not necessarily between presets. + A high-friction label is not a water-content model; these sand, snow, and + clay labels describe illustrative responses rather than measured materials. +* **Nearly rigid MPM:** high stiffness and yield limits suppress intended strain + and plastic flow but do not impose rigid-body constraints. Residual shape + drift, contact differences, and particle sampling error can remain. Compare + silhouettes and mass as well as motion; increase resolution only after + checking timestep and convergence. Higher particle density is more + expensive than a coarse comparison. + + +Example Recordings +------------------ + +Recordings are hosted outside Git on the Isaac Lab documentation media host, +following the other deformable tuning examples. + +Material Response +~~~~~~~~~~~~~~~~~ + +The selected material clips were recorded in Kit at 1920 × 1080. Their +annotations belong to those recordings; do not treat video duration as +simulation time. + +.. grid:: 1 1 2 2 + :gutter: 2 + + .. grid-item-card:: Elastic stiffness + + .. raw:: html + + + + Plate compression at 100 kPa, 300 kPa, and 1 MPa. + + + .. grid-item-card:: Compressibility + + .. raw:: html + + + + Plate compression at Poisson ratios 0.05, 0.30, and 0.499 with E = 50 kPa. + + + .. grid-item-card:: Granular friction + + .. raw:: html + + + + Runout for internal friction 0, 0.68, and 2.0; cohesion is unchanged. + + + .. grid-item-card:: Tensile cohesion + + .. raw:: html + + + + Tensile yield ratios 0, 0.01, and 0.05. + + + .. grid-item-card:: Pressure yielding + + .. raw:: html + + + + Stronger impact reveals compression at 100 kPa, 1 MPa, and 4 MPa. + + + .. grid-item-card:: Plastic hardening + + .. raw:: html + + + + Fixed strength (0) versus slow (0.05) and rapid (5) strength buildup. + + + .. grid-item-card:: Shear dilatancy + + .. raw:: html + + + + Spreading and packing for dilatancy 0, 0.1, and 1. + + + .. grid-item-card:: Cohesive yield stress + + .. raw:: html + + + + Retained shape at 0, 10 kPa, and 20 kPa. + + + .. grid-item-card:: Plastic viscosity + + .. raw:: html + + + + Rate of plastic flow at 0, 10 Pa·s, and 500 Pa·s. + + + .. grid-item-card:: Initial packing + + .. raw:: html + + + + Aligned sampling versus deterministic 30% particle-spacing jitter. + + +Nearly Rigid Limit +~~~~~~~~~~~~~~~~~~ + +.. grid:: 1 + :gutter: 2 + + .. grid-item-card:: Nearly rigid MPM versus MJWarp + + .. raw:: html + + + + Inspect matched colored primitives rolling down separated inclines. This + older presentation recording is not an accuracy claim for the current + implementation; high stiffness does not enforce rigid shape constraints. diff --git a/docs/source/concepts/using_mpm.rst b/docs/source/concepts/using_mpm.rst index 3c38a8d37b67..b6c9e59dc22e 100644 --- a/docs/source/concepts/using_mpm.rst +++ b/docs/source/concepts/using_mpm.rst @@ -5,9 +5,69 @@ Using Implicit MPM Newton's implicit Material Point Method (MPM) solver models particle materials such as granular media. MPM support and rigid-MPM coupling are experimental. -Start with the compact ``mpm-granular`` example; the ``snowball-smash`` and ``teapot-fill`` demos provide polished -coupling and cavity-sampling showcases. +Start with the compact ``mpm-granular`` example; the ``snowball-smash`` and +``teapot-fill`` demos provide polished coupling and cavity-sampling showcases. +The launcher uses ``cuda:0`` by default. Pass ``--device cuda:N`` to select a +different GPU. + + +Explore MPM Scenes +------------------ + +These examples and demos introduce MPM construction and interaction before any +parameter study. They default to Newton GL for interactive viewing: + +.. grid:: 1 1 2 2 + :gutter: 2 + + .. grid-item-card:: Granular drop + + .. raw:: html + + + + .. code-block:: bash + + uv run isaaclab example mpm-granular + + .. grid-item-card:: Two-way sphere pit + + .. raw:: html + + + + .. code-block:: bash + + uv run isaaclab example mpm-two-way-coupling + + .. grid-item-card:: Snowball smash + + .. raw:: html + + + + .. code-block:: bash + + uv run isaaclab demo snowball-smash + + .. grid-item-card:: Teapot fill + + .. raw:: html + + + + .. code-block:: bash + + uv run isaaclab demo teapot-fill --fluid_render_mode particles .. _franka-pour-reset-artifact: @@ -22,7 +82,7 @@ training needs no artifact setup: .. code-block:: bash uv run isaaclab train --rl_library rsl_rl --task IsaacContrib-Franka-Pour \ - --num_envs 2048 --device cuda:0 + --num_envs 2048 The checked-in generator remains the executable reference for reproducing or customizing the distribution. It takes about two minutes on an L40S-class GPU @@ -30,9 +90,9 @@ and writes a local artifact that can be selected explicitly: .. code-block:: bash - uv run python scripts/tools/generate_franka_pour_reset_dataset.py --device cuda:0 + uv run python scripts/tools/generate_franka_pour_reset_dataset.py uv run isaaclab train --rl_library rsl_rl --task IsaacContrib-Franka-Pour \ - --num_envs 2048 --device cuda:0 \ + --num_envs 2048 \ env.reset_dataset_path=datasets/franka_pour/reset_dataset.pt The task validates the payload's stored content digest automatically. Setting @@ -51,8 +111,8 @@ callback or particle override is required: .. code-block:: bash - uv run isaaclab play --rl_library rsl_rl --task IsaacContrib-Franka-Pour \ - --checkpoint /path/to/model.pt --num_envs 1 --device cuda:0 --visualizer kit + uv run --extra isaacsim isaaclab play --rl_library rsl_rl --task IsaacContrib-Franka-Pour \ + --checkpoint /path/to/model.pt --num_envs 1 --visualizer kit Minimal Setup @@ -116,35 +176,48 @@ USD clones share the same local particle distribution. Use reset events or domai randomization when each environment needs an independent distribution. +Controlled material experiments, comparison demos, and practical solver advice +are collected in :ref:`newton-tuning-mpm`. + + Render a Particle Surface ------------------------- MPM simulation state remains a set of particles. Surface reconstruction is an optional visualization pass: it does not change particle motion, collisions, or -material behavior. Run the teapot example to compare the available modes: +material behavior. Run the teapot demo to compare the available modes: .. code-block:: bash - # Reconstructed surface (default) - uv run isaaclab demo teapot-fill --device cuda:0 \ + # Reconstructed surface + uv run isaaclab demo teapot-fill \ --visualizer newton_gl --fluid_render_mode surface # Surface and source particles together - uv run isaaclab demo teapot-fill --device cuda:0 \ + uv run isaaclab demo teapot-fill \ --visualizer newton_gl --fluid_render_mode both # Path-traced translucent surface - uv run --extra ovrtx isaaclab demo teapot-fill --device cuda:0 \ + uv run --extra ovrtx isaaclab demo teapot-fill \ --visualizer newton_rtx --fluid_render_mode surface +The teapot demo defaults to the reconstructed surface. Select ``particles`` or +``both`` to inspect the source MPM state in Newton GL or Newton RTX. + Surface rendering is available in the Newton GL and Newton RTX visualizers. The Kit visualizer continues to render the MPM particles directly. -To reconstruct a surface in another Newton MPM script, create one reusable -``newton.geometry.ParticleSurface`` after ``sim.reset()``. On each render update, -extract from the current Newton particle positions, radii, flags, and world indices, -then pass the returned vertex, triangle-index, and normal arrays to -``NewtonGLVisualizer.log_mesh()`` or ``NewtonRTXVisualizer.log_mesh()`` with -``dynamic=True`` before calling ``sim.render()``. The visualizer stages the latest -mesh by name and submits it inside Newton's required viewer-frame lifecycle. +.. raw:: html + + + +This recording demonstrates rendering appearance, not a different +constitutive model. + +The teapot demo configures ``newton.geometry.ParticleSurface`` after +``sim.reset()`` and updates the mesh before ``sim.render()``. Its renderer +captures extraction on CUDA when enabled and stages the dynamic mesh inside +the viewer's frame lifecycle. Tune reconstruction independently from the simulation: @@ -157,10 +230,10 @@ Tune reconstruction independently from the simulation: * Anisotropic kernels preserve sheets and stretched fluid features better, but cost more than isotropic kernels. -The demo handles CUDA graph capture, empty surfaces, inactive particles, and -dynamic topology in one reusable helper: +The teapot demo handles CUDA graph capture, empty surfaces, inactive particles, +and dynamic topology: -.. dropdown:: ``FluidSurfaceRenderer`` implementation +.. dropdown:: Teapot surface renderer implementation :icon: code .. literalinclude:: ../../../examples/demos/teapot_fill.py @@ -168,51 +241,9 @@ dynamic topology in one reusable helper: :pyobject: FluidSurfaceRenderer -Tune Resolution, Time, Then Convergence ---------------------------------------- - -Tune one group at a time in this order: - -1. **Voxel and particle resolution.** ``MPMSolverCfg.voxel_size`` controls the - background grid. Smaller voxels resolve thinner geometry but increase active - cells and memory. ``MPMGridCfg.particles_per_cell`` controls particle density; - doubling it along each axis creates about eight times as many particles in - 3D. Start coarse, then refine until the measured behavior stops changing. -2. **Timestep and substeps.** Each Newton substep uses - ``SimulationCfg.dt / NewtonCfg.num_substeps``. Reduce ``dt`` or increase - ``num_substeps`` first when contacts tunnel, jitter, or become unstable. - Substeps do not change the policy period, which also includes environment - decimation. -3. **Iterations and tolerance.** ``MPMSolverCfg.max_iterations`` caps the - rheology solve; ``tolerance`` permits an earlier exit after convergence. - Increase the cap only when the solver reaches it, and lower the tolerance - only when tighter convergence improves a physical metric. These settings do - not repair an unstable timestep, invalid reset, or incorrect collider. - - -Tune Rigid-MPM Coupling ------------------------ - -For :class:`~isaaclab_contrib.coupling.CouplerProxyCfg`, first stabilize each -solver alone. Then tune the additional controls: - -* ``CouplerEntryCfg.substeps`` divides one coupled step for that entry. Increase - the MPM entry's value when only the particle solve needs a smaller timestep. -* ``CouplerProxyCfg.iterations`` repeats the proxy exchange and relaxation; it - does not replace smaller physical timesteps. -* ``CouplerProxyMappingCfg.mass_scale`` scales the source body's effective mass - and inertia only in the destination proxy view. It does not change the body's - authored mass in the rigid solver. - -Start ``mass_scale`` at ``1`` for a freely moving collider. Increase it when the -rigid solver strongly constrains the collider during MPM contact. For example, a -cup resting on a table has much greater effective resistance in the supported -direction than its free-body mass suggests. Sweep finite values geometrically, -such as ``1``, ``10``, and ``100``, and keep the smallest value that prevents -unrealistic proxy motion. Newton requires a finite positive value: do not use -infinity. An excessively large scalar also suppresses legitimate motion in -unsupported directions and can make the interaction effectively one-way. - -Validate both the supported and free-moving cases after changing coupling. If -the uncoupled systems are unstable, fix their timestep, contacts, and reset -states before adjusting ``mass_scale`` or coupling iterations. +Next Steps +---------- + +See :ref:`newton-tuning-mpm` for resolution and convergence tuning, controlled +material comparisons, and the nearly rigid MPM limit. See +:ref:`newton-coupled-solvers` for rigid--MPM coupling. diff --git a/docs/source/setup/demos.rst b/docs/source/setup/demos.rst index ae4c7a9c1558..a8992dc13d8e 100644 --- a/docs/source/setup/demos.rst +++ b/docs/source/setup/demos.rst @@ -27,6 +27,8 @@ For example, run ``uvx isaaclab demo zoo --viz newton_gl`` to explore the catalo Programs whose required modules are unavailable, hardware-dependent teleoperation, and Kit-only demos are not shown. +For particle-material comparisons and solver guidance, see :ref:`newton-tuning-mpm`. + Command Builder --------------- diff --git a/pyproject.toml b/pyproject.toml index 10ef9a8d5506..7c9bf36ec16d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -88,7 +88,7 @@ dependencies = [ "gitpython>=3.1.59", # used by RL training and experiment logging # ----- newton (default physics engine) ----- # Pin the Newton release used by both workspace and wheel installs. - "newton[sim]==1.6.0", + "newton[sim]>=1.2.0", # Import and mesh-processing packages used by Newton, including the ones that honoring # USD-authored ``physics:approximation`` requires. Keep these explicit instead of selecting # newton[importers], whose standalone USD dependency would overlap with usd-exchange. @@ -229,6 +229,7 @@ torchaudio = "2.11.0" ovphysx = "0.6.3" ovrtx = "0.5.0.377615" ovstage = "0.2.0.377349" +newton = "release-1.6" warp = "1.17.0" [tool.ruff] @@ -411,7 +412,7 @@ override-dependencies = [ "numpy>=2", "mujoco~=3.12.0", "mujoco-warp~=3.12.0", - "newton[sim]==1.6.0", + "newton[sim] @ git+https://github.com/newton-physics/newton.git@release-1.6", # Force the Newton-matched schemas over isaacsim's ==0.2.0 pin. "newton-usd-schemas>=0.5.0", # isaacsim-asset-isolated and isaacsim-robot-schema 6.1 pin usd-exchange ==2.3.0. diff --git a/source/isaaclab/changelog.d/henry-go2-base-height-inf-guard.rst b/source/isaaclab/changelog.d/henry-go2-base-height-inf-guard.rst deleted file mode 100644 index a64094f7ef1f..000000000000 --- a/source/isaaclab/changelog.d/henry-go2-base-height-inf-guard.rst +++ /dev/null @@ -1,7 +0,0 @@ -Fixed -^^^^^ - -* Fixed :func:`~isaaclab.envs.mdp.rewards.base_height_l2` returning an infinite reward for any - environment whose own height scan contained a missed ray, since ``ray_hits_w`` reports ``inf`` - for a ray that finds nothing within its ``max_distance`` rather than a clamped value. Now only - finite ray hits are averaged into the terrain-adjusted target height. diff --git a/source/isaaclab/changelog.d/newton-collection-path-documentation.skip b/source/isaaclab/changelog.d/newton-collection-path-documentation.skip deleted file mode 100644 index ccc05452ffd4..000000000000 --- a/source/isaaclab/changelog.d/newton-collection-path-documentation.skip +++ /dev/null @@ -1 +0,0 @@ -Removed the obsolete Newton collection path restriction from the configuration documentation. diff --git a/source/isaaclab/changelog.d/ovrtx-async-capture-metadata.minor.rst b/source/isaaclab/changelog.d/ovrtx-async-capture-metadata.minor.rst deleted file mode 100644 index 63b9ab93c79a..000000000000 --- a/source/isaaclab/changelog.d/ovrtx-async-capture-metadata.minor.rst +++ /dev/null @@ -1,5 +0,0 @@ -Added -^^^^^ - -* Attached capture poses, calibration, and frame indices to delayed OVRTX images through - ``CameraData.info[output_name]["capture"]`` while preserving the live camera fields. diff --git a/source/isaaclab/changelog.d/pv-ovrtx-async-frame-announcements.minor.rst b/source/isaaclab/changelog.d/pv-ovrtx-async-frame-announcements.minor.rst deleted file mode 100644 index 1c7e84c49008..000000000000 --- a/source/isaaclab/changelog.d/pv-ovrtx-async-frame-announcements.minor.rst +++ /dev/null @@ -1,7 +0,0 @@ -Added -^^^^^ - -* Added :meth:`~isaaclab.renderers.BaseRenderer.prepare_capture` and - :meth:`~isaaclab.renderers.BaseRenderer.reset` hooks for delayed camera observations. - Asynchronous renderers can publish matching image metadata through ``CameraData.info`` and - discard pending observations on reset without changing live camera fields. diff --git a/source/isaaclab/changelog.d/use-newton-release-1-6.rst b/source/isaaclab/changelog.d/use-newton-release-1-6.rst new file mode 100644 index 000000000000..22fea0715e38 --- /dev/null +++ b/source/isaaclab/changelog.d/use-newton-release-1-6.rst @@ -0,0 +1,5 @@ +Changed +^^^^^^^ + +* Changed the Newton dependency from the ``1.6.0`` PyPI release to the ``release-1.6`` Git branch. + Existing uv installations update automatically. diff --git a/source/isaaclab/docs/CHANGELOG.rst b/source/isaaclab/docs/CHANGELOG.rst index 0b4aae421047..567236d4fce3 100644 --- a/source/isaaclab/docs/CHANGELOG.rst +++ b/source/isaaclab/docs/CHANGELOG.rst @@ -1,6 +1,28 @@ Changelog --------- +32.1.0 (2026-09-30) +~~~~~~~~~~~~~~~~~~~ + +Added +^^^^^ + +* Attached capture poses, calibration, and frame indices to delayed OVRTX images through + ``CameraData.info[output_name]["capture"]`` while preserving the live camera fields. +* Added :meth:`~isaaclab.renderers.BaseRenderer.prepare_capture` and + :meth:`~isaaclab.renderers.BaseRenderer.reset` hooks for delayed camera observations. + Asynchronous renderers can publish matching image metadata through ``CameraData.info`` and + discard pending observations on reset without changing live camera fields. + +Fixed +^^^^^ + +* Fixed :func:`~isaaclab.envs.mdp.rewards.base_height_l2` returning an infinite reward for any + environment whose own height scan contained a missed ray, since ``ray_hits_w`` reports ``inf`` + for a ray that finds nothing within its ``max_distance`` rather than a clamped value. Now only + finite ray hits are averaged into the terrain-adjusted target height. + + 32.0.0 (2026-09-29) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab/pyproject.toml b/source/isaaclab/pyproject.toml index dec277df0135..7d4bd2a99362 100644 --- a/source/isaaclab/pyproject.toml +++ b/source/isaaclab/pyproject.toml @@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta" [project] name = "isaaclab" -version = "32.0.0" +version = "32.1.0" description = "Extension providing main framework interfaces and abstractions for robot learning." license = {text = "BSD-3-Clause"} authors = [{name = "Isaac Lab Project Developers"}] diff --git a/source/isaaclab/test/cli/test_uv_run_pyproject.py b/source/isaaclab/test/cli/test_uv_run_pyproject.py index 51a5ec8a39a3..130407753702 100644 --- a/source/isaaclab/test/cli/test_uv_run_pyproject.py +++ b/source/isaaclab/test/cli/test_uv_run_pyproject.py @@ -160,7 +160,7 @@ def spec(package: str) -> str: # The Newton uv override is its single pin and may select a release or Git revision. newton_spec = next(requirement for requirement in overrides if requirement.startswith("newton[sim]")) - assert "==" in newton_spec or " @ git+" in newton_spec + assert newton_spec.endswith(f"newton.git@{versions['newton']}") # warp-lang is a core dependency whose table value may be an exact pin # ("1.2.3" -> ``==``) or a range (">=1.2.3" -> mirrored verbatim). diff --git a/source/isaaclab/test/install_ci/uv_pip/test_uv_pip_install_isaaclab_all_trains_cartpole.py b/source/isaaclab/test/install_ci/uv_pip/test_uv_pip_install_isaaclab_all_trains_cartpole.py index 02c285389892..379a364471d8 100644 --- a/source/isaaclab/test/install_ci/uv_pip/test_uv_pip_install_isaaclab_all_trains_cartpole.py +++ b/source/isaaclab/test/install_ci/uv_pip/test_uv_pip_install_isaaclab_all_trains_cartpole.py @@ -51,12 +51,22 @@ def test_uv_pip_install_isaaclab_all_trains_cartpole(self, isaaclab_root, wheel, self.create_uv_env(isaaclab_root) result = self.run_in_uv_env( - ["uv", "--no-config", "pip", "install", f"{wheel}[all]"], cwd=isaaclab_root, timeout=1800 + [ + "uv", + "--no-config", + "pip", + "install", + f"{wheel}[all]", + "--overrides", + str(isaaclab_root / "source/isaaclab/test/install_ci/uv_pip/uv-overrides.txt"), + ], + cwd=isaaclab_root, + timeout=1800, ) assert result.returncode == 0, f"uv pip install {wheel}[all] failed:\n{result.stdout}\n{result.stderr}" result = self.run_in_uv_env( - ["python", "-c", "import importlib.metadata as m; assert m.version('newton') == '1.6.0'"], + ["python", "-c", "import importlib.metadata as m; assert m.version('newton') == '1.6.1rc1'"], cwd=isaaclab_root, ) assert result.returncode == 0, ( diff --git a/source/isaaclab/test/install_ci/uv_pip/uv-overrides.txt b/source/isaaclab/test/install_ci/uv_pip/uv-overrides.txt index 95864a020a72..f8afc819ca8e 100644 --- a/source/isaaclab/test/install_ci/uv_pip/uv-overrides.txt +++ b/source/isaaclab/test/install_ci/uv_pip/uv-overrides.txt @@ -1,7 +1,7 @@ numpy>=2 mujoco~=3.12.0 mujoco-warp~=3.12.0 -newton[sim]==1.6.0 +newton[sim] @ git+https://github.com/newton-physics/newton.git@release-1.6 newton-usd-schemas>=0.5.0 usd-exchange==3.0.0 torch==2.12.0 diff --git a/source/isaaclab_experimental/changelog.d/warp-base-height-reward.rst b/source/isaaclab_experimental/changelog.d/warp-base-height-reward.rst deleted file mode 100644 index e90c5e8cc9ef..000000000000 --- a/source/isaaclab_experimental/changelog.d/warp-base-height-reward.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fixed -^^^^^ - -* Added the Warp implementation of ``base_height_l2``, restoring Warp frontend support for - Unitree Go2 tasks with the base-height reward enabled. diff --git a/source/isaaclab_experimental/docs/CHANGELOG.rst b/source/isaaclab_experimental/docs/CHANGELOG.rst index d38920be6c03..75e86b9fd04e 100644 --- a/source/isaaclab_experimental/docs/CHANGELOG.rst +++ b/source/isaaclab_experimental/docs/CHANGELOG.rst @@ -1,6 +1,16 @@ Changelog --------- +0.2.4 (2026-09-30) +~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Added the Warp implementation of ``base_height_l2``, restoring Warp frontend support for + Unitree Go2 tasks with the base-height reward enabled. + + 0.2.3 (2026-09-28) ~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_experimental/pyproject.toml b/source/isaaclab_experimental/pyproject.toml index 3b49e46241d1..da3388127359 100644 --- a/source/isaaclab_experimental/pyproject.toml +++ b/source/isaaclab_experimental/pyproject.toml @@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta" [project] name = "isaaclab_experimental" -version = "0.2.3" +version = "0.2.4" description = "Provides early access to future features that are not yet production-ready." license = {text = "BSD-3-Clause"} authors = [{name = "Isaac Lab Project Developers"}] diff --git a/source/isaaclab_newton/changelog.d/fabric-review-regressions.skip b/source/isaaclab_newton/changelog.d/fabric-review-regressions.skip deleted file mode 100644 index 654f59c39c58..000000000000 --- a/source/isaaclab_newton/changelog.d/fabric-review-regressions.skip +++ /dev/null @@ -1 +0,0 @@ -Covered nested articulation root-pose rendering and rigid-body rendering alongside cables. diff --git a/source/isaaclab_newton/changelog.d/fix-newton-collection-exact-match.rst b/source/isaaclab_newton/changelog.d/fix-newton-collection-exact-match.rst deleted file mode 100644 index d99377614559..000000000000 --- a/source/isaaclab_newton/changelog.d/fix-newton-collection-exact-match.rst +++ /dev/null @@ -1,6 +0,0 @@ -Fixed -^^^^^ - -* Fixed :class:`~isaaclab_newton.assets.RigidObjectCollection` selecting rigid bodies outside the - collection whose names share the members' prefix or suffix, and rejecting members at different - path depths. The collection view now matches each configured prim path exactly. diff --git a/source/isaaclab_newton/docs/CHANGELOG.rst b/source/isaaclab_newton/docs/CHANGELOG.rst index 92cb8aefd29f..2c725643e883 100644 --- a/source/isaaclab_newton/docs/CHANGELOG.rst +++ b/source/isaaclab_newton/docs/CHANGELOG.rst @@ -1,6 +1,17 @@ Changelog --------- +9.1.1 (2026-09-30) +~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Fixed :class:`~isaaclab_newton.assets.RigidObjectCollection` selecting rigid bodies outside the + collection whose names share the members' prefix or suffix, and rejecting members at different + path depths. The collection view now matches each configured prim path exactly. + + 9.1.0 (2026-09-29) ~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_newton/pyproject.toml b/source/isaaclab_newton/pyproject.toml index fe05d0b3714a..0d428e348dd3 100644 --- a/source/isaaclab_newton/pyproject.toml +++ b/source/isaaclab_newton/pyproject.toml @@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta" [project] name = "isaaclab_newton" -version = "9.1.0" +version = "9.1.1" description = "Extension providing IsaacLab with Newton specific abstractions." license = {text = "BSD-3-Clause"} authors = [{name = "Isaac Lab Project Developers"}] diff --git a/source/isaaclab_ov/changelog.d/maximiliank-heterogeneous-cloning-ovphysx.minor.rst b/source/isaaclab_ov/changelog.d/maximiliank-heterogeneous-cloning-ovphysx.minor.rst deleted file mode 100644 index 43ebcc61e693..000000000000 --- a/source/isaaclab_ov/changelog.d/maximiliank-heterogeneous-cloning-ovphysx.minor.rst +++ /dev/null @@ -1,16 +0,0 @@ -Added -^^^^^ - -* Added plan-driven OvPhysX cloning for heterogeneous rigid-body and articulation geometry variants. GPU cloning imported complete original worlds and assigned one native environment ID per copied world; CPU imported full USD copies with collision grouping. - -Fixed -^^^^^ - -* Preserved numeric environment order in tensor bindings, including non-cloned multi-instance assets, so indexed state reads and writes address the intended instances. -* Paired each cloned contact sensor with its own environment's filters and shared filters, and rejected missing filters that would silently remove sensor rows. -* Preserved all active source variants and independently authored assets during physics export, including custom environment templates and scaled asset roots. -* Preserved contacts with USD-only physics in each world composition and rejected incompatible active rotation-axis and tendon layouts before combining articulation variants. -* Removed destination placeholders and empty exported environment roots that caused quadratic native binding lookup costs. -* Registered Newton USD schemas before OVStage parsing. This affected all authored physics assets, including mimic-joint constraints, not only cloned assets. -* Deferred scene-data tensor bindings until visualization requests them, avoiding unnecessary headless-training startup cost. -* Matched the native scene's declared step rate to ``SimulationCfg.dt`` so automatic contact offsets used the actual simulation timestep instead of the 60 Hz default. diff --git a/source/isaaclab_ov/changelog.d/ovrtx-async-operation-ownership.rst b/source/isaaclab_ov/changelog.d/ovrtx-async-operation-ownership.rst deleted file mode 100644 index 0e601fdd46cc..000000000000 --- a/source/isaaclab_ov/changelog.d/ovrtx-async-operation-ownership.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fixed -^^^^^ - -* Unified retention of asynchronous OVRTX camera, transform, and geometry buffers until native writes completed, - isolated camera captures across resets, and avoided extracting priming images twice. diff --git a/source/isaaclab_ov/changelog.d/pv-ovrtx-async-slot-buffers.minor.rst b/source/isaaclab_ov/changelog.d/pv-ovrtx-async-slot-buffers.minor.rst deleted file mode 100644 index 827a57a5339b..000000000000 --- a/source/isaaclab_ov/changelog.d/pv-ovrtx-async-slot-buffers.minor.rst +++ /dev/null @@ -1,9 +0,0 @@ -Added -^^^^^ - -* Added an opt-in asynchronous OVRTX render path controlled by - :attr:`~isaaclab_ov.renderers.OVRTXRendererCfg.async_rendering`. - ``True`` returns each camera's previous capture while rendering the next image. The first - capture and the first capture after reset wait for a fresh image. Matching capture poses, - calibration, and frame indices are available in ``camera.data.info[output_name]["capture"]``; - the live camera fields remain current. diff --git a/source/isaaclab_ov/docs/CHANGELOG.rst b/source/isaaclab_ov/docs/CHANGELOG.rst index 3d486c727fde..644bde5a3c2c 100644 --- a/source/isaaclab_ov/docs/CHANGELOG.rst +++ b/source/isaaclab_ov/docs/CHANGELOG.rst @@ -1,6 +1,35 @@ Changelog --------- +4.1.0 (2026-09-30) +~~~~~~~~~~~~~~~~~~ + +Added +^^^^^ + +* Added plan-driven OvPhysX cloning for heterogeneous rigid-body and articulation geometry variants. GPU cloning imported complete original worlds and assigned one native environment ID per copied world; CPU imported full USD copies with collision grouping. +* Added an opt-in asynchronous OVRTX render path controlled by + :attr:`~isaaclab_ov.renderers.OVRTXRendererCfg.async_rendering`. + ``True`` returns each camera's previous capture while rendering the next image. The first + capture and the first capture after reset wait for a fresh image. Matching capture poses, + calibration, and frame indices are available in ``camera.data.info[output_name]["capture"]``; + the live camera fields remain current. + +Fixed +^^^^^ + +* Preserved numeric environment order in tensor bindings, including non-cloned multi-instance assets, so indexed state reads and writes address the intended instances. +* Paired each cloned contact sensor with its own environment's filters and shared filters, and rejected missing filters that would silently remove sensor rows. +* Preserved all active source variants and independently authored assets during physics export, including custom environment templates and scaled asset roots. +* Preserved contacts with USD-only physics in each world composition and rejected incompatible active rotation-axis and tendon layouts before combining articulation variants. +* Removed destination placeholders and empty exported environment roots that caused quadratic native binding lookup costs. +* Registered Newton USD schemas before OVStage parsing. This affected all authored physics assets, including mimic-joint constraints, not only cloned assets. +* Deferred scene-data tensor bindings until visualization requests them, avoiding unnecessary headless-training startup cost. +* Matched the native scene's declared step rate to ``SimulationCfg.dt`` so automatic contact offsets used the actual simulation timestep instead of the 60 Hz default. +* Unified retention of asynchronous OVRTX camera, transform, and geometry buffers until native writes completed, + isolated camera captures across resets, and avoided extracting priming images twice. + + 4.0.0 (2026-09-29) ~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_ov/pyproject.toml b/source/isaaclab_ov/pyproject.toml index b0d45d79189b..f456f3ae71b3 100644 --- a/source/isaaclab_ov/pyproject.toml +++ b/source/isaaclab_ov/pyproject.toml @@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta" [project] name = "isaaclab_ov" -version = "4.0.0" +version = "4.1.0" description = "Extension providing Omniverse rendering and OVPhysX simulation integrations." license = {text = "BSD-3-Clause"} authors = [{name = "Isaac Lab Project Developers"}] diff --git a/source/isaaclab_tasks/changelog.d/antoiner-fix-drlegs-padmm-divergence.rst b/source/isaaclab_tasks/changelog.d/antoiner-fix-drlegs-padmm-divergence.rst deleted file mode 100644 index 0ec40801a7be..000000000000 --- a/source/isaaclab_tasks/changelog.d/antoiner-fix-drlegs-padmm-divergence.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fixed -^^^^^ - -* Stabilized the DR Legs Kamino P-ADMM preset by disabling its driven-joint effort limit; PhysX retained - the 3.1 N m limit. diff --git a/source/isaaclab_tasks/changelog.d/henry-cassie-gait-symmetry.minor.rst b/source/isaaclab_tasks/changelog.d/henry-cassie-gait-symmetry.minor.rst deleted file mode 100644 index 0da0e419b2b7..000000000000 --- a/source/isaaclab_tasks/changelog.d/henry-cassie-gait-symmetry.minor.rst +++ /dev/null @@ -1,13 +0,0 @@ -Added -^^^^^ - -* Added :func:`~isaaclab_tasks.core.velocity.mdp.rewards.feet_air_time_variance`, penalizing an - uneven swing/stance split between a biped's feet. - -Changed -^^^^^^^ - -* Changed ``Isaac-Velocity-Flat-Cassie``, ``Isaac-Velocity-Rough-Cassie`` and - ``Isaac-Velocity-Flat-H1`` to include the new ``air_time_variance`` reward term, which fixes the - tilted gait these tasks otherwise converge on. Policies trained on them will differ from ones - trained before this change; set the weight to ``0.0`` to recover the previous reward. diff --git a/source/isaaclab_tasks/changelog.d/henry-go2-crouch-and-gait-fix.minor.rst b/source/isaaclab_tasks/changelog.d/henry-go2-crouch-and-gait-fix.minor.rst deleted file mode 100644 index 022ede555879..000000000000 --- a/source/isaaclab_tasks/changelog.d/henry-go2-crouch-and-gait-fix.minor.rst +++ /dev/null @@ -1,12 +0,0 @@ -Changed -^^^^^^^ - -* Changed ``Isaac-Velocity-Flat-UnitreeGo2`` and ``Isaac-Velocity-Rough-UnitreeGo2`` to add a - ``base_height_l2`` reward term at weight ``-30.0`` (rough, height-scanner adjusted) and disabled - on flat via ``sensor_cfg=None``. Without it, Go2's leg colliders let a policy rest its weight on - the legs and collect the full episode-length alive bonus from a permanent crouch, since torso - contact never fires and flat-orientation reward can't see it. -* Changed ``action_rate_l2`` on both tasks from the shared default of ``-0.01`` to ``-0.005``. The - stronger penalty locked one hind foot into a low-amplitude, dragging gait on flat terrain with - the Newton backend. Policies trained on these tasks will differ from ones trained before this - change. diff --git a/source/isaaclab_tasks/changelog.d/maximiliank-heterogeneous-cloning-ovphysx.minor.rst b/source/isaaclab_tasks/changelog.d/maximiliank-heterogeneous-cloning-ovphysx.minor.rst deleted file mode 100644 index 095cc149d70c..000000000000 --- a/source/isaaclab_tasks/changelog.d/maximiliank-heterogeneous-cloning-ovphysx.minor.rst +++ /dev/null @@ -1,4 +0,0 @@ -Changed -^^^^^^^ - -* Enabled the heterogeneous shapes preset by default for KUKA–Allegro tasks with OvPhysX. Select the ``cube`` preset explicitly to retain the previous homogeneous object setup. diff --git a/source/isaaclab_tasks/changelog.d/maximiliank-remove-franka-reorient.major.rst b/source/isaaclab_tasks/changelog.d/maximiliank-remove-franka-reorient.major.rst deleted file mode 100644 index 04a0cd995c0e..000000000000 --- a/source/isaaclab_tasks/changelog.d/maximiliank-remove-franka-reorient.major.rst +++ /dev/null @@ -1,5 +0,0 @@ -Removed -^^^^^^^ - -* Removed the unsupported ``Isaac-Reorient-Franka`` task and its environment configuration. Migrate custom - reorientation experiments to a maintained task or keep a local copy of the old configuration. diff --git a/source/isaaclab_tasks/changelog.d/pv-ovrtx-async-slot-buffers.skip b/source/isaaclab_tasks/changelog.d/pv-ovrtx-async-slot-buffers.skip deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/source/isaaclab_tasks/docs/CHANGELOG.rst b/source/isaaclab_tasks/docs/CHANGELOG.rst index c5e93e8ea44f..46f7f08640be 100644 --- a/source/isaaclab_tasks/docs/CHANGELOG.rst +++ b/source/isaaclab_tasks/docs/CHANGELOG.rst @@ -1,6 +1,46 @@ Changelog --------- +23.0.0 (2026-09-30) +~~~~~~~~~~~~~~~~~~~ + +Added +^^^^^ + +* Added :func:`~isaaclab_tasks.core.velocity.mdp.rewards.feet_air_time_variance`, penalizing an + uneven swing/stance split between a biped's feet. + +Changed +^^^^^^^ + +* Enabled the heterogeneous shapes preset by default for KUKA–Allegro tasks with OvPhysX. Select the ``cube`` preset explicitly to retain the previous homogeneous object setup. +* Changed ``Isaac-Velocity-Flat-Cassie``, ``Isaac-Velocity-Rough-Cassie`` and + ``Isaac-Velocity-Flat-H1`` to include the new ``air_time_variance`` reward term, which fixes the + tilted gait these tasks otherwise converge on. Policies trained on them will differ from ones + trained before this change; set the weight to ``0.0`` to recover the previous reward. +* Changed ``Isaac-Velocity-Flat-UnitreeGo2`` and ``Isaac-Velocity-Rough-UnitreeGo2`` to add a + ``base_height_l2`` reward term at weight ``-30.0`` (rough, height-scanner adjusted) and disabled + on flat via ``sensor_cfg=None``. Without it, Go2's leg colliders let a policy rest its weight on + the legs and collect the full episode-length alive bonus from a permanent crouch, since torso + contact never fires and flat-orientation reward can't see it. +* Changed ``action_rate_l2`` on both tasks from the shared default of ``-0.01`` to ``-0.005``. The + stronger penalty locked one hind foot into a low-amplitude, dragging gait on flat terrain with + the Newton backend. Policies trained on these tasks will differ from ones trained before this + change. + +Removed +^^^^^^^ + +* Removed the unsupported ``Isaac-Reorient-Franka`` task and its environment configuration. Migrate custom + reorientation experiments to a maintained task or keep a local copy of the old configuration. + +Fixed +^^^^^ + +* Stabilized the DR Legs Kamino P-ADMM preset by disabling its driven-joint effort limit; PhysX retained + the 3.1 N m limit. + + 22.0.0 (2026-09-29) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_tasks/pyproject.toml b/source/isaaclab_tasks/pyproject.toml index ec6b8fb7088a..c2714465d760 100644 --- a/source/isaaclab_tasks/pyproject.toml +++ b/source/isaaclab_tasks/pyproject.toml @@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta" [project] name = "isaaclab_tasks" -version = "22.0.0" +version = "23.0.0" description = "Extension containing suite of environments for robot learning." license = {text = "BSD-3-Clause"} authors = [{name = "Isaac Lab Project Developers"}] diff --git a/tools/wheel_builder/uv-overrides.txt b/tools/wheel_builder/uv-overrides.txt index 95864a020a72..f8afc819ca8e 100644 --- a/tools/wheel_builder/uv-overrides.txt +++ b/tools/wheel_builder/uv-overrides.txt @@ -1,7 +1,7 @@ numpy>=2 mujoco~=3.12.0 mujoco-warp~=3.12.0 -newton[sim]==1.6.0 +newton[sim] @ git+https://github.com/newton-physics/newton.git@release-1.6 newton-usd-schemas>=0.5.0 usd-exchange==3.0.0 torch==2.12.0 diff --git a/uv.lock b/uv.lock index b3764fe92283..6836cbae6930 100644 --- a/uv.lock +++ b/uv.lock @@ -19,7 +19,7 @@ prerelease-mode = "allow" overrides = [ { name = "mujoco", specifier = "~=3.12.0" }, { name = "mujoco-warp", specifier = "~=3.12.0" }, - { name = "newton", extras = ["sim"], specifier = "==1.6.0" }, + { name = "newton", extras = ["sim"], git = "https://github.com/newton-physics/newton.git?rev=release-1.6" }, { name = "newton-usd-schemas", specifier = ">=0.5.0" }, { name = "numpy", specifier = ">=2" }, { name = "packaging", specifier = ">=20,<27" }, @@ -1989,7 +1989,7 @@ requires-dist = [ { name = "meshio", specifier = ">=5.3.5" }, { name = "moviepy", marker = "extra == 'video'", specifier = ">=1.0.3,<2.0.0.dev0" }, { name = "myst-parser", marker = "extra == 'dev'" }, - { name = "newton", extras = ["sim"], specifier = "==1.6.0" }, + { name = "newton", extras = ["sim"], specifier = ">=1.2.0" }, { name = "newton-usd-schemas", specifier = ">=0.5.0" }, { name = "numba", specifier = ">=0.63.1" }, { name = "numpy", specifier = ">=2" }, @@ -3291,14 +3291,11 @@ wheels = [ [[package]] name = "newton" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } +version = "1.6.1rc1" +source = { git = "https://github.com/newton-physics/newton.git?rev=release-1.6#dff296359317779bd08e3ba4bc23bc5d4e20bbcd" } dependencies = [ { name = "warp-lang" }, ] -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/d0/1955c2623762fd1d9f3bc0bb9866b6c0669e1e277202bdc16772520d7da1/newton-1.6.0-py3-none-any.whl", hash = "sha256:5eedebe17d7261ca39e8f97c2f2f20e22e7264d0aed01782f3cb1dd60180b872", size = 6159741, upload-time = "2026-09-10T13:50:10.666Z" }, -] [package.optional-dependencies] sim = [