Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
ce4db9c
Reset only masked environments in Newton and OVPhysX assets
hujc7 Sep 30, 2026
116e021
Forward the reset mask to every Warp scene entity
hujc7 Sep 30, 2026
88b1ba2
Write collection masks and reset ray-caster drift without host sync
hujc7 Sep 30, 2026
16ee932
Read history_order as a group setting in the Warp observation manager
hujc7 Sep 30, 2026
7949cb9
Write fixed tendon masks on Newton articulations without host sync
hujc7 Sep 30, 2026
12bd5a9
Make masked native-actuator and ray-caster resets capturable
hujc7 Sep 30, 2026
eb458ca
Write Newton tendon targets every step so captured commands apply
hujc7 Sep 30, 2026
b358e1a
Capture Warp frontend stages without an eager warm-up
hujc7 Sep 30, 2026
d0b411a
Reset Warp manager-based environments by mask
hujc7 Sep 30, 2026
d528675
Make stateful Warp event terms classes
hujc7 Sep 30, 2026
80cacc6
Test event capture through the recorded reset stage
hujc7 Sep 30, 2026
ca4eefb
Decide Warp stage capture per term
hujc7 Sep 30, 2026
eb61420
Drop the removed fixed-tendon mask conversion from the sync gate
hujc7 Sep 30, 2026
bf58395
Decide Warp term capturability from each term's parameters
hujc7 Sep 30, 2026
ab709eb
Let physics own decimation in the Warp environments
hujc7 Sep 30, 2026
3ac3db4
Store terminal observations in the Warp environments
hujc7 Sep 30, 2026
e6fcbba
Return copies of the logged values from the Warp environments
hujc7 Sep 30, 2026
a1743b7
Return copies of the reset log from the base Warp environment
hujc7 Sep 30, 2026
e70010e
Fix the Warp reorient twin's orientation error and object velocity
hujc7 Sep 30, 2026
b770700
Share the Warp reorient twin's success and reset paths with other hands
hujc7 Sep 30, 2026
910a0ba
Add a Warp twin of the direct Shadow Hand reorientation task
hujc7 Sep 30, 2026
12a3b4a
Merge remote-tracking branch 'upstream/develop' into jichuanh/warp-sc…
hujc7 Oct 1, 2026
adfd1ad
Merge branch 'jichuanh/warp-scene-mask-native' into jichuanh/warp-fro…
hujc7 Oct 1, 2026
dffcb05
Merge branch 'jichuanh/warp-frontend-cleanup' into jichuanh/task-clea…
hujc7 Oct 1, 2026
29b25ec
Merge remote-tracking branch 'upstream/develop' into jichuanh/warp-sc…
hujc7 Oct 1, 2026
2bb8e9e
Resolve adapter reset ids through preallocated masks
hujc7 Oct 1, 2026
edc61c8
Reset Isaac Lab actuator models from the environment mask
hujc7 Oct 1, 2026
e89284a
Reset surface grippers by index in the Warp scene
hujc7 Oct 1, 2026
8b2a161
Drop float from the fixed-tendon position limit type
hujc7 Oct 1, 2026
4fb4e01
Rename the fixed-tendon mask helper and move it beside its setters
hujc7 Oct 1, 2026
3c5e2de
Reuse the shared masked-copy kernel for tendon and link-pose writes
hujc7 Oct 1, 2026
ea94e20
Rename the collection body-mask resolver to _resolve_body_mask
hujc7 Oct 1, 2026
3f26cfa
Pass masks explicitly to actuator models, native actuators and delay …
hujc7 Oct 1, 2026
75de1d9
Forward env_mask through PhysX asset resets
hujc7 Oct 1, 2026
6ac6061
Share one per-environment Warp RNG state through WarpRng
hujc7 Oct 1, 2026
7966bba
Merge remote-tracking branch 'upstream/develop' into jichuanh/warp-sc…
hujc7 Oct 1, 2026
69c13a6
Point the Warp migration guide at WarpRng.state
hujc7 Oct 1, 2026
f846372
Allocate the scratch body mask in the Newton collection test helper
hujc7 Oct 1, 2026
11e36c4
Reset Multirotor thrusters and test actuator stubs from the environme…
hujc7 Oct 1, 2026
9328d98
Defer annotations in the seed module so the docs import it with Warp …
hujc7 Oct 1, 2026
e86c3c4
Merge remote-tracking branch 'upstream/develop' into jichuanh/warp-sc…
hujc7 Oct 1, 2026
e06ab39
Merge branch 'jichuanh/warp-scene-mask-native' into jichuanh/warp-fro…
hujc7 Oct 2, 2026
ee9e8ad
Record Warp stages per call and step the Warp environments like stable
hujc7 Oct 2, 2026
5ad9281
Merge remote-tracking branch 'upstream/develop' into jichuanh/warp-fr…
hujc7 Oct 2, 2026
e32bf45
Merge branch 'jichuanh/warp-frontend-cleanup' into jichuanh/task-clea…
hujc7 Oct 4, 2026
e35945b
Merge remote-tracking branch 'upstream/develop' into jichuanh/warp-sc…
hujc7 Oct 4, 2026
0c8af1d
Merge branch 'jichuanh/warp-scene-mask-native' into jichuanh/warp-fro…
hujc7 Oct 4, 2026
9114bd3
Merge branch 'jichuanh/warp-frontend-cleanup' into jichuanh/task-clea…
hujc7 Oct 4, 2026
e9535c6
Merge remote-tracking branch 'upstream/main' into jichuanh/warp-scene…
hujc7 Oct 20, 2026
326f33a
Merge branch 'jichuanh/warp-scene-mask-native' into jichuanh/warp-fro…
hujc7 Oct 20, 2026
0fb7300
Reach the physics backend through the simulation's backend manager in…
hujc7 Oct 20, 2026
87eadc6
Merge branch 'jichuanh/warp-frontend-cleanup' into jichuanh/task-clea…
hujc7 Oct 20, 2026
f6d31ca
Drop the history_order changelog entry that main already ships
hujc7 Oct 20, 2026
e368b31
Merge branch 'jichuanh/warp-frontend-cleanup' into jichuanh/task-clea…
hujc7 Oct 20, 2026
eb283d9
Merge branch 'jichuanh/warp-scene-mask-native' into jichuanh/warp-fro…
hujc7 Oct 20, 2026
ed3463d
Follow the hand with the Warp reorient goal marker when no fixed posi…
hujc7 Oct 20, 2026
dbb3b12
Merge remote-tracking branch 'upstream/main' into jichuanh/warp-scene…
hujc7 Oct 22, 2026
2030fe3
Move the shared WarpRng state out of this pull request
hujc7 Oct 22, 2026
3ddcf7e
Share one per-environment Warp RNG state through WarpRng
hujc7 Oct 22, 2026
5f1321c
Merge branch 'jichuanh/warp-rng-shared' into jichuanh/warp-frontend-c…
hujc7 Oct 22, 2026
31dbbac
Merge commit '5f1321c61bea825ef67181d7472d952ffeb89337' into jichuanh…
hujc7 Oct 22, 2026
5676dd1
Add resolve_ids next to resolve_1d_mask as the shared id and mask hel…
hujc7 Oct 26, 2026
97e5662
Resolve sensor, camera and wrench composer selections through the sha…
hujc7 Oct 26, 2026
92590d0
Fix the deformable mask writers that raised on any env mask
hujc7 Oct 26, 2026
f044c92
Resolve Newton selections through the shared helpers and write its ma…
hujc7 Oct 26, 2026
7b48c38
Resolve OVPhysX selections through the shared helpers
hujc7 Oct 26, 2026
3d3661f
Resolve PhysX selections through the shared helpers
hujc7 Oct 26, 2026
b455d35
Merge jichuanh/id-mask (#8821) into jichuanh/warp-scene-mask-native
hujc7 Oct 26, 2026
a9f7c50
Merge remote-tracking branch 'upstream/main' into jichuanh/warp-scene…
hujc7 Oct 26, 2026
3846f49
Merge branch 'jichuanh/warp-scene-mask-native' into jichuanh/warp-rng…
hujc7 Oct 26, 2026
009c820
Merge branch 'jichuanh/warp-rng-shared' into jichuanh/warp-frontend-c…
hujc7 Oct 26, 2026
799326f
Merge branch 'jichuanh/warp-frontend-cleanup' into jichuanh/task-clea…
hujc7 Oct 26, 2026
6c31123
Write Newton tendon targets behind the host flag again
hujc7 Oct 26, 2026
fdd4f5e
Merge branch 'jichuanh/warp-scene-mask-native' into jichuanh/warp-rng…
hujc7 Oct 26, 2026
121ed8a
Merge branch 'jichuanh/warp-rng-shared' into jichuanh/warp-frontend-c…
hujc7 Oct 26, 2026
7882192
Merge branch 'jichuanh/warp-frontend-cleanup' into jichuanh/task-clea…
hujc7 Oct 26, 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
2 changes: 1 addition & 1 deletion docs/source/_static/css/environment-browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
["Isaac-Reach-UR10", "rl_games,rsl_rl,skrl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "", "environment-previews/ur10_reach.jpg", true, {}, {}, "", null, ["||", "isaacsim_physx||", "newton_mjwarp||", "ovphysx||"]],
["Isaac-Reorient-Cube-Allegro-Direct", "rl_games,rsl_rl,skrl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "", "environment-previews/allegro_cube.jpg", true, {}, {}, "", null, ["||", "isaacsim_physx||", "newton_mjwarp||", "ovphysx||"]],
["Isaac-Reorient-Cube-Allegro", "rl_games,rsl_rl,skrl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "randomized,reset_only", "environment-previews/allegro_cube.jpg", false, {"*": ["reset_only"]}, {}, "", null, ["||", "||randomized", "||reset_only", "isaacsim_physx||", "isaacsim_physx||randomized", "isaacsim_physx||reset_only", "newton_mjwarp||", "newton_mjwarp||randomized", "newton_mjwarp||reset_only", "ovphysx||", "ovphysx||randomized", "ovphysx||reset_only"]],
["Isaac-Reorient-Cube-Shadow-Direct", "rl_games,rsl_rl,skrl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "", "environment-previews/shadow_cube.jpg", false, {}, {}, "", null, ["||", "isaacsim_physx||", "newton_mjwarp||", "ovphysx||"]],
["Isaac-Reorient-Cube-Shadow-Direct", "rl_games,rsl_rl,skrl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "", "environment-previews/shadow_cube.jpg", true, {}, {}, "", null, ["||", "isaacsim_physx||", "newton_mjwarp||", "ovphysx||"]],
["Isaac-Reorient-Cube-Shadow", "rl_games,rsl_rl,skrl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "asymmetric,randomized", "environment-previews/shadow_cube.jpg", false, {}, {}, "", null, ["||", "||asymmetric", "||randomized", "isaacsim_physx||", "isaacsim_physx||asymmetric", "isaacsim_physx||randomized", "newton_mjwarp||", "newton_mjwarp||asymmetric", "newton_mjwarp||randomized", "ovphysx||", "ovphysx||asymmetric", "ovphysx||randomized"]],
["Isaac-Reorient-Cube-Shadow-Camera-Direct", "rl_games,rsl_rl", "isaacsim_physx,newton_mjwarp,ovphysx", "isaacsim_rtx,newton_renderer,ovrtx", "albedo,full,rgb,semantic_segmentation,simple_shading_constant_diffuse,simple_shading_diffuse_mdl,simple_shading_full_mdl", "tasks/manipulation/shadow_cube.jpg", false, {"*": ["full"]}, {}, "", null, ["||", "||albedo", "||full", "||rgb", "||semantic_segmentation", "|isaacsim_rtx|", "|isaacsim_rtx|albedo", "|isaacsim_rtx|full", "|isaacsim_rtx|rgb", "|isaacsim_rtx|semantic_segmentation", "|isaacsim_rtx|simple_shading_constant_diffuse", "|isaacsim_rtx|simple_shading_diffuse_mdl", "|isaacsim_rtx|simple_shading_full_mdl", "|newton_renderer|", "|newton_renderer|albedo", "|newton_renderer|full", "|newton_renderer|rgb", "|newton_renderer|semantic_segmentation", "|ovrtx|", "|ovrtx|albedo", "|ovrtx|full", "|ovrtx|rgb", "|ovrtx|semantic_segmentation", "|ovrtx|simple_shading_constant_diffuse", "|ovrtx|simple_shading_diffuse_mdl", "|ovrtx|simple_shading_full_mdl", "isaacsim_physx||", "isaacsim_physx||albedo", "isaacsim_physx||full", "isaacsim_physx||rgb", "isaacsim_physx||semantic_segmentation", "isaacsim_physx|isaacsim_rtx|", "isaacsim_physx|isaacsim_rtx|albedo", "isaacsim_physx|isaacsim_rtx|full", "isaacsim_physx|isaacsim_rtx|rgb", "isaacsim_physx|isaacsim_rtx|semantic_segmentation", "isaacsim_physx|isaacsim_rtx|simple_shading_constant_diffuse", "isaacsim_physx|isaacsim_rtx|simple_shading_diffuse_mdl", "isaacsim_physx|isaacsim_rtx|simple_shading_full_mdl", "isaacsim_physx|newton_renderer|", "isaacsim_physx|newton_renderer|albedo", "isaacsim_physx|newton_renderer|full", "isaacsim_physx|newton_renderer|rgb", "isaacsim_physx|newton_renderer|semantic_segmentation", "newton_mjwarp||", "newton_mjwarp||albedo", "newton_mjwarp||full", "newton_mjwarp||rgb", "newton_mjwarp||semantic_segmentation", "newton_mjwarp|isaacsim_rtx|", "newton_mjwarp|isaacsim_rtx|albedo", "newton_mjwarp|isaacsim_rtx|full", "newton_mjwarp|isaacsim_rtx|rgb", "newton_mjwarp|isaacsim_rtx|semantic_segmentation", "newton_mjwarp|isaacsim_rtx|simple_shading_constant_diffuse", "newton_mjwarp|isaacsim_rtx|simple_shading_diffuse_mdl", "newton_mjwarp|isaacsim_rtx|simple_shading_full_mdl", "newton_mjwarp|newton_renderer|", "newton_mjwarp|newton_renderer|albedo", "newton_mjwarp|newton_renderer|full", "newton_mjwarp|newton_renderer|rgb", "newton_mjwarp|newton_renderer|semantic_segmentation", "newton_mjwarp|ovrtx|", "newton_mjwarp|ovrtx|albedo", "newton_mjwarp|ovrtx|full", "newton_mjwarp|ovrtx|rgb", "newton_mjwarp|ovrtx|semantic_segmentation", "newton_mjwarp|ovrtx|simple_shading_constant_diffuse", "newton_mjwarp|ovrtx|simple_shading_diffuse_mdl", "newton_mjwarp|ovrtx|simple_shading_full_mdl", "ovphysx||", "ovphysx||albedo", "ovphysx||full", "ovphysx||rgb", "ovphysx||semantic_segmentation", "ovphysx|newton_renderer|", "ovphysx|newton_renderer|albedo", "ovphysx|newton_renderer|full", "ovphysx|newton_renderer|rgb", "ovphysx|newton_renderer|semantic_segmentation", "ovphysx|ovrtx|", "ovphysx|ovrtx|albedo", "ovphysx|ovrtx|full", "ovphysx|ovrtx|rgb", "ovphysx|ovrtx|semantic_segmentation", "ovphysx|ovrtx|simple_shading_constant_diffuse", "ovphysx|ovrtx|simple_shading_diffuse_mdl", "ovphysx|ovrtx|simple_shading_full_mdl"]],
["Isaac-Reorient-Cube-Shadow-Camera", "rl_games,rsl_rl", "isaacsim_physx,newton_mjwarp,ovphysx", "isaacsim_rtx,newton_renderer,ovrtx", "albedo,full,randomized,rgb,semantic_segmentation,simple_shading_constant_diffuse,simple_shading_diffuse_mdl,simple_shading_full_mdl", "tasks/manipulation/shadow_cube.jpg", false, {"*": ["full"]}, {}, "", null, ["||", "||albedo", "||full", "||randomized", "||rgb", "||semantic_segmentation", "|isaacsim_rtx|", "|isaacsim_rtx|albedo", "|isaacsim_rtx|full", "|isaacsim_rtx|randomized", "|isaacsim_rtx|rgb", "|isaacsim_rtx|semantic_segmentation", "|isaacsim_rtx|simple_shading_constant_diffuse", "|isaacsim_rtx|simple_shading_diffuse_mdl", "|isaacsim_rtx|simple_shading_full_mdl", "|newton_renderer|", "|newton_renderer|albedo", "|newton_renderer|full", "|newton_renderer|randomized", "|newton_renderer|rgb", "|newton_renderer|semantic_segmentation", "|ovrtx|", "|ovrtx|albedo", "|ovrtx|full", "|ovrtx|randomized", "|ovrtx|rgb", "|ovrtx|semantic_segmentation", "|ovrtx|simple_shading_constant_diffuse", "|ovrtx|simple_shading_diffuse_mdl", "|ovrtx|simple_shading_full_mdl", "isaacsim_physx||", "isaacsim_physx||albedo", "isaacsim_physx||full", "isaacsim_physx||randomized", "isaacsim_physx||rgb", "isaacsim_physx||semantic_segmentation", "isaacsim_physx|isaacsim_rtx|", "isaacsim_physx|isaacsim_rtx|albedo", "isaacsim_physx|isaacsim_rtx|full", "isaacsim_physx|isaacsim_rtx|randomized", "isaacsim_physx|isaacsim_rtx|rgb", "isaacsim_physx|isaacsim_rtx|semantic_segmentation", "isaacsim_physx|isaacsim_rtx|simple_shading_constant_diffuse", "isaacsim_physx|isaacsim_rtx|simple_shading_diffuse_mdl", "isaacsim_physx|isaacsim_rtx|simple_shading_full_mdl", "isaacsim_physx|newton_renderer|", "isaacsim_physx|newton_renderer|albedo", "isaacsim_physx|newton_renderer|full", "isaacsim_physx|newton_renderer|randomized", "isaacsim_physx|newton_renderer|rgb", "isaacsim_physx|newton_renderer|semantic_segmentation", "newton_mjwarp||", "newton_mjwarp||albedo", "newton_mjwarp||full", "newton_mjwarp||randomized", "newton_mjwarp||rgb", "newton_mjwarp||semantic_segmentation", "newton_mjwarp|isaacsim_rtx|", "newton_mjwarp|isaacsim_rtx|albedo", "newton_mjwarp|isaacsim_rtx|full", "newton_mjwarp|isaacsim_rtx|randomized", "newton_mjwarp|isaacsim_rtx|rgb", "newton_mjwarp|isaacsim_rtx|semantic_segmentation", "newton_mjwarp|isaacsim_rtx|simple_shading_constant_diffuse", "newton_mjwarp|isaacsim_rtx|simple_shading_diffuse_mdl", "newton_mjwarp|isaacsim_rtx|simple_shading_full_mdl", "newton_mjwarp|newton_renderer|", "newton_mjwarp|newton_renderer|albedo", "newton_mjwarp|newton_renderer|full", "newton_mjwarp|newton_renderer|randomized", "newton_mjwarp|newton_renderer|rgb", "newton_mjwarp|newton_renderer|semantic_segmentation", "newton_mjwarp|ovrtx|", "newton_mjwarp|ovrtx|albedo", "newton_mjwarp|ovrtx|full", "newton_mjwarp|ovrtx|randomized", "newton_mjwarp|ovrtx|rgb", "newton_mjwarp|ovrtx|semantic_segmentation", "newton_mjwarp|ovrtx|simple_shading_constant_diffuse", "newton_mjwarp|ovrtx|simple_shading_diffuse_mdl", "newton_mjwarp|ovrtx|simple_shading_full_mdl", "ovphysx||", "ovphysx||albedo", "ovphysx||full", "ovphysx||randomized", "ovphysx||rgb", "ovphysx||semantic_segmentation", "ovphysx|newton_renderer|", "ovphysx|newton_renderer|albedo", "ovphysx|newton_renderer|full", "ovphysx|newton_renderer|randomized", "ovphysx|newton_renderer|rgb", "ovphysx|newton_renderer|semantic_segmentation", "ovphysx|ovrtx|", "ovphysx|ovrtx|albedo", "ovphysx|ovrtx|full", "ovphysx|ovrtx|randomized", "ovphysx|ovrtx|rgb", "ovphysx|ovrtx|semantic_segmentation", "ovphysx|ovrtx|simple_shading_constant_diffuse", "ovphysx|ovrtx|simple_shading_diffuse_mdl", "ovphysx|ovrtx|simple_shading_full_mdl"]],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,13 @@ The following classes are part of the public :mod:`isaaclab_experimental.utils`
.. autosummary::
:nosignatures:

ManagerCallMode
ManagerCallSwitch
WarpGraphCache
CapturedStage
captured
eager

.. autoclass:: ManagerCallMode
.. autoclass:: CapturedStage
:show-inheritance:

.. autoclass:: ManagerCallSwitch
:show-inheritance:
.. autofunction:: captured

.. autoclass:: WarpGraphCache
:show-inheritance:
.. autofunction:: eager
4 changes: 3 additions & 1 deletion docs/source/concepts/warp_environments.rst
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ implementation:
- ``Isaac-Ant-Direct`` — Ant locomotion
- ``Isaac-Humanoid-Direct`` — Humanoid locomotion
- ``Isaac-Reorient-Cube-Allegro-Direct`` — Allegro hand cube reorient
- ``Isaac-Reorient-Cube-Shadow-Direct`` — Shadow hand cube reorient


Manager-Based Warp Execution (``--frontend warp``)
Expand Down Expand Up @@ -493,7 +494,8 @@ checks the mask to skip non-selected environments:
return
# ... modify state for selected envs only

- RNG uses per-env ``env.rng_state_wp`` (``wp.uint32``) instead of ``torch.rand``
- RNG uses the per-env :attr:`WarpRng.state <isaaclab.utils.seed.WarpRng.state>` (``wp.uint32``) instead of
``torch.rand``
- **Startup/prestartup** events use the torch convention ``(env, env_ids, **params)``
- **Reset/interval** events use the warp convention ``(env, env_mask, **params)``

Expand Down
2 changes: 2 additions & 0 deletions source/isaaclab/changelog.d/jichuanh-id-mask.added.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* Added :func:`~isaaclab.utils.warp.utils.resolve_ids`, which resolves an index selection given as ids or as a
boolean mask to ids on a device, as :func:`~isaaclab.utils.warp.utils.resolve_1d_mask` does to a mask.
11 changes: 11 additions & 0 deletions source/isaaclab/changelog.d/jichuanh-id-mask.changed.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
* Changed the env selection helpers of :class:`~isaaclab.utils.wrench_composer.WrenchComposer`,
:class:`~isaaclab.sensors.SensorBase` and :class:`~isaaclab.sensors.Camera` to resolve ``env_ids`` and ``env_mask``
through :func:`~isaaclab.utils.warp.utils.resolve_ids` and :func:`~isaaclab.utils.warp.utils.resolve_1d_mask`.
Any integer sequence and slices with a negative step are accepted, ids on another device are moved to the owner's
device, and a :class:`~isaaclab.utils.warp.ProxyArray` is rejected with a :class:`TypeError`.
* Changed :class:`~isaaclab.utils.wrench_composer.WrenchComposer` to resolve ``body_ids`` through
:func:`~isaaclab.utils.warp.utils.resolve_ids` as well, so slices other than ``slice(None)`` are accepted.
* Changed :func:`~isaaclab.utils.warp.utils.resolve_1d_mask` to make ``scratch_mask`` optional for callers that never
pass ids. Ids without a ``scratch_mask`` raise a :class:`ValueError`.
* Changed :func:`~isaaclab.utils.warp.utils.resolve_1d_mask` to copy a Warp mask on another device to ``device``, and
to accept a boolean torch mask on ``device`` inside a CUDA graph capture.
2 changes: 2 additions & 0 deletions source/isaaclab/changelog.d/jichuanh-id-mask.fixed.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* Fixed the ``write_nodal_*_to_sim_mask`` methods of :class:`~isaaclab.assets.BaseDeformableObject`, which the
OVPhysX deformable object inherits, raising a :class:`RuntimeError` whenever ``env_mask`` was given.
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
* Added :class:`~isaaclab.utils.seed.WarpRng`, the per-environment Warp random number generator state that
environments and sensors share, one per process. :func:`~isaaclab.utils.seed.configure_seed` reseeds it in place,
and environments call :meth:`~isaaclab.utils.seed.WarpRng.initialize` at construction.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* Changed masked :meth:`~isaaclab.sensors.ray_caster.BaseRayCaster.reset` to draw its drift from the shared
:class:`~isaaclab.utils.seed.WarpRng` state instead of random states of its own.
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
* Added ``env_mask`` to :meth:`~isaaclab.actuators.ActuatorCollection.reset` and
:meth:`~isaaclab.actuators.ActuatorControl.reset_native_actuators`. Isaac Lab actuator models and backend-native
actuator state reset only the masked environments from the mask itself, without converting it to indices.
* Added ``batch_mask`` to :meth:`~isaaclab.utils.buffers.DelayBuffer.set_time_lag` and
:meth:`~isaaclab.utils.buffers.DelayBuffer.reset`, which select batches on the device without synchronizing the
host. Tensor lags set through a mask are full-sized and are not range-checked.
* Added ``env_mask`` to :meth:`~isaaclab.assets.BaseCableObject.reset`, matching the other scene assets.
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
* Changed masked :meth:`~isaaclab.sensors.ray_caster.BaseRayCaster.reset` to resample drift in a Warp kernel from
per-environment random states seeded from torch's global generator, so it neither synchronizes the host nor
allocates and can be captured in a CUDA graph. When both ``env_ids`` and ``env_mask`` are given, the mask selects
the resampled environments, matching :meth:`~isaaclab.sensors.SensorBase.reset`.
* Changed :meth:`~isaaclab.actuators.newton.NewtonActuatorAdapter.reset` to reuse preallocated per-DOF masks, so
masked resets of Newton-native actuator state do not allocate and can be captured in a CUDA graph.
* **Breaking:** Changed :meth:`~isaaclab.actuators.ActuatorBase.reset` to take an ``env_mask`` argument, the
boolean mask of the environments to reset that masked resets pass instead of indices. Custom actuator models must
accept ``env_mask`` and reset from it without synchronizing the host, for example through
:func:`~isaaclab.utils.array.index_fill_` or :func:`torch.where`.
* Changed :class:`~isaaclab.actuators.DelayedPDActuator` to raise :class:`ValueError` at construction unless
``0 <= min_delay <= max_delay``, instead of at a reset, because masked resets apply the sampled delays without
checking them on the host.
* Changed the ``limit`` annotation of
:meth:`~isaaclab.assets.BaseArticulation.set_fixed_tendon_position_limit_index` and
:meth:`~isaaclab.assets.BaseArticulation.set_fixed_tendon_position_limit_mask` to exclude ``float``, matching the
backends, which raise :class:`ValueError` for a float because it cannot hold both bounds.
Empty file.
10 changes: 8 additions & 2 deletions source/isaaclab/isaaclab/actuators/actuator_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,11 +279,17 @@ def joint_indices(self) -> slice | torch.Tensor:
"""

@abstractmethod
def reset(self, env_ids: Sequence[int]):
def reset(self, env_ids: Sequence[int] | slice | None = None, env_mask: torch.Tensor | None = None):
"""Reset the internals within the group.

.. caution::
If both ``env_ids`` and ``env_mask`` are provided, ``env_mask`` takes precedence.

Args:
env_ids: List of environment IDs to reset.
env_ids: Environment indices or a slice selecting the environments to reset. None resets all
environments.
env_mask: Boolean mask of the environments to reset. Shape is (num_envs,). Implementations reset from it
without synchronizing the host, for example through :func:`~isaaclab.utils.array.index_fill_`.
"""
raise NotImplementedError

Expand Down
15 changes: 12 additions & 3 deletions source/isaaclab/isaaclab/actuators/actuator_collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,18 +180,27 @@ def applied_effort(self) -> ProxyArray:

# Lifecycle.

def reset(self, env_ids: Sequence[int] | slice | None = None) -> None:
def reset(self, env_ids: Sequence[int] | slice | None = None, env_mask: wp.array | None = None) -> None:
"""Reset all actuator group states.

Isaac Lab actuator models receive the mask as a zero-copy boolean tensor through the ``env_mask``
argument of :meth:`~isaaclab.actuators.ActuatorBase.reset`. Backend-native actuator state resets from
the mask directly.

.. caution::
If both ``env_ids`` and ``env_mask`` are provided, ``env_mask`` takes precedence.

Args:
env_ids: Environment indices to reset. Defaults to all environments.
env_mask: Environment mask. Shape is (num_instances,). Defaults to None.
"""
group_env_ids = self._control._normalize_index_sequence(env_ids)
group_env_mask = None if env_mask is None else wp.to_torch(env_mask)
for actuator in self._groups.values():
# Newton-executed groups are reset through the backend below.
if isinstance(actuator, ActuatorBase):
actuator.reset(group_env_ids)
self._control.reset_native_actuators(slice(None) if group_env_ids is None else group_env_ids)
actuator.reset(group_env_ids, env_mask=group_env_mask)
self._control.reset_native_actuators(slice(None) if group_env_ids is None else group_env_ids, env_mask)

def compute(self, dt: float = 0.0) -> None:
"""Compute processed actuator commands and telemetry.
Expand Down
6 changes: 5 additions & 1 deletion source/isaaclab/isaaclab/actuators/actuator_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -307,11 +307,15 @@ def submit_commands(self, collection: ActuatorCollection) -> None:
"""
raise NotImplementedError

def reset_native_actuators(self, env_ids: Sequence[int] | slice) -> None:
def reset_native_actuators(self, env_ids: Sequence[int] | slice, env_mask: wp.array | None = None) -> None:
"""Reset backend-native actuator state.

.. caution::
If both ``env_ids`` and ``env_mask`` are provided, ``env_mask`` takes precedence.

Args:
env_ids: Environments to reset.
env_mask: Environment mask. Shape is (num_instances,). Defaults to None.
"""


Expand Down
14 changes: 8 additions & 6 deletions source/isaaclab/isaaclab/actuators/actuator_net.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,12 @@ def __init__(self, cfg: ActuatorNetLSTMCfg, *args, **kwargs):
Operations.
"""

def reset(self, env_ids: Sequence[int]):
def reset(self, env_ids: Sequence[int] | None = None, env_mask: torch.Tensor | None = None):
# reset the hidden and cell states for the specified environments
selection = env_ids if env_mask is None else env_mask
with torch.no_grad():
index_fill_(self.sea_hidden_state_per_env, env_ids, 0.0, dim=1)
index_fill_(self.sea_cell_state_per_env, env_ids, 0.0, dim=1)
index_fill_(self.sea_hidden_state_per_env, selection, 0.0, dim=1)
index_fill_(self.sea_cell_state_per_env, selection, 0.0, dim=1)

def compute(
self, control_action: ArticulationActions, joint_pos: torch.Tensor, joint_vel: torch.Tensor
Expand Down Expand Up @@ -138,10 +139,11 @@ def __init__(self, cfg: ActuatorNetMLPCfg, *args, **kwargs):
Operations.
"""

def reset(self, env_ids: Sequence[int]):
def reset(self, env_ids: Sequence[int] | None = None, env_mask: torch.Tensor | None = None):
# reset the history for the specified environments
index_fill_(self._joint_pos_error_history, env_ids, 0.0)
index_fill_(self._joint_vel_history, env_ids, 0.0)
selection = env_ids if env_mask is None else env_mask
index_fill_(self._joint_pos_error_history, selection, 0.0)
index_fill_(self._joint_vel_history, selection, 0.0)

def compute(
self, control_action: ArticulationActions, joint_pos: torch.Tensor, joint_vel: torch.Tensor
Expand Down
Loading
Loading