Skip to content
Open
Show file tree
Hide file tree
Changes from 101 commits
Commits
Show all changes
129 commits
Select commit Hold shift + click to select a range
2b1b621
Fix Newton dexterous task configurations
hujc7 Jul 2, 2026
1d7dbd4
Defer pxr/carb imports on environment construction
hujc7 Jul 2, 2026
35c92b1
Add dexterous backend presets
hujc7 Jul 2, 2026
1d5dbec
Merge remote-tracking branch 'origin/develop' into jichuanh/dexterous…
hujc7 Jul 2, 2026
99025bd
Format dexterous preset tests
hujc7 Jul 2, 2026
3f8b1b0
Retry deferred Isaac Sim stage sharing
hujc7 Jul 2, 2026
eb651e9
Fix OVPhysX actuator joint indexing
hujc7 Jul 2, 2026
0380e6b
Fix MARL adapter observations for RSL-RL
hujc7 Jul 2, 2026
a721d72
Add RSL-RL configs for dexterous tasks
hujc7 Jul 2, 2026
fae1971
Declare Handover RSL-RL observation groups
hujc7 Jul 2, 2026
db92802
Remove unrelated convergence changes
hujc7 Jul 2, 2026
b9cdf2b
Add manager-based handover environment
hujc7 Jul 2, 2026
ce1f1bf
Add state-based Shadow Manager task
hujc7 Jul 2, 2026
b3070ae
Defer Handover MDP imports
hujc7 Jul 2, 2026
17d0628
Handle initial Shadow Manager reset
hujc7 Jul 2, 2026
55b6ad5
Defer Shadow Manager action imports
hujc7 Jul 2, 2026
7a0024b
Preserve actions across manual resets
hujc7 Jul 2, 2026
0e57f84
Preserve Handover actions across resets
hujc7 Jul 2, 2026
7da09aa
Remove redundant dexterous settings
hujc7 Jul 2, 2026
3ed8cf1
Add Shadow OpenAI and camera Manager tasks
hujc7 Jul 2, 2026
2d6d284
Order camera Manager test imports
hujc7 Jul 2, 2026
c4c9e96
Align Allegro Manager with Direct task
hujc7 Jul 2, 2026
36bb19f
Cover camera variant validation gaps
hujc7 Jul 2, 2026
51b2833
Merge remote-tracking branch 'origin/develop' into jichuanh/dexterous…
hujc7 Jul 2, 2026
4bceaed
Add Menagerie dexterous hand presets
hujc7 Jul 2, 2026
6f124ec
Merge remote-tracking branch 'origin/develop' into jichuanh/dexterous…
hujc7 Jul 2, 2026
faeb4c0
Fix benchmark test import order
hujc7 Jul 2, 2026
aa03efa
Repair Menagerie dexterous hand topology
hujc7 Jul 2, 2026
ef833de
Fix Newton clone imports and solver pin
hujc7 Jul 2, 2026
a4301a8
Harden dexterous convergence contracts
hujc7 Jul 2, 2026
0f350f4
Fix dexterous Menagerie task behavior
hujc7 Jul 2, 2026
4147049
Remove deprecated reorientation schemas
hujc7 Jul 2, 2026
d6aee9d
Declare task package dependencies
hujc7 Jul 2, 2026
8e5f964
Fix local package install order
hujc7 Jul 2, 2026
1fe0690
Add camera task rendering goldens
hujc7 Jul 2, 2026
936aa17
Fix OVPhysX schema registration in Kit
hujc7 Jul 2, 2026
5f91435
Test camera keypoint deprecation
hujc7 Jul 2, 2026
d853c53
Support declared OVPhysX runtime API
hujc7 Jul 2, 2026
8df532f
Merge develop into dexterous convergence
hujc7 Jul 2, 2026
389cb6d
Declare dexterous task dependencies
hujc7 Jul 2, 2026
43ede30
Fix kitless OpenUSD provider conflict
hujc7 Jul 2, 2026
507b309
Test task dependency metadata
hujc7 Jul 2, 2026
8a5eb1a
Fix Shadow Hand OVPhysX task frame
hujc7 Jul 2, 2026
7752c14
Fix Shadow Hand environment links
hujc7 Jul 2, 2026
020ded6
Stabilize Shadow OpenAI Newton integration
hujc7 Jul 3, 2026
1ba85bc
Update Shadow Hand rendering references
hujc7 Jul 3, 2026
fe42016
Fix Newton marker shutdown cleanup
hujc7 Jul 3, 2026
d277aff
Reject unvalidated cubric adapter versions
hujc7 Jul 3, 2026
3dd37c8
Merge remote-tracking branch 'origin/develop' into jichuanh/dexterous…
hujc7 Jul 3, 2026
935c364
Separate task errors from success thresholds
hujc7 Jul 3, 2026
59a374e
Merge remote-tracking branch 'origin/develop' into jichuanh/dexterous…
hujc7 Jul 3, 2026
335b976
Merge remote-tracking branch 'origin/develop' into jichuanh/dexterous…
hujc7 Jul 7, 2026
ff3c153
Remove MuJoCo Menagerie asset adaptation from dexterous tasks
hujc7 Jul 7, 2026
85b04c5
Regenerate shadow camera goldens for the production assets
hujc7 Jul 7, 2026
ff9d7f5
Minimize divergence from develop in dexterous packages
hujc7 Jul 7, 2026
93fcb15
Fix handover Newton distal joints for renamed Shadow asset
hujc7 Jul 7, 2026
efc6c4f
Remove stale install-order test for reverted dependency
hujc7 Jul 7, 2026
8127591
Merge remote-tracking branch 'origin/develop' into jichuanh/dexterous…
hujc7 Jul 8, 2026
6a7d98b
Regenerate environment overview after develop merge
hujc7 Jul 8, 2026
d5dd976
Adapt to renderer preset rename and central dependency scheme
hujc7 Jul 8, 2026
853861b
Drop deep Direct/Manager parity suites
hujc7 Jul 8, 2026
07a8213
Reimplement shared dexterous reward functions in Warp
hujc7 Jul 8, 2026
b7dc39e
Map handover actuated joints per backend
hujc7 Jul 8, 2026
9a8db9b
Apply review fixes to the split parts under review
hujc7 Jul 8, 2026
fcf83ca
Compose handover Newton hand rotations with the asset base rotation
hujc7 Jul 9, 2026
b9f0156
Raise handover Newton substeps for sustained ball contact
hujc7 Jul 9, 2026
257e57e
Split dexterous test files along task and backend ownership
hujc7 Jul 9, 2026
a62b7fd
Fix physics preset accessor in the handover Newton cfg test
hujc7 Jul 9, 2026
a8b7599
Align manager scene and event presets with the Direct tasks
hujc7 Jul 9, 2026
cc39ad0
Drop the manager camera Benchmark registration
hujc7 Jul 9, 2026
aa3ee02
Relocate manager action and camera terms into the mdp package
hujc7 Jul 9, 2026
72c7df0
Add opt-in domain randomization to the Allegro manager
hujc7 Jul 9, 2026
418450a
Reimplement cube keypoint computation in Warp
hujc7 Jul 9, 2026
817ad06
Add shared task-constants modules for the dexterous families
hujc7 Jul 9, 2026
7eedc06
Calibrate the new manager benchmark gates from campaign evidence
hujc7 Jul 9, 2026
3b74b5d
Restore the fingertip re-export stripped by lint autofix
hujc7 Jul 9, 2026
e2ccee5
Single-source the handover actuated-joint preset
hujc7 Jul 9, 2026
025ba94
Adopt CI-rendered camera golden images
hujc7 Jul 9, 2026
a09371b
Apply review round-two quick fixes
hujc7 Jul 9, 2026
8cbd7b4
Move warp reward buffers to the callers
hujc7 Jul 9, 2026
3cceff6
Replace Direct-cfg instance reads with task constants
hujc7 Jul 9, 2026
32d09d2
Use framework mdp terms over parity-only customs
hujc7 Jul 9, 2026
00283a3
Convert quat-math observation terms to Warp kernels
hujc7 Jul 9, 2026
e6c51df
Serve RSL-RL observations from the standard env API
hujc7 Jul 9, 2026
21c30f1
Trim the MARL adapter to the strict minimum
hujc7 Jul 9, 2026
180f59d
Read RSL-RL observations from the environment buffer
hujc7 Jul 9, 2026
6c61e48
Bump Newton to the ignore_paths custom-frequency fix
hujc7 Jul 9, 2026
c5c3086
Apply review-bot fixes and drop duplicated Warp helper
hujc7 Jul 9, 2026
7e8630a
Launch task kernels on Warp-native environment state
hujc7 Jul 9, 2026
2c229da
Convert the remaining hot-path task math to Warp
hujc7 Jul 9, 2026
d69f887
Build the Direct observations and actuation in Warp
hujc7 Jul 9, 2026
beedbea
Revert "Bump Newton to the ignore_paths custom-frequency fix"
hujc7 Jul 9, 2026
003f2b5
Snapshot Direct observations at the RSL-RL boundary
hujc7 Jul 9, 2026
dc492d1
Revert "Revert "Bump Newton to the ignore_paths custom-frequency fix""
hujc7 Jul 9, 2026
ef6e907
Override the Isaac Sim MuJoCo pins for the Newton update
hujc7 Jul 9, 2026
8faabdb
Revert "Override the Isaac Sim MuJoCo pins for the Newton update"
hujc7 Jul 9, 2026
d575d56
Revert "Revert "Revert "Bump Newton to the ignore_paths custom-freque…
hujc7 Jul 9, 2026
f7c4c3b
Pin the latest Newton and override the Isaac Sim MuJoCo pins
hujc7 Jul 9, 2026
42e8c1c
Trim the task test suite to behavior tests
hujc7 Jul 9, 2026
f5dd8e3
Fix review findings across dexterous tasks and envs
hujc7 Jul 9, 2026
d3cddae
Calibrate camera benchmark gates from full-budget evidence
hujc7 Jul 10, 2026
ceb6c78
Remove redundant Warp init calls and launch casts
hujc7 Jul 12, 2026
0c103a4
Deduplicate shared Warp kernels into core utils
hujc7 Jul 12, 2026
77b9289
Single-source remaining duplicated task constants
hujc7 Jul 12, 2026
ec2dd84
Deduplicate cfg fragments and cross-family terms
hujc7 Jul 12, 2026
8727b1b
Parallelize Direct observation kernels over columns
hujc7 Jul 12, 2026
75e42e7
Remove per-step host syncs and allocations from task hot paths
hujc7 Jul 12, 2026
6b1a750
Restructure dexterous task parameters and kernel layout
hujc7 Jul 14, 2026
531664d
Sync the part-review outcomes into the lump
hujc7 Jul 16, 2026
ca04cac
Restore the torch internals of the episode recorder
hujc7 Jul 16, 2026
7326465
Revert the dexterous task logic from Warp to torch
hujc7 Jul 16, 2026
5e4cc50
Merge remote-tracking branch 'upstream/develop' into jichuanh/dextero…
hujc7 Jul 16, 2026
5c439fd
Merge remote-tracking branch 'upstream/develop' into jichuanh/dextero…
hujc7 Jul 17, 2026
5d7ddbb
Fix codespell finding in the value-parity test docstring
hujc7 Jul 17, 2026
2c22af0
Share per-family sim settings through task-cfg base mixins
hujc7 Jul 17, 2026
2d2f495
Merge remote-tracking branch 'upstream/develop' into jichuanh/dextero…
hujc7 Jul 17, 2026
289efcb
Drop the OVPhysX changelog fragment superseded by the merged Part 2
hujc7 Jul 17, 2026
2c5ea5b
Use the shared quaternion product for the handover Newton rotation
hujc7 Jul 17, 2026
792e400
Deduplicate backend scene presets via inner-class defaults
hujc7 Jul 17, 2026
42675b6
Nest single-consumer scene and camera helper cfgs in their presets
hujc7 Jul 18, 2026
1f05f85
Apply raw-review fixes across the dexterous task family
hujc7 Jul 18, 2026
c6140f9
Use the shared quaternion error metric and drop the direct_ prefixes
hujc7 Jul 18, 2026
173e9dc
Drop Direct prefix from manager reward and timeout terms
hujc7 Jul 18, 2026
9ad7bbd
Sync Part 1 content and drop the stale Newton pin remnants
hujc7 Jul 18, 2026
2727616
Remove the superseded manager reorientation env and legacy terms
hujc7 Jul 18, 2026
1732493
Remove the orphaned object_away_from_robot termination term
hujc7 Jul 18, 2026
3659a33
Share the manager section declarations through term factories
hujc7 Jul 19, 2026
ee272c9
Deduplicate the reorient action and reset-event declarations
hujc7 Jul 19, 2026
cdaadac
Restore inline task values and split identity into common modules
hujc7 Jul 20, 2026
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
805 changes: 377 additions & 428 deletions docs/source/overview/environments.rst

Large diffs are not rendered by default.

16 changes: 12 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -159,8 +159,11 @@ torchaudio = "2.11.0"
ovphysx = "0.5.2+head.f62c22207c"
ovrtx = ">=0.3.0,<0.4.0"
# Newton git commit + matching warp-lang prerelease (upgraded together).
newton = "c7ae7c7648cd0717df39e5c94b95d5a02c997320"
newton = "9af5a9f418156ff1f280711b884868df7b4ead37"
warp = "1.15.0.dev20260626"
# MuJoCo stack required by the Newton pin; overrides isaacsim-core's exact 3.8 pin.
mujoco_warp = ">=3.10.0.1,<3.11"
mujoco = "~=3.10.0"

[tool.ruff]
line-length = 120
Expand Down Expand Up @@ -326,9 +329,14 @@ prerelease = "allow"
# the CUDA indexes via [tool.uv.sources]. Values mirror [tool.isaaclab.versions] above.
override-dependencies = [
"numpy>=2",
"newton[sim] @ git+https://github.com/newton-physics/newton.git@c7ae7c7648cd0717df39e5c94b95d5a02c997320",
# Force the Newton-matched schemas over isaacsim's ==0.2.0 pin.
"newton-usd-schemas>=0.3.1",
"newton[sim] @ git+https://github.com/newton-physics/newton.git@9af5a9f418156ff1f280711b884868df7b4ead37",
# Force the Newton-matched schemas over isaacsim's ==0.2.0 pin
# (newton main's [importers] extra declares >=0.4.0).
"newton-usd-schemas>=0.4.0",
# The Newton pin requires the MuJoCo 3.10 stack; isaacsim-core pins
# mujoco-warp==3.8.0.3 exactly, so force the newer stack for every requester.
"mujoco-warp>=3.10.0.1,<3.11",
"mujoco~=3.10.0",
"torch==2.11.0",
"torchvision==0.26.0",
"torchaudio==2.11.0",
Expand Down
9 changes: 9 additions & 0 deletions source/isaaclab/changelog.d/dexterous-env-convergence.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Fixed
^^^^^

* Fixed :meth:`~isaaclab.envs.DirectRLEnv.reset` to store the observation buffer
like :meth:`~isaaclab.envs.DirectRLEnv.step` already does, and exposed the
latest observations on the multi-agent-to-single-agent adapter through the
same public buffer.
* Fixed kit-less installation to select one OpenUSD provider per architecture,
preventing mixed ``pxr`` ABIs during Newton training on x86.
4 changes: 3 additions & 1 deletion source/isaaclab/isaaclab/envs/direct_rl_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,9 @@ def reset(self, seed: int | None = None, options: dict[str, Any] | None = None)
self.sim.render()

# return observations
return self._get_observations(), self.extras
# store the buffer like step() does, so consumers can read the latest observations
self.obs_buf = self._get_observations()
return self.obs_buf, self.extras

def step(self, action: torch.Tensor) -> VecEnvStepReturn:
"""Execute one time-step of the environment's dynamics.
Expand Down
50 changes: 26 additions & 24 deletions source/isaaclab/isaaclab/envs/utils/marl.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,22 +81,34 @@ def __init__(self, env: DirectMARLEnv) -> None:
)
self.action_space = gym.vector.utils.batch_space(self.single_action_space, self.num_envs)

def reset(self, seed: int | None = None, options: dict[str, Any] | None = None) -> tuple[VecEnvObs, dict]:
obs, extras = self.env.reset(seed, options)
@property
def episode_length_buf(self) -> torch.Tensor:
"""Episode lengths from the wrapped multi-agent environment."""
return self.env.episode_length_buf

# use environment state as observation
if self._state_as_observation:
obs = {"policy": self.env.state()}
# concatenate agents' observations
@episode_length_buf.setter
def episode_length_buf(self, value: torch.Tensor) -> None:
self.env.episode_length_buf = value

@property
def obs_buf(self) -> VecEnvObs:
"""Latest observations from the wrapped multi-agent environment."""
return self._convert_observations(self.env.obs_dict)

def _convert_observations(self, obs: dict[AgentID, ObsType]) -> VecEnvObs:
"""Convert multi-agent observations to the single-agent policy observation."""
# FIXME: This implementation assumes the spaces are fundamental ones. Fix it to support composite spaces
else:
obs = {
"policy": torch.cat(
[obs[agent].reshape(self.num_envs, -1) for agent in self.env.possible_agents], dim=-1
)
}
if self._state_as_observation:
return {"policy": self.env.state()}
return {
"policy": torch.cat(
[obs[agent].reshape(self.num_envs, -1) for agent in self.env.possible_agents], dim=-1
)
}

return obs, extras
def reset(self, seed: int | None = None, options: dict[str, Any] | None = None) -> tuple[VecEnvObs, dict]:
obs, extras = self.env.reset(seed, options)
return self._convert_observations(obs), extras

def step(self, action: torch.Tensor) -> VecEnvStepReturn:
# split single-agent actions to build the multi-agent ones
Expand All @@ -111,17 +123,7 @@ def step(self, action: torch.Tensor) -> VecEnvStepReturn:
# step the environment
obs, rewards, terminated, time_outs, extras = self.env.step(_actions)

# use environment state as observation
if self._state_as_observation:
obs = {"policy": self.env.state()}
# concatenate agents' observations
# FIXME: This implementation assumes the spaces are fundamental ones. Fix it to support composite spaces
else:
obs = {
"policy": torch.cat(
[obs[agent].reshape(self.num_envs, -1) for agent in self.env.possible_agents], dim=-1
)
}
obs = self._convert_observations(obs)

# process environment outputs to return single-agent data
rewards = sum(rewards.values())
Expand Down
5 changes: 5 additions & 0 deletions source/isaaclab/test/cli/test_install_command_parsing.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,11 @@ def test_core_submodules_starts_with_isaaclab(self):
"isaaclab must be first so dependents resolve against the local copy"
)

def test_core_submodules_install_contrib_before_tasks(self):
assert CORE_ISAACLAB_SUBMODULES.index("isaaclab_contrib") < CORE_ISAACLAB_SUBMODULES.index("isaaclab_tasks"), (
"isaaclab_contrib must be installed before isaaclab_tasks so its declared local dependency resolves"
)

def test_core_submodules_contains_expected_packages(self):
expected = {
"isaaclab",
Expand Down
4 changes: 4 additions & 0 deletions source/isaaclab/test/cli/test_uv_run_pyproject.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,10 @@ def test_version_single_source_matches_literal_pins():
assert any(dep.endswith(f"newton.git@{versions['newton']}") for dep in overrides)
assert f"warp-lang=={versions['warp']}" in dependencies

# MuJoCo-stack overrides mirror the table (they outrank isaacsim-core's exact pins).
assert f"mujoco-warp{versions['mujoco_warp']}" in overrides
assert f"mujoco{versions['mujoco']}" in overrides


def test_uv_run_isaacsim_extra_is_conflict_forked():
"""Isaac Sim is an opt-in uv workspace extra, forked away from clashing extras.
Expand Down
82 changes: 82 additions & 0 deletions source/isaaclab/test/envs/test_marl_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# Copyright (c) 2022-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

from types import SimpleNamespace

import gymnasium as gym
import torch

from isaaclab.envs.utils.marl import multi_agent_to_single_agent


class _FakeMultiAgentEnv:
possible_agents = ["agent_0", "agent_1"]
observation_spaces = {
"agent_0": gym.spaces.Box(low=-1.0, high=1.0, shape=(2,)),
"agent_1": gym.spaces.Box(low=-1.0, high=1.0, shape=(1,)),
}
action_spaces = {
"agent_0": gym.spaces.Box(low=-1.0, high=1.0, shape=(1,)),
"agent_1": gym.spaces.Box(low=-1.0, high=1.0, shape=(1,)),
}
render_mode = None

def __init__(self):
self.unwrapped = self
self.cfg = SimpleNamespace(state_space=2)
self.state_space = gym.spaces.Box(low=-1.0, high=1.0, shape=(2,))
self.sim = object()
self.scene = SimpleNamespace(num_envs=2)
self.episode_length_buf = torch.tensor([1, 2])
self.obs_dict = {
"agent_0": torch.tensor([[1.0, 2.0], [3.0, 4.0]]),
"agent_1": torch.tensor([[5.0], [6.0]]),
}

def reset(self, seed=None, options=None):
return self.obs_dict, {}

def state(self):
return torch.tensor([[7.0, 8.0], [9.0, 10.0]])

def close(self):
pass


def test_multi_agent_to_single_agent_reset_concatenates_agents():
"""The adapter reset should concatenate the agents' observations."""
env = multi_agent_to_single_agent(_FakeMultiAgentEnv())

observations, _ = env.reset()

torch.testing.assert_close(observations["policy"], torch.tensor([[1.0, 2.0, 5.0], [3.0, 4.0, 6.0]]))


def test_multi_agent_to_single_agent_reset_can_use_state():
"""The adapter reset should support the state-as-observation mode."""
env = multi_agent_to_single_agent(_FakeMultiAgentEnv(), state_as_observation=True)

observations, _ = env.reset()

torch.testing.assert_close(observations["policy"], torch.tensor([[7.0, 8.0], [9.0, 10.0]]))


def test_multi_agent_to_single_agent_forwards_episode_lengths():
"""RSL-RL episode randomization should update the wrapped environment buffer."""
source_env = _FakeMultiAgentEnv()
env = multi_agent_to_single_agent(source_env)
episode_lengths = torch.tensor([3, 4])

env.episode_length_buf = episode_lengths

assert env.episode_length_buf is episode_lengths
assert source_env.episode_length_buf is episode_lengths


def test_multi_agent_to_single_agent_exposes_latest_observations():
"""The public observation buffer should reflect the wrapped environment's buffer."""
env = multi_agent_to_single_agent(_FakeMultiAgentEnv())

torch.testing.assert_close(env.obs_buf["policy"], torch.tensor([[1.0, 2.0, 5.0], [3.0, 4.0, 6.0]]))
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Fixed
^^^^^

* Fixed :meth:`~isaaclab_experimental.envs.DirectRLEnvWarp.step` and
:meth:`~isaaclab_experimental.envs.DirectRLEnvWarp.reset` to store the returned
observation dictionary in ``obs_buf``, which
:meth:`~isaaclab_rl.rsl_rl.RslRlVecEnvWrapper.get_observations` now reads.
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,9 @@ def reset(self, seed: int | None = None, options: dict[str, Any] | None = None)

# return observations
self._get_observations()
return {"policy": self.torch_obs_buf.clone()}, self.extras
# store the returned buffer so RslRlVecEnvWrapper.get_observations() can read env.obs_buf
self.obs_buf = {"policy": self.torch_obs_buf.clone()}
return self.obs_buf, self.extras

@Timer(name="env_step", msg="Step took:", enable=DEBUG_TIMER_STEP or DEBUG_TIMERS)
def step(self, action: torch.Tensor) -> VecEnvStepReturn:
Expand Down Expand Up @@ -460,8 +462,10 @@ def step(self, action: torch.Tensor) -> VecEnvStepReturn:
self._post_step_visualize()

# return observations, rewards, resets and extras
# store the returned buffer so RslRlVecEnvWrapper.get_observations() can read env.obs_buf
self.obs_buf = {"policy": self.torch_obs_buf.clone()}
return (
{"policy": self.torch_obs_buf.clone()},
self.obs_buf,
self.torch_reward_buf,
self.torch_reset_terminated,
self.torch_reset_time_outs,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
Fixed
^^^^^

* Fixed detached articulation links with Newton and Isaac RTX by falling back
from unvalidated cubric adapter versions.

* Fixed Newton clone imports creating empty MuJoCo custom-frequency rows from
ignored environment subtrees. The Newton pin is updated to a build whose
custom-frequency USD traversal honors ``ignore_paths`` (pulling in MuJoCo and
mujoco-warp 3.10), replacing the earlier import-scoping workaround.
20 changes: 4 additions & 16 deletions source/isaaclab_newton/isaaclab_newton/physics/_cubric.py
Original file line number Diff line number Diff line change
Expand Up @@ -250,10 +250,9 @@ def initialize(self) -> bool:
def _verify_iadapter_version(fw_ptr: int, ia_ptr: int) -> bool:
"""Verify the acquired IAdapter is compatible with this shim's vtable offsets.

Major mismatches and older minors return False (CPU fallback). Higher
minors are accepted under the semver compatibility contract but emit a
loud warning, so any silent ABI break — the failure mode that motivated
this verification — gets flagged early rather than miscalled.
Only the exact version whose vtable and transform behavior have been
validated is accepted. Any mismatch returns False so the caller uses
the safe CPU hierarchy fallback.
"""
get_desc_addr = _read_u64(fw_ptr + _FW_OFF_GET_INTERFACE_PLUGIN_DESC)
if get_desc_addr == 0:
Expand Down Expand Up @@ -288,7 +287,7 @@ def _verify_iadapter_version(fw_ptr: int, ia_ptr: int) -> bool:
continue
major = ctypes.c_uint32.from_address(entry_addr + 8).value
minor = ctypes.c_uint32.from_address(entry_addr + 12).value
if major != _IA_EXPECTED_MAJOR or minor < _IA_EXPECTED_MINOR:
if not (major == _IA_EXPECTED_MAJOR and minor == _IA_EXPECTED_MINOR):
logger.warning(
"cubric IAdapter version incompatible with this shim: plugin "
"reports v%d.%d, shim is pinned to v%d.%d. Falling back to "
Expand All @@ -299,17 +298,6 @@ def _verify_iadapter_version(fw_ptr: int, ia_ptr: int) -> bool:
_IA_EXPECTED_MINOR,
)
return False
if minor > _IA_EXPECTED_MINOR:
logger.warning(
"cubric IAdapter minor version newer than this shim was validated "
"against: plugin reports v%d.%d, shim is pinned to v%d.%d. Proceeding "
"under semver minor-compatibility — if transforms misbehave, verify "
"the vtable layout against omni/cubric/IAdapter.h.",
major,
minor,
_IA_EXPECTED_MAJOR,
_IA_EXPECTED_MINOR,
)
return True

logger.warning(
Expand Down
Loading
Loading