Skip to content

Commit 0ef5d00

Browse files
ooctipuskellyguo11
authored andcommitted
Adds dexterous lift and reorientation manipulation environments (#3378)
# Description This PR provides remake and extension to orginal environment kuka-allegro-reorientation implemented in paper: DexPBT: Scaling up Dexterous Manipulation for Hand-Arm Systems with Population Based Training (https://arxiv.org/abs/2305.12127) [Aleksei Petrenko](https://arxiv.org/search/cs?searchtype=author&query=Petrenko,+A), [Arthur Allshire](https://arxiv.org/search/cs?searchtype=author&query=Allshire,+A), [Gavriel State](https://arxiv.org/search/cs?searchtype=author&query=State,+G), [Ankur Handa](https://arxiv.org/search/cs?searchtype=author&query=Handa,+A), [Viktor Makoviychuk](https://arxiv.org/search/cs?searchtype=author&query=Makoviychuk,+V) and another environment kuka-allegro-lift implemented in paper: Visuomotor Policies to Grasp Anything with Dexterous Hands (https://dextrah-rgb.github.io/) [Ritvik Singh](https://www.ritvik-singh.com/), [Arthur Allshire](https://allshire.org/), [Ankur Handa](https://ankurhanda.github.io/), [Nathan Ratliff](https://www.nathanratliff.com/), [Karl Van Wyk](https://scholar.google.com/citations?user=TCYAoF8AAAAJ&hl=en) Though this is a remake, this remake ends up differs quite a lot in environment details for reasons like: 1. Simplify reward structure, 2. Unify environment implemtation, 3. Standarize mdp, 4. Utilizes manager-based API That in my opinion, makes environment study and extension more accessible, and analyzable. For example you can train lift policy first then continuing the checkpoint in reorientation environment, since they share the observation space. : )) It is a best to consider this a very careful re-interpretation rather than exact execution to migrate them to IsaacLab Here is the training curve if you just train with `./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Dexsuite-Kuka-Allegro-Lift-v0 --num_envs 8192 --headless` `./isaaclab.sh -p -m torch.distributed.run --nnodes=1 --nproc_per_node=4 scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Dexsuite-Kuka-Allegro-Reorient-v0 --num_envs 40960 --headless --distributed` lift training ~ 4 hours reorientation training ~ 2 days Note that it requires a order of magnitude more data and time for reorientation to converge compare to lift under almost identical setup training curve(screen captured from Wandb) - reward, Cyan: reorient, Purple: Lift <img width="1487" height="780" alt="Screenshot from 2025-09-07 22-58-13" src="https://github.com/user-attachments/assets/bfa911de-4fee-4c0d-b39c-e9c33fae28f4" /> video results lift ![cone_lift](https://github.com/user-attachments/assets/e626eadb-b281-4ec9-af16-57f626fcc6aa) ![fat_capsule_lift](https://github.com/user-attachments/assets/cde57d4c-ceb2-40ab-88dd-44320da689c5) reorient ![cube_reorient](https://github.com/user-attachments/assets/752809cb-ea19-4701-b124-20c1909e4566) ![rod_reorient](https://github.com/user-attachments/assets/f009605a-d93c-491c-b124-ff08606c63ec) Memo: I really enjoy working on this remake, and hopefully for whoever plan to play and extend on this remake find it helpful and similarily joyful as I did. I will be very excited to see what you got : )) Octi CAUTION: Do Not Merge until the asset is uploaded to S3 bucket! Fixes # (issue) <!-- As you go through the list, delete the ones that are not applicable. --> - New feature (non-breaking change which adds functionality) ## Screenshots Please attach before and after screenshots of the change if applicable. <!-- Example: | Before | After | | ------ | ----- | | _gif/png before_ | _gif/png after_ | To upload images to a PR -- simply drag and drop an image while in edit mode and it should upload the image directly. You can then paste that source into the above before/after sections. --> ## Checklist - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there <!-- As you go through the checklist above, you can mark something as done by putting an x character in it For example, - [x] I have done this task - [ ] I have not done this task -->
1 parent c7f92f6 commit 0ef5d00

File tree

25 files changed

+2101
-49
lines changed

25 files changed

+2101
-49
lines changed
46.6 KB
Loading
50.9 KB
Loading

docs/source/overview/environments.rst

Lines changed: 61 additions & 48 deletions
Large diffs are not rendered by default.

source/isaaclab_assets/isaaclab_assets/robots/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from .humanoid import *
1919
from .humanoid_28 import *
2020
from .kinova import *
21+
from .kuka_allegro import *
2122
from .pick_and_place import *
2223
from .quadcopter import *
2324
from .ridgeback_franka import *
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
2+
# All rights reserved.
3+
#
4+
# SPDX-License-Identifier: BSD-3-Clause
5+
6+
"""Configuration for the Kuka-lbr-iiwa arm robots and Allegro Hand.
7+
8+
The following configurations are available:
9+
10+
* :obj:`KUKA_ALLEGRO_CFG`: Kuka Allegro with implicit actuator model.
11+
12+
Reference:
13+
14+
* https://www.kuka.com/en-us/products/robotics-systems/industrial-robots/lbr-iiwa
15+
* https://www.wonikrobotics.com/robot-hand
16+
17+
"""
18+
19+
import isaaclab.sim as sim_utils
20+
from isaaclab.actuators.actuator_cfg import ImplicitActuatorCfg
21+
from isaaclab.assets.articulation import ArticulationCfg
22+
from isaaclab.utils.assets import ISAACLAB_NUCLEUS_DIR
23+
24+
##
25+
# Configuration
26+
##
27+
28+
KUKA_ALLEGRO_CFG = ArticulationCfg(
29+
spawn=sim_utils.UsdFileCfg(
30+
usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/KukaAllegro/kuka.usd",
31+
activate_contact_sensors=True,
32+
rigid_props=sim_utils.RigidBodyPropertiesCfg(
33+
disable_gravity=True,
34+
retain_accelerations=True,
35+
linear_damping=0.0,
36+
angular_damping=0.0,
37+
max_linear_velocity=1000.0,
38+
max_angular_velocity=1000.0,
39+
max_depenetration_velocity=1000.0,
40+
),
41+
articulation_props=sim_utils.ArticulationRootPropertiesCfg(
42+
enabled_self_collisions=True,
43+
solver_position_iteration_count=32,
44+
solver_velocity_iteration_count=1,
45+
sleep_threshold=0.005,
46+
stabilization_threshold=0.0005,
47+
),
48+
joint_drive_props=sim_utils.JointDrivePropertiesCfg(drive_type="force"),
49+
),
50+
init_state=ArticulationCfg.InitialStateCfg(
51+
pos=(0.0, 0.0, 0.0),
52+
rot=(1.0, 0.0, 0.0, 0.0),
53+
joint_pos={
54+
"iiwa7_joint_(1|2|7)": 0.0,
55+
"iiwa7_joint_3": 0.7854,
56+
"iiwa7_joint_4": 1.5708,
57+
"iiwa7_joint_(5|6)": -1.5708,
58+
"(index|middle|ring)_joint_0": 0.0,
59+
"(index|middle|ring)_joint_1": 0.3,
60+
"(index|middle|ring)_joint_2": 0.3,
61+
"(index|middle|ring)_joint_3": 0.3,
62+
"thumb_joint_0": 1.5,
63+
"thumb_joint_1": 0.60147215,
64+
"thumb_joint_2": 0.33795027,
65+
"thumb_joint_3": 0.60845138,
66+
},
67+
),
68+
actuators={
69+
"kuka_allegro_actuators": ImplicitActuatorCfg(
70+
joint_names_expr=[
71+
"iiwa7_joint_(1|2|3|4|5|6|7)",
72+
"index_joint_(0|1|2|3)",
73+
"middle_joint_(0|1|2|3)",
74+
"ring_joint_(0|1|2|3)",
75+
"thumb_joint_(0|1|2|3)",
76+
],
77+
effort_limit_sim={
78+
"iiwa7_joint_(1|2|3|4|5|6|7)": 300.0,
79+
"index_joint_(0|1|2|3)": 0.5,
80+
"middle_joint_(0|1|2|3)": 0.5,
81+
"ring_joint_(0|1|2|3)": 0.5,
82+
"thumb_joint_(0|1|2|3)": 0.5,
83+
},
84+
stiffness={
85+
"iiwa7_joint_(1|2|3|4)": 300.0,
86+
"iiwa7_joint_5": 100.0,
87+
"iiwa7_joint_6": 50.0,
88+
"iiwa7_joint_7": 25.0,
89+
"index_joint_(0|1|2|3)": 3.0,
90+
"middle_joint_(0|1|2|3)": 3.0,
91+
"ring_joint_(0|1|2|3)": 3.0,
92+
"thumb_joint_(0|1|2|3)": 3.0,
93+
},
94+
damping={
95+
"iiwa7_joint_(1|2|3|4)": 45.0,
96+
"iiwa7_joint_5": 20.0,
97+
"iiwa7_joint_6": 15.0,
98+
"iiwa7_joint_7": 15.0,
99+
"index_joint_(0|1|2|3)": 0.1,
100+
"middle_joint_(0|1|2|3)": 0.1,
101+
"ring_joint_(0|1|2|3)": 0.1,
102+
"thumb_joint_(0|1|2|3)": 0.1,
103+
},
104+
friction={
105+
"iiwa7_joint_(1|2|3|4|5|6|7)": 1.0,
106+
"index_joint_(0|1|2|3)": 0.01,
107+
"middle_joint_(0|1|2|3)": 0.01,
108+
"ring_joint_(0|1|2|3)": 0.01,
109+
"thumb_joint_(0|1|2|3)": 0.01,
110+
},
111+
),
112+
},
113+
soft_joint_pos_limit_factor=1.0,
114+
)

source/isaaclab_tasks/config/extension.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22

33
# Note: Semantic Versioning is used: https://semver.org/
4-
version = "0.10.51"
4+
version = "0.11.0"
55

66
# Description
77
title = "Isaac Lab Environments"

source/isaaclab_tasks/docs/CHANGELOG.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
Changelog
22
---------
33

4+
0.11.0 (2025-09-07)
5+
~~~~~~~~~~~~~~~~~~~~
6+
7+
Added
8+
^^^^^
9+
10+
* Added dextrous lifting and dextrous reorientation manipulation rl environments.
11+
12+
413
0.10.51 (2025-09-08)
514
~~~~~~~~~~~~~~~~~~~~
615

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
2+
# All rights reserved.
3+
#
4+
# SPDX-License-Identifier: BSD-3-Clause
5+
6+
"""Dexsuite environments.
7+
8+
Implementation Reference:
9+
10+
Reorient:
11+
@article{petrenko2023dexpbt,
12+
title={Dexpbt: Scaling up dexterous manipulation for hand-arm systems with population based training},
13+
author={Petrenko, Aleksei and Allshire, Arthur and State, Gavriel and Handa, Ankur and Makoviychuk, Viktor},
14+
journal={arXiv preprint arXiv:2305.12127},
15+
year={2023}
16+
}
17+
18+
Lift:
19+
@article{singh2024dextrah,
20+
title={Dextrah-rgb: Visuomotor policies to grasp anything with dexterous hands},
21+
author={Singh, Ritvik and Allshire, Arthur and Handa, Ankur and Ratliff, Nathan and Van Wyk, Karl},
22+
journal={arXiv preprint arXiv:2412.01791},
23+
year={2024}
24+
}
25+
26+
"""
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
2+
# All rights reserved.
3+
#
4+
# SPDX-License-Identifier: BSD-3-Clause
5+
6+
from isaaclab.managers import CurriculumTermCfg as CurrTerm
7+
from isaaclab.utils import configclass
8+
9+
from . import mdp
10+
11+
12+
@configclass
13+
class CurriculumCfg:
14+
"""Curriculum terms for the MDP."""
15+
16+
# adr stands for automatic/adaptive domain randomization
17+
adr = CurrTerm(
18+
func=mdp.DifficultyScheduler, params={"init_difficulty": 0, "min_difficulty": 0, "max_difficulty": 10}
19+
)
20+
21+
joint_pos_unoise_min_adr = CurrTerm(
22+
func=mdp.modify_term_cfg,
23+
params={
24+
"address": "observations.proprio.joint_pos.noise.n_min",
25+
"modify_fn": mdp.initial_final_interpolate_fn,
26+
"modify_params": {"initial_value": 0.0, "final_value": -0.1, "difficulty_term_str": "adr"},
27+
},
28+
)
29+
30+
joint_pos_unoise_max_adr = CurrTerm(
31+
func=mdp.modify_term_cfg,
32+
params={
33+
"address": "observations.proprio.joint_pos.noise.n_max",
34+
"modify_fn": mdp.initial_final_interpolate_fn,
35+
"modify_params": {"initial_value": 0.0, "final_value": 0.1, "difficulty_term_str": "adr"},
36+
},
37+
)
38+
39+
joint_vel_unoise_min_adr = CurrTerm(
40+
func=mdp.modify_term_cfg,
41+
params={
42+
"address": "observations.proprio.joint_vel.noise.n_min",
43+
"modify_fn": mdp.initial_final_interpolate_fn,
44+
"modify_params": {"initial_value": 0.0, "final_value": -0.2, "difficulty_term_str": "adr"},
45+
},
46+
)
47+
48+
joint_vel_unoise_max_adr = CurrTerm(
49+
func=mdp.modify_term_cfg,
50+
params={
51+
"address": "observations.proprio.joint_vel.noise.n_max",
52+
"modify_fn": mdp.initial_final_interpolate_fn,
53+
"modify_params": {"initial_value": 0.0, "final_value": 0.2, "difficulty_term_str": "adr"},
54+
},
55+
)
56+
57+
hand_tips_pos_unoise_min_adr = CurrTerm(
58+
func=mdp.modify_term_cfg,
59+
params={
60+
"address": "observations.proprio.hand_tips_state_b.noise.n_min",
61+
"modify_fn": mdp.initial_final_interpolate_fn,
62+
"modify_params": {"initial_value": 0.0, "final_value": -0.01, "difficulty_term_str": "adr"},
63+
},
64+
)
65+
66+
hand_tips_pos_unoise_max_adr = CurrTerm(
67+
func=mdp.modify_term_cfg,
68+
params={
69+
"address": "observations.proprio.hand_tips_state_b.noise.n_max",
70+
"modify_fn": mdp.initial_final_interpolate_fn,
71+
"modify_params": {"initial_value": 0.0, "final_value": 0.01, "difficulty_term_str": "adr"},
72+
},
73+
)
74+
75+
object_quat_unoise_min_adr = CurrTerm(
76+
func=mdp.modify_term_cfg,
77+
params={
78+
"address": "observations.policy.object_quat_b.noise.n_min",
79+
"modify_fn": mdp.initial_final_interpolate_fn,
80+
"modify_params": {"initial_value": 0.0, "final_value": -0.03, "difficulty_term_str": "adr"},
81+
},
82+
)
83+
84+
object_quat_unoise_max_adr = CurrTerm(
85+
func=mdp.modify_term_cfg,
86+
params={
87+
"address": "observations.policy.object_quat_b.noise.n_max",
88+
"modify_fn": mdp.initial_final_interpolate_fn,
89+
"modify_params": {"initial_value": 0.0, "final_value": 0.03, "difficulty_term_str": "adr"},
90+
},
91+
)
92+
93+
object_obs_unoise_min_adr = CurrTerm(
94+
func=mdp.modify_term_cfg,
95+
params={
96+
"address": "observations.perception.object_point_cloud.noise.n_min",
97+
"modify_fn": mdp.initial_final_interpolate_fn,
98+
"modify_params": {"initial_value": 0.0, "final_value": -0.01, "difficulty_term_str": "adr"},
99+
},
100+
)
101+
102+
object_obs_unoise_max_adr = CurrTerm(
103+
func=mdp.modify_term_cfg,
104+
params={
105+
"address": "observations.perception.object_point_cloud.noise.n_max",
106+
"modify_fn": mdp.initial_final_interpolate_fn,
107+
"modify_params": {"initial_value": 0.0, "final_value": -0.01, "difficulty_term_str": "adr"},
108+
},
109+
)
110+
111+
gravity_adr = CurrTerm(
112+
func=mdp.modify_term_cfg,
113+
params={
114+
"address": "events.variable_gravity.params.gravity_distribution_params",
115+
"modify_fn": mdp.initial_final_interpolate_fn,
116+
"modify_params": {
117+
"initial_value": ((0.0, 0.0, 0.0), (0.0, 0.0, 0.0)),
118+
"final_value": ((0.0, 0.0, -9.81), (0.0, 0.0, -9.81)),
119+
"difficulty_term_str": "adr",
120+
},
121+
},
122+
)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
2+
# All rights reserved.
3+
#
4+
# SPDX-License-Identifier: BSD-3-Clause
5+
6+
"""Configurations for the dexsuite environments."""
7+
8+
# We leave this file empty since we don't want to expose any configs in this package directly.
9+
# We still need this file to import the "config" module in the parent package.

0 commit comments

Comments
 (0)