From 7997db6c91b7c81bc33f5b0e3a56a98220dacd14 Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Fri, 28 Aug 2026 17:01:57 -0700 Subject: [PATCH 1/2] Add Greptile review config with UW Lab coding conventions Add a .greptile/ directory so Greptile reviews PRs against the project's conventions instead of only generic checks: - config.json: restrict comments to logic/syntax (formatting is handled by pre-commit), set review priorities, and add scoped rules for extension version + CHANGELOG bumps, cross-script CLI flag consistency, vectorized mdp terms, gym registration entry points, self-contained task packages, new-task docs, optional research dependencies, submodule policy, machine-specific paths, committed artifacts, type hints, TYPE_CHECKING imports, bash shebangs, and new dependencies. - rules.md: coding conventions adapted from Isaac Lab's contributing guide (file/class structure, type hints and docstrings, manager-based env conventions, task registration, adding a new task or publication, changelog format, tests, portability). - files.json: point the reviewer at the PR template, pre-commit config, and .gitattributes for context. --- .greptile/config.json | 123 +++++++++++++++++++++++++++ .greptile/files.json | 16 ++++ .greptile/rules.md | 192 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 331 insertions(+) create mode 100644 .greptile/config.json create mode 100644 .greptile/files.json create mode 100644 .greptile/rules.md diff --git a/.greptile/config.json b/.greptile/config.json new file mode 100644 index 00000000..783dffaf --- /dev/null +++ b/.greptile/config.json @@ -0,0 +1,123 @@ +{ + "commentTypes": [ + "logic", + "syntax" + ], + "instructions": "Review against the conventions in .greptile/rules.md. Formatting, import order, line length, license headers, spelling, and debug statements are already enforced by pre-commit (black/isort/flake8/pyupgrade/codespell) - do not comment on them, except under scripts/ which pre-commit skips. Prioritize, in order: (1) runtime bugs and cross-script CLI/config mismatches, (2) unvectorized, device-mismatched, or non-deterministic tensor code in mdp terms, (3) gym registration and cfg entry points that do not resolve, (4) missing extension version + CHANGELOG bumps, (5) machine-specific paths or committed artifacts. Be concise; include a code suggestion when the fix is local.", + "ignorePatterns": [ + "docs/licenses/**", + "docs/source/_static/**", + ".github/workflows/license-exceptions.json", + "CONTRIBUTORS.md" + ], + "rules": [ + { + "id": "extension-version-changelog", + "rule": "Any change to code under source/// must bump `version` in source//config/extension.toml (semver) and add a matching entry to source//docs/CHANGELOG.rst with the same version, a date, and Added/Changed/Deprecated/Removed/Fixed sub-sections written in past tense. Flag PRs that touch an extension's package without both, or where the two versions disagree.", + "severity": "high", + "scope": [ + "source/**" + ] + }, + { + "id": "cli-flag-consistency", + "rule": "When a script launches another script (subprocess, os.system, shell), every flag it passes must be defined by the target's argparse parser or Hydra config, and opt-out flags such as --no_video, --headless, or --disable_* must actually change behavior in every code path that reads them. Flag passed-but-undefined flags and flags that are parsed but ignored.", + "severity": "high", + "scope": [ + "scripts/**", + "scripts_v2/**", + "source/**" + ] + }, + { + "id": "vectorized-mdp-terms", + "rule": "Observation, reward, event, termination, curriculum, and command terms under **/mdp/ must be batched over the env dimension: operate on tensors shaped (num_envs, ...) or on the given env_ids, allocate tensors with device=env.device, and never loop in Python over environments, call .item()/.cpu()/.numpy() inside per-step logic, or mix CPU and CUDA tensors. Flag per-env Python loops and host round-trips in these files.", + "severity": "high", + "scope": [ + "source/**/mdp/**" + ] + }, + { + "id": "per-env-sampling-uses-torch", + "rule": "Per-environment randomness in mdp terms (anything that differs across env_ids: poses, velocities, physics parameters, noise) must be sampled with torch on env.device (torch.rand/randn/randint, math_utils.sample_uniform) in one batched call, not with Python `random` or `np.random` in a loop. Scalar scene-wide choices shared by all envs (e.g. picking one HDRI or a camera jitter applied to the whole scene) may use `random`, which the env seed also seeds.", + "severity": "medium", + "scope": [ + "source/uwlab_tasks/**", + "source/uwlab/**" + ] + }, + { + "id": "task-registration", + "rule": "A new environment cfg class in uwlab_tasks must be registered with gym.register in its package __init__.py, and every entry-point string in the registration (env_cfg_entry_point, *_cfg_entry_point) must resolve to an existing module:attribute or agents/ file. Flag registrations whose targets do not exist, duplicate task ids, and env cfgs that are never registered.", + "severity": "high", + "scope": [ + "source/uwlab_tasks/**" + ] + }, + { + "id": "task-package-self-contained", + "rule": "A new task lives in its own package under source/uwlab_tasks/uwlab_tasks//// (reference layout: manipulation/omnireset with __init__.py doing gym.register, *_env_cfg.py, mdp/, config// or agents/). By default everything the task needs - mdp terms, recorders, utilities, cfgs - stays inside that package. Changes outside it (the uwlab core extension, uwlab_rl, uwlab_assets, shared uwlab_tasks utilities, or another task's package) are sometimes correct but must be justified: the PR description or code comment should say why the code cannot live in the task package (generic and used by more than one task, a framework bug fix, a new asset). Flag out-of-package changes that carry no such justification, task-specific code added to another task's package (e.g. extending omnireset/mdp for a different task), and behaviour flags added to another task's env cfg instead of a separate env cfg.", + "severity": "high", + "scope": [ + "source/**" + ] + }, + { + "id": "new-task-docs", + "rule": "When a PR registers a new task id, it should also list it in docs/source/overview/uw_environments.rst. Work that ships as a publication (own Quick Start, checkpoints, paper) additionally gets docs/source/publications//index.rst and a bullet under 'Getting Started' in README.md. Mention this once as a note; do not block on it.", + "severity": "medium", + "scope": [ + "source/uwlab_tasks/**" + ] + }, + { + "id": "optional-research-dependencies", + "rule": "Research-only or heavy dependencies (e.g. diffusion_policy, robomimic, policy-training frameworks) must not be added to any extension's install_requires or extension.toml [python.pipapi] requirements, so a default UWLab install stays light. Ship them as an extras_require group (pattern: EXTRAS_REQUIRE in source/uwlab_rl/setup.py), a git submodule, or documented install steps on the relevant docs/source/publications// page. Nothing under source/ may import them at module import time.", + "severity": "high" + }, + { + "id": "submodule-policy", + "rule": "A new .gitmodules entry must point at a lab-owned repository (github.com/UW-Lab or github.com/WEIRDLabUW, not a personal fork), pin a branch or commit, be optional to initialize (nothing under source/ imports it at module import time), and come with docs saying when to run `git submodule update --init`. If docs previously told users to clone that repo manually (e.g. docs/source/publications/omnireset/distillation.rst), the PR must update them.", + "severity": "high" + }, + { + "id": "no-machine-specific-paths", + "rule": "Committed code must not contain absolute filesystem paths (/home/, /mnt, /data, /scratch), personal usernames, hard-coded conda env names, wandb entities, or local checkpoint and dataset paths. Use CLI arguments, environment variables, Hydra config, or paths relative to the repository or the extension's data directory.", + "severity": "high" + }, + { + "id": "no-committed-artifacts", + "rule": "Do not commit training outputs or generated data: checkpoints (*.pt, *.pth, *.jit, *.onnx), logs, videos, hdf5/npz datasets, USD files, __pycache__, or wandb/tensorboard directories. Binary assets that legitimately belong in uwlab_assets must go through git LFS per .gitattributes. Trained checkpoints and datasets are published to the Hugging Face dataset UW-Lab/uwlab-assets (checkpoints under Policies/) via a fork + PR and linked from the docs, never stored in this repo.", + "severity": "medium" + }, + { + "id": "type-hints-signature-only", + "rule": "Public functions and methods in source/ carry type hints in the signature using PEP 604 syntax (`int | None`, not `Optional[int]`), omit `-> None`, and use Google-style docstrings whose Args entries are `name: description` with no type repeated in the docstring. Flag missing hints on new public APIs and types duplicated in docstrings.", + "severity": "medium", + "scope": [ + "source/**" + ] + }, + { + "id": "type-checking-imports-only-for-cfg", + "rule": "Imports live at module top. `typing.TYPE_CHECKING` guarded imports are allowed only to break the cfg <-> implementation cycle (a cfg referencing its class_type/func, or an implementation annotating its cfg). The only other accepted exception is standalone scripts that must import isaaclab/uwlab modules after AppLauncher has started the app. Flag other function-local or TYPE_CHECKING imports.", + "severity": "medium", + "scope": [ + "source/**" + ] + }, + { + "id": "shell-scripts-need-bash", + "rule": "Shell scripts that use bash-only syntax (arrays, [[ ]], ${!arr[@]}, (( )), `local`) must start with `#!/usr/bin/env bash`, not `#!/bin/sh`.", + "severity": "medium", + "scope": [ + "**/*.sh" + ] + }, + { + "id": "new-dependencies-need-justification", + "rule": "Adding a package to any setup.py install_requires, extension.toml [python.pipapi] requirements, environment.yml, or pyproject.toml needs a stated reason in the PR and a license on the allowlist (MIT, Apache, BSD, ISC, zlib, PSF, BSL, MPL) or an entry in .github/workflows/license-exceptions.json. Prefer implementing with torch, numpy, or existing dependencies. Research-only or heavy dependencies (diffusion_policy, robomimic, policy-training frameworks) must not go in install_requires at all - see optional-research-dependencies.", + "severity": "medium" + } + ] +} diff --git a/.greptile/files.json b/.greptile/files.json new file mode 100644 index 00000000..1176a75e --- /dev/null +++ b/.greptile/files.json @@ -0,0 +1,16 @@ +{ + "files": [ + { + "path": ".github/PULL_REQUEST_TEMPLATE.md", + "description": "PR template. The items that matter for review are the pre-commit run and the CHANGELOG + extension.toml version bump; tests are optional and should not be requested." + }, + { + "path": ".pre-commit-config.yaml", + "description": "Formatting and lint checks that CI already enforces; do not duplicate these in review comments. Note scripts/ is excluded from pre-commit." + }, + { + "path": ".gitattributes", + "description": "File types that must be stored via git LFS." + } + ] +} diff --git a/.greptile/rules.md b/.greptile/rules.md new file mode 100644 index 00000000..71ebd9e5 --- /dev/null +++ b/.greptile/rules.md @@ -0,0 +1,192 @@ +# UW Lab review conventions + +UW Lab extends [Isaac Lab](https://github.com/isaac-sim/IsaacLab) and follows its coding +conventions (Google Python style, PEP 8, PEP 484/585 type hints, Google docstrings). This file +is review context for Greptile. Rules that pre-commit already enforces are listed so the reviewer +does not repeat them. + +## Already enforced by pre-commit (do not comment on these) + +`./uwlab.sh -f` runs: black (line length 120), isort (black profile, custom sections in +`pyproject.toml`), flake8 (+simplify, +return; see `.flake8` for ignored codes), pyupgrade +(`--py310-plus`), codespell, trailing whitespace / EOF fixes, license header insertion, +debug-statement check, and a 2 MB file-size cap. Everything under `scripts/` is **excluded** +from pre-commit, so basic hygiene issues there are fair game. + +## Repository layout + +Four Omniverse-style extensions live under `source/`, each with the same shape: + +``` +source// +├── config/extension.toml # version (semver) + metadata + pip requirements +├── docs/CHANGELOG.rst # one entry per version, must match extension.toml +├── / # the python package +├── test/ # pytest tests +└── setup.py +``` + +- `uwlab` – framework core (envs, mdp terms, sensors, utilities). Depends on `isaaclab`. +- `uwlab_assets` – robot / object / sensor cfg instances. Large binaries go through git LFS. +- `uwlab_tasks` – task definitions: `manager_based/` and `direct/`, each task is a package with + `__init__.py` (gym registration), `*_env_cfg.py`, `mdp/`, and `agents/` (RL library cfgs). +- `uwlab_rl` – RL library wrappers and runners. + +Standalone entry points: `scripts/` mirrors the Isaac Lab layout (`reinforcement_learning/`, +`imitation_learning/`, `tools/`, `tutorials/`); `scripts_v2/tools/` holds newer standalone tools. + +## Standalone scripts + +Any script that touches Isaac Sim must create the `AppLauncher` first and import `isaaclab` / +`uwlab*` modules only after `simulation_app` exists: + +```python +"""Launch Isaac Sim Simulator first.""" +from isaaclab.app import AppLauncher + +app_launcher = AppLauncher(args_cli) +simulation_app = app_launcher.app + +"""Rest everything follows.""" +import torch +from isaaclab.envs import ManagerBasedRLEnv +``` + +Scripts take configuration from argparse / Hydra, never from hard-coded absolute paths. +When one script shells out to another, the flags it passes must exist in the callee. + +## Python file and class structure + +Within a file: imports → constants → public functions → public classes → private functions → +private classes. Within a class: constants → `ClassVar` attributes → `__init__`/`__del__` → +`__repr__`/`__str__` → properties → public instance/class/static methods → private methods, +ordered the way a user would call them (`initialize`, `reset`, `update`, `close`). + +Private helpers are prefixed with `_`. Imports stay at module top; the only sanctioned +`typing.TYPE_CHECKING` use is breaking the cfg ↔ implementation cycle (a cfg's `class_type` / +`func` default referencing the implementation, or an implementation annotating its cfg type). + +## Type hints and docstrings + +- Type hints in the signature, PEP 604 unions (`torch.Tensor | None`), no `-> None`. +- Google docstrings. `Args:` entries are `name: description` — the type is never repeated. +- Physical quantities state SI units and shape: `"""Joint positions [rad], shape (num_envs, num_joints)."""` +- Docstrings explain *why* and non-obvious design choices, not just *what*. + +## Manager-based environments + +- Configs are `@configclass` dataclasses (`*Cfg`), usually alongside the implementation. +- MDP terms are plain functions with the Isaac Lab signature: + + ```python + def term(env: ManagerBasedRLEnv, ..., asset_cfg: SceneEntityCfg = SceneEntityCfg("robot")) -> torch.Tensor: + ``` + + Observation / reward / termination terms return a tensor of shape `(num_envs,)` or + `(num_envs, D)`. Event terms receive `env_ids: torch.Tensor | None` and must only touch those + environments. Stateful terms subclass `ManagerTermBase`. +- Everything is batched over the env dimension on `env.device`. No Python loops over envs, no + `.item()` / `.cpu()` / numpy round-trips in per-step code, no CPU/CUDA tensor mixing. +- Per-env randomness (anything that differs across `env_ids`) is sampled with torch on + `env.device` in one batched call (`torch.rand(..., device=env.device)`, + `math_utils.sample_uniform`). Python `random` is fine for scalar scene-wide choices shared by + every env (one HDRI, one camera jitter); the env seed seeds it too. Either way results must be + reproducible under `env_cfg.seed`, which `test_environment_determinism.py` checks. +- Scene entities are resolved through `SceneEntityCfg` (joint/body ids are resolved once, then + indexed), not by string lookups every step. + +## Task registration + +New environments are registered in the task package's `__init__.py`: + +```python +gym.register( + id="UW---v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + disable_env_checker=True, + kwargs={ + "env_cfg_entry_point": f"{__name__}._env_cfg:EnvCfg", + "rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:PPORunnerCfg", + }, +) +``` + +Every entry-point string must resolve; `-Play-v0` variants normally reuse the training cfg with +`num_envs`, randomization, and curriculum reduced. New tasks are picked up by +`source/uwlab_tasks/test/test_environments.py`, so they must construct and step headless. + +## Adding a new task or publication + +- One package per task under `source/uwlab_tasks/uwlab_tasks/manager_based///` + (`direct/` for direct-workflow envs). `manipulation/omnireset/` is the reference layout: + `__init__.py` (gym registration), `*_env_cfg.py`, `mdp/` (terms and utils; its `__init__` + re-exports `isaaclab.envs.mdp` and `uwlab.envs.mdp`, then the local modules), and + `config//` or `agents/` for robot-specific cfgs and RL library cfgs. +- By default everything the task needs - new mdp terms, recorders, helpers, cfgs - lives inside + that package. Do not extend another task's package (e.g. add cube logic to `omnireset/mdp/`) and + do not add flags to another task's env cfg; create a separate env cfg. +- Changes outside the task package (`uwlab` core, `uwlab_rl`, `uwlab_assets`, shared `uwlab_tasks` + utilities, another task's package) are sometimes the right call, but they must be justified in + the PR: why can this not live in the task package? Good reasons are code that is generic and used + by more than one task, a framework bug fix, or a new shared asset. If the justification is + missing, ask for it rather than rejecting the change. +- Docs: add the task id to `docs/source/overview/uw_environments.rst`. Publication-tier work also + gets `docs/source/publications//index.rst` (Quick Start first; see `omnireset/index.rst`) + and a bullet under **Getting Started** in `README.md`. +- Checkpoints and datasets go to the Hugging Face dataset `UW-Lab/uwlab-assets` (`Policies/` for + checkpoints) via fork + PR, and the docs link to them. They are never committed here. +- Heavy or research-only dependencies (diffusion_policy, robomimic, ...) are not added to core + install requirements, so a default install stays light. Use an `extras_require` group + (`EXTRAS_REQUIRE` in `source/uwlab_rl/setup.py` is the pattern), a git submodule, or install + steps on the publication's docs page. Nothing under `source/` may import them at module import + time. +- Submodules point at a lab-owned repo (`github.com/UW-Lab`, `github.com/WEIRDLabUW`), are pinned + to a branch or commit, are optional to initialize, and are documented (when to run + `git submodule update --init`). If docs previously said to clone the repo manually, update them + in the same PR. + +## Versioning and changelog + +Every PR that changes an extension's package bumps that extension's version in +`config/extension.toml` (patch for fixes, minor for features, major for breaking changes) and adds +a matching entry at the top of `docs/CHANGELOG.rst`: + +```rst +0.13.9 (2026-08-28) +~~~~~~~~~~~~~~~~~~~ + +Added +^^^^^ + +* Added :func:`~uwlab_tasks.manager_based.manipulation.omnireset.mdp.cube_reset` event for cube reset states. + +Fixed +^^^^^ + +* Fixed ``--no_video`` being ignored in :mod:`scripts.ASTEROID.run_asteroid`. +``` + +Bullets are past tense, concise, and say why when it is not obvious. Sub-sections are limited to +Added / Changed / Deprecated / Removed / Fixed. Breaking changes go under Changed, prefixed with +`**Breaking:**`, with migration guidance. + +## Dependencies + +Prefer torch, numpy, and what is already installed. A new package must be added to the owning +extension's `setup.py` and `extension.toml`, have an allowlisted license (MIT / Apache / BSD / +ISC / zlib / PSF / BSL / MPL — CI fails otherwise unless listed in +`.github/workflows/license-exceptions.json`), and be justified in the PR description. + +## Tests + +pytest under `source//test/`, run with `./uwlab.sh -t` or +`./uwlab.sh -p -m pytest `. Tests that need the simulator create the `AppLauncher` at +module top (headless) and are marked `@pytest.mark.isaacsim_ci`. Tests are **not required** for a +PR — do not ask for them. Do flag changes that would break the existing suite (e.g. a new task +that cannot be constructed headless, or a determinism regression). + +## Portability + +No absolute paths, usernames, hard-coded conda environments, wandb entities, or local +checkpoint/dataset locations in committed code. Use CLI args, environment variables, Hydra, or +paths relative to the repo / extension data directory. From 1f6337c2e01cbc830b783da4b48ee644dfd00c7c Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Fri, 28 Aug 2026 17:11:26 -0700 Subject: [PATCH 2/2] Apply pre-commit formatting to existing files Run ./uwlab.sh --format over the repository and commit the result so the pre-commit CI check passes. Whitespace, import order, and end-of-file fixes only; no functional changes. --- .vscode/tools/setup_vscode.py | 4 +--- docs/source/setup/installation/include/src_verify_uwlab.rst | 1 - scripts_v2/tools/sim2real/align_cameras.py | 4 +--- .../omnireset/config/ur5e_robotiq_2f85/grasp_sampling_cfg.py | 4 +--- .../config/ur5e_robotiq_2f85/partial_assemblies_cfg.py | 4 +--- .../omnireset/config/ur5e_robotiq_2f85/reset_states_cfg.py | 4 +--- .../omnireset/config/ur5e_robotiq_2f85/rl_state_cfg.py | 4 +--- tools/run_all_tests.py | 2 +- tools/run_train_envs.py | 2 +- 9 files changed, 8 insertions(+), 21 deletions(-) diff --git a/.vscode/tools/setup_vscode.py b/.vscode/tools/setup_vscode.py index dd02c436..bfdaff22 100644 --- a/.vscode/tools/setup_vscode.py +++ b/.vscode/tools/setup_vscode.py @@ -221,9 +221,7 @@ def main(): with open(uwlab_vscode_template_launch_filename) as f: uwlab_template_launch_settings = f.read() # add header - header_message = header_message.replace( - uwlab_vscode_template_filename, uwlab_vscode_template_launch_filename - ) + header_message = header_message.replace(uwlab_vscode_template_filename, uwlab_vscode_template_launch_filename) uwlab_launch_settings = header_message + uwlab_template_launch_settings # write the Isaac Lab launch settings file with open(uwlab_vscode_launch_filename, "w") as f: diff --git a/docs/source/setup/installation/include/src_verify_uwlab.rst b/docs/source/setup/installation/include/src_verify_uwlab.rst index 6934d17d..bb607dbf 100644 --- a/docs/source/setup/installation/include/src_verify_uwlab.rst +++ b/docs/source/setup/installation/include/src_verify_uwlab.rst @@ -92,4 +92,3 @@ We recommend adding ``--headless`` for faster training. .. code:: batch uwlab.bat -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Velocity-Rough-Anymal-C-v0 --headless - diff --git a/scripts_v2/tools/sim2real/align_cameras.py b/scripts_v2/tools/sim2real/align_cameras.py index 269eb5a9..f2ddd8fa 100644 --- a/scripts_v2/tools/sim2real/align_cameras.py +++ b/scripts_v2/tools/sim2real/align_cameras.py @@ -82,9 +82,7 @@ from pxr import Gf, UsdGeom # noqa: E402 import uwlab_tasks # noqa: F401 -from uwlab_tasks.manager_based.manipulation.omnireset.config.ur5e_robotiq_2f85.camera_align_cfg import ( - CameraAlignEnvCfg, -) +from uwlab_tasks.manager_based.manipulation.omnireset.config.ur5e_robotiq_2f85.camera_align_cfg import CameraAlignEnvCfg # ---- RGB key lookup ---- CAMERA_TO_RGB = { diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/grasp_sampling_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/grasp_sampling_cfg.py index 9b61dce4..f7b112b5 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/grasp_sampling_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/grasp_sampling_cfg.py @@ -170,9 +170,7 @@ def make_object(usd_path: str): variants = { "scene.object": { "fbleg": make_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/FurnitureBench/SquareLeg/square_leg.usd"), - "fbdrawerbottom": make_object( - f"{UWLAB_CLOUD_ASSETS_DIR}/Props/FurnitureBench/DrawerBottom/drawer_bottom.usd" - ), + "fbdrawerbottom": make_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/FurnitureBench/DrawerBottom/drawer_bottom.usd"), "peg": make_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Custom/Peg/peg.usd"), "cupcake": make_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Custom/CupCake/cupcake.usd"), "cube": make_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Custom/InsertiveCube/insertive_cube.usd"), diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/partial_assemblies_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/partial_assemblies_cfg.py index 02c0f054..b94ee380 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/partial_assemblies_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/partial_assemblies_cfg.py @@ -240,9 +240,7 @@ def make_receptive_object(usd_path: str): "fbtabletop": make_receptive_object( f"{UWLAB_CLOUD_ASSETS_DIR}/Props/FurnitureBench/SquareTableTop/square_table_top.usd" ), - "fbdrawerbox": make_receptive_object( - f"{UWLAB_CLOUD_ASSETS_DIR}/Props/FurnitureBench/DrawerBox/drawer_box.usd" - ), + "fbdrawerbox": make_receptive_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/FurnitureBench/DrawerBox/drawer_box.usd"), "peghole": make_receptive_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Custom/PegHole/peg_hole.usd"), "plate": make_receptive_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Custom/Plate/plate.usd"), "cube": make_receptive_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Custom/ReceptiveCube/receptive_cube.usd"), diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/reset_states_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/reset_states_cfg.py index e75d6b62..85a042d2 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/reset_states_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/reset_states_cfg.py @@ -501,9 +501,7 @@ def make_receptive_object(usd_path: str): "fbtabletop": make_receptive_object( f"{UWLAB_CLOUD_ASSETS_DIR}/Props/FurnitureBench/SquareTableTop/square_table_top.usd" ), - "fbdrawerbox": make_receptive_object( - f"{UWLAB_CLOUD_ASSETS_DIR}/Props/FurnitureBench/DrawerBox/drawer_box.usd" - ), + "fbdrawerbox": make_receptive_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/FurnitureBench/DrawerBox/drawer_box.usd"), "peghole": make_receptive_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Custom/PegHole/peg_hole.usd"), "plate": make_receptive_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Custom/Plate/plate.usd"), "cube": make_receptive_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Custom/ReceptiveCube/receptive_cube.usd"), diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/rl_state_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/rl_state_cfg.py index e9dbf863..e35809cb 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/rl_state_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/rl_state_cfg.py @@ -664,9 +664,7 @@ def make_receptive_object(usd_path: str): "fbtabletop": make_receptive_object( f"{UWLAB_CLOUD_ASSETS_DIR}/Props/FurnitureBench/SquareTableTop/square_table_top.usd" ), - "fbdrawerbox": make_receptive_object( - f"{UWLAB_CLOUD_ASSETS_DIR}/Props/FurnitureBench/DrawerBox/drawer_box.usd" - ), + "fbdrawerbox": make_receptive_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/FurnitureBench/DrawerBox/drawer_box.usd"), "peghole": make_receptive_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Custom/PegHole/peg_hole.usd"), "plate": make_receptive_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Custom/Plate/plate.usd"), "cube": make_receptive_object(f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Custom/ReceptiveCube/receptive_cube.usd"), diff --git a/tools/run_all_tests.py b/tools/run_all_tests.py index 6c37c77a..7ce2aec8 100644 --- a/tools/run_all_tests.py +++ b/tools/run_all_tests.py @@ -32,7 +32,7 @@ from prettytable import PrettyTable # Local imports -from test_settings import DEFAULT_TIMEOUT, UWLAB_PATH, PER_TEST_TIMEOUTS, TESTS_TO_SKIP +from test_settings import DEFAULT_TIMEOUT, PER_TEST_TIMEOUTS, TESTS_TO_SKIP, UWLAB_PATH def parse_args() -> argparse.Namespace: diff --git a/tools/run_train_envs.py b/tools/run_train_envs.py index cc8641b9..6617daee 100644 --- a/tools/run_train_envs.py +++ b/tools/run_train_envs.py @@ -21,7 +21,7 @@ import argparse import subprocess -from test_settings import UWLAB_PATH, TEST_RL_ENVS +from test_settings import TEST_RL_ENVS, UWLAB_PATH def parse_args() -> argparse.Namespace: