Skip to content

Merge dexsuite into lift - #6732

Open
StafaH wants to merge 3 commits into
isaac-sim:developfrom
StafaH:mhaiderbhai/merge-dexsuite-into-lift
Open

Merge dexsuite into lift#6732
StafaH wants to merge 3 commits into
isaac-sim:developfrom
StafaH:mhaiderbhai/merge-dexsuite-into-lift

Conversation

@StafaH

@StafaH StafaH commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Description

Important

Confirm the pull request base before submitting. Target develop for all
contributions. The release/3.0.0-beta2 branch is a frozen stable landing
snapshot and is not used for ongoing maintenance.

Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context.
List any dependencies that are required for this change.

Fixes # (issue)

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (existing functionality will not work without user modification)
  • Documentation update

Screenshots

Please attach before and after screenshots of the change if applicable.

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 asset New asset feature or request infrastructure labels Jul 27, 2026
@StafaH
StafaH marked this pull request as ready for review July 31, 2026 05:56
@StafaH
StafaH requested a review from a team July 31, 2026 05:56
@greptile-apps

greptile-apps Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Too many files changed for review. (214 files found, 100 file limit)

Bypass the limit by tagging @greptile-apps to review.

@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 dexsuite-to-lift consolidation is internally coherent across registrations, moved modules, inheritance, runner factories, presets, and rendering tests, but several merge-blocking compatibility and runtime issues remain: public task/module APIs are removed without prior deprecation, ADR restores the invalid object-bound floor, Franka exposes an unsupported OVPhysX gravity path, and zero rotation tolerance produces invalid reward behavior. Required skip changelog fragments are also missing for three touched packages.

  • Design and architecture: The unified lift/reorient hierarchy and shared runner factories reduce duplication appropriately. However, the shared OVPhysX preset is exposed to Franka while the required removal of runtime gravity randomization remains implemented only in the KukaAllegro-specific configuration; that backend workaround should be colocated with the shared preset behavior.
  • API: The moved entry points and imports are internally consistent, but Isaac-Lift-Cube-Franka and the public isaaclab_tasks.core.dexsuite path are removed outright. Repository policy requires a prior deprecation, so deprecated forwarding registrations/modules must preserve these existing API surfaces before removal.
  • Implementation: The static out-of-bound floor is correctly derived from table geometry, but the enabled ADR curriculum overwrites it with the old 0.3 m floor at initial difficulty. The rot_std=0.0 orientation branch also divides by zero and cannot latch success with a strict < 0.0 comparison. In addition, test-only changes to isaaclab, isaaclab_rl, and isaaclab_physx require package-level .skip changelog fragments.

Significant concerns. Posted 5 actionable findings inline.

Automated review; human maintainers own approval decisions.

##

gym.register(
id="IsaacContrib-Lift-Cube-Franka",

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.

🟡 Warning · Api — Task ID renamed without deprecation alias

Isaac-Lift-Cube-Franka is no longer registered anywhere; only IsaacContrib-Lift-Cube-Franka exists. Existing commands, scripts, and gym.make() callers fail with an unregistered-env error, and the isaaclab_tasks.core.dexsuite module path is removed the same way. Repository policy requires deprecating public symbols in a prior release, so keep the old ID (and dexsuite forwarding modules) as deprecated aliases that warn.

# The floor must sit below the object's resting height on the table, otherwise the
# episode terminates as soon as the object settles. Derived from the table top so it
# cannot drift: TABLE_SLAB[2] is 0.255 and a resting 0.05 cube centres at 0.28.
"in_bound_range": {"x": (-1.5, 0.5), "y": (-2.0, 2.0), "z": (round(TABLE_SLAB[2] - 0.1, 6), 2.0)},

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.

🟡 Warning · Implementation — Curriculum restores old out-of-bound floor

The derived floor (~0.155) only holds for the static config. AdrCurriculumCfg.oob_adr still writes terminations.object_out_of_bound.params.in_bound_range.z with initial_value=(0.3, 2.0), and the curriculum is enabled by default at difficulty 0, so the floor reverts to 0.3 on the first reset and a cube resting at ~0.28 terminates again — now also penalized by early_termination. Derive oob_adr's initial value from the same constant.

physx = default
# ``physx`` resolves to whichever PhysX runtime the launcher picks; these force one.
isaacsim_physx = default
ovphysx = OvPhysxCfg(

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.

🟡 Warning · Design Architecture — Shared ovphysx preset omits gravity workaround

PhysicsCfg now offers ovphysx to every lift/reorient robot, but only KukaAllegroMixinCfg strips variable_gravity and gravity_adr for OVPhysX, which its own comment states has no runtime gravity setter. Isaac-Lift-Franka and Isaac-Reorient-Franka now advertise physics=ovphysx while EventCfg.variable_gravity still calls randomize_physics_scene_gravity. Move the omission next to the shared preset instead of one robot config.

pos_dist = torch.linalg.norm(pos_err, dim=1)
contact_mask = contacts(env, contact_threshold, thumb_name, finger_names)

if rot_std is not None:

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.

🟡 Warning · Implementation — Zero rotation tolerance divides by zero

The changelog documents rot_std=0.0 as an exact-orientation goal, but this branch computes rot_dist / rot_std. An exactly aligned pose yields 0/0 and a NaN reward, and rot_dist < 0.0 can never latch success, so the documented behavior is unreachable. Handle zero as an explicit exact-alignment comparison, or reject it, instead of evaluating the tanh quotient.

"Isaac-Reach-UR10",
# Manipulation Lift
"Isaac-Lift-Cube-Franka",
"Isaac-Lift-Franka",

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.

🔵 Suggestion · Implementation — Missing changelog fragments for touched packages

Fragments are added only under isaaclab_assets/changelog.d and isaaclab_tasks/changelog.d, but the PR also touches isaaclab, isaaclab_rl, and isaaclab_physx (test-only edits). Repository policy requires one fragment per touched package; add a <slug>.skip file under each of those three changelog.d directories.

@StafaH StafaH changed the title Mhaiderbhai/merge dexsuite into lift Merge dexsuite into lift Jul 31, 2026
@ooctipus
ooctipus force-pushed the mhaiderbhai/merge-dexsuite-into-lift branch 3 times, most recently from 9f896e5 to 2170682 Compare August 3, 2026 00:33
@github-actions github-actions Bot added the isaac-lab Related to Isaac Lab team label Aug 3, 2026
@ooctipus
ooctipus force-pushed the mhaiderbhai/merge-dexsuite-into-lift branch from 2170682 to 740705b Compare August 3, 2026 00:37

@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.

LGTM

super().__init__(cfg, env)
body_ids = cfg.params["body_asset_cfg"].body_ids
if isinstance(body_ids, list):
body_ids = torch.tensor(body_ids, dtype=torch.long, device=env.device)

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.

favor int32 for these. The API is long friendly (and fast since the last changes) but still no reason to use a long.

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.

Claude / Codex, if you read this, look for other occurencies like that in this PR. Also make sure bodies / joint indices are not acquired and converted within a call, this is expensive.

@mmichelis mmichelis 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.

Thanks for the lift env cleanup! Aside from one or two questions (and the CI fix), it looks great!

self.scene.robot = OPENARM_UNI_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot")

# Scope the joint-space terms to the OpenArm's own joints.
openarm_cfg = SceneEntityCfg("robot", joint_names=OPENARM_JOINTS)

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.

Give each manager term its own SceneEntityCfg. SceneEntityCfg.resolve() mutates the configuration by populating joint_ids. Because openarm_cfg is shared here, resolving policy/joint_pos mutates it, then resolving policy/joint_vel fails because the populated IDs are compared against the original regex names. This prevents IsaacContrib-Lift-Cube-OpenArm from initializing and currently fails the contrib environment smoke test. Please construct or copy a separate SceneEntityCfg("robot", joint_names=OPENARM_JOINTS) for each term.

return ((pos_w < self._lower) | (pos_w > self._upper)).any(dim=1)


def abnormal_robot_state(env: ManagerBasedRLEnv, asset_cfg: SceneEntityCfg = SceneEntityCfg("robot")) -> torch.Tensor:

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.

calling this abnormal robot state is a bit general, it currently specifically checks joint velocity limits, not nans or something. The termination should indicate it is specifically for joint velocity limits.

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.

ahhh good point

func=mdp.body_state_b,
noise=Unoise(n_min=-0.0, n_max=0.0),
# good behaving number for position in m, velocity in m/s, rad/s,
# and quaternion are unlikely to exceed -2 to 2 range

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.

should we put a termination on this if it exceeds it instead of clipping the state?

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.

taht could be a good follow up

object_point_cloud = ObsTerm(
func=mdp.object_point_cloud_b,
noise=Unoise(n_min=-0.0, n_max=0.0),
clip=(-2.0, 2.0), # clamp between -2 m to 2 m

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.

what's the reason for the clamp here?

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.

thats the workspace limit to control the quality of state observation data

Restore int64 indices because LEAPP's ONNX GatherND export requires them.
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 documentation Improvements or additions to documentation infrastructure isaac-lab Related to Isaac Lab team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants