Skip to content

Add XR camera picture-in-picture feedback - #6818

Open
hougantc-nvda wants to merge 2 commits into
isaac-sim:developfrom
hougantc-nvda:hougantc/xr-camera-pip
Open

Add XR camera picture-in-picture feedback#6818
hougantc-nvda wants to merge 2 commits into
isaac-sim:developfrom
hougantc-nvda:hougantc/xr-camera-pip

Conversation

@hougantc-nvda

@hougantc-nvda hougantc-nvda commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Description

Adds low-latency XR camera picture-in-picture (PiP) feedback to IsaacTeleop so teleoperators can see the same task-configured camera views that are captured in demonstration data.

The implementation:

  • Selects existing task cameras declaratively through ordered IsaacTeleopCfg.xr_camera_feeds.
  • Supports manual, horizontal, vertical, and grid layouts with viewer-start, head-locked, and world placement.
  • Disables PiP when no feeds are configured or external cameras are disabled.
  • Shares the task-configured feed path between teleop_se3_agent.py and record_demos.py.
  • Keeps CPU physics and camera pose state on CPU while Isaac RTX produces camera pixels on cuda:0.
  • Uses MultiBackendRendererCfg for the GR1T2 and G1 reference cameras so other renderer backends remain valid.
  • Loads Kit Scene UI lazily so kitless runs warn and continue without PiP or task-camera mutation.
  • Uses responsive DLSS Ray Reconstruction on Isaac Sim 6.1+ and falls back to classic DLSS on older supported runtimes.
  • Limits XR camera PiP to one environment while preserving existing multi-environment behavior for IsaacTeleop XR without PiP.

Core changes are limited to two capabilities unavailable through existing public APIs: separating camera pixel output from the simulation device, and applying camera-local RTX settings when the renderer creates its render product. This keeps CPU physics and camera state on CPU while producing CUDA pixels without a readback, and avoids changing the XR headset renderer globally. Existing renderer behavior is preserved by default.

Canonical example:

./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py \
  --task IsaacContrib-PickPlace-GR1T2-Abs \
  --xr \
  --device cpu

Type of change

  • New feature (non-breaking change which adds functionality)
  • Documentation update

Screenshots

Quest 3 and IsaacTeleop Web Client acceptance was completed. A headset demonstration video was recorded separately and can be attached to the PR.

Validation

  • pre-commit run --all-files
  • 214 focused renderer contract/config, camera-feed, layout, Scene UI, task preset, control-event, and teleoperation-environment tests
  • 2 Isaac Sim GPU integration tests, including real CPU camera state with RGB output on cuda:0
  • Full Sphinx documentation build with warnings treated as errors
  • Quest 3 and IsaacTeleop Web Client acceptance of the PiP path

Checklist

  • I have read and understood the contribution guidelines
  • I have run the pre-commit checks with ./isaaclab.sh --format
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • I have added a changelog fragment under source/<pkg>/changelog.d/ for every touched package (do not edit CHANGELOG.rst or bump extension.toml — CI handles that)
  • I have added my name to the CONTRIBUTORS.md or my name already exists there

@github-actions github-actions Bot added documentation Improvements or additions to documentation isaac-lab Related to Isaac Lab team labels Jul 31, 2026
@hougantc-nvda
hougantc-nvda requested a review from rwiltz July 31, 2026 00:24
@hougantc-nvda
hougantc-nvda marked this pull request as ready for review July 31, 2026 00:25
@hougantc-nvda
hougantc-nvda requested a review from a team July 31, 2026 00:25
Comment thread source/isaaclab_teleop/isaaclab_teleop/camera_feed.py
@greptile-apps

greptile-apps Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

Adds task-configured XR camera picture-in-picture feedback throughout the teleoperation stack.

  • Separates camera pixel-output placement from simulation and camera-state devices.
  • Adds camera-local RTX/DLSS settings and version-aware responsive denoising.
  • Adds Scene UI panel presentation, layouts, placement modes, reset refresh, and task presets.
  • Integrates PiP lifecycle management into teleoperation and demonstration-recording entrypoints.

Confidence Score: 4/5

The PR appears safe to merge, with a non-blocking robustness gap when optional Scene UI runtime initialization fails after its modules import successfully.

The core camera-output and rendering changes are internally consistent, but the two entrypoints currently allow a late PiP initialization exception to terminate the parent workflow rather than disabling the optional presentation layer.

Files Needing Attention: source/isaaclab_teleop/isaaclab_teleop/camera_feed.py, scripts/environments/teleoperation/teleop_se3_agent.py, scripts/tools/record_demos.py

Important Files Changed

Filename Overview
source/isaaclab_teleop/isaaclab_teleop/camera_feed.py Adds feed validation, layout, binding, frame publication, and reset-refresh lifecycle; runtime presenter failures are not converted to the advertised optional-feature fallback.
source/isaaclab_teleop/isaaclab_teleop/camera_feed_kit_scene_ui.py Implements viewer-start, head-locked, and world-space Scene UI panels with direct CUDA image upload.
source/isaaclab/isaaclab/sensors/camera/camera.py Splits renderer pixel-output allocation from CPU/GPU camera pose and intrinsic state.
source/isaaclab_physx/isaaclab_physx/renderers/isaac_rtx_renderer.py Adds RTX camera output-device resolution and per-render-product DLSS settings.
scripts/environments/teleoperation/teleop_se3_agent.py Integrates feed preparation, responsive denoising, binding, and reset refresh into interactive teleoperation.
scripts/tools/record_demos.py Integrates the same camera-feed lifecycle into demonstration recording.
source/isaaclab_teleop/isaaclab_teleop/isaac_teleop_cfg.py Adds declarative per-feed and layout configuration classes.

Sequence Diagram

sequenceDiagram
    participant Task as Task configuration
    participant Script as Teleop/record script
    participant Env as Isaac Lab environment
    participant Camera as Camera sensor
    participant RTX as Isaac RTX renderer
    participant PiP as Scene UI presenter

    Task->>Script: XR feed names and layout
    Script->>Script: Prepare and validate feed session
    Script->>Env: Construct environment
    Env->>Camera: Initialize selected cameras
    Camera->>RTX: Create render product on output device
    Script->>PiP: Bind feed session
    loop Rendered frames
        RTX->>Camera: Produce RGBA output
        PiP->>Camera: Read persistent RGBA buffer
        PiP->>PiP: Upload image and place panel
    end
Loading

Reviews (1): Last reviewed commit: "Add XR camera picture-in-picture feedbac..." | Re-trigger Greptile

@isaaclab-review-bot isaaclab-review-bot 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.

Isaac Lab Review Bot

The XR PiP design cleanly separates camera pixel-output placement from simulation state and adds render-product-local DLSS controls. Two fixes remain: the new README example uses a repository-unsupported invocation path, and the pre-6.1 Ray Reconstruction fallback only runs during PiP preparation even though reference task cameras enable Ray Reconstruction unconditionally.

  • Design and architecture: The renderer boundary for output-device resolution and render-product-local settings is appropriate. However, compatibility handling for Isaac Sim versions before 6.1 is confined to _XrCameraFeedSession.prepare(). Consequently, the same task cameras retain Ray Reconstruction in non-XR, disabled-PiP, and kitless paths, bypassing the stated ghosting fallback. Resolve the effective setting in the RTX renderer or another path shared by every camera consumer.
  • API: The public XrCameraFeedCfg and XrCameraFeedLayoutCfg types are exported and integrated into the API and feature documentation. No unsupported public API removal or compatibility break was established.
  • Implementation: Camera state and image-output allocation paths, post-annotator render-product setting order, reset rebinding, and control reset latching were traced. Update the new README command from ./isaaclab.sh -p to uv run python per repository workflow rules, and ensure the pre-6.1 DLSS fallback also applies when reference cameras run outside an active PiP session.

Minor fixes needed. Posted 2 actionable findings inline.

Automated review; human maintainers own approval decisions.

Comment thread source/isaaclab_teleop/docs/README.md Outdated
Comment thread source/isaaclab_teleop/isaaclab_teleop/camera_feed.py Outdated
hougantc-nvda and others added 2 commits July 31, 2026 14:37
Signed-off-by: Hougant Chen <hougantc@nvidia.com>
Move the pre-6.1 Ray Reconstruction fallback into the Isaac RTX
renderer so every camera consumer gets compatible behavior.

Enable camera extensions in the Pink IK test now that reference tasks
include image observations. Align the documentation with supported
invocation and error contracts.

Signed-off-by: Hougant Chen <hougantc@nvidia.com>
@hougantc-nvda
hougantc-nvda force-pushed the hougantc/xr-camera-pip branch from db52ef3 to 6efecde Compare July 31, 2026 18:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation isaac-lab Related to Isaac Lab team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant