Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
17 changes: 10 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,11 @@ 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",
# Pin the Newton release used by both workspace and wheel installs until 1.6.0 final.
# [tool.uv].override-dependencies only reaches uv sync, so a wheel built from this
# metadata would otherwise resolve the newest stable (1.5.1) and miss newton#4017:
# 1.6.0rc1 is a prerelease, which a default resolve skips.
"newton[sim]==1.6.0rc1",
# 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 +223,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 +403,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
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
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
Reinstall AFTER the wheel install: unsafe-best-match re-resolves torch from PyPI to CPU.)
- (aarch64 only) export LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1
Tests:
- python -c "import importlib.metadata as m; assert m.version('newton') == '1.6.0.dev0'"
-> verify the wheel resolves the pinned Newton 1.6 development build
- python -c "import importlib.metadata as m; assert m.version('newton') == '1.6.0rc1'"
-> verify the wheel resolves the pinned Newton release
- uv run isaaclab train --rl_library rsl_rl --task Isaac-Cartpole-Direct --num_envs 16
presets=newton_mjwarp --max_iterations 5; uv run isaaclab train --rl_library rsl_rl
--task Isaac-Cartpole-Camera-Direct --num_envs 16 presets=newton_mjwarp,newton_renderer --max_iterations 2
Expand Down Expand Up @@ -57,7 +57,7 @@ def test_uv_pip_install_isaaclab_all_trains_cartpole(self, isaaclab_root, wheel,
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.dev0'"],
["python", "-c", "import importlib.metadata as m; assert m.version('newton') == '1.6.0rc1'"],
cwd=isaaclab_root,
)
assert result.returncode == 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,3 @@
Test-only change: the actuator tests now assert Newton's new drive class names
(``DrivePD``, ``DriveNeuralMLP``, ``DriveNeuralLSTM``). Newton 1.6.0rc1 still exports the
old ``Controller*`` aliases, so there is 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. ``run_to_run`` is exactly
# the guarantee this test asserts: one device, one process, run twice. ``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