Skip to content

Prepare UWLab 2.0 for Isaac Lab 3.0 EA / Sim 6.1 - #36

Merged
patrickhaoy merged 28 commits into
UW-Lab:mainfrom
JTran-UW:port_isaaclab3
Sep 28, 2026
Merged

patrickhaoy merged 28 commits into
UW-Lab:mainfrom
JTran-UW:port_isaaclab3

Conversation

@JTran-UW

@JTran-UW JTran-UW commented Sep 16, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Prepare UWLab 2.0.0 for Isaac Lab 3.0 EA, Isaac Sim 6.1, Python 3.12, and official UW-Lab RSL-RL 5.4.1.

  • Migrate task/asset APIs, quaternion conventions, observation layouts, and actor/critic integration.
  • Pin compatible assets and pretrained checkpoints on Hugging Face isaaclab3; preserve isaaclab2 / v1.3.0 for the legacy stack.
  • Align upstream scripts while preserving UWLab CLI behavior; fix Ray camera tuning, converter output filenames, and batched OBB visualization.
  • Update installation, CI, documentation, and consolidated release metadata. Preserve original robot dynamics and stock Isaac Lab initialization.

Addressed issues

Validation

  • Targeted CPU regressions, lint, docs build, and link checks passed.
  • Local mean-policy evaluation on 0ba08e7: documented leg/seed42 example achieved 20/20 successes. Across 18 task/seed comparisons, 15 matched reference counts exactly and three had higher observed success rates; none declined. Rectangle remains weak at 8.5–13.2%, unchanged.
  • Later code fixes were CPU-verified; those GPU results have not been relabeled as a new-head evaluation.

Remaining validation limits

  • Full simulator CI and the license audit remain unrun; self-hosted runner setup is deferred.
  • Fresh-install and optional-extra checks remain limited by vendor wheel upload-date metadata.
  • Sim2Real and distillation are expected to work but have not yet been tested on the new stack.

@github-actions github-actions Bot added documentation Improvements or additions to documentation infrastructure asset labels Sep 16, 2026
@greptile-apps

greptile-apps Bot commented Sep 16, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 5/5

[High risk] Updates build, CI, and dependency versions across the project.

No outstanding review finding was established that blocks merging.

Summary

UWLab 2.0 moves to the pinned Isaac Lab 3.0 EA / Isaac Sim 6.1 stack. Since the previous review, this PR selects RL-Games for camera tuning, restores requested URDF/MJCF output filenames through USD entry layers, and batches OmniReset OBB visualization. The previous Greptile threads are resolved.

Reviews (5) · Last reviewed commit: "Batch OBB geometry and debug drawing"

Comment thread uwlab.sh Outdated
@JTran-UW
JTran-UW force-pushed the port_isaaclab3 branch 3 times, most recently from 343d538 to 6d4047e Compare September 18, 2026 12:26
Hard switch: `main` becomes Isaac Lab 3.0 only. Isaac Lab 2.3.2 / rsl-rl 3.1.2
setups are no longer supported by this tree, and the cloud assets keep a separate
2.x line (see "Assets" below), so existing 2.x users are unaffected until they
update. The Newton (MuJoCo-Warp) backend is a separate, later PR.

## Pins

| | |
|---|---|
| Isaac Lab | `ffff603e` (3.0.0-beta2.patch1), pinned in `uwlab.sh` |
| Isaac Sim | 6.0.1.0 (Python 3.12 wheels only) |
| torch | 2.11.0+cu128 (isaacsim-core 6.0.1 requires 2.11.0; the default PyPI wheel is CUDA 13 and silently disables the GPU on 12.x drivers) |
| rsl-rl-lib | `JTran-UW/rsl_rl@f2c944d` (`port_rsl_rl_5` = `feature/locomotion`, the 5.2 API plus `GSDEGaussianDistribution`, plus a gSDE sampling fix; re-pin to `UW-Lab/rsl_rl` after that PR merges) |
| wandb | `<0.20` while rsl_rl still passes the removed `Settings(start_method=...)` |

`uwlab.sh` installs the twelve Isaac Lab 3.0 packages plus `isaaclab_rl[all]` (3.0
split the core; a 4-package install fails on `ModuleNotFoundError: isaaclab_physx`
even when the backend is PhysX) and fails fast if the pinned Isaac Lab predates the
rsl-rl 5.0 API. Bump the Isaac Lab and rsl-rl pins together.

## Quaternions: (w, x, y, z) -> (x, y, z, w)

The single largest source of silent breakage. 3.0 adopted Warp/PhysX/Newton's
element order, so a 2.x literal is a different rotation, not an error: `(1, 0, 0, 0)`
now reads as 180 degrees about X.

- Config literals converted across the locomotion env cfgs, the omnireset scene and
  variant cfgs, `assembly_keypoints.Offset` and the UR5e/Robotiq asset.
- `RelCartesianOSCAction` builds its delta quaternion scalar-last before `quat_mul`.
- The RGB data-collection and camera-alignment cfgs: table/support init states, the three
  calibrated camera extrinsics and the camera-randomization `base_rotation`s. The sim2real
  docs now say to reorder values pasted from diffusion_policy's extrinsics script.
- Recorded data carries the convention: the dataset handler stamps
  `quat_convention: xyzw`, and the reset/grasp/partial-assembly loaders plus
  `read_metadata_from_usd_directory` refuse anything unstamped rather than applying
  a rotated pose.
- `WARN_ON_TORCH_QUATF_ACCESS=1` is the runtime finder for anything missed.

Not yet audited: roughly fifteen quaternion literals in `factory_extension` and the
`xarm_leap` / `leap` / `tycho` / `xarm_uf_gripper` assets. Those tasks will spawn
rotated until someone goes through them.

## Assets (HuggingFace `UW-Lab/uwlab-assets`)

`metadata.yaml` offsets and the recorded datasets are convention-bearing, so the 3.0
versions live on a branch instead of overwriting `main`:

- `main` - unchanged 2.x assets and `Datasets/OmniReset`.
- `isaaclab3` (`8892962`) - the twenty `metadata.yaml` files with every `quat`
  reordered and stamped, plus `Datasets/OmniReset_isaaclab3` (the reset, grasp and
  partial-assembly datasets, converted and stamped).

`uwlab_assets.UWLAB_CLOUD_ASSETS_REVISION` pins that commit rather than tracking a
branch, so asset changes are opt-in; the download cache is keyed by revision so a
bump never serves a file cached from another one. Policies, media and STL links stay
on `main` - they do not depend on the convention.

## Warp-backed simulation data

`asset.data.*` is a `ProxyArray` over a `warp.array`. Its deprecation bridge covers
most torch ops, but not tensor instance methods or `torch.jit.script`'d functions
such as `isaaclab.utils.math`, so those call sites use `.torch` (as Isaac Lab's own
mdp code does). Physics-view accessors (`root_view.get_masses`,
`get_material_properties`) return raw `wp.array` and go through a small `_as_torch`
helper. `root_view` replaces the deprecated `root_physx_view`.

## Physics configuration

`SimulationCfg.physx` is gone with no shim: the backend is chosen by assigning a
`PhysicsCfg` subclass, so the four omnireset cfgs now set
`sim.physics = PhysxCfg(...)`. Field names are unchanged and the tuned values
(192 position iterations, friction thresholds) are untouched.

## rsl-rl 5.x

- The agent cfg declares explicit `actor` / `critic` model cfgs instead of the legacy
  `policy` cfg: gSDE is its own distribution class in 5.x, and the legacy path only
  forwards `std_type` ("scalar"/"log").
- `GsdeDistributionCfg` / `RslRlGsdePpoAlgorithmCfg` in `uwlab_rl` expose the gSDE
  constructor kwargs and `sde_sample_freq`. The omnireset agent sets
  `sde_sample_freq=1`: 5.x gSDE holds the exploration matrix fixed for a whole
  rollout, while the recipe this task was tuned with drew fresh noise every step and
  insertion depends on that dither. Only sampling changes - mean, std, log-prob and
  entropy are identical.
- `learn_features=True`: the rsl-rl 3.x recipe and the 3.0 control let the PPO gradient
  flow from the state-dependent std into the backbone; rsl_rl 5.x's class detaches it by
  default. With the detach, the adaptive-KL schedule floors the learning rate at
  iteration 0 and the std runs away (entropy 8 -> 34 in 84 iterations at 4096 envs;
  reproduced at 14336x4). With the flag, LR, entropy and reward track the control.
  Requires the rsl_rl sampling fix in `port_rsl_rl_5` (`learn_features=True` raised
  "Inference tensors cannot be saved for backward" as shipped).
- `RslRlFancyActorCriticCfg` must stay an alias, not a subclass: `isaaclab_rl`'s
  `policy` -> `actor`/`critic` shim dispatches on an exact type check, so a subclass
  leaves `actor` MISSING and surfaces much later as `KeyError: 'class_name'`.
- `play.py` exports ONNX through the runner. The JIT export goes through
  `uwlab_rl.rsl_rl.exporter`, rewritten for the 5.x `MLPModel`: it snapshots the
  normalizer, the MLP and the distribution's evaluated std (gSDE state-dependent, log or
  scalar) into a CPU TorchScript module with `forward` (mean) and
  `compute_distribution` (mean, std), which `scripts_v2/tools/collect_demos.py` samples
  from. rsl_rl's own JIT export carries the mean only.
- `collect_demos.py --deterministic` is now `--deterministic_expert`: Isaac Lab 3.0's
  `AppLauncher` owns `--deterministic` (RTX determinism) and rejects duplicate flags.

## Other API moves on the omnireset pipeline

- `write_joint_armature_to_sim` / `write_joint_friction_coefficient_to_sim` are deprecated
  shims that forward only the static coefficient; the finetune/ADR events use the `_index`
  methods, which keep the `joint_dynamic_friction_coeff` / `joint_viscous_friction_coeff`
  kwargs the sysid parameters need (PhysX backend, Isaac Sim >= 5.0).
- `ArticulationData.body_incoming_joint_wrench_b` is gone: `binary_force_contact` reads a
  `JointWrenchSensor` added to the RGB scene cfg (`find_bodies` maps the body name).
- Isaac Sim 6 material templates do not pre-author `diffuse_texture` / `diffuse_tint` /
  `diffuse_color_constant`, and USD 25.11 refuses `Set()` on an untyped attribute; the
  visual-appearance randomizer creates them up front like the other inputs.

## Isaac Sim 6.0.1 API moves

`isaacsim.core.utils.*` is no longer importable (enabling the extension no longer
joins `sys.path`): bounds helpers come from `isaacsim.core.experimental.utils.bounds`
(`compute_obb` takes the prim first, `bbox_cache` keyword-only), `enable_extension`
from `isaacsim.core.experimental.utils.app`, prim helpers from
`isaaclab.sim.utils.legacy`, seeding from `isaaclab.utils.seed.configure_seed`, and the
replicator `enable_extension` in the visual-appearance randomizer from the same `app` module.

## pytorch3d

Imported lazily and pinned per interpreter, because it ships only as a wheel built
against an exact python/torch/CUDA combination. Its one caller is the collision
analyzer used by the dataset-generation tasks, so the RL tasks stay usable without
it. cp312 takes the pt2.10.0 build (no pt2.11 build is published); its CUDA ops were
verified against torch 2.11.0.

## Verification

- `OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-v0` and `UW-Velocity-Flat-Spot-v0`
  build and step with finite rewards, with every asset, metadata file and dataset
  fetched from the pinned asset revision.
- A 2.x-trained expert scores 90.5 / 95.0 / 80.3 / 97.7 percent across the four reset
  types in the 3.0 env, matching its 2.x numbers - the end-to-end check that poses,
  offsets and frames survived the conversion.
- 12 PPO iterations with `GSDEGaussianDistribution` (`learn_features=True`): LR recovers
  to 8.6e-4, entropy 8.2 -> 9.5, reward -0.2 -> 5.2, all matching the control at the
  same iterations; the shipped default diverges (see rsl-rl 5.x above).
- `play.py` loads a 3.0 checkpoint and exports; the JIT and ONNX artifacts load and
  map obs(215) -> actions(7).
- The dataset-generation pipeline (partial assemblies, grasp sampling, all four reset-state
  tasks), the Finetune task (ADR reset writes armature and static/dynamic/viscous friction)
  and the RGB data-collection, RGB-Play and RGB-OOD-Play tasks with cameras all build and
  step in a fresh install; `collect_demos.py` loads a 3.0-exported expert and rolls out.
- `pre-commit run` is clean on every changed file.

## Follow-ups

- Checkpoints trained under 2.x do not load in the rsl-rl 5.x runner
  (`KeyError: 'actor_state_dict'`); the published `Policies/` experts and finetuned
  policies are to be regenerated on 3.0.
- Not ported (outside the OmniReset pipeline, will fail on 3.0 as-is): `sim.physx.*` in
  the locomotion (`advance_skills`, `risky_terrains`, `velocity`) and `track_goal` cfgs;
  `isaacsim.core.utils` imports in `scripts/tutorials`, `scripts/tools` and
  `scripts/environments/state_machine`; `root_physx_view` in the generic
  `uwlab` IK action and `diagnosis` terms; `factory_extension` and the
  `xarm_leap` / `leap` / `tycho` / `xarm_uf_gripper` assets keep 2.x quaternion literals.
- A fresh `./uwlab.sh -i` per the updated docs was exercised once (all packages resolved;
  the VS Code setup step needs `OMNI_KIT_ACCEPT_EULA=YES` when there is no TTY).
- `RslRlFancyPpoAlgorithmCfg`'s `behavior_cloning_cfg` / `offline_algorithm_cfg` are consumed by
  `scripts_v2/tools/collect_demos.py` (expert loader, observation group, expert path), not by
  rsl-rl; `collect_demos.py` strips them before constructing the runner. Unchanged here.
- Published policies under `Policies/` were trained on 2.x and are unchanged.

## Review follow-up: the rest of the repository

The first revision ported OmniReset and the install stack; everything else registered in
`uwlab_tasks` or shipped under `scripts/` is now on 3.0 too, so the repository-wide pin
leaves nothing behind:

- **`sim.physics = PhysxCfg()`** replaces `self.sim.physx.*` in the locomotion envs
  (velocity, advance_skills, risky_terrains), TrackGoal and the factory extension.
- **Warp-backed accessors**: the generic IK action and the NIST OSC action read
  `data.body_link_jacobian_w.torch` / `data.mass_matrix.torch` instead of
  `root_physx_view.get_jacobians()` / `get_generalized_mass_matrices()`; the diagnosis helpers
  use `data.joint_effort_limits` / `data.joint_vel_limits` and `root_view` for the two
  view-only quantities.
- **`isaacsim.core.utils` (deprecated in Isaac Sim 6.0.1, no longer imported by Isaac Lab)**
  replaced by `isaaclab.sim.utils` (`create_prim`, `open_stage`, `get_current_stage`,
  `find_matching_prim_paths`, `legacy.get_prim_at_path`/`define_prim`) and direct Kit calls
  (viewport creation, carb settings, `enable_extension(..., enabled=False)`).
- **Scalar-last quaternions** in the remaining asset and task configs: leap, xarm_leap,
  xarm_uf_gripper, tycho, franka IK offsets, factory assets and assembly keypoints,
  TrackGoal table, cartpole camera offsets (33 literals).
- **`.torch` on every `.data` read** in the factory extension, TrackGoal and locomotion task modules (81 sites); `ProxyArray` forwards float tensors, but warp-`quatf` arrays and TorchScript-typed math helpers reject it.
- **Vendored Isaac Lab scripts** (`scripts/tutorials/*`, `scripts/environments/state_machine/*`)
  replaced by their Isaac Lab 3.0 versions (UWLab header kept); the converters and
  `check_instanceable.py` patched in place.
- **PhysX 64K material cap**: PhysX 110 instantiates every USD `PhysicsMaterialAPI` prim once per cloned env (PhysX 107 shared them). The UR5e USD authors two (inner-finger `PhysicsMaterial`, unbound `fingertip_material`), which with the two object materials capped a process at 16384 envs. `spawn_ur5e_without_physics_materials` (from Yanda's port) unbinds and deactivates them at spawn; the `robot_material` randomizer already overwrote the pad friction at startup on 2.x and 3.0 alike, so grasp physics is unchanged (combine mode verified). Measured per-process ceiling on the peg/peghole scene: 31744 envs build, 32766 overflows (2 object materials per env remain; the ADR buckets are per shape). The documented 16384/GPU has 2x headroom; 2 x 32768 hangs at scene creation.
- **Packaging**: extension versions bumped with changelog entries (uwlab 0.9.0, uwlab_assets
  0.6.0, uwlab_rl 0.2.0, uwlab_tasks 0.14.0); pytorch3d moved to the `uwlab_tasks[collision]`
  extra, which `uwlab.sh -i` installs on linux x86_64 (the collision analyzer is only used
  by dataset generation, and `omnireset/mdp/utils.py` imports it lazily).

Verified headless on Isaac Sim 6.0.1: the replaced tutorial/state-machine scripts run, and
`UW-Velocity-Flat-Spot-v0`, `UW-Position-Pit-Spot-v0`, `UW-Track-Goal-Ur5-{JointPos,IkAbs}-v0`,
`UW-TrackGoal-XarmLeap-JointPos-v0`, `UW-PegInsert-Franka-JointPos-v0` and `Isaac-Cartpole-RGB-v0`
build, reset and step with finite rewards, as do `UW-NutThread-Franka-JointPos-v0`, `UW-Track-Goal-Tycho-IkAbs-v0`, `UW-Velocity-Rough-Spot-v0` and `UW-Position-Gap-Spot-v0`. Pre-existing, unrelated to the port: the `UW-TrackGoal-XarmLeap-*` tasks 404 at import (`dataset/misc/hammer_grasping_pca_components.npy` does not exist on any revision of the HF repo), and the Franka tutorials/state machines cannot download `Assets/Isaac/6.0/.../panda_instanceable.usd` from the Isaac 6.0 asset bucket. (`uwlab/uwlab/assets/articulation` is UWLab's own
view abstraction and is untouched.)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
patrickhaoy and others added 16 commits September 20, 2026 23:33
- Pin cloud assets to uwlab-assets isaaclab3 @ 5ea494f, which adds the Isaac Lab 3.0
  state experts: the best checkpoint per (task, seed) for seeds 42/43/44 of all six tasks.
- Docs: pretrained-checkpoint commands download those experts from the isaaclab3 branch,
  with seed 42/43/44 tabs for every task; note that rectangle-on-wall plateaus at about
  62-65% end-of-episode success on all three seeds.
- Pin rsl-rl-lib to bump_rsl_rl_5_3 (UW-Lab/rsl_rl#6, upstream v5.3.0), which carries
  HeteroscedasticGaussianDistribution; drop the gSDE configs that version does not provide.
- JIT exporter: support heteroscedastic Gaussian actors (mean from forward, per-state std
  clamped as in training from compute_distribution).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019ogU9ju7PGwhFwKH11djAC
Success-rate-vs-updates and vs-wall-clock figures for all six tasks, seeds 42/43/44 on 4x L40S,
from the runs the published 3.0 experts were selected from. Retries and continuations are
stitched per seed; the first 30 iterations after a resume are dropped because the logged
success window restarts empty, and unlogged stretches before a continuation are left as gaps.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019ogU9ju7PGwhFwKH11djAC
…oint sections

Docs: remove the pre-finetuned (sys-id) expert and pretrained RGB policy sections, whose
checkpoints are Isaac Lab 2.x only, and the references to them. Add pandas to the
distillation install line: loading a diffusion_policy checkpoint imports its training
workspace, whose json_logger imports pandas, and diffusion_policy does not declare it.

Tools, each verified by re-running the documented command:
- collect_fk_pairs.py: save ee_quat as (w, x, y, z) for diffusion_policy's
  test_fk_comparison.py (was 3.0 xyzw: 121-179 deg rotation error, still reported PASS).
- sysid_ur5e_osc.py, plot_sysid_fit.py: convert the real-robot collector's (w, x, y, z)
  waypoint quats to xyzw on load (hold-pose recording: 53 deg RMSE before, 0 after).
- eval_robustness.py: rsl-rl 5.x runner.alg.actor.
- align_cameras.py: print the paste-ready rot in (x, y, z, w).
- ZarrDatasetFileHandler.write_episode: accept the dataset_compression argument
  Isaac Lab 3.0's RecorderManager passes (RGB demo collection crashed at the first save).
- .torch accessors and flake8 E226 in the touched sim2real scripts.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019ogU9ju7PGwhFwKH11djAC
Use a matched Isaac Sim 6.1, Isaac Lab EA and RSL-RL 5.4.1 stack.
Keep the existing physics recipe and migrate renderer and registration APIs.
Adopt EA observation order with converted experts and a CPU migration tool
that preserves actor, critic, normalizer and Adam state. Refresh the
requested training plots and retain the documented task regressions.

Verified dependency consistency, CPU checkpoint/optimizer equivalence,
strict loading, all 18 bounded policy checks, registration/layout tests,
pre-commit and the warning-free documentation build.
Merge the current main branch while retaining the matched EA dependency
pin and extension version. Preserve main's historical pinning release
note and both parent histories. Keep the license heading unambiguous to
the merge-conflict check without changing its rendered meaning.
Select the FactoryV2 USD without replacing the original asset. It authors
outer-knuckle mass and inertia on the rigid bodies, prevents the camera
safety volume from adding phantom mass, and includes passive-link
armature and the calibrated fingertip TCP. Keep the immutable HF pin
and unchanged arm calibration; document the dynamics change.

Addresses UW-Lab#38 and UW-Lab#40. Authored MassAPI properties and remote asset
hash verified; bounded live readback and checkpoint checks are recorded
separately before publication approval.
Clear ProgressContext counters only for the selected environment IDs.
Preserve full-reset semantics for None and make an empty selection a
no-op. Regression tests cover partial, empty, full and repeated resets
without replacing the counter tensor.

Fixes UW-Lab#41. The exact source method failed the partial/empty CPU fixtures
before the fix and passed all four fixtures afterward.
Resolve concrete USD roots instead of rewriting legacy wildcard strings.
Keep natural environment-index order for batched geometry. Use scalar-last
collider quaternions and hash complete transforms so geometry caches do
not reuse different collider poses.

The grasp startup failed before stepping on the EA namespace regex.
CPU fixtures reproduced the invalid path and quaternion mismatch before
the fix, then passed both legacy and EA paths plus transform-hash checks.
No object mass, grasp force or success threshold was changed here.
Remove the ineffective 1 g object override from the default and all six
variant configurations. Let authored or geometry-derived mass properties
remain in effect instead of requesting a setting these assets ignore.

Addresses UW-Lab#42. Paired 64-environment checks retained identical live
masses and byte-identical saved grasp datasets for all six objects, with
17-33 valid grasps each and unchanged gravity, force and collision checks.
The source-configuration regression failed before and passed after.
Use wrist motor armature from the pinned robot metadata while retaining
Stage-1 shoulder and elbow dynamics, gains, action scales and policy rate.
The corrected lightweight gripper exposed persistent wrist motion in the
previous zero-armature model. Keep that startup inertia through the ADR
ramp rather than clearing it at zero progress.

Pin the semantically integrated RSL-RL 5.4.1 fork after resolving target
conflicts. CPU regressions cover selected-joint metadata application and
ADR endpoints; the full frozen checkpoint pass qualifies this candidate
separately after the commit.
Restore the original UR5e USD and disable added wrist armature by default.
Defer issues UW-Lab#38 and UW-Lab#40 after matched minimal-asset tests showed large
performance regressions. Keep the EA upgrade, converted checkpoints,
RSL integration and separate UW-Lab#41/UW-Lab#42 fixes unchanged.

Retain experimental assets and results without making them release
defaults. Add regression checks for both restored configuration choices
and update the robot download link and release notes.
Follow the metadata-clean RSL integration while retaining its exact
validated source tree. Update the extension patch version and document
the dependency refresh without changing runtime behavior.
Check the common asset interfaces instead of factory classes so grasp
and reset-state generation cannot silently skip velocity filtering.
Use explicit tensor views for collection velocities and cover both
success gates, moving assets, and consecutive-stability resets.

All four CPU regression cases fail without the fix and pass with it.
Document that affected datasets need regeneration.
Scope the upgraded UWLab stack to the separate RSL-RL 5.x actor and
critic model API without restoring the legacy combined ActorCritic.
Keep checkpoint-layout conversion and distribution-aware exports.

Bump uwlab_rl to 0.2.4 and document the older-caller migration boundary.
Pin the official UW-Lab RSL 5.4.1 release and align release metadata,
installation guidance, and CI defaults with Python 3.12 and Sim 6.1.
Retain the prepared backend-aware type fix and stock Isaac Lab
initialization, without restoring legacy RSL APIs.

Guard local Isaac Lab checkout changes with CPU regressions. Isolate
CI license installs and job-owned Docker resources instead of deleting
shared host caches, images, or containers. Pin existing workflow action
versions without changing workflow permissions or license policy.
@patrickhaoy patrickhaoy changed the title Port UWLab to Isaac Lab 3.0 Prepare UWLab 2.0 for Isaac Lab 3.0 EA / Sim 6.1 Sep 27, 2026
@patrickhaoy

Copy link
Copy Markdown
Collaborator

@greptileai Please re-review current head a5c7b33885c931605d456f559400427198ddf08a and the updated PR description. The existing summary was reviewed on 19b7fd8e5ac5d8069bc7b1c1fe88742cdcc28caa and predates the later port and release-preparation changes.

I checked the concrete examples in discussion_r4023828060 against current source and the GitHub comparison with that reviewed commit:

  • Locomotion and TrackGoal configs now import isaaclab_physx.physics.PhysxCfg, initialize self.sim.physics when needed, and configure that object instead of removed self.sim.physx.
  • The generic IK action now uses self._asset.data.body_link_jacobian_w.torch; the old root_physx_view accessor is no longer used there. Diagnosis terms use root_view with the array conversion helper.
  • scripts/tools/convert_urdf.py imports open_stage from isaaclab.sim.utils after AppLauncher starts, instead of isaacsim.core.utils.stage.
  • XarmLeap's articulation initial rotation and frame offset use scalar-last identity (0,0,0,1), replacing (1,0,0,0).
  • A Python-source search found no remaining executable uses of those three old API spellings; remaining matches were an autodoc mock string and an old docstring parameter name.
  • Package versions/changelogs were updated, and pytorch3d is declared under the optional collision extra rather than as a mandatory dependency for every caller. The installer opts into that extra for its supported collision-tool path.

These findings support updating the old review's concrete examples; they do not establish that every registered task, controller path, or standalone tool has been runtime-qualified. Please identify any remaining current-head migration problems rather than treating the old review as automatically resolved. I have not dismissed or resolved its thread.

CI approval has now been granted by the maintainer. The docs build passed; other jobs are running/queued at the current snapshot. The link checker failed with 77 reported errors, including obsolete task-source URLs and external 403s. Those failures are not suppressed. The package-age metadata limitation documented in the PR also remains explicit. The modern merge and v2.0.0 tag remain on hold.

Replace the stale copied Isaac Lab catalogue with its maintained
browser and pinned source references, keeping the UW task catalogue.
Correct moved ROS, Omniverse, and upstream issue links and stop
advertising a Windows helper that is not shipped in this repository.

Keep link-checker rules unchanged. The full local scan found only two
transient GitHub 503s; both targets passed the focused recheck. The
strict documentation build passes.
Move fifteen avoidable local imports in helpers and tests while keeping
optional collision dependencies and extension-activation boundaries
lazy. Update the tasks package release metadata without changing task
configuration or function logic.

The dependency-name sets and non-import ASTs are unchanged. Three
renderer configuration checks and four backend stability cases pass
on CPU. This does not claim blanket compliance for the remaining
lazy and type-checking boundaries across the port.
@patrickhaoy

Copy link
Copy Markdown
Collaborator

@greptileai Please review the focused follow-ups at e933b66415f328219e47bd25a71e06241af56410.

  • 4217c1b repairs the documentation references. The copied upstream environment table described an older task layout and linked to nonexistent UWLab files; it is replaced by the maintained upstream browser, exact pinned source references, and local discovery instructions. UWLab's own environment catalogue is unchanged. Moved ROS/Omniverse references, wrong upstream issue links, and the nonexistent Windows batch-helper documentation are corrected. No link-check exclusions or accepted-status changes were made.
  • e933b66 moves 15 avoidable function-local imports in the OmniReset helpers/tests to module scope, with uwlab_tasks 0.14.9 release metadata. Dependency-name sets and non-import ASTs are identical. Test SDK imports remain after AppLauncher at module scope. Three renderer-configuration and four backend-stability cases pass on CPU; pre-commit and the strict Sphinx build pass.

The remaining import finding is not declared fully resolved. PyTorch3D remains lazy because the repository's heavy-dependency rule explicitly forbids loading it at module import time; Replicator/debug/viewport integrations also have extension-activation constraints. Existing cfg/type-checking and cycle-sensitive boundaries across the port still need per-call-site assessment. I have not changed the review configuration, replaced imports with a syntactic workaround, or dismissed the finding. Please distinguish these boundaries from avoidable imports rather than recommending a blanket hoist that breaks optional dependencies or startup order.

Using the same Lychee 0.24.2 version locally, the full edited-tree scan had only two transient GitHub 503 errors; both exact targets passed a focused recheck. New-head CI remains authoritative and is not claimed green yet.

Runner infrastructure remains separate: the repository runner API reports zero runners, and the organization runner API is inaccessible to this login (403). No runners, labels, permissions, or checks were changed to bypass that. Modern merge and v2.0.0 remain on hold; legacy v1.3.0 is already published.

Use the already-converted EA experts from the pinned asset revision
instead of shipping beta migration tooling in the upcoming release.
Keep the environment observation-order regression and all published
checkpoint metadata and historical provenance intact.

Remove the quick-start conversion box and obsolete README guidance,
bump uwlab_rl to 0.2.6, and note that distillation and sim-to-real are
expected but not yet tested on Isaac Lab 3.0, with v1.3.0 as the legacy
reference.
Use isaaclab3 as the canonical Hugging Face branch for the Sim 6.1
release. It fast-forwards to the already-verified EA snapshot, so the
commit pin, checkpoint hashes, robot assets and runtime logic stay
unchanged.

Update publisher guidance and uwlab_assets release metadata to 0.6.4.
Keep main as the legacy Isaac Lab 2.x asset line.
@patrickhaoy

Copy link
Copy Markdown
Collaborator

HF asset-branch consolidation is complete, with this PR updated to f4d864ac2d32c1c3c8362e7a26f17dd95cd71176.

  • Fast-forwarded UW-Lab/uwlab-assets:isaaclab3 from c755e803b789b71deae0eb977afde983db828067 to the existing verified snapshot 83860532010b2737aa80d6e8621235ee554186f0 (Git tree eea187ac1c3a103e967447cb5852f494daa329a6). There were no divergent commits, new checkpoint conversions or uploads, or history rewrites.
  • Verified all18 state-expert LFS hashes against the corrected publication manifest, along with the layout/optimizer metadata and optional versioned asset. The original robot and datasets are unchanged; the optional _v2.usd remains non-default.
  • Removed the redundant isaaclab3-ea branch only after promotion and active-reference migration. The pinned 838605... commit remains reachable through isaaclab3, and the18 checkpoint hashes were rechecked after deletion.
  • HF main and HF tag v1.2.0 remain at f9486a69b30a38355c1c2415fc15f6d6be8cb5b3.
  • The UWLab pin and download URLs deliberately keep the same immutable SHA. Updated branch descriptions/upload guidance and uwlab_assets metadata to0.6.4. Executable asset-module AST, pin and URL/cache contract are unchanged. Targeted CPU/configuration checks, pre-commit and strict docs build passed.

No new GPU qualification or training was performed. This is not a UWLab merge or a v2.0.0 release tag; those remain on hold.

Keep vendored examples aligned with the dependency this release installs.
Mirror the complete tutorial tree from ae37b028ea415c91ea2bc32609efcd759ed2b974,
including upstream headers, new deployment/visualizer examples, and removal
of the obsolete rendering-mode tutorial.

Verify exact subtree identity, Python syntax for all 25 files, repository
pre-commit and the strict docs build. This does not claim new simulator
qualification of the tutorial catalogue.
Refresh existing upstream utilities and their required companions from
ae37b028ea415c91ea2bc32609efcd759ed2b974 while preserving UW task registration
and the documented per-framework RL entrypoints. Replace obsolete lifting
and checkpoint-management scripts with their maintained upstream versions.

Keep UW and OmniReset environments visible in the kitless listing tool.
Honor explicit RSL experiment/device options and preserve configured resume
state when the flag is absent. Add focused CPU regression coverage without
changing task physics, policy mode, checkpoint loading or custom exports.
@patrickhaoy

Copy link
Copy Markdown
Collaborator

@greptileai Please review the current head 0ba08e7a545685cb83db75f72005f28c5969244c, especially the generic-script alignment with pinned Isaac Lab ae37b02, the retained UW registration hooks, and the narrow RSL CLI configuration fixes. The documented per-framework RSL paths, UW Hydra variants, checkpoint loading, policy mode and distribution-aware export are preserved.

The PR description now includes the source-parity checks, focused CPU regressions, validation limits, and fresh local evaluation results: the documented one-environment leg example completed 20/20 successes; all 18 task/seed comparison cells completed, with 15 matching the frozen reference counts exactly and three higher observed rates. No cell declined; weak rectangle results remain explicitly reported. These are bounded local results, not blanket runtime qualification of the full script/backend catalogue. Current-head GitHub workflows still await maintainer approval; no checks or policies were bypassed. No merge or release tag has been made.

Comment thread scripts/reinforcement_learning/ray/tuner.py
Comment thread scripts/tools/convert_urdf.py Outdated
Comment thread scripts/tools/convert_mjcf.py
Select RL-Games explicitly for camera tuning overrides and reject a
conflicting backend instead of applying them to an RSL agent.

Write the requested USD entry filename while retaining the importers'
structured assets and relative references. Preserve layer metadata and
reject aliases that could overwrite the generated source layer.

Cover the CLI contracts and composed USD output with CPU regressions.
Keep corner computation on the input device and submit whole environment
batches to the optional debug renderer instead of looping over environments
and edges with repeated host copies. Preserve corner order, float32 output,
and the existing overlap decision and reset behavior.

Add CPU differential and transfer-boundary regression coverage and release
uwlab_tasks 0.14.10 metadata for the change.
@patrickhaoy

Copy link
Copy Markdown
Collaborator

@greptileai Please re-review current head 612f3f28b6a259b3f1bd75732b36e4bf687980fa. The four findings from the 0ba08e7 review are addressed in 653ddc6 (Ray camera backend and converter filename contracts) and 612f3f2 (batched OBB geometry/debug drawing), with detailed replies on each thread.

32 targeted CPU cases passed, with the new failure cases reproduced before fixes; 2,048 additional corner comparisons match the installed Isaac Sim implementation within the stated float tolerance. The actual termination decision/reset/init/cache logic is unchanged. Pre-commit, critical-error Flake8 and strict docs passed. The PR description distinguishes intentional downstream compatibility adapters from exact upstream copies and keeps the earlier GPU results tied to their tested 0ba08e7 candidate. No merge/tag, issue closure, review-policy change or additional GPU campaign was performed.

Consolidate the PR-only changelog history into one final-state entry per
package while preserving released entries and current version numbers.
Remove intermediate pin and withdrawn tooling notes, retain migration
guidance, and align the documentation badge with Isaac Sim 6.1.0.
Use the first minor-release version for each extension instead of treating
PR iterations as released patches. Keep package metadata and consolidated
changelog headings aligned without changing runtime code, dependency pins,
the root 2.0.0 version, or released history.
@patrickhaoy
patrickhaoy merged commit 8c872eb into UW-Lab:main Sep 28, 2026
6 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

asset documentation Improvements or additions to documentation infrastructure

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants