Skip to content

[Proposal] Single-environment OVRTX LiDAR adapter through the shared renderer lifecycle #7474

Open

Description

@RandomOakForest

Discussed in #7094

Originally posted by StriverAlex August 14, 2026

Proposal

I have a working proof of concept for exposing OVRTX 0.4 PointCloud LiDAR products as an IsaacLab
sensor in the kitless isaaclab_ov stack.

The proposed design adds a narrow renderer transaction/registration seam and an
OVRTXLiDARCfg / OVRTXLiDARData / OVRTXLiDAR adapter. Camera and LiDAR products share the same
simulation-scoped OVStage and OVRTX renderer. The sensor owns only its product specification and
handle; it does not create a second stage or renderer. PointCloud outputs remain on CUDA and retain
valid counts, flags, coordinates, intensity, time offset, emitter, channel, tick, and echo fields.
Because OVRTX 0.4 EchoId readback was not reliable in the proof, the initial adapter explicitly
requires maxReturns=1 instead of claiming multi-return support.

LiDAR profile authoring remains explicit and asset-owned. IsaacLab core would not contain Livox or
other vendor scan tables, and the adapter would not fall back to Newton or another backend when
OVRTX is unavailable.

Motivation

IsaacLab's current OVRTX integration exposes camera rendering, while OVRTX itself also provides a
generic LiDAR schema and CUDA PointCloud output. Users who need intensity, timing, emitter/channel
metadata, material response, or OVRTX motion compensation currently have no IsaacLab sensor
lifecycle for that product.

Earlier IsaacLab RTX LiDAR work in PR #802 and
PR #1372 targeted the Isaac Sim/Replicator stack;
issue #865 and
Discussion #291 record the related request
history. This proposal instead targets the kitless isaaclab_ov renderer and shares its existing
scene sync and renderer ownership.

Proven boundary

The proof branch has passed its single-environment correctness and integration gates:

  • deterministic plane/box range, occlusion, coordinate-frame, count, and channel-layout checks;
  • CUDA-backed PointCloud decoding without steady-state host copies;
  • LiDAR-only and Camera+LiDAR operation with one OVStage and one OVRTX renderer;
  • sensor mounting on a moving rigid body, reset, and renderer lifecycle checks;
  • explicit maxReturns=1 validation for the current OVRTX 0.4 EchoId limitation;
  • 72 renderer/sensor contract tests and 9 isolated CUDA integration tests;
  • Camera-only p95 regression below the 10% gate on the test GPU.

There is one intentional hard boundary. In paired low-level probes on OVRTX 0.4.0.346409,
non-tiled PointCloud products did not trace scene-partitioned geometry. With only partitioned
geometry both products returned zero points; with an unpartitioned control object they hit only that
control geometry. The adapter therefore rejects num_envs != 1 before opening the renderer scene.
It does not disable partitioning, post-filter points, or allocate one renderer per environment.

The initial contribution would be documented as a generic single-environment OVRTX LiDAR. It would
not claim batched support, strict Livox scan equivalence, or calibrated real-device noise.

Proposed pull-request split

  1. Renderer transaction and sensor-registration lifecycle
    • add a default no-op sensor renderer-preparation hook;
    • register renderer-backed sensors before stage preparation;
    • advance time-integrating shared renderers once per simulation step, independent of consumer
      read order;
    • preserve existing on-demand camera behavior;
    • cover the contract with fake-renderer and Camera regression tests;
    • add no OVRTX LiDAR public API.
  2. OVRTX PointCloud product and LiDAR sensor
    • add the OVRTX product registry/readback and LiDAR cfg/data/sensor API;
    • require one shared OVRTX renderer and authored OmniLidar profiles;
    • preserve raw CUDA channel contracts and fail fast on unsupported configuration;
    • enforce the current single-environment boundary;
    • add unit, CUDA integration, API documentation, and isaaclab_ov changelog coverage.

The second pull request would depend on the first. Vendor scan profiles and application-specific
robot mounts would remain outside IsaacLab.

Questions for maintainers

  1. Would you accept an initial single-environment adapter with the explicit OVRTX 0.4 fail-fast
    boundary, or should the contribution wait for a public PointCloud geometry-isolation contract?
  2. Is the two-PR split above the preferred ownership boundary?
  3. The contribution guide says to target main, but source/isaaclab_ov exists on develop and not
    on the audited main. Should these PRs target develop?
  4. Should a new scoped issue be opened after this Discussion, or should it cross-link/reopen Add RTX Lidar sensor #865
    even though Add RTX Lidar sensor #865 and its successor PRs concerned the Isaac Sim RTX path?
  5. Is there an OVRTX-side issue or planned API for per-PointCloud scene-partition isolation that this
    work should track?

Build info

  • IsaacLab version: 3.0.0
  • proof base: 135cf98904cbd73f3b8bdd89188e1a463ebcbb97
  • current audited upstream/develop: 45ca595b11c271f1f202d00f66099480e8f77e32
  • OVRTX: 0.4.0.346409 (ovrtx>=0.4.0,<0.5.0)
  • OVStage: 0.1.0.346039
  • execution path: kitless Newton + OVRTX; Isaac Sim is not used
  • GPU used for the full application performance matrix: NVIDIA RTX 4090 D

Acceptance criteria proposed for the initial contribution

  • One OVRTX renderer and one OVStage are shared by Camera and LiDAR products.
  • A LiDAR-only scene initializes, resets, steps, reads CUDA PointCloud data, and closes.
  • Deterministic range, occlusion, coordinate-frame, valid-count, and channel-layout tests pass.
  • Moving-mount and full-reset behavior pass.
  • Existing OVRTX Camera tests and the Camera-only performance regression gate pass.
  • Unsupported multi-environment use fails before scene loading with an actionable error.
  • Missing OVRTX/CUDA/schema requirements fail explicitly; no fallback backend is selected.
  • maxReturns != 1 fails explicitly until OVRTX provides reliable echo identity readback.
  • Public docs state the single-environment and generic-fidelity boundaries.

Activity

  1. StriverAlex commented on Sep 3, 2026

    @StriverAlex

    Update after refreshing the prototype against develop at
    860facd10
    and the currently pinned OVRTX/OVStage pair (ovrtx==0.4.1.364340,
    ovstage==0.1.1.355824).

    The local two-PR stack now follows the config-owned renderer construction introduced by #7379.
    The initial LiDAR adapter remains explicitly scoped to OVRTX 0.4.1: #7351 adds version-aware
    render-variable keys for the existing camera outputs, but it does not establish PointCloud or
    scene-partition behavior for LiDAR.

    Fresh local validation on the rebased stack:

    • renderer-lifecycle slice: 60 focused tests passed;
    • OVRTX adapter/renderer contracts and camera regressions: 201 tests passed;
    • real OVRTX CUDA integration: 11 tests passed;
    • single-environment G1 smoke: 10 complete LiDAR frames and 311,030 valid points over 100
      simulation steps.

    I also repeated the low-level scene-partition probe on OVRTX 0.4.1. The probe used one OVStage,
    one OVRTX renderer, two overlapping environment partitions, and one independent non-tiled
    PointCloud product per LiDAR. env_0 contained a wall at x=5 m and env_1 contained a wall at
    x=10 m.

    Both products emitted frames, but both reported Counts=0. The result was unchanged when:

    • preserving the original USD partition tokens;
    • bypassing OVStage partition-token rewriting; or
    • additionally authoring the partition token on each RenderProduct.

    This agrees with the earlier OVRTX 0.4.0 control probe: partitioned PointCloud products could hit
    unpartitioned control geometry, but not their own partitioned geometry. Because the failure is
    already visible in Counts, it is not caused by valid-bit filtering or PointCloud decoding in the
    adapter.

    Therefore, the proposed initial contract remains:

    • exactly one environment;
    • maxReturns=1;
    • fail before loading the renderer scene for unsupported configurations;
    • no partition removal, CPU post-filtering, per-environment renderer allocation, or fallback to
      another LiDAR backend.

    Would you prefer that I open the renderer-lifecycle PR against develop now, followed by the
    dependent single-environment OVRTX 0.4.1 LiDAR PR, or should the LiDAR PR wait until OVRTX 0.5
    PointCloud scene-partition behavior can be tested?

    If there is a public OVRTX issue tracking PointCloud scene-partition isolation, I would also be
    happy to link this reproduction to it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions