Skip to content

Conversation

@JinnnK
Copy link

@JinnnK JinnnK commented Nov 26, 2025

Description

Notice: The OpenArm USD files are currently under review and have not yet been officially registered.
Therefore, the current setup loads the USD assets from a separate repository. Once the assets are formally registered in Isaac Sim, the loading route will be updated accordingly. This implementation detail was prepared in consultation with Kei Kase from NVIDIA Japan.

  • Added the OpenArm assets to IsaacLab/source/isaaclab_assets/isaaclab_assets/robots.
    These assets include configurations for the OpenArm unimanual and bimanual models.

  • Added the following four environments to
    IsaacLab/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation:

    • OpenArm bimanual reach task
    • OpenArm unimanual reach task
    • OpenArm unimanual lift-a-cube task
    • OpenArm unimanual open-a-drawer task
  • Added the changelog entry for the OpenArm environments and updated extension.toml under
    IsaacLab/source/isaaclab_tasks/docs.

  • Added the OpenArm environments to IsaacLab/docs/source/overview/environments.rst.

The unit tests are as follows:

# Assuming the environment is set up for Isaac Lab v2.3.0.
# Clone the repository to load the USD assets.
git clone https://github.com/enactic/openarm_isaac_lab

# Add the path and navigate to the Isaac Lab repository.
export PYTHONPATH=$PYTHONPATH:~/openarm_isaac_lab
cd IsaacLab

# Run training.
python ./scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Reach-OpenArm-Bi-v0 --headless

# Run the test.
python ./scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Reach-OpenArm-Bi-v0 --num_envs 4

You can run different tasks and policies.

Task Description Task Name Policy Name
Reach target position (Bimanual) Isaac-Reach-OpenArm-Bi-v0 rsl_rl, rl_games, skrl
Reach target position Isaac-Reach-OpenArm-v0 rsl_rl, rl_games, skrl
Lift a cube Isaac-Lift-Cube-OpenArm-v0 rsl_rl, rl_games, skrl
Open a cabinet's drawer Isaac-Open-Drawer-OpenArm-v0 rsl_rl, rl_games, skrl

Type of change

  • New feature (non-breaking change which adds functionality)
  • Documentation update

Screenshots

Reach target position (Bimanual)

  • Screenshot

openarm_bi_reach

  • Reward function
Screenshot from 2025-11-27 15-40-46 Screenshot from 2025-11-27 15-40-54
  • Video
Screencast.from.11-27-2025.03.54.44.PM.webm

Reach target position

  • Screenshot

openarm_uni_reach

  • Reward function
Screenshot from 2025-11-27 15-46-10 Screenshot from 2025-11-27 15-46-03
  • Video
Screencast.from.11-27-2025.03.51.36.PM.webm

Lift a cube

  • Screenshot

openarm_lift

  • Reward function
Screenshot from 2025-11-27 15-44-08 Screenshot from 2025-11-27 15-43-57
  • Video
Screencast.from.11-27-2025.03.53.04.PM.webm

Open a cabinet's drawer

  • Screenshot

openarm_open_drawer

  • Reward function
Screenshot from 2025-11-27 15-45-26 Screenshot from 2025-11-27 15-45-34
  • Video
Screencast.from.11-27-2025.03.53.54.PM.webm

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 documentation Improvements or additions to documentation enhancement New feature or request asset New asset feature or request labels Nov 26, 2025
@greptile-apps
Copy link
Contributor

greptile-apps bot commented Nov 26, 2025

Greptile Overview

Greptile Summary

This PR introduces comprehensive support for OpenArm robots to Isaac Lab, adding four new manipulation environments across three different task types. The implementation includes OpenArm bimanual reach, unimanual reach, unimanual lift-cube, and unimanual cabinet drawer opening tasks. Each environment is configured with full reinforcement learning agent support for three frameworks (RSL-RL, RL Games, and SKRL).

The PR follows Isaac Lab's established patterns by creating robot-specific configuration directories under each manipulation task, similar to existing Franka and UR10 implementations. The OpenArm robot assets are loaded from an external repository (enactic/openarm_isaac_lab) as a temporary solution while USD files undergo official registration review with NVIDIA.

Key additions include robot articulation configurations for both unimanual and bimanual variants with high-PD control options, environment-specific configurations with OpenArm joint naming conventions, comprehensive agent configurations for all supported RL frameworks, and proper documentation updates including changelog entries and environment overview tables.

Important Files Changed

Filename Score Overview
source/isaaclab_assets/isaaclab_assets/robots/openarm.py 3/5 Adds OpenArm robot configurations but relies on external repository dependency
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/config/openarm/bimanual/agents/init.py 3/5 Empty initialization file missing expected agent configuration imports
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/config/openarm/unimanual/init.py 4/5 Registers OpenArm unimanual reach environments with proper RL framework support
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/config/openarm/bimanual/joint_pos_env_cfg.py 4/5 Implements OpenArm bimanual reach environment configuration with dual-arm control
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cabinet/config/openarm/joint_pos_env_cfg.py 4/5 Configures OpenArm cabinet manipulation task with robot-specific parameters
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/lift/config/openarm/init.py 4/5 Registers OpenArm lift environments including sb3 framework configuration
source/isaaclab_tasks/docs/CHANGELOG.rst 4/5 Documents new environments but contains inconsistent Gym ID formatting
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/lift/lift_openarm_env_cfg.py 4/5 Base configuration for OpenArm lift environment using MISSING placeholders
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/reach_openarm_bi_env_cfg.py 4/5 Bimanual reach environment with multiple MISSING placeholders requiring resolution
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/reach_openarm_uni_env_cfg.py 4/5 Unimanual reach base configuration with hardcoded joint names and MISSING fields
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cabinet/cabinet_openarm_env_cfg.py 4/5 Cabinet environment base configuration with abstract components using MISSING
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/lift/config/openarm/joint_pos_env_cfg.py 4/5 Complete OpenArm lift configuration with specific gripper and frame parameters
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/config/openarm/unimanual/joint_pos_env_cfg.py 4/5 OpenArm unimanual reach configuration following established robot patterns
docs/source/overview/environments.rst 5/5 Properly adds OpenArm environments to documentation with consistent formatting
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/config/openarm/bimanual/init.py 5/5 Correctly registers bimanual reach environments with proper RL framework entry points
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cabinet/config/openarm/init.py 5/5 Registers OpenArm cabinet environments following established registration patterns
Multiple agent configuration files (rl_games, rsl_rl, skrl configs) 5/5 Standard RL framework configurations with appropriate hyperparameters for manipulation tasks
Version and changelog files 5/5 Proper version bumps and documentation updates following project conventions
Empty init.py files 5/5 Standard package initialization files with correct copyright headers

Confidence score: 3/5

  • This PR introduces significant functionality but has several concerns that affect implementation robustness and maintainability
  • Score reflects the external dependency requirement, multiple MISSING placeholder values that need resolution, inconsistent documentation formatting, and empty agent initialization file that suggests incomplete implementation
  • Pay close attention to the external repository dependency in openarm.py and the numerous MISSING placeholders in base configuration files that must be properly resolved

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

Additional Comments (1)

  1. source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/config/openarm/bimanual/agents/__init__.py, line 1-5 (link)

    logic: This agents __init__.py file is empty and doesn't follow the pattern established by similar files like the ur_10 agents configuration. It should likely import agent configurations and define entry points for RL frameworks. Is this file intentionally empty, or should it contain agent configuration imports similar to the ur_10 agents __init__.py?

36 files reviewed, 7 comments

Edit Code Review Agent Settings | Greptile

time_limit_bootstrap: False
# logging and checkpoint
experiment:
directory: "openarm_lift"
Copy link
Contributor

Choose a reason for hiding this comment

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

style: Directory name uses snake_case while other similar configs use kebab-case (e.g., 'lift-cube-franka'). Should this follow the naming convention used in other experiment directories?

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!

Please `git clone https://github.com/enactic/openarm_isaac_lab` and `export PYTHONPATH=$PYTHONPATH:~/openarm_isaac_lab` to use these configurations.
"""

from source.openarm.openarm.tasks.manager_based.openarm_manipulation import OPENARM_ROOT_DIR
Copy link
Contributor

Choose a reason for hiding this comment

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

logic: Importing from external repository creates fragile dependency - users must manually clone and configure PYTHONPATH. Consider error handling if import fails. Should there be a fallback or error handling if the external repository is not available?

Comment on lines +156 to +157
OPENARM_BI_HIGH_PD_CFG.actuators["openarm_gripper"].stiffness = 2e3
OPENARM_BI_HIGH_PD_CFG.actuators["openarm_gripper"].damping = 1e2
Copy link
Contributor

Choose a reason for hiding this comment

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

style: High PD configuration sets same stiffness/damping values as base config for gripper actuators, making these lines redundant.

Suggested change
OPENARM_BI_HIGH_PD_CFG.actuators["openarm_gripper"].stiffness = 2e3
OPENARM_BI_HIGH_PD_CFG.actuators["openarm_gripper"].damping = 1e2
# Remove redundant lines since gripper values are already the same in base config


* Added reaching task environments for OpenArm unimanual robot:
* :class:`OpenArmReachEnvCfg`; Gym ID ``Isaac-Reach-OpenArm-v0``.
* :class:`OpenArmReachEnvCfg_PLAY`; Gym ID ``OpenArmReachEnvCfg_PLAY``.
Copy link
Contributor

Choose a reason for hiding this comment

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

syntax: Gym ID should be Isaac-Reach-OpenArm-Play-v0 not OpenArmReachEnvCfg_PLAY to match the pattern used in other PLAY environments

Suggested change
* :class:`OpenArmReachEnvCfg_PLAY`; Gym ID ``OpenArmReachEnvCfg_PLAY``.
* :class:`OpenArmReachEnvCfg_PLAY`; Gym ID ``Isaac-Reach-OpenArm-Play-v0``.

Comment on lines +20 to +21
* :class:`OpenArmReachEnvCfg`; Gym ID ``Isaac-Reach-OpenArm-Bi-v0``.
* :class:`OpenArmReachEnvCfg_PLAY`; Gym ID ``Isaac-Reach-OpenArm-Bi-Play-v0``.
Copy link
Contributor

Choose a reason for hiding this comment

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

logic: Class name appears to be duplicated from line 11 - should these be distinct bimanual class names? Are the bimanual environments using different class names than the unimanual ones?

Comment on lines +108 to +116
joint_names=[
"openarm_joint1",
"openarm_joint2",
"openarm_joint3",
"openarm_joint4",
"openarm_joint5",
"openarm_joint6",
"openarm_joint7",
],
Copy link
Contributor

Choose a reason for hiding this comment

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

style: Joint names are hardcoded and repeated multiple times throughout the file. Consider defining them as a constant or class attribute to reduce duplication and improve maintainability.

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!

@kellyguo11 kellyguo11 moved this to In review in Isaac Lab Nov 27, 2025
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 enhancement New feature or request

Projects

Status: In review

Development

Successfully merging this pull request may close these issues.

1 participant