From 2ed9e219ea42fc5f8bbb00826506c62524ea2cc8 Mon Sep 17 00:00:00 2001 From: strands-agent <217235299+strands-agent@users.noreply.github.com> Date: Sun, 15 Mar 2026 16:31:47 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20Newton=20up=5Faxis=20string=E2=86=92Axis?= =?UTF-8?q?=20enum,=20add=20warp-lang=20to=20[isaac],=20platform-gate=20us?= =?UTF-8?q?d-core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Port three GPU-blocker fixes from GPU test campaign (cagataycali/strands-gtc-nvidia#290): 1. Newton up_axis bug (BLOCKER): create_world() was setting up_axis on ModelBuilder as a string via attribute assignment, but Newton's up_vector property calls .to_vector() which requires an Axis enum. Fix: pass up_axis to ModelBuilder constructor (handles conversion). Applied to create_world(), _recreate_builder(), and replicate(). 2. Missing warp-lang in [isaac] extras: IsaacSimBackend.create_world() fails with 'No module named warp' without it. 3. usd-core aarch64 gating: no aarch64 wheels exist, blocking install on Jetson Thor. Added platform_machine marker. Tested: 73/73 tests pass. --- pyproject.toml | 3 +- strands_robots/newton/newton_backend.py | 53 +++++++++++++++---------- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3ef1792..af1b1b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,7 +63,8 @@ isaac = [ # pip install isaaclab isaaclab_assets isaaclab_tasks (from Isaac Lab source) "h5py>=3.0", "mujoco>=3.0.0", - "usd-core>=24.0", # OpenUSD (pxr) for MJCF→USD asset conversion + "usd-core>=24.0; platform_machine != 'aarch64'", # no aarch64 wheels + "warp-lang>=1.0.0", # required by Isaac Lab ] newton = [ "newton>=1.0.0", diff --git a/strands_robots/newton/newton_backend.py b/strands_robots/newton/newton_backend.py index 85de55f..533cb10 100644 --- a/strands_robots/newton/newton_backend.py +++ b/strands_robots/newton/newton_backend.py @@ -611,19 +611,20 @@ def create_world( gravity_mag = -abs(gy) if gy != 0 else -9.81 try: - self._builder = newton.ModelBuilder(gravity=gravity_mag) + self._builder = newton.ModelBuilder( + up_axis=up_axis.upper(), gravity=gravity_mag + ) except (TypeError, AttributeError): self._builder = newton.ModelBuilder() - # Set scalar gravity and up_vector - try: - self._builder.gravity = gravity_mag - except Exception: - pass - try: - self._builder.up_vector = up_vec - self._builder.up_axis = up_axis - except Exception: - pass + # Fallback: set gravity and up_vector as attributes + try: + self._builder.gravity = gravity_mag + except Exception: + pass + try: + self._builder.up_vector = up_vec + except Exception: + pass self._ground_plane_requested = ground_plane if ground_plane: @@ -657,18 +658,21 @@ def _recreate_builder(self) -> None: newton = self._newton gravity_mag = getattr(self._builder, "gravity", -9.81) up_vec = getattr(self._builder, "up_vector", (0.0, 0.0, 1.0)) + up_axis_str = "z" if up_vec[2] > up_vec[1] else "y" try: - self._builder = newton.ModelBuilder(gravity=gravity_mag) + self._builder = newton.ModelBuilder( + up_axis=up_axis_str.upper(), gravity=gravity_mag + ) except (TypeError, AttributeError): self._builder = newton.ModelBuilder() - try: - self._builder.gravity = gravity_mag - except Exception: - pass - try: - self._builder.up_vector = up_vec - except Exception: - pass + try: + self._builder.gravity = gravity_mag + except Exception: + pass + try: + self._builder.up_vector = up_vec + except Exception: + pass if getattr(self, "_ground_plane_requested", True): try: self._builder.add_ground_plane() @@ -1111,7 +1115,14 @@ def replicate(self, num_envs: Optional[int] = None) -> Dict[str, Any]: self._dof_per_world = getattr(main_builder, "joint_count", 0) # Use Newton's replicate — instance method on a new builder - replicated_builder = newton.ModelBuilder() + # Propagate up_axis from main builder to replicated builder + _up_axis = getattr(main_builder, "up_axis", "Y") + if hasattr(_up_axis, "name"): + _up_axis = _up_axis.name # Axis enum → string + try: + replicated_builder = newton.ModelBuilder(up_axis=str(_up_axis).upper()) + except (TypeError, AttributeError): + replicated_builder = newton.ModelBuilder() replicated_builder.replicate( main_builder, world_count=num_envs,