Xinyi0214 commited on
Commit
0037d53
·
verified ·
1 Parent(s): 3826a2f

Upload UWLab (code, datasets, checkpoints, eval outputs)

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .dockerignore +33 -0
  2. .flake8 +23 -0
  3. .gitattributes +196 -34
  4. .github/CODEOWNERS +49 -0
  5. .github/ISSUE_TEMPLATE/bug.md +54 -0
  6. .github/ISSUE_TEMPLATE/proposal.md +45 -0
  7. .github/ISSUE_TEMPLATE/question.md +21 -0
  8. .github/LICENSE_HEADER.md +4 -0
  9. .github/LICENSE_HEADER.txt +4 -0
  10. .github/PULL_REQUEST_TEMPLATE.md +59 -0
  11. .github/actions/combine-results/action.yml +103 -0
  12. .github/actions/docker-build/action.yml +78 -0
  13. .github/actions/run-tests/action.yml +157 -0
  14. .github/labeler.yml +59 -0
  15. .github/stale.yml +67 -0
  16. .github/workflows/build.yml +242 -0
  17. .github/workflows/check-links.yml +120 -0
  18. .github/workflows/docs.yaml +89 -0
  19. .github/workflows/labeler.yml +17 -0
  20. .github/workflows/license-check.yaml +127 -0
  21. .github/workflows/license-exceptions.json +479 -0
  22. .github/workflows/pre-commit.yaml +20 -0
  23. .gitignore +73 -0
  24. .pre-commit-config.yaml +87 -0
  25. .vscode/.gitignore +11 -0
  26. .vscode/extensions.json +16 -0
  27. .vscode/launch.json +61 -0
  28. .vscode/settings.json +126 -0
  29. .vscode/tasks.json +26 -0
  30. .vscode/tools/launch.template.json +57 -0
  31. .vscode/tools/settings.template.json +108 -0
  32. .vscode/tools/setup_vscode.py +234 -0
  33. CONTRIBUTING.md +45 -0
  34. CONTRIBUTORS.md +27 -0
  35. Datasets/OmniReset_failbias/Resets/InsertiveCube__ReceptiveCube/resets_ObjectAnywhereEEAnywhere.pt +3 -0
  36. Datasets/OmniReset_failbias/Resets/InsertiveCube__ReceptiveCube/resets_ObjectAnywhereEEGrasped.pt +3 -0
  37. Datasets/OmniReset_failbias/Resets/InsertiveCube__ReceptiveCube/resets_ObjectPartiallyAssembledEEGrasped.pt +3 -0
  38. Datasets/OmniReset_failbias/Resets/InsertiveCube__ReceptiveCube/resets_ObjectRestingEEGrasped.pt +3 -0
  39. LICENCE +30 -0
  40. README.md +52 -0
  41. VERSION +1 -0
  42. _isaaclab/IsaacLab/.dockerignore +30 -0
  43. _isaaclab/IsaacLab/.gitattributes +14 -0
  44. _isaaclab/IsaacLab/.github/CODEOWNERS +101 -0
  45. _isaaclab/IsaacLab/.github/ISSUE_TEMPLATE/bug.md +54 -0
  46. _isaaclab/IsaacLab/.github/ISSUE_TEMPLATE/proposal.md +45 -0
  47. _isaaclab/IsaacLab/.github/ISSUE_TEMPLATE/question.md +21 -0
  48. _isaaclab/IsaacLab/.github/LICENSE_HEADER.txt +4 -0
  49. _isaaclab/IsaacLab/.github/LICENSE_HEADER_MIMIC.txt +4 -0
  50. _isaaclab/IsaacLab/.github/PULL_REQUEST_TEMPLATE.md +59 -0
.dockerignore ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ignore .git related folders
2
+ .git/
3
+ .github/
4
+ .gitignore
5
+ # ignore docs
6
+ docs/
7
+ # copy in licenses folder to the container
8
+ !docs/licenses/
9
+ # ignore logs
10
+ **/logs/
11
+ **/runs/
12
+ **/output/*
13
+ **/outputs/*
14
+ **/videos/*
15
+ **/wandb/*
16
+ *.tmp
17
+ # ignore docker
18
+ docker/cluster/exports/
19
+ docker/.container.cfg
20
+ # ignore recordings
21
+ recordings/
22
+ # ignore __pycache__
23
+ **/__pycache__/
24
+ **/*.egg-info/
25
+ # ignore local virtual environments
26
+ env_uwlab/
27
+ # Note: _isaaclab/ is NOT ignored so it gets synced to cluster
28
+ # ignore isaac sim symlink
29
+ _isaac_sim?
30
+ # Docker history
31
+ docker/.uw-lab-docker-history
32
+ # datasets
33
+ /datasets/
.flake8 ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [flake8]
2
+ show-source=True
3
+ statistics=True
4
+ per-file-ignores=*/__init__.py:F401
5
+ # E402: Module level import not at top of file
6
+ # E501: Line too long
7
+ # W503: Line break before binary operator
8
+ # E203: Whitespace before ':' -> conflicts with black
9
+ # D401: First line should be in imperative mood
10
+ # R504: Unnecessary variable assignment before return statement.
11
+ # R505: Unnecessary elif after return statement
12
+ # SIM102: Use a single if-statement instead of nested if-statements
13
+ # SIM117: Merge with statements for context managers that have same scope.
14
+ # SIM118: Checks for key-existence checks against dict.keys() calls.
15
+ ignore=E402,E501,W503,E203,D401,R504,R505,SIM102,SIM117,SIM118
16
+ max-line-length = 120
17
+ max-complexity = 30
18
+ exclude=_*,.vscode,.git,docs/**
19
+ # docstrings
20
+ docstring-convention=google
21
+ # annotations
22
+ suppress-none-returning=True
23
+ allow-star-arg-any=True
.gitattributes CHANGED
@@ -1,35 +1,197 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
  *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.usd filter=lfs diff=lfs merge=lfs -text
2
+ *.usda filter=lfs diff=lfs merge=lfs -text
3
+ *.psd filter=lfs diff=lfs merge=lfs -text
4
+ *.hdr filter=lfs diff=lfs merge=lfs -text
5
+ *.dae filter=lfs diff=lfs merge=lfs -text
6
+ *.mtl filter=lfs diff=lfs merge=lfs -text
7
+ *.obj filter=lfs diff=lfs merge=lfs -text
8
+ *.gif filter=lfs diff=lfs merge=lfs -text
9
+ *.mp4 filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
10
  *.pt filter=lfs diff=lfs merge=lfs -text
11
+ *.jit filter=lfs diff=lfs merge=lfs -text
12
+ *.hdf5 filter=lfs diff=lfs merge=lfs -text
13
+
14
+ *.bat text eol=crlf
15
+ _isaaclab/IsaacLab/docs/source/_static/NVIDIA-logo-white.png filter=lfs diff=lfs merge=lfs -text
16
+ _isaaclab/IsaacLab/docs/source/_static/benchmarks/cartpole.jpg filter=lfs diff=lfs merge=lfs -text
17
+ _isaaclab/IsaacLab/docs/source/_static/benchmarks/g1_rough.jpg filter=lfs diff=lfs merge=lfs -text
18
+ _isaaclab/IsaacLab/docs/source/_static/benchmarks/shadow.jpg filter=lfs diff=lfs merge=lfs -text
19
+ _isaaclab/IsaacLab/docs/source/_static/demos/arms.jpg filter=lfs diff=lfs merge=lfs -text
20
+ _isaaclab/IsaacLab/docs/source/_static/demos/bin_packing.jpg filter=lfs diff=lfs merge=lfs -text
21
+ _isaaclab/IsaacLab/docs/source/_static/demos/bipeds.jpg filter=lfs diff=lfs merge=lfs -text
22
+ _isaaclab/IsaacLab/docs/source/_static/demos/deformables.jpg filter=lfs diff=lfs merge=lfs -text
23
+ _isaaclab/IsaacLab/docs/source/_static/demos/h1_locomotion.jpg filter=lfs diff=lfs merge=lfs -text
24
+ _isaaclab/IsaacLab/docs/source/_static/demos/hands.jpg filter=lfs diff=lfs merge=lfs -text
25
+ _isaaclab/IsaacLab/docs/source/_static/demos/haply_teleop_franka.jpg filter=lfs diff=lfs merge=lfs -text
26
+ _isaaclab/IsaacLab/docs/source/_static/demos/markers.jpg filter=lfs diff=lfs merge=lfs -text
27
+ _isaaclab/IsaacLab/docs/source/_static/demos/multi-mesh-raycast.jpg filter=lfs diff=lfs merge=lfs -text
28
+ _isaaclab/IsaacLab/docs/source/_static/demos/multi_asset.jpg filter=lfs diff=lfs merge=lfs -text
29
+ _isaaclab/IsaacLab/docs/source/_static/demos/pick_and_place.jpg filter=lfs diff=lfs merge=lfs -text
30
+ _isaaclab/IsaacLab/docs/source/_static/demos/procedural_terrain.jpg filter=lfs diff=lfs merge=lfs -text
31
+ _isaaclab/IsaacLab/docs/source/_static/demos/quadrupeds.jpg filter=lfs diff=lfs merge=lfs -text
32
+ _isaaclab/IsaacLab/docs/source/_static/demos/renderer_rtx_realtime.jpg filter=lfs diff=lfs merge=lfs -text
33
+ _isaaclab/IsaacLab/docs/source/_static/how-to/howto_rendering_example_balanced.jpg filter=lfs diff=lfs merge=lfs -text
34
+ _isaaclab/IsaacLab/docs/source/_static/how-to/howto_rendering_example_performance.jpg filter=lfs diff=lfs merge=lfs -text
35
+ _isaaclab/IsaacLab/docs/source/_static/how-to/howto_rendering_example_quality.jpg filter=lfs diff=lfs merge=lfs -text
36
+ _isaaclab/IsaacLab/docs/source/_static/isaaclab.jpg filter=lfs diff=lfs merge=lfs -text
37
+ _isaaclab/IsaacLab/docs/source/_static/migration/ovd_pvd_comparison.jpg filter=lfs diff=lfs merge=lfs -text
38
+ _isaaclab/IsaacLab/docs/source/_static/overview/sensors/contact_diagram.jpg filter=lfs diff=lfs merge=lfs -text
39
+ _isaaclab/IsaacLab/docs/source/_static/overview/sensors/contact_visualization.jpg filter=lfs diff=lfs merge=lfs -text
40
+ _isaaclab/IsaacLab/docs/source/_static/overview/sensors/frame_transformer.jpg filter=lfs diff=lfs merge=lfs -text
41
+ _isaaclab/IsaacLab/docs/source/_static/overview/sensors/imu_diagram.jpg filter=lfs diff=lfs merge=lfs -text
42
+ _isaaclab/IsaacLab/docs/source/_static/overview/sensors/raycaster_patterns.jpg filter=lfs diff=lfs merge=lfs -text
43
+ _isaaclab/IsaacLab/docs/source/_static/overview/sensors/raycaster_visualizer.jpg filter=lfs diff=lfs merge=lfs -text
44
+ _isaaclab/IsaacLab/docs/source/_static/overview/sensors/tacsl_diagram.jpg filter=lfs diff=lfs merge=lfs -text
45
+ _isaaclab/IsaacLab/docs/source/_static/overview/sensors/tacsl_force_field_example.jpg filter=lfs diff=lfs merge=lfs -text
46
+ _isaaclab/IsaacLab/docs/source/_static/policy_deployment/00_hover/hover_stable_wave.png filter=lfs diff=lfs merge=lfs -text
47
+ _isaaclab/IsaacLab/docs/source/_static/policy_deployment/00_hover/hover_training_robots.png filter=lfs diff=lfs merge=lfs -text
48
+ _isaaclab/IsaacLab/docs/source/_static/policy_deployment/02_gear_assembly/gear_assembly_sim_real.webm filter=lfs diff=lfs merge=lfs -text
49
+ _isaaclab/IsaacLab/docs/source/_static/policy_deployment/02_gear_assembly/sim_real_gear_assembly_train.jpg filter=lfs diff=lfs merge=lfs -text
50
+ _isaaclab/IsaacLab/docs/source/_static/setup/asset_caching.jpg filter=lfs diff=lfs merge=lfs -text
51
+ _isaaclab/IsaacLab/docs/source/_static/setup/cloudxr_avp_ik_error.jpg filter=lfs diff=lfs merge=lfs -text
52
+ _isaaclab/IsaacLab/docs/source/_static/setup/cloudxr_viewport.jpg filter=lfs diff=lfs merge=lfs -text
53
+ _isaaclab/IsaacLab/docs/source/_static/setup/ecosystem-dark.jpg filter=lfs diff=lfs merge=lfs -text
54
+ _isaaclab/IsaacLab/docs/source/_static/setup/ecosystem-light.jpg filter=lfs diff=lfs merge=lfs -text
55
+ _isaaclab/IsaacLab/docs/source/_static/setup/isaac_ants_example.jpg filter=lfs diff=lfs merge=lfs -text
56
+ _isaaclab/IsaacLab/docs/source/_static/setup/verify_install.jpg filter=lfs diff=lfs merge=lfs -text
57
+ _isaaclab/IsaacLab/docs/source/_static/setup/walkthrough_1_1_result.jpg filter=lfs diff=lfs merge=lfs -text
58
+ _isaaclab/IsaacLab/docs/source/_static/setup/walkthrough_1_2_arrows.jpg filter=lfs diff=lfs merge=lfs -text
59
+ _isaaclab/IsaacLab/docs/source/_static/tasks/classic/ant.jpg filter=lfs diff=lfs merge=lfs -text
60
+ _isaaclab/IsaacLab/docs/source/_static/tasks/classic/cart_double_pendulum.jpg filter=lfs diff=lfs merge=lfs -text
61
+ _isaaclab/IsaacLab/docs/source/_static/tasks/classic/cartpole.jpg filter=lfs diff=lfs merge=lfs -text
62
+ _isaaclab/IsaacLab/docs/source/_static/tasks/classic/humanoid.jpg filter=lfs diff=lfs merge=lfs -text
63
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/a1_flat.jpg filter=lfs diff=lfs merge=lfs -text
64
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/a1_rough.jpg filter=lfs diff=lfs merge=lfs -text
65
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/agility_digit_flat.jpg filter=lfs diff=lfs merge=lfs -text
66
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/agility_digit_loco_manip.jpg filter=lfs diff=lfs merge=lfs -text
67
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/agility_digit_rough.jpg filter=lfs diff=lfs merge=lfs -text
68
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/anymal_b_flat.jpg filter=lfs diff=lfs merge=lfs -text
69
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/anymal_b_rough.jpg filter=lfs diff=lfs merge=lfs -text
70
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/anymal_c_flat.jpg filter=lfs diff=lfs merge=lfs -text
71
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/anymal_c_rough.jpg filter=lfs diff=lfs merge=lfs -text
72
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/anymal_d_flat.jpg filter=lfs diff=lfs merge=lfs -text
73
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/anymal_d_rough.jpg filter=lfs diff=lfs merge=lfs -text
74
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/g1_flat.jpg filter=lfs diff=lfs merge=lfs -text
75
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/g1_rough.jpg filter=lfs diff=lfs merge=lfs -text
76
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/go1_flat.jpg filter=lfs diff=lfs merge=lfs -text
77
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/go1_rough.jpg filter=lfs diff=lfs merge=lfs -text
78
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/go2_flat.jpg filter=lfs diff=lfs merge=lfs -text
79
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/go2_rough.jpg filter=lfs diff=lfs merge=lfs -text
80
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/h1_flat.jpg filter=lfs diff=lfs merge=lfs -text
81
+ _isaaclab/IsaacLab/docs/source/_static/tasks/locomotion/h1_rough.jpg filter=lfs diff=lfs merge=lfs -text
82
+ _isaaclab/IsaacLab/docs/source/_static/tasks/manipulation/allegro_cube.jpg filter=lfs diff=lfs merge=lfs -text
83
+ _isaaclab/IsaacLab/docs/source/_static/tasks/manipulation/franka_lift.jpg filter=lfs diff=lfs merge=lfs -text
84
+ _isaaclab/IsaacLab/docs/source/_static/tasks/manipulation/franka_open_drawer.jpg filter=lfs diff=lfs merge=lfs -text
85
+ _isaaclab/IsaacLab/docs/source/_static/tasks/manipulation/franka_reach.jpg filter=lfs diff=lfs merge=lfs -text
86
+ _isaaclab/IsaacLab/docs/source/_static/tasks/manipulation/franka_stack.jpg filter=lfs diff=lfs merge=lfs -text
87
+ _isaaclab/IsaacLab/docs/source/_static/tasks/manipulation/g1_pick_place.jpg filter=lfs diff=lfs merge=lfs -text
88
+ _isaaclab/IsaacLab/docs/source/_static/tasks/manipulation/g1_pick_place_fixed_base.jpg filter=lfs diff=lfs merge=lfs -text
89
+ _isaaclab/IsaacLab/docs/source/_static/tasks/manipulation/gr-1_pick_place.jpg filter=lfs diff=lfs merge=lfs -text
90
+ _isaaclab/IsaacLab/docs/source/_static/tasks/manipulation/shadow_cube.jpg filter=lfs diff=lfs merge=lfs -text
91
+ _isaaclab/IsaacLab/docs/source/_static/tasks/manipulation/shadow_hand_over.jpg filter=lfs diff=lfs merge=lfs -text
92
+ _isaaclab/IsaacLab/docs/source/_static/tasks/manipulation/ur10_reach.jpg filter=lfs diff=lfs merge=lfs -text
93
+ _isaaclab/IsaacLab/docs/source/_static/tasks/manipulation/ur10e_reach.jpg filter=lfs diff=lfs merge=lfs -text
94
+ _isaaclab/IsaacLab/docs/source/_static/tasks/navigation/anymal_c_nav.jpg filter=lfs diff=lfs merge=lfs -text
95
+ _isaaclab/IsaacLab/docs/source/_static/tasks/others/humanoid_amp.jpg filter=lfs diff=lfs merge=lfs -text
96
+ _isaaclab/IsaacLab/docs/source/_static/tasks.jpg filter=lfs diff=lfs merge=lfs -text
97
+ _isaaclab/IsaacLab/docs/source/_static/teleop/hand_asset.jpg filter=lfs diff=lfs merge=lfs -text
98
+ _isaaclab/IsaacLab/docs/source/_static/teleop/teleop_diagram.jpg filter=lfs diff=lfs merge=lfs -text
99
+ _isaaclab/IsaacLab/docs/source/_static/terrains/height_field/inverted_pyramid_sloped_terrain.jpg filter=lfs diff=lfs merge=lfs -text
100
+ _isaaclab/IsaacLab/docs/source/_static/terrains/height_field/pyramid_sloped_terrain.jpg filter=lfs diff=lfs merge=lfs -text
101
+ _isaaclab/IsaacLab/docs/source/_static/terrains/height_field/random_uniform_terrain.jpg filter=lfs diff=lfs merge=lfs -text
102
+ _isaaclab/IsaacLab/docs/source/_static/terrains/height_field/stepping_stones_terrain.jpg filter=lfs diff=lfs merge=lfs -text
103
+ _isaaclab/IsaacLab/docs/source/_static/terrains/height_field/wave_terrain.jpg filter=lfs diff=lfs merge=lfs -text
104
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_add_new_robot_result.jpg filter=lfs diff=lfs merge=lfs -text
105
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_add_sensors.jpg filter=lfs diff=lfs merge=lfs -text
106
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_create_direct_workflow.jpg filter=lfs diff=lfs merge=lfs -text
107
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_create_manager_base.jpg filter=lfs diff=lfs merge=lfs -text
108
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_create_manager_rl_env.jpg filter=lfs diff=lfs merge=lfs -text
109
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_creating_a_scene.jpg filter=lfs diff=lfs merge=lfs -text
110
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_launch_app.jpg filter=lfs diff=lfs merge=lfs -text
111
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_modify_direct_rl_env.jpg filter=lfs diff=lfs merge=lfs -text
112
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_operational_space_controller.jpg filter=lfs diff=lfs merge=lfs -text
113
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_register_environment.jpg filter=lfs diff=lfs merge=lfs -text
114
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_run_articulation.jpg filter=lfs diff=lfs merge=lfs -text
115
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_run_deformable_object.jpg filter=lfs diff=lfs merge=lfs -text
116
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_run_rigid_object.jpg filter=lfs diff=lfs merge=lfs -text
117
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_run_surface_gripper.jpg filter=lfs diff=lfs merge=lfs -text
118
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_spawn_prims.jpg filter=lfs diff=lfs merge=lfs -text
119
+ _isaaclab/IsaacLab/docs/source/_static/tutorials/tutorial_task_space_controller.jpg filter=lfs diff=lfs merge=lfs -text
120
+ _isaaclab/IsaacLab/docs/source/_static/visualizers/newton_viz.jpg filter=lfs diff=lfs merge=lfs -text
121
+ _isaaclab/IsaacLab/docs/source/_static/visualizers/ov_viz.jpg filter=lfs diff=lfs merge=lfs -text
122
+ _isaaclab/IsaacLab/docs/source/_static/visualizers/rerun_viz.jpg filter=lfs diff=lfs merge=lfs -text
123
+ _isaaclab/IsaacLab/docs/source/_static/vscode_tasks.png filter=lfs diff=lfs merge=lfs -text
124
+ _isaaclab/IsaacLab/source/isaaclab_tasks/isaaclab_tasks/direct/humanoid_amp/motions/humanoid_dance.npz filter=lfs diff=lfs merge=lfs -text
125
+ _isaaclab/IsaacLab/source/isaaclab_tasks/isaaclab_tasks/direct/humanoid_amp/motions/humanoid_run.npz filter=lfs diff=lfs merge=lfs -text
126
+ _isaaclab/IsaacLab/source/isaaclab_tasks/isaaclab_tasks/direct/humanoid_amp/motions/humanoid_walk.npz filter=lfs diff=lfs merge=lfs -text
127
+ docs/source/_static/UW-logo-black.png filter=lfs diff=lfs merge=lfs -text
128
+ docs/source/_static/UW-logo-white.png filter=lfs diff=lfs merge=lfs -text
129
+ docs/source/_static/publications/omnireset/camera_setup.jpg filter=lfs diff=lfs merge=lfs -text
130
+ docs/source/_static/publications/omnireset/example_blend_front_camera.png filter=lfs diff=lfs merge=lfs -text
131
+ docs/source/_static/publications/omnireset/example_blend_side_camera.png filter=lfs diff=lfs merge=lfs -text
132
+ docs/source/_static/publications/omnireset/example_blend_wrist_camera.png filter=lfs diff=lfs merge=lfs -text
133
+ docs/source/_static/publications/omnireset/example_calibration.jpg filter=lfs diff=lfs merge=lfs -text
134
+ docs/source/_static/publications/pg1/pg1.png filter=lfs diff=lfs merge=lfs -text
135
+ docs/source/_static/setup/asset_caching.jpg filter=lfs diff=lfs merge=lfs -text
136
+ docs/source/_static/setup/cloudxr_avp_ik_error.jpg filter=lfs diff=lfs merge=lfs -text
137
+ docs/source/_static/setup/cloudxr_viewport.jpg filter=lfs diff=lfs merge=lfs -text
138
+ docs/source/_static/setup/isaac_ants_example.jpg filter=lfs diff=lfs merge=lfs -text
139
+ docs/source/_static/setup/verify_install.jpg filter=lfs diff=lfs merge=lfs -text
140
+ docs/source/_static/setup/walkthrough_1_1_result.jpg filter=lfs diff=lfs merge=lfs -text
141
+ docs/source/_static/setup/walkthrough_1_2_arrows.jpg filter=lfs diff=lfs merge=lfs -text
142
+ docs/source/_static/tasks/classic/ant.jpg filter=lfs diff=lfs merge=lfs -text
143
+ docs/source/_static/tasks/classic/cart_double_pendulum.jpg filter=lfs diff=lfs merge=lfs -text
144
+ docs/source/_static/tasks/classic/cartpole.jpg filter=lfs diff=lfs merge=lfs -text
145
+ docs/source/_static/tasks/classic/humanoid.jpg filter=lfs diff=lfs merge=lfs -text
146
+ docs/source/_static/tasks/locomotion/a1_flat.jpg filter=lfs diff=lfs merge=lfs -text
147
+ docs/source/_static/tasks/locomotion/a1_rough.jpg filter=lfs diff=lfs merge=lfs -text
148
+ docs/source/_static/tasks/locomotion/agility_digit_flat.jpg filter=lfs diff=lfs merge=lfs -text
149
+ docs/source/_static/tasks/locomotion/agility_digit_loco_manip.jpg filter=lfs diff=lfs merge=lfs -text
150
+ docs/source/_static/tasks/locomotion/agility_digit_rough.jpg filter=lfs diff=lfs merge=lfs -text
151
+ docs/source/_static/tasks/locomotion/anymal_b_flat.jpg filter=lfs diff=lfs merge=lfs -text
152
+ docs/source/_static/tasks/locomotion/anymal_b_rough.jpg filter=lfs diff=lfs merge=lfs -text
153
+ docs/source/_static/tasks/locomotion/anymal_c_flat.jpg filter=lfs diff=lfs merge=lfs -text
154
+ docs/source/_static/tasks/locomotion/anymal_c_rough.jpg filter=lfs diff=lfs merge=lfs -text
155
+ docs/source/_static/tasks/locomotion/anymal_d_flat.jpg filter=lfs diff=lfs merge=lfs -text
156
+ docs/source/_static/tasks/locomotion/anymal_d_rough.jpg filter=lfs diff=lfs merge=lfs -text
157
+ docs/source/_static/tasks/locomotion/g1_flat.jpg filter=lfs diff=lfs merge=lfs -text
158
+ docs/source/_static/tasks/locomotion/g1_rough.jpg filter=lfs diff=lfs merge=lfs -text
159
+ docs/source/_static/tasks/locomotion/go1_flat.jpg filter=lfs diff=lfs merge=lfs -text
160
+ docs/source/_static/tasks/locomotion/go1_rough.jpg filter=lfs diff=lfs merge=lfs -text
161
+ docs/source/_static/tasks/locomotion/go2_flat.jpg filter=lfs diff=lfs merge=lfs -text
162
+ docs/source/_static/tasks/locomotion/go2_rough.jpg filter=lfs diff=lfs merge=lfs -text
163
+ docs/source/_static/tasks/locomotion/h1_flat.jpg filter=lfs diff=lfs merge=lfs -text
164
+ docs/source/_static/tasks/locomotion/h1_rough.jpg filter=lfs diff=lfs merge=lfs -text
165
+ docs/source/_static/tasks/locomotion/spot_obstacle.jpg filter=lfs diff=lfs merge=lfs -text
166
+ docs/source/_static/tasks/locomotion/spot_slope.jpg filter=lfs diff=lfs merge=lfs -text
167
+ docs/source/_static/tasks/locomotion/spot_stepping_stone.jpg filter=lfs diff=lfs merge=lfs -text
168
+ docs/source/_static/tasks/manipulation/allegro_cube.jpg filter=lfs diff=lfs merge=lfs -text
169
+ docs/source/_static/tasks/manipulation/franka_lift.jpg filter=lfs diff=lfs merge=lfs -text
170
+ docs/source/_static/tasks/manipulation/franka_open_drawer.jpg filter=lfs diff=lfs merge=lfs -text
171
+ docs/source/_static/tasks/manipulation/franka_reach.jpg filter=lfs diff=lfs merge=lfs -text
172
+ docs/source/_static/tasks/manipulation/franka_stack.jpg filter=lfs diff=lfs merge=lfs -text
173
+ docs/source/_static/tasks/manipulation/g1_pick_place.jpg filter=lfs diff=lfs merge=lfs -text
174
+ docs/source/_static/tasks/manipulation/g1_pick_place_fixed_base.jpg filter=lfs diff=lfs merge=lfs -text
175
+ docs/source/_static/tasks/manipulation/gr-1_pick_place.jpg filter=lfs diff=lfs merge=lfs -text
176
+ docs/source/_static/tasks/manipulation/omnireset_drawer_assemble.jpg filter=lfs diff=lfs merge=lfs -text
177
+ docs/source/_static/tasks/manipulation/shadow_cube.jpg filter=lfs diff=lfs merge=lfs -text
178
+ docs/source/_static/tasks/manipulation/shadow_hand_over.jpg filter=lfs diff=lfs merge=lfs -text
179
+ docs/source/_static/tasks/manipulation/tycho_track_goal.jpg filter=lfs diff=lfs merge=lfs -text
180
+ docs/source/_static/tasks/manipulation/ur10_reach.jpg filter=lfs diff=lfs merge=lfs -text
181
+ docs/source/_static/tasks/manipulation/ur10e_reach.jpg filter=lfs diff=lfs merge=lfs -text
182
+ docs/source/_static/tasks/manipulation/ur5_track_goal.jpg filter=lfs diff=lfs merge=lfs -text
183
+ docs/source/_static/tasks/manipulation/xarm_leap_track_goal.jpg filter=lfs diff=lfs merge=lfs -text
184
+ docs/source/_static/tasks/navigation/anymal_c_nav.jpg filter=lfs diff=lfs merge=lfs -text
185
+ docs/source/_static/tasks/others/humanoid_amp.jpg filter=lfs diff=lfs merge=lfs -text
186
+ docs/source/_static/tasks.jpg filter=lfs diff=lfs merge=lfs -text
187
+ docs/source/_static/teleop/hand_asset.jpg filter=lfs diff=lfs merge=lfs -text
188
+ docs/source/_static/teleop/teleop_diagram.jpg filter=lfs diff=lfs merge=lfs -text
189
+ docs/source/_static/uwlab.jpg filter=lfs diff=lfs merge=lfs -text
190
+ docs/source/_static/vscode_tasks.png filter=lfs diff=lfs merge=lfs -text
191
+ eval_baseline_rerun/samples.npy filter=lfs diff=lfs merge=lfs -text
192
+ eval_grid_out/success_rate.npy filter=lfs diff=lfs merge=lfs -text
193
+ eval_sample4d_finetuned/samples.npy filter=lfs diff=lfs merge=lfs -text
194
+ eval_sample4d_out/samples.npy filter=lfs diff=lfs merge=lfs -text
195
+ exported/policy.onnx filter=lfs diff=lfs merge=lfs -text
196
+ logs/rsl_rl/ant/2026-06-24_19-58-15/events.out.tfevents.1782345500.grail-jupiter-exp.19988.0 filter=lfs diff=lfs merge=lfs -text
197
+ logs/rsl_rl/ur5e_robotiq_2f85_omnireset_agent/2026-06-25_18-18-32/events.out.tfevents.1782426006.grail-jupiter-exp.242640.0 filter=lfs diff=lfs merge=lfs -text
.github/CODEOWNERS ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ # All Rights Reserved.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+
6
+ # Codeowners are designated by their GitHub username. They are
7
+ # the people who are responsible for reviewing and approving PRs
8
+ # that modify the files that match the pattern.
9
+ #
10
+ # Codeowners are not the same as contributors. They are not
11
+ # automatically added to the PR, but they will be requested to
12
+ # review the PR when it is created.
13
+ #
14
+ # As a general rule, the codeowners are the people who are
15
+ # most familiar with the code that the PR is modifying. If you
16
+ # are not sure who to add, ask in the issue or in the PR itself.
17
+ #
18
+ # The format of the file is as follows:
19
+ # <file pattern> <codeowners>
20
+
21
+ # Core Framework
22
+ /source/uwlab @zoctipus
23
+
24
+ # RL Environment
25
+ /source/uwlab_tasks @zoctipus
26
+
27
+ # Assets
28
+ /source/uwlab_assets @zoctipus
29
+
30
+ # RL
31
+ /source/uwlab_rl @zoctipus @patrickhaoy
32
+
33
+ # Application
34
+ /source/uwlab_apps @zoctipus @patrickhaoy
35
+
36
+ # Standalone Scripts
37
+ /scripts @zoctipus
38
+ /scripts_v2 @zoctipus
39
+
40
+ # Github Actions
41
+ /.github/ @zoctipus
42
+
43
+ # Visual Studio Code
44
+ /.vscode/ @zoctipus
45
+
46
+ # Infrastructure (Docker, Docs, Tools)
47
+ /docker/ @zoctipus
48
+ /docs/ @zoctipus
49
+ /tools/ @zoctipus
.github/ISSUE_TEMPLATE/bug.md ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ name: Bug Report
3
+ about: Submit a bug report
4
+ title: "[Bug Report] Bug title"
5
+
6
+ ---
7
+
8
+ If you are submitting a bug report, please fill in the following details and use the tag [bug].
9
+
10
+ ### Describe the bug
11
+
12
+ A clear and concise description of what the bug is.
13
+
14
+ ### Steps to reproduce
15
+
16
+ Please try to provide a minimal example to reproduce the bug. Error messages and stack traces are also helpful.
17
+
18
+ <!-- Please post terminal logs, minimal example to reproduce, or command to run under three backticks (```) to allow code formatting.
19
+
20
+ ```
21
+ Paste your error here
22
+ ```
23
+
24
+ For more information on this, check: https://www.markdownguide.org/extended-syntax/#fenced-code-blocks
25
+
26
+ -->
27
+
28
+ ### System Info
29
+
30
+ Describe the characteristic of your environment:
31
+
32
+ <!-- Please complete the following description. -->
33
+ - Commit: [e.g. 8f3b9ca]
34
+ - Isaac Sim Version: [e.g. 5.0, this can be obtained by `cat ${ISAACSIM_PATH}/VERSION`]
35
+ - OS: [e.g. Ubuntu 22.04]
36
+ - GPU: [e.g. RTX 5090]
37
+ - CUDA: [e.g. 12.8]
38
+ - GPU Driver: [e.g. 553.05, this can be seen by using `nvidia-smi` command.]
39
+
40
+ ### Additional context
41
+
42
+ Add any other context about the problem here.
43
+
44
+ ### Checklist
45
+
46
+ - [ ] I have checked that there is no similar issue in the repo (**required**)
47
+ - [ ] I have checked that the issue is not in running Isaac Sim itself and is related to the repo
48
+
49
+ ### Acceptance Criteria
50
+
51
+ Add the criteria for which this task is considered **done**. If not known at issue creation time, you can add this once the issue is assigned.
52
+
53
+ - [ ] Criteria 1
54
+ - [ ] Criteria 2
.github/ISSUE_TEMPLATE/proposal.md ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ name: Proposal
3
+ about: Propose changes that are not bug fixes
4
+ title: "[Proposal] Proposal title"
5
+ ---
6
+
7
+
8
+ ### Proposal
9
+
10
+ A clear and concise description of the proposal. In a few sentences, describe the feature and its core capabilities.
11
+
12
+ ### Motivation
13
+
14
+ Please outline the motivation for the proposal. Summarize the core use cases and user problems and needs you are trying to solve.
15
+
16
+ Is your feature request related to a problem? e.g.,"I'm always frustrated when [...]".
17
+
18
+ If this is related to another GitHub issue, please link here too.
19
+
20
+ ### Alternatives
21
+
22
+ A clear and concise description of any alternative solutions or features you've considered, if any.
23
+
24
+ ### Build Info
25
+
26
+ Describe the versions where you are observing the missing feature in:
27
+
28
+ <!-- Please complete the following description. -->
29
+ - UW Lab Version: [e.g. 2.3.0]
30
+ - Isaac Sim Version: [e.g. 5.1, this can be obtained by `cat ${ISAACSIM_PATH}/VERSION`]
31
+
32
+ ### Additional context
33
+
34
+ Add any other context or screenshots about the feature request here.
35
+
36
+ ### Checklist
37
+
38
+ - [ ] I have checked that there is no similar issue in the repo (**required**)
39
+
40
+ ### Acceptance Criteria
41
+
42
+ Add the criteria for which this task is considered **done**. If not known at issue creation time, you can add this once the issue is assigned.
43
+
44
+ - [ ] Criteria 1
45
+ - [ ] Criteria 2
.github/ISSUE_TEMPLATE/question.md ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ name: Question
3
+ about: Ask a question
4
+ title: "[Question] Question title"
5
+ ---
6
+
7
+ ### Question
8
+
9
+ Basic questions, related to robot learning, that are not bugs or feature requests will be closed without reply, because GitHub issues are not an appropriate venue for these.
10
+
11
+ Advanced/nontrivial questions, especially in areas where documentation is lacking, are very much welcome.
12
+
13
+ For questions that are related to running and understanding Isaac Sim, please post them at the official [Isaac Sim forums](https://forums.developer.nvidia.com/c/omniverse/simulation/69).
14
+
15
+ ### Build Info
16
+
17
+ Describe the versions that you are currently using:
18
+
19
+ <!-- Please complete the following description. -->
20
+ - UW Lab Version: [e.g. 2.3.0]
21
+ - Isaac Sim Version: [e.g. 5.1, this can be obtained by `cat ${ISAACSIM_PATH}/VERSION`]
.github/LICENSE_HEADER.md ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ All Rights Reserved.
3
+
4
+ SPDX-License-Identifier: BSD-3-Clause
.github/LICENSE_HEADER.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ All Rights Reserved.
3
+
4
+ SPDX-License-Identifier: BSD-3-Clause
.github/PULL_REQUEST_TEMPLATE.md ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Description
2
+
3
+ <!--
4
+ Thank you for your interest in sending a pull request. Please make sure to check the contribution guidelines.
5
+
6
+ Link: https://uw-lab.github.io/UWLab/main/source/refs/contributing.html
7
+
8
+ 💡 Please try to keep PRs small and focused. Large PRs are harder to review and merge.
9
+ -->
10
+
11
+ Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context.
12
+ List any dependencies that are required for this change.
13
+
14
+ Fixes # (issue)
15
+
16
+ <!-- As a practice, it is recommended to open an issue to have discussions on the proposed pull request.
17
+ This makes it easier for the community to keep track of what is being developed or added, and if a given feature
18
+ is demanded by more than one party. -->
19
+
20
+ ## Type of change
21
+
22
+ <!-- As you go through the list, delete the ones that are not applicable. -->
23
+
24
+ - Bug fix (non-breaking change which fixes an issue)
25
+ - New feature (non-breaking change which adds functionality)
26
+ - Breaking change (existing functionality will not work without user modification)
27
+ - Documentation update
28
+
29
+ ## Screenshots
30
+
31
+ Please attach before and after screenshots of the change if applicable.
32
+
33
+ <!--
34
+ Example:
35
+
36
+ | Before | After |
37
+ | ------ | ----- |
38
+ | _gif/png before_ | _gif/png after_ |
39
+
40
+ 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.
41
+ -->
42
+
43
+ ## Checklist
44
+
45
+ - [ ] I have read and understood the [contribution guidelines](https://uw-lab.github.io/UWLab/main/source/refs/contributing.html)
46
+ - [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./uwlab.sh --format`
47
+ - [ ] I have made corresponding changes to the documentation
48
+ - [ ] My changes generate no new warnings
49
+ - [ ] I have added tests that prove my fix is effective or that my feature works
50
+ - [ ] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file
51
+ - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there
52
+
53
+ <!--
54
+ As you go through the checklist above, you can mark something as done by putting an x character in it
55
+
56
+ For example,
57
+ - [x] I have done this task
58
+ - [ ] I have not done this task
59
+ -->
.github/actions/combine-results/action.yml ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ # All Rights Reserved.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+
6
+ name: 'Combine XML Test Results'
7
+ description: 'Combines multiple XML test result files into a single file'
8
+
9
+ inputs:
10
+ tests-dir:
11
+ description: 'Directory containing test result files'
12
+ default: 'tests'
13
+ required: false
14
+ output-file:
15
+ description: 'Output combined XML file path'
16
+ required: true
17
+ reports-dir:
18
+ description: 'Directory to store the combined results'
19
+ default: 'reports'
20
+ required: false
21
+
22
+ runs:
23
+ using: composite
24
+ steps:
25
+ - name: Combine XML Test Results
26
+ shell: sh
27
+ run: |
28
+ # Function to combine multiple XML test results
29
+ combine_xml_results() {
30
+ local tests_dir="$1"
31
+ local output_file="$2"
32
+ local reports_dir="$3"
33
+
34
+ echo "Combining test results from: $tests_dir"
35
+ echo "Output file: $output_file"
36
+ echo "Reports directory: $reports_dir"
37
+
38
+ # Check if reports directory exists
39
+ if [ ! -d "$reports_dir" ]; then
40
+ echo "⚠️ Reports directory does not exist: $reports_dir"
41
+ mkdir -p "$reports_dir"
42
+ fi
43
+
44
+ # Check if tests directory exists
45
+ if [ ! -d "$tests_dir" ]; then
46
+ echo "⚠️ Tests directory does not exist: $tests_dir"
47
+ echo "Creating fallback XML..."
48
+ echo '<?xml version="1.0" encoding="utf-8"?><testsuite name="combined" tests="0" failures="0" errors="1" time="0"><testcase classname="setup" name="no_tests_dir"><error message="Tests directory not found">Tests directory was not found</error></testcase></testsuite>' > "$output_file"
49
+ return
50
+ fi
51
+
52
+ # Find all XML files in the tests directory
53
+ echo "Searching for XML files in: $tests_dir"
54
+ xml_files=$(find "$tests_dir" -name "*.xml" -type f 2>/dev/null | sort)
55
+
56
+ if [ -z "$xml_files" ]; then
57
+ echo "⚠️ No XML files found in: $tests_dir"
58
+ echo "Creating fallback XML..."
59
+ echo '<?xml version="1.0" encoding="utf-8"?><testsuite name="combined" tests="0" failures="0" errors="1" time="0"><testcase classname="setup" name="no_xml_files"><error message="No XML files found">No XML test result files were found</error></testcase></testsuite>' > "$output_file"
60
+ return
61
+ fi
62
+
63
+ # Count XML files found
64
+ file_count=$(echo "$xml_files" | wc -l)
65
+ echo "✅ Found $file_count XML file(s):"
66
+ echo "$xml_files" | while read -r file; do
67
+ echo " - $file ($(wc -c < "$file") bytes)"
68
+ done
69
+
70
+ # Create combined XML
71
+ echo "🔄 Combining $file_count XML files..."
72
+ echo '<?xml version="1.0" encoding="utf-8"?>' > "$output_file"
73
+ echo '<testsuites>' >> "$output_file"
74
+
75
+ # Process each XML file
76
+ combined_count=0
77
+ echo "$xml_files" | while read -r file; do
78
+ if [ -f "$file" ]; then
79
+ echo " Processing: $file"
80
+ # Remove XML declaration and outer testsuites wrapper from each file
81
+ # Remove first line (XML declaration) and strip outer <testsuites>/</testsuites> tags
82
+ sed '1d; s/^<testsuites>//; s/<\/testsuites>$//' "$file" >> "$output_file" 2>/dev/null || {
83
+ echo " ⚠️ Warning: Could not process $file, skipping..."
84
+ }
85
+ combined_count=$((combined_count + 1))
86
+ fi
87
+ done
88
+
89
+ echo '</testsuites>' >> "$output_file"
90
+ echo "✅ Successfully combined $combined_count files into: $output_file"
91
+
92
+ # Verify output file was created
93
+ if [ -f "$output_file" ]; then
94
+ echo "✅ Final output file created: $output_file"
95
+ echo "📊 Output file size: $(wc -c < "$output_file") bytes"
96
+ else
97
+ echo "❌ Failed to create output file: $output_file"
98
+ exit 1
99
+ fi
100
+ }
101
+
102
+ # Call the function with provided parameters
103
+ combine_xml_results "${{ inputs.tests-dir }}" "${{ inputs.output-file }}" "${{ inputs.reports-dir }}"
.github/actions/docker-build/action.yml ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ # All Rights Reserved.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+
6
+ name: 'Build Docker Image'
7
+ description: 'Builds a Docker image with IsaacSim and UWLab dependencies'
8
+
9
+ inputs:
10
+ image-tag:
11
+ description: 'Docker image tag to use'
12
+ required: true
13
+ isaacsim-base-image:
14
+ description: 'IsaacSim base image'
15
+ required: true
16
+ isaacsim-version:
17
+ description: 'IsaacSim version'
18
+ required: true
19
+ dockerfile-path:
20
+ description: 'Path to Dockerfile'
21
+ default: 'docker/Dockerfile.base'
22
+ required: false
23
+ context-path:
24
+ description: 'Build context path'
25
+ default: '.'
26
+ required: false
27
+
28
+ runs:
29
+ using: composite
30
+ steps:
31
+ - name: NGC Login
32
+ shell: sh
33
+ run: |
34
+ # Only attempt NGC login if API key is available
35
+ if [ -n "${{ env.NGC_API_KEY }}" ]; then
36
+ echo "Logging into NGC registry..."
37
+ docker login -u \$oauthtoken -p ${{ env.NGC_API_KEY }} nvcr.io
38
+ echo "✅ Successfully logged into NGC registry"
39
+ else
40
+ echo "⚠️ NGC_API_KEY not available - skipping NGC login"
41
+ echo "This is normal for PRs from forks or when secrets are not configured"
42
+ fi
43
+
44
+ - name: Build Docker Image
45
+ shell: sh
46
+ run: |
47
+ # Function to build Docker image
48
+ build_docker_image() {
49
+ local image_tag="$1"
50
+ local isaacsim_base_image="$2"
51
+ local isaacsim_version="$3"
52
+ local dockerfile_path="$4"
53
+ local context_path="$5"
54
+
55
+ echo "Building Docker image: $image_tag"
56
+ echo "Using Dockerfile: $dockerfile_path"
57
+ echo "Build context: $context_path"
58
+
59
+ # Build Docker image
60
+ docker buildx build --progress=plain --platform linux/amd64 \
61
+ -t uw-lab-dev \
62
+ -t $image_tag \
63
+ --build-arg ISAACSIM_BASE_IMAGE_ARG="$isaacsim_base_image" \
64
+ --build-arg ISAACSIM_VERSION_ARG="$isaacsim_version" \
65
+ --build-arg ISAACSIM_ROOT_PATH_ARG=/isaac-sim \
66
+ --build-arg UWLAB_PATH_ARG=/workspace/uwlab \
67
+ --build-arg DOCKER_USER_HOME_ARG=/root \
68
+ --cache-from type=gha \
69
+ --cache-to type=gha,mode=max \
70
+ -f $dockerfile_path \
71
+ --load $context_path
72
+
73
+ echo "✅ Docker image built successfully: $image_tag"
74
+ docker images | grep uw-lab-dev
75
+ }
76
+
77
+ # Call the function with provided parameters
78
+ build_docker_image "${{ inputs.image-tag }}" "${{ inputs.isaacsim-base-image }}" "${{ inputs.isaacsim-version }}" "${{ inputs.dockerfile-path }}" "${{ inputs.context-path }}"
.github/actions/run-tests/action.yml ADDED
@@ -0,0 +1,157 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ # All Rights Reserved.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+
6
+ name: 'Run Tests in Docker Container'
7
+ description: 'Runs pytest tests in a Docker container with GPU support and result collection'
8
+
9
+ inputs:
10
+ test-path:
11
+ description: 'Path to test directory or pytest arguments'
12
+ required: true
13
+ result-file:
14
+ description: 'Name of the result XML file'
15
+ required: true
16
+ container-name:
17
+ description: 'Name for the Docker container'
18
+ required: true
19
+ image-tag:
20
+ description: 'Docker image tag to use'
21
+ required: true
22
+ reports-dir:
23
+ description: 'Directory to store test results'
24
+ default: 'reports'
25
+ required: false
26
+ pytest-options:
27
+ description: 'Additional pytest options (e.g., -k filter)'
28
+ default: ''
29
+ required: false
30
+ filter-pattern:
31
+ description: 'Pattern to filter test files (e.g., uwlab_tasks)'
32
+ default: ''
33
+ required: false
34
+
35
+ runs:
36
+ using: composite
37
+ steps:
38
+ - name: Run Tests in Docker Container
39
+ shell: bash
40
+ run: |
41
+ # Function to run tests in Docker container
42
+ run_tests() {
43
+ local test_path="$1"
44
+ local result_file="$2"
45
+ local container_name="$3"
46
+ local image_tag="$4"
47
+ local reports_dir="$5"
48
+ local pytest_options="$6"
49
+ local filter_pattern="$7"
50
+
51
+ echo "Running tests in: $test_path"
52
+ if [ -n "$pytest_options" ]; then
53
+ echo "With pytest options: $pytest_options"
54
+ fi
55
+ if [ -n "$filter_pattern" ]; then
56
+ echo "With filter pattern: $filter_pattern"
57
+ fi
58
+
59
+ # Create reports directory
60
+ mkdir -p "$reports_dir"
61
+
62
+ # Clean up any existing container
63
+ docker rm -f $container_name 2>/dev/null || true
64
+
65
+ # Build Docker environment variables
66
+ docker_env_vars="\
67
+ -e OMNI_KIT_ACCEPT_EULA=yes \
68
+ -e ACCEPT_EULA=Y \
69
+ -e OMNI_KIT_DISABLE_CUP=1 \
70
+ -e ISAAC_SIM_HEADLESS=1 \
71
+ -e ISAAC_SIM_LOW_MEMORY=1 \
72
+ -e PYTHONUNBUFFERED=1 \
73
+ -e PYTHONIOENCODING=utf-8 \
74
+ -e TEST_RESULT_FILE=$result_file"
75
+
76
+ if [ -n "$filter_pattern" ]; then
77
+ if [[ "$filter_pattern" == not* ]]; then
78
+ # Handle "not pattern" case
79
+ exclude_pattern="${filter_pattern#not }"
80
+ docker_env_vars="$docker_env_vars -e TEST_EXCLUDE_PATTERN=$exclude_pattern"
81
+ echo "Setting exclude pattern: $exclude_pattern"
82
+ else
83
+ # Handle positive pattern case
84
+ docker_env_vars="$docker_env_vars -e TEST_FILTER_PATTERN=$filter_pattern"
85
+ echo "Setting include pattern: $filter_pattern"
86
+ fi
87
+ else
88
+ echo "No filter pattern provided"
89
+ fi
90
+
91
+ echo "Docker environment variables: '$docker_env_vars'"
92
+
93
+ # Run tests in container with error handling
94
+ echo "🚀 Starting Docker container for tests..."
95
+ if docker run --name $container_name \
96
+ --entrypoint bash --gpus all --network=host \
97
+ --security-opt=no-new-privileges:true \
98
+ --memory=$(echo "$(free -m | awk '/^Mem:/{print $2}') * 0.9 / 1" | bc)m \
99
+ --cpus=$(echo "$(nproc) * 0.9" | bc) \
100
+ --oom-kill-disable=false \
101
+ --ulimit nofile=65536:65536 \
102
+ --ulimit nproc=4096:4096 \
103
+ $docker_env_vars \
104
+ $image_tag \
105
+ -c "
106
+ set -e
107
+ cd /workspace/uwlab
108
+ mkdir -p tests
109
+ echo 'Starting pytest with path: $test_path'
110
+ /isaac-sim/python.sh -m pytest --ignore=tools/conftest.py $test_path $pytest_options -v --junitxml=tests/$result_file || echo 'Pytest completed with exit code: $?'
111
+ "; then
112
+ echo "✅ Docker container completed successfully"
113
+ else
114
+ echo "⚠️ Docker container failed, but continuing to copy results..."
115
+ fi
116
+
117
+ # Copy test results with error handling
118
+ echo "📋 Attempting to copy test results..."
119
+ if docker cp $container_name:/workspace/uwlab/tests/$result_file "$reports_dir/$result_file" 2>/dev/null; then
120
+ echo "✅ Test results copied successfully"
121
+ else
122
+ echo "❌ Failed to copy specific result file, trying to copy all test results..."
123
+ if docker cp $container_name:/workspace/uwlab/tests/ "$reports_dir/" 2>/dev/null; then
124
+ echo "✅ All test results copied successfully"
125
+ # Look for any XML files and use the first one found
126
+ if [ -f "$reports_dir/full_report.xml" ]; then
127
+ mv "$reports_dir/full_report.xml" "$reports_dir/$result_file"
128
+ echo "✅ Found and renamed full_report.xml to $result_file"
129
+ elif [ -f "$reports_dir/test-reports-"*".xml" ]; then
130
+ # Combine individual test reports if no full report exists
131
+ echo "📊 Combining individual test reports..."
132
+ echo '<?xml version="1.0" encoding="utf-8"?><testsuites>' > "$reports_dir/$result_file"
133
+ for xml_file in "$reports_dir"/test-reports-*.xml; do
134
+ if [ -f "$xml_file" ]; then
135
+ echo " Processing: $xml_file"
136
+ sed '1d; /^<testsuite/d; /^<\/testsuite/d' "$xml_file" >> "$reports_dir/$result_file" 2>/dev/null || true
137
+ fi
138
+ done
139
+ echo '</testsuites>' >> "$reports_dir/$result_file"
140
+ echo "✅ Combined individual test reports into $result_file"
141
+ else
142
+ echo "❌ No test result files found, creating fallback"
143
+ echo "<?xml version=\"1.0\" encoding=\"utf-8\"?><testsuite name=\"$container_name\" tests=\"0\" failures=\"0\" errors=\"1\" time=\"0\"><testcase classname=\"setup\" name=\"no_results_found\"><error message=\"No test results found\">Container may have failed to generate any results</error></testcase></testsuite>" > "$reports_dir/$result_file"
144
+ fi
145
+ else
146
+ echo "❌ Failed to copy any test results, creating fallback"
147
+ echo "<?xml version=\"1.0\" encoding=\"utf-8\"?><testsuite name=\"$container_name\" tests=\"0\" failures=\"0\" errors=\"1\" time=\"0\"><testcase classname=\"setup\" name=\"copy_failed\"><error message=\"Failed to copy test results\">Container may have failed to generate results</error></testcase></testsuite>" > "$reports_dir/$result_file"
148
+ fi
149
+ fi
150
+
151
+ # Clean up container
152
+ echo "🧹 Cleaning up Docker container..."
153
+ docker rm $container_name 2>/dev/null || echo "⚠️ Container cleanup failed, but continuing..."
154
+ }
155
+
156
+ # Call the function with provided parameters
157
+ run_tests "${{ inputs.test-path }}" "${{ inputs.result-file }}" "${{ inputs.container-name }}" "${{ inputs.image-tag }}" "${{ inputs.reports-dir }}" "${{ inputs.pytest-options }}" "${{ inputs.filter-pattern }}"
.github/labeler.yml ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ # All Rights Reserved.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+
6
+ # Documentation-related changes
7
+ documentation:
8
+ - all:
9
+ - changed-files:
10
+ - any-glob-to-any-file:
11
+ - 'docs/**'
12
+ - '**/README.md'
13
+ - all-globs-to-all-files:
14
+ - '!docs/licenses/**'
15
+
16
+ # Infrastructure changes
17
+ infrastructure:
18
+ - changed-files:
19
+ - any-glob-to-any-file:
20
+ - .github/**
21
+ - docker/**
22
+ - .dockerignore
23
+ - tools/**
24
+ - .vscode/**
25
+ - environment.yml
26
+ - setup.py
27
+ - pyproject.toml
28
+ - .pre-commit-config.yaml
29
+ - .flake8
30
+ - uwlab.sh
31
+ - uwlab.bat
32
+ - docs/licenses/**
33
+
34
+ # Assets (USD, glTF, etc.) related changes.
35
+ asset:
36
+ - changed-files:
37
+ - any-glob-to-any-file:
38
+ - source/uwlab_assets/**
39
+
40
+ # Core related changes.
41
+ core:
42
+ - all:
43
+ - changed-files:
44
+ - any-glob-to-any-file:
45
+ - source/**
46
+ - scripts/**
47
+ - scripts_v2/**
48
+ - all-globs-to-all-files:
49
+ - '!source/uwlab_assets/**'
50
+
51
+ # Add 'enhancement' label to any PR where the head branch name
52
+ # starts with `feature` or has a `feature` section in the name
53
+ enhancement:
54
+ - head-branch: ['^feature', 'feature']
55
+
56
+ # Add 'bug' label to any PR where the head branch name
57
+ # starts with `fix`/`bug` or has a `fix`/`bug` section in the name
58
+ bug:
59
+ - head-branch: ['^fix', 'fix', '^bug', 'bug']
.github/stale.yml ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ # All Rights Reserved.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+
6
+ # Configuration for probot-stale - https://github.com/probot/stale
7
+
8
+ # Number of days of inactivity before an Issue or Pull Request becomes stale
9
+ daysUntilStale: 60
10
+
11
+ # Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
12
+ # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
13
+ daysUntilClose: 14
14
+
15
+ # Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled)
16
+ onlyLabels:
17
+ - more-information-needed
18
+
19
+ # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
20
+ exemptLabels:
21
+ - pinned
22
+ - security
23
+ - "[Status] Maybe Later"
24
+
25
+ # Set to true to ignore issues in a project (defaults to false)
26
+ exemptProjects: true
27
+
28
+ # Set to true to ignore issues in a milestone (defaults to false)
29
+ exemptMilestones: true
30
+
31
+ # Set to true to ignore issues with an assignee (defaults to false)
32
+ exemptAssignees: true
33
+
34
+ # Label to use when marking as stale
35
+ staleLabel: stale
36
+
37
+ # Comment to post when marking as stale. Set to `false` to disable
38
+ markComment: >
39
+ This issue has been automatically marked as stale because it has not had
40
+ recent activity. It will be closed if no further activity occurs. Thank you
41
+ for your contributions.
42
+
43
+ # Comment to post when removing the stale label.
44
+ # unmarkComment: >
45
+ # Your comment here.
46
+
47
+ # Comment to post when closing a stale Issue or Pull Request.
48
+ # closeComment: >
49
+ # Your comment here.
50
+
51
+ # Limit the number of actions per hour, from 1-30. Default is 30
52
+ limitPerRun: 30
53
+
54
+ # Limit to only `issues` or `pulls`
55
+ only: issues
56
+
57
+ # Optionally, specify configuration settings that are specific to just 'issues' or 'pulls':
58
+ # pulls:
59
+ # daysUntilStale: 30
60
+ # markComment: >
61
+ # This pull request has been automatically marked as stale because it has not had
62
+ # recent activity. It will be closed if no further activity occurs. Thank you
63
+ # for your contributions.
64
+
65
+ # issues:
66
+ # exemptLabels:
67
+ # - confirmed
.github/workflows/build.yml ADDED
@@ -0,0 +1,242 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ # All Rights Reserved.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+
6
+ name: Build and Test
7
+
8
+ on:
9
+ pull_request:
10
+ branches:
11
+ - devel
12
+ - main
13
+ - 'release/**'
14
+
15
+ # Concurrency control to prevent parallel runs on the same PR
16
+ concurrency:
17
+ group: ${{ github.workflow }}-${{ github.ref }}
18
+ cancel-in-progress: true
19
+
20
+ permissions:
21
+ contents: read
22
+ pull-requests: write
23
+ checks: write
24
+ issues: read
25
+
26
+ env:
27
+ NGC_API_KEY: ${{ secrets.NGC_API_KEY }}
28
+ ISAACSIM_BASE_IMAGE: ${{ vars.ISAACSIM_BASE_IMAGE || 'nvcr.io/nvidia/isaac-sim' }}
29
+ ISAACSIM_BASE_VERSION: ${{ vars.ISAACSIM_BASE_VERSION || '5.1.0' }}
30
+ DOCKER_IMAGE_TAG: uw-lab-dev:${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || github.ref_name }}-${{ github.sha }}
31
+
32
+ jobs:
33
+ test-uwlab-tasks:
34
+ runs-on: [self-hosted, gpu, 24g]
35
+ timeout-minutes: 180
36
+ continue-on-error: true
37
+
38
+ steps:
39
+ - name: Checkout Code
40
+ uses: actions/checkout@v4
41
+ with:
42
+ fetch-depth: 0
43
+ lfs: true
44
+
45
+ - name: Remove previous uw-lab-dev images
46
+ run: |
47
+ IDS=$(docker image ls -q uw-lab-dev 2>/dev/null || true)
48
+ if [ -n "$IDS" ]; then
49
+ echo "Removing existing uw-lab-dev images: $IDS"
50
+ docker image rm -f $IDS || true
51
+ else
52
+ echo "No existing uw-lab-dev images to remove."
53
+ fi
54
+
55
+ - name: Build Docker Image
56
+ uses: ./.github/actions/docker-build
57
+ with:
58
+ image-tag: ${{ env.DOCKER_IMAGE_TAG }}
59
+ isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }}
60
+ isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }}
61
+
62
+ - name: Run UWLab Tasks Tests
63
+ uses: ./.github/actions/run-tests
64
+ with:
65
+ test-path: "tools"
66
+ result-file: "uwlab-tasks-report.xml"
67
+ container-name: "uw-lab-tasks-test-$$"
68
+ image-tag: ${{ env.DOCKER_IMAGE_TAG }}
69
+ pytest-options: ""
70
+ filter-pattern: "uwlab_tasks"
71
+
72
+ - name: Copy Test Results from UWLab Tasks Container
73
+ run: |
74
+ CONTAINER_NAME="uw-lab-tasks-test-$$"
75
+ if docker ps -a | grep -q $CONTAINER_NAME; then
76
+ echo "Copying test results from UWLab Tasks container..."
77
+ docker cp $CONTAINER_NAME:/workspace/uwlab/tests/uwlab-tasks-report.xml reports/ 2>/dev/null || echo "No test results to copy from UWLab Tasks container"
78
+ fi
79
+
80
+ - name: Upload UWLab Tasks Test Results
81
+ uses: actions/upload-artifact@v4
82
+ if: always()
83
+ with:
84
+ name: uwlab-tasks-test-results
85
+ path: reports/uwlab-tasks-report.xml
86
+ retention-days: 1
87
+ compression-level: 9
88
+
89
+ - name: Check Test Results for Fork PRs
90
+ if: github.event.pull_request.head.repo.full_name != github.repository
91
+ run: |
92
+ if [ -f "reports/uwlab-tasks-report.xml" ]; then
93
+ # Check if the test results contain any failures
94
+ if grep -q 'failures="[1-9]' reports/uwlab-tasks-report.xml || grep -q 'errors="[1-9]' reports/uwlab-tasks-report.xml; then
95
+ echo "Tests failed for PR from fork. The test report is in the logs. Failing the job."
96
+ exit 1
97
+ fi
98
+ else
99
+ echo "No test results file found. This might indicate test execution failed."
100
+ exit 1
101
+ fi
102
+
103
+ test-general:
104
+ runs-on: [self-hosted, gpu]
105
+ timeout-minutes: 180
106
+
107
+ steps:
108
+ - name: Checkout Code
109
+ uses: actions/checkout@v4
110
+ with:
111
+ fetch-depth: 0
112
+ lfs: true
113
+
114
+ - name: Remove previous uw-lab-dev images
115
+ run: |
116
+ IDS=$(docker image ls -q uw-lab-dev 2>/dev/null || true)
117
+ if [ -n "$IDS" ]; then
118
+ echo "Removing existing uw-lab-dev images: $IDS"
119
+ docker image rm -f $IDS || true
120
+ else
121
+ echo "No existing uw-lab-dev images to remove."
122
+ fi
123
+
124
+ - name: Build Docker Image
125
+ uses: ./.github/actions/docker-build
126
+ with:
127
+ image-tag: ${{ env.DOCKER_IMAGE_TAG }}
128
+ isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }}
129
+ isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }}
130
+
131
+ - name: Run General Tests
132
+ id: run-general-tests
133
+ uses: ./.github/actions/run-tests
134
+ with:
135
+ test-path: "tools"
136
+ result-file: "general-tests-report.xml"
137
+ container-name: "uw-lab-general-test-$$"
138
+ image-tag: ${{ env.DOCKER_IMAGE_TAG }}
139
+ pytest-options: ""
140
+ filter-pattern: "not uwlab_tasks"
141
+
142
+ - name: Copy Test Results from General Tests Container
143
+ run: |
144
+ CONTAINER_NAME="uw-lab-general-test-$$"
145
+ if docker ps -a | grep -q $CONTAINER_NAME; then
146
+ echo "Copying test results from General Tests container..."
147
+ docker cp $CONTAINER_NAME:/workspace/uwlab/tests/general-tests-report.xml reports/ 2>/dev/null || echo "No test results to copy from General Tests container"
148
+ fi
149
+
150
+ - name: Upload General Test Results
151
+ uses: actions/upload-artifact@v4
152
+ if: always()
153
+ with:
154
+ name: general-test-results
155
+ path: reports/general-tests-report.xml
156
+ retention-days: 1
157
+ compression-level: 9
158
+
159
+ - name: Check Test Results for Fork PRs
160
+ if: github.event.pull_request.head.repo.full_name != github.repository
161
+ run: |
162
+ if [ -f "reports/general-tests-report.xml" ]; then
163
+ # Check if the test results contain any failures
164
+ if grep -q 'failures="[1-9]' reports/general-tests-report.xml || grep -q 'errors="[1-9]' reports/general-tests-report.xml; then
165
+ echo "Tests failed for PR from fork. The test report is in the logs. Failing the job."
166
+ exit 1
167
+ fi
168
+ else
169
+ echo "No test results file found. This might indicate test execution failed."
170
+ exit 1
171
+ fi
172
+
173
+ combine-results:
174
+ needs: [test-uwlab-tasks, test-general]
175
+ runs-on: [self-hosted, gpu]
176
+ if: always()
177
+
178
+ steps:
179
+ - name: Checkout Code
180
+ uses: actions/checkout@v4
181
+ with:
182
+ fetch-depth: 0
183
+ lfs: false
184
+
185
+ - name: Create Reports Directory
186
+ run: |
187
+ mkdir -p reports
188
+
189
+ - name: Download Test Results
190
+ uses: actions/download-artifact@v4
191
+ with:
192
+ name: uwlab-tasks-test-results
193
+ path: reports/
194
+ continue-on-error: true
195
+
196
+ - name: Download General Test Results
197
+ uses: actions/download-artifact@v4
198
+ with:
199
+ name: general-test-results
200
+ path: reports/
201
+
202
+ - name: Combine All Test Results
203
+ uses: ./.github/actions/combine-results
204
+ with:
205
+ tests-dir: "reports"
206
+ output-file: "reports/combined-results.xml"
207
+
208
+ - name: Upload Combined Test Results
209
+ uses: actions/upload-artifact@v4
210
+ if: always()
211
+ with:
212
+ name: pr-${{ github.event.pull_request.number }}-combined-test-results
213
+ path: reports/combined-results.xml
214
+ retention-days: 7
215
+ compression-level: 9
216
+
217
+ - name: Comment on Test Results
218
+ id: test-reporter
219
+ if: github.event.pull_request.head.repo.full_name == github.repository
220
+ uses: EnricoMi/publish-unit-test-result-action@v2
221
+ with:
222
+ files: "reports/combined-results.xml"
223
+ check_name: "Tests Summary"
224
+ comment_mode: changes
225
+ comment_title: "Test Results Summary"
226
+ report_individual_runs: false
227
+ deduplicate_classes_by_file_name: true
228
+ compare_to_earlier_commit: true
229
+ fail_on: errors
230
+ action_fail_on_inconclusive: true
231
+
232
+ - name: Report Test Results
233
+ if: github.event.pull_request.head.repo.full_name == github.repository
234
+ uses: dorny/test-reporter@v1
235
+ with:
236
+ name: UWLab Build and Test Results
237
+ path: reports/combined-results.xml
238
+ reporter: java-junit
239
+ fail-on-error: true
240
+ only-summary: false
241
+ max-annotations: '50'
242
+ report-title: "UWLab Test Results - ${{ github.workflow }}"
.github/workflows/check-links.yml ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ # All Rights Reserved.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+
6
+ name: Check Documentation Links
7
+
8
+ on:
9
+ # Run on pull requests that modify documentation
10
+ pull_request:
11
+ paths:
12
+ - 'docs/**'
13
+ - '**.md'
14
+ - '.github/workflows/check-links.yml'
15
+ # Run on pushes to main branches
16
+ push:
17
+ branches:
18
+ - main
19
+ - devel
20
+ - 'release/**'
21
+ paths:
22
+ - 'docs/**'
23
+ - '**.md'
24
+ - '.github/workflows/check-links.yml'
25
+ # Allow manual trigger
26
+ workflow_dispatch:
27
+ # Run weekly to catch external links that break over time
28
+ schedule:
29
+ - cron: '0 0 * * 0' # Every Sunday at midnight UTC
30
+
31
+ concurrency:
32
+ group: ${{ github.workflow }}-${{ github.ref }}
33
+ cancel-in-progress: true
34
+
35
+ jobs:
36
+ check-links:
37
+ name: Check for Broken Links
38
+ runs-on: ubuntu-latest
39
+
40
+ steps:
41
+ - name: Checkout code
42
+ uses: actions/checkout@v4
43
+ with:
44
+ fetch-depth: 0
45
+
46
+ - name: Restore lychee cache
47
+ uses: actions/cache@v4
48
+ with:
49
+ path: .lycheecache
50
+ key: cache-lychee-${{ github.sha }}
51
+ restore-keys: cache-lychee-
52
+
53
+ - name: Run Link Checker
54
+ uses: lycheeverse/lychee-action@v2
55
+ with:
56
+ # Check all markdown files and documentation
57
+ args: >-
58
+ --verbose
59
+ --no-progress
60
+ --cache
61
+ --max-cache-age 1d
62
+ --exclude-path './docs/_build'
63
+ --exclude-path './apps/warp-*'
64
+ --exclude-path './logs'
65
+ --exclude-path './outputs'
66
+ --exclude-loopback
67
+ --exclude '^file://'
68
+ --exclude '^mailto:'
69
+ --exclude 'localhost'
70
+ --exclude '127\.0\.0\.1'
71
+ --exclude 'example\.com'
72
+ --exclude 'your-organization'
73
+ --exclude 'YOUR_'
74
+ --exclude 'yourdomain'
75
+ --exclude 'user@'
76
+ --exclude 'helm\.ngc\.nvidia\.com'
77
+ --exclude 'slurm\.schedmd\.com'
78
+ --max-retries 3
79
+ --retry-wait-time 5
80
+ --timeout 30
81
+ --accept 200,201,202,203,204,206,301,302,303,307,308,429
82
+ --scheme https
83
+ --scheme http
84
+ '*.md'
85
+ '**/*.md'
86
+ 'docs/**/*.rst'
87
+ 'docs/**/*.html'
88
+ # Output results to a file
89
+ output: ./lychee-output.md
90
+ # Fail action on broken links
91
+ fail: true
92
+ # Optional: Use GitHub token for authenticated requests (higher rate limit)
93
+ token: ${{ secrets.GITHUB_TOKEN }}
94
+
95
+ - name: Print results to logs
96
+ if: always()
97
+ run: |
98
+ echo "========================================"
99
+ echo "Link Checker Results:"
100
+ echo "========================================"
101
+ if [ -f ./lychee-output.md ]; then
102
+ cat ./lychee-output.md
103
+ echo ""
104
+ echo "========================================"
105
+
106
+ # Also add to GitHub step summary for easy viewing
107
+ echo "## Link Checker Results" >> $GITHUB_STEP_SUMMARY
108
+ echo "" >> $GITHUB_STEP_SUMMARY
109
+ cat ./lychee-output.md >> $GITHUB_STEP_SUMMARY
110
+ else
111
+ echo "No output file generated"
112
+ echo "========================================"
113
+ fi
114
+
115
+ - name: Fail job if broken links found
116
+ if: failure()
117
+ run: |
118
+ echo "❌ Broken links were found in the documentation!"
119
+ echo "Please review the link checker report above and fix all broken links."
120
+ exit 1
.github/workflows/docs.yaml ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ # All Rights Reserved.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+
6
+ name: Build & deploy docs
7
+
8
+ on:
9
+ push:
10
+ branches:
11
+ - main
12
+ - devel
13
+ - 'release/**'
14
+ pull_request:
15
+ types: [opened, synchronize, reopened]
16
+
17
+ concurrency:
18
+ group: ${{ github.workflow }}-${{ github.ref }}
19
+ cancel-in-progress: true
20
+
21
+ jobs:
22
+ check-secrets:
23
+ name: Check secrets
24
+ runs-on: ubuntu-latest
25
+ outputs:
26
+ trigger-deploy: ${{ steps.trigger-deploy.outputs.defined }}
27
+ steps:
28
+ - id: trigger-deploy
29
+ env:
30
+ REPO_NAME: ${{ secrets.REPO_NAME }}
31
+ if: "${{ github.repository == env.REPO_NAME && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/devel' || startsWith(github.ref, 'refs/heads/release/')) }}"
32
+ run: echo "defined=true" >> "$GITHUB_OUTPUT"
33
+
34
+ build-docs:
35
+ name: Build Docs
36
+ runs-on: ubuntu-latest
37
+ needs: [check-secrets]
38
+
39
+ steps:
40
+ - name: Checkout code
41
+ uses: actions/checkout@v2
42
+ with:
43
+ lfs: true
44
+
45
+ - name: Setup python
46
+ uses: actions/setup-python@v2
47
+ with:
48
+ python-version: "3.11"
49
+ architecture: x64
50
+
51
+ - name: Install dev requirements
52
+ working-directory: ./docs
53
+ run: pip install -r requirements.txt
54
+
55
+ - name: Check branch docs building
56
+ working-directory: ./docs
57
+ if: needs.check-secrets.outputs.trigger-deploy != 'true'
58
+ run: make current-docs
59
+
60
+ - name: Generate multi-version docs
61
+ working-directory: ./docs
62
+ run: |
63
+ git fetch --prune --unshallow --tags
64
+ make multi-docs
65
+
66
+ - name: Upload docs artifact
67
+ uses: actions/upload-artifact@v4
68
+ with:
69
+ name: docs-html
70
+ path: ./docs/_build
71
+
72
+ deploy-docs:
73
+ name: Deploy Docs
74
+ runs-on: ubuntu-latest
75
+ needs: [check-secrets, build-docs]
76
+ if: needs.check-secrets.outputs.trigger-deploy == 'true'
77
+
78
+ steps:
79
+ - name: Download docs artifact
80
+ uses: actions/download-artifact@v4
81
+ with:
82
+ name: docs-html
83
+ path: ./docs/_build
84
+
85
+ - name: Deploy to gh-pages
86
+ uses: peaceiris/actions-gh-pages@v3
87
+ with:
88
+ github_token: ${{ secrets.GITHUB_TOKEN }}
89
+ publish_dir: ./docs/_build
.github/workflows/labeler.yml ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ # All Rights Reserved.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+
6
+ name: "Pull Request Labeler"
7
+ on:
8
+ - pull_request_target
9
+
10
+ jobs:
11
+ labeler:
12
+ permissions:
13
+ contents: read
14
+ pull-requests: write
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/labeler@v6
.github/workflows/license-check.yaml ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ # All Rights Reserved.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+
6
+ name: Check Python Dependency Licenses
7
+
8
+ on:
9
+ pull_request:
10
+ types: [opened, synchronize, reopened]
11
+
12
+ concurrency:
13
+ group: ${{ github.workflow }}-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ license-check:
18
+ runs-on: [self-hosted]
19
+
20
+ steps:
21
+ - name: Checkout code
22
+ uses: actions/checkout@v3
23
+
24
+ # - name: Install jq
25
+ # run: sudo apt-get update && sudo apt-get install -y jq
26
+
27
+ - name: Clean up disk space
28
+ run: |
29
+ rm -rf /opt/hostedtoolcache
30
+
31
+ - name: Set up Python
32
+ uses: actions/setup-python@v4
33
+ with:
34
+ python-version: '3.11' # Adjust as needed
35
+
36
+ - name: Install dependencies using ./uwlab.sh -i
37
+ run: |
38
+ # first install isaac sim
39
+ pip install --upgrade pip
40
+ pip install 'isaacsim[all,extscache]==${{ vars.ISAACSIM_BASE_VERSION || '5.0.0' }}' --extra-index-url https://pypi.nvidia.com
41
+ chmod +x ./uwlab.sh # Make sure the script is executable
42
+ # install all lab dependencies
43
+ ./uwlab.sh -i
44
+
45
+ - name: Install pip-licenses
46
+ run: |
47
+ pip install pip-licenses
48
+ pip install -r tools/template/requirements.txt
49
+ pip install -r docs/requirements.txt
50
+
51
+ # Optional: Print the license report for visibility
52
+ - name: Print License Report
53
+ run: pip-licenses --from=mixed --format=markdown
54
+
55
+ # Print pipdeptree
56
+ - name: Print pipdeptree
57
+ run: |
58
+ pip install pipdeptree
59
+ pipdeptree
60
+
61
+ - name: Check licenses against whitelist and exceptions
62
+ run: |
63
+ # Generate licenses report and validate using concise Python
64
+ pip-licenses --from=mixed --format=json > licenses.json
65
+ python - <<'PY'
66
+ import json, sys
67
+
68
+ # Substring-based allowlist (case-insensitive)
69
+ ALLOWED = ("mit", "apache", "bsd", "isc", "zlib", "psfl", "bsl", "boost", "mpl")
70
+
71
+ def _norm(s: str) -> str:
72
+ return (s or "").strip().lower()
73
+
74
+ def _is_allowed(license_str: str) -> bool:
75
+ ln = _norm(license_str)
76
+ return any(tok in ln for tok in ALLOWED)
77
+
78
+ EXCEPTIONS_FILE = ".github/workflows/license-exceptions.json"
79
+
80
+ # Load report (defensive)
81
+ try:
82
+ with open("licenses.json", encoding="utf-8") as f:
83
+ packages = json.load(f)
84
+ except Exception as e:
85
+ print(f"ERROR: Failed to parse licenses.json: {e}")
86
+ sys.exit(1)
87
+
88
+ # Load exceptions (optional)
89
+ try:
90
+ with open(EXCEPTIONS_FILE, encoding="utf-8") as f:
91
+ exc_entries = json.load(f)
92
+ except FileNotFoundError:
93
+ exc_entries = []
94
+ exc_map = { (e.get("package") or ""): e.get("license") for e in exc_entries if e.get("package") }
95
+
96
+ failed = 0
97
+ for rec in packages:
98
+ name = (rec.get("Name") or "").strip()
99
+ lic = (rec.get("License") or "").strip()
100
+ if not name or name.startswith("uwlab"):
101
+ continue
102
+ if _is_allowed(lic):
103
+ continue
104
+ if name in exc_map:
105
+ exc_lic = exc_map[name]
106
+ exc_norm = _norm(exc_lic)
107
+ lic_norm = _norm(lic)
108
+ # NEW: if detected license is unknown/blank, accept when an exception exists
109
+ if lic_norm in ("", "unknown"):
110
+ continue
111
+ # Treat blank/unknown exception license as wildcard (accept any)
112
+ if exc_norm in ("", "null", "unknown", "unspecified", "n/a", "na", "none"):
113
+ continue
114
+ # Flexible match to avoid churn on formatting differences
115
+ if exc_norm in lic_norm or lic_norm in exc_norm:
116
+ continue
117
+ print(f"ERROR: {name} has license: {lic}")
118
+ failed += 1
119
+ continue
120
+ print(f"ERROR: {name} has license: {lic}")
121
+ failed += 1
122
+
123
+ if failed:
124
+ print(f"ERROR: {failed} packages were flagged.")
125
+ sys.exit(1)
126
+ print("All packages were checked.")
127
+ PY
.github/workflows/license-exceptions.json ADDED
@@ -0,0 +1,479 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "package": "uwlab",
4
+ "license": null,
5
+ "comment": "This Repo"
6
+ },
7
+ {
8
+ "package": "uwlab_assets",
9
+ "license": null,
10
+ "comment": "This Repo"
11
+ },
12
+ {
13
+ "package": "uwlab_apps",
14
+ "license": null,
15
+ "comment": "This Repo"
16
+ },
17
+ {
18
+ "package": "uwlab_rl",
19
+ "license": null,
20
+ "comment": "This Repo"
21
+ },
22
+ {
23
+ "package": "uwlab_tasks",
24
+ "license": null,
25
+ "comment": "This Repo"
26
+ },
27
+ {
28
+ "package": "pytorch3d",
29
+ "license": "UNKNOWN",
30
+ "comment": "BSD"
31
+ },
32
+ {
33
+ "package": "aiobotocore",
34
+ "license": "UNKNOWN",
35
+ "comment": "Apache-2.0"
36
+ },
37
+ {
38
+ "package": "isaaclab",
39
+ "license": null
40
+ },
41
+ {
42
+ "package": "isaaclab_assets",
43
+ "license": null
44
+ },
45
+ {
46
+ "package": "isaaclab_mimic",
47
+ "license": null
48
+ },
49
+ {
50
+ "package": "isaaclab_rl",
51
+ "license": null
52
+ },
53
+ {
54
+ "package": "isaaclab_tasks",
55
+ "license": null
56
+ },
57
+ {
58
+ "package": "isaacsim",
59
+ "license": null
60
+ },
61
+ {
62
+ "package": "isaacsim-app",
63
+ "license": null
64
+ },
65
+ {
66
+ "package": "isaacsim-asset",
67
+ "license": null
68
+ },
69
+ {
70
+ "package": "isaacsim-benchmark",
71
+ "license": null
72
+ },
73
+ {
74
+ "package": "isaacsim-code-editor",
75
+ "license": null
76
+ },
77
+ {
78
+ "package": "isaacsim-core",
79
+ "license": null
80
+ },
81
+ {
82
+ "package": "isaacsim-cortex",
83
+ "license": null
84
+ },
85
+ {
86
+ "package": "isaacsim-example",
87
+ "license": null
88
+ },
89
+ {
90
+ "package": "isaacsim-extscache-kit",
91
+ "license": null
92
+ },
93
+ {
94
+ "package": "isaacsim-extscache-kit-sdk",
95
+ "license": null
96
+ },
97
+ {
98
+ "package": "isaacsim-extscache-physics",
99
+ "license": null
100
+ },
101
+ {
102
+ "package": "isaacsim-gui",
103
+ "license": null
104
+ },
105
+ {
106
+ "package": "isaacsim-kernel",
107
+ "license": null
108
+ },
109
+ {
110
+ "package": "isaacsim-replicator",
111
+ "license": null
112
+ },
113
+ {
114
+ "package": "isaacsim-rl",
115
+ "license": null
116
+ },
117
+ {
118
+ "package": "isaacsim-robot",
119
+ "license": null
120
+ },
121
+ {
122
+ "package": "isaacsim-robot-motion",
123
+ "license": null
124
+ },
125
+ {
126
+ "package": "isaacsim-robot-setup",
127
+ "license": null
128
+ },
129
+ {
130
+ "package": "isaacsim-ros1",
131
+ "license": null
132
+ },
133
+ {
134
+ "package": "isaacsim-ros2",
135
+ "license": null
136
+ },
137
+ {
138
+ "package": "isaacsim-sensor",
139
+ "license": null
140
+ },
141
+ {
142
+ "package": "isaacsim-storage",
143
+ "license": null
144
+ },
145
+ {
146
+ "package": "isaacsim-template",
147
+ "license": null
148
+ },
149
+ {
150
+ "package": "isaacsim-test",
151
+ "license": null
152
+ },
153
+ {
154
+ "package": "isaacsim-utils",
155
+ "license": null
156
+ },
157
+ {
158
+ "package": "nvidia-cublas-cu12",
159
+ "license": null
160
+ },
161
+ {
162
+ "package": "nvidia-cuda-cupti-cu12",
163
+ "license": null
164
+ },
165
+ {
166
+ "package": "nvidia-cuda-nvrtc-cu12",
167
+ "license": null
168
+ },
169
+ {
170
+ "package": "nvidia-cuda-runtime-cu12",
171
+ "license": null
172
+ },
173
+ {
174
+ "package": "nvidia-cudnn-cu12",
175
+ "license": null
176
+ },
177
+ {
178
+ "package": "nvidia-cufft-cu12",
179
+ "license": null
180
+ },
181
+ {
182
+ "package": "nvidia-cufile-cu12",
183
+ "license": null
184
+ },
185
+ {
186
+ "package": "nvidia-curand-cu12",
187
+ "license": null
188
+ },
189
+ {
190
+ "package": "nvidia-cusolver-cu12",
191
+ "license": null
192
+ },
193
+ {
194
+ "package": "nvidia-cusparse-cu12",
195
+ "license": null
196
+ },
197
+ {
198
+ "package": "nvidia-cusparselt-cu12",
199
+ "license": null
200
+ },
201
+ {
202
+ "package": "nvidia-nccl-cu12",
203
+ "license": null
204
+ },
205
+ {
206
+ "package": "nvidia-nvjitlink-cu12",
207
+ "license": null
208
+ },
209
+ {
210
+ "package": "nvidia-nvtx-cu12",
211
+ "license": null
212
+ },
213
+ {
214
+ "package": "omniverse-kit",
215
+ "license": null
216
+ },
217
+ {
218
+ "package": "warp-lang",
219
+ "license": null
220
+ },
221
+ {
222
+ "package": "cmeel",
223
+ "license": "UNKNOWN",
224
+ "comment": "BSD"
225
+ },
226
+ {
227
+ "package": "cmeel-assimp",
228
+ "license": "UNKNOWN",
229
+ "comment": "BSD"
230
+ },
231
+ {
232
+ "package": "cmeel-boost",
233
+ "license": "BSL-1.0",
234
+ "comment": "BSL"
235
+ },
236
+ {
237
+ "package": "cmeel-console-bridge",
238
+ "license": "Zlib",
239
+ "comment": "ZLIBL"
240
+ },
241
+ {
242
+ "package": "cmeel-octomap",
243
+ "license": "UNKNOWN",
244
+ "comment": "BSD"
245
+ },
246
+ {
247
+ "package": "cmeel-qhull",
248
+ "license": "UNKNOWN",
249
+ "comment": "custom / OSRB"
250
+ },
251
+ {
252
+ "package": "cmeel-tinyxml",
253
+ "license": "Zlib",
254
+ "comment": "ZLIBL"
255
+ },
256
+ {
257
+ "package": "cmeel-urdfdom",
258
+ "license": "UNKNOWN",
259
+ "comment": "BSD"
260
+ },
261
+ {
262
+ "package": "cmeel-zlib",
263
+ "license": "Zlib",
264
+ "comment": "ZLIBL"
265
+ },
266
+ {
267
+ "package": "matplotlib",
268
+ "license": "Python Software Foundation License"
269
+ },
270
+ {
271
+ "package": "certifi",
272
+ "license": "Mozilla Public License 2.0 (MPL 2.0)"
273
+ },
274
+ {
275
+ "package": "rl_games",
276
+ "license": "UNKNOWN",
277
+ "comment": "MIT"
278
+ },
279
+ {
280
+ "package": "robomimic",
281
+ "license": "UNKNOWN",
282
+ "comment": "MIT"
283
+ },
284
+ {
285
+ "package": "hpp-fcl",
286
+ "license": "UNKNOWN",
287
+ "comment": "BSD"
288
+ },
289
+ {
290
+ "package": "pin",
291
+ "license": "UNKNOWN",
292
+ "comment": "BSD"
293
+ },
294
+ {
295
+ "package": "eigenpy",
296
+ "license": "UNKNOWN",
297
+ "comment": "BSD"
298
+ },
299
+ {
300
+ "package": "qpsolvers",
301
+ "license": "GNU Lesser General Public License v3 (LGPLv3)",
302
+ "comment": "OSRB"
303
+ },
304
+ {
305
+ "package": "quadprog",
306
+ "license": "GNU General Public License v2 or later (GPLv2+)",
307
+ "comment": "OSRB"
308
+ },
309
+ {
310
+ "package": "Markdown",
311
+ "license": "UNKNOWN",
312
+ "comment": "BSD"
313
+ },
314
+ {
315
+ "package": "anytree",
316
+ "license": "UNKNOWN",
317
+ "comment": "Apache"
318
+ },
319
+ {
320
+ "package": "click",
321
+ "license": "UNKNOWN",
322
+ "comment": "BSD"
323
+ },
324
+ {
325
+ "package": "egl_probe",
326
+ "license": "UNKNOWN",
327
+ "comment": "MIT"
328
+ },
329
+ {
330
+ "package": "filelock",
331
+ "license": "Unlicense",
332
+ "comment": "no condition"
333
+ },
334
+ {
335
+ "package": "proglog",
336
+ "license": "UNKNOWN",
337
+ "comment": "MIT"
338
+ },
339
+ {
340
+ "package": "termcolor",
341
+ "license": "UNKNOWN",
342
+ "comment": "MIT"
343
+ },
344
+ {
345
+ "package": "typing_extensions",
346
+ "license": "Python Software Foundation License",
347
+ "comment": "PSFL / OSRB"
348
+ },
349
+ {
350
+ "package": "urllib3",
351
+ "license": "UNKNOWN",
352
+ "comment": "MIT"
353
+ },
354
+ {
355
+ "package": "h5py",
356
+ "license": "UNKNOWN",
357
+ "comment": "BSD"
358
+ },
359
+ {
360
+ "package": "pillow",
361
+ "license": "UNKNOWN",
362
+ "comment": "MIT"
363
+ },
364
+ {
365
+ "package": "pygame",
366
+ "license": "GNU Library or Lesser General Public License (LGPL)",
367
+ "comment": "OSRB"
368
+ },
369
+ {
370
+ "package": "scikit-learn",
371
+ "license": "UNKNOWN",
372
+ "comment": "BSD"
373
+ },
374
+ {
375
+ "package": "tensorboardX",
376
+ "license": "UNKNOWN",
377
+ "comment": "MIT"
378
+ },
379
+ {
380
+ "package": "attrs",
381
+ "license": "UNKNOWN",
382
+ "comment": "MIT"
383
+ },
384
+ {
385
+ "package": "jsonschema",
386
+ "license": "UNKNOWN",
387
+ "comment": "MIT"
388
+ },
389
+ {
390
+ "package": "jsonschema-specifications",
391
+ "license": "UNKNOWN",
392
+ "comment": "MIT"
393
+ },
394
+ {
395
+ "package": "referencing",
396
+ "license": "UNKNOWN",
397
+ "comment": "MIT"
398
+ },
399
+ {
400
+ "package": "regex",
401
+ "license": "UNKNOWN",
402
+ "comment": "Apache 2.0"
403
+ },
404
+ {
405
+ "package": "anyio",
406
+ "license": "UNKNOWN",
407
+ "comment": "MIT"
408
+ },
409
+ {
410
+ "package" : "hf-xet",
411
+ "license" : "UNKNOWN",
412
+ "comment": "Apache 2.0"
413
+ },
414
+ {
415
+ "package": "rpds-py",
416
+ "license" : "UNKNOWN",
417
+ "comment": "MIT"
418
+ },
419
+ {
420
+ "package": "typing-inspection",
421
+ "license" : "UNKNOWN",
422
+ "comment": "MIT"
423
+ },
424
+ {
425
+ "package": "ml_dtypes",
426
+ "license" : "UNKNOWN",
427
+ "comment": "Apache 2.0"
428
+ },
429
+ {
430
+ "package": "zipp",
431
+ "license" : "UNKNOWN",
432
+ "comment": "MIT"
433
+ },
434
+ {
435
+ "package": "fsspec",
436
+ "license" : "UNKNOWN",
437
+ "comment": "BSD"
438
+ },
439
+ {
440
+ "package": "numpy-quaternion",
441
+ "license": "UNKNOWN",
442
+ "comment": "MIT"
443
+ },
444
+ {
445
+ "package": "aiohappyeyeballs",
446
+ "license": "Other/Proprietary License; Python Software Foundation License",
447
+ "comment": "PSFL / OSRB"
448
+ },
449
+ {
450
+ "package": "cffi",
451
+ "license": "UNKNOWN",
452
+ "comment": "MIT"
453
+ },
454
+ {
455
+ "package": "trio",
456
+ "license": "UNKNOWN",
457
+ "comment": "MIT"
458
+ },
459
+ {
460
+ "package": "pipdeptree",
461
+ "license": "UNKNOWN",
462
+ "comment": "MIT"
463
+ },
464
+ {
465
+ "package": "msgpack",
466
+ "license": "UNKNOWN",
467
+ "comment": "Apache 2.0"
468
+ },
469
+ {
470
+ "package": "onnx-ir",
471
+ "license": "UNKNOWN",
472
+ "comment": "Apache 2.0"
473
+ },
474
+ {
475
+ "package": "matplotlib-inline",
476
+ "license": "UNKNOWN",
477
+ "comment": "BSD-3"
478
+ }
479
+ ]
.github/workflows/pre-commit.yaml ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ # All Rights Reserved.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+
6
+ name: Run linters using pre-commit
7
+
8
+ on:
9
+ pull_request:
10
+ types: [opened, synchronize, reopened]
11
+
12
+ jobs:
13
+ pre-commit:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v3
17
+ - uses: actions/setup-python@v3
18
+ with:
19
+ python-version: "3.12"
20
+ - uses: pre-commit/action@v3.0.0
.gitignore ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # C++
2
+ **/cmake-build*/
3
+ **/build*/
4
+ **/*.so
5
+ **/*.log*
6
+
7
+ # Omniverse
8
+ **/*.dmp
9
+ **/.thumbs
10
+
11
+ # No USD files allowed in the repo
12
+ **/*.usd
13
+ **/*.usda
14
+ **/*.usdc
15
+ **/*.usdz
16
+
17
+ # Python
18
+ .DS_Store
19
+ **/*.egg-info/
20
+ **/__pycache__/
21
+ **/.pytest_cache/
22
+ **/*.pyc
23
+ **/*.pb
24
+
25
+ # Docker/Singularity
26
+ **/*.sif
27
+ docker/cluster/exports/
28
+ docker/.container.cfg
29
+
30
+ # IDE
31
+ **/.idea/
32
+ **/.vscode/
33
+ # Don't ignore the top-level .vscode directory as it is
34
+ # used to configure VS Code settings
35
+ !.vscode
36
+
37
+ # Outputs
38
+ **/output/*
39
+ **/outputs/*
40
+ **/videos/*
41
+ **/wandb/*
42
+ **/.neptune/*
43
+ docker/artifacts/
44
+ *.tmp
45
+
46
+ # Doc Outputs
47
+ **/docs/_build/*
48
+ **/generated/*
49
+
50
+ # Isaac-Sim packman
51
+ /_isaaclab/
52
+ /_uwlab/
53
+ _isaac_sim*
54
+ _repo
55
+ _build
56
+ .lastformat
57
+
58
+ # RL-Games
59
+ **/runs/*
60
+ **/logs/*
61
+ **/recordings/*
62
+
63
+ # Pre-Trained Checkpoints
64
+ /.pretrained_checkpoints/
65
+
66
+ # Teleop Recorded Dataset
67
+ /datasets/
68
+
69
+ # Tests
70
+ tests/
71
+
72
+ # Docker history
73
+ .uw-lab-docker-history
.pre-commit-config.yaml ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ # All Rights Reserved.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+
6
+ exclude: ^scripts/
7
+ repos:
8
+ - repo: https://github.com/python/black
9
+ rev: 24.3.0
10
+ hooks:
11
+ - id: black
12
+ args: ["--line-length", "120", "--unstable"]
13
+ - repo: https://github.com/pycqa/flake8
14
+ rev: 7.0.0
15
+ hooks:
16
+ - id: flake8
17
+ additional_dependencies: [flake8-simplify, flake8-return]
18
+ - repo: https://github.com/pre-commit/pre-commit-hooks
19
+ rev: v5.0.0
20
+ hooks:
21
+ - id: trailing-whitespace
22
+ - id: check-symlinks
23
+ - id: destroyed-symlinks
24
+ - id: check-added-large-files
25
+ args: ["--maxkb=2000"] # restrict files more than 2 MB. Should use git-lfs instead.
26
+ - id: check-yaml
27
+ - id: check-merge-conflict
28
+ - id: check-case-conflict
29
+ - id: check-executables-have-shebangs
30
+ - id: check-toml
31
+ - id: end-of-file-fixer
32
+ - id: check-shebang-scripts-are-executable
33
+ - id: detect-private-key
34
+ - id: debug-statements
35
+ - repo: https://github.com/pycqa/isort
36
+ rev: 5.13.2
37
+ hooks:
38
+ - id: isort
39
+ name: isort (python)
40
+ args: ["--profile", "black", "--filter-files"]
41
+ - repo: https://github.com/asottile/pyupgrade
42
+ rev: v3.15.1
43
+ hooks:
44
+ - id: pyupgrade
45
+ args: ["--py310-plus"]
46
+ # FIXME: This is a hack because Pytorch does not like: torch.Tensor | dict aliasing
47
+ exclude: "source/uwlab/uwlab/envs/common.py|source/uwlab/uwlab/ui/widgets/image_plot.py|source/uwlab_tasks/uwlab_tasks/direct/humanoid_amp/motions/motion_loader.py"
48
+ - repo: https://github.com/codespell-project/codespell
49
+ rev: v2.2.6
50
+ hooks:
51
+ - id: codespell
52
+ additional_dependencies:
53
+ - tomli
54
+ exclude: "CONTRIBUTORS.md|docs/source/setup/walkthrough/concepts_env_design.rst"
55
+ # FIXME: Figure out why this is getting stuck under VPN.
56
+ # - repo: https://github.com/RobertCraigie/pyright-python
57
+ # rev: v1.1.315
58
+ # hooks:
59
+ # - id: pyright
60
+ - repo: https://github.com/Lucas-C/pre-commit-hooks
61
+ rev: v1.5.1
62
+ hooks:
63
+ - id: insert-license
64
+ files: \.(py|ya?ml)$
65
+ args:
66
+ # - --remove-header # Remove existing license headers. Useful when updating license.
67
+ - --license-filepath
68
+ - .github/LICENSE_HEADER.txt
69
+ - --use-current-year
70
+ exclude: "source/uwlab_mimic/|scripts/imitation_learning/uwlab_mimic/"
71
+ # Apache 2.0 license for mimic files
72
+ - repo: https://github.com/Lucas-C/pre-commit-hooks
73
+ rev: v1.5.1
74
+ hooks:
75
+ - id: insert-license
76
+ files: ^(source/uwlab_mimic|scripts/imitation_learning/uwlab_mimic)/.*\.py$
77
+ args:
78
+ # - --remove-header # Remove existing license headers. Useful when updating license.
79
+ - --license-filepath
80
+ - .github/LICENSE_HEADER_MIMIC.txt
81
+ - --use-current-year
82
+ - repo: https://github.com/pre-commit/pygrep-hooks
83
+ rev: v1.10.0
84
+ hooks:
85
+ - id: rst-backticks
86
+ - id: rst-directive-colons
87
+ - id: rst-inline-touching-normal
.vscode/.gitignore ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Ignore all other files
2
+ .python.env
3
+ *.json
4
+
5
+ # Note: These files are kept for development purposes only.
6
+ !tools/settings.template.json
7
+ !tools/launch.template.json
8
+ !tools/setup_vscode.py
9
+ !extensions.json
10
+ !launch.json
11
+ !tasks.json
.vscode/extensions.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ // See http://go.microsoft.com/fwlink/?LinkId=827846
3
+ // for the documentation about the extensions.json format
4
+ "recommendations": [
5
+ "ms-vscode.cpptools",
6
+ "ms-python.python",
7
+ "ms-python.vscode-pylance",
8
+ "ban.spellright",
9
+ "streetsidesoftware.code-spell-checker",
10
+ "ms-iot.vscode-ros",
11
+ "ExecutableBookProject.myst-highlight",
12
+ "ms-python.black-formatter",
13
+ "ms-python.flake8",
14
+ "njpwerner.autodocstring"
15
+ ]
16
+ }
.vscode/launch.json ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // This file is a template and is automatically generated by the setup_vscode.py script.
2
+ // Do not edit this file directly.
3
+ //
4
+ // Generated from: /home/yu/UWLab/.vscode/tools/launch.template.json
5
+ {
6
+ // Use IntelliSense to learn about possible attributes.
7
+ // Hover to view descriptions of existing attributes.
8
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
9
+ "version": "0.2.0",
10
+ "configurations": [
11
+ {
12
+ "name": "Python: Current File",
13
+ "type": "python",
14
+ "request": "launch",
15
+ "program": "${file}",
16
+ "console": "integratedTerminal"
17
+ },
18
+ {
19
+ "name": "Python: Attach (windows-x86_64/linux-x86_64)",
20
+ "type": "python",
21
+ "request": "attach",
22
+ "port": 3000,
23
+ "host": "localhost"
24
+ },
25
+ {
26
+ "name": "Python: Train Environment",
27
+ "type": "python",
28
+ "request": "launch",
29
+ "args" : ["--task", "Isaac-Reach-Franka-v0", "--headless"],
30
+ "program": "${workspaceFolder}/scripts/reinforcement_learning/rsl_rl/train.py",
31
+ "console": "integratedTerminal"
32
+ },
33
+ {
34
+ "name": "Python: Play Environment",
35
+ "type": "python",
36
+ "request": "launch",
37
+ "args" : ["--task", "Isaac-Reach-Franka-v0", "--num_envs", "32"],
38
+ "program": "${workspaceFolder}/scripts/reinforcement_learning/rsl_rl/play.py",
39
+ "console": "integratedTerminal"
40
+ },
41
+ {
42
+ "name": "Python: SinglePytest",
43
+ "type": "python",
44
+ "request": "launch",
45
+ "module": "pytest",
46
+ "args": [
47
+ "${file}"
48
+ ],
49
+ "console": "integratedTerminal"
50
+ },
51
+ {
52
+ "name": "Python: ALL Pytest",
53
+ "type": "python",
54
+ "request": "launch",
55
+ "module": "pytest",
56
+ "args": ["source/isaaclab/test"],
57
+ "console": "integratedTerminal",
58
+ "justMyCode": false
59
+ }
60
+ ]
61
+ }
.vscode/settings.json ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // This file is a template and is automatically generated by the setup_vscode.py script.
2
+ // Do not edit this file directly.
3
+ //
4
+ // Generated from: /home/yu/UWLab/.vscode/tools/settings.template.json
5
+ {
6
+ "files.exclude": {
7
+ "**/.mypy_cache": true,
8
+ "**/__pycache__": true,
9
+ "**/*.egg-info": true
10
+ },
11
+ "files.associations": {
12
+ "*.tpp": "cpp",
13
+ "*.kit": "toml",
14
+ "*.rst": "restructuredtext"
15
+ },
16
+ "editor.rulers": [120],
17
+
18
+ // files to be ignored by the linter
19
+ "files.watcherExclude": {
20
+ "**/.git/objects/**": true,
21
+ "**/.git/subtree-cache/**": true,
22
+ "**/node_modules/**": true,
23
+ "**/_isaac_sim/**": true,
24
+ "**/_compiler/**": true
25
+ },
26
+ // Configuration for spelling checker
27
+ "spellright.language": [
28
+ "en-US-10-1."
29
+ ],
30
+ "spellright.documentTypes": [
31
+ "markdown",
32
+ "latex",
33
+ "plaintext",
34
+ "cpp",
35
+ "asciidoc",
36
+ "python",
37
+ "restructuredtext"
38
+ ],
39
+ "cSpell.words": [
40
+ "literalinclude",
41
+ "linenos",
42
+ "instanceable",
43
+ "isaacSim",
44
+ "jacobians",
45
+ "pointcloud",
46
+ "ridgeback",
47
+ "rllib",
48
+ "robomimic",
49
+ "teleoperation",
50
+ "xform",
51
+ "numpy",
52
+ "flatcache",
53
+ "physx",
54
+ "dpad",
55
+ "gamepad",
56
+ "linspace",
57
+ "upsampled",
58
+ "downsampled",
59
+ "arange",
60
+ "discretization",
61
+ "trimesh",
62
+ "uninstanceable",
63
+ "***SUPPLIMENTARY_KEYWORDS***",
64
+ "configclass",
65
+ "isaaclab",
66
+ "***UWLAB_KEYWORDS***",
67
+ "teleop",
68
+ "octi",
69
+ "uwlab",
70
+ "realsense",
71
+ "rokoko",
72
+ "ikabsolute",
73
+ "ikabs",
74
+ "ikdelta",
75
+ "ikdel",
76
+ "***ROBOTS_KEYWORDS***",
77
+ "franka",
78
+ "tycho",
79
+ "hebi",
80
+ "xarm"
81
+ ],
82
+ // This enables python language server. Seems to work slightly better than jedi:
83
+ "python.languageServer": "None",
84
+ // We use "black" as a formatter:
85
+ "python.formatting.provider": "black",
86
+ "python.formatting.blackArgs": ["--line-length", "120"],
87
+ // Use flake8 for linting
88
+ "python.linting.pylintEnabled": false,
89
+ "python.linting.flake8Enabled": true,
90
+ "python.linting.flake8Args": [
91
+ "--max-line-length=120"
92
+ ],
93
+ // Use docstring generator
94
+ "autoDocstring.docstringFormat": "google",
95
+ "autoDocstring.guessTypes": true,
96
+ // Python environment path
97
+ // note: the default interpreter is overridden when user selects a workspace interpreter
98
+ // in the status bar. For example, the virtual environment python interpreter
99
+ "python.defaultInterpreterPath": "/home/yu/miniforge3/envs/env_uwlab/bin/python",
100
+ // ROS distribution
101
+ "ros.distro": "noetic",
102
+ // Language specific settings
103
+ "[python]": {
104
+ "editor.tabSize": 4
105
+ },
106
+ "[restructuredtext]": {
107
+ "editor.tabSize": 2
108
+ },
109
+ // Python extra paths
110
+ // Note: this is filled up when "./isaaclab.sh -i" is run
111
+ "python.analysis.extraPaths": [
112
+ "${workspaceFolder}/source/uwlab_assets",
113
+ "${workspaceFolder}/source/uwlab_tasks",
114
+ "${workspaceFolder}/source/uwlab",
115
+ "${workspaceFolder}/source/uwlab_rl",
116
+ "${workspaceFolder}/_isaaclab/IsaacLab/source/isaaclab",
117
+ "${workspaceFolder}/_isaaclab/IsaacLab/source/isaaclab_assets",
118
+ "${workspaceFolder}/_isaaclab/IsaacLab/source/isaaclab_contrib",
119
+ "${workspaceFolder}/_isaaclab/IsaacLab/source/isaaclab_mimic",
120
+ "${workspaceFolder}/_isaaclab/IsaacLab/source/isaaclab_rl",
121
+ "${workspaceFolder}/_isaaclab/IsaacLab/source/isaaclab_tasks"
122
+ ],
123
+ "python-envs.defaultEnvManager": "ms-python.python:conda",
124
+ "python-envs.defaultPackageManager": "ms-python.python:conda",
125
+ "python-envs.pythonProjects": []
126
+ }
.vscode/tasks.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "version": "2.0.0",
3
+ "tasks": [
4
+ {
5
+ "label": "setup_python_env",
6
+ "type": "shell",
7
+ "linux": {
8
+ "command": "${workspaceFolder}/../IsaacLab/isaaclab.sh -p ${workspaceFolder}/.vscode/tools/setup_vscode.py"
9
+ },
10
+ "windows": {
11
+ "command": "${workspaceFolder}/../IsaacLab/isaaclab.bat -p ${workspaceFolder}/.vscode/tools/setup_vscode.py"
12
+ }
13
+ },
14
+ {
15
+ // run formatter
16
+ "label": "run_formatter",
17
+ "type": "shell",
18
+ "linux": {
19
+ "command": "${workspaceFolder}/../IsaacLab/isaaclab.sh --format"
20
+ },
21
+ "windows": {
22
+ "command": "${workspaceFolder}/../IsaacLab/isaaclab.bat --format"
23
+ }
24
+ }
25
+ ],
26
+ }
.vscode/tools/launch.template.json ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ // Use IntelliSense to learn about possible attributes.
3
+ // Hover to view descriptions of existing attributes.
4
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5
+ "version": "0.2.0",
6
+ "configurations": [
7
+ {
8
+ "name": "Python: Current File",
9
+ "type": "python",
10
+ "request": "launch",
11
+ "program": "${file}",
12
+ "console": "integratedTerminal"
13
+ },
14
+ {
15
+ "name": "Python: Attach (windows-x86_64/linux-x86_64)",
16
+ "type": "python",
17
+ "request": "attach",
18
+ "port": 3000,
19
+ "host": "localhost"
20
+ },
21
+ {
22
+ "name": "Python: Train Environment",
23
+ "type": "python",
24
+ "request": "launch",
25
+ "args" : ["--task", "Isaac-Reach-Franka-v0", "--headless"],
26
+ "program": "${workspaceFolder}/scripts/reinforcement_learning/rsl_rl/train.py",
27
+ "console": "integratedTerminal"
28
+ },
29
+ {
30
+ "name": "Python: Play Environment",
31
+ "type": "python",
32
+ "request": "launch",
33
+ "args" : ["--task", "Isaac-Reach-Franka-v0", "--num_envs", "32"],
34
+ "program": "${workspaceFolder}/scripts/reinforcement_learning/rsl_rl/play.py",
35
+ "console": "integratedTerminal"
36
+ },
37
+ {
38
+ "name": "Python: SinglePytest",
39
+ "type": "python",
40
+ "request": "launch",
41
+ "module": "pytest",
42
+ "args": [
43
+ "${file}"
44
+ ],
45
+ "console": "integratedTerminal"
46
+ },
47
+ {
48
+ "name": "Python: ALL Pytest",
49
+ "type": "python",
50
+ "request": "launch",
51
+ "module": "pytest",
52
+ "args": ["source/isaaclab/test"],
53
+ "console": "integratedTerminal",
54
+ "justMyCode": false
55
+ }
56
+ ]
57
+ }
.vscode/tools/settings.template.json ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "files.exclude": {
3
+ "**/.mypy_cache": true,
4
+ "**/__pycache__": true,
5
+ "**/*.egg-info": true
6
+ },
7
+ "files.associations": {
8
+ "*.tpp": "cpp",
9
+ "*.kit": "toml",
10
+ "*.rst": "restructuredtext"
11
+ },
12
+ "editor.rulers": [120],
13
+
14
+ // files to be ignored by the linter
15
+ "files.watcherExclude": {
16
+ "**/.git/objects/**": true,
17
+ "**/.git/subtree-cache/**": true,
18
+ "**/node_modules/**": true,
19
+ "**/_isaac_sim/**": true,
20
+ "**/_compiler/**": true
21
+ },
22
+ // Configuration for spelling checker
23
+ "spellright.language": [
24
+ "en-US-10-1."
25
+ ],
26
+ "spellright.documentTypes": [
27
+ "markdown",
28
+ "latex",
29
+ "plaintext",
30
+ "cpp",
31
+ "asciidoc",
32
+ "python",
33
+ "restructuredtext"
34
+ ],
35
+ "cSpell.words": [
36
+ "literalinclude",
37
+ "linenos",
38
+ "instanceable",
39
+ "isaacSim",
40
+ "jacobians",
41
+ "pointcloud",
42
+ "ridgeback",
43
+ "rllib",
44
+ "robomimic",
45
+ "teleoperation",
46
+ "xform",
47
+ "numpy",
48
+ "flatcache",
49
+ "physx",
50
+ "dpad",
51
+ "gamepad",
52
+ "linspace",
53
+ "upsampled",
54
+ "downsampled",
55
+ "arange",
56
+ "discretization",
57
+ "trimesh",
58
+ "uninstanceable",
59
+ "***SUPPLIMENTARY_KEYWORDS***",
60
+ "configclass",
61
+ "isaaclab",
62
+ "***UWLAB_KEYWORDS***",
63
+ "teleop",
64
+ "octi",
65
+ "uwlab",
66
+ "realsense",
67
+ "rokoko",
68
+ "ikabsolute",
69
+ "ikabs",
70
+ "ikdelta",
71
+ "ikdel",
72
+ "***ROBOTS_KEYWORDS***",
73
+ "franka",
74
+ "tycho",
75
+ "hebi",
76
+ "xarm"
77
+ ],
78
+ // This enables python language server. Seems to work slightly better than jedi:
79
+ "python.languageServer": "Pylance",
80
+ // We use "black" as a formatter:
81
+ "python.formatting.provider": "black",
82
+ "python.formatting.blackArgs": ["--line-length", "120"],
83
+ // Use flake8 for linting
84
+ "python.linting.pylintEnabled": false,
85
+ "python.linting.flake8Enabled": true,
86
+ "python.linting.flake8Args": [
87
+ "--max-line-length=120"
88
+ ],
89
+ // Use docstring generator
90
+ "autoDocstring.docstringFormat": "google",
91
+ "autoDocstring.guessTypes": true,
92
+ // Python environment path
93
+ // note: the default interpreter is overridden when user selects a workspace interpreter
94
+ // in the status bar. For example, the virtual environment python interpreter
95
+ "python.defaultInterpreterPath": "${workspaceFolder}/_isaac_sim/python.sh",
96
+ // ROS distribution
97
+ "ros.distro": "noetic",
98
+ // Language specific settings
99
+ "[python]": {
100
+ "editor.tabSize": 4
101
+ },
102
+ "[restructuredtext]": {
103
+ "editor.tabSize": 2
104
+ },
105
+ // Python extra paths
106
+ // Note: this is filled up when "./isaaclab.sh -i" is run
107
+ "python.analysis.extraPaths": []
108
+ }
.vscode/tools/setup_vscode.py ADDED
@@ -0,0 +1,234 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md).
2
+ # All Rights Reserved.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+
6
+ """This script sets up the vs-code settings for the Isaac Lab project.
7
+
8
+ This script merges the python.analysis.extraPaths from the "{ISAACSIM_DIR}/.vscode/settings.json" file into
9
+ the ".vscode/settings.json" file.
10
+
11
+ This is necessary because Isaac Sim 2022.2.1 onwards does not add the necessary python packages to the python path
12
+ when the "setup_python_env.sh" is run as part of the vs-code launch configuration.
13
+ """
14
+
15
+ import re
16
+ import sys
17
+ import os
18
+ import pathlib
19
+
20
+
21
+ UWLAB_DIR = pathlib.Path(__file__).parents[2]
22
+ """Path to the Isaac Lab directory."""
23
+
24
+ try:
25
+ import isaacsim # noqa: F401
26
+
27
+ isaacsim_dir = os.environ.get("ISAAC_PATH", "")
28
+ except ModuleNotFoundError or ImportError:
29
+ isaacsim_dir = os.path.join(UWLAB_DIR, "_isaac_sim")
30
+ except EOFError:
31
+ print("Unable to trigger EULA acceptance. This is likely due to the script being run in a non-interactive shell.")
32
+ print("Please run the script in an interactive shell to accept the EULA.")
33
+ print("Skipping the setup of the VSCode settings...")
34
+ sys.exit(0)
35
+
36
+ # check if the isaac-sim directory exists
37
+ if not os.path.exists(isaacsim_dir):
38
+ raise FileNotFoundError(
39
+ f"Could not find the isaac-sim directory: {isaacsim_dir}. There are two possible reasons for this:"
40
+ f"\n\t1. The Isaac Sim directory does not exist as a symlink at: {os.path.join(UWLAB_DIR, '_isaac_sim')}"
41
+ "\n\t2. The script could not import the 'isaacsim' package. This could be due to the 'isaacsim' package not "
42
+ "being installed in the Python environment.\n"
43
+ "\nPlease make sure that the Isaac Sim directory exists or that the 'isaacsim' package is installed."
44
+ )
45
+
46
+ ISAACSIM_DIR = isaacsim_dir
47
+ """Path to the isaac-sim directory."""
48
+
49
+
50
+ def overwrite_python_analysis_extra_paths(uwlab_settings: str) -> str:
51
+ """Overwrite the python.analysis.extraPaths in the Isaac Lab settings file.
52
+
53
+ The extraPaths are replaced with the path names from the isaac-sim settings file that exists in the
54
+ "{ISAACSIM_DIR}/.vscode/settings.json" file.
55
+
56
+ If the isaac-sim settings file does not exist, the extraPaths are not overwritten.
57
+
58
+ Args:
59
+ uwlab_settings: The settings string to use as template.
60
+
61
+ Returns:
62
+ The settings string with overwritten python analysis extra paths.
63
+ """
64
+ # isaac-sim settings
65
+ isaacsim_vscode_filename = os.path.join(ISAACSIM_DIR, ".vscode", "settings.json")
66
+
67
+ # we use the isaac-sim settings file to get the python.analysis.extraPaths for kit extensions
68
+ # if this file does not exist, we will not add any extra paths
69
+ if os.path.exists(isaacsim_vscode_filename):
70
+ # read the path names from the isaac-sim settings file
71
+ with open(isaacsim_vscode_filename) as f:
72
+ vscode_settings = f.read()
73
+ # extract the path names
74
+ # search for the python.analysis.extraPaths section and extract the contents
75
+ settings = re.search(
76
+ r"\"python.analysis.extraPaths\": \[.*?\]", vscode_settings, flags=re.MULTILINE | re.DOTALL
77
+ )
78
+ settings = settings.group(0)
79
+ settings = settings.split('"python.analysis.extraPaths": [')[-1]
80
+ settings = settings.split("]")[0]
81
+
82
+ # read the path names from the isaac-sim settings file
83
+ path_names = settings.split(",")
84
+ path_names = [path_name.strip().strip('"') for path_name in path_names]
85
+ path_names = [path_name for path_name in path_names if len(path_name) > 0]
86
+
87
+ # change the path names to be relative to the Isaac Lab directory
88
+ rel_path = os.path.relpath(ISAACSIM_DIR, UWLAB_DIR)
89
+ path_names = ['"${workspaceFolder}/' + rel_path + "/" + path_name + '"' for path_name in path_names]
90
+ else:
91
+ path_names = []
92
+ print(
93
+ f"[WARN] Could not find Isaac Sim VSCode settings: {isaacsim_vscode_filename}."
94
+ "\n\tThis will result in missing 'python.analysis.extraPaths' in the VSCode"
95
+ "\n\tsettings, which limits the functionality of the Python language server."
96
+ "\n\tHowever, it does not affect the functionality of the Isaac Lab project."
97
+ "\n\tWe are working on a fix for this issue with the Isaac Sim team."
98
+ )
99
+
100
+ # add the path names that are in the Isaac Lab extensions directory
101
+ uwlab_extensions = os.listdir(os.path.join(UWLAB_DIR, "source"))
102
+ path_names.extend(['"${workspaceFolder}/source/' + ext + '"' for ext in uwlab_extensions])
103
+
104
+ # Add upstream IsaacLab siblings from .../source (editable or wheel)
105
+ try:
106
+ import isaaclab as _il # noqa: F401
107
+
108
+ pkg_file = pathlib.Path(_il.__file__).resolve()
109
+
110
+ # Two possibilities:
111
+ # 1) Editable: .../IsaacLab/source/isaaclab/isaaclab/__init__.py → parents[2] == .../source
112
+ # 2) Wheel: .../site-packages/isaaclab/__init__.py → parent/"source" == .../isaaclab/source
113
+ parent_source = pkg_file.parents[2]
114
+ child_source = pkg_file.parent / "source"
115
+
116
+ source_dir = child_source if child_source.is_dir() else parent_source
117
+ if not source_dir.is_dir():
118
+ raise RuntimeError(f"Could not find 'source' near {pkg_file}")
119
+
120
+ for p in sorted(source_dir.iterdir()):
121
+ if p.is_dir() and p.name.startswith("isaaclab"):
122
+ rel = os.path.relpath(p, UWLAB_DIR).replace("\\", "/")
123
+ path_names.append(f'"${{workspaceFolder}}/{rel}"')
124
+ except Exception as e:
125
+ print(f"[WARN] Could not resolve upstream 'isaaclab' paths: {e}")
126
+
127
+ # Append all top-level isaaclab* dirs as ${workspaceFolder}-relative paths
128
+ for p in sorted(source_dir.iterdir()):
129
+ if p.is_dir() and p.name.startswith("isaaclab"):
130
+ rel = os.path.relpath(p, UWLAB_DIR).replace("\\", "/")
131
+ path_names.append(f'"${{workspaceFolder}}/{rel}"')
132
+
133
+ # combine them into a single string
134
+ path_names = ",\n\t\t".expandtabs(4).join(path_names)
135
+ # deal with the path separator being different on Windows and Unix
136
+ path_names = path_names.replace("\\", "/")
137
+
138
+ # replace the path names in the Isaac Lab settings file with the path names parsed
139
+ uwlab_settings = re.sub(
140
+ r"\"python.analysis.extraPaths\": \[.*?\]",
141
+ '"python.analysis.extraPaths": [\n\t\t'.expandtabs(4) + path_names + "\n\t]".expandtabs(4),
142
+ uwlab_settings,
143
+ flags=re.DOTALL,
144
+ )
145
+ # return the Isaac Lab settings string
146
+ return uwlab_settings
147
+
148
+
149
+ def overwrite_default_python_interpreter(uwlab_settings: str) -> str:
150
+ """Overwrite the default python interpreter in the Isaac Lab settings file.
151
+
152
+ The default python interpreter is replaced with the path to the python interpreter used by the
153
+ isaac-sim project. This is necessary because the default python interpreter is the one shipped with
154
+ isaac-sim.
155
+
156
+ Args:
157
+ uwlab_settings: The settings string to use as template.
158
+
159
+ Returns:
160
+ The settings string with overwritten default python interpreter.
161
+ """
162
+ # read executable name
163
+ python_exe = sys.executable.replace("\\", "/")
164
+
165
+ # We make an exception for replacing the default interpreter if the
166
+ # path (/kit/python/bin/python3) indicates that we are using a local/container
167
+ # installation of IsaacSim. We will preserve the calling script as the default, python.sh.
168
+ # We want to use python.sh because it modifies LD_LIBRARY_PATH and PYTHONPATH
169
+ # (among other envars) that we need for all of our dependencies to be accessible.
170
+ if "kit/python/bin/python3" in python_exe:
171
+ return uwlab_settings
172
+ # replace the default python interpreter in the Isaac Lab settings file with the path to the
173
+ # python interpreter in the Isaac Lab directory
174
+ uwlab_settings = re.sub(
175
+ r"\"python.defaultInterpreterPath\": \".*?\"",
176
+ f'"python.defaultInterpreterPath": "{python_exe}"',
177
+ uwlab_settings,
178
+ flags=re.DOTALL,
179
+ )
180
+ # return the Isaac Lab settings file
181
+ return uwlab_settings
182
+
183
+
184
+ def main():
185
+ # Isaac Lab template settings
186
+ uwlab_vscode_template_filename = os.path.join(UWLAB_DIR, ".vscode", "tools", "settings.template.json")
187
+ # make sure the Isaac Lab template settings file exists
188
+ if not os.path.exists(uwlab_vscode_template_filename):
189
+ raise FileNotFoundError(
190
+ f"Could not find the Isaac Lab template settings file: {uwlab_vscode_template_filename}"
191
+ )
192
+ # read the Isaac Lab template settings file
193
+ with open(uwlab_vscode_template_filename) as f:
194
+ uwlab_template_settings = f.read()
195
+
196
+ # overwrite the python.analysis.extraPaths in the Isaac Lab settings file with the path names
197
+ uwlab_settings = overwrite_python_analysis_extra_paths(uwlab_template_settings)
198
+ # overwrite the default python interpreter in the Isaac Lab settings file with the path to the
199
+ # python interpreter used to call this script
200
+ uwlab_settings = overwrite_default_python_interpreter(uwlab_settings)
201
+
202
+ # add template notice to the top of the file
203
+ header_message = (
204
+ "// This file is a template and is automatically generated by the setup_vscode.py script.\n"
205
+ "// Do not edit this file directly.\n"
206
+ "// \n"
207
+ f"// Generated from: {uwlab_vscode_template_filename}\n"
208
+ )
209
+ uwlab_settings = header_message + uwlab_settings
210
+
211
+ # write the Isaac Lab settings file
212
+ uwlab_vscode_filename = os.path.join(UWLAB_DIR, ".vscode", "settings.json")
213
+ with open(uwlab_vscode_filename, "w") as f:
214
+ f.write(uwlab_settings)
215
+
216
+ # copy the launch.json file if it doesn't exist
217
+ uwlab_vscode_launch_filename = os.path.join(UWLAB_DIR, ".vscode", "launch.json")
218
+ uwlab_vscode_template_launch_filename = os.path.join(UWLAB_DIR, ".vscode", "tools", "launch.template.json")
219
+ if not os.path.exists(uwlab_vscode_launch_filename):
220
+ # read template launch settings
221
+ with open(uwlab_vscode_template_launch_filename) as f:
222
+ uwlab_template_launch_settings = f.read()
223
+ # add header
224
+ header_message = header_message.replace(
225
+ uwlab_vscode_template_filename, uwlab_vscode_template_launch_filename
226
+ )
227
+ uwlab_launch_settings = header_message + uwlab_template_launch_settings
228
+ # write the Isaac Lab launch settings file
229
+ with open(uwlab_vscode_launch_filename, "w") as f:
230
+ f.write(uwlab_launch_settings)
231
+
232
+
233
+ if __name__ == "__main__":
234
+ main()
CONTRIBUTING.md ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contribution Guidelines
2
+
3
+ UW Lab is a community maintained project. We wholeheartedly welcome contributions to the project to make
4
+ the framework more mature and useful for everyone. These may happen in forms of bug reports, feature requests,
5
+ design proposals and more.
6
+
7
+ For general information on how to contribute see
8
+ <https://uw-lab.github.io/UWLab/main/source/refs/contributing.html>.
9
+
10
+ ---
11
+
12
+ Developer Certificate of Origin
13
+ Version 1.1
14
+
15
+ Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
16
+
17
+ Everyone is permitted to copy and distribute verbatim copies of this
18
+ license document, but changing it is not allowed.
19
+
20
+
21
+ Developer's Certificate of Origin 1.1
22
+
23
+ By making a contribution to this project, I certify that:
24
+
25
+ (a) The contribution was created in whole or in part by me and I
26
+ have the right to submit it under the open source license
27
+ indicated in the file; or
28
+
29
+ (b) The contribution is based upon previous work that, to the best
30
+ of my knowledge, is covered under an appropriate open source
31
+ license and I have the right under that license to submit that
32
+ work with modifications, whether created in whole or in part
33
+ by me, under the same open source license (unless I am
34
+ permitted to submit under a different license), as indicated
35
+ in the file; or
36
+
37
+ (c) The contribution was provided directly to me by some other
38
+ person who certified (a), (b) or (c) and I have not modified
39
+ it.
40
+
41
+ (d) I understand and agree that this project and the contribution
42
+ are public and that a record of the contribution (including all
43
+ personal information I submit with it, including my sign-off) is
44
+ maintained indefinitely and may be redistributed consistent with
45
+ this project or the open source license(s) involved.
CONTRIBUTORS.md ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # UW Lab Developers and Contributors
2
+
3
+ This is the official list of UW Lab Project developers and contributors.
4
+
5
+ To see the full list of contributors, please check the revision history in the source control.
6
+
7
+ Guidelines for modifications:
8
+
9
+ * Please keep the **lists sorted alphabetically**.
10
+ * Names should be added to this file as: *individual names* or *organizations*.
11
+ * E-mail addresses are tracked elsewhere to avoid spam.
12
+
13
+ ## Developers
14
+
15
+ * NVIDIA Corporation & Affiliates
16
+ * Shanghai Jiao Tong University
17
+ * University of Washington
18
+
19
+
20
+ ---
21
+
22
+ * Feng Yu
23
+ * Mateo Guaman Castro
24
+ * Patrick Yin
25
+ * Quanquan Peng
26
+ * Rosario Scalise
27
+ * Zhengyu Zhang
Datasets/OmniReset_failbias/Resets/InsertiveCube__ReceptiveCube/resets_ObjectAnywhereEEAnywhere.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:154b29cfd510524c69a8500b334772809d8913697e3c4ca801b1dec85710b531
3
+ size 38246811
Datasets/OmniReset_failbias/Resets/InsertiveCube__ReceptiveCube/resets_ObjectAnywhereEEGrasped.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8992bf8f43be37fd2b1869157d899b329f32d43de6724ae1b8e2ab3d05c8444c
3
+ size 37659377
Datasets/OmniReset_failbias/Resets/InsertiveCube__ReceptiveCube/resets_ObjectPartiallyAssembledEEGrasped.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2cd2ab75ca7811dfd8bf67e2911772dc5e878eafc69f441d5649af8b105527c8
3
+ size 41423813
Datasets/OmniReset_failbias/Resets/InsertiveCube__ReceptiveCube/resets_ObjectRestingEEGrasped.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:771cbeaa688341a23a6fc6aa0a3ee8d5e5c78351aed5c4b910ac3391c03d8a90
3
+ size 37626231
LICENCE ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2022-2025, The UW Lab Project Developers.
2
+
3
+ All rights reserved.
4
+
5
+ SPDX-License-Identifier: BSD-3-Clause
6
+
7
+ Redistribution and use in source and binary forms, with or without modification,
8
+ are permitted provided that the following conditions are met:
9
+
10
+ 1. Redistributions of source code must retain the above copyright notice,
11
+ this list of conditions and the following disclaimer.
12
+
13
+ 2. Redistributions in binary form must reproduce the above copyright notice,
14
+ this list of conditions and the following disclaimer in the documentation
15
+ and/or other materials provided with the distribution.
16
+
17
+ 3. Neither the name of the copyright holder nor the names of its contributors
18
+ may be used to endorse or promote products derived from this software without
19
+ specific prior written permission.
20
+
21
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
22
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
25
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
README.md ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ![Isaac Lab](docs/source/_static/uwlab.jpg)
2
+
3
+ # UW Lab
4
+
5
+ [![IsaacSim](https://img.shields.io/badge/IsaacSim-5.1.0-silver.svg)](https://docs.isaacsim.omniverse.nvidia.com/latest/index.html)
6
+ [![Python](https://img.shields.io/badge/python-3.11-blue.svg)](https://docs.python.org/3/whatsnew/3.11.html)
7
+ [![Linux platform](https://img.shields.io/badge/platform-linux--64-orange.svg)](https://releases.ubuntu.com/20.04/)
8
+ [![Windows platform](https://img.shields.io/badge/platform-windows--64-orange.svg)](https://www.microsoft.com/en-us/)
9
+ [![pre-commit](https://img.shields.io/github/actions/workflow/status/isaac-sim/IsaacLab/pre-commit.yaml?logo=pre-commit&logoColor=white&label=pre-commit&color=brightgreen)](https://github.com/isaac-sim/IsaacLab/actions/workflows/pre-commit.yaml)
10
+ [![docs status](https://img.shields.io/github/actions/workflow/status/isaac-sim/IsaacLab/docs.yaml?label=docs&color=brightgreen)](https://github.com/isaac-sim/IsaacLab/actions/workflows/docs.yaml)
11
+ [![License](https://img.shields.io/badge/license-BSD--3-yellow.svg)](https://opensource.org/licenses/BSD-3-Clause)
12
+
13
+ ## Overview
14
+
15
+ UW Lab builds upon the robust foundation established by Isaac Lab and NVIDIA Isaac Sim, expanding its framework to integrate a wider range of robotics algorithms, platforms, and environments. Rooted in principles of modularity, agility, openness, and a battery-included design inspired from IsaacLab, our framework is crafted to meet the evolving demands of modern robotics research.
16
+
17
+ In the short term, our mission is to consolidate and streamline robotics research into one cohesive ecosystem, empowering researchers and developers with a unified platform. Looking ahead, UW Lab envisions a future where artificial intelligence and robotics coalesce seamlessly with physical systems—bridging the gap between simulation and real-world application. By embedding the laws of physics at its core, our framework provides a realistic, adaptable platform for developing next-generation robotic systems.
18
+
19
+ At UW Lab, we believe that the development journey is as significant as the outcome. Our commitment to creating principled, flexible, and extensible structures supports an environment where innovation thrives and every experiment contributes to advancing the field of robotics. Join us as we push the boundaries of what's possible, transforming ideas into tangible, intelligent robotic solutions.
20
+
21
+
22
+ ## Key Features
23
+
24
+ In addition to what IsaacLab provides, UW Lab brings:
25
+
26
+ - **Environments**: Cleaned Implementation of reputable environments in Manager-Based format
27
+ - **Sim to Real**: Providing robots and configuration that has been tested in Lab and deliver the Simulation Setup that can directly transfer to reals
28
+
29
+
30
+ ## Installation
31
+
32
+ Follow the [installation guide](https://uw-lab.github.io/UWLab/main/source/setup/installation/index.html).
33
+
34
+
35
+ ## Getting Started
36
+
37
+ - **Train Your First Policy** — Train an ant to run in minutes → [Quickstart](https://uw-lab.github.io/UWLab/main/source/setup/installation/pip_installation.html#train-a-robot)
38
+ - **OmniReset** — RL for manipulation without reward engineering or demos → [Quickstart](https://uw-lab.github.io/UWLab/main/source/publications/omnireset/index.html#quick-start)
39
+
40
+ See [all available environments](https://uw-lab.github.io/UWLab/main/source/overview/uw_environments.html) and [full documentation](https://uw-lab.github.io/UWLab) for details.
41
+
42
+
43
+ ## Support
44
+
45
+ * Please use GitHub [Discussions](https://github.com/uw-lab/UWLab/discussions) for discussing ideas, asking questions, and requests for new features.
46
+ * Github [Issues](https://github.com/uw-lab/UWLab/issues) should only be used to track executable pieces of work with a definite scope and a clear deliverable. These can be fixing bugs, documentation issues, new features, or general updates.
47
+
48
+
49
+ ## License
50
+
51
+ UW Lab is released under [BSD-3 License](LICENSE)
52
+ The Isaac Lab framework is released under [BSD-3 License](LICENSE).
VERSION ADDED
@@ -0,0 +1 @@
 
 
1
+ 1.0.0
_isaaclab/IsaacLab/.dockerignore ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ignore .git related folders
2
+ .git/
3
+ .github/
4
+ .gitignore
5
+ # ignore docs
6
+ docs/
7
+ # copy in licenses folder to the container
8
+ !docs/licenses/
9
+ # ignore logs
10
+ **/logs/
11
+ **/runs/
12
+ **/output/*
13
+ **/outputs/*
14
+ **/videos/*
15
+ **/wandb/*
16
+ *.tmp
17
+ # ignore docker
18
+ docker/cluster/exports/
19
+ docker/.container.cfg
20
+ # ignore recordings
21
+ recordings/
22
+ # ignore __pycache__
23
+ **/__pycache__/
24
+ **/*.egg-info/
25
+ # ignore isaac sim symlink
26
+ _isaac_sim
27
+ # Docker history
28
+ docker/.isaac-lab-docker-history
29
+ # ignore uv environment
30
+ env_isaaclab
_isaaclab/IsaacLab/.gitattributes ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.usd filter=lfs diff=lfs merge=lfs -text
2
+ *.usda filter=lfs diff=lfs merge=lfs -text
3
+ *.psd filter=lfs diff=lfs merge=lfs -text
4
+ *.hdr filter=lfs diff=lfs merge=lfs -text
5
+ *.dae filter=lfs diff=lfs merge=lfs -text
6
+ *.mtl filter=lfs diff=lfs merge=lfs -text
7
+ *.obj filter=lfs diff=lfs merge=lfs -text
8
+ *.gif filter=lfs diff=lfs merge=lfs -text
9
+ *.mp4 filter=lfs diff=lfs merge=lfs -text
10
+ *.pt filter=lfs diff=lfs merge=lfs -text
11
+ *.jit filter=lfs diff=lfs merge=lfs -text
12
+ *.hdf5 filter=lfs diff=lfs merge=lfs -text
13
+
14
+ *.bat text eol=crlf
_isaaclab/IsaacLab/.github/CODEOWNERS ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Codeowners are designated by their GitHub username. They are
2
+ # the people who are responsible for reviewing and approving PRs
3
+ # that modify the files that match the pattern.
4
+ #
5
+ # Codeowners are not the same as contributors. They are not
6
+ # automatically added to the PR, but they will be requested to
7
+ # review the PR when it is created.
8
+ #
9
+ # As a general rule, the codeowners are the people who are
10
+ # most familiar with the code that the PR is modifying. If you
11
+ # are not sure who to add, ask in the issue or in the PR itself.
12
+ #
13
+ # The format of the file is as follows:
14
+ # <file pattern> <codeowners>
15
+
16
+
17
+ # App experience files
18
+ # These are the files that are used to launch the app with the correct settings and configurations
19
+ /apps/ @kellyguo11 @hhansen-bdai @Mayankm96
20
+
21
+ # Core Framework
22
+ /source/isaaclab/isaaclab/actuators @Mayankm96 @jtigue-bdai
23
+ /source/isaaclab/isaaclab/app @hhansen-bdai @kellyguo11
24
+ /source/isaaclab/isaaclab/assets @kellyguo11 @Mayankm96 @jtigue-bdai
25
+ /source/isaaclab/isaaclab/assets/deformable_object @masoudmoghani @ooctipus
26
+ /source/isaaclab/isaaclab/controllers @Mayankm96
27
+ /source/isaaclab/isaaclab/envs/manager_based_* @Mayankm96 @jtigue-bdai @ooctipus
28
+ /source/isaaclab/isaaclab/envs/direct_* @kellyguo11
29
+ /source/isaaclab/isaaclab/envs/mdp @ooctipus
30
+ /source/isaaclab/isaaclab/envs/mimic_* @peterd-NV
31
+ /source/isaaclab/isaaclab/envs/ui @ooctipus @ossamaAhmed
32
+ /source/isaaclab/isaaclab/envs/utils @Toni-SM
33
+ /source/isaaclab/isaaclab/managers @jtigue-bdai @Mayankm96 @ooctipus
34
+ /source/isaaclab/isaaclab/sensors/sensor_base* @pascal-roth
35
+ /source/isaaclab/isaaclab/sensors/camera @kellyguo11 @pascal-roth
36
+ /source/isaaclab/isaaclab/sensors/contact_sensor @jtigue-bdai @ooctipus
37
+ /source/isaaclab/isaaclab/sensors/imu @jtigue-bdai @pascal-roth
38
+ /source/isaaclab/isaaclab/sensors/ray_caster @pascal-roth
39
+ /source/isaaclab/isaaclab/sensors/frame_transformer @jtigue-bdai
40
+ /source/isaaclab/isaaclab/sim/converters @Mayankm96 @jtigue-bdai @kellyguo11
41
+ /source/isaaclab/isaaclab/sim/schemas @Mayankm96 @jtigue-bdai @kellyguo11
42
+ /source/isaaclab/isaaclab/sim/spawners @Mayankm96 @jtigue-bdai @ooctipus
43
+ /source/isaaclab/isaaclab/sim/simulation_* @matthewtrepte @ossamaAhmed @kellyguo11
44
+ /source/isaaclab/isaaclab/terrains @Mayankm96
45
+ /source/isaaclab/isaaclab/ui @pascal-roth @jtigue-bdai
46
+ /source/isaaclab/isaaclab/utils/buffers @ooctipus @jtigue-bdai
47
+ /source/isaaclab/isaaclab/utils/datasets @Peter-NV
48
+ /source/isaaclab/isaaclab/utils/interpolation @jtigue-bdai
49
+ /source/isaaclab/isaaclab/utils/io @ooctipus
50
+ /source/isaaclab/isaaclab/utils/modifiers @jtigue-bdai
51
+ /source/isaaclab/isaaclab/utils/noise @jtigue-bdai @kellyguo11
52
+ /source/isaaclab/isaaclab/utils/warp @pascal-roth
53
+ /source/isaaclab/isaaclab/utils/assets.py @kellyguo11 @Mayankm96
54
+ /source/isaaclab/isaaclab/utils/math.py @jtigue-bdai @Mayankm96
55
+ /source/isaaclab/isaaclab/utils/configclass.py @Mayankm96
56
+ /source/isaaclab/isaaclab/utils/sensors.py @kellyguo11 @pascal-roth
57
+
58
+ # RL Environment
59
+ /source/isaaclab_tasks/isaaclab_tasks/direct @kellyguo11
60
+ /source/isaaclab_tasks/isaaclab_tasks/manager_based @Mayankm96
61
+ /source/isaaclab_tasks/isaaclab_tasks/utils @Mayankm96
62
+
63
+ # Assets
64
+ /source/isaaclab_assets/isaaclab_assets/ @pascal-roth
65
+
66
+ # Mimic
67
+ /source/isaaclab_mimic/isaaclab_mimic @peterd-NV
68
+ /source/isaaclab_mimic/isaaclab_mimic @njawale42
69
+ /source/isaaclab_mimic/isaaclab_mimic @michaellin6
70
+ /source/isaaclab_mimic/isaaclab_mimic @jaybdub
71
+ /source/isaaclab_mimic/isaaclab_mimic @huihuaNvidia2023
72
+ /source/isaaclab_mimic/isaaclab_mimic @xyao-nv
73
+
74
+ # RL
75
+ /source/isaaclab_rl/isaaclab_rl/rsl_rl @Mayankm96 @ClemensSchwarke
76
+ /source/isaaclab_rl/isaaclab_rl/rl_games @Toni-SM
77
+ /source/isaaclab_rl/isaaclab_rl/sb3 @Toni-SM
78
+ /source/isaaclab_rl/isaaclab_rl/skrl @Toni-SM
79
+
80
+ # Standalone Scripts
81
+ /scripts/benchmarks/ @ooctipus @kellyguo11
82
+ /scripts/demos/ @ooctipus
83
+ /scripts/environments/ @ooctipus
84
+ /scripts/imitation_learning/ @Peter-NV
85
+ /scripts/reinforcement_learning/ @ooctipus @Toni-NV
86
+ /scripts/tools/ @jtigue-bdai @Mayankm96
87
+ /scripts/tutorials/ @jtigue-bdai @pascal-roth
88
+
89
+ # Github Actions
90
+ # This list is for people wanting to be notified every time there's a change
91
+ # related to Github Actions
92
+ /.github/ @kellyguo11 @hhansen-bdai
93
+
94
+ # Visual Studio Code
95
+ /.vscode/ @hhansen-bdai @Mayankm96
96
+
97
+ # Infrastructure (Docker, Docs, Tools)
98
+ /docker/ @hhansen-bdai @pascal-roth
99
+ /docs/ @jtigue-bdai @kellyguo11 @Mayankm96
100
+ /tools/ @hhansen-bdai
101
+ /isaaclab.* @hhansen-bdai @Mayankm96 @kellyguo11
_isaaclab/IsaacLab/.github/ISSUE_TEMPLATE/bug.md ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ name: Bug Report
3
+ about: Submit a bug report
4
+ title: "[Bug Report] Bug title"
5
+
6
+ ---
7
+
8
+ If you are submitting a bug report, please fill in the following details and use the tag [bug].
9
+
10
+ ### Describe the bug
11
+
12
+ A clear and concise description of what the bug is.
13
+
14
+ ### Steps to reproduce
15
+
16
+ Please try to provide a minimal example to reproduce the bug. Error messages and stack traces are also helpful.
17
+
18
+ <!-- Please post terminal logs, minimal example to reproduce, or command to run under three backticks (```) to allow code formatting.
19
+
20
+ ```
21
+ Paste your error here
22
+ ```
23
+
24
+ For more information on this, check: https://www.markdownguide.org/extended-syntax/#fenced-code-blocks
25
+
26
+ -->
27
+
28
+ ### System Info
29
+
30
+ Describe the characteristic of your environment:
31
+
32
+ <!-- Please complete the following description. -->
33
+ - Commit: [e.g. 8f3b9ca]
34
+ - Isaac Sim Version: [e.g. 5.0, this can be obtained by `cat ${ISAACSIM_PATH}/VERSION`]
35
+ - OS: [e.g. Ubuntu 22.04]
36
+ - GPU: [e.g. RTX 5090]
37
+ - CUDA: [e.g. 12.8]
38
+ - GPU Driver: [e.g. 553.05, this can be seen by using `nvidia-smi` command.]
39
+
40
+ ### Additional context
41
+
42
+ Add any other context about the problem here.
43
+
44
+ ### Checklist
45
+
46
+ - [ ] I have checked that there is no similar issue in the repo (**required**)
47
+ - [ ] I have checked that the issue is not in running Isaac Sim itself and is related to the repo
48
+
49
+ ### Acceptance Criteria
50
+
51
+ Add the criteria for which this task is considered **done**. If not known at issue creation time, you can add this once the issue is assigned.
52
+
53
+ - [ ] Criteria 1
54
+ - [ ] Criteria 2
_isaaclab/IsaacLab/.github/ISSUE_TEMPLATE/proposal.md ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ name: Proposal
3
+ about: Propose changes that are not bug fixes
4
+ title: "[Proposal] Proposal title"
5
+ ---
6
+
7
+
8
+ ### Proposal
9
+
10
+ A clear and concise description of the proposal. In a few sentences, describe the feature and its core capabilities.
11
+
12
+ ### Motivation
13
+
14
+ Please outline the motivation for the proposal. Summarize the core use cases and user problems and needs you are trying to solve.
15
+
16
+ Is your feature request related to a problem? e.g.,"I'm always frustrated when [...]".
17
+
18
+ If this is related to another GitHub issue, please link here too.
19
+
20
+ ### Alternatives
21
+
22
+ A clear and concise description of any alternative solutions or features you've considered, if any.
23
+
24
+ ### Build Info
25
+
26
+ Describe the versions where you are observing the missing feature in:
27
+
28
+ <!-- Please complete the following description. -->
29
+ - Isaac Lab Version: [e.g. 2.3.2]
30
+ - Isaac Sim Version: [e.g. 5.1, this can be obtained by `cat ${ISAACSIM_PATH}/VERSION`]
31
+
32
+ ### Additional context
33
+
34
+ Add any other context or screenshots about the feature request here.
35
+
36
+ ### Checklist
37
+
38
+ - [ ] I have checked that there is no similar issue in the repo (**required**)
39
+
40
+ ### Acceptance Criteria
41
+
42
+ Add the criteria for which this task is considered **done**. If not known at issue creation time, you can add this once the issue is assigned.
43
+
44
+ - [ ] Criteria 1
45
+ - [ ] Criteria 2
_isaaclab/IsaacLab/.github/ISSUE_TEMPLATE/question.md ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ name: Question
3
+ about: Ask a question
4
+ title: "[Question] Question title"
5
+ ---
6
+
7
+ ### Question
8
+
9
+ Basic questions, related to robot learning, that are not bugs or feature requests will be closed without reply, because GitHub issues are not an appropriate venue for these.
10
+
11
+ Advanced/nontrivial questions, especially in areas where documentation is lacking, are very much welcome.
12
+
13
+ For questions that are related to running and understanding Isaac Sim, please post them at the official [Isaac Sim forums](https://forums.developer.nvidia.com/c/omniverse/simulation/69).
14
+
15
+ ### Build Info
16
+
17
+ Describe the versions that you are currently using:
18
+
19
+ <!-- Please complete the following description. -->
20
+ - Isaac Lab Version: [e.g. 2.3.2]
21
+ - Isaac Sim Version: [e.g. 5.1, this can be obtained by `cat ${ISAACSIM_PATH}/VERSION`]
_isaaclab/IsaacLab/.github/LICENSE_HEADER.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
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
_isaaclab/IsaacLab/.github/LICENSE_HEADER_MIMIC.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ Copyright (c) 2024-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: Apache-2.0
_isaaclab/IsaacLab/.github/PULL_REQUEST_TEMPLATE.md ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Description
2
+
3
+ <!--
4
+ Thank you for your interest in sending a pull request. Please make sure to check the contribution guidelines.
5
+
6
+ Link: https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html
7
+
8
+ 💡 Please try to keep PRs small and focused. Large PRs are harder to review and merge.
9
+ -->
10
+
11
+ Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context.
12
+ List any dependencies that are required for this change.
13
+
14
+ Fixes # (issue)
15
+
16
+ <!-- As a practice, it is recommended to open an issue to have discussions on the proposed pull request.
17
+ This makes it easier for the community to keep track of what is being developed or added, and if a given feature
18
+ is demanded by more than one party. -->
19
+
20
+ ## Type of change
21
+
22
+ <!-- As you go through the list, delete the ones that are not applicable. -->
23
+
24
+ - Bug fix (non-breaking change which fixes an issue)
25
+ - New feature (non-breaking change which adds functionality)
26
+ - Breaking change (existing functionality will not work without user modification)
27
+ - Documentation update
28
+
29
+ ## Screenshots
30
+
31
+ Please attach before and after screenshots of the change if applicable.
32
+
33
+ <!--
34
+ Example:
35
+
36
+ | Before | After |
37
+ | ------ | ----- |
38
+ | _gif/png before_ | _gif/png after_ |
39
+
40
+ 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.
41
+ -->
42
+
43
+ ## Checklist
44
+
45
+ - [ ] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
46
+ - [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format`
47
+ - [ ] I have made corresponding changes to the documentation
48
+ - [ ] My changes generate no new warnings
49
+ - [ ] I have added tests that prove my fix is effective or that my feature works
50
+ - [ ] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file
51
+ - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there
52
+
53
+ <!--
54
+ As you go through the checklist above, you can mark something as done by putting an x character in it
55
+
56
+ For example,
57
+ - [x] I have done this task
58
+ - [ ] I have not done this task
59
+ -->