Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
156 commits
Select commit Hold shift + click to select a range
3795b51
Add renderer leases and the OVXR host adapter
hougantc-nvda Oct 30, 2026
a0cedbc
Add live and recorded OVXR teleoperation
hougantc-nvda Oct 30, 2026
b18f214
Enable G1 and GR1T2 tasks with kitless XR
hougantc-nvda Oct 30, 2026
614c319
Limit changes to the kitless feature scope
hougantc-nvda Oct 31, 2026
9449c38
Carry scoped cleanup through the kitless stack
hougantc-nvda Oct 31, 2026
fa0c2f7
Carry scoped cleanup through the kitless stack
hougantc-nvda Oct 31, 2026
804868f
Defer partition-visibility export change to its consumer
hougantc-nvda Oct 31, 2026
7b3e5b3
Keep poisoned render leases retirable
hougantc-nvda Oct 31, 2026
2342d8f
Split OVXR config and type the anchor contract
hougantc-nvda Oct 31, 2026
f2aa1ce
Merge fixed #8787 layer into #8788
hougantc-nvda Oct 31, 2026
da73ee7
Keep unset task physics on the simulation default
hougantc-nvda Oct 31, 2026
8fe1bce
Apply stack grasp contact tuning on SO101 OvPhysX
hougantc-nvda Oct 31, 2026
f6b3c79
Complete 8788 changelog and test conventions
hougantc-nvda Oct 31, 2026
0fe11e9
Merge fixed #8788 layer into #8789
hougantc-nvda Oct 31, 2026
855ac4e
Re-seed G1 wrist ramp after auto-resets
hougantc-nvda Oct 31, 2026
ed9888e
Share GR1T2 kitless OvPhysX preparation
hougantc-nvda Oct 31, 2026
472daae
Check teleop task paths against the spawned assets
hougantc-nvda Oct 31, 2026
4fe2ad1
Keep humanoid Mimic tasks on Isaac Sim PhysX
hougantc-nvda Oct 31, 2026
92450db
Complete 8789 changelog, docs and test order
hougantc-nvda Oct 31, 2026
2551f65
Mock Isaac Capture for the OVXR session API docs
hougantc-nvda Oct 31, 2026
bef60fa
Run OVXR config tests without Isaac Capture
hougantc-nvda Oct 31, 2026
48d1297
Document that OVRTX material sync requires CUDA
hougantc-nvda Oct 31, 2026
a02fbf4
Validate the OVXR environment count and device before the claim
hougantc-nvda Oct 31, 2026
8776b78
Require the claimed owner transfer before binding the OVXR Stage
hougantc-nvda Oct 31, 2026
ab024b5
Drop the XrAnchorManager claim from the anchor protocol docstring
hougantc-nvda Oct 31, 2026
00ee188
Sort imports in the OVXR adapter test
hougantc-nvda Oct 31, 2026
dd77126
Merge fixed #8787 review follow-ups into #8788
hougantc-nvda Oct 31, 2026
e6cdb59
Point the OVXR unset-physics error at --xr instead of a selector
hougantc-nvda Oct 31, 2026
40eb1df
Drive the real live loop in the rejected OVXR frame test
hougantc-nvda Oct 31, 2026
f28a853
Describe the OvPhysX contact settings against the PhysxSceneAPI schema
hougantc-nvda Oct 31, 2026
1baae4d
Run the OvPhysX contact settings test on one device
hougantc-nvda Oct 31, 2026
9ac5284
Skip the SO101 pipeline test when Capture lacks cache execution
hougantc-nvda Oct 31, 2026
49e9feb
Compare the SO101 OvPhysX tuning with its Isaac Sim PhysX preset
hougantc-nvda Oct 31, 2026
1812334
Clarify the SO101 reset and empty Warp array changelog entries
hougantc-nvda Oct 31, 2026
b44dc09
Name XrAnchorManager as the anchor protocol implementation
hougantc-nvda Oct 31, 2026
fc02a4c
Skip live OVXR loop tests without Capture OVXR session support
hougantc-nvda Oct 31, 2026
963adc2
Skip the OVXR task-ordering test without OVRTX
hougantc-nvda Oct 31, 2026
3bb567b
Merge fixed #8788 review follow-ups into #8789
hougantc-nvda Oct 31, 2026
f39bc37
Describe the Mimic PhysX pin as a change
hougantc-nvda Oct 31, 2026
429c6fb
Keep the G1 locomanipulation SDG task on Isaac Sim PhysX
hougantc-nvda Oct 31, 2026
06f7ea1
Describe the G1 contact-path change as Newton-specific
hougantc-nvda Oct 31, 2026
589e727
Skip the teleop asset checks only when the asset is unavailable
hougantc-nvda Oct 31, 2026
ce96626
Resolve preset defaults for directly built humanoid configs
hougantc-nvda Oct 31, 2026
8f8aad0
Point the GR1T2 action changelog entry at its defining module
hougantc-nvda Oct 31, 2026
75645c5
Re-seed the G1 wrist ramp after first-step terminations
hougantc-nvda Oct 31, 2026
de2dec6
Regenerate the environment browser for the SO101 IK-Abs task
hougantc-nvda Oct 31, 2026
c3c0d0a
Merge fixed #8788 environment browser into #8789
hougantc-nvda Oct 31, 2026
cc90610
Let a missing Isaac Capture raise its original import error
hougantc-nvda Nov 1, 2026
7314947
Document and close the OVStage scene publisher contract
hougantc-nvda Nov 1, 2026
9443d43
Merge #8787 publisher and import fixes into #8788
hougantc-nvda Nov 1, 2026
a80587e
Merge #8787 publisher and import fixes into #8789
hougantc-nvda Nov 1, 2026
689cbcb
Check the GR1T2 kinematics URDF against the asset's joint frames
hougantc-nvda Nov 1, 2026
3104bc9
Regenerate the GR1T2 kinematics URDF with Kit's exporter
hougantc-nvda Nov 1, 2026
add4f9c
Document the G1 kitless Newton helper contracts
hougantc-nvda Nov 1, 2026
54e23b2
List SO101 without Newton in the kitless XR guide
hougantc-nvda Nov 1, 2026
9577aef
Keep CPU OVRTX support out of the renderer lease
hougantc-nvda Nov 1, 2026
2982179
Keep the async write buffers in the OVRTX renderer module
hougantc-nvda Nov 1, 2026
2888357
Keep the upstream material drain comment and names
hougantc-nvda Nov 1, 2026
452a41a
Say when a leased material writer compiles its addresses
hougantc-nvda Nov 1, 2026
c3434a3
Drop hidden visual prims from the OVXR adapter
hougantc-nvda Nov 1, 2026
dc4b12f
Drop a later layer's attribute from the OVXR adapter test fake
hougantc-nvda Nov 1, 2026
b5a8dc8
Rename OvLibrariesXrConfig to OvLibrariesXrCfg
hougantc-nvda Nov 1, 2026
e845280
Drop the repeated word from two render-lease test names
hougantc-nvda Nov 1, 2026
04f2716
Read the environment's simulation configuration directly
hougantc-nvda Nov 1, 2026
b2d4e47
Import NumPy, Warp and SceneDataFormat at module level
hougantc-nvda Nov 1, 2026
58bd756
Resolve a bare CUDA device through one OVXR session helper
hougantc-nvda Nov 1, 2026
dfbdf32
Document the render lease's effect on OVRTX clone routing
hougantc-nvda Nov 1, 2026
3cc5aa1
Put the material writer's pending-update property after its constructor
hougantc-nvda Nov 1, 2026
5af4912
Cover the scene publisher's component and authority rules
hougantc-nvda Nov 1, 2026
3c06330
Cover OVXR session preparation checks in the adapter tests
hougantc-nvda Nov 1, 2026
6e9caf6
Describe the OVXR adapter's ownership and dependencies in the README
hougantc-nvda Nov 1, 2026
b85423d
Add an opt-in native harness for the OVRTX owner transfer
hougantc-nvda Nov 1, 2026
fd13148
Merge round-3 #8787 restructuring into #8788
hougantc-nvda Nov 1, 2026
1b2b679
Drop the unused XrCfg.hidden_visual_prims field
hougantc-nvda Nov 1, 2026
63d34e4
Drop the unused IsaacTeleopDevice.xr_anchor_path property
hougantc-nvda Nov 1, 2026
f754a3b
Publish OVRTX scene updates from a CPU simulation device
hougantc-nvda Nov 1, 2026
a72ca75
Run the native OVRTX transfer harness with CPU physics
hougantc-nvda Nov 1, 2026
098b046
Keep the environment open when the XR camera feed fails to close
hougantc-nvda Nov 1, 2026
0cfc2cd
Correct the kitless guide's client controls and SO101 checks
hougantc-nvda Nov 1, 2026
62ed4d3
Restore the upstream teleop README examples and Docker section
hougantc-nvda Nov 1, 2026
55b69a1
Document the kitless teleop hooks, render anchors and MCAP replay
hougantc-nvda Nov 1, 2026
a671f34
Drop later layers' attributes from the teleop entrypoint test fakes
hougantc-nvda Nov 1, 2026
8818d39
Restore upstream helpers and texts that the rebase reintroduced
hougantc-nvda Nov 1, 2026
a5a6e23
Keep selecting the camera rendering experience for live teleoperation
hougantc-nvda Nov 1, 2026
00de632
Strip cameras for disabled external cameras only under Kit XR again
hougantc-nvda Nov 1, 2026
672d80b
Share the OVXR pre-launch checks between live and replay
hougantc-nvda Nov 1, 2026
eb9cc49
Log and return on live teleoperation failures as upstream does
hougantc-nvda Nov 1, 2026
30fdb76
Keep the CloudXR stop warning when the runtime outlives the session
hougantc-nvda Nov 1, 2026
d8f94b4
Suppress Isaac Capture session exit errors unless OVXR lends the handles
hougantc-nvda Nov 1, 2026
40d1cc0
Restore upstream replay agent text, task parsing and comments
hougantc-nvda Nov 1, 2026
6591d50
Restore upstream live teleoperation text, comments and main entry
hougantc-nvda Nov 1, 2026
f749ede
Restore upstream XR anchor docstrings, logging and optional carb import
hougantc-nvda Nov 1, 2026
c4b9b1c
Cover empty CPU Warp conversion in its own proxy-array test
hougantc-nvda Nov 1, 2026
a237fd4
Restore the upstream Capture stubs in the control-event and hand tests
hougantc-nvda Nov 1, 2026
6f2376f
Keep the XR experience check in the upstream teleop smoke test
hougantc-nvda Nov 1, 2026
f6d3c93
Keep the upstream SO101 pipeline test and derive its full-pose home
hougantc-nvda Nov 1, 2026
8021f9e
Leave the upstream OpenXR constructor test without a Kit launch
hougantc-nvda Nov 1, 2026
52d82bc
Narrow the OvPhysX contact-setting docs and quiet the hand-presence log
hougantc-nvda Nov 1, 2026
31311bf
Describe the replay controls and render anchors accurately in the cha…
hougantc-nvda Nov 1, 2026
49cecdf
Leave upstream doc lines intact beside the kitless additions
hougantc-nvda Nov 1, 2026
302e244
Keep the upstream warmup and STOP-edge comment lines in replay
hougantc-nvda Nov 1, 2026
104ef22
Merge round-3 #8788 restructuring into #8789
hougantc-nvda Nov 1, 2026
6740d3c
Lead the kitless guide's live section with the task table and CPU OvP…
hougantc-nvda Nov 1, 2026
00d261d
Replay the GR1T2 task in the kitless OVXR replay example
hougantc-nvda Nov 1, 2026
956505d
Describe humanoid backend preparation in the task package README
hougantc-nvda Nov 1, 2026
4e84b41
Run the native OVRTX transfer harness on prepared GR1T2 with CPU OvPhysX
hougantc-nvda Nov 1, 2026
5c27cbf
Leave fixed-base G1's reset re-render count unchanged until it has im…
hougantc-nvda Nov 1, 2026
9de9aad
Remove only the cameras each G1 task declares in the OvPhysX wheel test
hougantc-nvda Nov 1, 2026
fa70f0d
Drop task-test assertions that cannot fail and name the G1 default-co…
hougantc-nvda Nov 1, 2026
0b60cae
Keep the upstream camera-feed layout position in locomanipulation G1
hougantc-nvda Nov 1, 2026
a65a3f8
Keep the upstream waist-joint append in the WaistEnabled GR1T2 config
hougantc-nvda Nov 1, 2026
4166bdf
Restore the upstream GR1T2 import layout and pipeline builder text
hougantc-nvda Nov 1, 2026
c1b11fa
Check teleop-free humanoid preparation in its own test beside the ups…
hougantc-nvda Nov 1, 2026
4ec9ac3
Keep the launcher physics-preservation test and check the humanoid ho…
hougantc-nvda Nov 1, 2026
fb146d9
Assert only preparation state in the registered-construction preset test
hougantc-nvda Nov 1, 2026
afecad7
Swap in the GR1T2 kitless action term during backend preparation
hougantc-nvda Nov 1, 2026
ce2a331
Keep the upstream Pink hand-joint comment and document the hand targe…
hougantc-nvda Nov 1, 2026
dec2d9d
Start Kit for every replay without --ovxr
hougantc-nvda Nov 2, 2026
a7b5bc7
Merge #8788 Kit-only replay into #8789
hougantc-nvda Nov 2, 2026
7328610
Merge replay cleanup correction into robot tasks
hougantc-nvda Nov 2, 2026
3047331
Preserve replay failures during session cleanup
hougantc-nvda Nov 2, 2026
01c1e16
Clarify humanoid joint target contracts
hougantc-nvda Nov 2, 2026
c7aac97
Latch replay exit failures only for OVXR replay
hougantc-nvda Nov 2, 2026
252a03c
Merge upstream main through borrowed renderer into live and recorded …
hougantc-nvda Nov 2, 2026
b839449
Merge OVXR replay latching and upstream main into G1 and GR1T2
hougantc-nvda Nov 2, 2026
1329d99
Merge upstream main into kitless borrowed renderer
hougantc-nvda Nov 2, 2026
bb4bfb8
Skip the OVXR preparation-order test without the OVXR session manager
hougantc-nvda Nov 2, 2026
aa69735
Bind the Warp array type when installing the to_torch shim
hougantc-nvda Nov 2, 2026
8aa3375
Give the SO101 IK-Abs automatic PhysX selector the tuned OvPhysX config
hougantc-nvda Nov 2, 2026
c7ccee6
Merge CI fixes into G1 and GR1T2
hougantc-nvda Nov 2, 2026
d48f5d0
Export the leased scene publisher and type the lease controller
hougantc-nvda Nov 2, 2026
0789f6b
Validate the OVXR anchor reference path and use configclass for the a…
hougantc-nvda Nov 2, 2026
b4e5381
Test OVXR transfer cancellation through the real bootstrap constructor
hougantc-nvda Nov 2, 2026
4f37423
Merge #8787 review fixes into live and recorded teleop
hougantc-nvda Nov 2, 2026
fec8104
Remove the render-only XR anchor
hougantc-nvda Nov 2, 2026
36f8adb
Remove the teleop task hooks from the OVXR entrypoints
hougantc-nvda Nov 2, 2026
65b54d9
Address OVXR teleop review style and test findings
hougantc-nvda Nov 2, 2026
284269e
Keep the existing XR render anchor accessor name
hougantc-nvda Nov 2, 2026
794c904
Merge #8788 review fixes into G1 and GR1T2
hougantc-nvda Nov 2, 2026
838b70b
Revert "Remove the teleop task hooks from the OVXR entrypoints"
hougantc-nvda Nov 2, 2026
ae271d0
Record the teleop task hooks in the humanoid teleop changelog fragment
hougantc-nvda Nov 2, 2026
9a6be53
Call output_types directly when chaining hand presence and drop the d…
hougantc-nvda Nov 2, 2026
721dad7
Pass the live hand-tracking requirement through the shared helper
hougantc-nvda Nov 2, 2026
8d51659
Commit conditioner state only for actions that pass post-conditioning…
hougantc-nvda Nov 2, 2026
d52ff4b
Document the teleop preparation and conditioner hook contracts
hougantc-nvda Nov 2, 2026
6f07b81
Read the G1 wrist poses through the articulation's declared fields
hougantc-nvda Nov 2, 2026
d10ce05
Drop the synthetic G1 contact-label test covered by the asset test
hougantc-nvda Nov 2, 2026
840cbe9
Share one typed spawn-wrapping helper across the kitless asset prepar…
hougantc-nvda Nov 2, 2026
12f15e5
Read the declared kitless preparation marker directly
hougantc-nvda Nov 2, 2026
1e24fe0
Move humanoid kitless preparation from config methods to module funct…
hougantc-nvda Nov 2, 2026
116c95f
Format the hand-guard test assertion
hougantc-nvda Nov 2, 2026
e546db3
Merge upstream main into live and recorded OVXR teleoperation
hougantc-nvda Nov 2, 2026
42849ed
Merge upstream main via #8788
hougantc-nvda Nov 2, 2026
54ba340
Share the OVXR session lifecycle between live and replay teleoperation
hougantc-nvda Nov 3, 2026
c169ab3
Keep the replay viewer startup policy out of the run loop
hougantc-nvda Nov 3, 2026
386f641
Merge OVXR session lifecycle unification from #8788
hougantc-nvda Nov 3, 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
1 change: 1 addition & 0 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,7 @@ def _read_pinned_versions() -> dict:
"ipywidgets",
"mpl_toolkits",
"isaacteleop",
"isaaccapture",
"scipy",
"hydra",
"hydra.core",
Expand Down
10 changes: 5 additions & 5 deletions docs/source/_static/css/environment-browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,11 @@
["IsaacContrib-Open-Drawer-Franka-IK-Abs", "rsl_rl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "", "environment-previews/franka_open_drawer.jpg", false, {}, {}, "", null, ["||", "isaacsim_physx||", "newton_mjwarp||", "ovphysx||"]],
["IsaacContrib-Open-Drawer-Franka-IK-Rel", "rsl_rl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "", "environment-previews/franka_open_drawer.jpg", false, {}, {}, "", null, ["||", "isaacsim_physx||", "newton_mjwarp||", "ovphysx||"]],
["IsaacContrib-Open-Drawer-OpenArm", "rl_games,rsl_rl", "", "", "", "environment-previews/openarm_uni_open_drawer.jpg"],
["IsaacContrib-PickPlace-FixedBaseUpperBodyIK-G1-Abs", "", "", "isaacsim_rtx,newton_renderer", "", "environment-previews/g1_pick_place_fixed_base.jpg", false, {}, {}, "", null, ["||", "|isaacsim_rtx|", "|newton_renderer|"]],
["IsaacContrib-PickPlace-FixedBaseUpperBodyIK-G1-Abs", "", "isaacsim_physx,newton_mjwarp,ovphysx", "isaacsim_rtx,newton_renderer,ovrtx", "", "environment-previews/g1_pick_place_fixed_base.jpg", false, {}, {}, "", null, ["||", "|isaacsim_rtx|", "|newton_renderer|", "isaacsim_physx||", "isaacsim_physx|isaacsim_rtx|", "isaacsim_physx|newton_renderer|", "newton_mjwarp||", "newton_mjwarp|isaacsim_rtx|", "newton_mjwarp|newton_renderer|", "newton_mjwarp|ovrtx|", "ovphysx|newton_renderer|", "ovphysx|ovrtx|"]],
["IsaacContrib-PickPlace-G1-InspireFTP-Abs", "", "", "", "", "environment-previews/g1_pick_place.jpg"],
["IsaacContrib-PickPlace-GR1T2-Abs", "", "", "isaacsim_rtx,newton_renderer", "", "environment-previews/gr_1_pick_place.jpg", false, {}, {}, "", null, ["||", "|isaacsim_rtx|", "|newton_renderer|"]],
["IsaacContrib-PickPlace-GR1T2-WaistEnabled-Abs", "", "", "", "", "environment-previews/gr_1_pick_place_waist.jpg"],
["IsaacContrib-PickPlace-Locomanipulation-G1-Abs", "", "", "isaacsim_rtx,newton_renderer", "", "environment-previews/g1_pick_place_locomanipulation.jpg", false, {}, {}, "", null, ["||", "|isaacsim_rtx|", "|newton_renderer|"]],
["IsaacContrib-PickPlace-GR1T2-Abs", "", "isaacsim_physx,newton_mjwarp,ovphysx", "isaacsim_rtx,newton_renderer,ovrtx", "", "environment-previews/gr_1_pick_place.jpg", false, {}, {}, "", null, ["||", "|isaacsim_rtx|", "|newton_renderer|", "isaacsim_physx||", "isaacsim_physx|isaacsim_rtx|", "isaacsim_physx|newton_renderer|", "newton_mjwarp||", "newton_mjwarp|isaacsim_rtx|", "newton_mjwarp|newton_renderer|", "newton_mjwarp|ovrtx|", "ovphysx|newton_renderer|", "ovphysx|ovrtx|"]],
["IsaacContrib-PickPlace-GR1T2-WaistEnabled-Abs", "", "isaacsim_physx,newton_mjwarp,ovphysx", "", "", "environment-previews/gr_1_pick_place_waist.jpg", false, {}, {}, "", null, ["||", "isaacsim_physx||", "newton_mjwarp||", "ovphysx||"]],
["IsaacContrib-PickPlace-Locomanipulation-G1-Abs", "", "isaacsim_physx,newton_mjwarp,ovphysx", "isaacsim_rtx,newton_renderer,ovrtx", "", "environment-previews/g1_pick_place_locomanipulation.jpg", false, {}, {}, "", null, ["||", "|isaacsim_rtx|", "|newton_renderer|", "isaacsim_physx||", "isaacsim_physx|isaacsim_rtx|", "isaacsim_physx|newton_renderer|", "newton_mjwarp||", "newton_mjwarp|isaacsim_rtx|", "newton_mjwarp|newton_renderer|", "newton_mjwarp|ovrtx|", "ovphysx|newton_renderer|", "ovphysx|ovrtx|"]],
["IsaacContrib-Place-Mug-Agibot-Left-Arm-RmpFlow", "", "isaacsim_physx", "", "", "environment-previews/agibot_place_mug.jpg", false, {}, {}, "", null, ["||", "isaacsim_physx||"]],
["IsaacContrib-Place-Toy2Box-Agibot-Right-Arm-RmpFlow", "", "isaacsim_physx", "", "", "environment-previews/agibot_place_toy.jpg", false, {}, {}, "", null, ["||", "isaacsim_physx||"]],
["IsaacContrib-Reach-OpenArm", "rl_games,rsl_rl,skrl", "", "", "", "environment-previews/openarm_uni_reach.jpg"],
Expand All @@ -130,7 +130,7 @@
["IsaacContrib-Stack-Cube-Instance-Randomize-Franka-IK-Rel", "", "", "", "", "environment-previews/franka_instance_randomize_stack.jpg"],
["IsaacContrib-Stack-Cube-RedGreen-Franka-IK-Rel", "", "isaacsim_physx", "", "", "environment-previews/franka_stack.jpg", false, {}, {}, "", null, ["||", "isaacsim_physx||"]],
["IsaacContrib-Stack-Cube-RedGreenBlue-Franka-IK-Rel", "", "isaacsim_physx", "", "", "environment-previews/franka_stack.jpg", false, {}, {}, "", null, ["||", "isaacsim_physx||"]],
["IsaacContrib-Stack-Cube-SO101-IK-Abs-v0", "", "isaacsim_physx", "", "", "environment-previews/so101_stack.jpg", false, {}, {}, "", null, ["||", "isaacsim_physx||"]],
["IsaacContrib-Stack-Cube-SO101-IK-Abs-v0", "", "isaacsim_physx,ovphysx", "", "", "environment-previews/so101_stack.jpg", false, {}, {}, "", null, ["||", "isaacsim_physx||", "ovphysx||"]],
["IsaacContrib-Stack-Cube-SO101-Joint-Teleop-v0", "", "isaacsim_physx", "", "", "environment-previews/so101_stack.jpg", false, {}, {}, "", null, ["||", "isaacsim_physx||"]],
["IsaacContrib-Stack-Cube-SO101-v0", "", "isaacsim_physx", "", "", "environment-previews/so101_stack.jpg", false, {}, {}, "", null, ["||", "isaacsim_physx||"]],
["IsaacContrib-Stack-Cube-UR10-Long-Suction-IK-Rel", "", "isaacsim_physx", "", "", "environment-previews/ur10_stack_surface_gripper.jpg", false, {}, {}, "", null, ["||", "isaacsim_physx||"]],
Expand Down
4 changes: 4 additions & 0 deletions docs/source/api/lab_ov/isaaclab_ov.cloner.rst
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ both OVPhysX and Newton. OVPhysX also retains native physics cloning.
``0`` selects native OVRTX cloning. Set the flag before creating the simulation. Reset retains the
selected route. This flag alone never enables physics/rendering stage sharing.

An active :class:`~isaaclab_ov.renderers.OvLibrariesRenderLease` makes OVStage rendering the
unset default for every OVRTX renderer in that simulation, and rejects
``ISAAC_LAB_OVRTX_USE_OVSTAGE=0`` and ``ISAAC_LAB_SHARE_OVSTAGE=1``.

To share one OVStage with OVPhysX and OVRTX, set ``ISAAC_LAB_SHARE_OVSTAGE=1``. Sharing requires
OVPhysX and selects OVStage rendering regardless of ``ISAAC_LAB_OVRTX_USE_OVSTAGE``.

Expand Down
20 changes: 20 additions & 0 deletions docs/source/api/lab_ov/isaaclab_ov.renderers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,36 @@ The following classes are part of the public :mod:`isaaclab_ov.renderers` API.
OVRTXRenderer
OVRTXRendererCfg
OVRTXBackendCfg
OvLibrariesRenderLease
OvLibrariesScenePublisher

.. autoclass:: OVRTXRenderer
:show-inheritance:
:members: acquire_ov_libraries_render_lease

.. autoclass:: OVRTXRendererCfg
:show-inheritance:

.. autoclass:: OVRTXBackendCfg
:show-inheritance:

Renderer leases
---------------

An external consumer, such as the OVXR teleoperation adapter, can borrow one exact OVRTX
renderer and its private OVStage with :meth:`OVRTXRenderer.acquire_ov_libraries_render_lease`
before clone preparation. While the lease is active, ordinary camera rendering, scene writes and
renderer/stage destruction are rejected; eager scene updates are left to the lease's scene
publisher, which :meth:`OvLibrariesRenderLease.capture_scene_publisher` returns. A failed leased
publication poisons publication only; the borrower can still retire the pair, after which the
renderer must be recreated.

.. autoclass:: OvLibrariesRenderLease
:members:

.. autoclass:: OvLibrariesScenePublisher
:members:

Simulation-owned stages
-----------------------

Expand Down
11 changes: 11 additions & 0 deletions docs/source/api/lab_teleop/isaaclab_teleop.rst
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ isaaclab_teleop
XrCfg
XrAnchorRotationMode
XrAnchorSynchronizer
OvLibrariesXrCfg
OvLibrariesXrSession

.. rubric:: Functions

Expand Down Expand Up @@ -61,6 +63,15 @@ XR Camera Feedback
.. autoclass:: XrCameraFeedSession
:members:

Kitless OVXR Session
--------------------

.. autoclass:: OvLibrariesXrCfg
:members:

.. autoclass:: OvLibrariesXrSession
:members:

Device
------

Expand Down
4 changes: 4 additions & 0 deletions docs/source/concepts/physics-backends/ovphysx.rst
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ OvPhysX
OvPhysX runs PhysX without Omniverse Kit. It reads scene-level solver settings
from the USD ``PhysicsScene`` prim. :class:`~isaaclab_ov.physics.OvPhysxCfg` holds
GPU buffer settings that USD does not represent.
It can also author selected contact settings onto that prim:
``bounce_threshold_velocity``, ``friction_correlation_distance`` and
``solve_articulation_contact_last``. Contact settings left at ``None`` keep the
stage value.

OvPhysX is selected through :class:`~isaaclab_ov.physics.OvPhysxCfg`:

Expand Down
20 changes: 20 additions & 0 deletions docs/source/features/isaac_teleop.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1344,6 +1344,26 @@ through this variable -- later runs no longer prompt. The variable applies to ev
that launches the runtime, including the process-scoped launcher in
``teleop_replay_agent.py``.

Replay MCAP with a Kitless OVXR Viewer
--------------------------------------

The MCAP replay entrypoint can present recorded input through an independent
OVXR viewer. Follow the :ref:`kitless XR guide <kitless-xr>` to install Isaac
Capture with its OVXR extra and select the compatible rendering dependencies.

.. code-block:: bash

uv run --extra ovxr python \
scripts/environments/teleoperation/teleop_replay_agent.py \
--task IsaacContrib-PickPlace-GR1T2-Abs --physics ovphysx \
--device cpu --num_envs 1 --ovxr \
--replay_file /absolute/path/to/session.mcap

Use ``--physics newton_mjwarp`` for Newton. MCAP supplies tracker and control
input; the connected client supplies the view. A recorded STOP, task success
or failure, or the replay duration limit ends the run. The separate
``isaaclab teleop replay`` command replays HDF5 demonstrations through Kit.

.. _isaac-teleop-xr-anchor:

Configure the XR Anchor
Expand Down
4 changes: 4 additions & 0 deletions docs/source/how-to/cloudxr_teleoperation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,10 @@ to capture demonstrations, and ``replay`` to play a dataset back. :ref:`The next
bundled Isaac Sim pins ``packaging==26.0`` while those runtimes require ``<24``. Install
the OV runtimes separately when you need them.

For XR teleoperation without Isaac Sim, follow the :ref:`kitless XR guide <kitless-xr>`. It
explains how to select a public Isaac Capture wheel and its optional OVXR dependencies. The Kit
setup below uses the published ``teleop`` extra.

Complete these steps first:

#. Install the system libraries required by the CloudXR runtime:
Expand Down
12 changes: 12 additions & 0 deletions docs/source/how-to/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,12 @@ How-to Guides

:guide-tag:`PhysX` :guide-tag:`Isaac Sim`

.. container:: guide-entry

:doc:`Kitless XR with Isaac Capture </source/how-to/kitless_xr>`

Install Isaac Capture and OVXR packages for live teleoperation and MCAP replay.

.. container:: guide-entry

:doc:`Setting up Haply teleoperation </source/how-to/haply_teleoperation>`
Expand Down Expand Up @@ -556,3 +562,9 @@ How-to Guides

This collection is a work in progress. If a question is not answered here, open an issue on the
`Isaac Lab GitHub repository <https://github.com/isaac-sim/IsaacLab>`_.

.. toctree::
:hidden:

kitless_xr
kitless_xr_source
15 changes: 15 additions & 0 deletions docs/source/how-to/kitless_xr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
myst:
heading_anchors: 2
---

<!--
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
-->

(kitless-xr)=

```{include} ../../../source/isaaclab_teleop/docs/kitless_xr.md
```
8 changes: 8 additions & 0 deletions docs/source/how-to/kitless_xr_source.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<!--
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
-->

```{include} ../../../source/isaaclab_teleop/docs/kitless_xr_source.md
```
2 changes: 2 additions & 0 deletions source/isaaclab/changelog.d/kitless-ovxr-lifecycle.added.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* Added the ``cleanup_context`` keyword to :func:`~isaaclab.app.launch_simulation` so an
asynchronous XR owner can drain before the simulation context is released.
2 changes: 2 additions & 0 deletions source/isaaclab/changelog.d/kitless-ovxr-lifecycle.fixed.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* Fixed ``wp.to_torch`` failing on empty CPU Warp arrays, whose null data pointer NumPy rejects.
They now convert through DLPack.
Empty file.
2 changes: 2 additions & 0 deletions source/isaaclab/changelog.d/pink-hand-joint-order.fixed.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* Fixed Pink hand targets being applied to the wrong joints when the articulation's joint order differs
from ``hand_joint_names`` (for example, Newton's G1 order).
13 changes: 12 additions & 1 deletion source/isaaclab/isaaclab/app/sim_launcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -412,12 +412,19 @@ def validate_launch( # noqa: C901
def launch_simulation(
cfg,
launcher_args: argparse.Namespace | dict | None = None,
*,
cleanup_context: bool = True,
) -> Generator[PhysicsCfg | None, None, None]:
"""Context manager that launches the appropriate simulation runtime for *cfg*.

Resolves configured consumers before starting their required runtimes. Each runtime starts
once and closes on exit. Cameras are auto-enabled for Kit-renderer sensors.

On exit, stops and releases a simulation context created inside the scope before closing
its runtimes. An existing context owned by the caller is preserved. Applications
with asynchronous resource owners can set ``cleanup_context=False`` and take
responsibility for context cleanup, including failed construction and drain.

Resolve viewer and physics choices on the same config used to construct the simulation::

sim_cfg = SimulationCfg()
Expand All @@ -437,6 +444,10 @@ def launch_simulation(
a tool that reaches a Kit-only extension API. This is additive -- it can only turn a
kitless launch into a Kit one, never the reverse, so a config that already needs Kit
still launches it when the key is absent or ``False``.
cleanup_context: Automatically release a context created inside this scope.
Disable only when the application owns its cleanup and must retain it
if asynchronous consumers cannot prove they have drained. This controls
context release only; configured runtime launchers still close on exit.
"""
launcher_args = {} if launcher_args is None else launcher_args
launcher_args = vars(launcher_args) if isinstance(launcher_args, argparse.Namespace) else launcher_args
Expand Down Expand Up @@ -500,7 +511,7 @@ def launch_simulation(
finally:
# Release runtime consumers before a launcher can terminate the process.
context = SimulationContext.instance()
if context is not None and context is not previous_context:
if cleanup_context and context is not None and context is not previous_context:
Comment thread
hougantc-nvda marked this conversation as resolved.
Resolved
SimulationContext.clear_instance()
except KeyboardInterrupt:
exit_code = 130
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,10 @@ class PinkInverseKinematicsActionCfg(ActionTermCfg):
"""List of joint names or regular expression patterns that specify the joints controlled by pink IK."""

hand_joint_names: list[str] = MISSING
"""List of joint names or regular expression patterns that specify the joints controlled by hand retargeting."""
"""List of joint names or regular expression patterns that specify the joints controlled by hand retargeting.

Hand targets in the action are applied in this order.
"""

controller: PinkIKControllerCfg = MISSING
"""Configuration for the Pink IK controller that will be used to solve the inverse kinematics."""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,12 @@ def _initialize_joint_info(self) -> None:
self.cfg.controller.all_joint_names = self._asset.data.joint_names

# Resolve hand joints
self._hand_joint_ids, self._hand_joint_names = self._asset.find_joints(self.cfg.hand_joint_names)
# Hand targets occupy the action tensor in configuration order. Newton's
# articulation order groups these joints differently, so preserve the
# declared order when resolving ids instead of silently permuting targets.
self._hand_joint_ids, self._hand_joint_names = self._asset.find_joints(
self.cfg.hand_joint_names, preserve_order=True
)

# Combine all joint information
self._controlled_joint_ids = self._isaaclab_controlled_joint_ids + self._hand_joint_ids
Expand Down
20 changes: 18 additions & 2 deletions source/isaaclab/isaaclab/utils/warp/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
from .proxy_array import ProxyArray # noqa: E402

_WP_TO_TORCH_ORIGINAL = wp.to_torch
# Bound at import so a later ``wp.array`` patch cannot break the empty-array check.
_WP_ARRAY = wp.array
_WP_TO_TORCH_WARNED = False


Expand All @@ -37,8 +39,9 @@ def _wp_to_torch_with_proxyarray(a, requires_grad=None):

The shim routes :class:`ProxyArray` arguments to their cached ``.torch``
view (a zero-copy :class:`torch.Tensor` of the same underlying memory) and
emits a one-shot :class:`DeprecationWarning`. For any other input type,
the original :func:`warp.to_torch` handles the call as before.
emits a one-shot :class:`DeprecationWarning`. Empty CPU arrays use DLPack
because NumPy rejects their null-pointer array interface. Other native
arrays keep the original :func:`warp.to_torch` conversion.
"""
global _WP_TO_TORCH_WARNED
if isinstance(a, ProxyArray):
Expand All @@ -51,6 +54,19 @@ def _wp_to_torch_with_proxyarray(a, requires_grad=None):
stacklevel=2,
)
return a.torch
if isinstance(a, _WP_ARRAY) and a.size == 0 and a.device is not None and a.device.is_cpu:
# Preserve Warp's structured-array rejection before the DLPack fallback.
if isinstance(a.dtype, wp._src.codegen.Struct): # noqa: SLF001
return _WP_TO_TORCH_ORIGINAL(a, requires_grad=requires_grad)
import torch

if requires_grad is None:
requires_grad = a.requires_grad
tensor = torch.from_dlpack(wp.to_dlpack(a))
tensor.requires_grad = requires_grad
if requires_grad and a.requires_grad:
tensor.grad = torch.from_dlpack(wp.to_dlpack(a.grad))
return tensor
return _WP_TO_TORCH_ORIGINAL(a, requires_grad=requires_grad)


Expand Down
37 changes: 37 additions & 0 deletions source/isaaclab/test/app/test_launch_simulation_require_kit.py
Original file line number Diff line number Diff line change
Expand Up @@ -256,3 +256,40 @@ def test_legacy_recording_reuses_the_display_producer(kit_branch_taken, visualiz
assert cfg.sim.visualizer_cfgs[0].headless == (not visualizers)
assert args.get("enable_cameras", False) == (source == "kit")
assert kit_branch_taken == [True] * (source == "kit")


@pytest.mark.parametrize(
"application_owns_cleanup,drain_failed", [(False, False), (False, True), (True, False), (True, True)]
)
def test_context_cleanup_respects_application_drain_ownership(monkeypatch, application_owns_cleanup, drain_failed):
"""An outer launcher must not release a context retained by a failed native drain."""
from isaaclab.sim import SimulationContext

state = {"context": None}
released = []

def clear():
released.append(state["context"])
state["context"] = None

monkeypatch.setattr(SimulationContext, "instance", lambda: state["context"])
monkeypatch.setattr(SimulationContext, "clear_instance", clear)
context = object()

def run():
with launch_simulation(PhysicsCfg(), cleanup_context=not application_owns_cleanup):
state["context"] = context
if drain_failed:
raise RuntimeError("consumer drain unproved")
if application_owns_cleanup:
# The already-owning environment/worker performs normal release.
SimulationContext.clear_instance()

if drain_failed:
with pytest.raises(RuntimeError, match="consumer drain unproved"):
run()
else:
run()
retained = application_owns_cleanup and drain_failed
assert released == ([] if retained else [context])
assert state["context"] is (context if retained else None)
Loading
Loading