-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Adds locomanipulation data generation via. disjoint navigation #3259
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
…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
There was a problem hiding this 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.
scripts/imitation_learning/disjoint_navigation/display_dataset.py
Outdated
Show resolved
Hide resolved
…cLab into disjoint-navigation
There was a problem hiding this 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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 |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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 |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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( |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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 \ |
There was a problem hiding this comment.
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 \ |
There was a problem hiding this comment.
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): |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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): |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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): |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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): |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
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.
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 datasetcommon.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 pathdisplay_dataset.py
-- Utility script for visualizing generated trajectories with matplotlibg1_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 stageType of change
Screenshots
Please attach before and after screenshots of the change if applicable.
Checklist
pre-commit
checks with./isaaclab.sh --format
config/extension.toml
fileCONTRIBUTORS.md
or my name already exists there