Skip to content

Commit b3f6b31

Browse files
Enhances Pink IK controller with null-space posture control and improv… (isaac-sim#3149)
# Description <!-- Thank you for your interest in sending a pull request. Please make sure to check the contribution guidelines. Link: https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html --> Enhance Pink IK Controller with Null Space Posture Control This PR improves the Pink IK controller integration for better humanoid robot control and more natural postures. **Note**: Original this PR was staged in the internal repo (isaac-sim#547). It has been moved here due to new Github workflow. ## Key Changes ### New Null Space Posture Task - Added NullSpacePostureTask to enforce postural constraints on shoulder/waist joints while prioritizing end-effector tasks - Maintains natural robot poses during manipulation ### Controller Improvements - Tuned low level PD controller gains - Support mixed task types (FrameTask + NullSpacePostureTask) ### Testing & Environment Updates - Redesigned pink controller test script to use JSON-based configurations to program test motions. - Updated all environments (PickPlace, NutPour, ExhaustPipe) with null space control, damping tasks, and improved tracking - Added `Isaac-PickPlace-GR1T2-WaistEnabled-Abs-v0` env that is identical to `Isaac-PickPlace-GR1T2-Abs-v0` but enables the Waist DOFs. - Added target_eef_link_names mapping for clearer link specification Fixes # (issue) These changes help fix the following problems from [VDR feedback](https://docs.google.com/document/d/1saB1QA5r_WlD1l17q7C04WWNltnBW-K0ydI2UB8jxAs/edit?tab=t.0) - [Enable Waist DOF](https://nvbugspro.nvidia.com/bug/5235527) - Discourage elbow flare - Make controller low-latency and low-jerk. **We improved the unit test for the pink controller and reduced our position and rotation accuracy tolerance from 30 mm, 10 degrees to 1 mm, 1 degree.** - Develop metric for controller performance - Added a flag to disable failure due to joint limits. Previously, any commanded pose that ended in joint limit violation would result in no solution and the controlled robot freezing in place. This change gets the solver to still provide a solution and instead issue a warning for joint limit violations. ## Screenshots These controller changes have been tested through the Mimic pipeline (teleop_se3_agent.py, record/replay_demos.py). Here are videos showing teleoperation of all three environments working. ### PickPlace-GR1T2-Abs ![IK Improvements - Pick Place Wheel](https://github.com/user-attachments/assets/98bd5a70-e5fc-4b5b-954a-848c8dbe85d4) ### NutPour-GR1T2 ![IK Improvements - NutPour](https://github.com/user-attachments/assets/b3603dd4-73cb-4ee7-9963-c68a32dffc60) ### ExhaustPipe-GR1T2 ![IK Improvements - ExhaustPipe](https://github.com/user-attachments/assets/28cd1a4b-29cc-402c-9ec4-7082b2c64d98) ### Successfully Trained Robomimic Model Rollout on PickPlace task For the two robomimic tasks: `Isaac-PickPlace-GR1T2-Abs-v0` and `Isaac-NutPour-GR1T2-Pink-IK-Abs-v0`, if we collect a new dataset, we achieve a success rate of 96 and 92% respectively. ![IK Improvements - GR1T2 Waist Enabled Model Rollout Trimmed](https://github.com/user-attachments/assets/d270e8a8-ed72-41f3-84ac-bdc2c02d190d) ![IK Improvements - GR1T2 Nut Pour Model Rollout Trimmed](https://github.com/user-attachments/assets/1434721a-5dce-4b76-845a-6ac1379982f5) ## 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 - [x] 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 --> --------- Co-authored-by: Kelly Guo <kellyg@nvidia.com>
1 parent 3d3af0b commit b3f6b31

37 files changed

Lines changed: 1897 additions & 339 deletions

CONTRIBUTORS.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ Guidelines for modifications:
7070
* HoJin Jeon
7171
* Hongwei Xiong
7272
* Hongyu Li
73+
* Huihua Zhao
7374
* Iretiayo Akinola
7475
* Jack Zeng
7576
* Jan Kerner
@@ -94,6 +95,7 @@ Guidelines for modifications:
9495
* Maurice Rahme
9596
* Michael Gussert
9697
* Michael Noseworthy
98+
* Michael Lin
9799
* Miguel Alonso Jr
98100
* Mingyu Lee
99101
* Muhong Guo
@@ -147,4 +149,5 @@ Guidelines for modifications:
147149
* Gavriel State
148150
* Hammad Mazhar
149151
* Marco Hutter
152+
* Yan Chang
150153
* Yashraj Narang
60.3 KB
Loading

docs/source/api/lab/isaaclab.controllers.rst

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
DifferentialIKControllerCfg
1212
OperationalSpaceController
1313
OperationalSpaceControllerCfg
14+
PinkIKController
15+
PinkIKControllerCfg
16+
pink_ik.NullSpacePostureTask
1417

1518
Differential Inverse Kinematics
1619
-------------------------------
@@ -39,3 +42,13 @@ Operational Space controllers
3942
:inherited-members:
4043
:show-inheritance:
4144
:exclude-members: __init__, class_type
45+
46+
Differential Inverse Kinematics Controllers (Based on Pink)
47+
-----------------------------------------------------------
48+
49+
For detailed documentation of Pink IK controllers and tasks, see:
50+
51+
.. toctree::
52+
:maxdepth: 1
53+
54+
isaaclab.controllers.pink_ik

docs/source/overview/environments.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@ for the lift-cube environment:
132132
+--------------------+-------------------------+-----------------------------------------------------------------------------+
133133
| |gr1_pick_place| | |gr1_pick_place-link| | Pick up and place an object in a basket with a GR-1 humanoid robot |
134134
+--------------------+-------------------------+-----------------------------------------------------------------------------+
135+
| |gr1_pp_waist| | |gr1_pp_waist-link| | Pick up and place an object in a basket with a GR-1 humanoid robot |
136+
| | | with waist degrees-of-freedom enables that provides a wider reach space. |
137+
+--------------------+-------------------------+-----------------------------------------------------------------------------+
135138

136139
.. |reach-franka| image:: ../_static/tasks/manipulation/franka_reach.jpg
137140
.. |reach-ur10| image:: ../_static/tasks/manipulation/ur10_reach.jpg
@@ -141,6 +144,7 @@ for the lift-cube environment:
141144
.. |cube-shadow| image:: ../_static/tasks/manipulation/shadow_cube.jpg
142145
.. |stack-cube| image:: ../_static/tasks/manipulation/franka_stack.jpg
143146
.. |gr1_pick_place| image:: ../_static/tasks/manipulation/gr-1_pick_place.jpg
147+
.. |gr1_pp_waist| image:: ../_static/tasks/manipulation/gr-1_pick_place_waist.jpg
144148

145149
.. |reach-franka-link| replace:: `Isaac-Reach-Franka-v0 <https://github.com/isaac-sim/IsaacLab/blob/main/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/config/franka/joint_pos_env_cfg.py>`__
146150
.. |reach-ur10-link| replace:: `Isaac-Reach-UR10-v0 <https://github.com/isaac-sim/IsaacLab/blob/main/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/config/ur_10/joint_pos_env_cfg.py>`__
@@ -154,6 +158,7 @@ for the lift-cube environment:
154158
.. |stack-cube-link| replace:: `Isaac-Stack-Cube-Franka-v0 <https://github.com/isaac-sim/IsaacLab/blob/main/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/stack_joint_pos_env_cfg.py>`__
155159
.. |stack-cube-bp-link| replace:: `Isaac-Stack-Cube-Franka-IK-Rel-Blueprint-v0 <https://github.com/isaac-sim/IsaacLab/blob/main/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/stack_ik_rel_blueprint_env_cfg.py>`__
156160
.. |gr1_pick_place-link| replace:: `Isaac-PickPlace-GR1T2-Abs-v0 <https://github.com/isaac-sim/IsaacLab/blob/main/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/pickplace_gr1t2_env_cfg.py>`__
161+
.. |gr1_pp_waist-link| replace:: `Isaac-PickPlace-GR1T2-WaistEnabled-Abs-v0 <https://github.com/isaac-sim/IsaacLab/blob/main/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/pickplace_gr1t2_waist_enabled_env_cfg.py>`__
157162

158163
.. |cube-shadow-link| replace:: `Isaac-Repose-Cube-Shadow-Direct-v0 <https://github.com/isaac-sim/IsaacLab/blob/main/source/isaaclab_tasks/isaaclab_tasks/direct/shadow_hand/shadow_hand_env_cfg.py>`__
159164
.. |cube-shadow-ff-link| replace:: `Isaac-Repose-Cube-Shadow-OpenAI-FF-Direct-v0 <https://github.com/isaac-sim/IsaacLab/blob/main/source/isaaclab_tasks/isaaclab_tasks/direct/shadow_hand/shadow_hand_env_cfg.py>`__

docs/source/overview/teleop_imitation.rst

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ Collect human demonstrations
333333

334334
Data collection for the GR-1 humanoid robot environment requires use of an Apple Vision Pro headset. If you do not have access to
335335
an Apple Vision Pro, you may skip this step and continue on to the next step: `Generate the dataset`_.
336-
A pre-recorded annotated dataset is provided in the next step .
336+
A pre-recorded annotated dataset is provided in the next step.
337337

338338
.. tip::
339339
The GR1 scene utilizes the wrist poses from the Apple Vision Pro (AVP) as setpoints for a differential IK controller (Pink-IK).
@@ -380,6 +380,9 @@ Collect five demonstrations by running the following command:
380380
--dataset_file ./datasets/dataset_gr1.hdf5 \
381381
--num_demos 5 --enable_pinocchio
382382
383+
.. note::
384+
We also provide a GR-1 pick and place task with waist degrees-of-freedom enabled ``Isaac-PickPlace-GR1T2-WaistEnabled-Abs-v0`` (see :ref:`environments` for details on the available environments, including the GR1 Waist Enabled variant). The same command above applies but with the task name changed to ``Isaac-PickPlace-GR1T2-WaistEnabled-Abs-v0``.
385+
383386
.. tip::
384387
If a demo fails during data collection, the environment can be reset using the teleoperation controls panel in the XR teleop client
385388
on the Apple Vision Pro or via voice control by saying "reset". See :ref:`teleoperate-apple-vision-pro` for more details.

source/isaaclab/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.45.7"
4+
version = "0.45.8"
55

66
# Description
77
title = "Isaac Lab framework for Robot Learning"

source/isaaclab/docs/CHANGELOG.rst

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

4+
0.45.8 (2025-07-25)
5+
~~~~~~~~~~~~~~~~~~~
6+
7+
Added
8+
^^^^^
9+
10+
* Created :attr:`~isaaclab.controllers.pink_ik.PinkIKControllerCfg.target_eef_link_names` to :class:`~isaaclab.controllers.pink_ik.PinkIKControllerCfg`
11+
to specify the target end-effector link names for the pink inverse kinematics controller.
12+
13+
Changed
14+
^^^^^^^
15+
16+
* Updated pink inverse kinematics controller configuration for the following tasks (Isaac-PickPlace-GR1T2, Isaac-NutPour-GR1T2, Isaac-ExhaustPipe-GR1T2)
17+
to increase end-effector tracking accuracy and speed. Also added a null-space regularizer that enables turning on of waist degrees-of-freedom.
18+
* Improved the test_pink_ik script to more comprehensive test on controller accuracy. Also, migrated to use pytest. With the current IK controller
19+
improvements, our unit tests pass position and orientation accuracy test within **(1 mm, 1 degree)**. Previously, the position accuracy tolerances
20+
were set to **(30 mm, 10 degrees)**.
21+
* Included a new config parameter :attr:`fail_on_ik_error` to :class:`~isaaclab.controllers.pink_ik.PinkIKControllerCfg`
22+
to control whether the IK controller raise an exception if robot joint limits are exceeded. In the case of an exception, the controller will hold the
23+
last joint position. This adds to stability of the controller and avoids operator experiencing what is perceived as sudden large delays in robot control.
24+
25+
426
0.45.7 (2025-08-21)
527
~~~~~~~~~~~~~~~~~~~
628

source/isaaclab/isaaclab/controllers/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@
1515
from .differential_ik_cfg import DifferentialIKControllerCfg
1616
from .operational_space import OperationalSpaceController
1717
from .operational_space_cfg import OperationalSpaceControllerCfg
18+
from .pink_ik import NullSpacePostureTask, PinkIKController, PinkIKControllerCfg

source/isaaclab/isaaclab/controllers/pink_ik.py

Lines changed: 0 additions & 133 deletions
This file was deleted.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
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+
"""Pink IK controller package for IsaacLab.
7+
8+
This package provides integration between Pink inverse kinematics solver and IsaacLab.
9+
"""
10+
11+
from .null_space_posture_task import NullSpacePostureTask
12+
from .pink_ik import PinkIKController
13+
from .pink_ik_cfg import PinkIKControllerCfg

0 commit comments

Comments
 (0)