Skip to content

Fix legacy OVRTX cloning of instanced geometry and unused variants - #7871

Closed
ooctipus wants to merge 5 commits into
isaac-sim:developfrom
ooctipus:fix/ovrtx-active-clone-sources
Closed

ooctipus wants to merge 5 commits into
isaac-sim:developfrom
ooctipus:fix/ovrtx-active-clone-sources

Conversation

@ooctipus

Copy link
Copy Markdown
Collaborator

Legacy OVRTX cloning drops nested instanced geometry, leaving Franka robots visible only in environment 0. Expand instances in the renderer's temporary USD export, while preserving the simulation stage and the ovstage and single-environment paths. Export only clone-plan rows with active destinations: unused variants intentionally retain placeholder paths without spawning USD prims.

The production franka_panda.usda reported Last-Modified: Tue, 15 Sep 2026 22:49:27 GMT and switched from base.usda to compact collider payloads containing instanced visual groups. Export deinstancing directly reproduces and fixes the missing clones; attribution to that external asset publication is an inference from its composition and timing, and no asset source commit is available. The first fix in #7865, commit 3ce2ea18f, introduced the confirmed Kuka regression by expanding inactive source paths (/World/envs/env_4/Object with 16 variants and four environments); this change handles both cases at the renderer export boundary.

Validation:

  • Red/green regression for 16 variant rows and four spawned environments; the legacy path failed on the absent fifth source before filtering, while the ovstage control passed.
  • 52 USD export and clone-plan tests passed, including nested instances and unchanged input layers.
  • All 16 legacy Newton/OVRTX rendering cases passed: 12 Franka cloth, soft-body and cable cases plus four heterogeneous Kuka cases. All 47 golden PNGs were verified against the base commit's LFS SHA-256 values; images and comparison thresholds are unchanged.
  • uv run --no-sync isaaclab -f passed. GPU comparisons passed in 94.72 seconds with the existing shader cache; an initial cold-cache attempt reached its five-minute watchdog after two passing cases.

Local GPU validation uses the existing environment's Newton 1.6.0rc1; CI resolves stable 1.6.0.

@ooctipus
ooctipus requested a review from a team September 17, 2026 11:17
@github-actions github-actions Bot added bug Something isn't working isaac-lab Related to Isaac Lab team labels Sep 17, 2026
@greptile-apps

greptile-apps Bot commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

The PR appears safe to merge; the changed export behavior is narrowly scoped and covered by targeted regressions.

Summary

This PR repairs legacy OVRTX cloning of nested instanced USD geometry while avoiding exports of inactive variant placeholders.

  • Filters clone-plan export sources to rows with at least one active destination.
  • Expands nested instances only in the legacy renderer’s anonymous export stage.
  • Preserves instancing in the simulation stage, ovstage path, and single-environment path.
  • Adds regression coverage for inactive variants, nested instances, mode selection, and unchanged input layers.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[Prepare simulation stage] --> B[Build active source list]
  B --> C{Multiple environments?}
  C -- No --> D[Export original stage]
  C -- Yes --> E{Legacy OVRTX path?}
  E -- Yes --> F[Expand source instances in anonymous session]
  F --> G[Keep environment-root placeholders]
  E -- No --> H[Retain source instancing]
  H --> I[Trim destination environment roots]
  G --> J[Export temporary USDA]
  I --> J
  J --> K{Renderer path}
  K -- Legacy --> L[renderer.clone_usd]
  K -- ovstage --> M[stage.clone]
Loading

Reviews (1) · Last reviewed commit: "Preserve instanced visuals when cloning ..."

@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 patch filters inactive clone-plan source rows before export and expands nested USD instances only in the temporary legacy OVRTX export. The live simulation stage, ovstage path, and single-environment export retain existing instancing behavior.

  • Design and architecture: The de-instancing is appropriately confined to the existing legacy keep_env_roots branch and anonymous export session. The original clone plan remains intact for scale capture, clone queries, and backend row indexing.
  • API: No public signature or default changes. export_stage_to_string retains its existing parameters and single-environment behavior, while its documentation and the isaaclab_ov changelog fragment describe the changed legacy export behavior.
  • Implementation: The active-source filter removes all-false clone-mask rows before export, avoiding placeholder paths with no corresponding prim. Tests cover inactive variant rows in both renderer paths, nested-instance expansion only in legacy multi-environment exports, and preservation of the input stage. De-instancing may increase temporary USDA size for heavily instanced assets, but it is scoped to the affected legacy export path.

No blocking issues. No inline issue met the actionable-evidence threshold; the assessment above records the review feedback.

Automated review; human maintainers own approval decisions.

@maxkra15

Copy link
Copy Markdown
Contributor

run-ci

@isaaclab-bot isaaclab-bot Bot added ci:run-docker Trigger the on-demand Docker and GPU CI workflow and removed ci:run-docker Trigger the on-demand Docker and GPU CI workflow labels Sep 17, 2026
# Native legacy cloning omits instanced visuals; expand only the renderer's copy.
with Usd.EditContext(export_stage, export_session):
for source_path in source_paths:
make_uninstanceable(source_path, stage=export_stage)

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.

is this supposed to be required? does this happen pre or post cloning?

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.

this is for legacy renderer.clone_usd() path, becuase it currently drops geometry beneath nested USD instances - instead we expand instances in the temporary export before OVRTX loads and clones it. it does not modify the simulation stage, and the ovstage path skips the workaround and retains instancing. this is pre cloning

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.

would it impact the rendering performance? if we make visual geometries not instanceable, it normally increases the memory usage quite a bit.

@maxkra15

Copy link
Copy Markdown
Contributor

run-ci

@isaaclab-bot isaaclab-bot Bot added ci:run-docker Trigger the on-demand Docker and GPU CI workflow and removed ci:run-docker Trigger the on-demand Docker and GPU CI workflow labels Sep 17, 2026
kellyguo11 added a commit that referenced this pull request Sep 17, 2026
`OperationalSpaceControllerAction` and the OSC integration-test helper
used link-origin poses and Jacobians together with center-of-mass
velocity feedback. When a link rotates with an offset center of mass,
these quantities describe different points, producing incorrect velocity
feedback. The task-frame test also copied rounded command quaternions
directly into reference frames, producing inconsistent composed targets.

Use `body_link_vel_w` and `root_link_vel_w` in both OSC callers, and
normalize the test's cloned task-frame quaternion before coordinate
conversion. Controller gains, raw command fixtures, convergence
tolerances, and step budgets match the base branch; the nullspace
damping ratio remains 1.0.

Two direct regressions guard these contracts: a moving, fixed-base
Franka checks each caller's velocity against its link Jacobian
multiplied by measured joint velocity, and a numerical check verifies
that the same rounded command resolves to the same absolute target
through root and task frames without mutating its inputs.

Provenance:

- [#5400](#5400) migrated both
OSC callers to `body_link_jacobian_w` while retaining the COM velocity
accessors.
- The rounded fixtures and unnormalized task-frame copy originated in
[#913](#913).
[#7624](#7624) later
normalized absolute pose commands, while the separately supplied frame
remained unnormalized. The exact change that first exposed the
convergence failures has not been bisected; these references establish
the input inconsistencies, not the first failing CI run.

Validation:

- Restoring COM feedback makes both velocity regression cases fail, with
a maximum linear-velocity discrepancy of 0.01469 m/s versus the 1e-4
assertion tolerance. Both pass with link-origin feedback.
- Removing frame normalization makes the target-equivalence regression
fail with a quaternion-component discrepancy of 0.00010675 versus the
1e-6 tolerance. It passes with the correction.
- The previously failing `test_franka_taskframe_pose_abs` and original
`test_franka_pose_abs_with_nullspace_centering` both pass with damping
1.0.
- Full OSC integration file: **21 passed** in 113 seconds, including all
three new regression cases.
- `uv run isaaclab -f` passes.

The earlier RL, legacy-rendering, and contrib failures have matching
failures and passing corresponding jobs in separate fixes: #7870, #7871,
and #7866, respectively. Those fixes remain separate from these OSC
corrections.

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
kellyguo11 added a commit to kellyguo11/IsaacLab-public that referenced this pull request Sep 17, 2026
…7868)

`OperationalSpaceControllerAction` and the OSC integration-test helper
used link-origin poses and Jacobians together with center-of-mass
velocity feedback. When a link rotates with an offset center of mass,
these quantities describe different points, producing incorrect velocity
feedback. The task-frame test also copied rounded command quaternions
directly into reference frames, producing inconsistent composed targets.

Use `body_link_vel_w` and `root_link_vel_w` in both OSC callers, and
normalize the test's cloned task-frame quaternion before coordinate
conversion. Controller gains, raw command fixtures, convergence
tolerances, and step budgets match the base branch; the nullspace
damping ratio remains 1.0.

Two direct regressions guard these contracts: a moving, fixed-base
Franka checks each caller's velocity against its link Jacobian
multiplied by measured joint velocity, and a numerical check verifies
that the same rounded command resolves to the same absolute target
through root and task frames without mutating its inputs.

Provenance:

- [isaac-sim#5400](isaac-sim#5400) migrated both
OSC callers to `body_link_jacobian_w` while retaining the COM velocity
accessors.
- The rounded fixtures and unnormalized task-frame copy originated in
[isaac-sim#913](isaac-sim#913).
[isaac-sim#7624](isaac-sim#7624) later
normalized absolute pose commands, while the separately supplied frame
remained unnormalized. The exact change that first exposed the
convergence failures has not been bisected; these references establish
the input inconsistencies, not the first failing CI run.

Validation:

- Restoring COM feedback makes both velocity regression cases fail, with
a maximum linear-velocity discrepancy of 0.01469 m/s versus the 1e-4
assertion tolerance. Both pass with link-origin feedback.
- Removing frame normalization makes the target-equivalence regression
fail with a quaternion-component discrepancy of 0.00010675 versus the
1e-6 tolerance. It passes with the correction.
- The previously failing `test_franka_taskframe_pose_abs` and original
`test_franka_pose_abs_with_nullspace_centering` both pass with damping
1.0.
- Full OSC integration file: **21 passed** in 113 seconds, including all
three new regression cases.
- `uv run isaaclab -f` passes.

The earlier RL, legacy-rendering, and contrib failures have matching
failures and passing corresponding jobs in separate fixes: isaac-sim#7870, isaac-sim#7871,
and isaac-sim#7866, respectively. Those fixes remain separate from these OSC
corrections.

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
(cherry picked from commit e836331)
kellyguo11 added a commit to kellyguo11/IsaacLab-public that referenced this pull request Sep 17, 2026
…7868)

`OperationalSpaceControllerAction` and the OSC integration-test helper
used link-origin poses and Jacobians together with center-of-mass
velocity feedback. When a link rotates with an offset center of mass,
these quantities describe different points, producing incorrect velocity
feedback. The task-frame test also copied rounded command quaternions
directly into reference frames, producing inconsistent composed targets.

Use `body_link_vel_w` and `root_link_vel_w` in both OSC callers, and
normalize the test's cloned task-frame quaternion before coordinate
conversion. Controller gains, raw command fixtures, convergence
tolerances, and step budgets match the base branch; the nullspace
damping ratio remains 1.0.

Two direct regressions guard these contracts: a moving, fixed-base
Franka checks each caller's velocity against its link Jacobian
multiplied by measured joint velocity, and a numerical check verifies
that the same rounded command resolves to the same absolute target
through root and task frames without mutating its inputs.

Provenance:

- [isaac-sim#5400](isaac-sim#5400) migrated both
OSC callers to `body_link_jacobian_w` while retaining the COM velocity
accessors.
- The rounded fixtures and unnormalized task-frame copy originated in
[isaac-sim#913](isaac-sim#913).
[isaac-sim#7624](isaac-sim#7624) later
normalized absolute pose commands, while the separately supplied frame
remained unnormalized. The exact change that first exposed the
convergence failures has not been bisected; these references establish
the input inconsistencies, not the first failing CI run.

Validation:

- Restoring COM feedback makes both velocity regression cases fail, with
a maximum linear-velocity discrepancy of 0.01469 m/s versus the 1e-4
assertion tolerance. Both pass with link-origin feedback.
- Removing frame normalization makes the target-equivalence regression
fail with a quaternion-component discrepancy of 0.00010675 versus the
1e-6 tolerance. It passes with the correction.
- The previously failing `test_franka_taskframe_pose_abs` and original
`test_franka_pose_abs_with_nullspace_centering` both pass with damping
1.0.
- Full OSC integration file: **21 passed** in 113 seconds, including all
three new regression cases.
- `uv run isaaclab -f` passes.

The earlier RL, legacy-rendering, and contrib failures have matching
failures and passing corresponding jobs in separate fixes: isaac-sim#7870, isaac-sim#7871,
and isaac-sim#7866, respectively. Those fixes remain separate from these OSC
corrections.

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
(cherry picked from commit e836331)
kellyguo11 added a commit to kellyguo11/IsaacLab-public that referenced this pull request Sep 17, 2026
…7868)

`OperationalSpaceControllerAction` and the OSC integration-test helper
used link-origin poses and Jacobians together with center-of-mass
velocity feedback. When a link rotates with an offset center of mass,
these quantities describe different points, producing incorrect velocity
feedback. The task-frame test also copied rounded command quaternions
directly into reference frames, producing inconsistent composed targets.

Use `body_link_vel_w` and `root_link_vel_w` in both OSC callers, and
normalize the test's cloned task-frame quaternion before coordinate
conversion. Controller gains, raw command fixtures, convergence
tolerances, and step budgets match the base branch; the nullspace
damping ratio remains 1.0.

Two direct regressions guard these contracts: a moving, fixed-base
Franka checks each caller's velocity against its link Jacobian
multiplied by measured joint velocity, and a numerical check verifies
that the same rounded command resolves to the same absolute target
through root and task frames without mutating its inputs.

Provenance:

- [isaac-sim#5400](isaac-sim#5400) migrated both
OSC callers to `body_link_jacobian_w` while retaining the COM velocity
accessors.
- The rounded fixtures and unnormalized task-frame copy originated in
[isaac-sim#913](isaac-sim#913).
[isaac-sim#7624](isaac-sim#7624) later
normalized absolute pose commands, while the separately supplied frame
remained unnormalized. The exact change that first exposed the
convergence failures has not been bisected; these references establish
the input inconsistencies, not the first failing CI run.

Validation:

- Restoring COM feedback makes both velocity regression cases fail, with
a maximum linear-velocity discrepancy of 0.01469 m/s versus the 1e-4
assertion tolerance. Both pass with link-origin feedback.
- Removing frame normalization makes the target-equivalence regression
fail with a quaternion-component discrepancy of 0.00010675 versus the
1e-6 tolerance. It passes with the correction.
- The previously failing `test_franka_taskframe_pose_abs` and original
`test_franka_pose_abs_with_nullspace_centering` both pass with damping
1.0.
- Full OSC integration file: **21 passed** in 113 seconds, including all
three new regression cases.
- `uv run isaaclab -f` passes.

The earlier RL, legacy-rendering, and contrib failures have matching
failures and passing corresponding jobs in separate fixes: isaac-sim#7870, isaac-sim#7871,
and isaac-sim#7866, respectively. Those fixes remain separate from these OSC
corrections.

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
(cherry picked from commit e836331)
kellyguo11 added a commit that referenced this pull request Sep 17, 2026
# Description

Consolidates the complete `develop` to `release/3.0.0` backport set
previously split across #7851, #7852, and #7853. Keeping the changes
together lets CI validate the runtime, task, tooling, dependency, and
renderer prerequisites as one coherent release tree.

The aggregate includes all audited develop changes through `e8363313c`,
including the latest #7866, #7867, #7868, #7869, and #7870 fixes. It
also includes the exact net patch from #7871 (`412cac434` / patch ID
`0f69afa6`) because the externally updated Franka asset already breaks
the release legacy-rendering matrix; #7871 is still pending merge to
`develop` at the time of this update.

Release CI now uses the same immutable Isaac Sim `latest-develop` digest
as `develop`:

```yaml
isaacsim_image_tag: latest-develop@sha256:223adbb0a6f1897ed78d40597dac2efc740843e8051779ffdcbb021a9edc1217
```

This supersedes #7852 and #7853.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- New feature (non-breaking change which adds functionality)
- Documentation update
- Release integration/backport

## Release backport

- [ ] <!-- backport-active-release --> Not applicable: this PR targets
`release/3.0.0` directly.

## Screenshots

Not applicable.

## Validation

- Latest five develop commits are patch-equivalent in the aggregate
tree.
- #7871 renderer fix matches its source patch ID exactly.
- `.github/workflows/config.yaml` matches `develop`.
- 33 OVRTX USD/export tests passed; 19 optional backend tests skipped
locally.
- 3 focused Franka Pour/Lift/Reorient collider regressions passed.
- 45 standalone supervisor tests passed; 386 simulator launch cases
skipped locally.
- All 23 repository skills validated.
- Ruff check and formatting check passed on all manually
merged/latest-fix Python files.
- Workflow YAML parsing, `uv lock --check`, and aggregate `git diff
--check` passed.
- Full `uv run isaaclab -f` and local docs build cannot run on macOS
ARM64 because the lock supports Linux x86_64/aarch64 and Windows AMD64;
Linux CI is authoritative for those checks.

## Checklist

- [x] I have read and understood the contribution guidelines.
- [ ] I have run the full pre-commit command locally
(platform-incompatible; focused Ruff/format checks passed and CI is
running).
- [x] I have made corresponding documentation changes.
- [x] My focused local checks generate no new warnings.
- [x] I have added/backported tests that prove the fixes are effective.
- [x] I have included changelog fragments for every touched source
package.
- [x] Contributor attribution is preserved from the source changes.

---------

Signed-off-by: Kelly Guo <kellyg@nvidia.com>
Co-authored-by: Rebecca Zhang <168459200+rebeccazhang0707@users.noreply.github.com>
Co-authored-by: Kai Pei <2047767028@qq.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: ooctipus <zhengyuz@nvidia.com>
Co-authored-by: Mustafa H <34825877+StafaH@users.noreply.github.com>
Co-authored-by: Maximilian Krause <99733341+maxkra15@users.noreply.github.com>
Co-authored-by: Ege Sekkin <72572910+nvsekkin@users.noreply.github.com>
Co-authored-by: Antoine RICHARD <antoiner@nvidia.com>
Co-authored-by: Piotr Barejko <pbarejko@nvidia.com>
Co-authored-by: nvsekkin <esekkin@nvidia.com>
Co-authored-by: camevor <camevor@nvidia.com>
Co-authored-by: hujc <jichuanh@nvidia.com>
Co-authored-by: marcodiiga <1969828+marcodiiga@users.noreply.github.com>
Co-authored-by: Alesiani Marco <marcodiiga@users.noreply.github.com>
Co-authored-by: Diego Ferigo <dferigo@rai-inst.com>
Co-authored-by: Matthew Taylor <mataylor@nvidia.com>
Co-authored-by: Yuchen Deng <yuchendeng@nvidia.com>
Co-authored-by: Daniela Hase <116915287+daniela-hase@users.noreply.github.com>
Co-authored-by: Henry Hu <yukanghu7@163.com>
Co-authored-by: r-schmitt <139814266+r-schmitt@users.noreply.github.com>
kellyguo11 added a commit that referenced this pull request Sep 18, 2026
## Summary

- Revert the OVRTX source and test changes from open PR #7871 that were
inadvertently included in release backport #7851.
- Restore the four affected implementation/test files to the exact
`develop` versions at `e8363313c1441788a4619157954b1842d3857759`.
- Preserve the older release-only OVRTX mapping compatibility code and
existing immutable changelog fragments.
- Add a corrective `isaaclab_ov` changelog fragment for this
release-only revert.

## Validation

- `tools/changelog/cli.py check --include-worktree` against
`release/3.0.0`
- `ruff check` on the four affected Python files
- `ruff format --check` on the four affected Python files
- `python -m py_compile` on the four affected Python files
- `git diff --check`
- Confirmed no diff versus `develop` for the four reverted
implementation/test files

The OVRTX runtime tests and `uv run isaaclab -f` cannot resolve on this
macOS arm64 host because the project lock supports Linux x86_64/aarch64
and Windows AMD64. Linux PR CI is the authoritative runtime validation.

## Type of change

- Bug fix (release alignment)

## Checklist

- [x] The reverted implementation and tests match `develop`
- [x] No docs branch routing changes are included
- [x] Existing changelog compilation/history differences are left
untouched
- [x] A new changelog fragment documents the release-only revert
@ooctipus ooctipus closed this Sep 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working isaac-lab Related to Isaac Lab team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants