Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ dependencies = [
"pyglet>=2.1.6,<3",
"transformers==4.57.6",
"einops",
"warp-lang==1.16.0",
"warp-lang==1.17.0",
"matplotlib>=3.10.3",
# pillow: floor, not exact — an exact pin below Isaac Sim's prebundled version forces a
# downgrade that deletes the prebundled copy other extensions symlink into (nvbugs 6410989).
Expand Down Expand Up @@ -85,8 +85,9 @@ dependencies = [
"rsl-rl-lib==5.4.1", # default RL framework
"onnxscript>=0.5",
# ----- newton (default physics engine) -----
# Pin the Newton build used by both workspace and wheel installs until the 1.6 release.
"newton[sim] @ git+https://github.com/newton-physics/newton.git@24bd863528d6b91137408930d0fbe8fa216ad962",
# Loose bound so the wheel co-resolves with isaacsim's newton[sim]==1.2.0 pin; the
# exact PyPI release is forced via [tool.uv].override-dependencies (uv sync only).
"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.
Expand Down Expand Up @@ -220,7 +221,7 @@ torchaudio = "2.11.0"
ovphysx = "0.5.11"
ovrtx = "0.4.1.364340"
ovstage = "0.1.1.355824"
warp = "1.16.0"
warp = "1.17.0"

[tool.ruff]
line-length = 120
Expand Down Expand Up @@ -400,9 +401,9 @@ environments = [
# Torch routes through [tool.uv.sources]. Values mirror [tool.isaaclab.versions] where applicable.
override-dependencies = [
"numpy>=2",
"mujoco~=3.11.0",
"mujoco-warp~=3.11.0",
"newton[sim] @ git+https://github.com/newton-physics/newton.git@24bd863528d6b91137408930d0fbe8fa216ad962",
"mujoco~=3.12.0",
"mujoco-warp~=3.12.0",
"newton[sim]==1.6.0rc1",
# Force the Newton-matched schemas over isaacsim's ==0.2.0 pin.
"newton-usd-schemas>=0.4.1",
"torch==2.11.0",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
CI-only fix; no user-visible change.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Suggestion · Implementation — Unrelated changelog fragments committed

This fragment and jichuanh-kitless-isaac-sim-symlink.skip describe a deps-invariants fix and a kit-less Isaac Sim symlink fix, neither of which appears in this diff; the isaaclab change here is already covered by jichuanh-newton-pin-4017.minor.rst. Drop both so the commit stays focused and changelog.d does not accumulate fragments for unshipped work.

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
CI-only fix; no user-visible change.
10 changes: 10 additions & 0 deletions source/isaaclab/changelog.d/jichuanh-newton-pin-4017.minor.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
Changed
^^^^^^^

* Changed the pinned Newton version from ``1.5.1`` to ``1.6.0rc1``, the first release carrying

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Warning · Api — Release note misstates the previous Newton pin

This diff replaces newton[sim] @ git+...@24bd8635..., which uv.lock recorded as version 1.6.0.dev0, not 1.5.1. The published note therefore misidentifies both the prior dependency and who was affected by the ArticulationView custom-frequency error. Restate it as moving from the pinned Newton git revision to the 1.6.0rc1 PyPI release, and consider noting the ControllerPD to DrivePD construction rename that this bump makes user-visible.

`newton#4017 <https://github.com/newton-physics/newton/pull/4017>`_, which makes
``ArticulationView`` generic over custom frequencies. Reading a MuJoCo actuator attribute such
as ``mujoco.actuator_trntype`` through an articulation view previously raised *"has custom
frequency 'mujoco:actuator' which is not supported by ArticulationView"*.
* Changed ``warp-lang`` from ``1.16.0`` to ``1.17.0`` and ``mujoco``/``mujoco-warp`` from
``3.11.0`` to ``3.12.0``, which Newton ``1.6.0rc1`` requires.
6 changes: 3 additions & 3 deletions source/isaaclab/test/actuators/test_newton_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import numpy as np
import pytest
from newton.actuators import ClampingDCMotor, ClampingMaxEffort, ClampingPositionBased, ControllerPD
from newton.actuators import ClampingDCMotor, ClampingMaxEffort, ClampingPositionBased, DrivePD

from pxr import Usd, UsdGeom, UsdPhysics

Expand Down Expand Up @@ -110,7 +110,7 @@ def test_from_usd_groups_by_structure_and_preserves_per_dof_values():
assert len(actuators) == 4

pd = next(actuator for actuator in actuators if [type(c) for c in actuator.clamping] == [ClampingMaxEffort])
assert type(pd.controller) is ControllerPD
assert type(pd.controller) is DrivePD
np.testing.assert_array_equal(pd.indices.numpy(), [0, 1, 6, 7])
np.testing.assert_allclose(pd.controller.kp.numpy(), [11.0, 22.0, 11.0, 22.0])
np.testing.assert_allclose(pd.controller.kd.numpy(), [1.5, 2.5, 1.5, 2.5])
Expand All @@ -119,7 +119,7 @@ def test_from_usd_groups_by_structure_and_preserves_per_dof_values():
assert pd.delay.buf_depth == 4

dc = next(actuator for actuator in actuators if [type(c) for c in actuator.clamping] == [ClampingDCMotor])
assert type(dc.controller) is ControllerPD
assert type(dc.controller) is DrivePD
assert dc.delay is None
np.testing.assert_array_equal(dc.indices.numpy(), [2, 3, 8, 9])
np.testing.assert_allclose(dc.controller.kp.numpy(), [33.0, 44.0, 33.0, 44.0])
Expand Down
6 changes: 3 additions & 3 deletions source/isaaclab/test/install_ci/uv_pip/uv-overrides.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
numpy>=2
mujoco~=3.11.0
mujoco-warp~=3.11.0
newton[sim] @ git+https://github.com/newton-physics/newton.git@24bd863528d6b91137408930d0fbe8fa216ad962
mujoco~=3.12.0
mujoco-warp~=3.12.0
newton[sim]==1.6.0rc1
newton-usd-schemas>=0.4.1
torch==2.11.0
torchvision==0.26.0
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Test-only change: the P-ADMM round-trip test now builds a solver combination the

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Suggestion · Implementation — Fragment describes a change absent from diff

The only isaaclab_newton change here updates actuator class-name literals in test/assets/test_newton_actuators_newton.py; no P-ADMM round-trip or solver-combination change exists in this PR. The fragment text therefore records inaccurate release metadata for the package. Reword it to describe the actuator class-name update that actually lands.

pinned Newton accepts. No user-visible behavior change.
Original file line number Diff line number Diff line change
Expand Up @@ -598,7 +598,7 @@ def test_has_delay(self):

def test_controller_is_pd(self):
for a in self.result["actuator_info"]:
self.assertEqual(a["controller_type"], "ControllerPD")
self.assertEqual(a["controller_type"], "DrivePD")


# ---------------------------------------------------------------------------
Expand Down Expand Up @@ -772,7 +772,7 @@ def test_kfe_controller_is_pd(self):
kfe_acts = [a for a in self.result["actuator_info"] if "ClampingPositionBased" in a["clamping_types"]]
self.assertTrue(len(kfe_acts) > 0, "No actuator with position-based clamping found")
for a in kfe_acts:
self.assertEqual(a["controller_type"], "ControllerPD")
self.assertEqual(a["controller_type"], "DrivePD")

def test_kfe_has_position_based_clamping(self):
kfe_acts = [a for a in self.result["actuator_info"] if "ClampingPositionBased" in a["clamping_types"]]
Expand Down Expand Up @@ -845,11 +845,11 @@ def test_num_actuators(self):
self.assertGreaterEqual(self.result["num_actuators"], 2)

def test_has_neural_mlp_controller(self):
mlp_acts = [a for a in self.result["actuator_info"] if a["controller_type"] == "ControllerNeuralMLP"]
mlp_acts = [a for a in self.result["actuator_info"] if a["controller_type"] == "DriveNeuralMLP"]
self.assertTrue(len(mlp_acts) > 0, "No NeuralMLP controller found")

def test_mlp_has_dc_motor_clamping(self):
mlp_acts = [a for a in self.result["actuator_info"] if a["controller_type"] == "ControllerNeuralMLP"]
mlp_acts = [a for a in self.result["actuator_info"] if a["controller_type"] == "DriveNeuralMLP"]
for a in mlp_acts:
self.assertIn("ClampingDCMotor", a["clamping_types"])

Expand Down Expand Up @@ -890,11 +890,11 @@ def test_num_actuators(self):
self.assertGreaterEqual(self.result["num_actuators"], 2)

def test_has_neural_lstm_controller(self):
lstm_acts = [a for a in self.result["actuator_info"] if a["controller_type"] == "ControllerNeuralLSTM"]
lstm_acts = [a for a in self.result["actuator_info"] if a["controller_type"] == "DriveNeuralLSTM"]
self.assertTrue(len(lstm_acts) > 0, "No NeuralLSTM controller found")

def test_lstm_has_dc_motor_clamping(self):
lstm_acts = [a for a in self.result["actuator_info"] if a["controller_type"] == "ControllerNeuralLSTM"]
lstm_acts = [a for a in self.result["actuator_info"] if a["controller_type"] == "DriveNeuralLSTM"]
for a in lstm_acts:
self.assertIn("ClampingDCMotor", a["clamping_types"])

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Fixed
^^^^^

* Fixed ``test_manipulation_env_determinism`` asserting bit-reproducible rewards without requesting
a determinism guarantee. Newton defaults to ``wp.DeterministicMode.NOT_GUARANTEED``, under which
Warp's atomics may accumulate in any order, so the test failed intermittently depending on GPU
scheduling. It now passes ``deterministic_mode="run_to_run"``, as the Newton cartpole cases
already did.
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,20 @@ def setup_environment():


@pytest.mark.parametrize(
"task_name",
("task_name", "deterministic_mode"),
[
"Isaac-Open-Drawer-Franka",
"IsaacContrib-Lift-Cube-Franka",
# Newton defaults to ``wp.DeterministicMode.NOT_GUARANTEED``, under which Warp's atomics may
# accumulate in any order, so two runs are not bit-reproducible. Ask for the guarantee this
# test asserts, as the Newton cartpole cases below already do. ``deterministic_mode`` is a
# Newton setting, so the PhysX-backed task leaves it unset.
("Isaac-Open-Drawer-Franka", "run_to_run"),
("IsaacContrib-Lift-Cube-Franka", None),
],
)
@pytest.mark.parametrize("device", ["cuda", "cpu"])
def test_manipulation_env_determinism(task_name, device):
def test_manipulation_env_determinism(task_name, deterministic_mode, device):
"""Check deterministic environment creation for manipulation."""
_test_environment_determinism(task_name, device)
_test_environment_determinism(task_name, device, deterministic_mode=deterministic_mode)


@pytest.mark.parametrize(
Expand Down
6 changes: 3 additions & 3 deletions tools/wheel_builder/uv-overrides.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
numpy>=2
mujoco~=3.11.0
mujoco-warp~=3.11.0
newton[sim] @ git+https://github.com/newton-physics/newton.git@24bd863528d6b91137408930d0fbe8fa216ad962
mujoco~=3.12.0
mujoco-warp~=3.12.0
newton[sim]==1.6.0rc1
newton-usd-schemas>=0.4.1
torch==2.11.0
torchvision==0.26.0
Expand Down
53 changes: 28 additions & 25 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading