Skip to content

[Newton] Add capture safety guards and fix WrenchComposer stale COM pose#4779

Merged
kellyguo11 merged 2 commits into
isaac-sim:dev/newtonfrom
hujc7:dev-newton-mig-wrench-composer
Mar 3, 2026
Merged

[Newton] Add capture safety guards and fix WrenchComposer stale COM pose#4779
kellyguo11 merged 2 commits into
isaac-sim:dev/newtonfrom
hujc7:dev-newton-mig-wrench-composer

Conversation

@hujc7

@hujc7 hujc7 commented Mar 1, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Add capture_unsafe decorator; guard 8 Tier 2 derived properties in ArticulationData and RigidObjectData to prevent silent stale reads during CUDA graph capture
  • Fix WrenchComposer caching body_com_pose_w at init (Tier 2, never refreshed); replace with Tier 1 body_link_pose_w + body_com_pos_b and inline COM pose in wrench kernels
  • Consolidate resolve_1d_mask into shared utility with capture guards; replace duplicated implementations in ArticulationData and ManagerBasedEnvWarp
  • Remove @warp_capturable(False) from event functions now that underlying write paths are capture-safe

Test plan

  • Run warp env sweep: env-ids=0,1,2,3,5,6,7,8,9,10,11,12,13,14 default=2
  • Verify no capture_unsafe RuntimeError during training (all warp MDP terms use Tier 1 data)
  • Verify is_global=True wrench path uses fresh COM poses (manual test)

- Add capture_unsafe decorator; guard 8 Tier 2 derived properties in
  ArticulationData and RigidObjectData to prevent silent stale reads
  during CUDA graph capture
- Fix WrenchComposer caching body_com_pose_w at init (Tier 2, never
  refreshed); replace with Tier 1 body_link_pose_w + body_com_pos_b
  and inline COM pose computation in wrench kernels
- Consolidate resolve_1d_mask into shared utility with capture guards;
  replace duplicated implementations in ArticulationData and
  ManagerBasedEnvWarp
- Remove @warp_capturable(False) from event functions now that the
  underlying write paths are capture-safe
@github-actions github-actions Bot added the isaac-lab Related to Isaac Lab team label Mar 1, 2026
@greptile-apps

greptile-apps Bot commented Mar 1, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR addresses two correctness issues in the Newton warp-first backend and introduces supporting infrastructure for CUDA graph capture safety.

Key changes:

  • WrenchComposer stale COM pose fix: Replaces the init-time cache of body_com_pose_w (a Tier 2 lazily-computed property that never refreshes after capture) with direct references to body_link_pose_w and body_com_pos_b (both stable Tier 1 sim-bind pointers). COM pose is now computed inline in the warp kernels via the new _com_pose_from_link helper, which is both correct in eager mode and safe during CUDA graph replay.
  • capture_unsafe decorator: New decorator in utils.py raises RuntimeError when any decorated callable is accessed during wp.get_device().is_capturing. Applied to 8 Tier 2 derived properties in ArticulationData and 6 in RigidObjectData, preventing silent stale reads during graph capture.
  • resolve_1d_mask consolidation: The duplicated mask-resolution logic (previously in manager_based_env_warp.py and WrenchComposer) is unified into a single shared utility with integrated capture guards and proper wp.array dtype validation.
  • Event function capture annotations: Removes @warp_capturable(False) from event functions since their underlying write paths now use Tier 1 sim-bind buffers throughout.
  • One issue found: In the new resolve_1d_mask, the CUDA capture guard checks ids is not None before the slice(None) normalization, meaning ids=slice(None) incorrectly raises a RuntimeError during capture even though it safely resolves to the stable all_mask pointer. See the inline comment for the suggested fix.

Confidence Score: 4/5

  • Safe to merge; the core correctness fixes are sound and the one identified bug is a minor edge-case in the new shared utility.
  • The stale COM pose fix is logically correct and the capture guard infrastructure is well-designed. The only issue is that resolve_1d_mask treats slice(None) as non-capturable when it should be equivalent to None, which could produce confusing errors for callers that pass slice(None) during capture. This is unlikely to surface in the current test suite but is a latent correctness gap in the new shared API.
  • source/isaaclab/isaaclab/utils/warp/utils.py — the resolve_1d_mask capture guard needs a one-line slice(None) normalization before the is_capturing check.

Important Files Changed

Filename Overview
source/isaaclab/isaaclab/utils/warp/kernels.py Adds _com_pose_from_link warp function and replaces the com_poses 2D array argument in both add_forces_and_torques_at_position and set_forces_and_torques_at_position with body_link_pose_w + body_com_pos_b, computing the COM pose inline. The math is correct: orientation is shared from the link frame, position is offset by rotating com_pos_b into world space.
source/isaaclab/isaaclab/utils/warp/utils.py Adds new shared resolve_1d_mask utility (consolidated from duplicated implementations) and capture_unsafe decorator. The resolve_1d_mask capture guard has a minor bug: slice(None) is not normalized before the ids is not None check, causing a spurious RuntimeError during capture even though slice(None) safely resolves to the stable all_mask pointer. The capture_unsafe decorator itself is correctly implemented.
source/isaaclab/isaaclab/utils/wrench_composer.py Correctly fixes the stale COM pose bug by caching body_link_pose_w (Tier 1 sim-bind pointer) and body_com_pos_b (static model buffer) at init instead of the lazily-computed body_com_pose_w. Passes both to the updated warp kernels for inline COM pose computation. Capture guards for non-warp inputs are properly placed.
source/isaaclab_newton/isaaclab_newton/assets/articulation/articulation_data.py Adds @capture_unsafe to 8 lazily-computed Tier 2 properties (root_link_vel_w, root_com_pose_w, body_link_vel_w, body_com_pose_w, projected_gravity_b, heading_w, root_link_vel_b, root_com_vel_b). Also consolidates resolve_env_mask / resolve_body_mask / resolve_joint_mask to use the new shared resolve_1d_mask. Decorator stacking (@property over @capture_unsafe) is correct.
source/isaaclab_newton/isaaclab_newton/assets/rigid_object/rigid_object_data.py Mirrors the articulation changes: @capture_unsafe applied to 6 Tier 2 derived properties. The body_link_pose_w and body_com_pos_b properties remain as plain Tier 1 sim-bind accessors (no capture guard), which is correct since they point to stable Newton state/model buffers.
source/isaaclab_experimental/isaaclab_experimental/envs/manager_based_env_warp.py Removes the duplicated _populate_mask_from_ids kernel and local resolve_1d_mask implementation, replacing them with the shared utility imported from isaaclab.utils.warp.utils. resolve_env_mask now delegates to the shared function. Clean consolidation with no behavioral change.
source/isaaclab_experimental/isaaclab_experimental/envs/mdp/events.py Removes @warp_capturable(False) annotations from event functions now that the underlying write paths (write_root_velocity_to_sim, set_external_force_and_torque) are capture-safe. Functions write directly into sim-bound warp buffers and call warp kernels — correct for captured graphs.
source/isaaclab_experimental/isaaclab_experimental/managers/observation_manager.py Adds a capture guard for history-buffered observation terms (circular buffer path is not capture-safe). The error message at line 530–534 now accurately describes the actual problem (circular buffer incompatibility), unlike the previous copy-paste error message.

Sequence Diagram

sequenceDiagram
    participant Caller
    participant WrenchComposer
    participant resolve_1d_mask
    participant WarpKernel as add_forces_and_torques_at_position
    participant _com_pose_from_link

    Caller->>WrenchComposer: add_forces_and_torques(forces, env_ids, ...)
    WrenchComposer->>resolve_1d_mask: ids=env_ids, all_mask, scratch_mask
    resolve_1d_mask-->>WrenchComposer: env_mask (wp.array[bool])
    WrenchComposer->>resolve_1d_mask: ids=body_ids, all_mask, scratch_mask
    resolve_1d_mask-->>WrenchComposer: body_mask (wp.array[bool])
    WrenchComposer->>WarpKernel: launch(env_mask, body_mask, forces, body_link_pose_w, body_com_pos_b, ...)
    note over WarpKernel: For each (env, body) where masks are True
    WarpKernel->>_com_pose_from_link: link_pose_w[env,body], com_pos_b[env,body]
    _com_pose_from_link-->>WarpKernel: com_pose_w (inline, no alloc)
    WarpKernel->>WarpKernel: cast force/torque to COM frame
    WarpKernel-->>WrenchComposer: composed_forces_b, composed_torques_b updated
Loading

Last reviewed commit: add76e8

@greptile-apps greptile-apps Bot left a comment

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.

8 files reviewed, 3 comments

Edit Code Review Agent Settings | Greptile

Comment on lines +529 to +533
if wp.get_device().is_capturing:
raise RuntimeError(
"ObservationManager.reset requires env_mask(wp.array[bool]) during capture. "
"Do not pass env_ids on captured paths."
)

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.

Incorrect error message in capture guard

The RuntimeError message here is copy-pasted from WrenchComposer.reset and does not accurately describe the actual failure. This code is inside the observation compute path (not ObservationManager.reset), and the problem is that the circular buffer itself is not capture-safe — it's unrelated to env_ids. A developer hitting this error would likely be confused about what to fix.

Suggested change
if wp.get_device().is_capturing:
raise RuntimeError(
"ObservationManager.reset requires env_mask(wp.array[bool]) during capture. "
"Do not pass env_ids on captured paths."
)
if wp.get_device().is_capturing:
raise RuntimeError(
"Observation terms with history (circular buffer) are not CUDA-graph-capture-safe. "
"Disable history for observation terms used inside a captured graph, or restructure "
"the graph to exclude history-buffered terms."
)

Comment on lines +306 to +309
elif isinstance(ids, wp.array):
if ids.shape[0] == 0:
return scratch_mask
ids_wp = ids

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.

Missing dtype validation for wp.array ids — regression from old implementation

When ids is a wp.array with a dtype other than wp.int32, the code assigns it to ids_wp without any type check and immediately passes it to _populate_mask_from_ids, which expects wp.array(dtype=wp.int32). Warp will then emit a low-level type-mismatch error at kernel launch instead of a helpful TypeError.

The previous implementation in manager_based_env_warp.py explicitly validated this:

if env_ids.dtype == wp.int32:
    ...
raise TypeError(
    f"Unsupported wp.array dtype for env_ids: {env_ids.dtype}. Expected wp.int32 indices or wp.bool mask."
)

This validation was lost during the consolidation. Consider adding it back:

Suggested change
elif isinstance(ids, wp.array):
if ids.shape[0] == 0:
return scratch_mask
ids_wp = ids
elif isinstance(ids, wp.array):
if ids.shape[0] == 0:
return scratch_mask
if ids.dtype != wp.int32:
raise TypeError(
f"Unsupported wp.array dtype for ids: {ids.dtype}. Expected wp.int32 index array."
)
ids_wp = ids

@hujc7

hujc7 commented Mar 2, 2026

Copy link
Copy Markdown
Collaborator Author

@greptileai Full review again.

Comment on lines +257 to +266
if wp.get_device().is_capturing:
# The only capturable path is
# 1. both ids and mask are None.
# 2. mask is a wp.array
# Note for case 1, the function needs to be consistently calling with both None to avoid launch problem as
# capture relies on fixed memory address of the input parameters.
if ids is not None or (mask is not None and not isinstance(mask, wp.array)):
raise RuntimeError(
"resolve_1d_mask is only capturable when mask is a wp.array or both ids and mask are None."
)

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.

slice(None) incorrectly rejected during CUDA graph capture

slice(None) is semantically identical to ids=None ("select all elements"), and the safe resolution for this path is to return all_mask — a stable warp array pointer that is capture-compatible. However, the capture guard fires first because slice(None) is not None evaluates to True, raising a RuntimeError even though no unsafe dynamic allocation would occur.

The normalization that handles this case correctly is on line 281:

if ids is None or (isinstance(ids, slice) and ids == slice(None)):
    return all_mask

…but it is unreachable during capture. To fix this, normalize slice(None) to None before the capture guard:

# Normalize slice(None) so the capture guard treats it identically to ids=None
if isinstance(ids, slice) and ids == slice(None):
    ids = None

if wp.get_device().is_capturing:
    if ids is not None or (mask is not None and not isinstance(mask, wp.array)):
        raise RuntimeError(
            "resolve_1d_mask is only capturable when mask is a wp.array or both ids and mask are None."
        )

Any caller that passes ids=slice(None) during a captured graph will currently get a spurious error and need to work around it by passing None instead — which may not be obvious.

@hujc7

hujc7 commented Mar 2, 2026

Copy link
Copy Markdown
Collaborator Author

1) Event fix VS baseline torch

Reward

Task Base R Event-fix R R gap Status
Isaac-Ant-Warp-v0 (0) 111.37 105.71 -5.1% ⚪ ok
Isaac-Cartpole-Warp-v0 (1) 4.94 4.93 -0.2% ⚪ ok
Isaac-Humanoid-Warp-v0 (2) 114.44 131.47 +14.9% ⚪ ok
Isaac-Reach-Franka-Warp-v0 (3) -0.09 0.44 n/a 🟢 better
Isaac-Velocity-Flat-Anymal-B-Warp-v0 (5) 26.28 26.88 +2.3% ⚪ ok
Isaac-Velocity-Flat-Anymal-C-Warp-v0 (6) 25.14 25.54 +1.6% ⚪ ok
Isaac-Velocity-Flat-Anymal-D-Warp-v0 (7) 23.91 24.64 +3.1% ⚪ ok
Isaac-Velocity-Flat-Cassie-Warp-v0 (8) -6.27 -6.33 n/a ⚪ ok
Isaac-Velocity-Flat-G1-Warp-v0 (9) 20.25 19.40 -4.2% ⚪ ok
Isaac-Velocity-Flat-G1-Warp-v1 (10) 1.68 8.13 * +383.9% 🟢 better (repeat avg)
Isaac-Velocity-Flat-H1-Warp-v0 (11) 25.29 29.70 +17.4% ⚪ ok
Isaac-Velocity-Flat-Unitree-A1-Warp-v0 (12) 38.81 40.40 +4.1% ⚪ ok
Isaac-Velocity-Flat-Unitree-Go1-Warp-v0 (13) 39.33 41.09 +4.5% ⚪ ok
Isaac-Velocity-Flat-Unitree-Go2-Warp-v0 (14) 39.71 40.55 +2.1% ⚪ ok

* env 10 uses repeat avg (r01-r03) from regress-test-env-10. The reward varies a lot thus not meaningful.

Time

Task Base env_step (us) Event-fix env_step (us) % change
Isaac-Ant-Warp-v0 (0) 12450.25 3972.74 -68.1%
Isaac-Cartpole-Warp-v0 (1) 9038.00 1376.80 -84.8%
Isaac-Humanoid-Warp-v0 (2) 20600.74 12707.48 -38.3%
Isaac-Reach-Franka-Warp-v0 (3) 12202.51 5558.44 -54.5%
Isaac-Velocity-Flat-Anymal-B-Warp-v0 (5) 38029.59 26378.65 -30.6%
Isaac-Velocity-Flat-Anymal-C-Warp-v0 (6) 37881.29 26119.93 -31.1%
Isaac-Velocity-Flat-Anymal-D-Warp-v0 (7) 39227.52 27471.33 -30.0%
Isaac-Velocity-Flat-Cassie-Warp-v0 (8) 22765.51 10393.77 -54.3%
Isaac-Velocity-Flat-G1-Warp-v0 (9) 39951.73 26537.53 -33.6%
Isaac-Velocity-Flat-G1-Warp-v1 (10) 55177.31 42444.48 * -23.1%
Isaac-Velocity-Flat-H1-Warp-v0 (11) 28866.51 16035.89 -44.5%
Isaac-Velocity-Flat-Unitree-A1-Warp-v0 (12) 20112.75 9431.94 -53.1%
Isaac-Velocity-Flat-Unitree-Go1-Warp-v0 (13) 20738.22 11042.20 -46.8%
Isaac-Velocity-Flat-Unitree-Go2-Warp-v0 (14) 18656.75 8744.70 -53.1%

2) Event fix VS without event fix

Reward

Task Without-fix R Event-fix R R gap Status
Isaac-Ant-Warp-v0 (0) 115.02 105.71 -8.1% ⚪ ok
Isaac-Cartpole-Warp-v0 (1) 4.93 4.93 +0.0% ⚪ ok
Isaac-Humanoid-Warp-v0 (2) 122.34 131.47 +7.5% ⚪ ok
Isaac-Reach-Franka-Warp-v0 (3) 0.32 0.44 +37.5% 🟢 better
Isaac-Velocity-Flat-Anymal-B-Warp-v0 (5) 26.84 26.88 +0.1% ⚪ ok
Isaac-Velocity-Flat-Anymal-C-Warp-v0 (6) 25.25 25.54 +1.1% ⚪ ok
Isaac-Velocity-Flat-Anymal-D-Warp-v0 (7) 24.46 24.64 +0.7% ⚪ ok
Isaac-Velocity-Flat-Cassie-Warp-v0 (8) -6.33 -6.33 -0.0% ⚪ ok
Isaac-Velocity-Flat-G1-Warp-v0 (9) 19.47 19.40 -0.4% ⚪ ok
Isaac-Velocity-Flat-G1-Warp-v1 (10) 1.81 8.13 * +349.2% 🟢 better (repeat avg)
Isaac-Velocity-Flat-H1-Warp-v0 (11) 31.15 29.70 -4.7% ⚪ ok
Isaac-Velocity-Flat-Unitree-A1-Warp-v0 (12) 40.33 40.40 +0.2% ⚪ ok
Isaac-Velocity-Flat-Unitree-Go1-Warp-v0 (13) 40.81 41.09 +0.7% ⚪ ok
Isaac-Velocity-Flat-Unitree-Go2-Warp-v0 (14) 40.52 40.55 +0.1% ⚪ ok

* env 10 uses repeat avg (r01-r03) from regress-test-env-10

Time

Task Without-fix env_step (us) Event-fix env_step (us) % change
Isaac-Ant-Warp-v0 (0) 4511.71 3972.74 -11.9%
Isaac-Cartpole-Warp-v0 (1) 1351.78 1376.80 +1.9%
Isaac-Humanoid-Warp-v0 (2) 12998.88 12707.48 -2.2%
Isaac-Reach-Franka-Warp-v0 (3) 6106.58 5558.44 -9.0%
Isaac-Velocity-Flat-Anymal-B-Warp-v0 (5) 27392.03 26378.65 -3.7%
Isaac-Velocity-Flat-Anymal-C-Warp-v0 (6) 27627.12 26119.93 -5.5%
Isaac-Velocity-Flat-Anymal-D-Warp-v0 (7) 27469.85 27471.33 +0.0%
Isaac-Velocity-Flat-Cassie-Warp-v0 (8) 10908.70 10393.77 -4.7%
Isaac-Velocity-Flat-G1-Warp-v0 (9) 27054.12 26537.53 -1.9%
Isaac-Velocity-Flat-G1-Warp-v1 (10) 43003.31 42444.48 * -1.3%
Isaac-Velocity-Flat-H1-Warp-v0 (11) 16307.55 16035.89 -1.7%
Isaac-Velocity-Flat-Unitree-A1-Warp-v0 (12) 10023.98 9431.94 -5.9%
Isaac-Velocity-Flat-Unitree-Go1-Warp-v0 (13) 11733.65 11042.20 -5.9%
Isaac-Velocity-Flat-Unitree-Go2-Warp-v0 (14) 9344.73 8744.70 -6.4%

@hujc7 hujc7 force-pushed the dev-newton-mig-wrench-composer branch from add76e8 to 387c52a Compare March 2, 2026 09:49
@hujc7

hujc7 commented Mar 2, 2026

Copy link
Copy Markdown
Collaborator Author

https://github.com/greptileai Full review again.

@kellyguo11

Copy link
Copy Markdown
Contributor

Looks awesome! + @AntoineRichard for viz on wrench composer changes

@kellyguo11 kellyguo11 merged commit cb8081e into isaac-sim:dev/newton Mar 3, 2026
5 of 11 checks passed
kellyguo11 added a commit that referenced this pull request Apr 25, 2026
…on (#4945)

## Summary

* Cherry-picks [Newton] Migrate more envs and mdps to warp
(#4690) onto develop
* Cherry-picks [Newton] Add capture safety guards and fix WrenchComposer
stale COM pose (#4779) onto
develop

### Changes included
- Warp-first MDP terms (observations, rewards, events, terminations,
actions) for manager-based envs
- Tested warp env configs: Ant, Humanoid, Cartpole, locomotion velocity
(A1, AnymalB/C/D, Cassie, G1, Go1/2, H1), Franka/UR10 reach
- ManagerCallSwitch max_mode cap and scene capture config
- MDP kernels made graph-capturable with consolidated test
infrastructure
- capture_unsafe safety guards on lazy-evaluated derived properties in
articulation/rigid_object data
- WrenchComposer fix: use fresh COM pose buffers instead of stale cached
link poses

### Dropped
- G1-29-DOF warp env (Isaac-Velocity-Flat-G1-Warp-v1): removed because
the stable g1_29_dofs task config does not exist on develop (only on
dev/newton). Warp env PRs should only add warp frontends for envs that
already exist in the stable package.

## Dependencies

Must be merged **after** these PRs (in order):
1. #4905 (merged)
2. #4829

## Validated base

Validated against develop at 7588fa9.

## Test plan

- [x] Run warp env training sweep across all manager-based env configs
(14/14 pass, mode=2, 4096 envs, 300 iters)
- [ ] Run test_mdp_warp_parity.py and test_mdp_warp_parity_new_terms.py
- [ ] Run test_action_warp_parity.py
- [ ] Verify WrenchComposer COM pose is fresh (not stale) during graph
replay

---------

Co-authored-by: Antoine Richard <antoiner@nvidia.com>
Co-authored-by: Kelly Guo <kellyg@nvidia.com>
matthewtrepte pushed a commit to matthewtrepte/IsaacLab that referenced this pull request Apr 26, 2026
…on (isaac-sim#4945)

## Summary

* Cherry-picks [Newton] Migrate more envs and mdps to warp
(isaac-sim#4690) onto develop
* Cherry-picks [Newton] Add capture safety guards and fix WrenchComposer
stale COM pose (isaac-sim#4779) onto
develop

### Changes included
- Warp-first MDP terms (observations, rewards, events, terminations,
actions) for manager-based envs
- Tested warp env configs: Ant, Humanoid, Cartpole, locomotion velocity
(A1, AnymalB/C/D, Cassie, G1, Go1/2, H1), Franka/UR10 reach
- ManagerCallSwitch max_mode cap and scene capture config
- MDP kernels made graph-capturable with consolidated test
infrastructure
- capture_unsafe safety guards on lazy-evaluated derived properties in
articulation/rigid_object data
- WrenchComposer fix: use fresh COM pose buffers instead of stale cached
link poses

### Dropped
- G1-29-DOF warp env (Isaac-Velocity-Flat-G1-Warp-v1): removed because
the stable g1_29_dofs task config does not exist on develop (only on
dev/newton). Warp env PRs should only add warp frontends for envs that
already exist in the stable package.

## Dependencies

Must be merged **after** these PRs (in order):
1. isaac-sim#4905 (merged)
2. isaac-sim#4829

## Validated base

Validated against develop at 7588fa9.

## Test plan

- [x] Run warp env training sweep across all manager-based env configs
(14/14 pass, mode=2, 4096 envs, 300 iters)
- [ ] Run test_mdp_warp_parity.py and test_mdp_warp_parity_new_terms.py
- [ ] Run test_action_warp_parity.py
- [ ] Verify WrenchComposer COM pose is fresh (not stale) during graph
replay

---------

Co-authored-by: Antoine Richard <antoiner@nvidia.com>
Co-authored-by: Kelly Guo <kellyg@nvidia.com>
mmichelis pushed a commit to mmichelis/IsaacLab that referenced this pull request Apr 29, 2026
…on (isaac-sim#4945)

## Summary

* Cherry-picks [Newton] Migrate more envs and mdps to warp
(isaac-sim#4690) onto develop
* Cherry-picks [Newton] Add capture safety guards and fix WrenchComposer
stale COM pose (isaac-sim#4779) onto
develop

### Changes included
- Warp-first MDP terms (observations, rewards, events, terminations,
actions) for manager-based envs
- Tested warp env configs: Ant, Humanoid, Cartpole, locomotion velocity
(A1, AnymalB/C/D, Cassie, G1, Go1/2, H1), Franka/UR10 reach
- ManagerCallSwitch max_mode cap and scene capture config
- MDP kernels made graph-capturable with consolidated test
infrastructure
- capture_unsafe safety guards on lazy-evaluated derived properties in
articulation/rigid_object data
- WrenchComposer fix: use fresh COM pose buffers instead of stale cached
link poses

### Dropped
- G1-29-DOF warp env (Isaac-Velocity-Flat-G1-Warp-v1): removed because
the stable g1_29_dofs task config does not exist on develop (only on
dev/newton). Warp env PRs should only add warp frontends for envs that
already exist in the stable package.

## Dependencies

Must be merged **after** these PRs (in order):
1. isaac-sim#4905 (merged)
2. isaac-sim#4829

## Validated base

Validated against develop at 7588fa9.

## Test plan

- [x] Run warp env training sweep across all manager-based env configs
(14/14 pass, mode=2, 4096 envs, 300 iters)
- [ ] Run test_mdp_warp_parity.py and test_mdp_warp_parity_new_terms.py
- [ ] Run test_action_warp_parity.py
- [ ] Verify WrenchComposer COM pose is fresh (not stale) during graph
replay

---------

Co-authored-by: Antoine Richard <antoiner@nvidia.com>
Co-authored-by: Kelly Guo <kellyg@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

isaac-lab Related to Isaac Lab team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants