Skip to content

Conversation

jaybdub
Copy link

@jaybdub jaybdub commented Aug 22, 2025

Description

This PR adds locomanipulation data generation via disjoint navigation. It allows the user to replay static manipulation data recorded with the G1 through an end to end pick-up -> navigate -> drop-off pipeline.

g1_locomanip_dn

The code for this PR is contained in the folder scripts/isaaclab/imitation_learning/disjoint_navigation, and does not modify existing IsaacLab extensions.

The code is as follows:

  • replay.py - Main entry script for loading the static-manipulation dataset and generating locomanipulation dataset
  • common.py - Common classes and abstract base classes for the data generation pipeline. This code may be re-used by different scenarios.
  • occupancy_map.py - Helper class and methods for working with occupancy maps.
  • path_utils.py - Helper class used by path controller for following a path
  • display_dataset.py -- Utility script for visualizing generated trajectories with matplotlib
  • g1_29dof.py - The example scenario using G1 + WBC with random forklifts and boxes. This may be copied modified by end users to support their own scenarios.
  • visualization.py - Code to visualize occupancy map in USD stage

Type of change

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

Screenshots

Please attach before and after screenshots of the change if applicable.

Checklist

  • 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

michaellin6 and others added 12 commits August 7, 2025 16:50
…ed testing

- Add NullSpacePostureTask for natural shoulder/waist joint postures during manipulation
- Refactor IK with damping, null-space control, and joint optimization
- Improve testing framework with JSON-based configurations and stricter tolerances (1mm/1° vs 30mm/10°)
- Apply IK improvements across all environments (PickPlace, NutPour, ExhaustPipe)
- Add waist-enabled manipulation environments and target_eef_link_names mapping
- Disable IK joint limits safety checks so that it always produces a
  solution
the locomanipulation environment for G1. Moved policy inference to
action term. Adding test files for controllers in each environment.
Adds G1 fixed base teleop support, G1 retargeter with hand rotation
fixes, comprehensive unit tests with pytest, and mock device testing.
- Migrate from command manager to using retargeter.
- Enhance pink IK with kinemaitcs model accounting for non-pink-controlled joints, and introducing pink task LocalFrameTask that can specify ee goal poses relative to any robot link reference frame.
- Generalize observation functions for manipulation and locomanipulation tasks.
- Added locomotion and locomanipulation policies with agile observation
- Enhanced IK controller with gravity compensation and tuned gains
- Expanded test coverage for ik
- Added unit tests for new pink kinematics config class, and new custom
  pink frame task
Copy link
Contributor

@michaellin6 michaellin6 left a comment

Choose a reason for hiding this comment

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

Made a first pass. Will go more in depth again later.

@jaybdub jaybdub changed the title [WIP] Disjoint navigation Adds locomanipulation data generation via. disjoint navigation Aug 28, 2025
@jaybdub jaybdub marked this pull request as ready for review August 29, 2025 18:37
Copy link

@huihuaNvidia2023 huihuaNvidia2023 left a comment

Choose a reason for hiding this comment

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

This PR needs to run the lint check as it is missing necessary docstrings

1. Record a static manipulation trajectory of "picking up" and "dropping off" an object.
In this phase, the robot base is stationary. This is done by human teleoperation.

2. Augment the static manipulation trajectory using mimic data generation pipeline. This will

Choose a reason for hiding this comment

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

Suggested change
2. Augment the static manipulation trajectory using mimic data generation pipeline. This will
2. Augment the in-place manipulation trajectory using mimic data generation pipeline. This will

Choose a reason for hiding this comment

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

@michaellin6 can you please confirm? Is the data collected using a floating base config or fixed base config?

--output_file_name=dataset_generated_disjoint_nav.hdf5


If you are using a different trajectory, you will need to change some parameters. Notably, you will need to set

Choose a reason for hiding this comment

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

Suggested change
If you are using a different trajectory, you will need to change some parameters. Notably, you will need to set
If you are using a different trajectory, you will need to change some parameters. Notably, you will need to set


If you are using a different trajectory, you will need to change some parameters. Notably, you will need to set

- --lift_step - The step index where the robot has finished grasping the object and is ready to lift it

Choose a reason for hiding this comment

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

In mimic, they use the object height change for this purpose. Can we do the same here? This is quite manual.

Copy link
Author

Choose a reason for hiding this comment

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

Good idea. Since we haven't tested this yet, I would prefer to add this post-merge. We can expose the ability to do this manually or automatically.

@@ -0,0 +1,25 @@
# Disjoint Navigation

This folder contains code for running the disjoint navigation data generation script. This assumes that you have collected a static manipulation dataset.

Choose a reason for hiding this comment

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

Suggested change
This folder contains code for running the disjoint navigation data generation script. This assumes that you have collected a static manipulation dataset.
This folder contains code for running the disjoint navigation data generation script. This assumes that you have collected a static manipulation dataset.

num_hand_joints=14,
show_ik_warnings=False,
variable_input_tasks=[
FrameTask(

Choose a reason for hiding this comment

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

I assume this needs to be updated with @michaellin6's latest update.

end-to-end locomanipulation trajectories by combining the static manipulation sequences with
path planning.

Step 1 - Static manipulation teleoperation
Copy link
Contributor

Choose a reason for hiding this comment

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

Here you can link the teleop_imitation.rst sections that have more detailed instructions on this

.. code:: bash
./isaaclab.sh -p \
scripts/imitation_learning/disjoint_navigation/replay.py \
Copy link
Contributor

Choose a reason for hiding this comment

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

I think it may be confusing for a user that the script is called replay. Can we name it something else? Like generate_navigation?


```bash
./isaaclab.sh -p \
scripts/imitation_learning/disjoint_navigation/replay.py \
Copy link
Contributor

Choose a reason for hiding this comment

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

Same as above. Replay seems misleading.

import isaaclab.utils.math as math_utils


def transform_to_matrix(transform: torch.Tensor):
Copy link
Contributor

Choose a reason for hiding this comment

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

There is already tools in Isaac Lab for this. check out unmake_pose in source/isaaclab/isaaclab/utils/math.py

Copy link
Author

Choose a reason for hiding this comment

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

This function uses unmake_pose under the hood. It's a helper function to reduce repeated / copied code.

return pose_matrix


def transform_from_matrix(matrix: torch.Tensor):
Copy link
Contributor

Choose a reason for hiding this comment

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

There is already tools in Isaac Lab for this. check out make_pose in source/isaaclab/isaaclab/utils/math.py

Copy link
Author

Choose a reason for hiding this comment

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

This function uses make_pose under the hood.

return torch.cat([pos, quat], dim=-1)


def transform_inv(transform: torch.Tensor):
Copy link
Contributor

Choose a reason for hiding this comment

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

There is already tools in Isaac Lab for this. check out pose_inv in source/isaaclab/isaaclab/utils/math.py

Copy link
Author

Choose a reason for hiding this comment

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

Hi @michaellin6 . This function actually uses pose_inv under the hood. I started by using the math functions directly. This quickly became cumbersome and there was a lot of repeated code. These transform_ functions were added organically to remove code redundancy.

return transform_from_matrix(matrix)


def transform_mul(transform_a, transform_b):
Copy link
Contributor

Choose a reason for hiding this comment

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

for all these math functions, please check that they are already available in IL

Copy link
Author

Choose a reason for hiding this comment

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

Similar to above. These methods use existing utilities under the hood. They are helper functions added to remove a bit of duplicate code inside the pipeline, and standardize on a [translation,quaternion] format for pose to reduce bookkeeping.

Copy link
Contributor

Choose a reason for hiding this comment

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

In general, this common file is kind of large and seems like a big mix of many components. Can we split it up a bit? Some seem to be utilities, and some seem to be abstract classes which are different.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants