Skip to content

Add SO-101 support in Isaac Lab#5989

Open
jiwenc-nv wants to merge 3 commits into
isaac-sim:developfrom
jiwenc-nv:jiwenc/so-101
Open

Add SO-101 support in Isaac Lab#5989
jiwenc-nv wants to merge 3 commits into
isaac-sim:developfrom
jiwenc-nv:jiwenc/so-101

Conversation

@jiwenc-nv

@jiwenc-nv jiwenc-nv commented Jun 5, 2026

Copy link
Copy Markdown

Description

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

@jiwenc-nv jiwenc-nv marked this pull request as draft June 5, 2026 14:54
@github-actions github-actions Bot added documentation Improvements or additions to documentation asset New asset feature or request isaac-sim Related to Isaac Sim team isaac-mimic Related to Isaac Mimic team infrastructure labels Jun 5, 2026
@jiwenc-nv jiwenc-nv changed the base branch from main to develop June 5, 2026 14:55

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🤖 Code Review — PR #5989: Add SO-101 Teleop

Latest review: Commit df713e6 (rebased onto latest develop)


Summary

This PR adds support for the TheRobotStudio SO-101 5-DOF follower arm to Isaac Lab, including:

  • Asset configuration (SO101_CFG, SO101_HIGH_PD_CFG)
  • Cube-stacking task environments (joint-position and IK-absolute)
  • Generalization of gripper MDP logic to support single-jaw grippers
  • XR teleoperation support with IsaacTeleop

✅ All Previous Issues Addressed

  1. Yaw tuple typo fixed"yaw": (-1.0, 1, 0)"yaw": (-1.0, 1.0)
  2. Test coverage addedtest_so101_teleop_pipeline.py tests the XR teleop retargeting pipeline

🟢 No New Issues

The PR was rebased onto the latest develop branch. The SO-101 implementation is unchanged from the previous review.


🟡 Non-Blocking Suggestions (for in-sim tuning)

  1. Table/Cube geometry: Base StackEnvCfg table is at pos=[0.5, 0, 0] but SO-101 cubes at x ∈ [0.15, 0.30]. Verify in-sim.

  2. Gripper limit margin: _SO101_GRIPPER_OPEN = 1.745 is at USD limit (~100°). Consider small margin.


🟢 Positive Aspects

  • Clean MDP generalization for single-jaw grippers
  • 5-DOF limitation well-documented
  • Position-only IK correctly handles under-actuated arm
  • Proper test coverage for teleop pipeline
  • Changelog fragments included

Verdict: Ready for human review — Implementation is solid and well-documented.


Update (commit 44e01de): New commits add the live EE home-latching feature (ee_frame_prim_path in IsaacTeleopCfg) and integrate it into the clutch retargeter so engaging teleop no longer snaps the arm. The _read_prim_world_matrix refactor in isaac_teleop_device.py is clean. No new issues introduced in the SO-101 changes. Non-SO-101 develop-branch changes (reach task renaming, hydra typed-selector validation, visualizer contacts/planes, version bumps) are out of scope for this review.


Update (commit 7edb2d1): Branch was rebased/squashed — all file contents are byte-identical to the previously reviewed 44e01de7. No new code changes, no new issues. Previous review findings still apply.


Update (commit 2c90531): New commits add changelog fragments (.rst files in changelog.d/ directories for isaaclab_assets, isaaclab_tasks, and isaaclab_teleop). These are documentation-only — no code changes. Previous inline comment (gripper tolerance) remains unaddressed but is non-blocking. No new issues.

@jiwenc-nv jiwenc-nv force-pushed the jiwenc/so-101 branch 2 times, most recently from a459b30 to 7d3d44c Compare June 5, 2026 23:35
@jiwenc-nv jiwenc-nv changed the title DRAFT: Jiwenc/so 101 Add SO-101 ARM support in Isaac Lab Jun 6, 2026
@jiwenc-nv jiwenc-nv force-pushed the jiwenc/so-101 branch 3 times, most recently from 44e01de to 7edb2d1 Compare June 7, 2026 05:49
@jiwenc-nv jiwenc-nv changed the title Add SO-101 ARM support in Isaac Lab Add SO-101 support in Isaac Lab Jun 7, 2026
@jiwenc-nv jiwenc-nv marked this pull request as ready for review June 7, 2026 05:56
@greptile-apps

greptile-apps Bot commented Jun 7, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds SO-101 (TheRobotStudio 5-DOF arm) support to Isaac Lab, introducing a robot asset config, two stacking task environments (joint-position and IK-Abs), three custom XR teleop retargeters (clutch EE-pose, analog gripper, wrist-roll), and corresponding teleop infrastructure extensions. The MDP observation and termination helpers are generalised from parallel-gripper-only to support single-jaw grippers.

  • so101.py adds SO101_CFG / SO101_HIGH_PD_CFG following the Franka pattern; stack_joint_pos_env_cfg.py seats and configures the robot for the stacking workspace.
  • Three retargeter modules implement clutch-rebased absolute EE-pose control, analog trigger-to-closedness gripper mapping, and swing-twist wrist-roll extraction; stack_ik_abs_env_cfg.py wires them into a 5D action pipeline.
  • isaac_teleop_device.py / session_lifecycle.py are extended with an optional live-EE-pose input so engaging teleop latches the arm's current pose rather than a hardcoded home.

Confidence Score: 3/5

Safe to merge after fixing the import guard bug; all other concerns are tuning and tolerance questions that do not affect correctness for installations with isaacteleop present.

The retargeter modules unconditionally import from isaacteleop at their own module top level, so importing stack_ik_abs_env_cfg without isaacteleop installed raises an unhandled ImportError despite the try/except block that is intended to make the module degrade gracefully. The _TELEOP_AVAILABLE = False branch is unreachable in that scenario. Additionally, the open-position success condition uses a sub-milliradian tolerance that may be unachievable with the SO-101's soft gripper actuator in the joint-position task, potentially making the stacking success signal never fire.

stack_ik_abs_env_cfg.py needs the retargeter imports moved inside the try/except block. observations.py and terminations.py warrant a revisit of the atol/rtol=1e-4 gripper-open tolerance once the robot is validated in simulation.

Important Files Changed

Filename Overview
source/isaaclab_tasks/isaaclab_tasks/contrib/stack/config/so101/stack_ik_abs_env_cfg.py Adds SO-101 IK-Abs env config with clutch/gripper/roll retargeters; has a P1 import bug where retargeter modules (which directly import isaacteleop) are imported unconditionally outside the try/except guard, crashing the module when isaacteleop is absent.
source/isaaclab_tasks/isaaclab_tasks/contrib/stack/config/so101/stack_joint_pos_env_cfg.py Defines the SO-101 joint-position stacking env; seats the robot at the correct table pose, sets up cube workspace, and configures frame transformers. Several TODO(verify-in-sim) annotations on base seat position and workspace bounds are expected for a new robot bring-up.
source/isaaclab_tasks/isaaclab_tasks/contrib/stack/config/so101/clutch_retargeter.py Implements clutch-style absolute EE-pose retargeter with well-documented frame math; production constants for home position, scale, and rotation axis are marked TODO(verify-in-sim) and pinned to seat pose via unit tests.
source/isaaclab_tasks/isaaclab_tasks/contrib/stack/mdp/observations.py Generalises gripper_pos/object_grasped/object_stacked to handle single-jaw and multi-jaw grippers; logic is correct but the atol/rtol=1e-4 open-position check may be unreachable with the SO-101's soft (stiffness=17.8) gripper actuator.
source/isaaclab_tasks/isaaclab_tasks/contrib/stack/mdp/terminations.py Same generalisation as observations.py for cubes_stacked; shares the same tight tolerance concern for soft actuators.
source/isaaclab_teleop/isaaclab_teleop/isaac_teleop_device.py Refactors prim world-matrix reading into a shared _read_prim_world_matrix helper and adds _get_ee_frame_world_matrix; the inversion logic is preserved correctly in the refactored _get_target_frame_T_world.

Sequence Diagram

sequenceDiagram
    participant XR as XR Controller
    participant Dev as IsaacTeleopDevice
    participant SL as TeleopSessionLifecycle
    participant CR as SO101ClutchRetargeter
    participant GR as SO101GripperRetargeter
    participant RR as SO101RollRetargeter
    participant TR as TensorReorderer
    participant Env as IsaacLab Env

    Dev->>Dev: _get_ee_frame_world_matrix()
    Dev->>SL: step(anchor_fn, target_T_world, ee_world_matrix)
    SL->>SL: _build_external_inputs() feeds world_T_anchor + robot_ee_pos
    XR-->>CR: grip_pos + grip_ori (transformed)
    SL-->>CR: robot_ee_pos (world_T_ee)
    CR->>CR: "clutch latch on engage, home = live EE pos (base frame)"
    CR->>TR: ee_pose 7D pos_xyz + quat_xyzw
    XR-->>GR: trigger_value
    GR->>TR: gripper_command closedness in 0-1
    XR-->>RR: grip_orientation
    RR->>TR: roll_command swing-twist angle rad
    TR->>TR: output_order pos_x pos_y pos_z roll_value gripper_value
    TR->>Env: action 5D
    Env->>Env: DiffIK(pos_xyz) + JointPos(roll) + JointPos(gripper)
Loading

Comments Outside Diff (1)

  1. source/isaaclab_tasks/isaaclab_tasks/contrib/stack/config/so101/stack_ik_abs_env_cfg.py, line 762-765 (link)

    P1 Unconditional retargeter imports break the _TELEOP_AVAILABLE guard

    The three retargeter modules (clutch_retargeter, gripper_retargeter, roll_retargeter) each unconditionally import from isaacteleop.* at their own module level. The try/except only covers import isaacteleop and from isaaclab_teleop import IsaacTeleopCfg, so when isaacteleop is absent the except branch sets _TELEOP_AVAILABLE = False — but the very next unconditional from .clutch_retargeter import ... immediately raises another ImportError that is not caught. Any caller importing this module without isaacteleop installed will crash with an unhandled error, making the _TELEOP_AVAILABLE = False path unreachable. Move the three retargeter imports into the same try block.

Reviews (1): Last reviewed commit: "Add SO-101 cube-stack task with XR teleo..." | Re-trigger Greptile

Comment on lines +384 to 394
torch.isclose(
robot.data.joint_pos.torch[:, joint_id],
open_val,
atol=1e-4,
rtol=1e-4,
),
stacked,
)
else:
raise ValueError("No gripper_joint_names found in environment config")

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.

P2 object_stacked open-position tolerance may be too tight for the SO-101 soft actuator

atol=1e-4, rtol=1e-4 requires the gripper joint to be within ≈0.0003 rad (≈0.017°) of gripper_open_val = 1.745. For the joint-position config (SO101_CFG), the gripper actuator has stiffness 17.8, which is soft enough that gravity and contact residuals can leave the joint several tenths of a radian away from the commanded target. In practice this means object_stacked may never return True for the SO-101 joint-position task, since the gripper cannot reliably settle within the sub-milliradian band. The corresponding cubes_stacked termination in terminations.py has the same threshold. Consider widening the tolerance or using a dedicated gripper_threshold parameter for this check.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

jiwenc-nv added 3 commits June 9, 2026 06:47
Add an SO-101 (5-DOF) cube-stacking environment driven by XR
teleoperation through the IsaacTeleop retargeting pipeline.

- Add the SO-101 robot asset and register it in isaaclab_assets.
- Add Isaac-Stack-Cube-SO101 joint-position and IK-Abs task configs. The
  5-DOF arm uses position-only IK over four joints, with the wrist roll
  driven directly and an analog gripper, flattened to a 5D action
  [pos_x, pos_y, pos_z, roll, gripper].
- Build the teleop pipeline from the SO-101 retargeters provided by
  Isaac Teleop (isaacteleop.retargeters): SO101ClutchRetargeter
  (relative-origin EE pose), SO101RollRetargeter (wrist-roll
  swing-twist), and SO101GripperRetargeter (analog gripper).

The clutch retargeter (in Isaac Teleop) latches the controller origin on
the first RUNNING frame, rotates the world-frame controller delta into
the seated base frame (yawed +90 deg about +Z), and latches the robot's
live end-effector pose as home on engage, so engaging teleop does not
jerk the arm. This task supplies that live pose:

isaaclab_teleop: add IsaacTeleopCfg.ee_frame_prim_path; the device reads
that prim's world transform each frame and supplies it to the pipeline
as the robot_ee_pos ValueInput leaf (passed through verbatim, not
composed with the anchor/rebase transforms).

Add sim-free tests for the Lab-side pipeline wiring (5D action width and
element order) and pin the clutch's seat-derived constants in Isaac
Teleop to this task's base seat pose. The retargeter math itself is unit
tested in Isaac Teleop.
Backfill the isaaclab_assets, isaaclab_tasks, and isaaclab_teleop
changelog.d entries for the SO-101 cube-stack work (one consolidated
minor fragment per package), as required by the nightly changelog and
version compilation.
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-mimic Related to Isaac Mimic team isaac-sim Related to Isaac Sim team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant