Skip to content

Improve Franka Lift resets and continuous Reach tracking - #8171

Merged
StafaH merged 43 commits into
isaac-sim:developfrom
maxkra15:maximiliank/franka-lift-soft-upstream
Oct 2, 2026
Merged

StafaH merged 43 commits into
isaac-sim:developfrom
maxkra15:maximiliank/franka-lift-soft-upstream

Conversation

@maxkra15

@maxkra15 maxkra15 commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

Description

Improve Franka rigid Lift resets and motion regularization:

  • Associate each of the eight cloned object geometries with its matching finger opening and hand-frame orientation, independent of prototype order.
  • Apply aligned pre-grasps after the generic finger-width reset, cache static reset data, and bound reset-bank prefill.
  • Scale Franka motion penalties with success-driven ADR, avoid terminating nominal arm-velocity excursions, and terminate non-finite rigid-object states.

Restore continuous Franka Reach tracking without an early-success termination or terminal success reward. Kuka reward/curriculum configs remain unchanged. Asset, backend, actuator, Drawer, and deformable migrations belong to #8170.

Updated against develop at b7c022547 after #8170 merged. Minimal Reach, Reach-OSC, and Lift use presets=minimal; there is no separate minimal task config. The diff against develop contains only the 11 task behavior, test, and release-note files.

Behavior change: training and play use a mixed table/pregrasp reset bank. Aligned pre-grasps have a 0.75 proposal probability before rejection and bank sampling; these scores are not table-only pickup success. For a separate table-only bank, set env.events.conditional_reset.params.terms.reset_object_to_target.params.probability=0 before initialization.

Validation

At 00387a373, 60 focused Reach/Lift/preset tests and formatting/changelog checks passed against current develop. Minimal Reach (2 environments) and Lift (8 environments, reset bank reduced to two states per group) each completed 10 random-agent steps with Newton MJWarp; the Lift reset bank filled successfully. These are smoke checks, not checkpoint requalification.

At 325bdd34e: 79 focused tests, formatting/changelog checks, and a warning-free documentation build passed. All 28 fresh-public-S3 checkpoint rollouts completed with zero non-finite actions.

Rigid Lift mean success: Isaac Sim PhysX 94.7%, Newton 83.5% (seeds 40–42), and OvPhysX 91.5% (seed 42). The same checkpoints are used in #8170 and #8171; different reset distributions make this an MDP comparison, not evidence of new policy training.

At 4f0c7ce8d, the verified CI fixes from #8170 are included; 67 focused Lift/Reach/action tests and formatting/changelog checks passed. Active Isaac Sim and legacy kitless cable golden tests now pass without modifying goldens or thresholds. Full CI is being rerun.

Remaining gates: Newton's thin capsule scored 40.6%; OvPhysX's thin plate scored 52.9%. The old Newton IK-Rel artifact remains unqualified. Controlled speed measurements remain pending.

The separate ovstage-only cable renderer check also fails on unmodified develop; it is post-merge-only and is not part of the PR CI gate.

Release backport

  • Backport this pull request to the active release branch after it merges into develop

@github-actions github-actions Bot added documentation Improvements or additions to documentation isaac-lab Related to Isaac Lab team labels Sep 29, 2026
@maxkra15
maxkra15 marked this pull request as ready for review September 29, 2026 20:56
@maxkra15
maxkra15 requested a review from a team September 29, 2026 20:56
@maxkra15

Copy link
Copy Markdown
Contributor Author

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 29, 2026
@greptile-apps

greptile-apps Bot commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

[High risk] Migrates robot configs and changes task reward structures.

No outstanding finding established in this review blocks merging, but runtime and release-branch validation should still be completed.

Summary

The PR aligns Franka Lift pre-grasps with cloned object geometry, adjusts Lift resets and motion penalties, and makes Franka Reach a continuous tracking task. It also includes the prerequisite asset, backend, tooling, and documentation changes. The maximum steps for this review have been reached; broader validation remains incomplete.

Reviews (2) · Last reviewed commit: "Merge branch 'maximiliank/franka-reach-d..."

Comment thread source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka/franka_env_cfg.py Outdated

@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

Migrates Franka rigid and deformable Lift to the flat asset, adds a variant-aware reset_to_grasp pre-grasp reset, gripper-only collider presets, and success-driven motion-penalty curricula. The unresolved problems all stem from FrankaMixinCfg/FrankaSceneCfg still being shared with the registered Isaac-Reorient-Franka task, plus the undeprecated rename of a public reward config.

  • Design and architecture: The chosen split between a variant-indexed event class (reset_to_grasp, which caches the clone-plan prototype mapping at construction) and the stateless difficulty_interpolate_float helper matches the existing term structure in this package. The remaining architectural problem is placement: the Lift-only action_rate/joint_vel reward terms are installed on FrankaMixinCfg.rewards, which FrankaReorientEnvCfg also composes, while the matching annealing curriculum is declared only on FrankaLiftEnvCfg. Those terms belong on the Lift environment so the shared mixin keeps owning only what both tasks need.
  • API: Checked the new public symbols reset_to_grasp and difficulty_interpolate_float: both are listed in mdp/__init__.pyi __all__ and imported from their owning submodules, and the reset_to_grasp docstring documents units, frames, and quaternion ordering. The new arm_collisions preset key and the Physics/Colliders variant dicts resolve through the existing preset() mechanism, but the generated environment-browser table only lists arm_collisions for the Lift task even though the preset is declared on the shared FrankaSceneCfg that Isaac-Reorient-Franka also uses.
  • Compatibility and deprecation: Breaking changes: the public module-level FrankaReorientRewardCfg config class is renamed to FrankaLiftRewardCfg with no deprecated alias, targeted warning, or removal guidance, so existing imports and subclasses break immediately; and Isaac-Reorient-Franka silently acquires the new constant action_rate/joint_vel penalties through the shared FrankaMixinCfg while the changelog documents the change as Lift-only. The Franka Lift reset-distribution change itself is documented in the .major changelog fragment with explicit checkpoint requalification guidance.
  • Implementation: Traced the clone-plan prototype to environment-id mapping and its duplicate/missing-variant guards, the quaternion composition and per-variant gripper joint writes in reset_to_grasp, the joint-id scoping added to abnormal_robot_state, the non-finite guard added to out_of_bound, and the collisionEnabled filter in collect_collision_meshes. Two issues remain: the reward-term leak into Reorient described above, and reset_to_grasp.__call__ masking env_ids directly where the sibling reset_to_target called from the same conditional_reset wrapper first normalizes through env.scene._ALL_INDICES, leaving the two reset terms with different accepted selector types.
  • Style consistency: Checked stub exports, changelog fragment placement and category, docstring sections, comment intent, and preset wiring against adjacent code in the same modules. Two documentation-consistency gaps remain: the auto-generated environment-browser row for Isaac-Reorient-Franka was not regenerated alongside the shared-scene preset addition, and the collect_collision_meshes docstring still describes unqualified collision-mesh collection after the predicate began excluding prims with collisions disabled.
  • Test quality: Audited the changes to source/isaaclab_tasks/test/core/test_lift_env_cfg.py. The added pre-grasp variant-mapping, joint-scoped abnormal_robot_state, disabled-collider, and ADR-interpolation tests each own a distinct contract introduced by this PR and would fail on the pre-change code; the collider-variant and PhysX-runtime-parity tests exercise the new preset wiring without duplicating the existing preset or rendering test files in the inventory. The new test_kuka_allegro_lift_family_keeps_its_existing_reward_contract guard asserts that the Franka motion penalties stay out of the Kuka family, but no equivalent guard covers FrankaReorientEnvCfg, which is exactly where the terms currently leak.

Significant concerns. Posted 5 actionable findings inline.

Automated review; human maintainers own approval decisions.

Comment thread docs/source/_static/css/environment-browser.js Outdated
Comment thread source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka/franka_env_cfg.py Outdated
Comment thread source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/events.py
Comment thread source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/utils.py

@AntoineRichard AntoineRichard left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Took a quick look some things should be updated. A broader consideration around the way the franka assets are defined could be good too.

Comment thread source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/curriculums.py Outdated
Comment thread source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/events.py Outdated
Comment thread source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/events.py
Comment thread source/isaaclab_tasks/test/core/test_lift_env_cfg.py
Comment thread source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/utils.py
Comment thread source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka/franka_env_cfg.py Outdated
Comment thread source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka/franka_env_cfg.py Outdated
@maxkra15
maxkra15 requested a review from peterd-NV as a code owner October 1, 2026 17:47
@github-actions github-actions Bot added the isaac-mimic Related to Isaac Mimic team label Oct 1, 2026
@maxkra15

maxkra15 commented Oct 1, 2026

Copy link
Copy Markdown
Contributor Author

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 Oct 1, 2026
@maxkra15

maxkra15 commented Oct 1, 2026

Copy link
Copy Markdown
Contributor Author

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 Oct 1, 2026
kellyguo11 pushed a commit that referenced this pull request Oct 2, 2026
## Description

Migrate maintained Franka tasks, contributed configs, benchmarks, and
controller examples to the shared `FRANKA_PANDA_CFG`. Standard tasks use
full primitive arm/gripper collisions with explicit `Physics=physx` or
`Physics=mujoco` payloads.

Add `FRANKA_MINIMAL_CFG` and expose its gripper-only collision scope
through `preset()` in the existing Franka Reach and rigid Lift configs.
Select it with `presets=minimal`, including Reach OSC, while retaining
task-local controller and actuator tuning. Backend selection stays
independent of collision scope. No additional task ID or
environment-page section is added.

Preserve task-local actuator tuning, correct absolute Reach action
mapping and OSC actuator handling, and support differential-IK action
offsets in the zero agent. Reset clearance ignores disabled colliders,
and cuRobo excludes robot geometry from world obstacles even with custom
ignore lists. Legacy compatibility configs remain available; maintained
tasks no longer use them.

Lift reset/curriculum and continuous Reach tracking improvements are
isolated in dependent #8171. No USD packages, checkpoints, or new
dependencies are added to this source PR.

**Breaking:** migrated tasks change robot dynamics and collision scope.
Existing checkpoints require requalification; use explicit legacy
configs where the old contract is needed.

## Validation

At `25ad1ecfc`, based on current `develop` (`ae5d4e397`):

- 72 focused tests passed on HORDE; formatting, changelog checks, and
warning-free documentation build passed.
- 28 rollouts used fresh, SHA-256-verified public-S3 checkpoints, with
no checkpoint lookup cache and zero non-finite actions.
- Reach/OSC, Drawer, and non-camera Soft/Cloth/Cable exceeded 90%
task-level success.
- Rigid Lift is not fully qualified by this asset-only change: Newton
averaged 55.2% across seeds 40–42. The obsolete Newton IK-Rel artifact
also remains unqualified.

CI fixes at `90960d451`: excluded the robot from cuRobo world obstacles,
and prevented randomized RL resets during static cable golden capture.
The frontend checks, all six cuRobo tests, Isaac Sim RTX and active
legacy kitless cable goldens passed; existing goldens and thresholds
were unchanged. Formatting, changelog checks, and the warning-free docs
build passed.

Full CI is being rerun. The controlled speed comparison remains pending;
no performance multiplier or complete checkpoint qualification is
claimed.

The separate ovstage-only cable renderer check also fails on unmodified
`develop`; it is post-merge-only and is not part of the PR CI gate.

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

Merged latest upstream `develop` (`7c05e96ca`). Audited every test added
or changed by this PR and removed 14 redundant cases: broad asset
inventories, repeated preset combinations, comparisons of copied
defaults, and a synthetic USD-variant test. Kept regression coverage for
action normalization and offsets, zero-agent holds, disabled collider
filtering, OSC solver limits, backend payloads surviving IK overrides,
and deterministic cable golden capture.

Latest local validation: 128 focused tests passed across the six
affected suites. Nine temporary production mutations failed on the
intended retained assertions; production files were restored. Formatting
and changelog checks passed. Earlier validation included minimal Reach,
Reach OSC, and Lift random-agent rollouts and a clean warning-free
documentation build. The final test pruning does not affect rendered
docs.

---------

Co-authored-by: Mustafa Haiderbhai <mhaiderbhai@nvidia.com>
isaaclab-bot Bot pushed a commit that referenced this pull request Oct 2, 2026
## Description

Migrate maintained Franka tasks, contributed configs, benchmarks, and
controller examples to the shared `FRANKA_PANDA_CFG`. Standard tasks use
full primitive arm/gripper collisions with explicit `Physics=physx` or
`Physics=mujoco` payloads.

Add `FRANKA_MINIMAL_CFG` and expose its gripper-only collision scope
through `preset()` in the existing Franka Reach and rigid Lift configs.
Select it with `presets=minimal`, including Reach OSC, while retaining
task-local controller and actuator tuning. Backend selection stays
independent of collision scope. No additional task ID or
environment-page section is added.

Preserve task-local actuator tuning, correct absolute Reach action
mapping and OSC actuator handling, and support differential-IK action
offsets in the zero agent. Reset clearance ignores disabled colliders,
and cuRobo excludes robot geometry from world obstacles even with custom
ignore lists. Legacy compatibility configs remain available; maintained
tasks no longer use them.

Lift reset/curriculum and continuous Reach tracking improvements are
isolated in dependent #8171. No USD packages, checkpoints, or new
dependencies are added to this source PR.

**Breaking:** migrated tasks change robot dynamics and collision scope.
Existing checkpoints require requalification; use explicit legacy
configs where the old contract is needed.

## Validation

At `25ad1ecfc`, based on current `develop` (`ae5d4e397`):

- 72 focused tests passed on HORDE; formatting, changelog checks, and
warning-free documentation build passed.
- 28 rollouts used fresh, SHA-256-verified public-S3 checkpoints, with
no checkpoint lookup cache and zero non-finite actions.
- Reach/OSC, Drawer, and non-camera Soft/Cloth/Cable exceeded 90%
task-level success.
- Rigid Lift is not fully qualified by this asset-only change: Newton
averaged 55.2% across seeds 40–42. The obsolete Newton IK-Rel artifact
also remains unqualified.

CI fixes at `90960d451`: excluded the robot from cuRobo world obstacles,
and prevented randomized RL resets during static cable golden capture.
The frontend checks, all six cuRobo tests, Isaac Sim RTX and active
legacy kitless cable goldens passed; existing goldens and thresholds
were unchanged. Formatting, changelog checks, and the warning-free docs
build passed.

Full CI is being rerun. The controlled speed comparison remains pending;
no performance multiplier or complete checkpoint qualification is
claimed.

The separate ovstage-only cable renderer check also fails on unmodified
`develop`; it is post-merge-only and is not part of the PR CI gate.

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

Merged latest upstream `develop` (`7c05e96ca`). Audited every test added
or changed by this PR and removed 14 redundant cases: broad asset
inventories, repeated preset combinations, comparisons of copied
defaults, and a synthetic USD-variant test. Kept regression coverage for
action normalization and offsets, zero-agent holds, disabled collider
filtering, OSC solver limits, backend payloads surviving IK overrides,
and deterministic cable golden capture.

Latest local validation: 128 focused tests passed across the six
affected suites. Nine temporary production mutations failed on the
intended retained assertions; production files were restored. Formatting
and changelog checks passed. Earlier validation included minimal Reach,
Reach OSC, and Lift random-agent rollouts and a clean warning-free
documentation build. The final test pruning does not affect rendered
docs.

---------

Co-authored-by: Mustafa Haiderbhai <mhaiderbhai@nvidia.com>

(cherry picked from commit b7c0225)
@kellyguo11

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 Oct 2, 2026
@StafaH

StafaH commented Oct 2, 2026

Copy link
Copy Markdown
Collaborator

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 Oct 2, 2026
@StafaH StafaH added the ci:run-docker Trigger the on-demand Docker and GPU CI workflow label Oct 2, 2026
@StafaH
StafaH merged commit 34040cd into isaac-sim:develop Oct 2, 2026
90 of 91 checks passed
@isaaclab-bot

isaaclab-bot Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

Backported to release/3.0.0 as 4e1e235.

isaaclab-bot Bot pushed a commit that referenced this pull request Oct 2, 2026
## Description

Improve Franka rigid Lift resets and motion regularization:

- Associate each of the eight cloned object geometries with its matching
finger opening and hand-frame orientation, independent of prototype
order.
- Apply aligned pre-grasps after the generic finger-width reset, cache
static reset data, and bound reset-bank prefill.
- Scale Franka motion penalties with success-driven ADR, avoid
terminating nominal arm-velocity excursions, and terminate non-finite
rigid-object states.

Restore continuous Franka Reach tracking without an early-success
termination or terminal success reward. Kuka reward/curriculum configs
remain unchanged. Asset, backend, actuator, Drawer, and deformable
migrations belong to #8170.

Updated against `develop` at `b7c022547` after #8170 merged. Minimal
Reach, Reach-OSC, and Lift use `presets=minimal`; there is no separate
minimal task config. The diff against `develop` contains only the 11
task behavior, test, and release-note files.

**Behavior change:** training and play use a mixed table/pregrasp reset
bank. Aligned pre-grasps have a 0.75 proposal probability before
rejection and bank sampling; these scores are not table-only pickup
success. For a separate table-only bank, set
`env.events.conditional_reset.params.terms.reset_object_to_target.params.probability=0`
before initialization.

## Validation

At `00387a373`, 60 focused Reach/Lift/preset tests and
formatting/changelog checks passed against current `develop`. Minimal
Reach (2 environments) and Lift (8 environments, reset bank reduced to
two states per group) each completed 10 random-agent steps with Newton
MJWarp; the Lift reset bank filled successfully. These are smoke checks,
not checkpoint requalification.

At `325bdd34e`: 79 focused tests, formatting/changelog checks, and a
warning-free documentation build passed. All 28 fresh-public-S3
checkpoint rollouts completed with zero non-finite actions.

Rigid Lift mean success: Isaac Sim PhysX 94.7%, Newton 83.5% (seeds
40–42), and OvPhysX 91.5% (seed 42). The same checkpoints are used in
#8170 and #8171; different reset distributions make this an MDP
comparison, not evidence of new policy training.

At `4f0c7ce8d`, the verified CI fixes from #8170 are included; 67
focused Lift/Reach/action tests and formatting/changelog checks passed.
Active Isaac Sim and legacy kitless cable golden tests now pass without
modifying goldens or thresholds. Full CI is being rerun.

**Remaining gates:** Newton's thin capsule scored 40.6%; OvPhysX's thin
plate scored 52.9%. The old Newton IK-Rel artifact remains unqualified.
Controlled speed measurements remain pending.

The separate ovstage-only cable renderer check also fails on unmodified
`develop`; it is post-merge-only and is not part of the PR CI gate.

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

---------

Co-authored-by: Mustafa Haiderbhai <mhaiderbhai@nvidia.com>

(cherry picked from commit 34040cd)
StafaH added a commit that referenced this pull request Oct 2, 2026
## Description

Standalone scripts can leave a live `SimulationContext` when their
`launch_simulation()` scope exits. Closing Kit first can terminate the
process before physics, rendering, visualizer, and stage resources are
released.

Release contexts created inside the launch scope before closing its
runtimes. `SimulationContext.clear_instance()` now stops the simulation
before releasing resources, replacing the separate stop in
`build_simulation_context()`. Cleanup runs in `finally` before runtime
shutdown. The existing exception handlers report body or cleanup errors
and assign exit statuses; no extra catch or suppression is added. If
both the body and cleanup fail, Python chains the original error behind
the cleanup error. An existing caller-owned context is preserved.

Motivated by the ARL demo's `Destroying busy TaskGroup!` shutdown abort
in #8171:
https://github.com/isaac-sim/IsaacLab/actions/runs/36968778710/job/110721645994.
No sleeps, retries, or assertion suppression are added. No test files
are changed; the added test scaffolding was removed in favor of existing
coverage and standalone validation.

The cleanup-order defect was reproduced with temporary regression
checks, but the intermittent native abort has not been reproduced
locally. Its native task-group owner remains unidentified. This is a
draft pending validation against the failing CI image.

## Validation

- Existing launcher tests: 11 passed.
- Existing Kit simulation-context tests: 26 passed, with two existing
material deprecation warnings.
- Simplified implementation: headless ARL PhysX demo completed 10 steps
and released its context before exit. The initial implementation also
completed five consecutive runs.
- Real Kit exit checks after simplification: ValueError,
KeyboardInterrupt, and SystemExit(7) released their contexts and exited
with 1, 130, and 7 respectively. A registered resource whose cleanup
intentionally fails also cleared the context and exited with 1.
- Formatting/lint hooks, changelog validation against the upstream base,
and `git diff --check` passed.
- Earlier additional visualizer validation: 36 passed, one failed
because a test reaches `carb` without a loaded Kit runtime in the local
setup. No visualizer code is changed.

Local simulation checks used the available source-built Isaac Sim
runtime, not the internal CI image digest from the original failure.

## Type of change

- Bug fix

## Release backport

- [ ] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Checklist

- [x] I have read the contribution guidelines.
- [x] I have run the pre-commit checks with `uv run isaaclab --format`.
- [x] I have updated the affected API docstrings.
- [x] I have validated the changed behavior with focused coverage and
applied the test-audit criteria.
- [x] I have added a changelog fragment for the touched package.
- [x] My name already exists in `CONTRIBUTORS.md`.
- [ ] CI validation against the failing Kit image is complete.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

asset New asset feature or request ci:run-docker Trigger the on-demand Docker and GPU CI workflow documentation Improvements or additions to documentation isaac-lab Related to Isaac Lab team isaac-mimic Related to Isaac Mimic team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants