Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
ced346d
add submodule.
EverNorif Jan 23, 2026
8390c56
fix isaaclab to 2.3.0
EverNorif Jan 23, 2026
41cbefb
pre-commit setup.
EverNorif Jan 23, 2026
c296dbf
add autosim and autosim_examples package structure.
EverNorif Jan 23, 2026
9052cb3
pipeline registration.
EverNorif Jan 23, 2026
692b155
skill registration.
EverNorif Jan 26, 2026
d339d0d
refine skill system & add grasp skill example.
EverNorif Jan 26, 2026
87956e5
remove autodiscover
EverNorif Jan 26, 2026
604a50c
task decomposer & skill tab.
EverNorif Jan 27, 2026
c2ad25e
add curobo dependency.
EverNorif Jan 27, 2026
4eaeb99
refine skill register system & dataclass from dict.
EverNorif Jan 28, 2026
aed1c5a
fix skill name.
EverNorif Jan 28, 2026
111e0d7
occupancy map func.
EverNorif Jan 29, 2026
b83fc71
a_start_planner.
EverNorif Jan 29, 2026
c0a4f2e
dwa planner.
EverNorif Jan 29, 2026
c3eba56
action adapter implement & skill and types clean.
EverNorif Jan 30, 2026
6f104b4
navigate skill setup ready.
EverNorif Jan 30, 2026
4062ee4
add env_extra_info in abstract skill.extract_goal_from_info.
EverNorif Jan 30, 2026
f74ee4d
unified logger.
EverNorif Jan 30, 2026
a3a75ea
small fix.
EverNorif Feb 3, 2026
f5a0708
curobot planner.
EverNorif Feb 3, 2026
a72c1af
lift skill & tensor fix.
EverNorif Feb 4, 2026
a55603d
use logger to replace print.
EverNorif Feb 4, 2026
c1c4367
reach skill.
EverNorif Feb 4, 2026
2230845
add logger in reach skill.
EverNorif Feb 4, 2026
dbdc9a4
remove maintain_other_ee_poses.
EverNorif Feb 4, 2026
2a5fee6
add extra target poses.
EverNorif Feb 4, 2026
2d23862
pipeline & debug util.
EverNorif Feb 4, 2026
cbadbad
env reset.
EverNorif Feb 4, 2026
ed09e09
use recorder in env to save results.
EverNorif Feb 5, 2026
8467208
modify gripper skill duration default value.
EverNorif Feb 5, 2026
67a5950
format.
EverNorif Feb 5, 2026
962b153
autosim example task: franka lift cube.
EverNorif Feb 6, 2026
5211b51
ee frame vis.
EverNorif Feb 6, 2026
a88d5f8
some fix.
EverNorif Feb 6, 2026
1787b91
add autosim example [not finished yet]
EverNorif Feb 11, 2026
28b060a
use iterator to provide reach pose sequence.
EverNorif Feb 25, 2026
fffa710
use relative reach to refactor lift / pull / push skill.
EverNorif Feb 25, 2026
dda5167
fix fixtures types.
EverNorif Feb 25, 2026
9f24bc5
change relative reach move_axis to eef frame based.
EverNorif Feb 27, 2026
7b718dc
expose reset_env interface.
EverNorif Feb 27, 2026
7b49e11
relative reach bug fix.
EverNorif Feb 27, 2026
f2f2920
typo and logger.
EverNorif Feb 28, 2026
8c2f760
add readme.
EverNorif Mar 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions .flake8
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
[flake8]
show-source=True
statistics=True
per-file-ignores=*/__init__.py:F401
# E402: Module level import not at top of file
# E501: Line too long
# W503: Line break before binary operator
# E203: Whitespace before ':' -> conflicts with black
# D401: First line should be in imperative mood
# R504: Unnecessary variable assignment before return statement.
# R505: Unnecessary elif after return statement
# SIM102: Use a single if-statement instead of nested if-statements
# SIM117: Merge with statements for context managers that have same scope.
# SIM118: Checks for key-existence checks against dict.keys() calls.
ignore=E402,E501,E704,W503,E203,D401,R504,R505,SIM102,SIM117,SIM118
max-line-length = 120
max-complexity = 30
exclude=_*,.vscode,.git,docs/**
# docstrings
docstring-convention=google
# annotations
suppress-none-returning=True
allow-star-arg-any=True
16 changes: 16 additions & 0 deletions .github/workflows/pre-commit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: Run linters using pre-commit

on:
pull_request:
types: [opened, synchronize, reopened]

jobs:
pre-commit:
name: Run pre-commit checks
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
with:
python-version: "3.11"
- uses: pre-commit/action@v3.0.0
11 changes: 8 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -182,11 +182,11 @@ cython_debug/
.abstra/

# Visual Studio Code
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
# and can be added to the global gitignore or merged into this file. However, if you prefer,
# and can be added to the global gitignore or merged into this file. However, if you prefer,
# you could uncomment the following to ignore the entire vscode folder
# .vscode/
.vscode/

# Ruff stuff:
.ruff_cache/
Expand All @@ -205,3 +205,8 @@ cython_debug/
marimo/_static/
marimo/_lsp/
__marimo__/


# IsaacLab
datasets/
recordings/
6 changes: 6 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[submodule "dependencies/IsaacLab"]
path = dependencies/IsaacLab
url = https://github.com/isaac-sim/IsaacLab.git
[submodule "dependencies/curobo"]
path = dependencies/curobo
url = https://github.com/NVlabs/curobo.git
60 changes: 60 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
repos:
- repo: https://github.com/python/black
rev: 24.3.0
hooks:
- id: black
args: ["--line-length", "120", "--unstable"]
- repo: https://github.com/pycqa/flake8
rev: 7.0.0
hooks:
- id: flake8
additional_dependencies: [flake8-simplify, flake8-return]
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: trailing-whitespace
- id: check-symlinks
- id: destroyed-symlinks
- id: check-added-large-files
args: ["--maxkb=2000"] # restrict files more than 2 MB. Should use git-lfs instead.
- id: check-yaml
- id: check-merge-conflict
- id: check-case-conflict
- id: check-executables-have-shebangs
- id: check-toml
- id: end-of-file-fixer
- id: check-shebang-scripts-are-executable
- id: detect-private-key
- id: debug-statements
- repo: https://github.com/pycqa/isort
rev: 5.13.2
hooks:
- id: isort
name: isort (python)
args: ["--profile", "black", "--filter-files"]
- repo: https://github.com/asottile/pyupgrade
rev: v3.15.1
hooks:
- id: pyupgrade
args: ["--py310-plus"]
# FIXME: This is a hack because Pytorch does not like: torch.Tensor | dict aliasing
exclude: "source/isaaclab/isaaclab/envs/common.py|source/isaaclab/isaaclab/ui/widgets/image_plot.py|source/isaaclab_tasks/isaaclab_tasks/direct/humanoid_amp/motions/motion_loader.py"
- repo: https://github.com/codespell-project/codespell
rev: v2.2.6
hooks:
- id: codespell
additional_dependencies:
- tomli
exclude: "CONTRIBUTORS.md|docs/source/setup/walkthrough/concepts_env_design.rst|docs/package-lock.json"
args: ["-L", "reacher"]
# FIXME: Figure out why this is getting stuck under VPN.
# - repo: https://github.com/RobertCraigie/pyright-python
# rev: v1.1.315
# hooks:
# - id: pyright
- repo: https://github.com/pre-commit/pygrep-hooks
rev: v1.10.0
hooks:
- id: rst-backticks
- id: rst-directive-colons
- id: rst-inline-touching-normal
162 changes: 161 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,162 @@
# autosim
autosim

**autosim: An automated data generation pipeline based on NVIDIA Isaac Lab**

An automatic simulation data generation pipeline built on Isaac Lab, integrating LLM-based task decomposition, motion planning, and navigation capabilities.

## Overview

`autosim` provides an extensible automated data generation pipeline for NVIDIA Isaac Lab environments:

- Starting from **task code and scene information**, it uses an LLM to **decompose high-level tasks** automatically.
- Maps the decomposition result into a sequence of **atomic skills**.
- Invokes **motion planning (based on cuRobo)** and **navigation** to execute these skills in simulation.
- Produces unified **action sequences / trajectory data** for downstream robot learning and research.

> In short: `autosim` helps you automatically turn “a task in Isaac Lab” into an executable sequence of skills, and generates data that can be used for training or evaluation.

## Installation

Below is a typical setup workflow. `autosim` can be installed as a submodule inside an environment that already contains Isaac Lab.

```bash
conda create -n autosim python=3.11

conda activate autosim

git clone https://github.com/LightwheelAI/autosim.git

cd autosim

git submodule update --init --recursive
```

### IsaacLab Installation

`autosim` depends on Isaac Lab. You can follow the official installation guide [here](https://isaac-sim.github.io/IsaacLab/v2.2.1/source/setup/installation/pip_installation.html), or use the commands below. If you already have an environment with Isaac Lab installed, you can reuse it and skip this step.

```bash
# Install CUDA toolkit
conda install -c "nvidia/label/cuda-12.8.1" cuda-toolkit

# Install PyTorch
pip install -U torch==2.7.0 torchvision==0.22.0 --index-url https://download.pytorch.org/whl/cu128

# Install IsaacSim
pip install --upgrade pip
pip install "isaacsim[all,extscache]==5.1.0" --extra-index-url https://pypi.nvidia.com


# Install IsaacLab
sudo apt install cmake build-essential

cd dependencies/IsaacLab
./isaaclab.sh --install
```

> ⚠️ The installation of Isaac Lab is relatively involved. Please follow the official documentation carefully. This repository only works on top of a correctly configured Isaac Lab environment.

### cuRobo Installation

Some skills in `autosim` depend on cuRobo. You can follow the official [documentation](https://curobo.org/get_started/1_install_instructions.html), or use the commands below:

```bash
cd dependencies/curobo

pip install -e . --no-build-isolation
```

### autosim Installation

Finally, install `autosim` into your environment:

```bash
pip install -e source/autosim
```

## Quick Start

### Run the Example Pipeline (Franka Cube Lift)

After completing the installation and configuration steps above, you can directly run the built-in example.

First, install the `autosim` example package:

```bash
pip install -e source/autosim_examples
```

Then launch the example with:

```bash
cd autosim

python examples/run_autosim_example.py \
--pipeline_id AutoSimPipeline-FrankaCubeLift-v0
```

After launching, you will see in the Isaac Sim UI that the manipulator automatically executes the Cube Lift task.

## Defining Your Own Pipeline

For a task that has already been defined in Isaac Lab, you can use `autosim` to define a custom `AutoSimPipeline` for it. A typical workflow looks like this:

1. **Implement a config class**

Inherit from `AutoSimPipelineCfg` and adjust components as needed:

- `decomposer` (e.g., using a different LLM or prompt template)
- `motion_planner` (e.g., different robot model or planner parameters)
- `skills` / `action_adapter`, etc.

2. **Implement the pipeline class**

Inherit from `AutoSimPipeline` and implement:

- `load_env(self) -> ManagerBasedEnv`: load the environment based on Isaac Lab / Gymnasium; this environment should correspond to the pre-defined Task.
- `get_env_extra_info(self) -> EnvExtraInfo`: provide the task name, robot name, end-effector link, and reach targets expressed as poses relative to objects, etc.

3. **Register the pipeline in the package’s `__init__.py`**

For example:

```python
from autosim import register_pipeline

register_pipeline(
id="MyPipeline-v0",
entry_point="my_package.pipelines.my_pipeline:MyPipeline",
cfg_entry_point="my_package.pipelines.my_pipeline:MyPipelineCfg",
)
```

4. **Use it from a script or external project**

```python
from autosim import make_pipeline

pipeline = make_pipeline("MyPipeline-v0")
output = pipeline.run()
```

> You can refer to `source/autosim_examples/autosim_examples/autosim/pipelines/franka_lift_cube.py` for a minimal working example.

## Contributing

Issues, feature requests, and pull requests are all welcome!

Before submitting contributions, we recommend:

- First verify that the example pipeline runs correctly in your local environment.
- Follow the existing code style in this repository (Black + isort, see the root `pyproject.toml`).
- Whenever possible, add tests or minimal reproducible examples for new features or bug fixes.

## Acknowledgements

`autosim` is built on top of the following excellent open-source projects:

- **cuRobo**: GPU-accelerated robot motion planning.
- **Isaac Lab**: NVIDIA’s framework for robot simulation and reinforcement learning.
- And other dependencies and upstream projects used in this repository.

We sincerely thank the authors and communities behind these projects.
1 change: 1 addition & 0 deletions dependencies/IsaacLab
Submodule IsaacLab added at 3c6e67
1 change: 1 addition & 0 deletions dependencies/curobo
Submodule curobo added at ebb717
36 changes: 36 additions & 0 deletions examples/run_autosim_example.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
"""Script to run autosim example."""

import argparse

from isaaclab.app import AppLauncher

# add argparse arguments
parser = argparse.ArgumentParser(description="run autosim example pipeline.")
parser.add_argument(
"--pipeline_id", type=str, default="AutoSimPipeline-FrankaCubeLift-v0", help="Name of the autosim pipeline."
)

# append AppLauncher cli args
AppLauncher.add_app_launcher_args(parser)
# parse the arguments
args_cli = parser.parse_args()

app_launcher_args = vars(args_cli)

# launch omniverse app
app_launcher = AppLauncher(app_launcher_args)
simulation_app = app_launcher.app


import autosim_examples # noqa: F401
from autosim import make_pipeline


def main():
pipeline = make_pipeline(args_cli.pipeline_id)
result = pipeline.run()
print(result)


if __name__ == "__main__":
main()
7 changes: 7 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[tool.black]
line-length = 120
target-version = ["py311"]

[tool.isort]
profile = "black"
known_first_party = ["autosim", "autosim_examples"]
2 changes: 2 additions & 0 deletions source/autosim/autosim/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from .core import *
from .skills import *
2 changes: 2 additions & 0 deletions source/autosim/autosim/capabilities/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from .motion_planning import *
from .navigation import *
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from .curobo.curobo_planner import CuroboPlanner
from .curobo.curobo_planner_cfg import CuroboPlannerCfg

__all__ = ["CuroboPlanner", "CuroboPlannerCfg"]
Loading