Skip to content

Franka Sim to SIm#6457

Merged
ooctipus merged 14 commits into
isaac-sim:developfrom
ooctipus:so101_keyboard
Jul 18, 2026
Merged

Franka Sim to SIm#6457
ooctipus merged 14 commits into
isaac-sim:developfrom
ooctipus:so101_keyboard

Conversation

@ooctipus

@ooctipus ooctipus commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

Description

Depends on #6481

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 updated the changelog and the corresponding version in the extension's config/extension.toml file
  • I have added my name to the CONTRIBUTORS.md or my name already exists there

@github-actions github-actions Bot added asset New asset feature or request isaac-sim Related to Isaac Sim team labels Jul 10, 2026
@greptile-apps

greptile-apps Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds Franka Panda sim-to-sim support for the dexsuite lift/reorient tasks, including robot-specific configs, a new conditional-reset system with Warp-based collision validation, and physics parameter updates for both Franka and Kuka-Allegro.

  • New Franka dexsuite environments: Adds Isaac-Reorient-Franka, Isaac-Lift-Franka and their PLAY variants with per-joint impedance gains inspired by libfranka, a passive mimic finger, gripper closing-speed DR, and spawn-in-hand curriculum reset.
  • conditional_reset infrastructure: New events.py and events_cfg.py implement rejection-sampling reset with Warp mesh/slab clearance criteria; replaces the previous flat event list across both Franka and Kuka-Allegro configs.
  • FRANKA_PANDA_CFG asset path change: Base config switches from panda_instanceable.usd to franka_panda.usda, affecting all 20+ existing Franka task configs, tests, and example scripts outside this diff.

Confidence Score: 1/5

Not safe to merge: the Franka environments fail to import due to a missing module, and the base Franka robot config change may break all existing Franka tasks.

The new Franka dexsuite environments import from .camera_cfg import StateObservationCfg, but camera_cfg.py does not exist in the franka config directory. Every gym environment registered in config/franka/__init__.py will raise ModuleNotFoundError at import time. Additionally, changing the base FRANKA_PANDA_CFG USD path from panda_instanceable.usd to franka_panda.usda affects 20+ tasks that were not modified in this PR; if the new nucleus asset is not already published, those tasks will silently fail at spawn time.

config/franka/dexsuite_franka_env_cfg.py has the broken import; robots/franka.py carries the high-blast-radius USD path change; mdp/events.py is otherwise well-implemented but the in-place dict clearing warrants a second look.

Important Files Changed

Filename Overview
source/isaaclab_assets/isaaclab_assets/robots/franka.py Consolidates arm actuators into panda_arm, adds per-joint stiffness/damping/armature values, splits the gripper into a driven and passive joint, and changes the base USD from panda_instanceable.usd to franka_panda.usda. The USD path change is a breaking change for all 20+ existing Franka tasks if the nucleus asset is not yet published.
source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/config/franka/dexsuite_franka_env_cfg.py New Franka dexsuite environment config. Has a hard import failure: from .camera_cfg import StateObservationCfg references a module that does not exist in this directory, making all four registered gym environments unloadable.
source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/mdp/events.py New file adding conditional reset with rejection sampling, Warp-backed mesh/slab clearance criteria, and shared-offset gripper reset. Logic appears sound; terms.clear() / valid_criteria.clear() mutates EventTermCfg.params in-place after prefill.
source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/dexsuite_env_cfg.py Restructures reset logic into conditional_reset, switches termination to joint_vel_out_of_limit, replaces action L2 penalties with mechanical_energy, adjusts reward weights/stds, and adds promotion_only to PLAY configs. The term_keys string→list fix for is_terminated_term is a genuine bug fix.
source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/mdp/observations.py Converts body_state_b from a function to a class to cache body indices; adds include_vel flag. Observation vector width changes from 13 to 7 per body when include_vel=False, which is a breaking change for any checkpointed policies.
source/isaaclab_assets/isaaclab_assets/robots/kuka_allegro.py Removes disable_gravity=True (gravity now enabled), updates effort/velocity limits and per-joint armature/damping to SDF-referenced values. Removal of gravity disable is a significant behavioral change for the kuka arm.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant RL as RL Trainer
    participant EM as EventManager
    participant CR as conditional_reset
    participant BUF as State Buffer
    participant MC as mesh_clearance
    participant SC as slab_clearance

    Note over CR,BUF: First reset - prefill phase
    RL->>EM: reset(env_ids)
    EM->>CR: call(env_ids, terms, valid_criteria)
    loop until buffer full per group
        CR->>CR: roll_once - apply nested reset terms
        CR->>MC: call(env, env_ids) returns bool mask
        CR->>SC: call(env, env_ids) returns bool mask
        CR->>BUF: get_reset_state for valid_ids
    end
    CR->>CR: terms.clear and valid_criteria.clear

    Note over CR,BUF: Subsequent resets - replay phase
    RL->>EM: reset(env_ids)
    EM->>CR: call(env_ids)
    CR->>BUF: sample rows by asset-combination group
    CR->>CR: set_reset_state with sampled states
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant RL as RL Trainer
    participant EM as EventManager
    participant CR as conditional_reset
    participant BUF as State Buffer
    participant MC as mesh_clearance
    participant SC as slab_clearance

    Note over CR,BUF: First reset - prefill phase
    RL->>EM: reset(env_ids)
    EM->>CR: call(env_ids, terms, valid_criteria)
    loop until buffer full per group
        CR->>CR: roll_once - apply nested reset terms
        CR->>MC: call(env, env_ids) returns bool mask
        CR->>SC: call(env, env_ids) returns bool mask
        CR->>BUF: get_reset_state for valid_ids
    end
    CR->>CR: terms.clear and valid_criteria.clear

    Note over CR,BUF: Subsequent resets - replay phase
    RL->>EM: reset(env_ids)
    EM->>CR: call(env_ids)
    CR->>BUF: sample rows by asset-combination group
    CR->>CR: set_reset_state with sampled states
Loading

Comments Outside Diff (1)

  1. source/isaaclab_assets/isaaclab_assets/robots/franka.py, line 10 (link)

    P1 Base config USD path change breaks all existing Franka tasks

    FRANKA_PANDA_CFG is the common base for 20+ existing tasks (reach, lift, cabinet, stack, tests, …). Changing panda_instanceable.usd to franka_panda.usda will break every one of them if franka_panda.usda is not already published at ISAACLAB_NUCLEUS_DIR/Robots/FrankaEmika/. The old panda_instanceable.usd is still referenced in cabinet_direct_env_cfg.py and several tests outside this diff. This should either go through a compatibility shim (e.g. a new FRANKA_PANDA_MENAGERIE_CFG constant) or be explicitly gated to confirm the nucleus asset is available before landing.

Reviews (2): Last reviewed commit: "Merge branch 'develop' into so101_keyboa..." | Re-trigger Greptile

Comment on lines +844 to +846
# keep descending: articulation links may be authored as nested rigid bodies
# (e.g. MuJoCo-converted assets), so a rigid body can have rigid-body children
all_prims += child_prim.GetChildren()

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.

P1 Unconditional child descent may quadratically inflate traversal on non-MuJoCo assets

The previous code stopped descending into the children of any prim that already carries RigidBodyAPI — a correct optimisation for standard PhysX assets where nested rigid bodies are disallowed. The new code always appends children regardless, so for a standard USD articulation (e.g. a Franka loaded from panda_instanceable) every rigid-body link now adds its own children back to the queue even though those children will never have a second RigidBodyAPI. For a 7-link arm with ~10 geometry children per link this multiplies prims visited by roughly 10×. The stated justification ("articulation links may be authored as nested rigid bodies in MuJoCo-converted assets") applies only to those assets but is now applied unconditionally to every asset type.

Comment thread source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/dexsuite_env_cfg.py Outdated

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

That's not the So101 keyboard? @ooctipus

@ooctipus ooctipus changed the title So101 keyboard Franka Sim to SIm Jul 13, 2026
@ooctipus
ooctipus force-pushed the so101_keyboard branch 3 times, most recently from 4b82c0f to 1831952 Compare July 14, 2026 02:49
@ooctipus

Copy link
Copy Markdown
Collaborator Author

@greptile-apps review pls


from ... import dexsuite_env_cfg as dexsuite
from ... import mdp
from .camera_cfg import StateObservationCfg

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.

P0 Missing camera_cfg module causes import failure

camera_cfg.py does not exist in the franka config directory (config/franka/), so this import will raise ModuleNotFoundError at module load time, making every gym environment registered in config/franka/__init__.py (Isaac-Reorient-Franka, Isaac-Lift-Franka, etc.) fail to instantiate. The analogous kuka_allegro/camera_cfg.py exists and defines StateObservationCfg; the franka equivalent is absent. The PR description notes a dependency on #6481, which may add this file — but as submitted the module is unrunnable.

Comment thread source/isaaclab/changelog.d/so101-keyboard.skip Outdated
Comment thread source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/mdp/events.py
Comment thread source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/mdp/rewards.py Outdated
Comment thread source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/mdp/utils.py Outdated
@ooctipus
ooctipus force-pushed the so101_keyboard branch 2 times, most recently from 724f646 to a46fe3b Compare July 17, 2026 05:19
ooctipus added 10 commits July 16, 2026 22:33
Sync PR isaac-sim#6481 review feedback: rename motor to joint velocity
terminology, warn when an implicit actuator sets only velocity_limit,
and fix partial velocity_limit dicts zeroing unmatched joints.
Partial-dict zero-fill is the uniform convention of
_parse_joint_parameter for all actuator parameters; the carve-out made
dict semantics inconsistent across actuator types.
The panda_shoulder and panda_forearm actuators were merged into panda_arm
in FRANKA_PANDA_CFG. Update the three test helpers that still referenced
the old keys, and add the required isaaclab_assets changelog fragment.
The Nucleus server replaced panda_instanceable.usd with
franka_panda.usda; the cabinet direct task carried the last stale
reference. Joint naming is unchanged between the assets.
The original panda_instanceable.usd moved to Legacy/ on the Nucleus
server; the cabinet task keeps the same robot model at its new home.
The Nucleus asset reorganization moved panda_instanceable.usd under
Robots/FrankaEmika/Legacy/. Point FRANKA_PANDA_CFG at that new location
and drop the panda_arm actuator rework from it, so upstream franka
tasks, mimic demos, and determinism baselines keep the exact robot they
were built on.

The menagerie-converted franka_panda.usda and its calibrated actuators
move into the dexsuite franka config as FRANKA_PANDA_DEXSUITE_CFG,
which is the only consumer. This also reverts the panda_arm rename
adaptations in the OSC tests and reach task, and removes the now
change-free newton/physx changelog fragments.

Also add the missing camera_cfg module the dexsuite franka config
imports; it previously only existed as a local build artifact.
Reverting the operational-space test adaptation left the package with
no changes, so the placeholder fragment no longer belongs.
@ooctipus
ooctipus requested a review from a team July 18, 2026 01:14
@ooctipus
ooctipus merged commit 564a008 into isaac-sim:develop Jul 18, 2026
35 of 38 checks passed
@YizeWang YizeWang mentioned this pull request Jul 19, 2026
7 tasks
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 isaac-sim Related to Isaac Sim team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants