From a4e6862bc411d3062484d276be67f4dc7a1a5a8b Mon Sep 17 00:00:00 2001 From: Joshua Tran Date: Tue, 15 Sep 2026 11:59:44 -0700 Subject: [PATCH 01/27] Port UWLab to Isaac Lab 3.0 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 --- .greptile/rules.md | 3 + CONTRIBUTORS.md | 1 + README.md | 4 +- docs/conf.py | 4 +- .../publications/omnireset/new_task.rst | 19 +- .../publications/omnireset/rl_training.rst | 132 +++++----- .../publications/omnireset/sim2real.rst | 14 +- .../include/pip_python_virtual_env.rst | 24 +- .../include/src_python_virtual_env.rst | 3 +- docs/source/setup/installation/index.rst | 17 +- .../setup/installation/pip_installation.rst | 8 +- environment.yml | 2 +- .../state_machine/lift_cube_sm.py | 25 +- .../state_machine/lift_teddy_bear.py | 25 +- .../state_machine/open_cabinet_sm.py | 26 +- scripts/reinforcement_learning/rsl_rl/play.py | 29 +-- scripts/tools/check_instanceable.py | 13 +- scripts/tools/convert_mesh.py | 4 +- scripts/tools/convert_mjcf.py | 4 +- scripts/tools/convert_urdf.py | 4 +- scripts/tutorials/00_sim/spawn_prims.py | 3 +- scripts/tutorials/01_assets/add_new_robot.py | 47 ++-- .../tutorials/01_assets/run_articulation.py | 27 ++- .../01_assets/run_deformable_object.py | 105 +++++--- .../tutorials/01_assets/run_rigid_object.py | 17 +- .../01_assets/run_surface_gripper.py | 32 ++- scripts/tutorials/02_scene/create_scene.py | 23 +- .../04_sensors/add_sensors_on_robot.py | 29 ++- .../04_sensors/run_frame_transformer.py | 32 ++- .../tutorials/04_sensors/run_ray_caster.py | 17 +- .../04_sensors/run_ray_caster_camera.py | 14 +- .../tutorials/04_sensors/run_usd_camera.py | 41 ++-- .../tutorials/05_controllers/run_diff_ik.py | 34 +-- scripts/tutorials/05_controllers/run_osc.py | 57 +++-- scripts_v2/tools/collect_demos.py | 6 +- scripts_v2/tools/record_grasps.py | 5 +- scripts_v2/tools/record_partial_assemblies.py | 8 +- scripts_v2/tools/record_reset_states.py | 5 +- scripts_v2/tools/sim2real/collect_fk_pairs.py | 4 +- scripts_v2/tools/sim2real/plot_sysid_fit.py | 6 +- scripts_v2/tools/sim2real/sysid_ur5e_osc.py | 6 +- scripts_v2/tools/visualize_reset_states.py | 7 +- source/uwlab/config/extension.toml | 2 +- source/uwlab/docs/CHANGELOG.rst | 11 + .../uwlab/assets/articulation/articulation.py | 6 +- source/uwlab/uwlab/devices/teleop.py | 20 +- .../uwlab/uwlab/envs/diagnosis/diagnosis.py | 26 +- .../actions/default_joint_static_action.py | 4 +- .../envs/mdp/actions/task_space_actions.py | 8 +- .../visualizable_joint_target_position.py | 15 +- .../envs/mdp/commands/categorical_command.py | 4 +- source/uwlab/uwlab/envs/mdp/events.py | 20 +- source/uwlab/uwlab/envs/mdp/rewards.py | 10 +- source/uwlab/uwlab/envs/mdp/terminations.py | 4 +- source/uwlab/uwlab/envs/real_rl_env.py | 4 +- source/uwlab/uwlab/envs/ui/base_env_window.py | 2 +- .../envs/ui/viewport_camera_controller.py | 6 +- .../uwlab/sim/converters/mesh_converter.py | 4 +- .../spawners/materials/physics_materials.py | 2 +- .../spawners/materials/visual_materials.py | 2 +- source/uwlab/uwlab/ui/widgets/line_plot.py | 2 +- .../ui/widgets/manager_live_visualizer.py | 2 +- .../datasets/torch_dataset_file_handler.py | 15 +- source/uwlab_assets/config/extension.toml | 2 +- source/uwlab_assets/docs/CHANGELOG.rst | 10 + source/uwlab_assets/uwlab_assets/__init__.py | 43 +++- .../uwlab_assets/robots/franka/action.py | 4 +- .../uwlab_assets/robots/leap/leap.py | 4 +- .../uwlab_assets/robots/tycho/actions.py | 4 +- .../uwlab_assets/robots/tycho/tycho.py | 4 +- .../ur5e_robotiq_2f85_gripper.py | 50 +++- .../robots/xarm_leap/xarm_leap.py | 4 +- .../robots/xarm_uf_gripper/xarm_uf_gripper.py | 2 +- source/uwlab_rl/config/extension.toml | 2 +- source/uwlab_rl/docs/CHANGELOG.rst | 10 + source/uwlab_rl/setup.py | 16 +- source/uwlab_rl/uwlab_rl/rsl_rl/__init__.py | 8 +- source/uwlab_rl/uwlab_rl/rsl_rl/exporter.py | 228 +++++------------- source/uwlab_rl/uwlab_rl/rsl_rl/rl_cfg.py | 53 +++- source/uwlab_tasks/config/extension.toml | 2 +- source/uwlab_tasks/docs/CHANGELOG.rst | 11 + source/uwlab_tasks/setup.py | 42 ++-- .../direct/cartpole/cartpole_camera_env.py | 4 +- .../cartpole/cartpole_camera_env_cfg.py | 4 +- .../advance_skills/advance_skills_base_env.py | 13 +- .../advance_skills/config/spot/mdp/rewards.py | 20 +- .../locomotion/advance_skills/mdp/rewards.py | 12 +- .../risky_terrains/balance_beams_env.py | 2 +- .../locomotion/risky_terrains/mdp/rewards.py | 51 ++-- .../risky_terrains/stepping_beams_env.py | 2 +- .../risky_terrains/stepping_stones_env.py | 13 +- .../velocity/config/spot/flat_env_cfg.py | 2 +- .../velocity/config/spot/rough_env_cfg.py | 2 +- .../config/spot_with_arm/flat_env_cfg.py | 2 +- .../config/spot_with_arm/rough_env_cfg.py | 2 +- .../locomotion/velocity/mdp/curriculums.py | 2 +- .../locomotion/velocity/mdp/rewards.py | 18 +- .../locomotion/velocity/velocity_env_cfg.py | 9 +- .../factory_extension/assembly_keypoints.py | 22 +- .../factory_extension/factory_assets_cfg.py | 20 +- .../factory_extension/factory_env_base.py | 23 +- .../mdp/actions/task_space_actions_nist.py | 18 +- .../factory_extension/mdp/events.py | 10 +- .../factory_extension/mdp/observations.py | 20 +- .../omnireset/assembly_keypoints.py | 8 +- .../ur5e_robotiq_2f85/agents/rsl_rl_cfg.py | 36 ++- .../ur5e_robotiq_2f85/camera_align_cfg.py | 12 +- .../data_collection_rgb_cfg.py | 34 +-- .../ur5e_robotiq_2f85/grasp_sampling_cfg.py | 34 +-- .../partial_assemblies_cfg.py | 38 +-- .../ur5e_robotiq_2f85/reset_states_cfg.py | 54 +++-- .../config/ur5e_robotiq_2f85/rl_state_cfg.py | 48 ++-- .../omnireset/mdp/actions/actions_cfg.py | 4 +- .../mdp/actions/task_space_actions.py | 14 +- .../omnireset/mdp/collision_analyzer.py | 10 +- .../manipulation/omnireset/mdp/events.py | 127 ++++++---- .../omnireset/mdp/observations.py | 79 +++--- .../omnireset/mdp/recorders/recorders.py | 10 +- .../manipulation/omnireset/mdp/rewards.py | 8 +- .../omnireset/mdp/rigid_object_hasher.py | 6 +- .../omnireset/mdp/terminations.py | 70 +++--- .../manipulation/omnireset/mdp/utils.py | 31 ++- .../config/ur5/track_goal_ur5_env_cfg.py | 5 +- .../config/xarm_leap/track_goal_xarm_leap.py | 3 +- .../manipulation/track_goal/mdp/command.py | 11 +- .../manipulation/track_goal/mdp/rewards.py | 8 +- .../manipulation/track_goal/track_goal_env.py | 11 +- uwlab.sh | 114 ++++----- 128 files changed, 1442 insertions(+), 1158 deletions(-) diff --git a/.greptile/rules.md b/.greptile/rules.md index 71ebd9e5..1e26f041 100644 --- a/.greptile/rules.md +++ b/.greptile/rules.md @@ -135,6 +135,9 @@ Every entry-point string must resolve; `-Play-v0` variants normally reuse the tr 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. +- Assets consumed by Isaac Lab 3.0 live on that repository's `isaaclab3` branch (quaternions in + `(x, y, z, w)`); `main` keeps the Isaac Lab 2.x files. Code pins a commit via + `uwlab_assets.UWLAB_CLOUD_ASSETS_REVISION`; bump it deliberately when publishing assets. - 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 diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 73998c5d..da649ccd 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -20,6 +20,7 @@ Guidelines for modifications: --- * Feng Yu +* Joshua Tran * Mateo Guaman Castro * Patrick Yin * Quanquan Peng diff --git a/README.md b/README.md index a97c857f..9a1e34d8 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ # UW Lab -[![IsaacSim](https://img.shields.io/badge/IsaacSim-5.1.0-silver.svg)](https://docs.isaacsim.omniverse.nvidia.com/latest/index.html) -[![Python](https://img.shields.io/badge/python-3.11-blue.svg)](https://docs.python.org/3/whatsnew/3.11.html) +[![IsaacSim](https://img.shields.io/badge/IsaacSim-6.0.1-silver.svg)](https://docs.isaacsim.omniverse.nvidia.com/latest/index.html) +[![Python](https://img.shields.io/badge/python-3.12-blue.svg)](https://docs.python.org/3/whatsnew/3.12.html) [![Linux platform](https://img.shields.io/badge/platform-linux--64-orange.svg)](https://releases.ubuntu.com/20.04/) [![Windows platform](https://img.shields.io/badge/platform-windows--64-orange.svg)](https://www.microsoft.com/en-us/) [![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) diff --git a/docs/conf.py b/docs/conf.py index a454f895..83d2ebf3 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -127,7 +127,7 @@ "numpy": ("https://numpy.org/doc/stable/", None), "trimesh": ("https://trimesh.org/", None), "torch": ("https://pytorch.org/docs/stable/", None), - "isaacsim": ("https://docs.isaacsim.omniverse.nvidia.com/5.1.0/py/", None), + "isaacsim": ("https://docs.isaacsim.omniverse.nvidia.com/6.0.1/py/", None), "gymnasium": ("https://gymnasium.farama.org/", None), "warp": ("https://nvidia.github.io/warp/", None), "dev-guide": ("https://docs.omniverse.nvidia.com/dev-guide/latest", None), @@ -264,7 +264,7 @@ { "name": "Isaac Sim", "url": "https://developer.nvidia.com/isaac-sim", - "icon": "https://img.shields.io/badge/IsaacSim-5.1.0-silver.svg", + "icon": "https://img.shields.io/badge/IsaacSim-6.0.1-silver.svg", "type": "url", }, { diff --git a/docs/source/publications/omnireset/new_task.rst b/docs/source/publications/omnireset/new_task.rst index 7fcf6389..88fa40ec 100644 --- a/docs/source/publications/omnireset/new_task.rst +++ b/docs/source/publications/omnireset/new_task.rst @@ -16,6 +16,8 @@ In a single Blender session: 2. Reorient so Z-axis points up when the object is resting on a table: ``Tab`` > Edit Mode, ``A`` to select all, rotate as needed (e.g. ``R X 90``). 3. Set origin: right-click > Set Origin > Origin to Center of Mass (Volume). 4. Place both objects in assembled pose, record the relative transform for ``assembled_pose`` to be used in Step 4. + Write its rotation as a quaternion in ``(x, y, z, w)`` order: Isaac Lab 3.0 changed the convention from + 2.x's ``(w, x, y, z)``, so a quaternion written the old way is a different rotation, not an error. 5. Export each object as ``.usdz``. .. raw:: html @@ -89,6 +91,9 @@ The metadata has the following fields: - ``assembled_offset``: Transform from the insertive object to this object in the assembled pose. Always identity for the insertive object; for the receptive object, use the relative transform recorded in Step 1. - ``bottom_offset``: Transform from origin to the bottom of the object. The Z value is the **negative** of the script output from Step 3. +- ``quat_convention``: Must be ``xyzw``. Since the Isaac Lab 3.0 bump, quaternions are ``(x, y, z, w)`` + (identity is ``[0.0, 0.0, 0.0, 1.0]``, not ``[1.0, 0.0, 0.0, 0.0]``). UW Lab refuses metadata without this + key rather than silently applying a rotated offset. - ``success_thresholds`` (receptive only): How tightly the policy must align parts. Use ``position: 0.0025, orientation: 0.025`` for tight-fit tasks (e.g. screw insertion). For looser tasks (e.g. cube stacking), try ``position: 0.005, orientation: 0.05``. May need to tune depending on the task. **Insertive object** example: @@ -97,10 +102,11 @@ The metadata has the following fields: assembled_offset: pos: [0.0, 0.0, 0.0] - quat: [1.0, 0.0, 0.0, 0.0] + quat: [0.0, 0.0, 0.0, 1.0] bottom_offset: pos: [0.0, 0.0, -0.056658] - quat: [1.0, 0.0, 0.0, 0.0] + quat: [0.0, 0.0, 0.0, 1.0] + quat_convention: xyzw **Receptive object** example: @@ -108,13 +114,14 @@ The metadata has the following fields: assembled_offset: pos: [0.012, 0.0, 0.035] - quat: [1.0, 0.0, 0.0, 0.0] + quat: [0.0, 0.0, 0.0, 1.0] bottom_offset: pos: [0.0, 0.0, -0.010169] - quat: [1.0, 0.0, 0.0, 0.0] + quat: [0.0, 0.0, 0.0, 1.0] success_thresholds: position: 0.0025 orientation: 0.025 + quat_convention: xyzw ---- @@ -164,6 +171,8 @@ Add to ``variants["scene.receptive_object"]``: .. tip:: Use local absolute paths during development. Switch to ``UWLAB_CLOUD_ASSETS_DIR`` when sharing. + Published assets go on the ``isaaclab3`` branch of the asset repository (``main`` holds the Isaac Lab 2.x + files), and ``uwlab_assets.UWLAB_CLOUD_ASSETS_REVISION`` has to be bumped to a commit that contains them. ---- @@ -194,7 +203,7 @@ If objects are misaligned or upside down, revisit Step 1. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ env.scene.insertive_object=my_insertive_object env.scene.receptive_object=my_receptive_object Confirm the receptive object sits flush on the table. If it's floating or clipping, adjust the ``bottom_offset`` in Step 4. diff --git a/docs/source/publications/omnireset/rl_training.rst b/docs/source/publications/omnireset/rl_training.rst index 597331af..0cbc6474 100644 --- a/docs/source/publications/omnireset/rl_training.rst +++ b/docs/source/publications/omnireset/rl_training.rst @@ -44,23 +44,23 @@ Reproduce our training results from scratch. --task OmniReset-UR5eRobotiq2f85-ObjectRestingEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=fbleg env.scene.receptive_object=fbtabletop \ - env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Anywhere, End-Effector Grasped (Grasped) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=fbleg env.scene.receptive_object=fbtabletop \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Partially Assembled, End-Effector Grasped (Near Goal) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectPartiallyAssembledEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=fbleg env.scene.receptive_object=fbtabletop \ - env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 **Step 3.5: Visualize Reset States (Optional)** @@ -74,7 +74,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ env.scene.insertive_object=fbleg env.scene.receptive_object=fbtabletop .. tab-item:: Reaching @@ -83,7 +83,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectAnywhereEEAnywhere \ env.scene.insertive_object=fbleg env.scene.receptive_object=fbtabletop @@ -93,7 +93,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectRestingEEGrasped \ env.scene.insertive_object=fbleg env.scene.receptive_object=fbtabletop @@ -103,7 +103,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectAnywhereEEGrasped \ env.scene.insertive_object=fbleg env.scene.receptive_object=fbtabletop @@ -113,7 +113,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectPartiallyAssembledEEGrasped \ env.scene.insertive_object=fbleg env.scene.receptive_object=fbtabletop @@ -150,7 +150,7 @@ Reproduce our training results from scratch. --distributed \ env.scene.insertive_object=fbleg \ env.scene.receptive_object=fbtabletop \ - env.events.reset_from_reset_states.params.dataset_dir=./Datasets/OmniReset + env.events.reset_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 **Training Curves** @@ -199,23 +199,23 @@ Reproduce our training results from scratch. --task OmniReset-UR5eRobotiq2f85-ObjectRestingEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=fbdrawerbottom env.scene.receptive_object=fbdrawerbox \ - env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Anywhere, End-Effector Grasped (Grasped) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=fbdrawerbottom env.scene.receptive_object=fbdrawerbox \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Partially Assembled, End-Effector Grasped (Near Goal) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectPartiallyAssembledEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=fbdrawerbottom env.scene.receptive_object=fbdrawerbox \ - env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 **Step 3.5: Visualize Reset States (Optional)** @@ -229,7 +229,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ env.scene.insertive_object=fbdrawerbottom env.scene.receptive_object=fbdrawerbox .. tab-item:: Reaching @@ -238,7 +238,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectAnywhereEEAnywhere \ env.scene.insertive_object=fbdrawerbottom env.scene.receptive_object=fbdrawerbox @@ -248,7 +248,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectRestingEEGrasped \ env.scene.insertive_object=fbdrawerbottom env.scene.receptive_object=fbdrawerbox @@ -258,7 +258,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectAnywhereEEGrasped \ env.scene.insertive_object=fbdrawerbottom env.scene.receptive_object=fbdrawerbox @@ -268,7 +268,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectPartiallyAssembledEEGrasped \ env.scene.insertive_object=fbdrawerbottom env.scene.receptive_object=fbdrawerbox @@ -305,7 +305,7 @@ Reproduce our training results from scratch. --distributed \ env.scene.insertive_object=fbdrawerbottom \ env.scene.receptive_object=fbdrawerbox \ - env.events.reset_from_reset_states.params.dataset_dir=./Datasets/OmniReset + env.events.reset_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 **Training Curves** @@ -354,23 +354,23 @@ Reproduce our training results from scratch. --task OmniReset-UR5eRobotiq2f85-ObjectRestingEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=peg env.scene.receptive_object=peghole \ - env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Anywhere, End-Effector Grasped (Grasped) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=peg env.scene.receptive_object=peghole \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Partially Assembled, End-Effector Grasped (Near Goal) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectPartiallyAssembledEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=peg env.scene.receptive_object=peghole \ - env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 **Step 3.5: Visualize Reset States (Optional)** @@ -384,7 +384,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ env.scene.insertive_object=peg env.scene.receptive_object=peghole .. tab-item:: Reaching @@ -393,7 +393,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectAnywhereEEAnywhere \ env.scene.insertive_object=peg env.scene.receptive_object=peghole @@ -403,7 +403,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectRestingEEGrasped \ env.scene.insertive_object=peg env.scene.receptive_object=peghole @@ -413,7 +413,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectAnywhereEEGrasped \ env.scene.insertive_object=peg env.scene.receptive_object=peghole @@ -423,7 +423,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectPartiallyAssembledEEGrasped \ env.scene.insertive_object=peg env.scene.receptive_object=peghole @@ -460,7 +460,7 @@ Reproduce our training results from scratch. --distributed \ env.scene.insertive_object=peg \ env.scene.receptive_object=peghole \ - env.events.reset_from_reset_states.params.dataset_dir=./Datasets/OmniReset + env.events.reset_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 **Training Curves** @@ -509,23 +509,23 @@ Reproduce our training results from scratch. --task OmniReset-UR5eRobotiq2f85-ObjectRestingEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=rectangle env.scene.receptive_object=wall \ - env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Anywhere, End-Effector Grasped (Grasped) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=rectangle env.scene.receptive_object=wall \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Partially Assembled, End-Effector Grasped (Near Goal) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectPartiallyAssembledEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=rectangle env.scene.receptive_object=wall \ - env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 **Step 3.5: Visualize Reset States (Optional)** @@ -539,7 +539,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ env.scene.insertive_object=rectangle env.scene.receptive_object=wall .. tab-item:: Reaching @@ -548,7 +548,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectAnywhereEEAnywhere \ env.scene.insertive_object=rectangle env.scene.receptive_object=wall @@ -558,7 +558,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectRestingEEGrasped \ env.scene.insertive_object=rectangle env.scene.receptive_object=wall @@ -568,7 +568,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectAnywhereEEGrasped \ env.scene.insertive_object=rectangle env.scene.receptive_object=wall @@ -578,7 +578,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectPartiallyAssembledEEGrasped \ env.scene.insertive_object=rectangle env.scene.receptive_object=wall @@ -615,7 +615,7 @@ Reproduce our training results from scratch. --distributed \ env.scene.insertive_object=rectangle \ env.scene.receptive_object=wall \ - env.events.reset_from_reset_states.params.dataset_dir=./Datasets/OmniReset + env.events.reset_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 .. warning:: @@ -668,23 +668,23 @@ Reproduce our training results from scratch. --task OmniReset-UR5eRobotiq2f85-ObjectRestingEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=cube env.scene.receptive_object=cube \ - env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Anywhere, End-Effector Grasped (Grasped) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=cube env.scene.receptive_object=cube \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Partially Assembled, End-Effector Grasped (Near Goal) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectPartiallyAssembledEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=cube env.scene.receptive_object=cube \ - env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 **Step 3.5: Visualize Reset States (Optional)** @@ -698,7 +698,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ env.scene.insertive_object=cube env.scene.receptive_object=cube .. tab-item:: Reaching @@ -707,7 +707,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectAnywhereEEAnywhere \ env.scene.insertive_object=cube env.scene.receptive_object=cube @@ -717,7 +717,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectRestingEEGrasped \ env.scene.insertive_object=cube env.scene.receptive_object=cube @@ -727,7 +727,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectAnywhereEEGrasped \ env.scene.insertive_object=cube env.scene.receptive_object=cube @@ -737,7 +737,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectPartiallyAssembledEEGrasped \ env.scene.insertive_object=cube env.scene.receptive_object=cube @@ -774,7 +774,7 @@ Reproduce our training results from scratch. --distributed \ env.scene.insertive_object=cube \ env.scene.receptive_object=cube \ - env.events.reset_from_reset_states.params.dataset_dir=./Datasets/OmniReset + env.events.reset_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 **Training Curves** @@ -823,23 +823,23 @@ Reproduce our training results from scratch. --task OmniReset-UR5eRobotiq2f85-ObjectRestingEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=cupcake env.scene.receptive_object=plate \ - env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Anywhere, End-Effector Grasped (Grasped) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=cupcake env.scene.receptive_object=plate \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Partially Assembled, End-Effector Grasped (Near Goal) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectPartiallyAssembledEEGrasped-v0 \ --num_envs 4096 --num_reset_states 10000 --headless \ env.scene.insertive_object=cupcake env.scene.receptive_object=plate \ - env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset \ - env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset + env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ + env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 **Step 3.5: Visualize Reset States (Optional)** @@ -853,7 +853,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ env.scene.insertive_object=cupcake env.scene.receptive_object=plate .. tab-item:: Reaching @@ -862,7 +862,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectAnywhereEEAnywhere \ env.scene.insertive_object=cupcake env.scene.receptive_object=plate @@ -872,7 +872,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectRestingEEGrasped \ env.scene.insertive_object=cupcake env.scene.receptive_object=plate @@ -882,7 +882,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectAnywhereEEGrasped \ env.scene.insertive_object=cupcake env.scene.receptive_object=plate @@ -892,7 +892,7 @@ Reproduce our training results from scratch. python scripts_v2/tools/visualize_reset_states.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 4 --dataset_dir ./Datasets/OmniReset \ + --num_envs 4 --dataset_dir ./Datasets/OmniReset_isaaclab3 \ --reset_type ObjectPartiallyAssembledEEGrasped \ env.scene.insertive_object=cupcake env.scene.receptive_object=plate @@ -929,7 +929,7 @@ Reproduce our training results from scratch. --distributed \ env.scene.insertive_object=cupcake \ env.scene.receptive_object=plate \ - env.events.reset_from_reset_states.params.dataset_dir=./Datasets/OmniReset + env.events.reset_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 **Training Curves** diff --git a/docs/source/publications/omnireset/sim2real.rst b/docs/source/publications/omnireset/sim2real.rst index 9f2c7c0b..3446ca7d 100644 --- a/docs/source/publications/omnireset/sim2real.rst +++ b/docs/source/publications/omnireset/sim2real.rst @@ -84,7 +84,7 @@ Install ROS 2 and set up the UR robot driver following the `NVIDIA Isaac ROS Uni **2. Update the robot USD** Download the existing calibrated robot USD from -`here `__ +`here `__ and open it in Isaac Sim. Replace the UR5e/UR7e arm in the USD with the URDF of your newly calibrated UR5e/UR7e. After replacing the arm, relink the joint that attaches the gripper to the arm. This joint connection must be re-established in Isaac Sim for the gripper to remain properly attached. **3. Verify alignment** @@ -118,7 +118,7 @@ Place the calibrated USD and a ``metadata.yaml`` side by side: ur5e_robotiq_gripper_d415_mount_safety_calibrated.usd metadata.yaml -Copy the base ``metadata.yaml`` from `here `__ and update the ``calibrated_joints`` (xyz/rpy) and ``link_inertials`` (masses/coms/inertias) sections with the values from your calibrated URDF. The ``sysid`` block will be filled in after :ref:`system identification ` below. +Copy the base ``metadata.yaml`` from `here `__ and update the ``calibrated_joints`` (xyz/rpy) and ``link_inertials`` (masses/coms/inertias) sections with the values from your calibrated URDF. The ``sysid`` block will be filled in after :ref:`system identification ` below. **5. Recollect reset states & retrain** @@ -181,7 +181,7 @@ Inspect the overlay plots. A good fit should show close tracking across all join **4. Save parameters** -Replace the ``sysid`` block in ``metadata.yaml`` (next to your robot USD) with the identified values for ``armature``, ``static_friction``, ``dynamic_ratio``, and ``viscous_friction``. These are loaded automatically during finetuning and evaluation. See the current calibrated robot's `metadata.yaml `_ for reference. +Replace the ``sysid`` block in ``metadata.yaml`` (next to your robot USD) with the identified values for ``armature``, ``static_friction``, ``dynamic_ratio``, and ``viscous_friction``. These are loaded automatically during finetuning and evaluation. See the current calibrated robot's `metadata.yaml `_ for reference. **5. Teleop to verify motion** @@ -717,6 +717,14 @@ After aligning each camera, paste the resulting ``pos``, ``rot``, and ``focal_le Update the ``TiledCameraCfg`` entries (``front_camera``, ``side_camera``, ``wrist_camera``) with the calibrated values. Also update the corresponding ``base_position`` and ``base_rotation`` in the randomization events (``randomize_front_camera``, ``randomize_side_camera``, ``randomize_wrist_camera``) to match. +.. caution:: + + Since the Isaac Lab 3.0 bump, every ``rot`` / ``base_rotation`` in these configs is a quaternion in + ``(x, y, z, w)`` order. ``2_get_isaacsim_extrinsics.py`` in the diffusion_policy repo prints the 2.x + ``(w, x, y, z)`` order, so move the first element to the end before pasting (or convert with + ``isaaclab.utils.math.convert_quat(q, to="xyzw")``). A quaternion pasted in the old order is a + different camera pose, not an error. + With calibrated cameras, proceed to :doc:`distillation` to collect RGB demos, train a vision policy, evaluate in sim, and deploy on the real robot. ---- diff --git a/docs/source/setup/installation/include/pip_python_virtual_env.rst b/docs/source/setup/installation/include/pip_python_virtual_env.rst index 4f6c87ec..45893b5f 100644 --- a/docs/source/setup/installation/include/pip_python_virtual_env.rst +++ b/docs/source/setup/installation/include/pip_python_virtual_env.rst @@ -20,13 +20,11 @@ You can choose different package managers to create a virtual environment. The Python version of the virtual environment must match the Python version of Isaac Sim. - - For Isaac Sim 5.X, the required Python version is 3.11. - - For Isaac Sim 4.X, the required Python version is 3.10. + - For Isaac Sim 6.X, the required Python version is 3.12. Using a different Python version will result in errors when running UW Lab. -The following instructions are for Isaac Sim 5.X, which requires Python 3.11. -If you wish to install Isaac Sim 4.5, please use modify the instructions accordingly to use Python 3.10. +The following instructions are for Isaac Sim 6.X, which requires Python 3.12. - Create a virtual environment using one of the package managers: @@ -45,8 +43,8 @@ If you wish to install Isaac Sim 4.5, please use modify the instructions accordi .. code-block:: bash - # create a virtual environment named env_uwlab with python3.11 - uv venv --python 3.11 env_uwlab + # create a virtual environment named env_uwlab with python3.12 + uv venv --python 3.12 env_uwlab # activate the virtual environment source env_uwlab/bin/activate @@ -55,8 +53,8 @@ If you wish to install Isaac Sim 4.5, please use modify the instructions accordi .. code-block:: batch - :: create a virtual environment named env_uwlab with python3.11 - uv venv --python 3.11 env_uwlab + :: create a virtual environment named env_uwlab with python3.12 + uv venv --python 3.12 env_uwlab :: activate the virtual environment env_uwlab\Scripts\activate @@ -70,7 +68,7 @@ If you wish to install Isaac Sim 4.5, please use modify the instructions accordi .. code-block:: bash - conda create -n env_uwlab python=3.11 + conda create -n env_uwlab python=3.12 conda activate env_uwlab .. tab-item:: venv Environment @@ -86,8 +84,8 @@ If you wish to install Isaac Sim 4.5, please use modify the instructions accordi .. code-block:: bash - # create a virtual environment named env_uwlab with python3.11 - python3.11 -m venv env_uwlab + # create a virtual environment named env_uwlab with python3.12 + python3.12 -m venv env_uwlab # activate the virtual environment source env_uwlab/bin/activate @@ -96,8 +94,8 @@ If you wish to install Isaac Sim 4.5, please use modify the instructions accordi .. code-block:: batch - :: create a virtual environment named env_uwlab with python3.11 - python3.11 -m venv env_uwlab + :: create a virtual environment named env_uwlab with python3.12 + python3.12 -m venv env_uwlab :: activate the virtual environment env_uwlab\Scripts\activate diff --git a/docs/source/setup/installation/include/src_python_virtual_env.rst b/docs/source/setup/installation/include/src_python_virtual_env.rst index 2f594c57..f8f71d78 100644 --- a/docs/source/setup/installation/include/src_python_virtual_env.rst +++ b/docs/source/setup/installation/include/src_python_virtual_env.rst @@ -27,8 +27,7 @@ instead of *./uwlab.sh -p* or *uwlab.bat -p*. The Python version of the virtual environment must match the Python version of Isaac Sim. - - For Isaac Sim 5.X, the required Python version is 3.11. - - For Isaac Sim 4.X, the required Python version is 3.10. + - For Isaac Sim 6.X, the required Python version is 3.12. Using a different Python version will result in errors when running UW Lab. diff --git a/docs/source/setup/installation/index.rst b/docs/source/setup/installation/index.rst index 93f3d9cb..c107ea6d 100644 --- a/docs/source/setup/installation/index.rst +++ b/docs/source/setup/installation/index.rst @@ -3,13 +3,13 @@ Local Installation ================== -.. image:: https://img.shields.io/badge/IsaacSim-5.1.0-silver.svg +.. image:: https://img.shields.io/badge/IsaacSim-6.0.1-silver.svg :target: https://developer.nvidia.com/isaac-sim - :alt: IsaacSim 5.1.0 + :alt: IsaacSim 6.0.1 -.. image:: https://img.shields.io/badge/python-3.11-blue.svg - :target: https://www.python.org/downloads/release/python-31013/ - :alt: Python 3.11 +.. image:: https://img.shields.io/badge/python-3.12-blue.svg + :target: https://www.python.org/downloads/release/python-31211/ + :alt: Python 3.12 .. image:: https://img.shields.io/badge/platform-linux--64-orange.svg :target: https://releases.ubuntu.com/22.04/ @@ -26,8 +26,8 @@ recommended installation methods for both Isaac Sim and UW Lab. .. caution:: - We have dropped support for Isaac Sim versions 4.2.0 and below. We recommend using the latest - Isaac Sim 5.1.0 release to benefit from the latest features and improvements. + UW Lab requires Isaac Lab 3.0, which requires Isaac Sim 6.X. Isaac Sim 5.X and below are + not supported. For more information, please refer to the `Isaac Sim release notes `__. @@ -51,8 +51,7 @@ The basic requirements are: it essential to use the same Python version when installing UW Lab. The required Python version is as follows: -- For Isaac Sim 5.X, the required Python version is 3.11. -- For Isaac Sim 4.X, the required Python version is 3.10. +- For Isaac Sim 6.X, the required Python version is 3.12. Driver Requirements diff --git a/docs/source/setup/installation/pip_installation.rst b/docs/source/setup/installation/pip_installation.rst index 895717e2..e8d96570 100644 --- a/docs/source/setup/installation/pip_installation.rst +++ b/docs/source/setup/installation/pip_installation.rst @@ -46,7 +46,7 @@ Installing dependencies .. code-block:: none - pip install "isaacsim[all,extscache]==5.1.0" --extra-index-url https://pypi.nvidia.com + pip install "isaacsim[all,extscache]==6.0.1.0" --extra-index-url https://pypi.nvidia.com - Install a CUDA-enabled PyTorch build that matches your system architecture: @@ -58,21 +58,21 @@ Installing dependencies .. code-block:: bash - pip install -U torch==2.7.0 torchvision==0.22.0 --index-url https://download.pytorch.org/whl/cu128 + pip install -U torch==2.11.0 torchvision==0.26.0 --index-url https://download.pytorch.org/whl/cu128 .. tab-item:: :icon:`fa-brands fa-windows` Windows (x86_64) :sync: windows-x86_64 .. code-block:: bash - pip install -U torch==2.7.0 torchvision==0.22.0 --index-url https://download.pytorch.org/whl/cu128 + pip install -U torch==2.11.0 torchvision==0.26.0 --index-url https://download.pytorch.org/whl/cu128 .. tab-item:: :icon:`fa-brands fa-linux` Linux (aarch64) :sync: linux-aarch64 .. code-block:: bash - pip install -U torch==2.9.0 torchvision==0.24.0 --index-url https://download.pytorch.org/whl/cu130 + pip install -U torch==2.11.0 torchvision==0.26.0 --index-url https://download.pytorch.org/whl/cu130 .. note:: diff --git a/environment.yml b/environment.yml index e4cd1de8..8b5e253a 100644 --- a/environment.yml +++ b/environment.yml @@ -7,7 +7,7 @@ channels: - conda-forge - defaults dependencies: - - python=3.11 + - python=3.12 - importlib_metadata - pip: - huggingface_hub diff --git a/scripts/environments/state_machine/lift_cube_sm.py b/scripts/environments/state_machine/lift_cube_sm.py index 4a2b6bca..4300de02 100644 --- a/scripts/environments/state_machine/lift_cube_sm.py +++ b/scripts/environments/state_machine/lift_cube_sm.py @@ -11,7 +11,7 @@ .. code-block:: bash - ./isaaclab.sh -p scripts/environments/state_machine/lift_cube_sm.py --num_envs 32 + ./isaaclab.sh -p scripts/environments/state_machine/lift_cube_sm.py --num_envs 32 --viz kit """ @@ -33,21 +33,20 @@ args_cli = parser.parse_args() # launch omniverse app -app_launcher = AppLauncher(headless=args_cli.headless) +app_launcher = AppLauncher(args_cli) simulation_app = app_launcher.app """Rest everything else.""" -import gymnasium as gym -import torch from collections.abc import Sequence +import gymnasium as gym +import torch import warp as wp from isaaclab.assets.rigid_object.rigid_object_data import RigidObjectData import isaaclab_tasks # noqa: F401 -import uwlab_tasks # noqa: F401 from isaaclab_tasks.manager_based.manipulation.lift.lift_env_cfg import LiftEnvCfg from isaaclab_tasks.utils.parse_cfg import parse_env_cfg @@ -222,10 +221,6 @@ def reset_idx(self, env_ids: Sequence[int] = None): def compute(self, ee_pose: torch.Tensor, object_pose: torch.Tensor, des_object_pose: torch.Tensor) -> torch.Tensor: """Compute the desired state of the robot's end-effector and the gripper.""" - # convert all transformations from (w, x, y, z) to (x, y, z, w) - ee_pose = ee_pose[:, [0, 1, 2, 4, 5, 6, 3]] - object_pose = object_pose[:, [0, 1, 2, 4, 5, 6, 3]] - des_object_pose = des_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] # convert to warp ee_pose_wp = wp.from_torch(ee_pose.contiguous(), wp.transform) @@ -251,10 +246,8 @@ def compute(self, ee_pose: torch.Tensor, object_pose: torch.Tensor, des_object_p device=self.device, ) - # convert transformations back to (w, x, y, z) - des_ee_pose = self.des_ee_pose[:, [0, 1, 2, 6, 3, 4, 5]] # convert to torch - return torch.cat([des_ee_pose, self.des_gripper_state.unsqueeze(-1)], dim=-1) + return torch.cat([self.des_ee_pose, self.des_gripper_state.unsqueeze(-1)], dim=-1) def main(): @@ -290,11 +283,13 @@ def main(): # observations # -- end-effector frame ee_frame_sensor = env.unwrapped.scene["ee_frame"] - tcp_rest_position = ee_frame_sensor.data.target_pos_w[..., 0, :].clone() - env.unwrapped.scene.env_origins - tcp_rest_orientation = ee_frame_sensor.data.target_quat_w[..., 0, :].clone() + tcp_rest_position = ( + ee_frame_sensor.data.target_pos_w.torch[..., 0, :].clone() - env.unwrapped.scene.env_origins + ) + tcp_rest_orientation = ee_frame_sensor.data.target_quat_w.torch[..., 0, :].clone() # -- object frame object_data: RigidObjectData = env.unwrapped.scene["object"].data - object_position = object_data.root_pos_w - env.unwrapped.scene.env_origins + object_position = object_data.root_pos_w.torch - env.unwrapped.scene.env_origins # -- target object frame desired_position = env.unwrapped.command_manager.get_command("object_pose")[..., :3] diff --git a/scripts/environments/state_machine/lift_teddy_bear.py b/scripts/environments/state_machine/lift_teddy_bear.py index e1a572fc..5b70c24b 100644 --- a/scripts/environments/state_machine/lift_teddy_bear.py +++ b/scripts/environments/state_machine/lift_teddy_bear.py @@ -34,22 +34,21 @@ simulation_app = app_launcher.app # disable metrics assembler due to scene graph instancing -from isaacsim.core.utils.extensions import disable_extension +from isaacsim.core.experimental.utils.app import enable_extension -disable_extension("omni.usd.metrics.assembler.ui") +enable_extension("omni.usd.metrics.assembler.ui", enabled=False) """Rest everything else.""" -import gymnasium as gym -import torch from collections.abc import Sequence +import gymnasium as gym +import torch import warp as wp from isaaclab.assets.rigid_object.rigid_object_data import RigidObjectData import isaaclab_tasks # noqa: F401 -import uwlab_tasks # noqa: F401 from isaaclab_tasks.manager_based.manipulation.lift.lift_env_cfg import LiftEnvCfg from isaaclab_tasks.utils.parse_cfg import parse_env_cfg @@ -235,10 +234,6 @@ def reset_idx(self, env_ids: Sequence[int] = None): def compute(self, ee_pose: torch.Tensor, object_pose: torch.Tensor, des_object_pose: torch.Tensor): """Compute the desired state of the robot's end-effector and the gripper.""" - # convert all transformations from (w, x, y, z) to (x, y, z, w) - ee_pose = ee_pose[:, [0, 1, 2, 4, 5, 6, 3]] - object_pose = object_pose[:, [0, 1, 2, 4, 5, 6, 3]] - des_object_pose = des_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] # convert to warp ee_pose_wp = wp.from_torch(ee_pose.contiguous(), wp.transform) @@ -264,10 +259,8 @@ def compute(self, ee_pose: torch.Tensor, object_pose: torch.Tensor, des_object_p device=self.device, ) - # convert transformations back to (w, x, y, z) - des_ee_pose = self.des_ee_pose[:, [0, 1, 2, 6, 3, 4, 5]] # convert to torch - return torch.cat([des_ee_pose, self.des_gripper_state.unsqueeze(-1)], dim=-1) + return torch.cat([self.des_ee_pose, self.des_gripper_state.unsqueeze(-1)], dim=-1) def main(): @@ -310,11 +303,13 @@ def main(): # observations # -- end-effector frame ee_frame_sensor = env.unwrapped.scene["ee_frame"] - tcp_rest_position = ee_frame_sensor.data.target_pos_w[..., 0, :].clone() - env.unwrapped.scene.env_origins - tcp_rest_orientation = ee_frame_sensor.data.target_quat_w[..., 0, :].clone() + tcp_rest_position = ( + ee_frame_sensor.data.target_pos_w.torch[..., 0, :].clone() - env.unwrapped.scene.env_origins + ) + tcp_rest_orientation = ee_frame_sensor.data.target_quat_w.torch[..., 0, :].clone() # -- object frame object_data: RigidObjectData = env.unwrapped.scene["object"].data - object_position = object_data.root_pos_w - env.unwrapped.scene.env_origins + object_position = object_data.root_pos_w.torch - env.unwrapped.scene.env_origins object_position += object_local_grasp_position # -- target object frame diff --git a/scripts/environments/state_machine/open_cabinet_sm.py b/scripts/environments/state_machine/open_cabinet_sm.py index 9ddeb0fd..00e6c282 100644 --- a/scripts/environments/state_machine/open_cabinet_sm.py +++ b/scripts/environments/state_machine/open_cabinet_sm.py @@ -11,7 +11,7 @@ .. code-block:: bash - ./isaaclab.sh -p scripts/environments/state_machine/open_cabinet_sm.py --num_envs 32 + ./isaaclab.sh -p scripts/environments/state_machine/open_cabinet_sm.py --num_envs 32 --viz kit """ @@ -33,21 +33,20 @@ args_cli = parser.parse_args() # launch omniverse app -app_launcher = AppLauncher(headless=args_cli.headless) +app_launcher = AppLauncher(args_cli) simulation_app = app_launcher.app """Rest everything else.""" -import gymnasium as gym -import torch from collections.abc import Sequence +import gymnasium as gym +import torch import warp as wp from isaaclab.sensors import FrameTransformer import isaaclab_tasks # noqa: F401 -import uwlab_tasks # noqa: F401 from isaaclab_tasks.manager_based.manipulation.cabinet.cabinet_env_cfg import CabinetEnvCfg from isaaclab_tasks.utils.parse_cfg import parse_env_cfg @@ -242,9 +241,6 @@ def reset_idx(self, env_ids: Sequence[int] | None = None): def compute(self, ee_pose: torch.Tensor, handle_pose: torch.Tensor): """Compute the desired state of the robot's end-effector and the gripper.""" - # convert all transformations from (w, x, y, z) to (x, y, z, w) - ee_pose = ee_pose[:, [0, 1, 2, 4, 5, 6, 3]] - handle_pose = handle_pose[:, [0, 1, 2, 4, 5, 6, 3]] # convert to warp ee_pose_wp = wp.from_torch(ee_pose.contiguous(), wp.transform) handle_pose_wp = wp.from_torch(handle_pose.contiguous(), wp.transform) @@ -269,10 +265,8 @@ def compute(self, ee_pose: torch.Tensor, handle_pose: torch.Tensor): device=self.device, ) - # convert transformations back to (w, x, y, z) - des_ee_pose = self.des_ee_pose[:, [0, 1, 2, 6, 3, 4, 5]] # convert to torch - return torch.cat([des_ee_pose, self.des_gripper_state.unsqueeze(-1)], dim=-1) + return torch.cat([self.des_ee_pose, self.des_gripper_state.unsqueeze(-1)], dim=-1) def main(): @@ -306,12 +300,14 @@ def main(): # observations # -- end-effector frame ee_frame_tf: FrameTransformer = env.unwrapped.scene["ee_frame"] - tcp_rest_position = ee_frame_tf.data.target_pos_w[..., 0, :].clone() - env.unwrapped.scene.env_origins - tcp_rest_orientation = ee_frame_tf.data.target_quat_w[..., 0, :].clone() + tcp_rest_position = ee_frame_tf.data.target_pos_w.torch[..., 0, :].clone() - env.unwrapped.scene.env_origins + tcp_rest_orientation = ee_frame_tf.data.target_quat_w.torch[..., 0, :].clone() # -- handle frame cabinet_frame_tf: FrameTransformer = env.unwrapped.scene["cabinet_frame"] - cabinet_position = cabinet_frame_tf.data.target_pos_w[..., 0, :].clone() - env.unwrapped.scene.env_origins - cabinet_orientation = cabinet_frame_tf.data.target_quat_w[..., 0, :].clone() + cabinet_position = ( + cabinet_frame_tf.data.target_pos_w.torch[..., 0, :].clone() - env.unwrapped.scene.env_origins + ) + cabinet_orientation = cabinet_frame_tf.data.target_quat_w.torch[..., 0, :].clone() # advance state machine actions = open_sm.compute( diff --git a/scripts/reinforcement_learning/rsl_rl/play.py b/scripts/reinforcement_learning/rsl_rl/play.py index 611e5047..f0c0f102 100644 --- a/scripts/reinforcement_learning/rsl_rl/play.py +++ b/scripts/reinforcement_learning/rsl_rl/play.py @@ -71,8 +71,9 @@ from isaaclab.utils.dict import print_dict from isaaclab_rl.rsl_rl import RslRlBaseRunnerCfg, RslRlVecEnvWrapper + +from uwlab_rl.rsl_rl.exporter import export_policy_as_jit from isaaclab_rl.utils.pretrained_checkpoint import get_published_pretrained_checkpoint -from uwlab_rl.rsl_rl.exporter import export_policy_as_jit, export_policy_as_onnx import isaaclab_tasks # noqa: F401 import uwlab_tasks # noqa: F401 @@ -155,27 +156,11 @@ def main(env_cfg: ManagerBasedRLEnvCfg | DirectRLEnvCfg | DirectMARLEnvCfg, agen # obtain the trained policy for inference policy = runner.get_inference_policy(device=env.unwrapped.device) - # extract the neural network module - # we do this in a try-except to maintain backwards compatibility. - try: - # version 2.3 onwards - policy_nn = runner.alg.policy - except AttributeError: - # version 2.2 and below - policy_nn = runner.alg.actor_critic - - # extract the normalizer - if hasattr(policy_nn, "actor_obs_normalizer"): - normalizer = policy_nn.actor_obs_normalizer - elif hasattr(policy_nn, "student_obs_normalizer"): - normalizer = policy_nn.student_obs_normalizer - else: - normalizer = None - - # export policy to onnx/jit + # export the trained policy to JIT and ONNX formats. The JIT export carries the output + # distribution (``compute_distribution``), which demo collection samples from. export_model_dir = os.path.join(os.path.dirname(resume_path), "exported") - export_policy_as_jit(policy_nn, normalizer=normalizer, path=export_model_dir, filename="policy.pt") - export_policy_as_onnx(policy_nn, normalizer=normalizer, path=export_model_dir, filename="policy.onnx") + export_policy_as_jit(getattr(runner.alg, "_raw_actor", runner.alg.actor), path=export_model_dir, filename="policy.pt") + runner.export_policy_to_onnx(path=export_model_dir, filename="policy.onnx") dt = env.unwrapped.step_dt @@ -192,7 +177,7 @@ def main(env_cfg: ManagerBasedRLEnvCfg | DirectRLEnvCfg | DirectMARLEnvCfg, agen # env stepping obs, _, dones, _ = env.step(actions) # reset recurrent states for episodes that have terminated - policy_nn.reset(dones) + policy.reset(dones) if args_cli.video: timestep += 1 # Exit the play loop after recording one video diff --git a/scripts/tools/check_instanceable.py b/scripts/tools/check_instanceable.py index f0da0e26..b3e9d51a 100644 --- a/scripts/tools/check_instanceable.py +++ b/scripts/tools/check_instanceable.py @@ -64,11 +64,10 @@ """Rest everything follows.""" -import isaacsim.core.utils.prims as prim_utils from isaacsim.core.api.simulation_context import SimulationContext from isaacsim.core.cloner import GridCloner -from isaacsim.core.utils.carb import set_carb_setting -from isaacsim.core.utils.stage import get_current_stage +from isaaclab.sim.utils import create_prim, get_current_stage +from isaaclab.sim.utils.legacy import define_prim from isaaclab.utils import Timer from isaaclab.utils.assets import check_file_path @@ -96,17 +95,17 @@ def main(): sim.get_physics_context().set_gpu_total_aggregate_pairs_capacity(2**21) # enable hydra scene-graph instancing # this is needed to visualize the scene when fabric is enabled - set_carb_setting(sim._settings, "/persistent/omnihydra/useSceneGraphInstancing", True) + sim._settings.set("/persistent/omnihydra/useSceneGraphInstancing", True) # Create interface to clone the scene cloner = GridCloner(spacing=args_cli.spacing, stage=stage) cloner.define_base_env("/World/envs") - prim_utils.define_prim("/World/envs/env_0") + define_prim("/World/envs/env_0") # Spawn things into stage - prim_utils.create_prim("/World/Light", "DistantLight") + create_prim("/World/Light", "DistantLight") # Everything under the namespace "/World/envs/env_0" will be cloned - prim_utils.create_prim("/World/envs/env_0/Asset", "Xform", usd_path=os.path.abspath(args_cli.input)) + create_prim("/World/envs/env_0/Asset", "Xform", usd_path=os.path.abspath(args_cli.input)) # Clone the scene num_clones = args_cli.num_clones diff --git a/scripts/tools/convert_mesh.py b/scripts/tools/convert_mesh.py index 7139c62e..513d0fef 100644 --- a/scripts/tools/convert_mesh.py +++ b/scripts/tools/convert_mesh.py @@ -93,7 +93,7 @@ import os import carb -import isaacsim.core.utils.stage as stage_utils +from isaaclab.sim.utils import open_stage import omni.kit.app from isaaclab.sim.converters import MeshConverter, MeshConverterCfg @@ -187,7 +187,7 @@ def main(): # Simulate scene (if not headless) if local_gui or livestream_gui: # Open the stage with USD - stage_utils.open_stage(mesh_converter.usd_path) + open_stage(mesh_converter.usd_path) # Reinitialize the simulation app = omni.kit.app.get_app_interface() # Run simulation diff --git a/scripts/tools/convert_mjcf.py b/scripts/tools/convert_mjcf.py index fa05a42b..7b1432c6 100644 --- a/scripts/tools/convert_mjcf.py +++ b/scripts/tools/convert_mjcf.py @@ -63,7 +63,7 @@ import os import carb -import isaacsim.core.utils.stage as stage_utils +from isaaclab.sim.utils import open_stage import omni.kit.app from isaaclab.sim.converters import MjcfConverter, MjcfConverterCfg @@ -122,7 +122,7 @@ def main(): # Simulate scene (if not headless) if local_gui or livestream_gui: # Open the stage with USD - stage_utils.open_stage(mjcf_converter.usd_path) + open_stage(mjcf_converter.usd_path) # Reinitialize the simulation app = omni.kit.app.get_app_interface() # Run simulation diff --git a/scripts/tools/convert_urdf.py b/scripts/tools/convert_urdf.py index aaa5ddb1..6f5b6cd1 100644 --- a/scripts/tools/convert_urdf.py +++ b/scripts/tools/convert_urdf.py @@ -81,7 +81,7 @@ import os import carb -import isaacsim.core.utils.stage as stage_utils +from isaaclab.sim.utils import open_stage import omni.kit.app from isaaclab.sim.converters import UrdfConverter, UrdfConverterCfg @@ -146,7 +146,7 @@ def main(): # Simulate scene (if not headless) if local_gui or livestream_gui: # Open the stage with USD - stage_utils.open_stage(urdf_converter.usd_path) + open_stage(urdf_converter.usd_path) # Reinitialize the simulation app = omni.kit.app.get_app_interface() # Run simulation diff --git a/scripts/tutorials/00_sim/spawn_prims.py b/scripts/tutorials/00_sim/spawn_prims.py index 0e1f02c3..4ebe30ec 100644 --- a/scripts/tutorials/00_sim/spawn_prims.py +++ b/scripts/tutorials/00_sim/spawn_prims.py @@ -31,7 +31,6 @@ """Rest everything follows.""" -import isaacsim.core.utils.prims as prim_utils import isaaclab.sim as sim_utils from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR @@ -51,7 +50,7 @@ def design_scene(): cfg_light_distant.func("/World/lightDistant", cfg_light_distant, translation=(1, 0, 10)) # create a new xform prim for all objects to be spawned under - prim_utils.create_prim("/World/Objects", "Xform") + sim_utils.create_prim("/World/Objects", "Xform") # spawn a red cone cfg_cone = sim_utils.ConeCfg( radius=0.15, diff --git a/scripts/tutorials/01_assets/add_new_robot.py b/scripts/tutorials/01_assets/add_new_robot.py index 43d31154..24d972ef 100644 --- a/scripts/tutorials/01_assets/add_new_robot.py +++ b/scripts/tutorials/01_assets/add_new_robot.py @@ -103,34 +103,43 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): sim_time = 0.0 count = 0 + # wheel-velocity templates allocated once on the simulation device; the joint + # target setters dispatch to GPU Warp kernels and reject CPU tensors. + straight_action = torch.tensor([[10.0, 10.0]], device=sim.device) + turn_action = torch.tensor([[5.0, -5.0]], device=sim.device) + while simulation_app.is_running(): # reset if count % 500 == 0: # reset counters count = 0 # reset the scene entities to their initial positions offset by the environment origins - root_jetbot_state = scene["Jetbot"].data.default_root_state.clone() - root_jetbot_state[:, :3] += scene.env_origins - root_dofbot_state = scene["Dofbot"].data.default_root_state.clone() - root_dofbot_state[:, :3] += scene.env_origins + root_jetbot_pose = scene["Jetbot"].data.default_root_pose.torch.clone() + root_jetbot_pose[:, :3] += scene.env_origins + root_dofbot_pose = scene["Dofbot"].data.default_root_pose.torch.clone() + root_dofbot_pose[:, :3] += scene.env_origins # copy the default root state to the sim for the jetbot's orientation and velocity - scene["Jetbot"].write_root_pose_to_sim(root_jetbot_state[:, :7]) - scene["Jetbot"].write_root_velocity_to_sim(root_jetbot_state[:, 7:]) - scene["Dofbot"].write_root_pose_to_sim(root_dofbot_state[:, :7]) - scene["Dofbot"].write_root_velocity_to_sim(root_dofbot_state[:, 7:]) + scene["Jetbot"].write_root_pose_to_sim_index(root_pose=root_jetbot_pose) + root_jetbot_vel = scene["Jetbot"].data.default_root_vel.torch.clone() + scene["Jetbot"].write_root_velocity_to_sim_index(root_velocity=root_jetbot_vel) + scene["Dofbot"].write_root_pose_to_sim_index(root_pose=root_dofbot_pose) + root_dofbot_vel = scene["Dofbot"].data.default_root_vel.torch.clone() + scene["Dofbot"].write_root_velocity_to_sim_index(root_velocity=root_dofbot_vel) # copy the default joint states to the sim joint_pos, joint_vel = ( - scene["Jetbot"].data.default_joint_pos.clone(), - scene["Jetbot"].data.default_joint_vel.clone(), + scene["Jetbot"].data.default_joint_pos.torch.clone(), + scene["Jetbot"].data.default_joint_vel.torch.clone(), ) - scene["Jetbot"].write_joint_state_to_sim(joint_pos, joint_vel) + scene["Jetbot"].write_joint_position_to_sim_index(position=joint_pos) + scene["Jetbot"].write_joint_velocity_to_sim_index(velocity=joint_vel) joint_pos, joint_vel = ( - scene["Dofbot"].data.default_joint_pos.clone(), - scene["Dofbot"].data.default_joint_vel.clone(), + scene["Dofbot"].data.default_joint_pos.torch.clone(), + scene["Dofbot"].data.default_joint_vel.torch.clone(), ) - scene["Dofbot"].write_joint_state_to_sim(joint_pos, joint_vel) + scene["Dofbot"].write_joint_position_to_sim_index(position=joint_pos) + scene["Dofbot"].write_joint_velocity_to_sim_index(velocity=joint_vel) # clear internal buffers scene.reset() print("[INFO]: Resetting Jetbot and Dofbot state...") @@ -138,17 +147,17 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): # drive around if count % 100 < 75: # Drive straight by setting equal wheel velocities - action = torch.Tensor([[10.0, 10.0]]) + action = straight_action else: # Turn by applying different velocities - action = torch.Tensor([[5.0, -5.0]]) + action = turn_action - scene["Jetbot"].set_joint_velocity_target(action) + scene["Jetbot"].set_joint_velocity_target_index(target=action) # wave - wave_action = scene["Dofbot"].data.default_joint_pos + wave_action = scene["Dofbot"].data.default_joint_pos.torch wave_action[:, 0:4] = 0.25 * np.sin(2 * np.pi * 0.5 * sim_time) - scene["Dofbot"].set_joint_position_target(wave_action) + scene["Dofbot"].set_joint_position_target_index(target=wave_action) scene.write_data_to_sim() sim.step() diff --git a/scripts/tutorials/01_assets/run_articulation.py b/scripts/tutorials/01_assets/run_articulation.py index 869ef033..cac69c30 100644 --- a/scripts/tutorials/01_assets/run_articulation.py +++ b/scripts/tutorials/01_assets/run_articulation.py @@ -34,8 +34,6 @@ import torch -import isaacsim.core.utils.prims as prim_utils - import isaaclab.sim as sim_utils from isaaclab.assets import Articulation from isaaclab.sim import SimulationContext @@ -59,9 +57,9 @@ def design_scene() -> tuple[dict, list[list[float]]]: # Each group will have a robot in it origins = [[0.0, 0.0, 0.0], [-1.0, 0.0, 0.0]] # Origin 1 - prim_utils.create_prim("/World/Origin1", "Xform", translation=origins[0]) + sim_utils.create_prim("/World/Origin1", "Xform", translation=origins[0]) # Origin 2 - prim_utils.create_prim("/World/Origin2", "Xform", translation=origins[1]) + sim_utils.create_prim("/World/Origin2", "Xform", translation=origins[1]) # Articulation cartpole_cfg = CARTPOLE_CFG.copy() @@ -92,22 +90,27 @@ def run_simulator(sim: sim_utils.SimulationContext, entities: dict[str, Articula # root state # we offset the root state by the origin since the states are written in simulation world frame # if this is not done, then the robots will be spawned at the (0, 0, 0) of the simulation world - root_state = robot.data.default_root_state.clone() - root_state[:, :3] += origins - robot.write_root_pose_to_sim(root_state[:, :7]) - robot.write_root_velocity_to_sim(root_state[:, 7:]) + root_pose = robot.data.default_root_pose.torch.clone() + root_pose[:, :3] += origins + robot.write_root_pose_to_sim_index(root_pose=root_pose) + root_vel = robot.data.default_root_vel.torch.clone() + robot.write_root_velocity_to_sim_index(root_velocity=root_vel) # set joint positions with some noise - joint_pos, joint_vel = robot.data.default_joint_pos.clone(), robot.data.default_joint_vel.clone() + joint_pos, joint_vel = ( + robot.data.default_joint_pos.torch.clone(), + robot.data.default_joint_vel.torch.clone(), + ) joint_pos += torch.rand_like(joint_pos) * 0.1 - robot.write_joint_state_to_sim(joint_pos, joint_vel) + robot.write_joint_position_to_sim_index(position=joint_pos) + robot.write_joint_velocity_to_sim_index(velocity=joint_vel) # clear internal buffers robot.reset() print("[INFO]: Resetting robot state...") # Apply random action # -- generate random joint efforts - efforts = torch.randn_like(robot.data.joint_pos) * 5.0 + efforts = torch.randn_like(robot.data.joint_pos.torch) * 5.0 # -- apply action to the robot - robot.set_joint_effort_target(efforts) + robot.set_joint_effort_target_index(target=efforts) # -- write data to sim robot.write_data_to_sim() # Perform step diff --git a/scripts/tutorials/01_assets/run_deformable_object.py b/scripts/tutorials/01_assets/run_deformable_object.py index ca7b841d..11e90ce8 100644 --- a/scripts/tutorials/01_assets/run_deformable_object.py +++ b/scripts/tutorials/01_assets/run_deformable_object.py @@ -15,15 +15,18 @@ """Launch Isaac Sim Simulator first.""" - import argparse +import os from isaaclab.app import AppLauncher # add argparse arguments parser = argparse.ArgumentParser(description="Tutorial on interacting with a deformable object.") +parser.add_argument("--backend", type=str, default="physx", choices=["physx", "newton"], help="Physics backend.") # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) +# demos should open Kit visualizer by default +parser.set_defaults(visualizer=["kit"]) # parse the arguments args_cli = parser.parse_args() @@ -35,12 +38,9 @@ import torch -import isaacsim.core.utils.prims as prim_utils - import isaaclab.sim as sim_utils import isaaclab.utils.math as math_utils from isaaclab.assets import DeformableObject, DeformableObjectCfg -from isaaclab.sim import SimulationContext def design_scene(): @@ -52,67 +52,94 @@ def design_scene(): cfg = sim_utils.DomeLightCfg(intensity=2000.0, color=(0.8, 0.8, 0.8)) cfg.func("/World/Light", cfg) - # Create separate groups called "Origin1", "Origin2", "Origin3" - # Each group will have a robot in it + # Create a dictionary for the scene entities + scene_entities = {} + + # Create separate groups called "env_0", "env_1", ... + # Newton's scene loader requires the "env_\d+" naming convention to + # detect per-environment Xforms and replicate them as separate worlds. origins = [[0.25, 0.25, 0.0], [-0.25, 0.25, 0.0], [0.25, -0.25, 0.0], [-0.25, -0.25, 0.0]] for i, origin in enumerate(origins): - prim_utils.create_prim(f"/World/Origin{i}", "Xform", translation=origin) - - # Deformable Object + sim_utils.create_prim(f"/World/env_{i}", "Xform", translation=origin) + + youngs_modulus = 1e5 + poissons_ratio = 0.4 + density = 500.0 + if args_cli.backend == "newton": + from isaaclab_newton.sim.schemas import NewtonDeformableBodyPropertiesCfg + from isaaclab_newton.sim.spawners.materials import NewtonDeformableBodyMaterialCfg + + deformable_props = NewtonDeformableBodyPropertiesCfg() + physics_material = NewtonDeformableBodyMaterialCfg( + k_mu=youngs_modulus / (2.0 * (1.0 + poissons_ratio)), + k_lambda=youngs_modulus * poissons_ratio / ((1.0 + poissons_ratio) * (1.0 - 2.0 * poissons_ratio)), + density=density, + ) + else: + from isaaclab_physx.sim.schemas import PhysxDeformableBodyPropertiesCfg + from isaaclab_physx.sim.spawners.materials import PhysxDeformableBodyMaterialCfg + + deformable_props = PhysxDeformableBodyPropertiesCfg(rest_offset=0.0, contact_offset=0.001) + physics_material = PhysxDeformableBodyMaterialCfg( + poissons_ratio=poissons_ratio, youngs_modulus=youngs_modulus, density=density + ) + + # 3D Deformable Object cfg = DeformableObjectCfg( - prim_path="/World/Origin.*/Cube", + prim_path="/World/env_.*/Cube", spawn=sim_utils.MeshCuboidCfg( size=(0.2, 0.2, 0.2), - deformable_props=sim_utils.DeformableBodyPropertiesCfg(rest_offset=0.0, contact_offset=0.001), + deformable_props=deformable_props, visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.5, 0.1, 0.0)), - physics_material=sim_utils.DeformableBodyMaterialCfg(poissons_ratio=0.4, youngs_modulus=1e5), + physics_material=physics_material, ), init_state=DeformableObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 1.0)), debug_vis=True, ) + cube_object = DeformableObject(cfg=cfg) + scene_entities["cube_object"] = cube_object # return the scene information - scene_entities = {"cube_object": cube_object} return scene_entities, origins -def run_simulator(sim: sim_utils.SimulationContext, entities: dict[str, DeformableObject], origins: torch.Tensor): +def run_simulator(sim: sim_utils.SimulationContext, entities: dict, origins: torch.Tensor, output_dir: str): """Runs the simulation loop.""" # Extract scene entities # note: we only do this here for readability. In general, it is better to access the entities directly from # the dictionary. This dictionary is replaced by the InteractiveScene class in the next tutorial. - cube_object = entities["cube_object"] + cube_object: DeformableObject = entities["cube_object"] + # Define simulation stepping sim_dt = sim.get_physics_dt() sim_time = 0.0 count = 0 # Nodal kinematic targets of the deformable bodies - nodal_kinematic_target = cube_object.data.nodal_kinematic_target.clone() + nodal_kinematic_target = cube_object.data.nodal_kinematic_target.torch.clone() # Simulate physics while simulation_app.is_running(): - # reset - if count % 250 == 0: + # reset at start and after 3 seconds + if count % int(3.0 / sim_dt) == 0: # reset counters - sim_time = 0.0 count = 0 # reset the nodal state of the object - nodal_state = cube_object.data.default_nodal_state_w.clone() + nodal_state = cube_object.data.default_nodal_state_w.torch.clone() # apply random pose to the object pos_w = torch.rand(cube_object.num_instances, 3, device=sim.device) * 0.1 + origins quat_w = math_utils.random_orientation(cube_object.num_instances, device=sim.device) nodal_state[..., :3] = cube_object.transform_nodal_pos(nodal_state[..., :3], pos_w, quat_w) # write nodal state to simulation - cube_object.write_nodal_state_to_sim(nodal_state) + cube_object.write_nodal_state_to_sim_index(nodal_state) # Write the nodal state to the kinematic target and free all vertices nodal_kinematic_target[..., :3] = nodal_state[..., :3] nodal_kinematic_target[..., 3] = 1.0 - cube_object.write_nodal_kinematic_target_to_sim(nodal_kinematic_target) + cube_object.write_nodal_kinematic_target_to_sim_index(nodal_kinematic_target) # reset buffers cube_object.reset() @@ -121,13 +148,14 @@ def run_simulator(sim: sim_utils.SimulationContext, entities: dict[str, Deformab print("[INFO]: Resetting object state...") # update the kinematic target for cubes at index 0 and 3 + kinematic_cubes = [0, 3] # we slightly move the cube in the z-direction by picking the vertex at index 0 - nodal_kinematic_target[[0, 3], 0, 2] += 0.001 + nodal_kinematic_target[kinematic_cubes, 0, 2] += 0.2 * sim_dt # set vertex at index 0 to be kinematically constrained # 0: constrained, 1: free - nodal_kinematic_target[[0, 3], 0, 3] = 0.0 + nodal_kinematic_target[kinematic_cubes, 0, 3] = 0.0 # write kinematic target to simulation - cube_object.write_nodal_kinematic_target_to_sim(nodal_kinematic_target) + cube_object.write_nodal_kinematic_target_to_sim_index(nodal_kinematic_target) # write internal data to simulation cube_object.write_data_to_sim() @@ -138,18 +166,29 @@ def run_simulator(sim: sim_utils.SimulationContext, entities: dict[str, Deformab count += 1 # update buffers cube_object.update(sim_dt) - # print the root position - if count % 50 == 0: - print(f"Root position (in world): {cube_object.data.root_pos_w[:, :3]}") + + # print the root positions every second + if count % int(1.0 / sim_dt) == 0: + print(f"Time {sim_time:.2f}s: \tRoot position (in world): {cube_object.data.root_pos_w.torch[:, :3]}") def main(): """Main function.""" # Load kit helper - sim_cfg = sim_utils.SimulationCfg(device=args_cli.device) - sim = SimulationContext(sim_cfg) + if args_cli.backend == "newton": + from isaaclab_newton.physics import NewtonCfg + + from isaaclab_contrib.deformable.newton_manager_cfg import VBDSolverCfg + + physics_cfg = NewtonCfg(solver_cfg=VBDSolverCfg(iterations=10), num_substeps=4) + else: + from isaaclab_physx.physics import PhysxCfg + + physics_cfg = PhysxCfg() + sim_cfg = sim_utils.SimulationCfg(dt=0.01, device=args_cli.device, physics=physics_cfg) + sim = sim_utils.SimulationContext(sim_cfg) # Set main camera - sim.set_camera_view(eye=[3.0, 0.0, 1.0], target=[0.0, 0.0, 0.5]) + sim.set_camera_view(eye=[2.0, 2.0, 2.0], target=[0.0, 0.0, 0.75]) # Design scene scene_entities, scene_origins = design_scene() scene_origins = torch.tensor(scene_origins, device=sim.device) @@ -158,7 +197,9 @@ def main(): # Now we are ready! print("[INFO]: Setup complete...") # Run the simulator - run_simulator(sim, scene_entities, scene_origins) + camera_output = os.path.join(os.path.dirname(os.path.realpath(__file__)), "output", "camera") + run_simulator(sim, scene_entities, scene_origins, camera_output) + print("[INFO]: Simulation complete...") if __name__ == "__main__": diff --git a/scripts/tutorials/01_assets/run_rigid_object.py b/scripts/tutorials/01_assets/run_rigid_object.py index 0ab19de7..a258fa40 100644 --- a/scripts/tutorials/01_assets/run_rigid_object.py +++ b/scripts/tutorials/01_assets/run_rigid_object.py @@ -35,8 +35,6 @@ import torch -import isaacsim.core.utils.prims as prim_utils - import isaaclab.sim as sim_utils import isaaclab.utils.math as math_utils from isaaclab.assets import RigidObject, RigidObjectCfg @@ -56,7 +54,7 @@ def design_scene(): # Each group will have a robot in it origins = [[0.25, 0.25, 0.0], [-0.25, 0.25, 0.0], [0.25, -0.25, 0.0], [-0.25, -0.25, 0.0]] for i, origin in enumerate(origins): - prim_utils.create_prim(f"/World/Origin{i}", "Xform", translation=origin) + sim_utils.create_prim(f"/World/Origin{i}", "Xform", translation=origin) # Rigid Object cone_cfg = RigidObjectCfg( @@ -96,15 +94,16 @@ def run_simulator(sim: sim_utils.SimulationContext, entities: dict[str, RigidObj sim_time = 0.0 count = 0 # reset root state - root_state = cone_object.data.default_root_state.clone() + root_pose = cone_object.data.default_root_pose.torch.clone() # sample a random position on a cylinder around the origins - root_state[:, :3] += origins - root_state[:, :3] += math_utils.sample_cylinder( + root_pose[:, :3] += origins + root_pose[:, :3] += math_utils.sample_cylinder( radius=0.1, h_range=(0.25, 0.5), size=cone_object.num_instances, device=cone_object.device ) # write root state to simulation - cone_object.write_root_pose_to_sim(root_state[:, :7]) - cone_object.write_root_velocity_to_sim(root_state[:, 7:]) + cone_object.write_root_pose_to_sim_index(root_pose=root_pose) + root_vel = cone_object.data.default_root_vel.torch.clone() + cone_object.write_root_velocity_to_sim_index(root_velocity=root_vel) # reset buffers cone_object.reset() print("----------------------------------------") @@ -120,7 +119,7 @@ def run_simulator(sim: sim_utils.SimulationContext, entities: dict[str, RigidObj cone_object.update(sim_dt) # print the root position if count % 50 == 0: - print(f"Root position (in world): {cone_object.data.root_pos_w}") + print(f"Root position (in world): {cone_object.data.root_pos_w.torch}") def main(): diff --git a/scripts/tutorials/01_assets/run_surface_gripper.py b/scripts/tutorials/01_assets/run_surface_gripper.py index 50a01431..31143501 100644 --- a/scripts/tutorials/01_assets/run_surface_gripper.py +++ b/scripts/tutorials/01_assets/run_surface_gripper.py @@ -24,6 +24,8 @@ parser = argparse.ArgumentParser(description="Tutorial on spawning and interacting with a Surface Gripper.") # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) +# tutorials should open Kit visualizer by default +parser.set_defaults(visualizer=["kit"]) # parse the arguments args_cli = parser.parse_args() @@ -34,11 +36,11 @@ """Rest everything follows.""" import torch - -import isaacsim.core.utils.prims as prim_utils +import warp as wp +from isaaclab_physx.assets import SurfaceGripper, SurfaceGripperCfg import isaaclab.sim as sim_utils -from isaaclab.assets import Articulation, SurfaceGripper, SurfaceGripperCfg +from isaaclab.assets import Articulation from isaaclab.sim import SimulationContext ## @@ -60,9 +62,9 @@ def design_scene(): # Each group will have a robot in it origins = [[2.75, 0.0, 0.0], [-2.75, 0.0, 0.0]] # Origin 1 - prim_utils.create_prim("/World/Origin1", "Xform", translation=origins[0]) + sim_utils.create_prim("/World/Origin1", "Xform", translation=origins[0]) # Origin 2 - prim_utils.create_prim("/World/Origin2", "Xform", translation=origins[1]) + sim_utils.create_prim("/World/Origin2", "Xform", translation=origins[1]) # Articulation: First we define the robot config pick_and_place_robot_cfg = PICK_AND_PLACE_CFG.copy() @@ -108,14 +110,19 @@ def run_simulator( # root state # we offset the root state by the origin since the states are written in simulation world frame # if this is not done, then the robots will be spawned at the (0, 0, 0) of the simulation world - root_state = robot.data.default_root_state.clone() - root_state[:, :3] += origins - robot.write_root_pose_to_sim(root_state[:, :7]) - robot.write_root_velocity_to_sim(root_state[:, 7:]) + root_pose = robot.data.default_root_pose.torch.clone() + root_pose[:, :3] += origins + robot.write_root_pose_to_sim_index(root_pose=root_pose) + root_vel = robot.data.default_root_vel.torch.clone() + robot.write_root_velocity_to_sim_index(root_velocity=root_vel) # set joint positions with some noise - joint_pos, joint_vel = robot.data.default_joint_pos.clone(), robot.data.default_joint_vel.clone() + joint_pos, joint_vel = ( + robot.data.default_joint_pos.torch.clone(), + robot.data.default_joint_vel.torch.clone(), + ) joint_pos += torch.rand_like(joint_pos) * 0.1 - robot.write_joint_state_to_sim(joint_pos, joint_vel) + robot.write_joint_position_to_sim_index(position=joint_pos) + robot.write_joint_velocity_to_sim_index(velocity=joint_vel) # clear internal buffers robot.reset() print("[INFO]: Resetting robot state...") @@ -153,7 +160,8 @@ def run_simulator( # Print the gripper state print(f"[INFO]: Gripper state: {surface_gripper_state}") mapped_commands = [ - "Open" if state == -1 else "Closing" if state == 0 else "Closed" for state in surface_gripper_state.tolist() + "Open" if state == -1 else "Closing" if state == 0 else "Closed" + for state in wp.to_torch(surface_gripper_state).tolist() ] print(f"[INFO]: Mapped commands: {mapped_commands}") diff --git a/scripts/tutorials/02_scene/create_scene.py b/scripts/tutorials/02_scene/create_scene.py index 57d91a3e..674ae699 100644 --- a/scripts/tutorials/02_scene/create_scene.py +++ b/scripts/tutorials/02_scene/create_scene.py @@ -39,7 +39,7 @@ from isaaclab.assets import ArticulationCfg, AssetBaseCfg from isaaclab.scene import InteractiveScene, InteractiveSceneCfg from isaaclab.sim import SimulationContext -from isaaclab.utils import configclass +from isaaclab.utils.configclass import configclass ## # Pre-defined configs @@ -81,22 +81,27 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): # root state # we offset the root state by the origin since the states are written in simulation world frame # if this is not done, then the robots will be spawned at the (0, 0, 0) of the simulation world - root_state = robot.data.default_root_state.clone() - root_state[:, :3] += scene.env_origins - robot.write_root_pose_to_sim(root_state[:, :7]) - robot.write_root_velocity_to_sim(root_state[:, 7:]) + root_pose = robot.data.default_root_pose.torch.clone() + root_pose[:, :3] += scene.env_origins + robot.write_root_pose_to_sim_index(root_pose=root_pose) + root_vel = robot.data.default_root_vel.torch.clone() + robot.write_root_velocity_to_sim_index(root_velocity=root_vel) # set joint positions with some noise - joint_pos, joint_vel = robot.data.default_joint_pos.clone(), robot.data.default_joint_vel.clone() + joint_pos, joint_vel = ( + robot.data.default_joint_pos.torch.clone(), + robot.data.default_joint_vel.torch.clone(), + ) joint_pos += torch.rand_like(joint_pos) * 0.1 - robot.write_joint_state_to_sim(joint_pos, joint_vel) + robot.write_joint_position_to_sim_index(position=joint_pos) + robot.write_joint_velocity_to_sim_index(velocity=joint_vel) # clear internal buffers scene.reset() print("[INFO]: Resetting robot state...") # Apply random action # -- generate random joint efforts - efforts = torch.randn_like(robot.data.joint_pos) * 5.0 + efforts = torch.randn_like(robot.data.joint_pos.torch) * 5.0 # -- apply action to the robot - robot.set_joint_effort_target(efforts) + robot.set_joint_effort_target_index(target=efforts) # -- write data to sim scene.write_data_to_sim() # Perform step diff --git a/scripts/tutorials/04_sensors/add_sensors_on_robot.py b/scripts/tutorials/04_sensors/add_sensors_on_robot.py index c877566b..6ad27355 100644 --- a/scripts/tutorials/04_sensors/add_sensors_on_robot.py +++ b/scripts/tutorials/04_sensors/add_sensors_on_robot.py @@ -15,7 +15,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/04_sensors/add_sensors_on_robot.py --enable_cameras + ./isaaclab.sh -p scripts/tutorials/04_sensors/add_sensors_on_robot.py --enable_cameras --viz kit """ @@ -45,7 +45,7 @@ from isaaclab.assets import ArticulationCfg, AssetBaseCfg from isaaclab.scene import InteractiveScene, InteractiveSceneCfg from isaaclab.sensors import CameraCfg, ContactSensorCfg, RayCasterCfg, patterns -from isaaclab.utils import configclass +from isaaclab.utils.configclass import configclass ## # Pre-defined configs @@ -111,25 +111,27 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): # root state # we offset the root state by the origin since the states are written in simulation world frame # if this is not done, then the robots will be spawned at the (0, 0, 0) of the simulation world - root_state = scene["robot"].data.default_root_state.clone() - root_state[:, :3] += scene.env_origins - scene["robot"].write_root_pose_to_sim(root_state[:, :7]) - scene["robot"].write_root_velocity_to_sim(root_state[:, 7:]) + root_pose = scene["robot"].data.default_root_pose.torch.clone() + root_pose[:, :3] += scene.env_origins + scene["robot"].write_root_pose_to_sim_index(root_pose=root_pose) + root_vel = scene["robot"].data.default_root_vel.torch.clone() + scene["robot"].write_root_velocity_to_sim_index(root_velocity=root_vel) # set joint positions with some noise joint_pos, joint_vel = ( - scene["robot"].data.default_joint_pos.clone(), - scene["robot"].data.default_joint_vel.clone(), + scene["robot"].data.default_joint_pos.torch.clone(), + scene["robot"].data.default_joint_vel.torch.clone(), ) joint_pos += torch.rand_like(joint_pos) * 0.1 - scene["robot"].write_joint_state_to_sim(joint_pos, joint_vel) + scene["robot"].write_joint_position_to_sim_index(position=joint_pos) + scene["robot"].write_joint_velocity_to_sim_index(velocity=joint_vel) # clear internal buffers scene.reset() print("[INFO]: Resetting robot state...") # Apply default actions to the robot # -- generate actions/commands - targets = scene["robot"].data.default_joint_pos + targets = scene["robot"].data.default_joint_pos.torch # -- apply action to the robot - scene["robot"].set_joint_position_target(targets) + scene["robot"].set_joint_position_target_index(target=targets) # -- write data to sim scene.write_data_to_sim() # perform step @@ -147,7 +149,10 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): print("Received shape of depth image: ", scene["camera"].data.output["distance_to_image_plane"].shape) print("-------------------------------") print(scene["height_scanner"]) - print("Received max height value: ", torch.max(scene["height_scanner"].data.ray_hits_w[..., -1]).item()) + print( + "Received max height value: ", + torch.max(scene["height_scanner"].data.ray_hits_w.torch[..., -1]).item(), + ) print("-------------------------------") print(scene["contact_forces"]) print("Received max contact force of: ", torch.max(scene["contact_forces"].data.net_forces_w).item()) diff --git a/scripts/tutorials/04_sensors/run_frame_transformer.py b/scripts/tutorials/04_sensors/run_frame_transformer.py index 41890e9d..a889b9e5 100644 --- a/scripts/tutorials/04_sensors/run_frame_transformer.py +++ b/scripts/tutorials/04_sensors/run_frame_transformer.py @@ -9,7 +9,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/04_sensors/run_frame_transformer.py + ./isaaclab.sh -p scripts/tutorials/04_sensors/run_frame_transformer.py --viz kit """ @@ -27,15 +27,20 @@ args_cli = parser.parse_args() # launch omniverse app -app_launcher = AppLauncher(headless=args_cli.headless) +app_launcher = AppLauncher(args_cli) simulation_app = app_launcher.app """Rest everything follows.""" import math + import torch -import isaacsim.util.debug_draw._debug_draw as omni_debug_draw +from isaacsim.core.experimental.utils.app import enable_extension + +enable_extension("isaacsim.util.debug_draw") + +from isaacsim.util.debug_draw import _debug_draw as omni_debug_draw import isaaclab.sim as sim_utils import isaaclab.utils.math as math_utils @@ -50,6 +55,9 @@ ## from isaaclab_assets.robots.anymal import ANYMAL_C_CFG # isort:skip +ROBOT_PRIM_PATH = "/World/envs/env_0/Robot" +ROBOT_PRIM_PATH_EXPR = "/World/envs/env_.*/Robot" + def define_sensor() -> FrameTransformer: """Defines the FrameTransformer sensor to add to the scene.""" @@ -59,11 +67,11 @@ def define_sensor() -> FrameTransformer: # Example using .* to get full body + LF_FOOT frame_transformer_cfg = FrameTransformerCfg( - prim_path="/World/Robot/base", + prim_path=f"{ROBOT_PRIM_PATH_EXPR}/base", target_frames=[ - FrameTransformerCfg.FrameCfg(prim_path="/World/Robot/.*"), + FrameTransformerCfg.FrameCfg(prim_path=f"{ROBOT_PRIM_PATH_EXPR}/.*"), FrameTransformerCfg.FrameCfg( - prim_path="/World/Robot/LF_SHANK", + prim_path=f"{ROBOT_PRIM_PATH_EXPR}/LF_SHANK", name="LF_FOOT_USER", offset=OffsetCfg(pos=tuple(pos_offset.tolist()), rot=tuple(rot_offset[0].tolist())), ), @@ -85,7 +93,7 @@ def design_scene() -> dict: cfg = sim_utils.DistantLightCfg(intensity=3000.0, color=(0.75, 0.75, 0.75)) cfg.func("/World/Light", cfg) # -- Robot - robot = Articulation(ANYMAL_C_CFG.replace(prim_path="/World/Robot")) + robot = Articulation(ANYMAL_C_CFG.replace(prim_path=ROBOT_PRIM_PATH)) # -- Sensors frame_transformer = define_sensor() @@ -122,7 +130,7 @@ def run_simulator(sim: sim_utils.SimulationContext, scene_entities: dict): # Simulate physics while simulation_app.is_running(): # perform this loop at policy control freq (50 Hz) - robot.set_joint_position_target(robot.data.default_joint_pos.clone()) + robot.set_joint_position_target_index(target=robot.data.default_joint_pos.torch.clone()) robot.write_data_to_sim() # perform step sim.step() @@ -145,10 +153,10 @@ def run_simulator(sim: sim_utils.SimulationContext, scene_entities: dict): print(f"Displaying Frame ID {frame_index}: {frame_names[frame_index]}") # visualize frame - source_pos = frame_transformer.data.source_pos_w - source_quat = frame_transformer.data.source_quat_w - target_pos = frame_transformer.data.target_pos_w[:, frame_index] - target_quat = frame_transformer.data.target_quat_w[:, frame_index] + source_pos = frame_transformer.data.source_pos_w.torch + source_quat = frame_transformer.data.source_quat_w.torch + target_pos = frame_transformer.data.target_pos_w.torch[:, frame_index] + target_quat = frame_transformer.data.target_quat_w.torch[:, frame_index] # draw the frames transform_visualizer.visualize( torch.cat([source_pos, target_pos], dim=0), torch.cat([source_quat, target_quat], dim=0) diff --git a/scripts/tutorials/04_sensors/run_ray_caster.py b/scripts/tutorials/04_sensors/run_ray_caster.py index 9916fa97..1c976f31 100644 --- a/scripts/tutorials/04_sensors/run_ray_caster.py +++ b/scripts/tutorials/04_sensors/run_ray_caster.py @@ -9,7 +9,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/04_sensors/run_ray_caster.py + ./isaaclab.sh -p scripts/tutorials/04_sensors/run_ray_caster.py --viz kit """ @@ -33,8 +33,6 @@ import torch -import isaacsim.core.utils.prims as prim_utils - import isaaclab.sim as sim_utils from isaaclab.assets import RigidObject, RigidObjectCfg from isaaclab.sensors.ray_caster import RayCaster, RayCasterCfg, patterns @@ -71,7 +69,7 @@ def design_scene() -> dict: # Each group will have a robot in it origins = [[0.25, 0.25, 0.0], [-0.25, 0.25, 0.0], [0.25, -0.25, 0.0], [-0.25, -0.25, 0.0]] for i, origin in enumerate(origins): - prim_utils.create_prim(f"/World/Origin{i}", "Xform", translation=origin) + sim_utils.create_prim(f"/World/Origin{i}", "Xform", translation=origin) # -- Balls cfg = RigidObjectCfg( prim_path="/World/Origin.*/ball", @@ -99,8 +97,9 @@ def run_simulator(sim: sim_utils.SimulationContext, scene_entities: dict): balls: RigidObject = scene_entities["balls"] # define an initial position of the sensor - ball_default_state = balls.data.default_root_state.clone() - ball_default_state[:, :3] = torch.rand_like(ball_default_state[:, :3]) * 10 + ball_default_pose = balls.data.default_root_pose.torch.clone() + ball_default_pose[:, :3] = torch.rand_like(ball_default_pose[:, :3]) * 10 + ball_default_vel = balls.data.default_root_vel.torch.clone() # Create a counter for resetting the scene step_count = 0 @@ -109,8 +108,8 @@ def run_simulator(sim: sim_utils.SimulationContext, scene_entities: dict): # Reset the scene if step_count % 250 == 0: # reset the balls - balls.write_root_pose_to_sim(ball_default_state[:, :7]) - balls.write_root_velocity_to_sim(ball_default_state[:, 7:]) + balls.write_root_pose_to_sim_index(root_pose=ball_default_pose) + balls.write_root_velocity_to_sim_index(root_velocity=ball_default_vel) # reset the sensor ray_caster.reset() # reset the counter @@ -120,7 +119,7 @@ def run_simulator(sim: sim_utils.SimulationContext, scene_entities: dict): # Update the ray-caster with Timer( f"Ray-caster update with {4} x {ray_caster.num_rays} rays with max height of" - f" {torch.max(ray_caster.data.pos_w).item():.2f}" + f" {torch.max(ray_caster.data.pos_w.torch).item():.2f}" ): ray_caster.update(dt=sim.get_physics_dt(), force_recompute=True) # Update counter diff --git a/scripts/tutorials/04_sensors/run_ray_caster_camera.py b/scripts/tutorials/04_sensors/run_ray_caster_camera.py index 3cfe3905..bdbfe57b 100644 --- a/scripts/tutorials/04_sensors/run_ray_caster_camera.py +++ b/scripts/tutorials/04_sensors/run_ray_caster_camera.py @@ -11,7 +11,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/04_sensors/run_ray_caster_camera.py + ./isaaclab.sh -p scripts/tutorials/04_sensors/run_ray_caster_camera.py --viz kit """ @@ -36,9 +36,9 @@ """Rest everything follows.""" import os + import torch -import isaacsim.core.utils.prims as prim_utils import omni.replicator.core as rep import isaaclab.sim as sim_utils @@ -53,8 +53,8 @@ def define_sensor() -> RayCasterCamera: # Camera base frames # In contras to the USD camera, we associate the sensor to the prims at these locations. # This means that parent prim of the sensor is the prim at this location. - prim_utils.create_prim("/World/Origin_00/CameraSensor", "Xform") - prim_utils.create_prim("/World/Origin_01/CameraSensor", "Xform") + sim_utils.create_prim("/World/Origin_00/CameraSensor", "Xform") + sim_utils.create_prim("/World/Origin_01/CameraSensor", "Xform") # Setup camera sensor camera_cfg = RayCasterCameraCfg( @@ -132,12 +132,10 @@ def run_simulator(sim: sim_utils.SimulationContext, scene_entities: dict): single_cam_data = convert_dict_to_backend( {k: v[camera_index] for k, v in camera.data.output.items()}, backend="numpy" ) - # Extract the other information - single_cam_info = camera.data.info[camera_index] - # Pack data back into replicator format to save them using its writer rep_output = {"annotators": {}} - for key, data, info in zip(single_cam_data.keys(), single_cam_data.values(), single_cam_info.values()): + for key, data in single_cam_data.items(): + info = camera.data.info.get(key) if info is not None: rep_output["annotators"][key] = {"render_product": {"data": data, **info}} else: diff --git a/scripts/tutorials/04_sensors/run_usd_camera.py b/scripts/tutorials/04_sensors/run_usd_camera.py index 1d360231..28a30035 100644 --- a/scripts/tutorials/04_sensors/run_usd_camera.py +++ b/scripts/tutorials/04_sensors/run_usd_camera.py @@ -12,7 +12,7 @@ .. code-block:: bash # Usage with GUI - ./isaaclab.sh -p scripts/tutorials/04_sensors/run_usd_camera.py --enable_cameras + ./isaaclab.sh -p scripts/tutorials/04_sensors/run_usd_camera.py --enable_cameras --viz kit # Usage with headless ./isaaclab.sh -p scripts/tutorials/04_sensors/run_usd_camera.py --headless --enable_cameras @@ -60,12 +60,13 @@ """Rest everything follows.""" -import numpy as np import os import random + +import numpy as np import torch +from isaaclab_physx.renderers import IsaacRtxRendererCfg -import isaacsim.core.utils.prims as prim_utils import omni.replicator.core as rep import isaaclab.sim as sim_utils @@ -82,8 +83,8 @@ def define_sensor() -> Camera: # Setup camera sensor # In contrast to the ray-cast camera, we spawn the prim at these locations. # This means the camera sensor will be attached to these prims. - prim_utils.create_prim("/World/Origin_00", "Xform") - prim_utils.create_prim("/World/Origin_01", "Xform") + sim_utils.create_prim("/World/Origin_00", "Xform") + sim_utils.create_prim("/World/Origin_01", "Xform") camera_cfg = CameraCfg( prim_path="/World/Origin_.*/CameraSensor", update_period=0, @@ -97,9 +98,11 @@ def define_sensor() -> Camera: "instance_segmentation_fast", "instance_id_segmentation_fast", ], - colorize_semantic_segmentation=True, - colorize_instance_id_segmentation=True, - colorize_instance_segmentation=True, + renderer_cfg=IsaacRtxRendererCfg( + colorize_semantic_segmentation=True, + colorize_instance_id_segmentation=True, + colorize_instance_segmentation=True, + ), spawn=sim_utils.PinholeCameraCfg( focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 1.0e5) ), @@ -124,7 +127,7 @@ def design_scene() -> dict: scene_entities = {} # Xform to hold objects - prim_utils.create_prim("/World/Objects", "Xform") + sim_utils.create_prim("/World/Objects", "Xform") # Random objects for i in range(8): # sample random position @@ -173,9 +176,9 @@ def run_simulator(sim: sim_utils.SimulationContext, scene_entities: dict): rep_writer = rep.BasicWriter( output_dir=output_dir, frame_padding=0, - colorize_instance_id_segmentation=camera.cfg.colorize_instance_id_segmentation, - colorize_instance_segmentation=camera.cfg.colorize_instance_segmentation, - colorize_semantic_segmentation=camera.cfg.colorize_semantic_segmentation, + colorize_instance_id_segmentation=camera.cfg.renderer_cfg.colorize_instance_id_segmentation, + colorize_instance_segmentation=camera.cfg.renderer_cfg.colorize_instance_segmentation, + colorize_semantic_segmentation=camera.cfg.renderer_cfg.colorize_semantic_segmentation, ) # Camera positions, targets, orientations @@ -196,7 +199,7 @@ def run_simulator(sim: sim_utils.SimulationContext, scene_entities: dict): camera_index = args_cli.camera_id # Create the markers for the --draw option outside of is_running() loop - if sim.has_gui() and args_cli.draw: + if sim.get_setting("/isaaclab/has_gui") and args_cli.draw: cfg = RAY_CASTER_MARKER_CFG.replace(prim_path="/Visuals/CameraPointCloud") cfg.markers["hit"].radius = 0.002 pc_markers = VisualizationMarkers(cfg) @@ -232,12 +235,10 @@ def run_simulator(sim: sim_utils.SimulationContext, scene_entities: dict): {k: v[camera_index] for k, v in camera.data.output.items()}, backend="numpy" ) - # Extract the other information - single_cam_info = camera.data.info[camera_index] - # Pack data back into replicator format to save them using its writer rep_output = {"annotators": {}} - for key, data, info in zip(single_cam_data.keys(), single_cam_data.values(), single_cam_info.values()): + for key, data in single_cam_data.items(): + info = camera.data.info.get(key) if info is not None: rep_output["annotators"][key] = {"render_product": {"data": data, **info}} else: @@ -248,7 +249,11 @@ def run_simulator(sim: sim_utils.SimulationContext, scene_entities: dict): rep_writer.write(rep_output) # Draw pointcloud if there is a GUI and --draw has been passed - if sim.has_gui() and args_cli.draw and "distance_to_image_plane" in camera.data.output.keys(): + if ( + sim.get_setting("/isaaclab/has_gui") + and args_cli.draw + and "distance_to_image_plane" in camera.data.output.keys() + ): # Derive pointcloud from camera at camera_index pointcloud = create_pointcloud_from_depth( intrinsic_matrix=camera.data.intrinsic_matrices[camera_index], diff --git a/scripts/tutorials/05_controllers/run_diff_ik.py b/scripts/tutorials/05_controllers/run_diff_ik.py index 180b4c48..8d55b482 100644 --- a/scripts/tutorials/05_controllers/run_diff_ik.py +++ b/scripts/tutorials/05_controllers/run_diff_ik.py @@ -46,8 +46,8 @@ from isaaclab.markers import VisualizationMarkers from isaaclab.markers.config import FRAME_MARKER_CFG from isaaclab.scene import InteractiveScene, InteractiveSceneCfg -from isaaclab.utils import configclass from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +from isaaclab.utils.configclass import configclass from isaaclab.utils.math import subtract_frame_transforms ## @@ -105,11 +105,11 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): ee_marker = VisualizationMarkers(frame_marker_cfg.replace(prim_path="/Visuals/ee_current")) goal_marker = VisualizationMarkers(frame_marker_cfg.replace(prim_path="/Visuals/ee_goal")) - # Define goals for the arm + # Define goals for the arm (x,y,z,qx,qy,qz,qw) ee_goals = [ - [0.5, 0.5, 0.7, 0.707, 0, 0.707, 0], - [0.5, -0.4, 0.6, 0.707, 0.707, 0.0, 0.0], - [0.5, 0, 0.5, 0.0, 1.0, 0.0, 0.0], + [0.5, 0.5, 0.7, 0, 0.707, 0, 0.707], + [0.5, -0.4, 0.6, 0.707, 0, 0, 0.707], + [0.5, 0, 0.5, 1.0, 0.0, 0.0, 0.0], ] ee_goals = torch.tensor(ee_goals, device=sim.device) # Track the given command @@ -145,9 +145,10 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): # reset time count = 0 # reset joint state - joint_pos = robot.data.default_joint_pos.clone() - joint_vel = robot.data.default_joint_vel.clone() - robot.write_joint_state_to_sim(joint_pos, joint_vel) + joint_pos = robot.data.default_joint_pos.torch.clone() + joint_vel = robot.data.default_joint_vel.torch.clone() + robot.write_joint_position_to_sim_index(position=joint_pos) + robot.write_joint_velocity_to_sim_index(velocity=joint_vel) robot.reset() # reset actions ik_commands[:] = ee_goals[current_goal_idx] @@ -158,11 +159,14 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): # change goal current_goal_idx = (current_goal_idx + 1) % len(ee_goals) else: - # obtain quantities from simulation - jacobian = robot.root_physx_view.get_jacobians()[:, ee_jacobi_idx, :, robot_entity_cfg.joint_ids] - ee_pose_w = robot.data.body_pose_w[:, robot_entity_cfg.body_ids[0]] - root_pose_w = robot.data.root_pose_w - joint_pos = robot.data.joint_pos[:, robot_entity_cfg.joint_ids] + # obtain quantities from simulation. The Jacobian DoF axis prepends + # ``num_base_dofs`` floating-base columns (0 for fixed-base, 6 for + # floating-base); shift the actuated-joint ids accordingly. + jacobi_joint_ids = [j + robot.num_base_dofs for j in robot_entity_cfg.joint_ids] + jacobian = robot.data.body_link_jacobian_w.torch[:, ee_jacobi_idx, :, jacobi_joint_ids] + ee_pose_w = robot.data.body_pose_w.torch[:, robot_entity_cfg.body_ids[0]] + root_pose_w = robot.data.root_pose_w.torch + joint_pos = robot.data.joint_pos.torch[:, robot_entity_cfg.joint_ids] # compute frame in root frame ee_pos_b, ee_quat_b = subtract_frame_transforms( root_pose_w[:, 0:3], root_pose_w[:, 3:7], ee_pose_w[:, 0:3], ee_pose_w[:, 3:7] @@ -171,7 +175,7 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): joint_pos_des = diff_ik_controller.compute(ee_pos_b, ee_quat_b, jacobian, joint_pos) # apply actions - robot.set_joint_position_target(joint_pos_des, joint_ids=robot_entity_cfg.joint_ids) + robot.set_joint_position_target_index(target=joint_pos_des, joint_ids=robot_entity_cfg.joint_ids) scene.write_data_to_sim() # perform step sim.step() @@ -181,7 +185,7 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): scene.update(sim_dt) # obtain quantities from simulation - ee_pose_w = robot.data.body_state_w[:, robot_entity_cfg.body_ids[0], 0:7] + ee_pose_w = robot.data.body_state_w.torch[:, robot_entity_cfg.body_ids[0], 0:7] # update marker positions ee_marker.visualize(ee_pose_w[:, 0:3], ee_pose_w[:, 3:7]) goal_marker.visualize(ik_commands[:, 0:3] + scene.env_origins, ik_commands[:, 3:7]) diff --git a/scripts/tutorials/05_controllers/run_osc.py b/scripts/tutorials/05_controllers/run_osc.py index 7578fcf9..5e5c5073 100644 --- a/scripts/tutorials/05_controllers/run_osc.py +++ b/scripts/tutorials/05_controllers/run_osc.py @@ -45,7 +45,7 @@ from isaaclab.markers.config import FRAME_MARKER_CFG from isaaclab.scene import InteractiveScene, InteractiveSceneCfg from isaaclab.sensors import ContactSensorCfg -from isaaclab.utils import configclass +from isaaclab.utils.configclass import configclass from isaaclab.utils.math import ( combine_frame_transforms, matrix_from_quat, @@ -86,7 +86,7 @@ class SceneCfg(InteractiveSceneCfg): activate_contact_sensors=True, ), init_state=AssetBaseCfg.InitialStateCfg( - pos=(0.6 + 0.085, 0.0, 0.3), rot=(0.9238795325, 0.0, -0.3826834324, 0.0) + pos=(0.6 + 0.085, 0.0, 0.3), rot=(0.0, -0.3826834324, 0.0, 0.9238795325) ), ) @@ -144,12 +144,12 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): ee_marker = VisualizationMarkers(frame_marker_cfg.replace(prim_path="/Visuals/ee_current")) goal_marker = VisualizationMarkers(frame_marker_cfg.replace(prim_path="/Visuals/ee_goal")) - # Define targets for the arm + # Define targets for the arm (x,y,z,qx,qy,qz,qw) ee_goal_pose_set_tilted_b = torch.tensor( [ - [0.6, 0.15, 0.3, 0.0, 0.92387953, 0.0, 0.38268343], - [0.6, -0.3, 0.3, 0.0, 0.92387953, 0.0, 0.38268343], - [0.8, 0.0, 0.5, 0.0, 0.92387953, 0.0, 0.38268343], + [0.6, 0.15, 0.3, 0.0, 0.38268343, 0.0, 0.92387953], + [0.6, -0.3, 0.3, 0.0, 0.38268343, 0.0, 0.92387953], + [0.8, 0.0, 0.5, 0.0, 0.38268343, 0.0, 0.92387953], ], device=sim.device, ) @@ -179,7 +179,7 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): robot.update(dt=sim_dt) # Get the center of the robot soft joint limits - joint_centers = torch.mean(robot.data.soft_joint_pos_limits[:, arm_joint_ids, :], dim=-1) + joint_centers = torch.mean(robot.data.soft_joint_pos_limits.torch[:, arm_joint_ids, :], dim=-1) # get the updated states ( @@ -213,10 +213,11 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): # reset every 500 steps if count % 500 == 0: # reset joint state to default - default_joint_pos = robot.data.default_joint_pos.clone() - default_joint_vel = robot.data.default_joint_vel.clone() - robot.write_joint_state_to_sim(default_joint_pos, default_joint_vel) - robot.set_joint_effort_target(zero_joint_efforts) # Set zero torques in the initial step + default_joint_pos = robot.data.default_joint_pos.torch.clone() + default_joint_vel = robot.data.default_joint_vel.torch.clone() + robot.write_joint_position_to_sim_index(position=default_joint_pos) + robot.write_joint_velocity_to_sim_index(velocity=default_joint_vel) + robot.set_joint_effort_target_index(target=zero_joint_efforts) # Set zero torques in the initial step robot.write_data_to_sim() robot.reset() # reset contact sensor @@ -260,7 +261,7 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): nullspace_joint_pos_target=joint_centers, ) # apply actions - robot.set_joint_effort_target(joint_efforts, joint_ids=arm_joint_ids) + robot.set_joint_effort_target_index(target=joint_efforts, joint_ids=arm_joint_ids) robot.write_data_to_sim() # update marker positions @@ -313,31 +314,35 @@ def update_states( """ # obtain dynamics related quantities from simulation ee_jacobi_idx = ee_frame_idx - 1 - jacobian_w = robot.root_physx_view.get_jacobians()[:, ee_jacobi_idx, :, arm_joint_ids] - mass_matrix = robot.root_physx_view.get_generalized_mass_matrices()[:, arm_joint_ids, :][:, :, arm_joint_ids] - gravity = robot.root_physx_view.get_gravity_compensation_forces()[:, arm_joint_ids] + # The J / M / g DoF axis prepends ``num_base_dofs`` floating-base columns + # (0 for fixed-base, 6 for floating-base); shift the actuated-joint ids by + # ``num_base_dofs`` to address the actuated-joint columns directly. + jacobi_joint_ids = [j + robot.num_base_dofs for j in arm_joint_ids] + jacobian_w = robot.data.body_link_jacobian_w.torch[:, ee_jacobi_idx, :, jacobi_joint_ids] + mass_matrix = robot.data.mass_matrix.torch[:, jacobi_joint_ids, :][:, :, jacobi_joint_ids] + gravity = robot.data.gravity_compensation_forces.torch[:, jacobi_joint_ids] # Convert the Jacobian from world to root frame jacobian_b = jacobian_w.clone() - root_rot_matrix = matrix_from_quat(quat_inv(robot.data.root_quat_w)) + root_rot_matrix = matrix_from_quat(quat_inv(robot.data.root_quat_w.torch)) jacobian_b[:, :3, :] = torch.bmm(root_rot_matrix, jacobian_b[:, :3, :]) jacobian_b[:, 3:, :] = torch.bmm(root_rot_matrix, jacobian_b[:, 3:, :]) # Compute current pose of the end-effector - root_pos_w = robot.data.root_pos_w - root_quat_w = robot.data.root_quat_w - ee_pos_w = robot.data.body_pos_w[:, ee_frame_idx] - ee_quat_w = robot.data.body_quat_w[:, ee_frame_idx] + root_pos_w = robot.data.root_pos_w.torch + root_quat_w = robot.data.root_quat_w.torch + ee_pos_w = robot.data.body_pos_w.torch[:, ee_frame_idx] + ee_quat_w = robot.data.body_quat_w.torch[:, ee_frame_idx] ee_pos_b, ee_quat_b = subtract_frame_transforms(root_pos_w, root_quat_w, ee_pos_w, ee_quat_w) root_pose_w = torch.cat([root_pos_w, root_quat_w], dim=-1) ee_pose_w = torch.cat([ee_pos_w, ee_quat_w], dim=-1) ee_pose_b = torch.cat([ee_pos_b, ee_quat_b], dim=-1) # Compute the current velocity of the end-effector - ee_vel_w = robot.data.body_vel_w[:, ee_frame_idx, :] # Extract end-effector velocity in the world frame - root_vel_w = robot.data.root_vel_w # Extract root velocity in the world frame + ee_vel_w = robot.data.body_vel_w.torch[:, ee_frame_idx, :] # Extract end-effector velocity in the world frame + root_vel_w = robot.data.root_vel_w.torch # Extract root velocity in the world frame relative_vel_w = ee_vel_w - root_vel_w # Compute the relative velocity in the world frame - ee_lin_vel_b = quat_apply_inverse(robot.data.root_quat_w, relative_vel_w[:, 0:3]) # From world to root frame - ee_ang_vel_b = quat_apply_inverse(robot.data.root_quat_w, relative_vel_w[:, 3:6]) + ee_lin_vel_b = quat_apply_inverse(robot.data.root_quat_w.torch, relative_vel_w[:, 0:3]) # From world to root frame + ee_ang_vel_b = quat_apply_inverse(robot.data.root_quat_w.torch, relative_vel_w[:, 3:6]) ee_vel_b = torch.cat([ee_lin_vel_b, ee_ang_vel_b], dim=-1) # Calculate the contact force @@ -352,8 +357,8 @@ def update_states( ee_force_b = ee_force_w # Get joint positions and velocities - joint_pos = robot.data.joint_pos[:, arm_joint_ids] - joint_vel = robot.data.joint_vel[:, arm_joint_ids] + joint_pos = robot.data.joint_pos.torch[:, arm_joint_ids] + joint_vel = robot.data.joint_vel.torch[:, arm_joint_ids] return ( jacobian_b, diff --git a/scripts_v2/tools/collect_demos.py b/scripts_v2/tools/collect_demos.py index d1de6599..1fa91619 100644 --- a/scripts_v2/tools/collect_demos.py +++ b/scripts_v2/tools/collect_demos.py @@ -28,7 +28,7 @@ parser.add_argument("--dataset_file", type=str, default="./datasets/dataset.zarr", help="Output dataset path.") parser.add_argument("--num_demos", type=int, default=10, help="Number of demonstrations to record.") parser.add_argument( - "--deterministic", + "--deterministic_expert", action="store_true", default=False, help="Use the mean of the policy distribution instead of sampling.", @@ -154,7 +154,7 @@ def main(env_cfg: ManagerBasedRLEnvCfg | DirectRLEnvCfg, agent_cfg: RslRlOnPolic expert_policy = loader(bc.experts_path[0]).to(env_cfg.sim.device) expert_policy.eval() - print(f"[Policy] {'Deterministic (mean)' if args_cli.deterministic else 'Stochastic (sampled)'} actions") + print(f"[Policy] {'Deterministic (mean)' if args_cli.deterministic_expert else 'Stochastic (sampled)'} actions") # simulate environment -- run everything in inference mode current_recorded_demo_count = 0 @@ -166,7 +166,7 @@ def main(env_cfg: ManagerBasedRLEnvCfg | DirectRLEnvCfg, agent_cfg: RslRlOnPolic # agent stepping expert_policy_obs = expert_obs_fn(env) mean, std = expert_policy.compute_distribution(expert_policy_obs) - actions = mean if args_cli.deterministic else torch.normal(mean, std) + actions = mean if args_cli.deterministic_expert else torch.normal(mean, std) # Mask actions to zero for environments in their first step after reset since first image may not be valid first_step_mask = env.unwrapped.episode_length_buf == 0 diff --git a/scripts_v2/tools/record_grasps.py b/scripts_v2/tools/record_grasps.py index 24b9e623..306660aa 100644 --- a/scripts_v2/tools/record_grasps.py +++ b/scripts_v2/tools/record_grasps.py @@ -22,7 +22,10 @@ parser.add_argument("--num_envs", type=int, default=1, help="Number of environments to simulate.") parser.add_argument("--task", type=str, default="OmniReset-Robotiq2f85-GraspSampling-v0", help="Name of the task.") parser.add_argument( - "--dataset_dir", type=str, default="./Datasets/OmniReset/", help="Root Datasets/OmniReset/ directory." + "--dataset_dir", + type=str, + default="./Datasets/OmniReset_isaaclab3/", + help="Root Datasets/OmniReset_isaaclab3/ directory.", ) parser.add_argument("--num_grasps", type=int, default=500, help="Number of grasp candidates to evaluate.") diff --git a/scripts_v2/tools/record_partial_assemblies.py b/scripts_v2/tools/record_partial_assemblies.py index 66619341..52b7614b 100644 --- a/scripts_v2/tools/record_partial_assemblies.py +++ b/scripts_v2/tools/record_partial_assemblies.py @@ -22,7 +22,10 @@ parser.add_argument("--num_envs", type=int, default=1, help="Number of environments to simulate.") parser.add_argument("--task", type=str, default="UW-FBLeg-PartialAssemblies-v0", help="Name of the task.") parser.add_argument( - "--dataset_dir", type=str, default="./Datasets/OmniReset/", help="Root Datasets/OmniReset/ directory." + "--dataset_dir", + type=str, + default="./Datasets/OmniReset_isaaclab3/", + help="Root Datasets/OmniReset_isaaclab3/ directory.", ) parser.add_argument( "--num_trajectories", type=int, default=1, help="Number of physics trajectories to run for pose discovery." @@ -196,7 +199,8 @@ def _save_poses_to_dataset(pose_batches: list, dataset_dir: str, pair_name: str) output_dir = os.path.join(dataset_dir, "Resets", pair_name) os.makedirs(output_dir, exist_ok=True) output_file = os.path.join(output_dir, "partial_assemblies.pt") - torch.save(all_poses, output_file) + # Stamp the quaternion convention; loaders refuse files without it. + torch.save({**all_poses, "quat_convention": "xyzw"}, output_file) print(f"Saved {len(all_poses['relative_position'])} poses to {output_file}") diff --git a/scripts_v2/tools/record_reset_states.py b/scripts_v2/tools/record_reset_states.py index c656bba1..51a0108f 100644 --- a/scripts_v2/tools/record_reset_states.py +++ b/scripts_v2/tools/record_reset_states.py @@ -24,7 +24,10 @@ "--task", type=str, default="OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEAnywhere-v0", help="Name of the task." ) parser.add_argument( - "--dataset_dir", type=str, default="./Datasets/OmniReset/", help="Root Datasets/OmniReset/ directory." + "--dataset_dir", + type=str, + default="./Datasets/OmniReset_isaaclab3/", + help="Root Datasets/OmniReset_isaaclab3/ directory.", ) parser.add_argument( "--reset_type", diff --git a/scripts_v2/tools/sim2real/collect_fk_pairs.py b/scripts_v2/tools/sim2real/collect_fk_pairs.py index a7f8dcb7..fe31074f 100644 --- a/scripts_v2/tools/sim2real/collect_fk_pairs.py +++ b/scripts_v2/tools/sim2real/collect_fk_pairs.py @@ -123,8 +123,8 @@ def main(): ee_pos_w = robot.data.body_link_pos_w[:, ee_idx] # (N, 3) ee_quat_w = robot.data.body_link_quat_w[:, ee_idx] # (N, 4) ee_pos_b, ee_quat_b = math_utils.subtract_frame_transforms( - robot.data.root_pos_w, - robot.data.root_quat_w, + robot.data.root_pos_w.torch, + robot.data.root_quat_w.torch, ee_pos_w, ee_quat_w, ) diff --git a/scripts_v2/tools/sim2real/plot_sysid_fit.py b/scripts_v2/tools/sim2real/plot_sysid_fit.py index 8605fc8b..b2b1ada0 100644 --- a/scripts_v2/tools/sim2real/plot_sysid_fit.py +++ b/scripts_v2/tools/sim2real/plot_sysid_fit.py @@ -111,8 +111,8 @@ def closed_loop_replay( action_dim = unwrapped.action_manager.total_action_dim W = wp_step_indices.shape[0] - default_joint_pos = robot.data.default_joint_pos.clone() - default_joint_vel = robot.data.default_joint_vel.clone() + default_joint_pos = robot.data.default_joint_pos.torch.clone() + default_joint_vel = robot.data.default_joint_vel.torch.clone() default_joint_pos[:, arm_joint_ids] = initial_joint_pos.unsqueeze(0) default_joint_vel[:] = 0.0 env.reset() @@ -128,7 +128,7 @@ def closed_loop_replay( ee_pos_w = robot.data.body_pos_w[:, ee_frame_idx] ee_quat_w = robot.data.body_quat_w[:, ee_frame_idx] ee_pos_b, ee_quat_b = subtract_frame_transforms( - robot.data.root_pos_w, robot.data.root_quat_w, ee_pos_w, ee_quat_w + robot.data.root_pos_w.torch, robot.data.root_quat_w.torch, ee_pos_w, ee_quat_w ) target_pos = wp_target_pos[wp_idx].unsqueeze(0) target_quat = wp_target_quat[wp_idx].unsqueeze(0) diff --git a/scripts_v2/tools/sim2real/sysid_ur5e_osc.py b/scripts_v2/tools/sim2real/sysid_ur5e_osc.py index a6e6813f..ac5cb654 100644 --- a/scripts_v2/tools/sim2real/sysid_ur5e_osc.py +++ b/scripts_v2/tools/sim2real/sysid_ur5e_osc.py @@ -234,8 +234,8 @@ def main(): sim_dt = env_cfg.sim.dt action_dim = unwrapped.action_manager.total_action_dim # 7 (arm 6 + gripper 1) - default_joint_pos = robot.data.default_joint_pos.clone() - default_joint_vel = robot.data.default_joint_vel.clone() + default_joint_pos = robot.data.default_joint_pos.torch.clone() + default_joint_vel = robot.data.default_joint_vel.torch.clone() default_joint_pos[:, arm_joint_ids] = initial_joint_pos_dev.unsqueeze(0).expand(N, -1) default_joint_vel[:] = 0.0 @@ -278,7 +278,7 @@ def main(): ee_pos_w = robot.data.body_pos_w[:, ee_frame_idx] ee_quat_w = robot.data.body_quat_w[:, ee_frame_idx] ee_pos_b, ee_quat_b = subtract_frame_transforms( - robot.data.root_pos_w, robot.data.root_quat_w, ee_pos_w, ee_quat_w + robot.data.root_pos_w.torch, robot.data.root_quat_w.torch, ee_pos_w, ee_quat_w ) target_pos = wp_target_pos[wp_idx].unsqueeze(0).expand(N, -1) target_quat = wp_target_quat[wp_idx].unsqueeze(0).expand(N, -1) diff --git a/scripts_v2/tools/visualize_reset_states.py b/scripts_v2/tools/visualize_reset_states.py index db2eb403..25f505d3 100644 --- a/scripts_v2/tools/visualize_reset_states.py +++ b/scripts_v2/tools/visualize_reset_states.py @@ -21,7 +21,7 @@ parser.add_argument( "--dataset_dir", type=str, - default="./Datasets/OmniReset", + default="./Datasets/OmniReset_isaaclab3", help="Base dataset directory (contains Resets// subdirectories).", ) parser.add_argument( @@ -35,8 +35,9 @@ AppLauncher.add_app_launcher_args(parser) args_cli, remaining_args = parser.parse_known_args() -# launch omniverse app -app_launcher = AppLauncher(headless=args_cli.headless) +# launch omniverse app -- pass the whole namespace: forwarding only `headless` parses +# the other AppLauncher flags (--viz, --device, --enable_cameras, ...) and drops them. +app_launcher = AppLauncher(args_cli) simulation_app = app_launcher.app """Rest everything else.""" diff --git a/source/uwlab/config/extension.toml b/source/uwlab/config/extension.toml index 8d0e7718..79ad16c1 100644 --- a/source/uwlab/config/extension.toml +++ b/source/uwlab/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.8.6" +version = "0.9.0" # Description title = "UW Lab framework for Robot Learning" diff --git a/source/uwlab/docs/CHANGELOG.rst b/source/uwlab/docs/CHANGELOG.rst index 0e2e8243..ee100e05 100644 --- a/source/uwlab/docs/CHANGELOG.rst +++ b/source/uwlab/docs/CHANGELOG.rst @@ -1,6 +1,17 @@ Changelog --------- +0.9.0 (2026-09-16) +~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Ported to Isaac Lab 3.0: scalar-last quaternions, warp-backed asset data (``.torch``), + ``root_view`` / ``data`` accessors instead of ``root_physx_view``, and ``isaaclab.sim.utils`` + in place of the deprecated ``isaacsim.core.utils`` helpers. + + 0.8.6 (2025-10-09) ~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab/uwlab/assets/articulation/articulation.py b/source/uwlab/uwlab/assets/articulation/articulation.py index 5361e575..060b8bc4 100644 --- a/source/uwlab/uwlab/assets/articulation/articulation.py +++ b/source/uwlab/uwlab/assets/articulation/articulation.py @@ -13,9 +13,9 @@ from prettytable import PrettyTable from typing import TYPE_CHECKING +import isaaclab.sim.utils.stage as stage_utils import isaaclab.utils.math as math_utils import isaaclab.utils.string as string_utils -import isaacsim.core.utils.stage as stage_utils import omni.log from isaaclab.actuators import ActuatorBase, ActuatorBaseCfg, ImplicitActuator from isaaclab.utils.types import ArticulationActions @@ -1433,7 +1433,7 @@ def _validate_cfg(self): for idx in violated_indices: joint_name = self.data.joint_names[idx] joint_limits = joint_pos_limits[idx] - joint_pos = self.data.default_joint_pos[0, idx] + joint_pos = self.data.default_joint_pos.torch[0, idx] # add to message msg += f"\t- '{joint_name}': {joint_pos:.3f} not in [{joint_limits[0]:.3f}, {joint_limits[1]:.3f}]\n" raise ValueError(msg) @@ -1448,7 +1448,7 @@ def _validate_cfg(self): for idx in violated_indices: joint_name = self.data.joint_names[idx] joint_limits = [-joint_max_vel[idx], joint_max_vel[idx]] - joint_vel = self.data.default_joint_vel[0, idx] + joint_vel = self.data.default_joint_vel.torch[0, idx] # add to message msg += f"\t- '{joint_name}': {joint_vel:.3f} not in [{joint_limits[0]:.3f}, {joint_limits[1]:.3f}]\n" raise ValueError(msg) diff --git a/source/uwlab/uwlab/devices/teleop.py b/source/uwlab/uwlab/devices/teleop.py index 214be523..535e4388 100644 --- a/source/uwlab/uwlab/devices/teleop.py +++ b/source/uwlab/uwlab/devices/teleop.py @@ -43,10 +43,10 @@ class TeleopState: def update_ref(self, robot: Articulation): ref_body_id = self.pose_reference_body.body_ids ref_pos_b, ref_quat_b = math_utils.subtract_frame_transforms( - robot.data.root_pos_w, - robot.data.root_quat_w, - robot.data.body_link_pos_w[:, ref_body_id, :].view(-1, 3), - robot.data.body_link_quat_w[:, ref_body_id, :].view(-1, 4), + robot.data.root_pos_w.torch, + robot.data.root_quat_w.torch, + robot.data.body_link_pos_w.torch[:, ref_body_id, :].view(-1, 3), + robot.data.body_link_quat_w.torch[:, ref_body_id, :].view(-1, 4), ) self.ref_pos_b = ref_pos_b.repeat_interleave(self.num_command_body, dim=0) self.ref_quat_b = ref_quat_b.repeat_interleave(self.num_command_body, dim=0) @@ -54,10 +54,10 @@ def update_ref(self, robot: Articulation): def update_attach(self, robot: Articulation): attach_body_id = self.attach_body.body_ids self.attach_pos_b, self.attach_quat_b = math_utils.subtract_frame_transforms( - robot.data.root_pos_w, - robot.data.root_quat_w, - robot.data.body_link_pos_w[:, attach_body_id, :].view(-1, 3), - robot.data.body_link_quat_w[:, attach_body_id, :].view(-1, 4), + robot.data.root_pos_w.torch, + robot.data.root_quat_w.torch, + robot.data.body_link_pos_w.torch[:, attach_body_id, :].view(-1, 3), + robot.data.body_link_quat_w.torch[:, attach_body_id, :].view(-1, 4), ) self.attach_pos_b = self.attach_pos_b.repeat_interleave(self.num_command_body, dim=0) self.attach_quat_b = self.attach_quat_b.repeat_interleave(self.num_command_body, dim=0) @@ -66,8 +66,8 @@ def combine_frame_on_root( self, robot: Articulation, command_pos_b: torch.Tensor, command_quat_b: torch.Tensor | None ): command_pos_w, command_quat_w = math_utils.combine_frame_transforms( - robot.data.root_pos_w.repeat_interleave(self.num_command_body, dim=0), - robot.data.root_quat_w.repeat_interleave(self.num_command_body, dim=0), + robot.data.root_pos_w.torch.repeat_interleave(self.num_command_body, dim=0), + robot.data.root_quat_w.torch.repeat_interleave(self.num_command_body, dim=0), command_pos_b, command_quat_b, ) diff --git a/source/uwlab/uwlab/envs/diagnosis/diagnosis.py b/source/uwlab/uwlab/envs/diagnosis/diagnosis.py index a3008b89..6a1a5fc1 100644 --- a/source/uwlab/uwlab/envs/diagnosis/diagnosis.py +++ b/source/uwlab/uwlab/envs/diagnosis/diagnosis.py @@ -9,6 +9,7 @@ from collections.abc import Sequence from typing import TYPE_CHECKING +import warp as wp from isaaclab.assets import Articulation from isaaclab.managers import SceneEntityCfg @@ -16,6 +17,15 @@ from isaaclab.envs import ManagerBasedRLEnv +def _as_torch(value) -> torch.Tensor: + """Return a physics-view result (``wp.array`` in Isaac Lab 3.0) as a torch tensor.""" + if hasattr(value, "torch"): + return value.torch + if isinstance(value, wp.array): + return wp.to_torch(value) + return value + + def get_link_incoming_joint_force( env: ManagerBasedRLEnv, env_ids: Sequence[int] | torch.Tensor | None, @@ -33,7 +43,7 @@ def get_link_incoming_joint_force( asset: Articulation = env.scene[asset_cfg.name] if env_ids is None: env_ids = slice(None) - force_from_child_link_to_joints = asset.root_physx_view.get_link_incoming_joint_force().to(env.device)[env_ids] + force_from_child_link_to_joints = _as_torch(asset.root_view.get_link_incoming_joint_force()).to(env.device)[env_ids] return force_from_child_link_to_joints @@ -56,7 +66,7 @@ def get_dof_projected_joint_forces( asset: Articulation = env.scene[asset_cfg.name] if env_ids is None: env_ids = slice(None) - projected_joint_forces = asset.root_physx_view.get_dof_projected_joint_forces().to(env.device)[env_ids] + projected_joint_forces = _as_torch(asset.root_view.get_dof_projected_joint_forces()).to(env.device)[env_ids] return projected_joint_forces @@ -108,7 +118,7 @@ def get_dof_position( asset: Articulation = env.scene[asset_cfg.name] if env_ids is None: env_ids = slice(None) - joint_pos = asset.data.joint_pos[env_ids] + joint_pos = asset.data.joint_pos.torch[env_ids] return joint_pos @@ -164,7 +174,7 @@ def get_joint_torque_utilization( if env_ids is None: env_ids = slice(None) applied_torque = asset.data.applied_torque[env_ids] - torque_max = asset.root_physx_view.get_dof_max_forces().to(env.device)[env_ids] + torque_max = asset.data.joint_effort_limits.torch.to(env.device)[env_ids] torque_utilization = torch.abs(applied_torque) / torque_max return torque_utilization @@ -178,7 +188,7 @@ def get_joint_velocity_utilization( if env_ids is None: env_ids = slice(None) joint_vel = asset.data.joint_vel[env_ids] - max_vel = asset.root_physx_view.get_dof_max_velocities().to(env.device)[env_ids] + max_vel = asset.data.joint_vel_limits.torch.to(env.device)[env_ids] velocity_utilization = torch.abs(joint_vel) / max_vel return velocity_utilization @@ -205,7 +215,7 @@ def get_joint_mechanical_work( asset: Articulation = env.scene[asset_cfg.name] if env_ids is None: env_ids = slice(None) - joint_pos = asset.data.joint_pos[env_ids] + joint_pos = asset.data.joint_pos.torch[env_ids] applied_torque = asset.data.applied_torque[env_ids] if "prev_joint_pos" in env.extensions: delta_joint_pos = joint_pos - env.extensions["prev_joint_pos"] @@ -241,7 +251,7 @@ def effective_torque( applied_torque = asset.data.applied_torque[env_ids] # Shape: (num_envs, num_joints) # Get projected joint forces - projected_joint_forces = asset.root_physx_view.get_dof_projected_joint_forces().to(env.device)[ + projected_joint_forces = _as_torch(asset.root_view.get_dof_projected_joint_forces()).to(env.device)[ env_ids ] # Shape: (num_envs, num_joints) @@ -275,6 +285,6 @@ def get_dof_weight_distribution( asset: Articulation = env.scene[asset_cfg.name] if env_ids is None: env_ids = slice(None) - force_from_child_link_to_joints = asset.root_physx_view.get_link_incoming_joint_force().to(env.device)[env_ids] + force_from_child_link_to_joints = _as_torch(asset.root_view.get_link_incoming_joint_force()).to(env.device)[env_ids] weight_forces = force_from_child_link_to_joints[..., 2] return weight_forces diff --git a/source/uwlab/uwlab/envs/mdp/actions/default_joint_static_action.py b/source/uwlab/uwlab/envs/mdp/actions/default_joint_static_action.py index 37d0c7fd..a6dbdf35 100644 --- a/source/uwlab/uwlab/envs/mdp/actions/default_joint_static_action.py +++ b/source/uwlab/uwlab/envs/mdp/actions/default_joint_static_action.py @@ -27,8 +27,8 @@ def __init__(self, cfg: actions_cfg.DefaultJointPositionStaticActionCfg, env: Ma super().__init__(cfg, env) # use default joint positions as offset if cfg.use_default_offset: - self._offset = self._asset.data.default_joint_pos[:, self._joint_ids].clone() - self._default_actions = self._asset.data.default_joint_pos[:, self._joint_ids].clone() + self._offset = self._asset.data.default_joint_pos.torch[:, self._joint_ids].clone() + self._default_actions = self._asset.data.default_joint_pos.torch[:, self._joint_ids].clone() @property def action_dim(self) -> int: diff --git a/source/uwlab/uwlab/envs/mdp/actions/task_space_actions.py b/source/uwlab/uwlab/envs/mdp/actions/task_space_actions.py index 290e57d1..ce84f112 100644 --- a/source/uwlab/uwlab/envs/mdp/actions/task_space_actions.py +++ b/source/uwlab/uwlab/envs/mdp/actions/task_space_actions.py @@ -131,13 +131,13 @@ def desired_joint_position(self): @property def jacobian_w(self) -> torch.Tensor: - return self._asset.root_physx_view.get_jacobians()[:, self._jacobi_body_idx, :, :][:, :, :, self._joint_ids] + return self._asset.data.body_link_jacobian_w.torch[:, self._jacobi_body_idx, :, :][:, :, :, self._joint_ids] @property def jacobian_b(self) -> torch.Tensor: jacobian = self.jacobian_w B = len(self._jacobi_body_idx) - rot_b = self._asset.data.root_link_quat_w + rot_b = self._asset.data.root_link_quat_w.torch rot_b_m = math_utils.matrix_from_quat(math_utils.quat_inv(rot_b)) rot_b_m = rot_b_m.unsqueeze(1).expand(-1, B, -1, -1).reshape(-1, 3, 3) # [N*B, 3, 3] @@ -166,7 +166,7 @@ def process_actions(self, actions: torch.Tensor): def apply_actions(self): # obtain quantities from simulation ee_pos_curr, ee_quat_curr = self._compute_frame_pose() - joint_pos = self._asset.data.joint_pos[:, self._joint_ids] + joint_pos = self._asset.data.joint_pos.torch[:, self._joint_ids] # compute the delta in joint-space if ee_quat_curr.norm() != 0: jacobian = self._compute_frame_jacobian() @@ -191,7 +191,7 @@ def _compute_frame_pose(self) -> tuple[torch.Tensor, torch.Tensor]: """ # obtain quantities from simulation num_body_idx = len(self._body_idx) - ee_pose_w = self._asset.data.body_link_state_w[:, self._body_idx, :7].view(-1, 7) + ee_pose_w = self._asset.data.body_link_state_w.torch[:, self._body_idx, :7].view(-1, 7) root_pose_w = self._asset.data.root_state_w[:, :7].repeat_interleave(num_body_idx, dim=0) # compute the pose of the body in the root frame ee_pos_b, ee_quat_b = math_utils.subtract_frame_transforms( diff --git a/source/uwlab/uwlab/envs/mdp/actions/visualizable_joint_target_position.py b/source/uwlab/uwlab/envs/mdp/actions/visualizable_joint_target_position.py index 71d56882..dc315de1 100644 --- a/source/uwlab/uwlab/envs/mdp/actions/visualizable_joint_target_position.py +++ b/source/uwlab/uwlab/envs/mdp/actions/visualizable_joint_target_position.py @@ -44,27 +44,28 @@ def apply_actions(self): pass def _set_debug_vis_impl(self, debug_vis: bool): - import isaacsim.core.utils.prims as prim_utils + from isaaclab.sim.utils import find_matching_prim_paths + from isaaclab.sim.utils.legacy import get_prim_at_path from pxr import UsdGeom if debug_vis: if not hasattr(self, "vis_articulation"): if self.cfg.articulation_vis_cfg.name in self._env.scene: self.vis_articulation: Articulation = self._env.scene[self.cfg.articulation_vis_cfg.name] - prims_paths = prim_utils.find_matching_prim_paths(self.vis_articulation.cfg.prim_path) - prims = [prim_utils.get_prim_at_path(prim) for prim in prims_paths] + prims_paths = find_matching_prim_paths(self.vis_articulation.cfg.prim_path) + prims = [get_prim_at_path(prim) for prim in prims_paths] for prim in prims: UsdGeom.Imageable(prim).MakeVisible() else: if hasattr(self, "vis_articulation"): - prims_paths = prim_utils.find_matching_prim_paths(self.vis_articulation.cfg.prim_path) - prims = [prim_utils.get_prim_at_path(prim) for prim in prims_paths] + prims_paths = find_matching_prim_paths(self.vis_articulation.cfg.prim_path) + prims = [get_prim_at_path(prim) for prim in prims_paths] for prim in prims: UsdGeom.Imageable(prim).MakeInvisible() def _debug_vis_callback(self, event): # update the box marker self.vis_articulation.write_joint_state_to_sim( - position=self._asset.data.joint_pos_target, - velocity=torch.zeros_like(self._asset.data.joint_pos_target, device=self.device), + position=self._asset.data.joint_pos_target.torch, + velocity=torch.zeros_like(self._asset.data.joint_pos_target.torch, device=self.device), ) diff --git a/source/uwlab/uwlab/envs/mdp/commands/categorical_command.py b/source/uwlab/uwlab/envs/mdp/commands/categorical_command.py index fd97d189..05d82c7c 100644 --- a/source/uwlab/uwlab/envs/mdp/commands/categorical_command.py +++ b/source/uwlab/uwlab/envs/mdp/commands/categorical_command.py @@ -124,8 +124,8 @@ def _debug_vis_callback(self, event): return # get marker location # -- base state - base_pos_w = self.robot.data.root_pos_w.clone() - base_quat_w = self.robot.data.root_quat_w.clone() + base_pos_w = self.robot.data.root_pos_w.torch.clone() + base_quat_w = self.robot.data.root_quat_w.torch.clone() base_pos_w[:, 2] += 0.5 # -- resolve the scales scale = self.command[:].repeat_interleave(3, 0).view(-1, 3) diff --git a/source/uwlab/uwlab/envs/mdp/events.py b/source/uwlab/uwlab/envs/mdp/events.py index b6add045..e9106f87 100644 --- a/source/uwlab/uwlab/envs/mdp/events.py +++ b/source/uwlab/uwlab/envs/mdp/events.py @@ -20,13 +20,13 @@ def reset_robot_to_default( ): """Reset the scene to the default state specified in the scene configuration.""" robot: Articulation = env.scene[robot_cfg.name] - default_root_state = robot.data.default_root_state[env_ids].clone() + default_root_state = robot.data.default_root_state.torch[env_ids].clone() default_root_state[:, 0:3] += env.scene.env_origins[env_ids] # set into the physics simulation robot.write_root_state_to_sim(default_root_state, env_ids=env_ids) # obtain default joint positions - default_joint_pos = robot.data.default_joint_pos[env_ids].clone() - default_joint_vel = robot.data.default_joint_vel[env_ids].clone() + default_joint_pos = robot.data.default_joint_pos.torch[env_ids].clone() + default_joint_vel = robot.data.default_joint_vel.torch[env_ids].clone() # set into the physics simulation robot.write_joint_state_to_sim(default_joint_pos, default_joint_vel, env_ids=env_ids) @@ -40,14 +40,18 @@ def launch_view_port( position: tuple[int, int] = (0, 0), ): if env.sim.has_gui(): - from isaacsim.core.utils.viewports import create_viewport_for_camera, get_viewport_names + import omni.kit.commands + from omni.kit.viewport.utility import create_viewport_window + from omni.kit.viewport.window import get_viewport_window_instances - if view_portname not in get_viewport_names(): - create_viewport_for_camera( - viewport_name=view_portname, - camera_prim_path=camera_path, + if view_portname not in [window.title for window in get_viewport_window_instances()]: + viewport_window = create_viewport_window( + name=view_portname, width=viewport_size[0], height=viewport_size[1], position_x=position[0], position_y=position[1], ) + omni.kit.commands.execute( + "SetViewportCamera", camera_path=camera_path, viewport_api=viewport_window.viewport_api + ) diff --git a/source/uwlab/uwlab/envs/mdp/rewards.py b/source/uwlab/uwlab/envs/mdp/rewards.py index 6dcb98bf..b7eb1d07 100644 --- a/source/uwlab/uwlab/envs/mdp/rewards.py +++ b/source/uwlab/uwlab/envs/mdp/rewards.py @@ -35,7 +35,7 @@ def joint_position_command_error_l2_norm( """Penalize tracking of the joint position error using L2-norm.""" asset: Articulation = env.scene[asset_cfg.name] command = env.command_manager.get_command(command_name) - cur_joint_position = asset.data.joint_pos[:, asset_cfg.joint_ids] + cur_joint_position = asset.data.joint_pos.torch[:, asset_cfg.joint_ids] error = torch.norm(command - cur_joint_position, dim=1) return error @@ -50,7 +50,7 @@ def link_position_command_align_tanh( # obtain the desired and current positions des_pos_b = command[:, :3] des_pos_w, _ = combine_frame_transforms(asset.data.root_state_w[:, :3], asset.data.root_state_w[:, 3:7], des_pos_b) - curr_pos_w = asset.data.body_link_pos_w[:, asset_cfg.body_ids[0], :3] # type: ignore + curr_pos_w = asset.data.body_link_pos_w.torch[:, asset_cfg.body_ids[0], :3] # type: ignore distance = torch.norm(curr_pos_w - des_pos_w, dim=1) return 1 - torch.tanh(distance / std) @@ -65,7 +65,7 @@ def link_position_command_error_l2_norm( # obtain the desired and current positions des_pos_b = command[:, :3] des_pos_w, _ = combine_frame_transforms(asset.data.root_state_w[:, :3], asset.data.root_state_w[:, 3:7], des_pos_b) - curr_pos_w = asset.data.body_link_pos_w[:, asset_cfg.body_ids[0], :3] # type: ignore + curr_pos_w = asset.data.body_link_pos_w.torch[:, asset_cfg.body_ids[0], :3] # type: ignore return torch.norm(curr_pos_w - des_pos_w, dim=1) @@ -79,7 +79,7 @@ def link_orientation_command_align_tanh( # obtain the desired and current orientations des_quat_b = command[:, 3:7] des_quat_w = quat_mul(asset.data.root_state_w[:, 3:7], des_quat_b) - curr_quat_w = asset.data.body_link_quat_w[:, asset_cfg.body_ids[0]] # type: ignore + curr_quat_w = asset.data.body_link_quat_w.torch[:, asset_cfg.body_ids[0]] # type: ignore return 1 - torch.tanh(quat_error_magnitude(curr_quat_w, des_quat_w) / std) @@ -93,5 +93,5 @@ def link_orientation_command_error_l2_norm( # obtain the desired and current orientations des_quat_b = command[:, 3:7] des_quat_w = quat_mul(asset.data.root_state_w[:, 3:7], des_quat_b) - curr_quat_w = asset.data.body_link_quat_w[:, asset_cfg.body_ids[0]] # type: ignore + curr_quat_w = asset.data.body_link_quat_w.torch[:, asset_cfg.body_ids[0]] # type: ignore return quat_error_magnitude(curr_quat_w, des_quat_w) diff --git a/source/uwlab/uwlab/envs/mdp/terminations.py b/source/uwlab/uwlab/envs/mdp/terminations.py index 0628c3cc..ba4739a5 100644 --- a/source/uwlab/uwlab/envs/mdp/terminations.py +++ b/source/uwlab/uwlab/envs/mdp/terminations.py @@ -29,9 +29,9 @@ def invalid_state(env: ManagerBasedRLEnv, asset_cfg: SceneEntityCfg) -> torch.Te """Return true if the RigidBody position reads nan""" # extract the used quantities (to enable type-hinting) asset: RigidObject = env.scene[asset_cfg.name] - return torch.isnan(asset.data.body_pos_w).any(dim=-1).any(dim=-1) + return torch.isnan(asset.data.body_pos_w.torch).any(dim=-1).any(dim=-1) def abnormal_robot_state(env: ManagerBasedRLEnv, asset_cfg: SceneEntityCfg = SceneEntityCfg("robot")) -> torch.Tensor: robot: Articulation = env.scene[asset_cfg.name] - return (robot.data.joint_vel.abs() > (robot.data.joint_vel_limits * 2)).any(dim=1) + return (robot.data.joint_vel.torch.abs() > (robot.data.joint_vel_limits.torch * 2)).any(dim=1) diff --git a/source/uwlab/uwlab/envs/real_rl_env.py b/source/uwlab/uwlab/envs/real_rl_env.py index 1db29ee6..a20a623c 100644 --- a/source/uwlab/uwlab/envs/real_rl_env.py +++ b/source/uwlab/uwlab/envs/real_rl_env.py @@ -11,7 +11,6 @@ from collections.abc import Sequence from typing import TYPE_CHECKING, Any, ClassVar -import isaacsim.core.utils.torch as torch_utils from isaaclab.envs import ManagerBasedRLEnv from isaaclab.envs.common import VecEnvObs, VecEnvStepReturn from isaaclab.managers import ( @@ -24,6 +23,7 @@ RewardManager, TerminationManager, ) +from isaaclab.utils.seed import configure_seed from isaaclab.utils.timer import Timer if TYPE_CHECKING: @@ -235,7 +235,7 @@ def reset( return self.obs_buf, self.extras def seed(self, seed: int = -1) -> int: - return torch_utils.set_seed(seed) + return configure_seed(seed) def close(self) -> None: del self.command_manager diff --git a/source/uwlab/uwlab/envs/ui/base_env_window.py b/source/uwlab/uwlab/envs/ui/base_env_window.py index cb157144..43a7bf0f 100644 --- a/source/uwlab/uwlab/envs/ui/base_env_window.py +++ b/source/uwlab/uwlab/envs/ui/base_env_window.py @@ -15,8 +15,8 @@ import omni.kit.app import omni.kit.commands import omni.usd +from isaaclab.sim.utils.stage import get_current_stage from isaaclab.ui.widgets import ManagerLiveVisualizer -from isaacsim.core.utils.stage import get_current_stage from pxr import PhysxSchema, Sdf, Usd, UsdGeom, UsdPhysics if TYPE_CHECKING: diff --git a/source/uwlab/uwlab/envs/ui/viewport_camera_controller.py b/source/uwlab/uwlab/envs/ui/viewport_camera_controller.py index 3f1ea2e2..3cf83bf0 100644 --- a/source/uwlab/uwlab/envs/ui/viewport_camera_controller.py +++ b/source/uwlab/uwlab/envs/ui/viewport_camera_controller.py @@ -160,7 +160,7 @@ def update_view_to_asset_root(self, asset_name: str): # set origin type to asset_root self.cfg.origin_type = "asset_root" # update the camera origins - self.viewer_origin = self._env.scene[self.cfg.asset_name].data.root_pos_w[self.cfg.env_index] + self.viewer_origin = self._env.scene[self.cfg.asset_name].data.root_pos_w.torch[self.cfg.env_index] # update the camera view self.update_view_location() @@ -193,7 +193,9 @@ def update_view_to_asset_body(self, asset_name: str, body_name: str): # set origin type to asset_body self.cfg.origin_type = "asset_body" # update the camera origins - self.viewer_origin = self._env.scene[self.cfg.asset_name].data.body_pos_w[self.cfg.env_index, body_id].view(3) + self.viewer_origin = ( + self._env.scene[self.cfg.asset_name].data.body_pos_w.torch[self.cfg.env_index, body_id].view(3) + ) # update the camera view self.update_view_location() diff --git a/source/uwlab/uwlab/sim/converters/mesh_converter.py b/source/uwlab/uwlab/sim/converters/mesh_converter.py index 08461efd..e98ce38d 100644 --- a/source/uwlab/uwlab/sim/converters/mesh_converter.py +++ b/source/uwlab/uwlab/sim/converters/mesh_converter.py @@ -6,13 +6,13 @@ import asyncio import os -import isaacsim.core.utils.prims as prim_utils +import isaaclab.sim.utils.legacy as prim_utils import omni import omni.kit.commands from isaaclab.sim.converters.asset_converter_base import AssetConverterBase from isaaclab.sim.schemas import schemas from isaaclab.sim.utils import clone, export_prim_to_file, get_all_matching_child_prims, safe_set_attribute_on_usd_prim -from isaacsim.coreutils.extensions import enable_extension +from isaacsim.core.experimental.utils.app import enable_extension from pxr import Sdf, Usd, UsdGeom, UsdPhysics, UsdShade, UsdUtils from .mesh_converter_cfg import MeshConverterCfg diff --git a/source/uwlab/uwlab/sim/spawners/materials/physics_materials.py b/source/uwlab/uwlab/sim/spawners/materials/physics_materials.py index 9220ff04..59a70750 100644 --- a/source/uwlab/uwlab/sim/spawners/materials/physics_materials.py +++ b/source/uwlab/uwlab/sim/spawners/materials/physics_materials.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING -import isaacsim.core.utils.prims as prim_utils +import isaaclab.sim.utils.legacy as prim_utils from isaaclab.sim.utils import clone, safe_set_attribute_on_usd_schema from pxr import PhysxSchema, Usd, UsdPhysics, UsdShade diff --git a/source/uwlab/uwlab/sim/spawners/materials/visual_materials.py b/source/uwlab/uwlab/sim/spawners/materials/visual_materials.py index adc1cc21..396c97d7 100644 --- a/source/uwlab/uwlab/sim/spawners/materials/visual_materials.py +++ b/source/uwlab/uwlab/sim/spawners/materials/visual_materials.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING -import isaacsim.core.utils.prims as prim_utils +import isaaclab.sim.utils.legacy as prim_utils import omni.kit.commands from isaaclab.sim.utils import clone, safe_set_attribute_on_usd_prim from isaaclab.utils.assets import NVIDIA_NUCLEUS_DIR diff --git a/source/uwlab/uwlab/ui/widgets/line_plot.py b/source/uwlab/uwlab/ui/widgets/line_plot.py index fa51ed70..3e3ddd34 100644 --- a/source/uwlab/uwlab/ui/widgets/line_plot.py +++ b/source/uwlab/uwlab/ui/widgets/line_plot.py @@ -11,7 +11,7 @@ from typing import TYPE_CHECKING import omni -from isaacsim.core.api.simulation_context import SimulationContext +from isaaclab.sim import SimulationContext with suppress(ImportError): # isaacsim.gui is not available when running in headless mode. diff --git a/source/uwlab/uwlab/ui/widgets/manager_live_visualizer.py b/source/uwlab/uwlab/ui/widgets/manager_live_visualizer.py index 3fdea7b9..dfaf23e5 100644 --- a/source/uwlab/uwlab/ui/widgets/manager_live_visualizer.py +++ b/source/uwlab/uwlab/ui/widgets/manager_live_visualizer.py @@ -13,8 +13,8 @@ import omni.kit.app from isaaclab.managers import ManagerBase +from isaaclab.sim import SimulationContext from isaaclab.utils import configclass -from isaacsim.core.api.simulation_context import SimulationContext from .image_plot import ImagePlot from .line_plot import LiveLinePlot diff --git a/source/uwlab/uwlab/utils/datasets/torch_dataset_file_handler.py b/source/uwlab/uwlab/utils/datasets/torch_dataset_file_handler.py index f52442d1..d4385f07 100644 --- a/source/uwlab/uwlab/utils/datasets/torch_dataset_file_handler.py +++ b/source/uwlab/uwlab/utils/datasets/torch_dataset_file_handler.py @@ -61,12 +61,22 @@ def get_num_episodes(self) -> int: """Get number of episodes in the file.""" return self._episode_count - def write_episode(self, episode: EpisodeData, demo_id: int | None = None): + def write_episode(self, episode: EpisodeData, demo_id: int | None = None, dataset_compression: bool = True): """Add an episode to the dataset. Args: episode: The episode data to add. demo_id: Custom index for the episode. If None, uses default index. + dataset_compression: Accepted for interface compatibility and ignored. + Isaac Lab 3.0's RecorderManager passes ``cfg.dataset_compression`` + positionally to every handler (see + :meth:`isaaclab.managers.RecorderManager.export_episodes`); omitting + it raises ``TypeError: write_episode() takes from 2 to 3 positional + arguments but 4 were given`` at the first episode export. It is + meaningful only for the HDF5 handler, which maps it onto gzip + per-dataset compression. This handler accumulates episodes in memory + and serializes them with ``torch.save`` in :meth:`flush`, which has no + equivalent option. """ if episode.is_empty() or not episode.success: return @@ -99,7 +109,8 @@ def load_episode(self, episode_name: str, device: str = "cpu") -> EpisodeData | def flush(self): """Flush any pending data to disk.""" if self._file_path and self._episode_data: - torch.save(self._episode_data, self._file_path) + # Stamp the quaternion convention; loaders refuse files without it. + torch.save({**self._episode_data, "quat_convention": "xyzw"}, self._file_path) def close(self): """Close the dataset file handler.""" diff --git a/source/uwlab_assets/config/extension.toml b/source/uwlab_assets/config/extension.toml index dd819024..bf4b4ff6 100644 --- a/source/uwlab_assets/config/extension.toml +++ b/source/uwlab_assets/config/extension.toml @@ -1,6 +1,6 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.5.2" +version = "0.6.0" # Description title = "UW Lab Assets" diff --git a/source/uwlab_assets/docs/CHANGELOG.rst b/source/uwlab_assets/docs/CHANGELOG.rst index cb39cdbe..038a1526 100644 --- a/source/uwlab_assets/docs/CHANGELOG.rst +++ b/source/uwlab_assets/docs/CHANGELOG.rst @@ -1,6 +1,16 @@ Changelog --------- +0.6.0 (2026-09-16) +~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Ported to Isaac Lab 3.0: asset quaternions are scalar-last ``(x, y, z, w)``; cloud assets + are pinned to the ``isaaclab3`` revision of ``UW-Lab/uwlab-assets``. + + 0.5.2 (2025-03-23) ~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_assets/uwlab_assets/__init__.py b/source/uwlab_assets/uwlab_assets/__init__.py index 0bf6a5f1..373eba25 100644 --- a/source/uwlab_assets/uwlab_assets/__init__.py +++ b/source/uwlab_assets/uwlab_assets/__init__.py @@ -21,23 +21,40 @@ UWLAB_ASSETS_METADATA = toml.load(os.path.join(UWLAB_ASSETS_EXT_DIR, "config", "extension.toml")) """Extension metadata dictionary parsed from the extension.toml file.""" -UWLAB_CLOUD_ASSETS_DIR = "https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main" +UWLAB_CLOUD_ASSETS_REPO = "https://huggingface.co/datasets/UW-Lab/uwlab-assets" +"""HuggingFace dataset repository holding the cloud assets.""" +UWLAB_CLOUD_ASSETS_REVISION = "8892962cdaad159de4efc331af0ac1bf7f192d0b" # branch isaaclab3 +"""Pinned commit of :data:`UWLAB_CLOUD_ASSETS_REPO`. -def _extract_relative_path(url: str) -> str: - """Strip the HuggingFace resolve-URL prefix, returning the repo-relative path. +Pinned rather than a branch name so that asset changes on HuggingFace are opt-in: bump this +constant deliberately when new assets or datasets are published. Isaac Lab 3.0 assets live on the +``isaaclab3`` branch of the repository (quaternions in ``(x, y, z, w)``); ``main`` keeps the Isaac +Lab 2.x files. +""" + +UWLAB_CLOUD_ASSETS_DIR = f"{UWLAB_CLOUD_ASSETS_REPO}/resolve/{UWLAB_CLOUD_ASSETS_REVISION}" + + +def _extract_revision_and_relative_path(url: str) -> tuple[str, str]: + """Split a HuggingFace resolve URL into ``(revision, repo-relative path)``. Example: - ``https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Props/Custom/Peg/peg.usd`` - -> ``Props/Custom/Peg/peg.usd`` + ``https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Props/Custom/Peg/peg.usd`` + -> ``("isaaclab3", "Props/Custom/Peg/peg.usd")`` """ parsed = urlparse(url) parts = parsed.path.strip("/").split("/") try: idx = parts.index("resolve") - return "/".join(parts[idx + 2 :]) - except ValueError: - return parsed.path.strip("/") + return parts[idx + 1], "/".join(parts[idx + 2 :]) + except (ValueError, IndexError): + return "", parsed.path.strip("/") + + +def _extract_relative_path(url: str) -> str: + """Strip the HuggingFace resolve-URL prefix, returning the repo-relative path.""" + return _extract_revision_and_relative_path(url)[1] def _urlretrieve_quiet(url: str, dest: str) -> None: @@ -57,15 +74,17 @@ def resolve_cloud_path(path: str) -> str: """Resolve a cloud asset path to a local file, downloading if needed. * Local paths (including already-cached files) are returned immediately. - * HTTPS URLs are downloaded once to ``~/.cache/uwlab/assets/`` - and the local cached path is returned on subsequent calls. + * HTTPS URLs are downloaded once to ``~/.cache/uwlab/assets//`` + and the local cached path is returned on subsequent calls. The revision is part + of the key so that bumping :data:`UWLAB_CLOUD_ASSETS_REVISION` never serves a + file cached from another revision. * Downloads are atomic (write to a temp file, then ``os.rename``). """ if not path.startswith(("http://", "https://")): return path - rel = _extract_relative_path(path) - cache_dir = os.path.join(os.path.expanduser("~"), ".cache", "uwlab", "assets") + revision, rel = _extract_revision_and_relative_path(path) + cache_dir = os.path.join(os.path.expanduser("~"), ".cache", "uwlab", "assets", revision) local = os.path.join(cache_dir, rel) if os.path.isfile(local): diff --git a/source/uwlab_assets/uwlab_assets/robots/franka/action.py b/source/uwlab_assets/uwlab_assets/robots/franka/action.py index 04f16dbe..615cc4a4 100644 --- a/source/uwlab_assets/uwlab_assets/robots/franka/action.py +++ b/source/uwlab_assets/uwlab_assets/robots/franka/action.py @@ -23,7 +23,7 @@ body_name="panda_hand", controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), scale=0.5, - body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=(0.0, 0.0, 0.1034), rot=(1.0, 0.0, 0, 0)), + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=(0.0, 0.0, 0.1034), rot=(0.0, 0.0, 0.0, 1.0)), ) JOINT_IKABSOLUTE: DifferentialInverseKinematicsActionCfg = DifferentialInverseKinematicsActionCfg( @@ -32,7 +32,7 @@ body_name="panda_hand", controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls"), scale=1, - body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=(0.0, 0.0, 0.1034), rot=(1.0, 0.0, 0, 0)), + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=(0.0, 0.0, 0.1034), rot=(0.0, 0.0, 0.0, 1.0)), ) BINARY_GRIPPER = BinaryJointPositionActionCfg( diff --git a/source/uwlab_assets/uwlab_assets/robots/leap/leap.py b/source/uwlab_assets/uwlab_assets/robots/leap/leap.py index 77419545..40aae891 100644 --- a/source/uwlab_assets/uwlab_assets/robots/leap/leap.py +++ b/source/uwlab_assets/uwlab_assets/robots/leap/leap.py @@ -32,7 +32,7 @@ ), joint_drive_props=sim_utils.JointDrivePropertiesCfg(drive_type="force"), ), - init_state=ArticulationCfg.InitialStateCfg(pos=(0, 0, 0), rot=(1, 0, 0, 0), joint_pos=LEAP_DEFAULT_JOINT_POS), + init_state=ArticulationCfg.InitialStateCfg(pos=(0, 0, 0), rot=(0, 0, 0, 1), joint_pos=LEAP_DEFAULT_JOINT_POS), soft_joint_pos_limit_factor=1, ) @@ -67,7 +67,7 @@ name="ee", offset=OffsetCfg( pos=(-0.028, -0.04, -0.07), - rot=(1.0, 0.0, 0.0, 0.0), + rot=(0.0, 0.0, 0.0, 1.0), ), ), ], diff --git a/source/uwlab_assets/uwlab_assets/robots/tycho/actions.py b/source/uwlab_assets/uwlab_assets/robots/tycho/actions.py index d32e3b38..fff9b7ba 100644 --- a/source/uwlab_assets/uwlab_assets/robots/tycho/actions.py +++ b/source/uwlab_assets/uwlab_assets/robots/tycho/actions.py @@ -24,7 +24,7 @@ body_name="static_chop_tip", controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), scale=0.05, - body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=(0.0, 0.0, 0.0), rot=(1.0, 0.0, 0, 0)), + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=(0.0, 0.0, 0.0), rot=(0.0, 0.0, 0.0, 1.0)), ) @@ -34,7 +34,7 @@ body_name="static_chop_tip", # Do not work if this is not end_effector controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls"), scale=1, - body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=(0.0, 0.0, 0.0), rot=(1, 0, 0, 0)), + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=(0.0, 0.0, 0.0), rot=(0, 0, 0, 1)), ) diff --git a/source/uwlab_assets/uwlab_assets/robots/tycho/tycho.py b/source/uwlab_assets/uwlab_assets/robots/tycho/tycho.py index 560d99c7..872f382b 100644 --- a/source/uwlab_assets/uwlab_assets/robots/tycho/tycho.py +++ b/source/uwlab_assets/uwlab_assets/robots/tycho/tycho.py @@ -42,7 +42,7 @@ enabled_self_collisions=False, solver_position_iteration_count=32, solver_velocity_iteration_count=1 ), ), - init_state=ArticulationCfg.InitialStateCfg(rot=(0.7071068, 0, 0, 0.7071068), joint_pos=HEBI_DEFAULT_JOINTPOS), + init_state=ArticulationCfg.InitialStateCfg(rot=(0, 0, 0.7071068, 0.7071068), joint_pos=HEBI_DEFAULT_JOINTPOS), soft_joint_pos_limit_factor=1, ) @@ -75,7 +75,7 @@ name="ee", offset=OffsetCfg( pos=(0.0, 0.0, 0.0), - rot=(1.0, 0.0, 0.0, 0.0), + rot=(0.0, 0.0, 0.0, 1.0), ), ), ], diff --git a/source/uwlab_assets/uwlab_assets/robots/ur5e_robotiq_gripper/ur5e_robotiq_2f85_gripper.py b/source/uwlab_assets/uwlab_assets/robots/ur5e_robotiq_gripper/ur5e_robotiq_2f85_gripper.py index 5d52f343..9fe9cd1b 100644 --- a/source/uwlab_assets/uwlab_assets/robots/ur5e_robotiq_gripper/ur5e_robotiq_2f85_gripper.py +++ b/source/uwlab_assets/uwlab_assets/robots/ur5e_robotiq_gripper/ur5e_robotiq_2f85_gripper.py @@ -13,12 +13,16 @@ * :obj:`UR5E_ROBOTIQ_2F85`: Alias for ``EXPLICIT_UR5E_ROBOTIQ_2F85`` (backward compatibility). """ +import logging + import isaaclab.sim as sim_utils from isaaclab.actuators import DelayedPDActuatorCfg, ImplicitActuatorCfg from isaaclab.assets.articulation import ArticulationCfg from uwlab_assets import UWLAB_CLOUD_ASSETS_DIR +logger = logging.getLogger(__name__) + ROBOTIQ_2F85_DEFAULT_JOINT_POS = { "finger_joint": 0.0, "right_outer_knuckle_joint": 0.0, @@ -28,6 +32,47 @@ "right_inner_finger_knuckle_joint": 0.0, } + +def spawn_ur5e_without_physics_materials(prim_path, cfg, translation=None, orientation=None): + """Spawn the UR5e USD, then strip its two authored physics materials and their bindings. + + PhysX 110 allocates a PxMaterial per env per USD material (107 shared them), so the pair hits the + hard 64K cap at 32768 envs; ``robot_material`` overwrites the finger friction at startup anyway. + """ + from pxr import PhysxSchema, Sdf, Usd, UsdPhysics, UsdShade + + prim = sim_utils.spawn_from_usd(prim_path, cfg, translation, orientation) + roots = sim_utils.find_matching_prims(prim_path) or [prim] + removed: list[str] = [] + for root in roots: + stage = root.GetStage() + material_paths = { + str(child.GetPath()) + for child in Usd.PrimRange(root) + if child.HasAPI(UsdPhysics.MaterialAPI) or child.HasAPI(PhysxSchema.PhysxMaterialAPI) + } + if not material_paths: + continue + for child in Usd.PrimRange(root): + if not child.HasAPI(UsdShade.MaterialBindingAPI): + continue + binding_api = UsdShade.MaterialBindingAPI(child) + rel = binding_api.GetDirectBindingRel("physics") + if rel and any(str(target) in material_paths for target in rel.GetTargets()): + binding_api.UnbindDirectBinding("physics") + for material_path in sorted(material_paths): + stage.RemovePrim(Sdf.Path(material_path)) + # prim specs authored in the referenced asset survive RemovePrim; deactivating prunes + # them from composition (and from the PhysX parser) instead. + leftover = stage.GetPrimAtPath(Sdf.Path(material_path)) + if leftover.IsValid(): + leftover.SetActive(False) + removed.extend(sorted(material_paths)) + if removed: + logger.info(f"Removed USD physics materials from spawned UR5e (PhysX 64K material cap): {removed}") + return prim + + UR5E_DEFAULT_JOINT_POS = { "shoulder_pan_joint": 0.0, "shoulder_lift_joint": -1.5708, @@ -58,6 +103,7 @@ UR5E_ARTICULATION = ArticulationCfg( spawn=sim_utils.UsdFileCfg( + func=spawn_ur5e_without_physics_materials, usd_path=f"{UWLAB_CLOUD_ASSETS_DIR}/Robots/UniversalRobots/Ur5e2f85RobotiqGripperCalibrated/ur5e_robotiq_gripper_d415_mount_safety_calibrated.usd", activate_contact_sensors=False, rigid_props=sim_utils.RigidBodyPropertiesCfg( @@ -68,7 +114,7 @@ enabled_self_collisions=True, solver_position_iteration_count=36, solver_velocity_iteration_count=0 ), ), - init_state=ArticulationCfg.InitialStateCfg(pos=(0, 0, 0), rot=(1, 0, 0, 0), joint_pos=UR5E_DEFAULT_JOINT_POS), + init_state=ArticulationCfg.InitialStateCfg(pos=(0, 0, 0), rot=(0, 0, 0, 1), joint_pos=UR5E_DEFAULT_JOINT_POS), soft_joint_pos_limit_factor=1, ) @@ -87,7 +133,7 @@ mass_props=sim_utils.MassPropertiesCfg(mass=0.5), ), init_state=ArticulationCfg.InitialStateCfg( - pos=(0, 0, 0.1), rot=(1, 0, 0, 0), joint_pos=ROBOTIQ_2F85_DEFAULT_JOINT_POS + pos=(0, 0, 0.1), rot=(0, 0, 0, 1), joint_pos=ROBOTIQ_2F85_DEFAULT_JOINT_POS ), actuators={ "gripper": ImplicitActuatorCfg( diff --git a/source/uwlab_assets/uwlab_assets/robots/xarm_leap/xarm_leap.py b/source/uwlab_assets/uwlab_assets/robots/xarm_leap/xarm_leap.py index ffd1f063..65c14c96 100644 --- a/source/uwlab_assets/uwlab_assets/robots/xarm_leap/xarm_leap.py +++ b/source/uwlab_assets/uwlab_assets/robots/xarm_leap/xarm_leap.py @@ -35,7 +35,7 @@ enabled_self_collisions=True, solver_position_iteration_count=1, solver_velocity_iteration_count=0 ), ), - init_state=ArticulationCfg.InitialStateCfg(pos=(0, 0, 0), rot=(1, 0, 0, 0), joint_pos=XARM_LEAP_DEFAULT_JOINT_POS), + init_state=ArticulationCfg.InitialStateCfg(pos=(0, 0, 0), rot=(0, 0, 0, 1), joint_pos=XARM_LEAP_DEFAULT_JOINT_POS), soft_joint_pos_limit_factor=1, ) @@ -77,7 +77,7 @@ name="ee", offset=OffsetCfg( pos=(-0.028, -0.04, -0.07), - rot=(1.0, 0.0, 0.0, 0.0), + rot=(0.0, 0.0, 0.0, 1.0), ), ), ], diff --git a/source/uwlab_assets/uwlab_assets/robots/xarm_uf_gripper/xarm_uf_gripper.py b/source/uwlab_assets/uwlab_assets/robots/xarm_uf_gripper/xarm_uf_gripper.py index 5e9290c1..d0730203 100644 --- a/source/uwlab_assets/uwlab_assets/robots/xarm_uf_gripper/xarm_uf_gripper.py +++ b/source/uwlab_assets/uwlab_assets/robots/xarm_uf_gripper/xarm_uf_gripper.py @@ -37,7 +37,7 @@ ), ), init_state=ArticulationCfg.InitialStateCfg( - pos=(0, 0, 0), rot=(1, 0, 0, 0), joint_pos=XARM_UF_GRIPPER_DEFAULT_JOINT_POS + pos=(0, 0, 0), rot=(0, 0, 0, 1), joint_pos=XARM_UF_GRIPPER_DEFAULT_JOINT_POS ), soft_joint_pos_limit_factor=1, ) diff --git a/source/uwlab_rl/config/extension.toml b/source/uwlab_rl/config/extension.toml index b6c3f73b..c81a7449 100644 --- a/source/uwlab_rl/config/extension.toml +++ b/source/uwlab_rl/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.1.3" +version = "0.2.0" # Description title = "UW Lab RL" diff --git a/source/uwlab_rl/docs/CHANGELOG.rst b/source/uwlab_rl/docs/CHANGELOG.rst index 1ddac4d5..27878d82 100644 --- a/source/uwlab_rl/docs/CHANGELOG.rst +++ b/source/uwlab_rl/docs/CHANGELOG.rst @@ -1,6 +1,16 @@ Changelog --------- +0.2.0 (2026-09-16) +~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Ported to rsl-rl 5.x: explicit actor/critic model configs, gSDE as a distribution config, + and the runner export API. Requires Isaac Lab 3.0. + + 0.1.3 (2025-11-09) ~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_rl/setup.py b/source/uwlab_rl/setup.py index 0ab21bd1..d592c82a 100644 --- a/source/uwlab_rl/setup.py +++ b/source/uwlab_rl/setup.py @@ -19,15 +19,27 @@ # Minimum dependencies required prior to installation INSTALL_REQUIRES = [ # generic - "wandb>=0.19.6", + # rsl_rl's WandbSummaryWriter still passes ``wandb.Settings(start_method="thread")``; + # wandb removed that field and its Settings model rejects unknown fields, so newer + # releases fail at the first log call. 0.19.x is the last series that accepts it. + "wandb>=0.19.6,<0.20", ] PYTORCH_INDEX_URL = ["https://download.pytorch.org/whl/cu118"] # Extra dependencies for RL agents +# Pinned to a commit, not a branch: an unpinned git dependency makes a rebuild +# silently install a different API than the one this code was written against. +# Must be a commit on UW-Lab/rsl_rl that carries both the rsl-rl >= 5.0 API that +# Isaac Lab 3.0's isaaclab_rl requires and the gSDE distribution +# (GSDEGaussianDistribution) -- the vendor/leggedrobotics mirror has the API but +# not gSDE. Bump together with the Isaac Lab commit pinned in uwlab.sh. +# TODO(port): point back at UW-Lab/rsl_rl once port_rsl_rl_5 is merged there. +RSL_RL_REPO = "https://github.com/JTran-UW/rsl_rl.git" +RSL_RL_COMMIT = "f2c944d524f853e906ce493540cfc76e54cc50ea" # port_rsl_rl_5 EXTRAS_REQUIRE = { "rsl-rl": [ - "rsl-rl-lib @ git+https://github.com/UW-Lab/rsl_rl.git@main", + f"rsl-rl-lib @ git+{RSL_RL_REPO}@{RSL_RL_COMMIT}", ], } diff --git a/source/uwlab_rl/uwlab_rl/rsl_rl/__init__.py b/source/uwlab_rl/uwlab_rl/rsl_rl/__init__.py index 6a185904..b4efed44 100644 --- a/source/uwlab_rl/uwlab_rl/rsl_rl/__init__.py +++ b/source/uwlab_rl/uwlab_rl/rsl_rl/__init__.py @@ -3,4 +3,10 @@ # # SPDX-License-Identifier: BSD-3-Clause -from .rl_cfg import BehaviorCloningCfg, OffPolicyAlgorithmCfg, RslRlFancyPpoAlgorithmCfg +from .rl_cfg import ( + BehaviorCloningCfg, + GsdeDistributionCfg, + OffPolicyAlgorithmCfg, + RslRlFancyPpoAlgorithmCfg, + RslRlGsdePpoAlgorithmCfg, +) diff --git a/source/uwlab_rl/uwlab_rl/rsl_rl/exporter.py b/source/uwlab_rl/uwlab_rl/rsl_rl/exporter.py index b0df39dd..2f544759 100644 --- a/source/uwlab_rl/uwlab_rl/rsl_rl/exporter.py +++ b/source/uwlab_rl/uwlab_rl/rsl_rl/exporter.py @@ -3,183 +3,81 @@ # # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2022-2025, The Isaac Lab Project Developers. -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause +"""JIT export of an rsl-rl >= 5.0 actor with its output distribution. + +rsl-rl's own ``OnPolicyRunner.export_policy_to_jit`` exports the mean action only. Demo collection +(``scripts_v2/tools/collect_demos.py``) samples from the expert, so the exported module also needs +``compute_distribution(obs) -> (mean, std)``. The distribution's standard deviation is evaluated once at +export time through the distribution's own code path, so gSDE (state-dependent std), log-std and scalar-std +Gaussians all export exactly. +""" +from __future__ import annotations + +import copy import os import torch from torch import nn -from isaaclab_rl.rsl_rl.exporter import _OnnxPolicyExporter, _TorchPolicyExporter - -def export_policy_as_jit(policy: object, normalizer: object | None, path: str, filename="policy.pt"): - """Export policy into a Torch JIT file. +def export_policy_as_jit(actor: nn.Module, path: str, filename: str = "policy.pt") -> None: + """Export an rsl-rl ``MLPModel`` actor into a TorchScript file with ``forward`` and ``compute_distribution``. Args: - policy: The policy torch module. - normalizer: The empirical normalizer module. If None, Identity is used. - path: The path to the saving directory. - filename: The name of exported JIT file. Defaults to "policy.pt". + actor: The actor model (``rsl_rl.models.MLPModel``), uncompiled. + path: The directory to save into. + filename: The file name. Defaults to "policy.pt". """ - policy_exporter = _TorchPolicyExporterExtended(policy, normalizer) - policy_exporter.export(path, filename) - - -def export_policy_as_onnx( - policy: object, path: str, normalizer: object | None = None, filename="policy.onnx", verbose=False -): - """Export policy into a Torch ONNX file. - - Args: - policy: The policy torch module. - normalizer: The empirical normalizer module. If None, Identity is used. - path: The path to the saving directory. - filename: The name of exported ONNX file. Defaults to "policy.onnx". - verbose: Whether to print the model summary. Defaults to False. - """ - if not os.path.exists(path): - os.makedirs(path, exist_ok=True) - policy_exporter = _OnnxPolicyExporterExtended(policy, normalizer, verbose) - policy_exporter.export(path, filename) - - -""" -Helper Classes - Private. -""" - - -class _StateDependentPolicyMixin(nn.Module): - """Mixin class to handle state-dependent policy logic.""" - - def _setup_state_dependent_policy(self, policy): - """Setup state-dependent policy components.""" - self.actor_features = self.actor[:-1] # type: ignore - self.actor_final = self.actor[-1] # type: ignore - - self.register_buffer("log_std", policy.log_std.clone()) + os.makedirs(path, exist_ok=True) + exporter = _TorchPolicyExporter(actor).to("cpu") # device-neutral artifact; consumers move it as needed + torch.jit.script(exporter).save(os.path.join(path, filename)) + + +class _TorchPolicyExporter(nn.Module): + """TorchScript-able snapshot of an ``MLPModel`` actor: normalizer, MLP and output distribution.""" + + def __init__(self, actor: nn.Module) -> None: + super().__init__() + self.normalizer = copy.deepcopy(actor.obs_normalizer) + # ``MLP`` is an ``nn.Sequential`` subclass whose ``__init__`` takes positional arguments, + # so it cannot be sliced; rebuild the split around the last layer explicitly. + layers = [copy.deepcopy(layer) for layer in actor.mlp] + self.actor_features = nn.Sequential(*layers[:-1]) + self.actor_final = layers[-1] self.epsilon = 1e-6 - def _setup_regular_policy(self, policy): - """Setup regular policy components.""" - self.actor_features = self.actor[:-1] # type: ignore - self.actor_final = self.actor[-1] # type: ignore - - if hasattr(policy, "std"): - self.register_buffer("std", policy.std.clone()) - if hasattr(policy, "log_std"): - self.register_buffer("log_std", policy.log_std.clone()) - if hasattr(policy, "noise_std_type"): - self.noise_std_type = policy.noise_std_type - else: - self.noise_std_type = "scalar" - - # For GSDE, ensure epsilon is set - if self.noise_std_type == "gsde": - self.epsilon = 1e-6 - - def _ensure_compatibility_attributes(self, policy): - """Ensure all attributes exist for TorchScript compatibility.""" - if not hasattr(self, "std"): - if hasattr(policy, "std"): - self.register_buffer("std", policy.std.clone()) - else: - # Create a default std tensor - default_std = torch.ones(policy.num_actions if hasattr(policy, "num_actions") else 1) - self.register_buffer("std", default_std) - - if not hasattr(self, "log_std"): - if hasattr(policy, "log_std"): - self.register_buffer("log_std", policy.log_std.clone()) + dist = actor.distribution + with torch.no_grad(): + if dist is None: + self.state_dependent = False + self.register_buffer("std", torch.ones(1)) + self.register_buffer("std_matrix", torch.ones(1, 1)) + elif hasattr(dist, "_get_std") and getattr(dist, "requires_latent_sde", False): + # gSDE: marginal std = sqrt(phi(s)^2 @ std_matrix^2), std_matrix is (latent_dim, num_actions) + # after the distribution's own clamp / full_std / expln handling. + self.state_dependent = True + self.register_buffer("std", torch.ones(1)) + self.register_buffer("std_matrix", dist._get_std().detach().clone()) else: - # Create a default log_std tensor - default_log_std = torch.zeros(policy.num_actions if hasattr(policy, "num_actions") else 1) - self.register_buffer("log_std", default_log_std) - - if not hasattr(self, "epsilon"): - self.epsilon = 1e-6 - - if not hasattr(self, "noise_std_type"): - if hasattr(policy, "noise_std_type"): - self.noise_std_type = policy.noise_std_type - else: - self.noise_std_type = "scalar" # Default fallback - - # Ensure epsilon is set for GSDE - if self.noise_std_type == "gsde" and not hasattr(self, "epsilon"): - self.epsilon = 1e-6 - - def _compute_distribution(self, observations): - """Compute mean and std for distribution.""" - if self.is_state_dependent.item(): # type: ignore - # Use the separated layers - features = self.actor_features(observations) # type: ignore - mean = self.actor_final(features) # type: ignore - - # Compute variance using exploration matrices and torch.mm - variance = torch.mm(features**2, torch.exp(self.log_std) ** 2) # type: ignore - std = torch.sqrt(variance + self.epsilon) - - return mean, std - else: - # Regular ActorCritic logic - mean = self.actor(observations) # type: ignore - - if self.noise_std_type == "scalar": - std = self.std.expand_as(mean) # type: ignore - elif self.noise_std_type == "log": - std = torch.exp(self.log_std).expand_as(mean) # type: ignore - elif self.noise_std_type == "gsde": - # GSDE: log_std is a matrix (hidden_dim, num_actions) - # Compute features from actor[:-1] (all layers except last) - features = self.actor_features(observations) # type: ignore - # Compute variance: variance = torch.mm(features**2, exp(log_std)**2) - # features shape: (batch, hidden_dim), log_std shape: (hidden_dim, num_actions) - variance = torch.mm(features**2, torch.exp(self.log_std) ** 2) # type: ignore - std = torch.sqrt(variance + self.epsilon) - else: - std = torch.ones_like(mean) - - return mean, std - - -class _TorchPolicyExporterExtended(_TorchPolicyExporter, _StateDependentPolicyMixin): - def __init__(self, policy, normalizer=None): - super().__init__(policy, normalizer) - - # Detect policy type - is_state_dependent = hasattr(policy, "use_state_dependent_noise") and policy.use_state_dependent_noise - self.register_buffer("is_state_dependent", torch.tensor(is_state_dependent, dtype=torch.bool)) - - if is_state_dependent: - self._setup_state_dependent_policy(policy) - else: - self._setup_regular_policy(policy) - - # Ensure all attributes exist for TorchScript compatibility - self._ensure_compatibility_attributes(policy) + # Gaussian: evaluate the clamped std once from the distribution's parameterization. + self.state_dependent = False + if getattr(dist, "std_type", "scalar") == "log": + std = torch.exp(dist.log_std_param.clamp(dist.log_std_range[0], dist.log_std_range[1])) + else: + std = dist.std_param.clamp(dist.std_range[0], dist.std_range[1]) + self.register_buffer("std", std.detach().clone()) + self.register_buffer("std_matrix", torch.ones(1, 1)) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + return self.actor_final(self.actor_features(self.normalizer(x))) @torch.jit.export - def compute_distribution(self, x): - observations = self.normalizer(x) - return self._compute_distribution(observations) - - -class _OnnxPolicyExporterExtended(_OnnxPolicyExporter, _StateDependentPolicyMixin): - def __init__(self, policy, normalizer=None, verbose=False): - super().__init__(policy, normalizer, verbose) - - is_state_dependent = hasattr(policy, "use_state_dependent_noise") and policy.use_state_dependent_noise - self.register_buffer("is_state_dependent", torch.tensor(is_state_dependent, dtype=torch.bool)) - - if is_state_dependent: - self._setup_state_dependent_policy(policy) + def compute_distribution(self, x: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]: + features = self.actor_features(self.normalizer(x)) + mean = self.actor_final(features) + if self.state_dependent: + variance = torch.mm(features**2, self.std_matrix**2) + std = torch.sqrt(variance + self.epsilon) else: - self._setup_regular_policy(policy) - - @torch.jit.export - def compute_distribution(self, x): - observations = self.normalizer(x) - return self._compute_distribution(observations) + std = self.std.expand_as(mean) + return mean, std diff --git a/source/uwlab_rl/uwlab_rl/rsl_rl/rl_cfg.py b/source/uwlab_rl/uwlab_rl/rsl_rl/rl_cfg.py index 11917539..af402f4b 100644 --- a/source/uwlab_rl/uwlab_rl/rsl_rl/rl_cfg.py +++ b/source/uwlab_rl/uwlab_rl/rsl_rl/rl_cfg.py @@ -4,10 +4,9 @@ # SPDX-License-Identifier: BSD-3-Clause from dataclasses import MISSING -from typing import Literal from isaaclab.utils import configclass -from isaaclab_rl.rsl_rl import RslRlPpoActorCriticCfg, RslRlPpoAlgorithmCfg # noqa: F401 +from isaaclab_rl.rsl_rl import RslRlMLPModelCfg, RslRlPpoActorCriticCfg, RslRlPpoAlgorithmCfg # noqa: F401 @configclass @@ -57,15 +56,12 @@ class OffPolicyAlgorithmCfg: """The configuration for the offline behavior cloning(dagger).""" -@configclass -class RslRlFancyActorCriticCfg(RslRlPpoActorCriticCfg): - """Configuration for the fancy actor-critic networks.""" - - state_dependent_std: bool = False - """Whether to use state-dependent standard deviation.""" - - noise_std_type: Literal["scalar", "log", "gsde"] = "scalar" - """The type of noise standard deviation for the policy. Default is scalar.""" +# Must stay an alias, not a subclass: isaaclab_rl's `policy` -> `actor`/`critic` shim +# dispatches on `type(cfg.policy) is RslRlPpoActorCriticCfg`, so a subclass falls through +# every branch and leaves `actor` MISSING (surfacing as `KeyError: 'class_name'` in +# PPO.construct_algorithm). See isaaclab_rl/rsl_rl/utils.py. +RslRlFancyActorCriticCfg = RslRlPpoActorCriticCfg +"""Alias of :class:`RslRlPpoActorCriticCfg`; see the note above.""" @configclass @@ -77,3 +73,38 @@ class RslRlFancyPpoAlgorithmCfg(RslRlPpoAlgorithmCfg): offline_algorithm_cfg: OffPolicyAlgorithmCfg | None = None """The configuration for the offline algorithms.""" + + +@configclass +class GsdeDistributionCfg(RslRlMLPModelCfg.DistributionCfg): + """Configuration for rsl_rl's ``GSDEGaussianDistribution`` (generalized state-dependent exploration). + + A separate cfg class because ``GaussianDistributionCfg`` carries ``std_type``, which the gSDE + constructor does not accept (every field here is forwarded as a constructor kwarg). + """ + + class_name: str = "rsl_rl.modules.distribution:GSDEGaussianDistribution" + + init_std: float = MISSING + """Initial standard deviation (fills every entry of the gSDE log-std matrix).""" + + full_std: bool = True + """Learn a full ``(latent_dim, output_dim)`` log-std matrix instead of one row broadcast over the latent.""" + + learn_features: bool = False + """Let gSDE gradients flow into the policy backbone through the penultimate features.""" + + use_expln: bool = False + """Use the ``expln`` std parameterization instead of ``exp``.""" + + +@configclass +class RslRlGsdePpoAlgorithmCfg(RslRlPpoAlgorithmCfg): + """PPO configuration with rsl_rl's gSDE resampling knob.""" + + sde_sample_freq: int = -1 + """Re-sample the per-env gSDE exploration matrices every this many env steps during a rollout. + + ``-1`` keeps them fixed for the whole rollout (smooth, time-correlated noise). ``1`` draws fresh + noise every step, i.e. exploration independent across steps and environments. + """ diff --git a/source/uwlab_tasks/config/extension.toml b/source/uwlab_tasks/config/extension.toml index 37dbd4f7..b6b67257 100644 --- a/source/uwlab_tasks/config/extension.toml +++ b/source/uwlab_tasks/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.13.8" +version = "0.14.0" # Description title = "UW Lab Tasks" diff --git a/source/uwlab_tasks/docs/CHANGELOG.rst b/source/uwlab_tasks/docs/CHANGELOG.rst index 44050103..071da403 100644 --- a/source/uwlab_tasks/docs/CHANGELOG.rst +++ b/source/uwlab_tasks/docs/CHANGELOG.rst @@ -1,6 +1,17 @@ Changelog --------- +0.14.0 (2026-09-16) +~~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Ported to Isaac Lab 3.0: ``sim.physics = PhysxCfg(...)`` replaces ``sim.physx``, scalar-last + quaternions in task and asset configs, warp-backed data accessors, ``JointWrenchSensor`` for + wrist wrenches, and Isaac Lab 3.0 convention-stamped OmniReset datasets. + + 0.13.8 (2025-10-24) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_tasks/setup.py b/source/uwlab_tasks/setup.py index ef5632e8..7e4dbacb 100644 --- a/source/uwlab_tasks/setup.py +++ b/source/uwlab_tasks/setup.py @@ -26,27 +26,31 @@ "cmaes", ] +# pytorch3d is only needed by the collision analyzer, which runs in the +# dataset-generation tasks (reset states, grasp sampling, partial assemblies). +# omnireset/mdp/utils.py imports it lazily so the RL tasks stay usable without it, +# and it is exposed as the ``collision`` extra (``uwlab.sh -i`` installs it). +# +# There is no sdist fallback on purpose -- building pytorch3d from source needs a +# matching CUDA toolkit and takes a long time -- so a wheel is only added when a +# prebuilt one exists for this python/CUDA combination. The build is tied to the +# torch it was compiled against, so keep this table in sync with the torch pin in +# uwlab.sh (`ensure_cuda_torch`) and check a new pin actually loads. +# +# cp310/cp311 -> 0.7.8 + pt2.7.0 + cu128 (Isaac Lab 2.3.2 stack) +# cp312 -> 0.7.9 + pt2.10.0 + cu128 (Isaac Lab 3.0 stack) +# +# cp312 needs 0.7.9: 0.7.8's newest cp312 build is pt2.8.0. No pt2.11 build is +# published for either release, so cp312 takes the newest (pt2.10.0); it loads +# against the torch 2.11.0 that Isaac Sim 6.0.1 pins (CUDA ops verified). is_linux_x86_64 = platform.system() == "Linux" and platform.machine() in ("x86_64", "AMD64") py = f"cp{sys.version_info.major}{sys.version_info.minor}" wheel_by_py = { - "cp311": ( - "https://github.com/MiroPsota/torch_packages_builder/releases/download/pytorch3d-0.7.8/" - "pytorch3d-0.7.8%2Bpt2.7.0cu128-cp311-cp311-linux_x86_64.whl" - ), - "cp310": ( - "https://github.com/MiroPsota/torch_packages_builder/releases/download/pytorch3d-0.7.8/" - "pytorch3d-0.7.8%2Bpt2.7.0cu128-cp310-cp310-linux_x86_64.whl" + "cp312": ( + "https://github.com/MiroPsota/torch_packages_builder/releases/download/pytorch3d-0.7.9/" + "pytorch3d-0.7.9%2Bpt2.10.0cu128-cp312-cp312-linux_x86_64.whl" ), -} - -if is_linux_x86_64 and py in wheel_by_py: - INSTALL_REQUIRES.append(f"pytorch3d @ {wheel_by_py[py]}") - -is_linux_x86_64 = platform.system() == "Linux" and platform.machine() in ("x86_64", "AMD64") -py = f"cp{sys.version_info.major}{sys.version_info.minor}" - -wheel_by_py = { "cp311": ( "https://github.com/MiroPsota/torch_packages_builder/releases/download/pytorch3d-0.7.8/" "pytorch3d-0.7.8%2Bpt2.7.0cu128-cp311-cp311-linux_x86_64.whl" @@ -57,8 +61,9 @@ ), } -if is_linux_x86_64 and py in wheel_by_py: - INSTALL_REQUIRES.append(f"pytorch3d @ {wheel_by_py[py]}") +EXTRAS_REQUIRE = { + "collision": [f"pytorch3d @ {wheel_by_py[py]}"] if is_linux_x86_64 and py in wheel_by_py else [], +} # Installation operation setup( @@ -73,6 +78,7 @@ include_package_data=True, python_requires=">=3.10", install_requires=INSTALL_REQUIRES, + extras_require=EXTRAS_REQUIRE, packages=["uwlab_tasks"], classifiers=[ "Natural Language :: English", diff --git a/source/uwlab_tasks/uwlab_tasks/direct/cartpole/cartpole_camera_env.py b/source/uwlab_tasks/uwlab_tasks/direct/cartpole/cartpole_camera_env.py index 31c0704f..86aa4b3e 100644 --- a/source/uwlab_tasks/uwlab_tasks/direct/cartpole/cartpole_camera_env.py +++ b/source/uwlab_tasks/uwlab_tasks/direct/cartpole/cartpole_camera_env.py @@ -38,7 +38,7 @@ class CartpoleRGBCameraEnvCfg(DirectRLEnvCfg): # camera tiled_camera: TiledCameraCfg = TiledCameraCfg( prim_path="/World/envs/env_.*/Camera", - offset=TiledCameraCfg.OffsetCfg(pos=(-5.0, 0.0, 2.0), rot=(1.0, 0.0, 0.0, 0.0), convention="world"), + offset=TiledCameraCfg.OffsetCfg(pos=(-5.0, 0.0, 2.0), rot=(0.0, 0.0, 0.0, 1.0), convention="world"), data_types=["rgb"], spawn=sim_utils.PinholeCameraCfg( focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 20.0) @@ -76,7 +76,7 @@ class CartpoleDepthCameraEnvCfg(CartpoleRGBCameraEnvCfg): # camera tiled_camera: TiledCameraCfg = TiledCameraCfg( prim_path="/World/envs/env_.*/Camera", - offset=TiledCameraCfg.OffsetCfg(pos=(-5.0, 0.0, 2.0), rot=(1.0, 0.0, 0.0, 0.0), convention="world"), + offset=TiledCameraCfg.OffsetCfg(pos=(-5.0, 0.0, 2.0), rot=(0.0, 0.0, 0.0, 1.0), convention="world"), data_types=["depth"], spawn=sim_utils.PinholeCameraCfg( focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 20.0) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/classic/cartpole/cartpole_camera_env_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/classic/cartpole/cartpole_camera_env_cfg.py index ab441009..b52ca861 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/classic/cartpole/cartpole_camera_env_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/classic/cartpole/cartpole_camera_env_cfg.py @@ -24,7 +24,7 @@ class CartpoleRGBCameraSceneCfg(CartpoleSceneCfg): # add camera to the scene tiled_camera: TiledCameraCfg = TiledCameraCfg( prim_path="{ENV_REGEX_NS}/Camera", - offset=TiledCameraCfg.OffsetCfg(pos=(-7.0, 0.0, 3.0), rot=(0.9945, 0.0, 0.1045, 0.0), convention="world"), + offset=TiledCameraCfg.OffsetCfg(pos=(-7.0, 0.0, 3.0), rot=(0.0, 0.1045, 0.0, 0.9945), convention="world"), data_types=["rgb"], spawn=sim_utils.PinholeCameraCfg( focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 20.0) @@ -40,7 +40,7 @@ class CartpoleDepthCameraSceneCfg(CartpoleSceneCfg): # add camera to the scene tiled_camera: TiledCameraCfg = TiledCameraCfg( prim_path="{ENV_REGEX_NS}/Camera", - offset=TiledCameraCfg.OffsetCfg(pos=(-7.0, 0.0, 3.0), rot=(0.9945, 0.0, 0.1045, 0.0), convention="world"), + offset=TiledCameraCfg.OffsetCfg(pos=(-7.0, 0.0, 3.0), rot=(0.0, 0.1045, 0.0, 0.9945), convention="world"), data_types=["distance_to_camera"], spawn=sim_utils.PinholeCameraCfg( focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 20.0) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/advance_skills/advance_skills_base_env.py b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/advance_skills/advance_skills_base_env.py index 7e0ba91f..1c30ee16 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/advance_skills/advance_skills_base_env.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/advance_skills/advance_skills_base_env.py @@ -20,7 +20,8 @@ from isaaclab.terrains import TerrainGeneratorCfg, TerrainImporterCfg from isaaclab.utils import configclass from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR, ISAACLAB_NUCLEUS_DIR -from isaaclab.utils.noise import AdditiveUniformNoiseCfg as Unoise +from isaaclab.utils.noise import UniformNoiseCfg as Unoise +from isaaclab_physx.physics import PhysxCfg import uwlab_tasks.manager_based.locomotion.advance_skills.mdp as mdp @@ -347,10 +348,12 @@ def __post_init__(self): self.sim.dt = 0.005 self.sim.render_interval = self.decimation self.sim.physics_material = self.scene.terrain.physics_material - self.sim.physx.gpu_total_aggregate_pairs_capacity = 2**24 - self.sim.physx.gpu_found_lost_pairs_capacity = 2**24 - self.sim.physx.gpu_collision_stack_size = 2**27 - self.sim.physx.gpu_max_rigid_patch_count = 5 * 2**16 + if self.sim.physics is None: + self.sim.physics = PhysxCfg() + self.sim.physics.gpu_total_aggregate_pairs_capacity = 2**24 + self.sim.physics.gpu_found_lost_pairs_capacity = 2**24 + self.sim.physics.gpu_collision_stack_size = 2**27 + self.sim.physics.gpu_max_rigid_patch_count = 5 * 2**16 # update sensor update periods # we tick all the sensors based on the smallest update period (physics update period) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/advance_skills/config/spot/mdp/rewards.py b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/advance_skills/config/spot/mdp/rewards.py index f5b6bd1e..d8684359 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/advance_skills/config/spot/mdp/rewards.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/advance_skills/config/spot/mdp/rewards.py @@ -32,7 +32,7 @@ def reward_forward_velocity( """Reward tracking of linear velocity commands (xy axes) using exponential kernel.""" # extract the used quantities (to enable type-hinting) asset: RigidObject = env.scene[asset_cfg.name] - root_lin_vel_b = asset.data.root_lin_vel_b + root_lin_vel_b = asset.data.root_lin_vel_b.torch forward_velocity = root_lin_vel_b[:, 0] current_iter = int(env.common_step_counter / 48) distance = torch.norm(env.command_manager.get_command("goal_point")[:, :2], dim=1) @@ -53,14 +53,14 @@ def air_time_reward( if contact_sensor.cfg.track_air_time is False: raise RuntimeError("Activate ContactSensor's track_air_time!") # compute the reward - current_air_time = contact_sensor.data.current_air_time[:, sensor_cfg.body_ids] - current_contact_time = contact_sensor.data.current_contact_time[:, sensor_cfg.body_ids] + current_air_time = contact_sensor.data.current_air_time.torch[:, sensor_cfg.body_ids] + current_contact_time = contact_sensor.data.current_contact_time.torch[:, sensor_cfg.body_ids] t_max = torch.max(current_air_time, current_contact_time) t_min = torch.clip(t_max, max=mode_time) stance_cmd_reward = torch.clip(current_contact_time - current_air_time, -mode_time, mode_time) distance = torch.norm(env.command_manager.get_command("goal_point")[:, :2], dim=1).unsqueeze(dim=1).expand(-1, 4) - body_vel = torch.linalg.norm(asset.data.root_com_lin_vel_b[:, :2], dim=1).unsqueeze(dim=1).expand(-1, 4) + body_vel = torch.linalg.norm(asset.data.root_com_lin_vel_b.torch[:, :2], dim=1).unsqueeze(dim=1).expand(-1, 4) reward = torch.where( torch.logical_or(distance > 0.4, body_vel > velocity_threshold), torch.where(t_max < mode_time, t_min, 0), @@ -174,8 +174,8 @@ def air_time_variance_penalty(env: ManagerBasedRLEnv, sensor_cfg: SceneEntityCfg if contact_sensor.cfg.track_air_time is False: raise RuntimeError("Activate ContactSensor's track_air_time!") # compute the reward - last_air_time = contact_sensor.data.last_air_time[:, sensor_cfg.body_ids] - last_contact_time = contact_sensor.data.last_contact_time[:, sensor_cfg.body_ids] + last_air_time = contact_sensor.data.last_air_time.torch[:, sensor_cfg.body_ids] + last_contact_time = contact_sensor.data.last_contact_time.torch[:, sensor_cfg.body_ids] return torch.var(torch.clip(last_air_time, max=0.5), dim=1) + torch.var( torch.clip(last_contact_time, max=0.5), dim=1 ) @@ -190,9 +190,9 @@ def foot_slip_penalty( contact_sensor: ContactSensor = env.scene.sensors[sensor_cfg.name] # check if contact force is above threshold - net_contact_forces = contact_sensor.data.net_forces_w_history + net_contact_forces = contact_sensor.data.net_forces_w_history.torch is_contact = torch.max(torch.norm(net_contact_forces[:, :, sensor_cfg.body_ids], dim=-1), dim=1)[0] > threshold - foot_planar_velocity = torch.linalg.norm(asset.data.body_com_lin_vel_w[:, asset_cfg.body_ids, :2], dim=2) + foot_planar_velocity = torch.linalg.norm(asset.data.body_com_lin_vel_w.torch[:, asset_cfg.body_ids, :2], dim=2) reward = is_contact * foot_planar_velocity return torch.sum(reward, dim=1) @@ -205,6 +205,6 @@ def joint_position_penalty( # extract the used quantities (to enable type-hinting) asset: Articulation = env.scene[asset_cfg.name] distance = torch.norm(env.command_manager.get_command("goal_point")[:, :2], dim=1) - body_vel = torch.linalg.norm(asset.data.root_lin_vel_b[:, :2], dim=1) - reward = torch.linalg.norm((asset.data.joint_pos - asset.data.default_joint_pos), dim=1) + body_vel = torch.linalg.norm(asset.data.root_lin_vel_b.torch[:, :2], dim=1) + reward = torch.linalg.norm((asset.data.joint_pos.torch - asset.data.default_joint_pos.torch), dim=1) return torch.where((distance > 0.4) | (body_vel > velocity_threshold), reward, stand_still_scale * reward) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/advance_skills/mdp/rewards.py b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/advance_skills/mdp/rewards.py index 873d7960..9c54c45d 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/advance_skills/mdp/rewards.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/advance_skills/mdp/rewards.py @@ -54,7 +54,7 @@ def heading_tracking(env: ManagerBasedRLEnv, distance_threshold: float = 2.0, re def exploration_reward(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEntityCfg("robot")): # Retrieve the robot and target data robot: Articulation = env.scene[robot_cfg.name] - base_velocity = robot.data.root_lin_vel_b # Robot's current base velocity vector + base_velocity = robot.data.root_lin_vel_b.torch # Robot's current base velocity vector target_position = env.command_manager.get_command("goal_point")[ :, :2 ] # Target position vector relative to robot base @@ -79,14 +79,14 @@ def stall_penalty( distance_threshold: float = 0.5, ): robot: Articulation = env.scene[robot_cfg.name] - base_vel = robot.data.root_lin_vel_b.norm(2, dim=-1) + base_vel = robot.data.root_lin_vel_b.torch.norm(2, dim=-1) distance_to_goal = env.command_manager.get_command("goal_point")[:, :2].norm(2, dim=-1) return (base_vel < base_vel_threshold) & (distance_to_goal > distance_threshold) def illegal_contact_penalty(env: ManagerBasedRLEnv, threshold: float, sensor_cfg: SceneEntityCfg): contact_sensor: ContactSensor = env.scene.sensors[sensor_cfg.name] # type: ignore - net_contact_forces = contact_sensor.data.net_forces_w_history + net_contact_forces = contact_sensor.data.net_forces_w_history.torch # check if any contact force exceeds the threshold return torch.any( torch.max(torch.norm(net_contact_forces[:, :, sensor_cfg.body_ids], dim=-1), dim=1)[0] > threshold, @@ -96,13 +96,13 @@ def illegal_contact_penalty(env: ManagerBasedRLEnv, threshold: float, sensor_cfg def feet_lin_acc_l2(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEntityCfg("robot")): robot: Articulation = env.scene[robot_cfg.name] - feet_acc = torch.sum(torch.square(robot.data.body_lin_acc_w[..., robot_cfg.body_ids, :]), dim=(1, 2)) + feet_acc = torch.sum(torch.square(robot.data.body_lin_acc_w.torch[..., robot_cfg.body_ids, :]), dim=(1, 2)) return feet_acc def feet_rot_acc_l2(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEntityCfg("robot")): robot: Articulation = env.scene[robot_cfg.name] - feet_acc = torch.sum(torch.square(robot.data.body_ang_acc_w[..., robot_cfg.body_ids, :]), dim=(1, 2)) + feet_acc = torch.sum(torch.square(robot.data.body_ang_acc_w.torch[..., robot_cfg.body_ids, :]), dim=(1, 2)) return feet_acc @@ -112,6 +112,6 @@ def stand_penalty( robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), ) -> torch.Tensor: robot: Articulation = env.scene[robot_cfg.name] - base_height = robot.data.root_link_pos_w[:, 2] # z-coordinate of the base + base_height = robot.data.root_link_pos_w.torch[:, 2] # z-coordinate of the base penalty = (base_height < height_threshold).float() * -1.0 return penalty diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/balance_beams_env.py b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/balance_beams_env.py index 2689e6b0..c362944b 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/balance_beams_env.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/balance_beams_env.py @@ -5,7 +5,7 @@ from isaaclab.managers import RewardTermCfg as RewTerm from isaaclab.utils import configclass -from isaaclab.utils.noise import AdditiveUniformNoiseCfg as Unoise +from isaaclab.utils.noise import UniformNoiseCfg as Unoise import uwlab_tasks.manager_based.locomotion.risky_terrains.mdp as mdp diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/mdp/rewards.py b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/mdp/rewards.py index 724e6050..c52744ab 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/mdp/rewards.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/mdp/rewards.py @@ -17,8 +17,8 @@ def joint_vel_limit_pen( env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), limits_factor: float = 0.9 ): robot: Articulation = env.scene[robot_cfg.name] - joint_vel = robot.data.joint_vel[:, robot_cfg.joint_ids] - joint_vel_limit = robot.data.soft_joint_vel_limits[:, robot_cfg.joint_ids] + joint_vel = robot.data.joint_vel.torch[:, robot_cfg.joint_ids] + joint_vel_limit = robot.data.soft_joint_vel_limits.torch[:, robot_cfg.joint_ids] return torch.sum((joint_vel.abs() - limits_factor * joint_vel_limit).clamp_min_(0), dim=-1) @@ -28,8 +28,8 @@ def base_accel_pen( ratio: float = 0.02, ): robot: Articulation = env.scene[robot_cfg.name] - base_angle_accel = robot.data.body_ang_acc_w[:, robot_cfg.body_ids].norm(2, dim=-1).pow(2) - base_lin_accel = robot.data.body_lin_acc_w[:, robot_cfg.body_ids].norm(2, dim=-1).pow(2) + base_angle_accel = robot.data.body_ang_acc_w.torch[:, robot_cfg.body_ids].norm(2, dim=-1).pow(2) + base_lin_accel = robot.data.body_lin_acc_w.torch[:, robot_cfg.body_ids].norm(2, dim=-1).pow(2) return (base_lin_accel + ratio * base_angle_accel).squeeze(-1) @@ -38,7 +38,7 @@ def feet_accel_l1_pen( robot_cfg: SceneEntityCfg = SceneEntityCfg("robot", body_names=".*FOOT"), ): robot: Articulation = env.scene[robot_cfg.name] - feet_acc = robot.data.body_lin_acc_w[:, robot_cfg.body_ids].norm(2, dim=-1) + feet_acc = robot.data.body_lin_acc_w.torch[:, robot_cfg.body_ids].norm(2, dim=-1) return torch.sum(feet_acc, dim=-1) @@ -46,7 +46,7 @@ def contact_forces_pen( env: ManagerBasedRLEnv, threshold: float = 700, sensor_cfg: SceneEntityCfg = SceneEntityCfg("contact_sensor") ): contact_sensor: ContactSensor = env.scene.sensors[sensor_cfg.name] - net_contact_forces = contact_sensor.data.net_forces_w_history + net_contact_forces = contact_sensor.data.net_forces_w_history.torch force = torch.norm(net_contact_forces[:, 0, sensor_cfg.body_ids], dim=-1) return torch.clamp(force - threshold, 0, threshold).pow(2).sum(-1) @@ -80,7 +80,7 @@ def dont_wait( ): robot: Articulation = env.scene[robot_cfg.name] dist_to_goal = env.command_manager.get_command("target_cmd")[:, :2].norm(2, -1) - return (dist_to_goal > d).float() * (robot.data.root_lin_vel_w.norm(2, -1) < velocity_threshold).float() + return (dist_to_goal > d).float() * (robot.data.root_lin_vel_w.torch.norm(2, -1) < velocity_threshold).float() def move_in_dir( @@ -89,7 +89,7 @@ def move_in_dir( robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), ): robot: Articulation = env.scene[robot_cfg.name] - lin_vel_b = robot.data.root_lin_vel_b[:, :2] + lin_vel_b = robot.data.root_lin_vel_b.torch[:, :2] target_dir = env.command_manager.get_command("target_cmd")[:, :2] current_iter = int(env.common_step_counter / 48) return torch.cosine_similarity(lin_vel_b, target_dir, dim=-1) * float(current_iter < max_iter) @@ -97,7 +97,9 @@ def move_in_dir( def foot_on_ground(env: ManagerBasedRLEnv, sensor_cfg: SceneEntityCfg, d: float = 0.25, tr: float = 1.0): contact_sensor: ContactSensor = env.scene.sensors[sensor_cfg.name] - foot_on_ground_rew = 1 - torch.tanh(contact_sensor.data.current_air_time[:, sensor_cfg.body_ids].sum(-1) / 0.5) + foot_on_ground_rew = 1 - torch.tanh( + contact_sensor.data.current_air_time.torch[:, sensor_cfg.body_ids].sum(-1) / 0.5 + ) distance_succ_mask = (env.command_manager.get_command("target_cmd")[:, :2].norm(2, -1)) < d rew_window_scaler = ( @@ -120,7 +122,9 @@ def stand_still( tr: float = 1.0, ): robot: Articulation = env.scene[robot_cfg.name] - movement_penalty = 2.5 * robot.data.root_lin_vel_w.norm(2, -1) + 1.0 * robot.data.root_ang_vel_w.norm(2, -1) + movement_penalty = 2.5 * robot.data.root_lin_vel_w.torch.norm(2, -1) + 1.0 * robot.data.root_ang_vel_w.torch.norm( + 2, -1 + ) heading_succ_mask = (env.command_manager.get_command("target_cmd")[:, 3].abs()) < phi distance_succ_mask = (env.command_manager.get_command("target_cmd")[:, :2].norm(2, -1)) < d @@ -138,7 +142,7 @@ def stand_still( def illegal_contact_penalty(env: ManagerBasedRLEnv, threshold: float, sensor_cfg: SceneEntityCfg): contact_sensor: ContactSensor = env.scene.sensors[sensor_cfg.name] - net_contact_forces = contact_sensor.data.net_forces_w_history + net_contact_forces = contact_sensor.data.net_forces_w_history.torch # check if any contact force exceeds the threshold return torch.any( torch.max(torch.norm(net_contact_forces[:, :, sensor_cfg.body_ids], dim=-1), dim=1)[0] > threshold, dim=1 @@ -221,7 +225,7 @@ def aggressive_motion( robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), ): robot: Articulation = env.scene[robot_cfg.name] - horizontal_velocity = robot.data.root_lin_vel_w[:, :2].norm(2, -1) + horizontal_velocity = robot.data.root_lin_vel_w.torch[:, :2].norm(2, -1) return (horizontal_velocity - threshold).pow(2) * (horizontal_velocity > threshold).float() @@ -236,7 +240,10 @@ def stand_pos( ): robot: Articulation = env.scene[robot_cfg.name] return ( - ((robot.data.root_pos_w[:, -1] - base_height).abs() + robot.data.projected_gravity_b[:, :2].pow(2).sum(-1)) + ( + (robot.data.root_pos_w.torch[:, -1] - base_height).abs() + + robot.data.projected_gravity_b.torch[:, :2].pow(2).sum(-1) + ) * ((env.command_manager.get_command("target_cmd")[:, :2].norm(2, -1)) < d).float() * ( 1 @@ -257,7 +264,7 @@ def torque_limits( ratio: float = 1.0, ) -> torch.Tensor: asset: Articulation = env.scene[asset_cfg.name] - computed_torque = asset.data.computed_torque[:, asset_cfg.joint_ids].abs() # shape: [batch, joint] + computed_torque = asset.data.computed_torque.torch[:, asset_cfg.joint_ids].abs() # shape: [batch, joint] limits = ratio * asset.actuators.get(actuator_name).effort_limit out_of_limits = torch.clamp(computed_torque - limits, min=0) return torch.sum(out_of_limits, dim=1) @@ -270,8 +277,8 @@ def torque_limits_knee( env: ManagerBasedRLEnv, asset_cfg: SceneEntityCfg = SceneEntityCfg("robot"), ratio: float = 1.0 ) -> torch.Tensor: asset: Articulation = env.scene[asset_cfg.name] - computed_torque = asset.data.computed_torque[:, asset_cfg.joint_ids] # shape: [batch, joint] - applied_torque = asset.data.applied_torque[:, asset_cfg.joint_ids] + computed_torque = asset.data.computed_torque.torch[:, asset_cfg.joint_ids] # shape: [batch, joint] + applied_torque = asset.data.applied_torque.torch[:, asset_cfg.joint_ids] out_of_limits = ratio * (computed_torque - applied_torque).abs() return torch.sum(out_of_limits, dim=1) @@ -288,7 +295,7 @@ def reward_forward_velocity( """Reward tracking of linear velocity commands (xy axes) using exponential kernel.""" # extract the used quantities (to enable type-hinting) asset: RigidObject = env.scene[asset_cfg.name] - root_lin_vel_b = asset.data.root_lin_vel_b + root_lin_vel_b = asset.data.root_lin_vel_b.torch forward_velocity = root_lin_vel_b * torch.tensor(forward_vector, device=env.device, dtype=root_lin_vel_b.dtype) forward_reward = torch.sum(forward_velocity, dim=1) current_iter = int(env.common_step_counter / 48) @@ -311,14 +318,14 @@ def air_time_reward( if contact_sensor.cfg.track_air_time is False: raise RuntimeError("Activate ContactSensor's track_air_time!") # compute the reward - current_air_time = contact_sensor.data.current_air_time[:, sensor_cfg.body_ids] - current_contact_time = contact_sensor.data.current_contact_time[:, sensor_cfg.body_ids] + current_air_time = contact_sensor.data.current_air_time.torch[:, sensor_cfg.body_ids] + current_contact_time = contact_sensor.data.current_contact_time.torch[:, sensor_cfg.body_ids] t_max = torch.max(current_air_time, current_contact_time) t_min = torch.clip(t_max, max=mode_time) stance_cmd_reward = torch.clip(current_contact_time - current_air_time, -mode_time, mode_time) # cmd = torch.norm(env.command_manager.get_command("base_velocity"), dim=1).unsqueeze(dim=1).expand(-1, 4) - body_vel = torch.linalg.norm(asset.data.root_com_lin_vel_b[:, :2], dim=1).unsqueeze(dim=1).expand(-1, 4) + body_vel = torch.linalg.norm(asset.data.root_com_lin_vel_b.torch[:, :2], dim=1).unsqueeze(dim=1).expand(-1, 4) distance = torch.norm(env.command_manager.get_command("target_cmd")[:, :2], dim=1) reward = torch.where( (distance > 0.4) & (body_vel > velocity_threshold), @@ -435,8 +442,8 @@ def joint_position_penalty( """Penalize joint position error from default on the articulation.""" asset: Articulation = env.scene[asset_cfg.name] distance = torch.norm(env.command_manager.get_command("target_cmd")[:, :2], dim=1) - body_vel = torch.linalg.norm(asset.data.root_lin_vel_b[:, :2], dim=1) - reward = torch.linalg.norm((asset.data.joint_pos - asset.data.default_joint_pos), dim=1) + body_vel = torch.linalg.norm(asset.data.root_lin_vel_b.torch[:, :2], dim=1) + reward = torch.linalg.norm((asset.data.joint_pos.torch - asset.data.default_joint_pos.torch), dim=1) return torch.where( torch.logical_or(distance > 0.4, body_vel > velocity_threshold), reward, stand_still_scale * reward ) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/stepping_beams_env.py b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/stepping_beams_env.py index 306faa3d..ccade4b5 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/stepping_beams_env.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/stepping_beams_env.py @@ -7,7 +7,7 @@ from isaaclab.managers import EventTermCfg as EventTerm from isaaclab.managers import RewardTermCfg as RewTerm from isaaclab.utils import configclass -from isaaclab.utils.noise import AdditiveUniformNoiseCfg as Unoise +from isaaclab.utils.noise import UniformNoiseCfg as Unoise import uwlab_tasks.manager_based.locomotion.risky_terrains.mdp as mdp diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/stepping_stones_env.py b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/stepping_stones_env.py index 55afb52a..a7f41976 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/stepping_stones_env.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/risky_terrains/stepping_stones_env.py @@ -20,7 +20,8 @@ from isaaclab.terrains import TerrainImporterCfg from isaaclab.utils import configclass from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR, ISAACLAB_NUCLEUS_DIR -from isaaclab.utils.noise import AdditiveUniformNoiseCfg as Unoise +from isaaclab.utils.noise import UniformNoiseCfg as Unoise +from isaaclab_physx.physics import PhysxCfg import uwlab_tasks.manager_based.locomotion.risky_terrains.mdp as mdp @@ -336,10 +337,12 @@ def __post_init__(self): self.sim.render_interval = self.decimation self.sim.disable_contact_processing = True self.sim.physics_material = self.scene.terrain.physics_material - self.sim.physx.gpu_total_aggregate_pairs_capacity = 2**24 - self.sim.physx.gpu_found_lost_pairs_capacity = 2**24 - self.sim.physx.gpu_collision_stack_size = 2**27 - self.sim.physx.gpu_max_rigid_patch_count = 6 * 2**15 + if self.sim.physics is None: + self.sim.physics = PhysxCfg() + self.sim.physics.gpu_total_aggregate_pairs_capacity = 2**24 + self.sim.physics.gpu_found_lost_pairs_capacity = 2**24 + self.sim.physics.gpu_collision_stack_size = 2**27 + self.sim.physics.gpu_max_rigid_patch_count = 6 * 2**15 self.viewer.resolution = (1920, 1080) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot/flat_env_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot/flat_env_cfg.py index eefaa1f1..b302d080 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot/flat_env_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot/flat_env_cfg.py @@ -16,7 +16,7 @@ from isaaclab.terrains import TerrainImporterCfg from isaaclab.utils import configclass from isaaclab.utils.assets import ISAACLAB_NUCLEUS_DIR -from isaaclab.utils.noise import AdditiveUniformNoiseCfg as Unoise +from isaaclab.utils.noise import UniformNoiseCfg as Unoise from isaaclab_tasks.manager_based.locomotion.velocity.velocity_env_cfg import LocomotionVelocityRoughEnvCfg ## diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot/rough_env_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot/rough_env_cfg.py index 1eeac6cb..8be52f86 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot/rough_env_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot/rough_env_cfg.py @@ -12,7 +12,7 @@ from isaaclab.managers import RewardTermCfg, SceneEntityCfg from isaaclab.managers import TerminationTermCfg as DoneTerm from isaaclab.utils import configclass -from isaaclab.utils.noise import AdditiveUniformNoiseCfg as Unoise +from isaaclab.utils.noise import UniformNoiseCfg as Unoise from isaaclab_tasks.manager_based.locomotion.velocity.velocity_env_cfg import LocomotionVelocityRoughEnvCfg ## diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot_with_arm/flat_env_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot_with_arm/flat_env_cfg.py index 3a8de5c5..a230c38a 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot_with_arm/flat_env_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot_with_arm/flat_env_cfg.py @@ -16,7 +16,7 @@ from isaaclab.terrains import TerrainImporterCfg from isaaclab.utils import configclass from isaaclab.utils.assets import ISAACLAB_NUCLEUS_DIR -from isaaclab.utils.noise import AdditiveUniformNoiseCfg as Unoise +from isaaclab.utils.noise import UniformNoiseCfg as Unoise from isaaclab_tasks.manager_based.locomotion.velocity.velocity_env_cfg import LocomotionVelocityRoughEnvCfg from uwlab.envs.mdp import DefaultJointPositionStaticActionCfg diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot_with_arm/rough_env_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot_with_arm/rough_env_cfg.py index 5a92ae5f..fadf78f6 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot_with_arm/rough_env_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/spot_with_arm/rough_env_cfg.py @@ -12,7 +12,7 @@ from isaaclab.managers import RewardTermCfg, SceneEntityCfg from isaaclab.managers import TerminationTermCfg as DoneTerm from isaaclab.utils import configclass -from isaaclab.utils.noise import AdditiveUniformNoiseCfg as Unoise +from isaaclab.utils.noise import UniformNoiseCfg as Unoise from isaaclab_tasks.manager_based.locomotion.velocity.velocity_env_cfg import LocomotionVelocityRoughEnvCfg from uwlab.envs.mdp import DefaultJointPositionStaticActionCfg diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/mdp/curriculums.py b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/mdp/curriculums.py index 3bb0d1d5..171201b7 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/mdp/curriculums.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/mdp/curriculums.py @@ -43,7 +43,7 @@ def terrain_levels_vel( terrain: TerrainImporter = env.scene.terrain command = env.command_manager.get_command("base_velocity") # compute the distance the robot walked - distance = torch.norm(asset.data.root_pos_w[env_ids, :2] - env.scene.env_origins[env_ids, :2], dim=1) + distance = torch.norm(asset.data.root_pos_w.torch[env_ids, :2] - env.scene.env_origins[env_ids, :2], dim=1) # robots that walked far enough progress to harder terrains move_up = distance > terrain.cfg.terrain_generator.size[0] / 2 # robots that walked less than half of their required distance go to simpler terrains diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/mdp/rewards.py b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/mdp/rewards.py index 4baa9347..0fc64e73 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/mdp/rewards.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/mdp/rewards.py @@ -31,7 +31,7 @@ def feet_air_time( contact_sensor: ContactSensor = env.scene.sensors[sensor_cfg.name] # compute the reward first_contact = contact_sensor.compute_first_contact(env.step_dt)[:, sensor_cfg.body_ids] - last_air_time = contact_sensor.data.last_air_time[:, sensor_cfg.body_ids] + last_air_time = contact_sensor.data.last_air_time.torch[:, sensor_cfg.body_ids] reward = torch.sum((last_air_time - threshold) * first_contact, dim=1) # no reward for zero command reward *= torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) > 0.1 @@ -48,8 +48,8 @@ def feet_air_time_positive_biped(env, command_name: str, threshold: float, senso """ contact_sensor: ContactSensor = env.scene.sensors[sensor_cfg.name] # compute the reward - air_time = contact_sensor.data.current_air_time[:, sensor_cfg.body_ids] - contact_time = contact_sensor.data.current_contact_time[:, sensor_cfg.body_ids] + air_time = contact_sensor.data.current_air_time.torch[:, sensor_cfg.body_ids] + contact_time = contact_sensor.data.current_contact_time.torch[:, sensor_cfg.body_ids] in_contact = contact_time > 0.0 in_mode_time = torch.where(in_contact, contact_time, air_time) single_stance = torch.sum(in_contact.int(), dim=1) == 1 @@ -63,9 +63,11 @@ def feet_air_time_positive_biped(env, command_name: str, threshold: float, senso def feet_slide(env, sensor_cfg: SceneEntityCfg, asset_cfg: SceneEntityCfg = SceneEntityCfg("robot")) -> torch.Tensor: # Penalize feet sliding contact_sensor: ContactSensor = env.scene.sensors[sensor_cfg.name] - contacts = contact_sensor.data.net_forces_w_history[:, :, sensor_cfg.body_ids, :].norm(dim=-1).max(dim=1)[0] > 1.0 + contacts = ( + contact_sensor.data.net_forces_w_history.torch[:, :, sensor_cfg.body_ids, :].norm(dim=-1).max(dim=1)[0] > 1.0 + ) asset = env.scene[asset_cfg.name] - body_vel = asset.data.body_lin_vel_w[:, asset_cfg.body_ids, :2] + body_vel = asset.data.body_lin_vel_w.torch[:, asset_cfg.body_ids, :2] reward = torch.sum(body_vel.norm(dim=-1) * contacts, dim=1) return reward @@ -76,7 +78,7 @@ def track_lin_vel_xy_yaw_frame_exp( """Reward tracking of linear velocity commands (xy axes) in the gravity aligned robot frame using exponential kernel.""" # extract the used quantities (to enable type-hinting) asset = env.scene[asset_cfg.name] - vel_yaw = quat_apply_inverse(yaw_quat(asset.data.root_quat_w), asset.data.root_lin_vel_w[:, :3]) + vel_yaw = quat_apply_inverse(yaw_quat(asset.data.root_quat_w.torch), asset.data.root_lin_vel_w.torch[:, :3]) lin_vel_error = torch.sum( torch.square(env.command_manager.get_command(command_name)[:, :2] - vel_yaw[:, :2]), dim=1 ) @@ -89,5 +91,7 @@ def track_ang_vel_z_world_exp( """Reward tracking of angular velocity commands (yaw) in world frame using exponential kernel.""" # extract the used quantities (to enable type-hinting) asset = env.scene[asset_cfg.name] - ang_vel_error = torch.square(env.command_manager.get_command(command_name)[:, 2] - asset.data.root_ang_vel_w[:, 2]) + ang_vel_error = torch.square( + env.command_manager.get_command(command_name)[:, 2] - asset.data.root_ang_vel_w.torch[:, 2] + ) return torch.exp(-ang_vel_error / std**2) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/velocity_env_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/velocity_env_cfg.py index dda7d399..48d5e246 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/velocity_env_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/velocity_env_cfg.py @@ -22,7 +22,8 @@ from isaaclab.terrains import TerrainImporterCfg from isaaclab.utils import configclass from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR, ISAACLAB_NUCLEUS_DIR -from isaaclab.utils.noise import AdditiveUniformNoiseCfg as Unoise +from isaaclab.utils.noise import UniformNoiseCfg as Unoise +from isaaclab_physx.physics import PhysxCfg from uwlab.terrains.config.rough import ROUGH_TERRAINS_CFG # isort: skip @@ -294,8 +295,10 @@ def __post_init__(self): self.sim.render_interval = self.decimation self.sim.disable_contact_processing = True self.sim.physics_material = self.scene.terrain.physics_material - self.sim.physx.gpu_total_aggregate_pairs_capacity = 2**24 - self.sim.physx.gpu_found_lost_pairs_capacity = 2**24 + if self.sim.physics is None: + self.sim.physics = PhysxCfg() + self.sim.physics.gpu_total_aggregate_pairs_capacity = 2**24 + self.sim.physics.gpu_found_lost_pairs_capacity = 2**24 self.viewer.eye = (0.0, 0.0, 80) self.viewer.resolution = (1920, 1080) # update sensor update periods diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/assembly_keypoints.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/assembly_keypoints.py index a3cd5030..78890647 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/assembly_keypoints.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/assembly_keypoints.py @@ -18,17 +18,17 @@ @configclass class Offset: pos: tuple[float, float, float] = (0.0, 0.0, 0.0) - quat: tuple[float, float, float, float] = (1.0, 0.0, 0.0, 0.0) + quat: tuple[float, float, float, float] = (0.0, 0.0, 0.0, 1.0) @property def pose(self) -> tuple[float, float, float, float, float, float, float]: return self.pos + self.quat def apply(self, root: RigidObject | Articulation) -> tuple[torch.Tensor, torch.Tensor]: - data = root.data.root_pos_w + data = root.data.root_pos_w.torch pos_w, quat_w = math_utils.combine_frame_transforms( - root.data.root_pos_w, - root.data.root_quat_w, + root.data.root_pos_w.torch, + root.data.root_quat_w.torch, torch.tensor(self.pos).to(data.device).repeat(data.shape[0], 1), torch.tensor(self.quat).to(data.device).repeat(data.shape[0], 1), ) @@ -49,10 +49,10 @@ def combine(self, pos: torch.Tensor, quat: torch.Tensor) -> tuple[torch.Tensor, class KeyPointsNistBoard: bolt_m16: Offset = Offset(pos=(0.145, -0.1495, -0.01)) hole_8mm: Offset = Offset(pos=(-0.0895, 0.0, 0.01)) - gear_base: Offset = Offset(pos=(0.145, 0.021, 0.0092), quat=(0.70711, 0.0, 0.0, -0.70711)) - small_gear: Offset = Offset(pos=(0.145, 0.021, 0.0092), quat=(0.70711, 0.0, 0.0, -0.70711)) - medium_gear: Offset = Offset(pos=(0.145, 0.021, 0.0092), quat=(0.70711, 0.0, 0.0, -0.70711)) - large_gear: Offset = Offset(pos=(0.145, 0.021, 0.0092), quat=(0.70711, 0.0, 0.0, -0.70711)) + gear_base: Offset = Offset(pos=(0.145, 0.021, 0.0092), quat=(0.0, 0.0, -0.70711, 0.70711)) + small_gear: Offset = Offset(pos=(0.145, 0.021, 0.0092), quat=(0.0, 0.0, -0.70711, 0.70711)) + medium_gear: Offset = Offset(pos=(0.145, 0.021, 0.0092), quat=(0.0, 0.0, -0.70711, 0.70711)) + large_gear: Offset = Offset(pos=(0.145, 0.021, 0.0092), quat=(0.0, 0.0, -0.70711, 0.70711)) @configclass @@ -67,7 +67,7 @@ class KeyPointsNutM16: center_axis_bottom: Offset = Offset(pos=(0.0, 0.0, 0.01)) center_axis_middle: Offset = Offset(pos=(0.0, 0.0, 0.0165)) center_axis_top: Offset = Offset(pos=(0.0, 0.0, 0.023)) - grasp_point: Offset = Offset(pos=(0.0, 0.0, 0.01), quat=(0.70711, 0.0, 0.0, -0.70711)) + grasp_point: Offset = Offset(pos=(0.0, 0.0, 0.01), quat=(0.0, 0.0, -0.70711, 0.70711)) grasp_diameter: float = 0.024 @@ -93,7 +93,7 @@ class KeyPointsSmallGear: class KeyPointsMediumGear: center_axis_bottom: Offset = Offset(pos=(0.02025, 0.0, 0.005)) center_axis_top: Offset = Offset(pos=(0.02025, 0.0, 0.03)) - grasp_point: Offset = Offset(pos=(0.02025, 0.0, 0.022), quat=(0.70711, 0.0, 0.0, -0.70711)) + grasp_point: Offset = Offset(pos=(0.02025, 0.0, 0.022), quat=(0.0, 0.0, -0.70711, 0.70711)) grasp_diameter: float = 0.03 @@ -122,7 +122,7 @@ class KeyPointsPeg8MM: @configclass class KeyPointPandaHand: - object_grasped_point: Offset = Offset(pos=(0.0, 0.0, 0.107), quat=(0.0, 0.0, 1.0, 0.0)) + object_grasped_point: Offset = Offset(pos=(0.0, 0.0, 0.107), quat=(0.0, 1.0, 0.0, 0.0)) KEYPOINTS_NISTBOARD = KeyPointsNistBoard() diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/factory_assets_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/factory_assets_cfg.py index 66d9fd8f..c0346743 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/factory_assets_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/factory_assets_cfg.py @@ -63,7 +63,7 @@ "panda_finger_joint2": 0.04, }, pos=(0.0, 0.0, 0.0), - rot=(1.0, 0.0, 0.0, 0.0), + rot=(0.0, 0.0, 0.0, 1.0), ), # Stiffness and dampness of the panda arm parts # will be set @@ -106,7 +106,7 @@ usd_path=f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Mounts/UWPatVention/pat_vention.usd", rigid_props=sim_utils.RigidBodyPropertiesCfg(kinematic_enabled=True), ), - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, 0.0, -0.868), rot=(0.70711, 0.0, 0.0, -0.70711)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, 0.0, -0.868), rot=(0.0, 0.0, -0.70711, 0.70711)), ) # NIST Board @@ -145,7 +145,7 @@ collision_props=sim_utils.CollisionPropertiesCfg(contact_offset=0.005, rest_offset=0.0), ), init_state=ArticulationCfg.InitialStateCfg( - pos=(0.55, 0.0, 0.05), rot=(1.0, 0.0, 0.0, 0.0), joint_pos={}, joint_vel={} + pos=(0.55, 0.0, 0.05), rot=(0.0, 0.0, 0.0, 1.0), joint_pos={}, joint_vel={} ), actuators={}, ) @@ -171,7 +171,7 @@ collision_props=sim_utils.CollisionPropertiesCfg(contact_offset=0.005, rest_offset=0.0), ), init_state=ArticulationCfg.InitialStateCfg( - pos=(0.4, 0.3, 0.0), rot=(1.0, 0.0, 0.0, 0.0), joint_pos={}, joint_vel={} + pos=(0.4, 0.3, 0.0), rot=(0.0, 0.0, 0.0, 1.0), joint_pos={}, joint_vel={} ), actuators={}, ) @@ -198,7 +198,7 @@ collision_props=sim_utils.CollisionPropertiesCfg(contact_offset=0.005, rest_offset=0.0), ), init_state=ArticulationCfg.InitialStateCfg( - pos=(0.6, 0.0, 0.05), rot=(1.0, 0.0, 0.0, 0.0), joint_pos={}, joint_vel={} + pos=(0.6, 0.0, 0.05), rot=(0.0, 0.0, 0.0, 1.0), joint_pos={}, joint_vel={} ), actuators={}, ) @@ -225,7 +225,7 @@ collision_props=sim_utils.CollisionPropertiesCfg(contact_offset=0.005, rest_offset=0.0), ), init_state=ArticulationCfg.InitialStateCfg( - pos=(0.4, 0.35, 0.0), rot=(1.0, 0.0, 0.0, 0.0), joint_pos={}, joint_vel={} + pos=(0.4, 0.35, 0.0), rot=(0.0, 0.0, 0.0, 1.0), joint_pos={}, joint_vel={} ), actuators={}, ) @@ -251,7 +251,7 @@ collision_props=sim_utils.CollisionPropertiesCfg(contact_offset=0.005, rest_offset=0.0), ), init_state=ArticulationCfg.InitialStateCfg( - pos=(0.0, 0.4, 0.1), rot=(1.0, 0.0, 0.0, 0.0), joint_pos={}, joint_vel={} + pos=(0.0, 0.4, 0.1), rot=(0.0, 0.0, 0.0, 1.0), joint_pos={}, joint_vel={} ), actuators={}, ) @@ -278,7 +278,7 @@ collision_props=sim_utils.CollisionPropertiesCfg(contact_offset=0.005, rest_offset=0.0), ), init_state=ArticulationCfg.InitialStateCfg( - pos=(0.0, 0.45, 0.1), rot=(1.0, 0.0, 0.0, 0.0), joint_pos={}, joint_vel={} + pos=(0.0, 0.45, 0.1), rot=(0.0, 0.0, 0.0, 1.0), joint_pos={}, joint_vel={} ), actuators={}, ) @@ -305,7 +305,7 @@ collision_props=sim_utils.CollisionPropertiesCfg(contact_offset=0.005, rest_offset=0.0), ), init_state=ArticulationCfg.InitialStateCfg( - pos=(0.65, 0.0, 0.05), rot=(1.0, 0.0, 0.0, 0.0), joint_pos={}, joint_vel={} + pos=(0.65, 0.0, 0.05), rot=(0.0, 0.0, 0.0, 1.0), joint_pos={}, joint_vel={} ), actuators={}, ) @@ -332,7 +332,7 @@ collision_props=sim_utils.CollisionPropertiesCfg(contact_offset=0.005, rest_offset=0.0), ), init_state=ArticulationCfg.InitialStateCfg( - pos=(0.4, 0.40, 0.0), rot=(1.0, 0.0, 0.0, 0.0), joint_pos={}, joint_vel={} + pos=(0.4, 0.40, 0.0), rot=(0.0, 0.0, 0.0, 1.0), joint_pos={}, joint_vel={} ), actuators={}, ) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/factory_env_base.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/factory_env_base.py index 4c3ebc0d..d3be029a 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/factory_env_base.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/factory_env_base.py @@ -15,6 +15,7 @@ from isaaclab.managers import TerminationTermCfg as DoneTerm from isaaclab.scene import InteractiveSceneCfg from isaaclab.utils import configclass +from isaaclab_physx.physics import PhysxCfg import uwlab_tasks.manager_based.manipulation.factory_extension.mdp as mdp @@ -304,16 +305,18 @@ def __post_init__(self) -> None: self.sim.dt = 1 / 120 self.sim.render_interval = self.decimation - self.sim.physx.solver_type = 1 - self.sim.physx.max_position_iteration_count = 192 # Important to avoid interpenetration. - self.sim.physx.max_velocity_iteration_count = 1 - self.sim.physx.bounce_threshold_velocity = 0.2 - self.sim.physx.friction_offset_threshold = 0.01 - self.sim.physx.friction_correlation_distance = 0.00625 - self.sim.physx.gpu_max_rigid_contact_count = 2**23 - self.sim.physx.gpu_max_rigid_patch_count = 2**23 - self.sim.physx.gpu_collision_stack_size = 2**31 - self.sim.physx.gpu_max_num_partitions = 1 + if self.sim.physics is None: + self.sim.physics = PhysxCfg() + self.sim.physics.solver_type = 1 + self.sim.physics.max_position_iteration_count = 192 # Important to avoid interpenetration. + self.sim.physics.max_velocity_iteration_count = 1 + self.sim.physics.bounce_threshold_velocity = 0.2 + self.sim.physics.friction_offset_threshold = 0.01 + self.sim.physics.friction_correlation_distance = 0.00625 + self.sim.physics.gpu_max_rigid_contact_count = 2**23 + self.sim.physics.gpu_max_rigid_patch_count = 2**23 + self.sim.physics.gpu_collision_stack_size = 2**31 + self.sim.physics.gpu_max_num_partitions = 1 self.sim.physics_material.static_friction = 1.0 self.sim.physics_material.dynamic_friction = 1.0 diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/actions/task_space_actions_nist.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/actions/task_space_actions_nist.py index 990d1799..0295c0bc 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/actions/task_space_actions_nist.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/actions/task_space_actions_nist.py @@ -140,7 +140,7 @@ def processed_actions(self) -> torch.Tensor: @property def jacobian_w(self) -> torch.Tensor: - return self._asset.root_physx_view.get_jacobians()[:, self._jacobi_body_idx, :, self._jacobi_joint_ids] + return self._asset.data.body_link_jacobian_w.torch[:, self._jacobi_body_idx, :, self._jacobi_joint_ids] @property def jacobian_b(self) -> torch.Tensor: @@ -200,8 +200,8 @@ def process_actions(self, actions: torch.Tensor): # set some useful reference to environment assets states fixed_asset: Articulation = self._env.scene["fixed_asset"] - fixed_pos = fixed_asset.data.root_link_pos_w - self._env.scene.env_origins - fixed_quat = fixed_asset.data.root_link_quat_w + fixed_pos = fixed_asset.data.root_link_pos_w.torch - self._env.scene.env_origins + fixed_quat = fixed_asset.data.root_link_quat_w.torch fixed_tip_pos_local = torch.zeros_like(fixed_pos) # here we want to be able to get the @@ -313,7 +313,7 @@ def _apply_task_space_gains(): # # adapted from https://gitlab-master.nvidia.com/carbon-gym/carbgym/-/blob/b4bbc66f4e31b1a1bee61dbaafc0766bbfbf0f58/python/examples/franka_cube_ik_osc.py#L70-78 # # roboticsproceedings.org/rss07/p31.pdf - arm_mass_matrix = self._asset.root_physx_view.get_generalized_mass_matrices()[:, 0:7, 0:7] + arm_mass_matrix = self._asset.data.mass_matrix.torch[:, 0:7, 0:7] # useful tensors arm_mass_matrix_inv = torch.inverse(arm_mass_matrix) arm_mass_matrix_task = torch.inverse( @@ -357,8 +357,8 @@ def reset(self, env_ids: Sequence[int] | None = None) -> None: # Custom part from NIST assembly - reset fixed_asset: Articulation = self._env.scene["fixed_asset"] robot: Articulation = self._env.scene["robot"] - fixed_pos = fixed_asset.data.root_link_pos_w - self._env.scene.env_origins - fixed_quat = fixed_asset.data.root_link_quat_w + fixed_pos = fixed_asset.data.root_link_pos_w.torch - self._env.scene.env_origins + fixed_quat = fixed_asset.data.root_link_quat_w.torch fixed_tip_pos_local = torch.zeros_like(fixed_pos) fixed_tip_pos_local[:, 2] += self.cfg.fixed_asset_cfg.height + self.cfg.fixed_asset_cfg.base_height @@ -369,9 +369,9 @@ def reset(self, env_ids: Sequence[int] | None = None) -> None: fixed_asset_pos_noise = fixed_asset_pos_noise @ torch.diag(fixed_asset_pos_rand) self.init_fixed_pos_obs_noise = fixed_asset_pos_noise fixed_pos_action_frame = fixed_tip_pos + self.init_fixed_pos_obs_noise - fingertip_midpoint_quat = robot.data.body_link_quat_w[:, self._body_idx] + fingertip_midpoint_quat = robot.data.body_link_quat_w.torch[:, self._body_idx] - fingertip_midpoint_pos = robot.data.body_link_pos_w[:, self._body_idx] - self._env.scene.env_origins + fingertip_midpoint_pos = robot.data.body_link_pos_w.torch[:, self._body_idx] - self._env.scene.env_origins pos_actions = fingertip_midpoint_pos - fixed_pos_action_frame pos_action_bounds = torch.tensor(CtrlCfg.pos_action_bounds, device=self.device) @@ -398,7 +398,7 @@ def reset(self, env_ids: Sequence[int] | None = None) -> None: yaw_action = (fingertip_yaw_fixed_asset + np.deg2rad(180.0)) / np.deg2rad(270.0) * 2.0 - 1.0 self._raw_actions[:, 5] = yaw_action - self._target_joint_pos_at_reset = robot.data.joint_pos_target.clone() + self._target_joint_pos_at_reset = robot.data.joint_pos_target.torch.clone() """ Helper functions. diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/events.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/events.py index e08a4fad..3f3353ca 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/events.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/events.py @@ -38,7 +38,7 @@ def reset_fixed_assets(env: ManagerBasedRLEnv, env_ids: torch.tensor, asset_list asset_on_board_pos, asset_on_board_quat = asset_offset_on_nist_board.apply(nistboard) root_pose = torch.cat((asset_on_board_pos, asset_on_board_quat), dim=1)[env_ids] asset.write_root_pose_to_sim(root_pose, env_ids=env_ids) - asset.write_root_velocity_to_sim(torch.zeros_like(asset.data.root_vel_w[env_ids]), env_ids=env_ids) + asset.write_root_velocity_to_sim(torch.zeros_like(asset.data.root_vel_w.torch[env_ids]), env_ids=env_ids) def reset_held_asset( @@ -52,8 +52,8 @@ def reset_held_asset( robot: Articulation = env.scene[holding_body_cfg.name] held_asset: Articulation = env.scene[held_asset_cfg.name] - end_effector_quat_w = robot.data.body_link_quat_w[env_ids, holding_body_cfg.body_ids].view(-1, 4) - end_effector_pos_w = robot.data.body_link_pos_w[env_ids, holding_body_cfg.body_ids].view(-1, 3) + end_effector_quat_w = robot.data.body_link_quat_w.torch[env_ids, holding_body_cfg.body_ids].view(-1, 4) + end_effector_pos_w = robot.data.body_link_pos_w.torch[env_ids, holding_body_cfg.body_ids].view(-1, 3) held_graspable_pos_b = torch.tensor(held_asset_graspable_offset.pos, device=env.device).repeat(len(env_ids), 1) held_graspable_quat_b = torch.tensor(held_asset_graspable_offset.quat, device=env.device).repeat(len(env_ids), 1) @@ -74,7 +74,7 @@ def reset_held_asset( new_quat_w = math_utils.quat_mul(translated_held_asset_quat, quat_b) held_asset.write_root_link_pose_to_sim(torch.cat([new_pos_w, new_quat_w], dim=1), env_ids=env_ids) # type: ignore - held_asset.write_root_com_velocity_to_sim(held_asset.data.default_root_state[env_ids, 7:], env_ids=env_ids) # type: ignore + held_asset.write_root_com_velocity_to_sim(held_asset.data.default_root_state.torch[env_ids, 7:], env_ids=env_ids) # type: ignore def grasp_held_asset( @@ -84,7 +84,7 @@ def grasp_held_asset( held_asset_diameter: float, ) -> None: robot: Articulation = env.scene[robot_cfg.name] - joint_pos = robot.data.joint_pos[:, robot_cfg.joint_ids][env_ids].clone() + joint_pos = robot.data.joint_pos.torch[:, robot_cfg.joint_ids][env_ids].clone() joint_pos[:, :] = held_asset_diameter / 2 * 1.25 robot.write_joint_state_to_sim(joint_pos, torch.zeros_like(joint_pos), robot_cfg.joint_ids, env_ids) # type: ignore diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/observations.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/observations.py index 97742bd9..9a0af8fd 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/observations.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/observations.py @@ -31,10 +31,10 @@ def target_asset_pose_in_root_asset_frame( taget_body_idx = 0 if isinstance(target_asset_cfg.body_ids, slice) else target_asset_cfg.body_ids root_body_idx = 0 if isinstance(root_asset_cfg.body_ids, slice) else root_asset_cfg.body_ids - target_pos = target_asset.data.body_link_pos_w[:, taget_body_idx].view(-1, 3) - target_quat = target_asset.data.body_link_quat_w[:, taget_body_idx].view(-1, 4) - root_pos = root_asset.data.body_link_pos_w[:, root_body_idx].view(-1, 3) - root_quat = root_asset.data.body_link_quat_w[:, root_body_idx].view(-1, 4) + target_pos = target_asset.data.body_link_pos_w.torch[:, taget_body_idx].view(-1, 3) + target_quat = target_asset.data.body_link_quat_w.torch[:, taget_body_idx].view(-1, 4) + root_pos = root_asset.data.body_link_pos_w.torch[:, root_body_idx].view(-1, 3) + root_quat = root_asset.data.body_link_quat_w.torch[:, root_body_idx].view(-1, 4) if root_asset_offset is not None: root_pos, root_quat = root_asset_offset.combine(root_pos, root_quat) @@ -56,14 +56,14 @@ def asset_link_velocity_in_root_asset_frame( target_body_idx = 0 if isinstance(target_asset_cfg.body_ids, slice) else target_asset_cfg.body_ids asset_lin_vel_b, _ = math_utils.subtract_frame_transforms( - root_asset.data.root_pos_w, - root_asset.data.root_quat_w, - target_asset.data.body_lin_vel_w[:, target_body_idx].view(-1, 3), + root_asset.data.root_pos_w.torch, + root_asset.data.root_quat_w.torch, + target_asset.data.body_lin_vel_w.torch[:, target_body_idx].view(-1, 3), ) asset_ang_vel_b, _ = math_utils.subtract_frame_transforms( - root_asset.data.root_pos_w, - root_asset.data.root_quat_w, - target_asset.data.body_ang_vel_w[:, target_body_idx].view(-1, 3), + root_asset.data.root_pos_w.torch, + root_asset.data.root_quat_w.torch, + target_asset.data.body_ang_vel_w.torch[:, target_body_idx].view(-1, 3), ) return torch.cat([asset_lin_vel_b, asset_ang_vel_b], dim=1) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/assembly_keypoints.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/assembly_keypoints.py index d8c5e509..74fb352c 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/assembly_keypoints.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/assembly_keypoints.py @@ -18,17 +18,17 @@ @configclass class Offset: pos: tuple[float, float, float] = (0.0, 0.0, 0.0) - quat: tuple[float, float, float, float] = (1.0, 0.0, 0.0, 0.0) + quat: tuple[float, float, float, float] = (0.0, 0.0, 0.0, 1.0) @property def pose(self) -> tuple[float, float, float, float, float, float, float]: return self.pos + self.quat def apply(self, root: RigidObject | Articulation) -> tuple[torch.Tensor, torch.Tensor]: - data = root.data.root_pos_w + data = root.data.root_pos_w.torch pos_w, quat_w = math_utils.combine_frame_transforms( - root.data.root_pos_w, - root.data.root_quat_w, + data, + root.data.root_quat_w.torch, torch.tensor(self.pos).to(data.device).repeat(data.shape[0], 1), torch.tensor(self.quat).to(data.device).repeat(data.shape[0], 1), ) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/agents/rsl_rl_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/agents/rsl_rl_cfg.py index 8f6db98e..72e99406 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/agents/rsl_rl_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/agents/rsl_rl_cfg.py @@ -4,13 +4,14 @@ # SPDX-License-Identifier: BSD-3-Clause from isaaclab.utils import configclass -from isaaclab_rl.rsl_rl import RslRlOnPolicyRunnerCfg, RslRlPpoAlgorithmCfg +from isaaclab_rl.rsl_rl import RslRlMLPModelCfg, RslRlOnPolicyRunnerCfg from uwlab_rl.rsl_rl.rl_cfg import ( BehaviorCloningCfg, + GsdeDistributionCfg, OffPolicyAlgorithmCfg, - RslRlFancyActorCriticCfg, RslRlFancyPpoAlgorithmCfg, + RslRlGsdePpoAlgorithmCfg, ) @@ -26,17 +27,27 @@ class Base_PPORunnerCfg(RslRlOnPolicyRunnerCfg): save_interval = 100 resume = False experiment_name = "ur5e_robotiq_2f85_omnireset_agent" - policy = RslRlFancyActorCriticCfg( - init_noise_std=1.0, - actor_obs_normalization=True, - critic_obs_normalization=True, - actor_hidden_dims=[512, 256, 128, 64], - critic_hidden_dims=[512, 256, 128, 64], + # Explicit `actor`/`critic` model cfgs rather than the legacy `policy` cfg: gSDE is a + # distribution class, and the legacy path only forwards `std_type` ("scalar"/"log"). + actor = RslRlMLPModelCfg( + hidden_dims=[512, 256, 128, 64], activation="elu", - noise_std_type="gsde", + obs_normalization=True, + stochastic=True, + init_noise_std=1.0, state_dependent_std=False, + # learn_features=True keeps the gradient path from the state-dependent std into the + # backbone, as in the rsl-rl 3.x recipe. With it detached (rsl_rl default) the + # adaptive-KL schedule floors the LR at iteration 0 and the std runs away. + distribution_cfg=GsdeDistributionCfg(init_std=1.0, learn_features=True), + ) + critic = RslRlMLPModelCfg( + hidden_dims=[512, 256, 128, 64], + activation="elu", + obs_normalization=True, + stochastic=False, ) - algorithm = RslRlPpoAlgorithmCfg( + algorithm = RslRlGsdePpoAlgorithmCfg( value_loss_coef=1.0, use_clipped_value_loss=True, normalize_advantage_per_mini_batch=False, @@ -50,6 +61,11 @@ class Base_PPORunnerCfg(RslRlOnPolicyRunnerCfg): lam=0.95, desired_kl=0.01, max_grad_norm=1.0, + # rsl-rl 5.x gSDE holds the exploration matrix fixed for a whole rollout by default + # (time-correlated noise). The recipe this task was tuned with (rsl-rl 3.x) drew fresh + # noise every step; insertion relies on that dither to discover contacts, so resample + # every step. Mean, std, log-prob and entropy are unaffected -- only the sample is. + sde_sample_freq=1, ) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/camera_align_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/camera_align_cfg.py index 6167c7b4..71cceb22 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/camera_align_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/camera_align_cfg.py @@ -58,7 +58,7 @@ class CameraAlignSceneCfg(RlStateSceneCfg): # --- Background curtains (match real workspace) --- curtain_left = RigidObjectCfg( prim_path="{ENV_REGEX_NS}/CurtainLeft", - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, -0.68, 0.519), rot=(0.707, 0.0, 0.0, -0.707)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, -0.68, 0.519), rot=(0.0, 0.0, -0.707, 0.707)), spawn=sim_utils.CuboidCfg( size=(0.01, 1.0, 1.125), rigid_props=sim_utils.RigidBodyPropertiesCfg(kinematic_enabled=True), @@ -68,7 +68,7 @@ class CameraAlignSceneCfg(RlStateSceneCfg): ) curtain_back = RigidObjectCfg( prim_path="{ENV_REGEX_NS}/CurtainBack", - init_state=RigidObjectCfg.InitialStateCfg(pos=(-0.15, 0.0, 0.519), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(-0.15, 0.0, 0.519), rot=(0.0, 0.0, 0.0, 1.0)), spawn=sim_utils.CuboidCfg( size=(0.01, 1.3, 1.125), rigid_props=sim_utils.RigidBodyPropertiesCfg(kinematic_enabled=True), @@ -78,7 +78,7 @@ class CameraAlignSceneCfg(RlStateSceneCfg): ) curtain_right = RigidObjectCfg( prim_path="{ENV_REGEX_NS}/CurtainRight", - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, 0.68, 0.519), rot=(0.707, 0.0, 0.0, -0.707)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, 0.68, 0.519), rot=(0.0, 0.0, -0.707, 0.707)), spawn=sim_utils.CuboidCfg( size=(0.01, 1.0, 1.125), rigid_props=sim_utils.RigidBodyPropertiesCfg(kinematic_enabled=True), @@ -95,7 +95,7 @@ class CameraAlignSceneCfg(RlStateSceneCfg): width=640, offset=TiledCameraCfg.OffsetCfg( pos=(1.0770121, -0.1679045, 0.4486344), - rot=(0.70564552, 0.46613815, 0.25072644, 0.47107948), + rot=(0.46613815, 0.25072644, 0.47107948, 0.70564552), convention="opengl", ), data_types=["rgb"], @@ -109,7 +109,7 @@ class CameraAlignSceneCfg(RlStateSceneCfg): width=640, offset=TiledCameraCfg.OffsetCfg( pos=(0.8323904, 0.5877843, 0.2805111), - rot=(0.29008842, 0.22122445, 0.51336143, 0.77676798), + rot=(0.22122445, 0.51336143, 0.77676798, 0.29008842), convention="opengl", ), data_types=["rgb"], @@ -123,7 +123,7 @@ class CameraAlignSceneCfg(RlStateSceneCfg): width=640, offset=TiledCameraCfg.OffsetCfg( pos=(0.0182505, -0.00408447, -0.0689107), - rot=(0.34254336, -0.61819255, -0.6160212, 0.347879), + rot=(-0.61819255, -0.6160212, 0.347879, 0.34254336), convention="opengl", ), data_types=["rgb"], diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/data_collection_rgb_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/data_collection_rgb_cfg.py index a5e06b11..1f9f41b3 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/data_collection_rgb_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/data_collection_rgb_cfg.py @@ -15,7 +15,7 @@ from isaaclab.managers import ObservationTermCfg as ObsTerm from isaaclab.managers import SceneEntityCfg from isaaclab.managers import TerminationTermCfg as DoneTerm -from isaaclab.sensors import TiledCameraCfg +from isaaclab.sensors import JointWrenchSensorCfg, TiledCameraCfg from isaaclab.utils import configclass from uwlab_assets import UWLAB_CLOUD_ASSETS_DIR @@ -27,10 +27,14 @@ @configclass class DataCollectionRGBObjectSceneCfg(RlStateSceneCfg): + # Incoming joint wrenches (binary_force_contact observation); Isaac Lab 3.0 moved these + # from ArticulationData to a sensor. + joint_wrench = JointWrenchSensorCfg(prim_path="{ENV_REGEX_NS}/Robot") + # background curtain_left = RigidObjectCfg( prim_path="{ENV_REGEX_NS}/CurtainLeft", - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, -0.68, 0.519), rot=(0.707, 0.0, 0.0, -0.707)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, -0.68, 0.519), rot=(0.0, 0.0, -0.707, 0.707)), spawn=sim_utils.CuboidCfg( size=(0.01, 1.0, 1.125), rigid_props=sim_utils.RigidBodyPropertiesCfg(kinematic_enabled=True), @@ -43,7 +47,7 @@ class DataCollectionRGBObjectSceneCfg(RlStateSceneCfg): curtain_back = RigidObjectCfg( prim_path="{ENV_REGEX_NS}/CurtainBack", - init_state=RigidObjectCfg.InitialStateCfg(pos=(-0.15, 0.0, 0.519), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(-0.15, 0.0, 0.519), rot=(0.0, 0.0, 0.0, 1.0)), spawn=sim_utils.CuboidCfg( size=(0.01, 1.3, 1.125), rigid_props=sim_utils.RigidBodyPropertiesCfg(kinematic_enabled=True), @@ -56,7 +60,7 @@ class DataCollectionRGBObjectSceneCfg(RlStateSceneCfg): curtain_right = RigidObjectCfg( prim_path="{ENV_REGEX_NS}/CurtainRight", - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, 0.68, 0.519), rot=(0.707, 0.0, 0.0, -0.707)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, 0.68, 0.519), rot=(0.0, 0.0, -0.707, 0.707)), spawn=sim_utils.CuboidCfg( size=(0.01, 1.0, 1.125), rigid_props=sim_utils.RigidBodyPropertiesCfg(kinematic_enabled=True), @@ -74,7 +78,7 @@ class DataCollectionRGBObjectSceneCfg(RlStateSceneCfg): width=320, offset=TiledCameraCfg.OffsetCfg( pos=(1.0770121, -0.1679045, 0.4486344), - rot=(0.70564552, 0.46613815, 0.25072644, 0.47107948), + rot=(0.46613815, 0.25072644, 0.47107948, 0.70564552), convention="opengl", ), data_types=["rgb"], @@ -88,7 +92,7 @@ class DataCollectionRGBObjectSceneCfg(RlStateSceneCfg): width=320, offset=TiledCameraCfg.OffsetCfg( pos=(0.8323904, 0.5877843, 0.2805111), - rot=(0.29008842, 0.22122445, 0.51336143, 0.77676798), + rot=(0.22122445, 0.51336143, 0.77676798, 0.29008842), convention="opengl", ), data_types=["rgb"], @@ -102,7 +106,7 @@ class DataCollectionRGBObjectSceneCfg(RlStateSceneCfg): width=320, offset=TiledCameraCfg.OffsetCfg( pos=(0.0182505, -0.00408447, -0.0689107), - rot=(0.34254336, -0.61819255, -0.6160212, 0.347879), + rot=(-0.61819255, -0.6160212, 0.347879, 0.34254336), convention="opengl", ), data_types=["rgb"], @@ -122,7 +126,7 @@ class BaseRGBEventCfg(FinetuneEvalEventCfg): "camera_path_template": "/World/envs/env_{}/Robot/rgb_front_camera", # Base values from TiledCameraCfg "base_position": (1.0770121, -0.1679045, 0.4486344), - "base_rotation": (0.70564552, 0.46613815, 0.25072644, 0.47107948), + "base_rotation": (0.46613815, 0.25072644, 0.47107948, 0.70564552), # Delta ranges for position (in meters) "position_deltas": {"x": (-0.05, 0.05), "y": (-0.05, 0.05), "z": (-0.05, 0.05)}, # Delta ranges for euler angles (in degrees) @@ -146,7 +150,7 @@ class BaseRGBEventCfg(FinetuneEvalEventCfg): "camera_path_template": "/World/envs/env_{}/Robot/rgb_side_camera", # Base values from TiledCameraCfg "base_position": (0.8323904, 0.5877843, 0.2805111), - "base_rotation": (0.29008842, 0.22122445, 0.51336143, 0.77676798), + "base_rotation": (0.22122445, 0.51336143, 0.77676798, 0.29008842), # Delta ranges for position (in meters) "position_deltas": {"x": (-0.05, 0.05), "y": (-0.05, 0.05), "z": (-0.05, 0.05)}, # Delta ranges for euler angles (in degrees) @@ -167,7 +171,7 @@ class BaseRGBEventCfg(FinetuneEvalEventCfg): "camera_path_template": "/World/envs/env_{}/Robot/robotiq_base_link/rgb_wrist_camera", # Base values from TiledCameraCfg "base_position": (0.0182505, -0.00408447, -0.0689107), - "base_rotation": (0.34254336, -0.61819255, -0.6160212, 0.347879), + "base_rotation": (-0.61819255, -0.6160212, 0.347879, 0.34254336), # Delta ranges for position (in meters) "position_deltas": {"x": (-0.01, 0.01), "y": (-0.01, 0.01), "z": (-0.01, 0.01)}, # Delta ranges for euler angles (in degrees) @@ -358,7 +362,7 @@ class RGBEventCfg(BaseRGBEventCfg): func=task_mdp.MultiResetManager, mode="reset", params={ - "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset", + "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset_isaaclab3", "reset_types": ["ObjectAnywhereEEAnywhere"], "probs": [1.0], "success": "env.reward_manager.get_term_cfg('progress_context').func.success", @@ -374,7 +378,7 @@ class DataCollectionRGBEventCfg(RGBEventCfg): func=task_mdp.MultiResetManager, mode="reset", params={ - "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset", + "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset_isaaclab3", "reset_types": [ "ObjectAnywhereEEAnywhere", "ObjectRestingEEGrasped", @@ -540,7 +544,7 @@ class RGBDataCollectionCfg(ObsGroup): binary_contact = ObsTerm( func=task_mdp.binary_force_contact, params={ - "asset_cfg": SceneEntityCfg("robot"), + "sensor_cfg": SceneEntityCfg("joint_wrench"), "body_name": "wrist_3_link", "force_threshold": 25.0, }, @@ -790,7 +794,7 @@ class OODRGBEventCfg(BaseRGBEventCfg): func=task_mdp.MultiResetManager, mode="reset", params={ - "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset", + "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset_isaaclab3", "reset_types": ["ObjectAnywhereEEAnywhere"], "probs": [1.0], "success": "env.reward_manager.get_term_cfg('progress_context').func.success", @@ -806,7 +810,7 @@ class DataCollectionOODRGBEventCfg(OODRGBEventCfg): func=task_mdp.MultiResetManager, mode="reset", params={ - "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset", + "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset_isaaclab3", "reset_types": [ "ObjectAnywhereEEAnywhere", "ObjectRestingEEGrasped", 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 f7b112b5..c0fd89ad 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 @@ -16,6 +16,7 @@ from isaaclab.scene import InteractiveSceneCfg from isaaclab.utils import configclass from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +from isaaclab_physx.physics import PhysxCfg import uwlab_assets.robots.ur5e_robotiq_gripper as ur5e_robotiq_gripper from uwlab_assets import UWLAB_CLOUD_ASSETS_DIR @@ -42,7 +43,7 @@ class GraspSamplingSceneCfg(InteractiveSceneCfg): # assume very light mass_props=sim_utils.MassPropertiesCfg(mass=0.001), ), - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, OBJECT_SPAWN_HEIGHT), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, OBJECT_SPAWN_HEIGHT), rot=(0.0, 0.0, 0.0, 1.0)), ) # Environment @@ -163,7 +164,7 @@ def make_object(usd_path: str): ), mass_props=sim_utils.MassPropertiesCfg(mass=0.001), ), - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 1.0), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 1.0), rot=(0.0, 0.0, 0.0, 1.0)), ) @@ -198,20 +199,21 @@ def __post_init__(self): # simulation settings self.sim.dt = 1 / 120.0 - # Contact and solver settings - self.sim.physx.solver_type = 1 - self.sim.physx.max_position_iteration_count = 192 - self.sim.physx.max_velocity_iteration_count = 1 - self.sim.physx.bounce_threshold_velocity = 0.02 - self.sim.physx.friction_offset_threshold = 0.01 - self.sim.physx.friction_correlation_distance = 0.0005 - - self.sim.physx.gpu_found_lost_aggregate_pairs_capacity = 1024 * 1024 * 4 - self.sim.physx.gpu_total_aggregate_pairs_capacity = 2**23 - self.sim.physx.gpu_max_rigid_contact_count = 2**23 - self.sim.physx.gpu_max_rigid_patch_count = 2**23 - self.sim.physx.gpu_collision_stack_size = 2**31 - + # Contact and solver settings, tuned for contact-rich peg insertion (note the + # 192 position iterations); these values back the sim-to-real transfer. + self.sim.physics = PhysxCfg( + solver_type=1, + max_position_iteration_count=192, + max_velocity_iteration_count=1, + bounce_threshold_velocity=0.02, + friction_offset_threshold=0.01, + friction_correlation_distance=0.0005, + gpu_found_lost_aggregate_pairs_capacity=1024 * 1024 * 4, + gpu_total_aggregate_pairs_capacity=2**23, + gpu_max_rigid_contact_count=2**23, + gpu_max_rigid_patch_count=2**23, + gpu_collision_stack_size=2**31, + ) # Render settings self.sim.render.enable_dlssg = True self.sim.render.enable_ambient_occlusion = True 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 b94ee380..676a82a0 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 @@ -15,6 +15,7 @@ from isaaclab.scene import InteractiveSceneCfg from isaaclab.utils import configclass from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +from isaaclab_physx.physics import PhysxCfg from uwlab_assets import UWLAB_CLOUD_ASSETS_DIR @@ -41,7 +42,7 @@ class PartialAssembliesSceneCfg(InteractiveSceneCfg): # assume very light mass_props=sim_utils.MassPropertiesCfg(mass=0.001), ), - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, OBJECT_SPAWN_HEIGHT * 2), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, OBJECT_SPAWN_HEIGHT * 2), rot=(0.0, 0.0, 0.0, 1.0)), ) receptive_object: RigidObjectCfg = RigidObjectCfg( @@ -58,7 +59,7 @@ class PartialAssembliesSceneCfg(InteractiveSceneCfg): # since kinematic_enabled=True, mass does not matter mass_props=sim_utils.MassPropertiesCfg(mass=0.5), ), - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, OBJECT_SPAWN_HEIGHT), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, OBJECT_SPAWN_HEIGHT), rot=(0.0, 0.0, 0.0, 1.0)), ) # Environment @@ -203,7 +204,7 @@ def make_insertive_object(usd_path: str): ), mass_props=sim_utils.MassPropertiesCfg(mass=0.001), ), - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, OBJECT_SPAWN_HEIGHT * 2), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, OBJECT_SPAWN_HEIGHT * 2), rot=(0.0, 0.0, 0.0, 1.0)), ) @@ -221,7 +222,7 @@ def make_receptive_object(usd_path: str): ), mass_props=sim_utils.MassPropertiesCfg(mass=0.5), ), - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, OBJECT_SPAWN_HEIGHT), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, OBJECT_SPAWN_HEIGHT), rot=(0.0, 0.0, 0.0, 1.0)), ) @@ -268,20 +269,21 @@ def __post_init__(self): # simulation settings self.sim.dt = 1 / 120.0 - # Contact and solver settings - self.sim.physx.solver_type = 1 - self.sim.physx.max_position_iteration_count = 192 - self.sim.physx.max_velocity_iteration_count = 1 - self.sim.physx.bounce_threshold_velocity = 0.02 - self.sim.physx.friction_offset_threshold = 0.01 - self.sim.physx.friction_correlation_distance = 0.0005 - - self.sim.physx.gpu_found_lost_aggregate_pairs_capacity = 1024 * 1024 * 4 - self.sim.physx.gpu_total_aggregate_pairs_capacity = 2**23 - self.sim.physx.gpu_max_rigid_contact_count = 2**23 - self.sim.physx.gpu_max_rigid_patch_count = 2**23 - self.sim.physx.gpu_collision_stack_size = 2**31 - + # Contact and solver settings, tuned for contact-rich peg insertion (note the + # 192 position iterations); these values back the sim-to-real transfer. + self.sim.physics = PhysxCfg( + solver_type=1, + max_position_iteration_count=192, + max_velocity_iteration_count=1, + bounce_threshold_velocity=0.02, + friction_offset_threshold=0.01, + friction_correlation_distance=0.0005, + gpu_found_lost_aggregate_pairs_capacity=1024 * 1024 * 4, + gpu_total_aggregate_pairs_capacity=2**23, + gpu_max_rigid_contact_count=2**23, + gpu_max_rigid_patch_count=2**23, + gpu_collision_stack_size=2**31, + ) # Render settings self.sim.render.enable_dlssg = True self.sim.render.enable_ambient_occlusion = True 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 85a042d2..9c74f6ac 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 @@ -17,6 +17,7 @@ from isaaclab.scene import InteractiveSceneCfg from isaaclab.utils import configclass from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +from isaaclab_physx.physics import PhysxCfg from uwlab_assets import UWLAB_CLOUD_ASSETS_DIR from uwlab_assets.robots.ur5e_robotiq_gripper import IMPLICIT_UR5E_ROBOTIQ_2F85 @@ -48,7 +49,7 @@ class ResetStatesSceneCfg(InteractiveSceneCfg): # assume very light mass_props=sim_utils.MassPropertiesCfg(mass=0.001), ), - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(0.0, 0.0, 0.0, 1.0)), ) receptive_object: RigidObjectCfg = RigidObjectCfg( @@ -66,13 +67,13 @@ class ResetStatesSceneCfg(InteractiveSceneCfg): # since kinematic_enabled=True, mass does not matter mass_props=sim_utils.MassPropertiesCfg(mass=0.5), ), - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(0.0, 0.0, 0.0, 1.0)), ) # Environment table = RigidObjectCfg( prim_path="{ENV_REGEX_NS}/Table", - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, 0.0, -0.881), rot=(0.707, 0.0, 0.0, -0.707)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, 0.0, -0.881), rot=(0.0, 0.0, -0.707, 0.707)), spawn=sim_utils.UsdFileCfg( usd_path=f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Mounts/UWPatVention/pat_vention.usd", rigid_props=sim_utils.RigidBodyPropertiesCfg(kinematic_enabled=True), @@ -81,7 +82,7 @@ class ResetStatesSceneCfg(InteractiveSceneCfg): ur5_metal_support = RigidObjectCfg( prim_path="{ENV_REGEX_NS}/UR5MetalSupport", - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0, -0.013), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0, -0.013), rot=(0.0, 0.0, 0.0, 1.0)), spawn=sim_utils.UsdFileCfg( usd_path=f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Mounts/UWPatVention2/Ur5MetalSupport/ur5plate.usd", rigid_props=sim_utils.RigidBodyPropertiesCfg(kinematic_enabled=True), @@ -236,7 +237,7 @@ class ObjectRestingEEGraspedEventCfg(ResetStatesBaseEventCfg): func=task_mdp.MultiResetManager, mode="reset", params={ - "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset", + "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset_isaaclab3", "reset_types": ["ObjectAnywhereEEAnywhere"], "probs": [1.0], }, @@ -246,7 +247,7 @@ class ObjectRestingEEGraspedEventCfg(ResetStatesBaseEventCfg): func=task_mdp.reset_end_effector_from_grasp_dataset, mode="reset", params={ - "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset", + "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset_isaaclab3", "fixed_asset_cfg": SceneEntityCfg("insertive_object"), "robot_ik_cfg": SceneEntityCfg( "robot", joint_names=["shoulder.*", "elbow.*", "wrist.*"], body_names="robotiq_base_link" @@ -289,7 +290,7 @@ class ObjectAnywhereEEGraspedEventCfg(ResetStatesBaseEventCfg): func=task_mdp.reset_end_effector_from_grasp_dataset, mode="reset", params={ - "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset", + "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset_isaaclab3", "fixed_asset_cfg": SceneEntityCfg("insertive_object"), "robot_ik_cfg": SceneEntityCfg( "robot", joint_names=["shoulder.*", "elbow.*", "wrist.*"], body_names="robotiq_base_link" @@ -313,7 +314,7 @@ class ObjectPartiallyAssembledEEAnywhereEventCfg(ResetStatesBaseEventCfg): func=task_mdp.reset_insertive_object_from_partial_assembly_dataset, mode="reset", params={ - "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset", + "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset_isaaclab3", "insertive_object_cfg": SceneEntityCfg("insertive_object"), "receptive_object_cfg": SceneEntityCfg("receptive_object"), "pose_range_b": { @@ -354,7 +355,7 @@ class ObjectPartiallyAssembledEEGraspedEventCfg(ResetStatesBaseEventCfg): func=task_mdp.reset_insertive_object_from_partial_assembly_dataset, mode="reset", params={ - "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset", + "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset_isaaclab3", "insertive_object_cfg": SceneEntityCfg("insertive_object"), "receptive_object_cfg": SceneEntityCfg("receptive_object"), "pose_range_b": { @@ -372,7 +373,7 @@ class ObjectPartiallyAssembledEEGraspedEventCfg(ResetStatesBaseEventCfg): func=task_mdp.reset_end_effector_from_grasp_dataset, mode="reset", params={ - "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset", + "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset_isaaclab3", "fixed_asset_cfg": SceneEntityCfg("insertive_object"), "robot_ik_cfg": SceneEntityCfg( "robot", joint_names=["shoulder.*", "elbow.*", "wrist.*"], body_names="robotiq_base_link" @@ -464,7 +465,7 @@ def make_insertive_object(usd_path: str): ), mass_props=sim_utils.MassPropertiesCfg(mass=0.001), ), - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(0.0, 0.0, 0.0, 1.0)), ) @@ -482,7 +483,7 @@ def make_receptive_object(usd_path: str): ), mass_props=sim_utils.MassPropertiesCfg(mass=0.5), ), - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(0.0, 0.0, 0.0, 1.0)), ) @@ -529,20 +530,21 @@ def __post_init__(self): # simulation settings self.sim.dt = 1 / 120.0 - # Contact and solver settings - self.sim.physx.solver_type = 1 - self.sim.physx.max_position_iteration_count = 192 - self.sim.physx.max_velocity_iteration_count = 1 - self.sim.physx.bounce_threshold_velocity = 0.02 - self.sim.physx.friction_offset_threshold = 0.01 - self.sim.physx.friction_correlation_distance = 0.0005 - - self.sim.physx.gpu_found_lost_aggregate_pairs_capacity = 1024 * 1024 * 4 - self.sim.physx.gpu_total_aggregate_pairs_capacity = 2**23 - self.sim.physx.gpu_max_rigid_contact_count = 2**23 - self.sim.physx.gpu_max_rigid_patch_count = 2**23 - self.sim.physx.gpu_collision_stack_size = 2**31 - + # Contact and solver settings, tuned for contact-rich peg insertion (note the + # 192 position iterations); these values back the sim-to-real transfer. + self.sim.physics = PhysxCfg( + solver_type=1, + max_position_iteration_count=192, + max_velocity_iteration_count=1, + bounce_threshold_velocity=0.02, + friction_offset_threshold=0.01, + friction_correlation_distance=0.0005, + gpu_found_lost_aggregate_pairs_capacity=1024 * 1024 * 4, + gpu_total_aggregate_pairs_capacity=2**23, + gpu_max_rigid_contact_count=2**23, + gpu_max_rigid_patch_count=2**23, + gpu_collision_stack_size=2**31, + ) # Render settings self.sim.render.enable_dlssg = True self.sim.render.enable_ambient_occlusion = True 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 e35809cb..bd893357 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 @@ -20,6 +20,7 @@ from isaaclab.scene import InteractiveSceneCfg from isaaclab.utils import configclass from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +from isaaclab_physx.physics import PhysxCfg from uwlab_assets import UWLAB_CLOUD_ASSETS_DIR from uwlab_assets.robots.ur5e_robotiq_gripper import EXPLICIT_UR5E_ROBOTIQ_2F85, IMPLICIT_UR5E_ROBOTIQ_2F85 @@ -51,7 +52,7 @@ class RlStateSceneCfg(InteractiveSceneCfg): ), mass_props=sim_utils.MassPropertiesCfg(mass=0.02), ), - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(0.0, 0.0, 0.0, 1.0)), ) receptive_object: RigidObjectCfg = RigidObjectCfg( @@ -67,13 +68,13 @@ class RlStateSceneCfg(InteractiveSceneCfg): ), mass_props=sim_utils.MassPropertiesCfg(mass=0.5), ), - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(0.0, 0.0, 0.0, 1.0)), ) # Environment table = RigidObjectCfg( prim_path="{ENV_REGEX_NS}/Table", - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, 0.0, -0.881), rot=(0.707, 0.0, 0.0, -0.707)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, 0.0, -0.881), rot=(0.0, 0.0, -0.707, 0.707)), spawn=sim_utils.UsdFileCfg( usd_path=f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Mounts/UWPatVention/pat_vention.usd", rigid_props=sim_utils.RigidBodyPropertiesCfg(kinematic_enabled=True), @@ -82,7 +83,7 @@ class RlStateSceneCfg(InteractiveSceneCfg): ur5_metal_support = RigidObjectCfg( prim_path="{ENV_REGEX_NS}/UR5MetalSupport", - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0, -0.013), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0, -0.013), rot=(0.0, 0.0, 0.0, 1.0)), spawn=sim_utils.UsdFileCfg( usd_path=f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Mounts/UWPatVention2/Ur5MetalSupport/ur5plate.usd", rigid_props=sim_utils.RigidBodyPropertiesCfg(kinematic_enabled=True), @@ -239,7 +240,7 @@ class TrainEventCfg(BaseEventCfg): func=task_mdp.MultiResetManager, mode="reset", params={ - "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset", + "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset_isaaclab3", "reset_types": [ "ObjectAnywhereEEAnywhere", "ObjectRestingEEGrasped", @@ -260,7 +261,7 @@ class TrainEvalEventCfg(BaseEventCfg): func=task_mdp.MultiResetManager, mode="reset", params={ - "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset", + "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset_isaaclab3", "reset_types": ["ObjectAnywhereEEAnywhere"], "probs": [1.0], "success": "env.reward_manager.get_term_cfg('progress_context').func.success", @@ -304,7 +305,7 @@ class FinetuneEvalEventCfg(BaseEventCfg): func=task_mdp.MultiResetManager, mode="reset", params={ - "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset", + "dataset_dir": f"{UWLAB_CLOUD_ASSETS_DIR}/Datasets/OmniReset_isaaclab3", "reset_types": ["ObjectAnywhereEEAnywhere"], "probs": [1.0], "success": "env.reward_manager.get_term_cfg('progress_context').func.success", @@ -627,7 +628,7 @@ def make_insertive_object(usd_path: str): ), mass_props=sim_utils.MassPropertiesCfg(mass=0.001), ), - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(0.0, 0.0, 0.0, 1.0)), ) @@ -645,7 +646,7 @@ def make_receptive_object(usd_path: str): ), mass_props=sim_utils.MassPropertiesCfg(mass=0.5), ), - init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(1.0, 0.0, 0.0, 0.0)), + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.0), rot=(0.0, 0.0, 0.0, 1.0)), ) @@ -692,19 +693,22 @@ def __post_init__(self): # simulation settings self.sim.dt = 1 / 120.0 - # Contact and solver settings - self.sim.physx.solver_type = 1 - self.sim.physx.max_position_iteration_count = 192 - self.sim.physx.max_velocity_iteration_count = 1 - self.sim.physx.bounce_threshold_velocity = 0.02 - self.sim.physx.friction_offset_threshold = 0.01 - self.sim.physx.friction_correlation_distance = 0.0005 - - self.sim.physx.gpu_found_lost_aggregate_pairs_capacity = 1024 * 1024 * 4 - self.sim.physx.gpu_total_aggregate_pairs_capacity = 2**23 - self.sim.physx.gpu_max_rigid_contact_count = 2**23 - self.sim.physx.gpu_max_rigid_patch_count = 2**23 - self.sim.physx.gpu_collision_stack_size = 2**31 + # Contact and solver settings, tuned for contact-rich peg insertion (note the 192 + # position iterations); these are what the sim-to-real transfer was validated + # against, so do not retune them casually. + self.sim.physics = PhysxCfg( + solver_type=1, + max_position_iteration_count=192, + max_velocity_iteration_count=1, + bounce_threshold_velocity=0.02, + friction_offset_threshold=0.01, + friction_correlation_distance=0.0005, + gpu_found_lost_aggregate_pairs_capacity=1024 * 1024 * 4, + gpu_total_aggregate_pairs_capacity=2**23, + gpu_max_rigid_contact_count=2**23, + gpu_max_rigid_patch_count=2**23, + gpu_collision_stack_size=2**31, + ) # Render settings self.sim.render.enable_dlssg = True diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/actions/actions_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/actions/actions_cfg.py index 5a1de1c8..53e5d723 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/actions/actions_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/actions/actions_cfg.py @@ -34,8 +34,8 @@ class OffsetCfg: pos: tuple[float, float, float] = (0.0, 0.0, 0.0) """Translation offset.""" - rot: tuple[float, float, float, float] = (1.0, 0.0, 0.0, 0.0) - """Rotation offset as quaternion (w, x, y, z).""" + rot: tuple[float, float, float, float] = (0.0, 0.0, 0.0, 1.0) + """Rotation offset as quaternion (x, y, z, w).""" joint_names: list[str] = MISSING """Joint names for the arm (regex supported).""" diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/actions/task_space_actions.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/actions/task_space_actions.py index 857610bb..607eccce 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/actions/task_space_actions.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/actions/task_space_actions.py @@ -132,7 +132,7 @@ def process_actions(self, actions: torch.Tensor): axis = delta_rot / safe_angle axis = torch.where(angle > 1e-6, axis, torch.zeros_like(axis)) half = angle / 2.0 - delta_quat = torch.cat([torch.cos(half), axis * torch.sin(half)], dim=-1) + delta_quat = torch.cat([axis * torch.sin(half), torch.cos(half)], dim=-1) self._ee_quat_des[:] = math_utils.quat_mul(delta_quat, ee_quat_b) def apply_actions(self): @@ -142,8 +142,8 @@ def apply_actions(self): """ # Current state ee_pos_b, ee_quat_b = self._get_ee_pose_root_frame() - joint_pos = self._asset.data.joint_pos[:, self._joint_ids] - joint_vel = self._asset.data.joint_vel[:, self._joint_ids] + joint_pos = self._asset.data.joint_pos.torch[:, self._joint_ids] + joint_vel = self._asset.data.joint_vel.torch[:, self._joint_ids] # Analytical Jacobian (base_link frame, matching EE pose frame) jacobian = compute_jacobian_analytical(joint_pos, device=str(self.device)) @@ -180,11 +180,11 @@ def reset(self, env_ids: Sequence[int] | None = None) -> None: def _get_ee_pose_root_frame(self) -> tuple[torch.Tensor, torch.Tensor]: """Get EE pose in root (base_link) frame from sim state.""" - ee_pos_w = self._asset.data.body_pos_w[:, self._ee_body_idx] - ee_quat_w = self._asset.data.body_quat_w[:, self._ee_body_idx] + ee_pos_w = self._asset.data.body_pos_w.torch[:, self._ee_body_idx] + ee_quat_w = self._asset.data.body_quat_w.torch[:, self._ee_body_idx] ee_pos_b, ee_quat_b = math_utils.subtract_frame_transforms( - self._asset.data.root_pos_w, - self._asset.data.root_quat_w, + self._asset.data.root_pos_w.torch, + self._asset.data.root_quat_w.torch, ee_pos_w, ee_quat_w, ) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/collision_analyzer.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/collision_analyzer.py index 10a89e73..a0e0b115 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/collision_analyzer.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/collision_analyzer.py @@ -116,12 +116,12 @@ def __init__(self, cfg: CollisionAnalyzerCfg, env: ManagerBasedRLEnv): def __call__(self, env: ManagerBasedRLEnv, env_ids: torch.Tensor): pos_w = ( - self.asset.data.body_link_pos_w[env_ids][:, self.body_ids] + self.asset.data.body_link_pos_w.torch[env_ids][:, self.body_ids] .unsqueeze(2) .expand(-1, -1, self.cfg.num_points, 3) ) quat_w = ( - self.asset.data.body_link_quat_w[env_ids][:, self.body_ids] + self.asset.data.body_link_quat_w.torch[env_ids][:, self.body_ids] .unsqueeze(2) .expand(-1, -1, self.cfg.num_points, 4) ) @@ -129,14 +129,16 @@ def __call__(self, env: ManagerBasedRLEnv, env_ids: torch.Tensor): obstacles_pos_w = torch.cat( [ - obstacle.data.root_pos_w[env_ids].view(-1, 1, 1, 3).expand(-1, -1, self.cfg.num_points, 3) + obstacle.data.root_pos_w.torch[env_ids].view(-1, 1, 1, 3).expand(-1, -1, self.cfg.num_points, 3) for obstacle in self.obstacles ], dim=0, ) obstacles_quat_w = torch.cat( [ - obstacle.data.root_quat_w[env_ids].view(-1, 1, 1, 4).expand(-1, cloud.shape[1], self.cfg.num_points, 4) + obstacle.data.root_quat_w.torch[env_ids] + .view(-1, 1, 1, 4) + .expand(-1, cloud.shape[1], self.cfg.num_points, 4) for obstacle in self.obstacles ], dim=0, diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py index 0769039c..630dd964 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py @@ -326,8 +326,8 @@ def _apply_grasp_transform_to_gripper(self, env, gripper_asset, grasp_transform, """Apply grasp transform to gripper asset.""" # Get object's current pose in world coordinates object_asset = env.scene[self.object_cfg.name] - object_pos = object_asset.data.root_pos_w[env_idx] - object_quat = object_asset.data.root_quat_w[env_idx] + object_pos = object_asset.data.root_pos_w.torch[env_idx] + object_quat = object_asset.data.root_quat_w.torch[env_idx] # Convert numpy transform matrix to torch tensors (object-local coordinates) transform_tensor = torch.tensor(grasp_transform, dtype=torch.float32, device=env.device) @@ -341,20 +341,22 @@ def _apply_grasp_transform_to_gripper(self, env, gripper_asset, grasp_transform, ) # Apply world transform to gripper asset for the specific environment - gripper_asset.data.root_pos_w[env_idx] = world_pos[0] - gripper_asset.data.root_quat_w[env_idx] = world_quat[0] + gripper_asset.data.root_pos_w.torch[env_idx] = world_pos[0] + gripper_asset.data.root_quat_w.torch[env_idx] = world_quat[0] # Write the new pose to simulation indices = torch.tensor([env_idx], device=env.device) - root_pose = torch.cat([gripper_asset.data.root_pos_w[indices], gripper_asset.data.root_quat_w[indices]], dim=-1) + root_pose = torch.cat( + [gripper_asset.data.root_pos_w.torch[indices], gripper_asset.data.root_quat_w.torch[indices]], dim=-1 + ) gripper_asset.write_root_pose_to_sim(root_pose, env_ids=indices) def _apply_grasp_transforms_vectorized(self, env, gripper_asset, grasp_transforms, env_ids): """Apply grasp transforms to gripper assets for multiple environments (vectorized).""" # Get object's current pose in world coordinates for all environments object_asset = env.scene[self.object_cfg.name] - object_pos = object_asset.data.root_pos_w[env_ids] - object_quat = object_asset.data.root_quat_w[env_ids] + object_pos = object_asset.data.root_pos_w.torch[env_ids] + object_quat = object_asset.data.root_quat_w.torch[env_ids] # Extract positions and quaternions from transform matrices (already tensors) local_positions = grasp_transforms[:, :3, 3] # Extract translation @@ -367,8 +369,8 @@ def _apply_grasp_transforms_vectorized(self, env, gripper_asset, grasp_transform ) # Apply world transforms to gripper assets (vectorized) - gripper_asset.data.root_pos_w[env_ids] = world_positions - gripper_asset.data.root_quat_w[env_ids] = world_quaternions + gripper_asset.data.root_pos_w.torch[env_ids] = world_positions + gripper_asset.data.root_quat_w.torch[env_ids] = world_quaternions # Write the new poses to simulation (single vectorized call) root_poses = torch.cat([world_positions, world_quaternions], dim=-1) @@ -383,8 +385,8 @@ def _visualize_grasp_poses(self, env, scale: float = 0.03): object_asset = env.scene[self.object_cfg.name] # Get object's current pose in world coordinates - object_pos = object_asset.data.root_pos_w[0] # Use first environment - object_quat = object_asset.data.root_quat_w[0] # Use first environment + object_pos = object_asset.data.root_pos_w.torch[0] # Use first environment + object_quat = object_asset.data.root_quat_w.torch[0] # Use first environment # Convert grasp transforms to poses and transform to world coordinates world_positions = [] @@ -414,7 +416,7 @@ def _visualize_grasp_poses(self, env, scale: float = 0.03): def _open_gripper(self, env, gripper_asset, env_ids): """Open gripper to prepare for grasping.""" # Get current joint positions - current_joint_pos = gripper_asset.data.joint_pos[env_ids].clone() + current_joint_pos = gripper_asset.data.joint_pos.torch[env_ids].clone() # Find joint indices using configurable joint names and positions joint_configs = [] @@ -443,13 +445,13 @@ def _ensure_stable_gripper_state(self, env, gripper_asset, env_ids): gripper_asset.reset(env_ids) # 2. Reset to default root state (position and velocity) - default_root_state = gripper_asset.data.default_root_state[env_ids].clone() + default_root_state = gripper_asset.data.default_root_state.torch[env_ids].clone() default_root_state[:, 0:3] += env.scene.env_origins[env_ids] gripper_asset.write_root_state_to_sim(default_root_state, env_ids=env_ids) # 3. Reset all joints to default positions with zero velocities - default_joint_pos = gripper_asset.data.default_joint_pos[env_ids].clone() - zero_joint_vel = torch.zeros_like(gripper_asset.data.default_joint_vel[env_ids]) + default_joint_pos = gripper_asset.data.default_joint_pos.torch[env_ids].clone() + zero_joint_vel = torch.zeros_like(gripper_asset.data.default_joint_vel.torch[env_ids]) gripper_asset.write_joint_state_to_sim(default_joint_pos, zero_joint_vel, env_ids=env_ids) # 4. Set joint targets to default positions to prevent drift @@ -561,8 +563,8 @@ def __init__(self, cfg: EventTermCfg, env: ManagerBasedEnv): scale=1.0, ) self.solver: DifferentialInverseKinematicsAction = robot_ik_solver_cfg.class_type(robot_ik_solver_cfg, env) # type: ignore - self.reset_velocity = torch.zeros((env.num_envs, self.robot.data.joint_vel.shape[1]), device=env.device) - self.reset_position = torch.zeros((env.num_envs, self.robot.data.joint_pos.shape[1]), device=env.device) + self.reset_velocity = torch.zeros((env.num_envs, self.robot.data.joint_vel.torch.shape[1]), device=env.device) + self.reset_position = torch.zeros((env.num_envs, self.robot.data.joint_pos.torch.shape[1]), device=env.device) def __call__( self, @@ -575,8 +577,8 @@ def __call__( ) -> None: if fixed_asset_offset is None: fixed_tip_pos_w, fixed_tip_quat_w = ( - env.scene[fixed_asset_cfg.name].data.root_pos_w, - env.scene[fixed_asset_cfg.name].data.root_quat_w, + env.scene[fixed_asset_cfg.name].data.root_pos_w.torch, + env.scene[fixed_asset_cfg.name].data.root_quat_w.torch, ) else: fixed_tip_pos_w, fixed_tip_quat_w = self.fixed_asset_offset.apply(self.fixed_asset) @@ -587,16 +589,18 @@ def __call__( pos_w = fixed_tip_pos_w + samples[:, 0:3] quat_w = math_utils.quat_from_euler_xyz(samples[:, 3], samples[:, 4], samples[:, 5]) pos_b, quat_b = math_utils.subtract_frame_transforms( - self.robot.data.root_link_pos_w, self.robot.data.root_link_quat_w, pos_w, quat_w + self.robot.data.root_link_pos_w.torch, self.robot.data.root_link_quat_w.torch, pos_w, quat_w ) self.solver.process_actions(torch.cat([pos_b, quat_b], dim=1)) # Error Rate 75% ^ 10 = 0.05 (final error) for i in range(10): self.solver.apply_actions() - delta_joint_pos = 0.25 * (self.robot.data.joint_pos_target[env_ids] - self.robot.data.joint_pos[env_ids]) + delta_joint_pos = 0.25 * ( + self.robot.data.joint_pos_target[env_ids] - self.robot.data.joint_pos.torch[env_ids] + ) self.robot.write_joint_state_to_sim( - position=(delta_joint_pos + self.robot.data.joint_pos[env_ids])[:, self.joint_ids], + position=(delta_joint_pos + self.robot.data.joint_pos.torch[env_ids])[:, self.joint_ids], velocity=torch.zeros((len(env_ids), self.n_joints), device=env.device), joint_ids=self.joint_ids, env_ids=env_ids, # type: ignore @@ -655,6 +659,7 @@ def _load_and_precompute_grasps(self, env): """Load Torch (.pt) grasp data and convert to optimized tensors.""" local_path = utils.safe_retrieve_file_path(self.grasp_dataset_path) data = torch.load(local_path, map_location="cpu") + _require_isaaclab3_dataset(data, self.grasp_dataset_path) # TorchDatasetFileHandler stores nested dicts; grasp data likely under 'grasp_relative_pose' grasp_group = data.get("grasp_relative_pose", data) @@ -719,8 +724,8 @@ def __call__( ) -> None: """Apply grasp poses to reset end effector.""" # RigidObject asset - object_pos_w = self.fixed_asset.data.root_pos_w[env_ids] - object_quat_w = self.fixed_asset.data.root_quat_w[env_ids] + object_pos_w = self.fixed_asset.data.root_pos_w.torch[env_ids] + object_quat_w = self.fixed_asset.data.root_quat_w.torch[env_ids] # Randomly sample grasp indices for each environment num_envs = len(env_ids) @@ -759,9 +764,11 @@ def __call__( # Solve IK iteratively for better convergence for i in range(25): self.solver.apply_actions() - delta_joint_pos = 0.25 * (self.robot.data.joint_pos_target[env_ids] - self.robot.data.joint_pos[env_ids]) + delta_joint_pos = 0.25 * ( + self.robot.data.joint_pos_target[env_ids] - self.robot.data.joint_pos.torch[env_ids] + ) self.robot.write_joint_state_to_sim( - position=(delta_joint_pos + self.robot.data.joint_pos[env_ids])[:, self.joint_ids], + position=(delta_joint_pos + self.robot.data.joint_pos.torch[env_ids])[:, self.joint_ids], velocity=torch.zeros((len(env_ids), self.n_joints), device=env.device), joint_ids=self.joint_ids, env_ids=env_ids, # type: ignore @@ -813,6 +820,7 @@ def _load_and_precompute_partial_assemblies(self, env): """Load Torch (.pt) partial assembly data and convert to optimized tensors.""" local_path = utils.safe_retrieve_file_path(self.partial_assembly_dataset_path) data = torch.load(local_path, map_location="cpu") + _require_isaaclab3_dataset(data, self.partial_assembly_dataset_path) rel_pos = data.get("relative_position") rel_quat = data.get("relative_orientation") @@ -845,8 +853,8 @@ def __call__( ) -> None: """Reset the insertive object from a partial assembly dataset.""" # Get receptive object pose (world coordinates) - receptive_pos_w = self.receptive_object.data.root_pos_w[env_ids] - receptive_quat_w = self.receptive_object.data.root_quat_w[env_ids] + receptive_pos_w = self.receptive_object.data.root_pos_w.torch[env_ids] + receptive_quat_w = self.receptive_object.data.root_quat_w.torch[env_ids] # Randomly sample partial assembly indices for each environment num_envs = len(env_ids) @@ -906,10 +914,10 @@ def __call__( """Collect pose data from all environments.""" # Get object poses for all environments - receptive_pos = self.receptive_object.data.root_pos_w[env_ids] - receptive_quat = self.receptive_object.data.root_quat_w[env_ids] - insertive_pos = self.insertive_object.data.root_pos_w[env_ids] - insertive_quat = self.insertive_object.data.root_quat_w[env_ids] + receptive_pos = self.receptive_object.data.root_pos_w.torch[env_ids] + receptive_quat = self.receptive_object.data.root_quat_w.torch[env_ids] + insertive_pos = self.insertive_object.data.root_pos_w.torch[env_ids] + insertive_quat = self.insertive_object.data.root_quat_w.torch[env_ids] # Calculate relative transform relative_pos, relative_quat = math_utils.subtract_frame_transforms( @@ -961,8 +969,8 @@ def __call__( """Spawn insertive object at assembled offset position.""" # Get receptive object poses - receptive_pos = self.receptive_object.data.root_pos_w[env_ids] - receptive_quat = self.receptive_object.data.root_quat_w[env_ids] + receptive_pos = self.receptive_object.data.root_pos_w.torch[env_ids] + receptive_quat = self.receptive_object.data.root_quat_w.torch[env_ids] # Apply receptive assembled offset to get target position target_pos, target_quat = self.receptive_assembled_offset.combine(receptive_pos, receptive_quat) @@ -992,6 +1000,21 @@ def __call__( ) +def _require_isaaclab3_dataset(data: dict, dataset_file: str) -> None: + """Refuse datasets that are not stamped with the Isaac Lab 3.0 quaternion convention. + + Datasets recorded under Isaac Lab 2.x hold ``(w, x, y, z)`` quaternions; loading them + silently rotates every reset pose by 180 degrees about X. The converted datasets are published + as ``Datasets/OmniReset_isaaclab3`` on the ``isaaclab3`` branch of the cloud asset repository. + """ + convention = data.pop("quat_convention", None) + if convention != "xyzw": + raise ValueError( + f"{dataset_file} is not an Isaac Lab 3.0 dataset (quat_convention={convention!r}, expected 'xyzw');" + " use Datasets/OmniReset_isaaclab3 from the isaaclab3 cloud asset branch" + ) + + class MultiResetManager(ManagerTermBase): def __init__(self, cfg: EventTermCfg, env: ManagerBasedEnv): super().__init__(cfg, env) @@ -1026,6 +1049,7 @@ def __init__(self, cfg: EventTermCfg, env: ManagerBasedEnv): raise FileNotFoundError(f"Dataset file {dataset_file} could not be accessed or downloaded.") dataset = torch.load(local_file_path) + _require_isaaclab3_dataset(dataset, dataset_file) num_states.append(len(dataset["initial_state"]["articulation"]["robot"]["joint_position"])) init_indices = torch.arange(num_states[-1], device=env.device) self.datasets.append(sample_state_data_set(dataset, init_indices, env.device)) @@ -1243,11 +1267,11 @@ def __init__(self, cfg: EventTermCfg, env: ManagerBasedEnv): torch.tensor(bottom_offset.get("pos"), device=env.device).unsqueeze(0).repeat(env.num_envs, 1) ) assert tuple(bottom_offset.get("quat")) == ( - 1.0, 0.0, 0.0, 0.0, - ), "Bottom offset rotation must be (1.0, 0.0, 0.0, 0.0)" + 1.0, + ), "Bottom offset rotation must be identity" def __call__( self, @@ -1279,14 +1303,14 @@ def __call__( asset: RigidObject | Articulation = env.scene[asset_cfg.name] # Get default root state for this asset - root_states = asset.data.default_root_state[env_ids].clone() + root_states = asset.data.default_root_state.torch[env_ids].clone() # Apply position offset positions = root_states[:, 0:3] + env.scene.env_origins[env_ids] + rand_pose_samples[:, 0:3] if self.offset_asset_cfg: offset_asset: RigidObject | Articulation = env.scene[self.offset_asset_cfg.name] - offset_positions = offset_asset.data.default_root_state[env_ids].clone() + offset_positions = offset_asset.data.default_root_state.torch[env_ids].clone() positions += offset_positions[:, 0:3] if self.use_bottom_offset: @@ -1542,9 +1566,9 @@ def _scale(nominal): dfric_vals = torch.minimum(dratio_vals * sfric_vals, sfric_vals) vfric_vals = _scale(self.viscous_friction) * p - self.robot.write_joint_armature_to_sim(arm_vals, joint_ids=self.joint_ids, env_ids=env_ids) - self.robot.write_joint_friction_coefficient_to_sim( - sfric_vals, + self.robot.write_joint_armature_to_sim_index(armature=arm_vals, joint_ids=self.joint_ids, env_ids=env_ids) + self.robot.write_joint_friction_coefficient_to_sim_index( + joint_friction_coeff=sfric_vals, joint_dynamic_friction_coeff=dfric_vals, joint_viscous_friction_coeff=vfric_vals, joint_ids=self.joint_ids, @@ -1633,10 +1657,12 @@ def _scale(nominal): gripper_actuator = self.robot.actuators[self.actuator_name] gripper_actuator.stiffness[env_ids] = stiff_vals gripper_actuator.damping[env_ids] = damp_vals - self.robot.write_joint_stiffness_to_sim(stiff_vals, joint_ids=self.gripper_joint_ids, env_ids=env_ids) - self.robot.write_joint_damping_to_sim(damp_vals, joint_ids=self.gripper_joint_ids, env_ids=env_ids) - self.robot.write_joint_armature_to_sim(arm_vals, joint_ids=self.gripper_joint_ids, env_ids=env_ids) - self.robot.write_joint_friction_coefficient_to_sim(fric_vals, joint_ids=self.gripper_joint_ids, env_ids=env_ids) + self.robot.write_joint_stiffness_to_sim_index(stiff_vals, joint_ids=self.gripper_joint_ids, env_ids=env_ids) + self.robot.write_joint_damping_to_sim_index(damp_vals, joint_ids=self.gripper_joint_ids, env_ids=env_ids) + self.robot.write_joint_armature_to_sim_index(arm_vals, joint_ids=self.gripper_joint_ids, env_ids=env_ids) + self.robot.write_joint_friction_coefficient_to_sim_index( + fric_vals, joint_ids=self.gripper_joint_ids, env_ids=env_ids + ) class randomize_rel_cartesian_osc_gains(ManagerTermBase): @@ -1933,7 +1959,7 @@ class obs_noise_curriculum(ManagerTermBase): """Curriculum that gradually increases uniform noise on observation terms. Monitors success rate and linearly ramps the half-range on the specified - observation terms' ``AdditiveUniformNoiseCfg`` from ``initial_half_range`` + observation terms' ``UniformNoiseCfg`` from ``initial_half_range`` to ``target_half_range`` as progress goes from 0 to 1. At full progress the noise is U(-target_half_range, +target_half_range). """ @@ -1964,7 +1990,7 @@ def _resolve(self): cfg = name_to_cfg[name] if cfg.noise is None: raise ValueError( - f"Obs term '{name}' has no noise config. Set noise=AdditiveUniformNoiseCfg(n_min=0.0, n_max=0.0)." + f"Obs term '{name}' has no noise config. Set noise=UniformNoiseCfg(n_min=0.0, n_max=0.0)." ) self._obs_term_cfgs.append(cfg) @@ -2047,7 +2073,7 @@ def __init__(self, cfg: EventTermCfg, env: ManagerBasedEnv): """Initialize the randomization term.""" super().__init__(cfg, env) - from isaacsim.core.utils.extensions import enable_extension + from isaacsim.core.experimental.utils.app import enable_extension enable_extension("omni.replicator.core") import omni.replicator.core as rep @@ -2180,6 +2206,11 @@ def __init__(self, cfg: EventTermCfg, env: ManagerBasedEnv): "reflection_roughness_constant": Sdf.ValueTypeNames.Float, "metallic_constant": Sdf.ValueTypeNames.Float, "specular_level": Sdf.ValueTypeNames.Float, + # Isaac Sim 6 material templates do not author these until first use; USD 25.11 + # refuses Set() on an untyped attribute, so create them up front too. + "diffuse_texture": Sdf.ValueTypeNames.Asset, + "diffuse_tint": Sdf.ValueTypeNames.Color3f, + "diffuse_color_constant": Sdf.ValueTypeNames.Color3f, } for shader_prim in self._shader_prims: shader = UsdShade.Shader(shader_prim) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/observations.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/observations.py index 43a64881..fde59232 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/observations.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/observations.py @@ -7,6 +7,7 @@ import torch.nn.functional as F import isaaclab.utils.math as math_utils +import warp as wp from isaaclab.assets import Articulation, RigidObject from isaaclab.envs import ManagerBasedEnv, ManagerBasedRLEnv from isaaclab.managers import ManagerTermBase, ObservationTermCfg, SceneEntityCfg @@ -30,10 +31,10 @@ def target_asset_pose_in_root_asset_frame( target_body_idx = 0 if isinstance(target_asset_cfg.body_ids, slice) else target_asset_cfg.body_ids root_body_idx = 0 if isinstance(root_asset_cfg.body_ids, slice) else root_asset_cfg.body_ids - target_pos = target_asset.data.body_link_pos_w[:, target_body_idx].view(-1, 3) - target_quat = target_asset.data.body_link_quat_w[:, target_body_idx].view(-1, 4) - root_pos = root_asset.data.body_link_pos_w[:, root_body_idx].view(-1, 3) - root_quat = root_asset.data.body_link_quat_w[:, root_body_idx].view(-1, 4) + target_pos = target_asset.data.body_link_pos_w.torch[:, target_body_idx].view(-1, 3) + target_quat = target_asset.data.body_link_quat_w.torch[:, target_body_idx].view(-1, 4) + root_pos = root_asset.data.body_link_pos_w.torch[:, root_body_idx].view(-1, 3) + root_quat = root_asset.data.body_link_quat_w.torch[:, root_body_idx].view(-1, 4) if root_asset_offset is not None: root_pos, root_quat = root_asset_offset.combine(root_pos, root_quat) @@ -102,10 +103,10 @@ def __call__( target_body_idx = 0 if isinstance(self.target_asset_cfg.body_ids, slice) else self.target_asset_cfg.body_ids root_body_idx = 0 if isinstance(self.root_asset_cfg.body_ids, slice) else self.root_asset_cfg.body_ids - target_pos = self.target_asset.data.body_link_pos_w[:, target_body_idx].view(-1, 3) - target_quat = self.target_asset.data.body_link_quat_w[:, target_body_idx].view(-1, 4) - root_pos = self.root_asset.data.body_link_pos_w[:, root_body_idx].view(-1, 3) - root_quat = self.root_asset.data.body_link_quat_w[:, root_body_idx].view(-1, 4) + target_pos = self.target_asset.data.body_link_pos_w.torch[:, target_body_idx].view(-1, 3) + target_quat = self.target_asset.data.body_link_quat_w.torch[:, target_body_idx].view(-1, 4) + root_pos = self.root_asset.data.body_link_pos_w.torch[:, root_body_idx].view(-1, 3) + root_quat = self.root_asset.data.body_link_quat_w.torch[:, root_body_idx].view(-1, 4) if self.root_asset_offset is not None: root_pos, root_quat = self.root_asset_offset.combine(root_pos, root_quat) @@ -133,26 +134,45 @@ def asset_link_velocity_in_root_asset_frame( target_body_idx = 0 if isinstance(target_asset_cfg.body_ids, slice) else target_asset_cfg.body_ids + root_pos_w = root_asset.data.root_pos_w.torch + root_quat_w = root_asset.data.root_quat_w.torch + asset_lin_vel_b, _ = math_utils.subtract_frame_transforms( - root_asset.data.root_pos_w, - root_asset.data.root_quat_w, - target_asset.data.body_lin_vel_w[:, target_body_idx].view(-1, 3), + root_pos_w, + root_quat_w, + target_asset.data.body_lin_vel_w.torch[:, target_body_idx].view(-1, 3), ) asset_ang_vel_b, _ = math_utils.subtract_frame_transforms( - root_asset.data.root_pos_w, - root_asset.data.root_quat_w, - target_asset.data.body_ang_vel_w[:, target_body_idx].view(-1, 3), + root_pos_w, + root_quat_w, + target_asset.data.body_ang_vel_w.torch[:, target_body_idx].view(-1, 3), ) return torch.cat([asset_lin_vel_b, asset_ang_vel_b], dim=1) +def _as_torch(value) -> torch.Tensor: + """Return ``value`` as a torch tensor. + + Isaac Lab 3.0 hands back warp-backed data from both asset ``.data`` properties + (as :class:`ProxyArray`) and physics view accessors (as raw ``wp.array``). + Neither supports torch instance methods such as ``view()`` -- ``wp.array.view()`` + is a dtype reinterpret with a different signature -- so convert explicitly. + """ + if hasattr(value, "torch"): # ProxyArray + return value.torch + if isinstance(value, wp.array): + return wp.to_torch(value) + return value + + def get_material_properties( env: ManagerBasedRLEnv, asset_cfg: SceneEntityCfg, ): + """Per-shape (static friction, dynamic friction, restitution), flattened.""" asset: RigidObject | Articulation = env.scene[asset_cfg.name] - return asset.root_physx_view.get_material_properties().view(env.num_envs, -1) + return _as_torch(asset.root_view.get_material_properties()).view(env.num_envs, -1) def get_mass( @@ -160,7 +180,7 @@ def get_mass( asset_cfg: SceneEntityCfg, ): asset: RigidObject | Articulation = env.scene[asset_cfg.name] - return asset.root_physx_view.get_masses().view(env.num_envs, -1) + return _as_torch(asset.root_view.get_masses()).view(env.num_envs, -1) def get_joint_friction( @@ -168,7 +188,7 @@ def get_joint_friction( asset_cfg: SceneEntityCfg, ): asset: RigidObject | Articulation = env.scene[asset_cfg.name] - return asset.data.joint_friction_coeff.view(env.num_envs, -1) + return asset.data.joint_friction_coeff.torch.view(env.num_envs, -1) def get_joint_armature( @@ -176,7 +196,7 @@ def get_joint_armature( asset_cfg: SceneEntityCfg, ): asset: RigidObject | Articulation = env.scene[asset_cfg.name] - return asset.data.joint_armature.view(env.num_envs, -1) + return asset.data.joint_armature.torch.view(env.num_envs, -1) def get_joint_stiffness( @@ -184,7 +204,7 @@ def get_joint_stiffness( asset_cfg: SceneEntityCfg, ): asset: RigidObject | Articulation = env.scene[asset_cfg.name] - return asset.data.joint_stiffness.view(env.num_envs, -1) + return asset.data.joint_stiffness.torch.view(env.num_envs, -1) def get_joint_damping( @@ -192,7 +212,7 @@ def get_joint_damping( asset_cfg: SceneEntityCfg, ): asset: RigidObject | Articulation = env.scene[asset_cfg.name] - return asset.data.joint_damping.view(env.num_envs, -1) + return asset.data.joint_damping.torch.view(env.num_envs, -1) def time_left(env) -> torch.Tensor: @@ -275,27 +295,26 @@ def process_image( def binary_force_contact( env: ManagerBasedEnv, - asset_cfg: SceneEntityCfg, + sensor_cfg: SceneEntityCfg = SceneEntityCfg("joint_wrench"), body_name: str = "wrist_3_link", force_threshold: float = 25.0, ) -> torch.Tensor: - """Binary contact detection from force norm at a body. + """Binary contact detection from the incoming joint force norm at a body. - Reads body_incoming_joint_wrench_b, computes ||F|| from the force - components (first 3), and returns 1.0 if above threshold, else 0.0. + Reads the force reported by a :class:`~isaaclab.sensors.JointWrenchSensor` on the + robot, computes ||F|| and returns 1.0 if above threshold, else 0.0. Args: env: The environment. - asset_cfg: Scene entity config for the robot articulation. - body_name: Name of the body to read wrench from. + sensor_cfg: Scene entity config for the joint-wrench sensor on the robot. + body_name: Name of the body to read the wrench from. force_threshold: Force norm threshold (N) for contact detection. Returns: Tensor of shape (num_envs, 1): 1.0 if contact, 0.0 otherwise. """ - robot: Articulation = env.scene[asset_cfg.name] - body_idx = robot.body_names.index(body_name) - wrench_b = robot.data.body_incoming_joint_wrench_b[:, body_idx, :] # (N, 6) - force_norm = torch.norm(wrench_b[:, :3], dim=-1) # (N,) + sensor = env.scene.sensors[sensor_cfg.name] + body_idx = sensor.find_bodies(body_name)[0][0] + force_norm = torch.norm(sensor.data.force.torch[:, body_idx], dim=-1) # (N,) contact = (force_norm > force_threshold).float() return contact.unsqueeze(-1) # (N, 1) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/recorders/recorders.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/recorders/recorders.py index 0da795bb..41c27660 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/recorders/recorders.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/recorders/recorders.py @@ -45,9 +45,9 @@ def record_pre_reset(self, env_ids): obj = self._env.scene[self.object_name] # Get object pose (root pose contains position and orientation) - obj_root_state = obj.data.root_state_w[env_ids] # Shape: (num_envs, 13) - pos(3) + quat(4) + vel(6) + obj_root_state = obj.data.root_state_w.torch[env_ids] # (num_envs, 13) - pos(3) + quat(4) + vel(6) obj_pos = obj_root_state[:, :3] # Position - obj_quat = obj_root_state[:, 3:7] # Quaternion (w, x, y, z) + obj_quat = obj_root_state[:, 3:7] # Get gripper body pose from the robot articulation # Find the gripper body index @@ -58,14 +58,14 @@ def record_pre_reset(self, env_ids): break # Get specific body pose - gripper_pos = robot.data.body_state_w[env_ids, gripper_body_idx, :3] - gripper_quat = robot.data.body_state_w[env_ids, gripper_body_idx, 3:7] + gripper_pos = robot.data.body_state_w.torch[env_ids, gripper_body_idx, :3] + gripper_quat = robot.data.body_state_w.torch[env_ids, gripper_body_idx, 3:7] # Calculate relative transform: T_gripper_in_object = T_object^{-1} * T_gripper relative_pos, relative_quat = math_utils.subtract_frame_transforms(obj_pos, obj_quat, gripper_pos, gripper_quat) # Get gripper joint states as dict mapping joint names to positions - gripper_joint_pos = robot.data.joint_pos[env_ids].clone() + gripper_joint_pos = robot.data.joint_pos.torch[env_ids].clone() gripper_joint_dict = {joint_name: gripper_joint_pos[:, i] for i, joint_name in enumerate(robot.joint_names)} # Prepare data to record diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rewards.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rewards.py index 18cfbc2d..7b6a0c6c 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rewards.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rewards.py @@ -59,12 +59,12 @@ def __call__( std: float = 0.1, ) -> torch.Tensor: root_asset_alignment_pos_w, root_asset_alignment_quat_w = self.root_asset_offset.combine( - self.root_asset.data.body_link_pos_w[:, root_asset_cfg.body_ids].view(-1, 3), - self.root_asset.data.body_link_quat_w[:, root_asset_cfg.body_ids].view(-1, 4), + self.root_asset.data.body_link_pos_w.torch[:, root_asset_cfg.body_ids].view(-1, 3), + self.root_asset.data.body_link_quat_w.torch[:, root_asset_cfg.body_ids].view(-1, 4), ) if self.target_asset_offset is None: - target_asset_alignment_pos_w = self.target_asset.data.root_pos_w.view(-1, 3) - target_asset_alignment_quat_w = self.target_asset.data.root_quat_w.view(-1, 4) + target_asset_alignment_pos_w = self.target_asset.data.root_pos_w.torch.view(-1, 3) + target_asset_alignment_quat_w = self.target_asset.data.root_quat_w.torch.view(-1, 4) else: target_asset_alignment_pos_w, target_asset_alignment_quat_w = self.target_asset_offset.apply( self.target_asset diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rigid_object_hasher.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rigid_object_hasher.py index 4f6b16bf..9a4988e8 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rigid_object_hasher.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rigid_object_hasher.py @@ -7,8 +7,7 @@ import numpy as np import torch -import isaacsim.core.utils.prims as prim_utils -import isaacsim.core.utils.stage as stage_utils +import isaaclab.sim.utils.stage as stage_utils import warp as wp from isaaclab.sim import get_all_matching_child_prims from pxr import Gf, Usd, UsdGeom, UsdPhysics @@ -45,6 +44,7 @@ def __init__(self, num_envs, prim_path_pattern, device="cpu"): "root_prim_scales": [], } stor = HASH_STORE[prim_path_pattern] + stage = stage_utils.get_current_stage() xform_cache = UsdGeom.XformCache() prim_paths = [prim_path_pattern.replace(".*", f"{i}", 1) for i in range(num_envs)] @@ -69,7 +69,7 @@ def __init__(self, num_envs, prim_path_pattern, device="cpu"): collider_prim_env_ids.extend([i] * len(coll_prims)) # 2: Get relative transforms of all collider prims - root_xf = xform_cache.GetLocalToWorldTransform(prim_utils.get_prim_at_path(prim_paths[i])) + root_xf = xform_cache.GetLocalToWorldTransform(stage.GetPrimAtPath(prim_paths[i])) root_tf = Gf.Transform(root_xf) rel_tfs = [] root_prim_scales.append(torch.tensor(root_tf.GetScale())) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py index 7daf6855..fc62bf95 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py @@ -8,7 +8,7 @@ import numpy as np import torch -import isaacsim.core.utils.bounds as bounds_utils +import isaacsim.core.experimental.utils.bounds as bounds_utils from isaaclab.assets import Articulation, RigidObject, RigidObjectCollection from isaaclab.envs import ManagerBasedEnv, ManagerBasedRLEnv from isaaclab.managers import ManagerTermBase, SceneEntityCfg, TerminationTermCfg @@ -135,11 +135,11 @@ def reset(self, env_ids: torch.Tensor | None = None) -> None: object_asset = self._env.scene[self.object_cfg.name] if not hasattr(object_asset, "initial_pos"): - object_asset.initial_pos = object_asset.data.root_pos_w.clone() - object_asset.initial_quat = object_asset.data.root_quat_w.clone() + object_asset.initial_pos = object_asset.data.root_pos_w.torch.clone() + object_asset.initial_quat = object_asset.data.root_quat_w.torch.clone() else: - object_asset.initial_pos[env_ids] = object_asset.data.root_pos_w[env_ids].clone() - object_asset.initial_quat[env_ids] = object_asset.data.root_quat_w[env_ids].clone() + object_asset.initial_pos[env_ids] = object_asset.data.root_pos_w.torch[env_ids].clone() + object_asset.initial_quat[env_ids] = object_asset.data.root_quat_w.torch[env_ids].clone() if env_ids is None: self.stability_counter.zero_() @@ -164,18 +164,18 @@ def __call__( time_out = env.episode_length_buf >= env.max_episode_length # Check for abnormal gripper state (excessive joint velocities) - abnormal_gripper_state = (gripper_asset.data.joint_vel.abs() > (gripper_asset.data.joint_vel_limits * 2)).any( - dim=1 - ) + abnormal_gripper_state = ( + gripper_asset.data.joint_vel.torch.abs() > (gripper_asset.data.joint_vel_limits.torch * 2) + ).any(dim=1) # Check if asset velocities are small current_step_stable = torch.ones(env.num_envs, device=env.device, dtype=torch.bool) # Check gripper (articulation) velocities - current_step_stable &= gripper_asset.data.joint_vel.abs().sum(dim=1) < 5.0 + current_step_stable &= gripper_asset.data.joint_vel.torch.abs().sum(dim=1) < 5.0 # Check object (rigid object) velocities if isinstance(object_asset, RigidObject): - current_step_stable &= object_asset.data.body_lin_vel_w.abs().sum(dim=2).sum(dim=1) < 0.05 - current_step_stable &= object_asset.data.body_ang_vel_w.abs().sum(dim=2).sum(dim=1) < 1.0 + current_step_stable &= object_asset.data.body_lin_vel_w.torch.abs().sum(dim=2).sum(dim=1) < 0.05 + current_step_stable &= object_asset.data.body_ang_vel_w.torch.abs().sum(dim=2).sum(dim=1) < 1.0 elif isinstance(object_asset, RigidObjectCollection): current_step_stable &= object_asset.data.object_lin_vel_w.abs().sum(dim=2).sum(dim=1) < 0.05 current_step_stable &= object_asset.data.object_ang_vel_w.abs().sum(dim=2).sum(dim=1) < 1.0 @@ -189,17 +189,17 @@ def __call__( stability_reached = self.stability_counter >= self.consecutive_stability_steps # Skip if position or quaternion is NaN - pos_is_nan = torch.isnan(object_asset.data.root_pos_w).any(dim=1) - quat_is_nan = torch.isnan(object_asset.data.root_quat_w).any(dim=1) + pos_is_nan = torch.isnan(object_asset.data.root_pos_w.torch).any(dim=1) + quat_is_nan = torch.isnan(object_asset.data.root_quat_w.torch).any(dim=1) skip_check = pos_is_nan | quat_is_nan # Object has excessive pose deviation if position exceeds thresholds - pos_deviation = (object_asset.data.root_pos_w - object_asset.initial_pos).norm(dim=1) + pos_deviation = (object_asset.data.root_pos_w.torch - object_asset.initial_pos).norm(dim=1) valid_pos_deviation = torch.where(~skip_check, pos_deviation, torch.zeros_like(pos_deviation)) excessive_pose_deviation = valid_pos_deviation > self.max_pos_deviation # Object is above ground if position is greater than z threshold - pos_above_ground = object_asset.data.root_pos_w[:, 2] >= self.pos_z_threshold + pos_above_ground = object_asset.data.root_pos_w.torch[:, 2] >= self.pos_z_threshold # Check for collisions between gripper and object all_env_ids = torch.arange(env.num_envs, device=env.device) @@ -285,9 +285,9 @@ def reset(self, env_ids: torch.Tensor | None = None) -> None: for asset in self.assets_to_check: if asset is self.robot_asset: - asset_pos = asset.data.body_link_pos_w[:, self.ee_body_idx].clone() + asset_pos = asset.data.body_link_pos_w.torch[:, self.ee_body_idx].clone() else: - asset_pos = asset.data.root_pos_w.clone() + asset_pos = asset.data.root_pos_w.torch.clone() if not hasattr(asset, "initial_pos") or env_ids is None: asset.initial_pos = asset_pos else: @@ -335,11 +335,11 @@ def __call__( # Check for abnormal gripper state (excessive joint velocities) abnormal_gripper_state = ( - self.robot_asset.data.joint_vel.abs() > (self.robot_asset.data.joint_vel_limits * 2) + self.robot_asset.data.joint_vel.torch.abs() > (self.robot_asset.data.joint_vel_limits.torch * 2) ).any(dim=1) # Check if gripper orientation is pointing downward within 60 degrees of vertical - ee_quat = self.robot_asset.data.body_link_quat_w[:, self.ee_body_idx] + ee_quat = self.robot_asset.data.body_link_quat_w.torch[:, self.ee_body_idx] gripper_approach_local = torch.tensor( self.gripper_approach_direction, device=env.device, dtype=torch.float32 ).expand(env.num_envs, -1) @@ -352,10 +352,10 @@ def __call__( current_step_stable = torch.ones(env.num_envs, device=env.device, dtype=torch.bool) for asset in self.assets_to_check: if isinstance(asset, Articulation): - current_step_stable &= asset.data.joint_vel.abs().sum(dim=1) < 5.0 + current_step_stable &= asset.data.joint_vel.torch.abs().sum(dim=1) < 5.0 elif isinstance(asset, RigidObject): - current_step_stable &= asset.data.body_lin_vel_w.abs().sum(dim=2).sum(dim=1) < 0.1 - current_step_stable &= asset.data.body_ang_vel_w.abs().sum(dim=2).sum(dim=1) < 1.0 + current_step_stable &= asset.data.body_lin_vel_w.torch.abs().sum(dim=2).sum(dim=1) < 0.1 + current_step_stable &= asset.data.body_ang_vel_w.torch.abs().sum(dim=2).sum(dim=1) < 1.0 elif isinstance(asset, RigidObjectCollection): current_step_stable &= asset.data.object_lin_vel_w.abs().sum(dim=2).sum(dim=1) < 0.1 current_step_stable &= asset.data.object_ang_vel_w.abs().sum(dim=2).sum(dim=1) < 1.0 @@ -373,13 +373,13 @@ def __call__( pos_below_threshold = torch.zeros(env.num_envs, device=env.device, dtype=torch.bool) for asset in self.assets_to_check: if asset is self.robot_asset: - asset_pos = asset.data.body_link_pos_w[:, self.ee_body_idx].clone() + asset_pos = asset.data.body_link_pos_w.torch[:, self.ee_body_idx].clone() else: - asset_pos = asset.data.root_pos_w.clone() + asset_pos = asset.data.root_pos_w.torch.clone() # Skip if position or quaternion is NaN - pos_is_nan = torch.isnan(asset.data.root_pos_w).any(dim=1) - quat_is_nan = torch.isnan(asset.data.root_quat_w).any(dim=1) + pos_is_nan = torch.isnan(asset.data.root_pos_w.torch).any(dim=1) + quat_is_nan = torch.isnan(asset.data.root_quat_w.torch).any(dim=1) skip_check = pos_is_nan | quat_is_nan # Asset has excessive pose deviation if position exceeds thresholds @@ -461,12 +461,12 @@ def _compute_object_obbs(self): # Compute OBB in world frame using Isaac Sim's built-in functions insertive_centroid_world, insertive_axes_world, insertive_half_extents = bounds_utils.compute_obb( - self._bbox_cache, insertive_prim_path + insertive_prim_path, bbox_cache=self._bbox_cache ) # Get current world pose of object (env 0) to convert OBB to body frame - insertive_pos_world = self.insertive_object.data.root_pos_w[0] # (3,) - insertive_quat_world = self.insertive_object.data.root_quat_w[0] # (4,) + insertive_pos_world = self.insertive_object.data.root_pos_w.torch[0] # (3,) + insertive_quat_world = self.insertive_object.data.root_quat_w.torch[0] # (4,) device = self._env.device @@ -495,8 +495,8 @@ def reset(self, env_ids: torch.Tensor | None = None) -> None: """Store initial pose of insertive object when environments are reset.""" super().reset(env_ids) - insertive_pos = self.insertive_object.data.root_pos_w.clone() - insertive_quat = self.insertive_object.data.root_quat_w.clone() + insertive_pos = self.insertive_object.data.root_pos_w.torch.clone() + insertive_quat = self.insertive_object.data.root_quat_w.torch.clone() if self._insertive_initial_pos is None or self._insertive_initial_quat is None or env_ids is None: # First time initialization or reset all environments @@ -547,8 +547,8 @@ def _visualize_bounding_boxes(self, env: ManagerBasedEnv): draw_interface.clear_lines() # Get current world poses of insertive object for all environments - insertive_pos = self.insertive_object.data.root_pos_w # (num_envs, 3) - insertive_quat = self.insertive_object.data.root_quat_w # (num_envs, 4) + insertive_pos = self.insertive_object.data.root_pos_w.torch # (num_envs, 3) + insertive_quat = self.insertive_object.data.root_quat_w.torch # (num_envs, 4) # Transform current insertive object OBB centroid from body frame to world coordinates for all environments insertive_obb_centroid_body = self._insertive_obb_centroid @@ -685,8 +685,8 @@ def __call__( """Check if OBB overlap condition is violated between initial and current insertive object positions.""" # Get current world poses of insertive object for all environments - insertive_pos = self.insertive_object.data.root_pos_w # (num_envs, 3) - insertive_quat = self.insertive_object.data.root_quat_w # (num_envs, 4) + insertive_pos = self.insertive_object.data.root_pos_w.torch # (num_envs, 3) + insertive_quat = self.insertive_object.data.root_quat_w.torch # (num_envs, 4) # Transform current insertive object centroid from body frame to world coordinates for all environments insertive_obb_centroid_body = self._insertive_obb_centroid diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/utils.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/utils.py index 86fe3f40..939821c9 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/utils.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/utils.py @@ -21,14 +21,12 @@ from urllib.parse import urlparse import isaaclab.utils.math as math_utils -import isaacsim.core.utils.torch as torch_utils import omni import warp as wp from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR, NVIDIA_NUCLEUS_DIR, retrieve_file_path +from isaaclab.utils.seed import configure_seed from isaaclab.utils.warp import convert_to_warp_mesh from pxr import UsdGeom -from pytorch3d.ops import sample_farthest_points, sample_points_from_meshes -from pytorch3d.structures import Meshes from uwlab_assets import UWLAB_CLOUD_ASSETS_DIR @@ -84,6 +82,23 @@ def sample_object_point_cloud( Returns: torch.Tensor | None: _description_ """ + # Imported lazily: pytorch3d is an optional, hard-to-build dependency (it ships as a + # wheel compiled against an exact python/torch/CUDA combination, and there is no sdist + # fallback). The only caller is CollisionAnalyzer, i.e. the dataset-generation tasks + # (reset states, grasp sampling, partial assemblies); the RL envs never reach it. A + # module-level import would make every task in the package unimportable wherever no + # matching wheel exists. See the wheel table in uwlab_tasks/setup.py. + try: + from pytorch3d.ops import sample_farthest_points, sample_points_from_meshes + from pytorch3d.structures import Meshes + except ImportError as exc: + raise ImportError( + "sample_object_point_cloud() requires pytorch3d, which is not installed. It is " + "optional and only needed by the collision analyzer used when generating datasets; " + "see the wheel table in uwlab_tasks/setup.py for the supported python/torch/CUDA " + "combinations." + ) from exc + hasher = ( rigid_object_hasher if rigid_object_hasher is not None @@ -295,7 +310,7 @@ def temporary_seed(seed: int, restore_numpy: bool = True, restore_python: bool = try: sink = io.StringIO() with redirect_stdout(sink), redirect_stderr(sink): - torch_utils.set_seed(seed) + configure_seed(seed) yield finally: # restore everything @@ -374,6 +389,14 @@ def read_metadata_from_usd_directory(usd_path: str) -> dict: with open(local_path) as f: metadata_file = yaml.safe_load(f) + # Isaac Lab 3.0 reads quaternions as (x, y, z, w); metadata authored under 2.x is (w, x, y, z) + # and would be applied verbatim, i.e. silently rotated. Require the converted, stamped files + # published on the ``isaaclab3`` branch of the cloud asset repository. + if metadata_file.pop("quat_convention", None) != "xyzw": + raise ValueError( + f"{metadata_path} is not an Isaac Lab 3.0 metadata file (missing 'quat_convention: xyzw');" + " point UWLAB_CLOUD_ASSETS_REVISION at a commit on the isaaclab3 cloud asset branch" + ) return metadata_file diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/config/ur5/track_goal_ur5_env_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/config/ur5/track_goal_ur5_env_cfg.py index d02f61f6..12b9e418 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/config/ur5/track_goal_ur5_env_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/config/ur5/track_goal_ur5_env_cfg.py @@ -5,6 +5,7 @@ from isaaclab.managers import TerminationTermCfg as DoneTerm from isaaclab.utils import configclass +from isaaclab_physx.physics import PhysxCfg import uwlab_assets.robots.ur5 as ur5 @@ -34,7 +35,9 @@ def __post_init__(self): self.viewer.eye = (3.0, 3.0, 1.0) # Contact and solver settings - self.sim.physx.solver_type = 1 + if self.sim.physics is None: + self.sim.physics = PhysxCfg() + self.sim.physics.solver_type = 1 # Render settings self.sim.render.enable_dlssg = True self.sim.render.enable_ambient_occlusion = True diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/config/xarm_leap/track_goal_xarm_leap.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/config/xarm_leap/track_goal_xarm_leap.py index dcce8aa2..db7b95d3 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/config/xarm_leap/track_goal_xarm_leap.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/config/xarm_leap/track_goal_xarm_leap.py @@ -173,12 +173,11 @@ def __post_init__(self): ): # this is necessary to visualize opacity in the raytracing import carb - import isaacsim.core.utils.carb as carb_utils self.sim.render.enable_translucency = True # # Access the Carb settings registry settings = carb.settings.get_settings() - carb_utils.set_carb_setting(settings, "/rtx/raytracing/fractionalCutoutOpacity", True) + settings.set("/rtx/raytracing/fractionalCutoutOpacity", True) @configclass diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/mdp/command.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/mdp/command.py index cc5c25ba..796378e3 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/mdp/command.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/mdp/command.py @@ -83,22 +83,23 @@ def _update_command(self): def _set_debug_vis_impl(self, debug_vis: bool): # create markers if necessary for the first tome - import isaacsim.core.utils.prims as prim_utils + from isaaclab.sim.utils import find_matching_prim_paths + from isaaclab.sim.utils.legacy import get_prim_at_path from pxr import UsdGeom if debug_vis: if not hasattr(self, "vis_articulation"): if self.cfg.articulation_vis_cfg.name in self.env.scene.keys(): # noqa: SIM118 self.vis_articulation: Articulation = self.env.scene[self.cfg.articulation_vis_cfg.name] - prims_paths = prim_utils.find_matching_prim_paths(self.vis_articulation.cfg.prim_path) - prims = [prim_utils.get_prim_at_path(prim) for prim in prims_paths] + prims_paths = find_matching_prim_paths(self.vis_articulation.cfg.prim_path) + prims = [get_prim_at_path(prim) for prim in prims_paths] for prim in prims: UsdGeom.Imageable(prim).MakeVisible() # VisualizationMarkers else: if hasattr(self, "vis_articulation"): - prims_paths = prim_utils.find_matching_prim_paths(self.vis_articulation.cfg.prim_path) - prims = [prim_utils.get_prim_at_path(prim) for prim in prims_paths] + prims_paths = find_matching_prim_paths(self.vis_articulation.cfg.prim_path) + prims = [get_prim_at_path(prim) for prim in prims_paths] for prim in prims: UsdGeom.Imageable(prim).MakeInvisible() diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/mdp/rewards.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/mdp/rewards.py index 8f53451f..d40761bd 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/mdp/rewards.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/mdp/rewards.py @@ -26,16 +26,16 @@ def stay_still( asset: Articulation = env.scene[hand_asset_cfg.name] ee_command = env.command_manager.get_command(ee_command_name) hand_command = env.command_manager.get_command(hand_command_name) - cur_hand_joint_pos = asset.data.joint_pos[:, hand_asset_cfg.joint_ids] + cur_hand_joint_pos = asset.data.joint_pos.torch[:, hand_asset_cfg.joint_ids] hand_error = torch.norm(hand_command - cur_hand_joint_pos, dim=1) des_pos_w, _ = math_utils.combine_frame_transforms( - asset.data.root_state_w[:, :3], asset.data.root_state_w[:, 3:7], ee_command[:, :3] + asset.data.root_state_w.torch[:, :3], asset.data.root_state_w.torch[:, 3:7], ee_command[:, :3] ) - curr_pos_w = asset.data.body_link_pos_w[:, ee_asset_cfg.body_ids, :3].view(-1, 3) + curr_pos_w = asset.data.body_link_pos_w.torch[:, ee_asset_cfg.body_ids, :3].view(-1, 3) distance = torch.norm(curr_pos_w - des_pos_w, dim=1) goal_reached_mask = (distance < 0.1) & (hand_error < 0.4) - return torch.where(goal_reached_mask, asset.data.body_vel_w.abs().sum(2).sum(1), 0) + return torch.where(goal_reached_mask, asset.data.body_vel_w.torch.abs().sum(2).sum(1), 0) def delta_action_l2( diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/track_goal_env.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/track_goal_env.py index e1f4b31f..fb2eb93c 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/track_goal_env.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/track_goal/track_goal_env.py @@ -17,6 +17,7 @@ from isaaclab.managers import TerminationTermCfg as DoneTerm from isaaclab.scene import InteractiveSceneCfg from isaaclab.utils import configclass +from isaaclab_physx.physics import PhysxCfg from uwlab_assets import UWLAB_CLOUD_ASSETS_DIR @@ -28,7 +29,7 @@ class SceneCfg(InteractiveSceneCfg): table = AssetBaseCfg( prim_path="{ENV_REGEX_NS}/Table", - init_state=AssetBaseCfg.InitialStateCfg(pos=(0.4, 0.0, -0.868), rot=(0.707, 0.0, 0.0, -0.707)), + init_state=AssetBaseCfg.InitialStateCfg(pos=(0.4, 0.0, -0.868), rot=(0.0, 0.0, -0.707, 0.707)), spawn=sim_utils.UsdFileCfg(usd_path=f"{UWLAB_CLOUD_ASSETS_DIR}/Props/Mounts/UWPatVention/pat_vention.usd"), ) @@ -193,9 +194,11 @@ def __post_init__(self): self.episode_length_s = 50 # simulation settings self.sim.dt = 0.02 / self.decimation - self.sim.physx.gpu_found_lost_aggregate_pairs_capacity = 1024 * 1024 * 4 - self.sim.physx.gpu_total_aggregate_pairs_capacity = 16 * 1024 - self.sim.physx.gpu_max_rigid_patch_count = 5 * 2**16 + if self.sim.physics is None: + self.sim.physics = PhysxCfg() + self.sim.physics.gpu_found_lost_aggregate_pairs_capacity = 1024 * 1024 * 4 + self.sim.physics.gpu_total_aggregate_pairs_capacity = 16 * 1024 + self.sim.physics.gpu_max_rigid_patch_count = 5 * 2**16 self.sim.render.enable_ambient_occlusion = True self.sim.render.enable_reflections = True diff --git a/uwlab.sh b/uwlab.sh index 4bfa38ae..ab838233 100755 --- a/uwlab.sh +++ b/uwlab.sh @@ -43,50 +43,6 @@ install_system_deps() { fi } -# Returns success (exit code 0 / "true") if the detected Isaac Sim version starts with 4.5, -# otherwise returns non-zero ("false"). Works with both symlinked binary installs and pip installs. -is_isaacsim_version_4_5() { - local version="" - local python_exe - python_exe=$(extract_python_exe) - - # 0) Fast path: read VERSION file from the symlinked _isaac_sim directory (binary install) - # If the repository has _isaac_sim → symlink, the VERSION file is the simplest source of truth. - if [[ -f "${UWLAB_PATH}/_isaac_sim/VERSION" ]]; then - # Read first line of the VERSION file; don't fail the whole script on errors. - version=$(head -n1 "${UWLAB_PATH}/_isaac_sim/VERSION" || true) - fi - - # 1) Package-path probe: import isaacsim and walk up to ../../VERSION (pip or nonstandard layouts) - # If we still don't know the version, ask Python where the isaacsim package lives - if [[ -z "$version" ]]; then - local sim_file="" - # Print isaacsim.__file__; suppress errors so set -e won't abort. - sim_file=$("${python_exe}" -c 'import isaacsim, os; print(isaacsim.__file__)' 2>/dev/null || true) - if [[ -n "$sim_file" ]]; then - local version_path - version_path="$(dirname "$sim_file")/../../VERSION" - # If that VERSION file exists, read it. - [[ -f "$version_path" ]] && version=$(head -n1 "$version_path" || true) - fi - fi - - # 2) Fallback: use package metadata via importlib.metadata.version("isaacsim") - if [[ -z "$version" ]]; then - version=$("${python_exe}" <<'PY' 2>/dev/null || true -from importlib.metadata import version, PackageNotFoundError -try: - print(version("isaacsim")) -except PackageNotFoundError: - pass -PY -) - fi - - # Final decision: return success if version begins with "4.5", 0 if match, 1 otherwise. - [[ "$version" == 4.5* ]] -} - # check if running in docker is_docker() { [ -f /.dockerenv ] || \ @@ -111,12 +67,17 @@ ensure_cuda_torch() { # choose pins per arch local torch_ver tv_ver cuda_ver if is_arm; then - torch_ver="2.9.0" - tv_ver="0.24.0" + torch_ver="2.11.0" + tv_ver="0.26.0" cuda_ver="130" else - torch_ver="2.7.0" - tv_ver="0.22.0" + # isaacsim-core 6.0.1 (Isaac Lab 3.0) requires torch==2.11.0. Its default + # PyPI wheel is built against CUDA 13.0 and silently yields + # torch.cuda.is_available() == False on CUDA 12.x drivers, so this pin is + # re-applied after the Isaac Lab install below (the +cu128 suffix check + # catches the swap). Bump together with ISAACLAB_COMMIT. + torch_ver="2.11.0" + tv_ver="0.26.0" cuda_ver="128" fi @@ -356,20 +317,7 @@ setup_conda_env() { echo -e "[INFO] Creating conda environment named '${env_name}'..." echo -e "[INFO] Installing dependencies from ${UWLAB_PATH}/environment.yml" - # patch Python version if needed, but back up first - cp "${UWLAB_PATH}/environment.yml"{,.bak} - if is_isaacsim_version_4_5; then - echo "[INFO] Detected Isaac Sim 4.5 → forcing python=3.10" - sed -i 's/^ - python=3\.11/ - python=3.10/' "${UWLAB_PATH}/environment.yml" - else - echo "[INFO] Isaac Sim >= 5.0 detected, installing python=3.11" - fi - conda env create -y --file ${UWLAB_PATH}/environment.yml -n ${env_name} - # (optional) restore original environment.yml: - if [[ -f "${UWLAB_PATH}/environment.yml.bak" ]]; then - mv "${UWLAB_PATH}/environment.yml.bak" "${UWLAB_PATH}/environment.yml" - fi fi # cache current paths for later @@ -582,23 +530,51 @@ while [[ $# -gt 0 ]]; do export -f extract_pip_command export -f extract_pip_uninstall_command export -f install_uwlab_extension - # --- NEW: install upstream isaaclab (GitHub main, editable) --- - echo "[INFO] Installing upstream IsaacLab packages from GitHub (main) in editable mode into ${UWLAB_PATH}/_isaaclab ..." + # --- install upstream isaaclab (pinned commit, editable) --- + # + # Pinned, not tracking main: Isaac Lab and rsl-rl-lib move together + # (isaaclab_rl's cfg schema follows the rsl-rl API), so the commit here + # and the rsl-rl-lib commit in source/uwlab_rl/setup.py must be bumped + # as a pair. Override for experiments with UWLAB_ISAACLAB_COMMIT=. + ISAACLAB_COMMIT="${UWLAB_ISAACLAB_COMMIT:-ffff603eafc6b74264a5261cc0183d6a65390d78}" # 3.0.0-beta2.patch1 + echo "[INFO] Installing upstream IsaacLab (pinned ${ISAACLAB_COMMIT:0:9}) in editable mode into ${UWLAB_PATH}/_isaaclab ..." repo_root="${UWLAB_PATH}/_isaaclab/IsaacLab" mkdir -p "${UWLAB_PATH}/_isaaclab" if [ ! -d "${repo_root}/.git" ]; then - echo "[INFO] Cloning IsaacLab repository (branch: main) into ${repo_root} ..." - git clone --depth 1 --branch main https://github.com/isaac-sim/IsaacLab.git "${repo_root}" + echo "[INFO] Initializing IsaacLab repository at ${repo_root} ..." + git init -q "${repo_root}" + git -C "${repo_root}" remote add origin https://github.com/isaac-sim/IsaacLab.git else - echo "[INFO] Found existing IsaacLab clone at ${repo_root}; using it." + echo "[INFO] Found existing IsaacLab clone at ${repo_root}; checking out the pin." fi - ${pip_command} -e "${repo_root}/source/isaaclab" --extra-index-url https://pypi.nvidia.com - ${pip_command} -e "${repo_root}/source/isaaclab_assets" --extra-index-url https://pypi.nvidia.com - ${pip_command} -e "${repo_root}/source/isaaclab_tasks" --extra-index-url https://pypi.nvidia.com + git -C "${repo_root}" fetch -q --depth 1 origin "${ISAACLAB_COMMIT}" + git -C "${repo_root}" checkout -q --detach FETCH_HEAD + + # Fail here rather than at the first training run: uwlab_rl targets the + # rsl-rl-lib >= 5.0 API, whose Isaac Lab side is recognisable by the + # `optimizer` field on RslRlPpoAlgorithmCfg. + if ! grep -q '^ optimizer' \ + "${repo_root}/source/isaaclab_rl/isaaclab_rl/rsl_rl/rl_cfg.py" 2>/dev/null; then + echo "[ERROR] Pinned IsaacLab (${ISAACLAB_COMMIT:0:9}) predates rsl-rl-lib 5.0 (no 'optimizer' field in" + echo "[ERROR] RslRlPpoAlgorithmCfg) but source/uwlab_rl/setup.py targets the 5.0+ API. Bump both pins together." + exit 1 + fi + # Isaac Lab 3.0 splits the core into per-backend packages; isaaclab + # imports isaaclab_physx/isaaclab_newton/isaaclab_ov at runtime, so all + # of them are required even for a single-backend install. + for ext in isaaclab isaaclab_assets isaaclab_contrib isaaclab_experimental isaaclab_newton \ + isaaclab_ov isaaclab_ovphysx isaaclab_physx isaaclab_ppisp isaaclab_tasks \ + isaaclab_tasks_experimental isaaclab_visualizers; do + ${pip_command} -e "${repo_root}/source/${ext}" --extra-index-url https://pypi.nvidia.com + done ${pip_command} -e "${repo_root}/source/isaaclab_rl[all]" --extra-index-url https://pypi.nvidia.com echo "[INFO] Upstream IsaacLab packages installed (editable) from local clone at ${repo_root}." # source directory find -L "${UWLAB_PATH}/source" -mindepth 1 -maxdepth 1 -type d -exec bash -c 'install_uwlab_extension "{}"' \; + # collision analyzer (dataset generation) needs pytorch3d; prebuilt wheels exist for linux x86_64 only + if [ "$(uname -m)" = "x86_64" ]; then + ${pip_command} -e "${UWLAB_PATH}/source/uwlab_tasks[collision]" + fi # install the python packages for supported reinforcement learning frameworks echo "[INFO] Installing extra requirements such as learning frameworks..." # check if specified which rl-framework to install From 2a522782c3dd77f868ceabaa595f5b5d85df8ee4 Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sun, 20 Sep 2026 23:33:22 -0700 Subject: [PATCH 02/27] optimized PPO HP --- .../ur5e_robotiq_2f85/agents/rsl_rl_cfg.py | 44 +++++++++---------- .../config/ur5e_robotiq_2f85/rl_state_cfg.py | 4 +- 2 files changed, 22 insertions(+), 26 deletions(-) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/agents/rsl_rl_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/agents/rsl_rl_cfg.py index 72e99406..841fc6dc 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/agents/rsl_rl_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/agents/rsl_rl_cfg.py @@ -4,15 +4,9 @@ # SPDX-License-Identifier: BSD-3-Clause from isaaclab.utils import configclass -from isaaclab_rl.rsl_rl import RslRlMLPModelCfg, RslRlOnPolicyRunnerCfg +from isaaclab_rl.rsl_rl import RslRlMLPModelCfg, RslRlOnPolicyRunnerCfg, RslRlPpoAlgorithmCfg -from uwlab_rl.rsl_rl.rl_cfg import ( - BehaviorCloningCfg, - GsdeDistributionCfg, - OffPolicyAlgorithmCfg, - RslRlFancyPpoAlgorithmCfg, - RslRlGsdePpoAlgorithmCfg, -) +from uwlab_rl.rsl_rl.rl_cfg import BehaviorCloningCfg, OffPolicyAlgorithmCfg, RslRlFancyPpoAlgorithmCfg def my_experts_observation_func(env): @@ -25,29 +19,32 @@ class Base_PPORunnerCfg(RslRlOnPolicyRunnerCfg): num_steps_per_env = 32 max_iterations = 40000 save_interval = 100 + obs_groups = {"actor": ["policy"], "critic": ["policy"]} resume = False experiment_name = "ur5e_robotiq_2f85_omnireset_agent" - # Explicit `actor`/`critic` model cfgs rather than the legacy `policy` cfg: gSDE is a - # distribution class, and the legacy path only forwards `std_type` ("scalar"/"log"). + # Explicit `actor`/`critic` model cfgs preserve the distribution constructor options, + # including the action-std bounds not exposed by the legacy `policy` conversion. actor = RslRlMLPModelCfg( hidden_dims=[512, 256, 128, 64], activation="elu", obs_normalization=True, - stochastic=True, - init_noise_std=1.0, - state_dependent_std=False, - # learn_features=True keeps the gradient path from the state-dependent std into the - # backbone, as in the rsl-rl 3.x recipe. With it detached (rsl_rl default) the - # adaptive-KL schedule floors the LR at iteration 0 and the std runs away. - distribution_cfg=GsdeDistributionCfg(init_std=1.0, learn_features=True), + # Bound normalized action std rather than feature-space noise weights. + # Predict state-dependent log std alongside the action mean while keeping + # the initial exploration scale identical to the previous recipe. + distribution_cfg={ + "class_name": "HeteroscedasticGaussianDistribution", + "init_std": 1.0, + "std_type": "log", + "std_range": [0.001, 2.0], + }, ) critic = RslRlMLPModelCfg( hidden_dims=[512, 256, 128, 64], activation="elu", obs_normalization=True, - stochastic=False, + distribution_cfg=None, ) - algorithm = RslRlGsdePpoAlgorithmCfg( + algorithm = RslRlPpoAlgorithmCfg( value_loss_coef=1.0, use_clipped_value_loss=True, normalize_advantage_per_mini_batch=False, @@ -61,11 +58,10 @@ class Base_PPORunnerCfg(RslRlOnPolicyRunnerCfg): lam=0.95, desired_kl=0.01, max_grad_norm=1.0, - # rsl-rl 5.x gSDE holds the exploration matrix fixed for a whole rollout by default - # (time-correlated noise). The recipe this task was tuned with (rsl-rl 3.x) drew fresh - # noise every step; insertion relies on that dither to discover contacts, so resample - # every step. Mean, std, log-prob and entropy are unaffected -- only the sample is. - sde_sample_freq=1, + # Exploration is handled by the actor's distribution configuration. + # Gaussian noise is drawn independently for each action sample. + # There is no latent noise matrix to resample on environment steps. + # Leave the optimizer and rollout settings unchanged. ) 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 bd893357..a557e7f8 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 @@ -413,7 +413,7 @@ class PolicyCfg(ObsGroup): def __post_init__(self): self.enable_corruption = True self.concatenate_terms = True - self.history_length = 5 + self.history_length = 0 @configclass class CriticCfg(ObsGroup): @@ -517,7 +517,7 @@ def __post_init__(self): # observation groups policy: PolicyCfg = PolicyCfg() - critic: CriticCfg = CriticCfg() + critic: CriticCfg | None = None @configclass From 07e95352dffb87553766b9a6a6c9c376c2d82e58 Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sun, 20 Sep 2026 23:55:19 -0700 Subject: [PATCH 03/27] Fix ee_vel frame transformation bug --- source/uwlab_tasks/config/extension.toml | 2 +- source/uwlab_tasks/docs/CHANGELOG.rst | 11 +++++ source/uwlab_tasks/test/test_environments.py | 43 +++++++++++++++++++ .../factory_extension/mdp/observations.py | 12 +++--- .../omnireset/mdp/observations.py | 7 +-- 5 files changed, 63 insertions(+), 12 deletions(-) diff --git a/source/uwlab_tasks/config/extension.toml b/source/uwlab_tasks/config/extension.toml index b6b67257..f128703d 100644 --- a/source/uwlab_tasks/config/extension.toml +++ b/source/uwlab_tasks/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.14.0" +version = "0.14.1" # Description title = "UW Lab Tasks" diff --git a/source/uwlab_tasks/docs/CHANGELOG.rst b/source/uwlab_tasks/docs/CHANGELOG.rst index 071da403..81e90ae1 100644 --- a/source/uwlab_tasks/docs/CHANGELOG.rst +++ b/source/uwlab_tasks/docs/CHANGELOG.rst @@ -1,6 +1,17 @@ Changelog --------- +0.14.1 (2026-09-21) +~~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Fixed OmniReset and Factory extension velocity observations subtracting the robot's world position + from linear and angular velocities. Velocity vectors are now rotated into the root frame without translation. +* Added regression coverage for stationary and moving links, translated roots, rotated frames, and body selection. + + 0.14.0 (2026-09-16) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_tasks/test/test_environments.py b/source/uwlab_tasks/test/test_environments.py index 2916244b..5d635ead 100644 --- a/source/uwlab_tasks/test/test_environments.py +++ b/source/uwlab_tasks/test/test_environments.py @@ -15,8 +15,14 @@ """Rest everything follows.""" +import importlib +import math +import torch +from types import SimpleNamespace + import pytest from env_test_utils import _run_environments, setup_environment +from isaaclab.managers import SceneEntityCfg import uwlab_tasks # noqa: F401 @@ -27,3 +33,40 @@ def test_environments(task_name, num_envs, device): # run environments without stage in memory _run_environments(task_name, device, num_envs, create_stage_in_memory=False) + + +@pytest.mark.parametrize("task_family", ["omnireset", "factory_extension"]) +@pytest.mark.parametrize("body_ids", [slice(None), [1]]) +@pytest.mark.parametrize("stationary", [True, False]) +@pytest.mark.parametrize("translated", [True, False]) +@pytest.mark.isaacsim_ci +def test_asset_link_velocity_frame_transform(task_family, body_ids, stationary, translated): + mdp = importlib.import_module(f"uwlab_tasks.manager_based.manipulation.{task_family}.mdp.observations") + positions = torch.tensor([[1.0, 2.0, 3.0], [-4.0, 7.0, 9.0], [25.0, -6.0, 0.5]]) + if not translated: + positions.zero_() + half_sqrt = math.sqrt(0.5) + quaternions = torch.tensor([[0.0, 0.0, 0.0, 1.0], [0.0, 0.0, half_sqrt, half_sqrt], [1.0, 0.0, 0.0, 0.0]]) + linear = torch.tensor([[[1.0, 2.0, 3.0], [7.0, 8.0, 9.0]]]).repeat(3, 1, 1) + angular = torch.tensor([[[4.0, 5.0, 6.0], [10.0, 11.0, 12.0]]]).repeat(3, 1, 1) + if stationary: + linear.zero_() + angular.zero_() + target = SimpleNamespace( + data=SimpleNamespace( + body_lin_vel_w=SimpleNamespace(torch=linear), body_ang_vel_w=SimpleNamespace(torch=angular) + ) + ) + root = SimpleNamespace( + data=SimpleNamespace( + root_pos_w=SimpleNamespace(torch=positions), root_quat_w=SimpleNamespace(torch=quaternions) + ) + ) + env = SimpleNamespace(scene={"target": target, "robot": root}) + actual = mdp.asset_link_velocity_in_root_asset_frame(env, SceneEntityCfg("target", body_ids=body_ids)) + index = 0 if isinstance(body_ids, slice) else body_ids[0] + linear_selected, angular_selected = linear[:, index], angular[:, index] + expected = torch.cat([linear_selected, angular_selected], dim=-1) + expected[1] = expected[1, [1, 0, 2, 4, 3, 5]] * torch.tensor([1.0, -1.0, 1.0, 1.0, -1.0, 1.0]) + expected[2] *= torch.tensor([1.0, -1.0, -1.0, 1.0, -1.0, -1.0]) + torch.testing.assert_close(actual, expected, rtol=1e-5, atol=1e-5) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/observations.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/observations.py index 9a0af8fd..76926301 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/observations.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/factory_extension/mdp/observations.py @@ -55,14 +55,14 @@ def asset_link_velocity_in_root_asset_frame( target_body_idx = 0 if isinstance(target_asset_cfg.body_ids, slice) else target_asset_cfg.body_ids - asset_lin_vel_b, _ = math_utils.subtract_frame_transforms( - root_asset.data.root_pos_w.torch, - root_asset.data.root_quat_w.torch, + root_quat_w = root_asset.data.root_quat_w.torch + + asset_lin_vel_b = math_utils.quat_apply_inverse( + root_quat_w, target_asset.data.body_lin_vel_w.torch[:, target_body_idx].view(-1, 3), ) - asset_ang_vel_b, _ = math_utils.subtract_frame_transforms( - root_asset.data.root_pos_w.torch, - root_asset.data.root_quat_w.torch, + asset_ang_vel_b = math_utils.quat_apply_inverse( + root_quat_w, target_asset.data.body_ang_vel_w.torch[:, target_body_idx].view(-1, 3), ) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/observations.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/observations.py index fde59232..4f6a517b 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/observations.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/observations.py @@ -134,16 +134,13 @@ def asset_link_velocity_in_root_asset_frame( target_body_idx = 0 if isinstance(target_asset_cfg.body_ids, slice) else target_asset_cfg.body_ids - root_pos_w = root_asset.data.root_pos_w.torch root_quat_w = root_asset.data.root_quat_w.torch - asset_lin_vel_b, _ = math_utils.subtract_frame_transforms( - root_pos_w, + asset_lin_vel_b = math_utils.quat_apply_inverse( root_quat_w, target_asset.data.body_lin_vel_w.torch[:, target_body_idx].view(-1, 3), ) - asset_ang_vel_b, _ = math_utils.subtract_frame_transforms( - root_pos_w, + asset_ang_vel_b = math_utils.quat_apply_inverse( root_quat_w, target_asset.data.body_ang_vel_w.torch[:, target_body_idx].view(-1, 3), ) From 6c538d4841af1e4ca747ce4b4cd9960fc550eb98 Mon Sep 17 00:00:00 2001 From: Joshua Tran Date: Wed, 23 Sep 2026 19:26:16 -0700 Subject: [PATCH 04/27] Publish Isaac Lab 3.0 OmniReset experts and pin rsl_rl #6 - 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) Claude-Session: https://claude.ai/code/session_019ogU9ju7PGwhFwKH11djAC --- docs/source/publications/omnireset/index.rst | 192 +++++++++++++----- .../publications/omnireset/rl_training.rst | 6 + source/uwlab_assets/uwlab_assets/__init__.py | 2 +- source/uwlab_rl/docs/CHANGELOG.rst | 4 +- source/uwlab_rl/setup.py | 11 +- source/uwlab_rl/uwlab_rl/rsl_rl/__init__.py | 8 +- source/uwlab_rl/uwlab_rl/rsl_rl/exporter.py | 42 +++- source/uwlab_rl/uwlab_rl/rsl_rl/rl_cfg.py | 35 ---- 8 files changed, 189 insertions(+), 111 deletions(-) diff --git a/docs/source/publications/omnireset/index.rst b/docs/source/publications/omnireset/index.rst index 7dc3f96d..26184126 100644 --- a/docs/source/publications/omnireset/index.rst +++ b/docs/source/publications/omnireset/index.rst @@ -36,7 +36,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts/leg_state_rl_expert_seed42.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/leg_state_rl_expert_seed42.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -45,29 +45,29 @@ Download our pretrained checkpoint and run evaluation. env.scene.insertive_object=fbleg \ env.scene.receptive_object=fbtabletop - .. tab-item:: Seed 0 + .. tab-item:: Seed 43 .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts/leg_state_rl_expert_seed0.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/leg_state_rl_expert_seed43.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ --num_envs 1 \ - --checkpoint leg_state_rl_expert_seed0.pt \ + --checkpoint leg_state_rl_expert_seed43.pt \ env.scene.insertive_object=fbleg \ env.scene.receptive_object=fbtabletop - .. tab-item:: Seed 1 + .. tab-item:: Seed 44 .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts/leg_state_rl_expert_seed1.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/leg_state_rl_expert_seed44.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ --num_envs 1 \ - --checkpoint leg_state_rl_expert_seed1.pt \ + --checkpoint leg_state_rl_expert_seed44.pt \ env.scene.insertive_object=fbleg \ env.scene.receptive_object=fbtabletop @@ -88,7 +88,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts/drawer_state_rl_expert_seed42.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/drawer_state_rl_expert_seed42.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -97,29 +97,29 @@ Download our pretrained checkpoint and run evaluation. env.scene.insertive_object=fbdrawerbottom \ env.scene.receptive_object=fbdrawerbox - .. tab-item:: Seed 0 + .. tab-item:: Seed 43 .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts/drawer_state_rl_expert_seed0.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/drawer_state_rl_expert_seed43.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ --num_envs 1 \ - --checkpoint drawer_state_rl_expert_seed0.pt \ + --checkpoint drawer_state_rl_expert_seed43.pt \ env.scene.insertive_object=fbdrawerbottom \ env.scene.receptive_object=fbdrawerbox - .. tab-item:: Seed 1 + .. tab-item:: Seed 44 .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts/drawer_state_rl_expert_seed1.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/drawer_state_rl_expert_seed44.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ --num_envs 1 \ - --checkpoint drawer_state_rl_expert_seed1.pt \ + --checkpoint drawer_state_rl_expert_seed44.pt \ env.scene.insertive_object=fbdrawerbottom \ env.scene.receptive_object=fbdrawerbox @@ -140,7 +140,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts/peg_state_rl_expert_seed42.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/peg_state_rl_expert_seed42.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -149,29 +149,29 @@ Download our pretrained checkpoint and run evaluation. env.scene.insertive_object=peg \ env.scene.receptive_object=peghole - .. tab-item:: Seed 0 + .. tab-item:: Seed 43 .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts/peg_state_rl_expert_seed0.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/peg_state_rl_expert_seed43.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ --num_envs 1 \ - --checkpoint peg_state_rl_expert_seed0.pt \ + --checkpoint peg_state_rl_expert_seed43.pt \ env.scene.insertive_object=peg \ env.scene.receptive_object=peghole - .. tab-item:: Seed 1 + .. tab-item:: Seed 44 .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts/peg_state_rl_expert_seed1.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/peg_state_rl_expert_seed44.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ --num_envs 1 \ - --checkpoint peg_state_rl_expert_seed1.pt \ + --checkpoint peg_state_rl_expert_seed44.pt \ env.scene.insertive_object=peg \ env.scene.receptive_object=peghole @@ -186,18 +186,52 @@ Download our pretrained checkpoint and run evaluation. - .. code:: bash + .. note:: - # Download checkpoint - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts/rectangle_state_rl_expert_seed0.pt + On Isaac Lab 3.0 this task plateaus at about 62-65% end-of-episode success on all three + seeds, well below the other tasks (90-99%). The checkpoints below are the best ones from + those runs. - # Run evaluation - python scripts/reinforcement_learning/rsl_rl/play.py \ - --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 1 \ - --checkpoint rectangle_state_rl_expert_seed0.pt \ - env.scene.insertive_object=rectangle \ - env.scene.receptive_object=wall + .. tab-set:: + + .. tab-item:: Seed 42 + + .. code:: bash + + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/rectangle_state_rl_expert_seed42.pt + + python scripts/reinforcement_learning/rsl_rl/play.py \ + --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ + --num_envs 1 \ + --checkpoint rectangle_state_rl_expert_seed42.pt \ + env.scene.insertive_object=rectangle \ + env.scene.receptive_object=wall + + .. tab-item:: Seed 43 + + .. code:: bash + + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/rectangle_state_rl_expert_seed43.pt + + python scripts/reinforcement_learning/rsl_rl/play.py \ + --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ + --num_envs 1 \ + --checkpoint rectangle_state_rl_expert_seed43.pt \ + env.scene.insertive_object=rectangle \ + env.scene.receptive_object=wall + + .. tab-item:: Seed 44 + + .. code:: bash + + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/rectangle_state_rl_expert_seed44.pt + + python scripts/reinforcement_learning/rsl_rl/play.py \ + --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ + --num_envs 1 \ + --checkpoint rectangle_state_rl_expert_seed44.pt \ + env.scene.insertive_object=rectangle \ + env.scene.receptive_object=wall .. tab-item:: Cube Stacking @@ -210,18 +244,46 @@ Download our pretrained checkpoint and run evaluation. - .. code:: bash + .. tab-set:: + + .. tab-item:: Seed 42 + + .. code:: bash + + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/cube_state_rl_expert_seed42.pt + + python scripts/reinforcement_learning/rsl_rl/play.py \ + --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ + --num_envs 1 \ + --checkpoint cube_state_rl_expert_seed42.pt \ + env.scene.insertive_object=cube \ + env.scene.receptive_object=cube + + .. tab-item:: Seed 43 - # Download checkpoint - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts/cube_state_rl_expert_seed42.pt + .. code:: bash + + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/cube_state_rl_expert_seed43.pt + + python scripts/reinforcement_learning/rsl_rl/play.py \ + --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ + --num_envs 1 \ + --checkpoint cube_state_rl_expert_seed43.pt \ + env.scene.insertive_object=cube \ + env.scene.receptive_object=cube + + .. tab-item:: Seed 44 - # Run evaluation - python scripts/reinforcement_learning/rsl_rl/play.py \ - --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 1 \ - --checkpoint cube_state_rl_expert_seed42.pt \ - env.scene.insertive_object=cube \ - env.scene.receptive_object=cube + .. code:: bash + + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/cube_state_rl_expert_seed44.pt + + python scripts/reinforcement_learning/rsl_rl/play.py \ + --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ + --num_envs 1 \ + --checkpoint cube_state_rl_expert_seed44.pt \ + env.scene.insertive_object=cube \ + env.scene.receptive_object=cube .. tab-item:: Cupcake on Plate @@ -234,18 +296,46 @@ Download our pretrained checkpoint and run evaluation. - .. code:: bash + .. tab-set:: - # Download checkpoint - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts/cupcake_state_rl_expert_seed42.pt + .. tab-item:: Seed 42 - # Run evaluation - python scripts/reinforcement_learning/rsl_rl/play.py \ - --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ - --num_envs 1 \ - --checkpoint cupcake_state_rl_expert_seed42.pt \ - env.scene.insertive_object=cupcake \ - env.scene.receptive_object=plate + .. code:: bash + + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/cupcake_state_rl_expert_seed42.pt + + python scripts/reinforcement_learning/rsl_rl/play.py \ + --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ + --num_envs 1 \ + --checkpoint cupcake_state_rl_expert_seed42.pt \ + env.scene.insertive_object=cupcake \ + env.scene.receptive_object=plate + + .. tab-item:: Seed 43 + + .. code:: bash + + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/cupcake_state_rl_expert_seed43.pt + + python scripts/reinforcement_learning/rsl_rl/play.py \ + --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ + --num_envs 1 \ + --checkpoint cupcake_state_rl_expert_seed43.pt \ + env.scene.insertive_object=cupcake \ + env.scene.receptive_object=plate + + .. tab-item:: Seed 44 + + .. code:: bash + + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/cupcake_state_rl_expert_seed44.pt + + python scripts/reinforcement_learning/rsl_rl/play.py \ + --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ + --num_envs 1 \ + --checkpoint cupcake_state_rl_expert_seed44.pt \ + env.scene.insertive_object=cupcake \ + env.scene.receptive_object=plate ---- diff --git a/docs/source/publications/omnireset/rl_training.rst b/docs/source/publications/omnireset/rl_training.rst index 0cbc6474..e3a1dfa9 100644 --- a/docs/source/publications/omnireset/rl_training.rst +++ b/docs/source/publications/omnireset/rl_training.rst @@ -478,6 +478,12 @@ Reproduce our training results from scratch. .. tab-item:: Rectangle on Wall + .. note:: + + On Isaac Lab 3.0 this task plateaus at about 62-65% end-of-episode success on all three + seeds, well below the other tasks (90-99%). Expect a lower final success rate than + for the other tasks. + .. note:: **Skip directly to Step 4** if you want to train an RL policy with our pre-generated reset state datasets. Only run Steps 1-3 if you want to generate your own. diff --git a/source/uwlab_assets/uwlab_assets/__init__.py b/source/uwlab_assets/uwlab_assets/__init__.py index 373eba25..c61616be 100644 --- a/source/uwlab_assets/uwlab_assets/__init__.py +++ b/source/uwlab_assets/uwlab_assets/__init__.py @@ -24,7 +24,7 @@ UWLAB_CLOUD_ASSETS_REPO = "https://huggingface.co/datasets/UW-Lab/uwlab-assets" """HuggingFace dataset repository holding the cloud assets.""" -UWLAB_CLOUD_ASSETS_REVISION = "8892962cdaad159de4efc331af0ac1bf7f192d0b" # branch isaaclab3 +UWLAB_CLOUD_ASSETS_REVISION = "5ea494fdd7eac242c0ba147fe6508c68abc898ac" # branch isaaclab3 """Pinned commit of :data:`UWLAB_CLOUD_ASSETS_REPO`. Pinned rather than a branch name so that asset changes on HuggingFace are opt-in: bump this diff --git a/source/uwlab_rl/docs/CHANGELOG.rst b/source/uwlab_rl/docs/CHANGELOG.rst index 27878d82..c0e1a9c6 100644 --- a/source/uwlab_rl/docs/CHANGELOG.rst +++ b/source/uwlab_rl/docs/CHANGELOG.rst @@ -7,8 +7,8 @@ Changelog Changed ^^^^^^^ -* Ported to rsl-rl 5.x: explicit actor/critic model configs, gSDE as a distribution config, - and the runner export API. Requires Isaac Lab 3.0. +* Ported to rsl-rl 5.x: explicit actor/critic model configs and the runner export API; the JIT + exporter supports heteroscedastic Gaussian actors. Requires Isaac Lab 3.0. 0.1.3 (2025-11-09) diff --git a/source/uwlab_rl/setup.py b/source/uwlab_rl/setup.py index d592c82a..a152db2c 100644 --- a/source/uwlab_rl/setup.py +++ b/source/uwlab_rl/setup.py @@ -30,13 +30,12 @@ # Extra dependencies for RL agents # Pinned to a commit, not a branch: an unpinned git dependency makes a rebuild # silently install a different API than the one this code was written against. -# Must be a commit on UW-Lab/rsl_rl that carries both the rsl-rl >= 5.0 API that -# Isaac Lab 3.0's isaaclab_rl requires and the gSDE distribution -# (GSDEGaussianDistribution) -- the vendor/leggedrobotics mirror has the API but -# not gSDE. Bump together with the Isaac Lab commit pinned in uwlab.sh. -# TODO(port): point back at UW-Lab/rsl_rl once port_rsl_rl_5 is merged there. +# Must be a commit on UW-Lab/rsl_rl with the rsl-rl >= 5.0 API that Isaac Lab 3.0's +# isaaclab_rl requires, including HeteroscedasticGaussianDistribution (rsl-rl 5.3). +# Bump together with the Isaac Lab commit pinned in uwlab.sh. +# TODO(port): point back at UW-Lab/rsl_rl once UW-Lab/rsl_rl#6 is merged there. RSL_RL_REPO = "https://github.com/JTran-UW/rsl_rl.git" -RSL_RL_COMMIT = "f2c944d524f853e906ce493540cfc76e54cc50ea" # port_rsl_rl_5 +RSL_RL_COMMIT = "16012ab06ac24ca6a56e75e77cfb60552e1ad51a" # bump_rsl_rl_5_3 (UW-Lab/rsl_rl#6) EXTRAS_REQUIRE = { "rsl-rl": [ f"rsl-rl-lib @ git+{RSL_RL_REPO}@{RSL_RL_COMMIT}", diff --git a/source/uwlab_rl/uwlab_rl/rsl_rl/__init__.py b/source/uwlab_rl/uwlab_rl/rsl_rl/__init__.py index b4efed44..6a185904 100644 --- a/source/uwlab_rl/uwlab_rl/rsl_rl/__init__.py +++ b/source/uwlab_rl/uwlab_rl/rsl_rl/__init__.py @@ -3,10 +3,4 @@ # # SPDX-License-Identifier: BSD-3-Clause -from .rl_cfg import ( - BehaviorCloningCfg, - GsdeDistributionCfg, - OffPolicyAlgorithmCfg, - RslRlFancyPpoAlgorithmCfg, - RslRlGsdePpoAlgorithmCfg, -) +from .rl_cfg import BehaviorCloningCfg, OffPolicyAlgorithmCfg, RslRlFancyPpoAlgorithmCfg diff --git a/source/uwlab_rl/uwlab_rl/rsl_rl/exporter.py b/source/uwlab_rl/uwlab_rl/rsl_rl/exporter.py index 2f544759..1e3855ec 100644 --- a/source/uwlab_rl/uwlab_rl/rsl_rl/exporter.py +++ b/source/uwlab_rl/uwlab_rl/rsl_rl/exporter.py @@ -7,9 +7,9 @@ rsl-rl's own ``OnPolicyRunner.export_policy_to_jit`` exports the mean action only. Demo collection (``scripts_v2/tools/collect_demos.py``) samples from the expert, so the exported module also needs -``compute_distribution(obs) -> (mean, std)``. The distribution's standard deviation is evaluated once at -export time through the distribution's own code path, so gSDE (state-dependent std), log-std and scalar-std -Gaussians all export exactly. +``compute_distribution(obs) -> (mean, std)``. Fixed-std Gaussians have their std evaluated once at export +time; heteroscedastic Gaussians (std predicted by the MLP next to the mean) and gSDE compute it per observation +with the same clamping as the distribution, so all of them export exactly. """ from __future__ import annotations @@ -19,6 +19,8 @@ import torch from torch import nn +from rsl_rl.modules import HeteroscedasticGaussianDistribution + def export_policy_as_jit(actor: nn.Module, path: str, filename: str = "policy.pt") -> None: """Export an rsl-rl ``MLPModel`` actor into a TorchScript file with ``forward`` and ``compute_distribution``. @@ -45,22 +47,33 @@ def __init__(self, actor: nn.Module) -> None: self.actor_features = nn.Sequential(*layers[:-1]) self.actor_final = layers[-1] self.epsilon = 1e-6 + self.heteroscedastic = False + self.gsde = False + self.log_std = False + self.std_min, self.std_max = 0.0, 0.0 + self.log_std_min, self.log_std_max = 0.0, 0.0 dist = actor.distribution with torch.no_grad(): if dist is None: - self.state_dependent = False + self.register_buffer("std", torch.ones(1)) + self.register_buffer("std_matrix", torch.ones(1, 1)) + elif isinstance(dist, HeteroscedasticGaussianDistribution): + # The MLP outputs [..., 2, num_actions]: mean, then (log-)std, clamped like ``dist.update``. + self.heteroscedastic = True + self.log_std = dist.std_type == "log" + self.std_min, self.std_max = float(dist.std_range[0]), float(dist.std_range[1]) + self.log_std_min, self.log_std_max = float(dist.log_std_range[0]), float(dist.log_std_range[1]) self.register_buffer("std", torch.ones(1)) self.register_buffer("std_matrix", torch.ones(1, 1)) elif hasattr(dist, "_get_std") and getattr(dist, "requires_latent_sde", False): # gSDE: marginal std = sqrt(phi(s)^2 @ std_matrix^2), std_matrix is (latent_dim, num_actions) # after the distribution's own clamp / full_std / expln handling. - self.state_dependent = True + self.gsde = True self.register_buffer("std", torch.ones(1)) self.register_buffer("std_matrix", dist._get_std().detach().clone()) else: # Gaussian: evaluate the clamped std once from the distribution's parameterization. - self.state_dependent = False if getattr(dist, "std_type", "scalar") == "log": std = torch.exp(dist.log_std_param.clamp(dist.log_std_range[0], dist.log_std_range[1])) else: @@ -69,15 +82,26 @@ def __init__(self, actor: nn.Module) -> None: self.register_buffer("std_matrix", torch.ones(1, 1)) def forward(self, x: torch.Tensor) -> torch.Tensor: - return self.actor_final(self.actor_features(self.normalizer(x))) + out = self.actor_final(self.actor_features(self.normalizer(x))) + if self.heteroscedastic: + return out[..., 0, :] + return out @torch.jit.export def compute_distribution(self, x: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]: features = self.actor_features(self.normalizer(x)) - mean = self.actor_final(features) - if self.state_dependent: + out = self.actor_final(features) + if self.heteroscedastic: + mean = out[..., 0, :] + if self.log_std: + std = torch.exp(out[..., 1, :].clamp(self.log_std_min, self.log_std_max)) + else: + std = out[..., 1, :].clamp(self.std_min, self.std_max) + elif self.gsde: + mean = out variance = torch.mm(features**2, self.std_matrix**2) std = torch.sqrt(variance + self.epsilon) else: + mean = out std = self.std.expand_as(mean) return mean, std diff --git a/source/uwlab_rl/uwlab_rl/rsl_rl/rl_cfg.py b/source/uwlab_rl/uwlab_rl/rsl_rl/rl_cfg.py index af402f4b..795d50a5 100644 --- a/source/uwlab_rl/uwlab_rl/rsl_rl/rl_cfg.py +++ b/source/uwlab_rl/uwlab_rl/rsl_rl/rl_cfg.py @@ -73,38 +73,3 @@ class RslRlFancyPpoAlgorithmCfg(RslRlPpoAlgorithmCfg): offline_algorithm_cfg: OffPolicyAlgorithmCfg | None = None """The configuration for the offline algorithms.""" - - -@configclass -class GsdeDistributionCfg(RslRlMLPModelCfg.DistributionCfg): - """Configuration for rsl_rl's ``GSDEGaussianDistribution`` (generalized state-dependent exploration). - - A separate cfg class because ``GaussianDistributionCfg`` carries ``std_type``, which the gSDE - constructor does not accept (every field here is forwarded as a constructor kwarg). - """ - - class_name: str = "rsl_rl.modules.distribution:GSDEGaussianDistribution" - - init_std: float = MISSING - """Initial standard deviation (fills every entry of the gSDE log-std matrix).""" - - full_std: bool = True - """Learn a full ``(latent_dim, output_dim)`` log-std matrix instead of one row broadcast over the latent.""" - - learn_features: bool = False - """Let gSDE gradients flow into the policy backbone through the penultimate features.""" - - use_expln: bool = False - """Use the ``expln`` std parameterization instead of ``exp``.""" - - -@configclass -class RslRlGsdePpoAlgorithmCfg(RslRlPpoAlgorithmCfg): - """PPO configuration with rsl_rl's gSDE resampling knob.""" - - sde_sample_freq: int = -1 - """Re-sample the per-env gSDE exploration matrices every this many env steps during a rollout. - - ``-1`` keeps them fixed for the whole rollout (smooth, time-correlated noise). ``1`` draws fresh - noise every step, i.e. exploration independent across steps and environments. - """ From 75c1590dc1e65dfc1c351ab5b20e38b07671545c Mon Sep 17 00:00:00 2001 From: Joshua Tran Date: Fri, 25 Sep 2026 13:04:56 -0700 Subject: [PATCH 05/27] Regenerate OmniReset training curves from the Isaac Lab 3.0 runs 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) Claude-Session: https://claude.ai/code/session_019ogU9ju7PGwhFwKH11djAC --- .../omnireset/cube_success_rate_seeds.jpg | Bin 22201 -> 33530 bytes .../cube_success_rate_seeds_walltime.jpg | Bin 21640 -> 33959 bytes .../omnireset/cupcake_success_rate_seeds.jpg | Bin 21653 -> 36250 bytes .../cupcake_success_rate_seeds_walltime.jpg | Bin 21573 -> 36823 bytes .../omnireset/drawer_success_rate_seeds.jpg | Bin 25939 -> 37117 bytes .../drawer_success_rate_seeds_walltime.jpg | Bin 25357 -> 37036 bytes .../omnireset/leg_success_rate_seeds.jpg | Bin 25901 -> 39114 bytes .../leg_success_rate_seeds_walltime.jpg | Bin 25586 -> 39703 bytes .../omnireset/peg_success_rate_seeds.jpg | Bin 23914 -> 33361 bytes .../peg_success_rate_seeds_walltime.jpg | Bin 23937 -> 32883 bytes .../rectangle_success_rate_seeds.jpg | Bin 19582 -> 32406 bytes .../rectangle_success_rate_seeds_walltime.jpg | Bin 20125 -> 33091 bytes 12 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/source/_static/publications/omnireset/cube_success_rate_seeds.jpg b/docs/source/_static/publications/omnireset/cube_success_rate_seeds.jpg index 372346cd9173133db4ebc75914c113603252cbbf..2bb89c40a973d6402e6c76f7a0f5758e44220611 100644 GIT binary patch literal 33530 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 diff --git a/docs/source/_static/publications/omnireset/cube_success_rate_seeds_walltime.jpg b/docs/source/_static/publications/omnireset/cube_success_rate_seeds_walltime.jpg index a225c6606a594cd03a84d0287189f50dd30a83dd..559e97661a67e4502166f69f3903c03856683a28 100644 GIT binary patch literal 33959 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 DNnyBp literal 21653 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 X@dq6H-yj743CjBaZ}$}XHuL`g-yixO literal 21573 zcmdsf1z22Jwr=4X2n2Tm1Si3rf)L!@2~fDZ22F4a5Fofa1;I4|f)o&(q6meA06_x; z5B@4M-Tk_I=FUvdo7?xjSA6^1M|Pb$Ys*^y`q$dre!N`<+*OoSkOd$iAptBAe}LP0 zfHdGP4lW)p_FcR?c!UIZ?~$=kkdcs(aWgPcvxxADiwW}z2};Tvt4co6lMxhBchb;% zYGGq*BcbBv=W6L|Y-I!b@em{eLP9cPvWFBD4?&NG9)tey=e8R_fQhV%LV|*HAAn4N zghGIH+XtWp0FclSZ~NngfBGOHqoAUpV_;%o;~*L|-31^cp`ak6qM)Inq9R%cBJKlF z3D5}XxuwwWX_#Z&cO&8nO)9`-cwE;*tU39Ok=MdK3=5ltl#HB$=>anfD;pobfS{1D zi1ZT~Svh$HMJ;U|T|IpRLy)DFwT-Qvy@#ilw~w!%|MM5&5s^{RG07>fQq$63XJi%@ z6_=Ejl~+{OH#9aix3spkzwhnqAAk%F4Npx&XJE4*=ir}LR@c6)Z)|RD9~>SXpPZh3 zKfm}P7ZL#FuVVco+3(~cK*)uRii(1Y@k1^oWFJI9AwWf==SC-#(!elxyLX=_6qD$2 zQbAo076Y&5H)0F-No*2EzRyetKScYBWdE9AVgHt7zX1{oY*ombcEj&-lfUCN=W0#`TML5SPxgd5Z=ALm%tY42^R-C325 zkN2Cgp-y(zfhE5&?vH0B)BKCPx;{!cjTsYG>1e9ru9AcKcPQ8&+yeUAC30NNI^M-I zQEMaj1-jy~8Rd8=H`c|R1~e-9b+{+5aoi;L#h`>Kd=HV&41$0Lt z7c?EHM*Dbj=0h3m^p}yzr6fXYWss&ur3o?)-{&XxfM=!1cd5xBWC;La?5j+Wcw6N zHko*#poi{IWChW)HG;}BS4NfkG64>DC9kc<7Uz4GUk1lQ^`ry9AMF}?T!P)-j6OP- z((T!uB}3Vfq~O!Fℜ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 NW6A#yzV~C|{{ZER?l=Gd literal 25939 zcmc$`1z40@*Ec>i0)ik&mw=RX=YU8{%+RegjC6yvh=d>@AvJUl-61I54N4>3-Sr>N zIX?drKJRfO~RMvQhv91O$LF{2$eu2E;b(Sz57HABt#D$5OL7ZkuwN#i3kgD@$-qv=qidm)sW=lSGEFa7#NzF zn~5sex!D@K>YA7t-97{X7Y~n!fQXHRgw5y){}ZEs{CCp?z(q$?M0$XP@DPBAi-3fS zaMJ>y1OO0F;H$k|@Na(zh)BpNsA%YSFfic*D((Rg5s;7&k&#ePkdfh|J>lO2ka1D) zs5!(@?}J{TJ+#B;^o>YGr+HHHnE*VvOUq?w?{^2|0U;4F3Ed-l21X`s9$r3v0YQnU zl2Xz#vT`b_YU&!ATG~d&CZ=ZQ7M2cPkvv>(KHK+8Q(w|7h0FO>Z~!u;rBNLY4^Ns)`~+cbZnAdw#;4K0mkAZ zd>zypkKg`iIM(gtSaOwPdcXXAbC^9U8fYvnyrot+W_T)do#^@VQqi#{`fO`&48T}g z=}TdSbW1+OnV~ZZ_0>!**>hv8(YF;4;tE;EuPeQa@-+(#%}8O3&yVmC+=F|n_E2M; zEF7HfesyK>9;<94^~N&3#y=V>Umh9|sac^}Hx; zkTpRPLT6GMxW^^y@Ll2I&^|;bWHij2&@s3R{`k|+>-_i#`I5$sLELe3{;rpIG$W=kqn-DJ4(S+ z)wus%i4Y0pLp*j$_N!L9FNk(+oJ7Vhg%ds)%v|8{Ll~1d`O$YtYT|Exz2PZn_~hQt zuDhbZ^5q_yyTl{+{bT^RpW#49+`i=!miO+1Mygrg$6R0RPMj8<4Pw?hN zNs}3ea3H7>qj=di8qe+o%dvs33jDE0i-FtU=4_dS(-_4cRehL#f?Mh7alp&&g2e1U` z7WwmpOoJEH2&)iP{UmW;5UL2Mz~sVao0g%BsCr)R36DMWo(GCNw)70>c|6TBQ)piqgIf_j4FQ>iU8C#^x<7i ztDX$U-6(U7-;o_=*)-_vL{)Bj57?=j@eyKTPS|aHyUpW~-_5*X{APV*zP>D4crLu@ zV)WysPO8onH{LortvXW^4H@n>Dg%;raMK=r5cN>GT3vYzu_+XF>Yf(uqFKbIlAYr2 zN{|&#zUy$GQe}a@@n9Zjp0jYWP}m_tounc3f%%h_j_aWiFS|tY#*;CQ^RW&pAMp;6 zRRr_2U;x8EZ3QqJegCJSvUXNZkByD%IkweS$RfoEGV%R1BPBbqQ{Q;5A{?sUoekmM zkk3su-!_(az9YQXTFW1|_lBoBv@m#8f*H$C5LXO4EtmoD-!vru)7KjmWoa^tOw5rj z#|SYA3s(01T4nz7L(r{Qyl12*mNG{deU0x@#2k}p$uN*3I1043$zf}WYRZjpIhZcI;n?vNP~ z7shx9>3lSb`948x{C1howHaTu@sqx>pJ1 z2@6kc;bhs0HHKB$=g+&*H12s-%qYDuvtK=V@c!B0Ra+!`E8Iq??n_0c%Hrw~Jv)E-H-7Re7~CwY|#(Xj1(A0hg5y5 zhkl^$TA^a!mWDZwqVz_?CZ)!C2YLn*Q{hWes&sdxj8+n(Fe_}gU~7>by55$T!C+l8 z^33qsG)g2{bvzuJALKDV>{WzpHuYS;tn0eWCYn>fYKzL&duCcQyk#0)TmL?v<5DJD zJnO5@;}9DYD~vAQ>M%Oxg@HK-F*58RBg!63I2>jDr(8(pJajTi@kh;Vv-&;)Ih0 zmC@o)D-R^=uDh-~H1`8>ma?Yv+YnAR&c}1q*f!sBx0T!g%qH9{U6{_8eLTh5wd=$v zTr7BEpbHIZM{~inQ!m_N?dKvwy_;Mw(Q}1K@pLV<561?*TS`ul!HtY(LHZ(rOA&gl zqtTgjh}&btUk(q9?uPee1QVscmBg2c@bw8!!Rhkh-+2R)a)bn7SsLp^BH?zNX*AfJ z=3h&`lfJIzF{mi3EDLS7u)#uClxy)77p*3sEs+*hz#lA#C~l?+^%H3YxP=G890eTX zW^Mp_wdIL1)A$YnNXh&Y5b5@PolohhGB<#RN&%xVmn@C5;7wq0x%WAW<_%y@&^y3n zy+#7W`d_ra7fQbLr7ATm^y0Dw`-aSFBzIJsGQFDuOPUMT2&$3WJg&o_Z{RtF77 z+wAYWm6Y38No9vUPG3J8Sy(Z5+dz=Pz!}F-Mw?vxToVX+_f)$Th7whCSBX!L$end} zIGw^BQ`+WZc)TBTEzSe#MCYv>EDjR)`YE7t4c}#B6jYjP1FmYq70r!Uh;{SGmfnaa zxNf7k0KW-Z#P$k$W`9iF+1CIjGxZF#+7XAjMr!t}Ibq?2A#RcLzGl4v)DtM6}R0x?CesC)x(f18d8?TXYP zm0i(VuJDsp+3wi$>ppzsBfRltu$$NayXIy@b1B19N)JjPrLLV;yt{;58mU`FzL4g= zOEX;#E4KSKX4EOAS?5jEsOSv>nTcGm0zRWc!W-xo_r&T&By~{y{Q~mu!3&|XM zy$wmQbeXZSfiK1a4rDJ}C|^0PTk;KapV1%8w0+C!d({>oZ?+K(_|8*VRel;o-dFmu z#F#=wa2vG0kX>eW&}(t(2Vs%^QX6}W6LTR)T>pBq8u89nKV_y9--EFe(3uOnB&XBl zLsZI$w285qAt37ndWvG5ky!dZKEmQ&tBp&V1bJJX36?q6VuI2P<9R^m`AYn1MID4? zLUn$uXs?uvw2~_CosEMxYJKS*BhPr6>)uxxM`I( zlou!n_+GA{Nd9C}r@TR4&6i5lWGh36kBx@bC^;ic1j4Y6YhHQ0H=$=yTaU2&5TYxC zrn^G!O*Wp{Y-VM1=MAQ-;oGC9VtL*OAjwRNfu2XfUqk6(FruhsaL|juGDny=;yqAIkBl% zQGmMW7}v%Z#&J@6n3W{h(sMw{?C{tp&;f7zxx1fTFTj>}ZRHhHb=Qvh;+Z0+s#~xk zP1<{)t<3mJyWLJi{N{`D$||4FDD|Kx4snBsx&8WR_>+2~UA^D7 z9&gQ=5}5|mfu%p80NfNpZKqbfo}P~;6}Zu*Mvf38^y__gp=`R)$a1w3Zp6_ng0A@9 zn|y>m)le<^HFs8SI3uo?E+D^4(WRV8=b%*wF7QN1DfobLkR$;AA2tV3A-AkS=vdgXpxW>? zWYA)l`{+WoF>z-;F4La`Ap3`sjX1P!wwnU!$3mgn3@~J3(Q^3WB?13+FC#;)z;f@` zr?YqYEI0|-wmG!Jp5)%q?==_Vu)ifc=W?-qCgVWq1e=NCVdTaMGWeCmmhIeg99ZlB@SRB8I-Eb9N%siGc2D&{Fv!Od>`~a zLF6_8O%5m4wW{EI#a_P<55oQ1nF?mNt{xZ8dmx-w6JTA_4O8)ZONljno3YI8N zT=ic2FGiI7vK0>AyD{mn2G_=)1*Sj8x?(aom493;URjSVm>u151yMkXPB^=rbX(YjaCWl{AqJ$Hg1M#^G8 zcBR@h_h9pqGV|$j`ry@P>*XvZ7_n%DqWo#f2Wjq-ZILqZ5v!W3b-T{);Qoz!8;(~f z2duvcjMi3xHbZBG#YV19G?vLT3MhN_*8Iu|aQ`l)K}+2))2Zq`neM|K4NrM)`Cw$} z-6s!5UT-%|zBL7ntm#7ftgNtK=8|-}rz$f@w6JZ=4~*7;wrD%DRTLUtQUbfetrY6$ zy<0L8zQSb{zUL)Nd#oRckf$a4)2**nzt)2?yOUxu*u6t&&Vs$hM4(eQfR0xM6Tgft z?Q1ZcUEh9T&8ZXzjMXl9rIGb;X$AS5fp#FTwT||BnN{8T7yjyg+k02MX5xyl`l_UV zLoS)4m`VO|YT&M$nainH`PAl?*$GZWS$gMDE}FPjyjMp2yXyGK4>tPf$2?hr7;=^x z^4ag>A$IV%CFN%s7NV=%@|7)xyeIH4<52KHV*jkY_Th9TAdKtrcIH3giIyvQ6K9g zMx!w8M0vV2S$<&>-%T=1uM9k>c4Q6=-Wd(#dbl5a)%Gw74~RVH;gXw^u{*HlSm%gs zDp4xl@wmKQaeV?RD z3w|O-%rjboIOLcUnprL8RX)6I^kQYECNntvo5HmQbHouX7uAl8Y5x>hK>#Fe>5L+( zy|3NL_LMN_!8iAvbi5+!vZLHwhVycFzLVl*>Z@&AnezdO)V{6up^)xw4~F{5k6@ln z%>|%bXXPG2!1OjvEC!U3_PN7MK)}#t{|*{6bHh8&efD{~ZHuP@OP!BWpx_GM2yM0Q z!*<|1u$4(m-v)w*nvhEoJ@**7i0N6wvuX48rx0Xi4qwoj>vPOkHFN56IWR;>Z{^*d{_b{;km zA~$0Ig^#_0J@0vCIIRuchCotWByZJW##=r8juqK*)sXTks;E<(joz2JnWe=y0QYmv zvFbf9s13E0tUQin9+zv{@eX3MV(g36&6@s0m=%r0o4(1D^jAeaVeTa-Fv+R_(M?Mr zhD|Jl(74>}VS7teAO(1GC3V^d$W%t*TOh;5Tf}~d+3Lhy0evhe>Ddei)83~~r^h+h z2_J7YQ*!NieJDAVW9Vx#Vq90ge-^*Cnx{B`fnDHAEH6lw-m$wEl4Vh{Jf9|M^lqql<)8op(|8tR8rH28v-N&|FJ zdTiSy(WbnT;+aH=NUx2K=Hx^h9z%qxGX@}CvbrG=uS^QVverLGvmV$)M7l&d56TM4 z*8?WeRvvrQOyZeQLgm&2SjeXRr#J24k<;E?ACBf@ooH+1&^VKmrW?SmV$7KFGK@o#dGw@X^d zE+p~zkB@7$2`v)099CgBnki& ztZiKS7{ncBo5u-Br7eH7kXIfbkfGy0Ma4W~2JI@--cW9Q_9O&ZX)tIpIC1Uxf%COh zhostifA~0$I_JuVPsn&1@8R&MzLdfTJFApO&+zzONr!XSR0im7&#ZxEnRnq=&HE_z zO2VyPYN57w*5dWhX^ zr$*~o1W65W8`2*cxf1M3e`3zp9MqwYT)T^Pp7EM1E=jRe_2^kKb)lO) z&bt>H*|K*!M&6gn^F4tDnJpGC#?5)xZcxgyFW2^bCjBbb23q!{X^J1{dINBQ=UwEc z%S-)+aLGV&JI@bJO*vBRkM;qT3nFSdRZ`QZJ19~+0y|z(wAKv1w+vxsEH_93# zPWnJ|LHGH2RPgG2xlB@mKhzS6@8HbX=_qMu1ZcY-G0VekmtlmSqOzJx`|nb4Ofj$* z6zRqTGIxlP@7anU5jY1Un1hBK4~JjIOmnrI$+$NlVcRGCSYuxwvhye$KF>9b6= z!{v-Zb5{34rL2%6#?=BAe2^aP&n85XBLMbhiqFrnA&OPK4Hl0*cg z2TV9^A3Yo^WBQpL!u&^uvUgNJG!P!0yiQ8b(bJc(sOqz=t5x^BT)uWH^?xKvqE3+{ zmNoHB-iu-(zpQhB&-3Fv2v2Vs`>5#gHICxW7&q*0C&9`a^I$; zYN;!k{8Rc+Qh}xS#86>uw!rhPi?e%IqiD!pJXKk1gBH7w?HH8N04kFznXIbf*{d;? zLM_U9s2hH=z#tf%axj4uAR7dp?zEoQT?v}fSr^nBTqCW8ws;@qrx)N5X~}zJr8Q+P zN>AZCi8R9aw^jMb=ZSdN9?rM#u##sO9r4tu9>$6GX6ZCf-@~Yp7!6k3gv-J$dim!E zNI!n_-jRS@MiArKJ$Qs9^W`V}Lxsm70v9Tl@BM-qvJfQkmH$?I=7w0*z+5>>Ka?IO zJRh#2dt@fGFX3{EA2}U@ml$K6m6?HrUy;dgFa1Gb8qRWU^q)yJ6XU1#8$dmiw%=Z* zP8oK3gr*@dfV$ltvu@Q&r|12ysJ_5*PFsKebU|o<)xt%v2UNQ(O9vPIAjr(-W6%*# zN<^L+`IULpPu+ z(fB7wSh(?kmyk*x3Lll#{{d6}cbS8%;!xqKAcKk`eUg0xa8#}6m!J8Ny<$^$eMiX{ z&gDYCCqIz`#9+pP&#Gl)2xGo?9*5vt(Ihg3MncGKdas&f2J17sIbM9;9TqViP~-z#b7@tb0l;=W4wg;uRy?4{I!}Sqcro`8@Rrlonf1#R_~;;$ok* zYw>uF=RK^zh#cH;_T1^ z8Gv6t&f#>`S{9igPENFwU;$E$h6*&~U5q<#ZIF!k-?eUkXB-&YFC8A1%KAMBX2>P_ z^FG|(w{I!@n&g4sH2uu{{rNK{MmI-_vs_D>o`tXKMDGk^of|pRYv@?;)fa#2HQ}xs zSNB=vZh6s(s%g&ZV2LcNF=c(+wrF#4#+bMJab^2<=OaybUu_PmF!mG#-wA)VU@!l* z$QwYuO{Qo9RTu7-)~JTRzEropkavw{eE7LR@FwgWRxhP;WE4F8`d%DQU?xuaX@Y9C z@Y}AoMxW(uj2iQ{s}PS$o1sC;m!^M9rv5=zj)3Yv4^7haO&!)+WkJmyEbEZu!U}3i z==2Q$8~iPDP?BIk=4Xt9e})hX+;KW3%n5rq8^jNj>#n?7u5rAIP?KKL{=g;ZX%GkI zlaQBjCs8sICv13rs&w*RUyt(4#&!$ZR>``w|I(W7dhzA#`+^+|$t82%g^Q-Dm0tc= zbdILI_#koWzawA&WX%79EE)&mmK>*1zip+RUGEi%DEW8$fbo38ms_uIgd8cbWEMH#G8A-PGXtaL0|v=Y7(3qx^cstP2%MS(Ddbjigv-oYDyGdoZ&_51M+Ac*uSaH${%TIikmQmpQ| zR}gs{ScC>*538=eLeW>SsdEaiL<-KarsN8vZ5w z-|i9?be5)$oFeU$;W}B>g*N;3lyaAY(Trz{pXwNRi{L5`u z_8z@9Q-P3(0oeKR%R%BPw}R^X-G5m=OXmjQwJ31T0JpMZyF>tW)ZB|30D;B8(SDi* z$I-&MhPc9Jum@FIFeBd2==q;~_A{jg;{iJP5q%y6zhSPkxB-kzNz&7KNux!KsKTpx zesdfD*gOU+9p!>Yq(8P7=Rz=m__NT};8?M=U}pQD!5LJUc~m9Q(FDscaF^3AsRlYz zb+11`U8AlrB;n>{C%?))e{@Fi-Q~#}sZ~$LH~|L*=@OVEKA7*8n*ygm&jtCcjYYBC z!+xFtb<}{1X&X)Gb%LAsNk2iOqNKd-|D~OD@Dk#@3$Wru$6955_34v_z?GdIoxLdQ z9@rvQ`D^p?ou@em*IQcJ53!escZPff8ZaPkY%d=l?ruG_EaJ3v^~bnFKZP^YAXg1B z!23G2?#w$wK78G`KgCdOQEZ-rNEMSRloi3Xs($vX1k?M1Icf7J>!-8FhSU{{q zleoyAEX(Q^+P!42p7x#HO}VQB#nX}SU@3S|RTcTfjVeMA{u1Hiu9=21Jc5g@Sja&Fb#> zrScXm&E@&!XNBmO>?n}GAFZMX@}YfIt-$jxbdM=cE%UNDV1grqpZQo7JwF+~{4>a@dMHLS-5Vh_mODycd$J3{G_ReqCAhL0CgDC>JO>OOrt@Z{cNkQS z2Q=?O`|obv01n2MCXZm}&Aax|1BOPU--0fCtyN+cV*cmR-48tb`~I)kw)j%Zi6A)v z>z#S51L;*92dL{5Y=pYEeJyW~$t(;9cK-ep+`9wn+kz=D|39v&#f44YD1{Ycp_^rruH z4EN7%WXMjJI4_Z%ZtEk5|djs`-ytzt=qe4J2iV3i(R_rtHr`fT<0q(_b0@m zDXF-iiN_UL?Ms?Z8jeFp^NfvfbB?nI`16@j;LH(MJ+csnJ=(hg)L}vgM!UN9xX!#N z>P2&_4ye4fA$G9V-3d2$f|MgMZ^4ngcx^X#t6Fy|0_(tPkuPvR1Gk?4ZGqB%SHSd# z@8R$fG~%C<@fq$2R6}pkAan04Nrw#S?^~)6-V;Kk?sw1k!>5E0=yQ%visZ6BfbCW9 zAEw}N?RsUV>hxO1^19q#FMCGV=cKMiS6tm~H<@S#b9dr1M0%fprjqkxE`;!j1VwmC z=av9QpC9J;-}PXM59QV=vrz$7A$Bmv#S-Sjp2|14zx0jd59mo$VH+?FbbsG=!UgRIjJ zCOE}$50aq)j%p#_ljN*;+on@E-Xt$kvru*A2y_CY0rs}CJZ)u0Fljq}k7?PoU{2et zsppPGQiaq`Te1~jO{ILxs~UMZTJD(@&tP+fx7E4-tFX@KIO`t-Wu4xmRYOn^JWd)@ zOUms$<7jt$?7cp|rj%8L!8od{9{j`uZg$iWevtNCkEm`Ma&VR9eYVDodze3Nf5scx zeKqnZ-+a(b+fnR@1_2TK;dJ_Y)l;Z3V9lnwOHR-xsFy(H!65ItCo`lxfZ|3>$!lMyZpi zl8M#L^(6vkxI(W@eFUy(l!qUM$g2;|j6VG2N^QUoWqrojjm;^`zmmmVQ-~wIyIst~ zfSq@|JDEADkF0@`5gV2~g|YK5UH)hKp{fE8pW1VCEg5U!Xv?y=#T!E+Y|%fHg^uOr zPvIb!Qzvj>3$u(2S_)$Vj0B!=nJij2x6}ZRn zSRg&wSdt1l3mq5NBthHZ@ies2I`-04(cz5gnf>3u9=8baCrHlWnyb9Fc5uN%CUi(g zmv)(oQx|K|sL^1k7Ncn|daDhZDPde7#{KdZ6+l3T=(iMnYw9#_O{F^8>uXmVQ+Oa#r8o<-u0xhG8bE~H|J)_@ zCe*!-i?V0i2zpR*BMR_)W@?XnR1d71biN!^3cKL7@DZbP;c9#3B-W`l1u+9%5jIT3rEUwCd*D-2<>|Dy z)`cI6t6gE2?W7qX|2FppZiJCReS_~-mXj*=vNMbMI{J_8bhd0_IFkAl*=4D0g)k1I zYh+&rj8=1|w=YWpsH$mb4pQz=R`8Z`TbUlH#5}DV+r$Kz@ zN9U>)gqQVR1Oc9D^@AX~pCX9TBd+DyZ%sn?sV@c9GfgC}BMKF$mJC4@-YQSHa!d7k z<$gGX)a#YEc9fJ7n@ok0 z%!t>AbAn^}5s>7=CqK=z{^=aQkp6n^*ehrzc8hP`f8fbKdZuc3LLK*%FKzn zau_4{#J~m|jHbva2T5B0Imkyq+4?duQQvz>6YikqXig$zHDu-y*$Y*P{UvH{3@r)>kMfTf3YZka=CwY!GG)iuSn$2uOV}apk1ep>KlgB-8x9%6HaH|kadxSeYEDsSzGtJsB(r*AoI@9@x zH-M8Fw$kuxH!*_){zAWmZ}`XJaHsZfGDZIfZyLZSzMcHGF^LbTI#I1MvOj?*@o0XQ zfcZyKcL((OglpYWqKUf$I2!!Lpe;Q83c~=C_J{322bI}g$K~eL8*GGsvTQ|8fomND zGpTCC_V!pCFM`-K;~@czrogVO}0dtJN;U;4`Q~ZQTFN2D)Tm>B+ z3ym23r$4gA2);HKJ0yC1mwUb{2g_9(ND^1u4f*{y0EMUCCmpRe!x7*qIJHmzUGf(m z)BMAdrr(W+9}0%SP01s4cseiR#ZQD832uxNuW~DHF}TW)SmNLH2t{A`h9cRH3?q%+ z#wR8+6z~Vp9P>iXE76XPP4H}n-HYh5Csz`bA-)A zCuNIs$J*=Z=4jAh)byc1RJh*2I^nw|Gx9@F7#S@wJ70w`!VjR5?aI8K_;A$IUv#i; z16L}VKY77VbzpiZhNp^b%;Nr61y#!qR}jm@DzYlLMBO@^6vY2@`>XMW%fs(C^&f#z z1bC^714ULcoR!u&BI|NrNJgU$88_i+OL)|ryWYRF7K?Tj>h(&kt9KmR$|&&Ky(|CJ z>6aimKZ`9o_vKN5w<5EB>66XzG>T%QBbepOc)8BhD7oU6A%QPBojmUlqQDJd^Y057 zPxxF!D~z;^7^}+Bt{j#crwP1>o=Sv21E3-L^7J!1N(>U9q6h{vlH3aGmmk|!TCczt zHGk38KcfKsh;%*%dwvS5n$()WE}P1sxr*q#{%{-eWoAkodveaOZMUJVX)s3IEulI@ zgvvbo!NdP_|6dpnWLk%Y^rc#kCSYuvnqsv zm7NcIu&^`^^IUjX-U%>H#OV2S=9GYXGzFB?Gt{toH1r5#_nbw2c3i*zs0%{u)32 z5SQg6Js_xZk5;=c$+GIB&u7|4AY!t`drB115B#$?Naz}pYCmJ;I|xV4RPG!JO!^2A zudPCI(|q{16z|$!XtTMbSByce7blylIMQm+0$(OV;pW0X#3&p3aW1ADe#RO z)Z4=yKx7qe0<1%!-nsK6+qN;#y%E`vK@I+j_fYBl3-1E%^tcpK!l@IU67dfr%ZtVv zc<9yz%hm*Bi$j__4ULe_dwD36L^M?}tr3_}t>)OXIkHf->IHO>i+ICDYpX*_xR2)j zqX*5ZD=^pV!^eseBO=+hKI-LdvCn(9Et-fk&NIM(kt!|5p}QUZa9xzH{*$8NyQdsg zg=j#Sqmxnzc-0Sn82Z2B@o%~MUnuTx3DCdq^`$w^IM(gJs!9iP`D?u|-g?(TK0#d< zY959H7%dnf#svjbdD<1tI^W0>JE_tAr$$49B4-{%N@1k96vVySQrs7qc5Zqd*M8El zmd+G;!R%}>%pwUZ&1tjiJQA(2e-A)K6PFjaQ&)cq4z2gzQ7!*ajs>Ry^%o%a+mR?i zzw6tI<5aVZT&qY^Ex$w)Y4NkM!_vnb++k1hLL)sifGH&-6%d$OV8?7-;5W3>_?#0a zkzOl4rLZrQthDIqY5s{`BI{fDs!`Q{#*Kfx=jbHD3@vHu1&9XQ#Il`?U!SFS$6jpQ z0A3AMW2Yr7bzdF9fw1}h()IZbV3u1K4W#hn+6`Wu>FK=_&x(|jb@tn}aEl_ z;E%=pzgQUDJ&V0geAA{n_dOeqjSvSV@!$NOV?VC{c5WLlJ$yMLVHbZ*$I@pv?x{Z?$!Aio$XRa#oYzAI$Fk+<%J9f91@rdS z>z0s{mkqCJ54PQNhiZq74GC#}X-n~BYDIjlJ-Q8F6sqrE031Oy41#Mhz)3ypyny?( zK2k}ML2fR(r`LL0PyKR@H}om)duwCLbM%uNfM~^lmJS`P^l30YLMZmkXwv*NyVkeB z_of!2ZbV0q-N$-WJaNIE@PZG5pO^3bz@Z$CW75|rhuOoVSH|8u-g3{-t$A=Bnuc%2 zf~~G;!>O)$D36P-`1Rp3R&?E9J}48DIn{SPdIQMDoV|cc;CT9l#&sf__s%%H+@{<- zU2G}Vj+s!SKKZV=QRFg&8OXq%%z&H#rKb)8<0JSFCmz9Svt3XQx@(7y`BkhjWKpj@ z#ixKpa*`jcD>@2Zl!xl-=ynSdYGrVb&f`f^@&_25qlU8}|vW}a=1ZKB=tI599 z7t*{B{fcO>_Qrgu0$Z3JtcWXoAJs%USkq|vDtvaiUyoB)mAJ5*y&B6$NH|e6p|-#% z$nf^l9JEe%;cK#oQ!d>w>!V;oNDHB@oN<_%KL#gnG;^{z@=333mc@{kyvyTppn2rF zI1PD%?UR6}#l3cTm<0oX$19j~(jy$t5Iy5klNC}w9RTi`eZp2sX@_Z#i4J1nO&4a2 zl}J)Nc^mC(^U6=rm53coBEQKk-Gv5Hg z(_7tX#j8`C`)Ei*KHQHpVssd2tHZlLE~rNUYg_Drf}Q0fi{aAp%Nog$Zyj$~PRSw( z9KNCu!wVmC{NH|%>)HqKaTX3J6?e9;XmPCWdz)bbxw;?_f0lw2>!v;pnn^mD6pX?3 z{fQaNgLU*lmU3mURrwlw7tbMEfrUu4Mmga8L&#gUhrU({BhI~?ZhTMRZ^tb9ekLX} zf@&9YKS)rIXNZa;0Ax)Jf34|a<-KX-Fb?jL$0g5PvakUFhP92v;rW5- z`*`}qWHTXcMiiW4NY-3iV_Csn>#arl6Xr{@AD3jb*q;Vo)gSg(xdURQ>O7_&PAu!* zAr|#kX!bw%SGb-U02LiDvS7f&P#Zr1L_}Yu)#dAU6Nh zt6lZYf@eLZ1LxL-_**WEQTCMDyjTn!^sj!^d5NP+H+Lo(+GnmvbICT`v z0|+h)^53*=7D|H=HpYAyKV^EojL@2Xm7ndmyiDX$tky^L2*)5+n9M;t{^^=XzM#QX zwGEA%nz}w(mlzVX$th=k*xJhKfsp(_88L~haU|7uDWj-}i13#rv5LhISyt0{Z^7?N z%`%^P+2AiCt`r|}BM9CA3Zkxd)>Oj$QVfnFy&JBW>;_akZlmn?{|bwKgh%lH@08zu z0F=KDK#qrWy!KUPDVjR8J`^4_TMFgJ z70hwU*`|l*7PL8!u^J)r$(x^1zu}|Y&CisNa6976RncMj0?B{(tlYVgu4b-7nq?z+ zxS~ql`~kNz0RJ>qM&qR=;5e5VB=x}M_K4}1Vv~Q>Zrq{^Fb76vP!n1F9eAXHpxc-2 z@uyE7Gw&-p?edb|9KdE34O`(`F4*lgx4mS&3mP5{L4j-7j z9oQsdO#uNwKo{r=m& z?FOJlc`-W#eP(kM0e_GEijkc@E#1Vvr67(XF5?^9CEUrhLkPjLmu$N?08ZGlyrg8Q z!5JI~g$@4J4;@EdOP_kjX}QqlxwuDXCg$T0@x?XU$}CurQdBF;P#js8@R*fXjXb>p zOf-HwF{R43MWI!e1-v19FS{zfT!CAH+-Zj)k2@8{iH&}BS60_^tF?7g`{jA;x0FiP zj4A6ErmsKE;YUw#M0XO4^t)TNyo?ca=h-Ts@J?WKGY*&_xc(kdCnVj2Ku<1`gH)P# zd=fFGJ1yqxuOpZq$xoYO4Mb#)!)+#ims4FAyduXJYQn*&8R1Nx-wAxQ?Y`8xQ2DYY92Mp;Op)m0NLZVh7 z8Z3r}G_|K5F(xy*@Vujm;JH1z$i|%_n&FDNkax-jh~I~(0)=9k4D6A@lzRBvMWbDs z2Rdz1zDaU^aC&Q^q;^Od0I>KY_Wq?v76G0f{YQ2IL%U)mMx9MqnR^r3)L=I?E<8hD zU$dYzoK$&rz}J0>5Wl_%2*rKxK@vb6gsskl_En|$QLIEP1??!PyE}84Z9BCaXD=7E zq;LlDIObk65xFUC)lxEZCP!)?NYOJ_O-+hGjN;21sCcf6G}l$;cLpD`imH!F#waqE z>*ew7Z}o~kZdyY<_b)3Z3J7mVB63{DL{1RJbm!cdR~owz5!s^jyu^pC-I*( zNbex%dW@^$O4+8EO@y;>C51pUS=Fu#E}K6(3z+O-XQB~m8)qcHp{X`olM|NB?X2q> z(nXktqV2ajp{Rxupsh2&;~C#m@S;ZJ`t5I&wx(_G-StbF<}IGP7!Ip~F>OUD7|!HA z42MVQ6OGf9(TvLOzGo_y7uTsyUl(IF$3AnCqM7&ao`qCIvT!cQL04?m1B=Hp_Eai@|tL{pwBMs zaGK&;XQM%e-$}+)Rc29{SX7dh%xMv7(B;EpUeJ9}H>oGpsj;~{_Wi{j6df<;GBbhp z-E;M%U#qm#MYHo2Y}}9^1d-+>Gi;L|1k5y{5M4heyTEcEIdSi;NE~Vw?4pxYe+szI zs|ZkZ6IiHP>IIk&s#@*P#%k1-8>`8r21{NaYkm@6q5Q&BSeM`X;yz2fH0_`-ZRWn( zy+o{q8WGXg$0>J%nOV2@j}>GK%J-~E7@n32H$@!a5r`psJ06^?@r^IW2qBT`Xoci_ z?5WaXC_qO+Mepnsxll$Emy|F!g&6bQz2D(pt~DWT$hD>NmsgaKF|SLN;CxgR#PIbV zlZA(%x$W?R*V`A|B>tG%`t_xqzn>=h5!wDv`+r5olvL@@ld|dYpgee9Zc;Yf60^BDX(cL; z+UC}d=GzCvnEJzf8K{D5_gnAQS5_YLjz2i~_!ML;)l@iir_CYkbdzZ;%EZaa&QoOJ ziT=9Ud-R|$KE8Gx$CsY9YCFHtM&a&V0bgGHbJO+XiRj+ZbZu#Kqsk8oA5BdjJC`mX zC{glh51Y3fFAKdL^e?1Us?Vm0=m*LEkrMpIc}jT2_$uLV`!|{y4GZSf)@em7>BP-Z zR+?A(!bnlJr_mlDr^;2Cu^Hu7Np+fTU1ZD~;53v@pp$zo}(WOutB1iIh z<9Z2Q&76`Q!EFAtWI#{kq)MQA^8OgJzynt!DXm8)OsbW3uLUUi)bL8dt_pc!np@kpR&+ z_9brhqA5IKh6O*4{bRz+Ua%f_{S&Xh!U!KvbGIbSQ=p zhoCWT!7-TKwO`k?vOGJb6Ggd*Q@^`ZgWRLMCRS=*EwWV@GU$q2O~Qve z@ql?&WxX}`?IMTAA-UQ!F9TX$6Zt#`Ac-z|5v)Fl#rqU-x8<$25n>(HT+C!7P%z(N zzW3q!$yU_Ywu8t!hKfYz5s8#7>X`rscY|QsPopY|4a4-s$xm5`K15YxtrWLQ=wUZ+ zX;rD8D;-}|EVcGnDVpZ%H+8fkBc@;V+KUUmWK$q|Hee zUx11)R6l@hX})^qeD%zeW2na66didfI!Xsl&>W_UPD=olg-P-oyN%rQ{LHP31g;N! zRuZ$n7=fiZrE0t{c3r_z9^zz0&?0?epW@VyhHR{+XKYc$`|kg%<~oC#Ot)}oB8sv! z1%e{QE7FuAARrMb3K0>J9-1g65Q->>5MtTjN-qW#M2ZxVDj|u460lIDC;+oO9mioNwOuea=(La@MxUWPA)fq3eCS4gSVu zEU?(sTprynD6ZC)td5is5Xk&eNVomw!MS!NTe(ij@+YG44rvHE_-_7VcPPnsC`E;d zf9E&KP4mRtpxdF+w1!^Y2P8`kZT6$Su>HI^Q1PWO-ngwh6)meV*2PmY6UZ=J`V8$F zb8Ww@`Ise?i?<*G+UKUu7hs8X#^vSlFH%OqlLmxbRlXeFzPzlE9`G#<1DTN4P_bN| z1mNx!T8mdV@s*ylxQI7ue=^?aus1^7vPEA3%6l>rv;z<+#hw#9bW5cdAfN|{@{C-_eJMBFrf!=)X0WE}q0R%Po=ed2bz&bXBqSf1H*;5I zoBL$8mSE1ejGD+NCAj@4kw{zr2owTa1veZF9vJE3Ml(BV*QlJPZ~EdJz<#amAh_R< z6*(l|K%nA;S!3KD=$pU5=l2Bu(G(oWx61tX0d%a{j_f6%I_@AWI#f5MT>jbXIIF~) zTCdoSddY4>E_FePI&FFpvLi1h0EkK>P2bbmjtQDpz1A`x?ETMKe-Sw1Zigerf)s`? z)TcVf$(dy<87@@@5B+khp&=!cUh z{@-jd?FNp*a@1W=ok=wtgxQ#lGwBYIp^ojj9$9Tc{5m^b4yt3mTafI2=RvhXxLwK8 zkAP^t#@3j0ty~Of_4#rP`sO?5|M!C#X(s+_85?n{9&~u- z+MDarjxeJ)Ri^JrPM>0#-P&5y-0*Awy*PsyM34Yis#srM?jUvQ8)%)SYsD}_ZLU^< z>S7JJIP`Sh1sEZqt!GSM_p#|rZ}Z^jhzrHzR4s(ks#{76R2FsqY-{w1G&%#)`n0w5 zcm&o$6r_Ayo_QmJn+yNQoX!hIpx0rHQXKDk0iS&_yhytuT&YmC#Zg9JuJku<)Ncdu zkh3|qnAP}XL2TNq{`ht2QbcaDo%uxsT5TKZNI3cPhN#FEgzL+tZwrsZ@0cA|@y;#2($Mm`%d9A%9 z#@U=+NeCG-?MkhIm#+X#KSk4U)R_%bzb#DYwdv`(lNw$lS40Wv#qnD!$HmPgEakpf zoXwBpzro`){lPb>av1*!&D&hX`KsP#BUBS3O}ay6sbfgKO*_UCldf4{1*rx6bBF= z_AY$Qn=Tn!4u*}TXs75BpSi*l{gDW?Ni{BdjIc0I2#JHOGE1&6SDRybN|)!bJb}WB z%ND1k6y9b4frbYH3oy5idd;3nztPUJ1i1Vd>$B`~SFK!K=n36`e7##{DEckK*pXeXSPA37!6lfUS%6AiKtAT~y;D~9Ww zp|9`v*#qdZgC~fSRiaH;oU-gmE~cvgiueOG9V?mYem%Y%`mFJWI1I!F;@13ucy=e1 zcb++pEd#W)6#t3Bv~$}f;t|`+y*o5q$<*P~d%)b^&#KYyTPAsDn6chONz)!06*<(5dhWzQ*G$5 z)8G=a<$<1y*;uV2URv$?1x3BJ_{N)zSZ|4QstwrquqMIh@$F3TvavmEITUR^ab*F! zgK*ylut??UoV{`6rsAfJl{NtmE4nCJQh0wHvcg=zWv%Z7$&*6z&9vJP-tU5<#7EvuYL4_YBvEdbxYxST^m#m z!jLD;`sgvQe*_Jx;fKkUef91xLakG(Nui)rx95N2{E0&vwW&5M`z^Np+~HL+5|Ib} zun!Ej0|qYa|A?U&b)u)ki!Nx1jZ$-8$e7-UTj81y*N_}&XH7QXZ=j~AP9R1><-(!-Sz7t*(2*lHq_Vn zW3+KMGX$`g4ugp21*a!*u2%ijYJAQ8wcEY4Mtjc@t9fA=mFS%bA#zwfvo|MK5ASs8cU%*|0P?w$#MG#LjG$1VWmatBeA3>`7H^ z%8v@t@?~ToqN+?QgOc~)~{Pw(=+8BV0i zB?!v)N%|@y8!)S3avo4poUsoeC>Dfe2 z#z~X#ugAhk^)z57@9#kc#{}hcJt#^h#9TS-{xO(wj8GNiVAg;oe)Xzw8!bq2Z$NPj zwKK%Jhucd>rTF@2t2tJ+4f;5P`Jxtjl?Vmi!BdsDdphM7`A{&zlU5YowX(G{1*dT##6MHJ~5i9`)XZ60oie8TEAU;XfKrr_2ESpC}%X_m$$K z1mcUc%K5TihU-BiGx%gc=FaL5=4_XGmM{!EIT;ex-tWH)R8 diff --git a/docs/source/_static/publications/omnireset/drawer_success_rate_seeds_walltime.jpg b/docs/source/_static/publications/omnireset/drawer_success_rate_seeds_walltime.jpg index 3c3970febf5af772bbaae4457120c56d5aa3c5b5..5d0ea497bbcae4509973b0c3e94d65e8ee6deaf7 100644 GIT binary patch literal 37036 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 X--eel4eQmS{>P~7uQ&~XFT;NWIz7|j diff --git a/docs/source/_static/publications/omnireset/leg_success_rate_seeds.jpg b/docs/source/_static/publications/omnireset/leg_success_rate_seeds.jpg index f7a982bb04198cfa01b7fce9f89c338f2be8d97b..038abbdf9b1edf99180b6477fe63145a0a446098 100644 GIT binary patch literal 39114 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

Dx48gIJ^fdftw_LdEp7mXfH)u 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

V3Dyw_xgAUVJ9BX2@7ZT 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 MKGo>|QKJ?4-+mbUXaE2J literal 33530 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%0A*vlG;Rg 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 CtQCX+ literal 33959 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

<2BKld2YLEHi>Fl_yf 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 !9I7g8mRXJ%Q0?%Uda300mx)dKvdAl-&zp^*1H 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 DNnyBp diff --git a/docs/source/_static/publications/omnireset/cupcake_success_rate_seeds_walltime.jpg b/docs/source/_static/publications/omnireset/cupcake_success_rate_seeds_walltime.jpg index 7f6fd19ee620d308dec78b24e433f2d86376ab94..db9405f43d93c3e7141e8dd298511793ff341bf9 100644 GIT binary patch literal 160599 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

Vx|vD32>irviV%S= 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 ZiruqavQd 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 DW*s^@ literal 36823 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 X@dq6H-yj743CjBaZ}$}XHuL`g-yixO diff --git a/docs/source/_static/publications/omnireset/drawer_success_rate_seeds.jpg b/docs/source/_static/publications/omnireset/drawer_success_rate_seeds.jpg index 4217c8816b6932ff38bea729933b42ab0c9b36e9..5d3df42a4e272107268c434c3bc5d2387a5a8279 100644 GIT binary patch literal 144759 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 Hzh?gjE?g6% literal 37117 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 NW6A#yzV~C|{{ZER?l=Gd diff --git a/docs/source/_static/publications/omnireset/drawer_success_rate_seeds_walltime.jpg b/docs/source/_static/publications/omnireset/drawer_success_rate_seeds_walltime.jpg index 5d0ea497bbcae4509973b0c3e94d65e8ee6deaf7..7f798a9fcd332d179bf5857991d897db99901eea 100644 GIT binary patch literal 145049 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

1(=+?KJ5=NOu=RO?`y-dgdX(_4S zclQRQadG7$i>`8Zu%38P!;p>T*a0FGB{RrrchkYGyY^j0ga6PYI~_ePi_Vk3kOBP} zOz`XDAHahD3b5dBbgX`IPW@L&>Rwz<6g3hJze!W6`0404Qb=1|&x?2)-Vy)>FZBBF z$U@Jef-mn!(C{gby6ZkPxpUt-l|rMDM!rFQ3p;%aDu(6BMQhzp*yv^9plq3~&`0z6 zS5gPiFe5Hv#*t^h3t^c;ILR*XbOK5ZV~mPBZ?jQ~Z8QlvaSx4=Q8jx=p(6vT+F8?BLxj z+qtRc$y2qCaUYJ;3ktg-+RxQ}J13=39Rc7pcXJHbN*@^W&bJHUVs6K;`jwp>IQW^>-3d4qhFcW*dj0-jms&YONV{+8I^io zLKSLX?}oFb9238c*pL2bGJj`}L`{%K7QQ z^69ThqE8izvcDOsN-Taho#iWHO#yp?r~5S_MBY^p%kiwc`2qW#BNxGOP>p;$Lk$-m zd!<16gJTT0b3ZtPWDAG0kMFHvBW&N?!M-6lcXV+EnWk(%edO)huaa-+3$t4}C>235 zJal5V=mW`p=hszpOHZ2?f3$Zn4ePoABuMZC@O6O2p9yDzj~+)UXr3_lb96k6Sj^L(i3{JeJ7dg)}=GY=$>=v zvY!0r_0@j;)`2hpN9zlSZ(MC?mD3B-voVp$8`{=9l5(?$V8(i_uxjbe^4yNc6^fq= z_(I;nmuKO1$=8YonEWgN)=H43Cd*=3I1qfKZ=Zv5LiEO%Oj7b_)PYepNRLv z!T`ZT%Py2m8;jv+dWB8%XW|=G;ef)zH{45j+xdH*QE)cpSOr6x$g%r^U*#)$hFS39XqF>5411%`tsj zF15WtHp8ytJqhkWp=Li*4mNW(#KND?Kdg<#+RaXJS;O7V==LXt--V@Y07lfpK3SC{u=u-nCTa?A*+fk_Vf~ zRrNJ7HqR;j04m7e6U)@%2R`vlDIk9SGE0em&(YVm`rJK;y{Ihir~zxkvK#NB$u_i4 z^PjZo#tJ|SWSVT24Q-ptjG==)iXVGkZCqV97Vn#`7?O9KeX&wK@>x2S)Ca*Y18B#w zsocLX2akI5y1gO9 z&4P2rdr|dY z@yY%*K$;QHu-+ssFJ$s#iO4^ z;@>p~kPCni1yCa~fq$(PCL0Ex$rh#&(QuQLm+GE^-k4@cL2qfVo3hTWsjuM?lS+J> zEL^(KH|+Sh9O}kH)@Mj}@MLcrq$V7(v5ZOpv1oLtoto0p9$xG5l-_jN5qy|an0qm$ z>$tgKEN9w&Ka)YE&hWco_hqNc{&x}l=kEoFxNVfbEuV7VfU%! z>I6mz2ht;$VS{hskWnXeT<$vW%uS70tf(_Z)5~almbxU58$}x zqYPqp<8BSuoGYn5jjm*MXVz63Ix%&jlzWOt@Pe(-=G6r(VU4{hkqHPFf3wooZ zNO4JZa~Ry*sP(umbDTq8 zFN{7$MfH$Mr~vTRpMv1!M(zIlCmdt6_DbiKRA~K~z1k{-bA`qAolF2ZcA8K9ji!zScGXq6y9X|EV>7Jlwe#;SaZ(Kc(l$P zAjjWB&iiJtjf#t+2z3~K`pmCYgjOJkb+x*~(FhD3nso}$->PsgH_D>jn!FsoXM~z_ z?9>!WRDONI`&~e{2s@%Lpi8|Vdf-E&M#Sym()lXe0`Gpq`Rv&;?BvSe=s6AX+^5}& zntIQmP2gg++zB?1;xVI$u3ViTxZ1$~d_Hu?+W8RoYJ2C9aC672jM z`22kSNAUCC5d56`K{X}Nb)vQn^jP>jA?d9MfWc=C0Go|&B&Uk>(-yyY+Xa73#|;P@ zv1jA&5^mstrmHpVR-5MuXN&p_fD4;?y*@v_%rl$AsBqqu)0W>O->*CHWuR*XXB{*O zt8)YL&Q9dZBLvrqS~K6o#*1%lH>y&`@lz%ZvPx107dOlk2@}hMEl2<+N?|$+h>vzr zM1Xsu8Ht+w3aWrcu(pxQvPrV!w`COZDJz?mdetoDVFUT>yn2B;`4YYMS8Oub+B zsZ@sw6cz#@8#NdU!RjL)+bQF!NfWn11J3VOdOcjuSp3lVvHaa<%?mTXV>@If?qHs*0Jagyq5kebR$- z{ZJsbp?yp+27b$ti-5kpK_(LKFaR3Dc%mR1<%_Q{)d}n?!hD46w=0zaL`ze#=yB4# zZI`swg#}LPF5-l7N5W>`1tC@vn_Jt7+IB=VyqcB7rO^tbsmCH(2Z3xVM{zZ4_$`*@ z*VS&*GV~ImArCKH*bXOE95g=evzL5+Gkt6RnVmAw?(dHM4k0`P@ZOoVfSYp1IrUZo zo;RXcd+hz1_9Z!m$&$N02NN9blY)T)887cUsVqavJv&XNoKO+T#m;;Nm+)H0m_`-%;9AqnOXX5%quHxlBREf+eEho4NJRpgenLY5j2wKiKod@s zB?0`s5xnGg6rqrGd=vIs7P$duvY3k3&rnDe9}dZoAYMw(_dM&Jci!9wk%9z5s2b!N zXE4y34L;o4mi)W&xHP(4Neb=`AC=grkl=eOlqrB=-gt`);JDYvrlek&{`!ZZpKjvy z^m!ss%AY8z0xSro?C|N_532bDN)u=rvd7Q_P_KZY@9Z zp-@h2tOzkjN@TAjXlH8*iF!*oNmM4Rqdq+mPtwIUVMf`ne6<$0vbl#Sa_8H6<7Kn> zevtiH_-UCs<YH)Aa@IRW@^;&Ipjn7tW12^-fwjXm~pPHD(jz$jfvU*_Pc zJodEJzOGfLZnzy#iwacPEyGWcbv@x*T|cPokm}%tS&Tp0KaRu;aLI$&V5b7YEV0WO zn0Uk@(b&==1w}9K*DE)X@cB^do%HeVOHnbAyTL9x8xvcz(qQBpj?(Li{ zH@oqb!Ha77Hmq@vq)pOabO*}VeI`ICj29(IT<=Vx4ux}xY_94}HKEM&*q1i#cnh3? z5+9@Hi`#dxYs(KK-wDg?@KP8Ri8qajcCeAd+W1H71=qs!5g(itm0v@o7?iHQ^&(C( zebn-MNw+z%#oJ!=F|*eK+ccKrW3%QjAa9}b{Q5<98Nzqa)d{pg6o4FJjS%JrR?f#2 zLe0fd&pFB4iiX6ts{UFHhny45~kl5~FEip&dReYxhy`}dZ`Qq6t}rp4gS zcBKshlMbPoA#~ZOvov))sr^!_!f#wGD=XJ6!{8q6&*MR7Az7fZZ%N{)In)4ug|tN1 zyN{%%nmPrbKHHPCz16>eIYRi^Yf?G?cozbso*Au6+$d6BMFhY3n~me1YT;6W4iDD3 z3(rVj)bDd2dl_%`aNwHTo@A@tact`2NA#Lf3!cm_hpMS=$c-tFRL2yoUR_Mh*DtiU zE6)lZHHpp&{1rYe>dtE+KeGvY+aMDA6%*A7d`YUk{MNKlmw{U>dq=`8 zqQt+TKk?sOUiyi(wKa)W&7>wjuHIs*?vCE-NXv*%ch>2|)G~OTq9|UJTudVhBV~{a zXymiZ2M|^YhukM|Pmet*5xYW;(}{xQtHVbqi)CdCvaAz?T83j)v2{Sng*ABR^4|6d zkX3(yK_zmwV7H9KHoZ6s1Jbdf{sHzk-9V?%?T4k=MYGf&<&Ar7I=`=TH(m<9*W6gj ziMPXY0?}C-1w>Lyo9;=~#X7#WS7#3uj~-X{4(UB6IRi*AsfNT+h6Zrw%D%rz+jXDD zp2O`mm&X-YHl~wIG;m@1^K6=Rt$~J`-j^YHvr#spE7b=GAkf-)F^!K0KEov8JKFfw z&c>tkLAEvgS*4}GV82HUeJcxMAqLUCs1t8;w_T4C;ywPfAZ{c|ry5%0@N zyCGxeEJ1Nw^uu-@*M^Bn2FoPtTjx{x9QYsjF1;-5?M<`;N4t%Z!2rZ^r*ijtsQ^Bz z4tE=1YF8oCE%uX(wZ$8TXO$frUcNIpdtdBnxChtHm+yRAw*AmbAo`;sS66{2%{pNx zhBq|@eGhzt4ed6kST5UiyK|gryWhExBLDEX_UgArZLz)&*4KuLU=DXB-@dYd@z?_y)@F=04uQ_v(46A@w!Ix10N+f7SJ@DcyTlAX1-4e0oG;RI3iY&wmBe`Tk&cc zGxzZi*tmt0+3?;iI)PBC>wx80>c7@A> zI#WYAyEOl~4IsyjA7uNP>Hgg!$LsVC4R7ynff_{446}zt`9I zpYIVX1LDuAEpvhi@g9&sbkjVK&2NXZg=fZPxz?zQO>o*gbKl&=Y@Tp=pwI8e&!0Bk zcYqAwau-b_d*RH#O}ANYm#j~#O^UG(@?ZbFeA%?&iS48)KaG>1a5ABb2&DB}Xh`XRCnBud^AGR&=QZ_hGyu-B%0xvrjleoJ>XlwXTLmTcR4zp!dw zDX8b^xH_^NW8r>&wJ&M5v)AP8>N)t=8*xxQ!|m9jDu8nxF!-w}6tAd!SA)@pKYJE$^ zi6!CR-n_?8Se}gxd|LSRZf)O%2Hqow6Q8_l%;HcdUdgi1&!v^{kB!Obs!#RL&XE-g zwE=7HbDNjdtP@>yWlV@)HzjV)d;L*yiARlgI$%$?27glw{H-eLR{-zp04OIRL@g@Y zchP^vqwteU;otkAPW_c&zaSu(asdD`e?snxS~~xG=l$(#)TvSMB~~>O-47~VZoh(n zNXmsB_$T=8$^Y18s0uCTxB1F{CbbS(Y=1rYkAJh|1X6?o5|c^^vvmFC`QLx7-|5H+ zN%%cgt=Gpj5N<RqzxbnT$_O7+Is@t?tBX?kgFJSfQUW2-`p0H23C^ z@Q8NHAtzJLlcaz=A(IP&tC?xd-!h1Mx|hpm_G_<4r}Ip4_Jcx(Bm2y;Wpp$sq$;3f zI~c2uXjh1vJ4Sw~$?GXM*3qaqKRd1K&%fm%79e+z@%(YF-j<~UG>$Aqeu;EKvQT=E zmB?^yD#9)QwCT2b&t#R}N=_di(W(hfXnQiN=8KPZ(R`;D7>TzhBw8FAPlmORdLMQK z0(yD98{?_26HOR*KbS#vbjz1E2QJqulwtRVN6V1m+QgNcLNkEyb#=;8>6X0e1Ef&=I&3oS$^7DZpq2CeT=473%aU)Aw1d7jZKr8&{T)r5_ND%cb>~c(E4* z0!NjZuta9K#t%iiBgIMw`#_VO^hh@dK|!Jc-306QkR_?1SoBHl16Q8pwaQ{{gYb?< z{z4ziCVEJKTNmaJJ8rw4w$%=ws%zUgqn6+d?9t1Sbp93VNYry?YQpI9{cG|vI_9op#ekC6=Aq;Jcz2sVV*`|86} zIXswEYi91(Xn!Fm`od%EPLbaVex%c@wRqnRC>qX703XN#NiEw1ahep<9mPZX>zadE-(Ya50AQRAc!s^3vaoo}r9-uqRblU;dV{gMFuAJrDblY^>T<=`h3 zQ#VjbiGn*POmi+GHzF6lCWWLX(|}a3rp4zz`f&P=hO{2L5Kbm&f|usbxWcp3JrEX+ z0h5Yo>JbVziGcLq}n3f3kK>UZt+RxoOu!M=e*s`g+ z9kQsoancjoA_%m_70O6{vSS%)777s1Cxk41rnvgRp4Id#ZFDF z)+o))+@4Y8P`)H<-4r3Sjc8S;Yljo0^D*JxX%R(%`2>rOrMkpqsuLC|Vn=RprRexb zO)>O3#HcbFRKa3M{$H{Io@S66xQY-FWu+=v}YJ#+#)DA*7_`#Mb1|mL_LU?C?|g) zacde-EhZ~`UcgN?M~oxg6sSr{(pUWhT=EhyMl$mEo>d6ESvYfUYa}z->sm)=+?Dzc z;c7i-6#{Dxo{S&Vs~Q0>h6Jd~na*_cWV4Ldaul*Xj4j=%yg$?KcBeX8HQ2_4QRY$lMg9 zd>T+Fc0>!lSPGh((oRJ#g_!6;t${Kd?Nf3_qotc~&J@XT%rM9&D{<=j z(=47*d@bbKevnJZBO%Q)#loemE5==x&P|+ayF;Eu6+?LKDxC0#M=U4Yt!xgOE#_x8 zJH1&)Z2Jbxt6PgFNmAHc0*Ew1(1}}$p`o zguD+YNPTbnLB$oogYH6B&ByM_lmwnsayf)0FB(nMR%M9A-xs-DDjd*h@ap5iOX;mn z{Gp(P0Bc*F>%dN-YFnMRL8jecnwcFY{noUNe~`>q{26N=2cxuNY-K@jaEFwSdr^h) zl$Om%A6dTgV{pT{(wwRn$6l!Tg}OJO#hl#S#qK{kCljwNDR?KIaD4o?USDd zMbmF@A3ytMw*#h^P6%)1mrz_R56H>ONQ-`X0CDQcNZZ)cP)cC^*r3%?Y{AMrt5)dV zsoA}O?i(A~tkRw$zXv`Z74iz`xt||InqS}X#xmP|*ey^e?w*0_8++O~;A@!Vi zCrI=$xe)2b8a-d*7)gGOa=*W-F4x|=rlr&Z9)E6R@V$~_IC=2GO(y8HH-K!Td;(WN zL6yi285Blsu|N0eVb{}dZp0V{_xshHT5a!`UOQRdedu-K{q^z>?8Q*(GRVc30YfeP z9%ivEck>lWjWU%QPb}vf+ZjXjXLIWA%~Um2X`85Hjp8fc?9j${m_?4dY+qANgYLO% z=qP85+6Oedhzs3ns5=a}d?Q7K)y&R-cnvlVVn#Y8(5|JG#i_UfOqg%1T)yE~|u~KMvjW+*{RDl=bIzKB0eM9Kftt-G$b1 zoT8?A5?wR$0p<>7FT@FRR12TTl1@e?-6oaCmrmKvRzKRZN;JOBESC4Qxx7FO%6zCGo)orUme1*`h@{7O{xQveDpH@bWz^?2Bo;)2*4~ z>nFNW$gR(PL8v+;;n;nvOySQ`i{&bUYc=0hr(vXwDa#ckZ=lB{uF)xT@na;o;8~m5 z^_&+^IShjnEsUp&NZi>KK+tMA29o|YW%dVN?QfxXe|tc1;X4gE@Ufca){21c$=Wc58my)UN#5<0z*!iB5V%A>j0=igI8w;TUv_&or%V09kkN>iKlVuD3)nVros??TA*2I5w7y>ATQxZ!swiEGs*`amU{g9T z82|1Acp(%)MH0ae9 zwI&&%%9y6R@}DRi3fB5m&6INMJUMoJLCNGQHkh(7vpUY3)aK*wB>2Ln+*#-gC%-67 z*i_D$c0&pAgDAP}J<;5dQgHi#Y~Sh8EcL`#X&L1#Q21u5QgDe%bGr4K^leDmNLps9 zWw6WeT+pM5@$YEM_5{L7M3=Ls&at{20@@&@=koKC_Q?ho3NF@Jgcdt==_gkA3deu}K(Pl^HB@xvZ9pIjYx@kfEDcs}*`VZUX6vx)p9Zq+a7$w!s& zdd&QL=tD1}i(bGv3j0Das?p6c&|Q7R(&P4+RFCodq5<=K24i9Yv46d9|7H622Tili zI#pqFrQ(5HdJS=|g3(x0Z@;H*x;b~6zBP3SaajySL!@AzAy^|sD6rU&P8qD95bT_}o3Ydz-U1BYVriZk>89((dOYw*>d!tqP`rAq#xh{=#Ew}gYn%>+z!PggZ)xk>ABELh%l~mT$*u*MH zYgz+IHU0D@-MnBrMQzCX7Jh5?aQ{4*nZ!#7T)^nsUTm}D9obl_s|t|MtEq@TFFs=+ z{_=PmDA`wa{LAEYZb`j+yb5E?n+3)YZsmu&XK>58+}umWE;j5Cc6rwdZ@D+XFLcc1{{CaEoXV3o^vO)fB>iy^O(H%+3 z@q$b@&#yL%?j4OKg3pKsga_H#cM6CSxt~RIgTN%Vqb3ul$l;}Xv)(A{bW7Z~EFX8} z0qZpJ(DCE>H3Z0BnJQohior|m+CT|rvg>CnqoIoQArpnZ#9ksNDZwDW)(#y1n1Kc~F^+2bGe(SKeD{=dQ@^5$Fq=Nb^o_JSQv-@O(`E?zd2vb-dIj>O<1&{;v z&$B^o7WwZR+ZbW>OZ@XRA%PyEmC0yPq5VSCp9&@?Ny-E-IDknYkW{ha6oi{ZBuXLT zL^qD{^4r{&#?0N>*Jt-D?mrjA^I@!=1KJdX+_RjX#Mid%<(V8m+)cIyC|1Mwdl_*fre+cL?^2`K|LT zKd9W?{8OH@&fC6T$lxO5Ry6&SUt#N_5A4XDMs%bWqh1C zuNt13n!eFcTPuiX(_<6@})eQ zyJlY9T|rcb2)rD*p_vXgYsWsJvK7uVcXG%V!Qf_`O_=^fQ5gbYznW?=-iNh~)!u$Q zW_7mKLlL^=(w~C0phvO%2I0tsCDw!>-U!Z~a-7M=@}j#_`#LL=e6D+lTy8_N`o|h^ z9ZgKxM~b*xrXsehEd$<;JWgT)Fc}6>${3Ed?*Ll|{*51GYCo}ckOeU%PAf;6r0)9m zQ96B}{ju}WofyjT4?n1q*a#57*b6NVlEp@gRtE`U@vo*#NSug8_v})pm8AXz7X``Z z@D<;KK_D+NM*zU$v=_+lkxqbc;ruaeQFx0Ka`8x#CHXB$gEyiKxfr;TR))_k{sJ-Z z%-?t>x(yx15clt%cyLf3X17CRAzl4hIHUA{D;>kJoInH{s-RZ_zf-mD21Qm`MwS>E zh{Z`UKfZFdX+C3?o)0ZKX|?7iVg;^Rt3&E>bMMa{+Vl%YR%MgpS9gLbL)tcvmXl}k zLz6cCaM9h;Xn;3gz>>lw^n>d1SqRAx$@+r|7Y$ylhA))Q?}n-TplVMCRyLrES|+iw zBRg36zAP60JFjN{&Q;_?`-tlQ`agKL^2g=>;pqS07@Wetq-y~-F6gm43?G1W2>j|SzrBa)B=0|6w=T<|uaP~2jVTs;OP6rQO8t`J30 z?~66U=>~-F2i5PqXz=&fu%&&C_x(UhPn$)LU{Y&~O)nj~Vhv18J|x1e9~B_F-N- z#s$y`R0PmWy!~Bs^@lC{!^)$%{&a`>m36`m5YTo9xMlsxBK>fj1PT0us#9jL`4qgx z;^z(aI81|dp1=gOc%Pb{3MfMv;E|-0X|9x^AlaA@GQzc%H#pbm-t&!T$&s%t{T|k7 z-uUAV`zP1of8agv|6R|9K){ExiH{vLmeE9>8HT~7-A7}g#jr!c}! zpe=#UR5z2y=*6xmm?&%rCWgz)SWHBv%h`92Y@sRuu9XLqiRGuRzB4qq6GgoIEyy_8c#jEy@8dpRlI2e3TF9e zoU$S3K)t%eBKpBuX`m}$Kqis=0e)v|Dv2Th(E&cgb9jp;LA6R$GwSRYH9`^FGx%?4BN;H)BEzMf&QxMExSy4hS%BG2exFwUHD&CEc>gC?%uc{EJJjr z05Qu15?g>oq2R4rfa*IEZ5M_+O3?wiQAQ~JI{@_$e7tMvAk+VF3*k8baS}aMv~xI5 zVLSo^=(6Mrm=e?m2=7DhkwggRCEMo1wB_rtaTFvD@EgpCCb25SOBPMlBjGW!e&zao z<Mlv|K zSMm<8U$?z`NwtxvD7WeK1-jZ_X8c#Y#_vA2j0SuR5WKSkxrhWW-h=mZ0e$*FWJZs` z8<6z?RYce^k4+sp=`3Z3tj~JaZ zc8ioP4L#w2nHJU1het$S95aT61OWQIz{#{P31A|h3()vuj);a-PHY_bV}nANOmNz{ z*zYoy%&?$)&Tk;SlyH@v4o#2GCvS{WoAh1)<&Rnb?6qdOgzv5DmT`}CPFIX8 ze^n@M$8Er+t;R3SAX}%c?)$0a{ykmNKL8Zda(4jR=p^C$qDg2y1xZvUsSiV~(M7@L zz(D)79d4H4nKbHRqjHS2SyKwb=bt219!-MC0D+|((t~xn4gZ8(40Z<6xeEAQtYm9H zXFG_dD{QVC#uKM|S;)6Ypm#XQBv^+3wP^gTcVhd|*9HTsAE@@h1WEr50O!NZP813N zDG&}!`AnpnY94!kdk+47$6>M-BLE&(_47cV6CQ(zP)3loY8WjP zXzCk;APGdsKzb-Y)OQ{Pus77=c-!IpP^0FCgf5&i$ukCsQzGFg=GHFwYQ1HivT^jRj<{{}2w6wE?5k5Y7 zZTOg8rUql3OsgEL%U;r-uW!a(5Fbn(g#*%k3)vJca+o$_S01H5lWvG)i-X$@?-|>) zWeQF3Se91|E2mpFkNMgRF(-bkjhH)o;_=F`iRS5?rD&={O7u4Ts~Q>^gLGB+nz|^7 z5l53Xj4LNJgRy9R+_7?(>^3pK=QFdDdYaD|KX0pd@_)WQ(05F!eaEi+Utg^OWnG}J zL<%n$6N6R2SNvQyWB|6rXhY$E6Q0BG2hLA}rw*Zh@O9D{5u98JKde*x?%5qXu7`**1pI4q1AGDav{)0?r}NlJPz|Job#kYDo>AFdzaJX7xD|dY zvnuoCm*P?n(OOcePBwi(q7~^hMy)hD6sgLV^7}#xa&E$5lMI=e! zW1BTOO#SL`(z6jgku-5yV~07S_v_JCu0qRk3`(~#@BsOOhWQbpP~3yL^g#Q zN=Gmzo*@Zfw?45xv16*i?mumm%FB(9%(=xQLu2&9&`~^NGDf3;V_>7Ny^`aC`r5y| zINm+hRHHCD;I>-fm2^J^-B9~o5J8ek4K5|=Z2$*(3o03O*0ZR%{1t66N$}#ym$H#` z^i~VIWj%v&Ana9;AY~AV)z9F?x2NO#aZWLh;Ku@Nj0j zfwCY5^NvHh<-6_GVx0a}dp|miN&8^L91WoxyLFpjjJw#1ub+<~8Rg8lq-`cb)3X|@ z(#{H&pW{2{a8HR|^gPW8LaGr^PYgibf7Pg#2R(`N#E27h1F{z-5<<8;5m=3O1h*ZW zQ9tprSj1$>IBlj;z>Jhtrr&jdF|V?jo}^zzXv5mKf_P<>U6j9Snk|NaEhDc1t(T_X zrp`Y#{P)!G^BglarvcH>+x-hXaT1iC2z28g3)| z7H45*&yI(95{Eve5X%g?`^g z{>3sLJLduvbXBp%MXMces^=xk6NaHbWlbGeNj-U*HuyV;}K?2mm zI`th@8bj16YaaxBdS-2L=UbX-T4n8?PwiwVU1Ryfb0%lL-ae}*Yso{oE6)K)rgNCb zzS*5Gm)u~-(&3L`<;xdApWBC=6&9>z|cFeRK{#bHVAEyzpusXiZyq4?hlw%D17NI?AH#_=X$hQ05cvcd^1{ zP96&KXx(ywmkm{Q@eT>%FS+<+gT8YeS%80VYDL6>u{Qv6x@&-s+zT6NK90mjK5YcQ zwQ~Vg(zV%|YNgiPvPHeD!?7Ixpz75~{~SLW_3%T*cR$g@WOy|zEUj*lZ zsK5(pnGyt6oTomaAQ-T%3grAo|6}pnDcID6M&CT!Ro=zL7b3N6ZF#zzya9=RpFcj* z^*%y33sWbZ#76CqiEHa1r`I-#xEq=MI%<$mHnXhp>BVb>fCxAfxe*} z=V9&(R)x|@Z%zwZy8X+WRM?$p4jVj?k2#NRgsKjMoy&eMP6=CmnQ{~)d}^#IB2QPQ z?72hcobR>`%vzWFiaeh^A_l&Y2xAGu|7^nxg$)5{p*Z+WxDX*i4txnWJJA{ExEY+l zMu=zX2zW7aE5-W0MdtKo+j8KIs%uu4V*6}X5L5mXhRSTp&<`pe2}1u{3gGZn@wWEg z+PNCqb)yC#eG_pRS4-?@u|M5U4WQuJR`8BX=-c6ZI37~wl5t1E2;W^!!Fy7%M!7DtM;x^^Eo`;*!J>{gNPFhd7 zjC;A@d4}3(*kvDH(<*XfAuVu%h*LP&$s}URvt{cE2y5;+HQ#E-Gt545 z^~)m=$k`7+PMpo?dFTArA>;L{J@IE^Nf3YMG&kodxxDzpjIs4wx4IY_o1ZI>Bwug7 zA4^3$%`Zm9Ao=71&-;IICoeT?lP=+STR~6kR0!pZtdT*8m_1J>f|2RiE|Ov8gJx~o zY=3oel7T(-sY=aCb=k{>#YX3-I6GieuqjYgX30Bv%L(n%0UBth4I`rQDw3a~5b#|W z=h-p;45mg93dvb9E@W}+yi^{)=|>*RZDcoaaN(!oC<-@|;wJN0K8MXB$|0?TgwqBa z{Uwwh1pnR-DmIr);fb7!VQWz_7 z-zLyy5%9b4sWx-M4K(ry!EOTIjoo&;#oNBc)Sc~`W)@g$ft|6P>M;z}8ai84-eSm( zjIsnAu@?VVZWK{+EKG1k;aflip#A+7>zJEw)74kxaxeA8-0dS1_r2;jwZdX2CJ@zt zWF{7j|3cs_gY^Te&N37|0hK~&_{Jah=Q-!Z4Yenla7A6zll7LaSAVW^WAr|VkNg_2 zbcypv!A^+y69yO|)OdFZGu@c-e^C7P&)|^%)<+A4c7*T>n2{m`R7W{UH%0RRi4C50^U+L|Ub&`5IoYSj zzq_6w0sT;+-jr5tVc>BF$_4~hfO3n^O#r5nO^7R6;{_ep=8%k0*w8$`K;~g8aDRIl zQ@k8AkU>gyOw*nI(rLvzGkWB3NDtaglz_LK)usieM^n=ur62_BZC1h!BrnXGw3RUf zA&iO%-<)d@ckb}ziV{qkouO>XaI&@NL;mFCi6ee@cH!8oWz$X+VMXHc09O0}5cvS0 z2YP>!#Q6R&APl8Ot|VvS6)NXvCeaw-tJ;oRm0LfkEI!WHzPbN6xPu#K(6$BWt&t?* z*el3qAgq}Q!O0VdNLrge;q9){dpq)qm{2Ij3Ysa@tVFG~U zfQ70clU*0d4QOB_ZUk(i@z9SWvIjgpNLV|SsOxYYby%X;>gxp zV6{>yRbN-dno;rj?(ytC6gabK0^bPy+vfyJ`~$4y#vV@LQ!|Z;pfjS1w-doY;MGUQ z+)|aXcPs5sE_cm7bH#~1Q6`YCcm5l^_^S7j-D;o1i4H_KOpp-vjwFs_ZAY?x4Jd0* z**^;;Sht=Og>5Ip+w44cQGj6d+W>PF%{C;)(l9BSX z+N;UeqP8oa1eu2^z>EVTExeR5WTj<0s}Pi*oa`F~J3~?)clrV~!>V;qL~DjOOMKst zpQkM!RqbX?6f>1gw52`0{)L*J3UtE~j3uH5Tahu>U27qX&Ef=j`;fExa%W7b;UdP7 zX>6og#`|5cRG)mSKvb_h0dYJ%V&N<#8Hs%`h%o@BjujWVp@NP4lzECAJKc_CF5T1e z^=#Gz5_l)vbDF1A1ip(`y>_2k#9yWTAnY&wPAB}pZM2ydHfKjg&V=7VPHo|9$;se5 zuNIOP4KTcDb~Nj;mj9={?+j{c4c7%h=|y^vQdOEtQ^5p8Ktx5c(2amn#aK{UNGQ@f zC~RRvKoC?)qy{MoArxsMy(uXOSct5k#RS$34I9ojKHy zUTND;FrU@8GysR8C4us%o#l1Uk-q%~84Iqu=MTKJogB8AP&2a5$Qy4xD6$aYPWhw9 zOKU*F&=MTmD0!MYS0RiqHr~h;PGyugcR~oJ@&HTu91H$9wyv`%^IT`qu>9t|(Zr?~ z(wZG2f`7$PY&HHBNW~bTjab+mt`k7$!^&|HFQahee+2@d439u5dC(&K>$kxY!_14< z{6S+leB)%zDeeIBkll?ps*Q;x1c_EY?SO(-9=hI%neTm0zfd#nvy6Pud)~(MuCwkB zMJLBUHtA2y0Q)f^kG{@}C($0Q90rE~RNwDs9}2n7$h2b*vMoEpJsQS3&z0JsEV!YU z+hyNO?QY$Nt`OkKJSF;0V`+G5Q%)_EnoO7S#a}3AY)#XjwP(#oT5fyon|a#pIY3|s z*pq_0tn{u)ko*F#$gJi4{7x9ef+ibG6vq@Z7K3Bn=UjyDiUv1?h7%sIG2+Y3tbxUT zQPb~Tl0r}~$veAzf>$sn47)E1KVHo_o4hT6IQ}=p#vZY(I%KdOm5t)x87D_`fCZZ>?lx<2RBE)}4C;<|VIXOr0g zTi8=`_fcFsm8;N*T&!I+O~GErFMef*vt$M*vdfJpYvx+1sYK1$@YYZD=6`+ME%mXDoXBtIRhk5xVTJ4Gji07R1;rAoj-8bVJxFR6IAQjfHrTz}jy%^F6 zAve>z*)GOKRiV!dMpf77`|9fo-_D5({v5x@mjhb>{LqRXOC-rgf@MniJ=a9He#5l6 zSpE6fn6lL|i~jU=U8_5eYs?RY>k@n1-1810HNXkJ_%Bw=5ah2Xav?7a8bFB{2?=fm z0l155?)`X`+I~%IN@rZkbHT$Q?C_|1(?%V#`}qLzFLu_ayP|WsvQDd*B#sk*9#X>i zHHedrLU~PIo8ub>pS4V7Sj&e$4=Fwr5-v4RHs)!qpAx*5-m4esc-!Mzp3L-V!&F`k z-waDRiWw)#l7f*SbP(IIbRhuVz%bp+ZI8n-ss1fR8*jcpKs+XmERzDlKa@3O!5$&} z5TGG~2^A1_?wo>aaIb)epmR4o&%`K2HSW7OfRMA8NMkGIeOA`;20L6>ax2Mvm{>MaZS53_s{+l<*0hWQV(j4kEiBCh>0%l3q^ zL1yW>mD19NyRaS5PEmnQq9A4lsR5;Uf7JFVmgw^=0>m_iTp?ZWJBbdN>xVIO*12ub zxIknRuWD?0jafP}7&-j+d6C&4?(46 zNYO7yS-4IV$pzpiRe26a)_sjxsnmQ{mfa~eVLp9&Bwst;IdG4_QHub|%HDT2z7-x| zOJB@d`HN?vMR$BZcNUf1EnNPv{3c|-+67BG5L@WLbsdXcbM8jcQ zowBjCY8>El+^SDY4w#^X)iu%8Q8`7wJ6PF-{M)xSml%UnN6i669j!nO+>ysZe#4xz zSn_3zDzr@y#gSHqZ3$w+Zg7tIK-&0eF@&UUW95_xC=?#q2Hnq)rt~`H2BEDeI_uC- z*|t4r+|<1x5~C$5^1K>hf-GsGyU$b4^r-09`*4r|^0(6$0l4{#1n0uF~*z6d4+77I_XQu}05 zaVj>KMN+szEafY#x24ZVEL`%=mNnMaE~SK9tO-?}UOTs$`{B)bp{)ak>xgB@Haej= z`?)RvG#Uu-W}_h^;hGIU-ck8+L``IRAfOhxek3E462CwbqaKEUrx4?^ImQd z(?69|`M_bXmC5GyD@+UqOFsNFm50aDYH@9N<`CnG)fK(~3ys|g*R0#_yixQ>Y4!5% z4L-*7MuwZ?k;|$&3WC36QsAa&eHI}H?F3NBBn2DmI%@`6ZlOd9Mi>T%E zi4RQ(?DEwbTzNZc_sG}x>KAuxXPZMzWH47mHE5_L-&QBXW75ZiQlfz>V>&pK;kSB zfERwrV3q#@x^Bu?GNja8tYrw&p$Ag?@V4+d*9n3Ib=UH?QScczmv#1mrozpTki(0G+@lTzQ%rPtZFasTkF4< z866OE_>_}mm*?F^wRrfOr`=enC{{-uF9X;hEIQ7 zu%IqtCfDF&t3glJ+Re&RpG6^nf877v~EA>HEx1b4gxa)-7#z!YWX5x zY?MJt#z~{isuq2tj(OuWLORR47%p{Pt?h)S!ZYm~=gLZgo#jr`g$~|S&~7IR^FRE_ z5H!#(z}r;T248fdF-oLQOPiD<#`O+i)jG}vPEOf9D%tK+SuL{AKrQ&xL|4eXXvJqB zB!5z2p;Yk*L|TdBMuxeBOKd|VD^!>p%7rqg zL=FB5b|)ghbg_J%FNTEnSO6@h|2b7E7|}0Qza0k4R(rgRP3Do)SGU75&)U0oyxy-k z=Bm-D7=>cj@q)3z>P));hODM5n_v9(s#vddjIv_ zB<{IT0_Y6Ag%~dz5#|b^yMOZiz}(ytU|(xZ3Nr-XwYK zz4CB9^~@`K|1pEt(Mle(O1l12@+zbIg?>=!LFC*d>JIK<8%4l{?v&E4S!Gl@?+i31 zqaYhSXcc|sQ~KY6Zw+NG@CqOc8y>*;foxU6bIiE#P8PE}4TxIVAQzd|4UPz0@g7VY z6BQ7!XJrU*6L^pAm*RF~$;dro(deIR%mk%igF3YtA^;TUqsT3h+wv_g=vqw$G zwTi#ROti0-`NYhBHJ*3Qp$|Sh`R=HE#akQY3Mt}2_xU#%*A{=yQ=yx@8ZviC1J{uLO&s1sf%QHc6IlNH71rx+dQ3A>klnpO9BUK03{B@{0d7?034rSVdsp;V^e zei^1cJr^{VVP3pfA(MhRM40BQpiNj#16_ErPjf5k9PMGPT9k(JmBBBb--%Ar{WlID zd?VrsH5pB~0^+Vq_UwsVwj0p+;wjfm>o_nSr8er`MJ)GhT@ASZaYcj_*%AEhym6nZ zM^n!APX|RlyANO&4cV7K79$P;MM)aiKxFEQ*<9-*v1g%tL*PbE)&0QAOhE<0ZtFoI zx!cuu?|DNK40b>%{a5(H{~%2` zj*L6Dutba;OD317$Atr?T(u2G9rMIjZ>UspJh}>e`^9z{4_Eno%VNPqb8v_1lt;hq z5AW+fXbQ{|OYTF8hW~I~DrGzJUcmQoeZT}@ng;cewvlAP*g?{6xYE^z@+#U33zs8% zo4P&E$Q$=`4J+rHryN#7~^X4fnXUghX!8qrj*oLHnVe7lJ$zBQ?;YM zS`LcM_X%yIe0h0LnvYZ9#sOU}U_LZ;N|fsl)=x}CZuaFr>F5<{u)P5Xj=)_fo(dSd}1C3R9@FKmuwDyBpxaby$(^$yOCn}ql-ck<10nk4`Fn`XLLkLIc$pSx+(*KuzlW)uvu44NQPlQT0ojhPyE|Z`Pcb2R{gYlgU6TK^_5-va+9bym6u>Dz_iA zb9xI;U;JhH{;b5QuG@!FRyEFxFiv7y2t&rPe5seL+MzDfhfAHGJ13Y1R)a1wLc^gB zqfsuL(>vUUH+KJXp=bWr8T&EeM6us>e2GfPIYL=QBK8l5G0_ZtViGQjnY=2;Vz;pj zC`zoTpgy9;?9=X%bj~6s)v`1TQ3Y7Wgo6Bn%sHhZUz4d+NTT5u0rdw^tQ-I ziIA9~OydZNTA)3%-d8=$aCt2`yQh0mb+m~a4OVxkhfv`9=Qh@97JbMw?)xyyS z4fvu%Koa}RBwz3S(lYugIP@%Pg7W+E&$k7|7kqrkA<~bbc0-r_X#(>q7Yjt)&;tTf zJW{t^E#@sk5drB05U2yyMW)F}smkt2oBQ?Ml8}_m(n>;5SU@cN-Gh_O{cF`a;uoB* z2#}%Yg~r4nuH%+{*1D4@ztL3b(Xw6aqs4Y zhMSN1v(@y!%o?h*cF9}(`d5G%{fv7Ju-fb`m*xFMx`B{DBV+ACYCdqyShq;K%EDfJ z`jT=~+w)sMfh^4^O0G&rz-}{);hF+_Rm%+GT;xwtMZUrJK(@vLqlS3{MaXbTv|T1c zm@f;|rbT2sU0|WojVlX|!+kq#oKeE(TN}raCcSxZU_o#l2b`xSt;m3XYMY;M&|FMU zPB_<{SB@5B1<=-tifO0}tc;Bxs?u}#<-&UzgafhXb$iLaOBI~csoOIxren?nu`-*r z9D_e^KhGE64@@wIpr*(cq&y$N^#QIFHw@FZB%*MuCb^6#zg8&9T>?gmt{ebri}&1l z60mbMi@R_D>wwYb9sP%bs;EIXbuP6H#Z%kJyUSw4xktwmd#?kF*PM z0|Ave?^ubjqj{xhA)48PLlJ0I+E-)Kx2kVpo0IxmgYk%?2wEltomy?KafHHfts9#c zIl<^KfIvaQqOj~#mU6~*l;+o0Aujmf--%?s##)r#bVb?KBh4oYE}yxc(AiF+QFF7( zC3uy85{2T`NJ<=>AtM7lhGi+X(&b(tV8JY19P{fDr5$v6xO}@h{`6R_ki~ByRuKCl zuNVUl`yH9VKZY463bJZmRK=TTy9^Men`au09GMF#E@@>?KNfE1PguOBQ6D12h!Fnn z%L<}UllhwO?jsdGINW1|yE;zpY3rEX$hPTN>nzZ{(sAE4-|IxbsX&6Q7KD`Uw1Nl| z;h1+gwmlbeqcyQFR}r*y%c40XaEi3}R{fNmIqG4IdGdwZ5*E!ZuowQ$zx0WZS%?%H zi&d0VC|r_-ORc{j2Xk*K8ND)f-}+=ndr$jg$-888w;j!npT_F5#G9LhWkX@Ypbi-; zh1RLzBEWleDF}#@&JHXpaZG<2!dmiNSgu&gqez~9A-4}AkqHPT*uwro01l|-F!pI) z7JL^M#Vf&vA(srvR4E9b*jW8nAai{_0;U#~D0OVz+xZ(8G-0lmJ#O^R_x^ZD++jH|Y(22Byv*#x~>osp*zTRg5lXj4IP@&)`{&^53$qzNU?;_ne;h8;Oo|>z}Gw zS@sBM3;l!?#6WBuTbAoXt{FspiFxpNHQSBj#%e6}qmO!obM0bd5=>1{RVO7P&A;pz z)vYYC74YvpFET;}PN_@mBhelrMVLBmSq=td*(pbbaDVo8OM&&rCWCo>k_}P+Q_MV6 zE2q85-fNzz3W-|1`@wlKrDrrMeAUctD}j5UqUrc!=TC;eboyXYd`<3gKo8fqB>+k| zyyKeHdSn_SD4pXS1Q{&gzS?cT4L%ulF6Sh+vosD+7<;O-5x^A0m^+?so-+S z#JAq3Y;>xFudtVV9&8sKKGEJ(k)~68cSKpzw^{nE02&GvciKR$!GYAJAin4?&Z)16 zmZ2e%NYsibTmtIyaOxxKwvobu*IOR--|*1P@@^*z#XCD{=D>p>o1W*jyaHWyb1bdI z(mk&}|18IWtL7YVC+|x{ScRP?S@E|W4Yv@$)(1oA6Y@|``ov}=&_em`lwChJJs5K} z9pId8ZJ%%Gy}h?5W1r%!JhAJ2BPtjc_)ks@ayM51lv$OLiV7l^n}7y%&5KUJm1j4e zgI3NnXsfW}?McyrDb_BT`^pcuH}__ZD&+4Bp2@2gvW5ML&E8mA#-x%Fi%;i%&mFD8 zE?f0x3~MKfB5t`MWKaE;cf*p0#Yw;zR!DEj%8BC{rCD|JZo~TftX%s<>@iLk1JMV2 zNL8tC9k*s|^!+O!4ZftFoNM@*ttPYkQyx+;rE1rf_O{{^6$hKx((84pzC*&-Cs_t` znLbojr*BRw3k!vmX!jd6q3=RV!g1*lr%a!=65|V{W}J^5%n2TqE7&Lb`iPFX;6G;2 z4mg7jbd(_Usqc3ivXREGCyrG)*n}%}a+r zJwf?utCfr_#{wsKaAXoz0~?N8H0=-dpW`ApmqLlA9@pv1r{|gB-;DJ3Y}-5C9E!w1 z+TMq|uOb%+eKA-jU77irHlczHURtlD834HK2*aq|^<1aW!t~AB(j)ut+~oV$SLs#d z4c->0ka>)tJ!x-;z?_}XS7PQ$t9W3}cY31kL-a^P#fKt+-*R=hUk+BZz=UXqD`<*j z7ShY0w0qP27`~Ufi>$fCS{q?c4>oH=`sBp0kkOF-0JN9F;6^`I9wHHvD4kB}X#cqe z#+K~o5?!TVOZ4{as&=cwr(z~&F0|-k0xSpol?C$8P5nup-VwD!smee8L}o3lTRlNL zYhE)l&#H<3)O1{tO!F&WJMVJXsj$g6&F61H$VC3(`7Cd-t$EpyW%#QI+3du;#~STJ zi1D?#VsqVg)##HzZni~-IcH&=KhxDEPnN9L?Q+VA5Pa(Xp7t_ndt(s36M_JnSXjQ) zIIop|0Q9E6t-BGx8e&9dVRX^QfRA%Gi=`@T<}Nx8%NQ5C>|ay}ig{?*am3)~S4QgQ z9ga2{1p(FluGxrY0tKrKCJtY?`ID*;1#_J--6Qeq#914oFCsU0XZ-Mvjg57QXl+Z- z&d?RpxbXb4gOGs05drBL!G8ice^5zJ(zPv3EP0pBg<7sT?V(G5O&|rjJ!xA~Tx*tl@0Q3H3=Fux_L%z6+}NIC+2RQ)#$%_6Z{L+PE0kJZT8^ z>ftQehu_f~3!HL=R1{-7-y5B4J|tdWb!X6y`)LLnlB@hjl<(Ij513|aLWgtE7c;Y> z0zP56oCO*QK-hp6|1qQI>ZoIf)cO}zX!{;lIdAPG&U>9(k^@CnLti(tY?Psz07m0A zfX(F^)P$8de7V^@^)plSTX?O{hKxddog{nDygU@;TJZ9)K_uDtQ3M)n^98Wn`@7+N zpml?5pVqGFAEW7cKivzK6aq!wl?Z@ae2KOIgF!?lwJB&bm)?709_`Ax^jYh`!J)BC z$Yabat3B+MwmtQ2H{rq0b&`G9K?8Tl^qlTE@jw*6cXZ#S?1emq5`iBvhNIoF z9AC5{cn6T6P+JYsjDEf_vhh?Zu`#Rk2%!egT3FZpaBpu;5%$-jC&j&6cAV2|e-T;- zWU|LWPnOd;R?^ocgESk7mr*-rZ*c?YTbiFg2SwL-cDtHKhOaprxeDpt-K~4~2ya;^ z@sO<+!6C|&f?Qs;2Vc~ELPG6uV=z@6U@N`RFZU#?Z6k5ge0cS*1jSLoqa7(CJ3U;C z_H}t2>cz+W&(S@?2S@Upp8wC^pzq&tV6Y50nhV~@1y7RJ|Hk&Y^SU6y`EM)-w%DC( z$`@Hjv6okBcu$GPAVekcosC%|w$GT?0Cip|_iKt!wA`1wb6cQgMGl0pvo_=S$Wl_^ zE?&p`*KY)Vi0{Lfz-6#xXA(UYbU6to|KX8?Ygqc0>;YnFBlh~I%v+Pn`)(YajZ7BS z;J)rXvMU~5{InZ&j@Lny`2uUtspLq&ALG5jPKxc>OQBXux3ewRyeuAh5A1vNCUAR{ zIG63XaD8viiaTFDl`f2HPva#wL^Q-;mGG&{S2|{%wxn__cV2Rq>KeHr7tJ`jw=g)X zaWU`PhJet*C%g{$gcE|^176^qiLzq5vyRs^Lk>54?{{Mh3GX8-6ju`i&N1K9*QL~b zj<>S<6=C-r?Uv_y?#7E7_F@dNWJkC(dOxc;9c^Vr+0u$iIt|z~4MAy~N>l*Ff6Ez| zZVfXuo*{<58P_;haB5G^MY&g|guLTamzf_-)LFt@1XK}hFrhg&+`5)`?5z6p8~6Rl zZlZf~D&7hIaDQ8F0=dUhh4I!BOrlFdsqQN?I`h zUxd+*+g~lEEGf=a?n-}l;`(b+!M-PRqO*2-W$_o{V}9Vrw^Cscd)ic#KTT@ErFWk- z&D!GnJ^#95G)L6`LV!u$?+Wak{b_7+3Wxj6<^JV0`@i*%C;LRi$S+sW4K za@*aQ8D{G#sW<}$G~rid(~|*7xqZbTW{H|%tk80u+4WhA7ZDTbYP?60R(Jm%K9sWZ zkB-|A?7l5c@|rt7lqB9Q(a7ER8q}!|-u3|lzf&eEKX{zQTHCbC2oi!z{P}nEwJ!~m zutz_1K~Z0eGgwH^)q)z@G+DE+NV$}l$jm*H_+|I0TSoD-2)bG)p{>tHTWQzrQH^-T zySGBMqllRK4VM6gnJb2k6FCKqp=r;vB3 z&=zJDRdTP&?N{Z=2@Y*DSq1-QK<~Q5v+pbv-NG zNH^Pa*44fUb`tX*w|xVlg4iqqlb{kUK{1Ku3L404-T*cROI&lg7Qp@LnO2Decmfa4 zIO}qOFs%oB;1U+wmA*G&9`rJI>rl~AT;$JU#93Al^Cp(zM8WS2!G+I3qy&MlYPSl5 zHgqv@W9*9#3b7w=IK1Dix+hz8R98A!h~A(>BlIETu`RBfJsfwm)J!A9stSlo?dOY6 zqqrwZ#-=71nc>a>864L#&yj9J`BQGkI|xc6^1=3(Ci+aXVC_Kz)Evk+rDFq4#X+by z{2kFCbVUu|cQIg@zm_b1CD$`A%f0dRq68dXDo8dtIYNFG{a3r~K-^gl#33ag#|EJu zs#zt#^+S=uOd}g?CFnnC;``HiBgu8fYgX=?hcS1(EhQ+9vz{z;G|)PS;d+^Mk1fr6 z#6JRl!={sD`ARKce-%wGe>ql@i${LGOYKh*Ek^j4@4c<{Rt#7toMAFEWNX1`0yQ zIRo38yIBU@WB1POdR^zqHDaBPT8kLJa$#4O`R>o5S3EBUjH-7y`$kE-ONtlNGRw^9 z-;!y$$-@AJo^>8XxlTh0{GY;tlmey$JTgvRaQ+Mv-hoYNj=(Pt(Hc`3uDd{j1E8x^ zOqFSs$d)IMhu=HwRI_j{uR71jj!W1XP8aBG^2O~}J^J;2kMe1jes(0C`C!nxPMzav zj5mI!>gj*~z^Ay30-3pZ_-Wp)02 zb^pxVNQgn~$H!G28O~2V|2BGI1TlOg8fOhZBE;cB{Ap}EqIVp*I#SL@z0qw(hS#bKQyG$=DEWrr08D(&-`EbKGy{p`y2>c%|t-a zpfpCYTkY)=$ycA1V~W!(q)vvs(B8}scl#FYHh-5}J925HphrycA|yO;E_Y#?5tM!3 zHBHMHJe>XfYvDh?zl8i|SKbJFdD>CUrOrEKHIcpyGjmo~`UW9?1FS9zRvjDSx*Y2c zTCl9xSRl2387qP|0eH;fhuy9$xebTuD_=I>#}V8TMH>v1vo{=HiK&Ce9>Hdz(s|U%xJQ3M<@G$bZDgKt5${N?29x}Qpo`B;0O!($XiFup zo}PiR#r#K>Z}Lk+*Gg3``$PSfe)xw7+9MbgS`Hb9v9&;pg|EWGwA5waF=A^X3n{2&gl#bfdi7X`%im z(HJZ_vR9BG&?Mz_O?5+s{G&pqoOle3z1jpJMF`Bha2iK_q=Vi8{54Hh#{nS3qa*CN+pRXtYJ#_2h)F^J>y z!1;i;jPc(?S_36^k1iW`t$#?!Sg{1<0RqDy$DEW7HwNAptF32Ng&w<7{G9T_rk&YzOIkm_H3c`KPJiIxD6^p#9V*grRQb*dXdXC5=u)H#>qo@XZ<*5;1R zdb^?N`B#e^qz4{KfQo`iIBEEfDCuQ-Y9C6v%)qXt<8}G;IpxB0uUfx%Z$C7%h6Y7A zU5jV>&}{_-1h*$P>GdGQTy3spy5VF^uBCm(D#G`kWmMkn^;fkTSMNadv2(?Ie)nd!wa=MD6c5^5GUFdfub1dUlX79PDgBj2eHt%B3Puj9zsm{1?B|nl%}#^(v}W{W z@Cgt)adEB@Gr@aiz)qgA{Ef?VDrAoaKl3nsaBb)JsWSo)aqI!q=V$;74Z`HR4OqGT zS5=g?bO3X;hj67ChmVt)3OzYT8jDArb`SSxXJJ_0x2VM-x_L4wP(DdY!nQeWKI4dU z!$IR`UtltNpl5VA!}#Jk)~y#Wef9BS;m^k{C?SDwZ2imEoi{95XE&bnz8pH?NMYkQ zDNmzHDTo$#%7hd+w_o0Knk!Yk9QxTZvSH@I9iz$?YShhn(`b$mf4BrUV9zS`0MD8J zoNmy(CS~tK>}c|}ZNj!0XBD=+9PKWW)|OPyvs>>;`QJy{{3lwy|IhjW(9E>|evSWL Nga1co0P*kQ{{T;)Lrnkx literal 37036 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

lqWn=o!0KD)-qM!uugErBgT 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 Vp8wy3miqtC^8d#B#Qr<=KL9I>gf9R9 literal 39114 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

A%Gc74|taICXm^R*1)X7sYKSE{< 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%0DxM#S?Ue&-tD8jccZO47)wAg(3-j6+&gO}J*m@#t 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

xXz$tCm9awgDwKmWVb+~qY3^fP*w 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

YKYrO+ zZoDX+&$-npy$@W)$(&-UjaI9BcQk8~Q?sNW1uN7=TdqCYRP^X_5Wdb`Sx^+UNU#2` z4e8&HEX_JkGRSFu5L)>`fq-+uDy6BFDi&{9isw4&o6PU7KPD9CJo*(%0!(t=>j6d8 zF{x3sGZ4b2p4fiBa`MSz@dp}nO$VdhpSBR1_1*f?r;$q=%7)Z%PqqS$HLaABg zH<7j`PVRf3SG;1y=bE06Keen+UDo-zO73Rz?m!=WZ~h`CGEewW^=?n#d}2qfM?Kzo zyT9X{(l?eJqa3%Gg{T>B164;3VW_qOwmM2|k~~U1w&7_sl%7aT>j^%pMIpYE+o^wQ4zz};EWG^4iX z#HquwH*asqyc`PeDfjL|R!z3z;!du8Wg?);B^Svaa^wTQTt?H|usLH*TDKVM4TIZ= z6s#?%uw~-_lFVj{C^WwxT+l$2y1J2J|2?O^#Khuq! z6D^R5+!t`U_2POOZq|FEoJV~UCRFPs)=gn?Etj~zZQ$%&{P=QFV8P&^|Caa0p_%m= z7yYV6=a|p-eS!toK3lx(JDO7dS=d|bD_;GFbA6NE3?ME6>WUz>=rMOv$|Qj3gJj27 zOm9XnLazpG9THUJtVVb{FlAjgxxPQA;OIge)H9I#q7zOmY>RrAyp_@E{+F*^;l;m> z+Fjcaev&?Z(6l@JVx5e)JnPTOC%D$Sg{n`xwi8S>pufK*cZS+5 zHj8!kX@6a*8n^uR+0-T}&2#Xog1Qu5ry6qje$XFOSs`!&KlN5cK{MGoUDs4Sg!PX! zNG)_-%DZr|bQK}u(RkHFcVI?g-Qt8=AxkdbU)M4-IOcS^!n&El?czVRh*CJI>^W8iU02>rpZSA9qskPj({#*hJ^QM|}>J?tcoH?q(2eAiCuH ze)!hyx)GhE*s6xx?~a+(aMW5xsd=N!e_lIc$MK#aNRD9gE<#dEyr;e)g_#;CtTIi# zH)E)8NO-ht6GnR$`NAS-?Q>6DYE$XT5r;s#`yI<)z25!x`CMU&sD-PJZ&lI0#~(*5 zO1FnjI$BJB9oc~zSTe3187oSk4DkcDR?GK!-fq*^F4Y%#4LZekE4V5e`h&RZLhqL{1Y-=q&AXC#cPE!U%%~4-`T*+-4tExwORV}P1R&Rf2U)q*ngX;&?KDgJYW9i)7bmVO< z!KJ@$guHy;(%SdjS@Ok-!*&De;1D_a*N%y*{%xaBa_z<=ni9B4Bc>#(K$sEpBNExo zJWjdfSYEu0iY(;y9=dT;-afjhzK8Q*&;ieGwqX2=!q|hM;YU@_Zo}0INUnFh1;35rB#wNAqDGo z9PJ{VALz1h;!sH?v4y0;V47nWS4eO~$;^P;wEoB59kWM!PM@+1z8iXtY*d;=4Tg9{ zJL{Sa`R*~L(Bc<_5Q*|5&mun0ivG2)ucZR6`Kj;0IdWKe!T*y)EUn(ID+o;;p!^65 z#-zUZCYl`JQHI)h_MtX%fO32W%H4kT{pOsyaKjxRaPAN1koh~=oxf>=`)_{-1y){~ zG!UOmf7|$XIq3f}Hu`sxPyg(pA>=eG;aYtFvX=vBfA!{>!*BtdKb+6ES$X7#_GtCP z!Te7(;x5ZIAJCyCCaexK<`OEs+C5jI5ANZGMV>Ly6?^(FMnnCxgIowtYRZF_ZBDro z!Xe;Y(YR?rs=)hO_ygE+yoB~|*gi$#?TH!Qgvz?6=CPuS+({Ao=0)!wYkdBA>6qx9 zO}QIA9E1<9p|m5+31nr?Mn1V2FcDXBbe3s$NlQl5smnKyCKb*)cc)Ny+ErfHY?pW{ zp0IJ=dpY@t(ucp3_=1C->rV93-;z?gk8n$iiFImN)x=++V04uoo%(5cvAVa-Sc4C| zRyf?_uEy~y=*Jdaq%SPsHPKT)?~(2CWkAo&IbyzX_m$B{3;FNDQD5W zD?zhm>l57#8JF%0J9~^X62DkBR)3~jk0Kx?^g26vjVcBi`W8B@*3=egjjPLLb~Yc{ z9)F&DlLZxqhb7$#6vib&{{W7MNnUrYNeDWeKmpjc0w@byInzeD)&jAZ$OZ=vm^IqZ0B5`g%srzIG4zknIc@ zhvi12&6ZD_2>B1Czsm8ivXA3D_bs$-9Gdttt$RYAx zB|Jk6?$h$c@{_&sg#u#t{iN=)Q+ipCi_xuD&b~i$BlZNzmW@AFx{%|$V!jDX zm(#5#Mt#xhrFe|Vci6RkAwo890)=3rF|gp7zf~LCleJ5aRl{u%nD^}b{@u?${|2u9 zBj5iC!2W+=0QxroHV8C1>80wRV-YZeV2aYIQrdWS$?!rdKj`H@nhtkcT z{EN}gh-Vv(pR5`kevif+B}^*}#uoajmu*zxZ`*rZN{yR(DMumnWy+}*_`t8@lgWS2~x2>}R;7XaU-ekX# z$z?veWHklfQE;NhskfPr&O)Z9FNST}-JH@WK3re_E?!!|R_%ir$AC?uH;3>Vk++$X zIR?mA(xP#dO6x&1ag6E*gMdW>pUbQdQnbs<}300D0sornSbbS2@ z-PN8vDGcOs2Z%L#>puZnC<~r9Iv?APWBl4V6B&!CwG`Zl4OpUSp(FhSWBnt*G`{NiS-6&`W!lb#vB<;}D={SficA zTxP@tU_wjj*TH*TW=@LUA;izONpRi5MO`LlqB$SeXBXH%3=9`~zyfc$WPOeSRlZ##uay+q<6Wz{7t6wgz#HO|D=Kb`?AV4gigJ-7e(ZDAx zCH{tO_92$GcYec06am!+l71A)m`2{PakbMr{?mpGmbZ~B?$_CcjZ#n>qzYhdWzfyk zKl~eJp2w)hkvnm_o{_C4k^?9HdF}s?#^L7{i2!MG+%-5#QEJ2Qr(1%hJH;T}`VBh} zR=BZ1PW~E7-0PmYWlPgOxeC-OKDO zH4tn9oid*XVYtOzx+0vM>9F8DP@998nQ^ww29ic+6Vj5 zN7vmyul?8k_g`@wun~ZC6*6G?4dcc$g@EbMcc=bo7;9kir)}UN6JT%7cQc+c@~L>a zjRLdT(4W%iP5MBJ7_R;E%5T_nE9MLlawF0zK(VkGSaEd2V5USd4Rsd0k0n!V zjd{R&eXDAaQ3$>o7*D_a#M)(1ajKu^zHBXY4PeHO0;(E=fC^{}^}uAWrvFt)LY0Jt~#)9Os7=SaXzT!Xbd4bK>Z7y0`VT zbUxQoFXX5fb)S8aK^CDok#$Fn_HC{L(xqAuDR~? z==rwxhS~c3`O81wn$;{}vgcnm?KPFE>waGqeB`qkSe@jb;lE+4g18z2^B{q_UdV)N zA{d9z)N!yJg+U8_)-Joy|529~<63zGn&n+F+MsxWB1l5C;G{A7M#mX18|_Fg+{RGK zQo^l#i|=ba{_?TzY>)czkMs_EXiD7e4n%EyQx06rFg6jobnt%wFtconb}v9`yX$M@ z%gfdPyMVM7L%Xb#P8PTK9LgcN{D!r`Vfk*|ZBFldjuKCbX{N@4N?>h6?#CRGM`W z;>1sfW2MNU8&1n}5^W+BiV%27w~D;`6Jz<2#r?;uV3CY}pbF<-t8s*5C}t$PXeJL` ziz3>^mmogk+bl(X5fl1)Z6-P1A;7=vdics;F>DXs7V5&35@A1gK<^(ox1$+Ax+)7? zI#fwBUY%E&AYdG@?|pMQqHoPcG)!%LD74Ug;jk%VUY6ldM$$kkTE>rGtqA(Tjza*V z2to>ijp#cJDGY-iYe-qM6Q3r{h9@m_1-Q3m&+mo8`I6T)LJ)hyq(?h$Yfby&yi>i> zHRLbu?%rjg^};-nO02ttrQa~XG>8|$91d6}#$XLTV62|bYb9BExBq&sSCjeI%~Sy& zhxD5IipSFX9)t_ARQ{ubVl2axX>yU`vK#k(nERV!P7+$SW~6LgG3WBTcbOhRPOk*z zv~c_G^H{92!!Q=*xYibAMU{y7R)=OBNdKUL>N_D;T8vm%12nE7)umw9Fx!t#CoCUL zd>YEMVpDL!d^r7ePX?FdF``=nX4T9w!Ox<5Y-AoN^++B;<_NKT|CgerzmrD!55LFQQIJgTmo#;{ z0^_x|=Cs^Z2u^wN8wNCgRaOD_&@v@It$jWIl#jGexumwmNQuC3Uo>S z8>0F@`z}mDwh|$Y;`LfeKedmHTz6W6NBxG0`&V1Xi#iSxV=&$%>$rvKJM8pam%nOr z+zxLRTfCT+Jmq!Vd2g=z?3vAf9XDk(y%>;@&HjeD7^(k;ebZ!zMS22!ae}x9=Z3#m z3#fp6kO!rdOrkd>RF4Og$=5fIZM_J1VxT3dQpu;!$VMzaqY|sY zM%y7*>{8_!Pn*T871K2e-An1V5Q>pg>}n!mS|;vn7If@+_kitz{)*GAQpCgE-AJ+v zLY(=*0xVVwMvRdtc6eTr%zXLUPkc9t&}irj>S}bV;zMq|t%;Vp@a1@XIJQ-Cdrn2x z)=T0H?=;~G6!J&-r1cch9TXUKgF1~VG<6rsU&JT6ib9mawPP3~pev5#Fp3I);rGk4 z{^Q4~IRN=Chlwj0OGee^1QoEtSayH>Bg++BBU#*yNReh|mhpio>S}uT1DXrQ-;=1Y< z3nWVmnt_VXLy^zI2yOFfWW^%kxYTB8jPZL3%gIKBc8|xs4c*R%{@F)dPuR@s!Il!( z_;To~d%^&r@_h=MtI}RHbQa+rah3esjw3Xqa_yT^z82l1($x8;@eIn^(q;(Cms#s+TmKjW%E0_xvcaE_H9#C3pzu&Xmt zu*Wb?padn_jqVER0%aMku=KiE>&F6gR!m@|=6>5<9nzp9*g zoCmoIvTvd5)=O!S(!zTF(!zA>Jl?vx9`+ zrdvr#(ZllPjj_MEmw$g>|KVo`rWzR^gNayjv2JNTNgl$N`Q%REbz&77$d60@f-lnaG(-3q+DDI`- z$@BGyMB)!Y-$2@ZB>BP?q+YyU zMpK)^wF1&dZ}bd$5mZXH%|f-lfc(s$-S8 z3!`NM6ZBUjSohf8`8|wGBe-9!-Y>hTMubSdNMTr%XVYH-JI=?VPm3vp%g=Ce6Jd|- zUViw;YXY#Ko}l$2!W{{z4R7En!L9rlSv=M44OtX4{)qE|Xk#17bfyS7c5V!1R~#(+ z!5%$ie>QNZ|J~`E6ISoK*N0hBwXX=wukA)_4{)3z@ zSInKVo%b>Hz@zFj2)|*VQ*Z`NB|^qz?`4JI4o%iDIchGXS*{e{XjuMrA}4fS3@fXxp~#pIkj0qq8B=T{CI@1S&oCE@xOb zRAA;_5bK#6jy}&#{NGB%igK7y`5CdzhIBo~v*tt0c|;BH$kzLyv}L{yD~;~cvE41% zIY+-@h2Q)48{CP^bHOr$&F~gr~)0vnoMpro#7cc)sRuxh@k0VU^SCl z+Qhi}^@aUqU=|Q!3a`s}YPZcWq?wVAJ+EKADjHA!P#Z9hr7}t|93;&|TqUBzI@X9U z)2obx*z@g|Yxd{1jkn3@;_Lh5Jcf z6Ki)p^4{L4@>Wd7lL%D5vV4SBe8)hqJW}`T)Dhz#Lp-T*`;*53Yim-{n%HX%x{lO$C7b$@ za)p|=J9a}^LTuhwhR(%i95Fx0J|_LFSpu9EJ*)GTajiU9t~sN^eP-9a2}L`-GB$y| zgl{J8E1TDD2B)4_Jq0&~BAELQ(qUnTi6oND=M9#|&1JAy=D^9JJWzk8y$isQy(zaUrxym7X-O9EDe~5@ z&h@oVMe{~-QFf`J&!p`Jk;R!J6>jGXl!W3^6a+rQnjilxujN)AmrJS1Kk z00&-mN*@Bt?MgbG}m3CeFb;eta&NHYizCLW z+9g+RP7z$8AE2&!FXQ28>oE+PviQM{q?h)6fj#VKj#YiVcxppQINk#Uz-Ecossr24 z8S8n6T!>obrdU48Rtw_(FFU$;aS3!(t%1B6ob>R5v= zmX60uPWA)2xSURWVu2+1q)*sh1Q*7TqS+xLEksd@qDLU&8?`)N4~yVmS)$#!oqB`) z%jNQ)xt-H`scfN|_=&g(I@Z44(Ob79@0yMMIDWkz08T!5_Sw}p7Baj+hZe*hT?sj! zs^^~CZ%6bW{%Nm7)dcNUpt$)r%!+&w?2EAlGI&Nvk+AMWIk~b(+ozoF zIs#%})Vzn)OKQt4jwfKnyGd3N9W#x#J>I$Y#RUhSMeXfbKB0Cc#85OBY?eDql$>bL zZkIM20ZtfL-Bqj+nwNfkD zdYQ=?146Ye2th;Bd7vP2E%g!9R>6FaRV9wgG`_D&i_5JN(fsT@XTTDeG5$J}v0vT| z^BdNbbsU%7BV2C*d<_$mm&jilMM%Q zY#-p-^x4!h2NjB*S9B$)aZxen9Zr|HJ6qGmE4%3jww4Y_mzF>ej%@N#8GzZTAJ;0! z+ym)Rix_FRK+WlP5|3;ZQj!T$%|hB%#x;9=GL{0|cI*tLxB<`OvFMW*Ile9=Vih6Q zRvga{cyhBMegL7=%zj0e7?M8HV2XJNZ5#=+*`Jz z^NY5?$rcVFIn@w_WSyJ@q(xrH-yF4fT+LC|MB7VhwbZ-Kn#dJ2W8&V*O(Pbo7I=&f zhh3%ufHWG1?ZH(d?;A;3F1aZFhPkG-xk^B_hBINd%U4Ifm)d`SN5J+<^mrs1lBQ2f z?U)Ot6un`gPOj&J=>k(0?a%xO=bv5TSnsD@@df5T5!*L;#78vOg_#o)y6>e|#=Jfx ztEVC)qNomCv?p^Bib}V)s9B8r06uxQP=oBmM=u;;Y6D240v@~Be1HzlJ9gJeX?sxf zisEfEtxCVH-bV*t>v?Z2*4}Zhv?}P+U0&=npg#tGlhc`&hz0v5dI&p@>Pz|NEp9!1{hm_)kQh8~>_A1TSOR<|3tCRSmJB0wN`UHn1-bZk;THvDWSEp*R5;I$*b*@9v!yI=@m2 z+?~u!FEd$gaPe9pIoIFk|EOD8Vu=gkec!x**S>!>Nx*y8rzr&%Imyup)TKoc`?|aJ zaS4vxklNQ`dueqSM?nAsdB@X7L#g@m$jr}lrq@P8_>k&n!hYa=TkvEvqOdPhc3fL? z*4rc-oWN_vW1kH#F>JLAo9Y-l)1@=4CH`{R?V_eJ|SwX?|q+B+;U5Lc`L5bA#fBCUg$8=v;3^;v3qzA z$LvCN?M5$6f!XG|w+2e0Ibm*nzz7yCe9Vi~{-!RUBf5Q;TcN2+W#{9uXfFQ305)$i z;dC1CF|B4qH^l6(QQLP6kUa5GSM412Q7d#D6`1(a#q2mL>*}Q6^X%PO`2&(&LJv-z z*h@4Z`hGYww-v;`PZTVsw3Nf`Kqif69e!SOINByfX3jbvNA9L|2W!Ni?M) zXT+X{bF!V?x5COg+02J+Ly&DXK@z0Z-U#g5)-wpdFoYL@cPh-g&2c!E?vLmAkrG}F z7x3NHEe|-9kA9t{c)(RnKx0+ZFSd(RQpNJ!dgBi?1@N`#0Bq-iFbR^NSzyOc>c!C= zsV{?#V)o`mmRNam!}=8_r=I-fc=*ymu|D3{5}OZDJs|2qR-qFBiZ*+h+Si!0oL#t# zWM3unV+l=mDwUfQ!th)a!;@E6=Gg>|DqGiO&0K^ooZ!I0{DR z{f71F5`C;`vP=Mxjv9`Kd(#gnEhzzWeV<4+=ezq0cb9(Dx467+QB^(EE`w9pb(=|H z+p$(<$+z|K0pQ-qw{Biw;>0*)7tBez`aeJ^I5fxhOSmeY%KG0M&Nyo4KJvC-PQD!`8af z)Nk0^AL@q`@@(#TJShDbZr&H#QX#j(ITS|7!Y$5DFTvj`rB&UNq1ooqOv2`8Kwe~G zht~|-C6$MI*J2Nq z54~9|Ro%n+4M1GhBpd{6J)NJ{S~D-zKoQ-jd}a(!)NZgcv+{T!Vu49Q74Zh{MyXqj z_P^v2S?ddUu6x9|{4$ff8?4bQI7q3OF4)r)R076uoZy+j?$Szc=95Zg@)|J}npnFcuuSGkNl?*0IXaP-8nTDpKfHQ7_<9vSB> z1FDg~rXjg;t#%;2??f7=3)nHarpbhEald(=0!3(zoOW(PZDDg574&5OjGDL9BdNIM zQ}7TvKX|VpTU0t z6>TSfSWd>SpGXcyv=CyN^%w<2FC6bTEPqw>9L^8T1qFVbIxT~WRQ$!=A5nTd*Wln% zhIX=$GvA!jt_hIg?f_^(aWs<+JJ75}#>J`KYO-vFSEHll$Yn!#zX$opM8eab#9fni zK5Hi8?tFN=aQX8=7|oJe&Zr`KrcDJekuX;nuZ{G43b;Nf)zJ*|yGm8HYct)At~TLTB4>H>9y0vv4IQY0%iguK!^=;Tbst&fF(hDKbs)8ILE6)uJG zT>Z5*zBeXv`DfYfds{mA>%P4*D+$y47v}N$KUI{`&*)-*S_*wSwH8% zj-hpG#FQ|n=ea0~b{*Ncn&ITlA2v!08Qk|PQQ^doH!_a>N-p@$(u)D{TJ%GVHsdc~ zGG8v#hB0apD1C-R3s!uBDKQ& zyv6Jx)@-f6q=nISb4V-enUuowlov4pn2FF@k)wlb6QQuZN3GE}(g#^LWTSf$&1I5P zQQ+*Xq}hgsg(Wffi!z#d^NTHs7Y03k$Zet zii^XVdVQ4eFWwT&Z2$wlB$CGax_+{4m?P}&YW4^A*fo2RP~}P?NzvPG_CLICE6Hb` zl3t}5149@1CtV0wj5-^(qVN(#e|5g|lnYtPNe-j_+GS@hxoDg|H65yx)%e!&jr^X9 zdf{OiI|AK|@fI9Wkuiu$_LYsNB+v%;3x&~m`{CL63rcos#<$x9Pq{<#lqBt}FPDZ2 zcm2BY?nn{vVQ&idLIBr+~@#itU z>HFN(zY6!54Fyxu+Tv?)tu^pkyY_{+(f$bXP8&|r0QrJ`*yFE$0qC|WL)V9XFZ1CU zgROT0+}d%5Rxs>5#u(Zq=Ph}+q&QI@QC1R}t&1t#ZQD@N)d^<1L9=O|>Jm_yVK@{4D90n(AuJwtn`_j92EUdyWAgDcYtGC9}MEnT0X}XY&elB zTYJ@zE5pM5>JJUr8d3_^dXdhxG@OVep8=i+;2Q9Q(~-sI6nF>jzPM{C`dymt%<`G+ z!5EttaP3+r zLSE2i#)Rkj;xg(nb?_FEd>IZY&8N`rfVo3puF?)bdL6f2Ijzq1TT4sU*N%*@zm|W~ zP+MOUvytPM=QhzRA#?ER30T&i=1@SX!cDu)?D!260Pr|21XS0h$ew+bvELHa;`uL z<*t~+jAyrI@vt=`i7}n<7o*=bg&bejjck?4+&+v}n5oLH;EXO^x4YqBOsG}eX<+W> zPYt-KIkna*EzuvA0hscp$ybL`K`8q=MaFVedtp=Nmim;3^!P8ie>{`$59S^JE-e4Q z`?Z)Tp!drO((@Q+Xyr9_6v@R@#@Is=%Ugm6=G7^hEd*(cC(X_6N|B%To(TAY$>^j% z8R)1K2}G^^Qf6I2PK`3T(#aB3b;?8?CG8Ytw<8TsKSfb|m>XD4;U*DN%R>eoNuBZn z3MJmNLN**MHQnOddoRFP`<$4ZVl>&QKNr7U+)9B<(2p)!i=i^V&8tIlOXx&V5$XNo z)SShk7n3y{3tdN;YB$+ZM53Z#gR!B{UJY=(yo z)0~m>5^J(A9W@H|tyG-q9o6_>iOe26QZo*dnnR5kM9_rjs!#%r8`$?&giaH#gFo!p z&Qc?GU(V&~`lyhj#YMR@TxV0bO;&#T?cY-MTF-w-YKl&TQ5X@_!;l?GbLu46fmxeG z5)rj%0G@|KifQXj6f~9fPk)Et zJyLestF?I;dHDXVNLKU41|t8r2fW8PpH?cGU}p}TArWK5jjCTjq1F}kQMYLE)yHjBW9w3$ z`buS86gqqe7W_`{9N@QRT^>#)l1i%K1wM!XpF z$o<2ey!*m^6+WFl%=JL2zgaP*&THt4mmzUo7Mxb=7&(Z=$F9my9DzAtJM%fFxFaG( zCE)Uzu@KHpb$`dU@v>#zl|F|gbE!{RD;eGyw%%%7Cw?6RHAZ|?6fg#Q7;(k}tX?<8 zl6s3#(tHx~Zud_G<-XNWok) z5^mw+#r4|Ca2?|Jkpf04C?lgui4MJs=id7{=A9kw;GX-GewZ{;PuV!3UlK48fDM2be0^e-AjVl`qy7a}ip4N(xuDr`Q*b}OC zU{EfdkH2%nO^;Hyp|eoWN~gSt7*vsH z@U^v<&)}53x1ld36s2Xp|42);F--(8zjiZun4Ji2BM$5YLLA|bvboNx79Rp`NQ%Nqz8`-dKEsl2u~R~{+#W`k zmzR*zep<+|$)%jO;e@Rs5D*sxYKU8E@x&fg{^{ZtHb&@!U4+qIB*Ms=;FtyAlyxVv zAd_p9gq+5^KwJPAV8duGN=#L2?)f@{nY=kzd`9BqxkG2&wI|QF776U#$#s*|dl+g5 zq>Z$etRcm?4Q`sA1x*yxBq4maX3VI0P&!Go(ucT@DFUrsohS#iVe6JECW?h>db+wF z9E-}H=JT%{tJ06UcvnpHmps@s$G|W?#fUMYzw<###MnlbKd!o#a+r*`x2278(eEnQ zKT1#-H#l12)aF(@{v<*^BjRQr=P{Mz(q3ZbibQ=39H6(Rj5G#=0C8Yz6k_lq3E zzhO1QbU`O7n$du6)LVupXhFqoOg*xD-#jmrLtg91_&P89f$g4vyl9ZO^4xN|%S{WI zfJGZ4o4AJY8X?7k&H4U1i%LsQj)2;R>J^ROVsk4_;o8-*#VPhUl{vQOSy}h zlK1}JV5B}M8i=Hf0ULd~QTSnQlOZ7~0sjPq!UQW4wbJTrVVitsU zqh>F78wbu`>I;o_H7l@q9xnE{*@E!Q=gEFMK#K(D#lAY+y}3In#2*&|MU6z%wL6>RB=*|ry3Jk1xsF#8uOhob>~2yuF{6#b)AK5B8pWmi&EBLm%k)2FxwsZg~-22x0ndN?g|#jE;d; z$P)`B-B&aC4m2x96MAZt@&qc_w*Ij*XDsA(YG+TIX{>!eIxsIa0yj-yav9S!n7s>? z)?M&v&Be~i`0pV0$9Pfn;&t-9I?FdgeTwZW6NkXU@vMKXOK#uCdFkq-9Jp4`al#8w z&v2CS80QI(!&UOF7G?++kO5@fy+W-^E(~RKM@3*F)))^g4g^lW8fq zN{^gF7f7OBChyV(ZQ+oDS-dQTBLORF^33vu7O1$y&0Lamt=>NGRhuX;(0$|ThwLLP zDaRx@5SBKl;PQ|tlS_CJh=~m@2!a+cv=nn@p-K~Ef-x7#56BxM7*ond`AefH@6Ur` zCsEZI@h;id#EKk@|C|I*tQl$JTD6Q==^>CDS!+=#snLnF773@~D7CQ|o5k7ulgx1q zw5GPIcWssBM1;4)pR3J+c$wveC zM!KE8TqZ_85z3~iTUZ?4eD<=~)4#NNS9E_|OucbrZOD2SO_hYKXm=pKHX@&qCKT7< z7?5+{NY>Z&=%^=o{NsUsb!x%T`|iU9VrNcwooTwFD#>$lveM?1G%qaxO!El@0HtOp zX4~uWo$oLvPa#5U&Lw9^iKKLwZmf|`;^XU=;g+p#jLWiv1)A-TgKhM%-NaXF(gliJ z@RfuvEB$36FjD?}Goqx)cy04Qx%bwc3yGC}*|}&u_ZihrU!IGnoV(T=@((6|lDv!h zc1{^a$YM%jdl15ZG%_F+JU|zGw_hfXFxp%_fs=k$>{4fz>Sw`&n4f``;puIf@Vu)h73+#! z=1$Gr68RN&o!eNvt)jGMxv{aF?;y8pE3g8_6ip_l5=||vmc*BA;7!h`R z8PDRj1;{M$mSx&L-Jgf*E9>l>vK~z*XBaelByVepdfn`-9K2H|#Pahu40M2J(cmt0 z<*{a1*f2GN@f35JOmz`ovnCG%3{VJj1vMzzR^YG6V<#S2==2jCQeTG(zM*9QST*J& z3*iPt1a6}lVh4le4;`kdhn03RkJN&pXh{}T#_yfNZ+#Rx)4B!rO9gq>dY%#as6$#1H&CMVFUM^dQfSMmMT_b-I@YYKL~*8)Ze{V; zJJGn(#@IQT7{^;JD%)t8yLU?D*1svUenuuN0QcXCo)Kj3EBe3Md(&_z`}lpBhzd>i zEk>49mdRex3}s1@c3aFXJ26QzGG@rWhftJBDv>2w#y<8XTPVwjF(V|#%qZi^EcbKW z&-3>G=6Urz|NrrO;msTl<66F-<@}uI`B{X39n{;maZr(VA;6gBkeDa(NCSV1dAXEb zSU7t}V83+zn}Dp%zpb+(ReYvMmrt=<7eDXkNgZ5`H{>UeBc;GZV2qVSw=C|^uCgxx zh+gHB3dB_1e;64h)UyvM3Ky!3BHQ4bRH{|x{j5DBYT6->TkcriPV*tam9X=;I-4Fu z${CZ5SV$LFxu42QrJl~Gw)N}=P5M1@j}hv3yY}^O`BqfDMto3-zJXd@yN{*KJ>lsa zjxRuPV2dn0ZRy?hnP4}c2|)~KOji^QZN1E828e3d~@3!|Os zqf_W{n16QQ#~B=xtv6SOwB*ym9Yii9ptJX}qS;Qgkw-gm2*2t%#s8Yx2qt0?)s2I2 z;FA~)##qnp+4_~XD$>GGcw}Ih2P#ab^=hwvb&<)ik~qjlU60&#qnN!mx+U?Jr9;7Fx7x)|y@B=lg?E)$S^8LB$fNsMaTXSuZk_aDmmy z(7i-&oD%jMRGAaTsO@(VPW&@dg)x1PIoeos47TE<$1S?mSoFYtV({(<)d6#f)82~K zi;%bPt5e_*T<0aTn_-e{N5ULoTIRbXCZf_L?DsV~Yd&#v ztw}F7P(5EifAITB>0vaTcVLIA76e{$3hp5GIETN6u^LzJc5Y#;Ls^#@+fBubcY12| z8)gMPzc#X>cOi(1_SO~k%3U}Kvgdt(&_1|0GjR?Sl}j*h6_(??e_dPK#k0cxgmN>s zv?KDiHZ+HFO>}?U)&JooIz37P?`#-zYzfuNg-{?Ht|e#-86=4Pr(>+B4oRQ^$=EsCbW`7BL}1Bv+ta#+e_@N`1uVUAjW_qz z@88xwy)dpdq+k$JXPC5qNc5-U*n-Nxd{5s4HoOsb4{{eXu7w9X#$k&<5F8O)W7gNR z(srNf2fE8U*Zu6uYram^F_eqGBb5h*sUM6`jfNM$ZokHT0?wbu;L z#udC#c))W=-F7puPBFa2@4`0~{(G>g6VaI_kbP=wn9Q&zX57Mkq<5m^(Y3u>gT}E- zND-j0-yPbJH6Xd}a*Gi0Zo%2obkGnnt9ax7<$w7q`LHEdk^69+nyqRf?34CvD`#-2 zJ-_U(a@(7A?5VGt$RntC3~oKI$W9 zhm8m_4aMH@r#@|KatO&)i!+}&v$?YqV%?v{*qHlFmp~*hq zd<&L(8+N<+4fyP zzKKqhN0dMxuHk&`-Zt4I-WIyE;a0jr-&FXpg}<7so)@p>pIIQh?*tc%3yg(_hw1lA ziL2&?hu_ &M|>$Y=ZR=k910RY!HYM;ZDpsJa4HnN9869SzG8|>{ZayOYy`{n-8=P_p&);wyE>h$c z6Ypk%B&Ne0S@65dzQ7M(BuZA)%V9LD&WERE<@9mkG26di^m@fIhj5BIIw&0UD&azVq%M|Xg&x91oSSy?T9%S zob=4ZAnu<Vl~gFVWLV)}Mhy6p7ca+e>6D-ToGFVxlNZH|Q$ zI<+=6;qUiL7*5zKyrUoQxZOw;B>WoPT(DjB`?2-i_V8o#D)GK=;K{3Ff=U~;MSC?iu8((O@orb8ABs6x?Kgm+Bv;@Ik)7t+e=T2+CrC_rrNwsXSwbNURIW2>8g6I zgFDf8qd?)QFwascl-IF?*ggJ!Ps4L&AjQ3*NIBmccury0GatZU@e0$Wl^11K%tGDvVl3EDjHR+1aGebSyZJ-Ng8`t60{X-*g7)(IrQfJOcr|l_ z;7|GYwiGT!+&^smbI|?F1Y|CUwLJy$%WiQ?%wUWqN;CuCg^&lbK?0b=SD{ygT~^_n zdE1q?7WH?g&NB0mQL2S{IcOu4ehxGRHEQ)={J~7YnBl-hNIeq%>F@iC6#?GNRG@0l zwCZ8H-hTNjgXzW3M1RD%gfSugP!gU(=)?oZ=UzSThPrB)&RNbFR8UmM{zr^lCYxN*y4e1H(3QU_!v*2bgQbvu@ z7sk$Gn)+jZsw+D_-{d;~zPN#e1vl81m5suFbw9=+_mD{fRM|w1@M{hXuv>yi`|pku>e})hrz-xGzEE=&K;#Ng zRIPo~Vcx?FO7@&h;)JxbJxt0e>%yh^~^w~QpKo=4e(bA5WV@D8z?V8{$Wi@si zB8|BY)I?IW+Rm&6S8fz1oUV5&c`kR6E{?1@x25;{etYoO!7I%?MQ#b0eT!Yd1?w;w z?7;ah-2TbFBBk*Sj)iPGN$i4Owtv3qQii1Ws$%SYpA4(97iu$U^AAh-qC%`NA(gn! ztFS+)S&2HZ-sw79L|7%Jp& zrX;Sy`@u7iE^$oY*F~)!VxR+v=McIx6+l7Mel{E(Zqddh_q??J`(S8Hx{f?s;FcaI za(4Oapn!JHA!YRo-*Q4P>USKBz|FE*Pr2nBH|8XjzOl{B=~4#22CIa=Zqq()q@>{5 zSP>SO`n4^@FjLF4TX<9TTA}ljcj4;OyN3LKDy5mzUH`F-)5mBwi~sUPLnYb`I6};? zaFZfdp8zA(Ezgc7v@7DTdo!4lM@1RSI=xA|@LK;<(B6pmbvV*A?*N2(adk@#e4bpQvxHsR4<(sw0>zI>` zKuq|elI|+?1xd7-lQ&l{kI~(F3Aa|Kq0Q)cf45T6%lp-|`P2m-r7R)*=t<4wF39X^ zKVGKQC@>KImVy%sC}_v;-7>IHXH8{~C=7__rpTD@6Md7m7(0TYFGA;pS)V6pJQ0o~ zKwCs4HZ1G|I?Mc<*!K( zv_6qm!UUDV#Y?!^a0<9YmLtz7?U5y^v)r}wcG%Z@c1W0joxvdWgQ~SxmW$KhIEOb& zbn-97FsJ))Bm^s(Thq>mxx&rIgi+2yZJ5N)bfnApAG)mH^z_xf!)x?2^EN>d`|_-Q zt2%vN@^G$gJwxMTccrYtRe(Yy!=&qMXrH?CSh*kXa8q0VQ|f|UQspdflh!E$v!Csk zA2VVuWU{f?g)^{DNF20oECVizIr9~RV7jbc0MClnYqy2DUm*c5PX(Rb6qDU3cFw_j zWKul`rLM!qw6v}WfB)k+;x5RoXgA{M1LI4$SVV(PW^64e^YrZ}1-C7lMm8=6=^lTZ z@N56;=B$|!Me8?bo>W!AZ<;wK1A)8)T&fj;k>6V_gSiasji6*ot-FNPuXbmO0-aT6 zuEiwsr7SD$^i{b{pSaKIX8ZR9i5xw=aWooX?guj4f?%YbC7TTj^`$%A8lbSx{CxEA zWvR|)4h0GYQmAvcr^P)Ws%ra}>>m0;4*L#0zbsWFuW}6-0yDNK(}5M<>D(?E(7uOp z6W<5jXG@hcb7KZX^gZ_yl=;+OdMv@oG9Sfy5k2v$M<==mEcaZ;-37p@p~zBycOW?i zD+Q9epjW?vBEf}q8zv}9PFQM=l=N$m-MMG)<@H40K&P#p#=Da~aqPQs8>|OMDxpH+ z;Ac7409UY5Gg#y81JqDUN=N-^%LaB)>ZBC8Wz{Q{2eqkPhU_L=!%O@ccn2AOObEA%+{@lSvkVWPo*Wo=osIAb%rlRt zrk{JR{*S#MZ;Z&e=342wG*9S+r6T09BESOKnbA;EvDU5%7*!0N@vr`;Ory7w)|xXq z)GX_-_Dnx<%gZe~gAZQIMEzHwC<&pY(d)e~!KrWOTKz-H0;b33Tze)i)buIX?z^d@ z_WGD+p0_~uUVq0`VOkK|96O6sCNAQyaUwyd8@zxM#(+6h{pz;Af>qiMZm!uHuUqfK z3J=$>Rg8>1IumQ9V14CsWmALx^w03r?b%is!XW^Gsx8T9U-K@U)T z{zc$~I4-B}*3KuLRsy)Ax(=dL_t}TMd~{fjC7ApC#nX$wL95Q!#D<&njoL7_KcbV& z?_VU&uzs_P%WOr2g-5{OmbJZItos^lxOO#93q8K`*I$2NWZC#4rzINxvw|!M^moDc z*Al*(`BE!QE)ZIXkNc*gF7KK?DEQ?o-o3}*iGrL0^B56?ZVmCe87 zCe6$T2eikHTS_?*OnfIf9;XQ311Q7zZlCwYA^H#!wtGjLuncv&bcLRSq=n!e%k(Pf z@Ni*Q-#LjpObAC>xCbmStQd%XqzJhKdjKl?>YF`1rTr*!=xFlmdH>}**#owMPm-7O zaE9kD)d*jZi?%($2cLM|gm~j2wf3F_=jVBqfZUabAN_0j!hpD^dPJkbt!qq*OT(<@7MjVsOhIygf*G#9RB zl(RN=H3iIB58EmouVnepA5NN&?muGNcMo!rL7Zh%=o~4~%Y&a0-hoOkIs~Y}V*j`a z^;=AZ=}7h|3DB}a5%>gD5Z+oT`F_{(y37<*T#?37FZYT ztNimJ(8Rghy1c?GK55^m@e^BNl}F1`{QaDeI$%0-(N+c6FB|7G4H}~9m<8txb^V%o ztdU$m)=jgJ3#t-2eN7BA1iCXEMJ9nT8!p`#p&j}Ea;8u{$rD4++&NbM<=(yJPG9q*(tP+tuGpz@5TAhn;Na=e~ILg=S{+dY!b{LVanm z0cJmk1O7h0uYL2$Fwkzl5t)0=MoxF@!q22L9|weUTe$V=iHjyZy+1JbG+{)R{7hgo1pTw$xnyNZ7h!xu*NWQE) z(`LfD)gREx)1Z|ygPxkVIqA?O^QpCAx}iECyY;@By?(@{19f+Wmes<7v7O*|_2Or1 zJ9tJDp!?7C1*Q;zN=z;wB>(vO$LUSRahczP!FRH3vggJ@+c^2IsxL}SM!!J!F%DR? zh{#g<6L}y;=^K^F4!5lP3LjjJD6)BZz_u1E`*40{R4C-d!CV6P2+*;-Yb6vY+k`HT zTl;NUNuOI^g!RC{fA=O+xRV&~*lg5J#FhC?Kf)BLH0LRr&HkDSulQu9ck!3J&aA}^ z)U&ijugvQ?UGCC_y;p!=NYOP~mFwD;lSM`SQ=d&!TXkD?f^$vV9p4laFJXVbFIl;A zUtU4f0EY_ff-KggA$AGhJr?%}moR)k>eG4`R{t9emdk=_t2-(@(EA9h)6*9f&C2PG zAa;VU8sRa5QV3VzsB+&`+^v7>XyP-<05&q1b?si2c$a$}$r}GTHC`aZKo1AHea@rNNuww&G``DIQ zorZofDbi169+-(hl@N=$$l5WE3Um(tNw^cT2T-K?Bz{;U5o0kI8^rGB?L5qX@?9{O zVuL$jnNGbY-S~tNIQs`m^6V%w0#Hljq#}XGD}Uk8U%OK|<#TSk#=$HI8+=X5((lF6y+w5@|gg*at0%Sr&(x!uE4J)<>nz$97@+8L&zUSCm8Pu zT)%cMeb`)}%x7?O0~FasHXP7rE6>4>e$_ z-WWy5q_YiqlL!U4A=;FRp!p)Y+qBLDxC+~>I+iA>tSKq=sw zFwz^@Yjgg$B;9XYc?bL+X7wqs20VH>UsE4BSK4B^b@Pb7v3U$*BHPQH+-_ z62_g|^Z*vi)0_rttXU#;h42>mM~Eq$!a*#K8$b6ey7qaqT76LC^XrqkK}-3;a>_Si z*0DlNVmw>}fY}1ci*CV6c2?65W>9}#o+F#;1}$5t-xrNGKhd!mZ5^>E8t#s$A<)h< zVXRvWVkb0}MC_hd>meVg7Zbh$_)>ND1dd#s*rH#GFBW@G`fjoR!g5kw(BWV}^0Zhk ze+xN*xS!~clC!Nud$OK0G&|=tyA=ot!GDGdK~uQkg54F{uD)TP#sujE*s;%|9_kv; zFEgYzebc}P5vU}v6rS2H06zzWKVQlaWuQgvMSx)DD2tAO{{8i=trJ%8a zlQ*{IG{66GvvxyT*L^FUsH$-PHFdhEZ~KOQu=9DjANz)jr%#zWrNutBG2{oSV?>WJ z;1~oX8~M`rVFyY5y$%W202>Og?bXnm^$;D-qrA3K|NM_;hur$^_*J_7lN#bjLh3t} z2=-Obkp4iaUE>tT;Qh~rj8vWFxG$Cy5>f`mS1$9P8vIkGwutWsxk$H>;-ExZ7?cTb z&;ds{EcHAaIme;X#CD@9S6>o_kXlgxSpsawBzRR|{Jp?3Jr*1dA$lDWcf&X8{VUda z(A@TYKV9PUQ${MkZ|MHO+XSi`7ZxkuNj~WCeEDT-w8PM?Rs*&I$6=i43CTdzzMX1$ z)j(hxTxX7q#)c_K2bsI)`w~m)R`_wP#6JMXi-n~_5NpPz-D}1Avmk= z5dYZZ6xmN^JoQt8TkOczZ^FaVeUUz`zgdOcR|v`r&XHF@HF%F{c-olKPwZhfVvaZV z1MH*8R)MRVTjcQk71V4@OR$OV{WG8`nK8&p4rC1V;KYfw@HuYGtAzlh=kHb`VjzBb zYljxp(y;XKpur2}r~FGuVd5S3hyh4&DrKL+cz@lfx{Fmu6MG4t?25me%H1`JEPIm{ zoNY9B#^%@n|I<^HXQ57DZ-(8^`;I*5%^-HuW!K1iwh<8Ek*jMUQQqPm`CV<9v-!<% zZqCr5&IdnR2Q(iXv=i(fa-U;BsF@rXG{*e^@QoYK%?DMKiE(xFD7FF39XAV~4m`|r zcwUbgY4@3*b9`tJ^TN^99I6VEh(8I_T-mPfNVGuTBWS1H*}bh6hj)d0>|9-0OzT8X zY0`-7?D*?r`FD)=dAr7+vr~Fz8u*b(=zx-l9iUwmDEDbM!44~{Ga#(+o+w4TdgfVT zdfxBRiE8a@es@~y?Yy<_zmqrjQ%8Rq*Hz~$*wqE!9ubPoh5!@af!~Aht&S(r(>Q0N z$}k#0Sp*d+L9YDDhE;k8IaOz|qg^~%fSs1$70YLy@$(yS2|##BOqeyt#M3k*%KX!d z(WxB@#);nkhbI*48ta-`^Q^=4;>2?s&EK3>Pxzd+Ckl0cb1v(NzLgFiCh{#vEIHGD ze2rMUlkh+bA`iIFQDvifT7m6)jLPM2b<@rE!{IxGswoq{!NWzj^QI$}o&=|VmC}}7 zVc}+1yPQ9;t*DzV*>6WoMI$`0feNPT$i8g9R->dTrz3cSbrkdum34q|6WK| zj(Zfdo2uCjn>o+A-^6t222C|s;!aNF*%?1Lgwb2s{!;AQHtqYZkCrVrZ1(y4TpO#S zUFjE0I|PwnWNtXKT?6paJQ1M3pM?{`7!+ePr+ySgK`7hxRHch1lfgP>+^xBH{kPDp zxo9cv?3&yGt13lSBsl4=rbdpD94)v7;FwFx9@;}zHnaDLG)bkl%DPCcXrX_!*30}F zyzgRi>AYrMIU`}A^K&MFC$&zLG_zeybwg5jx`!YlphDy^-Ez{*f?FnfKAVk$vs_jMZ40Vd_f*>ab&~A>rilwC}tXd1{v1 z!yNha3qdoOlY3xbq!uIkA!hm)$G}rGi=w? zh6?XzpKYsr|FrQ0-|_yTKLg(C(H5PZthcWY8n7~euu2XRlubu4^1B^xeGC96VLoMV z{C|^8wZ+Fm{k8S#;-#Od_zFI$FdyYNb9@HSS=WGMD(*3kAFDVMc;*BWqr=3-*CP+v z8TE8&B|Vt)NeLsUs=Cc49XqU|R_31jEBs$R#a5A0Oz0%eH?lA_i)!!KE$hO4b8hCD z{mWKH=Mnt}V(n-~Tc1NfH^}`xkL&sZY%^UKGdZeI4=`GKmirsyNH~%*ij_ZCH-I8U zU|s&2nvr3O_=oeew`qLJFmUjQV0{6C%0Yg!%|;7Tn6jZP3RF@>X!j%OGFFk?GD<4# zoRQsXLx!N9`|*2|)}IVrl?LuChKBbdY8-osaV~^Tgfw=5upr&u1XwK=(htCMm*&<# zTnN+BN~)B)tXZGnli?j{-V@>NI&4;TdN(hHZxx&f_##2A^x4qPp4rawK;^?tpT-JS z7EF_aX5p;)UI7!grv6i7(u<_T4L9aRI?JA0gcazo_7iXf?5McC0dTdZz%t%Qs7&TE z_ia$&;P;I=NS>0XaC)!S+UMW+cmx!z&N$_U4=K;jPDsE%{c;1)WQ+CgHRw*0A{wo%%A!F0%1(2 z_g}sj8?r+)s#|utG&TWu@HAL4Oox)=?*U1p{~7u*RaMt` z;5EJW0w*i%$9tp+ZErYd8FB(!_PwP6r1NCinL}03U|XZceMf88k0l^$32_`v z2D0xKT#+H2kV>U#_K#tLd|L^RPqnT`NRTYlky@Bf<`wAE?p9HV|8xwmz?gg%Zh$f7 z7QmGOBn6+rIo1vbLYcbjeUFUZeybmbD`(Q|(Y0%b%IO6nRteh^#{AFZzBQ!xh&h1v zfS@iq8KgV80-en2UY-yLZYGiUc`&MS--21Q2KDB)^>kxeYYi$7`X}zmNc8f8x$4cE z^V>mE{J-;4hcCuo zUHg^&PCvw!gyA&sT91R|tQk$#F6heRZ3mlq)K4XL+nR}kueRO;G3+9;ALQZ$rE?7C zT-;vwe3{c%w|jm^KO#ZU?Y+{As5a^;js+~Sn#y=N^5)D3=Zl7e)l`3#j3tjPlGQc& zC&nUt7HTTuQ&r>U&|{zzkR|9+=F4_MYqFjKOB7-(Po|mS8Xz$rfD|ohi?Zt(2@POT zMVfSvqz)0T@q)W1U;b?L7_8Q2!Z?yJR(m1K?;Ftzc_0ueT=_?`+PFAq$uCHfD5RiP@gF#8nX-v-gXClXtRStlBZ-`L*L5y1A6Gn^_5F^~-fr!hn$U#3r-kQ1q*Q?$ zPxOhxv2Flrh;E`}0LhY2keIx!6KrqL{cz&^o1f&nFFtE)t3BDY^Q(;)mem~iicTH%c% z=j}PA^EOQ;hrTD?|D=LmLQg7sY<;yp#J5+;bkU)cObVosX2)Z8`nYq__%^zgmGJQW;xdzpg-5gi>@Hh0AP?sANZ!V>&At`l@O@*GP?9NNSl$6N$7 zec!L2iHZI-+MNDfX16R+`6}qC6OnP%l)fe68!Uk&DnM`m>kTnt8F3Z3;-BKrBO!2g(GstLlZD6DbaT zN;bW}ms4}zxcZ;`b?cf0F8Y^C<5fJh;q0{ZPH7)#dj|H+^N8+8U_rp|`ir%2h^h0A zNSRTfI?0S(X%JO;y3fs|Jkevh{pZYK{TBzKGB=ovKzm>(lI<`9sLFA|-vc3rit`vZ z`)0SZ-p;q6+Qg^uuniHq0lQ8`NQWS zDWxP-qF-LU$WLGqOhnbJ8{8KdX$B5_H2D;VSeJu%D)b=78b~bu*<4@$#CfCc=WtDb zpdwB*P@W|FWf}&;lB|aSigBK$4K4);04cn4$n(qtOFdA?B9VEi;0--Ay!4m8tE)pP zd{v8e6@_@3#a}PzXD+PHtwFJ+cq0#y5+L(8wEz_zT(Mm()&HPfl?_QY+NWbA)RZ__ zWUIZ@C^Mo}Dujd$kBzj18`Xrc^)ZlU;3@_ASQ2!Ki04R#ycwgU!`K&pM5Wm4Ek&xW z>^B=UYe+FjmXD?V-SPS%u;LI8twnTYrsEmc5F}(DSsJ6ia0Dd=N=2hz^++255z>a#~caM34EFO>g|>)^99-i6D5 zGa?Wmw)P3%<*<+U`8r1!@L;Ps154dm>p?i#=n@d-i+oe-);2sXLvWN35G>QKR^6L@ zvgue_YK*zEBn3P_2jF{fo#)_M9AiNL-H=r*>mR#Jz^0@v;??+a&XwkQ!4n$`mUqi@ zBF^&}4tI!cuOh^VzBusM2;mm-;O2!yTEya9;7^`fZxx_8%DhofK?^yXzD=vIAccCf zxH%h>&*F}pi%tn?(T<{nRc+cf{s8A6kUxY!%o}@xF&eL@?{h`FUSN1FXz^yjA!5(u zSXk71_cx#Z=3JcUm!SH~d&XFJ)CZE^aPzTy?HHhxq4rOa&{&+=aoy)fW8UEW=W(wa z@YB`-CyWYKl5cLvnfK2sMEtr=X-uYDb`|bRxzdnUOE|tqvziaiSKp6?nT8b>hn8 z#TFVy^G*AmLZ`O=`I~|jddfce2l)9vd~FxzoM7O=aOvBH6lm4M(B1)_=j$d6|5p9j z;~FDsAz*TcR#zj?bV{z;j0vit6Iqr(GSkK#7^i|Z(T`!0=%Ncq_pg6&NzI#utVz*3 z#|Sq5ky7XzSNIO_tu~$B2qtRW#;{D`LNHb$9gK1}Y){x2 zjHvh7J(lqoI_l3qKX6KpZ;MERv6O-E$a0P~x0IvDw!oYNaMVgyd;4>2H^xr-yV^;b z_vD7<$w8ynRFR}C)uD>df5lYxS}cv@?%-10^#LYZ4RZ<@WF8#+XBrfxuobyiJrjp) zk7i5joTz4ez`x+{ILKE4OTsfQ<7ZZ>{ps7VBoHhSAAC<NgD72e|Y5&m*Y?`p(Rs6lCkK!r)l~Ymp z<68ZgECyb{Tnhyfhw#Ef;EDcAWHEFBQ~`Z?=xTv$&^awd^~SpP?9)m$CmXe7@jEXr z->6w>F97*KC_sf(bPBWxQg&W&;aq5CJEm`J3umt=-9pw{1?6Yl^0xTVtw1yXu(jDo zwe1EVY-#K;zSbs5m*dO`q@=8oDrqS*L*?$jb_(J@yJ!Ww`YpE>I3^tGfS%AV%N0fm z@IhbVC9!)kvP>jLJbRt>ooP%6GwF4ZCe4w7%)W_r1CdJW-KAR>d?&rnu@&|Xooiq} z?DM$ArypGXzCJS+0b*Z)bl})@FJupP@{!$ovu`(u%Y?K;f&1%M3KY>Ye}jLtel5u` zahn8}Djj-;8IR*TbfMZ5*kKC<;+4$2t1xg7W|my&?-ZdTPI4lV|c>6uV5%W3A|9 zR>a==G8#vcf`Hy$zvl*IOc@yE{(1P@x#MH|xcarb137wmf@#wY*w6SH;Y70|Y?;!H zdG-Y~r2A1LQ|RscU%X?C?c8>nF^RghYgdB`K6#)*amg~QQ%L2rjoc=PF8ASU^EZB1 z&jZyIWQ=Z5z3IH!%=Z9=>ZE$HYp758jwiJi#thWGv-Vr5D1GP$=Qp4)1?XcvNLNi>Y)u&Q-?V(Kf2H(d-JoPgd6P-tE!goq-|K{nDkk)B2Z#u9Z7ML3ghJ zhrhUW8?ALWM4TzzhS3X3QO_*ycn6O5q3=z<~InczwfqrBpv75#{h7vt6K2hQu> zOd3#0V_3X`jM4>oqaeb@6XXpcKiSaEE-D88gsTKBXaJF=>&nM-ZoJ$?)zNOMG&Fw9 z3C%SglA@@kDtd|^{r*o53GK?l0BY`>Q{=g%xgo|@&KCliXf0=xw`P+tO?BDI_8NpNBG2bu{1 zV~acKb|kJ85%D8guxIDH!$q))2-I-})jzWT<)doD!k<;DcIkVBvt>mEYy8e&t{t@r zd*H2BbIsIo?q5E6qPIgd6w1+g4VX|fyWi_>U{2qwMWg+v2?`HLt`%4(w%OEuD{ZaX zA1BhJ-t#@?t57mw33Idlpc35;0J{?KBI-aRM!Cu*X2SEpa(CM)>o`g#-pkKO7%@@)SinI=ssgzV$EGoBXY7Ue%86nGH6 z1y_{Ty|5lnRx6rvTDG3qY!cO%TWN$T@H(J-VF(|n3~z|IU)v_Oj;J^y&s2V2^sqPr zovv-YIA}Ed&e=PAA4xjTR&nTig}~k!^RrV#U9edgA=c8+mUUcsjuyG&3Z6*xNV<-3O`t(iIaU6+`9Z^SbresonVR`LG8QZsxvQ zRUHL3-nO~l_({b#_|2iZ=&hZld|D(JGtN_1d#aO*dUHP`zBhzyph)ra7$p_Gz~K= z<0fz*hWu6V097i|L`|`k5^hWizWw*8(dgc&N#-=`3KuNj{Ea6z;d-32_SSSu-!t$J zzVE-!Af1Kz&h&=)t6#US;QL=1EK3e*QsUHFF4 zdIjnBCa_5LlXo1B^eGPeJ7veh*TKGH8<1y` z7v-6&30O5W!je%P2is1yqw}L-mdxBff=pZ`zukam0s4qn{IXT9sz|+P_TG;5b&zJ` z12!PYy3$0NnGv(P#jv9a zR=iY3WEbpRf4Q5^XzAIhvaqO-@MBj}w#LG=vj@&a3$2_|ItDgu;MxZlP*8LVJkCxW zjZ%&WVEPJ35OY|}s1A>m`QWAQnwlDQvFn)E-EFT7XQ@ZR@cP2V%o+Nk4b7DO2>Z1G zceoX1-1ctf*MfAzq+xQ{{?`q)SsWAp=4A0yQzu9GOlQ{*6+{V7;A zz^?nB9DQXB*8^9NQpDQ&o|ceWc6d%?ZH_?_0{aER=Swwy%ne zwuSU>n;!CBv?*xaKh4IWArxMHNMwn>LPCDvKf$PlwaTl8AM{ujYPEWM+?nCzH<#AWL3R75`V;6yH+T@!MdeLzk>GvDxh{-TXYY*Hjvf9Bl{M;{(%nl=_5Cyvym^;~s=8G8Lsr(5a7+z1 zFUQB9%oOQ_%Wz+s`LeI@hKYM5>|lvwY}j`oo8EnLzO~`e!CGyX^rj2a&$#$8Lb`@u zAOA5qQE_A-=MEsv$N@PF(dvK)GqHnJu$i>gt53RJ`vJ7A)fF1!&3JmaNbh9o3wV>6D2jHnxRkH*Nc37*U-!vLqzf~`PEZ8TwlmDqTb1440cHtGh zWotiyCH>ALOPJs1?6seqzn8{5q+xaMqJ+M_X$bNxb_l_60Ih&2Lg|YR$p!hH zrgjkMPpn*>U4GQHh{efmnR?5XJQ3XKN{{Dc?B8PZQRj@M#+-F<@~gubqpW6PT$!ew zJO#FL(^BD(Yqb

XScwPN!7_C2}|XxXjE`UA3FS@+u%!RrWgN7~lW={Lel3-|QU_ I_;>dI0?}kanE(I) literal 39703 zcmeFZWmsI@vMxH21lK@tCqN*$YeNVgT!V%{a0%`-5`uex1P|^6hhV`8?j*RoG~Phd zoX)rGJ8SK;_g?4j`#kr@g=f&SdyXD+RL!b)yj7zn_doAf0DMJR1z7+I2?;Pq`~vs$ zfHZ*q@FCj62k2;MXc!pinAk)(*jQNDWQ33Kh^WYEsHw;)DQOuwm}%*sF;G&n2tIwr z#m&dZN5d>EF2p0o!OO?kkq#3hIN0Xy_Q2ScndF_y95z3JNkR%7X`}sEFQvi1Pp{ z!2?1%ZmEZl)J@Uoorrh>DEiA39ZCqU4+&w(Kyo29|d2qpM zZeD&tVNr2ObxmzueM4i@x6ZEap5DIx9|IGUQ`0lEKYz`wuB~ruZf)=E?wy>TonKsD zL9cIq%Y_7>{6(z4OZHE45g_D3Mny$IMf)um60!%Pp%9=xpyPf>D5Z{O>hy@7ClHTHy|B!1Az(zqr+&mNl00dm! zu;c__{*Sf-Wj>uT1+mjSweI|l1X;|YZ1V(F0BI?JMn-$`f(=K1%E-E*el~d{iEv)A znvS7pAc1unAX3-jXLpew52Di4uByVjl9+xM?{MS5z=z}?5wo;L(QH-0UJzsTMD1jd z;-Rhv4?05-`mu%@k_-`|X-v6gaLN-`lC8uITbo*6QLL|mY zA+kM@03Kz*?Q7}Q zhB-fr@?!g~bU)~DRH;RhehIBwy9WrBN^MfnK9n7ai5EUzc>A&J0AOZFe-xYMAYPL? z3(@W7#D|uy#x$(a9Na4K+X}ypn46m+!|d1Ld;7rSF=MhgUjDmOnb?RnYU@nK@$=hq zOg~(m6!(1gH49{-Qs2M^uTOw|-x6^X!~(~LCMb1&r(ahy^~mEZBj*rY%LaY<^lpy{z>l_Z`jy@S%#w?^H%gS>^Q@vF!} zBZh%f5x@%U0bZvUOzulT+FkKoBNesy?WI?VAdQ_l`QAlrxIbIyTK$)mMH1P`rakhuFKbk6Jpzws1aDaR zYWRzvVA9b+8PC__yhd#{H=v2@G$c@^?$o5h59N3tl9$#NvqtDwk)k%6gzUcr(z0Cg zH>@5b?PHyA_RfCGh!2&YVJ`?G>n`f)`U=PIj^Ulc+&*_i^Hqjyhg^)Jz1p3#yK$Qv zGHbV~ z`Y2?bjF~d?l_b^KY=mPc4enkW34~JLp~m*owx=JU`LkX1 zga)3J*XGv)M>5MvYVVpvn^4ayg1c{G!!KywXR?AH?WpbYGLnYSH@yn3Boo$f8h)q$ zIPC<>5GrW8ddHwLdF1MI2W{p>O(1&2{q}XYocT zp>AZK%Dms(Z6R}!a?BV@^^c0Pne`$tp>CL=kHFL5dCf$!3-GzZ?G>zXURcQFv!A$% zisxFDuO+0*@E&;2+%fk!+>UcuF)4MkyO{Jrm<59u8AYU7t1AtDZ7iXUci#;t$Q6XY zJ4hIoxg`_hIS>7?*0nh*ruHzpJ-RM~;`>}yn3!pS{(Ng1-V-}!!YBPgShbr~$wJ$O z`s?P<^7VZXp48g>DAsNkB`D94B$e28%b$Ki%o4CI#YRZyBtG}tx9Me zr?< zF{6Vl>Ph^b9Bq(`p-F_q<9!`}i77Fud@B*humk>w*3<*1>J%>yq~2iAx{cs^6LK## z<9%o&pQ?>)mA%!3j6{F&>W}Zh2_|voQF6441Ba5H^C6X=2w&tuJxUuwVaJC^(woBGk$$v4%R%eq;EsR~J-LY7G%V1A{dyco6dh-mRDu>wDW39qKv z`UqA}O~0H_j50TD<{Xd)giwn3qfbayXPSI+pfWHav*tF)UYRXr1^y6`+=m~uZc*lh zA~RY`M9|O*m>Og`{9>4OM2J1=&5OE5<@)}zJ~Z}Zvjl&`7#YC9*5r|xGO`5gD&3R=RI|z8w^uA zp;#TOn^~!uQ`vEFF`eNcy8O#lu3r3 zO2n#|{9sfwFv>D>dU&s$?82a(U{A#3!!SeXpFnpg(_k@ zN!lN294k+{9ipfNs|NZuM{YLicoA!b&}olg(7E(gA~)JDhlm`9!ZeE)t>GjSEvf~^ z{pR5uTLeEG6I3KDObngUS6s7kE0v%Fsi9rsCf)77f^Vgj%wv3BB(l8v$@rqwNxOkVz_duLL;5}eMcn|Eb8J36CM@X=E z`qPAX+`O+k)@^%cq^`!bn6W}AuuXewmU<43p~jtsnHE^%?+DP?CM;Q#t8dFuk4d5& ze;rks#_Jvp^-ljb6TJpT*@YBTT5=KgJYuAqaxQb$qI527!WP8@7NODW>@J;?b4)3B z!IYY^ukxoI>Z!h;Yhja~Ea)%?wz1j3*_&ou1*<1P4eVtbnF9u1WaS0#0N^Z+XK?I% z^ra3s))!~Z&#X^hF7nwqg|ZHvO}JCO@krX6*A%S3?8}hsAgT;ss7zMykf15j&>FuA z8-4MRBgXb^3fpdFHOYB!>}2X(?6pNH)Thf> z1R~dsrrSy=-tp}Pci$GTrS)rPl=LX~wIXQZszpN~^h{&6wi0hQlX3Eb z#M*cQ0ejC6Jh)NgM7GhGgQGmMao1O~y1`JDFYWcs^&jRnCl{U#q6W$5X~<(oC&tJ5 zWcD%hFVAMe_#iX+xueC#HvZ(}=e#1langlVmfsf)hW4)mAwpgF^{>;bWaAH8FH#9M3Cc^;U43wkKKzT4vT)+ruqRDq&Bs);H?|t1Hw-tD}C9E@TYU@S(DgxHRv#QFRDW`JVV2tEv^74c!t->}%_tLus?)Hs~ z_Gds(lIAlhVErqlYmu)oQ{2To(}0X6_RKgYE+iyVE}HW z_6&QiXKun4+mFZ6wO9ti4(K;w(_uHMsS|LldA*}IgeCGksADZE5+&ccZU}U2a_=s0 zCKcE0s|_-!*eutXN*;FLJ_ee_Y3&6q=K~9pwkL-l+f4vGAM8 z^;O~-&ARL^cza282ps)b%H8lx^L9C(+6L@%UgDE~4`g|PxZ!*bDR93HSRZu!{~zJM ztp^v9Wh`HeVw*%8U2h@{BW1c|xwE%w2Pz7z6qH#u`_ERYClA(YYd)~~Sn1k1y-3rR z%SO)m+pWrVZ9h9^-U9VT(l&E=72h3C#Qwf<+Ts)Uz-UX>r+a{0Q0X3!IQ2J!Syf|I zZ>MH0-Ld>}?==6bG5F(Be)jkO9HD3|oZNigWI3#Q?EmqPYm}?tw`FK;7+*ODP0cTZAo@rb ziG_r|WX4Q|JsTUAO)2Nmf6P-SCq|3p+4VnU`?ou2qY3AKk>UF51j%w~dTz80qt+Q1 z>KM*x^gnZGI~5rGp%Tft=#qs<7tUi^Z5PzHyViJ->uZ|R>VEJ|Y@#Y1>wJ`~IOSqt8j z7SY`OLMoYiKi-0*A!F8@Q7E*QMgL?}Dc6XDJ{~1^Q&l=xKr2a^i{Z5ztwP`c%-2>4EB?)fe z-V*vZbJgW}!nD4@#l^ne@Ef>WyvORDpkZCDNJ!Ji&MYRX6tZ4#f*sZ@7_9^a0?Z!X z1MSCfJ~lU=#8R*uoA*8NT?E7pYHQD+egpOci)@2dks!-3sNmf_06xiuUj1EDR3$E%+);^>eEOcHGOcwjO)+PKF+V&O zB0pt543}r*eHOrlNVJm*@plUb*G0BcXhqCT_=$`y&Kc=hJ1-{;ZVK!I@nkLKFf&`K ze5rMQ_P*dFem@FbdDm7=)%HwM4dFU*qY83W4s}{d9XXaJ(gk!7_gY{^bZkVek&MGj z!4QdIk_?`OP6$um=x8{xf-&BZ&{bKp3B{aE8{5SBFo#U?($>tHSJYPpqF~e5K~_o* z?S^(C+V$X$GGQ?WiK;@Iaj>~fJxK$(U2^=wo_ABThF+;1%8>6U191v|?=$7z9_#Rr;wqKy=?Fq> zNm6}hY}P<@^lpPIkGsRV+#m7?cQ7S$H3lZ>3F18AjMr*+13f~6QkOycAF01fXb7;;VZ(iVlvqV$Xhi4sQol9N&eUn>#1 zBxc#YsotE(PwX~ko%~d5UH+3XP6dfhPuA2aOZ~RK@78z<$nC2qfzyxG9@4vJvR&uD z(wApc?*G~x8uk_G!zRkR1>q~=Qj*A8;S27gH@!pI$?7J^6=z z?!xK5&9qQEoIj{(7=KZaAd9jw3x0vWIY;LQFSZm zaJLAWvy?o=7l0K>s?U1a;l791L=VS?xwX2V!u@a#O#P782KW-TnB71Bl1H<}N9scp zZ|c#TbZs?}n>jb=${%zgx#S~v>q~qlIp1G~VS(Mn_T#om%#{zRJ;!F!WYMNx*P7gD z_sZh&X$Mm7TRaM9Rjt=};@YKenksQR7{6_YU0BG)aeAZCzCN&3;56LZiV zAW`>xv~xyB&}pI1r>wcx`LUn=mKI3ck`_)M4elB(U$nmBwwd+zt>-u<3#5Pd>cc`j zJy$;&upZqTz_zo*+0Y7^POdEO&sfW5_5l#^bMsbrCONpfq;S&hnbB`uWeVF0@g9;veq);wGlSKboL1LXz|& z1uMF{cma)(7dPNFA;NjSLJUP1$<2(~l1dDe9Zryht#@yQcQO*&W#9ch#^2o1wmfLzgk@*8Z)tfVg)Hz$FE{po-YNrZxZ?z0pfSwE~ z%D_>kyyoim6TcQGV||-UYFp8;BYNk{>gypCv(1MxbSij5Xrl7Fy*TZ`{5$9D?oS=x zHZ}Vh@nbPIohH5I?oW8g#81lEV2u_S_UxgHd!WJ6+Nd18Mxp1#dLuf5qsVY&2SK$sJ)aRuhqd}=fldMwc z6L%sL_rS>&$!+xAQ)}jXAhxl6!Eskfm+F0IM2z)Xeb}H_F{N3l z@OR>1w{<_<#mgsy3xav*1{b?pi54!U=)Nj_GBVEXkj&k_BfUM&-Fl?aePzeTCd+~; zc~-g{cT4+Mufeg~s!5;kY*OUF(q%bK;+Z^Cyx)A3#qq2ref*oUJq>i@-hc^>lR%yf z#5qfEE+@d)G%GR1n=wxo8A|YUgbHdQdH!Yt5m`&m0NDPg*zY2y_Om<-hFPx|h3~i( zC1`d!jppAzz3bdYxyb1k-oFRvZ|{K>azP2Uv2q%_Zy%qu?`E3Z15yu*v#70Tx}4bj z=o}%XRlDSmqmhzUYJ<2t66~}6EppSk;g9S6YHami+WAm?>VUg4exv{BM7YSO9{+* zA!F&(jLo04Z;#cKY~Dy>wFTRM7LjULNxKIifmQ~d5%2DSAH26JI5A05C%yJIv*?5SL^fhk^nU#(EmX+E!j6$?tsg%ypWEVkOXXT%f-G4Z|_ ztE;i+0*oHKAW*rvV92>sd6-P$QOoycj|S+BQwy{r{Vq+~uf?9=$C=M`7TW#2Z&oaa9VDt6lCS)m+i|)MH ze+kcs?oiq9P%}cPO@0 zeL2am7c~;znP&LNwUs{R`jx=T778>>?%0@#Wvzqan!{5D7uY#jAnM! z1m+5k=KB@x&9_c%)x+#|o$(|T=2bX#4~W!gyWRuPbCcpyZDvDv1gF&?{Wo`Rk?bYb z5I+Cth;t&j`WZ`31n}p^nwMd6QtGCmQVE@Y@zSjj<}D3hDK5#=ycUS_Kav~3YvheE zslNv%Ywv-p9%rpywL%VsLG6t}wM1Q+64uIj@a`P=b}jbrUF0r5P+Yg8!KE)X4)k+A z6J^?&URH0{V3Tjd-r|-Ee751MYj!orx9u-0&?`*97I!^Ugy z;R=~NZt>P`Z@1w*=a$&bumMFZb8gL~#W+tg(h`ClSKUnM^}FXI%i5{%p~W8S*H=!X zk272>LZ$*Y1=EF@-_Zr`Py|LK^H#)$OHe7>?H=3%zh=u~%_{;3UoYfw3-_W8$ETl@ zX5-#OZ2Fq5DH*ZMS+keSTc?P`9G^FbC)1%SMIT||W1S+$YGy{*vUPfJLqk{nq6*cf z+{m&QxBY_E=-1>>VbM$wmk*jjU3GxRx$ct{w&u@={CXVu&BLv?jPA1|##?hdVbA3k zjz*MFl2=2Aob(0#*(b^zHtRq0^DN?d6QossFdAnC`HaY7roP6W z-tA%Vkbrkj*I<)0V1!|z86+uc(5?s^6#d=m4ZiB#UU-sO2W|%IT-03RRrJ#3?D)>FNI1woNZ?X1?&B2j^7L>Fywv?<-Sx{t%F| zC&#_j!iH;mN7&cne^DXNFD4CovP+KFnMtgBR74}CG|_Tv1PvFPOWSF~uTfUH!+p|d zb{poO=LXu&{J2iS9=(pn9xJtL*w%1@)kTgvA>~v2r7`xy2YmB)enLC`bwh~t24k%i zeAPyOA~S|7+)(4l#3jy!1`4Z4k%EG=tqA%qefYd|6WOAwK*!YJeC_N856)zQ#pSV{ z#I?(h>-I5`<%p}w!6urFUtjlZ(nQ#_^eOvCK_HoMqMb}LEB^Kld30z-J;O) zy8gULS07);I>ICCpB@&Z>#*Bc!(`Gzqw3xY@g4yRPy4B`TrIQ;(PON>{$j_PT)Ff>FA6vecxa;^^l*u|RYuid)uK>A z!Hvmgq~m2ucHxxsIkDS4@S%t52b$ukV<^Kw(B6V;!*qTW-b*gfOslyo@g_CK-BR6} zP%~3I2>u?_`OO;kY$B_RVR|PgVyOE!G_xh1Sdt%y&cjm`L0ok+x=+{O{NfMVcUMEV z9%y-R^?)&MDu<~aX50hR?GOf?y-dXNN?mxjuKSd{YxVaE!SZK-|L+{vXF2(QtPQ^+ z*;RV=_@8s>#DA;}--?-aVKzBTB9m}&x_jWA)-=vv*NWmlN{O_obd~K@78#VEU-pb& zmDR_TETVT{qcdc_r=IpMwn=S`iL~OV!wSTf>9##hwlo{p)*|e_0h9r=${^R-+V+Uk zwad%3>vgY6rjHoGvMyvAfzR#5qL6-wyJ+HJ_DE!TnHBG)CKo@LKsEKC#|fYeYSXX4 zedpoUkI0p<=~vB|#UG@aZ3@i3D&GkCc(G|Db;tHRfQuedYj5pgU9>lsS!(ZwV$dR( zz%&*;OF`gu4_Iy7PU(9D+aK_k8tEJ9YPB`j1u0oYFBE;3o%if4+OXfB+SthCp3w2@ zt#q`n(A(umNQ?YgkSYM!BeSPfyQIS*X2E0U*;tiC&g(WvR+1Gsn|x!#j!za*> zd+yrf#_xe#359v;4O%7zA=;J1C|ov2rRirEIJ(#!vGrP{kIsuvB9OAM5CU*FW@H*7`9$0C z1}nOXm@my=4xD}C0krGmgOHd#P-0YHj-d*)Jqnsxf`P5~G>n&t&gve1egRc&MAF6t zwgVbPV_XtdCw+N|Ka}1TyA&<&>6T&y2|H4O+{kFZYRhPou{H^fqNMsYM4T(Nik#kY zzIVR_pPX7ouUdJI4#l8g2XV)b+9WESP^XoRKwhPGYN5Z7Qr-@??_?+ny=7tF27lI4EAa)iAAO1?w{ z3ri^o=GOyX2P^6;+ym=JoL3Y#8q8nR2_5FC?YqVN>eE-FK>QA9RKE)X3i`!iVmxau_^tLQJ7X{%o|}p3B!AhP@?i$~ z4uez!vcv_?(Y{l^xDKYky!hKGxkbM3m(0<*G^)ML?KqwWs*s+b`Cre&oX)r?6ZceI zjtwG8+TA2?F!ePurjx@oisq`v9}ualS^Nb;)LTyauF~;rB9iEoU6k`$dK10r6@!$D z5(7L0vx}4zTz`@wO8zu;7#dzLv%eD5;g+-G{*_1k8&MMCxA?(soV4$$ zKCrO4FFeK+mn`*TDS?lCyDIt7)^;`vYkPj#nm`-z%ZyB{!P!QarrGqsdP>(wj9*0S zE`#4(I?>^v)C%mL6|G<5p0zjoGquU^vr-!&b>ykc4D_cK0~G1xH+UsC(NfxV4{%1e=(nZDIS!HU=0j=}edI4}SaP!eg4anW zu_XEw;K>!5PZcFij^yuLbJJTVZ)2OaPhReGgydWiM}Pwr~P($OnXlD zD^v}^q|b?2S?B zU|C@CVSgXVH#2QvL2-(TDkbP3R%hP`?aE|G=^~#=ai*Tbzf66S7f$(F;kFNuUlxvP zq*F|+_1J0+b-sxmiT*7js^>+1RqV^zEl68K-l(WG59iNXQMt(N{_ap7A;Q2$+$awp z?K>EGlS0-E8whuF2Ul!=xzQptW zaT$ih_|%kO4hu3EoMdRZC3GSFdy;~jMX()|NT@wKEY;#Gr`<{eie4+*rXd+mug8+G z%y+Z^pO|+dI>U?Y5vfNy)l=tIhv9c~%7p_*Xw4WOA3-ta7us^qa(@dQz+FarB4XS- z7n7T(Y{T2ie!v(#ibiVjIbfSAmL@~vL^-*^&!->~i%oP<0*zPI(aC+xE8*!wv3QD2 zsX?=t=Qpp<=l>yUymhsqG9*_zY(7tax2ZRLL%B8TOZd_+^*Ug=#aRGlL>^hTrD_t! zkZWk7eCaa}#_yaPN_mFDKBC}mHtE2nb^fb?cwh7%1Co{P(Lg>~pGd9xWN_-%DD+)M z(civy?S1h!$plC@H;Y3*vQ4VCmuY$G;^t>cq*E`!=2IHz$otZreV$C{r-YV}@HU-G z;6$s(-)}K+=Cv{ID_7!~rIB#hzDn&wA!^N8epXkY!05O0o$_FrMl5joOF0eJ{*|sj zlfA&QQDnD><1ccHR(WmxCCLF|vPtxwK(hcO3T5}(zt0qTT;aFLs}GBGf9`+gjS0LR z%0nXbyS#g#fc=~i(BfhqGLH{*nN6+v-A#(Eu~y@^b^PHcQqTYLW!c|G4rn*MZs4xL z2V@yD7ui0X;B_|}uoX=5Q7G{H>7sFWOUTFG+RwwzOTqXXQF z|G3Oh(NK8f{5AF{`|!xW@klkFHAJlhKnZw&^gN0M!0k*9SNO5_a%*{U-K!#zDZGr!pA9llXr{c%;iQ@;DQ)|A8R_Vk!t!OeU+ zIS4?LQj#HFN~-7i8zw%Te}{hVqRX02i6~o_)@2(S0547)*c+@7glRLL6U#nLRY(&@ z?=P;TJRqpl6)LJnKhnax-oCSq<*F2ZV}=fLXEzxhEd1gBb}~ZE{%ElD4>Xs%_64s$ zKm_gW{QP^RS2A8YS*I|ClLSPP!@vTz&VR1uPZLiBpS_s+6UL{Uv_DSO^tRy!Ggag? zfhq5SevY2@W-!4Wd5P$!H{cKk+n0#s;XQDyz4rxC{7{m3x7V(a`u_?c*M{Hv*-UGL z+m`i{`GXxEg$IY2Z%K};u)&RUrx*Y`f?9sDqL&Ts=ucH>*>E=AQFk> zucy^7t-#v}{@UzBdgyI`xqj?luU%}F^IhgIr?viiX(gG*$p6i$g{(Hbu(TRujY^P{ zGK>v{9eU_CO=V=*1rr6)zRSZcj|HEcm*bJ`aoXo&vH3ex#wL%e`v_qZQX=ukpI-vwsTEjDxac) zL(8|mcu%$R`iM<)jV6+D?0{kN{Nk+6c71ccTV&%(qB9oRlZPEk`PI=URiAghzc$4_ zQ*I}yn$Djc>&vpTeNK~NsqpfR=EQ`$)n*9b)f=gLxjxi?^)sPwHhul4`^~I^3^C5K zCeyr!DI$u)SC^3%{~ih840$8H(kaK}aw$59SC34rrsB&X9i(mzk#fYaI5TIgqDf+O z606)&n*Dmf`jeEjQsg6ZR7t6}P7qWRw!HJrJ5?aNNoVamCxUH;`){80x7VkA-II8i zdz+fZ90k-X(>d=xUskd`^R3hJl~%Z0Q+|Xf zCRhL;rLHPMWnLW%7hVmjexE!%y_9)>8`M&bm$H@>IXk6K0}HtaW-B#S8`%c^k9#VK zVvnV5z^A0d=d}_vDc59^x5il|;xC;au=5K?`v+xcy!lNWiHAIo;gatJuN>AvBj3EY z#1Nqx{nGK#DA}D&Zqo;5D9^b7Uwaetl=jW&1pJ^~U7zT4nFJBytMow;EZNBaM#HlH z9rDWmj(+Rn5jy`%t$<;R2|){kK>J-Nb(6zfVB!yg)%uj(S_y%~OzzCO@rAqu{b5Sg zYFSy#rS~y7zWtxGR_ilXSlBrp^^Dv4EG_rH9zR`fWsfpL#oo>yRk1?ZwU<+`nc%xV zzQFo)SWas+p+whNRAzz)z3qfQZSfJO(23dFd^E&Ox+K81hf>tP;aZ{EC-JoQ1k|-m z_R2a{yXSn){2qAI_~8XD$t!@P8CTw@x!H9)YL*=`ewejppSE+=Fn5tXp3GLdf9^b^ z!h4(d20#%a-7el(8AEHC*1bKvD5^7(*j9_+tDipRo6$_TEPX_BDe*=KR;64Yq-5** z!Jyb7PwGSF>o3a-he%*r)*L1!86xe3f6fN{hwmQ+CdydaehaepW*?rv2as3rG(3?% zKZ;9-{h4eIixtdP zvC!ykuU(w?Vfd9xh`Oe3ZCSCAo=!x=LpM-Z2R&YfmTcn14R5@1pmBb(^7V>2cBIvm zz)VJlRGSoKq8bLuLzDzK8OV`FYd4dS{kK7fE zg~PG$$nx_k!@+p_`ur)ml)Zh^T8Q0?sl35LNOn%d(|^e-{fBn+_bN_#J(M78f#kBc z-M5kF`2}BwY~=DqYW^j!#afCeUz{!}xd;5(>eL@m{C5qOxEES)TC`8@9u?~R@azbH z@9f~srXElQF$nKGRCdZFiQ4-%l3V&?K!K_M2OP136-$$(<&*w1blAqWawDc~2E_V{ zD2md2Y6@YU`L7Z85hdd!Hhc}z7VhNvlZTZmAhXO<9h$l+LFM^e$->A*LoQLXncD7j z5GE{)4tjYfktD5Q0##{aRKmCLW0rH1QNMcIc$}ps3~Sw=p$&f>NN*g$t>5k}us1xv z5zD%mpe{okAAnd8oIoG5IXS#B2U@Mv3igzDBBBg4;&u!4)T%&IYEq9xKb!A)<0&%K zTf9CM*t*(borumQ-qtMCCDGQdq}D6Xy=k9pD9*LPN*0Zrh+wJI`y+t;k5Yt%AQJVg zqJkeoC!AB06^+Tf@Uc7^{=Hb4%9M&q{d|eD*j>1sp+6DqvwO)RxFUGZW?JXlJ@5+e zwzoBX^zPS9-)|e_YXh~PGRGcap5e&bLkE39t$7Gu(f7SlHTFpN(>{Y^ug5*$C_{52 zh*)NfKTxb(<7Rb_zHC5f+^T(nW+1Pq+^aSe-c)&7Z1tNJ#swk5E(&bu^V^-Q8}eBx zJ!2j+NYXuU8+;EuCz{#PMr@mM$|`@MoDbe7rYm3KN`Alze%=zc;yLA@35s=f^KXWuDF^=FHCQAOS=Wk>z=LPE@6TN-f>gs;rNAgu3zRcxgmY z$*fMqoP^(U)`rz4DVy9o1eclq7cTQRPV@Vf)!1*s51lXW%yWBOMq9ui?K?)FSpkd8T#9Ub{Q54h!5i(RTr7ny#KsI;!eR*68 z=d%nvM|arV5tfdbzU!WKu}^bKJf?O z!rRIXwEOn^4kft8?d51yx3ZwzmZ$%ovO%y7saK%KI&mXkJS1S@U>)L%FCFS-I{=ML_ zRKO(2Nj;svk7zi1ysiBW+j**u?TY$ee$N*n{Xg0tflJ*VHeW(-W|b3B{rtb=Y^QAWgT*c>GH&;iV7tY>^7c)%ia0=q0}S^Gk(w2ZwHI1bw-=k zuW3fU?G-z?th$Br?iV3Ilv&F7X7gDY2S?uPVj{bZ%%8;DV2pC=Q!2S`-eST%5**gx zUp&uayS8Bas%vfePqKoRMi%aYJR8j?>1N^{Zg&qs!wtbwq2X=b^eMsWIK0DHK#1)+^vtG3yFVr`Tyt`8RLVqxQujR zY|?0}UgEJo(FB7txWdywXG;{Yk@rIWQ%{->2A5VWwO`MR}XRxzlcImis$@`AyC~fT5#r_ zQCUR!Nh}ulx1E=1+k@az5O5>wuz)!N+VW`2DhZ>YmKrqYM~Kv7ovmOuiUjo(S{WX! zxV*m<0+JT(WERmbyz}8auZU^NdYHZ|kah7LEV5hV6CVmEM7VGKS43tMsVDd{E3Es% zz>^z_c!CGTDBsDS>K>3kaj$#_-p-+g5pCb-T5B_;VU-y+*CT*kVdDQpDu{`@b69@t z^#!nMyyMkM5hQtlzyMF;j@WKR0W#^zb0HLMdOs>(?5y zvJ`lf;!jk>(bLm2ej*I0>B*mLyZ`GyJ5)*K)%?Cr$sfGr#Y=l4bshQts$4@?blrBe z#?#qK^Rq)(2(ahub;oN&?DTD)O0`$#F~)#Ca~AV$A3~L?Bfm2Z=F1ke^x{T(u8!2Bj>%LmkySVvYqwq^2qB^nd9>Rt& z3D(_j8om%~uC!2;!qlIbc#YS}-o94!A^5J^D5sVDP@}?O?-XN(wg(j#WYJwU)Xz8G z)4Vi~?QA97(*VNpMwYY7P8!2jcbg=#A`j0jCZad8zY(+~DAS#Wp|_aF)IO;pd9av9 z8DP`RjXs8?F`J~sepz1{ZvSK7wwaT$9!+OX+LY)4DN(Juai;2zCF{e@K8t z)GG7LXeXuanGudtK79Pno%0~JWVU@z_wGc;rtbJA5DqCu?0h5Yf^k!N!*gy6_l<4W z!6|DgA){C26=-k~+libV#Dio$h(r%0(!0+YbTSHWbzhYr-We!7Y0uj5WW~wWsl0On z-4MI+|A3Ni%OXOZ3Omrry3t!q0Lx zQ^Y@~%D*TL8o%f(96QgOu+vnnl2;dC0Un&A3$Tn4hBA0@>FV_}}NZ&eIFnSz38By%EIRRR#0 zt+WC4zP_V#+|;id^_(+d>ztLF#kx)h>)X1Bj7)97LOn$|*}Cf6PKsf@;BvQx#2bX^4a5Je-*{$CR@rN+W@48~S5t=U zN|ChJ?&&_%pQ$#vW%P>$5qbcgVnWPET|Xh#cj`vi^UaM2;C=I3_y4l_MeVje8u`sK z$n8-fN0v*`QXl!CNcZzR)@2Wu*DL8U+zZ~bs@c$-Wus}gR(|%)pl$gk{Fl}E9>_cu z+&=?s2mF~l8BAtclq#~Yl+232);)ILl49owEE}vKW_G;T$V6`YiG9*Wg)e z?bCS;m_eJ%>a8;7VwFp&5hJC$q_gT|ppis~Me@u$Y4XDuM$FtXGZ?p_*T;<_RxW6X zsPDJ-#=X39Tnk$%{BQs{KPO@*Uy(2S%Yz)@H2X!w{PfWg6!w3sUHm`2f6l|L`0yc1 zP9)ocshTmkuhgGdTnZ6rQjZ#X1+@`YLQOV|IHSE|LXULQVK3Lamk1nhd>GDpy!mKc zAjI1sBF`BZ)A9v@`t_{JgQavotk4r&L^O+dir5?^4I4)6;;O=eR$<`JrFFRrJx2&I zr9-5s5aU_y@f-~l^E)%=%$zfK zW`1-3xz9t`N!U-q-fOL|yzl#ctMh9{8T{E}pGOqF$FI2bAoK-9FGF`65gQV3pPGL! zfg=reVbNlUN;)DS7{`X)`=5{dJvyp2k+)?fHCmPNE&TPv3A(~>awFMUpQ+CF%Wz@d zP%*BRN7`0d)^2?NDj=8<<|TezmxAM@_c-mkRiFglO%GUK z>t|~;5cYg}eyXe`J<+Wdw)xQ|x+Ym@3Y~yuzC|2{_^M-@p!8Ox*2T1Hz)sXBE`j8+ ze398$EDhfXh0`#llpgFNUJ9X#p)0G*gYH5Z;`9+ui#m(Gerf8~O5c1zE$pXRCS7$4 z^lwIfy2c6y4`fX-8U-qw&j#^sESFW+Y>*e~nwt;L$*?&PYDEgHbdWcy%PsOxlRgq* zBYMUJB?&zyk)vt1pJ;q&Wx^uhIj8d-fIS00h zwP+U$q)m83;(4U)045 z?g${71E)?5k0^HQL&wc=dMBcW!E2DWc7$x$1dxr<6SQZ_37h#;fSPE@TWe1gj?vf! zbRvDm;;Z@)$l>?!hTcDnf2eheA%{pj<^Bp@lixTfp}v}C&oUU z>cF=J9MD?uqoP*x;3w$Pb2aL zU*?*W)%=`Gqs$Rjn6uv-XTjkI^jza@ZyAVH;kzNbP#+B-x_0WEl~ebuIWB)bHF#t~{NnTe(eLRGIHdILwb$O8k0QwvlzDw2GA9GR%+qO!OVmg-+%720 zG@&)x;(J~m*6Ns&L=hI1ENo5OM%A2alFPJ&A$uuc(T_@H?^4nf6;$Rpr*`eEM{Ac* zUo}UCB88-5w-jKZ*$ef{l_Zj6H!3(HBDGMnn|p+A$aK|+IaVT@UC!kAK= zWS%a3Ldvfn!Nm_(?D9b)Jt-Sn^vy@vwi8x|yx#z-nRUc-1+xzm^%CJy3$os(c z|0mS{1?|e!`-RI)y(t!YE0^=nCerEqo#;}LJ`w1IRfuBjy{iXt{SP9rQkF);udmRkBxFZhpc1`jU+cL2*!(>8@=!BPr*jcdt| zz^z%n%66zDV9o;~cf9#*%YBEad} zz71oJ%dCsxJ44V5bV1R=}7A4G?h{a@&NBCYRSVAv+?C>*D)sHtmKa1UzX zw0pi+WPxEA(vzw~r*zmy(rV+`8d)GXrdy+N>sYNnXcbLeb)FS{&wyC&8UoTKsbBri z--1Z)=vH72ZRkoiUv`OWwJ{r^L&~{*4f7kEA51sP4MjnjzPYcq+{`yfir014Y3%k| zTdoqU##H7TIJmh2ce?h@X_ombcyea+R6N!9OO^05Lm*rw>avAM_PFNO>JM$M44Lta z*cW_#8}i_V9n-Sm{9~U!Pw^Hh@rW1p0wuv8{F3Ea3N;eV$mdzkC{oEDGf(^4Y#$pA z;%#!(ZE{w=ERQz2cjs{KJT*)UKwYyy{-AUwlbOqRV?aYnb(K;A3eON&NZq3HQ#h$8iqCw%~qjs%3AKNI#vl`__>G z6rwKSkNZ{EyGk{!$gbDXDh-ONO*lKfl74z)PeFohX|$RLnQ5eCVacNW@~#$WkN9)$ zdvSN3OY?!60K$s$^P)_8BD>IF7fLIz)I*^-mh3V+>#KsfquSFzW0TRezZL*qN;wVy zWQoXSXfNN)WkphP;dtfgOM7pl=8#gF2S^d*A4g&~?dJYZ^e zpkhU*UUl~;D6GcQwzt08H5hObbWiW+gu{pLepRSV;Qk85-={IJK@HUrjI6$tn0Ncdo|uC z?&3#M5stdqg(u%MP!Pn|P@j+%TcJIs0`YJ6J1Pda2q*K%?KwO&zuM_)dYAWE@Q+Fd zPzs^NNYm&%fWXxip781wOWHz>&!hLGj!v!Gskivu1L^EL5`DctJNJcS`jMWR_M+-e z@)A75>*Krq2u92O=-vdOVx#KZYFUI@I{gOz@d zQxUGXSZXNE?NCF`fyi(IGx!?J3gVRA+WEndMAg#XCuPq9C-1Yw+X;-9P0N4ZY(ZX? z?DS>}C~eQzY?>4+^f{<4EUF6|Z8dkiyE+!7nHt+HtwrYdDXgVlr8zwS+dgdNKUMy`Ym#tW2eg6GVjH=E1x3NFkd4{*8q&T=}B*>D?f9>f>P zhU#FfwHda>1c(AI^Cw6|hI%1A-b1i6rscq9ua&Shr-^co|N3(C`P$B*6v-Z9A_%@> zGs1v&(;H1CJw=S~Wy@N%2>~+(pgX6zujj3<@}UnFsy| zL6&zvetgZ%oG2qRmNJom1BV1%C3iR~~W$RPgB2|*ykKI*`r9oC{5RZ=^A3*Q7l zMg#xAO#LHlVKK`_>8Um=9)Z2cpw(Xxqt(YhD?BBCOa0qd%ZDz>71QB9}%m%)GS{0*~gEvt&I~k%E_q5 zTEDcD?{IPXvdw;8AC<5X<;o5Ff{E_Ff}!!bSOcS-K5sYJy#DrN07j(Tqv#Or{HdLb z@Iy8?7btRIJOjuR&jf(hxm8+>W;3AHC{q5h%hYf?Ad>Qq-)c>-N;0>6SDnwJ*2-qevsbm8E-1r-Hq38C!P;RfdJS0i>&F- zxQT!IKKl4gk~*xy*4Fm|)VUUZgzBp3ewSPQH6F1EKe-4kE;h9SXaA#Ru5A?8nyKN@PKN3Lfm>S8fMAlK8|q*dd2AS>-Z}6op;(!elpAU)z$)Rb z`pKKZdC>#7(5iF4bB%upD5}r;ft%~-aKTxgi0?-arJ6GH&uWiuyVdMklfS_efu+SV=z@5&=xT%I@wt9@)N#|B$ zr7JXk=U|wBwVA!qmh6Y&H3F9 znyl=jnqNAmcy2@tswucc+n^JJM@$Y2-oaTkd0#lw^RCx}o{SdiIGFoxAY6L24@YiP1y zXmao#jj56NammF6{L`hElv`vgOGAv^g!{%Tyzw~iu^O68wj+;sKS2ulZgk7tv(I&L z9{_xTlSJ(P>zheh6Jo6?*Qiv+hhHa~AqRiXrBgEQk2mZoy~v*~l)q3CxA3*AXVn0l z5Axy)!?FdtEQ>)z2k^X3K0f(hOguTAW7JCQNXja;#B%o9=AGIKP&4|)GZVTBHRU}e zcT&}C#M-O5Orgl7~@2fq#VWso(8ey;o=r>rvc&Hsn7a>JcodI$?xP6j3WbHw>dnt2fjDrc4 zY|!9;qhk9iydiFTF^z6r3YB;>6)4kraA_d|bJGhfu2I2SW6?sRP+-3#Lhxja^P%bUgW@tzqdO^1xdZFFE zweVKB-AAA?=dH)yPYNNO3LvdP*W;vnxBA8mYWj^d)JF3jnhzg_%~`ZCe<`-=U}A^27e-eN{hD7BAxBw1CRDtd~j)3Ikz6)P74_ z%e)u#*+sak0GKV<@3Nt{SZFYI@jgdwW8USm&vSC6ot|rr#0{)04n+&tD`h+UPqpJb zWHHO&qlq;Oqal77(TpqA*%sjpHNk9z;$_}0SC4w!%Q;!FNp$bVUbRBZ`l7SAYR7G5 z;?Km`tA3KVnS2(HhB%C5{bb^!Mw9k&+C#qJ?N7!6K};2AOtMv?J)R`(u%;*DR&WN- zLkhDVY2`?PZr^%f*sBeqNCQ#0c{_V}NM>+xomvl->wjbw{+;)fr(FB`#3w}W;0$~9 zySG#bm;#?!;mvIb02D#`VauddS2VG}t*L=hwX9WtI|{&-zlY6>74RWWCgo7O;s}g# z-IcN}VjBeZyAU87<#&s1!3)_^mhrRLBBlbENQ+bM zq?jz>)tEqtEj)=56Jxo3#2xyc@YQlfZ}+Ax4`6+r`h8v_n)BKrxa)8-_V6nkDb|@ zsrd@3l+Gg;d8_Gmm&|BJB-o6rNJ)80(|s(?Vr2#sX4-Aqblt2lng#%ba0A)emupb8 z3=EC;%|A-9{#Qi0!Hs-)Ic`d&Xf+NavME2K~qy(Mt2$g#QZ=D)}v-Sn)!!%EB6zkRcoOuf(I3(?DVl2H&Ng)E69;oMKq+ww+p zdZ_x3yxBgEWsWPFdngr@vHeiUs^?evxe+97mpF4OG@#raq+*l28!sh)= z60eW(H7mMXH*hyQv)%laxW(J&ChknI_-6vs<`i0WLVxnyQa%ud_f>Nr1`%Q>-WjCa zm-F^9kLdRpxvhgn=_ST2lilN7Lf^l2hiY2bT6Yp$qe+KGzyt$1GPu=BTS%TjN zx4(CHze0<@9{)MSNUFxuaQ?>;geAU9*gAGY0;m{vRY+Cvho>Nc=u^+dM8 zZ}_PVRnLX~YbP7+?Zb}ss;!uXk-}}(atR6WGgq>SH@*0^&USR!Ck)kww4g%jF&1{G zO3m==SDf?<-Ea3WEn5y;(FSrzCnkIVO1{A1s~GIb_RVn0+sz|agDaUt`wWocUSbML zUZ;XEd7^*EVE);;%KoP_mG#a0GA8{of}ACu7u=*)eeZ*JAQ;ncOn=%{OK?U{MzOji zo)yWKf&$+nke$>Do^U5V!l7Fi{V$1a1rM1Uu;Gpkydbb`yW;Jm0dE;Vu*@#%P2wFZ zC#GN?4$#|L&&e_#m0bBaHuyGI_-bL{9vw+!BgYEFo@1)H5B_XwzP@8fO83QlsbGBb z==GnV%pzcpN_xGmi)~(G@oabi-ou=-T=nCk%R>g4=opDFqZvHn0se@b$?{F2 zpAZVEI`YDHe z<6o#&y~{!++6qS3e=}@k{Bvbf86(E9?#_8@rBh%y-;9Qhy?f#j#gdFBKsj8-xuXl7 zdjUqy^#aUz*@04D0&swXo$#EMCziLi>|`PDFn1bS5^556%!67+Gg}!3c1<;#4oBqJ zy6qAEo3o4ztA^r)cC%CXCkg+^LWV%!@BJ355F4B&-%SWInO@&>97+0wMMOq6YrWfBqj&RAp~wW2*c2hb@)Cb32-!vqZlo zNwaOh*K`5BCL5fvaX%j@R6M;%-mV|@L4p{yUD0fe-~%TFDHUGJ33Xr@30TZp>YBA_ zG%IB+tlI4w;Gx64`Mpd1#dxL~pD57kKYt)@S2l8j%P2Q1BwFX;oz$i|?$qaCl!v^K z#ea7=d>TLHK~O}gLObR}yJU3J#7|_u;4x-tCk>`nA)Xk@h^ak1*;45G*k;0BjxQNK z8!iTG9;M&D8MUnL0^xB0Hzx3Zp63lqy%dl%fodTXEeNDF zc*IGcoZ`nf`ZFmQ%O>Zbb6#qB$|7sQ@&KBX&`BTJ&DOl&i*-FoDxv<^gnH=?^GmR|Xz`sr$}c-L^XAPRG>& zOuB*wAY%9{U-VlF;vcx9-|eIHf5Fif+yp1__xoZ9UMA86FS;J^mf(AL`6IMkeH||T zy6m+t#JiG&(jH^{jv8040V#MYiCK1HD%}mgu1G_GXm$dEGTWM^CdA4Vy$ttLFB9vV z6;B8U?f9Wu=9)=r2Z9u&T-yTK0@~+4?p}rVBdh(D6!^z>WZ40)-4XcrYw16I{R$`? zIg@UVIhxuWFh=8FnVih%0P=ITscnjPMgUI_JyF_4N%P>i2siC?XCWc8b(BssxeJ7i zy;oS20!k7Gbf(S|JaFSy+CeFz^ij=CCZ{o^{&NMjS5>Q`duInf-v;Hp+nuc31L^(P z75)kGce6c+!Hb++%(0H%k*KEuHn-yc3DRb4S%ellRQbm?dloO$^(XdgzdJ%dpK?9n z9YB0{>>+Rx6im#qMW-Qd?Do=;eQnN^8}-Dx?s{ykhkF^l!2y3CCqHhs2!Gl3N#7HX zH?Q)BsFRFY810&$zRyAUl|h=I6RH)nO_Xod^Kd`^Mj|`=olieOML>G5 zI!Cx{Sc-hfZyD*oGn1gtRc9CpW9RLQhd7EA7`dsF6y$yyJ z94q>~aNbvM=ou!~cD)nyJQ5}988J6SVkZ)(x!|Ipc zuzVTjXdzozLzAHsjsz-h`Cr1>UR9MGGJ7zh;I`koms#1Fs(v!V3NDa#oehwhaM6s> z>s=~(r(M~fpk7&3`nc%Y1@ckNhXIN{&uf-u7MhWQaBP;RFsX)nS-$&hC@jdA$YF-* z=`m|tuipsvS3-Bqb5gSwaiC0>dnD%kFtajuDO7Xn=R{&9I(y%(^> zm!#{lw2wtQ`)Q*L)G9PJNBdU92CXZ3Xf*_4JQl775ShSF|9e{6r`6X0K(QC-gAo}? z#PvC)+V<<4MF)N{)TBKL{q~{t9dvzV)>BfiFeFmpNN+NBeukz=-!t2;#7`RFdwH*D zj>Fjxf#nM+1hTw;UgGf2yLA4OLRUJvfn@dczMmjxF^ASirAa82d7O{7|Lo{PKlcRd zkJSpr=f7e$de&QxHx3I6sw$_*6&99o_HaXIDrxc3|<170m5 zRQrf#b&B>aCFDqLJJr37@@m~xxPN!iw5LQI_ivT?XE+S5**6stb={Q(dEo&F4N!aijagWKX2h{atjibns zy%P#(fbV6mwe*5&BNr&7Mh7N~uxS&4& z=~%vv@xS9umPMD%VnaPcduu;$Y=)4;)&r9o$b8^`Qrf2OtOm6I=Wfjmv zXsh=sowqj-rb413^-Rh+^LV`M>s5<7=+syPb4<9S6+c#$Yi4*=z8*hx{4(itsDzp- z1Vloedwfld4?w!hskIc2;SyOb&z}E97V*cpELS}noFuQ22B z0;`sXCU@1e4+;t_Ui*6y-VZGr2HWcFiMTS>!dZs&@i>k81M04pUSnE~lIB zYt%^cF0pRjwFBQsHGsKKXe2+HW0H-a`F6PqcienCH!Q|h#r)t39@0!Cka*~#? zyLHAFL0x0~szx9A69mZW*3cQ~3v;8=@A>*kX`cu0){;nt^5!cj z7_rO%LY&KqzTp0pBdR51J%l&7|1ln%WUb3CU6lUGtO*Nr`%(v%i4fcV>V(&ai#$W- zljcXNQapB-QbPl0{XRTcR9u$jEvoed>cur3)*d`~I=>#W$<`Tp7a5Uf+hGfA>6=m> z{B)s`E85St$@y_sXWJ~)S7&9!)f}y}s^Tj&ayo6_o|bj|E!WZ3baQ}SQE`%SVh@XR zrvTxh?+5F+fVOj{H$Rv6#{>noALO<4M}Unp==Zr5+Ml`88YF<5vNbPzDw(z&C+2r| z$lAa$n))BzhjD_s(RvH7ryD^>)4O`>>E?w9i~byL`^T?e^7S@r-t8cTwr~0>%xzu1 z>|m8?vg{b?q0Sj-1-=W;LXP^f2mS;xFz=^$!KBZqsdF=O^(tv*+U(rG2px;maUCVY zU2+UZO==qt9641EKD6HEjj6@u&p?$&-lVX+W_dyhSm`Orye6FB3~rP9Zoz8(PTRa) z`VqE!&18QP)NA)FLOCxl&2_oW_GNGnHg%xKIC^#Dm0&ZBYD3#Lp1~P$Xn8@f0wEvC zLoUZ{d+@_<4@N$9r7q0A<$Z`>8!*TQ4$zsz^F~Z*cT*x3&!u><`BFj^rFpFro$m%5 z%|=-BN4n^maCAN`#UExjuhugqwBz z@d+t($c9O8AQ#|a0`Dl5?8tBUM%pkm==Q#FXtZOjERV1YyKUh7>eW`KS>}VB$kZ&N zdjX&g%>t`RApOw!Z8H1MH0uU}vwGs*o9~{JKCnL!kQED{B|NVRZ44!HndN;~+)8m> z)6z5s2*qg*Ddt)RoKol5LLsYI*n9!up5u~@EXrdCO&~&@c@bnVT7zzk5fAfcA6}-f zjBZhMD4D!{oM~}DdjiI#m?7WE+@}h{i+bd!1@;yUTYz`^?te!up@*59aCS2*t`3y> zgUehx^%hRf8wc-%y5)X?mTKL5GPC+sTzjuHjYt+3>zxbDxee4lriLnB|8HO_zxj-_ ze8eiR)>PcVJyyg7uksxvtle0x;01sz71-f(lV9u2|QwdO;8BaHfvLsfb24A&V6 zn$AcnXNeO9L-u@mA!Q?&HcPxd-J>*83)vvIdQ?S9tZuWCye(g+0WC zAYMRUdvo|r-3yZvm6wjvuN%HXM~=|SZ#yVEB%dtSeAwyhc3gljgqjwbe3=iNRDz1X zlaaL#-G#be&V3e$rnqy2=J&z`Hxz303@i9#3rCZey^aLaM3jnv&*8ag;>0LMu+PDr z;coPDZ2clQ`YS$<9%%=BeoXb%N%H{O0d}n}2C&)J!LxGpR39^K=#3vzMWdXmR6s`- zpc4gQO$y)pZYN7&H)LQJi#*n*@W%#OIXSoVh#onDHq_KcO`g3P9eV~BcsIjc8^<+- z^}BbX^@dxvS$BtR&MYE+I*C{*QpF0{a0NbljtGxQSiY6Ms)D7>Q8g*5HXIeZuHvGbRww zXJ9`EEq>WtSrJR0owP#}#3P64e&_`6sz6-!{O&;CD{CN1y7)&|Z8 zot*>7xq!7w_i<)|a;%~1YS~9yAr{_1pP2E40hFS1b^j9$19ubPT6r!2-u*Lh;s3P< zfch?!GO&!P5oQRFVC}X>m4WhvHiBL(Tj}Z#KPr*!`gY7KZS$=aimCUZy#2Xt`J%l1 z472MV;s=h#W8*fYf?^)$s%tvtxZpDdvzk|N8l2;k?EOGI^L)mTaIY#yp)AivhriUa zXW6A&4c&i^rWA^~ z!_aob3Rc}1JF(8@<#Bs99yhwjqi1O+BE(ZFv=7+$f2jiSpEtB#lDmz;E(Xsk z^ok^1#j2rSbv-i}pa)+(v9TZqqp1inhf7l{x zFN{Z~PLl?&83l8i;Wc#j?l{H)*xQ#J47h2HyKZ2|=Af`1UoG;O2$7n5!4EogD@Wr; z8_fLneo`v@wwc3h6Y zRsQvhqWTk;7ZBSaxb7x_vO2E1(vrTxmvN)5mzU;_8+YL?tY3E_!Rgis{=t@43lMfJ zz~(>{LJ2*oIXt%mUsG$F(KmLbBLTRGmgyJV=~rm|zjV9+v`sB3a=Aif0kkvbhfz2& zoz-`(LuWsnd%R7EL22kd`VzQeaZk77uIhY5aH$D=W-5r?u03^>hA^NC%P{Hz&n=oC zfPwPkO?B&!8al=|pPJyn4Q0{f{CiM|c}Q3kNNK?sW6}U>)aLOcQBhE{+q`f0OO@C~ z*KsWXI9%F80)3`#{{-b3`-#9mF}ppWOT?a%#d)W$ndo19{4r!(K*9E|jyX{$V!~oT z;eENe1^f~8g|W=k1hv(XMZE^JqB3}czW9Cx>O+t?%HH-OEeuWJ1+@43^0O~b7Wv4g&lSM+`ZwLqrK#CLcGWE<1#Jt3U>1uU@OHq; zlT^ki#FmoZNS-%0Q|$Zkl376|S>!1#QFI70fM`u!nq(pms;%#vPS{#gdXJbmv8{{} zH;n`F`Q^bXmD_Ixr7x+P`r^M(((& z@v1kiSlb7nG1irsl23})Vq0YEo@u}+vH8Dzykw+dzJk$C%yE4_>n|VwktB3L55Wzt zKI;9qPk1&qZmKdnaqn9{uwOE-O{yL8?8@S$%z@|~2?$aA-{ma(@SFN9# zcX)c=;Je?qpW`|O-n|IGxf*pKpZ$E;C<0~?tTK&g}4?O*y|yv8ip5LJd$ zwr8@<-qv~BgMIR7OmTpQueUP&AVqjDScMxY=Pv) zF1riPBkd!}yORHO@czm0>y%ei#57d}y+R(*is|=17}FG%?qEyCvpbDp@*VycgZIb7 z59MkoXJCHwQ3Rb`rdL}Xq}W$qtup^$?qm?+gZ-mxbUrPb>mem2p(6nRfxmTg0-iGx zZegy*zs5^?<(miJHn}BDvn5S^ChLGRbjeo|L+z&t>{?7&K66-NGS+ThX7r}gD9-v& z_U;uE&?mP08%b0llk|vYIkNiRjc3Z6>0_KXx@e2OJf=dQ^%w21hFrxc7GubiF=zX^|j$#Dy)ngPQ9=5|~ya^<#-ez}9! z`HmZv1JRu{HqGKvQAeR$yup~#$PeK>$=@gZ9IJJnMJ;tns_7w=uI0Tilk>OaU)CO-TRqaA_ zqRJLRgu1@^9G$2fp>2M5r%0Z!l^-10#~nyLe?OY^Ba(htLh+0>Ga>+a-&XOzKVeg>yEvI$d;Ei3TVX+?KC*BBq zQro3q8JJTxE}n3C!bLvu!N7beLmZ~|dq+{zCpWFzVbyjD!D`9u$I zfuYu<7_$~u$oS@Z^yLNl*3bz1_gv@obQptfM6Ai|X3{M9lBcm5@x31PqltAJ0e>{h zJ?dy)qSDrhPwq003^*D+s&2k_qk2;&6;}3RyEJ10PuUxgMVx!d;NqLJZj7f}Ynm9< zqDw66Yrm8ic{pF@--_N~QoQ~B0m!YjrPR)VcpLfM7#SpDrr@SLQ|hyZu8e3V7tbh) z1ZjC&MN9+~9R0p{ZZ{YH);lvMd&LP#psebDAu1hZN77akp?^Vxba}wid#S)1or(@0 z8}VGz#WWf(z4c|dG4I~@5^0i&wEtpsVfVUOWA#CIIdLXP6h*jw-bR#n%z@I(4A`cx zn%*NJ)s%h1H^9AF(ePP>vlQHTFN-T;aZ+-|5u=*Y8?2}!e9<#}D!|vmCIuJ#&D;MY zR4z8p)*K4g^C>mIe*XIPwBts?h7v1wL&`4NrphcM?1d43in1PDhwg6o%3XTv-$cti zZ;E}~kT!QF3|IPA#kotApfs;-$REpLring9`w$zf-DxzCD$RW9B^UHGel!(%BwG`G zR{!bU`DjuQ=NyMb6Ub>FMk5ffH|XjIZE#*m$cRAP{2Y0b|6CAlwj5X(v@V&AuLr$)oG9Yb8(0nHCZ8+hx`Q`?v<_AKpcQX)S2w; zF$D+<6g>WJxP)a?av|1L(v!n0Z7}xR6D;vIFLG)}l5ilH@yv@l(UtBLX#CNe5BvQq zf-H6yYk!z>c3;1KPr07^7%BG(o#CF$7o%gwsf5J&PeF{#Et}r&rpu>Yn_u{*+a)17 z@9fKuQ7rt7ivxcdU3Q!pZ}31`uQ(PdvAm6(62|9Nu#Q_@1>j|7bi$pUM!QA3#N?l;!tmcDA^T{B{N%*|p9zl_B!KM((PJCPYnk{mO>4GwCR z7buW#XA2~D<^AalM+ms zYg04}{iR8e7Uk{rqY`7zdv+Q#_WIXB9N=5m;;)@?YPr8+3J>r;(Zhxj_}JTAq_Hk>6MK8^@pF<3kQt%}&w{M!*EbSJOK_#V9y zB&h91;YPHRNy+a9?01OyZ_)FA>$xQ^UX6Jw2y4a{pgxfvi7FP3q?&fR%lzJ;L*E0< z%8OH)fsvY2GQ`;Sjg@&HI&nv0HWpDQy9Un&HN*1iXmOrN^Kxq?vhLp}&B5D@^T1{j zD-_vYIV+>CWf*hw(a|<%f+@Mok2m_$c3PSpUMy7F5b-&xu&VB0nfqBrW9>7QPf9;V z*|jCBj1z~^Yetz2CvzvuqS-Ng2nuXgsu2HTdbHQGr6*JLiayix&jVzW`3*D>I*A%@ z2t#Viv?4=o!XGWj82LWWQz~hX>s9T5DPV2QxPC%S>Q7M5lYGH&0{4K7;Iy8dfK}k) z{(@c2o`f|TdWTLH-X3Tli-l48&7Q1F z$ho_$BMP1=xY9Y^tCTHGRfyn{-kHQUe5s+Og>$G1(OWLE%}cG@*9ZTzG+dRM8`e3ni96cMbFpj@Lqv} zDRLRtCk@9o#2+{sULDhOrm|QWjwG7UHk}H^pa1NMUPp|@p}-^JhtkiVjn&(4RVn%} zqgZe>(`Lkt%zO!(X|_AI^im&oIBA4~hO^ebO2{Pd5pBgu6(nVUe1m{N-5SZVVF} zkLQS&3VyS;sPeGusr8WD>w>u8)v;_ zf(xIk^`BczkS;`iLrlLtf5Bf`>qG(Mt&adEdx@q%A`I%oVsGJ5_VF1-Lv(t!giM6& z>V$9aG?*5b+rUbWxkw03A09UxS=E#sKX4XPzRqCF6V*!088hw#i7LSBR;z=*_uzcg zLYIs%v}$}prjnPxQr@WuqiN&FI!-^n=yHYRt75kaWG_?lRSbrH0 z)S>1!cnd^j3`5#-hxryb$J3R+Rf(;WFrJ;K3Gm9PfJR`!g7iB3Gtm9nIUFB3{3K3Onp zpu&){tZGlnd0e)n^NQia8$tU5^KLH?v#hnbN;CQ>vGVQq`!y9$`_Db(YsuajNjrNS z`MHP8;_vMEzY3oGzdDaB3U_}-AZ2DMl);}pd9`z|@J2_Omg45Kupf@X6ajMg!26xSL(#PywRLeQkmj1wJEhhdKActAu(RWxk}DAUvc8GYDm2v@lSjggIa zS#;I&FIxhKGZv2IZRbpEMk^&apUp)QiKd8uKe1P5_$qd9O>El)2M8nYX;M2knPFELV0d&lReE-!ayjJ7d)Sp+34TE7oV z`7!a-%D0ma!)5HD$A5i%jGrkkZ-5$v`-vMHb5Tx=y&R zXWjQkHZE9Qj;R>Yq5tM4gTUu#+Q8d#m=-QpT>c4cX0p<5&Jb@jU90+|3!5J|Iy-r2 z*tncS>-;%6w8jD_-|1}${7c zSrktEoAFejjDimoIXT)rb0to=$xZ~dG+Mci;3jct;dGak@BR#Ala63=U#e^zRf9)@ zd$w$Pzq+TDeyO`9g*F43b9UFG{eq)V(2lf2P}RH~B_=rnZR}Nn7L+-DPA%7HHuGia zxqQoKQ5PMYQyxTqdx4{}kgP%TJjCAPWcoh6Z+$!hYgI6rT6-@Pv^!kKX4Z}oZ(_#o zm35~>jjanWD{d@ZNLL;qaU^SRO$FA{6%j46_tvlrZuxg+5N~TlMTe5n2^o#iUspIj4BWmePW_Q= zL6#`>cm`5%#PAx~?j%(j#RdSe-HJ>^7)(KM&QOj9Pc%@QwQI5ey`X4`mJ88-|O|~u9KUXoV}}RSN-Z& zwRf`mb(Miyf8>zWArv1UA1Vd>hguy#nWNT#mwbG`AJ_c;6X5^-C@3JnFCZi+B=qMc zEV5QeSVUMzXsy^<5z*g&;F-9XsQB*}zX$oZTh|Ek^9za!3km=Ek^e^ztFhI#gq|SUdgj9_N+6;F#4d(?n5luP;n* za+B_)1WrT;;^bPg+r$m`r5xT;T#=x0^RXU19z`1Iz^kmH>UOT87)7h7B2TVN>&RU8 zDEg+Ix3lUU?!IlSs9V{!!`mEtf7P9TZ`F}`!8-PuhlkYG_gjP=TX$mjL3IvT#w4bn zjEGdTMyJ_$IFRXJ2bYh<%OslE5wfRQlaENrx-ZXq`yJISDd%&ter8c>AgEnsv{QIW zQwC0F*&%2wY{}&UWIhBR)E9tqlL+cvNfjZpvxB z%N5BVPUJpEULv(nX%N>yd&ZZ!%q|0hiXoB^j59HNMBys0qG%Lfj>JUZ0(TXqrfo1c z5tLGW{kZTOhkLL)dyyAe<;!v;u4Q`8rZXuHtOjrCui6n;snHc4&9D8Q(kEPaNrs<> zFOg2C-SZp&+RrakeU5q`1Me{4=DB*UqCEM=2s~l?C+MkPFJT^QEhF{uUf=UKZoA=cM0ba$5^eu)mLQLzVLk+stx+3|`TRMJ^igi}f|bl8PZn|t>?;j?wuDvYKPTX z=*HMdzi-`K!Kd)ccAqRKiyiO3ryl2^E`$iVoO986Hg+X^e?dDM-bY77+s82Qu5hkG zN0m8et2eanQkC|TRg|AsMc#b$b84*9rry-&!zH$|Mdkc6uw<%z7$@Q!wsJqFhev#u z57k`+Vfn~xGq2E&&EHG)!m5rAW~h{Zk*0c$lrV;g*r|g|4$UujOX1hD9HbYlC27;5?TWkld zbzW_)di(rM)SWDXvxrvPE(I4+Le8rTsf z@H~Qp`^eGwu8BbXjG;>TmXtkRs(E4C!#pK2J@hF7=u{IMg|uT5y&JKgZ9XrW^!tqC!<0!TNMg?l%u~EY;_E`+&kznVmZslfj}B(dbPCVnX|X@lCkG->w}kZtcfVS zd3kRdJ=#n=EVdl z$C{Wk2y(#-0}bnmu01~^vYkb?r?zqq+CS^W@6laUv(nSiNql$wF$&#Np}t_v9s>UI zdI{Zsg`Lf6naO0PAtIAw$g9a!eQ(-M)pp!m72mcj80$)*$!S^F5w z`8|s{KcFX-{VBpYKbR)!~TB?Px=bB`TN~r#ggN+m8b(2^|I;MCk0(Pxp?>Yno{LxhaM-JFBHMTbw<6N@h&>Kj-@g^gQ~wi6|Ry*q0} ziRMgv4513*hzF-0VY%Kf+Z~Ll%aCOe*gY-L;}1^D_kYuuo%Y(WW@EYj_8}re8tX5yQ1k;6)GHIwdybTa2-N{nsX4|J2-Rj}Sg?{4o1 z$7`K(lD_JfSK8y~DX?a3!AA^iIKl4XMT6B|MJW<7AQpYd@Q!0qoCBwQt{*Gj5fzdf zJm!&Ko1LG3!#-?y&h!&%W=M7JJv{TI%U2;$AvN`A zQi$dbk;A=)8($9A$=s!W{6*#}1u;Vp!Tf<^U^HM!BEnry~U%zqU@)hX^){5{lJP*eW|zHw%1&vr8o;WrfV(Oo88=+ zeg}IS(uJ4~^jI2t76P^qfg?sR+zobPLD57EGpe4tUO3XGEyjexBwzI3c2l#&LPaty zQcS&dyvBq#?qq9U^NZQS-E0nEoR3#hwWAmFW_fl#$Ia(icXbuA8BTmY9WUQ9{H|!> z))R>=^FP9xP^2;C=P`;Kb>6(+@=ekjzYpoADq%-@@XVumxG`<+HVQKxq_uRWM4B%z zjSZ4Cbr#y<(m%Io@{SwdPmeEh&o=dGr81)NOeZ`{q|~=75Up2Hk$~FX2G?58Xw9Ye zLa6>MuaMoY&#(QEI&*E^xDkFdgik8 zf^!=8SgA%OhVXt#?GVW%4#kHk@XK1#uFH^TkTQ&(=qDI_6EQXufK>5aA?X< z14Fq6e{8M0F!7NfJ&72)JYM&81cQqK1=P$6FSw1AjSNwkC#d~+M5K+Q-^4ja>T*-7 zc+*)>^|nM)4p;8EWtpQ-58ks4=$HtO^UV-f*3m*zEsV{Oj^O{$ zn5Eyq7R$}<8AbQIvjcedOmM6yH)dI}Sz<2U#pgp7%?jc#!mZ062z})z;Fo`!TOybk zGk4k$c+`<{o-Tf(@tS1fR^f1;pHf}OIw4-} zD(d2V3=K*E-usNoJZ0nAB3pK(5NF~8}wuRa!_dGo{8vLk%h%Y9z}zv6Bd z26Z$5Q$cG$L&H;`2Er7JcIvex@2A8Ufbjn36u%$ltSs2_xt`Mx=*Y>E1K-`^LJon+hM2KXE9Z zt_6KwanzM++_WN$tYrbZfk>FMqGmK-0Phy4g6YhumXU)M8JQa@G*aATlIGN#)0^t) zVy*Ii;_-D#p?h|hxIjT~&_AZxk9ZFe5z<$PpLl>{Na`>XEMsAA5pkaEFo&aWFPyks z*XcNP_+pmjsjG>HJv;;yVz@*WmMc$S(9v+`vLo*ymhpmQ#MB~RgN?$LZzcVj{`jGh zaK$(D0!H5C0aX;WI1g_@b0sGbQ5hf`3)rWmKX`iVdp2|VXoM~EP$@t@T$CP0$!pPD z$MNvCUAwy&Tbn9|H}7^je(3g?!gUa z$MreOtna)WA(O?4wS|l4sD2RRE|p2}ti`}81x#A!ewSZNr-*n;A#q-pxfbQQm+8QjyTaB6Qf}q~SPzeaQ;)%~I6+hRV$bGV zrEjWPS5w{i-}PK|4Q}&GvIx$wKJ;dAW@pi!hXzG+3$3z=wYpdatPR^?nRmHsI2bm> z)zB{Tq0p2L(MuusxzYubnJeQf2$WnIx59y9sCHNe0Lq2P_WpU~0~hJP@Gh&}#vWhCc!74{0avXk!;qPOL<^IjP$AEV`L?NQUv)561#pA^Ny<8k{ zZcE_Y#S@(UuH<4~F~@2Z)x*n~|Lxq%4nZi)dZ=z5yKr?C#SgLzWeWT2wE8>--ifW9 zkHny{jP4wIWX48j*sV?WWTtL|LGNA7q8r*KtzuCXtEl_}U6VMT_2I@0n?O3#g$^6g z5sWI!u67kAjUCAY$@4T+FF(SG*PX#LZ$g*CirXGreQ5IPf<-OAZEKrRWp*M4-KgB@Iq1l3RQ*j;oh z2G-4KP?CWYf!i+dvJg40Rd<}y#$MunjnZtNr=ksBSDsfnND=&$d42XK>z-sJ$8&zC zbtxCD4)+SrJ8f(d$zQ2YtBRIL5Y3I*TYAJDsVg`l!0S^BWSfxy!8 z$4eV|C?MY-V1RX33*hbLGXpFKwqGCQB{Z4L@@yQl>aM!{=*q!ICup+*3vt@0cicStgRDm zvbR%4C)UTY^?s7gQ)kO0^Acazr<7|ru8a$^E}0hxu<`{k2lZmQYI8+j{d_bnX-jV@ z9o^p)=#gXe^3qN=j@v}s z)0@Xddj;sthMwp%F?g1DOL`;CR)d|w=8S#v-k<#N_?&u4rRO9T)&$C$?IiwY8%}28 zL}U0v-Xx6@U7}vF*3r$|=un;_FR$C*c~C{F>5BX=BRw%msa;!dem-`^*=z&2XSd1r zd~bFl0!m}19W~lbze7_+$W;3%v%+iP*(xe3qb%y3!>CzmwyK17!y2M1-Lk znrp^{xKbZEqn~3(Djm5NW9aDXsqF6s-wJ4|F+JxZ*NTmqIiqG?Jr;Uo-V;xp2gKlg zy+b{|*v?W(G7uvhzMmoW=l~K)wFAZmC4+p}S^soFhVJhee)wxm`AaX$5GYTM7NqYocrpo1Yu)96;dv2h%D4b(? zb4N<^g}4?C!iERZ=G$fmZ{D3t&{6Q+a>ErEVf&!V5LBm(^)&R&w%R~c?l@kwdyCG% zwl`yMw}cz7_hH(Nk-7P*9-!*pIx^2&^N|Xmhw%W2wl|n^W)-o+u%Xh!lUZ+I;y|t-k*5_LiL0uS;~=ar5I2IQ_8kffMnOm^32;uKa-!tDowc=uu(r272?Rf(Q+*xRl|| z#Y~NB3xDL22wG0s-(w86ER0H2jg_JTsLTsdTvaOb1GdzGO{QT-?ro#Ew;zkSAA*iTh2GUe&0uf@1a5L#Nw?x!bw}wb7=H2WnbEwj&g8 z&!bEJf{m<*Np*)MYtAkbfbQb*nFE}i*)tKGJ;9DYlr~$d-%pvk#o8Xmj-qxEgr)a247h3M#^mxPeAO80Aw{ z$-6}^eO4?T=4cJ22?b3AwTAPp900CuHE9%d8_TFRI`(d4U|;UsdEz!3c_eDB+ z?UdrS0WxJXtJ!A+4XgEWHv^wV8}ceZ_8hQ7Hk%{s$!{+Ha*g6D0d>CrCwY_Q^rAT zAY&x%e2Z~$hEJFJcQUM!%9Sog6n!|dKR}}h&DBD~$EZbt@gVCUQWzMJ$6^zD=`oM~ zZ(+~EDzC(?M44VTa_C&*Ta4n$Vi4N{94n|F&B7vSTI#F_L>xp^5|6cvH1a@4<4C^x zavHmlM}bCiArJH&Y_TwRJN+w$`KAi}Iyi`PWd`HT5gyPyAJM)*e9s+9TfQ`$Rv6!4 zSP+M0MA4c1@$eN(GB<3D0{dvgjsPqlUu4^3K#1Rx23t~i&lD?zIZj~v!^%(1yWchk zT-lFF#4tnVxmggXrr737WS-$v4^Nl45jJElGSKxn3F3O#X(Y`?wIM^MQ*&tubFAd% ziG62puPH#e`!|mcSxX(W+CkliWfaqyz7W@Rj9maQ+6$P`7lb>tzec!(InTy$)hV+C z-S-uhl=ekx30R9+mur{yEiAsBtL0ffL4U{BLQH!Ktl7eqEoQ@gkS7*arL?3=k4W6P zvLiF+V#W6I{*w2;CGh!E9E+i^^_nRH2ZF4Hi6ww#jqWIRf z4e7)(J;=55cYYN_YMBXAz=EEKEhwKkq`EwMdPwprO9zzfM5L$67cW3yO3CwbOA9KX0bx;zvNByRT+$=qmOkIWJT-J8p2Gc z2L)8;QaK7+5mbH0JoEcHhf%j|K$ZbX7E?uJx7Xa0ZHECK6@nl`>ieP$fh(th zCew^BNcyosN)QLUSqG{iW;H<7LVFC;9uNF*rr-_evbMy4WDEG=?JE=W$a@z)HlZB4 z_`-x<2<0wFv>VLT&>!%Rl3_D#aWA1X2zj7 zYES!1QXhtS1P6OVu!?;uSOq}CZ~x@o=A|)!nm_P=HqkWM1-cx?nY7OwIa+2*I@{#Z z;^%hVd9&gDW?*+GLX{*Ntkl95g0oo}>(&e)QktHlOEg9H^K(K@8oqjYM!{!?`pzW% z8Y%43UTUesGR>=X8tN#_tF!c5L~S3%gft%(|EOksb@FS01mob@y#%c-nKyFAUkD#4 zx$ZDWbs&9+C&xv3%p08U&u%I_C*FZq(%zwusATr+E; zl2{aj&4&idKZEs&`V-B??|_2m3?TC16acdqp?Y&RWkYZ(fTdd?FSPgTgCMmC!6dWW zXXSOr!wQV6D3sP_X;AYdQp$-+a_@kqx%0l@Q{T&#HbOLXLxeLjyu~>kqmR8HO<1v@ z_E+8QUm;da#Pv-QxJn6TqGVXr;fCd%$aGK5f z#x0f=0SEa8G$SBuJ6NskWM)bt=RB$VdU-7_mX>`>cI*giC_7@J=W4a*G3z_$4r`yg zbw%SSx#$n($i`hkd@@)SD&rYl49mC=6}QX`WOGe;fc5y{q>xU^#=VLcdJU^w{WFKW zXa={Jc1qd%ga%*mT&LIh;E+Jk?Zb4Q?Y_JG%UERHx>eMD{U22J@xAjrh2&olo)7q1 z5w+N}kqk~*tmQDL8z5N|?3L#}ZYq`C#KXT%%^Wh!^DWSF%8Ph4?ljxG>srSC`)l|F z9O(D?R+=~f1?skd9yOlnjEPrLrq;kug;H5*^#LHm!{v5x(5SWJ&*1Yn|4?yGj%(d= zciZf##7u{sG6%Cx?dO6N77o_7PW&eo-e$Urx`AjB^?3yjjqDoL-t5?e2hLqhzj7pF z$lg{b#18u?_OAF3_nqTH^aq=Gq2Sh=P~A&xao;S3b2K=U{T7Ber-K(q=HrO?T(eiN zS5b{M11E|jCvOPmb=Z^?O7PV^Ot=y*%>UuHN7to5V)MvW8eGW+VH6${Ods8TOClpM zfiiNwOG``HE>ZGb#sVuDZC-kyZl78RN|D~EO%on-m<2Nnk$kWUHHLUsZ<2NoNfxJ6 z@NzK!LXEZJWm?u?6r6EbGszPg)oL5AYC*&!S^77yo&>Uzysz63VV3BgSCQfuT= z{rqK7;^W(z(s4^4AMxTaMdh^uyayPzUK#9l7TsXUyb|n!NII6UJ#@eK`(W*6pZioM%7FMaVkIt>4?#iW5ycY^To2;VBdGxWNVX6(-@5jJ< zrAH=aLV!Hmm=m+@%vAQfB#d}4uE}od5xT*OC@{x#uF`2z%=E^+(mnjXXw8M)<1v)` zp5%Ng<29XW0Rn^{5v4QQbdSM5Jzo8&QDZKhupB8+4EA;$qZY+~{$76faBiyX_zm~X zajyn#Gc_7-go%u(@F<%Z5*Zodco9q_h8fqwd!%u@oUO{nCh1>lnIpB0yYu2}dSEnA z9Kb_8;3s0CY~n&Wc&-Q#G@+Om3xczye88;3cVf1sm7+RBiQMB>H!=_Flpii_xy1!# zm7panc_JL?`fd=ZH_xw`e`toc+`T;-YhL+&`m_2^EPEDsk~gUp!?dOJ7iss$vL7+? zdXQxIaqFi(&SCX+uP!dzHoLo|d6m6!pdD8G*ztDX`Ll5-5Gzaz3*KYuNDo~=c&1(t zf)BMfwCT>$`;D>R)PHB(60?qS#I2@hBBb&iy|PT5L4Zw88$op%q)i2NXU~~{uoep+ z^fqrehb^3#*+jmFWPj`bzVZ&i==zZ^IVj6<VHivPB_E;d}$xujkht#yq?OH`C(|a>b7hD&rwWM(+;y3Ukq#`P@jRh5h~O zoL16~;ndAf#lC$?Lj7PdGS%(|=C znALH}d3LP9Xq zoLbTH`=FelF01e6)zI>~uK6mJ)IK-+W6GgvJ_Ebq58s+#hdv7PFdjB2W}vxJ4x_#A zIOZ^6tUazObd0(lKIbcJ+a36Jb~g9+^K$(@oekv{UILNUjx|9KVF8rxBNR++p)(JF z(+LGLlVBzk3!DQoM%Jct&J*=22$I1OP8`2`qax>0CXOb}{b&u%N@6eTcfLNF6=ZC# z=6gyxpm-Ct7|WF#KtzR^4v1(LgAS|8ab?=s{;*F@aB|hz?2Gy&b!PQ*^AlePfsSJ_ zy_4HxoX!M4w|?8xyEoDz!SloWJ(LqX5T_jkVeVPpvnpTCA+FG$fHptUn>E(H!F$tO zfsb~SGSzWTTkHJ0lzqd)Q*BjG7T%olZPensV5s^V{``TlUt)@JGdRxSAK=_uGbkk+ zAvvPUNW5(z4&4&+tR?HK`AcQLggHm<^c~L>gT^}#|A;!?s4s*v#K7tX-1QOcNZt!z z{j5A-ifv#_Po$S5^rc4oqRx+H5OcSy9QJwX4ITR2yD?AeZmxk^$Oubr{o>xHgn>|N4n=x$dDQT`& zkyH~{uCng!H*zV&cnRF@(tHC2-q|wi`kK@~yn$C_;=$}{e$*77UOMr$B$|+?EZaLt z*nIGnX34Aj@zxjYThGTy2;boXREW?q6Pko%b4e=5S8TaK97)sJ`E<+P=6JcNL-%-3 zULIKA?!SF}@P%^R?zl`D74=u&Z(u#D6i4%vTihf&s|X`2iZgrD^~I*;67`GC^?bHT z87t=Q%TtS~Z*H|Nj5^xoyRE#e{LZ=Z@C~Ag&*IcxDu9E`d|fh{s13Fj|D!IM#XnP^ zz;&=ZUdXW79zry=6hD(X0y?~K%wgq7XuV}%P&OW?;8V6YY4qd8^LN#5JkbUEG8{Tf zjthUn6cunKLlKcHoDFa@eN=m9h_fl!mzHF^zdwp7*hww1gN zC^}S;+&GnxE$F)6W6SyjGCz46P_`ET-(3!M6wtFT1m#vGh)V(3j}Y2Bj1y-!>C>asW^&x{PUaG#Y_`6brCAf} zk$KVI`disk2)dl4v3BA6zV1Wg{f8O%(LYT|!N{i-Q2X4YdXeG7EI>1Cl_UYy6WTcR zeohNbA1Y)&_EhkDf_}P+Izu1$)y{6NVNKMxW4If8kc~tK_*AaTBwZ5OJbgXRpvddR zcjdiV-Ezmz8CN=uig$c^8gz+pe_bx!yss87aAg%GsX_#Jck2oU6kL%PneAMa3(&;oyr4DSboActcj(L$Qp3f(;;NTGFz3qo%%Hu&y0oYttTK)=;Dedn@}2pspeqQ zia#wNVQFQHF{lOdzyO>5`{b&?GS~!!qQO*%9K6_!VLpHtTIx5+-eyji$J%y#cIS`2 zO+sx=3J%)EF;@NP)LMbcHVN+Inq_GJvOv#*3N%uE6;-J|p$+d;<(d{F(tsCvBAa~> z`7T5f1N+bgcw|JzlfBF)v!fmcjuSZ0TvdFA-wcsc<{sBKrLs7E?Tu;Mr(VgHO({v1 z7x?y1SR7$Eic8#=98sHdxb)Z7kbpkjq(+<=-_TItsGsOHAOr6|-Eu$bC3y_&i z1cQ^~ZHr=eff`I^6*ZK+3$LQSw0Q!K?||i6V3^fJu(fTzmxAz}UPZAsI0^PI zQvRy{PCy;HK&T#m$^$(*W)rmR5hnl7LRkKFblC&fh!g*;6?SBa1$FL(e6id;cwRsL z5LEw@3Gu{xAy^Q&MI$i8U-h%N>q;>MYD|uTlZwX?8U&xCa*F=Rgbp2)zbf?CvCqr> zZ$qK3{j;HDJgs2rNZXa;vDRHxR%g0C)t$4_oY?>Ax_HseM;hTXD>;94r~A-fmZJu+ zilk{f7TnTzwi*)BXh*c*~D}jACg1kOCOYU#9uzRqw;I zY@x1H1Z&AXiC-FDMUgu`Dtuaz`zML}v5eBPLf=J*ai3b2G{Hd%masU0D9?`-j;7F2zznl&+b@ zKZhOWKaN$9PyKg8li`=tNl;H>GVdEcT+sekLOAdrvq4Q@u48zZr||Ssdm{87mSQrMhO4?uzTe$6eQV}s1 zAAt)_)IY=f@D(nmxtjAC)q@&A@`qy0Y@nt@~4)En{c>E}U~b zBam>SAA4kq7{VgdL1KEVs9C}tx-?OFq}6qR)RjNIhh~`}VQ^$h_dRzy!_nlZnp!}_ zi7<`%WkuVTv#M4-@rU2$4fUjcW}5*@_Sek$*AUJmZf0>t@Qp53^N14Ho2gYTSbXbU zngvTi&PrMeC4TOjXu$r7?vokY;R$A6T`FtRZ8zM&NLQOW9b!*Qjoun=`JuMHGCbho zuNPZ!_Y&!)>BvZ~pG+4!qtm2%E^m2orSh)^_-E)YdDFeu)c&)nxphsKmhbrKCey0i zA7kCS8C`h$>VzqE`MsvQJRiRem)?Wkim%$>sjA58Ec_N!SZ-80M+AiAugvAIIsOFP z(sCWwP_5!aUvJ_uG9=pc!ZBspvD>~^S=m#h<`BPsUG3*%>g0RuYTn~#8W{Ei_@d~9 zG9tw}0WEpBN9RS=+nrKx`$PNSw@w?jP1?whzUGrxe;oL1<@)jk&6Vb&Tu=Qw*!mG~ z%#MZ4a|S1Soe3@IH8%b^Ps7yuO)Q1euC19fb0!SJZpVcA^9aEXEt@IG_qygVR z`>Z$LmEg3Lcfe0lA@GFzIX<>YAMVY|C)u8!d9zs=w8uG;R^3;-Q*}D~dZz;k%Hx!O zCEpE)#{2c|$oL*+re~osH&eS)A<628pzRkEyw7N32vKu1O!$Oj;rG3_e>~W6C2mGl zzK;9)l;OT%n(UN?l|{AFLit~D`9Gs+1pg~}PW62TL7RxSPg*}H7riD2T(`&Gs@Wb) zXlc_4mTN)edgI@1V|W?8KD}~KfjI1=~%13(VMvYE)Jnu6QBO#w*O2n zfA$hBragY=-hWRkKNYh6RcQarvFp~Ww6E^|xlU_XW}jE~{bvb-N&ZJGd-G?m7U#Q8 zT|a%zXXD)=y}a=m)6GFg0}Nk0`I>&P+!J(`{$on~XTj#(ba}aED56pCQ?L(Cy;u-+ zeJ^(vH8r~zyJ4VC_2{>p_o4}ws;KXk>S*cwoU8){UZgD@ez|_h&a?&E^rsjP_uFby zhtFK86DrNvRK0W8XHC^&ujf4DhjvXP)5nfy>kS53z36-Wg9z${zl#IgY0UboIEmqb z$(k)JYGkgT7AWm{hZj#cX88FpsPEQnR|v}L<%VU#p2v$jiI!t{39n`6TN$pmOWDs0 ztpd2j!kpb&AqwI@WklmGeN^*lel7(zZVS$Y{1$Lx?QaW!crz?l4JPE6Kj9vP`x!QC zelbReTb)@dvPB=Eeyj5*=r{6HkM#QeoZjAj)zrbNx*U3E`uzJrLgub5UCE+v!XH2D z3^l&U6N%grZ}s+&RcVEd>-EfU^Z$y+Gg|ZGYd@S_5T|M`kf9^vek4<(R&lQib9SPc z%y04XV3S8-YU5>%_Xkknx0m^ogpV!#ar+2Gz-7t&Rdm*o!G$BdA@bwDuoIjA8_*B) z%J%M~RX-2ns>8K z?19tCDSrX~|Aat#`TY#ukwEjwGgNtyxZ%=_{CoL*ittjll~$$be2TT8Qm*5Pam=0t z?7xC>0qq6P=7S3PyHlG2+>~K}2nBV&#_5qJr&yV_zx-aE_3ksM@K}z18uNYasUSVF z^gfT{h95TOWdD)naM7atTfV1*%JL#DXg4Wm;YcqBo5i63$dpGqe%#9cEF7m2u=e>d^nE(yMUg0)WY3h&Nlf{W$Hc} zZ_a)NhpC^`8g>6pXadMt_UQpn%KEG-lpjv-tl4IRi#&c}pwTGIw z46vn?h8ITnX3O<|F&=FFjJ@uzvfuO@O&uD=fGt7;qS}{HmK+&-u^shw;IvEFv#w3t zfDeIko{{_dGi>K#yxmScJY*Z2Y1~Q(oSuAIm z?A3=iBDFP&#bq_`c+X2hZ&iG5degCY*AQxM>aHvq5#Td@-5w4x@+of|$bs8CuM%ii z8p^s#-#tk8vFX->Z)_Bh_j{6HI>;O9H(@9^*o_RX*i8fgQEpfh21u%aspy-kQ z!ZM_C)1f?rCL}D7V?)e^xcx z_dVgGVWgNOSFJGh`91E#MTdVWYR>od&6`G#y}Q2H9*Zxf)?#n!n3gxqlik*S@yoPn z!PWGhbd`+zw*UFZp^9D8P8|&njku)yrzz*tpa8vsn5Vb1XVq;EnGRTm%`l^YxqDoi zBQ3%IZ4ugmljrX-H7;YBI=B9O<9+zSe|y8i@w_BcBLKWn8Ad=vQ#lgO7f;|naO{E& zJOB9ddVinJhqvUF?}@2mNXO=|=}wX?(m@w7Q{$RaM$rwFxD1J2Jy*3));Zp?&hm@R zM?d3lsmy!@_|6`4Grq_7s-hS>3JwYl3%#7ezIH7`tvtzT{2JIf(708syB@`_a#t{j z`o9WUH#dy*t)>@0PR4c8le1Tp%9Pi|*6ZbTT_*UQ@B99*6vwAO?5Gy^)hKdQQ%m~P zREr8!=`+sao?+^jRW9LU+|X60-?rtKZ;05{N=|Mcnx7o57&~;uA;zyoCC4t}h>bc$ z@9zt-4!51WrzGiM<%W*n@@D*IqF9!fU7_P%Ma#y^<^sVkU{Zz-N_saaCT#Uw(Hu4n$L@#PG4>y`*M^36%QjOXxn>D$g@dWi$RR zO4W3?Zs$vHN-4TFPij|oFLV)#(!b-Ud%4d{v+Te|2DkrSLT16se2eg=Bd1?KE}(r{ zdgYLXhXYP51#!vXK+NCODYSgZm)?KuqvP2sUS5s#LBFkwPjrIk-it`@8x%Yvv#btVC%!{f+U&^gfUqQA-usooW4dAyQD)nopDC+)bOg!! z{l&MxqvR4lsyg-38HaVrv4oR@ms+j)P^d05zB;)q%0T_>rh+_ijXG_@bK} z^0^!)Z;W+!9&{cU%DtATOB}#uJOOTSy_Q!DG14-&!9O_%gB`$Es~=#!+N>GWW`Y=e z9g;AJ&E@J6@|=8(6pB{bvguz>oA?;1^e5>{Z9Q}@WUFWx&H_bbafFaseM({5GTBTG z9G4g~D_~(qsZFlu=(aGKrR>u6wCLUm{f>>knrBKQ_RyT`Bs~&jG|NMYjlQRTDaGvM zABA8|{4a99InwS>OW}m!j}b3FawN%3#Y-ov9DGhT*I9#ATOlK24oD{ZIM^obVX7i@ zhc3J#^etrya>OnLoYK4#npynjO;K0wv%+1V0Uy@`KRd#>S`o4JnK)Ix3ovMmIemB%;i7A43lDKFJ zj0ULr;nXZ+pO5J$=2VSr#AC&to(e+u3b!>j_{z>E6MbFjjW$mG!|c#Y}`#pyT}))xNT5;qdvu-G0=2>cl$1tAgu?=oVw3fmJjKKZDgv-e7yJSr)Rcx^Lz*1 z?gJ&7D<|5K4It)ZmdDiWdD7EMxH z{`QuaPW2`vWME)n2K9E0Ue`~oq>Y|^>Z9lS;cGu#w%ViRo}QK*ck@Qbws$_4qohWD ze9SwlcmG@(!A8n~Kx(;wNeH%?EGT?kV5A1d#{n*?y0i-)3fPi=~f?Qd3*VN_d-r9+$CN5)i8yN zz?Kqb@;H__e;@Gm$4&@c6{7i^MH{PJS|;3&<3rnCRUoJA1lw}=Ii)U!C+ zG$Jy=GGM=?)NaDhsOON{u}Z!s@|RgZNLbjxXM|^G_ocCLZ%e<{Y`JCVr6LPy87a?Y zkMOe!1x?^oNZqw6JZpZ0a0lyy69+Hd5jo(T{bh$8vXF8t3#_Sko_RNBr zF;U-aA1kV{K=#LU4pgsuA@N`)?oHX<5C;Q0SChm$I|QZnDYEyR;itNT7&=uJHA*K_ z*O|C;@Nf|O0du*Y94?35z%^xQH<&3!9IAXO7we}b**lb(qH_EMLso$K z1oMnuf}Is)2C+}Tnxkmi=CS!$p@`onbDd)If*g_dw-p?X9Tss0$-W9n)K62pqgyf_ zv|amChk_;u-W8S#e)p&uVBQ~uO{A}QMXC>0BA9#xj%AqYI4 zXeiHnSkZ9y+i})ME!Rd5`NJN*U$=yd$gCs-r}L{xLqv_4=IndDzFA&1Ymqkmx+*)F zdt0|*P<=sG=pa9)>AMwQs9W!^<(!K zIPt08O%8WT-p*^fSCfy#D?e`7xpO8*wO$>Von#Kx2F=O zrrOVDIPg{FKKH9jwy#-)IjblY%E@0~8$EOEiA3VDlhTvchbfoCcKMj^{`cSid+prE zt$_Mwpx*o*&Hsb4_l|0^`?^K3AW{VBMIb6wLJ^QE5F1@Uy40vh4G`%;LZT?WNtYU> zccddNbOZ#XONY>unovT3koP?Acg8oyJ@@?1x#Rwkk-t*Le%9W5t-0o$3r4YlY!M+_ z4>+B&BdA3G`&B4j3)Uss;ufrPJ!@PCd&S7ox#Jg1xW|71pE;Mj z_K@}JT4tI)Zg7IBi-~Q1rygEUmd+Y zc*~~k+cPabb%b9mdI{jd;0^Y!-i0y&b_}+n1D_UuXWd9s{UYf_NnLfsB-&xWtYakr zt0BxZeLK2Fss~_XVx0^kI513Pp_ea?E%Qr?T$1aIhoqmm6>Y6j1W?zY@WofykmIgDw}Ri#`Bz3PJaNM=xW4!ha|E7+pNOeLS)aaJn#rTX}W_M0UVgAWJWP+x*p4+K)HowP@axDgpNE zW#k1sBwT1znaRko7faTSdqlUj;72M02c}m9 zOdc5kA=z=7@}XQ9FS1>NQ>s0nwL+91iO%%jF_@PUhqWX!u*esw%BUS7k^ogyCxz}Y z8YPUrhG1D>6=O;G<9Yd+a*U+Hr-0+b+pW!{B7nkUNs?H(KN|p0aTadX;iUum94Eev z-3x7q*z)IM&au92^{%AtNt-xAfXWiEHDQ(|I*$5q!JE}ru$(R<>bD%L0}5}&m~NLE zNvzD3TnsGvF+?heE?j5FPc!NTn^@_{!Sqdq9FmLGMm!su_Bhdd{0r(GynJB;e_l0& zs&p&=RS+||Md#57*OYQNNldDXufx(3G8XY>dnB=f?m=4!6Zsy#E+ggb^F_2sunN2C z59wWjq0d?l^q|4xpyH)Vd(Y+3c;iKqm`v*6#*XUCv+mmxt=C6q2b4A;zorUWVMM0o z`ZmbN#jDK%j!TfxRu&tG);DvGI*ncDAo!;rz24 z+CRP7yYy1JAuYAr+Fh8@FE_{1B=Kc&&A1r2f3AGfU;+DhKcO8`=SODu>s7m5g?H?X zozXZmnUoUp89QtWl+uryyU!8#PUcae!GeIuZ(nwrZXlegO{AD2(az8a2h-jFSsZ-kD!oQ;9M!=w*BJC5CH)&D)ggVgY>`={+=*z@_3Y9IWzmZPz?ULpo6a z(IlA2zMEBks+|<^1F7=0>p9Y$o++#-Iwu;rhR=n!ekJYKI8ruj6*V3AhycHoImLjG=W9=A!1x6IC>LS}v8mOys@(u=nQF+UHi9m45D81_yeDOkHjLf|?>DF(V_r{SMl4 zvqpur%F_kb=my4C11NQL|1CYm24kZ4-@YD6dF!!sy*^dte~y7Vj78+kLpR>2LLG~)8Cf*txY32qa4JC2Syu`20F zWmRr@e)$EsV}RidaFcrBk*&<*M>ckynr+Z&;(%lt5AvrugYQhB#AycMiux^7Wc=UW83WJBoW3Kf^@(1$f(B<`QpQlvW z_9o9Yj+sUJ0=lL z2K1%(0Et=vIlcVh$*tU~6F@QIYhr=;ex>n&rKD z;Te5-cNR;F!@9aaX7U+QnFJ#QEGNwWM#>XJx~|>Udr+2Nz!B^Z*v@svouzW{a$Jtv zmllb$4aEb_v%zN%kv@bt{82^6;&lWHC%S5fW8$!c&RWgte80(QKXg7Hs?=98XBN#H z^oMaQ>BpZyCsPwH(@P>Ems;K!4j@kbb3HyU2z2X@8hL!o6zv}(S3S#23vjCo+bfH} zZ*rS_doIb-(LwMq%CIvtY^=X$y)*+0SPYOyNs@Jdl@v!!qM0Nl0 zHYqTNlSlEwuj7sxma;#|^Tze~3!leATvTae!Z6haF>Tdq510`~`zANkZ29bN_43{o zKtO6y7C%ki>w~ z!Tkf1YEy^wMx(5NMQb~cndH2f73;MkEKh*q4{sAkH=`)RLQY5SZQPF;IUbORy!1H&?Ox*oqvXfmV z8_T186W;fIm*mcwrqU_n=!>oFs1Xoj8HEq|0&kk%l&4$z@V4bVhcWLLnNZC~<)X64q*P0B<< z`?p?Vq=49Z0QZ*zUY)St7ft61=vH9V?5Ah=v1N4U@COuq70C}@-9E{~7+%m@H>Nk{ z*5#4!FYYlQt&*(dAQ-Q$RJOUX{4`@dgEJduD3Z+VTWJAf!Y9>yTJ-5!d>M8 z0rZemiGxLI+i4$yXQMUt7dRi7g4`|GsI(Xv=U5)L3s;i;@dd;@Ao%=9p&d}J(pK&T z#C?nSC4=lu;RzuN!#Di2Pu1&^8Q8xjmdI2tP3@AXy!qZv^0z7=Iv*L2DTwSxnJ08M zOMSMVPUfk5nTGSY_iY!SCzf2`RN zBPNwVTyp~~g(7^za?@#31WoQ#GlclgGJZnn=T|yI_sqH|!P)rO03B(#t!*fyaSFmP zXh2llSEEv~_|2-1h?%xY>p_NT_S$qqzqW;!>ToyE55%h*%vh~(z8k~6Hs^S2t?wv* zYF1+JLA}-W}>S zUx70lloaDUb9tjaq*2~AYpyKPlPvEnnv9QF&R^X#WDgI4P`5S$YK_mdhQ=0-$ zI1(vv{`p>j9({+hX0Xc3m4H8y&P3U;a*eF3H-|l+B|qsIETmJ(*m=PocKXzezFSSa zXKB(neIhUXqqTc>OU9UPnsI2SPqS5H@cFFjQ-pB{S+#SR`F+=G69OBoPy3FJHQvK5 zj|amN(|S}k)Cw+R`T%GJ0gahs1lAdJ-HPN3p+V%Rk4ly1Wi9rwII#@6mX;)*%=NOC z@b@oed05Nm;j6nbmwhrHFN?%@AGnnu(8k}ZS|Vwv;~g(d-L&U=nRskQ(-I&8JbIEO zdZ!j|)g4|z_QmsI!pW*Qu)oiZYr-3Plpl^U8a~=Pl4inE*WXO&ySWNlm0dECVlPYnQnx$O>)Gl4Cla~vLZwh-?Pl?T$8be!b>Vx(ywPb=J=7O<8&He)9q=ITGuVq z;O#eOC7Sz9Ra5RX;p_q$kZ2g5xgpiYYgOSL%EIBLBs;?p3EN(caiOHwG~x-=_UCi@ zk8j>s?Th}-&AzX&qXdKp&>;&7M=0RxBd`tu5Jr;Zuubf9oBMiA_?}2F4^IF=EWR#2 z+Sn%$F3{#QEExS=B_NB7q}RnO)FlS7F0m}=h_JS^EPO0u@vt4BYGNqYUT*hEy;D1`{Tvl768*T6$O1o*asmtI6t_-nQ z`XnClC2_9wYh{u^#BSbUz|T#GT3Oz)FamR8dQy(W?1E87&7Yn^?SlK#znqWu;8WI(ZOo>2>h8>$_P4pPevs3=>tnU^R7KC zyB_7Ar4@g>jo1A`J$2uOFgi4_`JDjM5##0F9e=#LLGXeCLAb&(&&B}eZ|4K2li0q- z#lU+qk{N&9;_97G+Hgq>hQfq+mZvjDvCDPs37oKXPF6E~! z)z=X4kt`l#E>3g(1*&FK$6%)4$n>Rm*??lhSy9RUmc#5sK*fPyCls$&K}A*v48zOF zqUW_LLdAi}YfH5}S)qXin!Zb!VXeIl8Kyy|1AunJeuv?W6a0H13x|Q8{ZBz`ya< z&%a4@l(bM6@*YpD5ZNUQpNNF2F}|66QSH>r+(*Ner=OkByeN^MpYt<4kk{I^-eu!A zsD_iw$>Gftg`q)l4N&K`G`NW!bn!%VieSDSh~M44?5;>Byvq2-0CdY4i+>KCEu6Ck zC}=YpJFe~$g5hqZ-Y_=N+<0~#MTMTW_)ELjqL6c@n3;N_6MnIqi6lA{d&WzqtxR|n z0vk}3Bslm>vWz+_=&26z)i-GIJui{>jQUd82C^Yb0~jcrLhUSHijqeC$`YG$R~xmI zU7o$+CUcA93Ujid=TEQr=Q8*QRLl)0)(RaKzIq)jUwcv$ilChQuM5XklSFG_#zh0D z9qqyaE1PNA@sb$)l;UuqgTI{4rx+G}+1$C@Vts%Qlv1=HWsk_mO%_l2k;VY%KB%5D zeoB1T$WcO=>bb-FFj>~#idZ7sdR>ouhzx3IDrs0^iqvx5T19eJpu&J@HVxuI4QT1dST9 z>urD>!7i_SM5Jm+=8CrKfK#<=mPKpk%h0N^pK36(ITX4nLL_buOM8foMu|ptuOQ%z zjTTM^DeBbO&$(}1v1SNMgu81Q556G3AuR$Yxxsn*T3rokkT8Jb_(%~STaTYvfO4lI ze^<5IU5;?r2MKz8^hnr*9Z3-{okybWOEAG%m(L6KC``_N6y@e$rTGb6%Hi=it+gO& z1|xOesF9A%$}fx&Wl4QX>#bS*^!RtL9l+Vj*} zMdep;3MbdK)?v%jK<_}6U5of<&>4kpWlTGCI%UN%Dks(Z`%$3&5Yvsh>4$3?KT3Db ze$mVJ@i2JmM&W7s7Gr$iB=FQWz!E6jqR5_SBW>*XKjf>UcYzrxN@} zxp7aw^l)kDqn>%Zx2**(Fyfo7g_Q$X5#-sp?J5|5v6MGehVcOE zhuKJVH-vJ3w);C;5Y#ym?A$lDjyj$;bJ?}h)GVuUtTk>gErHtXgI>N{0AEA`e_QA8DB* z?z3C5pF&sAzp=~a-OzWF=!?y!@WQ`uO{*S!>&=1s!|6KT^Q?UUzoR;9ukzo#P|-OR zo7&6L;X~4uh^D(Y)v%>8Qg&}4IRe@=B0Qd03)8Hh@$d_^zLerfqC3e`RQ?q2b7#yD z8A0&N#I%5=LbOZ#44@n7h9hbM&$(&?AI%zGW5sbtCOiGu5V)LlI+ab9B;7i5p^T2` z<{Sk5C)-O#ep zhcesx_iJqhf70wdOIn}|V=JL;Ow%#@2hT_b%i%j4<8CVvr?A-*$)`v+hMdefkF9HtKFxz{zQ1 zV{~jaQEr;Ou*0j=3SE}BPcrO%wf_&5Th!XB$y%PGMbn_*cbna9jO<~R<4SM06iEQk z311?EM^x;V&d|(=YQw1+p-{bV_>wMS-d7p>uq2B0JM3NS4W$)!9E1&P2bq0Lw0I9( zy5S%ipRy}6gyd;CzPQ0lO&4*u1YP?<%$2j5zm4~xBSln4e9A`3f*%;)hkoU*aN&h_ zmA!I)H7~Bmv!kHjBIQi|Izju6y2bQ;IatZePCX94E*na6h~{}N-k719?ztY5Bso83 z?4l=E^|r}Z^B@JUOMG}WBZFRk9SbR;>7EwM-^aK8sD1fM3 zCo`8LFu19ZS}CT@wAU=?*9eqpeUyv)bvFC&W^s@BHRn#kKzC_;P*WpNfp~}S$&ce- z$(*up+%ZeX)Mg}Zs@G(X3r@yWS?Z<@oA_I-D~JuBXGn9q^W6Jev%=#&$B{xRlYsjL zSXkv9L9!|UnQyx!);*SvRBm%+is(X+|I$@cJfru%G31`enz6Wg&U{QUSDYz@9o;U2 zc9japu)3lP-qb8ZKdu>%5UpP8DT&vf zX;{rjAf=r~DTI>)J`Vg{7O+kHF8+N@yD?h0-X+(0zQQkk`ef!5qo*d5qo^HdB)0V= z&#AzTM^EAPQ7yR~MMs*VTn;S=JN~CU%}DA z<>@rjt~gqLT>Ha6+JoAH9)sKwP7_HX+yEaH3huTx#c8sPdjECU?^LfDcQ*d$I(3|s zk6R#kR$Ed_iuaYgpcJLrdsp6TELs?}-I_;^=t-oR8yKJTj<;SzqDhW#7kCM#yDeY; zrd4sI>tzwG{M{uwX`)x(*ClJbqN}vY4G|F1^R+Y}vnmjqNDawv3p%jx()z{zG$C9zP6dnCaNZK~lSP zsI(v4)Z=pZRkZ){cS@};EUxg$v*H}83-74kEF$ognq*{=2LA4NOknG3EY>6R!b z+1*iWjLoTzSP+v6$bz*^n~Lg6_P;!e6x_HEamX&?GJ-7_*6kADJ6@omNi6=!9!Yet zCncb$7yovU|3}i9c$P?&wnJOrbgJ(mq-$U&EyW6mWgzEl2h_0$_14?Jk+LCnj2OA@ ziTqHUmA}->@Mp=-!j}4fe(!iW3mzo9@>DBXhHH`8|Uwu`VyrcgjF-^@c3 zvC|9=C`Vc&j&1~@M&RXvRUC#PZq>a4*$i**?)`xgi$7&cGxXCMCkc92M7G<>WK`Vk zoorh>ykp$m?PVOrDK413GED7mve-2Rw(cjk?2V)o^pJZp9d?x_pQFC`1FJiybb5@d@ZdF@co$xnXR!wF| z_U+b|$)EnD%%#6Ar*eDyB~F>RS#4OLK?metVh=NRDMyWC^3~WqsgN0s@6y$r;-}CE z@rhe~0?uc~-3P0_KaMNJ2-t1*GXx24j%Gqc5)BBe2OXaK&T6b_L}4X?^T1+dhyl<{ zojB(?ue@cM-Vy&gNQRTV#s&YT=x8>=Mc;jI8u zc7gyg>^z~o*)fMC)t$vg%E@z)f&tzjK5mjJj{etgt7n0fX9M=4o4+Xpv)mFl@o57N zfrGO*2)~Yta5mInv}zYK_Oom4065gE>EEX+s7kX4nj%6Z9F?VnbTj6)nrUl_e zAweZOcH6ltqD|VK2k^cul%KDU{3vb`zTN}_Wj*g{E1?oLrjlTAqzblxf-t!&G4 z9@MJfvdHcY{g@>=2I^?cYANotd!2S3+;z*={A%hvmmtf7AD4NEi!o^YV}qH;0J}`Q z`Jr9$9HMG{{qJai6g|QdmH=ZZysdfb*i)a1_V+mai807a{q@BOZZn)Le>}<}gUksHsw7UeGO(b+>**E`dyC^=wp8Dv0pO4|N@t`N=F0fl30ipP` z*?BqoaSw#!2yAD!oXG+!@g;~vE$l=wYm9Q0O{k0((06=_jK89(c-~by%=2fZ%l6tt zvzoczY)#(|VXIXhx@8;7qO;@-Ps;hl7NQdjr);OQ{0K zg6R0(bq&d-D(dAPOr9ypmNF90ij3TM-5GaSX&uL*%EL~Y~(hr_oqJY7?T@< zn%e9(TrcnsHVZyIgp?2**$5okU2-{((vq(BOPfcoHGk!X3Aw@jV4IDg3%#vuZzz5k zoJW=M$4z~SektAkl9GFqjrEhK$5{HaTcjGm5|(CZaXP__fJ!eR^|n*k>h(}Rq2lpY zIj=Q8Uc>eqpVc~0u}9f)uXLaRmqb4FQdujAgtcE{n&xa*PE2DgSSFQ&3<1i^2eZFB z1u|N(H|F%KG`Yo?-=FAntt1Jz$abLdT6-Z`9Oq53J9#4AQr9=Bno|gWI1@gNY-+lc zoPVWDsWX|oO#SBWm+G5$pf={~N3yOM@j<(&&JM*a#DShkaCU)&W%a_aV{MIE@0F^# zG&bku?Bbs5I%8HAmNR=WceLsxP{G1y{gyF1plrk#uD%D$y!E!=UGtMIzZ_dwmRn7_ z;IxnHlc%rjeaxb&R=tu`EC44}2omN(*QcEAZ!RB;@+-K(_m1ktqTC#P zYXhotfG5}%oobk6R z0-FO2V7})ifI;jb+2Il z0Z2LdGPW8U(yV;?@y6{*vUEk3^>O+S#4&yg1S4l7n$fSH$5AIL0E&Ua_IS zW+tHAk>dE3p+KxaPVwbZ+JxNId5FZt<`2ZmQHXm4Eg@;iykf*!sK% z@lvWI_S%**v~&0p^0wZi^|`^~US5S1zp2KcC;J%TyODHH*m&h1(x6rGvP1DTj1wC@T^^cBjde!GvY>@1i`|m#Ky7HEX7>LI#abfNX7Ewv*vOEPrQ=Rg_~3~ z3xJ{64{XiiwkE*gpX~)*MZ03(LAj7jFV7wz@8NS#nZht#mVBcmyB>M-xHfp1eGE6x zdcU;K)rR*YxlY6VxCfrf(2Gdk^F|0D(1u*6F#VfWu98&Y0I%}~LT0bCXnFCYTd{#+ z%%5Skva#nEP(Nn@X18X-oM}g`A9nuPR%W zI{1@dy@2aKb|!!r2&|~FGy2;aKrD=)qWqdd;!lqccj@ZWk2c3n#V*EKjjk3F53$tyz-6r7`a&z&yruo*s}{`ZB@ z+^IkFA&UU?PL9o1fvM)l_VO)!CDEYHbpp#e#rFEuPoIX^=M}zPzP*~Uas@P7KqQd- z&bY`jtpxcNAKtVv_s9pM7ViUfmTtO*T@VyY*4xz>r#b63#mYkL0L#Vt9U1^3wIyUV zojoP{lQ03N=LJ6b_1&9kuE)aa4mG%@3TXM-ilFV!J| zh;WiyI6(K8Rg_hb}elRxCwh?4kqHy zYIrz^-lu}!_K)A&(lnoD6c3iiH=V7N(ayv?+Bds_-)prKaMzm8YvUEqcsZg!pLo#9ezLGt=hL7ho#x>UmWDeQr}viKqw!wL z4k3-G(65$P#g}NryW)oh>IquA7Sm1Dtd^%65#I9*)Tv$Z?w#s4q6d03G!Q!{Q|^#1 zYkNk7ea-Tt%=xs4by(i9`3b+f)w1oS>tBuKON?2~`fAosOj;+(oUQWDyww~5vJNe} zT@Bd$nQ9l%Q9K(#JLQ~@p6g9THX9TGI%TNl{hyV+GStz{DGPr-{D`LF#o$~v)Z|d3 zi&r4gxonFPg4!_~t|6^b5uJO=BA4nz**uF~`&^Pps9X_2{ zjCbs=2*X^>A3dZOYL4F}x|t282_<(R#=LcJoZDNEkp)) z{{Df(-{W;rmm3^bXg$_9L;Ez&Z2a6n-6WV_f3fzl*UYFu7$YUfF>6scA9(yXfM2PU z(g&)x$M#6v=pjNcH_I{RNp#h-4D!cvOeI|*2oE+r-aV;*cSAs_!mc#XWdUcv@u!}- zZHE`_e86Y&>3fu&NFD4|YikS>&4=J`hbxS3P%)j|J#)9|efG-FKVQ#wnIxWgTMssY zCD@6;_%XBm|1^V)S_-K0e(=LdOq7peJ4OU1^80l_9rF*>pGW1t{+EGerhA98Hd>D) z6EU}!9b&IVDIcCrMBK?AYh=|f0eJFv81BTv;etgTf>(z*koESL^AU=w)dm&J=M@lF zC@^9I(^+wy)PxIOrFEpv>CCs%RJ6)`^!IDO)sxV@Ch64}=EwJ6nucw*FA)^UPn@1b zCaz`c`UPHd8Yv1ZENZuD4XvDm&B&Fdxp4AifEh5Gs|$A*4J=Pmh<|{yH34Bq1mkxj zS0rG|yR~J}Mw__Fp=&C|R|Upns^!TA9y3yPdJ(M(66?F}no4i;!9Xi(6jj`5N#!>6zBMP6O`t+sNblS_@IB(x|)+r+ae zNpxV*@NeWp4M`s!*SBa*gx)fH{i6AxNA`Wj zl3hS2Ahv6!S(aj$B}sLl=tsTF_pd}gOSC$8RzWObpsh!iTXG$r)d2&gK9xVg^P`%Z7Mvw7I z8%5KR9Q05ScHJ))bp>o1itvT`rz2mv#L6{HnA>|TvFcAsOfxd_glD%rl!o+oHXWZM z%pZ+8gy1H-pL~MvzwYY~5sceaQXJM9$&N_XG4gZAxwUjeh!!!Yuc)$8SfDhU3%qTR z86H>SZ&mV-X>=J{30p-I3~>f=lI_qJC$# zr=<$MnZZMe1LGIF8qI?NQ3GJuTUR0fL8UMIFQ?zJSgv4?o}hib&F=R=fl5Zt!xNOlk7?wK1qzajE0vUS4>pLQTm-P2FxeHQ0b@ zwqa|^^6d2`i(((4S4h_gSVNu&r9l-@W_b zN5ym+8AzHwydks7QLqFn+|ZZOeQ{;?^vgSazHu9Az*xBJm>#TgNjrh1v7~D>w=_wy z2EjT${adiIwaw6V708zn)X0l%M)f;3vz&33SYz^Kgisv>$cvUmk9S(%sFhoTxh@y{^`{leHZ@G zYhJ2G2lFV$Efu-X%{h=xJ2u|)jIlLKg|%vO?7wNN_rN*@NLHDks`t#G{r;MV6)wg6 z+)emFVldoiX*QjPggy>UUZPykJ7*YFvpMGUXh$CACW|Csr@ zdEp+rv3=`NFj#vfpP;I%y;c)?jsqY0QLgqaF_9hsLzVfdw7*V!lnU*Zyzz)$2%O6Y z#LlQE&?Hm=G_tBy2|rY>oXJr%QDVS2K5mJbSQ#ElZr#e7nve?+IBXTqi(LL${PC6o z-Ds2~ZYI7N+T=40z7Mc$)MD}G@5y}ll}@wPYk1BO*P1}FKAoB0&crP?!_{~#(_L-B ztlW45;aaC`ta5=q+n2AG<1Gbiv?aqq2_{8GrE}}EaI=N7)}3HBL$e1{LEM7cufr{J z1ap}CS6{4*Mfm*ZL77*~gEUkWF6>%9Lhsd;S=zTWb5vfH$ToSPO_xLUdX-Xh8sV{; zpEJ#Ah8oRD@qPRs(Pf?#@`rNB7Ql5A&`AG>>gE>ubP4mr^poEIWiltt((!gEUjMi| z4Z0(RM?VKVil&$FSBlUM3)V$9=Kq=tJ3W(Gl0INZ8EGl5GN*Nul+OGRi$o+4jp$*# z1lW>xCl@7|LhR`scOWlG(6bqY(v{zM0Jiy9!O@{Kfko9Zhs!osT z-xY-!nY&-JfK`7#LP9>-r*?A>v&R;Mdid%%&;M<#JiP&^hM|lUj=$2dMOGF69K_om z*n9Z3_4=Z27;C@jXAOR{XU~f(d%S{0Dogh+k^@M5gvZYlfIIdYN}6QVr9iN%?W(gB z#=?EXo^YG|FcNviCM!B5oqVaG0=O(^pu}rHn1&*Z+lX%gn-4Y^Oa9hzO1C~%&Dg~6izdb2>k$TT?2WtW-ycY<{zM>}wXmeK4O zkD|Y$iJbh;#Rl0t@!th6&C1~`x&RONxsYpX#!;3nnJ0DbeR%^VX67dt-)6;S?6#5} z2aHzxzKvCiclj7{M#Rs(cPo(n1b}@QfmAdoA1G9Z(d$npAf)-gI{+4RaGn8_Fz|OE zd5>ipH6=N-I)j|CQpCUj4pw~vbw0pO749GV#|17l`TqfL$;8|l@)GaidV6AH zc{gcKNp9eV@WkQfL`u4vuHv$Fy2L<1_}4U}GR2u+5y;Ud?OEIK`4fS^Iwxnu{qyEB zteql~b}5zy$u+4agankFIL%)G%acZZ{AQJ#4o=iEAl#v;LCvPDSz2-($Ae>PhdCn#lgluPorwUsYNq z_w2Ro#b~WRK;4lKMYg-o)KPN~W{S|@65y0cq22n2iVmxY>aiVWa}- z;qnb^7>J|w=ASIiU#?UNGmBxhPOhap?TS~l^X;GXDXvBo;V~5cjHm-S!K0q`uZ|1E+Z;}oD57K1fd2O$J^}=! zEEDc!UrA*+RZR*rgbh*N4+eUc99r9X@s$1hGQy!l@9c)s3~MX1&LOYSBvH)vCy2}N z%UAuahQ&s%TV1VSOv>Nv|Mh`CKs=*h2>nY7f(gn z!@fs1xK(4P7)ble5D7g$-?Y9EyKD#FnV>=fDBFt6_8$#UZ zq+A?3dTB4QlNnrX>tbG||0?B2U2RSDs=rG8K#lZ;MpL=DEl>@-C(w)d1Yf_yiKi#p zrT5wj6Kvn-ZYF14j_lz`bLpu6rYXDE+GwixDO~AA@FIMGUmv_bMO-DF5nACFP}9J? zZiq96Bm&u?l?rdx#cy>jTq617N~CCh_bsEZlH_mrPu`)737tNr9-nS)`usruvgrF{ z_W4sFiMiZQD)S+nQD~>}+fcG1VWZQ3s%-}K-YE-QRaZ4G$zW+MCP#lWekhtgdi2rG z!S#PO3pav$u|k;81HMEW~6|?eA50@SDIN9-@E7v zH_8aZU2W3fLQEE&C z{kZH+42N7^^Az#|dvNxmu9t&^8NGT<(=^dvyH?w;*ex}&+3}EmWse*mXbfCHu`%zI zpPYU8|0O#IgL_&9Lp#(sn+fb)-+GcO;r@~!S0~v4X;mt2k-wI;Co8~%oB=yREpb*Z!uiTlWe+77(*4sx0e| z`9+u=@5wM^l`EJ3vXtEUlQLL?tSHhXT%yqb%R|2orE@wB?&7~PS}vTh#4r z*su}%0ht>5`Tn8Vt=y=))7%0?I6&xnr^1SlYPNjLSo$Qq=hc4med_{} zw|I+Kqo2C6EZTwzP(ZoV&Wn8omYUWjy4DdEBMvQY5_)6ZzGA1MJL4yPbG$5P#13O! z)Q-94*R@Q;nZG~_)o$6!#e7TvQ$w7eDnb0H>d-nw#o7Bg(Cgn22FFO{wFoQu8qWh@ z`KL-$q?j7e%po1ksQcDtcMkMga9Nc>+wl|Su?AJq_xWslpN;k8UG5y1{@(NOPLG!2 zAJ{6K8a2-WtpNeE>i6CQmlBy(Wz>TH{g_85vhg)ujc4+W2@T4ziE$X# z^M-#-iDu3^A?&rWL5tTUnsx26HNSZL=3`tF$TZjLk+b zeMVOb9dCEyDJwXdE-PbDRI|ZF`Vx&^vaZC1x#W|}YrmHlzuhti-I5?5O9~Dma>AY0 z{C$*+^Bx%?!u!Pr!FgPJ1l76}D+}3EH5G-VH`r_AgR*pSMP|*fzTu-XC${JE>IMQ= zMvwoc*xALBgvC$cU40Ozy_rWgG8@J=wz~76&a@|^dQJ&6B0H?wYPOF+;)UAn7gE#j zYtD}UxEV5Y>sqr;80{^S7YrGg@v*I41Ul4nh^IXeN<(k6VBmL0bru~z?XB5Cpka1E z>PDaT$oN&&nDt9r31StRHi7E7!W$nHA^PRw|KUYvd+Yxpcg(|qPA(1pLv;a|QxI(P zA3h`oo}IN(o||9zDG((SwEBkjCewHXi`(>-H7OQSx(0p{BQaT7-0e^TySIScsb#j) z`}wo?9o0q}`DsfPsRfAQqVtxN2l(yd8180Bfe41TZ0-K=ALI` z;%^U}ny$DxE@OAJ3lIrJeS?VgDWjmD&ZyhBnXk{|+Y)rrQ z8HQ;(xESm7Kv~=6~XWC;A^JP_ofdO8T5Fw0SnaqlM;=s*Qe*R=!E-=(*;Cx z68KCAL951xWWi@x+Qn0{15KlJFcmG zdlv>p5Kxicjnb7SNR<*5>C!~H5T%F^At2I2f*`#K2n=1N2?&vnv`7~aQIK9km7Y*S zAZ6~J^Sg7-%p7OVIq&_wpZ9m)KOpQK*zD|YS!+G(Sb> zAPCYw9R>$bkQ32>rL2gXMEZ94011h6o@D4+z+p0lVIki&V06Rnjnyj8qXW~^KCRCb zzEsuHM2IrbZ$s$1nZ4#n0g&A_WHNxkKV5v)#YOuw)yf7~?g=15p(u-Jo1wNxE{*IV zEDi*kL%Z<@X)V0TMnjoyo$YTuWbR@H&Mycmbp^zyEdC-|0lqzmzCU|x^{6FRt*pZY z5_SH4WFCriOG>Br9gSz`o_s0M1MWM5be4X4l-8MW`nro}u?r*XxYZhS)pfa~yP8xp z%qj6S@qYIQD|aH-nJszh7SIb(7e3Lg`XEM1I z2s&;DY{th)Kxyp+e+^R<^4uOVmsX(+%Kr&Sk5st&KFu?Ke(7qHF>5THw5X^GbZ;92 zY6qVoaRS|92cD@jyG-h1yCR?kW4cdz2b+v7mSwL2HC(5i>6JO=Oaz}mTtAMQ?XOYGcDk+1<@3T9*Q4H*M5 zLqA?E`vPoj`QVWnRq)G6Kc5jB6tXO`s_QM%@si1H@sp8-&$F?n7#jFZF{nd&6 zjF-)5@?tl+SMAC)sr(=t!14nsc_Y#Gvm9%=XVK2!rwS9`DEZRs&|*UFoe@|~&~2zk zYg0n4>y?449aeXK8g5I9)=|+?Mgk&*S_1?TbT>Mh2i;{91*#G*C4_cd@t+ZV|5a7L z#O3lj%R$o4Oxqfl)HFJ3N&5js0J_>McKjpd3ZgZ);sDTo61_prP?sW6fAL1r_*paR zG)cbpH-eEPYb#E=^}qNcYw+-E*DLnBX8@_0j^4G#pJnW zkl*@De6D)4eiU97Ox@ljd_3gyH7d>laIY(M{7*3fdtk;*y})vq)=BgXQZ1v zXlzA~2#N~pp4|JWs!`JJ{Aj3lHK%t%r69tSzQ|dZbgmGqqlGKB-m7|KK1cI-@kB*m0&xcz z?I?9Rpso?%lGKHfY+p@3q+A%Jj7or@mGx1tGo)oXbp@wl+aJrm`+S`)W4=WO(GIDs z>)sBw=G*|(GB9#i2SQY3Yc<-BZe|or-FDe@p$?hQDYs8|=eQY_P7`9VDAS`Xzbr$BnvUq1ah;Vz{DbPTE7eIjVT zwB{dK>@O!KfKFwXpc6@}Jdz{%PB$-q_!O?uwE@q=DX|m2Vl!`z0L?CuSo2z(A<9u6 zbmBWtCd9V*()k3f%H#tv4ZcKA6_G`5*j^ggTNm^M*=mn;=_1e*FG9@&Xy0L>SHDxb zDsI~6>w3I*q2?c?7C&}XeZX}dIrkLk4^D&&lhdVJ)YkD!-jK*qec=+FpDwS~_6vFJ zFLLu2B!7L;5oqyUnUT_p$ue}^D>gm2LtMwnf3GoWs5p#ZLG35Uyz`gvF3>+14zz;H zAW&M3Dtqc!6p%NVs|N9S8=d%W$4c;g4Y_G!)~Gm&_tL8DmQXlkNV+*!DyaH$F8-F? zFrHHNSYj_T^KC*Bt)M91Lc$1IY5}_lsk0!lkq8dAhtD0fTl0@cTU}5ALW5R>qba$^ z`GjwPQQ`zT8*b1&FPLoFi_Puo{4BRnR_0r}2S~XLtmdBb;PQ87zj6zL^?075>k>Hr zuo+ge?XV|3M;EGky$CLjbvlS`>7*@%Vlr=!|~wu}6L+`C}$@SpyyoOQvc@qV6mLHir%*@?1^0UCW(49yOI zn6YErC!Zv$l~CJhgdSi411XYz==q3lBsJnA;;g@vl=%{jqnGumgKDFLE&!iL zmqPU0tR!|fwz!<6%v_Z91BG&$RU2|rO+)-ht_6XTHbF_+!=Nfr5=%Qqx@};hZ~@;@ zi91&lk(>3vuW6KXQ~aCP(%lN!q515} zt}@QAWUQoVC{4cFE(Ump;=Rf@e&m5S4cx>|`BE+bi@=w!6z}##zVQtEXHLN)rTJ#r zs+v+8sO`CxjgeJQ`gwl^G2Wlv^?^*cZA?p6+jPBurjm8y>bE+|kTcP=H@1+$0c`CM z1Sf%Zw=?%F+yI*IQt={g8zwXnz4hVJ%C{WxB2+q{xn0_b7aTP@@OA@$?8RONTzw44 z^wLL9%U%~{)1r$)csG&#iVf`6u^edbeGhM5lj7SlZtlr04}(t3NrMPi<|D!+;a*r` zhfhOGV$gC>vT;?=*S<=vIBZZhw^6-!6?wsra?F~~N}1L4h34uf10}g0C{W+}6-4)G zb60$$D~qdCUuk7?EYP1C5{ASukuyou`Tl|M?KAR+Tt8FgzOLgY!6%MH>S5tC%tNH( zZ&m@9XfNGr^9kt8`v(~hqqR^ z$*(d-JCOrDy$}LhCK(vz^1M%fMg#oy{Dp7mMSjnpsqTUfdE{mf=>RVOC=KOCoId6H zC}_X+XR5?Jzzu%xjV5~-Es7m;{fnlLmzypyNEMacVsm%984~!MR(n^z(RgANKjLMi z)^K)|R4+I(gX_xQmz1f4iptXW{;@aR>2D@>ui-p3x384@AB; z0W*DW#dNs*HplZ$HyEqF__J$PkvAQJ>6JckqtcL=Lp0U^b|l#lL1Ezm0BSDOo2H;S z$Z5DSmbM1yeVQuil}Cutem^7+bxhBboxFSVtKQQu;kQl39M5V!J_B8vC3vQhSZyeg zsjq+*t%w3ZS!n(Hj`Y6vxDnA|(hD+;znfZTv+Ip^7-~g2Jw})9&K60cc@qIbLn}Z< zp3C&XCrw?)#hBLnEj-W>z^14oFhM$ZgK2*IWNR7Wpd(=R zS&d?nX0B$_mvZ-+^ITytg$YHiQ}t?(Wv}x&?gBGhkp%Q5x4&V9nuSIsdUa+cNN z*}@AyrHIQ8oY*}_b?;6wjm-CJ^84T3&9LZGUrH*oHA0xDsb{mlTwQOeTx}SkRJ&kH zUoNi50aPfc9Pl=)!FD%oTz-CeB@#q&dg5u}#pE$oPEI22yuzXwqKGILSRu zSA~A^%iIWfqnmgUewLijbix-qGzSVR9Fz;(v@$O);|_Fm5>AJ3^SyY_;gK7Iwz8;TnGNjd;mZi4#|ig@MvA`iCO~9@|^8sD`Mb)X0;BEtA_Y+W=cGl0~Rm`As zasIl`p(&B1%|k8_5QYyH-qNAoB_QW2(6x{*U=p_okt+dt5j5dJj8RyCT33N$7>ORo z)HQ1C*WG#K{j9QExC6#k3M=gKTKwoXpL$VuD(vGat|QKN8oa>Yw>tSU`t!8L$LPVTD8A>HSDZshfEsPc zJ-S;t8Mp}iME%u?bESa*rxn(vl8Iupg1A~g8kIGGalFeYt9Z|OIX^@s z>B7~@uAlfEgM&`v1}Kd5-t*Foq!ZZD4F`w0hfTIPV6{mu@GDvnn#*f*U;CMA#B0I*v?(lLhP!@<1>2T*ib(Vw@2@W{2T%S?p3S z0d{|&qYn}t;4n_8>@!H3(je!$2x?1ka*D$^)A3a_p2a_fd@>Q=9|;Cag6HaUq;Pbb zLqHK|2swuWg8C`|P#f5JJ8YsmQvDM2DtyV*7WXK?vCi5e;_E1NUbVXUt0&apCJxWb z+|MnB&+(IsN!&zUWUCm3m*fRhF?f|2IAg2Y6%hQ`k?j8MNbkT*-iME#^qI9vtL`>= zmQzpGR~(u}0vW*pU`{dmnVOK(C`#j$K2SB?CXkMySB%@sWm!9dwUWFolld3-bb)x0v8VA}t&7Jy&~up}>XwTnfPNmb==U>~3Hc?- zhFphJ>_%6Pq|6UQDL(%^06kOYJ~SqeILjZY;0`Fd>c#t^ zKvudNLPKHzuA>0gA*cX=S158qi3BH*-;z`Y5v(pQg@ndV5TEEbshS{HNo#+{uPC!+ zMNXc84-RP`6IDZYWKLNoLIVHKNX6!mNRojY1|P4yFuklH_iVdsI9_&<66~{X#`RuB zz)7stHa7|2nhr4gMc{$lZ%DA8I9?lDvwo@5*To)JB%m@mo_a;_4Dp^NMD*o@@3Kbg z;9xlGOSn8%Ar8CUmYSoL{>sJY2$9PK61v<~@p6Hj!hQ&N?KJg+Mw@`=dcp|@+2kz| z8nyNbo=B~8lAC%XH9y#^AllG=!Ra7WtrUNzWj)SmpT|0?3FuPI{#C@G%DC9$ILBkE!)R&I zQtGKYGi-n)bqv|sD2hV+6%Lli=fM{H=TD2w&?c=(w${qwVjH%o=8|N^my8IKobiia zkwb!AA%c-N>~ z<3U^*^id!{rhquY@BJH{vZ?huz&muAl;b~By<%v*)1(0~Yy8o3;G?sp)qm`?O-=i% z*wV!~sK}&I$KmsFow1(1b2WhEzN{|b?4AI|c4~&?Jk&AT!invwQK*4EK4T&&!KPvV zVUK!?hQ*{%E&7wJ5SKJ`$sYqrx)D0M~eOH<*6ys*R*onOv}@W|Oy z^PjUED04vmLb>X9m~-ABzd?MlQ+$dUrU;c)PdH^Rka=}u{GSeRpT43q$eg5FK|i;} ze&l{#(_{PO!j*vdVe#&ROc0bjC@`aTd#?Fugc zFqrx!!1`?j>iV15l#SZwm$zGv0U!9gUuH*!dm47T{i<)IblKjt5z%a4Qk}O>M`}W( zQij`s?ok+{%=C3n&q&CV zvZ<#cwY<|hN&cFXvXkYR(x;5MYtC$b=Y5j<mlJ#HOBrLH z*xD$(5G-{!@r-L4aw%_cDF%89p6%;Ihz(Z*nPHA$Rb8Z4p^JC{zqnz2lW)kU-h+PW z6mAuVnGYNjwDZ);WoUw!(Pj)_73VFh`Bkz}sULqVm5VEynTHUDb{-HH7BTBxy&n30!e=5K&~BS6YXh zMojtP21x9zn3XWfQQ@oC;~!h1kMb))B%fQOE9qr?$WsK*&{j;v-Jus4u5U#mDDH2M z@0O`drW8!fXn*%NctpqQmk`%w|E}p>tnfwCVzx~&QxkYkDI{I7W_uYC{qWt58Re1k zXeJrKI!)L$Qz7I+-cH$sYdeG9Q2r(U4`(o1HvF=I^VyL4&+sjZZqP@Pp5X?7IX(Sb zHN+p-M!!9Gb`7#~rXDD5W+KJ$z(}Eh1F{~1yr2bm_2<_UjsQyh$FD&4j{rk^wAa0|v_?gO#2z(n~{ROvu1l5GN6NG?~wM}XPmfatLVEmba!m)K8_=H`7du6Mt zlW<(aWqEyjt31a1=Wi3=UFv0c?kA9aR|t7hvds8;5drAxjsNnd!{d7C{j&kobx#ce z|IkR3%(e{_qRuS<*_MLd?oaW{(HJzwwC86kO_feGK?$gB19&LE|Gm7F2w9a3@$i2- zPhnTh-822gUky#5bj6$VecXCj&inhb34}X4$ghSt808F@$fIoOCHVezJ?wWU!GHMw zOZWdjxvg@=g>`Cd>Fpc-KEY!9>W_IsfB#8RnVtn$HHEBO;mjLLgqvPlZq`U@e~R(@ zuD8kk%Okp4!(|Kr^K53%e@%Y;X>|`Ac>E`>5$eFLpmCc{gnC8ej{7`zzd!p~@J`h< zTWxH@Z64#XJyVFb#S&1+#HWJGGuMT)5)}x3DlPB8HQrpWX_}t$zpjg={&uDMS^WDb z@$UqEs$Hq`ue2uYwn^d^gokhx?*rtxs!UXe==S5CZqn^Ru$Qk2n4su2_YJ7@%u$8l zDv!=q0lEbym`faP zOTSa;&fhkdQJu%`OveLO16EijPJ z_f=#Ox-XQ%_PX-W|9oOFW&dC_OjWtaPo-@F_UuVyo3)EIT*0S=R)$Z9S$pwyQ`OwS zrZbkcE0=9QA^3v(CIrHLjx zUbOq~`@&!BBW%Al&^5oa-G5+Dnp?!c&FI1&B`xbaTS>}3=^BpdnW}tAPu{~~m$}UwI->D24lC{t9eUIG zDwHm?vC+|3Y$~>HvrhUAU@Rh3O`Yc^0cJ&a(CbOP7SOQ7xse5fPtZ&k0dI4y*d>{# z2Yw6eJ4GbcDhmB3t_Tkyzl1yE7J%r7Z|LsVCMe8X`Kuex{0Zo4`3R)CpOKaK-L*AT z(zO>yqvQJrSZT3gsZ>?BP$mba`>3xQx*M+!|A z6b5c=V>gH!=?Gzms}a0j11yns&NzE~ZTPa1ZzSqo%I8C?JNKCrM6>QW&RGoLoOtSU zIJ<8ba9-4lyP0I+R<9xiBc*klknhW4S)5{VsK2SY5 zE}8*UhS97ORB*g=+8b4QfDJFj;0mD%X$O@C52faFU3FEi^5d>t{CFPghsr{nf&*#) zc_YH5CNzCS2ib`v3=4uMJv<%I@5;fiaDz(Y!?}m%3(fE_3A^JLF`ts@Gwx?CnT`#a zyfDLDc&FcA}Oo zR`~c{y1A6PX0(2qKa%)LOM#bQ$C{Uz1@z_pLta@ zwcapOJ!&C(D=|mx)lJKJgHI)v*zK%S{=q&%WG09VX4xpZ#}CjMzjN2Mr`O8};iB6N z--PBG&5L-3eXcLBc_i_oSX1jP6smR6WhrnB@Vbaz^T&QPet$Uk?{lGAZUSyu4PwF# z0BMic;-rHYtLt%UqmhC`dwn+FxnG}RO22Y7q#(I3Zs^j7@I+-ki&5{tv7a19w*WZR zh#;n z%h*SI8bt!F&amW2pKC5^2l*cf?g2fdh=2rQT{qx~YP8LAsY??S4Ze7v_L*L(d^f~% zBYeQq^1=NJ!ndMZ?olOH3}q$JRSkm}3DBEZ=kO=nbOhH{$tRm4ZMHB?AxBvqS*sojqU=UhEo$jD7Y04ksIV)wCd4T)mqqE)+vaFSZ;T5bn6#UfRy{3B`O#*K&H4n-4yl0u*;J z-2}i1g1B^?yy_N*V#|3am{ZmVrp2}vAgvstubVq&K1t5DFa;4P&`Ao2@)>*_P}A%} zM%ytGTnb%UE_{3W9I{qhk&=p(Pt{fQ3Vr`gMrloa9+UP!6%x|prTqEgkVl!?@T5LQ zZym8RVI4n<6b<6`|RV>742KEr7N+#Pq4{5A*X!bNHmU^da3{8Cfl9VU)|onz25OnOU>}k0%Wm2d0YoT(p^1_xtvK-M-CMgivi*x!HB|;2spvU zfRZznUnzw_k$8df2|_Q8pdujF@6=;w!$>wIu8Dr_T>prF<$xPivgCz~2 z$1-Afl6TUm$g)5zF`kAGB?J*I5d(-*!8ocz+st}ahY-_n1$n} zP+qVhH<#ml%R_R>&s6TPNoh-R(K&?tVzq7^qG3VfV|Ic>Fj&7`mQ8_0Lh@I6DsgPd4k)LWL|~ zCe#1aOZt)b^jn)``;U%V!9YW-w0Q^81%hcANyCLHIgbFl)0`?hW+7u;C54$fK7j@! z=cd6CiUFh1>SB~H8Q=Pa+l9*$X$t%kmwevW3z2UF(9<#X;XMe6qi+5V;y5|FN!tY` zW7BMYvike=xy$uA@<5!7NP_jg0Zbqrg1hc1_#PC*IzVp)hs?WanDw3U5tPhGC_1`$ zpMnn@otfKwIwxV^mhGBYw3E<$c$YMK4qXk`Ycrlv3h;VE%4+T;jORLAbVF)To8C?d%T_17OtN^Ef&rmmtuKQ*pcp1027=X>g&ay{kHCLXsy`z zB)JFw|v+2gk>;b6M-W)#_07fwZ9G(}wGpis#@sl+fbO zRA9fT%!Qo|4xaF1d0_#=_fJ}h?7MFD%P*CzA+-tKFYaC8a~Ek*&&W9!ck#2Yn+lBb^p-=4dA5p z;v%9qR5|k$noHiMH%MD4^MNlT+ zTIHt;Fix)Ks5lC~qNlE(%n6qlOiVlyCEgt)yy`FxvNJ6%90kyQ-G2jYV+W@a6+ylE*m_5%Q*nvAlI<`bFIah>C z!_$v<8PcW8e_$B9AL1c<<%m`{rfrcV{F71krTrHdJM9Ki(1^a8?A%v-T$jGR^EVW@ zJ5sEoDOI~pxU$g;_@iKT_@6zaU(R3p4b1mD3d(EvG(?A&C4*hs0p$lDj~l4%+`Q5Cf~px z)M33I>hh(fc6I6F9&0BBZ_O}Y-CB*8`CB0?DeK6D3d z)T4myeJ(PWg~I0o5H?{6?J)k?HI9n!2!6u-w+UyPVvpHmDsP)_e;Sx>jlbbFw$dB~ zL<7uz+mw?aBFL|=W9CwVHUY>vwgDAS{^dPy{Z{7cLMZ}0_c8pBx6Ds_4359mvK+Ao z~~X6y9~&F+ynv$I**6ojt#)DjTG; zcGIophoUg0Fe8a897K(Uhz)wI{z5`Dg3&K&_x31Uk?sSMrTr~I^d>gDzqu@?+W4ek zO?}kMppibFH_TlQg2$J;*?SP9xmZ1;U{DRJiwwfQsw1S}L@}^VeqJrNbJBpu2;7F8 zSUl}g&_|A+YckbPz20+P)p3vegE5tQAmB)86P%67&jAzzSq(r8>z(StY4aQ?j_g;2 zbqc2lT5w?A)}68Xp?SAez4Lv!)F}yGnuh`p1mvfm9x>v?HE;=06uxx|55acdvD$s}KQ!OW~>(&Bk<#vm`cFJQTR^ zU?7_d0Ham&kO?S-0f<2vVeLDV(H8o;I_v=HVww2$9rp?S*J+T4)rr})mp-;w@!EXq zS<*!0ks~aBrh2(T(U*ir0p3n2kU}JiA;;GU08Ic^x)EK!aVr{fe+2v;Sei+F+GE}c zM`w_WmBSMklWr5wRQybJeSnl|t=|3?`NivJD&f@fuh-aG{(hA3ZXL7-sATmxl~x;{ zkpBBo-p18#G97rw%5{^CTL0IBhyS=>qbAk=ZI^e=sd6e!s9dobIC4eyRT4+~Z;zmt zhA3zUN;RND1$1|0_WPOYb|cORXfK4f{!}N}`~I7>8;jbjf~ksYJ_$|N{6By<&tA2xfqGE5XpHCE(`$sLiQ8sNJBUYi-cCv3sQ#lD+ zk4Ur6URN~PWG>9qX1QqhXa@Fe>vZARbKW(a##~(?HG)Zv(yvg!4T0}VhtE_(w z@M462o%*akz(_syHmMZ(0U8TTTXWJK0s!L8apd9X79wJ{ydyF@WNjW+O-*X>2IVN_ zow^>!>9Nb*Wg{vE#Ywn>g*$KvkQ7SubJO{?8|DTY1(OY~L~&6c#D2&JXG?dcjt6q$ zV#Zm+%3Yhv`?}&*lfFLH>hb@WRll945PP`G|4(M#zqf92@7a8(BPI) zk6=4jI?J=3EMe}WFxc!G*61xRhYyU39~nc>QL*}sqVcO^Y$K(oYOfxNuY zZPk5sMGYtoH*awOCY39&60RYbDHBDV4Hi$EWZtgwq=u@>4$!`RgZSzqf?*5p`c%@I z(tbhJ$-~kabZ7J{PFjJdK;pz*#mZ7mYr_MtMwkDiXY=qS!w)Yc_TTZ~|BZ_egU?#IF6jJ}4FmfoR7oF%J^CFCLiOX-^4m?l zNrl3o?^K*H7Sr9YUbcLGXtT%Yf|jQ*ou?hy&Yx%j7i}ag5mo()FlO;p=W?Y`_uix> z-?ViYzoeV=G6b=F^#COpd3nFW|BO_au)kr7PQi4&T-r<^pIT(zvjJ?%TB8=bOHWIW zfdXY=1w{~MxHbE(d9Tv7_(X$Ws4>giii^eynn}8wp%4Q^)kdSN!aVIXF1#L?i2**DG2n$jCD)#}?e zAGm9Me!p#ZABdQxs>iVh^C$4&5vYR63VAFaOjLs_GA(muB{RQpRLZ)FPky~MX%YI& zF1n{Es2aK))P2^8@MxPUb7kz22HxXs8C!N?k#K3FflZJ-MSJRpBQ3svd}rssVU_(G zgZ=+}3IC@T|McyVcf!WuZaK1#0}u>!+LLn`x!R3~bB%(RqJO69t2|<8{GkpD)%E{m zXZcTW>;I~y`Qy>5*#VK5bshB~6E(ugflQP7-8Q*gJ)H?ks7mM`Yrae`bbD4BkTN zC7zu%Lw|9L;Bz0pe1FW}F+K!sx4vsZIo(f?DSbH0q<$VAFub=CKWq2R?MXI|i^C;H zeWxVdX|IFlO}KJQ*Y~^LrU`>3M>%RJL-;l9-fW|mOks=OCOi|m2#1B&yH*qIl`=|a zQOd(e{B9*uF8MH*1+X(Nsz_)doNWls4f89LLY3VJ7Z!}fu;_{);ud2AN8ba#qDo={ zw{MTNV<@5Cu%$lr81gHD#DSwbsK-~fqqK(#z+DjPmXnB~x;hRpTa$1R^kUI;S~O$S z$((5?ZjUlvy4ZKjN!PhQtUtADELctDkxF;VbMfgrU6xOOy87av($^a$3HPYj356Dk z_UO@5hW_Rz9@+AS^mePF{t$il>MF2Lzt@!FQEvFh)f;*qZ`KSNt!m4Fw!%4eH}_05 zgWlt)e+1C|;M~8b4+s%Pw%WBQU7uqb)97aXpjz60!{UqN*}9`y@L9dH6_oxU zEAJ8;YskdvU}?HkUu11O?eLTr!D5My#7B?w**Y-ALN=!JbX#=2OUXWzaXt>82R2Yh zTDfeUplC?I6M4KUV=B@Gr@)hy8m(tEs0iDxX>qPdyx&rlJ`^*qLP|v!BmkmIp$K&b z8^UqCOcMd+TXZvxqKXqbpnoEGOuMp1WI}9g|H1>CLVk3B=eL!uUJOvBksE65yRlCM z6M&v|Y43`{o4{^Paux9+*~b0=CE&xN)XH>eJz%}6q&H&^SYw;NEl&XQI-4L;ieR!# z2ic4NcAd}W>JS#dLz_$^|4*=?0Wg#)ng`X293Se;Ws_4=nAus^8B!f{D~~xjm3HU+ z=J`E)zde)&3V^vn!pnhXaj5z8fQ&OU_(jENa;|x4_(z4NtN8xc2 zT7h8&W_Gg0G^0-zlOdiL8KqEtHVP0M&rE6Jgxpffh5HoXda>IYG{7@_v%bP>)| z!}Jyg28w-WY~=Z~w^xMve}Uyp!4kj#1plkA|B-28cpMQ9G#5vJNdkm@j5L7Svyig^ zzc>oX1BYN5b6NW6BKJ`nWX|@hr&wdWiXnP=fu*0}FQQeiTn1lOG5etY{xw>a!Ve7T z{T9Vmz^5?-1oqiY=V#lb8I9gBab|)eGtPy2dcjaqX!{qx^y#0>i!K)_X`pJ5vE5e-xoOk-c2?U>Wc#u4#htrr;(Vjx{`U(3pcPNnKgUX6zIx1x1rD} zxovTT{4BJgO=!XKF13V07mRuj%y z<;-=osg(p*T!>Wl>O=%(I;?5M!QBj;TnrAIZNLUSm1}mROiv5)gT|zV^DU;}yhP3> zP_+e#UEiGW%H@jf>e0=H_yQRCyjqhu)6u6n`$ygoCO|QsLJLLEVk6=Z zB7WWNqt=K#WJ!DeAvf=%|BzvZ=Y&Pwt`Wp#a{@_|7sG%t(fwEi+}l z?d`NK>O{~4rynszD@}04iyf8o&*YrTx~O@mX$!PhTm+J8h-k!<-{si;qB{Q1Q?Zve zss8IC+J@EC{eA;?s|UR|MV7KuZtiTwS+X3L`k=G-87T;Pp@?Q^5kt%%vDS=EgitKe zafpuX3egv$i+=|WGi22!w zoD*N=V*rTlJx}#f|6!!|DJPqrFtZocm2~#JlJ9OBrOqXx?;v_WXT4F;vs6z&kw8&( zdyqq$g>}LSK4pG- z>(JX5GBgT#*>2ck_RR06PVmDl)0Wc4iq&798yrsf6PC!|nImSuNmlN={7aRHUnb~(pHjqsO?S=zJ?;PNmHnR>MW~APzxMZ05lC3> zGf>US2k>NO8w7g?JvKXM4Y$eY!=wPB<59V%?vK14+UITNn+51*HV~Jceqvn)Z>SU@ zbNPwK8+!X5d_v5AAL^8!(H)#*YN&5Xf04`3RC~dg$m%wa(s+kV=jri^Z^R4j$8`mOC&1N-H9@#FiEO7?oPa%#v9XR@$%&v zXS_Or5!jQZ$!`G_eFPogyeRt(;7{O;+K^PzvE|zo8Il2INe`!VlKFx53xA9xV>3H^hCDaK+olas_dEpwZDN`tgg`nD<&!crz*N@JzpULxUK;)_sU)`sXykP8q;kpv}l55|nH={WE^qR;F#)e~*dEwPmNo$1q zPbJY!iLyR1>cYS?8Kn$1q=o)W<;V@R>v6SEP&_C0ZL|8N{d1wnlm0~)B7|>wawQlF zAH0PTE{twicwsH(8Yn|E3i060fk>n?k7T_vRPustx~`g{VXLEHmXOB|S3^P?cZ@0D^2d5GQ*d}vhoZ9YlKB!u4b)S9 zKtc%=oDp1TGIuha31`3LvH5xX)8Ni9d}z}>ya}kn+`NuWn43WrT9aIHdfyvtxAKIW zn{u5pV6r-`eTpw)dzJYXj{AxXdIS z?BrZkdd8_)8^a4b-&Wj)_Y$AyGi`NM$cVml_zuOMQ=8`@sU!u$Wp9^W)Vdtgc-yT^ zA|nv;pcb50PZ#lyq?t`TrSDn5)q6Xs(oeaL3=$pP3pjNt(9!t&+}Se>&;9pHQ!F&TZopMuTM>}AVw`H?-umEI$=@^?@^+4uSxlJX zbNanV<|C7kvV`d34RYQh0akEOrw;_x=GXq!cK^TM|CjYN=1iSTysO|d>L94P;>hxy zn!)Ox@-2GR$h;e$uWg6XP}pnh&Z=%dO1_wMnenCS8|5xUJvaq!1gybQ!1-6hBJmGL z)j_pId_V>vYGVgyTf8~q`}O4{In2S!h?r3yefr5o}MnA!XxWY zP49d09Be;ri$P>ANba&Ab;Rdkg!4tM;sar`@AeRiBTsrHx8Yv%jB#eC`f4)19-D0K zJ}^oViVlqO`Vvii(Cn^Q8k)v3TJS6+?kX%rxMn^n`LO2-N+p{!{Z5?F3;T_-r99FN zfTfhA`ny8%AHgBNCocSs)IeqX%O9Xb$c@R!4KExY@>}r}q;P*gzZa6LiS8B2h+sAk zif9pb=?q8Z8@c(o<BPr$h0|s2DKJXuJwjw~d>ZphH`CA$}OfAQSSzG>>NI8_0$dVf(%Zj^eSdu~;>Tn#`5zI-Uedn-7!|+%<-hYP{zqf^ zF9nexr-4o17|8yjft2L~SacGQf{Ru^?xzhz;1cR*)K({3^G=sV4a*I*lfKvGWb<7_(6CteX)^YjZ=d2+i>U&0e9ET=Wvd4i@)CvCLt`zpoJQYRgRvV%nw zb8OLf-~3i2<^L7b(9Fd%$+t4lm2L**0-5A9_*qyISkXP}`f4Uu4m?Uac4bc_TWWEvh z)GPg(kjG07)#G-$z(WA2&LK~~gDVrlU`>h`C^3rUFduVq5j$N?E8F1j$Q-kpdhNrB zDZPtYEY(hiY*(ZgwhFv($qT-*ZXk<#oMH^=ddW+Dj`x8v#J-wSy&P(jIoG%@e;7C) z--W(~F+7>-qUj)Wd$9nSl{7P*roX=W>JY@^7sZ#+^iD~MsE0qi-e`TK(o#EA*pT}Y zjJ=)^S_jljqg@itA;xo=&lAl?Vh1I|K1E)0Gc|VM@qd1luWo-f(3Z&_Y$5*-=C)r1 zi4}rJ=He~Lv8tTdq0SuM>aR`LJ&(^2qPf1(B+X8J9JGI6LhQK>zQm%dbhaeKOf%4@ z{(H!9_J?CQdZ9hOU5I4o_*<_>M`b$T$Lfo2brMg^cieXla~)c_C3XyXUTM81FOI5i zqviH}clEv=azmKq9qWeBmGC4xjE4Bi)0(HtEjP#sfVY&3=4z58LS_*|v%EEBg2px4 z&CP==?;7k6IERwY-MW=4^e{nz`h2)0K7@`d7i%UBz-05B?X$cObLlAT>jrKmhwa8q z_2JXPFmZn!$u`-_cMr^cPUxyQZ0LX;D4!dAJIbWzkl}6=8Qc6Bu^>s25mKXLq^4?m z;;T!~${nTzg$=o0-4FJJL^Y&Kb9x508?wH5Cw0ZZN+WxsXT8+ArbxSdm9kd6qAJ+N z$ZF^j>)C7UGCh!Jx9MYabAPRRynGNa5`#?rA^!pK^si~yK$H4#g;WcMlKd)}4^+N| zcD9pa);)o~QXgO6{@lSDte&!n1ooAO;4=WKfk!PQa1mN0ue9^nOHaZcJWIK0pE!rn z=WD!o&v|*TJWGnDR<@+bz_yt)bE9e2!TL^-_1y|B=gx$L4A3)GwfXI{xwWo!6Fyne z7VQ(KZn$X$KAEn$eL^Khk>N_P?t1LPPQ=`7TW$j2q32Ep?Smr&%!`WrjC32iBORZ; zh-sg&*XexZkT?XJxVxlf;U(kG;HJg6hYm(NyjQC|)wszb@m`D=+? zSH>JC=$J>QVXwgYXov2mu~*ZE&uH~_TLpf{kEXzC1W)ZQUEGa^xz(U8G}f6m)gY&6r|d z30k#t_qy0F)}eQ%-!wa8THQRrO76bu!fEc(qT8HC58fwY!=r+Trj!}by9cjc$Hbty z2}wiqk0mY&)sAfPXZbKJ9_x}nud=tk8|ZnUxS@^R?nKf9>KPDPxEii2egc6ibSY26 z8wpfIYh`Gke<5r%!%vTjLeFJ`YP8#P$HDk}-tlE5l?9{8%z(8zu0cRy4>SpBm^bbYL;KSTyz4?uu|lsevdL~4>(J47(4+cQ z2qdx z?sLrEc-?H!3*fT0;0wP6|NiXf|ADxy1pwTU*eVYw45CA#Qz z=II?FIk>!XoyZ@(+9cEImd~9$@Z#jxMB5%wC6l@&LnV;jVK@FI@QD)#gaCzRXn}Sz1B%1p##R{TCvWbxYbPQKp7zQ7bX1bf<8FXAILtA3 z$eepTAyqE$_FgKG;A?Kk)$~KnpB>_umy~*FI7Zv^6JLJjv`uI?_2Vnu-z-`|wI~vY zAO_h=);egcp<>k+N6mMW3&y~ym+dSEjx9GL$-qlscx7Y0}Fmz;UosF3Kb#9*gxn|@6vBsWW;e}9j2!vJuFO(NQ7 zL?Ix`a7Ig7ss4RN+tqWdL!vHj!s&viPVDNQ-8H!z+mWs{xvTO@45``f@!6=|5>~d7 zd{E|XD7AT1b7Y0|-#}PI&yx;fJR!F+6R=dgcYYZ=qK8t9{$K39XFyZ!)-8(C1VoB7 zL5NBdY0{MzQRxB#0!oWY2Lb6QAyE{NE+C*FL`6Vq1VS&NBSnzjOXvuZ1SAAfJj=b$ zyFcIkz3<-p-0!>h?sL!m!%9|?m9W;co;ja6#vJ2Y@d*r~6tp?ExJ8uY#fBh>q(#|h zvl{0*dq&jF1DG>Qa$0QGza*Sjcl{I}-BkGrqyFuj$tFWo9#LR^E8JUT!0Y>GVdKGh z8zcF%NopQ8Hcpca?R+;ZKxaE>+Jhl2KWL)irHD4l)!8n_51!UvkQtjdwJVxnCTH`$O?IdIDxy`{+&ESm5J zqi*K*nPgD0%-cO$($(EHp)_VW_0aP`3*Zb3j@w+x4Su&{TM^MarFFmTv;Vup%NcId zdMEJ-wqsGyYrwdA4(rKcC#D2o?7TY$yL_1{hh08?ObrQ<;HJ6V7afF&kmI{|@=4ec zWHOZp)-_kr-v*f|YzH_(Ud6C}p76q)j#n6Oj`hLLGu`p(6H?zG_w+z829|8+D=+uH z!S#p$&64f~AeRTZ{G~n=zhPS)dUxY`M6kL>b{E(4R=)jSzjB=gv(^*apIG|%aJtKE z(Ztn@DWJ_>#&RX;>?5EbO?e+-o+$Fpln>{@-?T@49k8>@LUux>; z476)%xFv@}ixr#X#ODr%J4iq~h~(nVkx)3#*BJ3Y|*bWJ_Wm zrbm|cYlofIW_z`mO^uyH{MmtKw-a55tX$QzGVu`U4Fv8+|9DS}=5f49lp->gXR?#P zGi5UaHmnS)u6Kc_cwWumoaZsweb#ZF!H`BvbHy&v`NRuIX^w>A;DCxporfoKa5YeX z_F0>F7Xx7ebc49sd2ce{t45pUs9Y;ol93GWo)N8Hd)I~Q=Z^(%o2nXy7G57VZ39gpYGe*8v&R)dcTQ_jORge|;q%Wy zI3qoA`%M;g%>)c!&Ech;O!;(`l=b>PpxYgb=Llu{P`HQ6H9W>P8p4Sj^~XWPL_&;9Y8{ZRpapaIgdV zQMyX=hLMhj^~xY)s5QX)eWzGolQOC=a?UsSHn*=Y#|@zr>$;-cKk*8tWNd$lG{ zY$|kWdjH%=!QFGUDS}f$ceJ^zQv5}1C-1%KLr|>LhgR;35byYacV(H?~^*JID z+T||_3uTx;o?_QM6}{YP%!RXXxv(R8LbdR0G?$* zrGXT&cvJrI~Y3vfy1NB+QLbr05bC7Tt1E4W7LP?a?YzL&=6stOp z;CPbs=wvWw){*+#5Te2HFUvG^OQRryP&R z)5G$hLbx12zgv@oXw!7?ApvWx5-D}h3z|FK=%~CdaC`5B`4h;C;81AKGoOo%Am%kp zfmt5EdzY?Bl%xpC!v<6s43u-3>NO&|<@k`EQF)f{3)HHlVLacaMl@vn{Q=aW1*ZOM zV)|!~|NT&hc(Ng$v~UuR0~RX;uTj|9SvPyYr8(sr`IaYUu0l$=HuvKJutE??2j=Y-#NpZwSLfeAn0MO07Tl~L@@!RLj8eGE(o#n>ac%d zPa$oNE80E2?~cYyPMiD#ziT~wPa`c)y_OL8K)bWEz}x0M#oGZXooizwUO=>hs;t@t zH9e0nkdw&LL?bukCN3g-zFPgtu>`@C_K0airI!67XF9Lj#Z@6pynC0?=fJLzsXZ!_ z%?HRj8h0(>IIIi7wMb;d)h)o{Fs$YaDiMkoJ;@yJf}=ZD#43kmWd^Tr>k9V25Su;b zbm-*;%{vsU{~JLCN8(W1aiaHC6+&sD!C--Iy_42OarOA7F>d_UqF6F6PiMH^d_nM@ zTe@Xr&gX!FIfYUto~HK74_&tzX`G_&9ZK$|4#K$`L1a1H^I_`g;5y?0MWU#_j1sFE z_I89u+dG++Q%*1EkL998;PY=mm8(ExoswMi?A&Z6soL9pZ4^+MyBjafd_^%!tooWl zcVE3yEtlsTKq0rgSIZ7z*Q%}pQA6^2S^Lzz$chs6*r>pk?KiMRE_{<}#S!@RHQmd~ zp7IoT%}#oId?OcC1YYQWHmgP{0ng_Fs*<2+f6&A>+i}2eKFO;{{memcU@D;&>Xj(m zBhdTtL2O@6qqFGi`R6r)vYY!r9CxN<*IVH)t;12`5i2Z5gVr0aRv}SY>jN#R{U@5fGj5ADX2|22gPDe#ovz2aw)=Ki z?q#BUjS1g9)xPa&>Pp}mvz&~xz^eHdtuj_$c-2_U3|m)xC+RDu_85^P38s`tOsOkRYrtaP?CwJ_kQC;US`{p0Fa7KUZto*$*RICi-p{v5gu9rc6es5%F7J*`m| zKb!bQ|Gra1$C&A`nS>12v%41B&h&(NhEs6%erq%^0{Sv>8BMjT?ZvlB1dIoz={8*X zydEe&8{kzx+(+^oTA}-n>;oUm1MUrpNNhr0Cvz8OJZr{JDFYyuOz>PkJoQ8{QA zYeX7GQ})ef2|xCOlEW*Wkys@l*aCCN&v!|_#1 zm~B;WNzTME^<6#E|)(I!U#~f=Ofk1$`{8?sQ7V zxA&1EhqiZ@T(Avl%|k%aOXd6WzM-};Lq8DvYnvB@!Ml4foiBk$j3785*|e0em5Ji+=SvY$VBMoE|2z3e)MR#~^1q-M#;_-CLM zK+cWkRiKb_x)|#q<;uOlEjJ%_*CjK-hmN2e%TXQrH=rFrh8#KMc4yI0yAts*2rO3| zm1$>xK$SQ%%znialtQP)D}puc(C?xcX+}%tIb_`bBgo=E?{jKzZ+I{56QHWgA6s5W z!#JF-a%kz1ywPo9*vb*I%^TyvxLB{lAD1{ky@5GKkBz{Wc!540`z@g9Cmp{v$-9Vd z1y7JLl}`XSP#71z9quzNR$PA6L~r zCqP^vj9_rRw4IaCWVzvhG(%Ia80ne%#16W|L&slcoAscRtM8E})j?0X)(5kKtR_?w zU%W7@A4#f`Uk?oxil3aCjW97}X2ig z!A9Hhb!Wp+*;bVfx`DagEA=L$ZWi)vJrmc(r@`pkwEu1xzqCUg`8LPI@QM-T^s4Y_}>t+6}xrRS-@BQ4Xnx2bB;TkK6BMWlN~IXXzCaT#%`%QeQuTZ6+Fgj{CLc%0lKJb_Ij^mhtE`~|wo`qNlWtBNadJ{; z*E;oNn17{XFaQ@IAzQ)I_AX=|A@?vJl}Y(BVfe3-suChzgR^Ad{05bop<`#?Fd zGvVE1isbedt3Fgfr_R6(A}k^Hk0B1lsMv(d4Kd+5Z2v?#Og@@ou?nyqH{^J4;R zOQr&I7x~shq}8k`hCdTV6in~WlEh#4|NAA3VL)pk_$g2WyUz9)fiwL{PSXY7flP!L z5Jx8ynr~4Bg7ccHvQ#R*h<}_a5HuJvjSoT3e9F3)a5C{povWZijplb`Kaij-fa4LB zRb;NA7C6o@fr&Zp@Y6 zKVCF@BjkZsp)x%o-3T_P9$}T;q|XbMVdI5Dh;J828iorpZ*%4@r4m&3sKPN8!?IcW znRHQ}%n!7lr#eS5M{pmcKw@VP5qI!I7!@*qIVNE;rUflne+Lu~rCofrE2w6h(N-lL zRP<8w^z;NJ?Av8h$=mdqUIt!Kn%;y|BmkSS495ryDy1ze=o#0!R<5tQ{Uv; zpTgTk-h9LoFw0c4Skt!A*%of~H^MMBhcLO_;`IG7Dzhl?|H=|>69r}4<8*?NGI!(k z6g4z#;d%C5+wFW8L1*Ra8joGRx^(ywW4UaLMW@5*%dfqbHq$c3F}-+{?2%o)}n@N&{%5b^|9_VCqk7l#JKe|2RzH>UB#osO?M#Rkja*$G& znTjsN5|K1zgnw${yN_kMoV84Xrmx;V*Rf%F zy!3%?X{;A;abX)Lb%6La#lM0ox7weoq(&9YSg!>IVX|yy>~GsIkUktMEmU28%%HDN zr)UeSAgW$GgKK!<`__{EXyH)~$Xg$0kCO=52(8Cyb#y5@RWGXCsf7?SB5lr3?3pioZ*~l0kZjalAiL zU|T0Qf2guHX6i**c`AN5B|^-X(TwIZ6b;lMdB14NksXNivQIRbh_@=@3{7w9AU#~} z=by0=K4GiF7q@9}YW$d<)J1hrd-W5LxlDJ#SPtXG4(SdF<)zUs(Gp};K5354>HE&f z(G=$L>rdamct2?%@onm%Yu$m6IF60V%(wuaR3qe65*5T-_$t`wH^w+8ZM3|-8wq@Y z_yE6^i&5E!4D}wd7IZS`ToNIrVZ58c5pYJ-dJ&X%-tM@*io*Vw^!s)8$tXV7H;MeQ z^NxO5d80sc7gHTc$dGiAEIwFovY;U{6^wvXlDrzLOdo61+;5S*q#PEVnBr_H62)&k z&hi}#-8;PephCUiLj8&@F{(;5`2Bi^ent%-OV+I*!IE9)2&A7m@{y2k^RE>0#*9Wl)LCjUOL!PgcuKZJ@i zTEW_MC50r&+r}2vC}iV|LS)G5-*bK`$ms7utl`Ljri_41cJS%dyxb;#0Zts+p zRA4kkLA3DEyn%^ebfo4P|KYX5S;Ip8vhovj|XJ-W~YR3+? zr?hdgPa6h*?Q(N^OFm15owBYrq2jbu zGG*9(00PH!jCCy7Jd(-lKivO2a*y4w#GmVbu>)dW)>PLSBp<`SHZZnnNq+`3RUq9Y3rqYK>Fj|# zkE@viFj671t6sZ3@wVgV3Q1+;S0j(1)srTq0rJ59ancD`D^-?KzC7mq1sasMex()b zxf*x*gopx@Ax`;wN9+FBX1{R?5$J=W`$0n~C0mfBgZs8xvjlNY5hYpYhoz)lJbEHy zr?81HF2GMAiaT))baaMyimDJwiaNSei1YX%})RI>y4Vvn~SEx+D zdY?W9$A~47Om2R)gfOb#!SSzRUQ;iihQ#VBag~*|Uxu?iN}0>sxqCw#j&db^`9TwK z@)4Ulksi282E%|0I|K9r4v?`(qcZ1%Vj5Y_5^9g< ziE_)fA?kE5guvMV8h&M3`PZ>DKrEEwQtA>S=ZQ6cLr(kPly$pnuV`i-1AA=rjq;EEpNKT1PAXF&$-0LWKy995fqST7 zwsA`!4d0iY?E>^P(yQN=Y^ zj%-2GlhtE@U&~7sajiuutIp>61o?V?$I=?tBnlS4chZ+}3^rYM9dpMXiu%q*6d}~i zvk}Gm$;ZKf58Vs6JAz9k9O}JT$hHaG-)p>+p{@Oz#i5FmQKfJhW%e%qX{@*6y9hId zM0-(uRTHRuYx6Up-pl93%~_o=(}BHc;A?SbV#r=R;kw-`MziG>-#o5AS2 z2oSXg%!77@Jc8h2iD6rW2Apx4&j)ymMZxSAD%CJAm|Rzvf8FU_>^GKb&-q8jaMK?& z7$M*ntO6PQ85QCPpl@mSE+5{ak^O_FA3?q9jnAfXU_n%%e{WkD9w%>zvXCX}qTu^G zfH-y>Rq@w%0vwHhvlov7mJ35SiT59fGuXTwu6)3!RtDzg-aq|wGQxjD<5vkUi9w`O z!JIc`kW%U|dFV1gc)8&`i-;49xD*rVW_4`M_jVYtLTc90yg)Q0xKT0!=0GQk9fpgG z9qsrp=14bEzT}{s6jJG@d_dE2377PUjMO6|BuVmRN+H^vrGLt5@fCVlG2z&3!$@OZ z$ab97En$v=dA6CRyxx{Orm0-CUN>Ng&8X9;3XNW*YGJzECseI%JG(oGc_4*Xe%kYyyQf9;0Mx9u4-MPk2-eZIEq!XdC#vRNE@E z^Rv_zipDYZ^7cgJah;-obA26Kz~-Y40J zpbVE{;nB4zxycyk#>V=arz5V2Y^%*nxyRl_+-5L>J|^)4XXg^xiKGP^^MlHKft|3? z$GADvC3Tv|Eg2R{-psydYfD?hr$@D>JEW}Gt)eME8xEZR%lN=2^NSWD4Swq z(B_6^w6EcV?K2lPe$c2to!jdw@uMEW;?%TpTbtu^+(`dnk2xN9g{myylT*!-m!lHN zrw7e6rb$-IHH~0}PU7RI-8hQ}r;Rly3-vW!^PB_&>wtkBrBtB%^??qpR8w$h%x5`N z&8nGwN0MjBEu|o7m9i0dcwV;4_&*r8$f1PZe>|>#u`>j|?+5{)8U+*RmE&)&k+yU~CL;C7w}vIlb_8k-h{A!FIF)5l61f#D$BZL{5JEW-o;gfd#%svhwSMOC2k_x zcn{n9fnsTL1~7dw-Fa=tBkXof#xLvj@qTx*3Z)!9{}uuaP`A0*s#y?Gcfr#VOgH7u zbnFRc;|O2whr~~H&NY!Ct6&#cf_)6v55H`qEvoI20>^un7t(GD0~A;GHx@O<&i=}<~|)_AHS z`I@dJr_K8HS3FWl40B37J&&J%I(@O9cDIo;o-HEy;e!?B=-1OPB(&FqLb|Q<$|k0= z?M#ZgEl!rp27moh=bb9C`;9<`rfW7*QX7T#=jhd07Qvuk{#JdwA@N*`pjqD_59lsb z>hry#&22jUV>997tktV0kd_gXv*R^Y;nzPcFHOqT#50(n4;P3>p!B}z3O=(i4YvrS zVe3o#btuBjquctq?JYz{s=UU6O1CTA4T`1_X8&kNdc5vczw#fBA{B89Y;5Z+@2_d+ z?ZKC`;lUvz{l7*Ez*!^bceh8v|NrVQlf{4I+4yCVrb`x{1d{=jZb|0{4S(L>U!i|G zBi+CsdgiK<>szPUB}1Xep;k4A=YF|tN>|$L`3AkzW%DnkLK~iTgM(+jBv?mR-B|YO zt+gbS?&_|rVyBQ~P5c;{O92yyZVmO&8J2oi`NdN_`ASXn%~Xf{Ywdh(dTf@!R$0zVoD~@OGKI(#hrU+(oe=>+V5& z>tcVeDPGqC$nWOj-%Uf1B1G~(eg_~S`Hv3p|J|35|FMnAjS3K(>!Qi)81Vkxx$S`l zwgNR(e*lM#Yk3fXs^eKPwo$I>p6Po_v-6=72avNhHpY!J$b_kVX;hoe%}^jpmafrICP=kq3OD zoNy1vkjWbv;3;InwQgE_#97#Z%CmbF2^>Vm`S7fK>9N@N<(V?4D(Vr}rI#l6Kg72v zi)_-m-Y%0}|4Brricyl`PH=v*1&WAW1WjaPsKtvh3;+$yDW9m^5o$Tz85f~e^{hAi zzFY)fC-)lHbw;&C$Wt&=qo~J2#;C?KWLexdbbhe88Fc_x`L=lNxt&S&tb_NYv}4MN z;^j^uM<*M>bu@P)D?p6e!khraI_?wAG3XPn3I=68?}Cw+tA;%V$JB1N-j9D8`}(A# zG-i#2_=T*Vi%T(;I77bY)#z1!N_{m^3`Z-5@I z{|;Gcqm)XWJ~au&ud7s1_o@S{$W$ZE`L@C7BbjL>gGI&~s>j^d+xy(lMkn8xUpfH2 zK;!HYu_`ceyvk!umRn!FeI5?<6n#xKZQh$8Oj(~l!)5fU3pO&k_;+UX{qxDRP)K)32h*D zvYUEPBM3(*4_J_VmS@xxdjHi%z_*&B8c1 zcZB%T!-6iJ)!C#Nu&3zz7WdN-vlsg(B5m=`aX8t<_&m%;OkMvOk5Jw=c1fuS{rB-I zmls`q4L>xqcI~dtsdLXGn4uSO#c5&cY;T)$*H!)PEmGn>o<4mo`El06Bw&Y);6npxM2#r52zK2Mq@Q zrCga)4DZRKz&a`J*uQ}SsK45y{j)Be`iw<*`)AswEJ6IShQ-g$YOKd~O#}QMfTt^? zMKm3t*?ycp;U`3J^2TgMV=E9c7vR8hYd(Pq>QF~X`EK&Ka*iEg4tByDCx_m@`>e-j zSs=tU!(l7=C|_o^r7Iz`IgA22>PUROAxBWWz3dd^oboQcuCB~3<$FV#`9RP40H5l3 zJsrXbwyOV%)dFa<4hN<(4^Nu3dxs$ezUzH&J?EMwoNjWYs5X}ADB8_3LjS0rjh>c& zYed}Owa1;{w?HM>JEC3!6DrwUE0n^e>J{ZiUzv7~_sr~t>mqkTl|Rr}g~M9sKK`I- zL5vSIr9O0NWo0yt-+&Ao5zs;Tv(mk7&+P8T^j_6kKIJ^M9d8%a<$iDmwQy~0!y@}> ztHq0t!x;o4QHp1}6(7#Um$fQpdw4;}-E%fBY{^shiO zKi~7upnVI#o`lv8@R=?`9559s*;t<#_|{2L)Bnj(c||^20O#KYivmI7^$!}3MlmQG zrF^sTgd0CJu#}i>Zlq$18ZOG{wFz)I>qr+ChjJ9sVtp;d3acJl@otIpGb94N7WBEH z@N0FvJe3C{+f0Fp$!i@bIBobYqykRKLd2s99gUrTV4Qs|Qn0^b?Ok*daLWOHgLfzu;Q1G5 zIKDzxwMd}xS)rZO%tAD@m#SEA|~ zF3)y5R%BjoXqXIrV<-TUj4H-J;6 zSauk^9=!v37XTDg$(;Qd6rA}7&26>_AtCmZq`lU{!rq(Ec4X$a{R5^)2Q-pv%op+m zq*|Z(C}q^Hx;@mLfrK49*0Y#`Yvc^GgeH2E&1?tBHq1N7NidZ&6w+jk2(PDqKwnws zlVdCM$}ey;QCp#-OQ8I$6pfehp>_Kh2q(N*AMVA*Pd+?`5(HtgGIF~@3Pj3HG;>%! z30K9XT&Fu)U&q@e{;2xo>x4dH`GuyXSEAQ+WQ?x3c*j_Is(%~HU0sKYCNGxPZ)bs+ zxK?Y?t?wEeEltK8@_+&108pvLD5>Ucn(D+ill}+PkBQc9W$RT&Qa(2yl_@h>oX#?; zq4QZPkxNDtOVVPD(F?NNP8FO;j5ju8V z_qmdilil*031T@mY_TwMC9%)}p4-hD?>`9v`D|est z4-DA_Vp~Ib+kY{_0llXqKWIMsKiKsy-*41o?3t^&cw3dKL50BC2^&PvTjjtW7dP&7IY}<}M_KO=MJE9cs;vDle}gV1evu{q)iISj@SjS% z{dS1IZT~3%TwDa83qo7ehW9^cz8KvqnCvG%1{{$#CQT@G!~OG4=ESl5r8z*l#$oO; zhz$nzfS`E8$+A+KXGWySUGF_AUGJtYN~|=m{-CJ_z~m4( zg>E#{XPJ1C=Wt8}e|nhji}Yv%Y=eE~t*Mubr7sV@2B*h+>c|-z)rp|2ziR>g89q(F zvbg^2@xLFt>vR9qA|Y%DkoWoN(|i;LK#@X?yu=|ZqQiphM8QT=x>w!&*3r)em6^y+ zK)BE~JC=%7;aMihEB>@y*m;60GnudIVI6^vY7i>s9!UFKTe!7g)Yv)i0=LD$= zw}?HuSv%SgqMqU$yL;o=Fqh7EE{oOiS3T}rOJl_JGKhxhe%`a4RON`{XCsKwA7cQxHYj=DwSNp) ziV=f!aPUY)pxGoiu*(xgk?D{$WN{SdxWY+y^~5IkCGt5emsPX!(ziXZL97GchaAT+ zv}EH&6ThFX?#Aj0xVmdYy`v8`%N=sAMNi1m*GH^uUsm%pKflL8J4d_A+h&z*{KY$f z*7xHxPrKftCc2j7B$I1aCvc1NolP5|?sJQ};fh0F#Gi-<; zUwyGg$=C}ItBw~bb1HG&VNQHKG2LG#kA&ZJk18HGHgxRZ>XW1e=jC9{=6U-l5dVB`d>n1;^ zB9Ly4C&C2c3__LYpIRN~j=lDHhL-)W~f?Z_s? zV=4zxA-Atw8v{Q!v5s)PIw>A}=f(q{@j3>FZzDTEG16v!3yZ<|UB;V)1A%|$);ARC zihCAwNU<@?y0waY*Zr$&pT$!UlJ|VsZ=^QSBF9s{Lv`cY228uTgDu`_SMjp=R*8np zc#U9-H@_j@uB|A2Z5h{AI;%Bv0gFUHhHe91)ypPle^XKU^U2X-@_$Kk<>vwaiRsO` z%5oqX4nZFfk^%1sCFep9T2<{YKWOq?e$Knss0URC|m}# z-lh--%Z${=)&X4b$UUmlD3NNo4NQ}kxxk-)$}y%>O(Q=k0dD|3Si(90aC2${elU;t zWctU7)JFfp5r0h^4?#`>@`^ubMqofNCOm|x0_%2ulF%Pol*ykA(i{VX2@L-dnurbr z0+nvo%+QDIZxgyLPUEreKeNmDSyqOC=pPPoJt3O2I zq|O1(b}cd969Cx%gC=GLFSr_}$vp*`{wkzU<7ppiCmkSJH~x-eQhIv1@@kD^99P`D z0lN5i9`XMTGd9~1ARkO1TT~MzNMgkD1$#u`M|-!)tBb}deTVG~8n21Z?Ino|ZY(Dd zRSf4*{IbpcC!wJYw$mF2n-4W!IxS0Mg*odazCVz;A3Dz+L_NkwtgZ!b?qcSi237%c zg-5%D;=qH~(^FcsYUIWk$tliIJ!CF?9-zjsY*IO>&46vCg16)C)UDR@U&o?1A{Fdc z*7t%w?Nsi3IV)JW<+VLa6Dk^&?@jUrFvE32JXophGt|h=;b{(>1bYZym&Iu;02Puj zuz|WaVGCbB$A)%B@(?35v^+b>!YYKdez6hx&%DXJ_Ic1Jv^A%!!r{$q>dFMfVRgvD zYS0fF6Z}n-g~Rp&i|gE}kXN6?rzWf5^96xa6}-#lSfSe_hZR7CvdO%){PK*h+tCv8 zp}m*2EpHA@iNsoE17h2nz_4z~qr{O<=h;pus?@d@dhlYlPh>4uy%nxJy`2Wy-0Ab! z-ecZRi1uIY9#Q2I6`9*H+Fsu#BOG=Ca-ny4io}k%SwnDp4*8?)B>4x8()6A?KvBC6 zmi>?9?Eg~ThuL1Fk=pk~R`zP$3F#>Z+AzLY*{|9#03U2NLwllQsA`n=WDSxWwU-JW zJu{5L8nD<|k$5Or$KikncEVv_dW&K$K{Ocs)bpfc5hExhQ@_2>drj1CKl*RN@|YT zr=hQ`ml^nftah(H`1+M!h&4E9EsAEs_%l^ZHhE%OF&@OPy#B4yz z;dua>a^Ga>>@a#s&g7jbzkKx9!~E&vKd7aICj8Nq|LT|; z!UM=wM8knx6kn{*+VmrzaQE`jyKId>84ZU^GeGWbiVp{y zkUckRLVeB)TnAbVCJk>s0e1m$0z=Ha9t6aM??g9}0oezan&OFzSX=Xiy;gQ8YVs42GYS{w0m%CXzR#h%Ov;|C)ZM6m5IXiga zpY+ZNJgnv6CdvKI$_;cJI3MmmXog|kAi~2&fPgmjm2{?21(@G~p!K zgrIF3C%6v^}S+EjKov#~p*+O>BX4K#;XM$$75)MkV3dlTtjX zmh1FIOuuRIgTi58Si7nd8Vj_3(Z3s^in&)^Ch6l+--Z^Aqjdef>0?B5VkFiW2vuqE z??JX>n?|8?{7O$+=jBHl&INgphJrkBWRuTiFhJYxEqAGKuP+Tix*>1^-Y@Bc0%hBy}hA{4QGbXuTn!ojAtZWD;SofM0|> z6XVyf{K%NJXV%8ao;~(}F6;i=gi9VfQbTfYQ|4En6=3}?>59aq@& z?akd}l_xF9#-i|hKYQO5D0$12B(l-Zd(^hJ9vwd*UKKt2tv&Z*mfni)oo(IM;O;iQ z@!RYkU#l1O67NPGE_lR!3+D^ThbS>r5LBbK+{2?3Gv$Fb7+DzqVmIAU-WRKJwPb!Q zhT1yI35dN?aLJbei%DNtztFL?8@SbHGE!tEuF2!r^ih%PUIy2;8D}(?=l5N@jxt_> zxLb|*hMB`(iO3{+V z_e)v&pURc~^4|Zt^n^vI164}}vI~%R0px%i0#rYr8;wyy(9|$@7o7ZC{JXr!V~%y+ zgayz(y(AEAiGgz+fN^UDCvQNsws;6wcBg_tXcrdHGowPN5~B0qIsRChM?kJy<@q`3 zr^Z*?s;eK&r0~ntTrQnHOS^z3%Jj#e=QD(4DVflVZ>imrW38-KgjX4zFhLNFNvlMW z%NTaow7~lL*U^hfYThFHb-icKTy|JJqPw91QzlDLiox?4b068T<_q3JuwD>Ohkk&{ zP6RDjktO^2VZ#Tuso!daKJIk7skR^O0?Gmo`YU?xvm{dVZY!5M>QIt?ccuR8vRT|q z@XEao7DO1l+&dQP;dZW58X2y1@l8qsxzfh@=8KS5f)|lDhIaw)g05YbF-b0`E9^BL zdbA1o$Oz!%HNg4n!2r|LoXYKg5dRs{zIVR)&b?Tbdbw$B#X*OQN9fKyJ?PD@>8xlS z=Y8pN^C3^|ixi3~rN_K!A-3HK3XW>qxz)jnw0cLHeYVq2RN=)~G$2~Hp3MoA+`IAl zg9lHoXlAQyZxo$9v^#Ggt_?UNV@ltVg9rP%)FU}Kf;SB?uc)gF`h?u|{07wufEQki zt(GdYt-VSmy^R(VYO@*{8EGd1z4^8lhFEd#bx_dv3)Q@b%cva9gB2NJ$-4;j!Aq)Y zswi%x&FDBN1{hr6XpIo7DxfXI&LOy#a;Rh@Sr zP_1?UX+{5+7EkW~h&m&af5W%|^6hUGt-s&8SO*vC)B!~i%qfydnpYkt?+MqwOU*2= zg>+XWpI7542L@vgUwks_G`F;{m5@t3d+%WWHe7WH#!L1lg7M&{S>Z3RlTZ^JwZSiE zrjUgPJr}@o)hJ-PJfcD+DIUtX4^Df08i}A_m$$u77*cH zis<9Sg{#pmou()`+X=V(Nml2Y)Sca!eDexAS%Aw_W(z)o3xzsg)EaHm(qVVsw%x1y zmRVsrIr?xdRPnz5cI>-=!im23X3-&qyQGTk(!IF2l*&vO!MJyx(W1=J#`nSesnL@7 zm8l??PhP)W#oxAnz6$!AZ^d6P`)?okN85j@KKZj@_PIs>Ut?Ok)d+ft+wV8|1^^uY z0CmmBIAnwXbuAOxA2ixIZljQJ_~Ib&9upABNYV^gPz?m2pSApNAK`GT*maT=pb}KC zLh=g^qB08uDb#SjcB;aXw1oXawxJ5b-`wYh!$WAGAEMoFDfdvmED-~E* z-~|em8p9B%@b=>6PuC6k?$ngUtxg^i?_qt!r0xeP{hhqmf32LhKKkgwRt*1(!vaPU zcJ-~YFPnr8FP+c1slCNr4f+A5SeuIgQ^aF553X`J2N82Gw{`?OGNJ0C2ni8(pt`&D1(~Y z$7~-3zJ>zPgKm`a#vAGheAWgx*5MtUuKHCK857X6)?oKq62qU#+`fB@v}#si}-xl)oH6rV@8uwTxl6)dJCs(DX-veYc!f5W)0A<9aP;v zM%y{uFAr#&4GS9woP1$Te0{vEZqEOE1FClVfU4d!^l2wyvp{LtjBD67nRsKeu58M= zqGGpv99V0So?w2LLI2vyU3UYZ_yB!o$Z#x%K@7^`kR}Ntv8vuVWQ<+s?rY7<^ zX%ACX<3ykQ_jh{bc$tk4<-VKJ58yXS?o#Ja)s^Zl7QU(&$1*cLr<I6djY0`PnWQZ-`_@;h>`%%BD_+iP>tiC!*Ny!%&RpoOb?qdcRt9o2R7F^Qlfxk#dnTkwiq= zA;ZH>+ia3Uvo+p=u)#(;Tz_+@?&4E^Y!!h4aa)OT`0*^#@wNifi(@&DPTz1$j$dLX z7ZHCd4y+Jg74`ctHhVvrbbe9hZ81#N4ctrqc#phrmW6PWh^Iztkyiy$!-8^ z$x00LL?yw3#+FL@$aUf!&aB(I+UP3;v8{HVFK(kj0|j1nu1rx&0*NBvU@AJr7sS&j z;RfTXO0!LFi^-i_>rzk8oN0S|I$p^_bR3aJ%Q}|J3f00nP?-yJh#Lgn5vm5%WEk~i zQI_5foA*^!Dft29UbT#6JNcdAxt>0n==bJq<=bZi9b6xX?c&%i;D{H;$ zeV_i^H;|P*5{mbXr-%`lh*W9{WMQjoj$;j%52bIX@#0YjL$SfnOufW&7HVtbE{opq z4-!iYu^K2mY}`!;HKgz^S^+<83Eh}yk8S~zWuPnbmGwAYn%ZYKlKfkW?)bgZU=h)6 z9RrN9-%2CurhJ8Kt=-b|758V%%=_caR4^%=d>P<&;!`b)P{$W6mPECfm$rLPD%(QC zyNKyEhRp7kvf@h0N7z=2VtSkm10flp<86n4&EBkgp87~z01%75^iJ7E=q76}5 z{A9NfJKs8Qz3z!dyYJv?9BM2sIB|A@Ck`~ju%z`ifa^BXrVh^!1cg(ISWfW70m029 z<0KvORVd9Zt4mY@pR5pb);0e0*STp^iJXD<8+2`M6Wh9<&#BJ`$O4(~N7)hKqzq_; zG%#+5n%ZJ4nMd$nj57Cb!j%lr*zhg3g7q;VP+&nU<=LIoxnS*Z<1-x(bgT2xn(+B4 zcr;89067tja3-0}e<(HsbpU9c>FZI8O5j5j(B2L_;dft;if6_}lTEJz-Jm4! z)+%5)fl;WfeW0k4Mnez)3Yt>*FUJMHJCp8j4=o3GpGOeQqx}_9KUQ~KzEdEs9PtLO zBr{1&%lVBCjEBz+(^P-#QMj9lN&ZuN#0vy?B7kg$Q7b>z5|VbZud$#ZXGG&GU6_m; zXXJ@L@g$2RltdTTW+y|`U7soSSO65;4R78KKX%OPbENc;`msnM;IV;c0h01?7Ht9T zp;xOm$4Y9u{OGDjDzf;}Spwdpk~6fc4F^U#O6Z>-D3XD~Olh>c`4re@ly;V6b9KCS zh^NS`w|Tynw(=ccu4nH;tg9 zDd0OJhq7#!5*;!S+D}u(^o38{OewwTv(w^z{x&}!9@w8w`jK-2D_`Q(#K<6q>pcl) zO0~QOa9a?xNAv6+SbbhpsAB{(jN8`_qF@7r8rZH3+&9}El;c!ckJ zA2DGX;&-9vJS}*84_A(-Uogk{V1Y&c6vPBOxn`Z<`BuxP&gN>jr2DCYI2%OZGcWhZ zB4hBWMd1mcSKc3hL#jzcGev0|GnSOEr%am#`}!6a`qixue0*vU>c|+Z&6dQSeQzio z-p=7lFr&RD(D&T`)MSvmeNnh)$uF6!8OZtZ6gTYqob+*SK@4_~P@i1-E^XvxerG(q)aNX=}Q(S*TI#Mk4!W zI-aqU=uTpK6>++*!Sq=czo3)#ch&a|&8g2mb~aw?^o)9VYz>OpVeEMA&-RI=3GA}jA?N;JJZm3y7rj%oSsQTiQ~{pG}2 zzJ`o<&&xbCR_XeX;Bjp;*HFS~Er&=GG3M6C8fSG6+yXb%RRh7Ia3AoKyqc0|RX9I@ zQXcE+=_QgnW<60eTapzl^I`B?JI76rl>T{{rETSh$vP|oeqvk}+-p+OCKJX^%|ye? z=f-9F3|MeGXK53VTJw&rsUO(jm9Dv1-BZb(1~sS8J(muvJ?j2UQIFe|VM!c+o{qK3 z%GzZqj~zW<3aUmXwlU6-dPWy$8SZ{^#bXMn9BYEucx6F!#x+c|XNdS&HNRtdFY3O7 zRbg@w=A;ck@cB{8?hP@L^b9h4FH~hhW;$eBpn}VrwYq9y7D+ z{{YCW&T8XJaP;$Lve>=uXIlQz&LmJ!VaNkzkL znK!f|%g0c-cz@Z*z{d81V33y%xAic_`A1~PT>j*`#EWkvIc=BNoHr3>Ax?Go(Hp+7 zThuq`c_dr}K$6)o8-vlW+an*`Gvir0=PHK_L8sSW02?m80Ws{hu*S? zQ-HAkLK|rlAElV6noo7~LY|JACHnZ23^>>ME0%s7j`h#Uv^w!%Ae8Q3aOL=Obe3M(ibEPv(ba%VHlfsFr)T{`B z0z*9L3P}|!j{i2=vB%3^>@bk-13Icb>#?ZvN?|UkW+_;67c}Q|n=zu+MWqU}(P3UVZcR z0)*x3#d(}oH^&!}(zM?2V_r2uo~|nGlrGn6FB9n=PHRAFp1hZhqe9_~YZ#^{lO4|7 zai3&`M2>&zG_QX+qH_7k1LpGVGt33_B^R9p(t^|RZ!JyN@0F47SiIOr!9H>Mq)NGu z7Juz)R=#poojuh>Y|};bep&NYKVLOOA$3%jpPB)7&%>PFBYpssZd9Avy6&lQU4EZB zi?mt-B!z-WQvbYh;8L;%Be9Q>}o=(KwQQ#R;K~={S*kiOs@?k@m;6lMo z^`x)szCw;)r=zc&#P9uYXqH`5~b zl3d`)%h%7%A9`?pd?muYOS970;H{)%opHB1KPs(0t~xY)2F5F@t}&o!;cX>SS3Mlr zf5}wV=#Kp9>IWi8J*64i^K5K1EBQaPS|&fJhlCv&y8-^y(i#56#-aNgCeP>p0|P|? z5s{=lhX+xatuOsR%5NR{Ug)g90&bqzq;_>2BC{P#!z zAL*9~`R``vcgc*BUlck3=x}}X6XF~n{x>>yN-bzsbmvgX9~;h}kBl>x0cEw*hy%cq zI5-N_>Hpclcr~^wuSHf{r0Rlp0iY9k!`FL73Qtnm6HY)4a}4mEMKrvm z)PbKv!hvPbQ~Rr>T>+TlEE1D6mDs;!fscLo+a~zm8vEZ^@BeB;=`DVi!SzxD;7hkh z;Y%X^K*0{zK1-Cv7;3S^@erK-0Pu3t3O`&)Vc`@3o`6W?19JkKy zYzR3VbxB)gbdhiODGSxW6#8}?585@OyGgOc^X3sOv4|KNzxU)Z9%QVF(BRqS8;&m$ z7x-dd9$#XTL`$G=AxP4DkAUaTf#9$7!RNC+2#6@~JOTm`bv+|9(1r!oP_xRU zhe}ZI5qVyWP>ft~e~JWkAe2+3yzb0W19YzkB%#E390*zPqUY1l^+2c#H%$N$XMt?a zd}(HA=LRz7ymM;NSpcDdxrV^qWRT^0_|25VjN|&zYQ6?#$7(}im%=RhmQrtWHPG-> z2^d_rVZ5-hHsO&rO=$0e6wbwS!JO$LVX+6JzxQZ?6z=OPF&UG5FkC#TzkYQ{(CC>A z_3^0$?a!B^Z!!U`Ic>|pXl;;C&mPqMm! zyW35@!xxVTHtW;D0)QBSHQ04)N^0J@5eU%r&ZlqI<5$`-Epv6|4=W|dBV^~F9n<}W zn?VY^R+{dLzxLwNjcm?0f$x!@5t}nww1|^{>!?SO1(vNm0-9|^n9b9v7Yabs)qq5`6 zN?$R<|8iLHyYn*R=>Fb;$bKYAVWr139L@;!nV(2YBec~l2-KR^K7sj5PAHr{XGG)m zGQGC}s)c1iC$BY(P&8F>s3H+(@XO=fW1vx0QtzUOgEin2r2d?x7ELVZkXO%Mr#)kp zug9q89%M?*hS8_LPVD5-qvb_KbvCJv{p2EXg^SaP6tc~A2n&GF02o26ThY!8DcI2HT75I0 z?&N-+#WGzt!Mh@F4cI@roisT5$!4HeOl&(*X~D={AVf^LtJQC5cf5}1?Asji9oF0K zs4O=MivIYn|MCm#%riwkXz^5iKvdTmxO{1&$4vAhaSX;hBGGJNn9dE^5w?fEB0 zyI2i6Hafcfe%et1vK;i;d~`cbZvl>|Fsnl@derAmbm*nmzKgZ(aCBWt))Q-V%vMOx zR{I8&$)8&P|eBj5YT9|tRmSBW})@;x>ki!yFwigzoY7D)9Y zn_+b}J~N@lxMu4{cA_5;Wz#(YpLyVoffq(q%g%dz=`k&7> z{N*YgANs!7TRqmxN9^cxx9yyKYcaV?Det!~nN>~I6LNO!`s$2BfB>XHGD}pO6=GNBh{}&d~5eX#I_Pbe2_9;=Wr#B?mn#zw0%- zmbx2aw-jE!0-9p3f7Fn%jWCmGd{JP+bq^DtlRZ}CQQ#Yv9PVIRKIMcg?QnaWV`R!X z=6cpaa@VWbE*MQ={X*t}&*uXnE+GH!o&}x;)?f$vR+MF9gA-rJk0F7k*4D%YTZ?i2 zv#g3SRVPKt(%O5$iljN>DQW?r7s}e?>VQrVv&caFim5t#i4)1PD+Hm_lT`JlG~715 zUpb?A_LGD|h{bXB(kuHV6i&JbeQG{Ushunat+%b8&=tH`=q=b&i8b@Q@@RcLUqt3{jOo%)hQ!Q8ewSD^S%GmTmh05Hda@J@>^Vx4jk|PO4#MIi5bo2XzKrLUk63cc119@U;I(tZ(sebW+E92hIg;bi?f82C8f~txQN6jV8Wz)6K1!ko;|9iF{rAx003js{yW$ zxqaKR1#>ox&v}WS41X^_gp7;80{@W{Veg4$9{7paz|!_N#wGg8(*+f71`VCAnv1#F zk!Fzm2F=1$bmf(^IM*zo91l$6qF$yx5{^t%*mnbW)c>+ODhB2CNTXKiO&9$N2yF18 zJLBV|^n6OR4$bIq$p4C18O-W^)fcQjK1B|_f^0H!V)Q#@ztb%R0jFq#fOpctPTm1` z{Hnubyw4m4{i4&({BmA#{)7KD!|0W}&WGfxgvGpzCc(cY(eT7_^sl=0cmDO?tu6m) zHT&;@EJX_jW`gMuf1#V`UVVeg6R%D(5OOI%Pt~F zr_l#U44O7%-U}hSTAu0+!recUUkK2>pP^r2C&|J$X9(qgDo2Dy7?QZin%>Vbq!o+0 z(XEzq?r630z+jg$`*qek9v?XNJH|R2k_ra*V;rCFuK>}123x?gsj!E)+xvS=0GNMy zTn^XGr+PjKAs?necsIY*K2Es5l*duPKvwp@GxhZ7^79k@zVDG!O{5?iivZb-hRFoH zz~@*6l9VTf%cHa1p1rFw9J@1nj)3k~5dI?cQd<#=Y9ouEX0|fN_(?QzG8nQ&`I%rd zjUH(K=m6m@;G{F5oolLI5exw5{4{h<&lhf&ZZqj%NcjHjPO!)&EB&->_}Q;vqfI>z ziz1qjTr+-;9Py?!ky;6sG}fQ>8Y#naaPK(`nOKYG!|~xQ%_l14b*1dv@wB_a zzwh~VmnW9;$@9);;G=^i(X<>{r``;D0m!fo6|atn%W*5#!qX<@CPOp#?!1k zswtju{}R$IqG=SZnlYBH$MhWLJT+*C@eRulql`9NH7Fm2+mncRHs8A$wUEb;nX3>? zUNxyxGSpQJ3t&?`L!WGI%z5Sh*{cA@4p7s}!9HVj*(kNd+FwVn9e#M&;MqGDHhI-9j zVl=WkWk_eU+OTecrLiP1LC3nU;_mE=(fo#n^HRT!7j)51_HziCq#frq55`Fq=cw2? zS81U+y?sh53r#hRC7a{v8uwqE`>Okr7W@OzWBw(49*)ymJf_?W=c?EZDz%5$WBPRx zi-#*`-h~NIf8amIVyY;qgZKf;D!N6Rh145Hp*-T@;zh$%?kkE5JS2hM%*k^${30-+SIu0fS?d&~Re(mC0)?4gluRl>PJFS2I zw3%Fw+AZ}3qZ?|BhXPZY5z8&pI(Fb)g$y{Wlfn0n=-Aper`2ezVT zx)WMPnB7qTlmTxz&CU%2sOmn$-9XWkg7%~W>rC*8igN=8euxvNjTMSKJWiDT2&j_m zK7FpL*k|)xh63ZasUPhNK0g|Y&iYsJ@dDJD+de+(KDBMMRykhtr@dssTFr_S^pu&8 zI2B%Lo{GK+NWT>X`VK_c%RaFTJ7^Dz9@(fY+JH%pC{#>1XijJ>oixX@Ie)sD1hQ|owPo$c}0p~`;A9`U?i4zavxe)*>7Rn5(mwOn;K zGmc!nC&x`ezLgN=?ytUaLp3jNyjGa8NS&`3$H|M2PT(Xk{ie<H&bSO9QLPn=WUcz?Kx2C4%>UDJKkeF-t}?r^zxn@_BA#Z`Fr zc+Z5frk$O0pT2lnTRO}$Bg56(m5^Mi>T#eT540j8nXx~6Q%^=+Mb)?FU5itaXk?c3 z?ag`hu-C6vhuhM(wPO!BA?dH{FaP@Zf3_a;Kf$Tc+p4O1r9mzlztI)TQxc>j~{yBmbLj@Y%^}NR`R^f+5pKYsl!9`)nAHajvD*m}O_m5h3 zfzSUp5*qb@@z;jFgcG|73OHFTJLwF-kL$mHe0)#gSsM>NwfFJv+%d}K+DtR{?lw^J zl2c{&kRRJSW0Ch>94SK2=9}n3BXfW_ts8WU2viF`ng&3c3{vqRfP@s>4ivc1FHXt@ zvx|`6*o49FuPdNUvJNrdExP)(v_ptna%b$KWaE#EgXDo8&yPT(hUwNLxG;^)2ZZYG z?U`en^Qt2C5=#l{vD&=;{uchVt2Vru-VTn2Rnz?mxdIOiFr8i>pBY@dZs56-it3jMLADURGt;8La~Nh#TINpLz=) zVctYaB?P^P&{0IIhl0gSOWSf=P$@IOL-s%H*_ttZILXO=9b(fSc2D{2$)cm>Jqj5_ zRPbaUW=?rggRGis*~znR8IqkY=i9o3D**_94eBWzp|qoDESRegi=Jj$JmWy!OXnhi zJBN;PbP&HEb{;U^pB}JQELM9^Cg~8sdQejaNjT5{P0@euykY#J&`Y*S9z1xyE(0Ib z-o*C+^>}-;MX_*tZQ{^{u0EigoKI)lgfl$Z`0cX=-lF3P*bLS1*oiYZH@jTJ)rVIX z%-_+gt`MBVA)38_)nF5cmRaMULABw?twW|!8bRzy?x=V7uwGh0y49)4{%z#5&s={* z(O63GdJ8LE;P?qJ4-l9SF9&#XI7pR}O?92j-*v~e!k|*(dFRiaJ8pVtq75izeiTUS zhjW14kdHD;I_F|D)1C*xOQD%gCX&N%-O^NIag_@!Jw~6mj&Zrs889yqzX2TC3e%R@ zNnGe+_!h%dg!q{6*$5rBrpn@?(wD_g6_@on?=5S-R6NNxFN;moJjh4$VnszhDB2A= zOSMk~i#QYwOQCkW)I)tj>JHY((R_iTkx%;80(z9Tm|J+#f}KHe{~VKljaVziveUuu67gM;Fw=J4b-7=4GR5rdFC?$`j9zJONmd7|ez+Mvue82j$Y08**-N(Q&9D}VSfiUK^YPsf3qhl=;S$klnwW!Cd|7mnQu$DMp;?$ zmO+5d{>i7B&TdbvmU>@eFUTim=xp>1L6IVsTozAxn~B%=xDbtl{9Z@3930fA!i1rl z6D@B{a-_-S`o3q=263Y_{&xIOGz!ReGTUR;Gocc%zU*66)(_0`=>#Snm##Zuq$@G| z^@tX@<^}JLcrkc~Yu`rSPEAZy39VZf09QvMtR&8ckip#ry%v7UweFOlnJzQRW_aQpV#9~@F!jwoV<6!w4$*h{KacA`i4@u}(5An*Z4<^86) z?(}kDni|lr;9>L+;1T@KVjJ85^23BhFg4JB$=g1ToFx!VRr3F4ys1GkdOhEcV8g(h z=76U$8N@&6eTrkEDuV|mQvVd}fjlpQFPe_i{?)q}G}tlEfMSwFnhu3!QkM(B72aK7 ze|mnlk_f4SE_UF%C1_dSob;9VP0yT(=t{ueK{U&{X4`xl>V{0w(^#y*{#!t93`}DN zHoQMgu?-o7--e5lR=RS4X7|tH8_Rkh zys$UO&@EC^>lC=d6`$Kl&;TXCbZH$2$A)lwfD3bPjHbD90yQg&kKD|hY3kdvmbJE3 zSrUoz-!2wwOf+|#T!mA(6&CwQ5@coQTz95Np-a?wnh@ zy+si!z~8%_$Ji1~7$JU%t)<=WAEynv9} z6gmbdqp`SbLZU0OnMZ$58EkDNcSu-RVpV*WHP#RC`xa8HHD=-SPKE2NrY$uddAnUkHR#z)eM zt(>~Tt}x=_9y1*Yzxjjo8y&Yr@51)|myWC^wU@`jvP^xQM*P;iQ8PZT$)T)P?_HGd zLtF0pC8%XLTKGruWSI=E?oO?hEdej`^462qvh2m4HC`oHw{j zjf>lp*0|Fl8wC< zg^X(BC569&hGHi>L2TW{s~EL}vpFvQLRu0i*`u~EYB+n-z={&F;>l)VD-^C0qS7$f zRpH?X^p3Z+U~cn*$i-TnaO-y?X(Q?$R<^Ga4oTcf;HEqJEn|+Zk!NeS4W1o-#c&Lt z>aMLSC1GZ~H?!F^JLz!G#(j~HJ+6}=U4Ql1_S{ft^*#sYBGJL9vKkyJh@?+slrcGj zO#8asQQlqL&0D7Srdn{_4BK=`rvn zc6AC9pc#2We&KDhx&8NE;?L*(%A;$A`5lVre{}hl1~X2(Xx+@d)Ju)nd=`QKx9_|pYq6+!(w?(@vnEQnYbrz*t~74Jey%c)K{z*TQ@ogue!!4(-l-1GSj$u-9pOzHqz6C9-I(qhoz7x5N4g z%R})L?~8iX(bRS6o^y1f;Q1*e=@g)Dv$);?>Geejz~6O1ZbF}h-v+?oPDWEW#E6$j zVsB}~V3cS*0o>WfhHq`L^tu0@gm^ncP1BT23A5bGh zW}vTy1p%+bsKOWR1E8kYKZbiu``&Ubk*8(kLv)@!n&?uOj@Icxmsrt`|*~aE7!%y*GFQVj6NPPII{Ud7k%U;q2T_`b-Lz8r$Ns z0QuPrjd(-3f=_FNW(vdoT3Xanj1N0`eeNVWTtCgpdU(*Un?HDnUN|y`9ND+1g`RrW zH7iI8eKqHOf1u9pq<@hQMD`(?rF;OjPq#Q8$7ipht;LL4o-ZX8(&_jO| zg2$(6AnnK7N-uFf4!cX-hM@G542P0FcFpsCTsdU}8l;%%31ky`oE|*#PUXX`$ooRq z_~(3fd{AuwR_S*EWK>^+kYev(iFGycL}EIs_C;lDQ^_nibn@PHeb_6QBVb_z064ZZ zordJ;4x8j|F)`n30$173795OU(*AM%y9Pj~7=a~w!zM(9sA;+ka}k#b7vhXj#N4?~ zqNY~uu}c9uDw47&Je_Jro$AX$v~Kqt~K4KY!i#)#eT2 zRrcmHJw7i`;8;Fi=3fo46dZ%R1JkuJL#2rKNKPdYr$|ACdan6vEUs0Lc$ScROBzB; zu4$p#HHzZNL6Axho>hGGQ8`ucUd0`MDawmEb35-g|7zVD4hsPT%gq9c{l~433Y1++ zxL6HCLXkXC{OJA0OV=h{$wB;h6Nu> zD6FrSkHN+_XWyf98%te8*TcIt+c;?bG(|#W&W~xwDbn48g$eg-fpP&=F>E`Mmb|hB zN27BUxL6ct%@kUedv3jc)N!NB{I=v=A1E7*ztXQk(}K5qM0gQQ<_ih86_D#`cMmm& zgynY#gCJ+;Z;}Hc$kd<6c8rS=p!#||vI~Mp4^Yh9xK{UBPF(guEGKL1d(D-=w7GgA zCM2l%{L|OIMN_T2i>V2U4G**39#VZaG-$2rU7Q7c--jQ&?8&0L^SH2Sf)&tP8nMXx zEi2an6w#4t@`zy!?K7kf^4@%Ebm4mzHt(7G!{$;DNYyTqiIKyFTB@| za$XUN<#1y$m_N>c6Hy6squgU60s-tt&9`+Kr&jFN&W}GqJ>NaX@Fr_&@;5qzvICp7 zR+w~$-FJ2E0p+v7AXk&}62`R3?(oUb$s&})E;wXi6Ty(|zV96c!&FLGc(rn-?A@s> zaaivF;$!u?Cx7P3WIq5^;zNlvdVqVGTfGYzo4J#AUbVHO_gpNi_I9&OuOLz=*7fTH zI=LW~}#k~{Ti+;rXfvNVs z-KBQ;?a?&(T4Sw`)6uyZb(2T=$c$jegW+V9=g`JSsBkMoC*GW5RX8*$i zKQ&5GFYc&Ac)c!YR_*WktX%GBv~_lm{e7<0N}%e_U;q$CLTr-pdqjJZVtxb*$%$uV zwTat89+kdbkuor1vfU>h|K@d0&X;8F;{kMZEZ?PQJ1C zR-5)+=WqJd8nT~dst@bG3CPa@%}4(hpZ_}$j{iEh^z-|jDdc@*X6AYK~Tc(MhNX@QzAuPj6cY@&+ zvbWc{nq@fdy3osQ!k8ymok9ZY%jJ#U@g6@#>h^*!O!`Ip--KI+hm#-o(ep zeLNz6=9A)k0VHYzkQukonDYu4#C!+kN;N4E{M6URBJ~+KBQ!v(K6(ljn)lq?AVgW<7uW0V2iIb34Y^~* z_tJ}b*oEJG_;yKJ=mqsRy8BceWN$OkA45+&&M_)qEE?RFvQR1+Yr18NuG!hD<;c6J zB9Dl$nS(|??HmHdbxl5caprTGma*j9;3Qi$iMWU|HIsZ|0!?&@BaZNreE3@f9Lf&{jP%M@Lvu5e?0!x1OJuei2Lv3 zJ^ZVm_}>ap`yZabPj3LC5CJrOJQ@bvF9p~!ihnCLS67_&MOSn*;(F1#SBZ~emR8># zmF8aG{MoH*af~&nBsHsKucWdg=Z*-{9XyS@qpTOm;^^?P+F)HkMCjDRr4xqNA=)q? zbAh)8>JHGG4g^NHSW2XZeUm2IXGT2zZ~XFf%i>ic!ds-zu6wrpR1d{atTf0VEIgO1|~3;a+S0d(00eTa6R;S- zHHeG7r)?{0Zd_@zS7d^_(IzGL*)~{Xv1s?}s7!y;jmm*Z=%_JzfO;4C46t$Q+GKsD zi1+co(LKRtmwV4jLX;FK*Y&v?DS7=!lsQhw&(dh`&dH%_N+|j zEyCzhky)d<2hI(bZ$`165;3Q60W+~S5C1ZXU5>Bo5L1sXKnM36^(ppAHgEjl^TkK@ z{VZ=C9{lJYoWahxO$208UlmJ8=;!v~2PaQdhBsPsxbHi$DNx9dU4b^5ZiUbIAV&!C zsTTwYxqzjl;qw;$Kl#_1Km9a;57nrB$e?m(QXT^nXyO3GIRKofM{N{CQgP=%w0Tt5 z`P7z@qLrFXO%{~(4)^tf_}ReZLmHbt z*e#M65J-Hs7!3dh`HPT#ET$5pgTOH=)3TAGi~8vBho{4m`!yp81q!-Xl{8mI+7_Qy zk+jj#%7zwRH_DhVu~xjrq_*;8=?v7h3hO$>Ehk$fUpFmp9wWB_;x$_P9B}7|ED32GVGMrWaxY zk@cX9)+ARveJ_~v-jQQ)>=x7d{hZ|LC4pD9$v617ew>kkUv}Cxd}q;{kV>0|ZtV2yX&^0I6YrLJ7i> z;I%vOCwVAf@pmHk{-&T4ZAAV`1V)X2XOcIH;un*)|Bs;Cq;VStP2E zZ1SN%t(|Cd-RCw1XqH`b;zXqS72D9EvgxkL>%3_WY0oLOb|2;vq6Lt-fOvWbI*Ohz zLf67^c3AkM1IVUGCB>AQrmZYeSGAx+-wEQrC&KFw@?O9E+AR21^KHZs%WJmaoZow+;HNN~}OO0A(xVy`d&*pEL znMJRm(;(_e0`YF!EH#m2f^1J7zOqdih#ql(v0M|ofDv|#bK^R#13w;(sTDE&@T7>W zTA>L!zhKrZh7b#?j*nk%DJRMUoK9CL*G6g+ScwmTpM|Z14&8|W`@1qd+5Aok&fie< zzRr{3tYK-A+Fkv=>XKT+wGQ{AdqSev3!s#r`99Ja1VvQ}0i@{jq9OPWfWj2giL8N5 zwjCV<*TbYKO0*B7McYeF<~4k1>0{P__T!&ug3I{qi!3Vn`adZU# z>5|1u5t7tY?cjxWmoT=^BxmwwO11A%aB_!S_FmE}iq9gNqz-=n8{L;Y7MNIsZMsQA z()t0lIF)U&twy%)X@@wAGj$#VXK z(zpJDpsY!MMZ)=b^+dt=qBZF@NMFGk`j^Lzct+Nv&F1m7@z7>OLDXEBC^X2Raa6Sr z^~^~>*x_jIvgTQ-GlK$&R`eXz97zUY$f}%2r-HtCpp_#eJ%B)J2Kb5)v-mSY%y z%5%_{d)s`!(Vf1GjzzvF{YIzUd$V*tfOI~QNA{L<$Hut=M#J4M#Uj<6rh`5(Z_+4HccnP#nY1juwbF&|XDx4Bgr0WhvSw%^`adtN|&UP4wH zYPyZ($WUvW8I<{fqDtqzgX2L{?Biq}+b)9NJ99Je>v~<&m21>=!>Y840-4yN0J{Cq6Xs?O zn!!x#<}6V44$&hc1`p@qENe}w4>G>-+FQkk;A2JVwKn4!zIG*FRWj~F7W80&Os4VG zga|FGbzSJ#@@R_B-GlOCnqiTBjbebCr}7~AH#%SVnB*Rf0^ePwVSqG) z*%lRe9UJ2q+2tXXe{Lq@=>G0;B^4W*WCe-|627>5zI}JEGV{+4$8EY_?`QbecUq1D zxVC>;o4?}_)ks_qk4>L_8J%aX8G{m{dU^tz4E+YcAB;x096u(o(CVCC`TPK z{bger{vti!4qxC#|3&`o!2i6!)^Xhb9`%Q_af5QPV#Vks+}#<`Ji$(kZoM#$gAVCnMqotF(YZ^L?jTS7$r>7 zzKnec{7QC?J5wh2M=lj9kH%_4DaGr8lv&0*7ACJ>DJyiI{VqOWxY|y*?rpAvJ2e(fe)l+TXE`Imfw#4eb_96Sg+waQNmQTG^K>5;lS(vj9{kSDB zITL?HQ`4~N3BPA)deV8D&78;;zBz@D+Z3dyV8k|1bTtQ2_1w$L3Q(=NvZ(w?-Lh;G zOB3`dNogX-ov$kwL8*rjKy#h9M&lC|pVII0V9|%*F5stNHrRP@a4lm_`Nq)O4fZhc zy7c;Mt)*nkqXM7hTqeuuScU0Fim8n-rFMMYJO~kC=k=yFXXpNj(VdL^bT_n5rhbB; zE;*?Yre$F6y@H;9f#%j#q1>cq`?a_bQhGQy77sG{(QcjFo=Oo(xx?fZxjJbXSEh)x~xA}KB^ zOe+va3Ff#2g5US$MRPoEbxeYB{X)7us@lKy@$rOXO$LsVFg=lX?UoP8T+Z%fao9&N zE7%nr#S3SEaXFY1H9W&BFVP55j^2EJ+{S^@*BBQ#xPg>YTtU%&->?Xmyv~@Q4D0+# z1L;edm|;YEF3tXI^w~g!-BZO+f)~Abex~b@Y1%)#OaC2(`4fuR|LG{qe^b#~4&nDA zViGHLh$VtkU*t^F-edLy`iCrx=-3@^wE>}%M+9$IeZ2Z+e|fqr5i-ryZt>k3V=#u+ z9P+Ppr(B_y-2|#KksQ$JUcs&qfS?lM*XTqV$W#0hrRnK$Qs!V1$YYyx@1I0Uju`vR z<{>U?43|6SUxVQNixAcFx^g5>tMhL6wR`M>rTN^H4p+pYUAfu?n1nss?pu+!gjelD zTJHI5kX(+^w;*J3ozhq7bf5vo$W90^5R-8OsIr8HxTbwT>=i0Hho`T$c&U)uKJIab z8G@Rh=Mb~AlRuPx#T!Wf2`W34TB7ZZU$2LO@JoV?3CY`3-<5lTPnca}i#kp)4JKm~ zkMq5za^^kJzOvR~`PgdDaeZTO=l(sLP~E3!mgVOYnPxskGa}3L$f^F3KZUF#91`yDE<;VeS|FGks*?VrV5U%m^V+WCN!{l zHW^$qx>+ggebJ&)ZC9(HJK_`;M3RNz%sHy?kXVX*{(5HkspKGEcZs6GVGXzRLAH;t zZKd~J1?Un>RDb04LJ;s1Z8{W_HXv5RLXaHubK=xU;$o;U?zqUQ=v#%{GuD)dm3Wzg zWX0>Aj?g#9nDCrp?kO<2eqYl>(bwN&VYYm;c6OGX0}tn1w(}gr-@`XB)iD{9pAO}OV!^e9l;&223{se9VK+ZS8zUMDaAG)?*JUQm2w(PKZJ zyNC5TX&S-N|m`H2tDNhtO8cT@u1+Y{#d0?es)p)7ZCXM#f@p zFA5*#+>G{uW?03Q%DoPIk4z`CIbVkiOf9TKJuFCcCFlkkX0@|qiemz@bN`hSfyvUy<#1P zDjBTZuhGBeUN&0tq_Zwv#wPuuFpd&UjX~dJpI*WKM%Oc_-i78-N$~F^ zHVFrXSvW$s1x~uLY!Z?FcSg0J*UUG4kD)Vldq;PG+>9cN(#GGBOcy{;X|fb!Lf*p` z^|!3goRmAP?^8lMI*j=>TWVTCoRD)Lb z?lZ6mH5sZ8LHT0|0=majQmg*2_TD@m%76VIA5lnlvKwVfwvr_!qwGmSSz{{M5-MS2 z%!m+Tl2C+%=xxis8@nR=PBBZRWSODHU9jX|2KliOAIvTaEfXWVEbKDdY2X%e z^|Iw_uIX_b@khtS-?k@}>caXsZx1ql1=6jFEfvU1n-*dXT9 z8&SK1iVb&lNm@OR_6@NMCj4lo-2$Hw!1Uz6Dbhj=yQ;|+&lkfH3QKm46Khw|4MDYg zELOeF!TjGktzB{=+>SJSz98{l-1S^m_h5;;s!iC!XE%jOeCChupO>+{IvHa%S;edV zVwkytvgNaoIk;V$>!48Tc=t~jd$J|K>re(7jA9_SLiLH;tiR{1?6BT zBP|rXITE(~B9wX;PbFF$l(-P9V=AWM>BVzzx3@y|oTnT=CO}#O+`10p8Tce`ESYq{%2Xh z-@N|+wvG2UU;KNVkN><)U>Ui=*YFco&d*4a3}i$D^6r-?>>jg1fVzD7(}37lqhQ$7 zt0Rl72IUPAHl2TQ|J#3mh~}+-Cs`6>@o~ni849t6u9-A?Gt1GEzZ{x)RJ+UZ)gt9= znb~?bRus)mmquwVNWJrU*Aw)@WzSnre9H!*w%$vcksp5V0_l@%L&Zxxp*0`DkM#m* zzhexcg1L>=7DQR<;sUZ>kcLT{-t;%i(XZIM)Alt!3623tQiU(Yd)aiaMTOCOTh)r< zZ^%l%QJHwNe7Nb!NI|}Y-u}Vx#CKCFv*rFGuGY1U%NI~ssqVw4Os;(^G#$a!1tpcY zW+m2@xvwsoNATwv?f{;Z7we6U#c(B_f}(v4Y|7rcVY|EREM?iGk5+MT2v9Fv780-a zUia9k7Yqp9^6M+P(zc&$(OP3`g6URSFS0$w3|%Vcgd%#)0v`u8HumYS(>%@m)#p|N zPhne~`gaUd9&p2-mM%T=y791Z_2UP{{`Vi0m8ISlDZR}Gx|hwZr>3ssP`QEoahY39 zA=9JI3QY|0^xc|v{+7(KHqgd2u_aEdg-4*JCyODX9nKKvO=)Tx_{Ng=fRYUFPE|F$U$-q|v9VnF?x80)8>xrmhuox6 zLmUJ8*YWRBzsjO{V(;YejDN!kqHKuIancn;qPKY6*hPEE*i+B8pSmL_Tz~j|a-8T3 zLdEQ6`zQl3hSu{Sy2*}P)s3$E7mWGe{4_S@9KgdZ@r+9}tzKVWLgD?A&hkT;$VDUe z5l55#Q_u6oU(epe`?)M+A3JUNQ9Sd0O~HKYI#v}^bib(GCWe>deI5!fWgHlJJ~~-Y z>%Zq~F{^h}Y70fIbCC^wc(klWlLNBrvU*t?yKm*@7b%kj9#hkH zrxY0XL~3$DsvE~h*LC6J*M*u6cjcEKm%U@(bhA96;jO9DVf~}J^Nu0Sb!~0l245yK zs{HHXS+CI>6#X zPJ2=CD@7EK?x``6)YHu8Er)`oa73R~9c9k16RykcRKz+65sFT81 zOUdtVF-rS>!uHd5mB_!QzEynWL4CN#u29Ts_N49UGpT7=(YJbP3#W}gYdtxKR*c+MJWC$PtE_)?)}d}{2#sktBG&r zzXiSj8pJ-t;a z;)qr|-_>s#ONAkTyw4f8rj4Dc=nkz9$&=k8S(E$rzr3j6=W*d_6gS5XKEuX}h5@R! z3Pn~c@xfA>ONgVRuhP2zN^{QSE^Em!(OVi;nRdw;j=tJpW5j0w#r5QH{b66fV;%qh zurFm6-!IqUE9#Wm;p233R1gBfM+)648 z`}S(p9W<$Nnz(d?(?HVHaN3b>_1_7JO8bN<2drWp3C+H z_SF$GtKqM`9MC`c3y15^NA!=j{a)0h%eEZ`HUjEpzc5Px5$G!etfcF7w4_4~r$O7Q z)nCz#e>0>Ap@kqU&&q1f*b}d&=sO_i5M7?mr@0W9CrUo$Lh@%Cf5PJY7>E2CW!|H7 z%+*#O9G|SbUNI<@Ab&un3na-ji|MITDyjA#j_Q9Vp zwx6((7`NYY7tj1#$M!#PaMXW98OLsSuxN{dFnw*jRK0|PQI;^{G8NecPX0@k4@(~! z2d!Rlc1XzlM00%9Teay#xpdPzFE>O<1> zp3#)FXg)5v={v01MT#BnHonsPUW+Ov(T(Dm+$IMaK5K%8iMZHY9<&~_tZc!>2oVu- zNy}XNfU>bdmE2)}kRUDs=NNsHVMVgp4c4+4*m90)jw^l3e*R`_3vYvF zj*A$Dvz^yl`Iz5>q}(W4l_-PqIO^L(A$Fp*a_739I$v(kzNQAJ%~9(WAgQk^XU)4-ewXzyGz(s zzESwwJ!Jt{AAR5O*e7>!oBe$~i0X`(+FapM1GT2K+OKu#YtS-jCXHjWu8j<(m81H) z;C#Sa2r-UQG#QGra^p2tCD}Y(h`H;tSic2x9s^yh&qI;=&C5LSOu{dLZ_U`A@(*c3 zN4i+2jEPw0lh8QC*HpWTQY_(7rsXJ>koyzHz0yy{Mz1dQF@xV}vWAhFNQ&EfB0w#` z*c2KTvZi>D^cX@}ECC4}>>PhrCF%;DC6*Ka3(yK!9^C#lGHUv+ z&?`?*^YXB{D@)kqXgSGP_9f9o>1-%?WEUvmA zNQTl+n1J>oH{>zEeD>89SG&BG<2_q8oOX4=DNr5sb3vwk3YTqf?)Lr^AxgzDbSoIU zkFxH2;h|Iv9Ly#Z!FGX!y2Atid50g+l+y#H0oFm&5$9ZQTcr3;*zde){M;Ha658L# z5b2^hK!W9rTM*!+bGSxGb!PIQ#YZ&k^Ib5B$6!K{DnK64_OfP%p zj$c*II}xC^cEK|5elLx9zb2r_4`z1FNE_UMTYoGi4*stX_W$w%@%IYbSNQ+d8wawu zCMh1YXOId_wY z@8JpiE?PDxDLtmi042#Y|A8@pM>d%c+0XO6HFB~3(i9sha|5lXo+;vgQiD_wL}nU- zM%}3M*p9PUui;49{out7%qwioQm2(>q@i5Xq&h=~l)L-$t%A0LlmOfdD}@XP-BDv! zB5L&eW|+OD!qr_dcais%Kc|VXZSKdsUaW~*`9Q$U4%5)gC_{NDvxsC#bv{GM0-rH|H7A8JT7h4~VDVSO%@C51c=j^RGG!+^C1lCp$S z#G(`^-pK|kR4tz26-^PJMIZX9U7OB3G8aB_hdGPFZ>-qI*j3QLiEi{Ugvm4ssE49T z%IMLY=clznIO4hp!w2dKyI^3f9KG^9+H~Y*GuJ6y7xx?u?#KCOhSpVMd?g-MeF)W? z_-bn;t4jA_^(|7S@st;M5((RR3`}*$lij1K?5yK(Kh`*Fa1$U?*r~qv-*ZBLtmk?y zHq4UeN;ZEivUUQ@YP%Y<3ZsQ~eF@It5aOB(d;R5Gd^FHurSsCJwE& z<1vY9A(dutD&s$HiYDgs@o@aGVR65sUqyjLhnud93Z5NgP!;IN$)(DYM=5tyK04!X2z0J4ex3Hu8FR{7n~JDb(KG+V!>i~3IPTCCS( zh~Q}M%u0+PYYkQ1(6e?awDKq?%9qmnHS3hWWkFPSUp9H>Vh% z5vbOGfbE6y>UVJH^30cjQ+WPYId@?qqN9s|jKb{C>U3F5Fw|IB_Ckt43A3W>YB#^V z^mM&^r>fU03#B+3b-#Nb=i)=hJ}e(-K&-@a1}{R2-gglMz*!M&;V(voAUK?m^C)tA z)%ntlTLF0Q>ok4s6s2v|$42Aj@5gNSPI{zq5~lzr5)caEl(V_B9>lFk{MA5cAADt# zf;|Z-limDIR#TO72@y8-!1}{?6zw(l4K233VO>iySEw{U(pgzmozz^+{uT3kCG+3i z22|mnF^s9how?hCnOK@H6kGsR_c_o2ai41`?%O-$%I?r02|16CP2*XEi%Vi!Is9Ydykl+4-(}dK^-? zK3{HkI5KG8_ueTmU%6&|b&zg@ila3G*40lKh^VF-??no&my>@r z($Y2Qvh3;}PgY8B*fr4tr?h+?$yhaGnMhf1klO{BI6M*bp?Xw^V_xGal?b8;_)G;I z!BPfus^Nij&Dmfczu|APS6#Ova=m}_^fKR)Ip<1x5#Bc9m>F3v$dZHwX@7^AB6O~3 z(MQ-OY3vXTd#K#xP^1>3{`p z9B8$jJxa7<4d1#M+BAuato3)bvyr*dCQ*|%6=AJ>YNl&Xf{LBqrMy zseqY7QqHdPqXn4vS>k9EGqYtEUZBOEy5%_XH89FuqM@0t;8M6&CXl({`eMha1Ezvn zC&LAbo%I6Uy@}?lee_TUJG06Vj(LTk*aw1x+Ia%)Svi3qx}vrSD?c7Mng24=shn%s z8f~k-_Z8*A=&4fC{uu7`KsEN&e;SEbeF!a)G!sGdvoVQZ5X}Vzdy^K$=X}dq(v*++ zr5d?`*x+`H_YD_JEQhQvJYm26#Ia+srs7ZcQ5d*J0noNCS`D*>#gB$j;T`k-H#!IU z((zpDwZ-3tceyT{S8NHrxc)l!yO5=agK4soS1>y);|%|3KNShOnO7n}$M`y32GvEg z2Gb_ufl(GQ6tS~l$TfoXijJMd3>3S%V~aO0EjF*v5mOp^YfIusb8FXET`BW4ZDv-B zCH*AB{Lnk!Ihlmo*o>m2EtkQS(n=R6*L|HWFG7H*TSY!;leXC2$mU=~1kh2|_jDXudVd_Eg33+Z!q0phK@ zdJQG5ypoc8W+G`R>f8K;S5^H)%ol@DTZ`q3zQlcZ36=dT{9CJF+RFdSJp3;o9ovyI zh9HJ@0AK8lh+a@)7Pt6O>S^{<28Rf(yVu>P8Ju~`tUcE5Zn{%SIXB~MAMs#oxKi%E z+tF#pX2AY=VL!7N5eT32CWLl?Bg9jz;dkJ?LrK)59oJE*4phBfH?OsQ1_%*~t976s zO_goQ?G4HIxaZBJQ_}TA&m)h0p*@7a0r2wDkD!3xAJ#Xvt}e`ndIWhWe}vES(-_P$Ic9ThAf%Mb5IIT=ysbS9$47D|p@qqa znEKG9JSh647{V*_(Du*1s{!(<`VJwx1czbrmT@Hf{5WeTFWn9^l?!~7Hx^P-?h3qP z41OFAO}Q}xe{#h=$0J$COTLVmer$Vuk?+a5{EZz#&L7m+a|G_~hJnEz-^FOb;76@N zAA`XC&heGHwOUUdZ?8ApIl5BAuVyYJDfQ)X&pgpaAR zz77$zoKwzXfx~LY&kh5pMX}4B8=!eWmH_-v-Qjc87msNc2QA`J<)`vRl&R~LUW(zx+VMKYRmZT zAN1Led^;Q(rdJnwkTLS+_9OPFf`k2;Fi4ohzcNY!BP4;S+BEGvR87XsA^Wg3>J{C& zf^H0hYG5GqrM&izl!(E>7lEtCWG(L48Y#@lH>&ekT+JSwDa1%eY;`-h1+Fr44fPn;sEAc| zLPauGoF({W!Js;Jo}`WCY`JyQ54l^-!o$2ZKJTG~$>pLfv4@b?_o_D*oF9h!)Hz*2 zhojUIJ%n+R5>uM7AVK9{ttRn{`1oDbQ(U;yrZ6U&V{mOWF4j@u8pqXe$4~qW=|D0+ z7gWOH@}-_2cWnX9W7ODiS9+UJ>@;7n{#tGJvDI_|!|(E2k$kUguKegCuCD~qwb7c) zv@-mqKu)y$7y&{C5?|B^6ID_Q>vMWNgLCw)9*otrT~3m()L54XGsbl`r#ptBJ>DxX zC>g!1ozptFdy5h+p`hG(tMpcG7wAV6XxnR8NW}BFb#v8aPEB-|uLf`neBZG8z~7tz zqw{x89f^HR%sy&8xn}UCIh^ZKQ&vdmt73ND@b^(ynEx!NLG%sU2lCbIwTS_R};O2aRn zoJ22DhH27cc)tqhurh5J@}!%iEvQKqQOPNU!Qd7NV#RKEpBE(b=Yt)-$GT~Drq|VW zN3U}2b>0?My=`{i_6TK428)ZA0FOq<)FS5&bz&*@h`En8BB)f`v2uoISQyp#bRc9I z`=nW2ZepkJm92vcrq6ad2})H(9daM1Be5L^SX`KCgy>D=94|%*Xggk{s-75qKe`GA zjqIf&X@+Hn=^J6Ooy1I)OAYm#+}9qM^*B8!xcr`-h>OBfn$S{2ETn>D2;n+&MbWlo zu+T!QLzjjrS+-QAGL8J=&(`HYpD?IEXX4K5{igd&;+@jnaBuG)o2MOuvMEz=NH?_$ zF5oq>ihZe_JL~XK#=*a9K*+^c*!A6>6(?(vVspD$8NbhgGZ{2ah>gw;2|H7;9Vnev z<1^ILwMsy?O&r2IMOe8~m7bD$gTsU6b~yIIV8vS9`!sr5guzlY8Ux1m%`=VdDXnqc zi}#KoJIeyQ&0VK3FkiT!LOsR$!}uxXU_a5sK@0aY3I`Ov>^AC*dGV14+=Q~LnhMR^?NnPGtsKTitGApgcJj+}jY{b*9x8EU3~WMNjsTyv{erRad$gYZzXKU7?54wHQH^BX1#> z!0OjUeT8qPK(}d6;1uNaF)JE+z}^VMk}}D%Ij4zCFM>Uh`iBl>b=NaKvnX zMBpo!{%GDe=>6+r{s(L1GhLY>n;o~3MJegsy@eES!HOMVm`s(vclH2HFz*y=5{xRY zUu)!unK9ezi(xXKw{81`t%a|Ep+M`i^W7{RAi;NYQNkw(=+{*fWsa-ssG=05E^jEJ z-k#`Ik(IokCn#y@yF2M)%88h9pv8J zn(2E6j)4_WB9TGM47jV1{Mzhs@%cldH4_u}YV$qY%r`cKL|BRvFOU zp=I-;LY|q5zl4v;t(^Gres;@HlMF?wNLCCbdbUkBq+OCBeloqivjH4CP(kT2`33yJ;pD zZdfF%@XJ&qv5v2>)x!+IL|P~$N)7EqiZjkphsnx4u8VPJEa6?pR7p#?U)TP|XpHTH z-tDn+3W98suMeh8o(s8u&f>?$Kgodl1+!;l1#SHli3+seG#o5;9`L{ZzTcK+5##Cy zR0p33zIw_JRAR~(DW`^aW5z)VoVADHKK2t9P?69inq43B9^VAnhLf(tZ`WFsmesdr zuh#xD|BjhMFfn;k?;-1PK-#~&3#`6H`e^n0tSh!Da^e8#h5|qPyB@W z;Nw$x4gHXi8Q{eapKcp_eFNXNQTFu{e9#TAvUt1Uz2p*L+}J=0j_tTPPVzzt{WNrx zjO|&EW*w$#r0jT1b_*g5Cu1vJyQf}iyxRR;Qo_zW$TCkqQu7=SS456`%<7wg|j}{6GLM|Shs2<$?Hr#Ov&W7;7&UVrKn2$?=iW+|m za#v|t8+`7wqa^x=C@mnJrJDWmb9ts)FL6oB;^mMUnLBy|t?q#VpnL7lp>R^@7gb57=|)lhtmm|LiK~f9n5rtmskIj64ICPm_9YlikcZX}s638bFs} z=kGo)Y~Y4J6jr-Dmv#OH4Bl|ok&H~h5}qRJ9alNQnb4TAh|6#;^w|l9JT;D16|)Lv z2x`pgF1v)r)qJoID{eQ_b$jd5Vy{*b&8m5EqW|;P&_o1b9tkOb$mn|g5!xP1;meAXC7FJ3bUs$NF@DnLRf>q7j=`m%s5 zz8x@jqv{|mi@Tzju^TDO*fC|`;Y$tg)|0eI?3%kxk9hJrQ2KtK{}nlGy|s2#fr?22mL_6n1)x}4fIzRA$jT{PhOqw*mf0kNt>{0W=!qggQ@>fn;`65lHL@OLX1 z%Fj`m^QM&}HJ+*cbWd8|jpX}**fimb>b)m3?pm;YogD7TjS0aD`?u|MV^~ob?uS}N z7aeLS_cGt`ycjMj$gzJ{_yVi*)Y;H@pWE#QWdq0K$W(ykFRhxB@N-BOpCP3MA&T(E z3!v4g!*>v#tw>8MHY%9@N^^VZYU%OoB2)Es-Cg1S3ik49uW^r#RF&)z{T8~qo$ib6 zFlPu;ZO&8TRscbetVYEu!ZPG)&??!#z}pv+;qT-{4v;vYti&CMS1ifcv@^KjGrwV%1)`D?0RurXVh8V zS^Yv<`MA%U{*b2jDwrh<}SQ4qr-+BeTJDZ!Z?)LIepbof05x;*V>Ao zRUa^0FVw-$v4t7MeSEaa9`=e9iLm}uaT}0wqIy|li|}Ag0jPq-4Q^PDda6wye=J5~ za;;_n7jMt77&p-KD}C##Zxvn85rR|7ldP(W-_a9tBL9hZbu-ujKtd0IJ68J}98&SD zh(({%NGV)qH<>Wtn7i@3*^i`ITljdi@J`*#lJKj@2QwS5uHQG3gL~K_ABQD)(F-FN{_0W)#H~p`F4ZiGUsj>1jS>G1LmLN9c^2k zTVVK|-o5{u{tpizH9{_yVuhXYW9?+82V>r{_A$%a_}o#?H%~ANba>RYJIK}^r;_AS z2Sd#hI@d%p)E7)W<`0wbKB`$1%?|t>1kblz0Thl{)LFp`g`S~$6$fjIEPis4X)Tx= z{5%v8u%O`3@aX+VOCG&rKI|U@=a14{nK@XGVQBA9*s27@o^}Z`eFkZE(sJ3*e%iNA zC;C@jeq3|(<@m|>8JP|{pT3qqbpIFbcJc37EN&fOT`Is}&N426zY*x|%sfLiR{t3& zt4DIUYf#>4;=^={N15B~d3Vcz0q%ZgsY*&mQeJmj^>UoJvZUVziF^^(NLgv;Gma^0- ziH!RyBRQz9og{2BPOho0tUq46CssVoPT>q}=TjKxHXvn!AT;FiG0xGo8NSSPEa64& zE|#R*@`4aE3vG|}r1Bi64CToBBRYSi)i_kU8*hUdG&_;6*It9AS?@oPmA>%BdE$fWqt(4H9qC5dSzNZG=&B&4c5b*+ zlfqq(6l2w0S}FHU!@Ohh7m+i#4y-^1X)zk_ksEW%CSeSF%)sV3`q=n|iQVUy-iWEd z?(2pPt&DKKK~MsgRtBi~1hEy(Ux&^ke~3nqK%WSts29)he(Iy=^3a`!ii>TrESYyUakstbTjJW< zecSv@%7c|#`{fT3gps!<9P1ozr9Ej1$@dkZZFY|ibBxAW3dTw}+x)5&LkTj1KfqJ2 zgHQm_a4G0DxFY`4#V#C(QndS&+-}}*lIZh$Kg?1It5;-BkjBQ2IrK04HNVR93g4G< zX=C7&u&|}H`Nylg2uO3dXORoN4WiT8(O049=jYvgWJMvoMp3zxt6oF6>tTO?cfSgC zHZK7)$)L#7dzEW3w|%iMHCL4LAbTW5DV{FMP^=zdILXVZjFw@feXq~??bUa}yZL!ul!t*#c9Mo`-{#cZb2q*#wI&RwP4(`4Hh*aa&et z0_{sd(EKQz(ZNX6Nsbl>zw^6g0FC*GMb#u#*tewM+*1bqHa*$A*~uAYux zF|f`R(eE`*Rc2@j zB-P)%UBHZ>;8teoM;HjIY$}2X=4e(8nu!(GM! zo=V0$1!CGR9U8QSqUn1v!2Wi($;~ocpc484v;pW#srhic2+Hb~-TAV0LOn|QX)?(t z(`4?}#n_`~I6o{gq`p5#Dfi$jk*m$b;o0eSm!TA*zZID?;Sz;E_M3Op1DdKtjnD3W zeZ#3?{j_HXmfm=wp9tCLfF3Byahqh&?1BMnstz%h7;C_ggPCsthj%+;WWPw7lWwcBBrxZJjWhkkA-Yg92#znl@{>(3U3E%zBW;Y7JfR|CU%h*fMj1PMEr!VEGRaP zeDzURn5^Z59eX!!lHi>kRjk#vB)2O^HJ#G8;zyT*lu2X;mhvljJ8waKk3005?628A z7tvNes8!W({r*~fe6ZK9P)5gH{ntLK>&Ys2NO+Stqf{S1z zmT#pek%yxzsC|}{p7i)@8P$g$^v}^=Wz?nXS+-1siL{i5-Z=Cvw-YgoV{xTX)>+(X zfNh4qhwyJTCfRiGCm_X@Tc{P?i_*~40$Fx{?n+puy4}#+g2F|e)|O{MjRu|b1)hqk z>zenFmBTCXbQ8Z2mJ;(R!V?=Odt{=N%T9P-KB4T>-}&Ht=gL#r_UYrw9f;^d zXni>6bD%96N4b0Fgn`=J_Qr9O3rpU!bz!bS^8x$VH*RUp1@*yS;(pCo(9+CAJmFoeLBH3 zNaeoPN$QEA;^HOW6Z6I@a278__hxB#0A8w=6l`so;`F>n* z;d=AHw95RQ;HIOW?$lv@+eHMegjvjzVD;th2<8WQvZ%*Ixi(!wXy46uyJx*x+a6b$ zoH1LwJ+rqZPA$()?~;+75Bun+3JvP|YA~gO*w?Pfj~U64tDY)&NxkgiLm7&>SQL?e zc4Dn!)P1gBT<~sqEbo@Fzm!w@T;VSjotpD{MDHG%qrLnUJ~?s}jTZ!-bInv-TuW$C zVfM$zUQ~n8clBusl?J;~UYVr4B5z&g{|`$0RG@4BaoOKAz^V>miBAz^ z4FoYAK@|E4%e)T44wAM$4`ebyqcGNM!vGJ#ALHi(Z)MREAQ01b@)%Ku8UdhCPpb!1 z2Z5XLU17+84Z~q(Ay%|#?oj2{cT52Dkra)5V@ZyEWZ$zkpI_+_+m!&0u})MMCW&<+ zW`f9R0HbIz`sGJJBQy1xdb7#-yoXEY7DNPsHkM!npqAsFKy5urBSDB_%-oT<6}2A@ zt%0O3ylgtQ#c!QEwdd1(rfdU6p4soo8qlD-=ty0>AA2+m2?fCK2w~>rX}fF3YCkhv z+Ti{!WV?hR_{xl^t%B~l%0tVgyYFMIpJ_FF88<(H@q0XL!I8XI3n|fn&2*5kIE(D2 zWe)hUwBz2?OsHQahw~aV#zi8IH?dW@>-1=8X}#U|5_#?GM=a%{^iQ2^Z(A_hiqNzl zuWi*`bRJ!Q)>PAcTdB4&%ILFpKwjEp+;$7Os3Xxv!lTF|sAkqqf6AfGBWrbI5PRPi zOMueWGN+edsPs8ULI}d1Y_a69SEvqq=4DZ^Mg9g6KE9*lBAnQY~>`?#a%-9%$LcZK4eaG z)2X;n73U_jW82tAl5*x`7B9VKGvTA$?Vdk9a?@W|>X>Zr z8_cp4YGnWZA4yMxULUhmnA-7}uFDV{%j(lIB}j$GLTN{>$Qcs>O3nV~wc*|y1&5l` zVlIB)Eix~;ZT?)S^g8-56i&3cv%o%PC;{yrBF&qPl*(6)m6g{@tSv~PrmvWJHiV{h z7Q+HA8NqIDi!=~papS?9J2>b%T=`&N{S)?V{RN`=2qvXYLNWRE;}+r9M{#(s)MGv(P5 zA-OXDbr3OYnBOoi_@WMDWn;!*$Gc~~iQl^)#oH?}8A~B+KJ27HWs*&-K^Or)6WZs{ z$wKgcUQmlR!}}vG8>-krQTEQ2<%MbPYj>R_y3}sK&JAq46Lsj5yACBVngyD>JFE=% zpg56xk$mr11EW4UM}53z z`HB@YSHtYb*|s#`bDb>r9;kZz*3D93yyD?W*qV`@QLi-&{f<;-L+b_UtCvp>cZNH( zmB%;-*`aL;P-lFPY{gF7Q2Da_uJ50lf284`JJ9;zV9m=1I^O4w@i|2Z(r;j2KV)10 zsJ$zRpQ-!Sf&Vsw@B~qr(UmLdYlxsscTA<)jc9QE;H2T>b=1ukPd$v7RWDmxQ;6k6 z5`9Kb5-!|x^roMKRJ#|2u%7GjaK0AN=MnYJ(+u`f-zMwaCn?{z4$WGN*siCfi3L?9 zy*Y93{eAtX{INB-s6}oJ8*30zwFPE5>)8P~F(!!w7lu@=@zkAuhpZ3@>a~i=s;h>< z-uo$~)_W{yq_?j7tn+y75nOEtFtfR0n8ROKip)oVEy=Vw0cDq<{JMUu-^FMy`b;nE zuC6_6wa3$s_ujyjlOm16syos?UYcbW{ie544e*F>%J8RW=p?))SN+Nq}JyT@YhevBi447m(fEV!Bn z7B6QSwqgqhutK}`o@XYYVqV#9;Is{4uxkg6;0K{E1kOa33Tq5e71}X8&+a7ovCNxN z-J?QI8`p6*kz5%uFMQ$bX^m40ASwnE^v@sIe=@i3=5Sn-Sd^idauL1SVo;`He0 z+`O_U&N%C&ODck<$^~cvZkFWhF}ycCstF!%AVqp7)_&gwi8dV3(6-^!seSWWHtXV% z6Az3kIXB*l*5BE-+!KN>xV%(0_0>(aJ5y&du6AC0tu%1;a$QT^Lr>56iIP0pehY*P z3^J!#K~_ZE%n}(iI<`wuyPyN$W^i5fAXusIU6{(;|RjTCO$`J(ohanPw3apFSl9x@}lU=TufT| z3l(u+jWYkDWS+RI=s|_6u8rDkn_|7|ybOP4A;NzZNto_l1mILBT-cu>Luu~Xs&f~j zBD$@z#jIURs;|@Do#fhE^Tb^*Te4l@LfgsSJhRIR<|JGUR;Fb;#fB)hl1R6?@}&?m z?#0%K%vrC-rjn(ye!?`nlKg_gEggVm{%I1kDai zUpIi+%v8|4m^m%pn%y>cki3YhZ}ZuEY6b?~-MnaPq_x>XXN$*cO84K;QxLc41v?XN z*A?3u1J;!@c{ov4fMS>d3a=+vBe~{K7g0UP7Po3^`hLdw3T;d5keAt+`MqZTCFxf$ zo{QfWc`UX~0JyRDr2!aH4Y3SKPc`?~l{>ew;k7c}LvueV==89xDEO=+rbm{uvU;oqPQZ!zrr!#KU#hHv>PbF?J3HQP>(-Hp z^nT*OITmSn3;IG_z12q>hnVyeC}p$8wrQ5&0z;R2uCVZq;!<;E^7z?k`#K~1!A3F?aR)tip?{26aKw;k$iz z*q*Ih&kEV0ikc_bbS~b_IXuQvfa<$$ocGJrNGks9;-1e}7{oq5hg9>snXos-?7Xq8 zbkyhief^fNIF|yG4CT-+%x4BtR6N z3J)xQS>$B#fdvLP;b>qioV(@7&FmdRq>tg&huy7@bdC>g_6xjO>wj)36UAN|6a$07 zI0q2bvDHK@FQz}Y_9WVT5ri=HnkM=Y@e{nOjwX7~*dz!Z}YY$sO_+#ZK^F4Yw`CG+3+*15=_-ej*Qs6Gu zAd=rekL*-n?QKKRP4zD+m|dv1o$aoQ9gZMYpKo1S;ioHI!HV+t`g;%$Xrf(M5XAh^4GH!e-{ zb@n;;?0xn<``q*0@y2-XkJpS^z1FItR?Vt8XZ@zEewck&1w48orzi(NKtKSzf&T#> z768ux=%}b@s3_=YXlNK1=$P0fz(uwDJf~_Ihkl^+36@LnT1%` zxq0~c`GHI#62iRVoP7MezdAv{z`(%9!Y0GPA>(~Q`GoiX`t$G&fRB!-gG7UbKnp;` zM?k_yc<2ED0RRLP_-KC(`0pPCL?mPsR5Wx9Oe}bV`bPjn1SBLxWF!<6WMp`2KX^R= z86Sn<36C@?p_(ZgtrHP%P<#$LolJEnvHBR8p3lrV7z2}pl#Ki_10xeN3oE~XppdYL z=(Fdta`Fm_FEn0jYH91}>Y2ZJYw^y~%G$-%&E3P(%RA(K=!dZIh{%M*Pf5uspHtIv z^YRM{K}E$SHMMp14UJ!$n!CDtdi(kZ2EUI_OioSD%+AfPt#52@ZSU;v?L$t_&Mz*n zu5WIC(S-m&`WspQpzKd{;lt@dL`FtJM*Bq<0-^`JAmJmUJmEnlkXA!8bt0tY4MHc9 ziO;F-#GvC-2NRn)k71I~^RF>Lev$SYW&asr!T&4D{z2I9bj<^>kr3dEhlCH10$klP z=LTZ_KU%UsBG9km=Kn;HRiAK+;nNM>9>1Uv+l_DFn;)quX*3|nUp>>d1ms47iuP~q z<1mMd_XU&Hc)Hqt3=t&mV&Oj}WiDbru@j(BI6kz`X>LelU<`h`J1e{vhW63g8^D|! z31BWsi!B9NUUuzhbktV|R!MWf|2J8L=509nD&$DZJf0!uP0ZBTx3_Oakg4B42DlNa zJw+kXWV?T-G``gs^=h*0aI?v*ilOI#{8RKBW_o+^*v#BO&M{dcfZG4J3c~gSfGS|~ zleO{1G~PW~{aRX5V@O>`*t}e6&VdlVXWfm3PIg8OC}Zy1jZ^MzLmvc1JBiw-1kwRhq_8#xVm6{a1S5@{goWT7A-ciF?}Z6uxrPt#$?1vD^E7(;{_HzcglA zN1Y^RB*dP?B&29<7Lb(@)3wJ27k(C=QjX!C$GCm6&CsT5^+(;5ABLSluXbpV;zN3+ zR08T?)R$|LQS$cr;fUw68fCzE;s$2T0fN07#wF1(B>Z zbX{?c0Vz8PXcH8r=dp2J&I#pJ-KDH(H6^BuLqLu1;y%oY>YYe;{;Hr=a~D( z7vk94(7XWwA(FH$e@cLLS}60llik*QM%H zAn-~U2Paetlt6FAz#?8c%Ip%;gXq3`Nxogr0ew=z)PJ`^sA&EGAkejYZsW8K;@G0y zus>RoreezkuLQ%MT;ty9j@3~}NFFFo0(p!VU!ui#B1G;u35!SLe-z2aGOqQ2Ml?6x zzn8j9({_PS^gDVYb(^dC1k^1K(|lOQS$HOhF(?s;bc1_Sh8Ju^I1PQWRxUGPSaU~z zX5>|rX|0$vn`t+D*S9;=ADvazcBir^8&_{ z#i?M)bE3Q9k(Fo&phmaF>*Ki;H~V6sODx~0z;|DrxE|5Q-Zl!=ueB5Q=C(Mz804+R zdF%nxYt0GVPO*UUC7Ui|d>9=S-3th3hIxV2vuaeb zvy`NcQ)@V#qC4YUj}|(X5kd(f6FHg>(sTYLs^ezuN@Q<<~!4uUg~~(`wCqzSh>j|t!#l>{@A(o={- zxXI7@82!G-{#g!Irs!#GF@jF4Dgd)@IQ__`-tiezy`WwPppmC{0Lk37@k{tBIFpLt zv5`k21xqgqqXoO)-fBQ`z>WH`6TMD0T42j*y{V=T9Fofp{4zZWz+xbmz1QHL?lg?( zx}flyap#-+t;!d{3^q~DT+Y{aF<)G;3GnE%)-!x7@k@61amE*E}%J>-S z>+;vgae?k4!nU|P=^?$2KzuhTq7~1?Z{X`n`G%^N$irrdvX;D$e7*6}3FPi)gLhrc zafH59ld9d7xO>e4JudsV^l{9K?q$PtsDAli?oOw4N0AaqCh%xa2f2+A>14ej?sw#> zuS1=7&Z*%J(Y4iFAuW_BOcY-G%t(2Vnck>!!rsy~KTI6%6y=*fmQ52z*zG)hDyG0xxVCt;7uk6o1n$>vfuXIwp9vNeT}wUtNuzHO%TSy6BO|@$ z!lcLUn`A~2Qa!}SI%@Uaubuf*3n{Ok6s9zmlg zyxf^*UR@deWZ&3vc`~{yZ1yGW+yuwCP@}uz+%bMn9@*9OISz#~Uq! z#6Xu5Z5aLa*=w+S{hE)2B$kNzlsz@ea2FpjLN1a$nF(~K!bb})x}A8x@d1G0s)}b- zEALXY$4>ddu9WkcJ*KLPe)L9=PCFgAvFC*JKoY(nG1P-3T~6&-Ht$hs$gvc9vydA^ zS%eo(2GI1^;k%PwTV+fx*x|ivxB!m1iC5-Uc&vEEp$R@zn10g@DNzq+L&B$<8f!|R zlEO->;ff>yC76wzw~?ZXl$^fuhoj3+?DZ;N-PJf^t1N>4*j6BM`T2w#!S?s{r>QrH zlmt&Z0o2*SV$+2MaH@%XWx%+l1=nfcN9EfSG=1nlsB&{IJ~9aQPLCBu8V_Xk)bCv( zXni_wUj%zRp7+y%;blAvVHx{3a#Z7VTyK}X*H8_JKMap->Dr~cYIk5-my|TEclHDA z2D#=Crvej|;z1v(b$>`)F9!(@Q}Ga${nTbl^AMo z(y?{C+lt#0q?W1n!E>Nfgbw+Uij7dW6n<;Kx@<#R?YOUy(>p%s^v`9pZT_WT1ztBK zCNe0SYUeUJ1UJdF(kP&dZS9^KW}`+GQ-^IJ=GzkyyN;RIm~&A9)VX%r0OA|z(NklL z`HG0UL;%%mnl*vJYy_xYtM7savT;ZIqzDC$#QMwE3=u~a6wN~4`o!o3Z~$p2xqh@~ zyV0NZ6EAp*sXN(!NH$wl} zDsNKF+9}Z!MchT{`>oov?=T&+3GC6?yb@AJaqX5zsqE&o-TRK{%QQkXwX>Wm6~?Ye zHg?B68%%My^8P)Xf5x1(69(;aDJrr0!Si>o0tkMP9$AM@5h$0avZIkNrN4D#TlDAm zG}nQ=3obvuCm21_R`gBe_qS$zL>KJbgImUy1sUzSyO-~5r*8SlP8ZU1Yv9Nhu1oi> zD`rJfCRqy*l4anQjoZD>6zLX+r8B2o5JTowHpJdsFc3isFkxQAB21hR?sd*Yxo#`= z4CxK)_AYNop3#swv2g*t7$)Q`w#z5*K^pOK-7fK!1{+7U>cB`Kh`X0pLJexHD^{e0 z*)nTE_8xYuvzz+`aeEmH- z^+*Pvp>mbYXATreICTU=ndm1gWF0&VK7iU+p{ zieDd&{6@zI(Vk_A0OGyJa#6FiB|=&`ex1n^q$MyD$o!?Id?L~&qo;Q7`qC`E?L&+X=hwvMkG_NN8TIilfHDhmiT_@y##ZE+b@6U z5H^M2HzLiq3I6YlyE6_c9f(9+-+S20T!Fr$F25=7D{hLn1Xh+BlMRgirSCY=N&;iYp`T?L*A4A_9XX_Y7 z{_3z(TC$rSM*PFlh!!Fj13^;&uY|klxLMYJL2{uiwXUjfjV$Z+HzIcgC63a8{1z$! z?UjX|iOMqqL#1~TMggKrWRGm0ntd-$rU`VK#T9)mNqOxdnYymz=c5lno}W6(sGL0< z(r0JG_Kgk97!HlO zJvpMK5ff0;gv<}UR6q@O=Vw*mB&c(yako-HZ5`lqULvFI)GTb6QtQZfJARx3^V@{> zUr*Fv)$F8YE#EW$)=*=K3wk$r69>t2?KnGO+Lr2zqG{puD!xA%j}wq;yVaB!e*lcO zW_^ADJQh-V07#ztn?o)C|33b&=R;)4e62Fr?Ot73Rb$LN^Hd!>0pqQ554JOLpafgq z1Uvr{NtYOo;53DjPWz@B;}q~dz}tQ=U}stNM?j3+jJ^uCa+Vq1Mecw$zwadMYES;x z8nOx4&n;Mg+q{>*p3pi~SG}dr_bx__qS+P@|Gf?B`hhO5*@W`@KB-8na3(NP+>c2< z)padkQ&rV7*y4|s0Zi>MXM>e@S5!>DGlnyv;dM0`O^Bkp*G+3TwB)rh!4I{~*7_*4 zPm!}914wLVBwiX(r#Bf?+|jRWe%@divh3*ex7~03{lOR&7mTs8N>6Jl0RtUuz;Bss zRIYG?%BaaF!!!pCrn~T*2=5wy=d9@V0w;^tujy^Tfb)(qX2-C9+0h?pjFNmjneKmP zFr|9eh+sw9MPQOxvi~K{#ogr=Gr#~eP8e``aIemE)$zUk+`au5lp7lqz`M?B2otBGHC7+RZZiIn&M9#Q+Bb2Gc@P$M*vW+Nd8f%;utc`gal2 z=3$H~Qbw1b=K3I(A6b4ATAV%hHiAep$8*!eCxz*pHm-bStw88h>CDnS>DKQ7u;r5T zyO3Ad!}OO}@kQ?ow`m;J+4=ASz9e2h{xDW?G0;0d=w}f*tMjJEi>@72MY1riT(S;y z#dSt#4QY+h*=koV;u-24in08m~`Ei7#lrW zU0JJ(purQj7ieG?rE%T|0Ihc20fq0(O@{XG9Oq;_o3=Ii#s1=8f^3&Y^F55-tyJmq zo{`6*+|Og%Z!X`}IrU0dDktxtZVN1@{s3q+J}^-Uu+!h}P|7g=y&o6%TiJ`U7+Px& zbwVhgQd7V=H4A6mmxCMptx5YFEa;<`_yOG6X_9aZtFi;14c75SrP~ay-#c&=t&Fm5 z1ILE7+ zUs`0S%y1%P`mw|_S}hgou93$gD_HjKWO=a?`~cuv_=C(337imJS4#WwEq-~ujbbaU{D2{mM|}R)@3krVOj4ljaWLcaG@hV}>8n)l zOmI1VC`2)R`dmsQU8^;Icc9*A=;Q$q=<^58_B?+q-zyMBYlDIW(;f0+6WYdQ=>S*w znimsF=B>YJh;QzcQG0=&|D`OGdW z`mLsf6Y9$5l$$vIMwALz`&-^`jW8CnGbfy)71hLq#frOb{}Jen`ssVl)d0nb-< z2|>b_H!c2QRX6{D2HJ^mAHupyDxtF7x)|C=?E7Tdck-7*i1KTZHO*nY`X9Qi9t%`S z52mRvj5bWK*E`K9YhSDwH?L;TPgS;_KLCCo&e_ur;z|sLR{pk%wg6*CuB}m;I&k#NUb|v_( zUv=QLniIrv^^PHW2Vs!inpbY9CP)}xoYEzOuKcfH@_(e{ll*D`0>R!5F&4i^SCm4YH-!8y^unU8B%e96PlMTrK%Wi_ir`P^U8d;Njfy z#STiR&R@^?jejAA*2chHz2tc6%5^cDaIRx)3bTf%#MSXxpFCii3xyHuXc6`rJ*WJ= z&zQLZVf#|IQ!V)^8kuDUSb9Po4%dQWQhylMk!t@$XNh9YuD8TUQ;9x`eoA=wS`1|D zOZ6p`Z#tVai)fqLdas=-$UFQ^f?Pn(lWO_uW7`}y!(DG35pp6;LxGAFr8=AIjaYEk z2iNc|Vz3a(<%so^+2DVR#1u1WL#>xyCziql)CftYlI)%gB5hJBD{V7f&774*b>Qta zZPrePWtr&U=0Dh0=*Wxe*gqPa`cNoW$51(>(9Ut#%?0+FQB_; zgm(uwGa?TFbi5A_fSt~cle-5%3=kZ6?Ev$ofIR>@t|#hz5{LC~w3p%hzK4MPhBC4r zLelIi%-*BbVcp!`tgqx5oh!hp`DNP~cPvyQVi&Moxp(VVk@P0n-RZ`W(Y<2bDKT+y zr?^CtA>>HZ_~R|2jibV@-wcw`#5E46PL^nm$aNIyw^gAgbzEZo^y@uZci z%y4%;Uu!yXZ~DXW_D+0aNYhGCYURv|e)`Lu&n`NCGTCxx1&ZNeNMO9|_ZPXvWn>l_Aa_6`6=T@~2Z z#_a-peO!Em740AqfRp5#~dThgrXmOVirRhAxWB24V{_Q+!w({aUWm zYM3)x93v^VI5PfOGn$ju3)MO5iD7g%TA)j3g+;$A1ZTQ_^~@uiBcnZ%A$HrLu5UHb zek_DcBjf!>5n6md@)QSB=Zv1irF&|T)#Liv>Lx`3u#NJiM)ehareY#ZEbh|hQQudn zeW4p6B`XI)gvlXFRY^GtBdN{|W|)D!1D*5<;#DnS#ErnHIuZVsVfmxz}r z@$bl%D43nnA^ifQ?J?^V4tO?WI`r{|iw9iJQA7g?O19%qOybh%cu@iACbwG8{qd$x zI9g4Cv&ZGy8r2Q4Kdc{z&A+jt<4vGy6kL9BPHzHP0Z=VhS9F5py&Nbb-N?!q+hR%N zXmXtru) z&&m%PQ_glB%&~S!N!0RFc*N>PzCRVy3B(l^IT~T@`%n4a3d!h=blh24R)Ye)1okbqT0gUn2e4?!R)z^;GGBX+Ar599`>}y zV3-k?FXiQx^>F|Ajm+FxCJ4(9>!iO3a0S};r>dWH!(bpyYgS^!LKn~v&ojVw3}2I1 z=?b*(J6L=kt(pGDz3fO|UztxO;jr(pG*lCbgDx>tmTEQua66@shpwYzDC?Z!U6;`3 zj67e^6YgI!A`O*Qti1NRD9w=E=FmG)P43Ou;HFo>;$BFop~DXPh%3BkN&JPcE{?Fb z$kTdAduni^cX(o+EQFkxo}lh2DJB59QXMdeB*E$f_jX!c3LajnVKqdlhp2oZf0dv} z`{X8aE%F38Xwl@OO~wS2t8xJrsf$_&i$h&86~c>GiP)3Lcn9mRMawoCFZ#$t7)_IUgUMRG+G4|osv^> z1)8AfkOYx(JH`iqeoH!zl3YVwqvch8mGKP}5=v*b5v(Fj7h4~NQdsF%ZY_GT{hk)? zr1qX&*qd0C8x~&H9pX)Xiu)9aDQARFvsEI;P|vdvYgp=OO82~3C+(8Hz;|8)5w==e zwOZDrZmLCUr^x(-S$T6Qs9!H^BjAOe;sapgnCpt-R((2t_9Z+y!0gX^D1N-*iz;O5 z>~VUV$4AmZdn)jR2c9%GE@KEu%36l-iglwBvhI8y`8x+$qy(!1zenSCbB~jTue16e zbG@G@tISWJ-|WjvveaYejf>P%=Ss)& zY&pK-;L9-k*E$7DJ%Klkq)!!231>t~39qrbJn(Cz!s@^j#R@XOA10BzMa4VGS4^4O zZKKrJF>s?q27DE|qB~ZGO-eGuqi|TmXNqMKO}H;>W|NjN8p*})01vy`nnp0BzTWuZ zF8s>RQ3Pr;-zsfN0$N*=>wCLId3pTapUS`OpidklTiL2YSD?3RVgIDq{AuSj|*}q1}+BLz2^(7MaOVxGjfY@wig1oOD!tqhhP%DE?ERe z{&V0H-7s=mAa}qwGAY=QL6e;tR*_( zl{Jh{>Zz@3Ls$yVOECQIs1>)bNx@O_m4cx8xMHr}*Kom0A(9 z3KV6DAAvAE)U?|3?Ap2_nM)u2DJKPC2QJ)?`q$dT)RAD)x9Nn{=SK2pv~|E90?S*s z-pTUzgK%kT@#R5a&?5oA8rn+OgsQqhzB*uWzw6NIJ6TvWRwj_ zib^`*>jScS0Gvch{-Y6ap3Gqz3cSIaQ>wO(e53AF9X3Cd`Geag3-U>{ZvJi2`1H}3 zeNrWDO{!U@0{0w#H65D!#3TU%V8-B00Wm}ElTu4pSMAKo$U}ZAM3@p`>7WnQ50dR6 zEvtfLv`?Yx(u;>*hkOfa>w<=9p-(%iCj@+=?gX1iKK5K*;qT1|#(zJRN~U9B=J?pF zqU|od`o^qCK4;9x3oq^hOUzHp=8n&UxFBSyUtG^^IE_>t?bEX3X2!PTm*+}o>hKBsa>JLzF5cj zF{93Vd`_XS>`%D{FeOyHS;{Ig7W>zMp_jZF&(tO@LOe1qah^s+P!gWh^^9+4&9UYiXz^OObDjB5P&hZmbvplE=RgB9tcCl zCp-S+DZ9F%40(@R!=9l>!3=#@DB&nK2=c|Fvit~BYDNz5xFPYP9+Z9JV%EWQa--V( zzGz(K?Uy0s<8HXb>SULi*2ed%(b5zVV9(?3g+{&vGVX^igyrLjEt9aN{)|u#GS`PHG<~7?waAR2z@;7 z7Z;x2nr8f{A>9Fz$ycS$#n@$qruQ8Dx3Aj+)I?ZL5gskFu+qD`Qc!}3KD|>DI z5M64|Tj#>FOu6#lB2H>sN^Sbet4Ju;JP<5DIEcUHK^W}EX57`Ng};9~_pV2x?Z2d-_}v2_ z?rX=Q!=94jKQ_0ohm3#J5dYQo*EdeW^GLx2`Pa`;Qa`T(L=%mS*Y1d~Bi4sH2=_5h ztw<8QL=AZHJ_Sud_7z4S07Yh_vGo)y_y=R2K!r~|6~W3XYu@?qa`BvTRVUqtJ-j6o z?Q*Rgb@Ui#&0b~u6PH}k`IpW4#CK@lkm8f@qel|U12El)wB(-161_tBdqFZpj<2DP zMi+o?R&C%UEP&8Btf^~1DoAg4j;c>bWYV;hR@gS+B|slf8ItHK2j z3qHH=hj37kfEdY~{ht)ftD*Kjw+Dd9G|q=)2U^~npr^hjvF-H}kI-pOabz7FsLG5C zo`#NiiIk`eKHTa<8P~~Hsv}!c{I*H$z^K@^d7R@FaH_+=v%PJuJn<1Npf-N>~2Hw z!K<&2dJN<`SS;Knh&83zRkM+QqKaNKDf=j0S8{SW*mGqHrJY(m{mlQ4CyAMeabn;b zW#WtgH@Hk=?D)`jS&MY1U<|YMU&`Q*gOkuYRgv z%1!B@MTfp2eCc~MvRz{|YpmRIn~I9!1{K4*MeEDU`K{Q5J(jO+kyd#os6T1vT9`ye zPf&#=@Lm9#A@ZE!17na0=MWut7;$9x)4Fl~Bh^>cu~QMctCrBd5l_2;*RcUDvs%MT zOKqX)Gal+?THu@nMKW*+s$voUkx{qiIPH|}G1Bb!53)(0vgi2{o&n^aO$XA9xw6^e zbH3CtFfcGw+A%O#{A$Hui-P>|Z%N8L6tyvc>Mvl6|VFD(Kw+ z@5rCoh@XESn`)8$@zEjsc1v@TSz{=6fWOW_aNQKb zD*DRQP>Mh^bR;C2cfv&=utap4$;8pg$q`K~)Og_r2YAc3nNfW#gZL&f7#BnM+j_%! zoBF8U1kI%D&C71+|fKuPTwj|vBz$H=Gw(|X{7DzU~ zvvn|$J|lA+FE_66Jv_UXj}n09Y?CF){_~^`cogpNb1#aHZDe2oL2F(P9XTB=ym>y1 zXg^^8WsTX6y|T90n#<4s)u{h?Q5MD(fHmhSC72YANn}_VbZx;#_1fCwaSW`$`w6!^ z#|G#)kDdgxs3ea;n~8kYMScFd^m+4y{mJ-^d1KA`<|swiPe^P(@y&V3YVtRwiDCo1Ad($E?Ei_NXbuBG3L3Y)M(=bg z(Xh&~>HPy-btj}E9c~xd566e8)FQAKnvRaNEOXn=(&7Ee{MoMgpRPGTzd#u6FFZCa z3!fHv2J|1wZ!Sgq62+@5NJ)5VNV%0H&E!!TZrD24VbEhBzh6A#nM<_a@#jwH0T70- z3XkBAJ$nFre`&m7*p|mNM|%^tM73`>v@a!UZO7&xUN4x`@!ZiE9O-!liv+^d&EUap zsWl?V$vu%2G`|-nuzYN+b~D!GC%>aQFU8e__v=8!ucR!~ulQl*^<+n#15v|WCB1A1 zef()G{8fiFU4Oo~7ovXY^M%EXpQf*rILZ$_?| zcP3p*_v7glXX^P!muU?75tJs1cl`i`6_Mz#PhKR}d2F|ZIp4;O#QY)=+4G{HI_~An zHn_bpe^kthmut38Og?I7peKx1m>}pYZnTGw<~g)bz24N{1! z2)c_Db#2E1O|z)tvR!RN(rIJcG9c&e^H>&<{e~9k6YD4nSE3z}X~$YMljoL45%=@T zpzp_MEf}8&uQ3-E+w;!yei0qWQ$_<3HR_v>&C6G|=4<0Pq>mXzBeO^i+@XpCW~f7y zlN^Q*22Ona9f9nw&5EPHMbWje#;a?^*alzTRF_ zU&N+zTXasu@|;>dV5QYr5NSjKQLeRm0!o)>V61%Uvk>s8YyL+HI}*o;qPzKoJ@@PL zxklmxvEMr+FWU!#KU+bh*L*U#v}+anFQaMiOkDe(zfCd*q`xu$h<M45tR;y_d{Xoq zGmTJW?VM#pd2@3o51yV^a^p?sn&j}k!T9~Y~MEHQ({K>{n9n1U;0sHBpC?P+B<%!vq33V$zeR`sp|KF z+$aRnzgMeWS_bSS_-k?y>7cj&tvaq2uJObZPm3*czsdfs`t?8hCqd-;dv)I7Pk25L zJ+wrRxeEX9^}xS9TYXG6FzWBsMSp*GawI#dPz1FY5Z8E-mQ}PzriwDy6YWfZG1Qv$ zS&!MMPpTlwn$jr^9wH~)LW ztmWeGd$F>lRsO^o|Fu->k}Uhq^PW%lrdyZxCpe;?Nqjj079s#+T;XY)X>vj4rog3O zVikFD%nflFxfY1W)A6uT+!Ul`6){wMBA`DJOklS@zb;a)W*oz}E0VeFNAO>Oc+7?X zIAmYuKj6B)8ZG7@G9oax;J@R#zA)~;nF&cbV8yC?chj?1T-T<(uLC!_mPP)mr+;T6 zVEs#&Z_sLt-%2OgaUVwAWIrF2IEcU2kg``NDVUhalUYBun4h3GOsQHUCx^NGJ{HG! zAT?{PA!C)9gOjj#%*JPVWx!+?}Ljp4Y` zldhsNW4!CTE*MLzj|7EQ?DiJn4<52*LAHIQqJd4<3e|o|mO6-3_X@eLRhnk+`TUy) zfZ5j%&uK_?0h}$k3WhB$t~=2)9N@8|taZCDyH}0#7ujRUY^4Y1&eJMFvHm)D^i|zBJKV+KZ ztSlZO1kkYNGAhXuX(qspRlvV1&ds}b@1k9m2(QfW95>E^MHMAY`oQy*aJ}ez_3#Uby%wg*u?H#%~&>rs@E}>C)8TW z)wXz03em4plOuEDjJ2?b5mdFVf1J&Zbw^28BAX+NH{TJvub0`ap!>4ymo3Q$EP32`h zVl@y4oOz1){tA_`boRL1>lMHidfb~Lvvsko($|+Aki)DOVCR)}jnn9k^L*E-x!cNt zv`FSk&+WhJ=HK1__kd3`pnXNJUeoxbaT;!hTINR9$oz#k{Y?ni_Q zlXyEFI=4s{cQ<^i&1kOHjU(7tpHe#J&#oh^$D=xP!4TyBEo44F8yj0qe>@nZ!fi+# zWq-T|=cDldQXzl!%{JmsLs;h7-<3)AvLrG1fRcof$J!y_=2lD%%7hki{~$miOOHCkqq)lAm6g{sW-DHQ;#4 zw9C*>Suf=NdBAZb*m-ollDXraB}2d;n6;}YOQhZE@=x&kk5K#HoRdua+TP-S?Q}M@ zU4LGWl8zOJa=ntutAzu&yR=SCR`_m?OT7FaNSQ3a!shlUE6mj<=EX%g8B@_Yn0u zKFHqR*6kbYxre}Bvis0GD@t@!B6s4_D|7p@xq0qJEmhe+d8Gb4Cn!i=OMa?nr5_&v z#j01b>i#Ll#s}JY4}jNM(nh$N(06YSQDN{Y(4dx{1rvSoOL3Ebh87_2lr*&f61Qj>c)M==cmea!PvB<`YNtxnZ9O%X0&L#MWv4JL<62!6AcCSme8}zs)Z7a8WhId)To-f$9gVNqkIJ|iufIoPvnMC%A z?MKMv?3|(QU`i!$dre7$#5|3}W&n&c`!AC_Fd-RqKepircv{)RnSJ4#&N zn)qWsUanwic9oej!KUA#-cWlzxtKUKoloD>it+yZ{l*c6D!`*per<9!kaZ2$;hDm- zFWS}PQ0DqHL+U%DW&?x$8CA!*eFSklkkdt_bjdV{n$;!u{L>us2$?`p%-R>Ksf!vZ z{9oXLoFAC`hfu?x&XFWlQjFE0`=44v4SgYhW(E9wP9g&)r!oP&XFB5du zWKKnMV+&#dWy9T5mRwj`LADGRp}q`+)?!<&iV$4AMQV;&?f_ zr`cv%hF@6;@?=?{s@nTkjQLFkh42~H*8Q`v{`0kkjVLT5N1yzp!aPF$YL*!~>~&cS zi5x7;Z}_Qs;wIw!kzGv$a~VYQ4m{%5Jk>{#JTT6`#qseZTy&~GyuQd6KVPBS2Sb2G z1ITXR+jOz%ACe=mvYRH*5NC@0=y`E9VxTDVIq?r)QE>dvx-$6L&eK3ek)Z{WPUlbkDvd)Yw$Vk1uAo(~p~WM$=#Sv_I@{(HeJ!Lyb(LAz+G z2YTM9aSr)bdqn8cBJ|apcWG1Z=mnowF&PAi7Tgv3lF1d%Cbbi3En=r10lrZp9B6Jd z@>wV%urJk)Cv(qec*S(#HM6dgkrA)UWL-wzm&@MOgDc=@J^&QIyE4bA`87P~6(=f+ z7+G%QB^`P%eSDM$T-b}?)A)}##6L3*QS|pn-Ed4)MTt-Vaws`H!ikaJx>PhZ)z3=m z5uhk+omUe!f*?!Rur3#XJ&jsjY@LMxC~ou zW0IL58JP#P`u-5D?pOE8Dz_OTgUT&dhxK=ukMPH#?^BCS=FhY$VXcMVNu;FKn?FlD z^SC-X=_lUxb_lLpk~HNPOin)5#<}z)#-L6`DsUxfh}Z3}q4C;R)zBDElIs<%NnSt) zXacYiz7f@_>Hg0O7Y-@N8>J35Z_BN;+(x0kjZJ!El~^nf0IweJ2f)#|D4Q=2tOc&O zjrK3T3OUDkR*Q4pGE3AioDOH0=Ep*+F}Kg-NHi^G~182J3B=v z&A(n$WJyD0+gnNwyshtF7NA1T}`(`c3keLr=m|{P)sD4PJ27#8YLo^{MQ(tW6^C5#CHa0Y-wk7$r>4YJ{ zex68)!vJp-V#+g)w$?;Rce&67>OhND9!c8kJ|LE!C(KW7t}gY0tF|GQLmLBEVIbv% zSZFq`F*hk*QSWKI-3-qlnI}2 z?3W?ow)a!*uZ_`u|I;ucy9H2^wL=76zVjuP0~%5Yqvn!#e9pXqfQ z5c3+s4$_@DJZJ9PePSvxA|-ntpm!KALtC_qilQ~J9aEy|yhkPJCtK3UG@L|3C0egX z4^Z4?EzeEi;&U_a_4<4_<=D+t-*K(=0Pqh#1{LhgR)ym`vP`NOy*JA(i@t&{^5@_` z1JFNQqqgK*8qTuD=FcR0w)6Th5{(8pik^$xm#aqHW-KlB zrLJ+XzKcCm^E(>^>a3EZo$YjhH`?qy*}4S%$!ggg>>pK;du+=~mIZ)p)23NuT_lFr zKaq;9n_E?J&PyFij>dCQdi*=GNLZx|=Q7|BB}Q$F6X`ihzxieOb$C zw;8B^<(i(r+LqLba26yWbxeOXEE{ez9#gLUwIcZ|1@r2kH~S*{X^+|rJ45x=zAi@l z$l28_+sVmSXu(#QgxB3@(QXR^0*1WHmun`Zq~m?!Up^Lx;=^|D$2xE1CF^&kaG}5o zPxk|ZDPP56ePiqSx_JI_+pkaQu+hMkQbO6gYy&WE_Oz6^3*eDbX->gjBMH8jQ{(sK z(>!uYY~UA1B+2WY$isFNJ>Wdd(5Je}BA`sy zlV;RZVQ4Lw);6S!SVc3(dGtLZ*)~-85RHnp;{%LJwZJoS!C+e8rao$jO|@FrV$MXz zY^O-wLlA>p60|_ILoTIl}>rdhFuiVkfHn?J#hi8yD^5kVE^ z{e&Ht;-bFt1jZ^K?@^rtK0@~j+}~;Wesq2Ue)~meN`OAWEH^@oj}Oy>TI4Xx6Vyt^NUFEVI9 zX>Y?b=C7!D$1yx6;UhZ7{&xa^SbI@!wDN2mG|3rD8=*w)hiW6!+StGEtF{rt)RpHl zx4^XEfUmkNL9BYSJLMS1H`(m8?H$%Vq(6%98S)Aen}hY-UP1qj|BD_`^VxJ@x5U9@ zNoESDzi?LGfglt!+XNe-4?x{jp(f%Y_I~TfFqp$*iJOAHZRR5Dzwj~g74*%&LD=k0uX_Bv|$0}0U6%|bqME5Oy z&BIr(-H>iUgWIXV%ziSdS~ z=HJp;$3o(M>C?T>q5sC+@mGfAe{+N2x~M}&LJAD`8yY=SYWB2-+}x30%Fvlxj>`1Y zAuT6%wu_9lx|ln;<%@S8o}zC>y3X&a()^$5zB{g|bZa+=2ueqgUZkotK~PF)(nO>; z=?X{-NR!@CdKUpHQlQbGwJT?OeyI)vU62oS1w>$x*$X3m^4bI$qhcmK$5?50+i|C$FD_^J)gBmf7yhG(B062kS_%I|<#|W~eh62z)QFK_3y^XtE)d(< z>~~oe7#bE##RzL)FF`|?sr=;+zkyn>*fz|YO$H8!QJIw(oebX1ID|q^o_y0TsAnr^HB2eGD=Cr14~?L?${`V>aGZ|>zAbeKnGB0Pnc%$Td&26L)o5#K-@*!3N8 zwykDB@CtA^ITk<7-S2Iw7X3tq%+R3`LfZsm_um`JaE-fOkj>DZ)7k}}D(1OnNTRQz zdV`m0g7slstb{ryJ9pH&U~>Q?g9O3I9E!2tdK#ouIBBW0*r8;m=7(K9%-AcH81DX( zZ4Gtb5x4GBq+nSo1{G+?TbTXc@&DOp3N!2SN`J8&A$W3;+IPQGe)ZoD;{bn$+wCJe z*L%@N0X?0avqtASU`r>DP%vEKxL6}XR21XV%*F0x&_s$KiYbY9Z#iO0<4v=nCg7t} zoVMb-s5dnl*C4J-9dUB?b~*ao(s7FU|Zd3aw;epNK*@N`Ij&Un3>FjSZg&4$EFcYAMjcYs50n)>uv8#>m=93z=E3S;H5 zE_{9|7o^J-iV(2LGH548*wD4zEPNyRc8_ZsZfnJkF}$p)v{Ef2PpM7&^Q8WPwTt|_ z>(aJAtJF?R6}D!LS-M~+ zNdUPI^^>gwWPo=Tjvc4hYwRy~%5}^Wm zZvVYS`sE%^wm=};-lNpRBW<4{Rw+_^TE52m*$`IVSu9-5%jB>Xe(O|Vra%a1y8m7` zm9hYi^e3(?sB+5;d8HZ+BsC^EPtnb!-Mw<+<-|o)+V%zp(3vJ?msE5wINl~_W*hO%VMAvZK;8SUp^Kxpt^u-diM<$y3rsc;Y8lO`cEFwN>;;bi?kgU@s znFrixC{DIYsVkpfH8Bx08PRBwU*|Rbkr&T+&ZsySNVaF)6abuLUU}S4e*4E(!L!|& zNeo?SLiIj^-XnUt#O=(u;XRYmp497;d-(}ZKNhxs8e{ZVtymeVaWmnDjKH7no2ZMHb&qy5m6B2cRb*yOneJv}R;l+)h|pe%sUScnd%E-8W)bn zZW!W&y#^Ov_;E7zkPkd)9%;O`POayjEXgz|-xF+hY*l+c#K#wjSf<$*VMvAgSRwhD z#23sBHhuAo>XO%)=#l##F>`CRfn-dbE8<#w@Qrh^^%$;9pMw%Qx7R!= zQ?JD{aB#EodhyOtsMYwVr*3R%P?0x9%%IuvSbrw3-aI6Rm zaP1KIz#MFlQ}HVO&Dg8_g{_u|Yeg)-OdS8nzPW#?fv-T*2(M&C0ixmlW1w*K;?F$w zzm8N(W~N*7S4Z_m&xhIPc)n$W4xi8L(}~C}v*{|eHV8=?pc&a2S9YGYvUcUp90>p? zba=(K)?(=S>DK(HY8o0wzVad{M3wT!ZwE~n71HZ?S?q``jOw9E^if+yIn#zK2DJSg zm1$3=5}=GmF&8Bavl(`qsX9H}=Q^YLe3a($(6SGKdDlO_9=K!45`^&85oK{~xMe)^ z94t|^+IS7^R#7A!=Wjc$U_Y-%I)IfmP@oT?+h>&>1VVIWVW_;9WFZWy% z#iR#G=UkVEi$=sgqu!SU4FUfg0_RST1aM|rff1<*_e$M0++No)ALaR2QtWg2!OD^T zrJ#e265-=}@zWC_;wks@-QLm6gPE$nU`gfBA!%s;hnX6KLhBIDs*vl8RUuE{77t%3 zRCl+Y52Cy&aq}z8GAH1gZJlpVHl>Yy$+S&r0mr5;C;x^|o716Ln*I5tkyRqN=G49C z#NcMxrrPmyXVSXSzgI^Sm7=~gQN_rnXd+kPIS{+Am+yx-(-|(jltmI?R?EvJ29I{- zm5DI}0%(Ou)cVmkkl5OyKOd*R%>B}NRT9lH?g}EYVi=h6eTgejM#iBLTgFK=={1Gf6i&j$LLakc6EQXWg3V&V>? z%frWB-dzAGEw4_DRD!8yBUAV~!@zgHfoz7KuqW}xlbs=B-W*D)OFZzyMdcR?M=NTh zi5KorYsoX%KAOKI&ism0HF0$%lJ30pxxfH?+oDg3Q{h^v5sR_YR&SUlHo32zXJK~q zI$DB$BGQbrh<^AyK3-Gf;bhB3ckQ5wy{dSy1$mL?hdpHFN={@j@PxkoXEl=Frj@^a zj}v-oHn>`_9h)bXbLq=bH1Lq>{+ZuA_lrg(i-*5*}N#rE|M#Jud5{dwA3(F%Jka@m}^-z!d*NB8AFFP}=uOlD*l;Un#@l70dl1lA6F1Nq?^?%!Hezu}c z(VSny7C(RUFMR%|Y$jxDj%Q=JHepMa{@#rAEh9kgg!j!e%f_^nZ4R6CqlLi}d*^-+ zpYb+-Z_gWsFr>4;Ol(K>hW)@m%k;Fsi-@0-e-x}ewkDw~@U?3P-jz>_ExAoz5zEU- z*FpizGT=kIXJwOjRQi#OGfc1Kl>93u$QYP7m^47pOx-H)=vlZ?$e!?39skaJCS@$4 zho90MlV!H(jvW%0ZG~Hc$3+l5{5QGHjqR zl&Fc!$Db>V&-q9-V~L)!lSonT$lu6I4+^3LT>#Bq8f%pQ48P+r2GwcO6o)*k4t)Gz z&O2j|mr|D#=O+*NzhwJsfd03){`af#IG-U|GuSSLcevb_8d?FZ=94Cawe?p6QiBMm zQj^U3r&q?LNE?nK);R3rZ+Tt1p>mf`%_8dNddg?xnZ@k$ril8Ns$Dw~Rq6(uU9J+n z!V->)eNL@K%AVf6%SEF)$0Nq)BCbK_Z^Fc}*|169B<4#tJR}9hCowK(P-Y}o9~r^X zQ|Q?el3Us4sg+|~Tkuru6I}Mu6d&>OUyOJx;mW%eFUE$q*Q<0u3@(A|Tb^9&hT0nHQ&Zg&_4Pn`Cobqu0KdQ~|4V&S ze`egTLFM0C&hMlM`JY(ZFMnJnh|rJCqFif3`}S9&%8s9hc$}1f1D(6-A1^fWb|{(M zsGib?kX|xg0`q*izQ$A4uc~jFdGZCLaX|4ABkXIXvbfKqxA#d$slYQ53rb@$=0>9F zX<4)I1dZdVChk~#l6&ov5sSg}+NAdlu0e-h>dNB*d0`Acvg}yjV#9#gy{_)@X{%>$Jz-ay|ANhM&g!8npq>q6~hS=nEzW)@X|7&P|t-anU ze`l%$T&FsCnQgrjL!~j<3`f_t3dVa2V2n#qZR_Qd z-acFS2GWhGv7r_GLaAZg0fgx4_?aGIr|@~|;4)IyfpJKV)HFaw6Q)`bUQSZnY+~5E z?iERVTSPML-8axk14(73{DO^E&JJ+e6@Qn9`KxRC<@Nm!?Efx7licXbzPEnyu!9oJJl)ql&m$0{=CQRNrTty(XOfdC?07GGqG%u zqF7g9+BIn77}Kj!(MqKz1Y74`=hJj`d_$<| z$YHIny*ifC*{I!<^`l!L#EQ3>S%a>eSxcq5E@pp<&rDxe^upq0xqgwO5>V@ky!G(+ zQsGaC08~!}Xv;&Nl}YKq!>?-Xfig#hhxNE;VVKu@5^~=_UBeUaGxuHEHOF4-j5x-= zIa~Y&I=`mWlCY|-Pl|E$RTAcCwTA=LzY3+NwW z0$HQg$%AR~$0LT8L!0zJ*#WtkAb0C=-1CyS8?H3c62&>0l}6hukuAqVWuA7S#NbB& zk&63Ev+~49QJA4P$4cGFgq7VWkG9fE@qq0W^_E>__j3vXNp3)Q=NhDE4;ED?k=Ht5 zBk-w6ElHcK!z~FnMpcBXZaEMGQ@#1BTJAez3}e`JtRjgkvDmFHCx(cj^s8Fpb;~3_ zV>PHM60{Z*U{~t5%pCFx>>!0V=nf+Aim@ZJ5J~>}_^FPSjX{A<0=BKA<$?##7E&>9 z2wO)anX8T^UMVp=dUW0h=ZyU*b#N-AS4+(;qi17Shag+~FSO(GoBuDJ&_6o%?>eZT z&Cp{xde5Ii8GXr^ur(nM5i7pEYmXZg8Dr#RHQ;gr4l-tU*6m zzr}DfW@eH30r^R=5`MF|cwslt?&d2z6hZiT2c+yZTO^etyk4nWp7uifQE9S0&S=U) z-wD|ug@ryp|C2yN&O7P$QUU7ztlX9TK9}FFSW}FQU+W_xiwv4Pcv^slCPgqRNsLjH zh(2x8xs)ya0rz`~C-V<0y}!*;|A*iIEfD=ngpIok!I2glnQ^;jlQ!h)q5r<{n(z`6 z4wDt2Wg`X6F$ZEHWt~>o-Y_+Di0PPsaX8;`W~y`;U`9z0?!2sAz|d z_sqyqF5DHG(L6oeS&@BX>>EHVuXKv}Bx3$Zr+q~et3L)*qZEEdgnk><{x5w0k8>rc zR;%uX7GF!jx$e{#yB0*ghqP$y)6O|#V>6qQ$Y}Y7r!$9_AdU{o)W8kz3;6&3hX0dN zhw!9P>wctu_M~3--Lz1=|= zuLkA(qeVrTm&>76odS?dGB7#Po^wW~{(bG>cF@Gd9lRX{p!rcS>rr6*C|vkL=!G&Q zEMiImFWpmMGWa=UYDvr>R;qK@HY^Rdsrr~|KmF*O@H^j+!VZjWq{P> zNh6zS%Hi$O%dU$JuLeHcPUsM9w@7%}VpM)nK8OV866d(fkC=JHD zk)MQ9S#7MIIN!wL1l&gIYbAtqROewLc|XkNKXi?MnWgux-jR{UYIj4%Zcz=d%R0Ly zgtbxBEW^9Qd*`NOEUxhN>-zk#rXMD~Bx6=ZW%a|FJipH|Fo0X*PY$R`aByj1H~4)^K=IlU)U|a|KWTj#t3#Y8(;C&;4B{+e+?n8(pqpgr6@klkYRrOT?>yZoNB1x;3 zkZ@XkWgoAQI@DZXyg-Tv~+^!s29TRG2EYkq=st+ z(huqO@z1e6YOAYyQxNd1;lZ>t>vP?gOYBKJ`GUuBKt``>AC~q4`)_ z6=ma>ZKlThogQIHU4ijSQe1r#2g5%kMdIrj7( z1cL-c0p^VNeEI-_6uEs4B4$~Yr!NCjJB<-qFC-plF?VbZ)b%UAUAXr_;s&8Za0W{s zLSPP3&kk=G!T8=)UfnpEjl33@zn}*`cOLR-K4CMCR1W1IjUT=x4E$f2O2UKT%33*h zH-~F+d>fljoB}?~?w^^}70-fk=Nc?W+x*zj3iS}i=;?BHGjaCU_a8^&;JT1p1V6(Z zK+pb)u>cr^$V?cMa1%-) zN0!5cq-c!R{HW1(lJxiXB&aMZla*hd30j8b_pP%W${eOW-;}1CM{cE2zi=fs*#+?a zrgwZ*Z3xnRM$5qAi?|Z17C{F ze*?jcfIehGuzV3#%>Yqj2=Vp%2GXZPxcOOIsMMorojRP@Tm}PsjQ~Zr7E&ZLtw*Tw z$O)hq81}T%ZIIVK_;XKltfaXhI>4pV#J3PvPaa!(aFi4c=m~a33$_|r8VjPgG}VM+ z0^^ACodreo z{8E7cr*+LlqGb6-WttVop-C#-fuK=HyBhw(DD+W#aZ48`y3fO9X~JLOEPYq zq(^EOe<#hgw9{tELESNXG@;iFBHl3~DLCYJb;Y3i&D@3BioV6fmuj0dmp5fvc5unG zXts!%g!_fRfyfQlZkL~k4J_3*h1^Wdot9lPESK-uh;GaNh^I<|2YS|c6+P7v?U`$H zC6#`SiDd{WSQcb_gGZXr@Y!2)Tq2xKaWz%$J7-t+QyYns4H8sq0r4mQinIp+@6+aN zY3p@|>V_NGD&lkIhcgb;e)jC9`-31}+XIEcFTqnqHDoC`x}e-98oXYU4}P=`0LMfN zdv^()GzONxU3*%|b28Z>cDB;=;G}K2KxSK-@f#=@;lu}rnPUBQ```BOm53y{RojfX zdQ312)&-DiWWq)ngFQ!IAf#YZK61lg8`x_9s)}&xnBmv5&pjW`y{!;L4|^OPyR20H zJmuQd6`vrFU7V=uCzU84tP=Tq-Nm`8Si7nfqLsN;vhM>z9RYQeRvWIbXa5 zCQ2vDc!kqy=%dt7g;t3PMLG~E=Tx0Ia8%CNDF2#<67p>=SNERO>r!;qPS|!H1WKB_?q`v}4X~yA zbV(IgQUHTgQ|lYk(?Te}iv7%0sLjS7#eiAycG2Ba3%BLRl!>=`f$J8}axM4=INm(c z4u}fs{xF;2@eQ=DcfA;UtNqA+CJM7je;+=?1J<~n_;h;H?D)E~`<85%?|hUOX&%so z{DQ4bk{C@AT88y&;dR)k6I)Hz?O1$d*46vEbn;QU(`c+0Xd6tA?2@AM@RBeXxPJ9; z{CZZxwmj>e*7^{0HY0ZylzYzq#kLRI+?}eS@mv1xt{e-iw4XbAK;xu7c+4@7s=q@0 z?|o#7Yz>TGIIkKArB)5S3~R4@P>y$=LO-PjWX>E`X1fe_a6v*Gh(7_{@QE+nQ%hsm zOaza&`3pMn!g0)7Hif%13sK z?25oHZU|eZx#pS)0Xq1FA77u)n;YZ1s%Wa2akeJ!s@RR}G#*CM?&)-2&sAxrPv)K% zav$6K+8%Find#^FZ*zlWPNLQHk4Td0xI!zZu3PNlC6>A!qoXG%`TQAlgMa4FQuY4m z!(k|oSnIkUbVwVPSTMv^d9OjRcU1EEKpov8!rE1ocec6;6TL|=_pE!#|}#b9%0AIJ8&)H#9gV{#(jj*!PS8UrUbmf`^jaD3SElF_pURr z7YSSx!%d`Fruo#PVy%XnF-2QQ3JnW;dps+XHHsnFvabxJ)o~{L5{wXiEr%D(Hyr^qZ%3OLR;@7H<>*L zm`?1C_s+LR1<&qgbT(0`si0ybz>3H>myX*~wGC7O1-4j>j;#+BkdqL5;FosOKfM+9s z8s~;tzwmK`l}e^cQ{NlStH4q5Ad%xUrsh^pf! zuOW#kmaz##I92a1He)2m7Wn*VA!l3zh$n@%j?MXNb(3)oWtkc5r_0cFjkr@ChAsKHla`MuBm{6pc;`!pl#(mu(IoL>GcK5^jSKJ}%zoRJgOE~I3 zw~sKLbwBC(2HGc+I+g%=%Tw(#2O{i?Jg8?^hlIMkZ5A`zRGzLnMzz|&73Lu%ei|le zPtf>nNA7LJQmu_V{iVDt!|GM(NiQoZtEXnGT**?vLjv7}D zw>YD%s;;T@G|@E-BC;cladadwt6A+(DgsLZN}mKi1gPP~SL526pV$jkbGE3N>_Qi{ z4_{+u)$yzQO{8WWB92C*pu)a%1VZ7$VZ6lciEVeERKE(!3ejtgdFWRajnXqfYa1}` z?G07m@_0JFg;ZWG@MK!0eXQH&vpI1fc2ouO{z5hDk80d|PQCx3yf5Sx*VsO;o8P3C z$W#;%<1wC!LX+EPDEGLT$yZZ#gHpj{(_cAurq=~4H3SDiX$%MltLO3rb=)={3z$=zB+rN)-|RqKS-M-ipipS~t)QC)TwLdOK&vLBGtS9_ycbH+z$agp@1O3ogwh)N~2>yV414qHjyYoJSyj@ic1C(OKGOm~ z(Zd$BNZx2NR5s>72sjnUTF3b&>%7C$7<%*`PpgtVMvO==r(c>OwABG$ZPuS4Ki<^? pu9cEuWpSQ0sq=H~GK1BciYw;7TPpjx{_$Tf$^AEu!~AXR{{ZoTn%w{Z diff --git a/docs/source/_static/publications/omnireset/peg_success_rate_seeds_walltime.jpg b/docs/source/_static/publications/omnireset/peg_success_rate_seeds_walltime.jpg index b50c15b7710d08ca562acfee6b4d9c4c332d8d80..fed1469fa03becb581a942d1551bf94092666686 100644 GIT binary patch literal 135792 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 literal 32883 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 diff --git a/docs/source/_static/publications/omnireset/rectangle_success_rate_seeds.jpg b/docs/source/_static/publications/omnireset/rectangle_success_rate_seeds.jpg index 21297570e71d08653d28a4c18c9bbc6edfdf9a2f..78eadfde45b11c56d4c8071a9c1d3715aeb588be 100644 GIT binary patch literal 131234 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ν_#XOkL?M%h(AX5|f0y?bjGDwW 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 A#sB~S literal 32406 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 diff --git a/docs/source/_static/publications/omnireset/rectangle_success_rate_seeds_walltime.jpg b/docs/source/_static/publications/omnireset/rectangle_success_rate_seeds_walltime.jpg index bbded9c40a257ff2d496e6235b0205f87a9b6ced..d94d0fb0207bed37e053181779c77370c04c425b 100644 GIT binary patch literal 133242 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 } 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 T{xezA{nuytzv{dEXX?KJyDSYU literal 33091 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 xkZ_R@>LdkgIuHzm-#t)B$dweI^} \ - --headless + --visualizer none This saves ``policy.pt`` (and ``policy.onnx``) under ``/exported/``. -**Step 2 — Collect RGB demonstrations** +**Step 2: Collect RGB demonstrations** Use the exported ``policy.pt`` to roll out the expert and record RGB observations in Zarr format. Only successful trajectories are saved. @@ -80,8 +80,7 @@ Use the exported ``policy.pt`` to roll out the expert and record RGB observation --dataset_file datasets/peg/rgb0.zarr \ --num_envs 32 \ --num_demos 10000 \ - --enable_cameras \ - --headless \ + --visualizer none \ env.scene.insertive_object=peg \ env.scene.receptive_object=peghole \ agent.algorithm.offline_algorithm_cfg.behavior_cloning_cfg.experts_path='["exported/policy.pt"]' @@ -95,8 +94,7 @@ Use the exported ``policy.pt`` to roll out the expert and record RGB observation --dataset_file datasets/leg/rgb0.zarr \ --num_envs 32 \ --num_demos 10000 \ - --enable_cameras \ - --headless \ + --visualizer none \ env.scene.insertive_object=fbleg \ env.scene.receptive_object=fbtabletop \ agent.algorithm.offline_algorithm_cfg.behavior_cloning_cfg.experts_path='["exported/policy.pt"]' @@ -110,8 +108,7 @@ Use the exported ``policy.pt`` to roll out the expert and record RGB observation --dataset_file datasets/drawer/rgb0.zarr \ --num_envs 32 \ --num_demos 10000 \ - --enable_cameras \ - --headless \ + --visualizer none \ env.scene.insertive_object=fbdrawerbottom \ env.scene.receptive_object=fbdrawerbox \ agent.algorithm.offline_algorithm_cfg.behavior_cloning_cfg.experts_path='["exported/policy.pt"]' @@ -199,8 +196,7 @@ Evaluate the trained vision policy in simulation. All commands below run in ``en --checkpoint .ckpt \ --num_envs 32 \ --num_trajectories 100 \ - --headless \ - --enable_cameras \ + --visualizer none \ --save_video \ env.scene.insertive_object=peg \ env.scene.receptive_object=peghole @@ -214,8 +210,7 @@ Evaluate the trained vision policy in simulation. All commands below run in ``en --checkpoint .ckpt \ --num_envs 32 \ --num_trajectories 100 \ - --headless \ - --enable_cameras \ + --visualizer none \ env.scene.insertive_object=peg \ env.scene.receptive_object=peghole @@ -230,8 +225,7 @@ Evaluate the trained vision policy in simulation. All commands below run in ``en --checkpoint .ckpt \ --num_envs 32 \ --num_trajectories 100 \ - --headless \ - --enable_cameras \ + --visualizer none \ --save_video \ env.scene.insertive_object=fbleg \ env.scene.receptive_object=fbtabletop @@ -245,8 +239,7 @@ Evaluate the trained vision policy in simulation. All commands below run in ``en --checkpoint .ckpt \ --num_envs 32 \ --num_trajectories 100 \ - --headless \ - --enable_cameras \ + --visualizer none \ env.scene.insertive_object=fbleg \ env.scene.receptive_object=fbtabletop @@ -261,8 +254,7 @@ Evaluate the trained vision policy in simulation. All commands below run in ``en --checkpoint .ckpt \ --num_envs 32 \ --num_trajectories 100 \ - --headless \ - --enable_cameras \ + --visualizer none \ --save_video \ env.scene.insertive_object=fbdrawerbottom \ env.scene.receptive_object=fbdrawerbox @@ -276,8 +268,7 @@ Evaluate the trained vision policy in simulation. All commands below run in ``en --checkpoint .ckpt \ --num_envs 32 \ --num_trajectories 100 \ - --headless \ - --enable_cameras \ + --visualizer none \ env.scene.insertive_object=fbdrawerbottom \ env.scene.receptive_object=fbdrawerbox diff --git a/docs/source/publications/omnireset/index.rst b/docs/source/publications/omnireset/index.rst index c246fc7c..0ed3d5ed 100644 --- a/docs/source/publications/omnireset/index.rst +++ b/docs/source/publications/omnireset/index.rst @@ -17,6 +17,21 @@ Quick Start (Try in 2 Minutes) Download our pretrained checkpoint and run evaluation. +.. important:: + + These checkpoints use the Isaac Lab 3.0 EA observation order. Earlier beta checkpoints + have the same input size but a different feature order. Do not use them unchanged. + To convert a beta state expert without retraining: + + .. code:: bash + + python scripts/reinforcement_learning/rsl_rl/convert_checkpoint_layout.py \ + --checkpoint --output + + The converter preserves the original file and updates actor/critic inputs, normalization + statistics and Adam state. It supports the published 43-input OmniReset state-policy architecture. + The old checkpoints remain on the ``isaaclab3`` HF branch; EA copies are on ``isaaclab3-ea``. + .. tab-set:: .. tab-item:: Leg Twisting @@ -36,7 +51,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/leg_state_rl_expert_seed42.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/leg_state_rl_expert_seed42.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -49,7 +64,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/leg_state_rl_expert_seed43.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/leg_state_rl_expert_seed43.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -62,7 +77,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/leg_state_rl_expert_seed44.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/leg_state_rl_expert_seed44.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -88,7 +103,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/drawer_state_rl_expert_seed42.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/drawer_state_rl_expert_seed42.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -101,7 +116,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/drawer_state_rl_expert_seed43.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/drawer_state_rl_expert_seed43.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -114,7 +129,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/drawer_state_rl_expert_seed44.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/drawer_state_rl_expert_seed44.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -140,7 +155,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/peg_state_rl_expert_seed42.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/peg_state_rl_expert_seed42.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -153,7 +168,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/peg_state_rl_expert_seed43.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/peg_state_rl_expert_seed43.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -166,7 +181,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/peg_state_rl_expert_seed44.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/peg_state_rl_expert_seed44.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -186,11 +201,12 @@ Download our pretrained checkpoint and run evaluation. - .. note:: + .. warning:: - On Isaac Lab 3.0 this task plateaus at about 62-65% end-of-episode success on all three - seeds, well below the other tasks (90-99%). The checkpoints below are the best ones from - those runs. + **Isaac Lab 3 regression:** Rectangle success stalls at 62-65%. + For now, use `UWLab v1.2.0 `_ + with Isaac Lab pinned to 2.x. Have a fix? + `Send a PR `_. We'll take a look. .. tab-set:: @@ -198,7 +214,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/rectangle_state_rl_expert_seed42.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/rectangle_state_rl_expert_seed42.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -211,7 +227,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/rectangle_state_rl_expert_seed43.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/rectangle_state_rl_expert_seed43.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -224,7 +240,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/rectangle_state_rl_expert_seed44.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/rectangle_state_rl_expert_seed44.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -250,7 +266,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/cube_state_rl_expert_seed42.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/cube_state_rl_expert_seed42.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -263,7 +279,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/cube_state_rl_expert_seed43.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/cube_state_rl_expert_seed43.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -276,7 +292,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/cube_state_rl_expert_seed44.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/cube_state_rl_expert_seed44.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -302,7 +318,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/cupcake_state_rl_expert_seed42.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/cupcake_state_rl_expert_seed42.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -315,7 +331,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/cupcake_state_rl_expert_seed43.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/cupcake_state_rl_expert_seed43.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ @@ -328,7 +344,7 @@ Download our pretrained checkpoint and run evaluation. .. code:: bash - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/isaaclab3/Policies/OmniReset/state_based_experts/cupcake_state_rl_expert_seed44.pt + wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/83860532010b2737aa80d6e8621235ee554186f0/Policies/OmniReset/state_based_experts/cupcake_state_rl_expert_seed44.pt python scripts/reinforcement_learning/rsl_rl/play.py \ --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0 \ diff --git a/docs/source/publications/omnireset/new_task.rst b/docs/source/publications/omnireset/new_task.rst index 88fa40ec..ee350357 100644 --- a/docs/source/publications/omnireset/new_task.rst +++ b/docs/source/publications/omnireset/new_task.rst @@ -171,7 +171,7 @@ Add to ``variants["scene.receptive_object"]``: .. tip:: Use local absolute paths during development. Switch to ``UWLAB_CLOUD_ASSETS_DIR`` when sharing. - Published assets go on the ``isaaclab3`` branch of the asset repository (``main`` holds the Isaac Lab 2.x + Published EA assets go on the ``isaaclab3-ea`` branch of the asset repository (``main`` holds the Isaac Lab 2.x files), and ``uwlab_assets.UWLAB_CLOUD_ASSETS_REVISION`` has to be bumped to a commit that contains them. ---- @@ -185,7 +185,7 @@ Step 6: Verify Setup python scripts_v2/tools/record_partial_assemblies.py \ --task OmniReset-PartialAssemblies-v0 \ - --num_envs 10 --num_trajectories 10 --headless \ + --num_envs 10 --num_trajectories 10 --visualizer none \ env.scene.insertive_object=my_insertive_object env.scene.receptive_object=my_receptive_object If objects are misaligned or upside down, revisit Step 1. @@ -196,7 +196,7 @@ If objects are misaligned or upside down, revisit Step 1. python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEAnywhere-v0 \ - --num_envs 4 --num_reset_states 8 --headless \ + --num_envs 4 --num_reset_states 8 --visualizer none \ env.scene.insertive_object=my_insertive_object env.scene.receptive_object=my_receptive_object .. code:: bash diff --git a/docs/source/publications/omnireset/rl_training.rst b/docs/source/publications/omnireset/rl_training.rst index e3a1dfa9..6888ff93 100644 --- a/docs/source/publications/omnireset/rl_training.rst +++ b/docs/source/publications/omnireset/rl_training.rst @@ -9,6 +9,26 @@ Reproduce our training results from scratch. **Want to try it quickly?** Start with **Cube Stacking** or **Peg Insertion**. They have the fastest reset state collection times and converge within ~8 hours on 4×L40S GPUs. +Plots show seeds 42, 43, and 44 on 4x L40S each. Relaunches are joined by PPO update; +dotted links mark gaps without logged samples. The first 30 updates after a resume are +omitted while the success window refills. Time sums the logged runtime of each run, +not total elapsed wall-clock time. + +.. warning:: + + **Known performance regressions in Isaac Lab 3** + + * **Leg Twisting:** Training success can drop sharply after roughly 24 hours. + The current workaround is to restart training from a checkpoint saved **before the drop**, + rather than from the latest degraded checkpoint. This is a workaround, not a resolved fix. + * **Rectangle on Wall:** Performance has degraded significantly compared with the Isaac Lab 2 + version. If you need this task now, use + `UWLab v1.2.0 `_ with an **Isaac Lab 2.x** environment, + rather than mixing that tag with the current Isaac Lab 3 installation. + + If you have a fix for either issue, please + `open a pull request `_. We'll review it. + .. tab-set:: .. tab-item:: Leg Twisting @@ -21,13 +41,13 @@ Reproduce our training results from scratch. .. code:: bash - python scripts_v2/tools/record_partial_assemblies.py --task OmniReset-PartialAssemblies-v0 --num_envs 10 --num_trajectories 10 --headless env.scene.insertive_object=fbleg env.scene.receptive_object=fbtabletop + python scripts_v2/tools/record_partial_assemblies.py --task OmniReset-PartialAssemblies-v0 --num_envs 10 --num_trajectories 10 --visualizer none env.scene.insertive_object=fbleg env.scene.receptive_object=fbtabletop **Step 2: Sample Grasp Poses** (~1 minute) .. code:: bash - python scripts_v2/tools/record_grasps.py --task OmniReset-Robotiq2f85-GraspSampling-v0 --num_envs 8192 --num_grasps 1000 --headless env.scene.object=fbleg + python scripts_v2/tools/record_grasps.py --task OmniReset-Robotiq2f85-GraspSampling-v0 --num_envs 8192 --num_grasps 1000 --visualizer none env.scene.object=fbleg **Step 3: Generate Reset State Datasets** (~1 min to multiple hours depending on the reset and task) @@ -36,13 +56,13 @@ Reproduce our training results from scratch. # Object Anywhere, End-Effector Anywhere (Reaching) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEAnywhere-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=fbleg env.scene.receptive_object=fbtabletop # Object Resting, End-Effector Grasped (Near Object) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectRestingEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=fbleg env.scene.receptive_object=fbtabletop \ env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 @@ -50,14 +70,14 @@ Reproduce our training results from scratch. # Object Anywhere, End-Effector Grasped (Grasped) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=fbleg env.scene.receptive_object=fbtabletop \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Partially Assembled, End-Effector Grasped (Near Goal) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectPartiallyAssembledEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=fbleg env.scene.receptive_object=fbtabletop \ env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 @@ -130,7 +150,7 @@ Reproduce our training results from scratch. --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-v0 \ --num_envs 16384 \ --logger wandb \ - --headless \ + --visualizer none \ --distributed \ env.scene.insertive_object=fbleg \ env.scene.receptive_object=fbtabletop @@ -146,7 +166,7 @@ Reproduce our training results from scratch. --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-v0 \ --num_envs 16384 \ --logger wandb \ - --headless \ + --visualizer none \ --distributed \ env.scene.insertive_object=fbleg \ env.scene.receptive_object=fbtabletop \ @@ -154,17 +174,19 @@ Reproduce our training results from scratch. **Training Curves** + Shown through **22.5 logged hours**, before the first seed drops. + .. list-table:: :widths: 50 50 :class: borderless * - .. figure:: ../../../source/_static/publications/omnireset/leg_success_rate_seeds.jpg :width: 100% - :alt: Leg twisting success rate over steps + :alt: Leg twisting success rate over PPO updates - .. figure:: ../../../source/_static/publications/omnireset/leg_success_rate_seeds_walltime.jpg :width: 100% - :alt: Leg twisting success rate over wall clock time + :alt: Leg twisting success rate over cumulative logged runtime .. tab-item:: Drawer Assembly @@ -176,13 +198,13 @@ Reproduce our training results from scratch. .. code:: bash - python scripts_v2/tools/record_partial_assemblies.py --task OmniReset-PartialAssemblies-v0 --num_envs 10 --num_trajectories 10 --headless env.scene.insertive_object=fbdrawerbottom env.scene.receptive_object=fbdrawerbox + python scripts_v2/tools/record_partial_assemblies.py --task OmniReset-PartialAssemblies-v0 --num_envs 10 --num_trajectories 10 --visualizer none env.scene.insertive_object=fbdrawerbottom env.scene.receptive_object=fbdrawerbox **Step 2: Sample Grasp Poses** (~1 minute) .. code:: bash - python scripts_v2/tools/record_grasps.py --task OmniReset-Robotiq2f85-GraspSampling-v0 --num_envs 8192 --num_grasps 1000 --headless env.scene.object=fbdrawerbottom + python scripts_v2/tools/record_grasps.py --task OmniReset-Robotiq2f85-GraspSampling-v0 --num_envs 8192 --num_grasps 1000 --visualizer none env.scene.object=fbdrawerbottom **Step 3: Generate Reset State Datasets** (~1 min to multiple hours depending on the reset and task) @@ -191,13 +213,13 @@ Reproduce our training results from scratch. # Object Anywhere, End-Effector Anywhere (Reaching) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEAnywhere-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=fbdrawerbottom env.scene.receptive_object=fbdrawerbox # Object Resting, End-Effector Grasped (Near Object) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectRestingEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=fbdrawerbottom env.scene.receptive_object=fbdrawerbox \ env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 @@ -205,14 +227,14 @@ Reproduce our training results from scratch. # Object Anywhere, End-Effector Grasped (Grasped) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=fbdrawerbottom env.scene.receptive_object=fbdrawerbox \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Partially Assembled, End-Effector Grasped (Near Goal) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectPartiallyAssembledEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=fbdrawerbottom env.scene.receptive_object=fbdrawerbox \ env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 @@ -285,7 +307,7 @@ Reproduce our training results from scratch. --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-v0 \ --num_envs 16384 \ --logger wandb \ - --headless \ + --visualizer none \ --distributed \ env.scene.insertive_object=fbdrawerbottom \ env.scene.receptive_object=fbdrawerbox @@ -301,7 +323,7 @@ Reproduce our training results from scratch. --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-v0 \ --num_envs 16384 \ --logger wandb \ - --headless \ + --visualizer none \ --distributed \ env.scene.insertive_object=fbdrawerbottom \ env.scene.receptive_object=fbdrawerbox \ @@ -315,11 +337,11 @@ Reproduce our training results from scratch. * - .. figure:: ../../../source/_static/publications/omnireset/drawer_success_rate_seeds.jpg :width: 100% - :alt: Drawer assembly success rate over steps + :alt: Drawer assembly success rate over PPO updates - .. figure:: ../../../source/_static/publications/omnireset/drawer_success_rate_seeds_walltime.jpg :width: 100% - :alt: Drawer assembly success rate over wall clock time + :alt: Drawer assembly success rate over cumulative logged runtime .. tab-item:: Peg Insertion @@ -331,13 +353,13 @@ Reproduce our training results from scratch. .. code:: bash - python scripts_v2/tools/record_partial_assemblies.py --task OmniReset-PartialAssemblies-v0 --num_envs 10 --num_trajectories 10 --headless env.scene.insertive_object=peg env.scene.receptive_object=peghole + python scripts_v2/tools/record_partial_assemblies.py --task OmniReset-PartialAssemblies-v0 --num_envs 10 --num_trajectories 10 --visualizer none env.scene.insertive_object=peg env.scene.receptive_object=peghole **Step 2: Sample Grasp Poses** (~1 minute) .. code:: bash - python scripts_v2/tools/record_grasps.py --task OmniReset-Robotiq2f85-GraspSampling-v0 --num_envs 8192 --num_grasps 1000 --headless env.scene.object=peg + python scripts_v2/tools/record_grasps.py --task OmniReset-Robotiq2f85-GraspSampling-v0 --num_envs 8192 --num_grasps 1000 --visualizer none env.scene.object=peg **Step 3: Generate Reset State Datasets** (~1 min to multiple hours depending on the reset and task) @@ -346,13 +368,13 @@ Reproduce our training results from scratch. # Object Anywhere, End-Effector Anywhere (Reaching) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEAnywhere-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=peg env.scene.receptive_object=peghole # Object Resting, End-Effector Grasped (Near Object) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectRestingEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=peg env.scene.receptive_object=peghole \ env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 @@ -360,14 +382,14 @@ Reproduce our training results from scratch. # Object Anywhere, End-Effector Grasped (Grasped) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=peg env.scene.receptive_object=peghole \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Partially Assembled, End-Effector Grasped (Near Goal) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectPartiallyAssembledEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=peg env.scene.receptive_object=peghole \ env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 @@ -440,7 +462,7 @@ Reproduce our training results from scratch. --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-v0 \ --num_envs 16384 \ --logger wandb \ - --headless \ + --visualizer none \ --distributed \ env.scene.insertive_object=peg \ env.scene.receptive_object=peghole @@ -456,7 +478,7 @@ Reproduce our training results from scratch. --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-v0 \ --num_envs 16384 \ --logger wandb \ - --headless \ + --visualizer none \ --distributed \ env.scene.insertive_object=peg \ env.scene.receptive_object=peghole \ @@ -470,19 +492,20 @@ Reproduce our training results from scratch. * - .. figure:: ../../../source/_static/publications/omnireset/peg_success_rate_seeds.jpg :width: 100% - :alt: Peg insertion success rate over steps + :alt: Peg insertion success rate over PPO updates - .. figure:: ../../../source/_static/publications/omnireset/peg_success_rate_seeds_walltime.jpg :width: 100% - :alt: Peg insertion success rate over wall clock time + :alt: Peg insertion success rate over cumulative logged runtime .. tab-item:: Rectangle on Wall - .. note:: + .. warning:: - On Isaac Lab 3.0 this task plateaus at about 62-65% end-of-episode success on all three - seeds, well below the other tasks (90-99%). Expect a lower final success rate than - for the other tasks. + **Isaac Lab 3 regression:** Rectangle success stalls at 62-65%. + For now, use `UWLab v1.2.0 `_ + with Isaac Lab pinned to 2.x. Have a fix? + `Send a PR `_. We'll take a look. .. note:: @@ -492,13 +515,13 @@ Reproduce our training results from scratch. .. code:: bash - python scripts_v2/tools/record_partial_assemblies.py --task OmniReset-PartialAssemblies-v0 --num_envs 10 --num_trajectories 10 --headless env.scene.insertive_object=rectangle env.scene.receptive_object=wall + python scripts_v2/tools/record_partial_assemblies.py --task OmniReset-PartialAssemblies-v0 --num_envs 10 --num_trajectories 10 --visualizer none env.scene.insertive_object=rectangle env.scene.receptive_object=wall **Step 2: Sample Grasp Poses** (~1 minute) .. code:: bash - python scripts_v2/tools/record_grasps.py --task OmniReset-Robotiq2f85-GraspSampling-v0 --num_envs 8192 --num_grasps 1000 --headless env.scene.object=rectangle + python scripts_v2/tools/record_grasps.py --task OmniReset-Robotiq2f85-GraspSampling-v0 --num_envs 8192 --num_grasps 1000 --visualizer none env.scene.object=rectangle **Step 3: Generate Reset State Datasets** (~1 min to multiple hours depending on the reset and task) @@ -507,13 +530,13 @@ Reproduce our training results from scratch. # Object Anywhere, End-Effector Anywhere (Reaching) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEAnywhere-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=rectangle env.scene.receptive_object=wall # Object Resting, End-Effector Grasped (Near Object) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectRestingEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=rectangle env.scene.receptive_object=wall \ env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 @@ -521,14 +544,14 @@ Reproduce our training results from scratch. # Object Anywhere, End-Effector Grasped (Grasped) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=rectangle env.scene.receptive_object=wall \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Partially Assembled, End-Effector Grasped (Near Goal) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectPartiallyAssembledEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=rectangle env.scene.receptive_object=wall \ env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 @@ -601,7 +624,7 @@ Reproduce our training results from scratch. --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-v0 \ --num_envs 16384 \ --logger wandb \ - --headless \ + --visualizer none \ --distributed \ env.scene.insertive_object=rectangle \ env.scene.receptive_object=wall @@ -617,16 +640,12 @@ Reproduce our training results from scratch. --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-v0 \ --num_envs 16384 \ --logger wandb \ - --headless \ + --visualizer none \ --distributed \ env.scene.insertive_object=rectangle \ env.scene.receptive_object=wall \ env.events.reset_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 - .. warning:: - - This task has the least stable training. Some seeds plateau around 60%; if a run dies, reload from a checkpoint before the crash. You may need to try a few seeds (plot below is seed 0). - **Training Curves** .. list-table:: @@ -635,11 +654,11 @@ Reproduce our training results from scratch. * - .. figure:: ../../../source/_static/publications/omnireset/rectangle_success_rate_seeds.jpg :width: 100% - :alt: Rectangle on wall success rate over steps + :alt: Rectangle on wall success rate over PPO updates - .. figure:: ../../../source/_static/publications/omnireset/rectangle_success_rate_seeds_walltime.jpg :width: 100% - :alt: Rectangle on wall success rate over wall clock time + :alt: Rectangle on wall success rate over cumulative logged runtime .. tab-item:: Cube Stacking @@ -651,13 +670,13 @@ Reproduce our training results from scratch. .. code:: bash - python scripts_v2/tools/record_partial_assemblies.py --task OmniReset-PartialAssemblies-v0 --num_envs 10 --num_trajectories 10 --headless env.scene.insertive_object=cube env.scene.receptive_object=cube + python scripts_v2/tools/record_partial_assemblies.py --task OmniReset-PartialAssemblies-v0 --num_envs 10 --num_trajectories 10 --visualizer none env.scene.insertive_object=cube env.scene.receptive_object=cube **Step 2: Sample Grasp Poses** (~1 minute) .. code:: bash - python scripts_v2/tools/record_grasps.py --task OmniReset-Robotiq2f85-GraspSampling-v0 --num_envs 8192 --num_grasps 1000 --headless env.scene.object=cube + python scripts_v2/tools/record_grasps.py --task OmniReset-Robotiq2f85-GraspSampling-v0 --num_envs 8192 --num_grasps 1000 --visualizer none env.scene.object=cube **Step 3: Generate Reset State Datasets** (~1 min to multiple hours depending on the reset and task) @@ -666,13 +685,13 @@ Reproduce our training results from scratch. # Object Anywhere, End-Effector Anywhere (Reaching) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEAnywhere-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=cube env.scene.receptive_object=cube # Object Resting, End-Effector Grasped (Near Object) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectRestingEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=cube env.scene.receptive_object=cube \ env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 @@ -680,14 +699,14 @@ Reproduce our training results from scratch. # Object Anywhere, End-Effector Grasped (Grasped) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=cube env.scene.receptive_object=cube \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Partially Assembled, End-Effector Grasped (Near Goal) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectPartiallyAssembledEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=cube env.scene.receptive_object=cube \ env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 @@ -760,7 +779,7 @@ Reproduce our training results from scratch. --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-v0 \ --num_envs 16384 \ --logger wandb \ - --headless \ + --visualizer none \ --distributed \ env.scene.insertive_object=cube \ env.scene.receptive_object=cube @@ -776,7 +795,7 @@ Reproduce our training results from scratch. --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-v0 \ --num_envs 16384 \ --logger wandb \ - --headless \ + --visualizer none \ --distributed \ env.scene.insertive_object=cube \ env.scene.receptive_object=cube \ @@ -790,11 +809,11 @@ Reproduce our training results from scratch. * - .. figure:: ../../../source/_static/publications/omnireset/cube_success_rate_seeds.jpg :width: 100% - :alt: Cube stacking success rate over steps + :alt: Cube stacking success rate over PPO updates - .. figure:: ../../../source/_static/publications/omnireset/cube_success_rate_seeds_walltime.jpg :width: 100% - :alt: Cube stacking success rate over wall clock time + :alt: Cube stacking success rate over cumulative logged runtime .. tab-item:: Cupcake on Plate @@ -806,13 +825,13 @@ Reproduce our training results from scratch. .. code:: bash - python scripts_v2/tools/record_partial_assemblies.py --task OmniReset-PartialAssemblies-v0 --num_envs 10 --num_trajectories 10 --headless env.scene.insertive_object=cupcake env.scene.receptive_object=plate + python scripts_v2/tools/record_partial_assemblies.py --task OmniReset-PartialAssemblies-v0 --num_envs 10 --num_trajectories 10 --visualizer none env.scene.insertive_object=cupcake env.scene.receptive_object=plate **Step 2: Sample Grasp Poses** (~1 minute) .. code:: bash - python scripts_v2/tools/record_grasps.py --task OmniReset-Robotiq2f85-GraspSampling-v0 --num_envs 8192 --num_grasps 1000 --headless env.scene.object=cupcake + python scripts_v2/tools/record_grasps.py --task OmniReset-Robotiq2f85-GraspSampling-v0 --num_envs 8192 --num_grasps 1000 --visualizer none env.scene.object=cupcake **Step 3: Generate Reset State Datasets** (~1 min to multiple hours depending on the reset and task) @@ -821,13 +840,13 @@ Reproduce our training results from scratch. # Object Anywhere, End-Effector Anywhere (Reaching) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEAnywhere-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=cupcake env.scene.receptive_object=plate # Object Resting, End-Effector Grasped (Near Object) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectRestingEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=cupcake env.scene.receptive_object=plate \ env.events.reset_insertive_object_pose_from_reset_states.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 @@ -835,14 +854,14 @@ Reproduce our training results from scratch. # Object Anywhere, End-Effector Grasped (Grasped) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectAnywhereEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=cupcake env.scene.receptive_object=plate \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 # Object Partially Assembled, End-Effector Grasped (Near Goal) python scripts_v2/tools/record_reset_states.py \ --task OmniReset-UR5eRobotiq2f85-ObjectPartiallyAssembledEEGrasped-v0 \ - --num_envs 4096 --num_reset_states 10000 --headless \ + --num_envs 4096 --num_reset_states 10000 --visualizer none \ env.scene.insertive_object=cupcake env.scene.receptive_object=plate \ env.events.reset_insertive_object_pose_from_partial_assembly_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 \ env.events.reset_end_effector_pose_from_grasp_dataset.params.dataset_dir=./Datasets/OmniReset_isaaclab3 @@ -915,7 +934,7 @@ Reproduce our training results from scratch. --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-v0 \ --num_envs 16384 \ --logger wandb \ - --headless \ + --visualizer none \ --distributed \ env.scene.insertive_object=cupcake \ env.scene.receptive_object=plate @@ -931,7 +950,7 @@ Reproduce our training results from scratch. --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-v0 \ --num_envs 16384 \ --logger wandb \ - --headless \ + --visualizer none \ --distributed \ env.scene.insertive_object=cupcake \ env.scene.receptive_object=plate \ @@ -945,11 +964,11 @@ Reproduce our training results from scratch. * - .. figure:: ../../../source/_static/publications/omnireset/cupcake_success_rate_seeds.jpg :width: 100% - :alt: Cupcake on plate success rate over steps + :alt: Cupcake on plate success rate over PPO updates - .. figure:: ../../../source/_static/publications/omnireset/cupcake_success_rate_seeds_walltime.jpg :width: 100% - :alt: Cupcake on plate success rate over wall clock time + :alt: Cupcake on plate success rate over cumulative logged runtime ---- diff --git a/docs/source/publications/omnireset/sim2real.rst b/docs/source/publications/omnireset/sim2real.rst index 70f45470..e4a051f1 100644 --- a/docs/source/publications/omnireset/sim2real.rst +++ b/docs/source/publications/omnireset/sim2real.rst @@ -12,15 +12,15 @@ Our system identification follows the `PACE `_ Pipeline overview ----------------- -1. **Robot setup** — UR5e/UR7e hardware config, robot calibration & USD, FK verification, metadata. Re-run reset state collection and RL training from :doc:`rl_training` (geometry-dependent). Install the diffusion_policy repo for real-robot control and sysid data collection. +1. **Robot setup**: UR5e/UR7e hardware config, robot calibration & USD, FK verification, metadata. Re-run reset state collection and RL training from :doc:`rl_training` (geometry-dependent). Install the diffusion_policy repo for real-robot control and sysid data collection. -2. **System identification** — Collect chirp on real robot, run CMA-ES in UWLab, verify fit, write sysid params to metadata, teleop to verify. +2. **System identification**: Collect chirp on real robot, run CMA-ES in UWLab, verify fit, write sysid params to metadata, teleop to verify. -3. **Finetune** — Select best Stage-1 checkpoint, finetune with ADR, evaluate. +3. **Finetune**: Select best Stage-1 checkpoint, finetune with ADR, evaluate. -4. **Camera & hardware setup** — Mount cameras (D415/D435/D455), print task objects, calibrate camera extrinsics. +4. **Camera & hardware setup**: Mount cameras (D415/D435/D455), print task objects, calibrate camera extrinsics. -5. **Next** — :doc:`distillation` for vision policy training and real-robot deployment. +5. **Next**: :doc:`distillation` for vision policy training and real-robot deployment. ---- @@ -97,7 +97,7 @@ Collect (joint_pos, ee_pose) pairs from the simulator using IK-based workspace s conda activate env_uwlab cd /UWLab python scripts_v2/tools/sim2real/collect_fk_pairs.py \ - --num_samples 4 --output /tmp/fk_pairs.npz --headless + --num_samples 4 --output /tmp/fk_pairs.npz --visualizer none .. code:: bash @@ -158,7 +158,7 @@ Use CMA-ES to optimize simulator dynamics parameters (armature, friction, motor conda activate env_uwlab cd /UWLab - python scripts_v2/tools/sim2real/sysid_ur5e_osc.py --headless \ + python scripts_v2/tools/sim2real/sysid_ur5e_osc.py --visualizer none \ --num_envs 512 \ --real_data /tmp/sysid_data_real.pt \ --max_iter 200 @@ -169,7 +169,7 @@ Plot simulated vs. real joint trajectories using the best checkpoint: .. code:: bash - python scripts_v2/tools/sim2real/plot_sysid_fit.py --headless \ + python scripts_v2/tools/sim2real/plot_sysid_fit.py --visualizer none \ --checkpoint logs/sysid//checkpoint_0200.pt \ --real_data /tmp/sysid_data_real.pt @@ -227,7 +227,7 @@ All commands below run in the ``env_uwlab`` environment from the UWLab directory --action_noise 2.0 \ --eval_steps 1000 \ --num_envs 4096 \ - --headless \ + --visualizer none \ env.scene.insertive_object=peg \ env.scene.receptive_object=peghole @@ -239,7 +239,7 @@ All commands below run in the ``env_uwlab`` environment from the UWLab directory --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Finetune-v0 \ --num_envs 4096 \ --logger wandb \ - --headless \ + --visualizer none \ --resume_path \ env.scene.insertive_object=peg \ env.scene.receptive_object=peghole @@ -281,7 +281,7 @@ All commands below run in the ``env_uwlab`` environment from the UWLab directory --action_noise 2.0 \ --eval_steps 1000 \ --num_envs 4096 \ - --headless \ + --visualizer none \ env.scene.insertive_object=fbleg \ env.scene.receptive_object=fbtabletop @@ -296,7 +296,7 @@ All commands below run in the ``env_uwlab`` environment from the UWLab directory --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Finetune-v0 \ --num_envs 16384 \ --logger wandb \ - --headless \ + --visualizer none \ --distributed \ --resume_path \ env.scene.insertive_object=fbleg \ @@ -339,7 +339,7 @@ All commands below run in the ``env_uwlab`` environment from the UWLab directory --action_noise 2.0 \ --eval_steps 1000 \ --num_envs 4096 \ - --headless \ + --visualizer none \ env.scene.insertive_object=fbdrawerbottom \ env.scene.receptive_object=fbdrawerbox @@ -351,7 +351,7 @@ All commands below run in the ``env_uwlab`` environment from the UWLab directory --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Finetune-v0 \ --num_envs 8192 \ --logger wandb \ - --headless \ + --visualizer none \ --resume_path \ env.scene.insertive_object=fbdrawerbottom \ env.scene.receptive_object=fbdrawerbox @@ -390,8 +390,8 @@ Camera & Hardware Setup We use a **three-camera setup** with Intel RealSense depth cameras: -* **Wrist camera** — D415 mounted on the Robotiq 2F-85 gripper via a 3D-printed bracket. -* **Two third-person cameras** — D435 and D455 on tripods, providing front and side views. +* **Wrist camera**: D415 mounted on the Robotiq 2F-85 gripper via a 3D-printed bracket. +* **Two third-person cameras**: D435 and D455 on tripods, providing front and side views. Any combination of D415 / D435 / D455 works for any of the three viewpoints (the D455 has a wider baseline and higher depth quality, so prefer it when available). @@ -433,7 +433,7 @@ Virtual cameras in simulation must match your real camera poses and intrinsics s 1. The calibration workflow switches between two environments: ``robodiff_real`` for real-robot scripts (Step 1) and ``env_uwlab`` for UWLab simulation scripts (Step 2). Set up ``robodiff_real`` in :ref:`Installing Diffusion Policy ` above. -2. Print an ArUco marker — the calibration scripts use dictionary **6x6_50**, marker **ID 12**, printed at **150 mm**. Download the printable PDF: :download:`marker_6x6_150mm_id12.pdf <../../_static/publications/omnireset/marker_6x6_150mm_id12.pdf>`. +2. Print an ArUco marker: the calibration scripts use dictionary **6x6_50**, marker **ID 12**, printed at **150 mm**. Download the printable PDF: :download:`marker_6x6_150mm_id12.pdf <../../_static/publications/omnireset/marker_6x6_150mm_id12.pdf>`. 3. Place the printed marker flat on the table near the robot base (see the :ref:`camera setup photo ` above for an example placement). Measure the offset (in meters) from the marker center to the robot base-frame origin and update ``aruco_offset`` in ``0_camera_calibrate.py``. If you place the marker in the same position as our setup photo, the default ``[0.24, 0.0, 0.0]`` should work. @@ -453,7 +453,7 @@ Real-world scripts live in the `diffusion_policy /UWLab python scripts_v2/tools/sim2real/align_cameras.py \ - --enable_cameras \ - --headless \ + --visualizer none \ --camera front_camera \ --real_image /path/to/real_front.png \ --joint_angles @@ -491,7 +490,7 @@ Real-world scripts live in the `diffusion_policy /UWLab python scripts_v2/tools/sim2real/align_cameras.py \ - --enable_cameras \ - --headless \ + --visualizer none \ --camera side_camera \ --real_image /path/to/real_side.png \ --joint_angles @@ -529,7 +527,7 @@ Real-world scripts live in the `diffusion_policy /UWLab python scripts_v2/tools/sim2real/align_cameras.py \ - --enable_cameras \ - --headless \ + --visualizer none \ --camera wrist_camera \ --real_image /path/to/real_wrist.png \ --joint_angles diff --git a/docs/source/setup/installation/pip_installation.rst b/docs/source/setup/installation/pip_installation.rst index e8d96570..9340c8c9 100644 --- a/docs/source/setup/installation/pip_installation.rst +++ b/docs/source/setup/installation/pip_installation.rst @@ -46,7 +46,7 @@ Installing dependencies .. code-block:: none - pip install "isaacsim[all,extscache]==6.0.1.0" --extra-index-url https://pypi.nvidia.com + pip install "isaacsim[all,extscache]==6.1.0.0" --extra-index-url https://pypi.nvidia.com - Install a CUDA-enabled PyTorch build that matches your system architecture: diff --git a/scripts/reinforcement_learning/rsl_rl/convert_checkpoint_layout.py b/scripts/reinforcement_learning/rsl_rl/convert_checkpoint_layout.py new file mode 100644 index 00000000..8e4372b6 --- /dev/null +++ b/scripts/reinforcement_learning/rsl_rl/convert_checkpoint_layout.py @@ -0,0 +1,51 @@ +# Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). +# All Rights Reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Convert a published OmniReset state expert from beta to EA observation order on CPU.""" + +from __future__ import annotations + +import argparse +import hashlib +import torch +from itertools import chain +from pathlib import Path +from tensordict import TensorDict + +from rsl_rl.models import MLPModel + +from uwlab_rl.rsl_rl.checkpoint_layout import convert_omnireset_checkpoint + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--checkpoint", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + if args.output.exists(): + raise FileExistsError(f"Refusing to overwrite {args.output}") + raw = args.checkpoint.read_bytes() + saved = torch.load(args.checkpoint, map_location="cpu", weights_only=True) + obs = TensorDict({"policy": torch.zeros(1, 43)}, batch_size=[1]) + groups = {"actor": ["policy"], "critic": ["policy"]} + actor = MLPModel( + obs, groups, "actor", 7, hidden_dims=[512, 256, 128, 64], activation="elu", obs_normalization=True, + distribution_cfg={"class_name": "HeteroscedasticGaussianDistribution", "init_std": 1.0, + "std_type": "log", "std_range": [0.001, 2.0]}, + ) + critic = MLPModel(obs, groups, "critic", 1, hidden_dims=[512, 256, 128, 64], activation="elu", obs_normalization=True) + actor.load_state_dict(saved["actor_state_dict"], strict=True) + critic.load_state_dict(saved["critic_state_dict"], strict=True) + optimizer = torch.optim.Adam(chain(actor.parameters(), critic.parameters())) + optimizer.load_state_dict(saved["optimizer_state_dict"]) + converted = convert_omnireset_checkpoint(saved, actor, critic, optimizer, hashlib.sha256(raw).hexdigest()) + args.output.parent.mkdir(parents=True, exist_ok=True) + with args.output.open("xb") as stream: + torch.save(converted, stream) + print(f"Saved EA-layout checkpoint to {args.output}; original unchanged: {args.checkpoint}") + + +if __name__ == "__main__": + main() diff --git a/scripts/reinforcement_learning/rsl_rl/train.py b/scripts/reinforcement_learning/rsl_rl/train.py index bee6d5dc..36bd4703 100644 --- a/scripts/reinforcement_learning/rsl_rl/train.py +++ b/scripts/reinforcement_learning/rsl_rl/train.py @@ -58,18 +58,14 @@ """Check for minimum supported RSL-RL version.""" import importlib.metadata as metadata -import platform from packaging import version # check minimum supported rsl-rl version -RSL_RL_VERSION = "3.0.1" +RSL_RL_VERSION = "5.4.1" installed_version = metadata.version("rsl-rl-lib") if version.parse(installed_version) < version.parse(RSL_RL_VERSION): - if platform.system() == "Windows": - cmd = [r".\isaaclab.bat", "-p", "-m", "pip", "install", f"rsl-rl-lib=={RSL_RL_VERSION}"] - else: - cmd = ["./isaaclab.sh", "-p", "-m", "pip", "install", f"rsl-rl-lib=={RSL_RL_VERSION}"] + cmd = [sys.executable, "-m", "pip", "install", "-e", "source/uwlab_rl[rsl-rl]"] print( f"Please install the correct version of RSL-RL.\nExisting version is: '{installed_version}'" f" and required version is: '{RSL_RL_VERSION}'.\nTo install the correct version, run:" diff --git a/scripts_v2/tools/sim2real/align_cameras.py b/scripts_v2/tools/sim2real/align_cameras.py index f6237dae..946cf845 100644 --- a/scripts_v2/tools/sim2real/align_cameras.py +++ b/scripts_v2/tools/sim2real/align_cameras.py @@ -16,14 +16,14 @@ Usage (front camera example): python scripts_v2/tools/sim2real/align_cameras.py \ - --enable_cameras \ + --visualizer none \ --camera front_camera \ --real_image /path/to/real_front.png \ --joint_angles -12.0 -80.0 63.0 -30.6 -97.9 174.3 Usage (wrist camera example): python scripts_v2/tools/sim2real/align_cameras.py \ - --enable_cameras \ + --visualizer none \ --camera wrist_camera \ --real_image /path/to/real_wrist.png \ --joint_angles -12.0 -80.0 63.0 -30.6 -97.9 174.3 diff --git a/scripts_v2/tools/sim2real/plot_sysid_fit.py b/scripts_v2/tools/sim2real/plot_sysid_fit.py index 836c6b26..e1f0a713 100644 --- a/scripts_v2/tools/sim2real/plot_sysid_fit.py +++ b/scripts_v2/tools/sim2real/plot_sysid_fit.py @@ -323,7 +323,7 @@ def main(): ee_frame_idx, sim_dt, T_steps, - headless=args_cli.headless, + headless=not app_launcher.has_gui(), ) sim_joints = result["joint_positions"] diff --git a/source/uwlab/config/extension.toml b/source/uwlab/config/extension.toml index 79ad16c1..19087c2b 100644 --- a/source/uwlab/config/extension.toml +++ b/source/uwlab/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.9.0" +version = "0.9.1" # Description title = "UW Lab framework for Robot Learning" diff --git a/source/uwlab/docs/CHANGELOG.rst b/source/uwlab/docs/CHANGELOG.rst index ee100e05..a56e3c46 100644 --- a/source/uwlab/docs/CHANGELOG.rst +++ b/source/uwlab/docs/CHANGELOG.rst @@ -1,6 +1,16 @@ Changelog --------- +0.9.1 (2026-09-26) +~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Updated mesh conversion to enable Isaac Sim extensions through the Isaac Lab API. + Launch the simulator before invoking conversion helpers. + + 0.9.0 (2026-09-16) ~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab/uwlab/sim/converters/mesh_converter.py b/source/uwlab/uwlab/sim/converters/mesh_converter.py index e98ce38d..5908f303 100644 --- a/source/uwlab/uwlab/sim/converters/mesh_converter.py +++ b/source/uwlab/uwlab/sim/converters/mesh_converter.py @@ -11,8 +11,13 @@ import omni.kit.commands from isaaclab.sim.converters.asset_converter_base import AssetConverterBase from isaaclab.sim.schemas import schemas -from isaaclab.sim.utils import clone, export_prim_to_file, get_all_matching_child_prims, safe_set_attribute_on_usd_prim -from isaacsim.core.experimental.utils.app import enable_extension +from isaaclab.sim.utils import ( + clone, + enable_extension, + export_prim_to_file, + get_all_matching_child_prims, + safe_set_attribute_on_usd_prim, +) from pxr import Sdf, Usd, UsdGeom, UsdPhysics, UsdShade, UsdUtils from .mesh_converter_cfg import MeshConverterCfg diff --git a/source/uwlab_assets/config/extension.toml b/source/uwlab_assets/config/extension.toml index bf4b4ff6..b215c4ed 100644 --- a/source/uwlab_assets/config/extension.toml +++ b/source/uwlab_assets/config/extension.toml @@ -1,6 +1,6 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.6.0" +version = "0.6.1" # Description title = "UW Lab Assets" diff --git a/source/uwlab_assets/docs/CHANGELOG.rst b/source/uwlab_assets/docs/CHANGELOG.rst index 038a1526..69eda894 100644 --- a/source/uwlab_assets/docs/CHANGELOG.rst +++ b/source/uwlab_assets/docs/CHANGELOG.rst @@ -1,6 +1,19 @@ Changelog --------- +0.6.1 (2026-09-26) +~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Aligned the USD Python provider with Isaac Lab 3.0 Early Access using ``usd-exchange``. + Use a fresh environment when upgrading to avoid overlapping ``pxr`` files from ``usd-core``. + The robot and object asset contents were unchanged. +* Pinned the EA asset revision containing converted OmniReset checkpoints. The beta and 2.x + branches remain available for their original observation layouts. + + 0.6.0 (2026-09-16) ~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_assets/setup.py b/source/uwlab_assets/setup.py index ff0b971b..5a247890 100644 --- a/source/uwlab_assets/setup.py +++ b/source/uwlab_assets/setup.py @@ -17,7 +17,7 @@ # Minimum dependencies required prior to installation INSTALL_REQUIRES = [ - "usd-core", + "usd-exchange==2.3.0", ] # Installation operation diff --git a/source/uwlab_assets/uwlab_assets/__init__.py b/source/uwlab_assets/uwlab_assets/__init__.py index c61616be..45b69503 100644 --- a/source/uwlab_assets/uwlab_assets/__init__.py +++ b/source/uwlab_assets/uwlab_assets/__init__.py @@ -24,13 +24,13 @@ UWLAB_CLOUD_ASSETS_REPO = "https://huggingface.co/datasets/UW-Lab/uwlab-assets" """HuggingFace dataset repository holding the cloud assets.""" -UWLAB_CLOUD_ASSETS_REVISION = "5ea494fdd7eac242c0ba147fe6508c68abc898ac" # branch isaaclab3 +UWLAB_CLOUD_ASSETS_REVISION = "83860532010b2737aa80d6e8621235ee554186f0" # branch isaaclab3-ea """Pinned commit of :data:`UWLAB_CLOUD_ASSETS_REPO`. Pinned rather than a branch name so that asset changes on HuggingFace are opt-in: bump this -constant deliberately when new assets or datasets are published. Isaac Lab 3.0 assets live on the -``isaaclab3`` branch of the repository (quaternions in ``(x, y, z, w)``); ``main`` keeps the Isaac -Lab 2.x files. +constant deliberately when new assets or datasets are published. Isaac Lab 3.0 EA assets and +converted state checkpoints live on ``isaaclab3-ea``. The ``isaaclab3`` branch retains beta +checkpoints with the legacy observation order; ``main`` keeps the Isaac Lab 2.x files. """ UWLAB_CLOUD_ASSETS_DIR = f"{UWLAB_CLOUD_ASSETS_REPO}/resolve/{UWLAB_CLOUD_ASSETS_REVISION}" diff --git a/source/uwlab_rl/config/extension.toml b/source/uwlab_rl/config/extension.toml index c81a7449..4df983cc 100644 --- a/source/uwlab_rl/config/extension.toml +++ b/source/uwlab_rl/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.2.0" +version = "0.2.1" # Description title = "UW Lab RL" diff --git a/source/uwlab_rl/docs/CHANGELOG.rst b/source/uwlab_rl/docs/CHANGELOG.rst index c0e1a9c6..08167051 100644 --- a/source/uwlab_rl/docs/CHANGELOG.rst +++ b/source/uwlab_rl/docs/CHANGELOG.rst @@ -1,6 +1,22 @@ Changelog --------- +0.2.1 (2026-09-26) +~~~~~~~~~~~~~~~~~~ + +Added +^^^^^ + +* Added CPU conversion of OmniReset beta observation layouts to EA order, including + actor/critic normalization and Adam state without retraining or overwriting the original. + +Changed +^^^^^^^ + +* Updated the RSL-RL dependency to version 5.4.1 for Isaac Lab 3.0 Early Access. + Run ``./uwlab.sh --install`` to reinstall the pinned dependencies when upgrading. + + 0.2.0 (2026-09-16) ~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_rl/setup.py b/source/uwlab_rl/setup.py index a152db2c..3dc72e31 100644 --- a/source/uwlab_rl/setup.py +++ b/source/uwlab_rl/setup.py @@ -35,7 +35,7 @@ # Bump together with the Isaac Lab commit pinned in uwlab.sh. # TODO(port): point back at UW-Lab/rsl_rl once UW-Lab/rsl_rl#6 is merged there. RSL_RL_REPO = "https://github.com/JTran-UW/rsl_rl.git" -RSL_RL_COMMIT = "16012ab06ac24ca6a56e75e77cfb60552e1ad51a" # bump_rsl_rl_5_3 (UW-Lab/rsl_rl#6) +RSL_RL_COMMIT = "1f30b1414b880bfd9d3707b1b00dca890f3a40f9" # bump_rsl_rl_5_3 (UW-Lab/rsl_rl#6) EXTRAS_REQUIRE = { "rsl-rl": [ f"rsl-rl-lib @ git+{RSL_RL_REPO}@{RSL_RL_COMMIT}", diff --git a/source/uwlab_rl/test/test_checkpoint_layout.py b/source/uwlab_rl/test/test_checkpoint_layout.py new file mode 100644 index 00000000..44ccf3de --- /dev/null +++ b/source/uwlab_rl/test/test_checkpoint_layout.py @@ -0,0 +1,70 @@ +# Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). +# All Rights Reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +import copy +import torch +from itertools import chain + +import pytest +from rsl_rl.modules.normalization import EmpiricalNormalization + +from uwlab_rl.rsl_rl.checkpoint_layout import LAYOUT_KEY, PERMUTATION, convert_omnireset_checkpoint + + +class Model(torch.nn.Module): + def __init__(self, output_dim): + super().__init__() + self.obs_normalizer = EmpiricalNormalization(43) + self.mlp = torch.nn.Sequential(torch.nn.Linear(43, 8), torch.nn.ELU(), torch.nn.Linear(8, output_dim)) + + def forward(self, obs): + return self.mlp(self.obs_normalizer(obs)) + + +@pytest.mark.parametrize("amsgrad", [False, True]) +def test_checkpoint_layout_preserves_outputs_and_optimizer(amsgrad): + torch.manual_seed(42) + actor, critic = Model(14), Model(1) + optimizer = torch.optim.Adam(chain(actor.parameters(), critic.parameters()), amsgrad=amsgrad) + observations = torch.randn(16, 43) + actor.obs_normalizer.update(observations) + critic.obs_normalizer.update(observations) + loss = actor(observations).square().mean() + critic(observations).square().mean() + loss.backward() + optimizer.step() + checkpoint = copy.deepcopy({ + "actor_state_dict": actor.state_dict(), + "critic_state_dict": critic.state_dict(), + "optimizer_state_dict": optimizer.state_dict(), + "iter": 19, + "learning_rate": 0.001, + "infos": {"source": "fixture"}, + "logger_state": {"tot_timesteps": 128}, + }) + converted = convert_omnireset_checkpoint(checkpoint, actor, critic, optimizer, "0" * 64) + p = torch.tensor(PERMUTATION) + inverse = torch.argsort(p) + for model, key in ((actor, "actor_state_dict"), (critic, "critic_state_dict")): + restored = copy.deepcopy(model) + restored.load_state_dict(converted[key], strict=True) + torch.testing.assert_close(restored(observations[:, p]), model(observations), rtol=1e-5, atol=1e-6) + for name, original in checkpoint[key].items(): + actual = converted[key][name] + if name in ("mlp.0.weight", "obs_normalizer._mean", "obs_normalizer._var", "obs_normalizer._std"): + actual = actual[:, inverse] + assert torch.equal(actual, original) + assert torch.equal(checkpoint[key]["mlp.0.weight"], model.state_dict()["mlp.0.weight"]) + input_ids = set(converted[LAYOUT_KEY]["optimizer_input_weight_parameter_ids"].values()) + for identifier, slots in checkpoint["optimizer_state_dict"]["state"].items(): + for name, original in slots.items(): + actual = converted["optimizer_state_dict"]["state"][identifier][name] + if identifier in input_ids and name != "step": + actual = actual[:, inverse] + assert torch.equal(actual, original) + assert converted["optimizer_state_dict"]["param_groups"] == checkpoint["optimizer_state_dict"]["param_groups"] + for name in ("iter", "learning_rate", "infos", "logger_state"): + assert converted[name] == checkpoint[name] + with pytest.raises(ValueError, match="double conversion"): + convert_omnireset_checkpoint(converted, actor, critic, optimizer, "0" * 64) diff --git a/source/uwlab_rl/uwlab_rl/rsl_rl/checkpoint_layout.py b/source/uwlab_rl/uwlab_rl/rsl_rl/checkpoint_layout.py new file mode 100644 index 00000000..b615bd71 --- /dev/null +++ b/source/uwlab_rl/uwlab_rl/rsl_rl/checkpoint_layout.py @@ -0,0 +1,110 @@ +# Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). +# All Rights Reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Observation-layout migration for OmniReset state-policy checkpoints.""" + +from __future__ import annotations + +import copy +import torch +from typing import Any + +LEGACY_LAYOUT = ( + ("insertive_asset_in_receptive_asset_frame", 6), + ("prev_actions", 7), + ("joint_pos", 12), + ("end_effector_pose", 6), + ("insertive_asset_pose", 6), + ("receptive_asset_pose", 6), +) +EA_LAYOUT = LEGACY_LAYOUT[1:] + LEGACY_LAYOUT[:1] +PERMUTATION = tuple(range(6, 43)) + tuple(range(6)) +LAYOUT_KEY = "uwlab_observation_layout" + + +def convert_omnireset_checkpoint( + checkpoint: dict[str, Any], + actor: torch.nn.Module, + critic: torch.nn.Module, + optimizer: torch.optim.Optimizer, + source_sha256: str, +) -> dict[str, Any]: + """Convert a legacy 43-feature checkpoint to EA declaration order without retraining. + + Args: + checkpoint: Loaded actor, critic, normalizer and Adam checkpoint state. + actor: Actor constructed with the checkpoint's original model configuration. + critic: Critic constructed with the checkpoint's original model configuration. + optimizer: Actor-then-critic Adam optimizer with checkpoint state already loaded. + source_sha256: SHA-256 of the original checkpoint file. + + Returns: + A separate checkpoint with reordered input weights, statistics, optimizer moments and layout metadata. + """ + if LAYOUT_KEY in checkpoint: + raise ValueError("Checkpoint already has observation-layout metadata; refusing double conversion.") + if len(source_sha256) != 64: + raise ValueError("Expected the original checkpoint's SHA-256.") + bytes.fromhex(source_sha256) + names = { + id(parameter): (role, name) + for role, model in (("actor", actor), ("critic", critic)) + for name, parameter in model.named_parameters() + } + saved_groups = checkpoint["optimizer_state_dict"]["param_groups"] + if len(optimizer.param_groups) != len(saved_groups): + raise ValueError("Optimizer parameter groups do not match the checkpoint.") + input_ids = {} + for group, saved_group in zip(optimizer.param_groups, saved_groups): + if len(group["params"]) != len(saved_group["params"]): + raise ValueError("Optimizer parameter counts do not match the checkpoint.") + for parameter, parameter_id in zip(group["params"], saved_group["params"]): + role, name = names[id(parameter)] + slot = checkpoint["optimizer_state_dict"]["state"][parameter_id] + if slot["exp_avg"].shape != parameter.shape or slot["exp_avg_sq"].shape != parameter.shape: + raise ValueError(f"Optimizer state shape mismatch for {role}.{name}.") + if name == "mlp.0.weight": + input_ids[f"{role}_state_dict"] = parameter_id + if len(input_ids) != 2 or len(set(input_ids.values())) != 2: + raise ValueError("Expected separate actor and critic input weights.") + output = copy.deepcopy(checkpoint) + for key, parameter_id in input_ids.items(): + state = output[key] + weight = state["mlp.0.weight"] + if weight.ndim != 2 or weight.shape[1] != 43: + raise ValueError(f"Expected 43 input features for {key}.") + p = torch.tensor(PERMUTATION, device=weight.device) + state["mlp.0.weight"] = weight.index_select(1, p).clone() + for name in ("obs_normalizer._mean", "obs_normalizer._var", "obs_normalizer._std"): + value = state[name] + if value.shape != (1, 43): + raise ValueError(f"Unexpected normalizer shape for {key}/{name}.") + state[name] = value.index_select(1, p.to(value.device)).clone() + slot = output["optimizer_state_dict"]["state"][parameter_id] + if not {"step", "exp_avg", "exp_avg_sq"} <= slot.keys() or not set(slot) <= { + "step", + "exp_avg", + "exp_avg_sq", + "max_exp_avg_sq", + }: + raise ValueError("Only Adam/AMSGrad optimizer state is supported.") + for name in ("exp_avg", "exp_avg_sq", "max_exp_avg_sq"): + if name in slot: + value = slot[name] + if value.shape != weight.shape: + raise ValueError(f"Unexpected optimizer shape for {key}/{name}.") + slot[name] = value.index_select(1, p.to(value.device)).clone() + output[LAYOUT_KEY] = { + "schema_version": 1, + "source_layout": "omnireset43_beta_annotated_first", + "target_layout": "omnireset43_ea_declaration_order", + "source_terms": list(LEGACY_LAYOUT), + "target_terms": list(EA_LAYOUT), + "new_index_to_old_index": list(PERMUTATION), + "source_checkpoint_sha256": source_sha256, + "optimizer_input_weight_parameter_ids": input_ids, + "optimizer_state_migrated": True, + } + return output diff --git a/source/uwlab_tasks/config/extension.toml b/source/uwlab_tasks/config/extension.toml index f128703d..a4a8e9ca 100644 --- a/source/uwlab_tasks/config/extension.toml +++ b/source/uwlab_tasks/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.14.1" +version = "0.14.2" # Description title = "UW Lab Tasks" diff --git a/source/uwlab_tasks/docs/CHANGELOG.rst b/source/uwlab_tasks/docs/CHANGELOG.rst index 81e90ae1..a5370a47 100644 --- a/source/uwlab_tasks/docs/CHANGELOG.rst +++ b/source/uwlab_tasks/docs/CHANGELOG.rst @@ -1,6 +1,26 @@ Changelog --------- +0.14.2 (2026-09-26) +~~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Migrated OmniReset renderer configuration and extension loading to Isaac Lab 3.0 Early Access. + Preserved the legacy actuator execution path and existing task parameters during migration. + Use ``--visualizer none`` instead of ``--headless`` when disabling visualization. +* Deferred task MDP and ANYmal configuration imports until a task was selected, matching upstream + registration behavior while preserving the existing task IDs and configuration entry points. +* Adopted the EA observation declaration order for OmniReset. Use the converted EA experts; + convert beta checkpoints with ``convert_checkpoint_layout.py`` before loading them. + +Fixed +^^^^^ + +* Fixed renderer setup for physics-replicated scenes without changing scene replication settings. + + 0.14.1 (2026-09-21) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_tasks/test/test_environments.py b/source/uwlab_tasks/test/test_environments.py index 5d635ead..2672212c 100644 --- a/source/uwlab_tasks/test/test_environments.py +++ b/source/uwlab_tasks/test/test_environments.py @@ -22,7 +22,8 @@ import pytest from env_test_utils import _run_environments, setup_environment -from isaaclab.managers import SceneEntityCfg +from isaaclab.managers import EventManager, ObservationManager, ObservationTermCfg, SceneEntityCfg +from isaaclab.sensors import CameraCfg import uwlab_tasks # noqa: F401 @@ -70,3 +71,92 @@ def test_asset_link_velocity_frame_transform(task_family, body_ids, stationary, expected[1] = expected[1, [1, 0, 2, 4, 3, 5]] * torch.tensor([1.0, -1.0, 1.0, 1.0, -1.0, 1.0]) expected[2] *= torch.tensor([1.0, -1.0, -1.0, 1.0, -1.0, -1.0]) torch.testing.assert_close(actual, expected, rtol=1e-5, atol=1e-5) + + +@pytest.mark.isaacsim_ci +def test_omnireset_renderer_configuration(): + mdp = importlib.import_module("uwlab_tasks.manager_based.manipulation.omnireset.mdp.events") + front = CameraCfg(prim_path="/World/Front", spawn=None, width=16, height=16) + side = CameraCfg(prim_path="/World/Side", spawn=None, width=16, height=16) + cfg = SimpleNamespace(scene=SimpleNamespace(front=front, side=side, robot=object()), events=SimpleNamespace()) + settings = { + "enable_dlssg": False, + "enable_reflections": True, + "enable_ambient_occlusion": True, + "enable_dl_denoiser": True, + "antialiasing_mode": "DLAA", + } + mdp.configure_isaac_rtx(cfg, **settings) + event = cfg.events.render_settings + assert event.mode == "startup" + assert event.func is mdp.apply_isaac_rtx_settings + for camera in (front, side): + assert camera.renderer_cfg.renderer_type == "isaac_rtx" + assert camera.renderer_cfg.enable_scene_partitioning is False + for key, value in settings.items(): + assert getattr(camera.renderer_cfg.global_settings, key) == value + front.renderer_cfg.global_settings.enable_reflections = False + assert side.renderer_cfg.global_settings.enable_reflections is True + assert event.params["settings"].enable_reflections is True + + +@pytest.mark.isaacsim_ci +def test_omnireset_renderer_configuration_without_cameras(): + mdp = importlib.import_module("uwlab_tasks.manager_based.manipulation.omnireset.mdp.events") + cfg = SimpleNamespace(scene=SimpleNamespace(robot=object()), events=SimpleNamespace()) + mdp.configure_isaac_rtx(cfg, enable_dlssg=True) + mdp.configure_isaac_rtx(cfg, enable_dlssg=False) + assert list(vars(cfg.events)) == ["render_settings"] + assert cfg.events.render_settings.params["settings"].enable_dlssg is False + + +@pytest.mark.isaacsim_ci +def test_omnireset_renderer_configuration_with_replicated_scene(): + mdp = importlib.import_module("uwlab_tasks.manager_based.manipulation.omnireset.mdp.events") + scene = SimpleNamespace(replicate_physics=True) + cfg = SimpleNamespace(scene=scene, events=SimpleNamespace()) + mdp.configure_isaac_rtx(cfg, enable_dlssg=True) + handle = SimpleNamespace(deregister=lambda: None) + sim = SimpleNamespace( + is_playing=lambda: False, + physics_manager=SimpleNamespace(register_callback=lambda *args, **kwargs: handle), + ) + env = SimpleNamespace(scene=SimpleNamespace(cfg=scene), sim=sim, num_envs=1, device="cpu") + manager = EventManager(cfg.events, env) + assert manager.available_modes == ["startup"] + assert scene.replicate_physics is True + + +@pytest.mark.isaacsim_ci +def test_omnireset_checkpoint_observation_layout(): + module = importlib.import_module( + "uwlab_tasks.manager_based.manipulation.omnireset.config.ur5e_robotiq_2f85.rl_state_cfg" + ) + names = [ + "prev_actions", + "joint_pos", + "end_effector_pose", + "insertive_asset_pose", + "receptive_asset_pose", + "insertive_asset_in_receptive_asset_frame", + ] + widths = [7, 12, 6, 6, 6, 6] + for group_type in (module.ObservationsCfg.PolicyCfg, module.ObservationsCfg.CriticCfg): + group = group_type() + terms = [name for name, value in vars(group).items() if isinstance(value, ObservationTermCfg)] + assert terms[:6] == names + + def sentinel(env, width, value): + return torch.full((env.num_envs, width), value, device=env.device) + + group = module.ObservationsCfg.PolicyCfg() + for index, (name, width) in enumerate(zip(names, widths)): + term = getattr(group, name) + term.func = sentinel + term.params = {"width": width, "value": float(index + 1)} + term.noise = None + env = SimpleNamespace(num_envs=2, device="cpu", sim=SimpleNamespace(is_playing=lambda: True)) + manager = ObservationManager({"policy": group}, env) + expected = torch.cat([torch.full((2, width), float(index + 1)) for index, width in enumerate(widths)], dim=-1) + assert manager.active_terms["policy"] == names + torch.testing.assert_close(manager.compute()["policy"], expected, rtol=0, atol=0) diff --git a/source/uwlab_tasks/test/test_task_registration.py b/source/uwlab_tasks/test/test_task_registration.py new file mode 100644 index 00000000..68a7ad09 --- /dev/null +++ b/source/uwlab_tasks/test/test_task_registration.py @@ -0,0 +1,56 @@ +# Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). +# All Rights Reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +import os +import subprocess +import sys + + +def test_task_registration_without_simulator(): + """Register discoverable task IDs without importing their MDP implementations.""" + program = """ +import ast +import importlib.abc +import sys +from pathlib import Path +from unittest.mock import patch + +import gymnasium as gym +from isaaclab.app import AppLauncher + +class RejectTaskMdp(importlib.abc.MetaPathFinder): + def find_spec(self, fullname, path=None, target=None): + if fullname.startswith('uwlab_tasks.') and '.mdp' in fullname: + raise AssertionError(f'Task registration eagerly imported {fullname}') + +sys.meta_path.insert(0, RejectTaskMdp()) +with patch.object(AppLauncher, '__init__', side_effect=AssertionError('Simulator launch forbidden')): + import uwlab_tasks + +expected = set() +root = Path(uwlab_tasks.__file__).parent +for path in root.rglob('__init__.py'): + parents = [parent for parent in path.parents if parent != root and root in parent.parents] + if not all((parent / '__init__.py').is_file() for parent in parents): + continue + for node in ast.walk(ast.parse(path.read_text())): + if isinstance(node, ast.Call) and ast.unparse(node.func) == 'gym.register': + for keyword in node.keywords: + if keyword.arg == 'id' and isinstance(keyword.value, ast.Constant): + expected.add(keyword.value.value) +assert expected +assert expected <= set(gym.registry), sorted(expected - set(gym.registry)) +assert 'OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Play-v0' in expected +assert not any(name.startswith('uwlab_tasks.') and '.mdp' in name for name in sys.modules) +print(f'Registered {len(expected)} declared task IDs without loading their MDPs') +""" + result = subprocess.run( + [sys.executable, "-c", program], + env={**os.environ, "CUDA_VISIBLE_DEVICES": ""}, + capture_output=True, + text=True, + timeout=60, + ) + assert result.returncode == 0, result.stdout + result.stderr diff --git a/source/uwlab_tasks/uwlab_tasks/__init__.py b/source/uwlab_tasks/uwlab_tasks/__init__.py index ccfcba43..0eee885a 100644 --- a/source/uwlab_tasks/uwlab_tasks/__init__.py +++ b/source/uwlab_tasks/uwlab_tasks/__init__.py @@ -25,6 +25,6 @@ from isaaclab_tasks.utils import import_packages # The blacklist is used to prevent importing configs from sub-packages -_BLACKLIST_PKGS = ["utils"] +_BLACKLIST_PKGS = ["utils", ".mdp"] # Import all configs in this package import_packages(__name__, _BLACKLIST_PKGS) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/anymal_c/__init__.py b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/anymal_c/__init__.py index 52ca103c..00ae6241 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/anymal_c/__init__.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/locomotion/velocity/config/anymal_c/__init__.py @@ -5,7 +5,7 @@ import gymnasium as gym -from . import agents, flat_env_cfg, rough_env_cfg +from . import agents ## # Register Gym environments. @@ -16,7 +16,7 @@ entry_point="isaaclab.envs:ManagerBasedRLEnv", disable_env_checker=True, kwargs={ - "env_cfg_entry_point": flat_env_cfg.AnymalCRoughEnvCfg, + "env_cfg_entry_point": f"{__name__}.flat_env_cfg:AnymalCRoughEnvCfg", "rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_cfg:AnymalCRoughPPORunnerFlatCfg", "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_flat_ppo_cfg.yaml", "skrl_cfg_entry_point": f"{agents.__name__}:skrl_flat_ppo_cfg.yaml", @@ -28,7 +28,7 @@ entry_point="isaaclab.envs:ManagerBasedRLEnv", disable_env_checker=True, kwargs={ - "env_cfg_entry_point": flat_env_cfg.AnymalCFlatEnvCfg_PLAY, + "env_cfg_entry_point": f"{__name__}.flat_env_cfg:AnymalCFlatEnvCfg_PLAY", "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_flat_ppo_cfg.yaml", "rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_cfg:AnymalCRoughPPORunnerFlatCfg", "skrl_cfg_entry_point": f"{agents.__name__}:skrl_flat_ppo_cfg.yaml", @@ -41,7 +41,7 @@ entry_point="isaaclab.envs:ManagerBasedRLEnv", disable_env_checker=True, kwargs={ - "env_cfg_entry_point": rough_env_cfg.AnymalCRoughEnvCfg, + "env_cfg_entry_point": f"{__name__}.rough_env_cfg:AnymalCRoughEnvCfg", "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_rough_ppo_cfg.yaml", "rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_cfg:AnymalCRoughPPORunnerCfg", "skrl_cfg_entry_point": f"{agents.__name__}:skrl_rough_ppo_cfg.yaml", @@ -53,7 +53,7 @@ entry_point="isaaclab.envs:ManagerBasedRLEnv", disable_env_checker=True, kwargs={ - "env_cfg_entry_point": rough_env_cfg.AnymalCRoughEnvCfg_PLAY, + "env_cfg_entry_point": f"{__name__}.rough_env_cfg:AnymalCRoughEnvCfg_PLAY", "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_rough_ppo_cfg.yaml", "rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_cfg:AnymalCRoughPPORunnerCfg", "skrl_cfg_entry_point": f"{agents.__name__}:skrl_rough_ppo_cfg.yaml", diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/camera_align_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/camera_align_cfg.py index 71cceb22..72996d3d 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/camera_align_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/camera_align_cfg.py @@ -32,6 +32,7 @@ from isaaclab.managers import TerminationTermCfg as DoneTerm from isaaclab.sensors import TiledCameraCfg from isaaclab.utils import configclass +from isaaclab_physx.physics import PhysxCfg from uwlab_assets.robots.ur5e_robotiq_gripper import EXPLICIT_UR5E_ROBOTIQ_2F85 @@ -208,10 +209,13 @@ def __post_init__(self) -> None: self.scene.robot.init_state.pos = (0.0, -0.039, 0.0) self.scene.ur5_metal_support.init_state.pos = (0.0, -0.039, -0.013) + self.sim.use_newton_actuators = False + self.sim.physics = PhysxCfg(enable_external_forces_every_iteration=False) + # Render settings for visual fidelity - self.sim.render.enable_ambient_occlusion = True - self.sim.render.enable_reflections = True - self.sim.render.enable_dl_denoiser = True + task_mdp.configure_isaac_rtx( + self, enable_ambient_occlusion=True, enable_reflections=True, enable_dl_denoiser=True + ) self.sim.render_interval = 1 # rerender on reset diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/data_collection_rgb_cfg.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/data_collection_rgb_cfg.py index 1f9f41b3..b7dcb5d8 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/data_collection_rgb_cfg.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/config/ur5e_robotiq_2f85/data_collection_rgb_cfg.py @@ -626,11 +626,14 @@ def __post_init__(self): self.episode_length_s = 32.0 # Render settings - self.sim.render.enable_dlssg = False - self.sim.render.enable_ambient_occlusion = True - self.sim.render.enable_reflections = True - self.sim.render.enable_dl_denoiser = True - self.sim.render.antialiasing_mode = "DLAA" + task_mdp.configure_isaac_rtx( + self, + enable_dlssg=False, + enable_ambient_occlusion=True, + enable_reflections=True, + enable_dl_denoiser=True, + antialiasing_mode="DLAA", + ) # speeds up rendering self.sim.render_interval = self.decimation 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 c0fd89ad..30a136d0 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 @@ -203,6 +203,7 @@ def __post_init__(self): # 192 position iterations); these values back the sim-to-real transfer. self.sim.physics = PhysxCfg( solver_type=1, + enable_external_forces_every_iteration=False, max_position_iteration_count=192, max_velocity_iteration_count=1, bounce_threshold_velocity=0.02, @@ -214,8 +215,13 @@ def __post_init__(self): gpu_max_rigid_patch_count=2**23, gpu_collision_stack_size=2**31, ) + self.sim.use_newton_actuators = False + # Render settings - self.sim.render.enable_dlssg = True - self.sim.render.enable_ambient_occlusion = True - self.sim.render.enable_reflections = True - self.sim.render.enable_dl_denoiser = True + task_mdp.configure_isaac_rtx( + self, + enable_dlssg=True, + enable_ambient_occlusion=True, + enable_reflections=True, + enable_dl_denoiser=True, + ) 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 676a82a0..04ba0a55 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 @@ -273,6 +273,7 @@ def __post_init__(self): # 192 position iterations); these values back the sim-to-real transfer. self.sim.physics = PhysxCfg( solver_type=1, + enable_external_forces_every_iteration=False, max_position_iteration_count=192, max_velocity_iteration_count=1, bounce_threshold_velocity=0.02, @@ -284,8 +285,13 @@ def __post_init__(self): gpu_max_rigid_patch_count=2**23, gpu_collision_stack_size=2**31, ) + self.sim.use_newton_actuators = False + # Render settings - self.sim.render.enable_dlssg = True - self.sim.render.enable_ambient_occlusion = True - self.sim.render.enable_reflections = True - self.sim.render.enable_dl_denoiser = True + task_mdp.configure_isaac_rtx( + self, + enable_dlssg=True, + enable_ambient_occlusion=True, + enable_reflections=True, + enable_dl_denoiser=True, + ) 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 9c74f6ac..f397ea96 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 @@ -534,6 +534,7 @@ def __post_init__(self): # 192 position iterations); these values back the sim-to-real transfer. self.sim.physics = PhysxCfg( solver_type=1, + enable_external_forces_every_iteration=False, max_position_iteration_count=192, max_velocity_iteration_count=1, bounce_threshold_velocity=0.02, @@ -545,11 +546,16 @@ def __post_init__(self): gpu_max_rigid_patch_count=2**23, gpu_collision_stack_size=2**31, ) + self.sim.use_newton_actuators = False + # Render settings - self.sim.render.enable_dlssg = True - self.sim.render.enable_ambient_occlusion = True - self.sim.render.enable_reflections = True - self.sim.render.enable_dl_denoiser = True + task_mdp.configure_isaac_rtx( + self, + enable_dlssg=True, + enable_ambient_occlusion=True, + enable_reflections=True, + enable_dl_denoiser=True, + ) @configclass 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 a557e7f8..f3678795 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 @@ -698,6 +698,7 @@ def __post_init__(self): # against, so do not retune them casually. self.sim.physics = PhysxCfg( solver_type=1, + enable_external_forces_every_iteration=False, max_position_iteration_count=192, max_velocity_iteration_count=1, bounce_threshold_velocity=0.02, @@ -710,11 +711,16 @@ def __post_init__(self): gpu_collision_stack_size=2**31, ) + self.sim.use_newton_actuators = False + # Render settings - self.sim.render.enable_dlssg = True - self.sim.render.enable_ambient_occlusion = True - self.sim.render.enable_reflections = True - self.sim.render.enable_dl_denoiser = True + task_mdp.configure_isaac_rtx( + self, + enable_dlssg=True, + enable_ambient_occlusion=True, + enable_reflections=True, + enable_dl_denoiser=True, + ) # Training configuration (Stage 1: no curriculum, implicit actuator, no sysid DR) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py index 630dd964..2dcad1c3 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py @@ -21,11 +21,13 @@ import omni.usd from isaaclab.assets import Articulation, RigidObject from isaaclab.controllers import DifferentialIKControllerCfg -from isaaclab.envs import ManagerBasedEnv +from isaaclab.envs import ManagerBasedEnv, ManagerBasedEnvCfg from isaaclab.envs.mdp.actions.task_space_actions import DifferentialInverseKinematicsAction from isaaclab.managers import EventTermCfg, ManagerTermBase, SceneEntityCfg from isaaclab.markers import VisualizationMarkers from isaaclab.markers.config import FRAME_MARKER_CFG +from isaaclab.sensors import CameraCfg +from isaaclab_physx.renderers import IsaacRtxRendererCfg, IsaacRtxRendererGlobalSettingsCfg from pxr import Gf, UsdGeom, UsdLux from uwlab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg @@ -36,6 +38,32 @@ from .success_monitor_cfg import SuccessMonitorCfg +def apply_isaac_rtx_settings( + env: ManagerBasedEnv, + env_ids: torch.Tensor | None, + settings: IsaacRtxRendererGlobalSettingsCfg, +): + """Apply process-global RTX settings during environment startup.""" + from isaaclab_physx.renderers.isaac_rtx_renderer_utils import apply_isaac_rtx_global_settings + + if settings.antialiasing_mode is not None: + sim_utils.enable_extension("omni.replicator.core") + apply_isaac_rtx_global_settings(settings) + + +def configure_isaac_rtx(env_cfg: ManagerBasedEnvCfg, **settings: bool | str): + """Preserve the task's renderer settings across the EA renderer API migration.""" + global_settings = IsaacRtxRendererGlobalSettingsCfg(**settings) + env_cfg.events.render_settings = EventTermCfg( + func=apply_isaac_rtx_settings, mode="startup", params={"settings": global_settings} + ) + for sensor_cfg in vars(env_cfg.scene).values(): + if isinstance(sensor_cfg, CameraCfg): + sensor_cfg.renderer_cfg = IsaacRtxRendererCfg( + enable_scene_partitioning=False, global_settings=global_settings.copy() + ) + + class grasp_sampling_event(ManagerTermBase): """EventTerm class for grasp sampling and positioning gripper.""" @@ -2073,7 +2101,7 @@ def __init__(self, cfg: EventTermCfg, env: ManagerBasedEnv): """Initialize the randomization term.""" super().__init__(cfg, env) - from isaacsim.core.experimental.utils.app import enable_extension + from isaaclab.sim.utils import enable_extension enable_extension("omni.replicator.core") import omni.replicator.core as rep diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py index fc62bf95..40dca565 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py @@ -8,10 +8,10 @@ import numpy as np import torch -import isaacsim.core.experimental.utils.bounds as bounds_utils from isaaclab.assets import Articulation, RigidObject, RigidObjectCollection from isaaclab.envs import ManagerBasedEnv, ManagerBasedRLEnv from isaaclab.managers import ManagerTermBase, SceneEntityCfg, TerminationTermCfg +from isaaclab.sim.utils import enable_extension from isaaclab.utils import math as math_utils from uwlab_tasks.manager_based.manipulation.omnireset.mdp import utils @@ -437,6 +437,10 @@ def __init__(self, cfg: TerminationTermCfg, env: ManagerBasedEnv): self.insertive_object = env.scene[self.insertive_object_cfg.name] self.enable_visualization = cfg.params.get("enable_visualization", False) + enable_extension("isaacsim.core.experimental.utils") + import isaacsim.core.experimental.utils.bounds as bounds_utils + + self._bounds_utils = bounds_utils # Initialize OBB computation cache and compute OBBs once self._bbox_cache = bounds_utils.create_bbox_cache() @@ -448,6 +452,7 @@ def __init__(self, cfg: TerminationTermCfg, env: ManagerBasedEnv): # Store debug draw interface if visualization is enabled if self.enable_visualization: + enable_extension("isaacsim.util.debug_draw") import isaacsim.util.debug_draw._debug_draw as omni_debug_draw self._omni_debug_draw = omni_debug_draw @@ -460,7 +465,7 @@ def _compute_object_obbs(self): insertive_prim_path = self.insertive_object.cfg.prim_path.replace(".*", "0", 1) # Compute OBB in world frame using Isaac Sim's built-in functions - insertive_centroid_world, insertive_axes_world, insertive_half_extents = bounds_utils.compute_obb( + insertive_centroid_world, insertive_axes_world, insertive_half_extents = self._bounds_utils.compute_obb( insertive_prim_path, bbox_cache=self._bbox_cache ) @@ -531,7 +536,7 @@ def _compute_obb_corners_batch(self, centroids, axes, half_extents): all_corners = [] for env_idx in range(num_envs): # Use Isaac Sim's get_obb_corners function - corners_np = bounds_utils.get_obb_corners( + corners_np = self._bounds_utils.get_obb_corners( centroids_np[env_idx], axes_np[env_idx], half_extents_np ) # (8, 3) all_corners.append(corners_np) diff --git a/uwlab.sh b/uwlab.sh index ab838233..bb8a79fd 100755 --- a/uwlab.sh +++ b/uwlab.sh @@ -536,7 +536,7 @@ while [[ $# -gt 0 ]]; do # (isaaclab_rl's cfg schema follows the rsl-rl API), so the commit here # and the rsl-rl-lib commit in source/uwlab_rl/setup.py must be bumped # as a pair. Override for experiments with UWLAB_ISAACLAB_COMMIT=. - ISAACLAB_COMMIT="${UWLAB_ISAACLAB_COMMIT:-ffff603eafc6b74264a5261cc0183d6a65390d78}" # 3.0.0-beta2.patch1 + ISAACLAB_COMMIT="${UWLAB_ISAACLAB_COMMIT:-ae37b028ea415c91ea2bc32609efcd759ed2b974}" # 3.0.0-EA echo "[INFO] Installing upstream IsaacLab (pinned ${ISAACLAB_COMMIT:0:9}) in editable mode into ${UWLAB_PATH}/_isaaclab ..." repo_root="${UWLAB_PATH}/_isaaclab/IsaacLab" mkdir -p "${UWLAB_PATH}/_isaaclab" @@ -562,12 +562,43 @@ while [[ $# -gt 0 ]]; do # Isaac Lab 3.0 splits the core into per-backend packages; isaaclab # imports isaaclab_physx/isaaclab_newton/isaaclab_ov at runtime, so all # of them are required even for a single-backend install. - for ext in isaaclab isaaclab_assets isaaclab_contrib isaaclab_experimental isaaclab_newton \ - isaaclab_ov isaaclab_ovphysx isaaclab_physx isaaclab_ppisp isaaclab_tasks \ - isaaclab_tasks_experimental isaaclab_visualizers; do - ${pip_command} -e "${repo_root}/source/${ext}" --extra-index-url https://pypi.nvidia.com - done - ${pip_command} -e "${repo_root}/source/isaaclab_rl[all]" --extra-index-url https://pypi.nvidia.com + requirements_file=$(mktemp) + "${python_exe}" - "${repo_root}" "${UWLAB_PATH}" "${2:-all}" > "${requirements_file}" <<'PY' +import platform +import re +import sys +import tomllib +from pathlib import Path + +isaaclab_root, uwlab_root = (Path(value).resolve() for value in sys.argv[1:3]) +framework = sys.argv[3].replace("_", "-") +metadata = tomllib.loads((isaaclab_root / "pyproject.toml").read_text()) +project = metadata["project"] +sources = metadata["tool"]["uv"]["sources"] +requirements = list(project["dependencies"]) +for extra in ("isaacsim", "video"): + requirements.extend(project["optional-dependencies"][extra]) +if framework not in ("all", "none", "rsl-rl"): + requirements.extend(project["optional-dependencies"][framework]) +for requirement in dict.fromkeys(requirements): + name = re.match(r"[A-Za-z0-9_.-]+", requirement).group().replace("_", "-").lower() + source = sources.get(name) + if isinstance(source, dict) and "path" in source: + print("-e " + (isaaclab_root / source["path"]).resolve().as_uri()) + else: + print(requirement) +for extension in sorted((uwlab_root / "source").iterdir()): + if not (extension / "setup.py").is_file(): + continue + extra = "" + if extension.name == "uwlab_rl" and framework != "none": + extra = f"[{framework}]" + if extension.name == "uwlab_tasks" and platform.machine() == "x86_64": + extra = "[collision]" + print("-e " + extension.as_uri() + extra) +PY + ${pip_command} -r "${requirements_file}" --extra-index-url https://pypi.nvidia.com + rm "${requirements_file}" echo "[INFO] Upstream IsaacLab packages installed (editable) from local clone at ${repo_root}." # source directory find -L "${UWLAB_PATH}/source" -mindepth 1 -maxdepth 1 -type d -exec bash -c 'install_uwlab_extension "{}"' \; From b76b9a73650d4faf270e3cfd9775c2def84ec0f7 Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sat, 26 Sep 2026 02:13:18 -0700 Subject: [PATCH 08/27] Use the versioned UR5e asset with corrected gripper dynamics 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 #38 and #40. Authored MassAPI properties and remote asset hash verified; bounded live readback and checkpoint checks are recorded separately before publication approval. --- docs/source/publications/omnireset/sim2real.rst | 2 +- source/uwlab_assets/config/extension.toml | 2 +- source/uwlab_assets/docs/CHANGELOG.rst | 12 ++++++++++++ .../ur5e_robotiq_2f85_gripper.py | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/source/publications/omnireset/sim2real.rst b/docs/source/publications/omnireset/sim2real.rst index e4a051f1..b3a907f3 100644 --- a/docs/source/publications/omnireset/sim2real.rst +++ b/docs/source/publications/omnireset/sim2real.rst @@ -84,7 +84,7 @@ Install ROS 2 and set up the UR robot driver following the `NVIDIA Isaac ROS Uni **2. Update the robot USD** Download the existing calibrated robot USD from -`here `__ +`here `__ and open it in Isaac Sim. Replace the UR5e/UR7e arm in the USD with the URDF of your newly calibrated UR5e/UR7e. After replacing the arm, relink the joint that attaches the gripper to the arm. This joint connection must be re-established in Isaac Sim for the gripper to remain properly attached. **3. Verify alignment** diff --git a/source/uwlab_assets/config/extension.toml b/source/uwlab_assets/config/extension.toml index b215c4ed..ba0eef0f 100644 --- a/source/uwlab_assets/config/extension.toml +++ b/source/uwlab_assets/config/extension.toml @@ -1,6 +1,6 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.6.1" +version = "0.6.2" # Description title = "UW Lab Assets" diff --git a/source/uwlab_assets/docs/CHANGELOG.rst b/source/uwlab_assets/docs/CHANGELOG.rst index 69eda894..50640201 100644 --- a/source/uwlab_assets/docs/CHANGELOG.rst +++ b/source/uwlab_assets/docs/CHANGELOG.rst @@ -1,6 +1,18 @@ Changelog --------- +0.6.2 (2026-09-26) +~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Selected the versioned FactoryV2 UR5e/Robotiq asset with explicit knuckle mass and inertia, + camera/mount mass corrections, passive-link armature and the calibrated fingertip TCP. + The previous USD remains available under its original filename for reproducible comparisons. + Existing policies should be checked against the changed robot dynamics before deployment. + + 0.6.1 (2026-09-26) ~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_assets/uwlab_assets/robots/ur5e_robotiq_gripper/ur5e_robotiq_2f85_gripper.py b/source/uwlab_assets/uwlab_assets/robots/ur5e_robotiq_gripper/ur5e_robotiq_2f85_gripper.py index 9fe9cd1b..97e69f3d 100644 --- a/source/uwlab_assets/uwlab_assets/robots/ur5e_robotiq_gripper/ur5e_robotiq_2f85_gripper.py +++ b/source/uwlab_assets/uwlab_assets/robots/ur5e_robotiq_gripper/ur5e_robotiq_2f85_gripper.py @@ -104,7 +104,7 @@ def spawn_ur5e_without_physics_materials(prim_path, cfg, translation=None, orien UR5E_ARTICULATION = ArticulationCfg( spawn=sim_utils.UsdFileCfg( func=spawn_ur5e_without_physics_materials, - usd_path=f"{UWLAB_CLOUD_ASSETS_DIR}/Robots/UniversalRobots/Ur5e2f85RobotiqGripperCalibrated/ur5e_robotiq_gripper_d415_mount_safety_calibrated.usd", + usd_path=f"{UWLAB_CLOUD_ASSETS_DIR}/Robots/UniversalRobots/Ur5e2f85RobotiqGripperCalibrated/ur5e_robotiq_gripper_d415_mount_safety_calibrated_v2.usd", activate_contact_sensors=False, rigid_props=sim_utils.RigidBodyPropertiesCfg( disable_gravity=True, From 540c0b95a38239604dd0123b1d76ca909e5359ba Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sat, 26 Sep 2026 02:18:08 -0700 Subject: [PATCH 09/27] Keep consecutive success across unrelated environment resets 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 #41. The exact source method failed the partial/empty CPU fixtures before the fix and passed all four fixtures afterward. --- source/uwlab_tasks/config/extension.toml | 2 +- source/uwlab_tasks/docs/CHANGELOG.rst | 10 ++++++++++ source/uwlab_tasks/test/test_environments.py | 15 +++++++++++++++ .../manipulation/omnireset/mdp/rewards.py | 4 +++- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/source/uwlab_tasks/config/extension.toml b/source/uwlab_tasks/config/extension.toml index a4a8e9ca..8acad627 100644 --- a/source/uwlab_tasks/config/extension.toml +++ b/source/uwlab_tasks/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.14.2" +version = "0.14.3" # Description title = "UW Lab Tasks" diff --git a/source/uwlab_tasks/docs/CHANGELOG.rst b/source/uwlab_tasks/docs/CHANGELOG.rst index a5370a47..81326797 100644 --- a/source/uwlab_tasks/docs/CHANGELOG.rst +++ b/source/uwlab_tasks/docs/CHANGELOG.rst @@ -1,6 +1,16 @@ Changelog --------- +0.14.3 (2026-09-26) +~~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Fixed partial environment resets clearing consecutive-success counters in unrelated + environments. An empty reset selection leaves counters unchanged; ``None`` resets all. + + 0.14.2 (2026-09-26) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_tasks/test/test_environments.py b/source/uwlab_tasks/test/test_environments.py index 2672212c..58ee77da 100644 --- a/source/uwlab_tasks/test/test_environments.py +++ b/source/uwlab_tasks/test/test_environments.py @@ -160,3 +160,18 @@ def sentinel(env, width, value): expected = torch.cat([torch.full((2, width), float(index + 1)) for index, width in enumerate(widths)], dim=-1) assert manager.active_terms["policy"] == names torch.testing.assert_close(manager.compute()["policy"], expected, rtol=0, atol=0) + + +@pytest.mark.parametrize("env_ids, expected", [([1], [4, 0]), ([], [4, 2]), (None, [0, 0]), ([0, 1], [0, 0])]) +@pytest.mark.isaacsim_ci +def test_progress_context_reset_is_per_environment(env_ids, expected): + module = importlib.import_module("uwlab_tasks.manager_based.manipulation.omnireset.mdp.rewards") + context = module.ProgressContext.__new__(module.ProgressContext) + context.continuous_success_counter = torch.tensor([4, 2], dtype=torch.int32) + reference = context.continuous_success_counter + ids = None if env_ids is None else torch.tensor(env_ids, dtype=torch.long) + context.reset(ids) + assert context.continuous_success_counter is reference + assert torch.equal(reference, torch.tensor(expected, dtype=torch.int32)) + context.reset(ids) + assert torch.equal(reference, torch.tensor(expected, dtype=torch.int32)) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rewards.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rewards.py index 7b6a0c6c..2814541b 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rewards.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rewards.py @@ -112,7 +112,9 @@ def __init__(self, cfg: RewardTermCfg, env: ManagerBasedRLEnv): def reset(self, env_ids: torch.Tensor | None = None) -> None: super().reset(env_ids) - self.continuous_success_counter[:] = 0 + if env_ids is None: + env_ids = slice(None) + self.continuous_success_counter[env_ids] = 0 def __call__( self, From 6460448556903c6412976531f94ada7c7357216b Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sat, 26 Sep 2026 02:43:27 -0700 Subject: [PATCH 10/27] Resolve EA asset paths and collider frames before grasp sampling 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. --- source/uwlab_tasks/config/extension.toml | 2 +- source/uwlab_tasks/docs/CHANGELOG.rst | 12 ++++++ source/uwlab_tasks/test/test_environments.py | 37 +++++++++++++++++++ .../omnireset/mdp/collision_analyzer.py | 5 ++- .../manipulation/omnireset/mdp/events.py | 2 +- .../omnireset/mdp/rigid_object_hasher.py | 19 ++++++++-- .../omnireset/mdp/terminations.py | 4 +- 7 files changed, 72 insertions(+), 9 deletions(-) diff --git a/source/uwlab_tasks/config/extension.toml b/source/uwlab_tasks/config/extension.toml index 8acad627..b6fdc16f 100644 --- a/source/uwlab_tasks/config/extension.toml +++ b/source/uwlab_tasks/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.14.3" +version = "0.14.4" # Description title = "UW Lab Tasks" diff --git a/source/uwlab_tasks/docs/CHANGELOG.rst b/source/uwlab_tasks/docs/CHANGELOG.rst index 81326797..ee772f05 100644 --- a/source/uwlab_tasks/docs/CHANGELOG.rst +++ b/source/uwlab_tasks/docs/CHANGELOG.rst @@ -1,6 +1,18 @@ Changelog --------- +0.14.4 (2026-09-26) +~~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Resolved grasp-sampling and collision asset paths from the USD stage for both legacy and EA + environment namespace patterns, preserving natural environment-index ordering. +* Corrected cached collider-relative quaternions to scalar-last order and included complete + collider transforms in geometry hashes. Regenerate grasp datasets to use the corrected geometry checks. + + 0.14.3 (2026-09-26) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_tasks/test/test_environments.py b/source/uwlab_tasks/test/test_environments.py index 58ee77da..b4c65fa8 100644 --- a/source/uwlab_tasks/test/test_environments.py +++ b/source/uwlab_tasks/test/test_environments.py @@ -175,3 +175,40 @@ def test_progress_context_reset_is_per_environment(env_ids, expected): assert torch.equal(reference, torch.tensor(expected, dtype=torch.int32)) context.reset(ids) assert torch.equal(reference, torch.tensor(expected, dtype=torch.int32)) + + +@pytest.mark.parametrize("pattern", ["/World/envs/env_.*/Object", "/World/envs/env_[^/]+/Object"]) +@pytest.mark.isaacsim_ci +def test_collision_asset_paths_and_frames(monkeypatch, pattern): + from isaaclab.sim.utils import find_matching_prim_paths, get_all_matching_child_prims + from pxr import Usd, UsdGeom, UsdPhysics + + module = importlib.import_module("uwlab_tasks.manager_based.manipulation.omnireset.mdp.rigid_object_hasher") + stage = Usd.Stage.CreateInMemory() + for index in (10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11): + root = f"/World/envs/env_{index}/Object" + UsdGeom.Xform.Define(stage, root) + for name, y in (("a", 1.0), ("b", float(index + 2))): + cube = UsdGeom.Cube.Define(stage, f"{root}/{name}") + UsdPhysics.CollisionAPI.Apply(cube.GetPrim()) + cube.AddTranslateOp().Set((0.0, y, 0.0)) + monkeypatch.setattr(module.stage_utils, "get_current_stage", lambda: stage) + monkeypatch.setattr(module.stage_utils, "get_current_stage_id", lambda: None) + monkeypatch.setattr(module, "HASH_STORE", {"warp_mesh_store": {}, "__stage_id__": None}) + monkeypatch.setattr( + module, + "find_matching_prim_paths", + lambda expr, stage=None: find_matching_prim_paths(expr, stage=stage), + raising=False, + ) + monkeypatch.setattr( + module, + "get_all_matching_child_prims", + lambda path, **kwargs: get_all_matching_child_prims(path, stage=stage, **kwargs), + ) + hasher = module.RigidObjectHasher(12, pattern, device="cpu") + paths = [str(prim.GetPath()) for prim in hasher.collider_prims] + assert paths == [f"/World/envs/env_{index}/Object/{name}" for index in range(12) for name in ("a", "b")] + expected_quaternions = torch.tensor([[0.0, 0.0, 0.0, 1.0]]).expand(24, -1) + torch.testing.assert_close(hasher.collider_prim_relative_transforms[:, 3:7], expected_quaternions, rtol=0, atol=0) + assert hasher.root_prim_hashes[0] != hasher.root_prim_hashes[1] diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/collision_analyzer.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/collision_analyzer.py index a0e0b115..9fdf144c 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/collision_analyzer.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/collision_analyzer.py @@ -51,16 +51,17 @@ def __init__(self, cfg: CollisionAnalyzerCfg, env: ManagerBasedRLEnv): self.body_ids = [] self.local_pts = [] + template_path = RigidObjectHasher.resolve_prim_paths(env.num_envs, self.asset.cfg.prim_path)[0] for i, body_name in enumerate(body_names): # start = time.perf_counter() prim = get_first_matching_child_prim( - self.asset.cfg.prim_path.replace(".*", "0", 1), # we use the 0th env prim as template + template_path, # we use the 0th env prim as template predicate=lambda p: p.GetName() == body_name and p.HasAPI(UsdPhysics.RigidBodyAPI), ) local_pts = utils.sample_object_point_cloud( num_envs=env.num_envs, num_points=cfg.num_points, - prim_path_pattern=str(prim.GetPath()).replace("env_0", "env_.*", 1), + prim_path_pattern=self.asset.cfg.prim_path + str(prim.GetPath())[len(template_path) :], device=env.device, ) if local_pts is not None: diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py index 2dcad1c3..71100bea 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py @@ -169,7 +169,7 @@ def _extract_mesh_from_asset(self, asset): stage = omni.usd.get_context().get_stage() # For multi-environment setups, we need to get the first environment's path - prim_path = asset.cfg.prim_path.replace(".*", "0", 1) + prim_path = utils.RigidObjectHasher.resolve_prim_paths(self._env.num_envs, asset.cfg.prim_path, stage=stage)[0] # Get the USD prim prim = stage.GetPrimAtPath(prim_path) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rigid_object_hasher.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rigid_object_hasher.py index 9a4988e8..d27ebb9b 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rigid_object_hasher.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/rigid_object_hasher.py @@ -5,11 +5,12 @@ import hashlib import numpy as np +import re import torch import isaaclab.sim.utils.stage as stage_utils import warp as wp -from isaaclab.sim import get_all_matching_child_prims +from isaaclab.sim import find_matching_prim_paths, get_all_matching_child_prims from pxr import Gf, Usd, UsdGeom, UsdPhysics HASH_STORE = {"warp_mesh_store": {}, "__stage_id__": None} @@ -46,7 +47,7 @@ def __init__(self, num_envs, prim_path_pattern, device="cpu"): stor = HASH_STORE[prim_path_pattern] stage = stage_utils.get_current_stage() xform_cache = UsdGeom.XformCache() - prim_paths = [prim_path_pattern.replace(".*", f"{i}", 1) for i in range(num_envs)] + prim_paths = self.resolve_prim_paths(num_envs, prim_path_pattern, stage=stage) num_roots = len(prim_paths) collider_prim_env_ids = [] @@ -78,7 +79,7 @@ def __init__(self, num_envs, prim_path_pattern, device="cpu"): rel_mat_tf = Gf.Transform(child_xf * root_xf.GetInverse()) rel_quat = rel_mat_tf.GetRotation().GetQuat() rel_t = torch.tensor(rel_mat_tf.GetTranslation()) - rel_q = torch.tensor([rel_quat.GetReal(), *rel_quat.GetImaginary()]) + rel_q = torch.tensor([*rel_quat.GetImaginary(), rel_quat.GetReal()]) rel_s = torch.tensor(rel_mat_tf.GetScale()) rel_tfs.append(torch.cat([rel_t, rel_q, rel_s])) rel_tfs = torch.cat(rel_tfs) @@ -86,7 +87,7 @@ def __init__(self, num_envs, prim_path_pattern, device="cpu"): # 3: Store the collider prims hash root_hash = hashlib.sha256() - for prim, prim_rel_tf in zip(coll_prims, rel_tfs.numpy()): + for prim, prim_rel_tf in zip(coll_prims, rel_tfs.view(-1, 10).numpy()): h = hashlib.sha256() h.update( np.round(prim_rel_tf * 50).astype(np.int64) @@ -130,6 +131,16 @@ def __init__(self, num_envs, prim_path_pattern, device="cpu"): stor["root_prim_hashes"] = torch.tensor(root_prim_hashes, dtype=torch.int64, device="cpu") stor["root_prim_scales"] = torch.stack(root_prim_scales).to("cpu") + @staticmethod + def resolve_prim_paths(num_envs: int, prim_path_pattern: str, stage: Usd.Stage | None = None) -> list[str]: + """Resolve one asset root per environment in natural environment-index order.""" + stage = stage_utils.get_current_stage() if stage is None else stage + paths = find_matching_prim_paths(prim_path_pattern, stage=stage) + paths.sort(key=lambda path: [int(part) if part.isdigit() else part for part in re.split(r"(\d+)", path)]) + if len(paths) != num_envs: + raise ValueError(f"Expected {num_envs} asset roots for {prim_path_pattern}, found {len(paths)}.") + return paths + @property def num_root(self) -> int: return self.get_val("num_roots") diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py index 40dca565..d9e69ab1 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py @@ -462,7 +462,9 @@ def __init__(self, cfg: TerminationTermCfg, env: ManagerBasedEnv): def _compute_object_obbs(self): """Compute OBB for insertive object and convert to body frame.""" # Get prim path (use env 0 as template) - insertive_prim_path = self.insertive_object.cfg.prim_path.replace(".*", "0", 1) + insertive_prim_path = utils.RigidObjectHasher.resolve_prim_paths( + self._env.num_envs, self.insertive_object.cfg.prim_path + )[0] # Compute OBB in world frame using Isaac Sim's built-in functions insertive_centroid_world, insertive_axes_world, insertive_half_extents = self._bounds_utils.compute_obb( From 2467bbfa18c75491f954406aa7cd19736c6b00c2 Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sat, 26 Sep 2026 03:01:43 -0700 Subject: [PATCH 11/27] Preserve asset masses when generating grasps 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 #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. --- source/uwlab_tasks/config/extension.toml | 2 +- source/uwlab_tasks/docs/CHANGELOG.rst | 12 ++++++++++++ source/uwlab_tasks/test/test_environments.py | 12 ++++++++++++ .../config/ur5e_robotiq_2f85/grasp_sampling_cfg.py | 6 +++--- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/source/uwlab_tasks/config/extension.toml b/source/uwlab_tasks/config/extension.toml index b6fdc16f..9ee2e624 100644 --- a/source/uwlab_tasks/config/extension.toml +++ b/source/uwlab_tasks/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.14.4" +version = "0.14.5" # Description title = "UW Lab Tasks" diff --git a/source/uwlab_tasks/docs/CHANGELOG.rst b/source/uwlab_tasks/docs/CHANGELOG.rst index ee772f05..c0eb6b1b 100644 --- a/source/uwlab_tasks/docs/CHANGELOG.rst +++ b/source/uwlab_tasks/docs/CHANGELOG.rst @@ -1,6 +1,18 @@ Changelog --------- +0.14.5 (2026-09-26) +~~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Used authored or geometry-derived object masses for grasp sampling instead of requesting a + 1 g override. The override was ineffective for the released assets; all six objects retained + identical live masses and sampled grasp datasets in paired checks. Custom assets now retain + their own mass properties, so verify those properties when generating new grasp datasets. + + 0.14.4 (2026-09-26) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_tasks/test/test_environments.py b/source/uwlab_tasks/test/test_environments.py index b4c65fa8..92147ea1 100644 --- a/source/uwlab_tasks/test/test_environments.py +++ b/source/uwlab_tasks/test/test_environments.py @@ -212,3 +212,15 @@ def test_collision_asset_paths_and_frames(monkeypatch, pattern): expected_quaternions = torch.tensor([[0.0, 0.0, 0.0, 1.0]]).expand(24, -1) torch.testing.assert_close(hasher.collider_prim_relative_transforms[:, 3:7], expected_quaternions, rtol=0, atol=0) assert hasher.root_prim_hashes[0] != hasher.root_prim_hashes[1] + + +@pytest.mark.isaacsim_ci +def test_grasp_sampling_preserves_asset_masses(): + module = importlib.import_module( + "uwlab_tasks.manager_based.manipulation.omnireset.config.ur5e_robotiq_2f85.grasp_sampling_cfg" + ) + assert module.GraspSamplingSceneCfg().object.spawn.mass_props is None + assert set(module.variants["scene.object"]) == {"peg", "cube", "cupcake", "rectangle", "fbleg", "fbdrawerbottom"} + for object_cfg in module.variants["scene.object"].values(): + assert object_cfg.spawn.mass_props is None + assert object_cfg.spawn.rigid_props.disable_gravity is False 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 30a136d0..5977ea30 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 @@ -40,8 +40,8 @@ class GraspSamplingSceneCfg(InteractiveSceneCfg): rigid_props=sim_utils.RigidBodyPropertiesCfg( solver_position_iteration_count=4, solver_velocity_iteration_count=0, disable_gravity=False ), - # assume very light - mass_props=sim_utils.MassPropertiesCfg(mass=0.001), + # Use the asset mass instead of assuming a very light object. + mass_props=None, ), init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, OBJECT_SPAWN_HEIGHT), rot=(0.0, 0.0, 0.0, 1.0)), ) @@ -162,7 +162,7 @@ def make_object(usd_path: str): disable_gravity=False, kinematic_enabled=False, ), - mass_props=sim_utils.MassPropertiesCfg(mass=0.001), + mass_props=None, ), init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 1.0), rot=(0.0, 0.0, 0.0, 1.0)), ) From ea6bce267d9d4dd42dae3ed37703aef092306174 Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sat, 26 Sep 2026 12:02:17 -0700 Subject: [PATCH 12/27] Initialize calibrated wrist inertia for corrected UR5e dynamics 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. --- source/uwlab_rl/config/extension.toml | 2 +- source/uwlab_rl/docs/CHANGELOG.rst | 11 ++++ source/uwlab_rl/setup.py | 2 +- source/uwlab_tasks/config/extension.toml | 2 +- source/uwlab_tasks/docs/CHANGELOG.rst | 13 ++++ source/uwlab_tasks/test/test_environments.py | 65 +++++++++++++++++++ .../config/ur5e_robotiq_2f85/rl_state_cfg.py | 8 ++- .../manipulation/omnireset/mdp/events.py | 39 +++++++++-- 8 files changed, 132 insertions(+), 10 deletions(-) diff --git a/source/uwlab_rl/config/extension.toml b/source/uwlab_rl/config/extension.toml index 4df983cc..4964b838 100644 --- a/source/uwlab_rl/config/extension.toml +++ b/source/uwlab_rl/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.2.1" +version = "0.2.2" # Description title = "UW Lab RL" diff --git a/source/uwlab_rl/docs/CHANGELOG.rst b/source/uwlab_rl/docs/CHANGELOG.rst index b8efa597..c0acb8e5 100644 --- a/source/uwlab_rl/docs/CHANGELOG.rst +++ b/source/uwlab_rl/docs/CHANGELOG.rst @@ -1,6 +1,17 @@ Changelog --------- +0.2.2 (2026-09-26) +~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Pinned the integrated RSL-RL 5.4.1 fork, retaining deprecated legacy checkpoint inference + and distributed initialization fixes. New training uses the 5.x actor/critic configuration. + Reinstall the pinned dependency with ``./uwlab.sh --install`` after updating. + + 0.2.1 (2026-09-26) ~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_rl/setup.py b/source/uwlab_rl/setup.py index 5f262631..a834a326 100644 --- a/source/uwlab_rl/setup.py +++ b/source/uwlab_rl/setup.py @@ -35,7 +35,7 @@ # Bump together with the Isaac Lab commit pinned in uwlab.sh. # TODO(port): point back at UW-Lab/rsl_rl once UW-Lab/rsl_rl#6 is merged there. RSL_RL_REPO = "https://github.com/JTran-UW/rsl_rl.git" -RSL_RL_COMMIT = "1f30b1414b880bfd9d3707b1b00dca890f3a40f9" # bump_rsl_rl_5_3 (UW-Lab/rsl_rl#6) +RSL_RL_COMMIT = "d2411d54ac8f0fd7eb6039254ec92e5119e64fd2" # bump_rsl_rl_5_3 (UW-Lab/rsl_rl#6) EXTRAS_REQUIRE = { "rsl-rl": [ # Update this pin alongside compatible UWLab changes. diff --git a/source/uwlab_tasks/config/extension.toml b/source/uwlab_tasks/config/extension.toml index 9ee2e624..c7a60456 100644 --- a/source/uwlab_tasks/config/extension.toml +++ b/source/uwlab_tasks/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.14.5" +version = "0.14.6" # Description title = "UW Lab Tasks" diff --git a/source/uwlab_tasks/docs/CHANGELOG.rst b/source/uwlab_tasks/docs/CHANGELOG.rst index c0eb6b1b..d6bbbe74 100644 --- a/source/uwlab_tasks/docs/CHANGELOG.rst +++ b/source/uwlab_tasks/docs/CHANGELOG.rst @@ -1,6 +1,19 @@ Changelog --------- +0.14.6 (2026-09-26) +~~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Applied calibrated wrist motor armature at startup for the corrected UR5e asset, while + retaining Stage-1 shoulder/elbow settings and the existing policy rate, gains and action scales. + The values come from the robot's ``metadata.yaml``; keep this metadata with custom robot assets. +* Started armature ADR from the initialized robot model instead of erasing its inertia at zero + progress. Full-progress calibration and friction/motor-delay ramps remain unchanged. + + 0.14.5 (2026-09-26) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_tasks/test/test_environments.py b/source/uwlab_tasks/test/test_environments.py index 92147ea1..b061a5e3 100644 --- a/source/uwlab_tasks/test/test_environments.py +++ b/source/uwlab_tasks/test/test_environments.py @@ -224,3 +224,68 @@ def test_grasp_sampling_preserves_asset_masses(): for object_cfg in module.variants["scene.object"].values(): assert object_cfg.spawn.mass_props is None assert object_cfg.spawn.rigid_props.disable_gravity is False + + +@pytest.mark.isaacsim_ci +def test_sysid_armature_startup_selects_wrist_joints(monkeypatch): + from isaaclab.managers import SceneEntityCfg + + module = importlib.import_module("uwlab_tasks.manager_based.manipulation.omnireset.mdp.events") + names = [ + "shoulder_pan_joint", + "shoulder_lift_joint", + "elbow_joint", + "wrist_1_joint", + "wrist_2_joint", + "wrist_3_joint", + ] + nominal = [3.0, 1.2, 1.4, 0.17, 0.08, 0.38] + written = [] + robot = SimpleNamespace( + cfg=SimpleNamespace(spawn=SimpleNamespace(usd_path="fixture/robot.usd")), + device="cpu", + joint_names=names, + find_joints=lambda selected: ([names.index(name) for name in selected], selected), + write_joint_armature_to_sim_index=lambda **kwargs: written.append(kwargs), + ) + monkeypatch.setattr(module.utils, "read_metadata_from_usd_directory", lambda path: {"sysid": {"armature": nominal}}) + env = SimpleNamespace(scene={"robot": robot}, num_envs=4) + ids = torch.tensor([1, 3]) + module.set_armature_from_sysid(env, ids, SceneEntityCfg("robot", joint_names=names[3:])) + assert written[0]["joint_ids"] == [3, 4, 5] + assert torch.equal(written[0]["env_ids"], ids) + torch.testing.assert_close(written[0]["armature"], torch.tensor([nominal[3:], nominal[3:]]), rtol=0, atol=0) + + +@pytest.mark.isaacsim_ci +def test_armature_curriculum_preserves_startup_baseline(): + module = importlib.import_module("uwlab_tasks.manager_based.manipulation.omnireset.mdp.events") + initial = torch.tensor([[0.0, 0.0, 0.0, 0.17, 0.08, 0.38]]).repeat(4, 1) + current = initial.clone() + written = [] + + def write_armature(armature, joint_ids, env_ids): + current[env_ids[:, None], joint_ids] = armature + written.append(armature.clone()) + + robot = SimpleNamespace( + device="cpu", + data=SimpleNamespace(joint_armature=SimpleNamespace(torch=current)), + actuators={"arm": SimpleNamespace()}, + write_joint_armature_to_sim_index=write_armature, + write_joint_friction_coefficient_to_sim_index=lambda **kwargs: None, + ) + term = module.randomize_arm_from_sysid.__new__(module.randomize_arm_from_sysid) + term.robot = robot + term.joint_ids = list(range(6)) + term.actuator_name = "arm" + term.armature = [3.0, 1.2, 1.4, 0.17, 0.08, 0.38] + term.static_friction = term.dynamic_ratio = term.viscous_friction = [1.0] * 6 + term._initial_armature = None + ids = torch.tensor([1, 3]) + for progress in (0.0, 1.0, 0.5): + term.scale_progress = progress + term(None, ids, None, [], "arm", scale_range=(1.0, 1.0), delay_range=(0, 0)) + expected = initial[ids] * (1.0 - progress) + torch.tensor(term.armature).repeat(2, 1) * progress + torch.testing.assert_close(written[-1], expected, rtol=0, atol=0) + torch.testing.assert_close(current[[0, 2]], initial[[0, 2]], rtol=0, atol=0) 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 f3678795..e957ed4f 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 @@ -107,13 +107,19 @@ class RlStateSceneCfg(InteractiveSceneCfg): @configclass class BaseEventCfg: - """Shared events: material/mass randomization, gripper gains, scene reset. + """Shared events: fixed wrist inertia, material/mass randomization, gripper gains and reset. Does NOT include arm sysid or OSC gain randomization -- those differ between finetune (curriculum-ramped) and eval (fixed) stages. See ``FinetuneEventCfg`` and ``FinetuneEvalEventCfg``. """ + robot_wrist_armature = EventTerm( + func=task_mdp.set_armature_from_sysid, + mode="startup", + params={"asset_cfg": SceneEntityCfg("robot", joint_names=["wrist_1_joint", "wrist_2_joint", "wrist_3_joint"])}, + ) + # mode: startup (randomize dynamics) robot_material = EventTerm( func=task_mdp.randomize_rigid_body_material, # type: ignore diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py index 71100bea..6cda6dcf 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py @@ -30,6 +30,8 @@ from isaaclab_physx.renderers import IsaacRtxRendererCfg, IsaacRtxRendererGlobalSettingsCfg from pxr import Gf, UsdGeom, UsdLux +from uwlab_assets.robots.ur5e_robotiq_gripper.kinematics import ARM_JOINT_NAMES + from uwlab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg from uwlab_tasks.manager_based.manipulation.omnireset.mdp import utils @@ -1535,6 +1537,27 @@ def randomize_camera_focal_length( focal_attr.Set(focal_length) +def set_armature_from_sysid(env: ManagerBasedEnv, env_ids: torch.Tensor | None, asset_cfg: SceneEntityCfg) -> None: + """Set selected UR5e motor armatures [kg*m^2] from the robot's metadata. + + Args: + env: Environment containing the robot. + env_ids: Environments to update, or all environments when None. + asset_cfg: Robot and joint-name selection for the calibrated motor inertia. + """ + robot: Articulation = env.scene[asset_cfg.name] + metadata = utils.read_metadata_from_usd_directory(robot.cfg.spawn.usd_path) + nominal = metadata["sysid"]["armature"] + if len(nominal) != len(ARM_JOINT_NAMES): + raise ValueError("Expected one calibrated armature for each UR5e arm joint.") + joint_ids, joint_names = robot.find_joints(asset_cfg.joint_names) + values = torch.tensor( + [nominal[ARM_JOINT_NAMES.index(name)] for name in joint_names], device=robot.device, dtype=torch.float32 + ) + count = env.num_envs if env_ids is None else len(env_ids) + robot.write_joint_armature_to_sim_index(armature=values.repeat(count, 1), joint_ids=joint_ids, env_ids=env_ids) + + class randomize_arm_from_sysid(ManagerTermBase): """Randomize arm joint dynamics around sysid nominal values. @@ -1542,8 +1565,9 @@ class randomize_arm_from_sysid(ManagerTermBase): next to the robot USD. ``scale_range = (lo, hi)`` scales each nominal: ``nominal * uniform(lo, hi)`` per env per joint. - When used with ADR, ``scale_progress`` (0→1) linearly interpolates armature, - friction, and motor delay from 0 to the full sysid-randomized values. + When used with ADR, ``scale_progress`` (0 to 1) interpolates armature from + its startup value [kg*m^2] to the randomized calibration. Friction and motor + delay retain their zero-to-calibrated ramp. """ def __init__(self, cfg: EventTermCfg, env: ManagerBasedEnv): @@ -1561,8 +1585,9 @@ def __init__(self, cfg: EventTermCfg, env: ManagerBasedEnv): self.dynamic_ratio = sysid["dynamic_ratio"] self.viscous_friction = sysid["viscous_friction"] - # ADR progress: 0 = armature/friction are 0, 1 = full sysid randomization + # ADR progress: 0 = startup armature and zero friction, 1 = full sysid randomization self.scale_progress: float = cfg.params.get("initial_scale_progress", 0.0) + self._initial_armature: torch.Tensor | None = None def __call__( self, @@ -1587,8 +1612,10 @@ def _scale(nominal): val = torch.as_tensor(nominal, device=device, dtype=torch.float32) return val * (lo + torch.rand(N, n_joints, device=device) * (hi - lo)) - # Armature and friction: scaled by ADR progress (0 → sysid) - arm_vals = _scale(self.armature) * p + # Armature and friction: interpolate from the startup model to sysid + if self._initial_armature is None: + self._initial_armature = self.robot.data.joint_armature.torch[:, self.joint_ids].clone() + arm_vals = self._initial_armature[env_ids] * (1.0 - p) + _scale(self.armature) * p sfric_vals = _scale(self.static_friction) * p dratio_vals = _scale(self.dynamic_ratio) * p dfric_vals = torch.minimum(dratio_vals * sfric_vals, sfric_vals) @@ -1793,7 +1820,7 @@ class adr_sysid_curriculum(ManagerTermBase): Monitors the mean success rate from ``MultiResetManager``'s ``SuccessMonitor`` and linearly ramps the ``scale_progress`` attribute of the target event terms - from 0 (no friction/armature) to 1 (full sysid randomization). + from 0 (startup dynamics) to 1 (full sysid randomization). Updates are gated by ``update_every_n_steps`` (env steps via ``common_step_counter``) to ensure the update rate is independent of the number of environments. From 823d73c45aa87c723604cd658bc413bbbce59ea2 Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sat, 26 Sep 2026 13:48:21 -0700 Subject: [PATCH 13/27] Preserve robot dynamics for the published checkpoints Restore the original UR5e USD and disable added wrist armature by default. Defer issues #38 and #40 after matched minimal-asset tests showed large performance regressions. Keep the EA upgrade, converted checkpoints, RSL integration and separate #41/#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. --- docs/source/publications/omnireset/sim2real.rst | 2 +- source/uwlab_assets/config/extension.toml | 2 +- source/uwlab_assets/docs/CHANGELOG.rst | 11 +++++++++++ .../ur5e_robotiq_2f85_gripper.py | 2 +- source/uwlab_tasks/config/extension.toml | 2 +- source/uwlab_tasks/docs/CHANGELOG.rst | 11 +++++++++++ source/uwlab_tasks/test/test_environments.py | 15 +++++++++++++++ .../config/ur5e_robotiq_2f85/rl_state_cfg.py | 8 ++------ 8 files changed, 43 insertions(+), 10 deletions(-) diff --git a/docs/source/publications/omnireset/sim2real.rst b/docs/source/publications/omnireset/sim2real.rst index b3a907f3..73abcb46 100644 --- a/docs/source/publications/omnireset/sim2real.rst +++ b/docs/source/publications/omnireset/sim2real.rst @@ -84,7 +84,7 @@ Install ROS 2 and set up the UR robot driver following the `NVIDIA Isaac ROS Uni **2. Update the robot USD** Download the existing calibrated robot USD from -`here `__ +`here `__ and open it in Isaac Sim. Replace the UR5e/UR7e arm in the USD with the URDF of your newly calibrated UR5e/UR7e. After replacing the arm, relink the joint that attaches the gripper to the arm. This joint connection must be re-established in Isaac Sim for the gripper to remain properly attached. **3. Verify alignment** diff --git a/source/uwlab_assets/config/extension.toml b/source/uwlab_assets/config/extension.toml index ba0eef0f..17264a9f 100644 --- a/source/uwlab_assets/config/extension.toml +++ b/source/uwlab_assets/config/extension.toml @@ -1,6 +1,6 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.6.2" +version = "0.6.3" # Description title = "UW Lab Assets" diff --git a/source/uwlab_assets/docs/CHANGELOG.rst b/source/uwlab_assets/docs/CHANGELOG.rst index 50640201..0667a62b 100644 --- a/source/uwlab_assets/docs/CHANGELOG.rst +++ b/source/uwlab_assets/docs/CHANGELOG.rst @@ -1,6 +1,17 @@ Changelog --------- +0.6.3 (2026-09-26) +~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Restored the original calibrated UR5e USD for compatibility with published OmniReset + checkpoints. Deferred the mass/inertia changes for issues #38 and #40. Use the original + filename with existing checkpoints; the experimental ``_v2.usd`` is not the default. + + 0.6.2 (2026-09-26) ~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_assets/uwlab_assets/robots/ur5e_robotiq_gripper/ur5e_robotiq_2f85_gripper.py b/source/uwlab_assets/uwlab_assets/robots/ur5e_robotiq_gripper/ur5e_robotiq_2f85_gripper.py index 97e69f3d..9fe9cd1b 100644 --- a/source/uwlab_assets/uwlab_assets/robots/ur5e_robotiq_gripper/ur5e_robotiq_2f85_gripper.py +++ b/source/uwlab_assets/uwlab_assets/robots/ur5e_robotiq_gripper/ur5e_robotiq_2f85_gripper.py @@ -104,7 +104,7 @@ def spawn_ur5e_without_physics_materials(prim_path, cfg, translation=None, orien UR5E_ARTICULATION = ArticulationCfg( spawn=sim_utils.UsdFileCfg( func=spawn_ur5e_without_physics_materials, - usd_path=f"{UWLAB_CLOUD_ASSETS_DIR}/Robots/UniversalRobots/Ur5e2f85RobotiqGripperCalibrated/ur5e_robotiq_gripper_d415_mount_safety_calibrated_v2.usd", + usd_path=f"{UWLAB_CLOUD_ASSETS_DIR}/Robots/UniversalRobots/Ur5e2f85RobotiqGripperCalibrated/ur5e_robotiq_gripper_d415_mount_safety_calibrated.usd", activate_contact_sensors=False, rigid_props=sim_utils.RigidBodyPropertiesCfg( disable_gravity=True, diff --git a/source/uwlab_tasks/config/extension.toml b/source/uwlab_tasks/config/extension.toml index c7a60456..71ac5c4c 100644 --- a/source/uwlab_tasks/config/extension.toml +++ b/source/uwlab_tasks/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.14.6" +version = "0.14.7" # Description title = "UW Lab Tasks" diff --git a/source/uwlab_tasks/docs/CHANGELOG.rst b/source/uwlab_tasks/docs/CHANGELOG.rst index d6bbbe74..4259c556 100644 --- a/source/uwlab_tasks/docs/CHANGELOG.rst +++ b/source/uwlab_tasks/docs/CHANGELOG.rst @@ -1,6 +1,17 @@ Changelog --------- +0.14.7 (2026-09-26) +~~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Disabled added wrist armature by default when restoring the original robot for published + checkpoints. Keep ``robot_wrist_armature`` unset with those checkpoints; the experimental + mass/inertia changes are deferred. + + 0.14.6 (2026-09-26) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_tasks/test/test_environments.py b/source/uwlab_tasks/test/test_environments.py index b061a5e3..657fe9a5 100644 --- a/source/uwlab_tasks/test/test_environments.py +++ b/source/uwlab_tasks/test/test_environments.py @@ -226,6 +226,21 @@ def test_grasp_sampling_preserves_asset_masses(): assert object_cfg.spawn.rigid_props.disable_gravity is False +@pytest.mark.parametrize("contract", ["asset", "armature"]) +@pytest.mark.isaacsim_ci +def test_omnireset_published_expert_robot_defaults(contract): + if contract == "asset": + module = importlib.import_module("uwlab_assets.robots.ur5e_robotiq_gripper.ur5e_robotiq_2f85_gripper") + assert module.UR5E_ARTICULATION.spawn.usd_path.endswith( + "/ur5e_robotiq_gripper_d415_mount_safety_calibrated.usd" + ) + else: + module = importlib.import_module( + "uwlab_tasks.manager_based.manipulation.omnireset.config.ur5e_robotiq_2f85.rl_state_cfg" + ) + assert module.BaseEventCfg().robot_wrist_armature is None + + @pytest.mark.isaacsim_ci def test_sysid_armature_startup_selects_wrist_joints(monkeypatch): from isaaclab.managers import SceneEntityCfg 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 e957ed4f..6e2afe5f 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 @@ -107,18 +107,14 @@ class RlStateSceneCfg(InteractiveSceneCfg): @configclass class BaseEventCfg: - """Shared events: fixed wrist inertia, material/mass randomization, gripper gains and reset. + """Shared events: material/mass randomization, gripper gains and reset. Does NOT include arm sysid or OSC gain randomization -- those differ between finetune (curriculum-ramped) and eval (fixed) stages. See ``FinetuneEventCfg`` and ``FinetuneEvalEventCfg``. """ - robot_wrist_armature = EventTerm( - func=task_mdp.set_armature_from_sysid, - mode="startup", - params={"asset_cfg": SceneEntityCfg("robot", joint_names=["wrist_1_joint", "wrist_2_joint", "wrist_3_joint"])}, - ) + robot_wrist_armature = None # mode: startup (randomize dynamics) robot_material = EventTerm( From 250673604ab3d65a4d7a4f90f385035696cbddd3 Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sat, 26 Sep 2026 15:05:40 -0700 Subject: [PATCH 14/27] Pin the prepared RSL revision for publication 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. --- source/uwlab_rl/config/extension.toml | 2 +- source/uwlab_rl/docs/CHANGELOG.rst | 10 ++++++++++ source/uwlab_rl/setup.py | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/source/uwlab_rl/config/extension.toml b/source/uwlab_rl/config/extension.toml index 4964b838..3942de2e 100644 --- a/source/uwlab_rl/config/extension.toml +++ b/source/uwlab_rl/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.2.2" +version = "0.2.3" # Description title = "UW Lab RL" diff --git a/source/uwlab_rl/docs/CHANGELOG.rst b/source/uwlab_rl/docs/CHANGELOG.rst index c0acb8e5..db8a6518 100644 --- a/source/uwlab_rl/docs/CHANGELOG.rst +++ b/source/uwlab_rl/docs/CHANGELOG.rst @@ -1,6 +1,16 @@ Changelog --------- +0.2.3 (2026-09-26) +~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Updated the pinned RSL-RL 5.4.1 revision without changing its library code or runtime behavior. + Reinstall the pinned dependency with ``./uwlab.sh --install`` after updating. + + 0.2.2 (2026-09-26) ~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_rl/setup.py b/source/uwlab_rl/setup.py index a834a326..62397599 100644 --- a/source/uwlab_rl/setup.py +++ b/source/uwlab_rl/setup.py @@ -35,7 +35,7 @@ # Bump together with the Isaac Lab commit pinned in uwlab.sh. # TODO(port): point back at UW-Lab/rsl_rl once UW-Lab/rsl_rl#6 is merged there. RSL_RL_REPO = "https://github.com/JTran-UW/rsl_rl.git" -RSL_RL_COMMIT = "d2411d54ac8f0fd7eb6039254ec92e5119e64fd2" # bump_rsl_rl_5_3 (UW-Lab/rsl_rl#6) +RSL_RL_COMMIT = "c00da4cf282edde51a74ed6965b24aab8e49269c" # bump_rsl_rl_5_3 (UW-Lab/rsl_rl#6) EXTRAS_REQUIRE = { "rsl-rl": [ # Update this pin alongside compatible UWLab changes. From a3362ed5e28acabc9afee287a69aae06199dfdd1 Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sun, 27 Sep 2026 01:44:35 -0700 Subject: [PATCH 15/27] Restore backend asset stability checks 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. --- source/uwlab_tasks/config/extension.toml | 2 +- source/uwlab_tasks/docs/CHANGELOG.rst | 10 +++ source/uwlab_tasks/test/test_environments.py | 88 +++++++++++++++++++ .../omnireset/mdp/terminations.py | 20 ++--- 4 files changed, 109 insertions(+), 11 deletions(-) diff --git a/source/uwlab_tasks/config/extension.toml b/source/uwlab_tasks/config/extension.toml index 71ac5c4c..fe5f62b7 100644 --- a/source/uwlab_tasks/config/extension.toml +++ b/source/uwlab_tasks/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.14.7" +version = "0.14.8" # Description title = "UW Lab Tasks" diff --git a/source/uwlab_tasks/docs/CHANGELOG.rst b/source/uwlab_tasks/docs/CHANGELOG.rst index 4259c556..7e0f6b58 100644 --- a/source/uwlab_tasks/docs/CHANGELOG.rst +++ b/source/uwlab_tasks/docs/CHANGELOG.rst @@ -1,6 +1,16 @@ Changelog --------- +0.14.8 (2026-09-27) +~~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Fixed backend-specific assets bypassing velocity-stability checks during OmniReset grasp + and reset-state generation. Regenerate affected datasets to apply the restored stability filters. + + 0.14.7 (2026-09-26) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_tasks/test/test_environments.py b/source/uwlab_tasks/test/test_environments.py index 657fe9a5..2ef4ffb7 100644 --- a/source/uwlab_tasks/test/test_environments.py +++ b/source/uwlab_tasks/test/test_environments.py @@ -214,6 +214,94 @@ def test_collision_asset_paths_and_frames(monkeypatch, pattern): assert hasher.root_prim_hashes[0] != hasher.root_prim_hashes[1] +@pytest.mark.parametrize("term_name", ["check_grasp_success", "check_reset_state_success"]) +@pytest.mark.parametrize("object_kind", ["rigid", "collection"]) +@pytest.mark.isaacsim_ci +def test_dataset_success_requires_backend_asset_stability(term_name, object_kind): + from unittest.mock import Mock + + from isaaclab.assets import BaseArticulation, BaseRigidObject, BaseRigidObjectCollection + + module = importlib.import_module("uwlab_tasks.manager_based.manipulation.omnireset.mdp.terminations") + positions = torch.tensor([[0.0, 0.0, 0.1]]).repeat(4, 1) + quaternions = torch.tensor([[0.0, 0.0, 0.0, 1.0]]).repeat(4, 1) + joint_velocities = torch.zeros(4, 2) + linear_velocities = torch.zeros(4, 2, 3) + angular_velocities = torch.zeros(4, 2, 3) + joint_velocities[1, 0] = 6.0 + linear_velocities[2, 1, 0] = 0.2 + angular_velocities[3, 1, 0] = 2.0 + robot = Mock(spec=BaseArticulation) + robot.initial_pos = positions.clone() + robot.data = SimpleNamespace( + joint_vel=SimpleNamespace(torch=joint_velocities), + joint_vel_limits=SimpleNamespace(torch=torch.full_like(joint_velocities, 100.0)), + root_pos_w=SimpleNamespace(torch=positions), + root_quat_w=SimpleNamespace(torch=quaternions), + body_link_pos_w=SimpleNamespace(torch=positions[:, None]), + body_link_quat_w=SimpleNamespace(torch=quaternions[:, None]), + ) + obj = Mock(spec=BaseRigidObject if object_kind == "rigid" else BaseRigidObjectCollection) + obj.initial_pos = positions.clone() + obj.data = SimpleNamespace( + root_pos_w=SimpleNamespace(torch=positions), + root_quat_w=SimpleNamespace(torch=quaternions), + body_lin_vel_w=SimpleNamespace(torch=linear_velocities), + body_ang_vel_w=SimpleNamespace(torch=angular_velocities), + object_lin_vel_w=SimpleNamespace(torch=linear_velocities), + object_ang_vel_w=SimpleNamespace(torch=angular_velocities), + ) + env = SimpleNamespace( + scene={"robot": robot, "object": obj}, + num_envs=4, + device="cpu", + episode_length_buf=torch.full((4,), 10), + max_episode_length=10, + ) + term_type = getattr(module, term_name) + term = term_type.__new__(term_type) + term.stability_counter = torch.zeros(4, dtype=torch.int32) + term.consecutive_stability_steps = 2 + term.pos_z_threshold = 0.05 + + def collision_free(env, ids): + return torch.ones(len(ids), dtype=torch.bool) + + robot_cfg = SceneEntityCfg("robot") + object_cfg = SceneEntityCfg("object") + if term_name == "check_grasp_success": + term.object_cfg = object_cfg + term.gripper_cfg = robot_cfg + term.max_pos_deviation = 0.05 + term.collision_analyzer = collision_free + params = {"object_cfg": object_cfg, "gripper_cfg": robot_cfg, "collision_analyzer_cfg": None} + else: + term.robot_asset = robot + term.assets_to_check = [obj, robot] + term.ee_body_idx = 0 + term.gripper_approach_direction = (0.0, 0.0, -1.0) + term.max_robot_pos_deviation = term.max_object_pos_deviation = 0.05 + term.collision_analyzers = [collision_free] + term.assembly_success_prob = None + params = { + "object_cfgs": [object_cfg], + "robot_cfg": robot_cfg, + "ee_body_name": "tool", + "collision_analyzer_cfgs": [], + } + assert not term(env, **params).any() + torch.testing.assert_close(term(env, **params), torch.tensor([True, False, False, False])) + torch.testing.assert_close(term.stability_counter, torch.tensor([2, 0, 0, 0], dtype=torch.int32)) + joint_velocities.zero_() + linear_velocities.zero_() + angular_velocities.zero_() + torch.testing.assert_close(term(env, **params), torch.tensor([True, False, False, False])) + assert term(env, **params).all() + linear_velocities[0, 1, 0] = 0.2 + torch.testing.assert_close(term(env, **params), torch.tensor([False, True, True, True])) + assert term.stability_counter[0] == 0 + + @pytest.mark.isaacsim_ci def test_grasp_sampling_preserves_asset_masses(): module = importlib.import_module( diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py index d9e69ab1..9d6bb92e 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py @@ -8,7 +8,7 @@ import numpy as np import torch -from isaaclab.assets import Articulation, RigidObject, RigidObjectCollection +from isaaclab.assets import BaseArticulation, BaseRigidObject, BaseRigidObjectCollection from isaaclab.envs import ManagerBasedEnv, ManagerBasedRLEnv from isaaclab.managers import ManagerTermBase, SceneEntityCfg, TerminationTermCfg from isaaclab.sim.utils import enable_extension @@ -173,12 +173,12 @@ def __call__( # Check gripper (articulation) velocities current_step_stable &= gripper_asset.data.joint_vel.torch.abs().sum(dim=1) < 5.0 # Check object (rigid object) velocities - if isinstance(object_asset, RigidObject): + if isinstance(object_asset, BaseRigidObject): current_step_stable &= object_asset.data.body_lin_vel_w.torch.abs().sum(dim=2).sum(dim=1) < 0.05 current_step_stable &= object_asset.data.body_ang_vel_w.torch.abs().sum(dim=2).sum(dim=1) < 1.0 - elif isinstance(object_asset, RigidObjectCollection): - current_step_stable &= object_asset.data.object_lin_vel_w.abs().sum(dim=2).sum(dim=1) < 0.05 - current_step_stable &= object_asset.data.object_ang_vel_w.abs().sum(dim=2).sum(dim=1) < 1.0 + elif isinstance(object_asset, BaseRigidObjectCollection): + current_step_stable &= object_asset.data.object_lin_vel_w.torch.abs().sum(dim=2).sum(dim=1) < 0.05 + current_step_stable &= object_asset.data.object_ang_vel_w.torch.abs().sum(dim=2).sum(dim=1) < 1.0 self.stability_counter = torch.where( current_step_stable, @@ -351,14 +351,14 @@ def __call__( # Check if asset velocities are small current_step_stable = torch.ones(env.num_envs, device=env.device, dtype=torch.bool) for asset in self.assets_to_check: - if isinstance(asset, Articulation): + if isinstance(asset, BaseArticulation): current_step_stable &= asset.data.joint_vel.torch.abs().sum(dim=1) < 5.0 - elif isinstance(asset, RigidObject): + elif isinstance(asset, BaseRigidObject): current_step_stable &= asset.data.body_lin_vel_w.torch.abs().sum(dim=2).sum(dim=1) < 0.1 current_step_stable &= asset.data.body_ang_vel_w.torch.abs().sum(dim=2).sum(dim=1) < 1.0 - elif isinstance(asset, RigidObjectCollection): - current_step_stable &= asset.data.object_lin_vel_w.abs().sum(dim=2).sum(dim=1) < 0.1 - current_step_stable &= asset.data.object_ang_vel_w.abs().sum(dim=2).sum(dim=1) < 1.0 + elif isinstance(asset, BaseRigidObjectCollection): + current_step_stable &= asset.data.object_lin_vel_w.torch.abs().sum(dim=2).sum(dim=1) < 0.1 + current_step_stable &= asset.data.object_ang_vel_w.torch.abs().sum(dim=2).sum(dim=1) < 1.0 self.stability_counter = torch.where( current_step_stable, From abd8c2b093120bed928d6a388bad22a42c68788f Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sun, 27 Sep 2026 14:10:57 -0700 Subject: [PATCH 16/27] Pin the modern-only RSL integration 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. --- source/uwlab_rl/config/extension.toml | 2 +- source/uwlab_rl/docs/CHANGELOG.rst | 11 +++++++++++ source/uwlab_rl/setup.py | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/source/uwlab_rl/config/extension.toml b/source/uwlab_rl/config/extension.toml index 3942de2e..575e22b0 100644 --- a/source/uwlab_rl/config/extension.toml +++ b/source/uwlab_rl/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.2.3" +version = "0.2.4" # Description title = "UW Lab RL" diff --git a/source/uwlab_rl/docs/CHANGELOG.rst b/source/uwlab_rl/docs/CHANGELOG.rst index db8a6518..b81c1502 100644 --- a/source/uwlab_rl/docs/CHANGELOG.rst +++ b/source/uwlab_rl/docs/CHANGELOG.rst @@ -1,6 +1,17 @@ Changelog --------- +0.2.4 (2026-09-27) +~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Updated the pinned RSL-RL 5.4.1 integration to target separate actor and critic models for the upgraded UWLab stack. + The legacy combined ``ActorCritic`` interface is not provided; retain the pinned 3.x stack for old callers. + Reinstall the pinned dependency with ``./uwlab.sh --install`` after updating. + + 0.2.3 (2026-09-26) ~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_rl/setup.py b/source/uwlab_rl/setup.py index 62397599..d2a641b2 100644 --- a/source/uwlab_rl/setup.py +++ b/source/uwlab_rl/setup.py @@ -35,7 +35,7 @@ # Bump together with the Isaac Lab commit pinned in uwlab.sh. # TODO(port): point back at UW-Lab/rsl_rl once UW-Lab/rsl_rl#6 is merged there. RSL_RL_REPO = "https://github.com/JTran-UW/rsl_rl.git" -RSL_RL_COMMIT = "c00da4cf282edde51a74ed6965b24aab8e49269c" # bump_rsl_rl_5_3 (UW-Lab/rsl_rl#6) +RSL_RL_COMMIT = "2d8cc641a6ef915328aef8b67403c59b32b3930e" # bump_rsl_rl_5_3 (UW-Lab/rsl_rl#6) EXTRAS_REQUIRE = { "rsl-rl": [ # Update this pin alongside compatible UWLab changes. From a5c7b33885c931605d456f559400427198ddf08a Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sun, 27 Sep 2026 16:16:55 -0700 Subject: [PATCH 17/27] Prepare UWLab 2.0 against the released RSL fork 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. --- .github/actions/docker-build/action.yml | 5 +- .github/actions/run-tests/action.yml | 7 ++- .github/workflows/build.yml | 68 +++++++++------------ .github/workflows/license-check.yaml | 22 ++++--- README.md | 9 ++- VERSION | 2 +- docker/.env.base | 4 +- docker/Dockerfile.base | 2 +- docs/conf.py | 2 +- docs/source/setup/installation/index.rst | 4 +- source/uwlab_rl/config/extension.toml | 2 +- source/uwlab_rl/docs/CHANGELOG.rst | 13 ++++ source/uwlab_rl/setup.py | 12 ++-- tools/test_installer_pin.py | 76 ++++++++++++++++++++++++ uwlab.sh | 5 +- 15 files changed, 164 insertions(+), 69 deletions(-) create mode 100644 tools/test_installer_pin.py diff --git a/.github/actions/docker-build/action.yml b/.github/actions/docker-build/action.yml index 51f0a90d..22c82ada 100644 --- a/.github/actions/docker-build/action.yml +++ b/.github/actions/docker-build/action.yml @@ -32,9 +32,9 @@ runs: shell: sh run: | # Only attempt NGC login if API key is available - if [ -n "${{ env.NGC_API_KEY }}" ]; then + if [ -n "$NGC_API_KEY" ]; then echo "Logging into NGC registry..." - docker login -u \$oauthtoken -p ${{ env.NGC_API_KEY }} nvcr.io + printf '%s' "$NGC_API_KEY" | docker login -u '$oauthtoken' --password-stdin nvcr.io echo "✅ Successfully logged into NGC registry" else echo "⚠️ NGC_API_KEY not available - skipping NGC login" @@ -58,7 +58,6 @@ runs: # Build Docker image docker buildx build --progress=plain --platform linux/amd64 \ - -t uw-lab-dev \ -t $image_tag \ --build-arg ISAACSIM_BASE_IMAGE_ARG="$isaacsim_base_image" \ --build-arg ISAACSIM_VERSION_ARG="$isaacsim_version" \ diff --git a/.github/actions/run-tests/action.yml b/.github/actions/run-tests/action.yml index df471c1d..7f5b7dac 100644 --- a/.github/actions/run-tests/action.yml +++ b/.github/actions/run-tests/action.yml @@ -59,8 +59,11 @@ runs: # Create reports directory mkdir -p "$reports_dir" - # Clean up any existing container - docker rm -f $container_name 2>/dev/null || true + # Preserve any existing container + if docker container inspect "$container_name" >/dev/null 2>&1; then + echo "Container already exists; refusing to replace it: $container_name" >&2 + return 1 + fi # Build Docker environment variables docker_env_vars="\ diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index de9b797f..19ce8c1a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,8 +26,8 @@ permissions: env: NGC_API_KEY: ${{ secrets.NGC_API_KEY }} ISAACSIM_BASE_IMAGE: ${{ vars.ISAACSIM_BASE_IMAGE || 'nvcr.io/nvidia/isaac-sim' }} - ISAACSIM_BASE_VERSION: ${{ vars.ISAACSIM_BASE_VERSION || '5.1.0' }} - DOCKER_IMAGE_TAG: uw-lab-dev:${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || github.ref_name }}-${{ github.sha }} + ISAACSIM_BASE_VERSION: ${{ vars.ISAACSIM_BASE_VERSION || '6.1.0' }} + DOCKER_IMAGE_TAG: uw-lab-dev:${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || github.ref_name }}-${{ github.sha }}-${{ github.run_id }}-${{ github.run_attempt }} jobs: test-uwlab-tasks: @@ -37,25 +37,15 @@ jobs: steps: - name: Checkout Code - uses: actions/checkout@v4 + uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 with: fetch-depth: 0 lfs: true - - name: Remove previous uw-lab-dev images - run: | - IDS=$(docker image ls -q uw-lab-dev 2>/dev/null || true) - if [ -n "$IDS" ]; then - echo "Removing existing uw-lab-dev images: $IDS" - docker image rm -f $IDS || true - else - echo "No existing uw-lab-dev images to remove." - fi - - name: Build Docker Image uses: ./.github/actions/docker-build with: - image-tag: ${{ env.DOCKER_IMAGE_TAG }} + image-tag: ${{ env.DOCKER_IMAGE_TAG }}-${{ github.job }} isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} @@ -64,21 +54,21 @@ jobs: with: test-path: "tools" result-file: "uwlab-tasks-report.xml" - container-name: "uw-lab-tasks-test-$$" - image-tag: ${{ env.DOCKER_IMAGE_TAG }} + container-name: "uw-lab-tasks-test-${{ github.run_id }}-${{ github.run_attempt }}" + image-tag: ${{ env.DOCKER_IMAGE_TAG }}-${{ github.job }} pytest-options: "" filter-pattern: "uwlab_tasks" - name: Copy Test Results from UWLab Tasks Container run: | - CONTAINER_NAME="uw-lab-tasks-test-$$" + CONTAINER_NAME="uw-lab-tasks-test-${{ github.run_id }}-${{ github.run_attempt }}" if docker ps -a | grep -q $CONTAINER_NAME; then echo "Copying test results from UWLab Tasks container..." 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" fi - name: Upload UWLab Tasks Test Results - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 if: always() with: name: uwlab-tasks-test-results @@ -100,31 +90,25 @@ jobs: exit 1 fi + - name: Remove this job's image tag + if: always() + run: docker image rm "${{ env.DOCKER_IMAGE_TAG }}-${{ github.job }}" || true + test-general: runs-on: [self-hosted, gpu] timeout-minutes: 180 steps: - name: Checkout Code - uses: actions/checkout@v4 + uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 with: fetch-depth: 0 lfs: true - - name: Remove previous uw-lab-dev images - run: | - IDS=$(docker image ls -q uw-lab-dev 2>/dev/null || true) - if [ -n "$IDS" ]; then - echo "Removing existing uw-lab-dev images: $IDS" - docker image rm -f $IDS || true - else - echo "No existing uw-lab-dev images to remove." - fi - - name: Build Docker Image uses: ./.github/actions/docker-build with: - image-tag: ${{ env.DOCKER_IMAGE_TAG }} + image-tag: ${{ env.DOCKER_IMAGE_TAG }}-${{ github.job }} isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} @@ -134,21 +118,21 @@ jobs: with: test-path: "tools" result-file: "general-tests-report.xml" - container-name: "uw-lab-general-test-$$" - image-tag: ${{ env.DOCKER_IMAGE_TAG }} + container-name: "uw-lab-general-test-${{ github.run_id }}-${{ github.run_attempt }}" + image-tag: ${{ env.DOCKER_IMAGE_TAG }}-${{ github.job }} pytest-options: "" filter-pattern: "not uwlab_tasks" - name: Copy Test Results from General Tests Container run: | - CONTAINER_NAME="uw-lab-general-test-$$" + CONTAINER_NAME="uw-lab-general-test-${{ github.run_id }}-${{ github.run_attempt }}" if docker ps -a | grep -q $CONTAINER_NAME; then echo "Copying test results from General Tests container..." 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" fi - name: Upload General Test Results - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 if: always() with: name: general-test-results @@ -170,6 +154,10 @@ jobs: exit 1 fi + - name: Remove this job's image tag + if: always() + run: docker image rm "${{ env.DOCKER_IMAGE_TAG }}-${{ github.job }}" || true + combine-results: needs: [test-uwlab-tasks, test-general] runs-on: [self-hosted, gpu] @@ -177,7 +165,7 @@ jobs: steps: - name: Checkout Code - uses: actions/checkout@v4 + uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 with: fetch-depth: 0 lfs: false @@ -187,14 +175,14 @@ jobs: mkdir -p reports - name: Download Test Results - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: uwlab-tasks-test-results path: reports/ continue-on-error: true - name: Download General Test Results - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: general-test-results path: reports/ @@ -206,7 +194,7 @@ jobs: output-file: "reports/combined-results.xml" - name: Upload Combined Test Results - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 if: always() with: name: pr-${{ github.event.pull_request.number }}-combined-test-results @@ -217,7 +205,7 @@ jobs: - name: Comment on Test Results id: test-reporter if: github.event.pull_request.head.repo.full_name == github.repository - uses: EnricoMi/publish-unit-test-result-action@v2 + uses: EnricoMi/publish-unit-test-result-action@d0a4676d0e0b938bc201470d88276b7c74c712b3 # v2 with: files: "reports/combined-results.xml" check_name: "Tests Summary" @@ -231,7 +219,7 @@ jobs: - name: Report Test Results if: github.event.pull_request.head.repo.full_name == github.repository - uses: dorny/test-reporter@v1 + uses: dorny/test-reporter@d61b558e8df85cb60d09ca3e5b09653b4477cea7 # v1 with: name: UWLab Build and Test Results path: reports/combined-results.xml diff --git a/.github/workflows/license-check.yaml b/.github/workflows/license-check.yaml index b9ba98ab..c2f1cd3b 100644 --- a/.github/workflows/license-check.yaml +++ b/.github/workflows/license-check.yaml @@ -19,25 +19,31 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@a37ce9120846195fa4ece8f58b268e6043cb2f26 # v3 # - name: Install jq # run: sudo apt-get update && sudo apt-get install -y jq - - name: Clean up disk space - run: | - rm -rf /opt/hostedtoolcache - - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@7f4fc3e22c37d6ff65e88745f38bd3157c663f7c # v4 with: - python-version: '3.11' # Adjust as needed + python-version: '3.12' # Adjust as needed + + - name: Check pinned installer behavior + run: python tools/test_installer_pin.py + + - name: Create isolated license environment + run: | + ENV_PATH="$RUNNER_TEMP/uwlab-license-$GITHUB_RUN_ID-$GITHUB_RUN_ATTEMPT" + python -m venv "$ENV_PATH" + echo "$ENV_PATH/bin" >> "$GITHUB_PATH" + echo "VIRTUAL_ENV=$ENV_PATH" >> "$GITHUB_ENV" - name: Install dependencies using ./uwlab.sh -i run: | # first install isaac sim pip install --upgrade pip - pip install 'isaacsim[all,extscache]==${{ vars.ISAACSIM_BASE_VERSION || '5.0.0' }}' --extra-index-url https://pypi.nvidia.com + pip install 'isaacsim[all,extscache]==${{ vars.ISAACSIM_PIP_VERSION || '6.1.0.0' }}' --extra-index-url https://pypi.nvidia.com chmod +x ./uwlab.sh # Make sure the script is executable # install all lab dependencies ./uwlab.sh -i diff --git a/README.md b/README.md index 9a1e34d8..9bda997f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # UW Lab -[![IsaacSim](https://img.shields.io/badge/IsaacSim-6.0.1-silver.svg)](https://docs.isaacsim.omniverse.nvidia.com/latest/index.html) +[![IsaacSim](https://img.shields.io/badge/IsaacSim-6.1.0-silver.svg)](https://docs.isaacsim.omniverse.nvidia.com/latest/index.html) [![Python](https://img.shields.io/badge/python-3.12-blue.svg)](https://docs.python.org/3/whatsnew/3.12.html) [![Linux platform](https://img.shields.io/badge/platform-linux--64-orange.svg)](https://releases.ubuntu.com/20.04/) [![Windows platform](https://img.shields.io/badge/platform-windows--64-orange.svg)](https://www.microsoft.com/en-us/) @@ -27,6 +27,13 @@ In addition to what IsaacLab provides, UW Lab brings: - **Sim to Real**: Providing robots and configuration that has been tested in Lab and deliver the Simulation Setup that can directly transfer to reals +## Release line + +UWLab 2.0 targets Isaac Lab **3.0 Early Access**, Isaac Sim **6.1**, Python **3.12**, and the released UW-Lab RSL-RL **5.4.1** integration. +The installer pins Isaac Lab to `ae37b028ea415c91ea2bc32609efcd759ed2b974` and RSL-RL to `2c3bf18001a5e2a78527e9ea368b7ea31700a2c5` (`uw-v5.4.1`). +Use `isaaclab2` for the legacy Isaac Lab 2.x / Isaac Sim 5.1 stack. Do not mix its environments, datasets, or checkpoint layouts with this release; follow the OmniReset migration and checkpoint-conversion instructions. +The installer refuses to replace an Isaac Lab checkout with local changes. + ## Installation Follow the [installation guide](https://uw-lab.github.io/UWLab/main/source/setup/installation/index.html). diff --git a/VERSION b/VERSION index 3eefcb9d..227cea21 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.0 +2.0.0 diff --git a/docker/.env.base b/docker/.env.base index 7be5c03f..91c91480 100644 --- a/docker/.env.base +++ b/docker/.env.base @@ -6,8 +6,8 @@ ACCEPT_EULA=Y # NVIDIA Isaac Sim base image ISAACSIM_BASE_IMAGE=nvcr.io/nvidia/isaac-sim -# NVIDIA Isaac Sim version to use (e.g. 5.1.0) -ISAACSIM_VERSION=5.1.0 +# NVIDIA Isaac Sim version to use (e.g. 6.1.0) +ISAACSIM_VERSION=6.1.0 # Derived from the default path in the NVIDIA provided Isaac Sim container DOCKER_ISAACSIM_ROOT_PATH=/isaac-sim # The UW Lab path in the container diff --git a/docker/Dockerfile.base b/docker/Dockerfile.base index aca9ec5e..3f62de48 100644 --- a/docker/Dockerfile.base +++ b/docker/Dockerfile.base @@ -13,7 +13,7 @@ ENV ISAACSIM_VERSION=${ISAACSIM_VERSION_ARG} SHELL ["/bin/bash", "-c"] # Adds labels to the Dockerfile -LABEL version="2.1.1" +LABEL version="2.0.0" LABEL description="Dockerfile for building and running the UW Lab framework inside Isaac Sim container image." # Arguments diff --git a/docs/conf.py b/docs/conf.py index 45067ffc..b9eb58ee 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -284,7 +284,7 @@ # Whitelist pattern for remotes smv_remote_whitelist = r"^.*$" # Whitelist pattern for branches (set to None to ignore all branches) -smv_branch_whitelist = os.getenv("SMV_BRANCH_WHITELIST", r"^(main|devel|release/.*)$") +smv_branch_whitelist = os.getenv("SMV_BRANCH_WHITELIST", r"^(main|isaaclab2|devel|release/.*)$") # Whitelist pattern for tags (set to None to ignore all tags) smv_tag_whitelist = os.getenv("SMV_TAG_WHITELIST", r"^v[1-9]\d*\.\d+\.\d+$") html_sidebars = { diff --git a/docs/source/setup/installation/index.rst b/docs/source/setup/installation/index.rst index c107ea6d..d7ff8db7 100644 --- a/docs/source/setup/installation/index.rst +++ b/docs/source/setup/installation/index.rst @@ -3,9 +3,9 @@ Local Installation ================== -.. image:: https://img.shields.io/badge/IsaacSim-6.0.1-silver.svg +.. image:: https://img.shields.io/badge/IsaacSim-6.1.0-silver.svg :target: https://developer.nvidia.com/isaac-sim - :alt: IsaacSim 6.0.1 + :alt: IsaacSim 6.1.0 .. image:: https://img.shields.io/badge/python-3.12-blue.svg :target: https://www.python.org/downloads/release/python-31211/ diff --git a/source/uwlab_rl/config/extension.toml b/source/uwlab_rl/config/extension.toml index 575e22b0..a92d390e 100644 --- a/source/uwlab_rl/config/extension.toml +++ b/source/uwlab_rl/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.2.4" +version = "0.2.5" # Description title = "UW Lab RL" diff --git a/source/uwlab_rl/docs/CHANGELOG.rst b/source/uwlab_rl/docs/CHANGELOG.rst index b81c1502..0cf304a3 100644 --- a/source/uwlab_rl/docs/CHANGELOG.rst +++ b/source/uwlab_rl/docs/CHANGELOG.rst @@ -1,6 +1,19 @@ Changelog --------- +0.2.5 (2026-09-27) +~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Pinned the released ``uw-v5.4.1`` revision from the official UW-Lab RSL-RL repository, + including logger configuration and image-only normalization fixes. + Reinstall the pinned dependency with ``./uwlab.sh --install`` after updating. +* Changed the supported runtime metadata to Python 3.12 and Isaac Sim 6.1. + Use the ``isaaclab2`` branch for older environments. + + 0.2.4 (2026-09-27) ~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_rl/setup.py b/source/uwlab_rl/setup.py index d2a641b2..485774b5 100644 --- a/source/uwlab_rl/setup.py +++ b/source/uwlab_rl/setup.py @@ -33,9 +33,9 @@ # Must be a commit on UW-Lab/rsl_rl with the rsl-rl >= 5.0 API that Isaac Lab 3.0's # isaaclab_rl requires, including HeteroscedasticGaussianDistribution (rsl-rl 5.3). # Bump together with the Isaac Lab commit pinned in uwlab.sh. -# TODO(port): point back at UW-Lab/rsl_rl once UW-Lab/rsl_rl#6 is merged there. -RSL_RL_REPO = "https://github.com/JTran-UW/rsl_rl.git" -RSL_RL_COMMIT = "2d8cc641a6ef915328aef8b67403c59b32b3930e" # bump_rsl_rl_5_3 (UW-Lab/rsl_rl#6) +# Released UW-Lab/rsl_rl integration after UW-Lab/rsl_rl#6 merged. +RSL_RL_REPO = "https://github.com/UW-Lab/rsl_rl.git" +RSL_RL_COMMIT = "2c3bf18001a5e2a78527e9ea368b7ea31700a2c5" # uw-v5.4.1 (UW-Lab/rsl_rl#6) EXTRAS_REQUIRE = { "rsl-rl": [ # Update this pin alongside compatible UWLab changes. @@ -59,15 +59,15 @@ keywords=EXTENSION_TOML_DATA["package"]["keywords"], license="BSD-3-Clause", include_package_data=True, - python_requires=">=3.10", + python_requires=">=3.12,<3.13", install_requires=INSTALL_REQUIRES, dependency_links=PYTORCH_INDEX_URL, extras_require=EXTRAS_REQUIRE, packages=["uwlab_rl"], classifiers=[ "Natural Language :: English", - "Programming Language :: Python :: 3.10", - "Isaac Sim :: 4.5.0", + "Programming Language :: Python :: 3.12", + "Isaac Sim :: 6.1.0", ], zip_safe=False, ) diff --git a/tools/test_installer_pin.py b/tools/test_installer_pin.py new file mode 100644 index 00000000..88bfc3c8 --- /dev/null +++ b/tools/test_installer_pin.py @@ -0,0 +1,76 @@ +# Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). +# All Rights Reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""CPU-only checks of the installer's pinned checkout and local-change guard.""" + +import os +import re +import shlex +import subprocess +import tempfile +import unittest +from pathlib import Path + +INSTALLER = (Path(__file__).resolve().parents[1] / "uwlab.sh").read_text() + + +class TestInstallerPin(unittest.TestCase): + """Exercise checkout selection with a fake Git command and no package installation.""" + + def _run_checkout(self, existing=False, dirty=False): + start = INSTALLER.index(' repo_root="${UWLAB_PATH}/_isaaclab/IsaacLab"') + checkout = re.search(r"^\s*git .* checkout .*FETCH_HEAD.*$", INSTALLER[start:], re.MULTILINE) + end = start + checkout.end() if checkout else INSTALLER.index(" ${pip_command}", start) + pin = re.search(r"^\s*ISAACLAB_COMMIT=.*$", INSTALLER[:start], re.MULTILINE) + fragment = (pin.group(0) + "\n" if pin else "") + INSTALLER[start:end] + self.assertNotIn("${pip_command}", fragment) + with tempfile.TemporaryDirectory(prefix="uwlab checkout ") as directory: + root = Path(directory) + if existing: + (root / "_isaaclab/IsaacLab/.git").mkdir(parents=True) + trace = root / "git.log" + script = "\n".join([ + "set -e", + f"UWLAB_PATH={shlex.quote(directory)}", + f"TRACE={shlex.quote(str(trace))}", + "git() {", + ' printf "%s\\t" "$@" >> "$TRACE"', + ' printf "\\n" >> "$TRACE"', + ' if [ "${3:-}" = status ]; then printf "%s" "${TEST_DIRTY:-}"; fi', + " return 0", + "}", + fragment, + ]) + env = os.environ.copy() + env.pop("UWLAB_ISAACLAB_COMMIT", None) + env["TEST_DIRTY"] = " M modified.py" if dirty else "" + result = subprocess.run(["bash", "-c", script], env=env, capture_output=True, text=True, check=False) + calls = [line.rstrip("\t").split("\t") for line in trace.read_text().splitlines()] if trace.exists() else [] + return result, calls + + def _assert_pinned_fetch(self, calls): + fetches = [call for call in calls if "fetch" in call] + self.assertEqual(len(fetches), 1) + self.assertRegex(fetches[0][-1], r"^[0-9a-f]{40}$") + self.assertTrue(any(call[-3:] == ["-q", "--detach", "FETCH_HEAD"] for call in calls)) + + def test_fresh_checkout_fetches_an_exact_revision(self): + result, calls = self._run_checkout() + self.assertEqual(result.returncode, 0, result.stderr) + self._assert_pinned_fetch(calls) + + def test_clean_existing_checkout_is_pinned(self): + result, calls = self._run_checkout(existing=True) + self.assertEqual(result.returncode, 0, result.stderr) + self._assert_pinned_fetch(calls) + + def test_dirty_existing_checkout_is_preserved(self): + result, calls = self._run_checkout(existing=True, dirty=True) + self.assertNotEqual(result.returncode, 0) + self.assertFalse(any("fetch" in call or "checkout" in call for call in calls)) + + +if __name__ == "__main__": + unittest.main() diff --git a/uwlab.sh b/uwlab.sh index bb8a79fd..5b29e240 100755 --- a/uwlab.sh +++ b/uwlab.sh @@ -71,7 +71,7 @@ ensure_cuda_torch() { tv_ver="0.26.0" cuda_ver="130" else - # isaacsim-core 6.0.1 (Isaac Lab 3.0) requires torch==2.11.0. Its default + # isaacsim-core 6.1 (Isaac Lab 3.0) requires torch==2.11.0. Its default # PyPI wheel is built against CUDA 13.0 and silently yields # torch.cuda.is_available() == False on CUDA 12.x drivers, so this pin is # re-applied after the Isaac Lab install below (the +cu128 suffix check @@ -544,6 +544,9 @@ while [[ $# -gt 0 ]]; do echo "[INFO] Initializing IsaacLab repository at ${repo_root} ..." git init -q "${repo_root}" git -C "${repo_root}" remote add origin https://github.com/isaac-sim/IsaacLab.git + elif [ -n "$(git -C "${repo_root}" status --porcelain)" ]; then + echo "[ERROR] IsaacLab checkout has local changes; refusing to replace them." + exit 1 else echo "[INFO] Found existing IsaacLab clone at ${repo_root}; checking out the pin." fi From 4217c1b290251825d2750568bc02c11c4721c67f Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sun, 27 Sep 2026 18:29:13 -0700 Subject: [PATCH 18/27] Link documentation to maintained upstream references 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. --- CONTRIBUTING.md | 4 +- docs/source/deployment/docker.rst | 2 +- .../overview/developer-guide/development.rst | 4 +- docs/source/overview/isaac_environments.rst | 1154 +---------------- docs/source/refs/license.rst | 2 +- .../installation/binaries_installation.rst | 4 +- .../installation/include/src_clone_uwlab.rst | 70 +- .../include/src_python_virtual_env.rst | 4 +- docs/source/setup/installation/index.rst | 7 +- 9 files changed, 58 insertions(+), 1193 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9aec2185..164f7780 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,8 +4,8 @@ UW Lab is a community maintained project. We wholeheartedly welcome contribution the framework more mature and useful for everyone. These may happen in forms of bug reports, feature requests, design proposals and more. -For general information on how to contribute see -. +For development setup and extension structure, see the +[developer guide](docs/source/overview/developer-guide/development.rst). --- diff --git a/docs/source/deployment/docker.rst b/docs/source/deployment/docker.rst index 832df708..8a41234e 100644 --- a/docs/source/deployment/docker.rst +++ b/docs/source/deployment/docker.rst @@ -363,6 +363,6 @@ To run an example within the container, run: .. _`several streaming clients`: https://docs.isaacsim.omniverse.nvidia.com/latest/installation/manual_livestream_clients.html .. _`known issue`: https://forums.developer.nvidia.com/t/unable-to-use-webrtc-when-i-run-runheadless-webrtc-sh-in-remote-headless-container/222916 .. _`profile`: https://docs.docker.com/compose/compose-file/15-profiles/ -.. _`apt package`: https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html#install-ros-2-packages +.. _`apt package`: https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debs.html#install-ros-2-packages .. _`various middleware`: https://docs.ros.org/en/humble/How-To-Guides/Working-with-multiple-RMW-implementations.html .. _`tuned`: https://docs.ros.org/en/foxy/How-To-Guides/DDS-tuning.html diff --git a/docs/source/overview/developer-guide/development.rst b/docs/source/overview/developer-guide/development.rst index 4d586d20..d65a70ae 100644 --- a/docs/source/overview/developer-guide/development.rst +++ b/docs/source/overview/developer-guide/development.rst @@ -68,12 +68,12 @@ python package to build the python module provided by the extensions. This is do .. note:: The ``setup.py`` file is not required for extensions that are only loaded into Omniverse - using the `Extension Manager `__. + using the `Extension Manager `__. Lastly, the ``tests`` directory contains the unit tests for the extension. These are written using the `unittest `__ framework. It is important to note that Omniverse also provides a similar -`testing framework `__. +`testing framework `__. However, it requires going through the build process and does not support testing of the python module in standalone applications. diff --git a/docs/source/overview/isaac_environments.rst b/docs/source/overview/isaac_environments.rst index e601fa2f..3b798d2d 100644 --- a/docs/source/overview/isaac_environments.rst +++ b/docs/source/overview/isaac_environments.rst @@ -1,1137 +1,41 @@ .. _environments: -Available Environments +Isaac Lab Environments ====================== -The following lists comprises of all the RL and IL tasks implementations that are available in UW Lab. -While we try to keep this list up-to-date, you can always get the latest list of environments by -running the following command: +Upstream Isaac Lab environments are supplied by the pinned Isaac Lab dependency, +not by ``source/uwlab_tasks``. UWLab 2.0 uses Isaac Lab 3.0 Early Access at +``ae37b028ea415c91ea2bc32609efcd759ed2b974``. Task names, configuration locations, +and backend presets differ from the older 2.x catalogue. -.. tab-set:: - :sync-group: os +Use the `maintained Isaac Lab environment browser +`_ +to explore upstream tasks. That live page follows upstream development; the +`task registrations at UWLab's pinned revision +`_ +and the `browser source at that revision +`_ +are the version-specific references for this release. - .. tab-item:: :icon:`fa-brands fa-linux` Linux - :sync: linux +Discover installed environments +------------------------------- - .. code:: bash +After installing the pinned stack, list the environments registered by the local +checkout rather than assuming that a name from another release is available: - ./uwlab.sh -p scripts/environments/list_envs.py +.. code-block:: bash - .. tab-item:: :icon:`fa-brands fa-windows` Windows - :sync: windows + ./uwlab.sh -p scripts/environments/list_envs.py - .. code:: batch +For UWLab's own tasks and configurations, see :doc:`uw_environments`. +Availability in the registry does not by itself establish runtime qualification +of every task, robot, or backend combination. - uwlab.bat -p scripts\environments\list_envs.py +Legacy environments +------------------- -We are actively working on adding more environments to the list. If you have any environments that -you would like to add to UW Lab, please feel free to open a pull request! - -Single-agent ------------- - -Classic -~~~~~~~ - -Classic environments that are based on IsaacGymEnvs implementation of MuJoCo-style environments. - -.. table:: - :widths: 33 37 30 - - +------------------+-----------------------------+-------------------------------------------------------------------------+ - | World | Environment ID | Description | - +==================+=============================+=========================================================================+ - | |humanoid| | |humanoid-link| | Move towards a direction with the MuJoCo humanoid robot | - | | | | - | | |humanoid-direct-link| | | - +------------------+-----------------------------+-------------------------------------------------------------------------+ - | |ant| | |ant-link| | Move towards a direction with the MuJoCo ant robot | - | | | | - | | |ant-direct-link| | | - +------------------+-----------------------------+-------------------------------------------------------------------------+ - | |cartpole| | |cartpole-link| | Move the cart to keep the pole upwards in the classic cartpole control | - | | | | - | | |cartpole-direct-link| | | - +------------------+-----------------------------+-------------------------------------------------------------------------+ - | |cartpole| | |cartpole-rgb-link| | Move the cart to keep the pole upwards in the classic cartpole control | - | | | and perceptive inputs. Requires running with ``--enable_cameras``. | - | | |cartpole-depth-link| | | - | | | | - | | |cartpole-rgb-direct-link| | | - | | | | - | | |cartpole-depth-direct-link|| | - +------------------+-----------------------------+-------------------------------------------------------------------------+ - | |cartpole| | |cartpole-resnet-link| | Move the cart to keep the pole upwards in the classic cartpole control | - | | | based off of features extracted from perceptive inputs with pre-trained | - | | |cartpole-theia-link| | frozen vision encoders. Requires running with ``--enable_cameras``. | - +------------------+-----------------------------+-------------------------------------------------------------------------+ - -.. |humanoid| image:: ../_static/tasks/classic/humanoid.jpg -.. |ant| image:: ../_static/tasks/classic/ant.jpg -.. |cartpole| image:: ../_static/tasks/classic/cartpole.jpg - -.. |humanoid-link| replace:: `Isaac-Humanoid-v0 `__ -.. |ant-link| replace:: `Isaac-Ant-v0 `__ -.. |cartpole-link| replace:: `Isaac-Cartpole-v0 `__ -.. |cartpole-rgb-link| replace:: `Isaac-Cartpole-RGB-v0 `__ -.. |cartpole-depth-link| replace:: `Isaac-Cartpole-Depth-v0 `__ -.. |cartpole-resnet-link| replace:: `Isaac-Cartpole-RGB-ResNet18-v0 `__ -.. |cartpole-theia-link| replace:: `Isaac-Cartpole-RGB-TheiaTiny-v0 `__ - - -.. |humanoid-direct-link| replace:: `Isaac-Humanoid-Direct-v0 `__ -.. |ant-direct-link| replace:: `Isaac-Ant-Direct-v0 `__ -.. |cartpole-direct-link| replace:: `Isaac-Cartpole-Direct-v0 `__ -.. |cartpole-rgb-direct-link| replace:: `Isaac-Cartpole-RGB-Camera-Direct-v0 `__ -.. |cartpole-depth-direct-link| replace:: `Isaac-Cartpole-Depth-Camera-Direct-v0 `__ - -Manipulation -~~~~~~~~~~~~ - -Environments based on fixed-arm manipulation tasks. - -For many of these tasks, we include configurations with different arm action spaces. For example, -for the lift-cube environment: - -* |lift-cube-link|: Franka arm with joint position control -* |lift-cube-ik-abs-link|: Franka arm with absolute IK control -* |lift-cube-ik-rel-link|: Franka arm with relative IK control - -.. table:: - :widths: 33 37 30 - - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | World | Environment ID | Description | - +=========================+==============================+=============================================================================+ - | |reach-franka| | |reach-franka-link| | Move the end-effector to a sampled target pose with the Franka robot | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |reach-ur10| | |reach-ur10-link| | Move the end-effector to a sampled target pose with the UR10 robot | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |deploy-reach-ur10e| | |deploy-reach-ur10e-link| | Move the end-effector to a sampled target pose with the UR10e robot | - | | | This policy has been deployed to a real robot | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |lift-cube| | |lift-cube-link| | Pick a cube and bring it to a sampled target position with the Franka robot | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |stack-cube| | |stack-cube-link| | Stack three cubes (bottom to top: blue, red, green) with the Franka robot. | - | | | Blueprint env used for the NVIDIA Isaac GR00T blueprint for synthetic | - | | |stack-cube-bp-link| | manipulation motion generation | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |surface-gripper| | |long-suction-link| | Stack three cubes (bottom to top: blue, red, green) | - | | | with the UR10 arm and long surface gripper | - | | |short-suction-link| | or short surface gripper. | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |cabi-franka| | |cabi-franka-link| | Grasp the handle of a cabinet's drawer and open it with the Franka robot | - | | | | - | | |franka-direct-link| | | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |cube-allegro| | |cube-allegro-link| | In-hand reorientation of a cube using Allegro hand | - | | | | - | | |allegro-direct-link| | | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |cube-shadow| | |cube-shadow-link| | In-hand reorientation of a cube using Shadow hand | - | | | | - | | |cube-shadow-ff-link| | | - | | | | - | | |cube-shadow-lstm-link| | | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |cube-shadow| | |cube-shadow-vis-link| | In-hand reorientation of a cube using Shadow hand using perceptive inputs. | - | | | Requires running with ``--enable_cameras``. | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |gr1_pick_place| | |gr1_pick_place-link| | Pick up and place an object in a basket with a GR-1 humanoid robot | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |gr1_pp_waist| | |gr1_pp_waist-link| | Pick up and place an object in a basket with a GR-1 humanoid robot | - | | | with waist degrees-of-freedom enables that provides a wider reach space. | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |g1_pick_place| | |g1_pick_place-link| | Pick up and place an object in a basket with a Unitree G1 humanoid robot | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |g1_pick_place_fixed| | |g1_pick_place_fixed-link| | Pick up and place an object in a basket with a Unitree G1 humanoid robot | - | | | with three-fingered hands. Robot is set up with the base fixed in place. | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |g1_pick_place_lm| | |g1_pick_place_lm-link| | Pick up and place an object in a basket with a Unitree G1 humanoid robot | - | | | with three-fingered hands and in-place locomanipulation capabilities | - | | | enabled (i.e. Robot lower body balances in-place while upper body is | - | | | controlled via Inverse Kinematics). | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |kuka-allegro-lift| | |kuka-allegro-lift-link| | Pick up a primitive shape on the table and lift it to target position | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |kuka-allegro-reorient| | |kuka-allegro-reorient-link| | Pick up a primitive shape on the table and orient it to target pose | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |galbot_stack| | |galbot_stack-link| | Stack three cubes (bottom to top: blue, red, green) with the left arm of | - | | | a Galbot humanoid robot | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |agibot_place_mug| | |agibot_place_mug-link| | Pick up and place a mug upright with a Agibot A2D humanoid robot | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - | |agibot_place_toy| | |agibot_place_toy-link| | Pick up and place an object in a box with a Agibot A2D humanoid robot | - +-------------------------+------------------------------+-----------------------------------------------------------------------------+ - -.. |reach-franka| image:: ../_static/tasks/manipulation/franka_reach.jpg -.. |reach-ur10| image:: ../_static/tasks/manipulation/ur10_reach.jpg -.. |deploy-reach-ur10e| image:: ../_static/tasks/manipulation/ur10e_reach.jpg -.. |lift-cube| image:: ../_static/tasks/manipulation/franka_lift.jpg -.. |cabi-franka| image:: ../_static/tasks/manipulation/franka_open_drawer.jpg -.. |cube-allegro| image:: ../_static/tasks/manipulation/allegro_cube.jpg -.. |cube-shadow| image:: ../_static/tasks/manipulation/shadow_cube.jpg -.. |stack-cube| image:: ../_static/tasks/manipulation/franka_stack.jpg -.. |gr1_pick_place| image:: ../_static/tasks/manipulation/gr-1_pick_place.jpg -.. |g1_pick_place| image:: ../_static/tasks/manipulation/g1_pick_place.jpg -.. |g1_pick_place_fixed| image:: ../_static/tasks/manipulation/g1_pick_place_fixed_base.jpg -.. |g1_pick_place_lm| image:: ../_static/tasks/manipulation/g1_pick_place_locomanipulation.jpg -.. |surface-gripper| image:: ../_static/tasks/manipulation/ur10_stack_surface_gripper.jpg -.. |gr1_pp_waist| image:: ../_static/tasks/manipulation/gr-1_pick_place_waist.jpg -.. |galbot_stack| image:: ../_static/tasks/manipulation/galbot_stack_cube.jpg -.. |agibot_place_mug| image:: ../_static/tasks/manipulation/agibot_place_mug.jpg -.. |agibot_place_toy| image:: ../_static/tasks/manipulation/agibot_place_toy.jpg -.. |kuka-allegro-lift| image:: ../_static/tasks/manipulation/kuka_allegro_lift.jpg -.. |kuka-allegro-reorient| image:: ../_static/tasks/manipulation/kuka_allegro_reorient.jpg - -.. |reach-franka-link| replace:: `Isaac-Reach-Franka-v0 `__ -.. |reach-ur10-link| replace:: `Isaac-Reach-UR10-v0 `__ -.. |deploy-reach-ur10e-link| replace:: `Isaac-Deploy-Reach-UR10e-v0 `__ -.. |lift-cube-link| replace:: `Isaac-Lift-Cube-Franka-v0 `__ -.. |lift-cube-ik-abs-link| replace:: `Isaac-Lift-Cube-Franka-IK-Abs-v0 `__ -.. |lift-cube-ik-rel-link| replace:: `Isaac-Lift-Cube-Franka-IK-Rel-v0 `__ -.. |cabi-franka-link| replace:: `Isaac-Open-Drawer-Franka-v0 `__ -.. |franka-direct-link| replace:: `Isaac-Franka-Cabinet-Direct-v0 `__ -.. |cube-allegro-link| replace:: `Isaac-Repose-Cube-Allegro-v0 `__ -.. |allegro-direct-link| replace:: `Isaac-Repose-Cube-Allegro-Direct-v0 `__ -.. |stack-cube-link| replace:: `Isaac-Stack-Cube-Franka-v0 `__ -.. |stack-cube-bp-link| replace:: `Isaac-Stack-Cube-Franka-IK-Rel-Blueprint-v0 `__ -.. |gr1_pick_place-link| replace:: `Isaac-PickPlace-GR1T2-Abs-v0 `__ -.. |g1_pick_place-link| replace:: `Isaac-PickPlace-G1-InspireFTP-Abs-v0 `__ -.. |g1_pick_place_fixed-link| replace:: `Isaac-PickPlace-FixedBaseUpperBodyIK-G1-Abs-v0 `__ -.. |g1_pick_place_lm-link| replace:: `Isaac-PickPlace-Locomanipulation-G1-Abs-v0 `__ -.. |long-suction-link| replace:: `Isaac-Stack-Cube-UR10-Long-Suction-IK-Rel-v0 `__ -.. |short-suction-link| replace:: `Isaac-Stack-Cube-UR10-Short-Suction-IK-Rel-v0 `__ -.. |gr1_pp_waist-link| replace:: `Isaac-PickPlace-GR1T2-WaistEnabled-Abs-v0 `__ -.. |galbot_stack-link| replace:: `Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-RmpFlow-v0 `__ -.. |kuka-allegro-lift-link| replace:: `Isaac-Dexsuite-Kuka-Allegro-Lift-v0 `__ -.. |kuka-allegro-reorient-link| replace:: `Isaac-Dexsuite-Kuka-Allegro-Reorient-v0 `__ -.. |cube-shadow-link| replace:: `Isaac-Repose-Cube-Shadow-Direct-v0 `__ -.. |cube-shadow-ff-link| replace:: `Isaac-Repose-Cube-Shadow-OpenAI-FF-Direct-v0 `__ -.. |cube-shadow-lstm-link| replace:: `Isaac-Repose-Cube-Shadow-OpenAI-LSTM-Direct-v0 `__ -.. |cube-shadow-vis-link| replace:: `Isaac-Repose-Cube-Shadow-Vision-Direct-v0 `__ -.. |agibot_place_mug-link| replace:: `Isaac-Place-Mug-Agibot-Left-Arm-RmpFlow-v0 `__ -.. |agibot_place_toy-link| replace:: `Isaac-Place-Toy2Box-Agibot-Right-Arm-RmpFlow-v0 `__ - - -Contact-rich Manipulation -~~~~~~~~~~~~~~~~~~~~~~~~~ - -Environments based on contact-rich manipulation tasks such as peg insertion, gear meshing and nut-bolt fastening. - -These tasks share the same task configurations and control options. You can switch between them by specifying the task name. -For example: - -* |factory-peg-link|: Peg insertion with the Franka arm -* |factory-gear-link|: Gear meshing with the Franka arm -* |factory-nut-link|: Nut-Bolt fastening with the Franka arm - -.. table:: - :widths: 33 37 30 - - +--------------------+-------------------------+-----------------------------------------------------------------------------+ - | World | Environment ID | Description | - +====================+=========================+=============================================================================+ - | |factory-peg| | |factory-peg-link| | Insert peg into the socket with the Franka robot | - +--------------------+-------------------------+-----------------------------------------------------------------------------+ - | |factory-gear| | |factory-gear-link| | Insert and mesh gear into the base with other gears, using the Franka robot | - +--------------------+-------------------------+-----------------------------------------------------------------------------+ - | |factory-nut| | |factory-nut-link| | Thread the nut onto the first 2 threads of the bolt, using the Franka robot | - +--------------------+-------------------------+-----------------------------------------------------------------------------+ - -.. |factory-peg| image:: ../_static/tasks/factory/peg_insert.jpg -.. |factory-gear| image:: ../_static/tasks/factory/gear_mesh.jpg -.. |factory-nut| image:: ../_static/tasks/factory/nut_thread.jpg - -.. |factory-peg-link| replace:: `Isaac-Factory-PegInsert-Direct-v0 `__ -.. |factory-gear-link| replace:: `Isaac-Factory-GearMesh-Direct-v0 `__ -.. |factory-nut-link| replace:: `Isaac-Factory-NutThread-Direct-v0 `__ - -AutoMate -~~~~~~~~ - -Environments based on 100 diverse assembly tasks, each involving the insertion of a plug into a socket. These tasks share a common configuration and differ by th geometry and properties of the parts. - -You can switch between tasks by specifying the corresponding asset ID. Available asset IDs include: - -'00004', '00007', '00014', '00015', '00016', '00021', '00028', '00030', '00032', '00042', '00062', '00074', '00077', '00078', '00081', '00083', '00103', '00110', '00117', '00133', '00138', '00141', '00143', '00163', '00175', '00186', '00187', '00190', '00192', '00210', '00211', '00213', '00255', '00256', '00271', '00293', '00296', '00301', '00308', '00318', '00319', '00320', '00329', '00340', '00345', '00346', '00360', '00388', '00410', '00417', '00422', '00426', '00437', '00444', '00446', '00470', '00471', '00480', '00486', '00499', '00506', '00514', '00537', '00553', '00559', '00581', '00597', '00614', '00615', '00638', '00648', '00649', '00652', '00659', '00681', '00686', '00700', '00703', '00726', '00731', '00741', '00755', '00768', '00783', '00831', '00855', '00860', '00863', '01026', '01029', '01036', '01041', '01053', '01079', '01092', '01102', '01125', '01129', '01132', '01136'. - -We provide environments for both disassembly and assembly. - -.. attention:: - - CUDA is recommended for running the AutoMate environments with 570 drivers. If running with Nvidia driver 570 on Linux with architecture x86_64, we follow the below steps to install CUDA 12.8. This allows for computing rewards in AutoMate environments with CUDA. If you have a different operation system or architecture, please refer to the `CUDA installation page `_ for additional instruction. - - .. code-block:: bash - - wget https://developer.download.nvidia.com/compute/cuda/12.8.0/local_installers/cuda_12.8.0_570.86.10_linux.run - sudo sh cuda_12.8.0_570.86.10_linux.run --toolkit - - When using conda, cuda toolkit can be installed with: - - .. code-block:: bash - - conda install cudatoolkit - - With 580 drivers and CUDA 13, we are currently unable to enable CUDA for computing the rewards. The code automatically fallbacks to CPU, resulting in slightly slower performance. - -* |disassembly-link|: The plug starts inserted in the socket. A low-level controller lifts the plug out and moves it to a random position. This process is purely scripted and does not involve any learned policy. Therefore, it does not require policy training or evaluation. The resulting trajectories serve as demonstrations for the reverse process, i.e., learning to assemble. To run disassembly for a specific task: ``python source/uwlab_tasks/uwlab_tasks/direct/automate/run_disassembly_w_id.py --assembly_id=ASSEMBLY_ID --disassembly_dir=DISASSEMBLY_DIR``. All generated trajectories are saved to a local directory ``DISASSEMBLY_DIR``. -* |assembly-link|: The goal is to insert the plug into the socket. You can use this environment to train a policy via reinforcement learning or evaluate a pre-trained checkpoint. - - * To train an assembly policy, we run the command ``python source/uwlab_tasks/uwlab_tasks/direct/automate/run_w_id.py --assembly_id=ASSEMBLY_ID --train``. We can customize the training process using the optional flags: ``--headless`` to run without opening the GUI windows, ``--max_iterations=MAX_ITERATIONS`` to set the number of training iterations, ``--num_envs=NUM_ENVS`` to set the number of parallel environments during training, ``--seed=SEED`` to assign the random seed. The policy checkpoints will be saved automatically during training in the directory ``logs/rl_games/Assembly/test``. - * To evaluate an assembly policy, we run the command ``python source/uwlab_tasks/uwlab_tasks/direct/automate/run_w_id.py --assembly_id=ASSEMBLY_ID --checkpoint=CHECKPOINT --log_eval``. The evaluation results are stored in ``evaluation_{ASSEMBLY_ID}.h5``. - -.. table:: - :widths: 33 37 30 - - +--------------------+-------------------------+-----------------------------------------------------------------------------+ - | World | Environment ID | Description | - +====================+=========================+=============================================================================+ - | |disassembly| | |disassembly-link| | Lift a plug out of the socket with the Franka robot | - +--------------------+-------------------------+-----------------------------------------------------------------------------+ - | |assembly| | |assembly-link| | Insert a plug into its corresponding socket with the Franka robot | - +--------------------+-------------------------+-----------------------------------------------------------------------------+ - -.. |assembly| image:: ../_static/tasks/automate/00004.jpg -.. |disassembly| image:: ../_static/tasks/automate/01053_disassembly.jpg - -.. |assembly-link| replace:: `Isaac-AutoMate-Assembly-Direct-v0 `__ -.. |disassembly-link| replace:: `Isaac-AutoMate-Disassembly-Direct-v0 `__ - -FORGE -~~~~~~~~ - -FORGE environments extend Factory environments with: - -* Force sensing: Add observations for force experienced by the end-effector. -* Excessive force penalty: Add an option to penalize the agent for excessive contact forces. -* Dynamics randomization: Randomize controller gains, asset properties (friction, mass), and dead-zone. -* Success prediction: Add an extra action that predicts task success. - -These tasks share the same task configurations and control options. You can switch between them by specifying the task name. - -* |forge-peg-link|: Peg insertion with the Franka arm -* |forge-gear-link|: Gear meshing with the Franka arm -* |forge-nut-link|: Nut-Bolt fastening with the Franka arm - -.. table:: - :widths: 33 37 30 - - +--------------------+-------------------------+-----------------------------------------------------------------------------+ - | World | Environment ID | Description | - +====================+=========================+=============================================================================+ - | |forge-peg| | |forge-peg-link| | Insert peg into the socket with the Franka robot | - +--------------------+-------------------------+-----------------------------------------------------------------------------+ - | |forge-gear| | |forge-gear-link| | Insert and mesh gear into the base with other gears, using the Franka robot | - +--------------------+-------------------------+-----------------------------------------------------------------------------+ - | |forge-nut| | |forge-nut-link| | Thread the nut onto the first 2 threads of the bolt, using the Franka robot | - +--------------------+-------------------------+-----------------------------------------------------------------------------+ - -.. |forge-peg| image:: ../_static/tasks/factory/peg_insert.jpg -.. |forge-gear| image:: ../_static/tasks/factory/gear_mesh.jpg -.. |forge-nut| image:: ../_static/tasks/factory/nut_thread.jpg - -.. |forge-peg-link| replace:: `Isaac-Forge-PegInsert-Direct-v0 `__ -.. |forge-gear-link| replace:: `Isaac-Forge-GearMesh-Direct-v0 `__ -.. |forge-nut-link| replace:: `Isaac-Forge-NutThread-Direct-v0 `__ - - -Locomotion -~~~~~~~~~~ - -Environments based on legged locomotion tasks. - -.. table:: - :widths: 33 37 30 - - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | World | Environment ID | Description | - +==============================+==============================================+==============================================================================+ - | |velocity-flat-anymal-b| | |velocity-flat-anymal-b-link| | Track a velocity command on flat terrain with the Anymal B robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-rough-anymal-b| | |velocity-rough-anymal-b-link| | Track a velocity command on rough terrain with the Anymal B robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-flat-anymal-c| | |velocity-flat-anymal-c-link| | Track a velocity command on flat terrain with the Anymal C robot | - | | | | - | | |velocity-flat-anymal-c-direct-link| | | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-rough-anymal-c| | |velocity-rough-anymal-c-link| | Track a velocity command on rough terrain with the Anymal C robot | - | | | | - | | |velocity-rough-anymal-c-direct-link| | | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-flat-anymal-d| | |velocity-flat-anymal-d-link| | Track a velocity command on flat terrain with the Anymal D robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-rough-anymal-d| | |velocity-rough-anymal-d-link| | Track a velocity command on rough terrain with the Anymal D robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-flat-unitree-a1| | |velocity-flat-unitree-a1-link| | Track a velocity command on flat terrain with the Unitree A1 robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-rough-unitree-a1| | |velocity-rough-unitree-a1-link| | Track a velocity command on rough terrain with the Unitree A1 robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-flat-unitree-go1| | |velocity-flat-unitree-go1-link| | Track a velocity command on flat terrain with the Unitree Go1 robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-rough-unitree-go1| | |velocity-rough-unitree-go1-link| | Track a velocity command on rough terrain with the Unitree Go1 robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-flat-unitree-go2| | |velocity-flat-unitree-go2-link| | Track a velocity command on flat terrain with the Unitree Go2 robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-rough-unitree-go2| | |velocity-rough-unitree-go2-link| | Track a velocity command on rough terrain with the Unitree Go2 robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-flat-spot| | |velocity-flat-spot-link| | Track a velocity command on flat terrain with the Boston Dynamics Spot robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-flat-h1| | |velocity-flat-h1-link| | Track a velocity command on flat terrain with the Unitree H1 robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-rough-h1| | |velocity-rough-h1-link| | Track a velocity command on rough terrain with the Unitree H1 robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-flat-g1| | |velocity-flat-g1-link| | Track a velocity command on flat terrain with the Unitree G1 robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-rough-g1| | |velocity-rough-g1-link| | Track a velocity command on rough terrain with the Unitree G1 robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-flat-digit| | |velocity-flat-digit-link| | Track a velocity command on flat terrain with the Agility Digit robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |velocity-rough-digit| | |velocity-rough-digit-link| | Track a velocity command on rough terrain with the Agility Digit robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - | |tracking-loco-manip-digit| | |tracking-loco-manip-digit-link| | Track a root velocity and hand pose command with the Agility Digit robot | - +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+ - -.. |velocity-flat-anymal-b-link| replace:: `Isaac-Velocity-Flat-Anymal-B-v0 `__ -.. |velocity-rough-anymal-b-link| replace:: `Isaac-Velocity-Rough-Anymal-B-v0 `__ - -.. |velocity-flat-anymal-c-link| replace:: `Isaac-Velocity-Flat-Anymal-C-v0 `__ -.. |velocity-rough-anymal-c-link| replace:: `Isaac-Velocity-Rough-Anymal-C-v0 `__ - -.. |velocity-flat-anymal-c-direct-link| replace:: `Isaac-Velocity-Flat-Anymal-C-Direct-v0 `__ -.. |velocity-rough-anymal-c-direct-link| replace:: `Isaac-Velocity-Rough-Anymal-C-Direct-v0 `__ - -.. |velocity-flat-anymal-d-link| replace:: `Isaac-Velocity-Flat-Anymal-D-v0 `__ -.. |velocity-rough-anymal-d-link| replace:: `Isaac-Velocity-Rough-Anymal-D-v0 `__ - -.. |velocity-flat-unitree-a1-link| replace:: `Isaac-Velocity-Flat-Unitree-A1-v0 `__ -.. |velocity-rough-unitree-a1-link| replace:: `Isaac-Velocity-Rough-Unitree-A1-v0 `__ - -.. |velocity-flat-unitree-go1-link| replace:: `Isaac-Velocity-Flat-Unitree-Go1-v0 `__ -.. |velocity-rough-unitree-go1-link| replace:: `Isaac-Velocity-Rough-Unitree-Go1-v0 `__ - -.. |velocity-flat-unitree-go2-link| replace:: `Isaac-Velocity-Flat-Unitree-Go2-v0 `__ -.. |velocity-rough-unitree-go2-link| replace:: `Isaac-Velocity-Rough-Unitree-Go2-v0 `__ - -.. |velocity-flat-spot-link| replace:: `Isaac-Velocity-Flat-Spot-v0 `__ - -.. |velocity-flat-h1-link| replace:: `Isaac-Velocity-Flat-H1-v0 `__ -.. |velocity-rough-h1-link| replace:: `Isaac-Velocity-Rough-H1-v0 `__ - -.. |velocity-flat-g1-link| replace:: `Isaac-Velocity-Flat-G1-v0 `__ -.. |velocity-rough-g1-link| replace:: `Isaac-Velocity-Rough-G1-v0 `__ - -.. |velocity-flat-digit-link| replace:: `Isaac-Velocity-Flat-Digit-v0 `__ -.. |velocity-rough-digit-link| replace:: `Isaac-Velocity-Rough-Digit-v0 `__ -.. |tracking-loco-manip-digit-link| replace:: `Isaac-Tracking-LocoManip-Digit-v0 `__ - -.. |velocity-flat-anymal-b| image:: ../_static/tasks/locomotion/anymal_b_flat.jpg -.. |velocity-rough-anymal-b| image:: ../_static/tasks/locomotion/anymal_b_rough.jpg -.. |velocity-flat-anymal-c| image:: ../_static/tasks/locomotion/anymal_c_flat.jpg -.. |velocity-rough-anymal-c| image:: ../_static/tasks/locomotion/anymal_c_rough.jpg -.. |velocity-flat-anymal-d| image:: ../_static/tasks/locomotion/anymal_d_flat.jpg -.. |velocity-rough-anymal-d| image:: ../_static/tasks/locomotion/anymal_d_rough.jpg -.. |velocity-flat-unitree-a1| image:: ../_static/tasks/locomotion/a1_flat.jpg -.. |velocity-rough-unitree-a1| image:: ../_static/tasks/locomotion/a1_rough.jpg -.. |velocity-flat-unitree-go1| image:: ../_static/tasks/locomotion/go1_flat.jpg -.. |velocity-rough-unitree-go1| image:: ../_static/tasks/locomotion/go1_rough.jpg -.. |velocity-flat-unitree-go2| image:: ../_static/tasks/locomotion/go2_flat.jpg -.. |velocity-rough-unitree-go2| image:: ../_static/tasks/locomotion/go2_rough.jpg -.. |velocity-flat-spot| image:: ../_static/tasks/locomotion/spot_flat.jpg -.. |velocity-flat-h1| image:: ../_static/tasks/locomotion/h1_flat.jpg -.. |velocity-rough-h1| image:: ../_static/tasks/locomotion/h1_rough.jpg -.. |velocity-flat-g1| image:: ../_static/tasks/locomotion/g1_flat.jpg -.. |velocity-rough-g1| image:: ../_static/tasks/locomotion/g1_rough.jpg -.. |velocity-flat-digit| image:: ../_static/tasks/locomotion/agility_digit_flat.jpg -.. |velocity-rough-digit| image:: ../_static/tasks/locomotion/agility_digit_rough.jpg -.. |tracking-loco-manip-digit| image:: ../_static/tasks/locomotion/agility_digit_loco_manip.jpg - -Navigation -~~~~~~~~~~ - -.. table:: - :widths: 33 37 30 - - +----------------+---------------------+-----------------------------------------------------------------------------+ - | World | Environment ID | Description | - +================+=====================+=============================================================================+ - | |anymal_c_nav| | |anymal_c_nav-link| | Navigate towards a target x-y position and heading with the ANYmal C robot. | - +----------------+---------------------+-----------------------------------------------------------------------------+ - -.. |anymal_c_nav-link| replace:: `Isaac-Navigation-Flat-Anymal-C-v0 `__ - -.. |anymal_c_nav| image:: ../_static/tasks/navigation/anymal_c_nav.jpg - - -Others -~~~~~~ - -.. note:: - - Adversarial Motion Priors (AMP) training is only available with the `skrl` library, as it is the only one of the currently - integrated libraries that supports it out-of-the-box (for the other libraries, it is necessary to implement the algorithm and architectures). - See the `skrl's AMP Documentation `_ for more information. - The AMP algorithm can be activated by adding the command line input ``--algorithm AMP`` to the train/play script. - - For evaluation, the play script's command line input ``--real-time`` allows the interaction loop between the environment and the agent to run in real time, if possible. - -.. table:: - :widths: 33 37 30 - - +----------------+---------------------------+-----------------------------------------------------------------------------+ - | World | Environment ID | Description | - +================+===========================+=============================================================================+ - | |quadcopter| | |quadcopter-link| | Fly and hover the Crazyflie copter at a goal point by applying thrust. | - +----------------+---------------------------+-----------------------------------------------------------------------------+ - | |humanoid_amp| | |humanoid_amp_dance-link| | Move a humanoid robot by imitating different pre-recorded human animations | - | | | (Adversarial Motion Priors). | - | | |humanoid_amp_run-link| | | - | | | | - | | |humanoid_amp_walk-link| | | - +----------------+---------------------------+-----------------------------------------------------------------------------+ - -.. |quadcopter-link| replace:: `Isaac-Quadcopter-Direct-v0 `__ -.. |humanoid_amp_dance-link| replace:: `Isaac-Humanoid-AMP-Dance-Direct-v0 `__ -.. |humanoid_amp_run-link| replace:: `Isaac-Humanoid-AMP-Run-Direct-v0 `__ -.. |humanoid_amp_walk-link| replace:: `Isaac-Humanoid-AMP-Walk-Direct-v0 `__ - -.. |quadcopter| image:: ../_static/tasks/others/quadcopter.jpg -.. |humanoid_amp| image:: ../_static/tasks/others/humanoid_amp.jpg - -Spaces showcase -~~~~~~~~~~~~~~~ - -The |cartpole_showcase| folder contains showcase tasks (based on the *Cartpole* and *Cartpole-Camera* Direct tasks) -for the definition/use of the various Gymnasium observation and action spaces supported in UW Lab. - -.. |cartpole_showcase| replace:: `cartpole_showcase `__ - -.. note:: - - Currently, only UW Lab's Direct workflow supports the definition of observation and action spaces other than ``Box``. - See Direct workflow's :py:obj:`~uwlab.envs.DirectRLEnvCfg.observation_space` / :py:obj:`~uwlab.envs.DirectRLEnvCfg.action_space` - documentation for more details. - -The following tables summarize the different pairs of showcased spaces for the *Cartpole* and *Cartpole-Camera* tasks. -Replace ```` and ```` with the observation and action spaces to be explored in the task names for training and evaluation. - -.. raw:: html - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Showcase spaces for the Cartpole task

-

Isaac-Cartpole-Showcase-<OBSERVATION>-<ACTION>-Direct-v0

-
action space
 Box Discrete MultiDiscrete

observation

space

 Boxxxx
 Discretexxx
 MultiDiscretexxx
 Dictxxx
 Tuplexxx
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Showcase spaces for the Cartpole-Camera task

-

Isaac-Cartpole-Camera-Showcase-<OBSERVATION>-<ACTION>-Direct-v0

-
action space
 Box Discrete MultiDiscrete

observation

space

 Boxxxx
 Discrete---
 MultiDiscrete---
 Dictxxx
 Tuplexxx
- -Multi-agent ------------- - -.. note:: - - True mutli-agent training is only available with the `skrl` library, see the `Multi-Agents Documentation `_ for more information. - It supports the `IPPO` and `MAPPO` algorithms, which can be activated by adding the command line input ``--algorithm IPPO`` or ``--algorithm MAPPO`` to the train/play script. - If these environments are run with other libraries or without the `IPPO` or `MAPPO` flags, they will be converted to single-agent environments under the hood. - - -Classic -~~~~~~~ - -.. table:: - :widths: 33 37 30 - - +------------------------+------------------------------------+-----------------------------------------------------------------------------------------------------------------------+ - | World | Environment ID | Description | - +========================+====================================+=======================================================================================================================+ - | |cart-double-pendulum| | |cart-double-pendulum-direct-link| | Move the cart and the pendulum to keep the last one upwards in the classic inverted double pendulum on a cart control | - +------------------------+------------------------------------+-----------------------------------------------------------------------------------------------------------------------+ - -.. |cart-double-pendulum| image:: ../_static/tasks/classic/cart_double_pendulum.jpg - -.. |cart-double-pendulum-direct-link| replace:: `Isaac-Cart-Double-Pendulum-Direct-v0 `__ - -Manipulation -~~~~~~~~~~~~ - -Environments based on fixed-arm manipulation tasks. - -.. table:: - :widths: 33 37 30 - - +----------------------+--------------------------------+--------------------------------------------------------+ - | World | Environment ID | Description | - +======================+================================+========================================================+ - | |shadow-hand-over| | |shadow-hand-over-direct-link| | Passing an object from one hand over to the other hand | - +----------------------+--------------------------------+--------------------------------------------------------+ - -.. |shadow-hand-over| image:: ../_static/tasks/manipulation/shadow_hand_over.jpg - -.. |shadow-hand-over-direct-link| replace:: `Isaac-Shadow-Hand-Over-Direct-v0 `__ - -| - -Comprehensive List of Environments -================================== - -For environments that have a different task name listed under ``Inference Task Name``, please use the Inference Task Name -provided when running ``play.py`` or any inferencing workflows. These tasks provide more suitable configurations for -inferencing, including reading from an already trained checkpoint and disabling runtime perturbations used for training. - -.. list-table:: - :widths: 33 25 19 25 - - * - **Task Name** - - **Inference Task Name** - - **Workflow** - - **RL Library** - * - Isaac-Ant-Direct-v0 - - - - Direct - - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Ant-v0 - - - - Manager Based - - **rsl_rl** (PPO), **rl_games** (PPO), **skrl** (PPO), **sb3** (PPO) - * - Isaac-Cart-Double-Pendulum-Direct-v0 - - - - Direct - - **rl_games** (PPO), **skrl** (IPPO, PPO, MAPPO) - * - Isaac-Cartpole-Camera-Showcase-Box-Box-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Camera-Showcase-Box-Discrete-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Camera-Showcase-Box-MultiDiscrete-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Camera-Showcase-Dict-Box-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Camera-Showcase-Dict-Discrete-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Camera-Showcase-Dict-MultiDiscrete-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Camera-Showcase-Tuple-Box-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Camera-Showcase-Tuple-Discrete-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Camera-Showcase-Tuple-MultiDiscrete-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Depth-Camera-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **rl_games** (PPO), **skrl** (PPO) - * - Isaac-Cartpole-Depth-v0 (Requires running with ``--enable_cameras``) - - - - Manager Based - - **rl_games** (PPO) - * - Isaac-Cartpole-Direct-v0 - - - - Direct - - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO) - * - Isaac-Cartpole-RGB-Camera-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **rl_games** (PPO), **skrl** (PPO) - * - Isaac-Cartpole-RGB-ResNet18-v0 (Requires running with ``--enable_cameras``) - - - - Manager Based - - **rl_games** (PPO) - * - Isaac-Cartpole-RGB-TheiaTiny-v0 (Requires running with ``--enable_cameras``) - - - - Manager Based - - **rl_games** (PPO) - * - Isaac-Cartpole-RGB-v0 (Requires running with ``--enable_cameras``) - - - - Manager Based - - **rl_games** (PPO) - * - Isaac-Cartpole-Showcase-Box-Box-Direct-v0 - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Showcase-Box-Discrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Showcase-Box-MultiDiscrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Showcase-Dict-Box-Direct-v0 - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Showcase-Dict-Discrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Showcase-Dict-MultiDiscrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Showcase-Discrete-Box-Direct-v0 - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Showcase-Discrete-Discrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Showcase-Discrete-MultiDiscrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Showcase-MultiDiscrete-Box-Direct-v0 - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Showcase-MultiDiscrete-Discrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Showcase-MultiDiscrete-MultiDiscrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Showcase-Tuple-Box-Direct-v0 - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Showcase-Tuple-Discrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-Showcase-Tuple-MultiDiscrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - * - Isaac-Cartpole-v0 - - - - Manager Based - - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO) - * - Isaac-Factory-GearMesh-Direct-v0 - - - - Direct - - **rl_games** (PPO) - * - Isaac-Factory-NutThread-Direct-v0 - - - - Direct - - **rl_games** (PPO) - * - Isaac-Factory-PegInsert-Direct-v0 - - - - Direct - - **rl_games** (PPO) - * - Isaac-AutoMate-Assembly-Direct-v0 - - - - Direct - - **rl_games** (PPO) - * - Isaac-AutoMate-Disassembly-Direct-v0 - - - - Direct - - - * - Isaac-Forge-GearMesh-Direct-v0 - - - - Direct - - **rl_games** (PPO) - * - Isaac-Forge-NutThread-Direct-v0 - - - - Direct - - **rl_games** (PPO) - * - Isaac-Forge-PegInsert-Direct-v0 - - - - Direct - - **rl_games** (PPO) - * - Isaac-Franka-Cabinet-Direct-v0 - - - - Direct - - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Humanoid-AMP-Dance-Direct-v0 - - - - Direct - - **skrl** (AMP) - * - Isaac-Humanoid-AMP-Run-Direct-v0 - - - - Direct - - **skrl** (AMP) - * - Isaac-Humanoid-AMP-Walk-Direct-v0 - - - - Direct - - **skrl** (AMP) - * - Isaac-Humanoid-Direct-v0 - - - - Direct - - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Humanoid-v0 - - - - Manager Based - - **rsl_rl** (PPO), **rl_games** (PPO), **skrl** (PPO), **sb3** (PPO) - * - Isaac-Lift-Cube-Franka-IK-Abs-v0 - - - - Manager Based - - - * - Isaac-Lift-Cube-Franka-IK-Rel-v0 - - - - Manager Based - - - * - Isaac-Lift-Cube-Franka-v0 - - Isaac-Lift-Cube-Franka-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO), **rl_games** (PPO), **sb3** (PPO) - * - Isaac-Lift-Teddy-Bear-Franka-IK-Abs-v0 - - - - Manager Based - - - * - Isaac-Tracking-LocoManip-Digit-v0 - - Isaac-Tracking-LocoManip-Digit-Play-v0 - - Manager Based - - **rsl_rl** (PPO) - * - Isaac-Navigation-Flat-Anymal-C-v0 - - Isaac-Navigation-Flat-Anymal-C-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Open-Drawer-Franka-IK-Abs-v0 - - - - Manager Based - - - * - Isaac-Open-Drawer-Franka-IK-Rel-v0 - - - - Manager Based - - - * - Isaac-Open-Drawer-Franka-v0 - - Isaac-Open-Drawer-Franka-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **rl_games** (PPO), **skrl** (PPO) - * - Isaac-Quadcopter-Direct-v0 - - - - Direct - - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Reach-Franka-IK-Abs-v0 - - - - Manager Based - - - * - Isaac-Reach-Franka-IK-Rel-v0 - - - - Manager Based - - - * - Isaac-Reach-Franka-OSC-v0 - - Isaac-Reach-Franka-OSC-Play-v0 - - Manager Based - - **rsl_rl** (PPO) - * - Isaac-Reach-Franka-v0 - - Isaac-Reach-Franka-Play-v0 - - Manager Based - - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Reach-UR10-v0 - - Isaac-Reach-UR10-Play-v0 - - Manager Based - - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Deploy-Reach-UR10e-v0 - - Isaac-Deploy-Reach-UR10e-Play-v0 - - Manager Based - - **rsl_rl** (PPO) - * - Isaac-Repose-Cube-Allegro-Direct-v0 - - - - Direct - - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Repose-Cube-Allegro-NoVelObs-v0 - - Isaac-Repose-Cube-Allegro-NoVelObs-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **rl_games** (PPO), **skrl** (PPO) - * - Isaac-Repose-Cube-Allegro-v0 - - Isaac-Repose-Cube-Allegro-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **rl_games** (PPO), **skrl** (PPO) - * - Isaac-Repose-Cube-Shadow-Direct-v0 - - - - Direct - - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Repose-Cube-Shadow-OpenAI-FF-Direct-v0 - - - - Direct - - **rl_games** (FF), **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Repose-Cube-Shadow-OpenAI-LSTM-Direct-v0 - - - - Direct - - **rl_games** (LSTM) - * - Isaac-Repose-Cube-Shadow-Vision-Direct-v0 (Requires running with ``--enable_cameras``) - - Isaac-Repose-Cube-Shadow-Vision-Direct-Play-v0 (Requires running with ``--enable_cameras``) - - Direct - - **rsl_rl** (PPO), **rl_games** (VISION) - * - Isaac-Shadow-Hand-Over-Direct-v0 - - - - Direct - - **rl_games** (PPO), **skrl** (IPPO, PPO, MAPPO) - * - Isaac-Stack-Cube-Franka-IK-Rel-v0 - - - - Manager Based - - - * - Isaac-Dexsuite-Kuka-Allegro-Lift-v0 - - Isaac-Dexsuite-Kuka-Allegro-Lift-Play-v0 - - Manager Based - - **rl_games** (PPO), **rsl_rl** (PPO) - * - Isaac-Dexsuite-Kuka-Allegro-Reorient-v0 - - Isaac-Dexsuite-Kuka-Allegro-Reorient-Play-v0 - - Manager Based - - **rl_games** (PPO), **rsl_rl** (PPO) - * - Isaac-Stack-Cube-Franka-v0 - - - - Manager Based - - - * - Isaac-Stack-Cube-Instance-Randomize-Franka-IK-Rel-v0 - - - - Manager Based - - - * - Isaac-Stack-Cube-Instance-Randomize-Franka-v0 - - - - Manager Based - - - * - Isaac-PickPlace-G1-InspireFTP-Abs-v0 - - - - Manager Based - - - * - Isaac-Stack-Cube-UR10-Long-Suction-IK-Rel-v0 - - - - Manager Based - - - * - Isaac-Stack-Cube-UR10-Short-Suction-IK-Rel-v0 - - - - Manager Based - - - * - Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-RmpFlow-v0 - - - - Manager Based - - - * - Isaac-Stack-Cube-Galbot-Right-Arm-Suction-RmpFlow-v0 - - - - Manager Based - - - * - Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor-v0 - - Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor-Play-v0 - - Manager Based - - - * - Isaac-Place-Mug-Agibot-Left-Arm-RmpFlow-v0 - - - - Manager Based - - - * - Isaac-Place-Toy2Box-Agibot-Right-Arm-RmpFlow-v0 - - - - Manager Based - - - * - Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-RmpFlow-v0 - - - - Manager Based - - - * - Isaac-Stack-Cube-Galbot-Right-Arm-Suction-RmpFlow-v0 - - - - Manager Based - - - * - Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor-v0 - - Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor-Play-v0 - - Manager Based - - - * - Isaac-Place-Mug-Agibot-Left-Arm-RmpFlow-v0 - - - - Manager Based - - - * - Isaac-Place-Toy2Box-Agibot-Right-Arm-RmpFlow-v0 - - - - Manager Based - - - - * - Isaac-Velocity-Flat-Anymal-B-v0 - - Isaac-Velocity-Flat-Anymal-B-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Flat-Anymal-C-Direct-v0 - - - - Direct - - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Flat-Anymal-C-v0 - - Isaac-Velocity-Flat-Anymal-C-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **rl_games** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Flat-Anymal-D-v0 - - Isaac-Velocity-Flat-Anymal-D-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Flat-Cassie-v0 - - Isaac-Velocity-Flat-Cassie-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Flat-Digit-v0 - - Isaac-Velocity-Flat-Digit-Play-v0 - - Manager Based - - **rsl_rl** (PPO) - * - Isaac-Velocity-Flat-G1-v0 - - Isaac-Velocity-Flat-G1-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Flat-H1-v0 - - Isaac-Velocity-Flat-H1-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Flat-Spot-v0 - - Isaac-Velocity-Flat-Spot-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Flat-Unitree-A1-v0 - - Isaac-Velocity-Flat-Unitree-A1-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO) - * - Isaac-Velocity-Flat-Unitree-Go1-v0 - - Isaac-Velocity-Flat-Unitree-Go1-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Flat-Unitree-Go2-v0 - - Isaac-Velocity-Flat-Unitree-Go2-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Rough-Anymal-B-v0 - - Isaac-Velocity-Rough-Anymal-B-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Rough-Anymal-C-Direct-v0 - - - - Direct - - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Rough-Anymal-C-v0 - - Isaac-Velocity-Rough-Anymal-C-Play-v0 - - Manager Based - - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Rough-Anymal-D-v0 - - Isaac-Velocity-Rough-Anymal-D-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Rough-Cassie-v0 - - Isaac-Velocity-Rough-Cassie-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Rough-Digit-v0 - - Isaac-Velocity-Rough-Digit-Play-v0 - - Manager Based - - **rsl_rl** (PPO) - * - Isaac-Velocity-Rough-G1-v0 - - Isaac-Velocity-Rough-G1-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Rough-H1-v0 - - Isaac-Velocity-Rough-H1-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Rough-Unitree-A1-v0 - - Isaac-Velocity-Rough-Unitree-A1-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO) - * - Isaac-Velocity-Rough-Unitree-Go1-v0 - - Isaac-Velocity-Rough-Unitree-Go1-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) - * - Isaac-Velocity-Rough-Unitree-Go2-v0 - - Isaac-Velocity-Rough-Unitree-Go2-Play-v0 - - Manager Based - - **rsl_rl** (PPO), **skrl** (PPO) +Use UWLab's ``isaaclab2`` branch or ``v1.3.0`` tag for the Isaac Lab 2.3.2 / +Isaac Sim 5.1 stack. The `Isaac Lab 2.x environment catalogue +`_ +may help identify older task names, but those names and configurations must not +be mixed with the pinned 3.0 stack without migration. diff --git a/docs/source/refs/license.rst b/docs/source/refs/license.rst index bfbba6f8..ef93eb8e 100644 --- a/docs/source/refs/license.rst +++ b/docs/source/refs/license.rst @@ -5,7 +5,7 @@ License NVIDIA Isaac Sim is available freely under `individual license `_. For more information -about its license terms, please check `here `_. +about its license terms, consult the `official licensing information `_. The license files for all its dependencies and included assets are available in its `documentation `_. diff --git a/docs/source/setup/installation/binaries_installation.rst b/docs/source/setup/installation/binaries_installation.rst index 0dc833bf..97863066 100644 --- a/docs/source/setup/installation/binaries_installation.rst +++ b/docs/source/setup/installation/binaries_installation.rst @@ -13,8 +13,8 @@ Downloading pre-built binaries Isaac Sim binaries can be downloaded directly as a zip file from `here `__. -If you wish to use the older Isaac Sim 4.5 release, please check the older download page -`here `__. +Use Isaac Sim 6.1 with this release. For the older Isaac Lab 2.x / Isaac Sim 5.1 +stack, use UWLab's ``isaaclab2`` branch or ``v1.3.0`` tag and its installation instructions. Once the zip file is downloaded, you can unzip it to the desired directory. As an example set of instructions for unzipping the Isaac Sim binaries, diff --git a/docs/source/setup/installation/include/src_clone_uwlab.rst b/docs/source/setup/installation/include/src_clone_uwlab.rst index 3a8b00df..f92af0a8 100644 --- a/docs/source/setup/installation/include/src_clone_uwlab.rst +++ b/docs/source/setup/installation/include/src_clone_uwlab.rst @@ -3,76 +3,36 @@ Cloning UW Lab .. note:: - We recommend making a `fork `_ of the UW Lab repository to contribute - to the project but this is not mandatory to use the framework. If you - make a fork, please replace ``isaac-sim`` with your username - in the following instructions. + We recommend making a `fork `_ to contribute, + but this is not required to use the framework. When using your fork, replace + ``uw-lab`` with your GitHub username in the clone commands. -Clone the UW Lab repository into your project's workspace: +Clone UW Lab into your project's workspace: .. tab-set:: .. tab-item:: SSH - .. code:: bash + .. code-block:: bash git clone git@github.com:uw-lab/UWLab.git .. tab-item:: HTTPS - .. code:: bash + .. code-block:: bash git clone https://github.com/uw-lab/UWLab.git +We provide the Linux helper `uwlab.sh `_ +to manage installation, Python execution, tests, and documentation. From the checkout, +print the supported commands with: -We provide a helper executable `uwlab.sh `_ -and `uwlab.bat `_ for Linux and Windows -respectively that provides utilities to manage extensions. +.. code-block:: bash -.. tab-set:: - :sync-group: os - - .. tab-item:: :icon:`fa-brands fa-linux` Linux - :sync: linux - - .. code:: text - - ./uwlab.sh --help - - usage: uwlab.sh [-h] [-i] [-f] [-p] [-s] [-t] [-o] [-v] [-d] [-n] [-c] -- Utility to manage UW Lab. - - optional arguments: - -h, --help Display the help content. - -i, --install [LIB] Install the extensions inside UW Lab and learning frameworks (rl_games, rsl_rl, sb3, skrl) as extra dependencies. Default is 'all'. - -f, --format Run pre-commit to format the code and check lints. - -p, --python Run the python executable provided by Isaac Sim or virtual environment (if active). - -s, --sim Run the simulator executable (isaac-sim.sh) provided by Isaac Sim. - -t, --test Run all python pytest tests. - -o, --docker Run the docker container helper script (docker/container.sh). - -v, --vscode Generate the VSCode settings file from template. - -d, --docs Build the documentation from source using sphinx. - -n, --new Create a new external project or internal task from template. - -c, --conda [NAME] Create the conda environment for UW Lab. Default name is 'env_uwlab'. - -u, --uv [NAME] Create the uv environment for UW Lab. Default name is 'env_uwlab'. - - .. tab-item:: :icon:`fa-brands fa-windows` Windows - :sync: windows - - .. code:: text - - uwlab.bat --help + ./uwlab.sh --help - usage: uwlab.bat [-h] [-i] [-f] [-p] [-s] [-v] [-d] [-n] [-c] -- Utility to manage UW Lab. +.. warning:: - optional arguments: - -h, --help Display the help content. - -i, --install [LIB] Install the extensions inside UW Lab and learning frameworks (rl_games, rsl_rl, sb3, skrl) as extra dependencies. Default is 'all'. - -f, --format Run pre-commit to format the code and check lints. - -p, --python Run the python executable provided by Isaac Sim or virtual environment (if active). - -s, --sim Run the simulator executable (isaac-sim.bat) provided by Isaac Sim. - -t, --test Run all python pytest tests. - -v, --vscode Generate the VSCode settings file from template. - -d, --docs Build the documentation from source using sphinx. - -n, --new Create a new external project or internal task from template. - -c, --conda [NAME] Create the conda environment for UW Lab. Default name is 'env_uwlab'. - -u, --uv [NAME] Create the uv environment for UW Lab. Default name is 'env_uwlab'. + This repository does not ship ``uwlab.bat``. Do not assume that Isaac Lab's + Windows batch commands have UWLab equivalents; the helper instructions here + use the Linux shell entry point. diff --git a/docs/source/setup/installation/include/src_python_virtual_env.rst b/docs/source/setup/installation/include/src_python_virtual_env.rst index f8f71d78..5bf41c52 100644 --- a/docs/source/setup/installation/include/src_python_virtual_env.rst +++ b/docs/source/setup/installation/include/src_python_virtual_env.rst @@ -61,8 +61,8 @@ instead of *./uwlab.sh -p* or *uwlab.bat -p*. :sync: windows .. warning:: - Windows support for UV is currently unavailable. Please check - `issue #3483 `_ to track progress. + UWLab does not ship a Windows batch helper. Upstream Isaac Lab's Windows + UV support is discussed in `issue #3438 `_. .. tab-item:: Conda Environment diff --git a/docs/source/setup/installation/index.rst b/docs/source/setup/installation/index.rst index d7ff8db7..008d61e3 100644 --- a/docs/source/setup/installation/index.rst +++ b/docs/source/setup/installation/index.rst @@ -76,11 +76,12 @@ The DGX spark is a standalone machine learning device with aarch64 architecture. features of UW Lab are not currently supported on the DGX spark. The most noteworthy is that the architecture *requires* CUDA ≥ 13, and thus the cu13 build of PyTorch or newer. Other notable limitations with respect to UW Lab include... -#. `SkillGen `_ is not supported out of the box. This +#. `SkillGen `_ is not supported out of the box. This is because cuRobo builds native CUDA/C++ extensions that requires specific tooling and library versions which are not validated for use with DGX spark. -#. Extended reality teleoperation tools such as `OpenXR `_ is not supported. This is due - to encoding performance limitations that have not yet been fully investigated. +#. Extended reality teleoperation tools such as OpenXR are not supported. See the + `upstream platform limitations `_ + for the currently documented restrictions. #. SKRL training with `JAX `_ has not been explicitly validated or tested in UW Lab on the DGX Spark. JAX provides pre-built CUDA wheels only for Linux on x86_64, so on aarch64 systems (e.g., DGX Spark) it runs on CPU only by default. From e933b66415f328219e47bd25a71e06241af56410 Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sun, 27 Sep 2026 18:29:20 -0700 Subject: [PATCH 19/27] Move required OmniReset imports to module scope 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. --- source/uwlab_tasks/config/extension.toml | 2 +- source/uwlab_tasks/docs/CHANGELOG.rst | 11 +++++++++++ source/uwlab_tasks/test/test_environments.py | 13 ++++--------- .../manipulation/omnireset/mdp/events.py | 14 +++----------- .../manipulation/omnireset/mdp/utils.py | 13 +++---------- 5 files changed, 22 insertions(+), 31 deletions(-) diff --git a/source/uwlab_tasks/config/extension.toml b/source/uwlab_tasks/config/extension.toml index fe5f62b7..a0539835 100644 --- a/source/uwlab_tasks/config/extension.toml +++ b/source/uwlab_tasks/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.14.8" +version = "0.14.9" # Description title = "UW Lab Tasks" diff --git a/source/uwlab_tasks/docs/CHANGELOG.rst b/source/uwlab_tasks/docs/CHANGELOG.rst index 7e0f6b58..b35875b0 100644 --- a/source/uwlab_tasks/docs/CHANGELOG.rst +++ b/source/uwlab_tasks/docs/CHANGELOG.rst @@ -1,6 +1,17 @@ Changelog --------- +0.14.9 (2026-09-28) +~~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Moved required OmniReset helper imports to module scope while retaining deferred + imports for optional collision dependencies and extension-dependent features. + No task configuration or caller changes are required. + + 0.14.8 (2026-09-27) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_tasks/test/test_environments.py b/source/uwlab_tasks/test/test_environments.py index 2ef4ffb7..8d81a863 100644 --- a/source/uwlab_tasks/test/test_environments.py +++ b/source/uwlab_tasks/test/test_environments.py @@ -19,11 +19,15 @@ import math import torch from types import SimpleNamespace +from unittest.mock import Mock import pytest from env_test_utils import _run_environments, setup_environment +from isaaclab.assets import BaseArticulation, BaseRigidObject, BaseRigidObjectCollection from isaaclab.managers import EventManager, ObservationManager, ObservationTermCfg, SceneEntityCfg from isaaclab.sensors import CameraCfg +from isaaclab.sim.utils import find_matching_prim_paths, get_all_matching_child_prims +from pxr import Usd, UsdGeom, UsdPhysics import uwlab_tasks # noqa: F401 @@ -180,9 +184,6 @@ def test_progress_context_reset_is_per_environment(env_ids, expected): @pytest.mark.parametrize("pattern", ["/World/envs/env_.*/Object", "/World/envs/env_[^/]+/Object"]) @pytest.mark.isaacsim_ci def test_collision_asset_paths_and_frames(monkeypatch, pattern): - from isaaclab.sim.utils import find_matching_prim_paths, get_all_matching_child_prims - from pxr import Usd, UsdGeom, UsdPhysics - module = importlib.import_module("uwlab_tasks.manager_based.manipulation.omnireset.mdp.rigid_object_hasher") stage = Usd.Stage.CreateInMemory() for index in (10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11): @@ -218,10 +219,6 @@ def test_collision_asset_paths_and_frames(monkeypatch, pattern): @pytest.mark.parametrize("object_kind", ["rigid", "collection"]) @pytest.mark.isaacsim_ci def test_dataset_success_requires_backend_asset_stability(term_name, object_kind): - from unittest.mock import Mock - - from isaaclab.assets import BaseArticulation, BaseRigidObject, BaseRigidObjectCollection - module = importlib.import_module("uwlab_tasks.manager_based.manipulation.omnireset.mdp.terminations") positions = torch.tensor([[0.0, 0.0, 0.1]]).repeat(4, 1) quaternions = torch.tensor([[0.0, 0.0, 0.0, 1.0]]).repeat(4, 1) @@ -331,8 +328,6 @@ def test_omnireset_published_expert_robot_defaults(contract): @pytest.mark.isaacsim_ci def test_sysid_armature_startup_selects_wrist_joints(monkeypatch): - from isaaclab.managers import SceneEntityCfg - module = importlib.import_module("uwlab_tasks.manager_based.manipulation.omnireset.mdp.events") names = [ "shoulder_pan_joint", diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py index 6cda6dcf..fd6581d1 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/events.py @@ -14,6 +14,7 @@ import trimesh import trimesh.transformations as tra from collections.abc import Sequence +from scipy.spatial.transform import Rotation as R import carb import isaaclab.sim as sim_utils @@ -28,7 +29,8 @@ from isaaclab.markers.config import FRAME_MARKER_CFG from isaaclab.sensors import CameraCfg from isaaclab_physx.renderers import IsaacRtxRendererCfg, IsaacRtxRendererGlobalSettingsCfg -from pxr import Gf, UsdGeom, UsdLux +from isaaclab_physx.renderers.isaac_rtx_renderer_utils import apply_isaac_rtx_global_settings +from pxr import Gf, Sdf, Usd, UsdGeom, UsdLux, UsdShade from uwlab_assets.robots.ur5e_robotiq_gripper.kinematics import ARM_JOINT_NAMES @@ -46,8 +48,6 @@ def apply_isaac_rtx_settings( settings: IsaacRtxRendererGlobalSettingsCfg, ): """Apply process-global RTX settings during environment startup.""" - from isaaclab_physx.renderers.isaac_rtx_renderer_utils import apply_isaac_rtx_global_settings - if settings.antialiasing_mode is not None: sim_utils.enable_extension("omni.replicator.core") apply_isaac_rtx_global_settings(settings) @@ -187,8 +187,6 @@ def _find_mesh_in_prim(self, prim): if prim.IsA(UsdGeom.Mesh): return UsdGeom.Mesh(prim) - from pxr import Usd - for child in Usd.PrimRange(prim): if child.IsA(UsdGeom.Mesh): return UsdGeom.Mesh(child) @@ -1431,8 +1429,6 @@ def __call__( light_prim.GetAttribute("inputs:texture:file").Set(random_hdri) light_prim.GetAttribute("inputs:intensity").Set(float(intensity)) - from scipy.spatial.transform import Rotation as R - quat = R.random().as_quat() # [x, y, z, w] scipy convention xformable = UsdGeom.Xformable(light_prim) xformable.ClearXformOpOrder() @@ -2239,8 +2235,6 @@ def __init__(self, cfg: EventTermCfg, env: ManagerBasedEnv): self._texture_verified = False # Cache shader prims for direct USD access (avoids Replicator pipeline race conditions) - from pxr import Sdf, UsdShade - self._shader_prims = [] for i, mat_prim in enumerate(self.material_prims): mat_path = str(mat_prim.GetPath()) if hasattr(mat_prim, "GetPath") else str(mat_prim) @@ -2306,8 +2300,6 @@ def __call__( if not self._shader_prims: return - from pxr import Sdf - rng = self.texture_rng.generator num_prims = len(self._shader_prims) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/utils.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/utils.py index 939821c9..811570b9 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/utils.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/utils.py @@ -12,9 +12,11 @@ import random import shutil import tempfile +import time import torch import trimesh import yaml +from concurrent.futures import ThreadPoolExecutor, as_completed from contextlib import contextmanager, redirect_stderr, redirect_stdout from functools import lru_cache from pathlib import PurePosixPath @@ -28,7 +30,7 @@ from isaaclab.utils.warp import convert_to_warp_mesh from pxr import UsdGeom -from uwlab_assets import UWLAB_CLOUD_ASSETS_DIR +from uwlab_assets import UWLAB_CLOUD_ASSETS_DIR, _extract_relative_path, resolve_cloud_path from .rigid_object_hasher import RigidObjectHasher @@ -354,8 +356,6 @@ def safe_retrieve_file_path(url: str, download_dir: str | None = None) -> str: handles download + persistent caching. Nucleus (``omniverse://``) paths still fall back to Isaac Lab's :func:`retrieve_file_path`. """ - from uwlab_assets import resolve_cloud_path - if url.startswith(("http://", "https://")) or os.path.isfile(url): return resolve_cloud_path(url) @@ -535,11 +535,6 @@ def _download_cloud_assets(cloud_urls: list[str], cache_subdir: str = "", num_wo Downloads are parallelized with *num_workers* threads and a live progress line with elapsed time is printed. """ - import time - from concurrent.futures import ThreadPoolExecutor, as_completed - - from uwlab_assets import resolve_cloud_path - n = len(cloud_urls) to_download = [u for u in cloud_urls if not os.path.isfile(_cached_local_path(u))] needs_download = len(to_download) @@ -576,8 +571,6 @@ def _download_cloud_assets(cloud_urls: list[str], cache_subdir: str = "", num_wo def _cached_local_path(url: str) -> str: """Return the expected local cache path for a cloud URL without downloading.""" - from uwlab_assets import _extract_relative_path - rel = _extract_relative_path(url) return os.path.join(os.path.expanduser("~"), ".cache", "uwlab", "assets", rel) From 6b9aa140d12be04203fd01b1f18dca978d90d382 Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sun, 27 Sep 2026 23:07:10 -0700 Subject: [PATCH 20/27] Remove migration-only checkpoint conversion tooling 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. --- README.md | 2 +- .../publications/omnireset/distillation.rst | 5 + docs/source/publications/omnireset/index.rst | 15 --- .../publications/omnireset/sim2real.rst | 5 + .../rsl_rl/convert_checkpoint_layout.py | 51 -------- source/uwlab_rl/config/extension.toml | 2 +- source/uwlab_rl/docs/CHANGELOG.rst | 11 ++ .../uwlab_rl/test/test_checkpoint_layout.py | 70 ----------- .../uwlab_rl/rsl_rl/checkpoint_layout.py | 110 ------------------ 9 files changed, 23 insertions(+), 248 deletions(-) delete mode 100644 scripts/reinforcement_learning/rsl_rl/convert_checkpoint_layout.py delete mode 100644 source/uwlab_rl/test/test_checkpoint_layout.py delete mode 100644 source/uwlab_rl/uwlab_rl/rsl_rl/checkpoint_layout.py diff --git a/README.md b/README.md index 9bda997f..8bb11e7a 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ In addition to what IsaacLab provides, UW Lab brings: UWLab 2.0 targets Isaac Lab **3.0 Early Access**, Isaac Sim **6.1**, Python **3.12**, and the released UW-Lab RSL-RL **5.4.1** integration. The installer pins Isaac Lab to `ae37b028ea415c91ea2bc32609efcd759ed2b974` and RSL-RL to `2c3bf18001a5e2a78527e9ea368b7ea31700a2c5` (`uw-v5.4.1`). -Use `isaaclab2` for the legacy Isaac Lab 2.x / Isaac Sim 5.1 stack. Do not mix its environments, datasets, or checkpoint layouts with this release; follow the OmniReset migration and checkpoint-conversion instructions. +Use `isaaclab2` for the legacy Isaac Lab 2.x / Isaac Sim 5.1 stack. Do not mix its environments, datasets, or checkpoint layouts with this release. Use the already-compatible pretrained checkpoints linked in the OmniReset quick start. The installer refuses to replace an Isaac Lab checkout with local changes. ## Installation diff --git a/docs/source/publications/omnireset/distillation.rst b/docs/source/publications/omnireset/distillation.rst index 178b5711..34d3e575 100644 --- a/docs/source/publications/omnireset/distillation.rst +++ b/docs/source/publications/omnireset/distillation.rst @@ -1,6 +1,11 @@ Distillation & Deployment ========================= +.. note:: + + This workflow is expected to work with Isaac Lab 3.0 but has not yet been tested. + Validation is planned; use UWLab ``v1.3.0`` as the legacy reference. + This guide covers distilling a state-based RL expert into a vision-based policy, evaluating it in simulation, and deploying on a real robot. .. _distillation-install: diff --git a/docs/source/publications/omnireset/index.rst b/docs/source/publications/omnireset/index.rst index 0ed3d5ed..40314739 100644 --- a/docs/source/publications/omnireset/index.rst +++ b/docs/source/publications/omnireset/index.rst @@ -17,21 +17,6 @@ Quick Start (Try in 2 Minutes) Download our pretrained checkpoint and run evaluation. -.. important:: - - These checkpoints use the Isaac Lab 3.0 EA observation order. Earlier beta checkpoints - have the same input size but a different feature order. Do not use them unchanged. - To convert a beta state expert without retraining: - - .. code:: bash - - python scripts/reinforcement_learning/rsl_rl/convert_checkpoint_layout.py \ - --checkpoint --output - - The converter preserves the original file and updates actor/critic inputs, normalization - statistics and Adam state. It supports the published 43-input OmniReset state-policy architecture. - The old checkpoints remain on the ``isaaclab3`` HF branch; EA copies are on ``isaaclab3-ea``. - .. tab-set:: .. tab-item:: Leg Twisting diff --git a/docs/source/publications/omnireset/sim2real.rst b/docs/source/publications/omnireset/sim2real.rst index 73abcb46..dccf2c03 100644 --- a/docs/source/publications/omnireset/sim2real.rst +++ b/docs/source/publications/omnireset/sim2real.rst @@ -1,6 +1,11 @@ Sim2Real: SysID & RL Finetuning ================================ +.. note:: + + This workflow is expected to work with Isaac Lab 3.0 but has not yet been tested. + Validation is planned; use UWLab ``v1.3.0`` as the legacy reference. + This guide bridges sim-to-real via system identification and policy finetuning. Finetuning uses a curriculum: sim dynamics shift toward your sys-id'd parameters (with higher OSC gains to compensate for friction, since policies do not train well under high friction from scratch), and action scale is reduced so the policy runs slower and transfers better to the real robot. Our system identification follows the `PACE `_ framework by Bjelonic et al. diff --git a/scripts/reinforcement_learning/rsl_rl/convert_checkpoint_layout.py b/scripts/reinforcement_learning/rsl_rl/convert_checkpoint_layout.py deleted file mode 100644 index 8e4372b6..00000000 --- a/scripts/reinforcement_learning/rsl_rl/convert_checkpoint_layout.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""Convert a published OmniReset state expert from beta to EA observation order on CPU.""" - -from __future__ import annotations - -import argparse -import hashlib -import torch -from itertools import chain -from pathlib import Path -from tensordict import TensorDict - -from rsl_rl.models import MLPModel - -from uwlab_rl.rsl_rl.checkpoint_layout import convert_omnireset_checkpoint - - -def main() -> None: - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--checkpoint", type=Path, required=True) - parser.add_argument("--output", type=Path, required=True) - args = parser.parse_args() - if args.output.exists(): - raise FileExistsError(f"Refusing to overwrite {args.output}") - raw = args.checkpoint.read_bytes() - saved = torch.load(args.checkpoint, map_location="cpu", weights_only=True) - obs = TensorDict({"policy": torch.zeros(1, 43)}, batch_size=[1]) - groups = {"actor": ["policy"], "critic": ["policy"]} - actor = MLPModel( - obs, groups, "actor", 7, hidden_dims=[512, 256, 128, 64], activation="elu", obs_normalization=True, - distribution_cfg={"class_name": "HeteroscedasticGaussianDistribution", "init_std": 1.0, - "std_type": "log", "std_range": [0.001, 2.0]}, - ) - critic = MLPModel(obs, groups, "critic", 1, hidden_dims=[512, 256, 128, 64], activation="elu", obs_normalization=True) - actor.load_state_dict(saved["actor_state_dict"], strict=True) - critic.load_state_dict(saved["critic_state_dict"], strict=True) - optimizer = torch.optim.Adam(chain(actor.parameters(), critic.parameters())) - optimizer.load_state_dict(saved["optimizer_state_dict"]) - converted = convert_omnireset_checkpoint(saved, actor, critic, optimizer, hashlib.sha256(raw).hexdigest()) - args.output.parent.mkdir(parents=True, exist_ok=True) - with args.output.open("xb") as stream: - torch.save(converted, stream) - print(f"Saved EA-layout checkpoint to {args.output}; original unchanged: {args.checkpoint}") - - -if __name__ == "__main__": - main() diff --git a/source/uwlab_rl/config/extension.toml b/source/uwlab_rl/config/extension.toml index a92d390e..daf77289 100644 --- a/source/uwlab_rl/config/extension.toml +++ b/source/uwlab_rl/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.2.5" +version = "0.2.6" # Description title = "UW Lab RL" diff --git a/source/uwlab_rl/docs/CHANGELOG.rst b/source/uwlab_rl/docs/CHANGELOG.rst index 0cf304a3..4eb27025 100644 --- a/source/uwlab_rl/docs/CHANGELOG.rst +++ b/source/uwlab_rl/docs/CHANGELOG.rst @@ -1,6 +1,17 @@ Changelog --------- +0.2.6 (2026-09-28) +~~~~~~~~~~~~~~~~~~ + +Removed +^^^^^^^ + +* Removed the beta-to-EA checkpoint conversion utility and its migration-only tests + from the upcoming release. Use the already-compatible EA checkpoints linked in + the OmniReset quick start; beta checkpoint migration is no longer provided. + + 0.2.5 (2026-09-27) ~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_rl/test/test_checkpoint_layout.py b/source/uwlab_rl/test/test_checkpoint_layout.py deleted file mode 100644 index 44ccf3de..00000000 --- a/source/uwlab_rl/test/test_checkpoint_layout.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -import copy -import torch -from itertools import chain - -import pytest -from rsl_rl.modules.normalization import EmpiricalNormalization - -from uwlab_rl.rsl_rl.checkpoint_layout import LAYOUT_KEY, PERMUTATION, convert_omnireset_checkpoint - - -class Model(torch.nn.Module): - def __init__(self, output_dim): - super().__init__() - self.obs_normalizer = EmpiricalNormalization(43) - self.mlp = torch.nn.Sequential(torch.nn.Linear(43, 8), torch.nn.ELU(), torch.nn.Linear(8, output_dim)) - - def forward(self, obs): - return self.mlp(self.obs_normalizer(obs)) - - -@pytest.mark.parametrize("amsgrad", [False, True]) -def test_checkpoint_layout_preserves_outputs_and_optimizer(amsgrad): - torch.manual_seed(42) - actor, critic = Model(14), Model(1) - optimizer = torch.optim.Adam(chain(actor.parameters(), critic.parameters()), amsgrad=amsgrad) - observations = torch.randn(16, 43) - actor.obs_normalizer.update(observations) - critic.obs_normalizer.update(observations) - loss = actor(observations).square().mean() + critic(observations).square().mean() - loss.backward() - optimizer.step() - checkpoint = copy.deepcopy({ - "actor_state_dict": actor.state_dict(), - "critic_state_dict": critic.state_dict(), - "optimizer_state_dict": optimizer.state_dict(), - "iter": 19, - "learning_rate": 0.001, - "infos": {"source": "fixture"}, - "logger_state": {"tot_timesteps": 128}, - }) - converted = convert_omnireset_checkpoint(checkpoint, actor, critic, optimizer, "0" * 64) - p = torch.tensor(PERMUTATION) - inverse = torch.argsort(p) - for model, key in ((actor, "actor_state_dict"), (critic, "critic_state_dict")): - restored = copy.deepcopy(model) - restored.load_state_dict(converted[key], strict=True) - torch.testing.assert_close(restored(observations[:, p]), model(observations), rtol=1e-5, atol=1e-6) - for name, original in checkpoint[key].items(): - actual = converted[key][name] - if name in ("mlp.0.weight", "obs_normalizer._mean", "obs_normalizer._var", "obs_normalizer._std"): - actual = actual[:, inverse] - assert torch.equal(actual, original) - assert torch.equal(checkpoint[key]["mlp.0.weight"], model.state_dict()["mlp.0.weight"]) - input_ids = set(converted[LAYOUT_KEY]["optimizer_input_weight_parameter_ids"].values()) - for identifier, slots in checkpoint["optimizer_state_dict"]["state"].items(): - for name, original in slots.items(): - actual = converted["optimizer_state_dict"]["state"][identifier][name] - if identifier in input_ids and name != "step": - actual = actual[:, inverse] - assert torch.equal(actual, original) - assert converted["optimizer_state_dict"]["param_groups"] == checkpoint["optimizer_state_dict"]["param_groups"] - for name in ("iter", "learning_rate", "infos", "logger_state"): - assert converted[name] == checkpoint[name] - with pytest.raises(ValueError, match="double conversion"): - convert_omnireset_checkpoint(converted, actor, critic, optimizer, "0" * 64) diff --git a/source/uwlab_rl/uwlab_rl/rsl_rl/checkpoint_layout.py b/source/uwlab_rl/uwlab_rl/rsl_rl/checkpoint_layout.py deleted file mode 100644 index b615bd71..00000000 --- a/source/uwlab_rl/uwlab_rl/rsl_rl/checkpoint_layout.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright (c) 2024-2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""Observation-layout migration for OmniReset state-policy checkpoints.""" - -from __future__ import annotations - -import copy -import torch -from typing import Any - -LEGACY_LAYOUT = ( - ("insertive_asset_in_receptive_asset_frame", 6), - ("prev_actions", 7), - ("joint_pos", 12), - ("end_effector_pose", 6), - ("insertive_asset_pose", 6), - ("receptive_asset_pose", 6), -) -EA_LAYOUT = LEGACY_LAYOUT[1:] + LEGACY_LAYOUT[:1] -PERMUTATION = tuple(range(6, 43)) + tuple(range(6)) -LAYOUT_KEY = "uwlab_observation_layout" - - -def convert_omnireset_checkpoint( - checkpoint: dict[str, Any], - actor: torch.nn.Module, - critic: torch.nn.Module, - optimizer: torch.optim.Optimizer, - source_sha256: str, -) -> dict[str, Any]: - """Convert a legacy 43-feature checkpoint to EA declaration order without retraining. - - Args: - checkpoint: Loaded actor, critic, normalizer and Adam checkpoint state. - actor: Actor constructed with the checkpoint's original model configuration. - critic: Critic constructed with the checkpoint's original model configuration. - optimizer: Actor-then-critic Adam optimizer with checkpoint state already loaded. - source_sha256: SHA-256 of the original checkpoint file. - - Returns: - A separate checkpoint with reordered input weights, statistics, optimizer moments and layout metadata. - """ - if LAYOUT_KEY in checkpoint: - raise ValueError("Checkpoint already has observation-layout metadata; refusing double conversion.") - if len(source_sha256) != 64: - raise ValueError("Expected the original checkpoint's SHA-256.") - bytes.fromhex(source_sha256) - names = { - id(parameter): (role, name) - for role, model in (("actor", actor), ("critic", critic)) - for name, parameter in model.named_parameters() - } - saved_groups = checkpoint["optimizer_state_dict"]["param_groups"] - if len(optimizer.param_groups) != len(saved_groups): - raise ValueError("Optimizer parameter groups do not match the checkpoint.") - input_ids = {} - for group, saved_group in zip(optimizer.param_groups, saved_groups): - if len(group["params"]) != len(saved_group["params"]): - raise ValueError("Optimizer parameter counts do not match the checkpoint.") - for parameter, parameter_id in zip(group["params"], saved_group["params"]): - role, name = names[id(parameter)] - slot = checkpoint["optimizer_state_dict"]["state"][parameter_id] - if slot["exp_avg"].shape != parameter.shape or slot["exp_avg_sq"].shape != parameter.shape: - raise ValueError(f"Optimizer state shape mismatch for {role}.{name}.") - if name == "mlp.0.weight": - input_ids[f"{role}_state_dict"] = parameter_id - if len(input_ids) != 2 or len(set(input_ids.values())) != 2: - raise ValueError("Expected separate actor and critic input weights.") - output = copy.deepcopy(checkpoint) - for key, parameter_id in input_ids.items(): - state = output[key] - weight = state["mlp.0.weight"] - if weight.ndim != 2 or weight.shape[1] != 43: - raise ValueError(f"Expected 43 input features for {key}.") - p = torch.tensor(PERMUTATION, device=weight.device) - state["mlp.0.weight"] = weight.index_select(1, p).clone() - for name in ("obs_normalizer._mean", "obs_normalizer._var", "obs_normalizer._std"): - value = state[name] - if value.shape != (1, 43): - raise ValueError(f"Unexpected normalizer shape for {key}/{name}.") - state[name] = value.index_select(1, p.to(value.device)).clone() - slot = output["optimizer_state_dict"]["state"][parameter_id] - if not {"step", "exp_avg", "exp_avg_sq"} <= slot.keys() or not set(slot) <= { - "step", - "exp_avg", - "exp_avg_sq", - "max_exp_avg_sq", - }: - raise ValueError("Only Adam/AMSGrad optimizer state is supported.") - for name in ("exp_avg", "exp_avg_sq", "max_exp_avg_sq"): - if name in slot: - value = slot[name] - if value.shape != weight.shape: - raise ValueError(f"Unexpected optimizer shape for {key}/{name}.") - slot[name] = value.index_select(1, p.to(value.device)).clone() - output[LAYOUT_KEY] = { - "schema_version": 1, - "source_layout": "omnireset43_beta_annotated_first", - "target_layout": "omnireset43_ea_declaration_order", - "source_terms": list(LEGACY_LAYOUT), - "target_terms": list(EA_LAYOUT), - "new_index_to_old_index": list(PERMUTATION), - "source_checkpoint_sha256": source_sha256, - "optimizer_input_weight_parameter_ids": input_ids, - "optimizer_state_migrated": True, - } - return output From f4d864ac2d32c1c3c8362e7a26f17dd95cd71176 Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sun, 27 Sep 2026 23:39:12 -0700 Subject: [PATCH 21/27] Consolidate modern asset publication on isaaclab3 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. --- docs/source/publications/omnireset/new_task.rst | 5 +++-- source/uwlab_assets/config/extension.toml | 2 +- source/uwlab_assets/docs/CHANGELOG.rst | 12 ++++++++++++ source/uwlab_assets/uwlab_assets/__init__.py | 7 +++---- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/docs/source/publications/omnireset/new_task.rst b/docs/source/publications/omnireset/new_task.rst index ee350357..a64033a9 100644 --- a/docs/source/publications/omnireset/new_task.rst +++ b/docs/source/publications/omnireset/new_task.rst @@ -171,8 +171,9 @@ Add to ``variants["scene.receptive_object"]``: .. tip:: Use local absolute paths during development. Switch to ``UWLAB_CLOUD_ASSETS_DIR`` when sharing. - Published EA assets go on the ``isaaclab3-ea`` branch of the asset repository (``main`` holds the Isaac Lab 2.x - files), and ``uwlab_assets.UWLAB_CLOUD_ASSETS_REVISION`` has to be bumped to a commit that contains them. + Publish Isaac Lab 3.0 / Isaac Sim 6.1 assets on the ``isaaclab3`` branch of the asset repository + (``main`` holds the Isaac Lab 2.x files), then pin ``uwlab_assets.UWLAB_CLOUD_ASSETS_REVISION`` + to a commit that contains them. ---- diff --git a/source/uwlab_assets/config/extension.toml b/source/uwlab_assets/config/extension.toml index 17264a9f..e3a3a9e6 100644 --- a/source/uwlab_assets/config/extension.toml +++ b/source/uwlab_assets/config/extension.toml @@ -1,6 +1,6 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.6.3" +version = "0.6.4" # Description title = "UW Lab Assets" diff --git a/source/uwlab_assets/docs/CHANGELOG.rst b/source/uwlab_assets/docs/CHANGELOG.rst index 0667a62b..50bf104e 100644 --- a/source/uwlab_assets/docs/CHANGELOG.rst +++ b/source/uwlab_assets/docs/CHANGELOG.rst @@ -1,6 +1,18 @@ Changelog --------- +0.6.4 (2026-09-28) +~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Consolidated Isaac Lab 3.0 / Isaac Sim 6.1 asset publication on the ``isaaclab3`` + Hugging Face branch. The existing pinned commit and asset contents were unchanged. + Publish new assets on ``isaaclab3`` and update the commit pin deliberately; + ``main`` remains the legacy Isaac Lab 2.x asset line. + + 0.6.3 (2026-09-26) ~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_assets/uwlab_assets/__init__.py b/source/uwlab_assets/uwlab_assets/__init__.py index 45b69503..8e946ace 100644 --- a/source/uwlab_assets/uwlab_assets/__init__.py +++ b/source/uwlab_assets/uwlab_assets/__init__.py @@ -24,13 +24,12 @@ UWLAB_CLOUD_ASSETS_REPO = "https://huggingface.co/datasets/UW-Lab/uwlab-assets" """HuggingFace dataset repository holding the cloud assets.""" -UWLAB_CLOUD_ASSETS_REVISION = "83860532010b2737aa80d6e8621235ee554186f0" # branch isaaclab3-ea +UWLAB_CLOUD_ASSETS_REVISION = "83860532010b2737aa80d6e8621235ee554186f0" # branch isaaclab3 """Pinned commit of :data:`UWLAB_CLOUD_ASSETS_REPO`. Pinned rather than a branch name so that asset changes on HuggingFace are opt-in: bump this -constant deliberately when new assets or datasets are published. Isaac Lab 3.0 EA assets and -converted state checkpoints live on ``isaaclab3-ea``. The ``isaaclab3`` branch retains beta -checkpoints with the legacy observation order; ``main`` keeps the Isaac Lab 2.x files. +constant deliberately when new assets or datasets are published. Isaac Lab 3.0 EA / Isaac Sim 6.1 +assets and compatible state checkpoints live on ``isaaclab3``; ``main`` keeps the Isaac Lab 2.x files. """ UWLAB_CLOUD_ASSETS_DIR = f"{UWLAB_CLOUD_ASSETS_REPO}/resolve/{UWLAB_CLOUD_ASSETS_REVISION}" From 0ca176c5dc0a7c74caed69e6394d77e2b398bc7d Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Mon, 28 Sep 2026 00:25:31 -0700 Subject: [PATCH 22/27] Sync tutorials with the pinned Isaac Lab revision 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. --- scripts/tutorials/00_sim/create_empty.py | 6 +- scripts/tutorials/00_sim/launch_app.py | 8 +- scripts/tutorials/00_sim/log_time.py | 8 +- .../tutorials/00_sim/set_rendering_mode.py | 83 ------ scripts/tutorials/00_sim/spawn_prims.py | 12 +- scripts/tutorials/01_assets/add_new_robot.py | 24 +- .../tutorials/01_assets/run_articulation.py | 8 +- .../01_assets/run_deformable_object.py | 107 ++++---- .../tutorials/01_assets/run_rigid_object.py | 6 +- .../01_assets/run_surface_gripper.py | 6 +- scripts/tutorials/02_scene/create_scene.py | 8 +- .../03_envs/create_cartpole_base_env.py | 13 +- .../tutorials/03_envs/create_cube_base_env.py | 23 +- .../03_envs/create_quadruped_base_env.py | 8 +- .../03_envs/policy_inference_in_usd.py | 28 +- .../tutorials/03_envs/run_cartpole_rl_env.py | 23 +- .../04_sensors/add_sensors_on_robot.py | 10 +- .../04_sensors/run_frame_transformer.py | 8 +- .../tutorials/04_sensors/run_ray_caster.py | 6 +- .../04_sensors/run_ray_caster_camera.py | 23 +- .../tutorials/04_sensors/run_usd_camera.py | 20 +- .../tutorials/05_controllers/run_diff_ik.py | 8 +- scripts/tutorials/05_controllers/run_osc.py | 10 +- scripts/tutorials/06_deploy/anymal_c_env.py | 215 +++++++++++++++ .../run_tiled_camera_visualizer.py | 180 ++++++++++++ .../07_visualizers/run_video_recording.py | 256 ++++++++++++++++++ 26 files changed, 846 insertions(+), 261 deletions(-) delete mode 100644 scripts/tutorials/00_sim/set_rendering_mode.py create mode 100644 scripts/tutorials/06_deploy/anymal_c_env.py create mode 100644 scripts/tutorials/07_visualizers/run_tiled_camera_visualizer.py create mode 100644 scripts/tutorials/07_visualizers/run_video_recording.py diff --git a/scripts/tutorials/00_sim/create_empty.py b/scripts/tutorials/00_sim/create_empty.py index e922acc1..9729145b 100644 --- a/scripts/tutorials/00_sim/create_empty.py +++ b/scripts/tutorials/00_sim/create_empty.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -8,7 +8,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/00_sim/create_empty.py + uv run python scripts/tutorials/00_sim/create_empty.py """ diff --git a/scripts/tutorials/00_sim/launch_app.py b/scripts/tutorials/00_sim/launch_app.py index ddea3c7c..fb4c203d 100644 --- a/scripts/tutorials/00_sim/launch_app.py +++ b/scripts/tutorials/00_sim/launch_app.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -9,7 +9,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/00_sim/launch_app.py + uv run python scripts/tutorials/00_sim/launch_app.py """ @@ -70,7 +70,7 @@ def main(): """Main function.""" # Initialize the simulation context - sim_cfg = sim_utils.SimulationCfg(dt=0.01, device=args_cli.device) + sim_cfg = sim_utils.SimulationCfg(device=args_cli.device, dt=0.01) sim = sim_utils.SimulationContext(sim_cfg) # Set main camera sim.set_camera_view([2.0, 0.0, 2.5], [-0.5, 0.0, 0.5]) diff --git a/scripts/tutorials/00_sim/log_time.py b/scripts/tutorials/00_sim/log_time.py index 4169c9fe..b8d2e480 100644 --- a/scripts/tutorials/00_sim/log_time.py +++ b/scripts/tutorials/00_sim/log_time.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -10,7 +10,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/00_sim/log_time.py + uv run python scripts/tutorials/00_sim/log_time.py """ @@ -45,7 +45,7 @@ def main(): os.mkdir(log_dir_path) # In the container, the absolute path will be # /workspace/isaaclab/logs/docker_tutorial, because - # all python execution is done through /workspace/isaaclab/isaaclab.sh + # all Python execution is done through the uv-managed workspace # and the calling process' path will be /workspace/isaaclab log_dir_path = os.path.abspath(os.path.join(log_dir_path, "docker_tutorial")) if not os.path.isdir(log_dir_path): diff --git a/scripts/tutorials/00_sim/set_rendering_mode.py b/scripts/tutorials/00_sim/set_rendering_mode.py deleted file mode 100644 index 49125d91..00000000 --- a/scripts/tutorials/00_sim/set_rendering_mode.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""This script demonstrates how to spawn prims into the scene. - -.. code-block:: bash - - # Usage - ./isaaclab.sh -p scripts/tutorials/00_sim/set_rendering_mode.py - -""" - -"""Launch Isaac Sim Simulator first.""" - - -import argparse - -from isaaclab.app import AppLauncher - -# create argparser -parser = argparse.ArgumentParser( - description="Tutorial on viewing a warehouse scene with a given rendering mode preset." -) -# append AppLauncher cli args -AppLauncher.add_app_launcher_args(parser) -# parse the arguments -args_cli = parser.parse_args() -# launch omniverse app -app_launcher = AppLauncher(args_cli) -simulation_app = app_launcher.app - -"""Rest everything follows.""" - -import isaaclab.sim as sim_utils -from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR - - -def main(): - """Main function.""" - - # rendering modes include performance, balanced, and quality - # note, the rendering_mode specified in the CLI argument (--rendering_mode) takes precedence over this Render Config setting - rendering_mode = "performance" - - # carb setting dictionary can include any rtx carb setting which will overwrite the native preset setting - carb_settings = {"rtx.reflections.enabled": True} - - # Initialize render config - render_cfg = sim_utils.RenderCfg( - rendering_mode=rendering_mode, - carb_settings=carb_settings, - ) - - # Initialize the simulation context with render coofig - sim_cfg = sim_utils.SimulationCfg(render=render_cfg) - sim = sim_utils.SimulationContext(sim_cfg) - - # Pose camera in the hospital lobby area - sim.set_camera_view([-11, -0.5, 2], [0, 0, 0.5]) - - # Load hospital scene - hospital_usd_path = f"{ISAAC_NUCLEUS_DIR}/Environments/Hospital/hospital.usd" - cfg = sim_utils.UsdFileCfg(usd_path=hospital_usd_path) - cfg.func("/Scene", cfg) - - # Play the simulator - sim.reset() - - # Now we are ready! - print("[INFO]: Setup complete...") - - # Run simulation and view scene - while simulation_app.is_running(): - sim.step() - - -if __name__ == "__main__": - # run the main function - main() - # close sim app - simulation_app.close() diff --git a/scripts/tutorials/00_sim/spawn_prims.py b/scripts/tutorials/00_sim/spawn_prims.py index 4ebe30ec..cfc0a87a 100644 --- a/scripts/tutorials/00_sim/spawn_prims.py +++ b/scripts/tutorials/00_sim/spawn_prims.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -8,7 +8,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/00_sim/spawn_prims.py + uv run python scripts/tutorials/00_sim/spawn_prims.py """ @@ -31,6 +31,8 @@ """Rest everything follows.""" +from isaaclab_physx.sim.schemas import PhysxDeformableBodyPropertiesCfg +from isaaclab_physx.sim.spawners.materials import PhysxDeformableBodyMaterialCfg import isaaclab.sim as sim_utils from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR @@ -76,9 +78,9 @@ def design_scene(): # spawn a blue cuboid with deformable body cfg_cuboid_deformable = sim_utils.MeshCuboidCfg( size=(0.2, 0.5, 0.2), - deformable_props=sim_utils.DeformableBodyPropertiesCfg(), + deformable_props=PhysxDeformableBodyPropertiesCfg(), visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 0.0, 1.0)), - physics_material=sim_utils.DeformableBodyMaterialCfg(), + physics_material=PhysxDeformableBodyMaterialCfg(), ) cfg_cuboid_deformable.func("/World/Objects/CuboidDeformable", cfg_cuboid_deformable, translation=(0.15, 0.0, 2.0)) diff --git a/scripts/tutorials/01_assets/add_new_robot.py b/scripts/tutorials/01_assets/add_new_robot.py index 24d972ef..ca0c477e 100644 --- a/scripts/tutorials/01_assets/add_new_robot.py +++ b/scripts/tutorials/01_assets/add_new_robot.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -59,22 +59,22 @@ actuators={ "front_joints": ImplicitActuatorCfg( joint_names_expr=["joint[1-2]"], - effort_limit_sim=100.0, - velocity_limit_sim=100.0, + joint_effort_limit=100.0, + joint_velocity_limit=100.0, stiffness=10000.0, damping=100.0, ), "joint3_act": ImplicitActuatorCfg( joint_names_expr=["joint3"], - effort_limit_sim=100.0, - velocity_limit_sim=100.0, + joint_effort_limit=100.0, + joint_velocity_limit=100.0, stiffness=10000.0, damping=100.0, ), "joint4_act": ImplicitActuatorCfg( joint_names_expr=["joint4"], - effort_limit_sim=100.0, - velocity_limit_sim=100.0, + joint_effort_limit=100.0, + joint_velocity_limit=100.0, stiffness=10000.0, damping=100.0, ), @@ -105,8 +105,8 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): # wheel-velocity templates allocated once on the simulation device; the joint # target setters dispatch to GPU Warp kernels and reject CPU tensors. - straight_action = torch.tensor([[10.0, 10.0]], device=sim.device) - turn_action = torch.tensor([[5.0, -5.0]], device=sim.device) + straight_action = torch.tensor([[10.0, 10.0]], device=sim.device).repeat(scene.num_envs, 1) + turn_action = torch.tensor([[5.0, -5.0]], device=sim.device).repeat(scene.num_envs, 1) while simulation_app.is_running(): # reset @@ -155,7 +155,7 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): scene["Jetbot"].set_joint_velocity_target_index(target=action) # wave - wave_action = scene["Dofbot"].data.default_joint_pos.torch + wave_action = scene["Dofbot"].data.default_joint_pos.torch.clone() wave_action[:, 0:4] = 0.25 * np.sin(2 * np.pi * 0.5 * sim_time) scene["Dofbot"].set_joint_position_target_index(target=wave_action) @@ -173,7 +173,7 @@ def main(): sim = sim_utils.SimulationContext(sim_cfg) sim.set_camera_view([3.5, 0.0, 3.2], [0.0, 0.0, 0.5]) # Design scene - scene_cfg = NewRobotsSceneCfg(args_cli.num_envs, env_spacing=2.0) + scene_cfg = NewRobotsSceneCfg(num_envs=args_cli.num_envs, env_spacing=2.0) scene = InteractiveScene(scene_cfg) # Play the simulator sim.reset() diff --git a/scripts/tutorials/01_assets/run_articulation.py b/scripts/tutorials/01_assets/run_articulation.py index cac69c30..5607d48d 100644 --- a/scripts/tutorials/01_assets/run_articulation.py +++ b/scripts/tutorials/01_assets/run_articulation.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -8,7 +8,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/01_assets/run_articulation.py + uv run python scripts/tutorials/01_assets/run_articulation.py """ @@ -110,7 +110,7 @@ def run_simulator(sim: sim_utils.SimulationContext, entities: dict[str, Articula # -- generate random joint efforts efforts = torch.randn_like(robot.data.joint_pos.torch) * 5.0 # -- apply action to the robot - robot.set_joint_effort_target_index(target=efforts) + robot.actuators.target_command.set_effort_index(value=efforts) # -- write data to sim robot.write_data_to_sim() # Perform step diff --git a/scripts/tutorials/01_assets/run_deformable_object.py b/scripts/tutorials/01_assets/run_deformable_object.py index 11e90ce8..4b1b6d4d 100644 --- a/scripts/tutorials/01_assets/run_deformable_object.py +++ b/scripts/tutorials/01_assets/run_deformable_object.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -8,31 +8,39 @@ .. code-block:: bash - # Usage - ./isaaclab.sh -p scripts/tutorials/01_assets/run_deformable_object.py + # Usage with default PhysX physics and default kit visualizer. + uv run --extra isaacsim --extra tetrahedralization python scripts/tutorials/01_assets/run_deformable_object.py + + # Usage with Newton VBD physics and default kit visualizer. + uv run --extra isaacsim --extra tetrahedralization python scripts/tutorials/01_assets/run_deformable_object.py \ + --backend newton_vbd + + # Usage with OvPhysX physics without a visualizer. + uv run --extra ovphysx --extra tetrahedralization python scripts/tutorials/01_assets/run_deformable_object.py \ + --backend ovphysx """ -"""Launch Isaac Sim Simulator first.""" +"""Parse CLI first so we can decide whether to launch Isaac Sim Kit.""" import argparse -import os +from typing import TYPE_CHECKING -from isaaclab.app import AppLauncher +from isaaclab.app import add_launcher_args, launch_simulation # add argparse arguments parser = argparse.ArgumentParser(description="Tutorial on interacting with a deformable object.") -parser.add_argument("--backend", type=str, default="physx", choices=["physx", "newton"], help="Physics backend.") -# append AppLauncher cli args -AppLauncher.add_app_launcher_args(parser) -# demos should open Kit visualizer by default -parser.set_defaults(visualizer=["kit"]) +parser.add_argument( + "--backend", type=str, default="physx", choices=["physx", "newton_vbd", "ovphysx"], help="Physics backend." +) +# append simulation launcher CLI arguments +add_launcher_args(parser) +# Kit cannot be combined with OvPhysX, so use no visualizer by default for that backend +backend_args, _ = parser.parse_known_args() +parser.set_defaults(visualizer=None if backend_args.backend == "ovphysx" else ["kit"]) # parse the arguments args_cli = parser.parse_args() - -# launch omniverse app -app_launcher = AppLauncher(args_cli) -simulation_app = app_launcher.app +args_cli.physics = args_cli.backend """Rest everything follows.""" @@ -40,11 +48,16 @@ import isaaclab.sim as sim_utils import isaaclab.utils.math as math_utils -from isaaclab.assets import DeformableObject, DeformableObjectCfg +from isaaclab.physics import PhysicsCfg + +if TYPE_CHECKING: + from isaaclab.assets import DeformableObject def design_scene(): """Designs the scene.""" + from isaaclab.assets import DeformableObject, DeformableObjectCfg + # Ground-plane cfg = sim_utils.GroundPlaneCfg() cfg.func("/World/defaultGroundPlane", cfg) @@ -65,21 +78,24 @@ def design_scene(): youngs_modulus = 1e5 poissons_ratio = 0.4 density = 500.0 - if args_cli.backend == "newton": + if args_cli.backend == "newton_vbd": from isaaclab_newton.sim.schemas import NewtonDeformableBodyPropertiesCfg from isaaclab_newton.sim.spawners.materials import NewtonDeformableBodyMaterialCfg deformable_props = NewtonDeformableBodyPropertiesCfg() + # Newton's VBD path skips the simulation mesh collider, so collision offsets do not apply + collision_props = None physics_material = NewtonDeformableBodyMaterialCfg( k_mu=youngs_modulus / (2.0 * (1.0 + poissons_ratio)), k_lambda=youngs_modulus * poissons_ratio / ((1.0 + poissons_ratio) * (1.0 - 2.0 * poissons_ratio)), density=density, ) else: - from isaaclab_physx.sim.schemas import PhysxDeformableBodyPropertiesCfg + from isaaclab_physx.sim.schemas import PhysxCollisionCfg, PhysxDeformableBodyPropertiesCfg from isaaclab_physx.sim.spawners.materials import PhysxDeformableBodyMaterialCfg - deformable_props = PhysxDeformableBodyPropertiesCfg(rest_offset=0.0, contact_offset=0.001) + deformable_props = PhysxDeformableBodyPropertiesCfg() + collision_props = [PhysxCollisionCfg(rest_offset=0.0, contact_offset=0.001)] physics_material = PhysxDeformableBodyMaterialCfg( poissons_ratio=poissons_ratio, youngs_modulus=youngs_modulus, density=density ) @@ -90,6 +106,7 @@ def design_scene(): spawn=sim_utils.MeshCuboidCfg( size=(0.2, 0.2, 0.2), deformable_props=deformable_props, + collision_props=collision_props, visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.5, 0.1, 0.0)), physics_material=physics_material, ), @@ -104,7 +121,7 @@ def design_scene(): return scene_entities, origins -def run_simulator(sim: sim_utils.SimulationContext, entities: dict, origins: torch.Tensor, output_dir: str): +def run_simulator(sim: sim_utils.SimulationContext, entities: dict, origins: torch.Tensor): """Runs the simulation loop.""" # Extract scene entities # note: we only do this here for readability. In general, it is better to access the entities directly from @@ -120,7 +137,7 @@ def run_simulator(sim: sim_utils.SimulationContext, entities: dict, origins: tor nodal_kinematic_target = cube_object.data.nodal_kinematic_target.torch.clone() # Simulate physics - while simulation_app.is_running(): + while sim.is_headless_or_exist_active_visualizer(): # reset at start and after 3 seconds if count % int(3.0 / sim_dt) == 0: # reset counters @@ -174,36 +191,26 @@ def run_simulator(sim: sim_utils.SimulationContext, entities: dict, origins: tor def main(): """Main function.""" - # Load kit helper - if args_cli.backend == "newton": - from isaaclab_newton.physics import NewtonCfg - - from isaaclab_contrib.deformable.newton_manager_cfg import VBDSolverCfg - - physics_cfg = NewtonCfg(solver_cfg=VBDSolverCfg(iterations=10), num_substeps=4) - else: - from isaaclab_physx.physics import PhysxCfg - - physics_cfg = PhysxCfg() - sim_cfg = sim_utils.SimulationCfg(dt=0.01, device=args_cli.device, physics=physics_cfg) - sim = sim_utils.SimulationContext(sim_cfg) - # Set main camera - sim.set_camera_view(eye=[2.0, 2.0, 2.0], target=[0.0, 0.0, 0.75]) - # Design scene - scene_entities, scene_origins = design_scene() - scene_origins = torch.tensor(scene_origins, device=sim.device) - # Play the simulator - sim.reset() - # Now we are ready! - print("[INFO]: Setup complete...") - # Run the simulator - camera_output = os.path.join(os.path.dirname(os.path.realpath(__file__)), "output", "camera") - run_simulator(sim, scene_entities, scene_origins, camera_output) - print("[INFO]: Simulation complete...") + with launch_simulation(cfg=PhysicsCfg(), launcher_args=args_cli) as physics_cfg: + if args_cli.backend == "newton_vbd": + physics_cfg.solver_cfg.iterations = 10 + physics_cfg.num_substeps = 4 + sim_cfg = sim_utils.SimulationCfg(dt=0.01, device=args_cli.device, physics=physics_cfg) + sim = sim_utils.SimulationContext(sim_cfg) + # Set main camera + sim.set_camera_view(eye=[2.0, 2.0, 2.0], target=[0.0, 0.0, 0.75]) + # Design scene + scene_entities, scene_origins = design_scene() + scene_origins = torch.tensor(scene_origins, device=sim.device) + # Play the simulator + sim.reset() + # Now we are ready! + print("[INFO]: Setup complete...") + # Run the simulator + run_simulator(sim, scene_entities, scene_origins) + print("[INFO]: Simulation complete...") if __name__ == "__main__": # run the main function main() - # close sim app - simulation_app.close() diff --git a/scripts/tutorials/01_assets/run_rigid_object.py b/scripts/tutorials/01_assets/run_rigid_object.py index a258fa40..266cac7b 100644 --- a/scripts/tutorials/01_assets/run_rigid_object.py +++ b/scripts/tutorials/01_assets/run_rigid_object.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -9,7 +9,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/01_assets/run_rigid_object.py + uv run python scripts/tutorials/01_assets/run_rigid_object.py """ diff --git a/scripts/tutorials/01_assets/run_surface_gripper.py b/scripts/tutorials/01_assets/run_surface_gripper.py index 31143501..3c321873 100644 --- a/scripts/tutorials/01_assets/run_surface_gripper.py +++ b/scripts/tutorials/01_assets/run_surface_gripper.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -8,7 +8,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/01_assets/run_surface_gripper.py --device=cpu + uv run python scripts/tutorials/01_assets/run_surface_gripper.py --device=cpu When running this script make sure the --device flag is set to cpu. This is because the surface gripper is currently only supported on the CPU. diff --git a/scripts/tutorials/02_scene/create_scene.py b/scripts/tutorials/02_scene/create_scene.py index 674ae699..36dce16c 100644 --- a/scripts/tutorials/02_scene/create_scene.py +++ b/scripts/tutorials/02_scene/create_scene.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -8,7 +8,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/02_scene/create_scene.py --num_envs 32 + uv run python scripts/tutorials/02_scene/create_scene.py --num_envs 32 """ @@ -39,7 +39,7 @@ from isaaclab.assets import ArticulationCfg, AssetBaseCfg from isaaclab.scene import InteractiveScene, InteractiveSceneCfg from isaaclab.sim import SimulationContext -from isaaclab.utils.configclass import configclass +from isaaclab.utils import configclass ## # Pre-defined configs diff --git a/scripts/tutorials/03_envs/create_cartpole_base_env.py b/scripts/tutorials/03_envs/create_cartpole_base_env.py index b48357ee..35da1550 100644 --- a/scripts/tutorials/03_envs/create_cartpole_base_env.py +++ b/scripts/tutorials/03_envs/create_cartpole_base_env.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -9,7 +9,7 @@ .. code-block:: bash - ./isaaclab.sh -p scripts/tutorials/03_envs/create_cartpole_base_env.py --num_envs 32 + uv run python scripts/tutorials/03_envs/create_cartpole_base_env.py --num_envs 32 """ @@ -36,6 +36,7 @@ """Rest everything follows.""" import math + import torch import isaaclab.envs.mdp as mdp @@ -45,8 +46,9 @@ from isaaclab.managers import ObservationTermCfg as ObsTerm from isaaclab.managers import SceneEntityCfg from isaaclab.utils import configclass +from isaaclab.visualizers import VisualizerCfg -from isaaclab_tasks.manager_based.classic.cartpole.cartpole_env_cfg import CartpoleSceneCfg +from isaaclab_tasks.core.cartpole.cartpole_manager_env_cfg import CartpoleSceneCfg @configclass @@ -127,8 +129,7 @@ class CartpoleEnvCfg(ManagerBasedEnvCfg): def __post_init__(self): """Post initialization.""" # viewer settings - self.viewer.eye = [4.5, 0.0, 6.0] - self.viewer.lookat = [0.0, 0.0, 2.0] + self.sim.default_visualizer_cfg = VisualizerCfg(eye=(4.5, 0.0, 6.0), lookat=(0.0, 0.0, 2.0)) # step settings self.decimation = 4 # env step every 4 sim steps: 200Hz / 4 = 50Hz # simulation settings diff --git a/scripts/tutorials/03_envs/create_cube_base_env.py b/scripts/tutorials/03_envs/create_cube_base_env.py index 803d627f..08d203b9 100644 --- a/scripts/tutorials/03_envs/create_cube_base_env.py +++ b/scripts/tutorials/03_envs/create_cube_base_env.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -22,7 +22,7 @@ .. code-block:: bash # Run the script - ./isaaclab.sh -p scripts/tutorials/03_envs/create_cube_base_env.py --num_envs 32 + uv run python scripts/tutorials/03_envs/create_cube_base_env.py --num_envs 32 """ @@ -56,14 +56,14 @@ import isaaclab.sim as sim_utils from isaaclab.assets import AssetBaseCfg, RigidObject, RigidObjectCfg from isaaclab.envs import ManagerBasedEnv, ManagerBasedEnvCfg -from isaaclab.managers import ActionTerm, ActionTermCfg +from isaaclab.managers import ActionTerm, ActionTermCfg, SceneEntityCfg from isaaclab.managers import EventTermCfg as EventTerm from isaaclab.managers import ObservationGroupCfg as ObsGroup from isaaclab.managers import ObservationTermCfg as ObsTerm -from isaaclab.managers import SceneEntityCfg from isaaclab.scene import InteractiveSceneCfg from isaaclab.terrains import TerrainImporterCfg from isaaclab.utils import configclass +from isaaclab.visualizers import VisualizerCfg ## # Custom action term @@ -129,11 +129,11 @@ def process_actions(self, actions: torch.Tensor): def apply_actions(self): # implement a PD controller to track the target position - pos_error = self._processed_actions - (self._asset.data.root_pos_w - self._env.scene.env_origins) - vel_error = -self._asset.data.root_lin_vel_w + pos_error = self._processed_actions - (self._asset.data.root_pos_w.torch - self._env.scene.env_origins) + vel_error = -self._asset.data.root_lin_vel_w.torch # set velocity targets self._vel_command[:, :3] = self.p_gain * pos_error + self.d_gain * vel_error - self._asset.write_root_velocity_to_sim(self._vel_command) + self._asset.write_root_velocity_to_sim_index(root_velocity=self._vel_command) @configclass @@ -158,7 +158,7 @@ def base_position(env: ManagerBasedEnv, asset_cfg: SceneEntityCfg) -> torch.Tens """Root linear velocity in the asset's root frame.""" # extract the used quantities (to enable type-hinting) asset: RigidObject = env.scene[asset_cfg.name] - return asset.data.root_pos_w - env.scene.env_origins + return asset.data.root_pos_w.torch - env.scene.env_origins ## @@ -306,8 +306,7 @@ def __post_init__(self): self.sim.render_interval = 2 # render interval should be a multiple of decimation self.sim.device = args_cli.device # viewer settings - self.viewer.eye = (5.0, 5.0, 5.0) - self.viewer.lookat = (0.0, 0.0, 2.0) + self.sim.default_visualizer_cfg = VisualizerCfg(eye=(5.0, 5.0, 5.0), lookat=(0.0, 0.0, 2.0)) def main(): @@ -337,7 +336,7 @@ def main(): # step env obs, _ = env.step(target_position) # print mean squared position error between target and current position - error = torch.norm(obs["policy"] - target_position).mean().item() + error = torch.linalg.norm(obs["policy"] - target_position).mean().item() print(f"[Step: {count:04d}]: Mean position error: {error:.4f}") # update counter count += 1 diff --git a/scripts/tutorials/03_envs/create_quadruped_base_env.py b/scripts/tutorials/03_envs/create_quadruped_base_env.py index 5aac02a8..151c213a 100644 --- a/scripts/tutorials/03_envs/create_quadruped_base_env.py +++ b/scripts/tutorials/03_envs/create_quadruped_base_env.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -13,7 +13,7 @@ .. code-block:: bash # Run the script - ./isaaclab.sh -p scripts/tutorials/03_envs/create_quadruped_base_env.py --num_envs 32 + uv run python scripts/tutorials/03_envs/create_quadruped_base_env.py --num_envs 32 """ @@ -54,7 +54,7 @@ from isaaclab.terrains import TerrainImporterCfg from isaaclab.utils import configclass from isaaclab.utils.assets import ISAACLAB_NUCLEUS_DIR, check_file_path, read_file -from isaaclab.utils.noise import AdditiveUniformNoiseCfg as Unoise +from isaaclab.utils.noise import UniformNoiseCfg as Unoise ## # Pre-defined configs diff --git a/scripts/tutorials/03_envs/policy_inference_in_usd.py b/scripts/tutorials/03_envs/policy_inference_in_usd.py index cab84e62..c9f1e3ce 100644 --- a/scripts/tutorials/03_envs/policy_inference_in_usd.py +++ b/scripts/tutorials/03_envs/policy_inference_in_usd.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -7,12 +7,12 @@ This script demonstrates policy inference in a prebuilt USD environment. In this example, we use a locomotion policy to control the H1 robot. The robot was trained -using Isaac-Velocity-Rough-H1-v0. The robot is commanded to move forward at a constant velocity. +using Isaac-Velocity-Rough-H1. The robot is commanded to move forward at a constant velocity. .. code-block:: bash # Run the script - ./isaaclab.sh -p scripts/tutorials/03_envs/policy_inference_in_usd.py --checkpoint /path/to/jit/checkpoint.pt + uv run python scripts/tutorials/03_envs/policy_inference_in_usd.py --checkpoint /path/to/jit/checkpoint.pt """ @@ -29,45 +29,41 @@ # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) -# parse the arguments -args_cli = parser.parse_args() +# parse the arguments, forwarding unrecognized ones as Hydra-style task config overrides +args_cli, hydra_overrides = parser.parse_known_args() # launch omniverse app app_launcher = AppLauncher(args_cli) simulation_app = app_launcher.app """Rest everything follows.""" -import io import os -import torch -import omni +import torch from isaaclab.envs import ManagerBasedRLEnv from isaaclab.terrains import TerrainImporterCfg -from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR, read_file -from isaaclab_tasks.manager_based.locomotion.velocity.config.h1.rough_env_cfg import H1RoughEnvCfg_PLAY +from isaaclab_tasks.utils import parse_env_cfg def main(): """Main function.""" # load the trained jit policy policy_path = os.path.abspath(args_cli.checkpoint) - file_content = omni.client.read_file(policy_path)[2] - file = io.BytesIO(memoryview(file_content).tobytes()) + file = read_file(policy_path) policy = torch.jit.load(file, map_location=args_cli.device) # setup environment - env_cfg = H1RoughEnvCfg_PLAY() - env_cfg.scene.num_envs = 1 + env_cfg = parse_env_cfg("Isaac-Velocity-Rough-H1", device=args_cli.device, num_envs=1, overrides=hydra_overrides) + env_cfg.play_mode() env_cfg.curriculum = None env_cfg.scene.terrain = TerrainImporterCfg( prim_path="/World/ground", terrain_type="usd", usd_path=f"{ISAAC_NUCLEUS_DIR}/Environments/Simple_Warehouse/warehouse.usd", ) - env_cfg.sim.device = args_cli.device if args_cli.device == "cpu": env_cfg.sim.use_fabric = False diff --git a/scripts/tutorials/03_envs/run_cartpole_rl_env.py b/scripts/tutorials/03_envs/run_cartpole_rl_env.py index 87cee28a..2f36a26b 100644 --- a/scripts/tutorials/03_envs/run_cartpole_rl_env.py +++ b/scripts/tutorials/03_envs/run_cartpole_rl_env.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -8,7 +8,10 @@ .. code-block:: bash - ./isaaclab.sh -p scripts/tutorials/03_envs/run_cartpole_rl_env.py --num_envs 32 + uv run python scripts/tutorials/03_envs/run_cartpole_rl_env.py --num_envs 32 + +Trailing ``key=value`` arguments (e.g. ``physics=isaacsim_physx``) are forwarded as Hydra-style +overrides to the task configuration; see :func:`~isaaclab_tasks.utils.parse_env_cfg`. """ @@ -24,8 +27,10 @@ # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) -# parse the arguments -args_cli = parser.parse_args() +# tutorials should open Kit visualizer by default +parser.set_defaults(visualizer=["kit"]) +# parse the arguments, forwarding unrecognized ones as Hydra-style task config overrides +args_cli, hydra_overrides = parser.parse_known_args() # launch omniverse app app_launcher = AppLauncher(args_cli) @@ -37,15 +42,15 @@ from isaaclab.envs import ManagerBasedRLEnv -from isaaclab_tasks.manager_based.classic.cartpole.cartpole_env_cfg import CartpoleEnvCfg +from isaaclab_tasks.utils import parse_env_cfg def main(): """Main function.""" # create environment configuration - env_cfg = CartpoleEnvCfg() - env_cfg.scene.num_envs = args_cli.num_envs - env_cfg.sim.device = args_cli.device + env_cfg = parse_env_cfg( + "Isaac-Cartpole", device=args_cli.device, num_envs=args_cli.num_envs, overrides=hydra_overrides + ) # setup RL environment env = ManagerBasedRLEnv(cfg=env_cfg) diff --git a/scripts/tutorials/04_sensors/add_sensors_on_robot.py b/scripts/tutorials/04_sensors/add_sensors_on_robot.py index 6ad27355..7eb6e9ed 100644 --- a/scripts/tutorials/04_sensors/add_sensors_on_robot.py +++ b/scripts/tutorials/04_sensors/add_sensors_on_robot.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -15,7 +15,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/04_sensors/add_sensors_on_robot.py --enable_cameras --viz kit + uv run python scripts/tutorials/04_sensors/add_sensors_on_robot.py --viz kit """ @@ -45,7 +45,7 @@ from isaaclab.assets import ArticulationCfg, AssetBaseCfg from isaaclab.scene import InteractiveScene, InteractiveSceneCfg from isaaclab.sensors import CameraCfg, ContactSensorCfg, RayCasterCfg, patterns -from isaaclab.utils.configclass import configclass +from isaaclab.utils import configclass ## # Pre-defined configs @@ -155,7 +155,7 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): ) print("-------------------------------") print(scene["contact_forces"]) - print("Received max contact force of: ", torch.max(scene["contact_forces"].data.net_forces_w).item()) + print("Received max contact force of: ", torch.max(scene["contact_forces"].data.net_normal_forces_w).item()) def main(): diff --git a/scripts/tutorials/04_sensors/run_frame_transformer.py b/scripts/tutorials/04_sensors/run_frame_transformer.py index a889b9e5..64c7772d 100644 --- a/scripts/tutorials/04_sensors/run_frame_transformer.py +++ b/scripts/tutorials/04_sensors/run_frame_transformer.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -9,7 +9,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/04_sensors/run_frame_transformer.py --viz kit + uv run python scripts/tutorials/04_sensors/run_frame_transformer.py --viz kit """ @@ -36,7 +36,7 @@ import torch -from isaacsim.core.experimental.utils.app import enable_extension +from isaaclab.sim.utils import enable_extension enable_extension("isaacsim.util.debug_draw") diff --git a/scripts/tutorials/04_sensors/run_ray_caster.py b/scripts/tutorials/04_sensors/run_ray_caster.py index 1c976f31..7287df3a 100644 --- a/scripts/tutorials/04_sensors/run_ray_caster.py +++ b/scripts/tutorials/04_sensors/run_ray_caster.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -9,7 +9,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/04_sensors/run_ray_caster.py --viz kit + uv run python scripts/tutorials/04_sensors/run_ray_caster.py --viz kit """ diff --git a/scripts/tutorials/04_sensors/run_ray_caster_camera.py b/scripts/tutorials/04_sensors/run_ray_caster_camera.py index bdbfe57b..755106a5 100644 --- a/scripts/tutorials/04_sensors/run_ray_caster_camera.py +++ b/scripts/tutorials/04_sensors/run_ray_caster_camera.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -11,7 +11,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/04_sensors/run_ray_caster_camera.py --viz kit + uv run python scripts/tutorials/04_sensors/run_ray_caster_camera.py --viz kit """ @@ -36,11 +36,10 @@ """Rest everything follows.""" import os +from typing import Any import torch -import omni.replicator.core as rep - import isaaclab.sim as sim_utils from isaaclab.sensors.ray_caster import RayCasterCamera, RayCasterCameraCfg, patterns from isaaclab.utils import convert_dict_to_backend @@ -58,7 +57,7 @@ def define_sensor() -> RayCasterCamera: # Setup camera sensor camera_cfg = RayCasterCameraCfg( - prim_path="/World/Origin_.*/CameraSensor", + prim_path="/World/Origin_[^/]+/CameraSensor", mesh_prim_paths=["/World/ground"], update_period=0.1, offset=RayCasterCameraCfg.OffsetCfg(pos=(0.0, 0.0, 0.0), rot=(1.0, 0.0, 0.0, 0.0)), @@ -98,9 +97,14 @@ def run_simulator(sim: sim_utils.SimulationContext, scene_entities: dict): # extract entities for simplified notation camera: RayCasterCamera = scene_entities["camera"] - # Create replicator writer - output_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "output", "ray_caster_camera") - rep_writer = rep.BasicWriter(output_dir=output_dir, frame_padding=3) + # Create the Replicator writer only when saving. The ray-cast camera itself + # is Warp-based and does not require Replicator or RTX rendering extensions. + rep_writer: Any | None = None + if args_cli.save: + import omni.replicator.core as rep + + output_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "output", "ray_caster_camera") + rep_writer = rep.BasicWriter(output_dir=output_dir, frame_padding=3) # Set pose: There are two ways to set the pose of the camera. # -- Option-1: Set pose using view @@ -142,6 +146,7 @@ def run_simulator(sim: sim_utils.SimulationContext, scene_entities: dict): rep_output["annotators"][key] = {"render_product": {"data": data}} # Save images rep_output["trigger_outputs"] = {"on_time": camera.frame[camera_index]} + assert rep_writer is not None rep_writer.write(rep_output) # Pointcloud in world frame diff --git a/scripts/tutorials/04_sensors/run_usd_camera.py b/scripts/tutorials/04_sensors/run_usd_camera.py index 28a30035..7fa75adb 100644 --- a/scripts/tutorials/04_sensors/run_usd_camera.py +++ b/scripts/tutorials/04_sensors/run_usd_camera.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -12,10 +12,10 @@ .. code-block:: bash # Usage with GUI - ./isaaclab.sh -p scripts/tutorials/04_sensors/run_usd_camera.py --enable_cameras --viz kit + uv run python scripts/tutorials/04_sensors/run_usd_camera.py --viz kit - # Usage with headless - ./isaaclab.sh -p scripts/tutorials/04_sensors/run_usd_camera.py --headless --enable_cameras + # Usage with no visualizer + uv run python scripts/tutorials/04_sensors/run_usd_camera.py """ @@ -53,6 +53,8 @@ AppLauncher.add_app_launcher_args(parser) # parse the arguments args_cli = parser.parse_args() +# Camera sensors require the rendering extensions in headless and viewport-free launches. +args_cli.enable_cameras = True # launch omniverse app app_launcher = AppLauncher(args_cli) @@ -86,7 +88,7 @@ def define_sensor() -> Camera: sim_utils.create_prim("/World/Origin_00", "Xform") sim_utils.create_prim("/World/Origin_01", "Xform") camera_cfg = CameraCfg( - prim_path="/World/Origin_.*/CameraSensor", + prim_path="/World/Origin_[^/]+/CameraSensor", update_period=0, height=480, width=640, @@ -95,7 +97,7 @@ def define_sensor() -> Camera: "distance_to_image_plane", "normals", "semantic_segmentation", - "instance_segmentation_fast", + "instance_segmentation", "instance_id_segmentation_fast", ], renderer_cfg=IsaacRtxRendererCfg( @@ -221,8 +223,8 @@ def run_simulator(sim: sim_utils.SimulationContext, scene_entities: dict): print("Received shape of normals : ", camera.data.output["normals"].shape) if "semantic_segmentation" in camera.data.output.keys(): print("Received shape of semantic segm. : ", camera.data.output["semantic_segmentation"].shape) - if "instance_segmentation_fast" in camera.data.output.keys(): - print("Received shape of instance segm. : ", camera.data.output["instance_segmentation_fast"].shape) + if "instance_segmentation" in camera.data.output.keys(): + print("Received shape of instance segm. : ", camera.data.output["instance_segmentation"].shape) if "instance_id_segmentation_fast" in camera.data.output.keys(): print("Received shape of instance id segm.: ", camera.data.output["instance_id_segmentation_fast"].shape) print("-------------------------------") diff --git a/scripts/tutorials/05_controllers/run_diff_ik.py b/scripts/tutorials/05_controllers/run_diff_ik.py index 8d55b482..7008ad0d 100644 --- a/scripts/tutorials/05_controllers/run_diff_ik.py +++ b/scripts/tutorials/05_controllers/run_diff_ik.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -12,7 +12,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/05_controllers/run_diff_ik.py + uv run python scripts/tutorials/05_controllers/run_diff_ik.py """ @@ -46,8 +46,8 @@ from isaaclab.markers import VisualizationMarkers from isaaclab.markers.config import FRAME_MARKER_CFG from isaaclab.scene import InteractiveScene, InteractiveSceneCfg +from isaaclab.utils import configclass from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR -from isaaclab.utils.configclass import configclass from isaaclab.utils.math import subtract_frame_transforms ## diff --git a/scripts/tutorials/05_controllers/run_osc.py b/scripts/tutorials/05_controllers/run_osc.py index 5e5c5073..5089ec78 100644 --- a/scripts/tutorials/05_controllers/run_osc.py +++ b/scripts/tutorials/05_controllers/run_osc.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -12,7 +12,7 @@ .. code-block:: bash # Usage - ./isaaclab.sh -p scripts/tutorials/05_controllers/run_osc.py + uv run python scripts/tutorials/05_controllers/run_osc.py """ @@ -45,7 +45,7 @@ from isaaclab.markers.config import FRAME_MARKER_CFG from isaaclab.scene import InteractiveScene, InteractiveSceneCfg from isaaclab.sensors import ContactSensorCfg -from isaaclab.utils.configclass import configclass +from isaaclab.utils import configclass from isaaclab.utils.math import ( combine_frame_transforms, matrix_from_quat, @@ -351,7 +351,7 @@ def update_states( contact_forces.update(sim_dt) # update contact sensor # Calculate the contact force by averaging over last four time steps (i.e., to smoothen) and # taking the max of three surfaces as only one should be the contact of interest - ee_force_w, _ = torch.max(torch.mean(contact_forces.data.net_forces_w_history, dim=1), dim=1) + ee_force_w, _ = torch.max(torch.mean(contact_forces.data.net_normal_forces_w_history, dim=1), dim=1) # This is a simplification, only for the sake of testing. ee_force_b = ee_force_w diff --git a/scripts/tutorials/06_deploy/anymal_c_env.py b/scripts/tutorials/06_deploy/anymal_c_env.py new file mode 100644 index 00000000..895bd8da --- /dev/null +++ b/scripts/tutorials/06_deploy/anymal_c_env.py @@ -0,0 +1,215 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# ruff: noqa: I001 + +from __future__ import annotations + +import gymnasium as gym +import torch +import warp as wp + +import isaaclab.sim as sim_utils +from isaaclab import cloner +from isaaclab.assets import Articulation +from isaaclab.envs import DirectRLEnv +from isaaclab.sensors import ContactSensor, RayCaster + +from .anymal_c_env_cfg import AnymalCFlatEnvCfg, AnymalCRoughEnvCfg +from leapp import annotate # isort: skip + + +class AnymalCEnv(DirectRLEnv): + cfg: AnymalCFlatEnvCfg | AnymalCRoughEnvCfg + + def __init__(self, cfg: AnymalCFlatEnvCfg | AnymalCRoughEnvCfg, render_mode: str | None = None, **kwargs): + super().__init__(cfg, render_mode, **kwargs) + + self._actions = torch.zeros(self.num_envs, gym.spaces.flatdim(self.single_action_space), device=self.device) + self._previous_actions = torch.zeros( + self.num_envs, gym.spaces.flatdim(self.single_action_space), device=self.device + ) + + self._commands = torch.zeros(self.num_envs, 3, device=self.device) + + self._episode_sums = { + key: torch.zeros(self.num_envs, dtype=torch.float, device=self.device) + for key in [ + "track_lin_vel_xy_exp", + "track_ang_vel_z_exp", + "lin_vel_z_l2", + "ang_vel_xy_l2", + "dof_torques_l2", + "dof_acc_l2", + "action_rate_l2", + "feet_air_time", + "undesired_contacts", + "flat_orientation_l2", + ] + } + self._base_id, _ = self._contact_sensor.find_sensors("base") + self._feet_ids, _ = self._contact_sensor.find_sensors(".*FOOT") + self._undesired_contact_body_ids, _ = self._contact_sensor.find_sensors(".*THIGH") + + def _setup_scene(self): + self._robot = Articulation(self.cfg.robot) + self.scene.articulations["robot"] = self._robot + self._contact_sensor = ContactSensor(self.cfg.contact_sensor) + self.scene.sensors["contact_sensor"] = self._contact_sensor + if isinstance(self.cfg, AnymalCRoughEnvCfg): + self._height_scanner = RayCaster(self.cfg.height_scanner) + self.scene.sensors["height_scanner"] = self._height_scanner + self.cfg.terrain.num_envs = self.scene.cfg.num_envs + self.cfg.terrain.env_spacing = self.scene.cfg.env_spacing + self._terrain = self.cfg.terrain.class_type(self.cfg.terrain) + src, dest = "/World/envs/env_0", "/World/envs/env_{}" + pos = cloner.grid_transforms(self.scene.num_envs, self.scene.cfg.env_spacing, device=self.device)[0] + global_paths = (self.cfg.terrain.prim_path,) + plan = cloner.clone_plan_from_env_0(src, dest, self.scene.num_envs, self.device, pos, global_paths=global_paths) + cloner.replicate(plan, stage=self.scene.stage) + # PhysX replication requires explicit collision filtering between environments. + if "physx" in self.scene.physics_backend: + self.scene.filter_collisions(global_prim_paths=[self.cfg.terrain.prim_path]) + light_cfg = sim_utils.DomeLightCfg(intensity=2000.0, color=(0.75, 0.75, 0.75)) + light_cfg.func("/World/Light", light_cfg) + + def _pre_physics_step(self, actions: torch.Tensor): + self._actions = actions.clone() + self._processed_actions = self.cfg.action_scale * self._actions + self._robot.data.default_joint_pos.torch + # start LEAPP annotations for outputs + annotate.update_state(self.spec.id, {"previous_actions": actions}) + annotate.output_tensors(self.spec.id, {"processed_actions": self._processed_actions}, export_with="onnx-dynamo") + # end LEAPP annotations for outputs + + def _apply_action(self): + self._robot.set_joint_position_target_index(target=self._processed_actions) + + def _get_observations(self) -> dict: + self._previous_actions = self._actions.clone() + height_data = None + if isinstance(self.cfg, AnymalCRoughEnvCfg): + height_data = ( + self._height_scanner.data.pos_w.torch[:, 2].unsqueeze(1) + - self._height_scanner.data.ray_hits_w.torch[..., 2] + - 0.5 + ).clip(-1.0, 1.0) + # start LEAPP annotations for inputs + root_lin_vel_b = annotate.input_tensors(self.spec.id, {"root_lin_vel_b": self._robot.data.root_lin_vel_b.torch}) + root_ang_vel_b = annotate.input_tensors(self.spec.id, {"root_ang_vel_b": self._robot.data.root_ang_vel_b.torch}) + projected_gravity_b = annotate.input_tensors( + self.spec.id, {"projected_gravity_b": self._robot.data.projected_gravity_b.torch} + ) + commands = annotate.input_tensors(self.spec.id, {"commands": self._commands}) + joint_pos = annotate.input_tensors(self.spec.id, {"joint_pos": self._robot.data.joint_pos.torch}) + default_joint_pos = annotate.input_tensors( + self.spec.id, {"default_joint_pos": self._robot.data.default_joint_pos.torch} + ) + joint_vel = annotate.input_tensors(self.spec.id, {"joint_vel": self._robot.data.joint_vel.torch}) + if height_data is not None: + height_data = annotate.input_tensors(self.spec.id, {"height_data": height_data}) + previous_actions = annotate.state_tensors(self.spec.id, {"previous_actions": self._actions}) + # end LEAPP annotations for inputs + + obs = torch.cat( + [ + tensor + for tensor in ( + root_lin_vel_b, + root_ang_vel_b, + projected_gravity_b, + commands, + joint_pos - default_joint_pos, + joint_vel, + height_data, + previous_actions, + ) + if tensor is not None + ], + dim=-1, + ) + observations = {"policy": obs} + return observations + + def _get_rewards(self) -> torch.Tensor: + lin_vel_error = torch.sum( + torch.square(self._commands[:, :2] - self._robot.data.root_lin_vel_b.torch[:, :2]), dim=1 + ) + lin_vel_error_mapped = torch.exp(-lin_vel_error / 0.25) + yaw_rate_error = torch.square(self._commands[:, 2] - self._robot.data.root_ang_vel_b.torch[:, 2]) + yaw_rate_error_mapped = torch.exp(-yaw_rate_error / 0.25) + z_vel_error = torch.square(self._robot.data.root_lin_vel_b.torch[:, 2]) + ang_vel_error = torch.sum(torch.square(self._robot.data.root_ang_vel_b.torch[:, :2]), dim=1) + joint_torques = torch.sum(torch.square(self._robot.actuators.applied_effort.torch), dim=1) + joint_accel = torch.sum(torch.square(self._robot.data.joint_acc.torch), dim=1) + action_rate = torch.sum(torch.square(self._actions - self._previous_actions), dim=1) + first_contact = self._contact_sensor.compute_first_contact(self.step_dt).torch[:, self._feet_ids] + last_air_time = self._contact_sensor.data.last_air_time.torch[:, self._feet_ids] + air_time = torch.sum((last_air_time - 0.5) * first_contact, dim=1) * ( + torch.linalg.norm(self._commands[:, :2], dim=1) > 0.1 + ) + net_contact_forces = self._contact_sensor.data.net_normal_forces_w_history.torch + is_contact = ( + torch.max(torch.linalg.norm(net_contact_forces[:, :, self._undesired_contact_body_ids], dim=-1), dim=1)[0] + > 1.0 + ) + contacts = torch.sum(is_contact, dim=1) + flat_orientation = torch.sum(torch.square(self._robot.data.projected_gravity_b.torch[:, :2]), dim=1) + + rewards = { + "track_lin_vel_xy_exp": lin_vel_error_mapped * self.cfg.lin_vel_reward_scale * self.step_dt, + "track_ang_vel_z_exp": yaw_rate_error_mapped * self.cfg.yaw_rate_reward_scale * self.step_dt, + "lin_vel_z_l2": z_vel_error * self.cfg.z_vel_reward_scale * self.step_dt, + "ang_vel_xy_l2": ang_vel_error * self.cfg.ang_vel_reward_scale * self.step_dt, + "dof_torques_l2": joint_torques * self.cfg.joint_torque_reward_scale * self.step_dt, + "dof_acc_l2": joint_accel * self.cfg.joint_accel_reward_scale * self.step_dt, + "action_rate_l2": action_rate * self.cfg.action_rate_reward_scale * self.step_dt, + "feet_air_time": air_time * self.cfg.feet_air_time_reward_scale * self.step_dt, + "undesired_contacts": contacts * self.cfg.undesired_contact_reward_scale * self.step_dt, + "flat_orientation_l2": flat_orientation * self.cfg.flat_orientation_reward_scale * self.step_dt, + } + reward = torch.sum(torch.stack(list(rewards.values())), dim=0) + for key, value in rewards.items(): + self._episode_sums[key] += value + return reward + + def _get_dones(self) -> tuple[torch.Tensor, torch.Tensor]: + time_out = self.episode_length_buf >= self.max_episode_length - 1 + net_contact_forces = self._contact_sensor.data.net_normal_forces_w_history.torch + died = torch.any( + torch.max(torch.linalg.norm(net_contact_forces[:, :, self._base_id], dim=-1), dim=1)[0] > 1.0, dim=1 + ) + return died, time_out + + def _reset_idx(self, env_ids: torch.Tensor | None): + if env_ids is None or len(env_ids) == self.num_envs: + env_ids = wp.to_torch(self._robot._ALL_INDICES) + assert env_ids is not None + self._robot.reset(env_ids) + super()._reset_idx(env_ids) + if len(env_ids) == self.num_envs: + self.episode_length_buf[:] = torch.randint_like(self.episode_length_buf, high=int(self.max_episode_length)) + self._actions[env_ids] = 0.0 + self._previous_actions[env_ids] = 0.0 + self._commands[env_ids] = torch.zeros_like(self._commands[env_ids]).uniform_(-1.0, 1.0) + joint_pos = self._robot.data.default_joint_pos.torch[env_ids] + joint_vel = self._robot.data.default_joint_vel.torch[env_ids] + default_root_pose = self._robot.data.default_root_pose.torch[env_ids] + default_root_vel = self._robot.data.default_root_vel.torch[env_ids] + default_root_pose[:, :3] += self._terrain.env_origins[env_ids] + self._robot.write_root_pose_to_sim_index(root_pose=default_root_pose, env_ids=env_ids) + self._robot.write_root_velocity_to_sim_index(root_velocity=default_root_vel, env_ids=env_ids) + self._robot.write_joint_position_to_sim_index(position=joint_pos, env_ids=env_ids) + self._robot.write_joint_velocity_to_sim_index(velocity=joint_vel, env_ids=env_ids) + extras = dict() + for key in self._episode_sums.keys(): + episodic_sum_avg = torch.mean(self._episode_sums[key][env_ids]) + extras["Episode_Reward/" + key] = episodic_sum_avg / self.max_episode_length_s + self._episode_sums[key][env_ids] = 0.0 + self.extras["log"] = dict() + self.extras["log"].update(extras) + extras = dict() + extras["Episode_Termination/base_contact"] = torch.count_nonzero(self.reset_terminated[env_ids]).item() + extras["Episode_Termination/time_out"] = torch.count_nonzero(self.reset_time_outs[env_ids]).item() + self.extras["log"].update(extras) diff --git a/scripts/tutorials/07_visualizers/run_tiled_camera_visualizer.py b/scripts/tutorials/07_visualizers/run_tiled_camera_visualizer.py new file mode 100644 index 00000000..9dbd9bf4 --- /dev/null +++ b/scripts/tutorials/07_visualizers/run_tiled_camera_visualizer.py @@ -0,0 +1,180 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +""" +This script demonstrates the visualizer tiled camera panel. + +.. code-block:: bash + + # Kit visualizer tiled camera panel + uv run python scripts/tutorials/07_visualizers/run_tiled_camera_visualizer.py \ + --task Isaac-Velocity-Rough-AnymalD --num_envs 256 --viz kit + + # Newton visualizer tiled camera panel + uv run python scripts/tutorials/07_visualizers/run_tiled_camera_visualizer.py \ + --task IsaacContrib-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor --num_envs 25 --viz newton + +""" + +from __future__ import annotations + +import argparse +import contextlib +import sys + +import gymnasium as gym +import torch + +import isaaclab_tasks # noqa: F401 + +with contextlib.suppress(ImportError): + import isaaclab_tasks_experimental # noqa: F401 +from isaaclab.app import add_launcher_args, launch_simulation + +from isaaclab_tasks.utils import resolve_task_config, setup_preset_cli + +KIT_DEFAULT_TASK = "Isaac-Velocity-Rough-AnymalD" +NEWTON_DEFAULT_TASK = "IsaacContrib-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor" +SUPPORTED_TILED_VISUALIZERS = {"kit", "newton", "newton_gl", "newton_rtx"} +UNSUPPORTED_TILED_VISUALIZERS = {"rerun", "viser"} + + +def _resolve_env_regex_path(prim_path: str) -> str: + """Resolve scene config env namespace macros to the cloned-env regex.""" + return prim_path.format(ENV_REGEX_NS="/World/envs/env_.*") + + +def _requested_visualizers(args_cli: argparse.Namespace) -> list[str]: + """Return requested visualizers, defaulting to Kit for this tutorial.""" + visualizers = args_cli.visualizer or ["kit"] + visualizers = [str(visualizer).lower() for visualizer in visualizers] + + if "none" in visualizers: + raise ValueError("This demo requires a tiled-camera visualizer. Use '--viz kit' or '--viz newton_gl'.") + unsupported = sorted(set(visualizers) & UNSUPPORTED_TILED_VISUALIZERS) + if unsupported: + raise ValueError( + "The visualizer tiled camera panel is only implemented for Kit and Newton. " + f"Unsupported selection: {unsupported}." + ) + unknown = sorted(set(visualizers) - SUPPORTED_TILED_VISUALIZERS) + if unknown: + raise ValueError(f"Unknown visualizer selection for this demo: {unknown}.") + return visualizers + + +def _make_kit_visualizer_cfg(env_cfg): + """Create the Kit streaming-camera visualizer for the selected task.""" + from isaaclab_visualizers.kit import KitVisualizerCfg + + visualizer_cfg = KitVisualizerCfg() + visualizer_cfg.streaming_view = True + visualizer_cfg.streaming_envs = 36 + + ego_cam_cfg = getattr(env_cfg.scene, "ego_cam", None) + if ego_cam_cfg is not None: + visualizer_cfg.streaming_sensor_prim_path = _resolve_env_regex_path(ego_cam_cfg.prim_path) + return visualizer_cfg + + visualizer_cfg.streaming_sensor_prim_path = None + visualizer_cfg.streaming_cam_eye = (3.0, 3.0, 3.0) + visualizer_cfg.streaming_cam_target_prim_path = "/World/envs/*/Robot/base" + # Here is an alternative eye position for a top down view + # visualizer_cfg.streaming_cam_eye = (0.0, 0.0, 5.0) + return visualizer_cfg + + +def _make_newton_visualizer_cfg(env_cfg): + """Create the Newton streaming-camera visualizer for the selected task.""" + from isaaclab_visualizers.newton import NewtonGLVisualizerCfg + + visualizer_cfg = NewtonGLVisualizerCfg() + visualizer_cfg.streaming_view = True + visualizer_cfg.streaming_envs = 12 + + ego_cam_cfg = getattr(env_cfg.scene, "ego_cam", None) + if ego_cam_cfg is not None: + visualizer_cfg.streaming_sensor_prim_path = _resolve_env_regex_path(ego_cam_cfg.prim_path) + return visualizer_cfg + + # Here are other robot mounted camera options for this environment + # visualizer_cfg.streaming_sensor_prim_path = "/World/envs/env_.*/Robot/left_arm_camera_sim_view_frame/left_camera" + # visualizer_cfg.streaming_sensor_prim_path = ( + # "/World/envs/env_.*/Robot/right_arm_camera_sim_view_frame/right_camera" + # ) + visualizer_cfg.streaming_sensor_prim_path = None + visualizer_cfg.streaming_cam_eye = (3.0, 3.0, 3.0) + visualizer_cfg.streaming_cam_target_prim_path = "/World/envs/*/Robot/base" + return visualizer_cfg + + +def _configure_visualizers(env_cfg, args_cli: argparse.Namespace) -> None: + """Attach tiled camera visualizer configs to the environment simulation config.""" + visualizers = _requested_visualizers(args_cli) + args_cli.visualizer = visualizers + env_cfg.sim.visualizer_cfgs = [ + _make_kit_visualizer_cfg(env_cfg) if visualizer == "kit" else _make_newton_visualizer_cfg(env_cfg) + for visualizer in visualizers + ] + + +def _resolve_task(args_cli: argparse.Namespace) -> str: + """Resolve the task for the selected visualizer.""" + if args_cli.task is not None: + return args_cli.task + if "newton" in _requested_visualizers(args_cli): + return NEWTON_DEFAULT_TASK + return KIT_DEFAULT_TASK + + +# add argparse arguments +parser = argparse.ArgumentParser(description="Showcase the Kit/Newton visualizer tiled camera panel.") +parser.add_argument("--num_envs", type=int, default=None, help="Number of environments to simulate.") +parser.add_argument("--task", type=str, default=None, help="Name of the task.") +# append AppLauncher cli args +add_launcher_args(parser) +args_cli, hydra_args = setup_preset_cli(parser) +args_cli.task = _resolve_task(args_cli) +sys.argv = [sys.argv[0]] + hydra_args + + +def main(): + """Run a random-action environment with a tiled camera visualizer.""" + # parse configuration via Hydra (supports preset selection, e.g. presets=newton_mjwarp) + env_cfg, _ = resolve_task_config(args_cli.task, "") + _configure_visualizers(env_cfg, args_cli) + + with launch_simulation(env_cfg, args_cli): + # override with CLI arguments + env_cfg.scene.num_envs = args_cli.num_envs if args_cli.num_envs is not None else env_cfg.scene.num_envs + env_cfg.sim.device = args_cli.device if args_cli.device is not None else env_cfg.sim.device + + # create environment + env = gym.make(args_cli.task, cfg=env_cfg) + + # print info (this is vectorized environment) + print(f"[INFO]: Gym observation space: {env.observation_space}") + print(f"[INFO]: Gym action space: {env.action_space}") + env.reset() + + # keep stepping until all visualizer windows have been closed + sim = env.unwrapped.sim + if not sim.visualizers: + print("[WARN]: No visualizers found. Exiting.") + env.close() + return + + while True: + if sim.visualizers and not any(v.is_running() and not v.is_closed for v in sim.visualizers): + break + with torch.inference_mode(): + actions = 2 * torch.rand(env.action_space.shape, device=env.unwrapped.device) - 1 + env.step(actions) + + env.close() + + +if __name__ == "__main__": + main() diff --git a/scripts/tutorials/07_visualizers/run_video_recording.py b/scripts/tutorials/07_visualizers/run_video_recording.py new file mode 100644 index 00000000..66caad8f --- /dev/null +++ b/scripts/tutorials/07_visualizers/run_video_recording.py @@ -0,0 +1,256 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Tutorial: recording video from visualizers and scene sensors. + +This script demonstrates three progressively richer recording configurations, +all using the Shadow Hand cube-reorientation task +(``Isaac-Reorient-Cube-Shadow-Camera-Direct``). + +Example 1 — Kit viewport (simplest) + One clip from the Kit interactive viewport, showing 4 parallel environments. + + .. code-block:: bash + + uv run python scripts/tutorials/07_visualizers/run_video_recording.py \ + --example 1 --num_envs 4 + +Example 2 — scene sensor only, headless + One clip captured directly from the scene's tiled-camera sensor. + No visualizer window opens; the sensor renders offline. + + .. code-block:: bash + + uv run python scripts/tutorials/07_visualizers/run_video_recording.py \ + --example 2 --num_envs 16 + +Example 3 — Kit viewport + Kit tiled grid + Newton viewport + scene sensor + Four independent clip streams recorded simultaneously. + + .. code-block:: bash + + uv run python scripts/tutorials/07_visualizers/run_video_recording.py \ + --example 3 --num_envs 4 + +Clips are written to ``videos/recording_tutorial/example_/`` in the working directory. +Examples 1 and 2 each demonstrate one recording source; Example 3 combines all of them. +""" + +from __future__ import annotations + +import argparse +import contextlib +import os +import sys + +import gymnasium as gym +import torch + +import isaaclab_tasks # noqa: F401 + +with contextlib.suppress(ImportError): + import isaaclab_tasks_experimental # noqa: F401 + +from isaaclab.app import add_launcher_args, launch_simulation +from isaaclab.envs.utils.video_recorder_cfg import VideoRecorderCfg + +from isaaclab_tasks.utils import resolve_task_config, setup_preset_cli + +# --------------------------------------------------------------------------- +# Constants +# --------------------------------------------------------------------------- + +_VIDEO_LENGTH = 100 # env steps per clip +_NUM_STEPS = 115 # slightly more than _VIDEO_LENGTH so the clip flushes cleanly + +_TASK_SHADOW = "Isaac-Reorient-Cube-Shadow-Camera-Direct" + +# Kit viewport camera: positioned to show a 2×2 grid of Shadow Hand environments. +# env_spacing=1.0 with 4 envs → envs centered at ±0.5 in x and y. +# Cube spawns at ~(0, -0.39, 0.6) per env; wrist cylinder is the landmark at the top. +_SHADOW_EYE = (0.0, -2.2, 1.8) +_SHADOW_LOOKAT = (0.0, -0.1, 0.4) +_SHADOW_ENV_SPACING = 1.0 + +# Skip the first few steps so the RTX renderer has warmed up before recording starts. +_KIT_STEP_OFFSET = 5 + + +def _output_dir(example: int) -> str: + return os.path.join("videos", "recording_tutorial", f"example_{example}") + + +def _shadow_env_cfg(num_envs: int, env_spacing: float = _SHADOW_ENV_SPACING): + """Build a base Shadow Hand camera env cfg shared by all examples.""" + env_cfg, _ = resolve_task_config(_TASK_SHADOW, "", overrides=(*sys.argv[1:], "env.tiled_camera=rgb")) + env_cfg.tiled_camera.height = 256 + env_cfg.tiled_camera.width = 256 + env_cfg.scene.num_envs = num_envs + env_cfg.scene.env_spacing = env_spacing + return env_cfg + + +# --------------------------------------------------------------------------- +# Per-example environment config builders +# --------------------------------------------------------------------------- + + +def _build_env_cfg_example_1(num_envs: int): + """Shadow Hand + Kit viewport: one clip from the interactive viewport.""" + from isaaclab_visualizers.kit import KitVisualizerCfg + + env_cfg = _shadow_env_cfg(num_envs) + env_cfg.sim.visualizer_cfgs = [KitVisualizerCfg(eye=_SHADOW_EYE, lookat=_SHADOW_LOOKAT)] + + out = _output_dir(1) + env_cfg.video_recorders = [ + VideoRecorderCfg( + source="visualizer:kit", + output_dir=out, + output_filename_prefix="kit_viewport", + video_length=_VIDEO_LENGTH, + fps=30, + step_offset=_KIT_STEP_OFFSET, + ), + ] + return env_cfg, _TASK_SHADOW + + +def _build_env_cfg_example_2(num_envs: int): + """Shadow Hand + headless: scene tiled-camera sensor clip only.""" + env_cfg = _shadow_env_cfg(num_envs, env_spacing=2.0) + env_cfg.sim.visualizer_cfgs = [] # no interactive visualizer + + out = _output_dir(2) + env_cfg.video_recorders = [ + VideoRecorderCfg( + source="sensor:tiled_camera", + output_dir=out, + output_filename_prefix="sensor", + video_length=_VIDEO_LENGTH, + fps=30, + ), + ] + return env_cfg, _TASK_SHADOW + + +def _build_env_cfg_example_3(num_envs: int): + """Shadow Hand + Kit viewport + Kit tiled grid + Newton viewport + sensor: four simultaneous streams. + + Note: ``source='visualizer:newton'`` captures the full Newton GL window. When + ``streaming_view=True`` is set on :class:`~isaaclab_visualizers.newton.NewtonGLVisualizerCfg`, + the GL window displays the per-environment camera panel, so this effectively records + a Newton streaming view without a separate ``render_tiled_rgb_array()`` call. + """ + from isaaclab_visualizers.kit import KitVisualizerCfg + from isaaclab_visualizers.newton import NewtonGLVisualizerCfg + + env_cfg = _shadow_env_cfg(num_envs) + kit_cfg = KitVisualizerCfg( + eye=_SHADOW_EYE, + lookat=_SHADOW_LOOKAT, + streaming_view=True, + streaming_envs=min(num_envs, 16), + # No streaming_sensor_prim_path/streaming_cam_target_prim_path: adopts the existing + # tiled_camera sensor automatically, so the streaming panel shows the same + # RTX-rendered views as source="sensor:tiled_camera". + ) + newton_cfg = NewtonGLVisualizerCfg( + eye=_SHADOW_EYE, + lookat=_SHADOW_LOOKAT, + window_width=1280, + window_height=720, + focal_length=25.0, + ) + env_cfg.sim.visualizer_cfgs = [kit_cfg, newton_cfg] + + out = _output_dir(3) + env_cfg.video_recorders = [ + VideoRecorderCfg( + source="visualizer:kit", + output_dir=out, + output_filename_prefix="kit_viewport", + video_length=_VIDEO_LENGTH, + fps=30, + step_offset=_KIT_STEP_OFFSET, + ), + VideoRecorderCfg( + source="visualizer:kit:streaming_view", + output_dir=out, + output_filename_prefix="tiled_kit_viewport", + video_length=_VIDEO_LENGTH, + fps=30, + step_offset=_KIT_STEP_OFFSET, + ), + VideoRecorderCfg( + source="visualizer:newton", + output_dir=out, + output_filename_prefix="newton_viewport", + video_length=_VIDEO_LENGTH, + fps=30, + ), + VideoRecorderCfg( + source="sensor:tiled_camera", + output_dir=out, + output_filename_prefix="sensor", + video_length=_VIDEO_LENGTH, + fps=30, + ), + ] + return env_cfg, _TASK_SHADOW + + +_BUILDERS = { + 1: _build_env_cfg_example_1, + 2: _build_env_cfg_example_2, + 3: _build_env_cfg_example_3, +} + +# --------------------------------------------------------------------------- +# Argument parsing +# --------------------------------------------------------------------------- +parser = argparse.ArgumentParser(description="Video recording tutorial for Isaac Lab environments.") +parser.add_argument( + "--example", type=int, default=1, choices=[1, 2, 3], help="Which recording example to run (1, 2, or 3)." +) +parser.add_argument("--num_envs", type=int, default=None, help="Number of environments to simulate.") +add_launcher_args(parser) +args_cli, hydra_args = setup_preset_cli(parser) +sys.argv = [sys.argv[0]] + hydra_args + + +def main(): + """Run the selected video recording example.""" + defaults = {1: 4, 2: 16, 3: 4} + num_envs = args_cli.num_envs if args_cli.num_envs is not None else defaults[args_cli.example] + env_cfg, task = _BUILDERS[args_cli.example](num_envs) + env_cfg.sim.device = args_cli.device if args_cli.device is not None else env_cfg.sim.device + + # Examples 1 and 3 record from the Kit viewport via omni.replicator, which requires + # camera rendering support. Force it here for visualizer-only recording. + if args_cli.example in (1, 3): + args_cli.enable_cameras = True + + with launch_simulation(env_cfg, args_cli): + env = gym.make(task, cfg=env_cfg) + + out = _output_dir(args_cli.example) + print(f"[INFO]: Running Example {args_cli.example} — clips → {out}/") + print(f"[INFO]: Gym observation space: {env.observation_space}") + print(f"[INFO]: Gym action space: {env.action_space}") + + print("[INFO]: Setup complete.") + env.reset() + for _ in range(_NUM_STEPS): + with torch.inference_mode(): + actions = 2 * torch.rand(env.action_space.shape, device=env.unwrapped.device) - 1 + env.step(actions) + + env.close() + print(f"[INFO]: Done. Clips written to {out}/") + + +if __name__ == "__main__": + main() From 0ba08e7a545685cb83db75f72005f28c5969244c Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Mon, 28 Sep 2026 01:16:34 -0700 Subject: [PATCH 23/27] Align generic scripts with the pinned upstream APIs 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. --- scripts/environments/export_IODescriptors.py | 16 +- scripts/environments/list_envs.py | 135 ++- scripts/environments/random_agent.py | 74 +- .../state_machine/lift_cube_sm.py | 17 +- ...lift_teddy_bear.py => lift_franka_soft.py} | 240 +++--- .../state_machine/open_cabinet_sm.py | 17 +- .../teleoperation/teleop_se3_agent.py | 476 +++++++--- scripts/environments/zero_agent.py | 74 +- .../isaaclab_mimic/annotate_demos.py | 44 +- .../isaaclab_mimic/consolidated_demo.py | 18 +- .../isaaclab_mimic/generate_dataset.py | 191 +++-- .../locomanipulation_sdg/generate_data.py | 460 ++++++++-- .../plot_navigation_trajectory.py | 33 +- scripts/imitation_learning/robomimic/play.py | 64 +- .../robomimic/robust_eval.py | 40 +- scripts/imitation_learning/robomimic/train.py | 43 +- scripts/reinforcement_learning/play.py | 25 + .../ray/grok_cluster_with_kubectl.py | 11 +- .../vision_cartpole_cfg.py | 34 +- .../ray/hyperparameter_tuning/vision_cfg.py | 39 +- scripts/reinforcement_learning/ray/launch.py | 25 +- .../ray/mlflow_to_local_tensorboard.py | 6 +- .../reinforcement_learning/ray/submit_job.py | 7 +- .../reinforcement_learning/ray/task_runner.py | 112 ++- scripts/reinforcement_learning/ray/tuner.py | 75 +- scripts/reinforcement_learning/ray/util.py | 6 +- .../ray/wrap_resources.py | 16 +- .../reinforcement_learning/rsl_rl/cli_args.py | 6 +- scripts/reinforcement_learning/train.py | 30 + .../reinforcement_learning/train_multigpu.py | 17 + scripts/tools/blender_obj.py | 7 +- scripts/tools/check_instanceable.py | 54 +- scripts/tools/convert_instanceable.py | 5 +- scripts/tools/convert_mesh.py | 35 +- scripts/tools/convert_mjcf.py | 182 ++-- scripts/tools/convert_urdf.py | 152 ++-- scripts/tools/cosmos/cosmos_prompt_gen.py | 4 +- scripts/tools/hdf5_to_mp4.py | 50 +- scripts/tools/merge_hdf5_datasets.py | 8 +- scripts/tools/mp4_to_hdf5.py | 11 +- scripts/tools/pretrained_checkpoint.py | 376 -------- scripts/tools/process_meshes_to_obj.py | 4 +- scripts/tools/record_demos.py | 616 +++++++++---- scripts/tools/replay_demos.py | 275 ++++-- scripts/tools/test/test_cosmos_prompt_gen.py | 8 +- scripts/tools/test/test_hdf5_to_mp4.py | 41 +- scripts/tools/test/test_mp4_to_hdf5.py | 14 +- .../test_train_and_publish_checkpoints.py | 208 +++++ scripts/tools/test/test_uw_entrypoints.py | 67 ++ .../tools/train_and_publish_checkpoints.py | 811 ++++++++++++++++++ 50 files changed, 3673 insertions(+), 1606 deletions(-) rename scripts/environments/state_machine/{lift_teddy_bear.py => lift_franka_soft.py} (57%) create mode 100644 scripts/reinforcement_learning/play.py create mode 100644 scripts/reinforcement_learning/train.py create mode 100644 scripts/reinforcement_learning/train_multigpu.py delete mode 100644 scripts/tools/pretrained_checkpoint.py create mode 100644 scripts/tools/test/test_train_and_publish_checkpoints.py create mode 100644 scripts/tools/test/test_uw_entrypoints.py create mode 100644 scripts/tools/train_and_publish_checkpoints.py diff --git a/scripts/environments/export_IODescriptors.py b/scripts/environments/export_IODescriptors.py index ba573365..ac39aa7e 100644 --- a/scripts/environments/export_IODescriptors.py +++ b/scripts/environments/export_IODescriptors.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -8,6 +8,7 @@ """Launch Isaac Sim Simulator first.""" import argparse +import contextlib import os from isaaclab.app import AppLauncher @@ -18,8 +19,8 @@ parser.add_argument("--output_dir", type=str, default=None, help="Path to the output directory.") # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) -# parse the arguments -args_cli = parser.parse_args() +# parse the arguments, forwarding unrecognized ones as Hydra-style task config overrides +args_cli, hydra_overrides = parser.parse_known_args() args_cli.headless = True # launch omniverse app @@ -33,6 +34,9 @@ import isaaclab_tasks # noqa: F401 import uwlab_tasks # noqa: F401 + +with contextlib.suppress(ImportError): + import isaaclab_tasks_experimental # noqa: F401 from isaaclab_tasks.utils import parse_env_cfg # PLACEHOLDER: Extension template (do not remove this comment) @@ -41,7 +45,9 @@ def main(): """Random actions agent with Isaac Lab environment.""" # create environment configuration - env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=1, use_fabric=True) + env_cfg = parse_env_cfg( + args_cli.task, device=args_cli.device, num_envs=1, use_fabric=True, overrides=hydra_overrides + ) # create environment env = gym.make(args_cli.task, cfg=env_cfg) diff --git a/scripts/environments/list_envs.py b/scripts/environments/list_envs.py index 5c074388..5fd1b13e 100644 --- a/scripts/environments/list_envs.py +++ b/scripts/environments/list_envs.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -9,20 +9,28 @@ The script iterates over all registered environments and stores the details in a table. It prints the name of the environment, the entry point and the config file. -All the environments are registered in the `isaaclab_tasks` extension. They start -with `Isaac` in their name. +Environments are registered by the `isaaclab_tasks` and `uwlab_tasks` extensions. +Isaac Lab, UWLab, and OmniReset task names are included. """ -"""Launch Isaac Sim Simulator first.""" - -from isaaclab.app import AppLauncher - -# launch omniverse app -app_launcher = AppLauncher(headless=True) -simulation_app = app_launcher.app - - -"""Rest everything follows.""" +import argparse +import contextlib + +# add argparse arguments +parser = argparse.ArgumentParser(description="List Isaac Lab environments.") +parser.add_argument("--keyword", type=str, default=None, help="Keyword to filter environments.") +parser.add_argument( + "--show_presets", + action="store_true", + default=False, + help=( + "Show available preset selectors for each environment. " + "Presets are grouped by selector type: physics (physics=NAME), " + "renderer (renderer=NAME), and domain (presets=NAME)." + ), +) +# parse the arguments +args_cli = parser.parse_args() import gymnasium as gym from prettytable import PrettyTable @@ -30,36 +38,83 @@ import isaaclab_tasks # noqa: F401 import uwlab_tasks # noqa: F401 +# PLACEHOLDER: Extension template (do not remove this comment) +with contextlib.suppress(ImportError): + import isaaclab_tasks_experimental # noqa: F401 + + +def _format_presets(preset_map: dict | None) -> str: + """Format a preset map returned by :func:`enumerate_task_presets` into a human-readable string. + + Args: + preset_map: Mapping of :class:`~isaaclab_tasks.utils.preset_target.PresetTarget` + to sorted preset name lists, or ``None`` when the env cfg could not be loaded. + + Returns: + A multi-line string with one line per non-empty selector category, or a + short placeholder when no presets are available or the cfg failed to load. + """ + if preset_map is None: + return "(unavailable)" + from isaaclab_tasks.utils.preset_target import PresetTarget + + lines = [] + labels = { + PresetTarget.PHYSICS: "physics", + PresetTarget.RENDERER: "renderer", + PresetTarget.DOMAIN: "domain", + } + for target, label in labels.items(): + names = preset_map.get(target, []) + if names: + lines.append(f"{label}: {', '.join(names)}") + return "\n".join(lines) if lines else "(none)" + def main(): - """Print all environments registered in `isaaclab_tasks` extension.""" - # print all the available environments - table = PrettyTable(["S. No.", "Task Name", "Entry Point", "Config"]) - table.title = "Available Environments in Isaac Lab" - # set alignment of table columns - table.align["Task Name"] = "l" - table.align["Entry Point"] = "l" - table.align["Config"] = "l" - - # count of environments - index = 0 - # acquire all Isaac environments names - for task_spec in gym.registry.values(): - if "Isaac" in task_spec.id: - # add details to table - table.add_row([index + 1, task_spec.id, task_spec.entry_point, task_spec.kwargs["env_cfg_entry_point"]]) - # increment count - index += 1 + """Print registered Isaac Lab and UWLab environments.""" + # Collect matching task specs first so we can enumerate presets in one pass. + task_specs = [ + spec + for spec in gym.registry.values() + if ("Isaac" in spec.id or spec.id.startswith(("UW-", "OmniReset-"))) + and not spec.kwargs.get("deprecated") + and (args_cli.keyword is None or args_cli.keyword in spec.id) + ] + + if args_cli.show_presets: + from isaaclab_tasks.utils.preset_cli import enumerate_task_presets + + table = PrettyTable(["S. No.", "Task Name", "Entry Point", "Config", "Presets"]) + table.title = "Available Environments in Isaac Lab and UWLab" + table.align["Task Name"] = "l" + table.align["Entry Point"] = "l" + table.align["Config"] = "l" + table.align["Presets"] = "l" + + for index, spec in enumerate(task_specs): + preset_map = enumerate_task_presets(spec.id) + table.add_row( + [ + index + 1, + spec.id, + spec.entry_point, + spec.kwargs["env_cfg_entry_point"], + _format_presets(preset_map), + ] + ) + else: + table = PrettyTable(["S. No.", "Task Name", "Entry Point", "Config"]) + table.title = "Available Environments in Isaac Lab and UWLab" + table.align["Task Name"] = "l" + table.align["Entry Point"] = "l" + table.align["Config"] = "l" + + for index, spec in enumerate(task_specs): + table.add_row([index + 1, spec.id, spec.entry_point, spec.kwargs["env_cfg_entry_point"]]) print(table) if __name__ == "__main__": - try: - # run the main function - main() - except Exception as e: - raise e - finally: - # close the app - simulation_app.close() + main() diff --git a/scripts/environments/random_agent.py b/scripts/environments/random_agent.py index bec9817e..332b0f6f 100644 --- a/scripts/environments/random_agent.py +++ b/scripts/environments/random_agent.py @@ -1,73 +1,29 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause -"""Script to an environment with random action agent.""" +"""Random-action agent executable for Isaac Lab environments.""" -"""Launch Isaac Sim Simulator first.""" - -import argparse - -from isaaclab.app import AppLauncher - -# add argparse arguments -parser = argparse.ArgumentParser(description="Random agent for Isaac Lab environments.") -parser.add_argument( - "--disable_fabric", action="store_true", default=False, help="Disable fabric and use USD I/O operations." -) -parser.add_argument("--num_envs", type=int, default=None, help="Number of environments to simulate.") -parser.add_argument("--task", type=str, default=None, help="Name of the task.") -# append AppLauncher cli args -AppLauncher.add_app_launcher_args(parser) -# parse the arguments -args_cli = parser.parse_args() +# PLACEHOLDER: Extension template (do not remove this comment) -# launch omniverse app -app_launcher = AppLauncher(args_cli) -simulation_app = app_launcher.app +# Warp captures ``enable_backward`` when a module is created, which happens at import +# time, so it has to be set before importing anything that defines Warp kernels. +# Isaac Lab does not use Warp autodiff; skipping adjoint codegen roughly halves the +# time spent building kernels on a cold kernel cache. +import warp as wp -"""Rest everything follows.""" +wp.config.enable_backward = False -import gymnasium as gym -import torch +from isaaclab_rl.entrypoints import run_random_agent_cli # noqa: E402 -import isaaclab_tasks # noqa: F401 import uwlab_tasks # noqa: F401 -from isaaclab_tasks.utils import parse_env_cfg - -# PLACEHOLDER: Extension template (do not remove this comment) - - -def main(): - """Random actions agent with Isaac Lab environment.""" - # create environment configuration - env_cfg = parse_env_cfg( - args_cli.task, device=args_cli.device, num_envs=args_cli.num_envs, use_fabric=not args_cli.disable_fabric - ) - # create environment - env = gym.make(args_cli.task, cfg=env_cfg) - # print info (this is vectorized environment) - print(f"[INFO]: Gym observation space: {env.observation_space}") - print(f"[INFO]: Gym action space: {env.action_space}") - # reset environment - env.reset() - # simulate environment - while simulation_app.is_running(): - # run everything in inference mode - with torch.inference_mode(): - # sample actions from -1 to 1 - actions = 2 * torch.rand(env.action_space.shape, device=env.unwrapped.device) - 1 - # apply actions - env.step(actions) - # close the simulator - env.close() +def main(argv: list[str] | None = None) -> int: + """Run an environment with a random-action agent.""" + return run_random_agent_cli(argv) if __name__ == "__main__": - # run the main function - main() - # close sim app - simulation_app.close() + raise SystemExit(main()) diff --git a/scripts/environments/state_machine/lift_cube_sm.py b/scripts/environments/state_machine/lift_cube_sm.py index 4300de02..dd1e9774 100644 --- a/scripts/environments/state_machine/lift_cube_sm.py +++ b/scripts/environments/state_machine/lift_cube_sm.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -11,7 +11,7 @@ .. code-block:: bash - ./isaaclab.sh -p scripts/environments/state_machine/lift_cube_sm.py --num_envs 32 --viz kit + uv run python scripts/environments/state_machine/lift_cube_sm.py --num_envs 32 --viz kit """ @@ -29,8 +29,8 @@ parser.add_argument("--num_envs", type=int, default=None, help="Number of environments to simulate.") # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) -# parse the arguments -args_cli = parser.parse_args() +# parse the arguments, forwarding unrecognized ones as Hydra-style task config overrides +args_cli, hydra_overrides = parser.parse_known_args() # launch omniverse app app_launcher = AppLauncher(args_cli) @@ -47,7 +47,7 @@ from isaaclab.assets.rigid_object.rigid_object_data import RigidObjectData import isaaclab_tasks # noqa: F401 -from isaaclab_tasks.manager_based.manipulation.lift.lift_env_cfg import LiftEnvCfg +from isaaclab_tasks.contrib.lift.lift_env_cfg import LiftEnvCfg from isaaclab_tasks.utils.parse_cfg import parse_env_cfg # initialize warp @@ -253,13 +253,14 @@ def compute(self, ee_pose: torch.Tensor, object_pose: torch.Tensor, des_object_p def main(): # parse configuration env_cfg: LiftEnvCfg = parse_env_cfg( - "Isaac-Lift-Cube-Franka-IK-Abs-v0", + "IsaacContrib-Lift-Cube-Franka-IK-Abs", device=args_cli.device, num_envs=args_cli.num_envs, use_fabric=not args_cli.disable_fabric, + overrides=hydra_overrides, ) # create environment - env = gym.make("Isaac-Lift-Cube-Franka-IK-Abs-v0", cfg=env_cfg) + env = gym.make("IsaacContrib-Lift-Cube-Franka-IK-Abs", cfg=env_cfg) # reset environment at start env.reset() diff --git a/scripts/environments/state_machine/lift_teddy_bear.py b/scripts/environments/state_machine/lift_franka_soft.py similarity index 57% rename from scripts/environments/state_machine/lift_teddy_bear.py rename to scripts/environments/state_machine/lift_franka_soft.py index 5b70c24b..9e50bfca 100644 --- a/scripts/environments/state_machine/lift_teddy_bear.py +++ b/scripts/environments/state_machine/lift_franka_soft.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -11,46 +11,39 @@ .. code-block:: bash - ./isaaclab.sh -p scripts/environments/state_machine/lift_teddy_bear.py + # Kitless run with the Newton OpenGL viewer (default). + uv run python scripts/environments/state_machine/lift_franka_soft.py -""" + # Headless. + uv run python scripts/environments/state_machine/lift_franka_soft.py --viz none -"""Launch Omniverse Toolkit first.""" +""" import argparse - -from isaaclab.app import AppLauncher - -# add argparse arguments -parser = argparse.ArgumentParser(description="Pick and lift a teddy bear with a robotic arm.") -parser.add_argument("--num_envs", type=int, default=1, help="Number of environments to simulate.") -# append AppLauncher cli args -AppLauncher.add_app_launcher_args(parser) -# parse the arguments -args_cli = parser.parse_args() - -# launch omniverse app -app_launcher = AppLauncher(headless=args_cli.headless) -simulation_app = app_launcher.app - -# disable metrics assembler due to scene graph instancing -from isaacsim.core.experimental.utils.app import enable_extension - -enable_extension("omni.usd.metrics.assembler.ui", enabled=False) - -"""Rest everything else.""" - +import sys from collections.abc import Sequence import gymnasium as gym import torch import warp as wp -from isaaclab.assets.rigid_object.rigid_object_data import RigidObjectData +from isaaclab.app import add_launcher_args, launch_simulation +from isaaclab.assets.deformable_object.deformable_object_data import DeformableObjectData +from isaaclab.visualizers import VisualizerCfg import isaaclab_tasks # noqa: F401 -from isaaclab_tasks.manager_based.manipulation.lift.lift_env_cfg import LiftEnvCfg -from isaaclab_tasks.utils.parse_cfg import parse_env_cfg +from isaaclab_tasks.utils import resolve_task_config, setup_preset_cli + +# add argparse arguments +parser = argparse.ArgumentParser(description="Pick and lift a deformable with a robotic arm.") +parser.add_argument("--num_envs", type=int, default=1, help="Number of environments to simulate.") +parser.add_argument("--num_steps", type=int, default=1000, help="Number of environment steps to run.") +parser.add_argument("--task", type=str, default="Isaac-Lift-Soft-Franka", help="The task to run.") +add_launcher_args(parser) +# the task runs on Newton, so default to the kitless viewer +parser.set_defaults(visualizer=["newton"]) +args_cli, hydra_args = setup_preset_cli(parser) +sys.argv = [sys.argv[0]] + hydra_args # initialize warp wp.init() @@ -74,17 +67,6 @@ class PickSmState: OPEN_GRIPPER = wp.constant(5) -class PickSmWaitTime: - """Additional wait times (in s) for states for before switching.""" - - REST = wp.constant(0.2) - APPROACH_ABOVE_OBJECT = wp.constant(0.5) - APPROACH_OBJECT = wp.constant(0.6) - GRASP_OBJECT = wp.constant(0.6) - LIFT_OBJECT = wp.constant(1.0) - OPEN_GRIPPER = wp.constant(0.0) - - @wp.func def distance_below_threshold(current_pos: wp.vec3, desired_pos: wp.vec3, threshold: float) -> bool: return wp.length(current_pos - desired_pos) < threshold @@ -175,6 +157,20 @@ def infer_state_machine( sm_wait_time[tid] = sm_wait_time[tid] + dt[tid] +class PickSmWaitTime: + """Additional wait times (in s) for states for before switching. + + Wait times are generous because the low-PD Franka takes a while to settle on each IK target. + """ + + REST = wp.constant(0.2) + APPROACH_ABOVE_OBJECT = wp.constant(1.0) + APPROACH_OBJECT = wp.constant(1.5) + GRASP_OBJECT = wp.constant(1.5) + LIFT_OBJECT = wp.constant(1.5) + OPEN_GRIPPER = wp.constant(0.0) + + class PickAndLiftSm: """A simple state machine in a robot's task space to pick and lift an object. @@ -190,7 +186,7 @@ class PickAndLiftSm: 5. LIFT_OBJECT: The robot lifts the object to the desired pose. This is the final state. """ - def __init__(self, dt: float, num_envs: int, device: torch.device | str = "cpu", position_threshold=0.01): + def __init__(self, dt: float, num_envs: int, device: torch.device | str = "cpu", position_threshold=0.03): """Initialize the state machine. Args: @@ -214,7 +210,7 @@ def __init__(self, dt: float, num_envs: int, device: torch.device | str = "cpu", # approach above object offset self.offset = torch.zeros((self.num_envs, 7), device=self.device) - self.offset[:, 2] = 0.2 + self.offset[:, 2] = 0.1 self.offset[:, -1] = 1.0 # warp expects quaternion as (x, y, z, w) # convert to warp @@ -264,74 +260,98 @@ def compute(self, ee_pose: torch.Tensor, object_pose: torch.Tensor, des_object_p def main(): - # parse configuration - env_cfg: LiftEnvCfg = parse_env_cfg( - "Isaac-Lift-Teddy-Bear-Franka-IK-Abs-v0", - device=args_cli.device, - num_envs=args_cli.num_envs, - ) - - env_cfg.viewer.eye = (2.1, 1.0, 1.3) - - # create environment - env = gym.make("Isaac-Lift-Teddy-Bear-Franka-IK-Abs-v0", cfg=env_cfg) - # reset environment at start - env.reset() - - # create action buffers (position + quaternion) - actions = torch.zeros(env.unwrapped.action_space.shape, device=env.unwrapped.device) - actions[:, 3] = 1.0 - # desired rotation after grasping - desired_orientation = torch.zeros((env.unwrapped.num_envs, 4), device=env.unwrapped.device) - desired_orientation[:, 1] = 1.0 - - object_grasp_orientation = torch.zeros((env.unwrapped.num_envs, 4), device=env.unwrapped.device) - # z-axis pointing down and 45 degrees rotation - object_grasp_orientation[:, 1] = 0.9238795 - object_grasp_orientation[:, 2] = -0.3826834 - object_local_grasp_position = torch.tensor([0.02, -0.08, 0.0], device=env.unwrapped.device) - - # create state machine - pick_sm = PickAndLiftSm(env_cfg.sim.dt * env_cfg.decimation, env.unwrapped.num_envs, env.unwrapped.device) - - while simulation_app.is_running(): - # run everything in inference mode - with torch.inference_mode(): - # step environment - dones = env.step(actions)[-2] - - # observations - # -- end-effector frame - ee_frame_sensor = env.unwrapped.scene["ee_frame"] - tcp_rest_position = ( - ee_frame_sensor.data.target_pos_w.torch[..., 0, :].clone() - env.unwrapped.scene.env_origins - ) - tcp_rest_orientation = ee_frame_sensor.data.target_quat_w.torch[..., 0, :].clone() - # -- object frame - object_data: RigidObjectData = env.unwrapped.scene["object"].data - object_position = object_data.root_pos_w.torch - env.unwrapped.scene.env_origins - object_position += object_local_grasp_position - - # -- target object frame - desired_position = env.unwrapped.command_manager.get_command("object_pose")[..., :3] - - # advance state machine - actions = pick_sm.compute( - torch.cat([tcp_rest_position, tcp_rest_orientation], dim=-1), - torch.cat([object_position, object_grasp_orientation], dim=-1), - torch.cat([desired_position, desired_orientation], dim=-1), - ) - - # reset state machine - if dones.any(): - pick_sm.reset_idx(dones.nonzero(as_tuple=False).squeeze(-1)) - - # close the environment - env.close() + # parse configuration via Hydra, so presets can be selected on the CLI (e.g. presets=isaacsim_physx) + env_cfg, _ = resolve_task_config(args_cli.task, "") + env_cfg.sim.device = args_cli.device + env_cfg.scene.num_envs = args_cli.num_envs + # Scripted demo: keep only the time-out, extended to 10 s so the slow low-PD Franka can finish a + # pick-and-lift, and drop the failure terminations so a transient bound or velocity spike does + # not cut a run short. + env_cfg.episode_length_s = 10.0 + for term_name in list(vars(env_cfg.terminations)): + if term_name != "time_out": + setattr(env_cfg.terminations, term_name, None) + # the state machine emits absolute end-effector poses, so pick the task's own IK action preset + # (e.g. the cloth closes the gripper fully); the env otherwise defaults to relative joint + # targets, which RL trains on. + env_cfg.actions = type(env_cfg)().actions.ik + env_cfg.viewer.eye = (1.3, 0.6, 0.5) + env_cfg.viewer.lookat = (0.5, 0.0, 0.05) + env_cfg.sim.default_visualizer_cfg = VisualizerCfg(eye=env_cfg.viewer.eye, lookat=env_cfg.viewer.lookat) + + with launch_simulation(env_cfg, args_cli): + env = gym.make(args_cli.task, cfg=env_cfg) + is_cable = "cable" in env.unwrapped.scene.keys() + + # reset environment at start + env.reset() + + # create action buffers (position + quaternion) + actions = torch.zeros(env.unwrapped.action_space.shape, device=env.unwrapped.device) + actions[:, 3] = 1.0 + # desired rotation after grasping + desired_orientation = torch.zeros((env.unwrapped.num_envs, 4), device=env.unwrapped.device) + desired_orientation[:, 0] = 1.0 + + # Top-down approach: identity quaternion (wxyz, w=1) aligns panda_hand with the Franka root, + # giving the canonical top-down grasp pose. The bar lies along world-X, so the gripper + # closes across its short side without any wrist twist. + object_grasp_orientation = torch.zeros((env.unwrapped.num_envs, 4), device=env.unwrapped.device) + object_grasp_orientation[:, 0] = 1.0 + # Grasp 1 cm below the deformable's centre of mass, so the fingers close around its lower half. + # The cloth drapes over a support cube, so its COM sits well below the graspable fold; reach + # 8 cm higher to close on the raised cloth instead of the table. + grasp_z = -0.01 + (0.08 if "Cloth" in args_cli.task else 0.0) + object_local_grasp_position = torch.tensor([0.0, 0.0, grasp_z], device=env.unwrapped.device) + + # create state machine + pick_sm = PickAndLiftSm(env_cfg.sim.dt * env_cfg.decimation, env.unwrapped.num_envs, env.unwrapped.device) + + for _ in range(args_cli.num_steps): + # run everything in inference mode + with torch.inference_mode(): + # step environment + _, _, terminated, time_outs, _ = env.step(actions) + dones = terminated | time_outs + + # reset state machine + if dones.any(): + pick_sm.reset_idx(dones.nonzero(as_tuple=False).squeeze(-1)) + + # observations + # -- end-effector frame + ee_frame_sensor = env.unwrapped.scene["ee_frame"] + tcp_rest_position = ( + ee_frame_sensor.data.target_pos_w.torch[..., 0, :].clone() - env.unwrapped.scene.env_origins + ) + tcp_rest_orientation = ee_frame_sensor.data.target_quat_w.torch[..., 0, :].clone() + # -- object frame + if is_cable: + segment_index = env_cfg.commands.cable_pose.segment_index + object_position = ( + env.unwrapped.scene["cable"].data.segment_pose_w.torch[:, segment_index, :3] + - env.unwrapped.scene.env_origins + ) + command_name = "cable_pose" + else: + object_data: DeformableObjectData = env.unwrapped.scene["deformable"].data + object_position = object_data.root_pos_w.torch - env.unwrapped.scene.env_origins + object_position += object_local_grasp_position + command_name = "deformable_pose" + + # -- target object frame + desired_position = env.unwrapped.command_manager.get_command(command_name)[..., :3] + + # advance state machine + actions = pick_sm.compute( + torch.cat([tcp_rest_position, tcp_rest_orientation], dim=-1), + torch.cat([object_position, object_grasp_orientation], dim=-1), + torch.cat([desired_position, desired_orientation], dim=-1), + ) + + # close the environment + env.close() if __name__ == "__main__": - # run the main function main() - # close sim app - simulation_app.close() diff --git a/scripts/environments/state_machine/open_cabinet_sm.py b/scripts/environments/state_machine/open_cabinet_sm.py index 00e6c282..68710111 100644 --- a/scripts/environments/state_machine/open_cabinet_sm.py +++ b/scripts/environments/state_machine/open_cabinet_sm.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -11,7 +11,7 @@ .. code-block:: bash - ./isaaclab.sh -p scripts/environments/state_machine/open_cabinet_sm.py --num_envs 32 --viz kit + uv run python scripts/environments/state_machine/open_cabinet_sm.py --num_envs 32 --viz kit """ @@ -29,8 +29,8 @@ parser.add_argument("--num_envs", type=int, default=None, help="Number of environments to simulate.") # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) -# parse the arguments -args_cli = parser.parse_args() +# parse the arguments, forwarding unrecognized ones as Hydra-style task config overrides +args_cli, hydra_overrides = parser.parse_known_args() # launch omniverse app app_launcher = AppLauncher(args_cli) @@ -47,7 +47,7 @@ from isaaclab.sensors import FrameTransformer import isaaclab_tasks # noqa: F401 -from isaaclab_tasks.manager_based.manipulation.cabinet.cabinet_env_cfg import CabinetEnvCfg +from isaaclab_tasks.core.cabinet.cabinet_env_cfg import CabinetEnvCfg from isaaclab_tasks.utils.parse_cfg import parse_env_cfg # initialize warp @@ -272,13 +272,14 @@ def compute(self, ee_pose: torch.Tensor, handle_pose: torch.Tensor): def main(): # parse configuration env_cfg: CabinetEnvCfg = parse_env_cfg( - "Isaac-Open-Drawer-Franka-IK-Abs-v0", + "IsaacContrib-Open-Drawer-Franka-IK-Abs", device=args_cli.device, num_envs=args_cli.num_envs, use_fabric=not args_cli.disable_fabric, + overrides=hydra_overrides, ) # create environment - env = gym.make("Isaac-Open-Drawer-Franka-IK-Abs-v0", cfg=env_cfg) + env = gym.make("IsaacContrib-Open-Drawer-Franka-IK-Abs", cfg=env_cfg) # reset environment at start env.reset() diff --git a/scripts/environments/teleoperation/teleop_se3_agent.py b/scripts/environments/teleoperation/teleop_se3_agent.py index 43dfeb25..24532be4 100644 --- a/scripts/environments/teleoperation/teleop_se3_agent.py +++ b/scripts/environments/teleoperation/teleop_se3_agent.py @@ -1,85 +1,256 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause -"""Script to run a keyboard teleoperation with Isaac Lab manipulation environments.""" +"""Script to run teleoperation with Isaac Lab manipulation environments. + +Supports multiple input devices (e.g., keyboard, spacemouse, gamepad) and devices +configured within the environment (including OpenXR-based hand tracking or motion +controllers). + +This script supports two teleoperation stacks: +1. Native Isaac Lab teleop stack (via teleop_devices in env_cfg) +2. IsaacTeleop-based stack (via isaac_teleop in env_cfg) + +The script automatically detects which stack to use based on the environment config. +""" """Launch Isaac Sim Simulator first.""" +# Isaac Lab does not use Warp autodiff; skipping adjoint codegen roughly halves the +# time spent building kernels on a cold kernel cache. +import warp as wp + +wp.config.enable_backward = False + import argparse +import sys from collections.abc import Callable from isaaclab.app import AppLauncher +from isaaclab.utils.string import list_intersection, string_to_callable + +from isaaclab_tasks.utils import setup_preset_cli # add argparse arguments -parser = argparse.ArgumentParser(description="Keyboard teleoperation for Isaac Lab environments.") +parser = argparse.ArgumentParser(description="Teleoperation for Isaac Lab environments.") parser.add_argument("--num_envs", type=int, default=1, help="Number of environments to simulate.") parser.add_argument( "--teleop_device", type=str, - default="keyboard", + default=None, help=( - "Teleop device. Set here (legacy) or via the environment config. If using the environment config, pass the" - " device key/name defined under 'teleop_devices' (it can be a custom name, not necessarily 'handtracking')." - " Built-ins: keyboard, spacemouse, gamepad. Not all tasks support all built-ins." + "Legacy teleop device name. When omitted, the IsaacTeleop pipeline is used if configured in the env," + " otherwise keyboard is used as fallback. When explicitly provided, the script uses the legacy" + " teleop_devices path and looks up this name in env_cfg.teleop_devices.devices." ), ) parser.add_argument("--task", type=str, default=None, help="Name of the task.") parser.add_argument("--sensitivity", type=float, default=1.0, help="Sensitivity factor.") parser.add_argument( - "--enable_pinocchio", + "--cloudxr_env", + type=str, + default=None, + help=( + "Path to a CloudXR .env file, or a shorthand: 'cloudxrjs' (Quest/Pico), 'avp' (Apple Vision Pro)," + " or 'standalone' (headless, no XR client). Set to 'none' to disable CloudXR auto-launch entirely." + " When unset, defaults to 'cloudxrjs' with --xr and 'standalone' without --xr." + ), +) +parser.add_argument( + "--auto_launch_cloudxr", + action=argparse.BooleanOptionalAction, + default=True, + help="Auto-launch the CloudXR runtime when --cloudxr_env is set. Use --no-auto_launch_cloudxr to disable.", +) +parser.add_argument( + "--enable_debug_visualization", action="store_true", default=False, - help="Enable Pinocchio.", + help="Enable hand joint and controller aim debug visualization at session start (IsaacTeleop only).", +) +parser.add_argument( + "--external_callback", + default=None, + help="Fully qualified path to an externally defined callback.", ) +parser.add_argument( + "--disable_external_cameras", + action="store_true", + default=False, + help=( + "Disable external camera rendering. External cameras render by default for teleoperation;" + " pass this flag to strip camera sensors from the environment (e.g. to reduce GPU contention" + " and improve XR performance)." + ), +) + # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) # parse the arguments -args_cli = parser.parse_args() +args_cli, hydra_args = setup_preset_cli(parser) app_launcher_args = vars(args_cli) -if args_cli.enable_pinocchio: - # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and - # not the one installed by Isaac Sim pinocchio is required by the Pink IK controllers and the - # GR1T2 retargeter - import pinocchio # noqa: F401 -if "handtracking" in args_cli.teleop_device.lower(): - app_launcher_args["xr"] = True - -# launch omniverse app -app_launcher = AppLauncher(app_launcher_args) +# Enable external camera rendering by default (``--disable_external_cameras`` turns it off). The +# ``--enable_cameras`` CLI flag was removed in Isaac Lab 3.0 (see #6656), so pass the intent to +# AppLauncher as a kwarg; this selects a camera-rendering experience that provides RTX/DLSS support. +# Everywhere else we read ``args_cli.disable_external_cameras`` directly. +app_launcher = AppLauncher(app_launcher_args, enable_cameras=not args_cli.disable_external_cameras) simulation_app = app_launcher.app +# Call an external callback if requested. +remaining_args_env_registration = None +if args_cli.external_callback: + external_callback_function = string_to_callable(args_cli.external_callback, separator=".") + remaining_args_env_registration = external_callback_function() + +# Hand arguments consumed by neither this parser nor the callback over to Hydra. +hydra_args = list_intersection(hydra_args, remaining_args_env_registration) +sys.argv = [sys.argv[0]] + hydra_args + """Rest everything follows.""" -import gymnasium as gym import logging + +import gymnasium as gym import torch +from isaaclab_physx.renderers import IsaacRtxRendererGlobalSettingsCfg +from isaaclab_physx.renderers.isaac_rtx_renderer_utils import ( + apply_isaac_rtx_global_settings, +) from isaaclab.devices import Se3Gamepad, Se3GamepadCfg, Se3Keyboard, Se3KeyboardCfg, Se3SpaceMouse, Se3SpaceMouseCfg from isaaclab.devices.openxr import remove_camera_configs from isaaclab.devices.teleop_device_factory import create_teleop_device +from isaaclab.envs import ManagerBasedRLEnvCfg from isaaclab.managers import TerminationTermCfg as DoneTerm import isaaclab_tasks # noqa: F401 import uwlab_tasks # noqa: F401 -from isaaclab_tasks.manager_based.manipulation.lift import mdp -from isaaclab_tasks.utils import parse_env_cfg - -if args_cli.enable_pinocchio: - import isaaclab_tasks.manager_based.locomanipulation.pick_place # noqa: F401 - import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 +from isaaclab_tasks.core.lift import mdp +from isaaclab_tasks.utils import resolve_task_config -# import logger logger = logging.getLogger(__name__) +_CLOUDXR_ENV_SHORTHANDS: dict[str, str] = {} + -def main() -> None: +def _resolve_cloudxr_env(value: str | None, xr_enabled: bool = False) -> str | None: + """Resolve ``--cloudxr_env`` shorthands to absolute ``.env`` file paths. + + Accepts ``"cloudxrjs"`` (Quest/Pico), ``"avp"`` (Apple Vision Pro), + ``"standalone"`` (headless, no XR client), ``"none"`` (disable), or an + arbitrary file path. When *value* is ``None`` (flag unset), defaults to + ``"cloudxrjs"`` when *xr_enabled* else ``"standalone"`` -- so a run without + ``--xr`` uses the clientless headless profile. """ - Run keyboard teleoperation with Isaac Lab manipulation environment. + if value is None: + value = "cloudxrjs" if xr_enabled else "standalone" + if value.strip() == "" or value.lower() == "none": + return None + if not _CLOUDXR_ENV_SHORTHANDS: + from isaaclab_teleop import CLOUDXR_AVP_ENV, CLOUDXR_JS_ENV, CLOUDXR_STANDALONE_ENV + + _CLOUDXR_ENV_SHORTHANDS["cloudxrjs"] = CLOUDXR_JS_ENV + _CLOUDXR_ENV_SHORTHANDS["avp"] = CLOUDXR_AVP_ENV + _CLOUDXR_ENV_SHORTHANDS["standalone"] = CLOUDXR_STANDALONE_ENV + return _CLOUDXR_ENV_SHORTHANDS.get(value.lower(), value) + + +def _rtx_rendering_requested(args: argparse.Namespace) -> bool: + """Return whether the CLI selects a renderer that actually drives RTX rendering. + + The RTX/DLSS global settings are only meaningful when something renders through RTX. + That happens when the Kit visualizer is enabled (``--viz kit``), when external cameras + are rendered (on by default; see ``--disable_external_cameras``), or in XR mode (``--xr``). + A pure-headless session with none of these renders nothing. + + This reads the resolved namespace intent rather than any Kit/carb runtime state so the + check keeps working as these scripts grow support for other renderers and kitless runs. + """ + visualizers = getattr(args, "visualizer", None) or [] + external_cameras = not getattr(args, "disable_external_cameras", False) + return external_cameras or ("kit" in visualizers) or bool(getattr(args, "xr", False)) + + +def _ensure_replicator_loaded() -> None: + """Enable ``omni.replicator.core`` so RTX/DLSS global settings can be applied. + + :func:`apply_isaac_rtx_global_settings` sets the antialiasing mode through + ``omni.replicator.core``, which ships with the SDG/rendering extensions. Some Kit + experiences (e.g. the Kit-viewport-only app selected by ``--visualizer kit`` without + cameras or XR) do not preload it, so enable it on demand via the extension manager + before applying RTX settings. Idempotent when the extension is already enabled. + """ + import omni.kit.app + + omni.kit.app.get_app().get_extension_manager().set_extension_enabled_immediate("omni.replicator.core", True) + + +def _create_builtin_device(device_name: str, sensitivity: float) -> object | None: + """Create a built-in teleop device by name, or return None if unrecognized.""" + name = device_name.lower() + if name == "keyboard": + return Se3Keyboard(Se3KeyboardCfg(pos_sensitivity=0.05 * sensitivity, rot_sensitivity=0.05 * sensitivity)) + elif name == "spacemouse": + return Se3SpaceMouse(Se3SpaceMouseCfg(pos_sensitivity=0.05 * sensitivity, rot_sensitivity=0.05 * sensitivity)) + elif name == "gamepad": + return Se3Gamepad(Se3GamepadCfg(pos_sensitivity=0.1 * sensitivity, rot_sensitivity=0.1 * sensitivity)) + return None + + +def _make_haptic_io(env, teleop_interface, env_cfg, use_isaac_teleop: bool): + """Return ``(update, stop)`` callables driving controller haptics, or no-ops. + + Keeps haptics opt-in without branching in the main loop: both callables are + no-ops unless the active device is an IsaacTeleop device and the env declares + a ``haptic_feedback`` config. ``update`` renders the current contact force; + ``stop`` zeroes it so a stale pulse does not persist while teleop is paused. + """ + noop = lambda: None # noqa: E731 + if not use_isaac_teleop: + return noop, noop + from isaaclab_teleop import create_haptic_feedback_driver + + driver = create_haptic_feedback_driver(env.unwrapped, teleop_interface, env_cfg) + if driver is None: + return noop, noop + return driver.update, driver.stop + + +def _make_control_keyboard(teleop_interface, use_isaac_teleop: bool, has_window: bool): + """Create an optional keyboard for headset-free IsaacTeleop control. + + Binds ``B`` / ``P`` / ``R`` to start-resume / pause / reset so a user can drive + the teleop state machine without an XR headset. Keys are captured through the app + window, so this returns ``None`` when there is no window or when IsaacTeleop is + not the active stack (a windowless run still auto-starts teleop). ``R`` is an operator + reset: :meth:`~isaaclab_teleop.IsaacTeleopDevice.reset` with ``pause=True`` injects a + single RESET pulse (the loop's control-event handler turns it into one environment + reset) and pauses the session (binding it straight to the reset callback would reset + the env twice). The returned device must be kept referenced by the caller so its carb + input subscription survives. + """ + if not use_isaac_teleop or not has_window: + return None + try: + keyboard = Se3Keyboard(Se3KeyboardCfg(pos_sensitivity=0.0, rot_sensitivity=0.0)) + keyboard.add_callback("B", teleop_interface.request_start) + keyboard.add_callback("P", teleop_interface.request_stop) + keyboard.add_callback("R", lambda: teleop_interface.reset(pause=True)) + print("IsaacTeleop control keys: [B] start/resume [P] pause [R] reset") + return keyboard + except Exception as e: + logger.warning(f"Control keyboard unavailable ({e}); teleop still auto-starts without --xr") + return None + + +def main() -> None: # noqa: C901 + """ + Run teleoperation with an Isaac Lab manipulation environment. Creates the environment, sets up teleoperation interfaces and callbacks, and runs the main simulation loop until the application is closed. @@ -87,9 +258,16 @@ def main() -> None: Returns: None """ - # parse configuration - env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=args_cli.num_envs) + # Resolve the task configuration through Hydra so CLI presets are applied. + env_cfg, _ = resolve_task_config(args_cli.task, "") + env_cfg.sim.device = args_cli.device + env_cfg.scene.num_envs = args_cli.num_envs env_cfg.env_name = args_cli.task + if not isinstance(env_cfg, ManagerBasedRLEnvCfg): + raise ValueError( + "Teleoperation is only supported for ManagerBasedRLEnv environments. " + f"Received environment config type: {type(env_cfg).__name__}" + ) # modify configuration env_cfg.terminations.time_out = None if "Lift" in args_cli.task: @@ -98,11 +276,44 @@ def main() -> None: # add termination condition for reaching the goal otherwise the environment won't reset env_cfg.terminations.object_reached_goal = DoneTerm(func=mdp.object_reached_goal) + # When --teleop_device is explicitly provided, use the legacy teleop_devices path + # even if isaac_teleop is configured. Otherwise prefer isaac_teleop when available. + teleop_device_explicitly_set = args_cli.teleop_device is not None + use_isaac_teleop = ( + not teleop_device_explicitly_set and hasattr(env_cfg, "isaac_teleop") and env_cfg.isaac_teleop is not None + ) + + from isaaclab_teleop import XrCameraFeedSession + + camera_feed_session = XrCameraFeedSession.prepare( + env_cfg, + enabled=args_cli.xr and use_isaac_teleop, + camera_rendering_enabled=not args_cli.disable_external_cameras, + ) + + # XR-rendering setup (camera removal + DLSS) is only needed for the Kit XR + # path. Without --xr, IsaacTeleop runs standalone (I/O only) and renders + # normally, so gate on --xr alone. if args_cli.xr: - # External cameras are not supported with XR teleop - # Check for any camera configs and disable them - env_cfg = remove_camera_configs(env_cfg) - env_cfg.sim.render.antialiasing_mode = "DLSS" + # Keep camera configs when external cameras are enabled (defaulted on); otherwise + # strip them so the XR headset view is the sole render product. + if args_cli.disable_external_cameras: + env_cfg = remove_camera_configs(env_cfg) + # Apply the RTX/DLSS global settings when an RTX render pipeline will run (Kit visualizer, + # external cameras, or XR). ``apply_isaac_rtx_global_settings`` uses ``omni.replicator``, + # which some experiences do not preload, so ensure it is loaded first. + if _rtx_rendering_requested(args_cli): + _ensure_replicator_loaded() + apply_isaac_rtx_global_settings( + IsaacRtxRendererGlobalSettingsCfg( + antialiasing_mode="DLSS", + carb_settings=( + {"/rtx/dldenoiser/responsiveDenoising": True} + if camera_feed_session.requires_responsive_denoising + else None + ), + ), + ) try: # create environment @@ -170,47 +381,64 @@ def stop_teleoperation() -> None: "RESET": reset_recording_instance, } - # For hand tracking devices, add additional callbacks - if args_cli.xr: - # Default to inactive for hand tracking - teleoperation_active = False + # For XR devices (hand tracking or IsaacTeleop), default to inactive. Without + # --xr, teleop is started locally (see ``request_start`` below) rather than by + # a headset, so it still begins running -- but it flows through the same state + # machine, so keyboard/host pause/resume keeps working. + if use_isaac_teleop or args_cli.xr: + teleoperation_active = env_cfg.isaac_teleop.teleoperation_active_default if use_isaac_teleop else False else: # Always active for other devices teleoperation_active = True - # Create teleop device from config if present, otherwise create manually + # Create teleop device based on configuration teleop_interface = None + try: - if hasattr(env_cfg, "teleop_devices") and args_cli.teleop_device in env_cfg.teleop_devices.devices: - teleop_interface = create_teleop_device( - args_cli.teleop_device, env_cfg.teleop_devices.devices, teleoperation_callbacks - ) - else: - logger.warning( - f"No teleop device '{args_cli.teleop_device}' found in environment config. Creating default." + if use_isaac_teleop: + from isaaclab_teleop import create_isaac_teleop_device, poll_control_events + + teleop_interface = create_isaac_teleop_device( + env_cfg.isaac_teleop, + sim_device=args_cli.device, + callbacks=teleoperation_callbacks, + cloudxr_env_file=_resolve_cloudxr_env(args_cli.cloudxr_env, args_cli.xr), + auto_launch_cloudxr=args_cli.auto_launch_cloudxr, + enable_debug_visualization=args_cli.enable_debug_visualization, + use_kit_xr_bridge=args_cli.xr, + haptic_cfg=getattr(env_cfg, "haptic_feedback", None), ) - # Create fallback teleop device - sensitivity = args_cli.sensitivity - if args_cli.teleop_device.lower() == "keyboard": - teleop_interface = Se3Keyboard( - Se3KeyboardCfg(pos_sensitivity=0.05 * sensitivity, rot_sensitivity=0.05 * sensitivity) - ) - elif args_cli.teleop_device.lower() == "spacemouse": - teleop_interface = Se3SpaceMouse( - Se3SpaceMouseCfg(pos_sensitivity=0.05 * sensitivity, rot_sensitivity=0.05 * sensitivity) - ) - elif args_cli.teleop_device.lower() == "gamepad": - teleop_interface = Se3Gamepad( - Se3GamepadCfg(pos_sensitivity=0.1 * sensitivity, rot_sensitivity=0.1 * sensitivity) + + elif teleop_device_explicitly_set: + device_name = args_cli.teleop_device + if hasattr(env_cfg, "teleop_devices") and device_name in env_cfg.teleop_devices.devices: + teleop_interface = create_teleop_device( + device_name, env_cfg.teleop_devices.devices, teleoperation_callbacks ) else: - logger.error(f"Unsupported teleop device: {args_cli.teleop_device}") - logger.error("Supported devices: keyboard, spacemouse, gamepad, handtracking") - env.close() - simulation_app.close() - return - - # Add callbacks to fallback device + teleop_interface = _create_builtin_device(device_name, args_cli.sensitivity) + if teleop_interface is None: + logger.error( + f"--teleop_device={device_name} was passed but no matching entry exists in" + " env_cfg.teleop_devices and it is not a built-in device name. Either remove" + " --teleop_device to use the IsaacTeleop pipeline, or add a" + f" '{device_name}' entry under teleop_devices in the environment config." + " Built-in devices: keyboard, spacemouse, gamepad." + ) + env.close() + simulation_app.close() + return + for key, callback in teleoperation_callbacks.items(): + try: + teleop_interface.add_callback(key, callback) + except (ValueError, TypeError) as e: + logger.warning(f"Failed to add callback for key {key}: {e}") + else: + # No --teleop_device and no isaac_teleop: fall back to keyboard + sensitivity = args_cli.sensitivity + teleop_interface = Se3Keyboard( + Se3KeyboardCfg(pos_sensitivity=0.05 * sensitivity, rot_sensitivity=0.05 * sensitivity) + ) for key, callback in teleoperation_callbacks.items(): try: teleop_interface.add_callback(key, callback) @@ -230,36 +458,82 @@ def stop_teleoperation() -> None: print(f"Using teleop device: {teleop_interface}") - # reset environment - env.reset() - teleop_interface.reset() - - print("Teleoperation started. Press 'R' to reset the environment.") - - # simulate environment - while simulation_app.is_running(): - try: - # run everything in inference mode - with torch.inference_mode(): - # get device command - action = teleop_interface.advance() - - # Only apply teleop commands when active - if teleoperation_active: - # process actions - actions = action.repeat(env.num_envs, 1) - # apply actions - env.step(actions) - else: - env.sim.render() - - if should_reset_recording_instance: - env.reset() - should_reset_recording_instance = False - print("Environment reset complete") - except Exception as e: - logger.error(f"Error during simulation step: {e}") - break + # Optional controller haptics: no-ops unless the env declares a + # ``haptic_feedback`` config and the device can render it (IsaacTeleop). + haptic_update, haptic_stop = _make_haptic_io(env, teleop_interface, env_cfg, use_isaac_teleop) + + # Optional keyboard for headset-free IsaacTeleop control. Kept in a local so its + # carb input subscription is not garbage-collected; a headless run auto-starts + # (in ``run_loop``) without it. + control_keyboard = _make_control_keyboard(teleop_interface, use_isaac_teleop, app_launcher.has_window) # noqa: F841 + + def run_loop(): + """Inner function to run the teleop loop with access to nonlocal variables.""" + nonlocal should_reset_recording_instance, teleoperation_active + + # reset environment + env.reset() + teleop_interface.reset() + + # Without --xr there is no headset to send START, so start locally ([B]/[P] can + # still pause/resume). The reset() above is a host reset (a pure pulse), so it does + # not cancel this start. + if use_isaac_teleop and not args_cli.xr: + teleop_interface.request_start() + + stack_name = "IsaacTeleop" if use_isaac_teleop else "native" + print(f"{stack_name} teleoperation started. Press 'R' to reset the environment.") + + # simulate environment + while simulation_app.is_running(): + try: + # run everything in inference mode + with torch.inference_mode(): + # get device command + action = teleop_interface.advance() + + if use_isaac_teleop: + ctrl = poll_control_events(teleop_interface) + if ctrl.is_active is not None: + teleoperation_active = ctrl.is_active + if ctrl.should_reset: + should_reset_recording_instance = True + + # action is None when IsaacTeleop session hasn't started yet + # (e.g. waiting for user to click "Start AR") + if action is None: + env.sim.render() + haptic_stop() + elif teleoperation_active: + # process actions + actions = action.repeat(env.num_envs, 1) + # apply actions + env.step(actions) + # render controller haptics from post-step contact forces + haptic_update() + else: + env.sim.render() + # not stepping: zero haptics so a paused grip stops buzzing + haptic_stop() + + if should_reset_recording_instance: + env.reset() + teleop_interface.reset() + camera_feed_session.refresh() + should_reset_recording_instance = False + print("Environment reset complete") + except Exception as e: + logger.error(f"Error during simulation step: {e}") + break + + # Run the teleoperation loop + # IsaacTeleop requires a context manager, native devices don't + if use_isaac_teleop: + with teleop_interface, camera_feed_session.bind(env): + run_loop() + else: + with camera_feed_session.bind(env): + run_loop() # close the simulator env.close() @@ -269,5 +543,7 @@ def stop_teleoperation() -> None: if __name__ == "__main__": # run the main function main() - # close sim app + # env.close() already closes the USD stage via sim.clear_instance(). + # Pump the event loop so the viewport processes closure, then close the app. + simulation_app.update() simulation_app.close() diff --git a/scripts/environments/zero_agent.py b/scripts/environments/zero_agent.py index 88aa98e7..a3519dcc 100644 --- a/scripts/environments/zero_agent.py +++ b/scripts/environments/zero_agent.py @@ -1,73 +1,29 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause -"""Script to run an environment with zero action agent.""" +"""Zero-action agent executable for Isaac Lab environments.""" -"""Launch Isaac Sim Simulator first.""" - -import argparse - -from isaaclab.app import AppLauncher - -# add argparse arguments -parser = argparse.ArgumentParser(description="Zero agent for Isaac Lab environments.") -parser.add_argument( - "--disable_fabric", action="store_true", default=False, help="Disable fabric and use USD I/O operations." -) -parser.add_argument("--num_envs", type=int, default=None, help="Number of environments to simulate.") -parser.add_argument("--task", type=str, default=None, help="Name of the task.") -# append AppLauncher cli args -AppLauncher.add_app_launcher_args(parser) -# parse the arguments -args_cli = parser.parse_args() +# PLACEHOLDER: Extension template (do not remove this comment) -# launch omniverse app -app_launcher = AppLauncher(args_cli) -simulation_app = app_launcher.app +# Warp captures ``enable_backward`` when a module is created, which happens at import +# time, so it has to be set before importing anything that defines Warp kernels. +# Isaac Lab does not use Warp autodiff; skipping adjoint codegen roughly halves the +# time spent building kernels on a cold kernel cache. +import warp as wp -"""Rest everything follows.""" +wp.config.enable_backward = False -import gymnasium as gym -import torch +from isaaclab_rl.entrypoints import run_zero_agent_cli # noqa: E402 -import isaaclab_tasks # noqa: F401 import uwlab_tasks # noqa: F401 -from isaaclab_tasks.utils import parse_env_cfg - -# PLACEHOLDER: Extension template (do not remove this comment) - - -def main(): - """Zero actions agent with Isaac Lab environment.""" - # parse configuration - env_cfg = parse_env_cfg( - args_cli.task, device=args_cli.device, num_envs=args_cli.num_envs, use_fabric=not args_cli.disable_fabric - ) - # create environment - env = gym.make(args_cli.task, cfg=env_cfg) - # print info (this is vectorized environment) - print(f"[INFO]: Gym observation space: {env.observation_space}") - print(f"[INFO]: Gym action space: {env.action_space}") - # reset environment - env.reset() - # simulate environment - while simulation_app.is_running(): - # run everything in inference mode - with torch.inference_mode(): - # compute zero actions - actions = torch.zeros(env.action_space.shape, device=env.unwrapped.device) - # apply actions - env.step(actions) - # close the simulator - env.close() +def main(argv: list[str] | None = None) -> int: + """Run an environment with a zero-action agent.""" + return run_zero_agent_cli(argv) if __name__ == "__main__": - # run the main function - main() - # close sim app - simulation_app.close() + raise SystemExit(main()) diff --git a/scripts/imitation_learning/isaaclab_mimic/annotate_demos.py b/scripts/imitation_learning/isaaclab_mimic/annotate_demos.py index f67f0bef..c53dd425 100644 --- a/scripts/imitation_learning/isaaclab_mimic/annotate_demos.py +++ b/scripts/imitation_learning/isaaclab_mimic/annotate_demos.py @@ -1,7 +1,7 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2024-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-License-Identifier: Apache-2.0 """ Script to add mimic annotations to demos to be used as source demos for mimic dataset generation. @@ -11,6 +11,7 @@ import math from isaaclab.app import AppLauncher +from isaaclab.utils.string import list_intersection, string_to_callable # Launching Isaac Sim Simulator first. @@ -28,12 +29,6 @@ help="File name of the annotated output dataset file.", ) parser.add_argument("--auto", action="store_true", default=False, help="Automatically annotate subtasks.") -parser.add_argument( - "--enable_pinocchio", - action="store_true", - default=False, - help="Enable Pinocchio.", -) parser.add_argument( "--annotate_subtask_start_signals", action="store_true", @@ -41,32 +36,41 @@ help="Enable annotating start points of subtasks.", ) +parser.add_argument("--external_callback", default=None, help="Fully qualified path to an externally defined callback.") # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) # parse the arguments -args_cli = parser.parse_args() - -if args_cli.enable_pinocchio: - # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and not the one installed by Isaac Sim - # pinocchio is required by the Pink IK controllers and the GR1T2 retargeter - import pinocchio # noqa: F401 +args_cli, remaining_args = parser.parse_known_args() # launch the simulator app_launcher = AppLauncher(args_cli) simulation_app = app_launcher.app +# Call an external callback if requested. +remaining_args_env_registration = None +if args_cli.external_callback: + external_callback_function = string_to_callable(args_cli.external_callback, separator=".") + remaining_args_env_registration = external_callback_function() + +# Extras of the form "key=value" are Hydra-style task config overrides forwarded to +# parse_env_cfg(); everything else must be consumed by the external callback or is an error. +hydra_overrides = [arg for arg in remaining_args if "=" in arg] +unrecognized_args = list_intersection( + [arg for arg in remaining_args if arg not in hydra_overrides], remaining_args_env_registration +) +if unrecognized_args: + parser.error(f"unrecognized arguments: {' '.join(unrecognized_args)}") + """Rest everything follows.""" import contextlib -import gymnasium as gym import os + +import gymnasium as gym import torch import isaaclab_mimic.envs # noqa: F401 -if args_cli.enable_pinocchio: - import isaaclab_mimic.envs.pinocchio_envs # noqa: F401 - # Only enables inputs if this script is NOT headless mode if not args_cli.headless and not os.environ.get("HEADLESS", 0): from isaaclab.devices import Se3Keyboard, Se3KeyboardCfg @@ -196,7 +200,7 @@ def main(): if env_name is None: raise ValueError("Task/env name was not specified nor found in the dataset.") - env_cfg = parse_env_cfg(env_name, device=args_cli.device, num_envs=1) + env_cfg = parse_env_cfg(env_name, device=args_cli.device, num_envs=1, overrides=hydra_overrides) env_cfg.env_name = env_name diff --git a/scripts/imitation_learning/isaaclab_mimic/consolidated_demo.py b/scripts/imitation_learning/isaaclab_mimic/consolidated_demo.py index 57381af7..94c3681c 100644 --- a/scripts/imitation_learning/isaaclab_mimic/consolidated_demo.py +++ b/scripts/imitation_learning/isaaclab_mimic/consolidated_demo.py @@ -1,7 +1,7 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2024-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-License-Identifier: Apache-2.0 """ Script to record teleoperated demos and run mimic dataset generation in real-time. @@ -62,8 +62,8 @@ ) # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) -# parse the arguments -args_cli = parser.parse_args() +# parse the arguments, forwarding unrecognized ones as Hydra-style task config overrides +args_cli, hydra_overrides = parser.parse_known_args() # launch the simulator app_launcher = AppLauncher(args_cli) @@ -73,11 +73,12 @@ import asyncio import contextlib -import gymnasium as gym -import numpy as np import os import random import time + +import gymnasium as gym +import numpy as np import torch from isaaclab.devices import Se3Keyboard, Se3KeyboardCfg, Se3SpaceMouse, Se3SpaceMouseCfg @@ -302,7 +303,6 @@ def env_loop(env, env_action_queue, shared_datagen_info_pool, asyncio_event_loop is_first_print = True with contextlib.suppress(KeyboardInterrupt) and torch.inference_mode(): while True: - actions = torch.zeros(env.unwrapped.action_space.shape) # get actions from all the data generators @@ -372,7 +372,7 @@ def main(): raise ValueError("Task/env name was not specified nor found in the dataset.") # parse configuration - env_cfg = parse_env_cfg(env_name, device=args_cli.device, num_envs=num_envs) + env_cfg = parse_env_cfg(env_name, device=args_cli.device, num_envs=num_envs, overrides=hydra_overrides) env_cfg.env_name = env_name # extract success checking function to invoke manually diff --git a/scripts/imitation_learning/isaaclab_mimic/generate_dataset.py b/scripts/imitation_learning/isaaclab_mimic/generate_dataset.py index fcc85f84..b982906b 100644 --- a/scripts/imitation_learning/isaaclab_mimic/generate_dataset.py +++ b/scripts/imitation_learning/isaaclab_mimic/generate_dataset.py @@ -1,18 +1,18 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2024-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-License-Identifier: Apache-2.0 """ Main data generation script. """ - """Launch Isaac Sim Simulator first.""" import argparse from isaaclab.app import AppLauncher +from isaaclab.utils.string import list_intersection, string_to_callable # add argparse arguments parser = argparse.ArgumentParser(description="Generate demonstrations for Isaac Lab environments.") @@ -31,57 +31,66 @@ parser.add_argument( "--pause_subtask", action="store_true", - help="pause after every subtask during generation for debugging - only useful with render flag", + help="Pause after every subtask during generation for debugging - only useful with render flag", ) parser.add_argument( - "--enable_pinocchio", + "--use_skillgen", action="store_true", default=False, - help="Enable Pinocchio.", + help="Use skillgen to generate motion trajectories", ) parser.add_argument( - "--use_skillgen", + "--disable_dataset_compression", action="store_true", default=False, - help="use skillgen to generate motion trajectories", + help="Disables dataset compression", +) +parser.add_argument( + "--external_callback", + default=None, + help="Fully qualified path to an externally defined callback.", ) + # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) # parse the arguments -args_cli = parser.parse_args() +args_cli, remaining_args = parser.parse_known_args() -if args_cli.enable_pinocchio: - # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and not the one installed by Isaac Sim - # pinocchio is required by the Pink IK controllers and the GR1T2 retargeter - import pinocchio # noqa: F401 - -# launch the simulator -app_launcher = AppLauncher(args_cli) +# Mimic environments may use camera observations or an RTX renderer. Request +# rendering support here so callers do not need a legacy CLI flag. +app_launcher = AppLauncher(args_cli, enable_cameras=True) simulation_app = app_launcher.app +import uwlab_tasks # noqa: F401 + +# Call an external callback if requested. +remaining_args_env_registration = None +if args_cli.external_callback: + external_callback_function = string_to_callable(args_cli.external_callback, separator=".") + remaining_args_env_registration = external_callback_function() + +# Error on unrecognized arguments. +unrecognized_args = list_intersection(remaining_args, remaining_args_env_registration) +if unrecognized_args: + parser.error(f"unrecognized arguments: {' '.join(unrecognized_args)}") + """Rest everything follows.""" import asyncio -import gymnasium as gym import inspect import logging -import numpy as np import random + +import gymnasium as gym +import numpy as np import torch from isaaclab.envs import ManagerBasedRLMimicEnv import isaaclab_mimic.envs # noqa: F401 - -if args_cli.enable_pinocchio: - import isaaclab_mimic.envs.pinocchio_envs # noqa: F401 - from isaaclab_mimic.datagen.generation import env_loop, setup_async_generation, setup_env_config from isaaclab_mimic.datagen.utils import get_env_name_from_dataset, setup_output_paths -import isaaclab_tasks # noqa: F401 -import uwlab_tasks # noqa: F401 - # import logger logger = logging.getLogger(__name__) @@ -104,6 +113,7 @@ def main(): num_envs=num_envs, device=args_cli.device, generation_num_trials=args_cli.generation_num_trials, + dataset_compression=not args_cli.disable_dataset_compression, ) # Create environment @@ -128,72 +138,77 @@ def main(): env.reset() motion_planners = None - if args_cli.use_skillgen: - from isaaclab_mimic.motion_planners.curobo.curobo_planner import CuroboPlanner - from isaaclab_mimic.motion_planners.curobo.curobo_planner_cfg import CuroboPlannerCfg - - # Create one motion planner per environment - motion_planners = {} - for env_id in range(num_envs): - print(f"Initializing motion planner for environment {env_id}") - # Create a config instance from the task name - planner_config = CuroboPlannerCfg.from_task_name(env_name) - - # Ensure visualization is only enabled for the first environment - # If not, sphere and plan visualization will be too slow in isaac lab - # It is efficient to visualize the spheres and plan for the first environment in rerun - if env_id != 0: - planner_config.visualize_spheres = False - planner_config.visualize_plan = False - - motion_planners[env_id] = CuroboPlanner( - env=env, - robot=env.scene["robot"], - config=planner_config, # Pass the config object - env_id=env_id, # Pass environment ID - ) - - env.cfg.datagen_config.use_skillgen = True - - # Setup and run async data generation - async_components = setup_async_generation( - env=env, - num_envs=args_cli.num_envs, - input_file=args_cli.input_file, - success_term=success_term, - pause_subtask=args_cli.pause_subtask, - motion_planners=motion_planners, # Pass the motion planners dictionary - ) - try: - data_gen_tasks = asyncio.ensure_future(asyncio.gather(*async_components["tasks"])) - env_loop( - env, - async_components["reset_queue"], - async_components["action_queue"], - async_components["info_pool"], - async_components["event_loop"], + if args_cli.use_skillgen: + from isaaclab_mimic.motion_planners.curobo.curobo_planner import CuroboPlanner + from isaaclab_mimic.motion_planners.curobo.curobo_planner_cfg import CuroboPlannerCfg + + # Create one motion planner per environment + motion_planners = {} + for env_id in range(num_envs): + print(f"Initializing motion planner for environment {env_id}") + # Create a config instance from the task name + planner_config = CuroboPlannerCfg.from_task_name(env_name) + + # Ensure visualization is only enabled for the first environment + # If not, sphere and plan visualization will be too slow in isaac lab + # It is efficient to visualize the spheres and plan for the first environment in rerun + if env_id != 0: + planner_config.visualize_spheres = False + planner_config.visualize_plan = False + + motion_planners[env_id] = CuroboPlanner( + env=env, + robot=env.scene["robot"], + config=planner_config, # Pass the config object + env_id=env_id, # Pass environment ID + ) + + env.cfg.datagen_config.use_skillgen = True + + # Setup and run async data generation + async_components = setup_async_generation( + env=env, + num_envs=args_cli.num_envs, + input_file=args_cli.input_file, + success_term=success_term, + pause_subtask=args_cli.pause_subtask, + motion_planners=motion_planners, # Pass the motion planners dictionary ) - except asyncio.CancelledError: - print("Tasks were cancelled.") - finally: - # Cancel all async tasks when env_loop finishes - data_gen_tasks.cancel() + try: - # Wait for tasks to be cancelled - async_components["event_loop"].run_until_complete(data_gen_tasks) + data_gen_tasks = asyncio.ensure_future(asyncio.gather(*async_components["tasks"])) + env_loop( + env, + async_components["reset_queue"], + async_components["action_queue"], + async_components["info_pool"], + async_components["event_loop"], + data_gen_tasks=data_gen_tasks, + ) except asyncio.CancelledError: - print("Remaining async tasks cancelled and cleaned up.") - except Exception as e: - print(f"Error cancelling remaining async tasks: {e}") - # Cleanup of motion planners and their visualizers - if motion_planners is not None: - for env_id, planner in motion_planners.items(): - if getattr(planner, "plan_visualizer", None) is not None: - print(f"Closing plan visualizer for environment {env_id}") - planner.plan_visualizer.close() - planner.plan_visualizer = None - motion_planners.clear() + print("Tasks were cancelled.") + finally: + # Cancel all async tasks when env_loop finishes + data_gen_tasks.cancel() + try: + # Wait for tasks to be cancelled + async_components["event_loop"].run_until_complete(data_gen_tasks) + except asyncio.CancelledError: + print("Remaining async tasks cancelled and cleaned up.") + except Exception as e: + print(f"Error cancelling remaining async tasks: {e}") + # Cleanup of motion planners and their visualizers + if motion_planners is not None: + for env_id, planner in motion_planners.items(): + if getattr(planner, "plan_visualizer", None) is not None: + print(f"Closing plan visualizer for environment {env_id}") + planner.plan_visualizer.close() + planner.plan_visualizer = None + motion_planners.clear() + finally: + # Close env after async tasks are done so success_term is never called on a closed env + env.close() if __name__ == "__main__": diff --git a/scripts/imitation_learning/locomanipulation_sdg/generate_data.py b/scripts/imitation_learning/locomanipulation_sdg/generate_data.py index f9ed8325..f7191630 100644 --- a/scripts/imitation_learning/locomanipulation_sdg/generate_data.py +++ b/scripts/imitation_learning/locomanipulation_sdg/generate_data.py @@ -1,19 +1,15 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause """Script to replay demonstrations with Isaac Lab environments.""" -"""Launch Isaac Sim Simulator first.""" - - import argparse import os from isaaclab.app import AppLauncher -# Launch Isaac Lab parser = argparse.ArgumentParser(description="Locomanipulation SDG") parser.add_argument("--task", type=str, help="The Isaac Lab locomanipulation SDG task to load for data generation.") parser.add_argument("--dataset", type=str, help="The static manipulation dataset recorded via teleoperation.") @@ -30,14 +26,17 @@ "--navigate_step", type=int, help=( - "The step index in the input recording where the robot is ready to navigate. Aka, where it has finished" - " lifting the object" + "The step index in the input recording where the robot is ready to navigate. Aka, where it has finished" + " lifting the object." ), ) -parser.add_argument("--demo", type=str, default=None, help="The demo in the input dataset to use.") +parser.add_argument("--demo", type=str, default=None, help="The demo in the input dataset to use, e.g. 'demo_0'") parser.add_argument("--num_runs", type=int, default=1, help="The number of trajectories to generate.") parser.add_argument( - "--draw_visualization", type=bool, default=False, help="Draw the occupancy map and path planning visualization." + "--draw_visualization", + action="store_true", + default=False, + help="Draw the occupancy map and path planning visualization.", ) parser.add_argument( "--angular_gain", @@ -88,42 +87,79 @@ ) parser.add_argument( "--randomize_placement", - type=bool, - default=True, + action="store_true", + default=False, help="Whether or not to randomize the placement of fixtures in the scene upon environment initialization.", ) parser.add_argument( - "--enable_pinocchio", + "--background_usd_path", + type=str, + default=None, + help="Path to the USD file for the background asset", +) +parser.add_argument( + "--background_occupancy_yaml_file", + type=str, + default=None, + help="Path to the occupancy map YAML file for the background asset", +) +parser.add_argument( + "--high_res_video", action="store_true", default=False, - help="Enable Pinocchio.", + help="Whether to use high resolution video for the robot's POV camera.", +) +parser.add_argument( + "--seed", + type=int, + default=None, + help="Random seed for reproducibility.", +) +parser.add_argument( + "--sensor_camera_view", + action="store_true", + default=False, + help="Set the Sim GUI viewport to the robot_pov_cam sensor view at the start of each episode.", ) -AppLauncher.add_app_launcher_args(parser) -args_cli = parser.parse_args() -if args_cli.enable_pinocchio: - # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and not the one installed by Isaac Sim - # pinocchio is required by the Pink IK controllers and the GR1T2 retargeter - import pinocchio # noqa: F401 +AppLauncher.add_app_launcher_args(parser) +# forward unrecognized args as Hydra-style task config overrides +args_cli, hydra_overrides = parser.parse_known_args() app_launcher = AppLauncher(args_cli) simulation_app = app_launcher.app import enum -import gymnasium as gym import random +from dataclasses import dataclass + +import gymnasium as gym +import numpy as np import torch +import warp as wp import omni.kit +import omni.kit.viewport.utility +import omni.usd +from isaaclab.managers import DatasetExportMode from isaaclab.utils import configclass from isaaclab.utils.datasets import EpisodeData, HDF5DatasetFileHandler +from isaaclab.utils.math import convert_quat +from isaaclab.utils.seed import configure_seed import isaaclab_mimic.locomanipulation_sdg.envs # noqa: F401 -from isaaclab_mimic.locomanipulation_sdg.data_classes import LocomanipulationSDGOutputData +from isaaclab_mimic.locomanipulation_sdg.data_classes import ( + LocomanipulationSDGOutputData, +) + +if args_cli.seed is not None: + configure_seed(args_cli.seed) + from isaaclab_mimic.locomanipulation_sdg.envs.locomanipulation_sdg_env import LocomanipulationSDGEnv from isaaclab_mimic.locomanipulation_sdg.occupancy_map_utils import ( OccupancyMap, + OccupancyMapDataValue, merge_occupancy_maps, occupancy_map_add_to_stage, ) @@ -169,7 +205,7 @@ class LocomanipulationSDGControlConfig: linear_max: float = 1.0 """Maximum allowed linear velocity (m/s)""" - distance_threshold: float = 0.1 + distance_threshold: float = 0.2 """Distance threshold for state transitions (m)""" following_offset: float = 0.6 @@ -178,12 +214,28 @@ class LocomanipulationSDGControlConfig: angle_threshold: float = 0.2 """Angular threshold for orientation control (rad)""" - approach_distance: float = 1.0 + approach_distance: float = 0.5 """Buffer distance from final goal (m)""" +@dataclass +class NavigationScene: + """Navigation scene data class.""" + + """The occupancy map of the navigation scene.""" + occupancy_map: OccupancyMap + """The base path helper of the navigation scene.""" + base_path_helper: ParameterizedPath + """The base goal of the navigation scene.""" + base_goal: RelativePose + """The approach goal of the navigation scene.""" + base_goal_approach: RelativePose + + def compute_navigation_velocity( - current_pose: torch.Tensor, target_xy: torch.Tensor, config: LocomanipulationSDGControlConfig + current_pose: torch.Tensor, + target_xy: torch.Tensor, + config: LocomanipulationSDGControlConfig, ) -> tuple[torch.Tensor, torch.Tensor]: """Compute linear and angular velocities for navigation control. @@ -203,8 +255,8 @@ def compute_navigation_velocity( delta_distance = torch.sqrt(torch.sum(delta_xy**2)) target_yaw = torch.arctan2(delta_xy[1], delta_xy[0]) - delta_yaw = target_yaw - current_yaw # Normalize angle to [-π, π] + delta_yaw = target_yaw - current_yaw delta_yaw = (delta_yaw + torch.pi) % (2 * torch.pi) - torch.pi # Compute control commands @@ -222,7 +274,7 @@ def load_and_transform_recording_data( recording_step: int, reference_pose: torch.Tensor, target_pose: torch.Tensor, -) -> tuple[torch.Tensor, torch.Tensor]: +) -> tuple[torch.Tensor | None, torch.Tensor | None]: """Load recording data and transform hand targets to current reference frame. Args: @@ -245,12 +297,130 @@ def load_and_transform_recording_data( return left_hand_pose, right_hand_pose +def sync_simulation_state(env: LocomanipulationSDGEnv): + """Push USD pose updates into physics, advance the sim, and sync back + + Args: + env: The locomanipulation SDG environment + """ + env.scene.write_data_to_sim() + env.sim.step(render=False) + env.scene.update(dt=env.physics_dt) + + +def _set_sensor_camera_view(): + """Set the Sim GUI viewport to display the robot_pov_cam sensor view.""" + viewport = omni.kit.viewport.utility.get_active_viewport() + if viewport is not None: + cam_prim_path = "/World/envs/env_0/Robot/torso_link/d435_link/camera" + viewport.set_active_camera(cam_prim_path) + + +def project_robot_state_into_env(env: LocomanipulationSDGEnv, input_episode_data: EpisodeData) -> torch.Tensor: + """Project the recorded robot pose and joint state into the current environment. + + Args: + env: The locomanipulation SDG environment + input_episode_data: Input episode data + + Returns: + The new robot pose + """ + initial_state = env.load_input_data(input_episode_data, 0) + recording_initial_state = input_episode_data.get_initial_state() + + object = env.scene["object"] + current_object_pose = torch.cat( + [ + torch.as_tensor(object.data.root_pos_w.torch[0:1], device=env.device, dtype=torch.float32), + torch.as_tensor(object.data.root_quat_w.torch[0:1], device=env.device, dtype=torch.float32), + ], + dim=-1, + ) # (1, 7) + + new_robot_pose = transform_mul( + current_object_pose, + transform_mul( + transform_inv(initial_state.object_pose.to(env.device)), + initial_state.base_pose.to(env.device), + ), + ) + + env.scene["robot"].write_root_pose_to_sim_index(root_pose=new_robot_pose, env_ids=[0]) + env.scene["robot"].write_root_velocity_to_sim_index( + root_velocity=torch.zeros((1, 6), device=env.device), env_ids=[0] + ) + # Update default root pose and velocity for correct state on reset + default_pose = env.scene["robot"].data.default_root_pose.torch.clone() + default_pose[0] = new_robot_pose[0] + env.scene["robot"].data.default_root_pose.warp.assign( + wp.from_torch(default_pose.to(env.device).contiguous()).view(wp.transformf) + ) + default_vel = env.scene["robot"].data.default_root_vel.torch.clone() + default_vel[0] = torch.zeros(6, device=env.device) + env.scene["robot"].data.default_root_vel.warp.assign(wp.from_torch(default_vel.to(env.device).contiguous())) + + robot_state = recording_initial_state["articulation"]["robot"] + joint_position = robot_state["joint_position"][0].to(env.device) + joint_velocity = robot_state["joint_velocity"][0].to(env.device) + + # Update default joint positions and velocities for correct state on reset + default_joint_pos = env.scene["robot"].data.default_joint_pos.torch.clone() + default_joint_pos[0] = joint_position + env.scene["robot"].data.default_joint_pos.warp.assign(wp.from_torch(default_joint_pos.to(env.device).contiguous())) + default_joint_vel = env.scene["robot"].data.default_joint_vel.torch.clone() + default_joint_vel[0] = joint_velocity + env.scene["robot"].data.default_joint_vel.warp.assign(wp.from_torch(default_joint_vel.to(env.device).contiguous())) + env.scene["robot"].write_joint_position_to_sim_index(position=joint_position[None, :], env_ids=[0]) + env.scene["robot"].write_joint_velocity_to_sim_index(velocity=joint_velocity[None, :], env_ids=[0]) + + return new_robot_pose + + +def project_object_state_into_env(env: LocomanipulationSDGEnv, input_episode_data: EpisodeData) -> torch.Tensor: + """Project the recorded object pose into the current environment. + + Args: + env: The locomanipulation SDG environment + input_episode_data: Input episode data + + Returns: + The new object pose + """ + initial_state = env.load_input_data(input_episode_data, 0) + + new_object_pose = transform_mul( + env.get_start_fixture().get_pose(), + transform_mul( + transform_inv(initial_state.fixture_pose.to(env.device)), + initial_state.object_pose.to(env.device), + ), + ) + + env.scene["object"].write_root_pose_to_sim_index(root_pose=new_object_pose, env_ids=[0]) + env.scene["object"].write_root_velocity_to_sim_index( + root_velocity=torch.zeros((1, 6), device=env.device), env_ids=[0] + ) + # Update default root pose and velocity for correct state on reset + default_pose = env.scene["object"].data.default_root_pose.torch.clone() + default_pose[0] = new_object_pose[0] + env.scene["object"].data.default_root_pose.warp.assign( + wp.from_torch(default_pose.to(env.device).contiguous()).view(wp.transformf) + ) + default_vel = env.scene["object"].data.default_root_vel.torch.clone() + default_vel[0] = torch.zeros(6, device=env.device) + env.scene["object"].data.default_root_vel.warp.assign(wp.from_torch(default_vel.to(env.device).contiguous())) + + return new_object_pose + + def setup_navigation_scene( env: LocomanipulationSDGEnv, input_episode_data: EpisodeData, approach_distance: float, randomize_placement: bool = True, -) -> tuple[OccupancyMap, ParameterizedPath, RelativePose, RelativePose]: + draw_visualization: bool = False, +) -> NavigationScene | None: """Set up the navigation scene with occupancy map and path planning. Args: @@ -258,40 +428,101 @@ def setup_navigation_scene( input_episode_data: Input episode data approach_distance: Buffer distance from final goal randomize_placement: Whether to randomize fixture placement + draw_visualization: Whether to add occupancy map and path to the USD stage Returns: - Tuple of (occupancy_map, path_helper, base_goal, base_goal_approach) + NavigationScene or None if the navigation scene setup failed. """ - # Create base occupancy map - occupancy_map = merge_occupancy_maps([ - OccupancyMap.make_empty(start=(-7, -7), end=(7, 7), resolution=0.05), - env.get_start_fixture().get_occupancy_map(), - ]) - - # Randomize fixture placement if enabled - if randomize_placement: + + background_fixture = env.get_background_fixture() + if background_fixture is not None: + occupancy_map = background_fixture.get_occupancy_map() + fixtures = [env.get_start_fixture(), env.get_end_fixture()] + env.get_obstacle_fixtures() + if not randomize_placement: + raise ValueError("randomize_placement needs to be True when background_usd_path is provided") + else: + occupancy_map = merge_occupancy_maps( + [ + OccupancyMap.make_empty(start=(-7, -7), end=(7, 7), resolution=0.05), + env.get_start_fixture().get_occupancy_map(), + ] + ) + fixtures = [env.get_end_fixture()] + env.get_obstacle_fixtures() - for fixture in fixtures: - place_randomly(fixture, occupancy_map.buffered_meters(1.0)) - occupancy_map = merge_occupancy_maps([occupancy_map, fixture.get_occupancy_map()]) - # Compute goal poses from initial state + for fixture in fixtures: + if randomize_placement: + if not place_randomly(fixture, occupancy_map.buffered_meters(0.7), num_iter=5000): + print(f"Failed to randomize fixture placement for {fixture.entity_name}", flush=True) + return None + + sync_simulation_state(env) + occupancy_map = merge_occupancy_maps([occupancy_map, fixture.get_occupancy_map()]) + initial_state = env.load_input_data(input_episode_data, 0) + base_goal = RelativePose( - relative_pose=transform_mul(transform_inv(initial_state.fixture_pose), initial_state.base_pose), + relative_pose=transform_mul( + transform_inv(initial_state.fixture_pose.to(env.device)), + initial_state.base_pose.to(env.device), + ), parent=env.get_end_fixture(), ) base_goal_approach = RelativePose( - relative_pose=torch.tensor([-approach_distance, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]), parent=base_goal + relative_pose=torch.tensor([-approach_distance, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0], device=env.device), + parent=base_goal, ) - # Plan navigation path - base_path = plan_path( - start=env.get_base(), end=base_goal_approach, occupancy_map=occupancy_map.buffered_meters(0.15) - ) + sync_simulation_state(env) + project_object_state_into_env(env, input_episode_data) + sync_simulation_state(env) + project_robot_state_into_env(env, input_episode_data) + # Flush physics writes so scene data buffers reflect the projected poses before path planning. + # Without this, env.get_base() would return the stale pre-projection position. + sync_simulation_state(env) + env.sim.render() + env.obs_buf = env.observation_manager.compute(update_history=True) + + nav_map = occupancy_map.buffered_meters(0.15) + nav_fs = nav_map.freespace_mask() + start_pos = env.get_base().get_pose()[0, :2].detach().cpu().numpy() + start_px = nav_map.world_to_pixel_numpy(start_pos[None])[0].astype(int) + sx, sy = int(start_px[0]), int(start_px[1]) + + # Clear the buffer zone around the robot's start pixel if it falls inside it. + # The robot stands adjacent to the start table so its position sits within the 0.15m buffer. + if 0 <= sy < nav_fs.shape[0] and 0 <= sx < nav_fs.shape[1] and not nav_fs[sy, sx]: + clear_r = int(0.15 / nav_map.resolution) + yy, xx = np.ogrid[: nav_map.data.shape[0], : nav_map.data.shape[1]] + nav_map.data[(xx - sx) ** 2 + (yy - sy) ** 2 <= clear_r**2] = OccupancyMapDataValue.FREESPACE + + base_path = plan_path(start=env.get_base(), end=base_goal_approach, occupancy_map=nav_map) + + if base_path is None: + return None + base_path_helper = ParameterizedPath(base_path) + if len(base_path_helper.points) <= 2: + print(f"Base path does not have enough points: {len(base_path_helper.points)} points", flush=True) + return None - return occupancy_map, base_path_helper, base_goal, base_goal_approach + sync_simulation_state(env) + + if draw_visualization: + occupancy_map_add_to_stage( + occupancy_map, + stage=omni.usd.get_context().get_stage(), + path="/OccupancyMap", + z_offset=0.01, + draw_path=base_path_helper.points, + ) + + return NavigationScene( + occupancy_map=occupancy_map, + base_path_helper=base_path_helper, + base_goal=base_goal, + base_goal_approach=base_goal_approach, + ) def handle_grasp_state( @@ -318,7 +549,7 @@ def handle_grasp_state( # Set control targets - robot stays stationary during grasping output_data.data_generation_state = int(LocomanipulationSDGDataGenerationState.GRASP_OBJECT) output_data.recording_step = recording_step - output_data.base_velocity_target = torch.tensor([0.0, 0.0, 0.0]) + output_data.base_velocity_target = torch.tensor([0.0, 0.0, 0.0], device=env.device) # Transform hand poses relative to object output_data.left_hand_pose_target = transform_relative_pose( @@ -366,7 +597,7 @@ def handle_lift_state( # Set control targets - robot stays stationary during lifting output_data.data_generation_state = int(LocomanipulationSDGDataGenerationState.LIFT_OBJECT) output_data.recording_step = recording_step - output_data.base_velocity_target = torch.tensor([0.0, 0.0, 0.0]) + output_data.base_velocity_target = torch.tensor([0.0, 0.0, 0.0], device=env.device) # Transform hand poses relative to base output_data.left_hand_pose_target = transform_relative_pose( @@ -425,7 +656,7 @@ def handle_navigate_state( # Set control targets output_data.data_generation_state = int(LocomanipulationSDGDataGenerationState.NAVIGATE) output_data.recording_step = recording_step - output_data.base_velocity_target = torch.tensor([linear_velocity, 0.0, angular_velocity]) + output_data.base_velocity_target = torch.tensor([linear_velocity, 0.0, angular_velocity], device=env.device) # Transform hand poses relative to base output_data.left_hand_pose_target = transform_relative_pose( @@ -479,7 +710,7 @@ def handle_approach_state( # Set control targets output_data.data_generation_state = int(LocomanipulationSDGDataGenerationState.APPROACH) output_data.recording_step = recording_step - output_data.base_velocity_target = torch.tensor([linear_velocity, 0.0, angular_velocity]) + output_data.base_velocity_target = torch.tensor([linear_velocity, 0.0, angular_velocity], device=env.device) # Transform hand poses relative to base output_data.left_hand_pose_target = transform_relative_pose( @@ -540,7 +771,7 @@ def handle_drop_off_state( # Set control targets output_data.data_generation_state = int(LocomanipulationSDGDataGenerationState.DROP_OFF_OBJECT) output_data.recording_step = recording_step - output_data.base_velocity_target = torch.tensor([linear_velocity, 0.0, angular_velocity]) + output_data.base_velocity_target = torch.tensor([linear_velocity, 0.0, angular_velocity], device=env.device) # Transform hand poses relative to end fixture output_data.left_hand_pose_target = transform_relative_pose( @@ -568,7 +799,7 @@ def populate_output_data( base_goal: RelativePose, base_goal_approach: RelativePose, base_path: torch.Tensor, -) -> None: +): """Populate remaining output data fields. Args: @@ -605,12 +836,13 @@ def replay( angular_gain: float = 2.0, linear_gain: float = 1.0, linear_max: float = 1.0, - distance_threshold: float = 0.1, + distance_threshold: float = 0.2, following_offset: float = 0.6, angle_threshold: float = 0.2, - approach_distance: float = 1.0, + approach_distance: float = 0.5, randomize_placement: bool = True, -) -> None: + sensor_camera_view: bool = False, +) -> bool: """Replay a locomanipulation SDG episode with state machine control. This function implements a state machine for locomanipulation SDG, where the robot: @@ -634,10 +866,20 @@ def replay( angle_threshold: Angular threshold for orientation control (rad) approach_distance: Buffer distance from final goal (m) randomize_placement: Whether to randomize obstacle placement + sensor_camera_view: Whether to set the Sim GUI viewport to the robot_pov_cam sensor view + + Returns: + True if the episode ended with success termination, False otherwise. """ + # Reset recorder manager to clear any leftover episode data from previous runs + # This prevents duplicate exports when reset_to calls record_pre_reset + env.recorder_manager.reset(env_ids=[0]) + # Initialize environment to starting state - env.reset_to(state=input_episode_data.get_initial_state(), env_ids=torch.tensor([0]), is_relative=True) + env.reset_to( + state=input_episode_data.get_initial_state(), env_ids=torch.tensor([0], device=env.device), is_relative=True + ) # Create navigation control configuration config = LocomanipulationSDGControlConfig( @@ -650,30 +892,27 @@ def replay( approach_distance=approach_distance, ) - # Set up navigation scene and path planning - occupancy_map, base_path_helper, base_goal, base_goal_approach = setup_navigation_scene( - env, input_episode_data, approach_distance, randomize_placement + nav_scene = setup_navigation_scene( + env, input_episode_data, approach_distance, randomize_placement, draw_visualization ) + if nav_scene is None: + print("Failed to setup navigation scene", flush=True) + return False - # Visualize occupancy map and path if requested - if draw_visualization: - occupancy_map_add_to_stage( - occupancy_map, - stage=omni.usd.get_context().get_stage(), - path="/OccupancyMap", - z_offset=0.01, - draw_path=base_path_helper.points, - ) + if sensor_camera_view: + _set_sensor_camera_view() # Initialize state machine output_data = LocomanipulationSDGOutputData() current_state = LocomanipulationSDGDataGenerationState.GRASP_OBJECT + previous_state = None recording_step = 0 # Main simulation loop with state machine while simulation_app.is_running() and not simulation_app.is_exiting(): - - print(f"Current state: {current_state.name}, Recording step: {recording_step}") + if current_state != previous_state: + print(f"State changed: {current_state.name}, Recording step: {recording_step}", flush=True) + previous_state = current_state # Execute state-specific logic using helper functions if current_state == LocomanipulationSDGDataGenerationState.GRASP_OBJECT: @@ -688,24 +927,32 @@ def replay( elif current_state == LocomanipulationSDGDataGenerationState.NAVIGATE: current_state = handle_navigate_state( - env, input_episode_data, recording_step, base_path_helper, base_goal_approach, config, output_data + env, + input_episode_data, + recording_step, + nav_scene.base_path_helper, + nav_scene.base_goal_approach, + config, + output_data, ) elif current_state == LocomanipulationSDGDataGenerationState.APPROACH: current_state = handle_approach_state( - env, input_episode_data, recording_step, base_goal, config, output_data + env, input_episode_data, recording_step, nav_scene.base_goal, config, output_data ) elif current_state == LocomanipulationSDGDataGenerationState.DROP_OFF_OBJECT: recording_step, next_state = handle_drop_off_state( - env, input_episode_data, recording_step, base_goal, config, output_data + env, input_episode_data, recording_step, nav_scene.base_goal, config, output_data ) if next_state is None: # End of episode data break current_state = next_state # Populate additional output data fields - populate_output_data(env, output_data, base_goal, base_goal_approach, base_path_helper.points) + populate_output_data( + env, output_data, nav_scene.base_goal, nav_scene.base_goal_approach, nav_scene.base_path_helper.points + ) # Attach output data to environment for recording env._locomanipulation_sdg_output_data = output_data @@ -718,33 +965,59 @@ def replay( left_hand_pose_target=output_data.left_hand_pose_target, right_hand_pose_target=output_data.right_hand_pose_target, ) + _, _, reset_terminated, reset_time_outs, _ = env.step(action) - env.step(action) + if reset_terminated[0] or reset_time_outs[0]: + print(f"Environment terminated at state {current_state.name}, step {recording_step}", flush=True) + success_terminated = False + # Check if termination was due to success + if hasattr(env, "termination_manager") and "success" in env.termination_manager.active_terms: + success_terminated = bool(env.termination_manager.get_term("success")[0].item()) -if __name__ == "__main__": + if success_terminated: + print(f"Success termination at state {current_state.name}, step {recording_step}", flush=True) + else: + print(f"Non-success termination at state {current_state.name}, step {recording_step}", flush=True) - with torch.no_grad(): + return success_terminated + print("Replay completed!", flush=True) + return False + + +if __name__ == "__main__": + with torch.no_grad(): # Create environment if args_cli.task is not None: env_name = args_cli.task.split(":")[-1] if env_name is None: raise ValueError("Task/env name was not specified nor found in the dataset.") - env_cfg = parse_env_cfg(env_name, device=args_cli.device, num_envs=1) + env_cfg = parse_env_cfg(env_name, device=args_cli.device, num_envs=1, overrides=hydra_overrides) env_cfg.sim.device = "cpu" env_cfg.recorders.dataset_export_dir_path = os.path.dirname(args_cli.output_file) env_cfg.recorders.dataset_filename = os.path.basename(args_cli.output_file) + env_cfg.recorders.dataset_export_mode = DatasetExportMode.EXPORT_SUCCEEDED_ONLY + env_cfg.recorders.export_in_record_pre_reset = True + + if args_cli.background_usd_path is not None and args_cli.background_occupancy_yaml_file is not None: + env_cfg.background_usd_path = args_cli.background_usd_path + env_cfg.background_occupancy_yaml_file = args_cli.background_occupancy_yaml_file + + env_cfg.high_res_video = args_cli.high_res_video env = gym.make(args_cli.task, cfg=env_cfg).unwrapped # Load input data input_dataset_file_handler = HDF5DatasetFileHandler() input_dataset_file_handler.open(args_cli.dataset) + is_legacy_quat_format = input_dataset_file_handler.is_legacy_quaternion_format() - for i in range(args_cli.num_runs): + run_id = 0 + success_runs = 0 + while success_runs < args_cli.num_runs: if args_cli.demo is None: demo = random.choice(list(input_dataset_file_handler.get_episode_names())) else: @@ -752,7 +1025,17 @@ def replay( input_episode_data = input_dataset_file_handler.load_episode(demo, args_cli.device) - replay( + assert input_episode_data is not None + assert "actions" in input_episode_data.data + + # See G1LocomanipulationSDGEnv.build_action_vector() for the action layout; + # left_quat=[3:7], right_quat=[10:14]. + if is_legacy_quat_format: + actions = input_episode_data.data["actions"] + actions[:, 3:7] = convert_quat(actions[:, 3:7], to="xyzw") # left hand quat + actions[:, 10:14] = convert_quat(actions[:, 10:14], to="xyzw") # right hand quat + + success = replay( env=env, input_episode_data=input_episode_data, lift_step=args_cli.lift_step, @@ -766,9 +1049,20 @@ def replay( angle_threshold=args_cli.angle_threshold, approach_distance=args_cli.approach_distance, randomize_placement=args_cli.randomize_placement, + sensor_camera_view=args_cli.sensor_camera_view, ) - env.reset() # FIXME: hack to handle missing final recording + run_id += 1 + + if success: + success_runs += 1 + print("successful episodes count", env.recorder_manager.exported_successful_episode_count, flush=True) + else: + print(f"Run {run_id} failed (demo={demo}), retrying...", flush=True) + + env.recorder_manager.close() + if getattr(env, "viewport_camera_controller", None) is not None: + env.viewport_camera_controller.update_view_to_world() env.close() simulation_app.close() diff --git a/scripts/imitation_learning/locomanipulation_sdg/plot_navigation_trajectory.py b/scripts/imitation_learning/locomanipulation_sdg/plot_navigation_trajectory.py index 706b2d65..4022ea75 100644 --- a/scripts/imitation_learning/locomanipulation_sdg/plot_navigation_trajectory.py +++ b/scripts/imitation_learning/locomanipulation_sdg/plot_navigation_trajectory.py @@ -1,28 +1,27 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause -"""Script to visualize navigation datasets. +"""Script to visualize navigation datasets from locomanipulation SDG. -Loads a navigation dataset and generates plots showing paths, poses and obstacles. - -Args: - dataset: Path to the HDF5 dataset file containing recorded demonstrations. - output_dir: Directory path where visualization plots will be saved. - figure_size: Size of the generated figures (width, height). - demo_filter: If provided, only visualize specific demo(s). Can be a single demo name or comma-separated list. +Loads an HDF5 dataset containing locomanipulation_sdg_output_data and generates +plots showing base path, base pose, object pose, start/end fixtures, and obstacles. """ import argparse +import os + import h5py import matplotlib.pyplot as plt -import os -def main(): - """Main function to process dataset and generate visualizations.""" - # add argparse arguments +def main() -> None: + """Load dataset, filter demos if requested, and save navigation visualization plots. + + Reads HDF5 from --input_file, optionally restricts to --demo_filter, and writes + one PNG per demo to --output_dir with path, poses, and obstacle positions. + """ parser = argparse.ArgumentParser( description="Visualize navigation dataset from locomanipulation sdg demonstrations." ) @@ -44,22 +43,17 @@ def main(): help="If provided, only visualize specific demo(s). Can be a single demo name or comma-separated list.", ) - # parse the arguments args = parser.parse_args() - # Validate inputs if not os.path.exists(args.input_file): raise FileNotFoundError(f"Dataset file not found: {args.input_file}") - # Create output directory if it doesn't exist os.makedirs(args.output_dir, exist_ok=True) - # Load dataset dataset = h5py.File(args.input_file, "r") demos = list(dataset["data"].keys()) - # Filter demos if specified if args.demo_filter: filter_demos = [d.strip() for d in args.demo_filter.split(",")] demos = [d for d in demos if d in filter_demos] @@ -86,7 +80,6 @@ def main(): plt.plot(object_pose[:, 0], object_pose[:, 1], "b--", label="Object Pose", linewidth=2) plt.plot(obstacle_poses[0, :, 0], obstacle_poses[0, :, 1], "ro", label="Obstacles", markersize=8) - # Add start and end markers plt.plot(start_pose[0, 0], start_pose[0, 1], "gs", label="Start", markersize=12) plt.plot(end_pose[0, 0], end_pose[0, 1], "rs", label="End", markersize=12) diff --git a/scripts/imitation_learning/robomimic/play.py b/scripts/imitation_learning/robomimic/play.py index 77b7d2e1..1f381bb6 100644 --- a/scripts/imitation_learning/robomimic/play.py +++ b/scripts/imitation_learning/robomimic/play.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -22,7 +22,9 @@ import argparse -from isaaclab.app import AppLauncher +from isaaclab.app import AppLauncher, scan + +from isaaclab_tasks.utils import resolve_task_config # add argparse arguments parser = argparse.ArgumentParser(description="Evaluate robomimic policy for Isaac Lab environment.") @@ -40,37 +42,34 @@ parser.add_argument( "--norm_factor_max", type=float, default=None, help="Optional: maximum value of the normalization factor." ) -parser.add_argument("--enable_pinocchio", default=False, action="store_true", help="Enable Pinocchio.") - # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) -# parse the arguments -args_cli = parser.parse_args() - -if args_cli.enable_pinocchio: - # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and not the one installed by Isaac Sim - # pinocchio is required by the Pink IK controllers and the GR1T2 retargeter - import pinocchio # noqa: F401 +# parse the arguments, forwarding unrecognized ones as Hydra-style task config overrides +args_cli, hydra_overrides = parser.parse_known_args() # launch omniverse app -app_launcher = AppLauncher(args_cli) +# Only enable rendering for tasks that actually declare Kit camera sensors: this script also +# plays policies trained on low-dimensional observations, which should not pay for the RTX +# renderer. ``resolve_task_config`` is safe to call before Kit is launched, and ``scan`` is the +# same detection ``launch_simulation`` uses, so this matches how camera enabling is resolved +# elsewhere now that the ``--enable_cameras`` flag is gone. +# ``overrides`` must be passed explicitly: this script keeps its own flags in ``sys.argv`` rather +# than stripping them, so letting Hydra fall back to reading ``sys.argv`` makes it reject them. +env_cfg_for_scan, _ = resolve_task_config(args_cli.task, "", overrides=hydra_overrides) +app_launcher = AppLauncher(args_cli, enable_cameras=scan(env_cfg_for_scan, args_cli).has_kit_camera) simulation_app = app_launcher.app """Rest everything follows.""" import copy -import gymnasium as gym -import numpy as np import random -import torch +import gymnasium as gym +import numpy as np import robomimic.utils.file_utils as FileUtils import robomimic.utils.torch_utils as TorchUtils - -if args_cli.enable_pinocchio: - import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 - import isaaclab_tasks.manager_based.locomanipulation.pick_place # noqa: F401 +import torch from isaaclab_tasks.utils import parse_env_cfg @@ -143,7 +142,13 @@ def rollout(policy, env, success_term, horizon, device): def main(): """Run a trained policy from robomimic with Isaac Lab environment.""" # parse configuration - env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=1, use_fabric=not args_cli.disable_fabric) + env_cfg = parse_env_cfg( + args_cli.task, + device=args_cli.device, + num_envs=1, + use_fabric=not args_cli.disable_fabric, + overrides=hydra_overrides, + ) # Set observations to dictionary mode for Robomimic env_cfg.observations.policy.concatenate_terms = False @@ -170,14 +175,15 @@ def main(): # Acquire device device = TorchUtils.get_torch_device(try_to_use_cuda=True) - # Run policy - results = [] - for trial in range(args_cli.num_rollouts): - print(f"[INFO] Starting trial {trial}") - policy, _ = FileUtils.policy_from_checkpoint(ckpt_path=args_cli.checkpoint, device=device) - terminated, traj = rollout(policy, env, success_term, args_cli.horizon, device) - results.append(terminated) - print(f"[INFO] Trial {trial}: {terminated}\n") + with torch.inference_mode(): + # Run policy + results = [] + for trial in range(args_cli.num_rollouts): + print(f"[INFO] Starting trial {trial}") + policy, _ = FileUtils.policy_from_checkpoint(ckpt_path=args_cli.checkpoint, device=device) + terminated, traj = rollout(policy, env, success_term, args_cli.horizon, device) + results.append(terminated) + print(f"[INFO] Trial {trial}: {terminated}\n") print(f"\nSuccessful trials: {results.count(True)}, out of {len(results)} trials") print(f"Success rate: {results.count(True) / len(results)}") diff --git a/scripts/imitation_learning/robomimic/robust_eval.py b/scripts/imitation_learning/robomimic/robust_eval.py index 1f93d413..32a87554 100644 --- a/scripts/imitation_learning/robomimic/robust_eval.py +++ b/scripts/imitation_learning/robomimic/robust_eval.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -28,7 +28,9 @@ import argparse -from isaaclab.app import AppLauncher +from isaaclab.app import AppLauncher, scan + +from isaaclab_tasks.utils import resolve_task_config # add argparse arguments parser = argparse.ArgumentParser(description="Evaluate robomimic policy for Isaac Lab environment.") @@ -57,33 +59,35 @@ parser.add_argument( "--norm_factor_max", type=float, default=None, help="Optional: maximum value of the normalization factor." ) -parser.add_argument("--enable_pinocchio", default=False, action="store_true", help="Enable Pinocchio.") # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) -# parse the arguments -args_cli = parser.parse_args() - -if args_cli.enable_pinocchio: - # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and not the one installed by Isaac Sim - # pinocchio is required by the Pink IK controllers and the GR1T2 retargeter - import pinocchio # noqa: F401 +# parse the arguments, forwarding unrecognized ones as Hydra-style task config overrides +args_cli, hydra_overrides = parser.parse_known_args() # launch omniverse app -app_launcher = AppLauncher(args_cli) +# Only enable rendering for tasks that actually declare Kit camera sensors: this script also +# evaluates policies trained on low-dimensional observations, which should not pay for the RTX +# renderer. ``resolve_task_config`` is safe to call before Kit is launched, and ``scan`` is the +# same detection ``launch_simulation`` uses, so this matches how camera enabling is resolved +# elsewhere now that the ``--enable_cameras`` flag is gone. +# ``overrides`` must be passed explicitly: this script keeps its own flags in ``sys.argv`` rather +# than stripping them, so letting Hydra fall back to reading ``sys.argv`` makes it reject them. +env_cfg_for_scan, _ = resolve_task_config(args_cli.task, "", overrides=hydra_overrides) +app_launcher = AppLauncher(args_cli, enable_cameras=scan(env_cfg_for_scan, args_cli).has_kit_camera) simulation_app = app_launcher.app """Rest everything follows.""" import copy -import gymnasium as gym import os import pathlib import random -import torch +import gymnasium as gym import robomimic.utils.file_utils as FileUtils import robomimic.utils.torch_utils as TorchUtils +import torch from isaaclab_tasks.utils import parse_env_cfg @@ -219,7 +223,13 @@ def evaluate_model( def main() -> None: """Run evaluation of trained policies from robomimic with Isaac Lab environment.""" # Parse configuration - env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=1, use_fabric=not args_cli.disable_fabric) + env_cfg = parse_env_cfg( + args_cli.task, + device=args_cli.device, + num_envs=1, + use_fabric=not args_cli.disable_fabric, + overrides=hydra_overrides, + ) # Set observations to dictionary mode for Robomimic env_cfg.observations.policy.concatenate_terms = False diff --git a/scripts/imitation_learning/robomimic/train.py b/scripts/imitation_learning/robomimic/train.py index 837a8972..4369f594 100644 --- a/scripts/imitation_learning/robomimic/train.py +++ b/scripts/imitation_learning/robomimic/train.py @@ -1,7 +1,26 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause + +# MIT License +# +# Copyright (c) 2021 Stanford Vision and Learning Lab +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. @@ -34,41 +53,35 @@ """Rest everything follows.""" -# Standard library imports import argparse - -# Third-party imports -import gymnasium as gym -import h5py import importlib import json -import numpy as np import os import shutil import sys import time -import torch import traceback from collections import OrderedDict -from torch.utils.data import DataLoader +import gymnasium as gym +import h5py +import numpy as np import psutil - -# Robomimic imports import robomimic.utils.env_utils as EnvUtils import robomimic.utils.file_utils as FileUtils import robomimic.utils.obs_utils as ObsUtils import robomimic.utils.torch_utils as TorchUtils import robomimic.utils.train_utils as TrainUtils +import torch from robomimic.algo import algo_factory from robomimic.config import Config, config_factory from robomimic.utils.log_utils import DataLogger, PrintLogger +from torch.utils.data import DataLoader -# Isaac Lab imports (needed so that environment is registered) import isaaclab_tasks # noqa: F401 import uwlab_tasks # noqa: F401 -import isaaclab_tasks.manager_based.locomanipulation.pick_place # noqa: F401 -import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 +import isaaclab_tasks.contrib.locomanip_pick_place # noqa: F401 +import isaaclab_tasks.contrib.pick_place # noqa: F401 def normalize_hdf5_actions(config: Config, log_dir: str) -> str: diff --git a/scripts/reinforcement_learning/play.py b/scripts/reinforcement_learning/play.py new file mode 100644 index 00000000..0ca047f3 --- /dev/null +++ b/scripts/reinforcement_learning/play.py @@ -0,0 +1,25 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Unified playback executable for Isaac Lab reinforcement learning workflows.""" + +# Warp captures ``enable_backward`` when a module is created, which happens at import +# time, so it has to be set before importing anything that defines Warp kernels. +# Isaac Lab does not use Warp autodiff; skipping adjoint codegen roughly halves the +# time spent building kernels on a cold kernel cache. +import warp as wp + +wp.config.enable_backward = False + +from isaaclab_rl.entrypoints import run_play_cli # noqa: E402 + + +def main(argv: list[str] | None = None) -> int: + """Run the selected reinforcement learning play library.""" + return run_play_cli(argv) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/reinforcement_learning/ray/grok_cluster_with_kubectl.py b/scripts/reinforcement_learning/ray/grok_cluster_with_kubectl.py index 11c1aa3f..b7b3c5cf 100644 --- a/scripts/reinforcement_learning/ray/grok_cluster_with_kubectl.py +++ b/scripts/reinforcement_learning/ray/grok_cluster_with_kubectl.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -164,11 +164,12 @@ def process_cluster(cluster_info: dict, ray_head_name: str = "head") -> str: For each cluster, check that it is running, and get the Ray head address that will accept jobs. Args: - cluster_info (dict): A dictionary containing cluster information with keys 'cluster', 'pods', and 'namespace'. - ray_head_name (str, optional): The name of the ray head container. Defaults to "head". + cluster_info: A dictionary containing cluster information with keys 'cluster', 'pods', and 'namespace'. + ray_head_name: The name of the ray head container. Defaults to "head". Returns: - str: A string containing the cluster name and its Ray head address, or an error message if the head pod or Ray address is not found. + A string containing the cluster name and its Ray head address, or an error message if + the head pod or Ray address is not found. """ cluster, pods, namespace = cluster_info head_pod = None diff --git a/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cartpole_cfg.py b/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cartpole_cfg.py index 6e8d9a08..20318d35 100644 --- a/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cartpole_cfg.py +++ b/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cartpole_cfg.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause import pathlib @@ -13,44 +13,62 @@ import util import vision_cfg from ray import tune +from ray.tune.progress_reporter import CLIReporter from ray.tune.stopper import Stopper class CartpoleRGBNoTuneJobCfg(vision_cfg.CameraJobCfg): def __init__(self, cfg: dict = {}): cfg = util.populate_isaac_ray_cfg_args(cfg) - cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-RGB-v0"]) + cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-Camera"]) super().__init__(cfg, vary_env_count=False, vary_cnn=False, vary_mlp=False) class CartpoleRGBCNNOnlyJobCfg(vision_cfg.CameraJobCfg): def __init__(self, cfg: dict = {}): cfg = util.populate_isaac_ray_cfg_args(cfg) - cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-RGB-v0"]) + cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-Camera"]) super().__init__(cfg, vary_env_count=False, vary_cnn=True, vary_mlp=False) class CartpoleRGBJobCfg(vision_cfg.CameraJobCfg): def __init__(self, cfg: dict = {}): cfg = util.populate_isaac_ray_cfg_args(cfg) - cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-RGB-v0"]) + cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-Camera"]) super().__init__(cfg, vary_env_count=True, vary_cnn=True, vary_mlp=True) class CartpoleResNetJobCfg(vision_cfg.ResNetCameraJob): def __init__(self, cfg: dict = {}): cfg = util.populate_isaac_ray_cfg_args(cfg) - cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-RGB-ResNet18-v0"]) + cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-Camera"]) + cfg["hydra_args"]["presets"] = "resnet18" super().__init__(cfg) class CartpoleTheiaJobCfg(vision_cfg.TheiaCameraJob): def __init__(self, cfg: dict = {}): cfg = util.populate_isaac_ray_cfg_args(cfg) - cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-RGB-TheiaTiny-v0"]) + cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-Camera"]) + cfg["hydra_args"]["presets"] = "theia_tiny" super().__init__(cfg) +class CustomCartpoleProgressReporter(CLIReporter): + def __init__(self): + super().__init__( + metric_columns={ + "training_iteration": "iter", + "time_total_s": "total time (s)", + "Episode/Episode_Reward/alive": "alive", + "Episode/Episode_Reward/cart_vel": "cart velocity", + "rewards/time": "rewards/time", + }, + max_report_frequency=5, + sort_by_metric=True, + ) + + class CartpoleEarlyStopper(Stopper): def __init__(self): self._bad_trials = set() @@ -60,7 +78,7 @@ def __call__(self, trial_id: str, result: dict[str, Any]) -> bool: out_of_bounds = result.get("Episode/Episode_Termination/cart_out_of_bounds") # Mark the trial for stopping if conditions are met - if 20 <= iter and out_of_bounds is not None and out_of_bounds > 0.85: + if iter >= 20 and out_of_bounds is not None and out_of_bounds > 0.85: self._bad_trials.add(trial_id) return trial_id in self._bad_trials diff --git a/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cfg.py b/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cfg.py index b6665538..08fa8e20 100644 --- a/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cfg.py +++ b/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cfg.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -32,8 +32,6 @@ def __init__(self, cfg={}, vary_env_count: bool = False, vary_cnn: bool = False, cfg = util.populate_isaac_ray_cfg_args(cfg) # Basic configuration - cfg["runner_args"]["headless_singleton"] = "--headless" - cfg["runner_args"]["enable_cameras_singleton"] = "--enable_cameras" cfg["hydra_args"]["agent.params.config.max_epochs"] = 200 if vary_env_count: # Vary the env count, and horizon length, and select a compatible mini-batch size @@ -85,12 +83,14 @@ def get_cnn_layers(_): if next_size <= 0: break - layers.append({ - "filters": tune.randint(16, 32).sample(), - "kernel_size": str(kernel), - "strides": str(stride), - "padding": str(padding), - }) + layers.append( + { + "filters": tune.randint(16, 32).sample(), + "kernel_size": str(kernel), + "strides": str(stride), + "padding": str(padding), + } + ) size = next_size return layers @@ -98,7 +98,6 @@ def get_cnn_layers(_): cfg["hydra_args"]["agent.params.network.cnn.convs"] = tune.sample_from(get_cnn_layers) if vary_mlp: # Vary the MLP structure; neurons (units) per layer, number of layers, - max_num_layers = 6 max_neurons_per_layer = 128 if "env.observations.policy.image.params.model_name" in cfg["hydra_args"]: @@ -140,12 +139,14 @@ class TheiaCameraJob(CameraJobCfg): def __init__(self, cfg: dict = {}): cfg = util.populate_isaac_ray_cfg_args(cfg) - cfg["hydra_args"]["env.observations.policy.image.params.model_name"] = tune.choice([ - "theia-tiny-patch16-224-cddsv", - "theia-tiny-patch16-224-cdiv", - "theia-small-patch16-224-cdiv", - "theia-base-patch16-224-cdiv", - "theia-small-patch16-224-cddsv", - "theia-base-patch16-224-cddsv", - ]) + cfg["hydra_args"]["env.observations.policy.image.params.model_name"] = tune.choice( + [ + "theia-tiny-patch16-224-cddsv", + "theia-tiny-patch16-224-cdiv", + "theia-small-patch16-224-cdiv", + "theia-base-patch16-224-cdiv", + "theia-small-patch16-224-cddsv", + "theia-base-patch16-224-cddsv", + ] + ) super().__init__(cfg, vary_env_count=True, vary_cnn=False, vary_mlp=True) diff --git a/scripts/reinforcement_learning/ray/launch.py b/scripts/reinforcement_learning/ray/launch.py index 43196d47..3a3be716 100644 --- a/scripts/reinforcement_learning/ray/launch.py +++ b/scripts/reinforcement_learning/ray/launch.py @@ -1,17 +1,8 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause -import argparse -import pathlib -import subprocess -import yaml - -import util -from jinja2 import Environment, FileSystemLoader -from kubernetes import config - """This script helps create one or more KubeRay clusters. Usage: @@ -34,6 +25,18 @@ --num_workers 1 2 --num_clusters 1 \ --worker_accelerator nvidia-l4 nvidia-tesla-t4 --gpu_per_worker 1 2 4 """ + +import argparse +import pathlib +import subprocess + +import yaml +from jinja2 import Environment, FileSystemLoader +from kubernetes import config + +# Local imports +import util # isort: skip + RAY_DIR = pathlib.Path(__file__).parent diff --git a/scripts/reinforcement_learning/ray/mlflow_to_local_tensorboard.py b/scripts/reinforcement_learning/ray/mlflow_to_local_tensorboard.py index 4c932e32..2c45f1cd 100644 --- a/scripts/reinforcement_learning/ray/mlflow_to_local_tensorboard.py +++ b/scripts/reinforcement_learning/ray/mlflow_to_local_tensorboard.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -9,10 +9,10 @@ import os import sys from concurrent.futures import ProcessPoolExecutor, as_completed -from torch.utils.tensorboard import SummaryWriter import mlflow from mlflow.tracking import MlflowClient +from torch.utils.tensorboard import SummaryWriter def setup_logging(level=logging.INFO): diff --git a/scripts/reinforcement_learning/ray/submit_job.py b/scripts/reinforcement_learning/ray/submit_job.py index 75b8b534..21fb6a3d 100644 --- a/scripts/reinforcement_learning/ray/submit_job.py +++ b/scripts/reinforcement_learning/ray/submit_job.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -46,7 +46,8 @@ python3 scripts/reinforcement_learning/ray/submit_job.py --aggregate_jobs wrap_resources.py --test # Example: submitting tasks with specific resources, and supporting pip packages and py_modules - # You may use relative paths for task_cfg and py_modules, placing them in the scripts/reinforcement_learning/ray directory, which will be uploaded to the cluster. + # You may use relative paths for task_cfg and py_modules, placing them in the + # "scripts/reinforcement_learning/ray" directory, which will be uploaded to the cluster. python3 scripts/reinforcement_learning/ray/submit_job.py --aggregate_jobs task_runner.py --task_cfg tasks.yaml # For all command line arguments diff --git a/scripts/reinforcement_learning/ray/task_runner.py b/scripts/reinforcement_learning/ray/task_runner.py index 6ac3ef51..7b10237f 100644 --- a/scripts/reinforcement_learning/ray/task_runner.py +++ b/scripts/reinforcement_learning/ray/task_runner.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -22,8 +22,13 @@ - `pip`: List of extra pip packages to install before running any tasks. - `py_modules`: List of additional Python module paths (directories or files) to include in the runtime environment. - `concurrent`: (bool) It determines task dispatch semantics: - - If `concurrent: true`, **all tasks are scheduled as a batch**. The script waits until sufficient resources are available for every task in the batch, then launches all tasks together. If resources are insufficient, all tasks remain blocked until the cluster can support the full batch. - - If `concurrent: false`, tasks are launched as soon as resources are available for each individual task, and Ray independently schedules them. This may result in non-simultaneous task start times. + - If `concurrent: true`, **all tasks are scheduled as a batch**. The script waits until + sufficient resources are available for every task in the batch, then launches all tasks + together. If resources are insufficient, all tasks remain blocked until the cluster can + support the full batch. + - If `concurrent: false`, tasks are launched as soon as resources are available for each + individual task, and Ray independently schedules them. This may result in non-simultaneous + task start times. - `tasks`: List of task specifications, each with: - `name`: String identifier for the task. - `py_args`: Arguments to the Python interpreter (e.g., script/module, flags, user arguments). @@ -33,14 +38,16 @@ - `node` (optional): Node placement constraints. - `specific` (str): Type of node placement, support `hostname`, `node_id`, or `any`. - `any`: Place the task on any available node. - - `hostname`: Place the task on a specific hostname. `hostname` must be specified in the node field. - - `node_id`: Place the task on a specific node ID. `node_id` must be specified in the node field. + - `hostname`: Place the task on a specific hostname. `hostname` must be specified + in the node field. + - `node_id`: Place the task on a specific node ID. `node_id` must be specified in + the node field. - `hostname` (str): Specific hostname to place the task on. - `node_id` (str): Specific node ID to place the task on. Typical usage: ---------------- +-------------- .. code-block:: bash @@ -51,15 +58,16 @@ python task_runner.py --task_cfg /path/to/tasks.yaml YAML configuration example-1: ---------------------------- +----------------------------- + .. code-block:: yaml pip: ["xxx"] py_modules: ["my_package/my_package"] concurrent: false tasks: - - name: "Isaac-Cartpole-v0" - py_args: "-m torch.distributed.run --nnodes=1 --nproc_per_node=2 --rdzv_endpoint=localhost:29501 /workspace/isaaclab/scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --max_iterations 200 --headless --distributed" + - name: "Isaac-Cartpole" + py_args: "-m torch.distributed.run --nnodes=1 --nproc_per_node=2 --rdzv_endpoint=localhost:29501 /workspace/isaaclab/scripts/reinforcement_learning/train.py --rl_library rsl_rl --task=Isaac-Cartpole --max_iterations 200 --distributed" num_gpus: 2 num_cpus: 10 memory: 10737418240 @@ -70,23 +78,24 @@ memory: 10*1024*1024*1024 YAML configuration example-2: ---------------------------- +----------------------------- + .. code-block:: yaml pip: ["xxx"] py_modules: ["my_package/my_package"] concurrent: true tasks: - - name: "Isaac-Cartpole-v0-multi-node-train-1" - py_args: "-m torch.distributed.run --nproc_per_node=1 --nnodes=2 --node_rank=0 --rdzv_id=123 --rdzv_backend=c10d --rdzv_endpoint=localhost:5555 /workspace/isaaclab/scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --headless --distributed --max_iterations 1000" + - name: "Isaac-Cartpole-multi-node-train-1" + py_args: "-m torch.distributed.run --nproc_per_node=1 --nnodes=2 --node_rank=0 --rdzv_id=123 --rdzv_backend=c10d --rdzv_endpoint=localhost:5555 /workspace/isaaclab/scripts/reinforcement_learning/train.py --rl_library rsl_rl --task=Isaac-Cartpole --distributed --max_iterations 1000" num_gpus: 1 num_cpus: 10 memory: 10*1024*1024*1024 node: specific: "hostname" hostname: "xxx" - - name: "Isaac-Cartpole-v0-multi-node-train-2" - py_args: "-m torch.distributed.run --nproc_per_node=1 --nnodes=2 --node_rank=1 --rdzv_id=123 --rdzv_backend=c10d --rdzv_endpoint=x.x.x.x:5555 /workspace/isaaclab/scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --headless --distributed --max_iterations 1000" + - name: "Isaac-Cartpole-multi-node-train-2" + py_args: "-m torch.distributed.run --nproc_per_node=1 --nnodes=2 --node_rank=1 --rdzv_id=123 --rdzv_backend=c10d --rdzv_endpoint=x.x.x.x:5555 /workspace/isaaclab/scripts/reinforcement_learning/train.py --rl_library rsl_rl --task=Isaac-Cartpole --distributed --max_iterations 1000" num_gpus: 1 num_cpus: 10 memory: 10*1024*1024*1024 @@ -95,13 +104,69 @@ hostname: "xxx" To stop all tasks early, press Ctrl+C; the script will cancel all running Ray tasks. -""" +""" # noqa: E501 import argparse -import yaml +import ast +import operator from datetime import datetime -import util +import yaml + +# Local imports +import util # isort: skip + +# Safe operators for arithmetic expression evaluation +_SAFE_OPERATORS = { + ast.Add: operator.add, + ast.Sub: operator.sub, + ast.Mult: operator.mul, + ast.Div: operator.truediv, + ast.FloorDiv: operator.floordiv, + ast.Pow: operator.pow, + ast.Mod: operator.mod, + ast.USub: operator.neg, + ast.UAdd: operator.pos, +} + + +def safe_eval_arithmetic(expr: str) -> int | float: + """ + Safely evaluate a string containing only arithmetic expressions. + + Supports: +, -, *, /, //, **, % and numeric literals. + Raises ValueError for any non-arithmetic expressions. + + Args: + expr: A string containing an arithmetic expression (e.g., "10*1024*1024"). + + Returns: + The numeric result of the expression. + + Raises: + ValueError: If the expression contains non-arithmetic operations. + """ + + def _eval_node(node: ast.AST) -> int | float: + if isinstance(node, ast.Expression): + return _eval_node(node.body) + elif isinstance(node, ast.Constant) and isinstance(node.value, (int, float)): + return node.value + elif isinstance(node, ast.BinOp) and type(node.op) in _SAFE_OPERATORS: + left = _eval_node(node.left) + right = _eval_node(node.right) + return _SAFE_OPERATORS[type(node.op)](left, right) + elif isinstance(node, ast.UnaryOp) and type(node.op) in _SAFE_OPERATORS: + operand = _eval_node(node.operand) + return _SAFE_OPERATORS[type(node.op)](operand) + else: + raise ValueError(f"Unsafe expression: {ast.dump(node)}") + + try: + tree = ast.parse(expr.strip(), mode="eval") + return _eval_node(tree) + except (SyntaxError, TypeError) as e: + raise ValueError(f"Invalid arithmetic expression: {expr}") from e def parse_args() -> argparse.Namespace: @@ -109,7 +174,7 @@ def parse_args() -> argparse.Namespace: Parse command-line arguments for the Ray task runner. Returns: - argparse.Namespace: The namespace containing parsed CLI arguments: + A namespace containing parsed CLI arguments: - task_cfg (str): Path to the YAML task file. - ray_address (str): Ray cluster address. - test (bool): Whether to run a GPU resource isolation sanity check. @@ -143,11 +208,14 @@ def parse_task_resource(task: dict) -> util.JobResource: """ resource = util.JobResource() if "num_gpus" in task: - resource.num_gpus = eval(task["num_gpus"]) if isinstance(task["num_gpus"], str) else task["num_gpus"] + value = task["num_gpus"] + resource.num_gpus = safe_eval_arithmetic(value) if isinstance(value, str) else value if "num_cpus" in task: - resource.num_cpus = eval(task["num_cpus"]) if isinstance(task["num_cpus"], str) else task["num_cpus"] + value = task["num_cpus"] + resource.num_cpus = safe_eval_arithmetic(value) if isinstance(value, str) else value if "memory" in task: - resource.memory = eval(task["memory"]) if isinstance(task["memory"], str) else task["memory"] + value = task["memory"] + resource.memory = safe_eval_arithmetic(value) if isinstance(value, str) else value return resource diff --git a/scripts/reinforcement_learning/ray/tuner.py b/scripts/reinforcement_learning/ray/tuner.py index 908aca1b..92357cf4 100644 --- a/scripts/reinforcement_learning/ray/tuner.py +++ b/scripts/reinforcement_learning/ray/tuner.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause import argparse @@ -14,6 +14,7 @@ import util from ray import air, tune from ray.tune import Callback +from ray.tune.progress_reporter import ProgressReporter from ray.tune.search.optuna import OptunaSearch from ray.tune.search.repeater import Repeater from ray.tune.stopper import CombinedStopper @@ -41,15 +42,20 @@ .. code-block:: bash - ./isaaclab.sh -p scripts/reinforcement_learning/ray/tuner.py -h + uv run python scripts/reinforcement_learning/ray/tuner.py -h # Examples # Local - ./isaaclab.sh -p scripts/reinforcement_learning/ray/tuner.py --run_mode local \ + uv run python scripts/reinforcement_learning/ray/tuner.py --run_mode local \ --cfg_file scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cartpole_cfg.py \ --cfg_class CartpoleTheiaJobCfg + # Local with a custom progress reporter + uv run python scripts/reinforcement_learning/ray/tuner.py \ + --cfg_file scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cartpole_cfg.py \ + --cfg_class CartpoleTheiaJobCfg \ + --progress_reporter CustomCartpoleProgressReporter # Remote (run grok cluster or create config file mentioned in :file:`submit_job.py`) - ./isaaclab.sh -p scripts/reinforcement_learning/ray/submit_job.py \ + uv run python scripts/reinforcement_learning/ray/submit_job.py \ --aggregate_jobs tuner.py \ --cfg_file hyperparameter_tuning/vision_cartpole_cfg.py \ --cfg_class CartpoleTheiaJobCfg --mlflow_uri @@ -59,7 +65,7 @@ DOCKER_PREFIX = "/workspace/isaaclab/" BASE_DIR = os.path.expanduser("~") PYTHON_EXEC = "./isaaclab.sh -p" -WORKFLOW = "scripts/reinforcement_learning/rl_games/train.py" +WORKFLOW = "scripts/reinforcement_learning/train.py" NUM_WORKERS_PER_NODE = 1 # needed for local parallelism PROCESS_RESPONSE_TIMEOUT = 200.0 # seconds to wait before killing the process when it stops responding MAX_LINES_TO_SEARCH_EXPERIMENT_LOGS = 1000 # maximum number of lines to read from the training process logs @@ -229,6 +235,7 @@ def _cleanup_trial(self, trial): def invoke_tuning_run( cfg: dict, args: argparse.Namespace, + progress_reporter: ProgressReporter | None = None, stopper: tune.Stopper | None = None, ) -> None: """Invoke an Isaac-Ray tuning run. @@ -237,6 +244,7 @@ def invoke_tuning_run( Args: cfg: Configuration dictionary extracted from job setup args: Command-line arguments related to tuning. + progress_reporter: Custom progress reporter. Defaults to CLIReporter or JupyterNotebookReporter if not provided. stopper: Custom stopper, optional. """ # Allow for early exit @@ -266,10 +274,23 @@ def invoke_tuning_run( repeat_search = Repeater(searcher, repeat=args.repeat_run_count) # Configure the stoppers - stoppers: CombinedStopper = CombinedStopper(*[ - LogExtractionErrorStopper(max_errors=MAX_LOG_EXTRACTION_ERRORS), - *([stopper] if stopper is not None else []), - ]) + stoppers: CombinedStopper = CombinedStopper( + *[ + LogExtractionErrorStopper(max_errors=MAX_LOG_EXTRACTION_ERRORS), + *([stopper] if stopper is not None else []), + ] + ) + + if progress_reporter is not None: + os.environ["RAY_AIR_NEW_OUTPUT"] = "0" + if ( + getattr(progress_reporter, "_metric", None) is not None + or getattr(progress_reporter, "_mode", None) is not None + ): + raise ValueError( + "Do not set or directly in the custom progress reporter class, " + "provide them as arguments to tuner.py instead." + ) if args.run_mode == "local": # Standard config, to file run_config = air.RunConfig( @@ -282,6 +303,7 @@ def invoke_tuning_run( checkpoint_at_end=False, # Disable final checkpoint ), stop=stoppers, + progress_reporter=progress_reporter, ) elif args.run_mode == "remote": # MLFlow, to MLFlow server @@ -298,6 +320,7 @@ def invoke_tuning_run( callbacks=[ProcessCleanupCallback(), mlflow_callback], checkpoint_config=ray.train.CheckpointConfig(checkpoint_frequency=0, checkpoint_at_end=False), stop=stoppers, + progress_reporter=progress_reporter, ) else: raise ValueError("Unrecognized run mode.") @@ -335,13 +358,13 @@ def __init__(self, cfg: dict): """ Runner args include command line arguments passed to the task. For example: - cfg["runner_args"]["headless_singleton"] = "--headless" - cfg["runner_args"]["enable_cameras_singleton"] = "--enable_cameras" + cfg["runner_args"]["video_singleton"] = "--video" """ assert "runner_args" in cfg, "No runner arguments specified." + cfg["runner_args"].setdefault("--rl_library", "rsl_rl") """ Task is the desired task to train on. For example: - cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-RGB-TheiaTiny-v0"]) + cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-Camera"]) """ assert "--task" in cfg["runner_args"], "No task specified." """ @@ -373,10 +396,7 @@ def __init__(self, cfg: dict): "--run_mode", choices=["local", "remote"], default="remote", - help=( - "Set to local to use ./isaaclab.sh -p python, set to " - "remote to use /workspace/isaaclab/isaaclab.sh -p python" - ), + help=("Set to local to use uv run python, set to remote to use /workspace/isaaclab/isaaclab.sh -p python"), ) parser.add_argument( "--workflow", @@ -435,6 +455,16 @@ def __init__(self, cfg: dict): default=MAX_LOG_EXTRACTION_ERRORS, help="Max number number of LogExtractionError failures before we abort the whole tuning run.", ) + parser.add_argument( + "--progress_reporter", + type=str, + default=None, + help=( + "Optional: name of a custom reporter class defined in the cfg_file. " + "Must subclass ray.tune.ProgressReporter " + "(e.g., CustomCartpoleProgressReporter)." + ), + ) parser.add_argument( "--stopper", type=str, @@ -508,7 +538,16 @@ def __init__(self, cfg: dict): else: raise TypeError(f"[ERROR]: Unsupported stop criteria type: {type(stopper)}") print(f"[INFO]: Loaded custom stop criteria from '{args.stopper}'") - invoke_tuning_run(cfg, args, stopper=stopper) + # Load optional progress reporter config + progress_reporter = None + if args.progress_reporter and hasattr(module, args.progress_reporter): + progress_reporter = getattr(module, args.progress_reporter) + if isinstance(progress_reporter, type) and issubclass(progress_reporter, tune.ProgressReporter): + progress_reporter = progress_reporter() + else: + raise TypeError(f"[ERROR]: {args.progress_reporter} is not a valid ProgressReporter.") + print(f"[INFO]: Loaded custom progress reporter from '{args.progress_reporter}'") + invoke_tuning_run(cfg, args, progress_reporter=progress_reporter, stopper=stopper) else: raise AttributeError(f"[ERROR]:Class '{class_name}' not found in {file_path}") diff --git a/scripts/reinforcement_learning/ray/util.py b/scripts/reinforcement_learning/ray/util.py index c6eb79e0..c14b1f0b 100644 --- a/scripts/reinforcement_learning/ray/util.py +++ b/scripts/reinforcement_learning/ray/util.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause import argparse @@ -60,7 +60,7 @@ def get_latest_scalars(path: str) -> dict: def get_invocation_command_from_cfg( cfg: dict, python_cmd: str = "/workspace/isaaclab/isaaclab.sh -p", - workflow: str = "scripts/reinforcement_learning/rl_games/train.py", + workflow: str = "scripts/reinforcement_learning/train.py", ) -> str: """Generate command with proper Hydra arguments""" runner_args = [] diff --git a/scripts/reinforcement_learning/ray/wrap_resources.py b/scripts/reinforcement_learning/ray/wrap_resources.py index 127b1764..7043b23e 100644 --- a/scripts/reinforcement_learning/ray/wrap_resources.py +++ b/scripts/reinforcement_learning/ray/wrap_resources.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -40,22 +40,22 @@ .. code-block:: bash # **Ensure that sub-jobs are separated by the ``+`` delimiter.** # Generic Templates----------------------------------- - ./isaaclab.sh -p scripts/reinforcement_learning/ray/wrap_resources.py -h + uv run python scripts/reinforcement_learning/ray/wrap_resources.py -h # No resource isolation; no parallelization: - ./isaaclab.sh -p scripts/reinforcement_learning/ray/wrap_resources.py + uv run python scripts/reinforcement_learning/ray/wrap_resources.py --sub_jobs ++ # Automatic Resource Isolation; Example A: needed for parallelization - ./isaaclab.sh -p scripts/reinforcement_learning/ray/wrap_resources.py \ + uv run python scripts/reinforcement_learning/ray/wrap_resources.py \ --num_workers \ --sub_jobs + # Manual Resource Isolation; Example B: needed for parallelization - ./isaaclab.sh -p scripts/reinforcement_learning/ray/wrap_resources.py --num_cpu_per_worker \ + uv run python scripts/reinforcement_learning/ray/wrap_resources.py --num_cpu_per_worker \ --gpu_per_worker --ram_gb_per_worker --sub_jobs + # Manual Resource Isolation; Example C: Needed for parallelization, for heterogeneous workloads - ./isaaclab.sh -p scripts/reinforcement_learning/ray/wrap_resources.py --num_cpu_per_worker \ + uv run python scripts/reinforcement_learning/ray/wrap_resources.py --num_cpu_per_worker \ --gpu_per_worker --ram_gb_per_worker --sub_jobs + # to see all arguments - ./isaaclab.sh -p scripts/reinforcement_learning/ray/wrap_resources.py -h + uv run python scripts/reinforcement_learning/ray/wrap_resources.py -h """ import argparse diff --git a/scripts/reinforcement_learning/rsl_rl/cli_args.py b/scripts/reinforcement_learning/rsl_rl/cli_args.py index 215003b5..c09fd85e 100644 --- a/scripts/reinforcement_learning/rsl_rl/cli_args.py +++ b/scripts/reinforcement_learning/rsl_rl/cli_args.py @@ -29,7 +29,7 @@ def add_rsl_rl_args(parser: argparse.ArgumentParser): ) arg_group.add_argument("--run_name", type=str, default=None, help="Run name suffix to the log directory.") # -- load arguments - arg_group.add_argument("--resume", action="store_true", default=False, help="Whether to resume from a checkpoint.") + arg_group.add_argument("--resume", action="store_true", default=None, help="Whether to resume from a checkpoint.") arg_group.add_argument("--load_run", type=str, default=None, help="Name of the run folder to resume from.") arg_group.add_argument("--checkpoint", type=str, default=None, help="Checkpoint file to resume from.") # -- logger arguments @@ -81,6 +81,10 @@ def update_rsl_rl_cfg(agent_cfg: RslRlBaseRunnerCfg, args_cli: argparse.Namespac agent_cfg.load_run = args_cli.load_run if args_cli.checkpoint is not None: agent_cfg.load_checkpoint = args_cli.checkpoint + if args_cli.experiment_name is not None: + agent_cfg.experiment_name = args_cli.experiment_name + if getattr(args_cli, "device", None) is not None: + agent_cfg.device = args_cli.device if args_cli.run_name is not None: agent_cfg.run_name = args_cli.run_name if args_cli.logger is not None: diff --git a/scripts/reinforcement_learning/train.py b/scripts/reinforcement_learning/train.py new file mode 100644 index 00000000..8e1d530c --- /dev/null +++ b/scripts/reinforcement_learning/train.py @@ -0,0 +1,30 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Unified training executable for Isaac Lab reinforcement learning workflows.""" + +# Warp captures ``enable_backward`` when a module is created, which happens at import +# time, so it has to be set before importing anything that defines Warp kernels. +# Isaac Lab does not use Warp autodiff; skipping adjoint codegen roughly halves the +# time spent building kernels on a cold kernel cache. +import warp as wp + +wp.config.enable_backward = False + +from isaaclab_rl.entrypoints import run_train_cli # noqa: E402 + + +def main(argv: list[str] | None = None) -> int: + """Run the selected reinforcement learning training library.""" + return run_train_cli(argv) + + +if __name__ == "__main__": + # ``record`` writes the failing rank's traceback to the error file that torchrun reports as the + # root cause. Without it, a crash on a non-zero rank surfaces only as an exit code, which is + # invisible when console output is filtered to rank 0. Outside torchrun it is a no-op. + from torch.distributed.elastic.multiprocessing.errors import record + + raise SystemExit(record(main)()) diff --git a/scripts/reinforcement_learning/train_multigpu.py b/scripts/reinforcement_learning/train_multigpu.py new file mode 100644 index 00000000..cb094246 --- /dev/null +++ b/scripts/reinforcement_learning/train_multigpu.py @@ -0,0 +1,17 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Multi-GPU training executable for Isaac Lab reinforcement learning workflows.""" + +from isaaclab_rl.entrypoints import run_train_multigpu_cli + + +def main(argv: list[str] | None = None) -> int: + """Launch multi-GPU training with the selected distributed launcher.""" + return run_train_multigpu_cli(argv) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/tools/blender_obj.py b/scripts/tools/blender_obj.py index 16b55133..c03a525f 100644 --- a/scripts/tools/blender_obj.py +++ b/scripts/tools/blender_obj.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -17,10 +17,11 @@ The script was tested on Blender 3.2 on Ubuntu 20.04LTS. """ -import bpy import os import sys +import bpy + def parse_cli_args(): """Parse the input command line arguments.""" diff --git a/scripts/tools/check_instanceable.py b/scripts/tools/check_instanceable.py index b3e9d51a..8cd5cce3 100644 --- a/scripts/tools/check_instanceable.py +++ b/scripts/tools/check_instanceable.py @@ -1,19 +1,21 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause """ This script uses the cloner API to check if asset has been instanced properly. +An asset path may be a local file or a Nucleus/HTTPS URL; remote assets are downloaded before use. + Usage with different inputs (replace `` and `` with the path to the original asset and the instanced asset respectively): ```bash -./isaaclab.sh -p source/tools/check_instanceable.py -n 4096 --headless --physics -./isaaclab.sh -p source/tools/check_instanceable.py -n 4096 --headless --physics -./isaaclab.sh -p source/tools/check_instanceable.py -n 4096 --headless -./isaaclab.sh -p source/tools/check_instanceable.py -n 4096 --headless +uv run python scripts/tools/check_instanceable.py -n 4096 --physics +uv run python scripts/tools/check_instanceable.py -n 4096 --physics +uv run python scripts/tools/check_instanceable.py -n 4096 +uv run python scripts/tools/check_instanceable.py -n 4096 ``` Output from the above commands: @@ -42,7 +44,6 @@ import argparse import contextlib -import os from isaaclab.app import AppLauncher @@ -64,13 +65,16 @@ """Rest everything follows.""" -from isaacsim.core.api.simulation_context import SimulationContext +from isaaclab.sim.utils import enable_extension + +enable_extension("isaacsim.core.cloner") + from isaacsim.core.cloner import GridCloner -from isaaclab.sim.utils import create_prim, get_current_stage -from isaaclab.sim.utils.legacy import define_prim +import isaaclab.sim as sim_utils +from isaaclab.sim import SimulationCfg, SimulationContext from isaaclab.utils import Timer -from isaaclab.utils.assets import check_file_path +from isaaclab.utils.assets import check_file_path, retrieve_file_path def main(): @@ -79,33 +83,27 @@ def main(): if not check_file_path(args_cli.input): raise ValueError(f"Invalid file path: {args_cli.input}") # Load kit helper - sim = SimulationContext( - stage_units_in_meters=1.0, physics_dt=0.01, rendering_dt=0.01, backend="torch", device="cuda:0" - ) + sim = SimulationContext(SimulationCfg(dt=0.01)) # get stage handle - stage = get_current_stage() - - # enable fabric which avoids passing data over to USD structure - # this speeds up the read-write operation of GPU buffers - if sim.get_physics_context().use_gpu_pipeline: - sim.get_physics_context().enable_fabric(True) - # increase GPU buffer dimensions - sim.get_physics_context().set_gpu_found_lost_aggregate_pairs_capacity(2**25) - sim.get_physics_context().set_gpu_total_aggregate_pairs_capacity(2**21) + stage = sim_utils.get_current_stage() + + # Fabric and PhysX GPU buffers are configured through SimulationCfg/PhysxCfg defaults. # enable hydra scene-graph instancing # this is needed to visualize the scene when fabric is enabled - sim._settings.set("/persistent/omnihydra/useSceneGraphInstancing", True) + sim.set_setting("/persistent/omnihydra/useSceneGraphInstancing", True) # Create interface to clone the scene cloner = GridCloner(spacing=args_cli.spacing, stage=stage) cloner.define_base_env("/World/envs") - define_prim("/World/envs/env_0") + stage.DefinePrim("/World/envs/env_0", "Xform") # Spawn things into stage - create_prim("/World/Light", "DistantLight") + sim_utils.create_prim("/World/Light", "DistantLight") - # Everything under the namespace "/World/envs/env_0" will be cloned - create_prim("/World/envs/env_0/Asset", "Xform", usd_path=os.path.abspath(args_cli.input)) + # Everything under the namespace "/World/envs/env_0" will be cloned. + # Resolve through retrieve_file_path so Nucleus/HTTPS inputs are downloaded first; applying + # os.path.abspath() to a URL would prepend the working directory and corrupt it. + sim_utils.create_prim("/World/envs/env_0/Asset", "Xform", usd_path=retrieve_file_path(args_cli.input)) # Clone the scene num_clones = args_cli.num_clones diff --git a/scripts/tools/convert_instanceable.py b/scripts/tools/convert_instanceable.py index 73c2dd6c..7713bdc7 100644 --- a/scripts/tools/convert_instanceable.py +++ b/scripts/tools/convert_instanceable.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -89,7 +89,6 @@ def main(): - # Define conversion time given conversion_type = args_cli.conversion_type.lower() # Warning if conversion type input is not valid diff --git a/scripts/tools/convert_mesh.py b/scripts/tools/convert_mesh.py index 513d0fef..0493bc3f 100644 --- a/scripts/tools/convert_mesh.py +++ b/scripts/tools/convert_mesh.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -31,7 +31,8 @@ -h, --help Show this help message and exit --make-instanceable, Make the asset instanceable for efficient cloning. (default: False) --collision-approximation The method used for approximating collision mesh. Defaults to convexDecomposition. - Set to \"none\" to not add a collision mesh to the converted mesh. (default: convexDecomposition) + Set to \"none\" to not add a collision mesh to the converted mesh. + (default: convexDecomposition) --mass The mass (in kg) to assign to the converted asset. (default: None) """ @@ -89,13 +90,9 @@ """Rest everything follows.""" -import contextlib import os -import carb -from isaaclab.sim.utils import open_stage -import omni.kit.app - +import isaaclab.sim as sim_utils from isaaclab.sim.converters import MeshConverter, MeshConverterCfg from isaaclab.sim.schemas import schemas_cfg from isaaclab.utils.assets import check_file_path @@ -176,25 +173,9 @@ def main(): print("-" * 80) print("-" * 80) - # Determine if there is a GUI to update: - # acquire settings interface - carb_settings_iface = carb.settings.get_settings() - # read flag for whether a local GUI is enabled - local_gui = carb_settings_iface.get("/app/window/enabled") - # read flag for whether livestreaming GUI is enabled - livestream_gui = carb_settings_iface.get("/app/livestream/enabled") - - # Simulate scene (if not headless) - if local_gui or livestream_gui: - # Open the stage with USD - open_stage(mesh_converter.usd_path) - # Reinitialize the simulation - app = omni.kit.app.get_app_interface() - # Run simulation - with contextlib.suppress(KeyboardInterrupt): - while app.is_running(): - # perform step - app.update() + # Show the converted asset if the launch resolved to a window or livestream + if AppLauncher.has_gui(): + sim_utils.show_stage_in_viewport(mesh_converter.usd_path) if __name__ == "__main__": diff --git a/scripts/tools/convert_mjcf.py b/scripts/tools/convert_mjcf.py index 7b1432c6..8243031c 100644 --- a/scripts/tools/convert_mjcf.py +++ b/scripts/tools/convert_mjcf.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -9,66 +9,135 @@ MuJoCo XML Format (MJCF) is an XML file format used in MuJoCo to describe all elements of a robot. For more information, see: http://www.mujoco.org/book/XMLreference.html -This script uses the MJCF importer extension from Isaac Sim (``isaacsim.asset.importer.mjcf``) to convert -a MJCF asset into USD format. It is designed as a convenience script for command-line use. For more information -on the MJCF importer, see the documentation for the extension: +This script uses the MJCF importer API (``isaacsim.asset.importer.mjcf``) from Isaac Sim or its standalone +wheel to convert a MJCF asset into USD format. It is designed as a convenience script for command-line use. +For more information on the MJCF importer, see the documentation for the extension: https://docs.isaacsim.omniverse.nvidia.com/latest/robot_setup/ext_isaacsim_asset_importer_mjcf.html positional arguments: - input The path to the input URDF file. + input The path to the input MJCF file. output The path to store the USD file. optional arguments: -h, --help Show this help message and exit - --fix-base Fix the base to where it is imported. (default: False) - --import-sites Import sites by parse tag. (default: True) - --make-instanceable Make the asset instanceable for efficient cloning. (default: False) + --merge_mesh Merge meshes where possible to optimize the model. (default: False) + --collision_from_visuals Generate collision geometry from visual geometries. (default: False) + --collision_type Type of collision geometry to use. (default: "Convex Hull") + --self_collision Activate self-collisions between links. (default: False) + --import_physics_scene Import the physics scene from the MJCF file. (default: False) + +The standard launcher arguments are also accepted. In particular, ``--viz`` previews the converted +asset: ``--viz kit`` opens it in the Isaac Sim viewport, while ``--viz newton`` (or ``rerun`` / +``viser``) opens it kitlessly. Run with ``--help`` for the full list. """ -"""Launch Isaac Sim Simulator first.""" +"""Parse CLI first so we can decide whether to launch Isaac Sim Kit.""" import argparse -from isaaclab.app import AppLauncher +from isaaclab.app import AppLauncher, add_launcher_args, launch_simulation +from isaaclab.utils.version import standalone_importers_available -# add argparse arguments parser = argparse.ArgumentParser(description="Utility to convert a MJCF into USD format.") parser.add_argument("input", type=str, help="The path to the input MJCF file.") parser.add_argument("output", type=str, help="The path to store the USD file.") -parser.add_argument("--fix-base", action="store_true", default=False, help="Fix the base to where it is imported.") parser.add_argument( - "--import-sites", action="store_true", default=False, help="Import sites by parsing the tag." + "--merge_mesh", + "--merge-mesh", + action="store_true", + default=False, + help="Merge meshes where possible to optimize the model.", ) parser.add_argument( - "--make-instanceable", + "--collision_from_visuals", + "--collision-from-visuals", action="store_true", default=False, - help="Make the asset instanceable for efficient cloning.", + help="Generate collision geometry from visual geometries.", ) - -# append AppLauncher cli args -AppLauncher.add_app_launcher_args(parser) -# parse the arguments +parser.add_argument( + "--collision_type", + "--collision-type", + type=str, + default="Convex Hull", + choices=["Convex Hull", "Convex Decomposition", "Bounding Sphere", "Bounding Cube"], + help='Type of collision geometry to use. Defaults to "Convex Hull".', +) +parser.add_argument( + "--self_collision", + "--self-collision", + action="store_true", + default=False, + help="Activate self-collisions between links of the articulation.", +) +parser.add_argument( + "--import_physics_scene", + "--import-physics-scene", + action="store_true", + default=False, + help="Import the physics scene (worldbody, defaults) from the MJCF file.", +) +add_launcher_args(parser) args_cli = parser.parse_args() -# launch omniverse app -app_launcher = AppLauncher(args_cli) -simulation_app = app_launcher.app +# Prefer kit-less: it skips Kit startup and the kitless visualizers can host the preview. +args_cli.require_kit = not standalone_importers_available() -"""Rest everything follows.""" +# ``launch_simulation`` receives a bare ``PhysicsCfg()`` placeholder, so name the backend the +# runtime provides; without it the preview builds a simulation with no physics manager. +args_cli.physics = "isaacsim_physx" if args_cli.require_kit else "newton_mjwarp" -import contextlib -import os - -import carb -from isaaclab.sim.utils import open_stage -import omni.kit.app +# Report the missing importer before converting anything. Without this the launcher reports only +# that Isaac Sim is absent, which does not mention the wheel that would make this run kitlessly. +if args_cli.require_kit and not AppLauncher.is_available(): + raise ImportError( + "MJCF conversion requires either the full Isaac Sim runtime or the standalone" + " 'isaacsim-asset-isolated' importer wheel, but neither is installed." + ) -from isaaclab.sim.converters import MjcfConverter, MjcfConverterCfg -from isaaclab.utils.assets import check_file_path -from isaaclab.utils.dict import print_dict +import os # noqa: E402 + +import isaaclab.sim as sim_utils # noqa: E402 +from isaaclab.physics import PhysicsCfg # noqa: E402 +from isaaclab.sim.converters import MjcfConverter, MjcfConverterCfg # noqa: E402 +from isaaclab.utils.assets import check_file_path # noqa: E402 +from isaaclab.utils.dict import print_dict # noqa: E402 + + +def preview(usd_path: str, physics_cfg: PhysicsCfg) -> None: + """Open the converted asset in the visualizer selected on the command line. + + Args: + usd_path: Path of the generated USD file to display. + physics_cfg: Physics config resolved by :func:`~isaaclab.app.launch_simulation`. + """ + visualizers = args_cli.visualizer or [] + if not visualizers: + return + + if "kit" in visualizers: + # a Kit app that resolved without a GUI has no viewport to display the asset in + if AppLauncher.has_gui(): + sim_utils.show_stage_in_viewport(usd_path) + return + + # Kitless preview: the physics backend ingests the USD stage and every visualizer renders the + # shared scene data, so no backend-specific code is needed here. Physics is not stepped -- the + # asset is shown in its imported pose until the visualizer window is closed. + sim = sim_utils.SimulationContext(sim_utils.SimulationCfg(device=args_cli.device, physics=physics_cfg)) + light_cfg = sim_utils.DomeLightCfg(intensity=3000.0, color=(0.75, 0.75, 0.75)) + light_cfg.func("/World/Light", light_cfg) + asset_cfg = sim_utils.UsdFileCfg(usd_path=usd_path) + asset_cfg.func("/World/ConvertedAsset", asset_cfg) + sim.reset() + + # Checked per visualizer rather than through ``SimulationContext.is_headless_or_exist_active_visualizer``: + # that predicate also reports True for an empty visualizer list (headless stepping), and ``render`` + # drops visualizers once they close, so the preview would never exit. + while any(viz.is_running() and not viz.is_closed for viz in sim.visualizers): + sim.render() def main(): @@ -87,11 +156,12 @@ def main(): mjcf_converter_cfg = MjcfConverterCfg( asset_path=mjcf_path, usd_dir=os.path.dirname(dest_path), - usd_file_name=os.path.basename(dest_path), - fix_base=args_cli.fix_base, - import_sites=args_cli.import_sites, force_usd_conversion=True, - make_instanceable=args_cli.make_instanceable, + merge_mesh=args_cli.merge_mesh, + collision_from_visuals=args_cli.collision_from_visuals, + collision_type=args_cli.collision_type, + self_collision=args_cli.self_collision, + import_physics_scene=args_cli.import_physics_scene, ) # Print info @@ -103,37 +173,17 @@ def main(): print("-" * 80) print("-" * 80) - # Create mjcf converter and import the file - mjcf_converter = MjcfConverter(mjcf_converter_cfg) - # print output - print("MJCF importer output:") - print(f"Generated USD file: {mjcf_converter.usd_path}") - print("-" * 80) - print("-" * 80) + with launch_simulation(cfg=PhysicsCfg(), launcher_args=args_cli) as physics_cfg: + # Create mjcf converter and import the file + mjcf_converter = MjcfConverter(mjcf_converter_cfg) + # print output + print("MJCF importer output:") + print(f"Generated USD file: {mjcf_converter.usd_path}") + print("-" * 80) + print("-" * 80) - # Determine if there is a GUI to update: - # acquire settings interface - carb_settings_iface = carb.settings.get_settings() - # read flag for whether a local GUI is enabled - local_gui = carb_settings_iface.get("/app/window/enabled") - # read flag for whether livestreaming GUI is enabled - livestream_gui = carb_settings_iface.get("/app/livestream/enabled") - - # Simulate scene (if not headless) - if local_gui or livestream_gui: - # Open the stage with USD - open_stage(mjcf_converter.usd_path) - # Reinitialize the simulation - app = omni.kit.app.get_app_interface() - # Run simulation - with contextlib.suppress(KeyboardInterrupt): - while app.is_running(): - # perform step - app.update() + preview(mjcf_converter.usd_path, physics_cfg) if __name__ == "__main__": - # run the main function main() - # close sim app - simulation_app.close() diff --git a/scripts/tools/convert_urdf.py b/scripts/tools/convert_urdf.py index 6f5b6cd1..803dd497 100644 --- a/scripts/tools/convert_urdf.py +++ b/scripts/tools/convert_urdf.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -9,9 +9,9 @@ Unified Robot Description Format (URDF) is an XML file format used in ROS to describe all elements of a robot. For more information, see: http://wiki.ros.org/urdf -This script uses the URDF importer extension from Isaac Sim (``isaacsim.asset.importer.urdf``) to convert a -URDF asset into USD format. It is designed as a convenience script for command-line use. For more -information on the URDF importer, see the documentation for the extension: +This script uses the URDF importer API (``isaacsim.asset.importer.urdf``) from Isaac Sim or its standalone +wheel to convert a URDF asset into USD format. It is designed as a convenience script for command-line use. +For more information on the URDF importer, see the documentation for the extension: https://docs.isaacsim.omniverse.nvidia.com/latest/robot_setup/ext_isaacsim_asset_importer_urdf.html @@ -21,72 +21,119 @@ optional arguments: -h, --help Show this help message and exit - --merge-joints Consolidate links that are connected by fixed joints. (default: False) - --fix-base Fix the base to where it is imported. (default: False) - --joint-stiffness The stiffness of the joint drive. (default: 100.0) - --joint-damping The damping of the joint drive. (default: 1.0) - --joint-target-type The type of control to use for the joint drive. (default: "position") + --merge_joints Consolidate links that are connected by fixed joints. (default: False) + --fix_base Fix the base to where it is imported. (default: False) + --joint_stiffness The stiffness of the joint drive. (default: 100.0) + --joint_damping The damping of the joint drive. (default: 1.0) + --joint_target_type The type of control to use for the joint drive. (default: "position") + +The standard launcher arguments are also accepted. In particular, ``--viz`` previews the converted +asset: ``--viz kit`` opens it in the Isaac Sim viewport, while ``--viz newton`` (or ``rerun`` / +``viser``) opens it kitlessly. Run with ``--help`` for the full list. """ -"""Launch Isaac Sim Simulator first.""" +"""Parse CLI first so we can decide whether to launch Isaac Sim Kit.""" import argparse -from isaaclab.app import AppLauncher +from isaaclab.app import AppLauncher, add_launcher_args, launch_simulation +from isaaclab.utils.version import standalone_importers_available -# add argparse arguments parser = argparse.ArgumentParser(description="Utility to convert a URDF into USD format.") parser.add_argument("input", type=str, help="The path to the input URDF file.") parser.add_argument("output", type=str, help="The path to store the USD file.") parser.add_argument( + "--merge_joints", "--merge-joints", action="store_true", default=False, help="Consolidate links that are connected by fixed joints.", ) -parser.add_argument("--fix-base", action="store_true", default=False, help="Fix the base to where it is imported.") parser.add_argument( + "--fix_base", "--fix-base", action="store_true", default=False, help="Fix the base to where it is imported." +) +parser.add_argument( + "--joint_stiffness", "--joint-stiffness", type=float, default=100.0, help="The stiffness of the joint drive.", ) parser.add_argument( + "--joint_damping", "--joint-damping", type=float, default=1.0, help="The damping of the joint drive.", ) parser.add_argument( + "--joint_target_type", "--joint-target-type", type=str, default="position", choices=["position", "velocity", "none"], help="The type of control to use for the joint drive.", ) - -# append AppLauncher cli args -AppLauncher.add_app_launcher_args(parser) -# parse the arguments +add_launcher_args(parser) args_cli = parser.parse_args() -# launch omniverse app -app_launcher = AppLauncher(args_cli) -simulation_app = app_launcher.app +# Prefer kit-less: it skips Kit startup and the kitless visualizers can host the preview. +args_cli.require_kit = not standalone_importers_available() -"""Rest everything follows.""" +# ``launch_simulation`` receives a bare ``PhysicsCfg()`` placeholder, so name the backend the +# runtime provides; without it the preview builds a simulation with no physics manager. +args_cli.physics = "isaacsim_physx" if args_cli.require_kit else "newton_mjwarp" -import contextlib -import os - -import carb -from isaaclab.sim.utils import open_stage -import omni.kit.app +# Report the missing importer before converting anything. Without this the launcher reports only +# that Isaac Sim is absent, which does not mention the wheel that would make this run kitlessly. +if args_cli.require_kit and not AppLauncher.is_available(): + raise ImportError( + "URDF conversion requires either the full Isaac Sim runtime or the standalone" + " 'isaacsim-asset-isolated' importer wheel, but neither is installed." + ) -from isaaclab.sim.converters import UrdfConverter, UrdfConverterCfg -from isaaclab.utils.assets import check_file_path -from isaaclab.utils.dict import print_dict +import os # noqa: E402 + +import isaaclab.sim as sim_utils # noqa: E402 +from isaaclab.physics import PhysicsCfg # noqa: E402 +from isaaclab.sim.converters import UrdfConverter, UrdfConverterCfg # noqa: E402 +from isaaclab.utils.assets import check_file_path # noqa: E402 +from isaaclab.utils.dict import print_dict # noqa: E402 + + +def preview(usd_path: str, physics_cfg: PhysicsCfg) -> None: + """Open the converted asset in the visualizer selected on the command line. + + Args: + usd_path: Path of the generated USD file to display. + physics_cfg: Physics config resolved by :func:`~isaaclab.app.launch_simulation`. + """ + visualizers = args_cli.visualizer or [] + if not visualizers: + return + + if "kit" in visualizers: + # a Kit app that resolved without a GUI has no viewport to display the asset in + if AppLauncher.has_gui(): + sim_utils.show_stage_in_viewport(usd_path) + return + + # Kitless preview: the physics backend ingests the USD stage and every visualizer renders the + # shared scene data, so no backend-specific code is needed here. Physics is not stepped -- the + # asset is shown in its imported pose until the visualizer window is closed. + sim = sim_utils.SimulationContext(sim_utils.SimulationCfg(device=args_cli.device, physics=physics_cfg)) + light_cfg = sim_utils.DomeLightCfg(intensity=3000.0, color=(0.75, 0.75, 0.75)) + light_cfg.func("/World/Light", light_cfg) + asset_cfg = sim_utils.UsdFileCfg(usd_path=usd_path) + asset_cfg.func("/World/ConvertedAsset", asset_cfg) + sim.reset() + + # Checked per visualizer rather than through ``SimulationContext.is_headless_or_exist_active_visualizer``: + # that predicate also reports True for an empty visualizer list (headless stepping), and ``render`` + # drops visualizers once they close, so the preview would never exit. + while any(viz.is_running() and not viz.is_closed for viz in sim.visualizers): + sim.render() def main(): @@ -102,10 +149,11 @@ def main(): dest_path = os.path.abspath(dest_path) # Create Urdf converter config + # Note: usd_file_name is determined by the URDF importer 3.0 based on the robot name + # and cannot be overridden. The output is placed under dest_path as usd_dir. urdf_converter_cfg = UrdfConverterCfg( asset_path=urdf_path, - usd_dir=os.path.dirname(dest_path), - usd_file_name=os.path.basename(dest_path), + usd_dir=dest_path, fix_base=args_cli.fix_base, merge_fixed_joints=args_cli.merge_joints, force_usd_conversion=True, @@ -127,37 +175,17 @@ def main(): print("-" * 80) print("-" * 80) - # Create Urdf converter and import the file - urdf_converter = UrdfConverter(urdf_converter_cfg) - # print output - print("URDF importer output:") - print(f"Generated USD file: {urdf_converter.usd_path}") - print("-" * 80) - print("-" * 80) + with launch_simulation(cfg=PhysicsCfg(), launcher_args=args_cli) as physics_cfg: + # Create Urdf converter and import the file + urdf_converter = UrdfConverter(urdf_converter_cfg) + # print output + print("URDF importer output:") + print(f"Generated USD file: {urdf_converter.usd_path}") + print("-" * 80) + print("-" * 80) - # Determine if there is a GUI to update: - # acquire settings interface - carb_settings_iface = carb.settings.get_settings() - # read flag for whether a local GUI is enabled - local_gui = carb_settings_iface.get("/app/window/enabled") - # read flag for whether livestreaming GUI is enabled - livestream_gui = carb_settings_iface.get("/app/livestream/enabled") - - # Simulate scene (if not headless) - if local_gui or livestream_gui: - # Open the stage with USD - open_stage(urdf_converter.usd_path) - # Reinitialize the simulation - app = omni.kit.app.get_app_interface() - # Run simulation - with contextlib.suppress(KeyboardInterrupt): - while app.is_running(): - # perform step - app.update() + preview(urdf_converter.usd_path, physics_cfg) if __name__ == "__main__": - # run the main function main() - # close sim app - simulation_app.close() diff --git a/scripts/tools/cosmos/cosmos_prompt_gen.py b/scripts/tools/cosmos/cosmos_prompt_gen.py index b0f34513..32db884a 100644 --- a/scripts/tools/cosmos/cosmos_prompt_gen.py +++ b/scripts/tools/cosmos/cosmos_prompt_gen.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2024-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause diff --git a/scripts/tools/hdf5_to_mp4.py b/scripts/tools/hdf5_to_mp4.py index 98fc1a9b..a0f4f7ea 100644 --- a/scripts/tools/hdf5_to_mp4.py +++ b/scripts/tools/hdf5_to_mp4.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2024-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -15,21 +15,21 @@ --output_dir Directory to save the output MP4 files. optional arguments: - --input_keys List of input keys to process from the HDF5 file. (default: ["table_cam", "wrist_cam", "table_cam_segmentation", "table_cam_normals", "table_cam_shaded_segmentation"]) + --input_keys List of input keys to process from the HDF5 file. + (default: ["table_cam", "wrist_cam", "table_cam_segmentation", + "table_cam_normals", "table_cam_shaded_segmentation"]) --video_height Height of the output video in pixels. (default: 704) --video_width Width of the output video in pixels. (default: 1280) --framerate Frames per second for the output video. (default: 30) + --demo_id If provided, only export this specific demo_id. (default: None) """ -# Standard library imports import argparse -import h5py -import numpy as np - -# Third-party imports import os import cv2 +import h5py +import numpy as np # Constants DEFAULT_VIDEO_HEIGHT = 704 @@ -48,6 +48,18 @@ MAX_DEPTH = 1.5 +def _convert_frame_to_uint8(frame: np.ndarray) -> np.ndarray: + """Convert a video frame to the uint8 format expected by MP4 encoders.""" + if frame.dtype == np.uint8: + return frame + + if np.issubdtype(frame.dtype, np.floating): + frame = np.nan_to_num(frame, nan=0.0, posinf=1.0, neginf=0.0) + return np.clip(frame * 255.0, 0, 255).astype(np.uint8) + + return np.clip(frame, 0, 255).astype(np.uint8) + + def parse_args(): """Parse command line arguments.""" parser = argparse.ArgumentParser(description="Convert HDF5 demonstration files to MP4 videos.") @@ -89,6 +101,12 @@ def parse_args(): default=DEFAULT_FRAMERATE, help="Frames per second for the output video.", ) + parser.add_argument( + "--demo_id", + type=int, + default=None, + help="If provided, only export this specific demo_id.", + ) args = parser.parse_args() @@ -141,15 +159,17 @@ def write_demo_to_mp4( # Process shaded segmentation frames elif "shaded_segmentation" in input_key: - seg = frame[..., :-1] + segmentation_frame = _convert_frame_to_uint8(frame) + seg = segmentation_frame[..., :-1] normals_key = input_key.replace("shaded_segmentation", "normals") normals = f[f"data/demo_{demo_id}/obs/{normals_key}"][ix] shade = 0.5 + (normals * LIGHT_SOURCE[None, None, :]).sum(axis=-1) * 0.5 - shaded_seg = (shade[..., None] * seg).astype(np.uint8) - frame = np.concatenate((shaded_seg, frame[..., -1:]), axis=-1) + shaded_seg = np.clip(shade[..., None] * seg, 0, 255).astype(np.uint8) + frame = np.concatenate((shaded_seg, segmentation_frame[..., -1:]), axis=-1) # Convert RGB to BGR if "depth" not in input_key: + frame = _convert_frame_to_uint8(frame) frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) else: frame = (frame[..., 0] - MIN_DEPTH) / (MAX_DEPTH - MIN_DEPTH) @@ -189,8 +209,14 @@ def main(): num_demos = get_num_demos(args.input_file) print(f"Found {num_demos} demonstrations in {args.input_file}") + if args.demo_id is not None: + demo_ids = [args.demo_id] + print(f"Exporting only demo_id {args.demo_id}") + else: + demo_ids = list(range(num_demos)) + # Convert each demonstration - for i in range(num_demos): + for i in demo_ids: frames_path = f"data/demo_{str(i)}/obs" for input_key in args.input_keys: write_demo_to_mp4( diff --git a/scripts/tools/merge_hdf5_datasets.py b/scripts/tools/merge_hdf5_datasets.py index 92329f77..a9fe1c63 100644 --- a/scripts/tools/merge_hdf5_datasets.py +++ b/scripts/tools/merge_hdf5_datasets.py @@ -1,12 +1,13 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause import argparse -import h5py import os +import h5py + parser = argparse.ArgumentParser(description="Merge a set of HDF5 datasets.") parser.add_argument( "--input_files", @@ -30,7 +31,6 @@ def merge_datasets(): copy_attributes = True for filepath in args_cli.input_files: - with h5py.File(filepath, "r") as input: for episode, data in input["data"].items(): input.copy(f"data/{episode}", output, f"data/demo_{episode_idx}") diff --git a/scripts/tools/mp4_to_hdf5.py b/scripts/tools/mp4_to_hdf5.py index a4d8f43f..61f7b5b0 100644 --- a/scripts/tools/mp4_to_hdf5.py +++ b/scripts/tools/mp4_to_hdf5.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2024-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -17,16 +17,13 @@ --videos_dir Directory containing the visually augmented MP4 videos. """ -# Standard library imports import argparse import glob -import h5py -import numpy as np - -# Third-party imports import os import cv2 +import h5py +import numpy as np def parse_args(): diff --git a/scripts/tools/pretrained_checkpoint.py b/scripts/tools/pretrained_checkpoint.py deleted file mode 100644 index 96b8562d..00000000 --- a/scripts/tools/pretrained_checkpoint.py +++ /dev/null @@ -1,376 +0,0 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -""" -Script to manage pretrained checkpoints for our environments. -""" - -import argparse - -from isaaclab.app import AppLauncher - -# Initialize the parser -parser = argparse.ArgumentParser( - description=""" -Script used for the training and publishing of pre-trained checkpoints for Isaac Lab. - -Examples : - # Train an agent using the rl_games workflow on the Isaac-Cartpole-v0 environment. - pretrained_checkpoint.py --train rl_games:Isaac-Cartpole-v0 - # Train and publish the checkpoints for all workflows on only the direct Cartpole environments. - pretrained_checkpoint.py -tp "*:Isaac-Cartpole-*Direct-v0" \\ - --/persistent/isaaclab/asset_root/pretrained_checkpoints="/some/path" - # Review all repose cube jobs, excluding the Play tasks and skrl - pretrained_checkpoint.py -r "*:*Repose-Cube*" --exclude "*:*Play*" --exclude skrl:* - # Publish all results (that have been reviewed and approved). - pretrained_checkpoint.py --publish --all \\ - --/persistent/isaaclab/asset_root/pretrained_checkpoints="/some/path" -""", - formatter_class=argparse.RawTextHelpFormatter, -) - -# Add positional arguments that can accept zero or more values -parser.add_argument( - "jobs", - nargs="*", - help=""" -A job consists of a workflow and a task name separated by a colon (wildcards optional), for example : - rl_games:Isaac-Humanoid-*v0 - rsl_rl:Isaac-Ant-*-v0 - *:Isaac-Velocity-Flat-Spot-v0 -""", -) -parser.add_argument("-t", "--train", action="store_true", help="Train checkpoints for later publishing.") -parser.add_argument("-p", "--publish_checkpoint", action="store_true", help="Publish pre-trained checkpoints.") -parser.add_argument("-r", "--review", action="store_true", help="Review checkpoints.") -parser.add_argument("-l", "--list", action="store_true", help="List all available environments and workflows.") -parser.add_argument("-f", "--force", action="store_true", help="Force training when results already exist.") -parser.add_argument("-a", "--all", action="store_true", help="Run all valid workflow task pairs.") -parser.add_argument( - "-E", - "--exclude", - action="append", - type=str, - default=[], - help="Excludes jobs matching the argument, with wildcard support.", -) -parser.add_argument("--num_envs", type=int, default=None, help="Number of environments to simulate.") -parser.add_argument("--force_review", action="store_true", help="Forces review when one already exists.") -parser.add_argument("--force_publish", action="store_true", help="Publish checkpoints without review.") -parser.add_argument("--headless", action="store_true", help="Run training without the UI.") - -args, _ = parser.parse_known_args() - -# Need something to do -if len(args.jobs) == 0 and not args.all: - parser.error("Jobs must be provided, or --all.") - -# Must train, publish, review or list -if not (args.train or args.publish_checkpoint or args.review or args.list): - parser.error("A train, publish, review or list flag must be given.") - -# List excludes train and publish -if args.list and (args.train or args.publish_checkpoint): - parser.error("Can't train or publish when listing.") - -# launch omniverse app -app_launcher = AppLauncher(headless=True) -simulation_app = app_launcher.app - - -import csv - -# Now everything else -import fnmatch -import gymnasium as gym -import json -import numpy as np -import os -import subprocess -import sys - -import omni.client -from omni.client._omniclient import CopyBehavior - -from isaaclab.utils.pretrained_checkpoint import ( - WORKFLOW_EXPERIMENT_NAME_VARIABLE, - WORKFLOW_PLAYER, - WORKFLOW_TRAINER, - WORKFLOWS, - get_log_root_path, - get_pretrained_checkpoint_path, - get_pretrained_checkpoint_publish_path, - get_pretrained_checkpoint_review, - get_pretrained_checkpoint_review_path, - has_pretrained_checkpoint_job_finished, - has_pretrained_checkpoint_job_run, - has_pretrained_checkpoints_asset_root_dir, -) - -# Need somewhere to publish -if args.publish_checkpoint and not has_pretrained_checkpoints_asset_root_dir(): - raise Exception("A /persistent/isaaclab/asset_root/pretrained_checkpoints setting is required to publish.") - - -def train_job(workflow, task_name, headless=False, force=False, num_envs=None): - """ - This trains a task using the workflow's train.py script, overriding the experiment name to ensure unique - log directories. By default it will return if an experiment has already been run. - - Args: - workflow: The workflow. - task_name: The task name. - headless: Should the training run without the UI. - force: Run training even if previous experiments have been run. - num_envs: How many simultaneous environments to simulate, overriding the config. - """ - - log_root_path = get_log_root_path(workflow, task_name) - - # We already ran this - if not force and os.path.exists(log_root_path) and len(os.listdir(log_root_path)) > 0: - print(f"Skipping training of {workflow}:{task_name}, already has been run") - return - - print(f"Training {workflow}:{task_name}") - - # Construct our command - cmd = [ - sys.executable, - WORKFLOW_TRAINER[workflow], - "--task", - task_name, - "--enable_cameras", - ] - - # Changes the directory name for logging - if WORKFLOW_EXPERIMENT_NAME_VARIABLE[workflow]: - cmd.append(f"{WORKFLOW_EXPERIMENT_NAME_VARIABLE[workflow]}={task_name}") - - if headless: - cmd.append("--headless") - if num_envs: - cmd.extend(["--num_envs", str(num_envs)]) - - print("Running : " + " ".join(cmd)) - - subprocess.run(cmd) - - -def review_pretrained_checkpoint(workflow, task_name, force_review=False, num_envs=None): - """ - This initiates a review of the pretrained checkpoint. The play.py script for the workflow is run, and the user - inspects the results. When done they close the simulator and will be prompted for their review. - - Args: - workflow: The workflow. - task_name: The task name. - force_review: Performs the review even if a review already exists. - num_envs: How many simultaneous environments to simulate, overriding the config. - """ - - # This workflow task pair hasn't been trained - if not has_pretrained_checkpoint_job_run(workflow, task_name): - print(f"Skipping review of {workflow}:{task_name}, hasn't been trained yet") - return - - # Couldn't find the checkpoint - if not has_pretrained_checkpoint_job_finished(workflow, task_name): - print(f"Training not complete for {workflow}:{task_name}") - return - - review = get_pretrained_checkpoint_review(workflow, task_name) - - if not force_review and review and review["reviewed"]: - print(f"Review already complete for {workflow}:{task_name}") - return - - print(f"Reviewing {workflow}:{task_name}") - - # Construct our command - cmd = [ - sys.executable, - WORKFLOW_PLAYER[workflow], - "--task", - task_name, - "--checkpoint", - get_pretrained_checkpoint_path(workflow, task_name), - "--enable_cameras", - ] - - if num_envs: - cmd.extend(["--num_envs", str(num_envs)]) - - print("Running : " + " ".join(cmd)) - - subprocess.run(cmd) - - # Give user a chance to leave the old review - if force_review and review and review["reviewed"]: - result = review["result"] - notes = review.get("notes") - print(f"A review already exists for {workflow}:{task_name}, it was marked as '{result}'.") - print(f" Notes: {notes}") - answer = input("Would you like to replace it? Please answer yes or no (y/n) [n]: ").strip().lower() - if answer != "y": - return - - # Get the verdict from the user - print(f"Do you accept this checkpoint for {workflow}:{task_name}?") - - answer = input("Please answer yes, no or undetermined (y/n/u) [u]: ").strip().lower() - if answer not in {"y", "n", "u"}: - answer = "u" - answer_map = { - "y": "accepted", - "n": "rejected", - "u": "undetermined", - } - - # Create the review dict - review = { - "reviewed": True, - "result": answer_map[answer], - } - - # Maybe add some notes - notes = input("Please add notes or hit enter: ").strip().lower() - if notes: - review["notes"] = notes - - # Save the review JSON file - path = get_pretrained_checkpoint_review_path(workflow, task_name) - if not path: - raise Exception("This shouldn't be possible, something went very wrong.") - - with open(path, "w") as f: - json.dump(review, f, indent=4) - - -def publish_pretrained_checkpoint(workflow, task_name, force_publish=False): - """ - This publishes the pretrained checkpoint to Nucleus using the asset path in the - /persistent/isaaclab/asset_root/pretrained_checkpoints Carb variable. - - Args: - workflow: The workflow. - task_name: The task name. - force_publish: Publish without review. - """ - - # This workflow task pair hasn't been trained - if not has_pretrained_checkpoint_job_run(workflow, task_name): - print(f"Skipping publishing of {workflow}:{task_name}, hasn't been trained yet") - return - - # Couldn't find the checkpoint - if not has_pretrained_checkpoint_job_finished(workflow, task_name): - print(f"Training not complete for {workflow}:{task_name}") - return - - # Get local pretrained checkpoint path - local_path = get_pretrained_checkpoint_path(workflow, task_name) - if not local_path: - raise Exception("This shouldn't be possible, something went very wrong.") - - # Not forcing, need to check review results - if not force_publish: - - # Grab the review if it exists - review = get_pretrained_checkpoint_review(workflow, task_name) - - if not review or not review["reviewed"]: - print(f"Skipping publishing of {workflow}:{task_name}, hasn't been reviewed yet") - return - - result = review["result"] - if result != "accepted": - print(f'Skipping publishing of {workflow}:{task_name}, review result was "{result}"') - return - - print(f"Publishing {workflow}:{task_name}") - - # Copy the file - publish_path = get_pretrained_checkpoint_publish_path(workflow, task_name) - omni.client.copy_file(local_path, publish_path, CopyBehavior.OVERWRITE) - - -def get_job_summary_row(workflow, task_name): - """Returns a single row summary of the job""" - - has_run = has_pretrained_checkpoint_job_run(workflow, task_name) - has_finished = has_pretrained_checkpoint_job_finished(workflow, task_name) - review = get_pretrained_checkpoint_review(workflow, task_name) - - if review: - result = review.get("result", "undetermined") - notes = review.get("notes", "") - else: - result = "" - notes = "" - - return [workflow, task_name, has_run, has_finished, result, notes] - - -def main(): - - # Figure out what workflows and tasks we'll be using - if args.all: - jobs = ["*:*"] - else: - jobs = args.jobs - - if args.list: - print() - print("# Workflow, Task, Ran, Finished, Review, Notes") - - summary_rows = [] - - # Could be implemented more efficiently, but the performance gain would be inconsequential - for workflow in WORKFLOWS: - for task_spec in sorted(gym.registry.values(), key=lambda t: t.id): - job_id = f"{workflow}:{task_spec.id}" - - # We've excluded this job - if any(fnmatch.fnmatch(job_id, e) for e in args.exclude): - continue - - # None of our jobs match this pair - if not np.any(np.array([fnmatch.fnmatch(job_id, job) for job in jobs])): - continue - - # No config for this workflow - if workflow + "_cfg_entry_point" not in task_spec.kwargs: - continue - - if args.list: - summary_rows.append(get_job_summary_row(workflow, task_spec.id)) - continue - - # Training reviewing and publishing - if args.train: - train_job(workflow, task_spec.id, args.headless, args.force, args.num_envs) - - if args.review: - review_pretrained_checkpoint(workflow, task_spec.id, args.force_review, args.num_envs) - - if args.publish_checkpoint: - publish_pretrained_checkpoint(workflow, task_spec.id, args.force_publish) - - if args.list: - writer = csv.writer(sys.stdout, quotechar='"', quoting=csv.QUOTE_MINIMAL) - writer.writerows(summary_rows) - - -if __name__ == "__main__": - - try: - # Run the main function - main() - except Exception as e: - raise e - finally: - # Close the app - simulation_app.close() diff --git a/scripts/tools/process_meshes_to_obj.py b/scripts/tools/process_meshes_to_obj.py index 331f7b09..2c5be04c 100644 --- a/scripts/tools/process_meshes_to_obj.py +++ b/scripts/tools/process_meshes_to_obj.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause diff --git a/scripts/tools/record_demos.py b/scripts/tools/record_demos.py index e3609d39..51b09132 100644 --- a/scripts/tools/record_demos.py +++ b/scripts/tools/record_demos.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause """ @@ -9,26 +9,48 @@ The recorded demonstrations are stored as episodes in a hdf5 file. Users can specify the task, teleoperation device, dataset directory, and environment stepping rate through command-line arguments. +This script supports two teleoperation stacks: +1. Native Isaac Lab teleop stack (via teleop_devices in env_cfg) +2. IsaacTeleop-based stack (via isaac_teleop in env_cfg) + +The script automatically detects which stack to use based on the environment config. + required arguments: --task Name of the task. optional arguments: -h, --help Show this help message and exit - --teleop_device Device for interacting with environment. (default: keyboard) + --teleop_device Legacy teleop device name. When omitted, IsaacTeleop is used if + configured, otherwise keyboard. When set, forces the legacy path. --dataset_file File path to export recorded demos. (default: "./datasets/dataset.hdf5") --step_hz Environment stepping rate in Hz. (default: 30) --num_demos Number of demonstrations to record. (default: 0) - --num_success_steps Number of continuous steps with task success for concluding a demo as successful. (default: 10) + --num_success_steps Number of continuous steps with task success for concluding a demo as successful. + (default: 10) """ """Launch Isaac Sim Simulator first.""" +# Isaac Lab does not use Warp autodiff; skipping adjoint codegen roughly halves the +# time spent building kernels on a cold kernel cache. +import warp as wp + +wp.config.enable_backward = False + # Standard library imports import argparse import contextlib +import sys +from typing import TYPE_CHECKING # Isaac Lab AppLauncher from isaaclab.app import AppLauncher +from isaaclab.utils.string import list_intersection, string_to_callable + +from isaaclab_tasks.utils import setup_preset_cli + +if TYPE_CHECKING: + from isaaclab_teleop import XrCameraFeedSession # add argparse arguments parser = argparse.ArgumentParser(description="Record demonstrations for Isaac Lab environments.") @@ -36,11 +58,11 @@ parser.add_argument( "--teleop_device", type=str, - default="keyboard", + default=None, help=( - "Teleop device. Set here (legacy) or via the environment config. If using the environment config, pass the" - " device key/name defined under 'teleop_devices' (it can be a custom name, not necessarily 'handtracking')." - " Built-ins: keyboard, spacemouse, gamepad. Not all tasks support all built-ins." + "Legacy teleop device name. When omitted, the IsaacTeleop pipeline is used if configured in the env," + " otherwise keyboard is used as fallback. When explicitly provided, the script uses the legacy" + " teleop_devices path and looks up this name in env_cfg.teleop_devices.devices." ), ) parser.add_argument( @@ -57,16 +79,64 @@ help="Number of continuous steps with task success for concluding a demo as successful. Default is 10.", ) parser.add_argument( - "--enable_pinocchio", + "--reset_sim_buffer_each_episode", + action=argparse.BooleanOptionalAction, + default=True, + help=( + "Call env.sim.reset() before the initial episode and between recording attempts." + " Use --no-reset_sim_buffer_each_episode to preserve simulation buffers." + ), +) +parser.add_argument( + "--cloudxr_env", + type=str, + default=None, + help=( + "Path to a CloudXR .env file, or a shorthand: 'cloudxrjs' (Quest/Pico), 'avp' (Apple Vision Pro)," + " or 'standalone' (headless, no XR client). Set to 'none' to disable CloudXR auto-launch entirely." + " When unset, defaults to 'cloudxrjs' with --xr and 'standalone' without --xr." + ), +) +parser.add_argument( + "--auto_launch_cloudxr", + action=argparse.BooleanOptionalAction, + default=True, + help="Auto-launch the CloudXR runtime when --cloudxr_env is set. Use --no-auto_launch_cloudxr to disable.", +) +parser.add_argument( + "--mcap_record_path", + type=str, + default=None, + help=( + "Debug-only: write the live IsaacTeleop session to this MCAP file (one continuous file for the whole run)." + " Intended for pairing with teleop_replay_agent.py in CI -- NOT a data-generation format. MCAPs produced" + " here lack per-episode segmentation, world-frame anchor state, env reset state, and have no public Python" + " decoder. For data-gen workflows use the HDF5 dataset path (default). Ignored when the IsaacTeleop stack" + " is not in use." + ), +) + +parser.add_argument( + "--enable_debug_visualization", action="store_true", default=False, - help="Enable Pinocchio.", + help="Enable hand joint and controller aim debug visualization at session start (IsaacTeleop only).", +) +parser.add_argument("--external_callback", default=None, help="Fully qualified path to an externally defined callback.") +parser.add_argument( + "--disable_external_cameras", + action="store_true", + default=False, + help=( + "Disable external camera rendering. External cameras render by default for teleoperation;" + " pass this flag to strip camera sensors from the environment (e.g. to reduce GPU contention" + " and improve XR performance)." + ), ) - # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) # parse the arguments -args_cli = parser.parse_args() +args_cli, hydra_args = setup_preset_cli(parser) # Validate required arguments if args_cli.task is None: @@ -74,54 +144,119 @@ app_launcher_args = vars(args_cli) -if args_cli.enable_pinocchio: - # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and not the one installed by Isaac Sim - # pinocchio is required by the Pink IK controllers and the GR1T2 retargeter - import pinocchio # noqa: F401 -if "handtracking" in args_cli.teleop_device.lower(): - app_launcher_args["xr"] = True - # launch the simulator -app_launcher = AppLauncher(args_cli) +# Enable external camera rendering by default (``--disable_external_cameras`` turns it off). The +# ``--enable_cameras`` CLI flag was removed in Isaac Lab 3.0 (see #6656), so pass the intent to +# AppLauncher as a kwarg; this selects a camera-rendering experience that provides RTX/DLSS support. +# Everywhere else we read ``args_cli.disable_external_cameras`` directly. +app_launcher = AppLauncher(args_cli, enable_cameras=not args_cli.disable_external_cameras) simulation_app = app_launcher.app +# Call an external callback if requested. +remaining_args_env_registration = None +if args_cli.external_callback: + external_callback_function = string_to_callable(args_cli.external_callback, separator=".") + remaining_args_env_registration = external_callback_function() + +# Hand arguments consumed by neither this parser nor the callback over to Hydra. +hydra_args = list_intersection(hydra_args, remaining_args_env_registration) +sys.argv = [sys.argv[0]] + hydra_args + """Rest everything follows.""" # Third-party imports -import gymnasium as gym import logging import os import time +from collections.abc import Callable + +import gymnasium as gym import torch +from isaaclab_physx.renderers import IsaacRtxRendererGlobalSettingsCfg +from isaaclab_physx.renderers.isaac_rtx_renderer_utils import ( + apply_isaac_rtx_global_settings, +) import omni.ui as ui from isaaclab.devices import Se3Keyboard, Se3KeyboardCfg, Se3SpaceMouse, Se3SpaceMouseCfg from isaaclab.devices.openxr import remove_camera_configs from isaaclab.devices.teleop_device_factory import create_teleop_device - -import isaaclab_mimic.envs # noqa: F401 -from isaaclab_mimic.ui.instruction_display import InstructionDisplay, show_subtask_instructions - -if args_cli.enable_pinocchio: - import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 - import isaaclab_tasks.manager_based.locomanipulation.pick_place # noqa: F401 - -from collections.abc import Callable - from isaaclab.envs import DirectRLEnvCfg, ManagerBasedRLEnvCfg from isaaclab.envs.mdp.recorders.recorders_cfg import ActionStateRecorderManagerCfg from isaaclab.envs.ui import EmptyWindow from isaaclab.managers import DatasetExportMode +import isaaclab_mimic.envs # noqa: F401 +from isaaclab_mimic.ui.instruction_display import InstructionDisplay, show_subtask_instructions + import isaaclab_tasks # noqa: F401 import uwlab_tasks # noqa: F401 -from isaaclab_tasks.utils.parse_cfg import parse_env_cfg +from isaaclab_tasks.utils import resolve_task_config +from isaaclab_tasks.utils.parse_cfg import load_cfg_from_registry -# import logger logger = logging.getLogger(__name__) +_CLOUDXR_ENV_SHORTHANDS: dict[str, str] = {} + + +def _never_terminate(env: gym.Env) -> torch.Tensor: + """Return a false termination signal for every environment.""" + return torch.zeros(env.num_envs, dtype=torch.bool, device=env.device) + + +def _resolve_cloudxr_env(value: str | None, xr_enabled: bool = False) -> str | None: + """Resolve ``--cloudxr_env`` shorthands to absolute ``.env`` file paths. + + Accepts ``"cloudxrjs"`` (Quest/Pico), ``"avp"`` (Apple Vision Pro), + ``"standalone"`` (headless, no XR client), ``"none"`` (disable), or an + arbitrary file path. When *value* is ``None`` (flag unset), defaults to + ``"cloudxrjs"`` when *xr_enabled* else ``"standalone"`` -- so a run without + ``--xr`` uses the clientless headless profile. + """ + if value is None: + value = "cloudxrjs" if xr_enabled else "standalone" + if value.strip() == "" or value.lower() == "none": + return None + if not _CLOUDXR_ENV_SHORTHANDS: + from isaaclab_teleop import CLOUDXR_AVP_ENV, CLOUDXR_JS_ENV, CLOUDXR_STANDALONE_ENV + + _CLOUDXR_ENV_SHORTHANDS["cloudxrjs"] = CLOUDXR_JS_ENV + _CLOUDXR_ENV_SHORTHANDS["avp"] = CLOUDXR_AVP_ENV + _CLOUDXR_ENV_SHORTHANDS["standalone"] = CLOUDXR_STANDALONE_ENV + return _CLOUDXR_ENV_SHORTHANDS.get(value.lower(), value) + + +def _rtx_rendering_requested(args: argparse.Namespace) -> bool: + """Return whether the CLI selects a renderer that actually drives RTX rendering. + + The RTX/DLSS global settings are only meaningful when something renders through RTX. + That happens when the Kit visualizer is enabled (``--viz kit``), when external cameras + are rendered (on by default; see ``--disable_external_cameras``), or in XR mode (``--xr``). + A pure-headless session with none of these renders nothing. + + This reads the resolved namespace intent rather than any Kit/carb runtime state so the + check keeps working as these scripts grow support for other renderers and kitless runs. + """ + visualizers = getattr(args, "visualizer", None) or [] + external_cameras = not getattr(args, "disable_external_cameras", False) + return external_cameras or ("kit" in visualizers) or bool(getattr(args, "xr", False)) + + +def _ensure_replicator_loaded() -> None: + """Enable ``omni.replicator.core`` so RTX/DLSS global settings can be applied. + + :func:`apply_isaac_rtx_global_settings` sets the antialiasing mode through + ``omni.replicator.core``, which ships with the SDG/rendering extensions. Some Kit + experiences (e.g. the Kit-viewport-only app selected by ``--visualizer kit`` without + cameras or XR) do not preload it, so enable it on demand via the extension manager + before applying RTX settings. Idempotent when the extension is already enabled. + """ + import omni.kit.app + + omni.kit.app.get_app().get_extension_manager().set_extension_enabled_immediate("omni.replicator.core", True) + class RateLimiter: """Convenience class for enforcing rates in loops.""" @@ -181,7 +316,7 @@ def setup_output_directories() -> tuple[str, str]: def create_environment_config( output_dir: str, output_file_name: str -) -> tuple[ManagerBasedRLEnvCfg | DirectRLEnvCfg, object | None]: +) -> tuple[ManagerBasedRLEnvCfg | DirectRLEnvCfg, object | None, bool]: """Create and configure the environment configuration. Parses the environment configuration and makes necessary adjustments for demo recording. @@ -192,49 +327,74 @@ def create_environment_config( output_file_name: Name of the file to store the demonstrations Returns: - tuple[isaaclab_tasks.utils.parse_cfg.EnvCfg, Optional[object]]: A tuple containing: + tuple[isaaclab_tasks.utils.parse_cfg.EnvCfg, Optional[object], bool]: A tuple containing: - env_cfg: The configured environment configuration - success_term: The success termination object or None if not available + - use_isaac_teleop: Whether IsaacTeleop stack should be used Raises: Exception: If parsing the environment configuration fails """ - # parse configuration + # Resolve the task configuration through Hydra so CLI presets are applied. try: - env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=1) + env_cfg, _ = resolve_task_config(args_cli.task, "") + env_cfg.sim.device = args_cli.device + env_cfg.scene.num_envs = 1 env_cfg.env_name = args_cli.task.split(":")[-1] except Exception as e: logger.error(f"Failed to parse environment configuration: {e}") exit(1) - # extract success checking function to invoke in the main loop - success_term = None - if hasattr(env_cfg.terminations, "success"): - success_term = env_cfg.terminations.success - env_cfg.terminations.success = None + # When --teleop_device is explicitly provided, use the legacy teleop_devices path + # even if isaac_teleop is configured. Otherwise prefer isaac_teleop when available. + teleop_device_explicitly_set = args_cli.teleop_device is not None + use_isaac_teleop = ( + not teleop_device_explicitly_set and hasattr(env_cfg, "isaac_teleop") and env_cfg.isaac_teleop is not None + ) + + # Extract the success condition for manual evaluation in the main loop. Keep + # an inert term registered under the same name so rewards and other manager + # terms that reference "success" can still resolve it during initialization. + success_term = getattr(env_cfg.terminations, "success", None) + if success_term is not None: + env_cfg.terminations.success = success_term.replace(func=_never_terminate, params={}) else: logger.warning( "No success termination term was found in the environment." " Will not be able to mark recorded demos as successful." ) + # XR-rendering setup is only needed for the Kit XR path. Without --xr, + # IsaacTeleop runs standalone (I/O only) and renders normally. if args_cli.xr: - # If cameras are not enabled and XR is enabled, remove camera configs - if not args_cli.enable_cameras: + # Strip camera configs only when external cameras are explicitly disabled; otherwise keep + # them (defaulted on) so cameras render alongside the XR view. + if args_cli.disable_external_cameras: env_cfg = remove_camera_configs(env_cfg) - env_cfg.sim.render.antialiasing_mode = "DLSS" + # Apply the RTX/DLSS global settings when an RTX render pipeline will run (Kit visualizer, + # external cameras, or XR). ``apply_isaac_rtx_global_settings`` uses ``omni.replicator``, + # which some experiences do not preload, so ensure it is loaded first. + if _rtx_rendering_requested(args_cli): + _ensure_replicator_loaded() + apply_isaac_rtx_global_settings( + IsaacRtxRendererGlobalSettingsCfg(antialiasing_mode="DLSS"), + ) # modify configuration such that the environment runs indefinitely until # the goal is reached or other termination conditions are met env_cfg.terminations.time_out = None env_cfg.observations.policy.concatenate_terms = False - env_cfg.recorders: ActionStateRecorderManagerCfg = ActionStateRecorderManagerCfg() + demo_recorder_cfg_entry_point = gym.spec(args_cli.task.split(":")[-1]).kwargs.get("demo_recorder_cfg_entry_point") + if demo_recorder_cfg_entry_point is None: + env_cfg.recorders = ActionStateRecorderManagerCfg() + else: + env_cfg.recorders = load_cfg_from_registry(args_cli.task, "demo_recorder_cfg_entry_point") env_cfg.recorders.dataset_export_dir_path = output_dir env_cfg.recorders.dataset_filename = output_file_name env_cfg.recorders.dataset_export_mode = DatasetExportMode.EXPORT_SUCCEEDED_ONLY - return env_cfg, success_term + return env_cfg, success_term, use_isaac_teleop def create_environment(env_cfg: ManagerBasedRLEnvCfg | DirectRLEnvCfg) -> gym.Env: @@ -242,7 +402,7 @@ def create_environment(env_cfg: ManagerBasedRLEnvCfg | DirectRLEnvCfg) -> gym.En Args: env_cfg: The environment configuration object that defines the environment properties. - This should be an instance of EnvCfg created by parse_env_cfg(). + This should be an instance of EnvCfg created by resolve_task_config(). Returns: gym.Env: A Gymnasium environment instance for the specified task. @@ -258,7 +418,17 @@ def create_environment(env_cfg: ManagerBasedRLEnvCfg | DirectRLEnvCfg) -> gym.En exit(1) -def setup_teleop_device(callbacks: dict[str, Callable]) -> object: +def _create_builtin_device(device_name: str) -> object | None: + """Create a built-in teleop device by name, or return None if unrecognized.""" + name = device_name.lower() + if name == "keyboard": + return Se3Keyboard(Se3KeyboardCfg(pos_sensitivity=0.2, rot_sensitivity=0.5)) + elif name == "spacemouse": + return Se3SpaceMouse(Se3SpaceMouseCfg(pos_sensitivity=0.2, rot_sensitivity=0.5)) + return None + + +def setup_teleop_device(callbacks: dict[str, Callable], use_isaac_teleop: bool = False) -> object: """Set up the teleoperation device based on configuration. Attempts to create a teleoperation device based on the environment configuration. @@ -267,6 +437,7 @@ def setup_teleop_device(callbacks: dict[str, Callable]) -> object: Args: callbacks: Dictionary mapping callback keys to functions that will be attached to the teleop device + use_isaac_teleop: Whether to use IsaacTeleop stack instead of native stack Returns: object: The configured teleoperation device interface @@ -274,25 +445,46 @@ def setup_teleop_device(callbacks: dict[str, Callable]) -> object: Raises: Exception: If teleop device creation fails """ + teleop_device_explicitly_set = args_cli.teleop_device is not None teleop_interface = None try: - if hasattr(env_cfg, "teleop_devices") and args_cli.teleop_device in env_cfg.teleop_devices.devices: - teleop_interface = create_teleop_device(args_cli.teleop_device, env_cfg.teleop_devices.devices, callbacks) - else: - logger.warning( - f"No teleop device '{args_cli.teleop_device}' found in environment config. Creating default." + if use_isaac_teleop: + from isaaclab_teleop import create_isaac_teleop_device + + teleop_interface = create_isaac_teleop_device( + env_cfg.isaac_teleop, + sim_device=args_cli.device, + callbacks=callbacks, + cloudxr_env_file=_resolve_cloudxr_env(args_cli.cloudxr_env, args_cli.xr), + auto_launch_cloudxr=args_cli.auto_launch_cloudxr, + use_kit_xr_bridge=args_cli.xr, + mcap_record_path=args_cli.mcap_record_path, + enable_debug_visualization=args_cli.enable_debug_visualization, + haptic_cfg=getattr(env_cfg, "haptic_feedback", None), ) - # Create fallback teleop device - if args_cli.teleop_device.lower() == "keyboard": - teleop_interface = Se3Keyboard(Se3KeyboardCfg(pos_sensitivity=0.2, rot_sensitivity=0.5)) - elif args_cli.teleop_device.lower() == "spacemouse": - teleop_interface = Se3SpaceMouse(Se3SpaceMouseCfg(pos_sensitivity=0.2, rot_sensitivity=0.5)) - else: - logger.error(f"Unsupported teleop device: {args_cli.teleop_device}") - logger.error("Supported devices: keyboard, spacemouse, handtracking") - exit(1) + if args_cli.mcap_record_path is not None: + logger.info("Recording live IsaacTeleop session to MCAP (debug-only): %s", args_cli.mcap_record_path) - # Add callbacks to fallback device + elif teleop_device_explicitly_set: + device_name = args_cli.teleop_device + if hasattr(env_cfg, "teleop_devices") and device_name in env_cfg.teleop_devices.devices: + teleop_interface = create_teleop_device(device_name, env_cfg.teleop_devices.devices, callbacks) + else: + teleop_interface = _create_builtin_device(device_name) + if teleop_interface is None: + logger.error( + f"--teleop_device={device_name} was passed but no matching entry exists in" + " env_cfg.teleop_devices and it is not a built-in device name. Either remove" + " --teleop_device to use the IsaacTeleop pipeline, or add a" + f" '{device_name}' entry under teleop_devices in the environment config." + " Built-in devices: keyboard, spacemouse." + ) + exit(1) + for key, callback in callbacks.items(): + teleop_interface.add_callback(key, callback) + else: + # No --teleop_device and no isaac_teleop: fall back to keyboard + teleop_interface = Se3Keyboard(Se3KeyboardCfg(pos_sensitivity=0.2, rot_sensitivity=0.5)) for key, callback in callbacks.items(): teleop_interface.add_callback(key, callback) except Exception as e: @@ -366,36 +558,47 @@ def process_success_condition(env: gym.Env, success_term: object | None, success def handle_reset( - env: gym.Env, success_step_count: int, instruction_display: InstructionDisplay, label_text: str + env: gym.Env, + success_step_count: int, + instruction_display: InstructionDisplay, + label_text: str, + teleop_interface: object | None = None, ) -> int: """Handle resetting the environment. - Resets the environment, recorder manager, and related state variables. - Updates the instruction display with current status. + Resets the environment, recorder manager, teleop device, and related + state variables. Updates the instruction display with current status. Args: - env: The environment instance to reset - success_step_count: Current count of consecutive successful steps - instruction_display: The display object to update - label_text: Text to display showing current recording status + env: The environment instance to reset. + success_step_count: Current count of consecutive successful steps. + instruction_display: The display object to update. + label_text: Text to display showing current recording status. + teleop_interface: Optional teleop device to reset (resets XR anchor + and retargeter cross-step state). Returns: - int: Reset success step count (0) + Reset success step count (0). """ print("Resetting environment...") - env.sim.reset() + if args_cli.reset_sim_buffer_each_episode: + env.sim.reset() env.recorder_manager.reset() env.reset() + if teleop_interface is not None and hasattr(teleop_interface, "reset"): + teleop_interface.reset() success_step_count = 0 instruction_display.show_demo(label_text) return success_step_count -def run_simulation_loop( +def run_simulation_loop( # noqa: C901 env: gym.Env, teleop_interface: object | None, success_term: object | None, rate_limiter: RateLimiter | None, + camera_feed_session: "XrCameraFeedSession", + use_isaac_teleop: bool = False, ) -> int: """Run the main simulation loop for collecting demonstrations. @@ -408,6 +611,8 @@ def run_simulation_loop( teleop_interface: Optional teleop interface (will be created if None) success_term: The success termination object or None if not available rate_limiter: Optional rate limiter to control simulation speed + camera_feed_session: Shared XR camera-feed lifecycle + use_isaac_teleop: Whether to use IsaacTeleop stack Returns: int: Number of successful demonstrations recorded @@ -415,11 +620,21 @@ def run_simulation_loop( current_recorded_demo_count = 0 success_step_count = 0 should_reset_recording_instance = False - running_recording_instance = not args_cli.xr + # For IsaacTeleop or XR, default to inactive until START is triggered. Without + # --xr, recording is started locally (see ``request_start`` below) instead of by + # a headset; it flows through the same state machine so keyboard/host pause/resume + # keeps working. + running_recording_instance = not (args_cli.xr or use_isaac_teleop) # Callback closures for the teleop device def reset_recording_instance(): nonlocal should_reset_recording_instance + if success_step_count > 0: + print( + "Manual reset ignored. Success has fired and post-success steps are still recording. Please wait for" + " the automatic reset." + ) + return should_reset_recording_instance = True print("Recording instance reset requested") @@ -433,7 +648,9 @@ def stop_recording_instance(): running_recording_instance = False print("Recording paused") - # Set up teleoperation callbacks + # Set up teleoperation callbacks. For IsaacTeleop the primary control + # path is poll_control_events(); these callbacks are bridged automatically + # and also serve native (keyboard / spacemouse) devices. teleoperation_callbacks = { "R": reset_recording_instance, "START": start_recording_instance, @@ -441,74 +658,153 @@ def stop_recording_instance(): "RESET": reset_recording_instance, } - teleop_interface = setup_teleop_device(teleoperation_callbacks) - teleop_interface.add_callback("R", reset_recording_instance) - - # Reset before starting - env.sim.reset() - env.reset() - teleop_interface.reset() + teleop_interface = setup_teleop_device(teleoperation_callbacks, use_isaac_teleop) + + # Optional controller haptics: no-ops unless the env declares a + # ``haptic_feedback`` config and the device can render it (IsaacTeleop). + # ``haptic_update`` renders the current contact force; ``haptic_stop`` zeroes + # it so a stale pulse does not persist while recording is paused. + haptic_update, haptic_stop = (lambda: None), (lambda: None) + if use_isaac_teleop: + from isaaclab_teleop import create_haptic_feedback_driver + + _haptic_driver = create_haptic_feedback_driver(env.unwrapped, teleop_interface, env_cfg) + if _haptic_driver is not None: + haptic_update, haptic_stop = _haptic_driver.update, _haptic_driver.stop + + # Optional keyboard for headset-free IsaacTeleop control (start / pause / reset). + # Captured through the app window, so only wired when one is present; a + # windowless run still auto-starts in ``inner_loop``. Kept in a local so its carb + # input subscription is not garbage-collected. ``R`` is an operator reset: + # ``reset(pause=True)`` injects a single RESET pulse (the control-event handler + # turns it into one env reset) and pauses the session -- binding it straight to + # ``reset_recording_instance`` would reset the env twice. + control_keyboard = None + if use_isaac_teleop and app_launcher.has_window: + try: + control_keyboard = Se3Keyboard(Se3KeyboardCfg(pos_sensitivity=0.0, rot_sensitivity=0.0)) + control_keyboard.add_callback("B", teleop_interface.request_start) + control_keyboard.add_callback("P", teleop_interface.request_stop) + control_keyboard.add_callback("R", lambda: teleop_interface.reset(pause=True)) + print("IsaacTeleop control keys: [B] start/resume [P] pause [R] reset") + except Exception as e: + logger.warning(f"Control keyboard unavailable ({e}); recording still auto-starts without --xr") + control_keyboard = None label_text = f"Recorded {current_recorded_demo_count} successful demonstrations." instruction_display = setup_ui(label_text, env) - subtasks = {} - - with contextlib.suppress(KeyboardInterrupt) and torch.inference_mode(): - while simulation_app.is_running(): - # Get keyboard command - action = teleop_interface.advance() - # Expand to batch dimension - actions = action.repeat(env.num_envs, 1) - - # Perform action on environment - if running_recording_instance: - # Compute actions based on environment - obv = env.step(actions) - if subtasks is not None: - if subtasks == {}: - subtasks = obv[0].get("subtask_terms") - elif subtasks: - show_subtask_instructions(instruction_display, subtasks, obv, env.cfg) - else: - env.sim.render() - - # Check for success condition - success_step_count, success_reset_needed = process_success_condition(env, success_term, success_step_count) - if success_reset_needed: - should_reset_recording_instance = True - - # Update demo count if it has changed - if env.recorder_manager.exported_successful_episode_count > current_recorded_demo_count: - current_recorded_demo_count = env.recorder_manager.exported_successful_episode_count - label_text = f"Recorded {current_recorded_demo_count} successful demonstrations." - print(label_text) - - # Check if we've reached the desired number of demos - if args_cli.num_demos > 0 and env.recorder_manager.exported_successful_episode_count >= args_cli.num_demos: - label_text = f"All {current_recorded_demo_count} demonstrations recorded.\nExiting the app." - instruction_display.show_demo(label_text) - print(label_text) - target_time = time.time() + 0.8 - while time.time() < target_time: - if rate_limiter: - rate_limiter.sleep(env) - else: - env.sim.render() - break - - # Handle reset if requested - if should_reset_recording_instance: - success_step_count = handle_reset(env, success_step_count, instruction_display, label_text) - should_reset_recording_instance = False - - # Check if simulation is stopped - if env.sim.is_stopped(): - break - - # Rate limiting - if rate_limiter: - rate_limiter.sleep(env) + def inner_loop(): + """Inner loop function with access to nonlocal variables.""" + nonlocal current_recorded_demo_count, success_step_count, should_reset_recording_instance + nonlocal running_recording_instance, label_text + + # Reset before starting + if args_cli.reset_sim_buffer_each_episode: + env.sim.reset() + env.reset() + teleop_interface.reset() + + # Without --xr there is no headset to send START, so drive the IsaacTeleop + # state machine to RUNNING locally ([B]/[P] can still pause/resume). The reset() + # above is a host reset (a pure pulse), so it does not cancel this start. + if use_isaac_teleop and not args_cli.xr: + teleop_interface.request_start() + + subtasks = {} + stack_name = "IsaacTeleop" if use_isaac_teleop else "native" + print(f"{stack_name} recording started.") + + if use_isaac_teleop: + from isaaclab_teleop import poll_control_events + + with contextlib.suppress(KeyboardInterrupt), torch.inference_mode(), camera_feed_session.bind(env): + while simulation_app.is_running(): + # Get teleop command (may be None while waiting for session start) + action = teleop_interface.advance() + + if use_isaac_teleop: + ctrl = poll_control_events(teleop_interface) + if ctrl.is_active is not None: + running_recording_instance = ctrl.is_active + if ctrl.should_reset: + should_reset_recording_instance = True + + if action is None: + env.sim.render() + haptic_stop() + continue + # Expand to batch dimension + actions = action.repeat(env.num_envs, 1) + + # Perform action on environment + if running_recording_instance: + # Compute actions based on environment + obv = env.step(actions) + # render controller haptics from post-step contact forces + haptic_update() + if subtasks is not None: + if subtasks == {}: + subtasks = obv[0].get("subtask_terms") + elif subtasks: + show_subtask_instructions(instruction_display, subtasks, obv, env.cfg) + else: + env.sim.render() + # not stepping: zero haptics so a paused grip stops buzzing + haptic_stop() + + # Check for success condition + success_step_count_new, success_reset_needed = process_success_condition( + env, success_term, success_step_count + ) + success_step_count = success_step_count_new + if success_reset_needed: + should_reset_recording_instance = True + + # Update demo count if it has changed + if env.recorder_manager.exported_successful_episode_count > current_recorded_demo_count: + current_recorded_demo_count = env.recorder_manager.exported_successful_episode_count + label_text = f"Recorded {current_recorded_demo_count} successful demonstrations." + print(label_text) + + # Check if we've reached the desired number of demos + if ( + args_cli.num_demos > 0 + and env.recorder_manager.exported_successful_episode_count >= args_cli.num_demos + ): + label_text = f"All {current_recorded_demo_count} demonstrations recorded.\nExiting the app." + instruction_display.show_demo(label_text) + print(label_text) + target_time = time.time() + 0.8 + while time.time() < target_time: + if rate_limiter: + rate_limiter.sleep(env) + else: + env.sim.render() + break + + # Handle reset if requested + if should_reset_recording_instance: + success_step_count = handle_reset( + env, success_step_count, instruction_display, label_text, teleop_interface + ) + camera_feed_session.refresh() + should_reset_recording_instance = False + + # Check if simulation is stopped + if env.sim.is_stopped(): + break + + # Rate limiting + if rate_limiter: + rate_limiter.sleep(env) + + # Run the loop with or without context manager based on stack + if use_isaac_teleop: + with teleop_interface: + inner_loop() + else: + inner_loop() return current_recorded_demo_count @@ -526,7 +822,30 @@ def main() -> None: Raises: Exception: Propagates exceptions from any of the called functions """ - # if handtracking is selected, rate limiting is achieved via OpenXR + # Set up output directories + output_dir, output_file_name = setup_output_directories() + + # Create and configure environment + global env_cfg # Make env_cfg available to setup_teleop_device + env_cfg, success_term, use_isaac_teleop = create_environment_config(output_dir, output_file_name) + + from isaaclab_teleop import XrCameraFeedSession + + camera_feed_session = XrCameraFeedSession.prepare( + env_cfg, + enabled=args_cli.xr and use_isaac_teleop, + camera_rendering_enabled=not args_cli.disable_external_cameras, + ) + if camera_feed_session.requires_responsive_denoising: + apply_isaac_rtx_global_settings( + IsaacRtxRendererGlobalSettingsCfg( + carb_settings={"/rtx/dldenoiser/responsiveDenoising": True}, + ) + ) + + # With --xr, rate limiting is achieved via OpenXR and the XR visualization + # manager is installed. Without --xr (including standalone IsaacTeleop I/O), + # fall back to the software rate limiter and skip the XR viz stack. if args_cli.xr: rate_limiter = None from isaaclab.ui.xr_widgets import TeleopVisualizationManager, XRVisualization @@ -536,18 +855,13 @@ def main() -> None: else: rate_limiter = RateLimiter(args_cli.step_hz) - # Set up output directories - output_dir, output_file_name = setup_output_directories() - - # Create and configure environment - global env_cfg # Make env_cfg available to setup_teleop_device - env_cfg, success_term = create_environment_config(output_dir, output_file_name) - # Create environment env = create_environment(env_cfg) # Run simulation loop - current_recorded_demo_count = run_simulation_loop(env, None, success_term, rate_limiter) + current_recorded_demo_count = run_simulation_loop( + env, None, success_term, rate_limiter, camera_feed_session, use_isaac_teleop + ) # Clean up env.close() @@ -558,5 +872,7 @@ def main() -> None: if __name__ == "__main__": # run the main function main() - # close sim app + # env.close() already closes the USD stage via sim.clear_instance(). + # Pump the event loop so the viewport processes closure, then close the app. + simulation_app.update() simulation_app.close() diff --git a/scripts/tools/replay_demos.py b/scripts/tools/replay_demos.py index e3d776fa..ae36414c 100644 --- a/scripts/tools/replay_demos.py +++ b/scripts/tools/replay_demos.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause """Script to replay demonstrations with Isaac Lab environments.""" @@ -7,9 +7,19 @@ """Launch Isaac Sim Simulator first.""" +# Isaac Lab does not use Warp autodiff; skipping adjoint codegen roughly halves the +# time spent building kernels on a cold kernel cache. +import warp as wp + +wp.config.enable_backward = False + import argparse +import sys from isaaclab.app import AppLauncher +from isaaclab.utils.string import list_intersection, string_to_callable + +from isaaclab_tasks.utils import setup_preset_cli # add argparse arguments parser = argparse.ArgumentParser(description="Replay demonstrations in Isaac Lab environments.") @@ -33,44 +43,56 @@ ), ) parser.add_argument( - "--enable_pinocchio", + "--validate_success_rate", action="store_true", default=False, - help="Enable Pinocchio.", + help="Validate the replay success rate using the task environment termination criteria", +) +parser.add_argument( + "--reset_sim_buffer_each_episode", + action="store_true", + default=False, + help=( + "Before loading each episode's initial state, call env.sim.reset() to clear" + " simulation buffers. Only valid with --num_envs 1." + ), ) +parser.add_argument("--external_callback", default=None, help="Fully qualified path to an externally defined callback.") # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) # parse the arguments -args_cli = parser.parse_args() +args_cli, hydra_args = setup_preset_cli(parser) # args_cli.headless = True -if args_cli.enable_pinocchio: - # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and not the one installed by Isaac Sim - # pinocchio is required by the Pink IK controllers and the GR1T2 retargeter - import pinocchio # noqa: F401 - # launch the simulator app_launcher = AppLauncher(args_cli) simulation_app = app_launcher.app +# Call an external callback if requested. +remaining_args_env_registration = None +if args_cli.external_callback: + external_callback_function = string_to_callable(args_cli.external_callback, separator=".") + remaining_args_env_registration = external_callback_function() + +# Hand arguments consumed by neither this parser nor the callback over to Hydra. +hydra_args = list_intersection(hydra_args, remaining_args_env_registration) +sys.argv = [sys.argv[0]] + hydra_args + """Rest everything follows.""" import contextlib -import gymnasium as gym import os + +import gymnasium as gym import torch from isaaclab.devices import Se3Keyboard, Se3KeyboardCfg from isaaclab.utils.datasets import EpisodeData, HDF5DatasetFileHandler -if args_cli.enable_pinocchio: - import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 - import isaaclab_tasks.manager_based.locomanipulation.pick_place # noqa: F401 - import isaaclab_tasks # noqa: F401 import uwlab_tasks # noqa: F401 -from isaaclab_tasks.utils.parse_cfg import parse_env_cfg +from isaaclab_tasks.utils import resolve_task_config is_paused = False @@ -115,95 +137,84 @@ def compare_states(state_from_dataset, runtime_state, runtime_env_index) -> (boo return states_matched, output_log -def main(): - """Replay episodes loaded from a file.""" - global is_paused - - # Load dataset - if not os.path.exists(args_cli.dataset_file): - raise FileNotFoundError(f"The dataset file {args_cli.dataset_file} does not exist.") - dataset_file_handler = HDF5DatasetFileHandler() - dataset_file_handler.open(args_cli.dataset_file) - env_name = dataset_file_handler.get_env_name() - episode_count = dataset_file_handler.get_num_episodes() - - if episode_count == 0: - print("No episodes found in the dataset.") - exit() - - episode_indices_to_replay = args_cli.select_episodes - if len(episode_indices_to_replay) == 0: - episode_indices_to_replay = list(range(episode_count)) - - if args_cli.task is not None: - env_name = args_cli.task.split(":")[-1] - if env_name is None: - raise ValueError("Task/env name was not specified nor found in the dataset.") - - num_envs = args_cli.num_envs - - env_cfg = parse_env_cfg(env_name, device=args_cli.device, num_envs=num_envs) - - # Disable all recorders and terminations - env_cfg.recorders = {} - env_cfg.terminations = {} - - # create environment from loaded config - env = gym.make(args_cli.task, cfg=env_cfg).unwrapped - - teleop_interface = Se3Keyboard(Se3KeyboardCfg(pos_sensitivity=0.1, rot_sensitivity=0.1)) - teleop_interface.add_callback("N", play_cb) - teleop_interface.add_callback("B", pause_cb) - print('Press "B" to pause and "N" to resume the replayed actions.') - - # Determine if state validation should be conducted - state_validation_enabled = False - if args_cli.validate_states and num_envs == 1: - state_validation_enabled = True - elif args_cli.validate_states and num_envs > 1: - print("Warning: State validation is only supported with a single environment. Skipping state validation.") - - # Get idle action (idle actions are applied to envs without next action) - if hasattr(env_cfg, "idle_action"): - idle_action = env_cfg.idle_action.repeat(num_envs, 1) - else: - idle_action = torch.zeros(env.action_space.shape) - - # reset before starting - env.reset() - teleop_interface.reset() +def replay_episodes_loop( # noqa: C901 + env, + dataset_file_handler: HDF5DatasetFileHandler, + episode_names: list[str], + episode_count: int, + episode_indices_to_replay: list[int], + num_envs: int, + success_term, + state_validation_enabled: bool, + idle_action: torch.Tensor, + reset_sim_buffer_each_episode: bool, +) -> tuple[int, int, list[int]]: + """Run the replay loop until all selected episodes finish or the app exits. - # simulate environment -- run everything in inference mode - episode_names = list(dataset_file_handler.get_episode_names()) + Returns: + Tuple of (replayed_episode_count, recorded_episode_count, failed_demo_ids). + """ replayed_episode_count = 0 + recorded_episode_count = 0 + current_episode_indices: list[int | None] = [None] * num_envs + failed_demo_ids: list[int] = [] + with contextlib.suppress(KeyboardInterrupt) and torch.inference_mode(): while simulation_app.is_running() and not simulation_app.is_exiting(): env_episode_data_map = {index: EpisodeData() for index in range(num_envs)} first_loop = True has_next_action = True + episode_ended = [False] * num_envs while has_next_action: # initialize actions with idle action so those without next action will not move - actions = idle_action + actions = idle_action.clone() has_next_action = False for env_id in range(num_envs): env_next_action = env_episode_data_map[env_id].get_next_action() if env_next_action is None: + # check if the episode is successful after the whole episode_data is + if ( + (success_term is not None) + and (current_episode_indices[env_id]) is not None + and (not episode_ended[env_id]) + ): + if bool(success_term.func(env, **success_term.params)[env_id]): + recorded_episode_count += 1 + plural_trailing_s = "s" if recorded_episode_count > 1 else "" + + print( + f"Successfully replayed {recorded_episode_count} episode{plural_trailing_s} out" + f" of {replayed_episode_count} demos." + ) + else: + # if not successful, add to failed demo IDs list + cid = current_episode_indices[env_id] + if cid is not None and cid not in failed_demo_ids: + failed_demo_ids.append(cid) + + episode_ended[env_id] = True + next_episode_index = None while episode_indices_to_replay: next_episode_index = episode_indices_to_replay.pop(0) + if next_episode_index < episode_count: + episode_ended[env_id] = False break next_episode_index = None if next_episode_index is not None: replayed_episode_count += 1 - print(f"{replayed_episode_count :4}: Loading #{next_episode_index} episode to env_{env_id}") + current_episode_indices[env_id] = next_episode_index + print(f"{replayed_episode_count:4}: Loading #{next_episode_index} episode to env_{env_id}") episode_data = dataset_file_handler.load_episode( episode_names[next_episode_index], env.device ) env_episode_data_map[env_id] = episode_data # Set initial state for the new episode initial_state = episode_data.get_initial_state() + if reset_sim_buffer_each_episode: + env.sim.reset() env.reset_to(initial_state, torch.tensor([env_id], device=env.device), is_relative=True) # Get the first action for the new episode env_next_action = env_episode_data_map[env_id].get_next_action() @@ -213,6 +224,9 @@ def main(): else: has_next_action = True actions[env_id] = env_next_action + if not has_next_action: + # Stop before stepping once every environment has exhausted its recorded actions. + break if first_loop: first_loop = False else: @@ -225,7 +239,7 @@ def main(): state_from_dataset = env_episode_data_map[0].get_next_state() if state_from_dataset is not None: print( - f"Validating states at action-index: {env_episode_data_map[0].next_state_index - 1 :4}", + f"Validating states at action-index: {env_episode_data_map[0].next_state_index - 1:4}", end="", ) current_runtime_state = env.scene.get_state(is_relative=True) @@ -236,9 +250,114 @@ def main(): print("\t- mismatched.") print(comparison_log) break + + return replayed_episode_count, recorded_episode_count, failed_demo_ids + + +def main(): + """Replay episodes loaded from a file.""" + global is_paused + + # Load dataset + if not os.path.exists(args_cli.dataset_file): + raise FileNotFoundError(f"The dataset file {args_cli.dataset_file} does not exist.") + dataset_file_handler = HDF5DatasetFileHandler() + dataset_file_handler.open(args_cli.dataset_file) + env_name = dataset_file_handler.get_env_name() + episode_count = dataset_file_handler.get_num_episodes() + + if episode_count == 0: + print("No episodes found in the dataset.") + exit() + + episode_indices_to_replay = list(args_cli.select_episodes) + if len(episode_indices_to_replay) == 0: + episode_indices_to_replay = list(range(episode_count)) + + if args_cli.task is not None: + env_name = args_cli.task.split(":")[-1] + if env_name is None: + raise ValueError("Task/env name was not specified nor found in the dataset.") + + num_envs = args_cli.num_envs + if args_cli.reset_sim_buffer_each_episode and num_envs != 1: + raise ValueError( + "--reset_sim_buffer_each_episode is only supported with a single environment (--num_envs 1). " + f"Got num_envs={num_envs}. Use --num_envs 1 or disable --reset_sim_buffer_each_episode." + ) + + env_cfg, _ = resolve_task_config(env_name, "") + env_cfg.sim.device = args_cli.device + env_cfg.scene.num_envs = num_envs + + # extract success checking function to invoke in the main loop + success_term = None + if args_cli.validate_success_rate: + if hasattr(env_cfg.terminations, "success"): + success_term = env_cfg.terminations.success + env_cfg.terminations.success = None + else: + print( + "No success termination term was found in the environment." + " Will not be able to mark recorded demos as successful." + ) + + # Disable all recorders and terminations + env_cfg.recorders = {} + env_cfg.terminations = {} + + # create environment from loaded config + env = gym.make(args_cli.task, cfg=env_cfg).unwrapped + + teleop_interface = Se3Keyboard(Se3KeyboardCfg(pos_sensitivity=0.1, rot_sensitivity=0.1)) + teleop_interface.add_callback("N", play_cb) + teleop_interface.add_callback("B", pause_cb) + print('Press "B" to pause and "N" to resume the replayed actions.') + + # Determine if state validation should be conducted + state_validation_enabled = False + if args_cli.validate_states and num_envs == 1: + state_validation_enabled = True + elif args_cli.validate_states and num_envs > 1: + print("Warning: State validation is only supported with a single environment. Skipping state validation.") + + # Get idle action (idle actions are applied to envs without next action) + if hasattr(env_cfg, "idle_action"): + idle_action = torch.tensor(env_cfg.idle_action, device=env.unwrapped.device).repeat(num_envs, 1) + else: + idle_action = torch.zeros(env.action_space.shape) + + # reset before starting + env.reset() + teleop_interface.reset() + + episode_names = list(dataset_file_handler.get_episode_names()) + replayed_episode_count, recorded_episode_count, failed_demo_ids = replay_episodes_loop( + env, + dataset_file_handler, + episode_names, + episode_count, + episode_indices_to_replay, + num_envs, + success_term, + state_validation_enabled, + idle_action, + args_cli.reset_sim_buffer_each_episode, + ) + # Close environment after replay in complete plural_trailing_s = "s" if replayed_episode_count > 1 else "" print(f"Finished replaying {replayed_episode_count} episode{plural_trailing_s}.") + + # Print success statistics only if validation was enabled + if success_term is not None: + print(f"Successfully replayed: {recorded_episode_count}/{replayed_episode_count}") + + # Print failed demo IDs if any + if failed_demo_ids: + print(f"\nFailed demo IDs ({len(failed_demo_ids)} total):") + print(f" {sorted(failed_demo_ids)}") + env.close() diff --git a/scripts/tools/test/test_cosmos_prompt_gen.py b/scripts/tools/test/test_cosmos_prompt_gen.py index d644d332..17f1764d 100644 --- a/scripts/tools/test/test_cosmos_prompt_gen.py +++ b/scripts/tools/test/test_cosmos_prompt_gen.py @@ -1,5 +1,5 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2024-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause @@ -17,7 +17,7 @@ @pytest.fixture(scope="class") def temp_templates_file(): """Create temporary templates file.""" - temp_file = tempfile.NamedTemporaryFile(suffix=".json", delete=False) + temp_file = tempfile.NamedTemporaryFile(suffix=".json", delete=False) # noqa: SIM115 # Create test templates test_templates = { @@ -40,7 +40,7 @@ def temp_templates_file(): @pytest.fixture def temp_output_file(): """Create temporary output file.""" - temp_file = tempfile.NamedTemporaryFile(suffix=".txt", delete=False) + temp_file = tempfile.NamedTemporaryFile(suffix=".txt", delete=False) # noqa: SIM115 yield temp_file.name # Cleanup os.remove(temp_file.name) diff --git a/scripts/tools/test/test_hdf5_to_mp4.py b/scripts/tools/test/test_hdf5_to_mp4.py index ef8f97f0..2cb3c777 100644 --- a/scripts/tools/test/test_hdf5_to_mp4.py +++ b/scripts/tools/test/test_hdf5_to_mp4.py @@ -1,15 +1,16 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2024-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause """Test cases for HDF5 to MP4 conversion script.""" -import h5py -import numpy as np import os import tempfile +import cv2 +import h5py +import numpy as np import pytest from scripts.tools.hdf5_to_mp4 import get_num_demos, main, write_demo_to_mp4 @@ -18,7 +19,7 @@ @pytest.fixture(scope="class") def temp_hdf5_file(): """Create temporary HDF5 file with test data.""" - temp_file = tempfile.NamedTemporaryFile(suffix=".h5", delete=False) + temp_file = tempfile.NamedTemporaryFile(suffix=".h5", delete=False) # noqa: SIM115 with h5py.File(temp_file.name, "w") as h5f: # Create test data structure for demo_id in range(2): # Create 2 demos @@ -28,6 +29,12 @@ def temp_hdf5_file(): rgb_data = np.random.randint(0, 255, (2, 704, 1280, 3), dtype=np.uint8) demo_group.create_dataset("table_cam", data=rgb_data) + # Create RGB frames stored as floats in [0, 1] + checkerboard = (np.indices((16, 16)).sum(axis=0) % 2).astype(np.float32) + rgb_float_data = np.stack([checkerboard, 1.0 - checkerboard], axis=0) + rgb_float_data = np.repeat(rgb_float_data[..., None], 3, axis=-1) + demo_group.create_dataset("table_cam_float", data=rgb_float_data) + # Create segmentation frames seg_data = np.random.randint(0, 255, (2, 704, 1280, 4), dtype=np.uint8) demo_group.create_dataset("table_cam_segmentation", data=seg_data) @@ -48,7 +55,7 @@ def temp_hdf5_file(): @pytest.fixture def temp_output_dir(): """Create temporary output directory.""" - temp_dir = tempfile.mkdtemp() + temp_dir = tempfile.mkdtemp() # noqa: SIM115 yield temp_dir # Cleanup for file in os.listdir(temp_dir): @@ -72,6 +79,28 @@ def test_write_demo_to_mp4_rgb(self, temp_hdf5_file, temp_output_dir): assert os.path.exists(output_file) assert os.path.getsize(output_file) > 0 + def test_write_demo_to_mp4_float_rgb(self, temp_hdf5_file, temp_output_dir): + """Test writing float RGB frames to MP4.""" + write_demo_to_mp4(temp_hdf5_file, 0, "data/demo_0/obs", "table_cam_float", temp_output_dir, 12, 20) + + output_file = os.path.join(temp_output_dir, "demo_0_table_cam_float.mp4") + assert os.path.exists(output_file) + assert os.path.getsize(output_file) > 0 + + video = cv2.VideoCapture(output_file) + decoded_frames = [] + while True: + success, frame = video.read() + if not success: + break + decoded_frames.append(frame) + video.release() + + assert len(decoded_frames) == 2 + decoded_frames = np.stack(decoded_frames) + assert decoded_frames.shape[1:3] == (12, 20) + assert 60.0 < decoded_frames.mean() < 195.0 + def test_write_demo_to_mp4_segmentation(self, temp_hdf5_file, temp_output_dir): """Test writing segmentation frames to MP4.""" write_demo_to_mp4(temp_hdf5_file, 0, "data/demo_0/obs", "table_cam_segmentation", temp_output_dir, 704, 1280) diff --git a/scripts/tools/test/test_mp4_to_hdf5.py b/scripts/tools/test/test_mp4_to_hdf5.py index f26fb117..631ac41d 100644 --- a/scripts/tools/test/test_mp4_to_hdf5.py +++ b/scripts/tools/test/test_mp4_to_hdf5.py @@ -1,16 +1,16 @@ -# Copyright (c) 2024-2025, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). -# All Rights Reserved. +# Copyright (c) 2024-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause """Test cases for MP4 to HDF5 conversion script.""" -import h5py -import numpy as np import os import tempfile import cv2 +import h5py +import numpy as np import pytest from scripts.tools.mp4_to_hdf5 import get_frames_from_mp4, main, process_video_and_demo @@ -19,7 +19,7 @@ @pytest.fixture(scope="class") def temp_hdf5_file(): """Create temporary HDF5 file with test data.""" - temp_file = tempfile.NamedTemporaryFile(suffix=".h5", delete=False) + temp_file = tempfile.NamedTemporaryFile(suffix=".h5", delete=False) # noqa: SIM115 with h5py.File(temp_file.name, "w") as h5f: # Create test data structure for 2 demos for demo_id in range(2): @@ -55,7 +55,7 @@ def temp_hdf5_file(): @pytest.fixture(scope="class") def temp_videos_dir(): """Create temporary MP4 files.""" - temp_dir = tempfile.mkdtemp() + temp_dir = tempfile.mkdtemp() # noqa: SIM115 video_paths = [] for demo_id in range(2): @@ -83,7 +83,7 @@ def temp_videos_dir(): @pytest.fixture def temp_output_file(): """Create temporary output file.""" - temp_file = tempfile.NamedTemporaryFile(suffix=".h5", delete=False) + temp_file = tempfile.NamedTemporaryFile(suffix=".h5", delete=False) # noqa: SIM115 yield temp_file.name # Cleanup os.remove(temp_file.name) diff --git a/scripts/tools/test/test_train_and_publish_checkpoints.py b/scripts/tools/test/test_train_and_publish_checkpoints.py new file mode 100644 index 00000000..f36ab17f --- /dev/null +++ b/scripts/tools/test/test_train_and_publish_checkpoints.py @@ -0,0 +1,208 @@ +# Copyright (c) 2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Tests for the pretrained-checkpoint training utility.""" + +from argparse import Namespace +from pathlib import Path +from types import SimpleNamespace + +import gymnasium as gym +import pytest + +from isaaclab_tasks.utils.hydra import collect_presets +from isaaclab_tasks.utils.parse_cfg import load_cfg_from_registry +from isaaclab_tasks.utils.preset_cli import enumerate_task_presets +from isaaclab_tasks.utils.preset_target import PresetTarget + +from scripts.tools.train_and_publish_checkpoints import ( + CheckpointJob, + _build_core_jobs, + _play_command, + _select_physics_variants, + _training_command, + collect_pretrained_checkpoint, + publish_pretrained_checkpoint, +) + + +def test_cartpole_feature_presets_are_in_pretrained_checkpoint_matrix() -> None: + """Every Cartpole feature policy for the preferred workflow must receive a distinct checkpoint.""" + task_spec = gym.spec("Isaac-Cartpole-Camera") + workflow = task_spec.kwargs["default_agent"] + agent_cfg = load_cfg_from_registry(task_spec.id, f"{workflow}_cfg_entry_point") + feature_presets = set(collect_presets(agent_cfg)[""]) - {"default"} + + assert set(task_spec.kwargs["pretrained_checkpoint_preset_compatibility"][workflow]) == feature_presets + + +def test_checkpoint_preset_metadata_references_registered_variants() -> None: + """Checkpoint declarations must name registered workflows and domain presets.""" + for task_spec in gym.registry.values(): + checkpoint_compatibility = task_spec.kwargs.get("pretrained_checkpoint_preset_compatibility", {}) + if not checkpoint_compatibility: + continue + + preset_map = enumerate_task_presets(task_spec.id) or {} + domain_presets = set(preset_map.get(PresetTarget.DOMAIN, ())) + for workflow, preset_names in checkpoint_compatibility.items(): + assert f"{workflow}_cfg_entry_point" in task_spec.kwargs, ( + f"{task_spec.id}: unregistered {workflow} workflow" + ) + assert len(preset_names) == len(set(preset_names)), ( + f"{task_spec.id}: duplicate {workflow} checkpoint preset" + ) + assert not set(preset_names) - domain_presets, f"{task_spec.id}: unknown {workflow} checkpoint preset" + + +def test_build_core_jobs_skips_unsupported_preset_without_normalizing_default( + monkeypatch: pytest.MonkeyPatch, +) -> None: + """An unsupported preset-only task must not abort construction of the supported core matrix.""" + task_spec = SimpleNamespace( + id="Isaac-Unsupported-Core-Task", + kwargs={ + "env_cfg_entry_point": "isaaclab_tasks.core.unsupported:UnsupportedEnvCfg", + "rsl_rl_cfg_entry_point": "isaaclab_tasks.core.unsupported:UnsupportedAgentCfg", + }, + ) + monkeypatch.setattr("scripts.tools.train_and_publish_checkpoints.gym.registry", {task_spec.id: task_spec}) + monkeypatch.setattr("scripts.tools.train_and_publish_checkpoints.parse_env_cfg", lambda _: object()) + monkeypatch.setattr( + "scripts.tools.train_and_publish_checkpoints.enumerate_task_presets", + lambda _: {PresetTarget.PHYSICS: ["newton_kamino"]}, + ) + monkeypatch.setattr( + "scripts.tools.train_and_publish_checkpoints.get_pretrained_checkpoint_backend_names", + lambda _: pytest.fail("preset-only tasks must not normalize their unsupported default backend"), + ) + args = Namespace(physics_backends="physx,newtonmjwarp", render_backends="rtx,newton") + + assert _build_core_jobs(args) == [] + + +def test_job_commands_use_uv_run_isaaclab() -> None: + """Training and playback must use the uv-managed Isaac Lab CLI.""" + job = CheckpointJob( + workflow="rsl_rl", + task_name="Isaac-Test", + physics_backend="physx", + render_backend="none", + preset_names=("depth",), + physics_selector="isaacsim_physx", + ) + args = Namespace(max_iterations=None, num_envs=None) + + train_command = _training_command(job, args, smoke=False) + play_command = _play_command(job, args, "/tmp/checkpoint.pt") + + assert train_command[:4] == ["uv", "run", "isaaclab", "train"] + assert play_command[:4] == ["uv", "run", "isaaclab", "play"] + assert train_command[-2:] == ["physics=isaacsim_physx", "presets=depth"] + assert play_command[-2:] == ["physics=isaacsim_physx", "presets=depth"] + + +def test_build_core_jobs_includes_declared_checkpoint_presets(monkeypatch: pytest.MonkeyPatch) -> None: + """Core jobs must include preset-specific checkpoints declared by the task.""" + task_spec = SimpleNamespace( + id="Isaac-Test", + kwargs={ + "env_cfg_entry_point": "isaaclab_tasks.core.test:TestEnvCfg", + "rl_games_cfg_entry_point": "isaaclab_tasks.core.test:TestAgentCfg", + "rsl_rl_cfg_entry_point": "isaaclab_tasks.core.test:TestAgentCfg", + "pretrained_checkpoint_preset_compatibility": {"rl_games": ("depth",)}, + }, + ) + monkeypatch.setattr("scripts.tools.train_and_publish_checkpoints.gym.registry", {task_spec.id: task_spec}) + monkeypatch.setattr("scripts.tools.train_and_publish_checkpoints.parse_env_cfg", lambda _: object()) + monkeypatch.setattr("scripts.tools.train_and_publish_checkpoints.enumerate_task_presets", lambda _: {}) + monkeypatch.setattr( + "scripts.tools.train_and_publish_checkpoints.get_pretrained_checkpoint_backend_names", + lambda _: ("physx", "rtx"), + ) + args = Namespace(physics_backends="physx", render_backends="rtx") + + jobs = _build_core_jobs(args) + + assert [(job.workflow, job.preset_names) for job in jobs] == [("rsl_rl", ()), ("rl_games", ("depth",))] + + +def test_select_physics_variants_uses_concrete_isaac_sim_physx() -> None: + """The normalized PhysX job must not resolve through the automatic selector.""" + variants = ["physx", "isaacsim_physx", "ovphysx", "newton_mjwarp"] + + selections = _select_physics_variants("Isaac-Test", variants, "physx", ["physx", "newtonmjwarp"]) + + assert selections == [("physx", "isaacsim_physx"), ("newtonmjwarp", "newton_mjwarp")] + + +def test_select_physics_variants_includes_franka_osc_newton_mjwarp() -> None: + """The effort-limited OSC task is supported by Newton MJWarp.""" + selections = _select_physics_variants( + "Isaac-Reach-Franka-OSC", ["isaacsim_physx", "newton_mjwarp"], "physx", ["newtonmjwarp"] + ) + + assert selections == [("newtonmjwarp", "newton_mjwarp")] + + +def test_select_physics_variants_selects_coupled_newton_preset() -> None: + """Coupled tasks must publish under the MJWarp backend using their proxy preset.""" + variants = ["physx", "isaacsim_physx", "ovphysx", "newton_mjwarp_vbd_proxy"] + + selections = _select_physics_variants("Isaac-Test", variants, "newtonmjwarp", ["newtonmjwarp"]) + + assert selections == [("newtonmjwarp", "newton_mjwarp_vbd_proxy")] + + +def test_select_physics_variants_does_not_fall_back_to_automatic_physx() -> None: + """A task without a concrete Isaac Sim selector must not run as OvPhysX.""" + selections = _select_physics_variants("Isaac-Test", ["physx", "ovphysx"], "physx", ["physx"]) + + assert selections == [] + + +def test_legacy_job_experiment_name_preserves_task_name() -> None: + """Legacy jobs must keep separate experiment directories for each task.""" + job = CheckpointJob(workflow="rsl_rl", task_name="Isaac-Test") + + assert job.experiment_name == "Isaac-Test" + + +def test_legacy_collection_preserves_task_directory(tmp_path: Path) -> None: + """Legacy collected checkpoints must retain their task-specific directory.""" + job = CheckpointJob(workflow="rsl_rl", task_name="Isaac-Test") + + path = collect_pretrained_checkpoint(job, str(tmp_path), dry_run=True) + + assert path == str(tmp_path / "rsl_rl" / "Isaac-Test" / "checkpoint.pt") + + +def test_publish_uses_collected_checkpoint_without_training_logs( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], +) -> None: + """Publishing a collected checkpoint must not require its original training logs.""" + job = CheckpointJob( + workflow="rsl_rl", + task_name="Isaac-Test", + physics_backend="newtonmjwarp", + render_backend="none", + preset_names=("depth",), + ) + collected_path = tmp_path / "rsl_rl" / "Isaac-Test_depth_newtonmjwarp_none_rsl_rl.pt" + collected_path.parent.mkdir() + collected_path.touch() + args = Namespace( + dry_run=True, + force_publish=True, + output_dir=str(tmp_path), + publish_root="omniverse://checkpoints", + ) + + assert publish_pretrained_checkpoint(job, args) + assert ( + f"Publishing {collected_path} -> omniverse://checkpoints/rsl_rl/Isaac-Test_depth_newtonmjwarp_none_rsl_rl.pt" + in capsys.readouterr().out + ) diff --git a/scripts/tools/test/test_uw_entrypoints.py b/scripts/tools/test/test_uw_entrypoints.py new file mode 100644 index 00000000..3d8c64b5 --- /dev/null +++ b/scripts/tools/test/test_uw_entrypoints.py @@ -0,0 +1,67 @@ +# Copyright (c) 2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). +# All Rights Reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +import argparse +import runpy +import sys +from pathlib import Path +from types import ModuleType, SimpleNamespace + +import pytest + +ROOT = Path(__file__).resolve().parents[3] + + +@pytest.mark.parametrize( + "keyword, expected", + [(None, ["Isaac-Test", "UW-Test", "OmniReset-Test"]), ("UW-", ["UW-Test"]), ("OmniReset-", ["OmniReset-Test"])], +) +def test_environment_listing_includes_uw_tasks(monkeypatch, capsys, keyword, expected): + gym = ModuleType("gymnasium") + gym.registry = { + name: SimpleNamespace( + id=name, + entry_point="fixture:Env", + kwargs={"env_cfg_entry_point": "fixture:Cfg", "deprecated": name == "Isaac-Old"}, + ) + for name in ("Isaac-Test", "UW-Test", "OmniReset-Test", "Isaac-Old", "Other-Test") + } + monkeypatch.setitem(sys.modules, "gymnasium", gym) + for name in ("isaaclab_tasks", "isaaclab_tasks_experimental", "uwlab_tasks"): + monkeypatch.setitem(sys.modules, name, ModuleType(name)) + argv = ["list_envs.py"] + (["--keyword", keyword] if keyword else []) + monkeypatch.setattr(sys, "argv", argv) + runpy.run_path(str(ROOT / "scripts/environments/list_envs.py"), run_name="__main__") + output = capsys.readouterr().out + for name in gym.registry: + assert (name in output) == (name in expected) + + +@pytest.mark.parametrize( + "arguments, resume", + [([], True), (["--experiment_name", "custom"], False), (["--resume"], False), (["--device", "cpu"], False)], +) +def test_rsl_cli_overrides_only_requested_values(arguments, resume): + module = runpy.run_path(str(ROOT / "scripts/reinforcement_learning/rsl_rl/cli_args.py")) + parser = argparse.ArgumentParser() + module["add_rsl_rl_args"](parser) + parser.add_argument("--device", default=None) + args = parser.parse_args(arguments) + cfg = SimpleNamespace( + seed=42, + resume=resume, + load_run="saved", + load_checkpoint="model.pt", + experiment_name="original", + run_name="base", + logger="tensorboard", + device="cuda:0", + ) + result = module["update_rsl_rl_cfg"](cfg, args) + assert result is cfg + assert cfg.resume is (resume or "--resume" in arguments) + assert cfg.experiment_name == ("custom" if "--experiment_name" in arguments else "original") + assert cfg.device == ("cpu" if "--device" in arguments else "cuda:0") + assert cfg.load_run == "saved" and cfg.load_checkpoint == "model.pt" diff --git a/scripts/tools/train_and_publish_checkpoints.py b/scripts/tools/train_and_publish_checkpoints.py new file mode 100644 index 00000000..e9b1cf69 --- /dev/null +++ b/scripts/tools/train_and_publish_checkpoints.py @@ -0,0 +1,811 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Train, collect, review, and publish pretrained Isaac Lab checkpoints. + +The core-task workflow selects RSL-RL when it is registered, falls back to +RL-Games, and uses SKRL MAPPO for multi-agent environments. Backend-aware +checkpoints are collected into one subdirectory per RL library: + +.. code-block:: text + + logs/pretrained_checkpoints/ + ├── rl_games/ + ├── rsl_rl/ + └── skrl/ + +Each checkpoint is named +``[_]___``. +State-only tasks use ``none`` as the render backend because their policies do +not depend on rendering. This workflow targets core tasks only; other +registered tasks do not receive published checkpoints from this matrix. The +core matrix excludes Newton Kamino presets. + +Examples: + +.. code-block:: shell + + # List the preferred core-task training matrix. + uv run python scripts/tools/train_and_publish_checkpoints.py \ + --list --all --core + + # Smoke-test every supported core-task backend combination. + uv run python scripts/tools/train_and_publish_checkpoints.py \ + --smoke --all --core + + # Run full training and collect checkpoints. + uv run python scripts/tools/train_and_publish_checkpoints.py \ + --train --all --core + + # Resume collection after training jobs have completed. + uv run python scripts/tools/train_and_publish_checkpoints.py \ + --collect --all --core + + # Select legacy jobs with workflow and task wildcards. + rl_games:Isaac-Humanoid-* # Wildcard for any Humanoid version + rsl_rl:Isaac-Ant-* # Wildcard for any Ant environment + *:IsaacContrib-Velocity-Flat-Spot # Wildcard for any workflow, specific task + +Legacy ``workflow:task`` job selectors remain supported when ``--core`` is +omitted. +""" + +from __future__ import annotations + +import argparse +import csv +import fnmatch +import json +import os +import posixpath +import shutil +import subprocess +import sys +from dataclasses import dataclass + +# Prefer this checkout over editable installs that may point at another worktree. +_REPO_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) +_SOURCE_ROOT = os.path.join(_REPO_ROOT, "source") +_REPO_SOURCE_PATHS = sorted( + entry.path for entry in os.scandir(_SOURCE_ROOT) if entry.is_dir() and os.path.isdir(entry.path) +) +for source_path in reversed(_REPO_SOURCE_PATHS): + if source_path not in sys.path: + sys.path.insert(0, source_path) + +import gymnasium as gym + +from isaaclab.envs import DirectMARLEnvCfg + +from isaaclab_rl.utils.pretrained_checkpoint import ( + WORKFLOW_EXPERIMENT_NAME_VARIABLE, + WORKFLOWS, + get_latest_job_run_path, + get_pretrained_checkpoint_backend_names, + get_pretrained_checkpoint_filename, + get_pretrained_checkpoint_path, + get_pretrained_checkpoint_publish_path, + get_pretrained_checkpoint_review, + get_pretrained_checkpoint_review_path, + has_pretrained_checkpoint_job_finished, + has_pretrained_checkpoint_job_run, + has_pretrained_checkpoints_asset_root_dir, +) + +import isaaclab_tasks # noqa: F401 +from isaaclab_tasks.utils import parse_env_cfg +from isaaclab_tasks.utils.hydra import resolve_task_config +from isaaclab_tasks.utils.preset_cli import enumerate_task_presets +from isaaclab_tasks.utils.preset_target import PresetTarget + +_TRAINING_COMPLETE_FILENAME = ".pretrained_checkpoint_training_complete" +_CORE_WORKFLOWS = ("rl_games", "rsl_rl", "skrl") + + +@dataclass(frozen=True) +class CheckpointJob: + """One workflow, task, preset, physics, and renderer training combination.""" + + workflow: str + task_name: str + physics_backend: str | None = None + render_backend: str | None = None + preset_names: tuple[str, ...] = () + physics_selector: str | None = None + render_selector: str | None = None + agent: str | None = None + algorithm: str | None = None + + @property + def job_id(self) -> str: + """Return the stable human-readable job identifier.""" + if self.physics_backend is None: + return f"{self.workflow}:{self.task_name}" + parts = [self.workflow, self.task_name, *self.preset_names, self.physics_backend, self.render_backend] + return ":".join(parts) + + @property + def experiment_name(self) -> str: + """Return the experiment directory name used by the RL workflow.""" + if self.physics_backend is None and self.render_backend is None: + return self.task_name + filename = get_pretrained_checkpoint_filename( + self.workflow, + self.task_name, + self.physics_backend, + self.render_backend, + preset_names=self.preset_names, + ) + extension = os.path.splitext(filename)[1] + return filename.removesuffix(extension) + + @property + def preset_args(self) -> list[str]: + """Return preset selectors for this job.""" + args = [] + if self.physics_selector is not None: + args.append(f"physics={self.physics_selector}") + if self.render_selector is not None: + args.append(f"renderer={self.render_selector}") + if self.preset_names: + args.append(f"presets={','.join(self.preset_names)}") + return args + + +def _create_parser() -> argparse.ArgumentParser: + """Create the command-line parser.""" + parser = argparse.ArgumentParser( + description="Train and manage backend-aware pretrained checkpoints.", + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.add_argument( + "jobs", + nargs="*", + help="Job patterns. Legacy jobs use workflow:task. Core matrix patterns match the displayed job IDs.", + ) + parser.add_argument("-t", "--train", action="store_true", help="Run full training and collect checkpoints.") + parser.add_argument("--smoke", action="store_true", help="Run one-iteration backend smoke training.") + parser.add_argument("--collect", action="store_true", help="Collect completed checkpoints without training.") + parser.add_argument("-p", "--publish_checkpoint", action="store_true", help="Publish collected checkpoints.") + parser.add_argument("-r", "--review", action="store_true", help="Interactively review checkpoints.") + parser.add_argument("-l", "--list", action="store_true", help="List matching checkpoint jobs.") + parser.add_argument("-f", "--force", action="store_true", help="Repeat completed training jobs.") + parser.add_argument("-a", "--all", action="store_true", help="Match all jobs in the selected scope.") + parser.add_argument( + "--core", + action="store_true", + help="Use core tasks, preferred RL libraries, and the supported backend matrix.", + ) + parser.add_argument( + "--physics_backends", + default="physx,newtonmjwarp", + help="Comma-separated normalized physics backends for --core (default: physx,newtonmjwarp).", + ) + parser.add_argument( + "--render_backends", + default="rtx,newton", + help="Comma-separated normalized camera render backends for --core (default: rtx,newton).", + ) + parser.add_argument( + "--output_dir", + default=os.path.join("logs", "pretrained_checkpoints"), + help="Structured checkpoint output directory.", + ) + parser.add_argument( + "--publish_root", + default=None, + help="Writable Nucleus root ending in PretrainedCheckpoints; defaults to the configured asset root.", + ) + parser.add_argument( + "-E", + "--exclude", + action="append", + default=[], + help="Exclude jobs matching a wildcard pattern.", + ) + parser.add_argument("--num_envs", type=int, default=None, help="Override the training environment count.") + parser.add_argument( + "--max_iterations", + type=int, + default=None, + help="Override full-training iterations. Omit to use each agent config's full schedule.", + ) + parser.add_argument("--force_review", action="store_true", help="Replace an existing review.") + parser.add_argument("--force_publish", action="store_true", help="Publish without an accepted review.") + parser.add_argument("--fail_fast", action="store_true", help="Stop after the first failed job.") + parser.add_argument("--dry_run", action="store_true", help="Print commands without running them.") + return parser + + +def _parse_backend_list(value: str, supported: set[str], option: str) -> list[str]: + """Parse and validate a comma-separated backend option.""" + backends = [item.strip() for item in value.split(",") if item.strip()] + unknown = set(backends) - supported + if unknown: + raise ValueError(f"{option} contains unsupported values: {sorted(unknown)}") + return backends + + +def _is_core_task(task_spec: gym.EnvSpec) -> bool: + """Return whether a Gym task is registered from ``isaaclab_tasks.core``.""" + env_cfg_entry_point = task_spec.kwargs.get("env_cfg_entry_point") + return ( + isinstance(env_cfg_entry_point, str) + and env_cfg_entry_point.startswith("isaaclab_tasks.core.") + and not task_spec.kwargs.get("deprecated") + ) + + +def _select_workflow(task_spec: gym.EnvSpec, env_cfg) -> tuple[str, str | None, str | None]: + """Select the preferred RL workflow and optional agent arguments.""" + if isinstance(env_cfg, DirectMARLEnvCfg): + if "skrl_mappo_cfg_entry_point" not in task_spec.kwargs: + raise ValueError(f"Multi-agent task {task_spec.id!r} does not register an SKRL MAPPO config") + return "skrl", "skrl_mappo_cfg_entry_point", "MAPPO" + if "rsl_rl_cfg_entry_point" in task_spec.kwargs: + return "rsl_rl", None, None + if "rl_games_cfg_entry_point" in task_spec.kwargs: + return "rl_games", None, None + raise ValueError(f"Task {task_spec.id!r} has neither an RSL-RL nor an RL-Games config") + + +def _select_physics_variants( + task_name: str, + variants: list[str], + default_backend: str | None, + requested_backends: list[str], +) -> list[tuple[str, str | None]]: + """Return normalized physics backends and their task preset selectors.""" + selections = [] + for backend in requested_backends: + selector = None + if variants: + if backend == "physx" and "isaacsim_physx" in variants: + selector = "isaacsim_physx" + elif backend == "newtonmjwarp": + selector = next( + ( + candidate + for candidate in ("newton_mjwarp", "newton_mjwarp_vbd", "newton_mjwarp_vbd_proxy") + if candidate in variants + ), + None, + ) + if selector is None: + continue + elif backend != default_backend: + continue + selections.append((backend, selector)) + return selections + + +def _resolve_physics_backend(task_name: str, physics_selector: str | None, default_backend: str | None) -> str: + """Return the checkpoint physics token produced by a task's selected physics preset. + + The token names the solver tree, so a preset selector and its published filename can + only be kept in agreement by resolving the selector. + """ + if physics_selector is None: + return default_backend + env_cfg, _ = resolve_task_config(task_name, None, overrides=(f"physics={physics_selector}",)) + physics_backend, _ = get_pretrained_checkpoint_backend_names(env_cfg) + return physics_backend + + +def _select_render_variants( + variants: list[str], + requested_backends: list[str], +) -> list[tuple[str, str | None]]: + """Return normalized render backends and their task preset selectors.""" + if not variants: + return [("none", None)] + + selections = [] + for backend in requested_backends: + selector = None + if backend == "rtx": + selector = next( + (candidate for candidate in ("isaacsim_rtx", "rtx", "ovrtx") if candidate in variants), None + ) + elif backend == "newton" and "newton_renderer" in variants: + selector = "newton_renderer" + if selector is not None: + selections.append((backend, selector)) + return selections + + +def _build_core_jobs(args: argparse.Namespace) -> list[CheckpointJob]: + """Build the supported preferred-workflow matrix for core tasks.""" + physics_backends = _parse_backend_list( + args.physics_backends, + {"newtonmjwarp", "physx"}, + "--physics_backends", + ) + render_backends = _parse_backend_list( + args.render_backends, + {"newton", "rtx"}, + "--render_backends", + ) + jobs = [] + for task_spec in sorted(gym.registry.values(), key=lambda spec: spec.id): + if not _is_core_task(task_spec): + continue + + preset_map = enumerate_task_presets(task_spec.id) or {} + physics_variants = preset_map.get(PresetTarget.PHYSICS, []) + render_variants = preset_map.get(PresetTarget.RENDERER, []) + env_cfg = parse_env_cfg(task_spec.id) + preferred_workflow = _select_workflow(task_spec, env_cfg) + checkpoint_compatibility = task_spec.kwargs.get("pretrained_checkpoint_preset_compatibility", {}) + workflow_selections = [preferred_workflow] + workflow_selections.extend( + (workflow, None, None) + for workflow in checkpoint_compatibility + if workflow != preferred_workflow[0] and f"{workflow}_cfg_entry_point" in task_spec.kwargs + ) + default_physics = None + if not physics_variants: + default_physics, _ = get_pretrained_checkpoint_backend_names(env_cfg) + + physics_selections = _select_physics_variants( + task_spec.id, + physics_variants, + default_physics, + physics_backends, + ) + render_selections = _select_render_variants(render_variants, render_backends) + for workflow, agent, algorithm in workflow_selections: + checkpoint_presets = [()] if workflow == preferred_workflow[0] else [] + checkpoint_presets.extend((preset_name,) for preset_name in checkpoint_compatibility.get(workflow, ())) + for _physics_family, physics_selector in physics_selections: + physics_backend = _resolve_physics_backend(task_spec.id, physics_selector, default_physics) + for render_backend, render_selector in render_selections: + for preset_names in checkpoint_presets: + jobs.append( + CheckpointJob( + workflow=workflow, + task_name=task_spec.id, + physics_backend=physics_backend, + render_backend=render_backend, + preset_names=preset_names, + physics_selector=physics_selector, + render_selector=render_selector, + agent=agent, + algorithm=algorithm, + ) + ) + return jobs + + +def _build_legacy_jobs() -> list[CheckpointJob]: + """Build every legacy workflow/task pair registered with Gym.""" + jobs = [] + for workflow in WORKFLOWS: + for task_spec in sorted(gym.registry.values(), key=lambda spec: spec.id): + if workflow + "_cfg_entry_point" in task_spec.kwargs and not task_spec.kwargs.get("deprecated"): + jobs.append(CheckpointJob(workflow=workflow, task_name=task_spec.id)) + return jobs + + +def _filter_jobs(jobs: list[CheckpointJob], args: argparse.Namespace) -> list[CheckpointJob]: + """Apply positional include patterns and exclusion patterns.""" + include_patterns = ["*"] if args.all else args.jobs + selected = [] + for job in jobs: + if not any(fnmatch.fnmatch(job.job_id, pattern) for pattern in include_patterns): + continue + if any(fnmatch.fnmatch(job.job_id, pattern) for pattern in args.exclude): + continue + selected.append(job) + return selected + + +def _training_command(job: CheckpointJob, args: argparse.Namespace, smoke: bool) -> list[str]: + """Build the unified training command for a checkpoint job.""" + command = [ + "uv", + "run", + "isaaclab", + "train", + "--rl_library", + job.workflow, + "--task", + job.task_name, + ] + if job.agent is not None: + command.extend(["--agent", job.agent]) + if job.algorithm is not None: + command.extend(["--algorithm", job.algorithm]) + + experiment_name = f"{job.experiment_name}_smoke" if smoke else job.experiment_name + experiment_variable = WORKFLOW_EXPERIMENT_NAME_VARIABLE[job.workflow] + if experiment_variable is not None: + command.append(f"{experiment_variable}={experiment_name}") + + if smoke: + command.extend(["--max_iterations", "1", "--num_envs", str(args.num_envs or 4)]) + else: + if args.max_iterations is not None: + command.extend(["--max_iterations", str(args.max_iterations)]) + if args.num_envs is not None: + command.extend(["--num_envs", str(args.num_envs)]) + command.extend(job.preset_args) + return command + + +def _play_command(job: CheckpointJob, args: argparse.Namespace, checkpoint_path: str) -> list[str]: + """Build the unified playback command for a checkpoint job.""" + command = [ + "uv", + "run", + "isaaclab", + "play", + "--rl_library", + job.workflow, + "--task", + job.task_name, + "--checkpoint", + checkpoint_path, + ] + if job.agent is not None: + command.extend(["--agent", job.agent]) + if job.algorithm is not None: + command.extend(["--algorithm", job.algorithm]) + if args.num_envs is not None: + command.extend(["--num_envs", str(args.num_envs)]) + command.extend(job.preset_args) + return command + + +def _run_command(command: list[str], dry_run: bool) -> int: + """Print and run a subprocess command.""" + print("Running:", " ".join(command), flush=True) + if dry_run: + return 0 + env = os.environ.copy() + existing_pythonpath = env.get("PYTHONPATH") + python_paths = _REPO_SOURCE_PATHS + ([existing_pythonpath] if existing_pythonpath else []) + env["PYTHONPATH"] = os.pathsep.join(python_paths) + env.pop("CONDA_PREFIX", None) + # Keep the active environment ahead of Isaac Sim's bundled site-packages. + # This matters for packages such as Newton, where the project environment + # can carry the source-compatible revision while Isaac Sim bundles an older + # release. + env["VIRTUAL_ENV"] = sys.prefix + return subprocess.run(command, check=False, cwd=_REPO_ROOT, env=env).returncode + + +def _has_training_job_completed(job: CheckpointJob) -> bool: + """Return whether the latest run exited successfully with a checkpoint.""" + run_path = get_latest_job_run_path( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ) + if run_path is None or not os.path.isfile(os.path.join(run_path, _TRAINING_COMPLETE_FILENAME)): + return False + return has_pretrained_checkpoint_job_finished( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ) + + +def _mark_training_job_completed(job: CheckpointJob) -> None: + """Record that the latest training subprocess exited successfully.""" + run_path = get_latest_job_run_path( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ) + if run_path is None: + raise RuntimeError(f"Unable to determine the latest run for {job.job_id}") + marker_path = os.path.join(run_path, _TRAINING_COMPLETE_FILENAME) + with open(marker_path, "w", encoding="utf-8") as marker_file: + marker_file.write(f"{job.job_id}\n") + + +def train_job(job: CheckpointJob, args: argparse.Namespace, smoke: bool = False) -> bool: + """Train or smoke-test one checkpoint job.""" + if not smoke and not args.force and _has_training_job_completed(job): + print(f"Skipping completed training job {job.job_id}") + return True + + result = _run_command(_training_command(job, args, smoke), args.dry_run) + if result != 0: + print(f"Training failed for {job.job_id} with exit code {result}", file=sys.stderr) + return False + if smoke or args.dry_run: + return True + if not has_pretrained_checkpoint_job_finished( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ): + print(f"Training did not produce a checkpoint for {job.job_id}", file=sys.stderr) + return False + _mark_training_job_completed(job) + return True + + +def collect_pretrained_checkpoint(job: CheckpointJob, output_dir: str, dry_run: bool = False) -> str | None: + """Copy the last or best checkpoint into the structured output directory.""" + destination = _get_collected_checkpoint_path(job, output_dir) + if dry_run: + print(f"Would collect the completed checkpoint -> {destination}") + return destination + + source_path = get_pretrained_checkpoint_path( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ) + if source_path is None or not os.path.isfile(source_path): + print(f"No completed checkpoint to collect for {job.job_id}") + return None + + print(f"Collecting {source_path} -> {destination}") + os.makedirs(os.path.dirname(destination), exist_ok=True) + shutil.copy2(source_path, destination) + return destination + + +def review_pretrained_checkpoint(job: CheckpointJob, args: argparse.Namespace) -> bool: + """Play and interactively review one checkpoint.""" + if not has_pretrained_checkpoint_job_run( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ): + print(f"Skipping review of {job.job_id}; it has not been trained") + return False + if not has_pretrained_checkpoint_job_finished( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ): + print(f"Skipping review of {job.job_id}; training is incomplete") + return False + + review = get_pretrained_checkpoint_review( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ) + if not args.force_review and review and review.get("reviewed"): + print(f"Review already complete for {job.job_id}") + return True + + checkpoint_path = get_pretrained_checkpoint_path( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ) + if checkpoint_path is None: + print(f"Skipping review of {job.job_id}; no checkpoint was found") + return False + command = _play_command(job, args, checkpoint_path) + if _run_command(command, args.dry_run) != 0: + return False + if args.dry_run: + return True + + answer = input(f"Accept checkpoint {job.job_id}? yes, no, or undetermined (y/n/u) [u]: ").strip().lower() + answer_map = {"y": "accepted", "n": "rejected", "u": "undetermined"} + result = answer_map.get(answer, "undetermined") + notes = input("Review notes (optional): ").strip() + review_data = {"reviewed": True, "result": result} + if notes: + review_data["notes"] = notes + + review_path = get_pretrained_checkpoint_review_path( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ) + if review_path is None: + raise RuntimeError(f"Unable to determine review path for {job.job_id}") + with open(review_path, "w", encoding="utf-8") as review_file: + json.dump(review_data, review_file, indent=4) + return True + + +def publish_pretrained_checkpoint(job: CheckpointJob, args: argparse.Namespace) -> bool: + """Publish an accepted checkpoint to the configured Nucleus asset root.""" + if args.publish_root is None and not has_pretrained_checkpoints_asset_root_dir(): + raise RuntimeError("A pretrained-checkpoint Nucleus asset root is not configured") + local_path = _get_collected_checkpoint_path(job, args.output_dir) + if not os.path.isfile(local_path): + print(f"Skipping publish of {job.job_id}; no collected checkpoint was found") + return False + + if not args.force_publish: + review = get_pretrained_checkpoint_review( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ) + if not review or review.get("result") != "accepted": + print(f"Skipping publish of {job.job_id}; it does not have an accepted review") + return False + + if args.publish_root is None: + publish_path = get_pretrained_checkpoint_publish_path( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ) + else: + filename = get_pretrained_checkpoint_filename( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ) + publish_path = posixpath.join(args.publish_root.rstrip("/"), job.workflow, filename) + print(f"Publishing {local_path} -> {publish_path}") + if args.dry_run: + return True + + import omni.client + from omni.client._omniclient import CopyBehavior + + result = omni.client.copy_file(local_path, publish_path, CopyBehavior.OVERWRITE) + if result != omni.client.Result.OK: + print(f"Publishing failed for {job.job_id}: {result}", file=sys.stderr) + return False + return True + + +def _summary_row(job: CheckpointJob, output_dir: str) -> list[str | bool]: + """Return one CSV summary row.""" + has_run = has_pretrained_checkpoint_job_run( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ) + has_finished = ( + _has_training_job_completed(job) + if job.physics_backend is not None + else has_pretrained_checkpoint_job_finished(job.workflow, job.task_name) + ) + collected_path = _get_collected_checkpoint_path(job, output_dir) + review = get_pretrained_checkpoint_review( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ) + return [ + job.workflow, + job.task_name, + ",".join(job.preset_names), + job.physics_backend or "", + job.render_backend or "", + job.physics_selector or "", + job.render_selector or "", + has_run, + has_finished, + os.path.isfile(collected_path), + (review or {}).get("result", ""), + ] + + +def _get_collected_checkpoint_path(job: CheckpointJob, output_dir: str) -> str: + """Return the absolute path of a checkpoint in the collection directory.""" + filename = get_pretrained_checkpoint_filename( + job.workflow, + job.task_name, + job.physics_backend, + job.render_backend, + preset_names=job.preset_names, + ) + path_parts = [output_dir, job.workflow] + if job.physics_backend is None: + path_parts.append(job.task_name) + return os.path.abspath(os.path.join(*path_parts, filename)) + + +def main(argv: list[str] | None = None) -> int: + """Run checkpoint management actions.""" + parser = _create_parser() + args = parser.parse_args(argv) + if not args.all and not args.jobs: + parser.error("provide one or more job patterns, or pass --all") + if not any((args.train, args.smoke, args.collect, args.publish_checkpoint, args.review, args.list)): + parser.error( + "select at least one action: --train, --smoke, --collect, --publish_checkpoint, --review, or --list" + ) + if args.train and args.smoke: + parser.error("--train and --smoke are separate actions") + + jobs = _build_core_jobs(args) if args.core else _build_legacy_jobs() + jobs = _filter_jobs(jobs, args) + if not jobs: + print("No jobs matched the requested scope and patterns.", file=sys.stderr) + return 1 + if args.core and (args.train or args.collect) and not args.dry_run: + for workflow in _CORE_WORKFLOWS: + os.makedirs(os.path.join(args.output_dir, workflow), exist_ok=True) + + if args.list: + writer = csv.writer(sys.stdout, quotechar='"', quoting=csv.QUOTE_MINIMAL) + writer.writerow( + [ + "Workflow", + "Task", + "Presets", + "Physics", + "Renderer", + "Physics selector", + "Renderer selector", + "Ran", + "Finished", + "Collected", + "Review", + ] + ) + writer.writerows(_summary_row(job, args.output_dir) for job in jobs) + return 0 + + failed_jobs = [] + for job in jobs: + success = True + if args.smoke: + success = train_job(job, args, smoke=True) + if args.train: + success = train_job(job, args) + if success: + success = collect_pretrained_checkpoint(job, args.output_dir, args.dry_run) is not None + elif args.collect: + success = collect_pretrained_checkpoint(job, args.output_dir, args.dry_run) is not None + if success and args.review: + success = review_pretrained_checkpoint(job, args) + if success and args.publish_checkpoint: + success = publish_pretrained_checkpoint(job, args) + + if not success: + failed_jobs.append(job.job_id) + if args.fail_fast: + break + + if failed_jobs: + print("Failed jobs:", file=sys.stderr) + for job_id in failed_jobs: + print(f" {job_id}", file=sys.stderr) + return 1 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 653ddc627524d0c7b6acccf0f47d291e5dfe252d Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Mon, 28 Sep 2026 10:51:12 -0700 Subject: [PATCH 24/27] Preserve converter outputs and camera tuning contracts 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. --- .../ray/hyperparameter_tuning/vision_cfg.py | 3 + scripts/tools/convert_mjcf.py | 9 +- scripts/tools/convert_urdf.py | 15 ++- scripts/tools/test/test_converter_output.py | 120 ++++++++++++++++++ scripts/tools/test/test_uw_entrypoints.py | 70 ++++++++++ scripts/tools/usd_output.py | 38 ++++++ 6 files changed, 248 insertions(+), 7 deletions(-) create mode 100644 scripts/tools/test/test_converter_output.py create mode 100644 scripts/tools/usd_output.py diff --git a/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cfg.py b/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cfg.py index 08fa8e20..31a5d55f 100644 --- a/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cfg.py +++ b/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cfg.py @@ -30,6 +30,9 @@ def _get_batch_size_divisors(batch_size: int, min_size: int = 128) -> list[int]: def __init__(self, cfg={}, vary_env_count: bool = False, vary_cnn: bool = False, vary_mlp: bool = False): cfg = util.populate_isaac_ray_cfg_args(cfg) + library = cfg["runner_args"].setdefault("--rl_library", "rl_games") + if library != "rl_games": + raise ValueError("Camera tuning overrides require --rl_library rl_games.") # Basic configuration cfg["hydra_args"]["agent.params.config.max_epochs"] = 200 diff --git a/scripts/tools/convert_mjcf.py b/scripts/tools/convert_mjcf.py index 8243031c..e72c0f60 100644 --- a/scripts/tools/convert_mjcf.py +++ b/scripts/tools/convert_mjcf.py @@ -15,6 +15,9 @@ https://docs.isaacsim.omniverse.nvidia.com/latest/robot_setup/ext_isaacsim_asset_importer_mjcf.html +The requested output file is a USD entry layer. Keep the importer-generated asset +directory beside it so its relative references remain available. + positional arguments: input The path to the input MJCF file. output The path to store the USD file. @@ -104,6 +107,7 @@ from isaaclab.sim.converters import MjcfConverter, MjcfConverterCfg # noqa: E402 from isaaclab.utils.assets import check_file_path # noqa: E402 from isaaclab.utils.dict import print_dict # noqa: E402 +from usd_output import write_usd_entry_layer def preview(usd_path: str, physics_cfg: PhysicsCfg) -> None: @@ -176,13 +180,14 @@ def main(): with launch_simulation(cfg=PhysicsCfg(), launcher_args=args_cli) as physics_cfg: # Create mjcf converter and import the file mjcf_converter = MjcfConverter(mjcf_converter_cfg) + output_path = write_usd_entry_layer(mjcf_converter.usd_path, dest_path) # print output print("MJCF importer output:") - print(f"Generated USD file: {mjcf_converter.usd_path}") + print(f"Generated USD file: {output_path}") print("-" * 80) print("-" * 80) - preview(mjcf_converter.usd_path, physics_cfg) + preview(output_path, physics_cfg) if __name__ == "__main__": diff --git a/scripts/tools/convert_urdf.py b/scripts/tools/convert_urdf.py index 803dd497..69e91e13 100644 --- a/scripts/tools/convert_urdf.py +++ b/scripts/tools/convert_urdf.py @@ -15,6 +15,9 @@ https://docs.isaacsim.omniverse.nvidia.com/latest/robot_setup/ext_isaacsim_asset_importer_urdf.html +The requested output file is a USD entry layer. Keep the importer-generated asset +directory beside it so its relative references remain available. + positional arguments: input The path to the input URDF file. output The path to store the USD file. @@ -100,6 +103,7 @@ from isaaclab.sim.converters import UrdfConverter, UrdfConverterCfg # noqa: E402 from isaaclab.utils.assets import check_file_path # noqa: E402 from isaaclab.utils.dict import print_dict # noqa: E402 +from usd_output import write_usd_entry_layer def preview(usd_path: str, physics_cfg: PhysicsCfg) -> None: @@ -149,11 +153,11 @@ def main(): dest_path = os.path.abspath(dest_path) # Create Urdf converter config - # Note: usd_file_name is determined by the URDF importer 3.0 based on the robot name - # and cannot be overridden. The output is placed under dest_path as usd_dir. + # The importer owns its structured asset filenames and relative references. + # An entry layer below preserves the requested output filename. urdf_converter_cfg = UrdfConverterCfg( asset_path=urdf_path, - usd_dir=dest_path, + usd_dir=os.path.dirname(dest_path), fix_base=args_cli.fix_base, merge_fixed_joints=args_cli.merge_joints, force_usd_conversion=True, @@ -178,13 +182,14 @@ def main(): with launch_simulation(cfg=PhysicsCfg(), launcher_args=args_cli) as physics_cfg: # Create Urdf converter and import the file urdf_converter = UrdfConverter(urdf_converter_cfg) + output_path = write_usd_entry_layer(urdf_converter.usd_path, dest_path) # print output print("URDF importer output:") - print(f"Generated USD file: {urdf_converter.usd_path}") + print(f"Generated USD file: {output_path}") print("-" * 80) print("-" * 80) - preview(urdf_converter.usd_path, physics_cfg) + preview(output_path, physics_cfg) if __name__ == "__main__": diff --git a/scripts/tools/test/test_converter_output.py b/scripts/tools/test/test_converter_output.py new file mode 100644 index 00000000..d3b300c8 --- /dev/null +++ b/scripts/tools/test/test_converter_output.py @@ -0,0 +1,120 @@ +# Copyright (c) 2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). +# All Rights Reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +import ast +import contextlib +import os +from pathlib import Path +from types import SimpleNamespace + +import pytest +from pxr import Sdf, Usd, UsdGeom + +from scripts.tools.usd_output import write_usd_entry_layer + +ROOT = Path(__file__).resolve().parents[3] + + +class ConverterCfg: + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + def to_dict(self): + return vars(self) + + +ConverterCfg.JointDriveCfg = ConverterCfg +ConverterCfg.PDGainsCfg = ConverterCfg + + +def make_imported_asset(directory): + directory.mkdir(parents=True) + part = Usd.Stage.CreateNew(str(directory / "part.usda")) + prim = UsdGeom.Cube.Define(part, "/Robot/Part") + prim.CreateSizeAttr(2.5) + part.GetRootLayer().Save() + generated = Usd.Stage.CreateNew(str(directory / "robot.usda")) + robot = generated.DefinePrim("/Robot", "Xform") + generated.SetDefaultPrim(robot) + UsdGeom.SetStageUpAxis(generated, "Y") + UsdGeom.SetStageMetersPerUnit(generated, 0.01) + generated.GetRootLayer().subLayerPaths = ["part.usda"] + generated.GetRootLayer().Save() + return directory / "robot.usda" + + +@pytest.mark.parametrize("kind", ["urdf", "mjcf"]) +@pytest.mark.parametrize("extension", ["usd", "usda", "usdc"]) +def test_converter_main_honors_requested_filename(tmp_path, kind, extension): + source = tmp_path / f"input.{kind}" + source.touch() + output = tmp_path / "output" / f"custom name.{extension}" + previews = [] + + def convert(cfg): + path = make_imported_asset(Path(cfg.usd_dir) / "robot") + return SimpleNamespace(usd_path=str(path)) + + args = SimpleNamespace( + input=str(source), + output=str(output), + fix_base=False, + merge_joints=False, + joint_stiffness=100.0, + joint_damping=1.0, + joint_target_type="position", + merge_mesh=False, + collision_from_visuals=False, + collision_type="convexHull", + self_collision=False, + import_physics_scene=False, + ) + namespace = { + "args_cli": args, + "os": os, + "check_file_path": os.path.isfile, + "print_dict": lambda *a, **kw: None, + "PhysicsCfg": object, + "launch_simulation": lambda **kw: contextlib.nullcontext(None), + "preview": lambda path, cfg: previews.append(path), + "write_usd_entry_layer": write_usd_entry_layer, + "UrdfConverterCfg": ConverterCfg, + "MjcfConverterCfg": ConverterCfg, + "UrdfConverter": convert, + "MjcfConverter": convert, + } + tree = ast.parse((ROOT / f"scripts/tools/convert_{kind}.py").read_text()) + main = next(node for node in tree.body if isinstance(node, ast.FunctionDef) and node.name == "main") + exec(compile(ast.Module(body=[main], type_ignores=[]), str(source), "exec"), namespace) + namespace["main"]() + assert output.is_file() + assert previews == [str(output)] + stage = Usd.Stage.Open(str(output)) + assert stage.GetDefaultPrim().GetPath() == Sdf.Path("/Robot") + assert UsdGeom.GetStageUpAxis(stage) == "Y" + assert UsdGeom.GetStageMetersPerUnit(stage) == 0.01 + assert UsdGeom.Cube(stage.GetPrimAtPath("/Robot/Part")).GetSizeAttr().Get() == 2.5 + assert stage.GetRootLayer().subLayerPaths == ["robot/robot.usda"] + + +def test_same_output_layer_is_not_rewritten(tmp_path): + generated = make_imported_asset(tmp_path / "robot") + before = generated.read_bytes() + assert write_usd_entry_layer(str(generated), str(generated)) == str(generated) + assert generated.read_bytes() == before + + +@pytest.mark.parametrize("symlink", [False, True]) +def test_output_alias_cannot_overwrite_generated_layer(tmp_path, symlink): + generated = make_imported_asset(tmp_path / "robot") + output = tmp_path / "alias.usda" + if symlink: + output.symlink_to(generated) + else: + os.link(generated, output) + before = generated.read_bytes() + with pytest.raises(ValueError, match="aliases"): + write_usd_entry_layer(str(generated), str(output)) + assert generated.read_bytes() == before diff --git a/scripts/tools/test/test_uw_entrypoints.py b/scripts/tools/test/test_uw_entrypoints.py index 3d8c64b5..84999a9d 100644 --- a/scripts/tools/test/test_uw_entrypoints.py +++ b/scripts/tools/test/test_uw_entrypoints.py @@ -4,6 +4,7 @@ # SPDX-License-Identifier: BSD-3-Clause import argparse +import ast import runpy import sys from pathlib import Path @@ -65,3 +66,72 @@ def test_rsl_cli_overrides_only_requested_values(arguments, resume): assert cfg.experiment_name == ("custom" if "--experiment_name" in arguments else "original") assert cfg.device == ("cpu" if "--device" in arguments else "cuda:0") assert cfg.load_run == "saved" and cfg.load_checkpoint == "model.pt" + + +def _camera_configs(): + def load(path, names, namespace): + tree = ast.parse((ROOT / path).read_text()) + nodes = [node for node in tree.body if isinstance(node, (ast.FunctionDef, ast.ClassDef)) and node.name in names] + assert len(nodes) == len(names) + exec(compile(ast.Module(body=nodes, type_ignores=[]), path, "exec"), namespace) + return namespace + + class Sample: + def __init__(self, value): + self.value = value + + def sample(self): + return self.value + + tune = SimpleNamespace( + choice=lambda values: Sample(values[0]), + randint=lambda low, high: Sample(low), + sample_from=lambda function: Sample(function), + ) + base = load("scripts/reinforcement_learning/ray/tuner.py", ["JobCfg"], {}) + util = load("scripts/reinforcement_learning/ray/util.py", ["populate_isaac_ray_cfg_args"], {}) + vision = load( + "scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cfg.py", + ["CameraJobCfg", "ResNetCameraJob", "TheiaCameraJob"], + { + "tune": tune, + "tuner": SimpleNamespace(JobCfg=base["JobCfg"]), + "util": SimpleNamespace(populate_isaac_ray_cfg_args=util["populate_isaac_ray_cfg_args"]), + }, + ) + jobs = load( + "scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cartpole_cfg.py", + [ + "CartpoleRGBNoTuneJobCfg", + "CartpoleRGBCNNOnlyJobCfg", + "CartpoleRGBJobCfg", + "CartpoleResNetJobCfg", + "CartpoleTheiaJobCfg", + ], + {"tune": tune, "util": vision["util"], "vision_cfg": SimpleNamespace(**vision)}, + ) + return vision, jobs + + +@pytest.mark.parametrize( + "name", + [ + "CartpoleRGBNoTuneJobCfg", + "CartpoleRGBCNNOnlyJobCfg", + "CartpoleRGBJobCfg", + "CartpoleResNetJobCfg", + "CartpoleTheiaJobCfg", + ], +) +def test_camera_tuning_selects_matching_agent(name): + _, jobs = _camera_configs() + cfg = jobs[name]({}).cfg + assert cfg["runner_args"]["--rl_library"] == "rl_games" + assert cfg["hydra_args"]["agent.params.config.max_epochs"] == 200 + assert all(not key.startswith("agent.") or key.startswith("agent.params.") for key in cfg["hydra_args"]) + + +def test_camera_tuning_rejects_conflicting_agent(): + vision, _ = _camera_configs() + with pytest.raises(ValueError, match="rl_games"): + vision["CameraJobCfg"]({"runner_args": {"--task": "Isaac-Cartpole-Camera", "--rl_library": "rsl_rl"}}) diff --git a/scripts/tools/usd_output.py b/scripts/tools/usd_output.py new file mode 100644 index 00000000..5da7cf72 --- /dev/null +++ b/scripts/tools/usd_output.py @@ -0,0 +1,38 @@ +# Copyright (c) 2026, The UW Lab Project Developers. (https://github.com/uw-lab/UWLab/blob/main/CONTRIBUTORS.md). +# All Rights Reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +import os +from pathlib import Path + +from pxr import Sdf + + +def write_usd_entry_layer(generated_path: str, output_path: str) -> str: + """Expose structured importer output without relocating its assets. + + Args: + generated_path: Root USD layer produced by the importer. + output_path: Requested USD entry-layer filename. + + Returns: + Absolute path to the requested entry layer. + """ + generated_path = os.path.abspath(generated_path) + output_path = os.path.abspath(output_path) + source = Sdf.Layer.FindOrOpen(generated_path) + if source is None: + raise ValueError(f"Unable to open generated USD layer: {generated_path}") + if generated_path == output_path: + return output_path + if os.path.exists(output_path) and os.path.samefile(generated_path, output_path): + raise ValueError("Requested output aliases the generated layer; choose a distinct filename.") + entry = Sdf.Layer.CreateAnonymous() + for key in source.pseudoRoot.ListInfoKeys(): + if key not in {"subLayers", "subLayerOffsets"}: + entry.pseudoRoot.SetInfo(key, source.pseudoRoot.GetInfo(key)) + entry.subLayerPaths = [Path(os.path.relpath(generated_path, os.path.dirname(output_path))).as_posix()] + if not entry.Export(output_path): + raise RuntimeError(f"Unable to write USD entry layer: {output_path}") + return output_path From 612f3f28b6a259b3f1bd75732b36e4bf687980fa Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Mon, 28 Sep 2026 10:51:19 -0700 Subject: [PATCH 25/27] Batch OBB geometry and debug drawing 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. --- source/uwlab_tasks/config/extension.toml | 2 +- source/uwlab_tasks/docs/CHANGELOG.rst | 11 +++ source/uwlab_tasks/test/test_environments.py | 76 +++++++++++++++ .../omnireset/mdp/terminations.py | 97 +++++++++---------- 4 files changed, 134 insertions(+), 52 deletions(-) diff --git a/source/uwlab_tasks/config/extension.toml b/source/uwlab_tasks/config/extension.toml index a0539835..0ef65aeb 100644 --- a/source/uwlab_tasks/config/extension.toml +++ b/source/uwlab_tasks/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.14.9" +version = "0.14.10" # Description title = "UW Lab Tasks" diff --git a/source/uwlab_tasks/docs/CHANGELOG.rst b/source/uwlab_tasks/docs/CHANGELOG.rst index b35875b0..e3cd9dfc 100644 --- a/source/uwlab_tasks/docs/CHANGELOG.rst +++ b/source/uwlab_tasks/docs/CHANGELOG.rst @@ -1,6 +1,17 @@ Changelog --------- +0.14.10 (2026-09-28) +~~~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Vectorized OmniReset OBB corner computation and debug drawing across environments, + avoiding per-environment host transfers. The termination decision and task settings + were unchanged; existing configurations require no migration. + + 0.14.9 (2026-09-28) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_tasks/test/test_environments.py b/source/uwlab_tasks/test/test_environments.py index 8d81a863..d5147f5e 100644 --- a/source/uwlab_tasks/test/test_environments.py +++ b/source/uwlab_tasks/test/test_environments.py @@ -18,6 +18,7 @@ import importlib import math import torch +from itertools import product from types import SimpleNamespace from unittest.mock import Mock @@ -387,3 +388,78 @@ def write_armature(armature, joint_ids, env_ids): expected = initial[ids] * (1.0 - progress) + torch.tensor(term.armature).repeat(2, 1) * progress torch.testing.assert_close(written[-1], expected, rtol=0, atol=0) torch.testing.assert_close(current[[0, 2]], initial[[0, 2]], rtol=0, atol=0) + + +@pytest.mark.parametrize("num_envs", [0, 1, 7]) +@pytest.mark.parametrize("dtype", [torch.float32, torch.float64]) +@pytest.mark.isaacsim_ci +def test_obb_corners_stay_batched_on_device(monkeypatch, num_envs, dtype): + module = importlib.import_module("uwlab_tasks.manager_based.manipulation.omnireset.mdp.terminations") + term = module.check_obb_no_overlap_termination.__new__(module.check_obb_no_overlap_termination) + generator = torch.Generator().manual_seed(42) + centroids = torch.randn(num_envs, 3, generator=generator, dtype=dtype, requires_grad=True) + axes = torch.randn(num_envs, 3, 3, generator=generator, dtype=dtype, requires_grad=True) + extents = torch.tensor([0.3, 0.0 if num_envs == 1 else 0.7, 1.2], dtype=dtype) + expected = torch.empty(num_envs, 8, 3, dtype=torch.float32) + for index in range(num_envs): + for corner, signs in enumerate(product((-1, 1), repeat=3)): + expected[index, corner] = centroids[index] + sum( + signs[axis] * extents[axis] * axes[index, axis] for axis in range(3) + ) + with monkeypatch.context() as guard: + guard.setattr(torch.Tensor, "cpu", Mock(side_effect=AssertionError("OBB math transferred to host"))) + guard.setattr(torch.Tensor, "numpy", Mock(side_effect=AssertionError("OBB math used NumPy"))) + actual = term._compute_obb_corners_batch(centroids, axes, extents) + assert actual.device == centroids.device and actual.dtype == torch.float32 and not actual.requires_grad + torch.testing.assert_close(actual, expected, rtol=1e-5, atol=1e-6) + + +@pytest.mark.parametrize("num_envs", [0, 1, 7]) +@pytest.mark.isaacsim_ci +def test_obb_wireframes_transfer_one_batch(monkeypatch, num_envs): + module = importlib.import_module("uwlab_tasks.manager_based.manipulation.omnireset.mdp.terminations") + term = module.check_obb_no_overlap_termination.__new__(module.check_obb_no_overlap_termination) + corners = torch.arange(num_envs * 24, dtype=torch.float32).reshape(num_envs, 8, 3) + draw = Mock() + transfers = [] + original = torch.Tensor.cpu + + def copy_to_cpu(tensor, *args, **kwargs): + transfers.append(tensor.shape) + return original(tensor, *args, **kwargs) + + with monkeypatch.context() as guard: + guard.setattr(torch.Tensor, "cpu", copy_to_cpu) + guard.setattr(torch.Tensor, "numpy", Mock(side_effect=AssertionError("Per-edge NumPy conversion"))) + term._draw_obb_wireframe(corners[0] if num_envs == 1 else corners, draw_interface=draw) + assert len(transfers) == 1 + draw.draw_lines.assert_called_once() + starts, ends, colors, widths = draw.draw_lines.call_args.args + assert len(starts) == len(ends) == len(colors) == len(widths) == 24 * num_envs + for index in range(num_envs): + assert starts[24 * index] == corners[index, 0].tolist() + assert ends[24 * index] == corners[index, 1].tolist() + + +@pytest.mark.isaacsim_ci +def test_obb_visualization_submits_whole_environment_batches(): + module = importlib.import_module("uwlab_tasks.manager_based.manipulation.omnireset.mdp.terminations") + term = module.check_obb_no_overlap_termination.__new__(module.check_obb_no_overlap_termination) + env = SimpleNamespace(num_envs=5) + positions = torch.zeros(5, 3) + quaternions = torch.tensor([[0.0, 0.0, 0.0, 1.0]]).repeat(5, 1) + term.insertive_object = SimpleNamespace( + data=SimpleNamespace( + root_pos_w=SimpleNamespace(torch=positions), root_quat_w=SimpleNamespace(torch=quaternions) + ) + ) + term._insertive_initial_pos, term._insertive_initial_quat = positions, quaternions + term._insertive_obb_centroid = torch.zeros(3) + term._insertive_obb_axes = torch.eye(3) + term._insertive_obb_half_extents = torch.ones(3) + term._omni_debug_draw = SimpleNamespace(acquire_debug_draw_interface=lambda: Mock()) + term._compute_obb_corners_batch = lambda centroids, axes, extents: centroids[:, None, :].expand(-1, 8, -1) + term._draw_obb_wireframe = Mock() + term._visualize_bounding_boxes(env) + assert term._draw_obb_wireframe.call_count == 2 + assert all(call.args[0].shape == (5, 8, 3) for call in term._draw_obb_wireframe.call_args_list) diff --git a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py index 9d6bb92e..a1de88a3 100644 --- a/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py +++ b/source/uwlab_tasks/uwlab_tasks/manager_based/manipulation/omnireset/mdp/terminations.py @@ -5,7 +5,6 @@ """MDP functions for manipulation tasks.""" -import numpy as np import torch from isaaclab.assets import BaseArticulation, BaseRigidObject, BaseRigidObjectCollection @@ -514,38 +513,37 @@ def reset(self, env_ids: torch.Tensor | None = None) -> None: self._insertive_initial_pos[env_ids] = insertive_pos[env_ids] self._insertive_initial_quat[env_ids] = insertive_quat[env_ids] - def _compute_obb_corners_batch(self, centroids, axes, half_extents): - """ - Compute the 8 corners of Oriented Bounding Boxes for all environments using Isaac Sim's built-in function. + @torch.no_grad() + def _compute_obb_corners_batch( + self, centroids: torch.Tensor, axes: torch.Tensor, half_extents: torch.Tensor + ) -> torch.Tensor: + """Compute batched OBB corners on-device in Isaac Sim's corner order. Args: - centroids: Centers of OBBs (num_envs, 3) - axes: Orientation axes of OBBs (num_envs, 3, 3) - rows are the axes - half_extents: Half extents of OBB along its axes (3,) + centroids: Centers [m], shape (num_envs, 3). + axes: Orientation axes, shape (num_envs, 3, 3), with one axis per row. + half_extents: Half lengths [m], shape (3,). Returns: - corners: 8 corners of the OBBs (num_envs, 8, 3) + Detached float32 corner positions [m], shape (num_envs, 8, 3). """ num_envs = centroids.shape[0] device = centroids.device - # Convert torch tensors to numpy for Isaac Sim functions - centroids_np = centroids.detach().cpu().numpy() - axes_np = axes.detach().cpu().numpy() - half_extents_np = half_extents.detach().cpu().numpy() + # Keep corner offsets on the input device. + signs = torch.tensor( + [[-1, -1, -1], [-1, -1, 1], [-1, 1, -1], [-1, 1, 1], [1, -1, -1], [1, -1, 1], [1, 1, -1], [1, 1, 1]], + device=device, + dtype=centroids.dtype, + ) - # Compute corners for each environment using Isaac Sim's function - all_corners = [] - for env_idx in range(num_envs): - # Use Isaac Sim's get_obb_corners function - corners_np = self._bounds_utils.get_obb_corners( - centroids_np[env_idx], axes_np[env_idx], half_extents_np - ) # (8, 3) - all_corners.append(corners_np) + # Compute offsets for all environments at once. + offsets = (signs * half_extents).expand(num_envs, -1, -1) + # Match Isaac Sim's ordering and row-vector axes. + corners_tensor = centroids.unsqueeze(1) + torch.bmm(offsets, axes) # (num_envs, 8, 3) - # Convert back to torch tensor - corners_tensor = torch.tensor(np.stack(all_corners), device=device, dtype=torch.float32) - return corners_tensor # (num_envs, 8, 3) + # Preserve the existing float32 output contract without a host transfer. + return corners_tensor.to(dtype=torch.float32) # (num_envs, 8, 3) def _visualize_bounding_boxes(self, env: ManagerBasedEnv): """Visualize oriented bounding boxes for initial and current insertive object positions using wireframe edges.""" @@ -573,7 +571,7 @@ def _visualize_bounding_boxes(self, env: ManagerBasedEnv): 1, 2 ) # (num_envs, 3, 3) - # Compute OBB corners for current position visualization using Isaac Sim's built-in function + # Compute OBB corners for current position visualization in one batch. insertive_current_corners = self._compute_obb_corners_batch( insertive_current_world_centroids, insertive_current_world_axes, self._insertive_obb_half_extents ) # (num_envs, 8, 3) @@ -592,28 +590,27 @@ def _visualize_bounding_boxes(self, env: ManagerBasedEnv): 1, 2 ) # (num_envs, 3, 3) - # Compute OBB corners for initial position visualization using Isaac Sim's built-in function + # Compute OBB corners for initial position visualization in one batch. insertive_initial_corners = self._compute_obb_corners_batch( insertive_initial_world_centroids, insertive_initial_world_axes, self._insertive_obb_half_extents ) # (num_envs, 8, 3) - # Draw wireframe boxes for each environment - for env_idx in range(env.num_envs): - # Draw current insertive object bounding box edges (blue) - self._draw_obb_wireframe( - insertive_current_corners[env_idx], # (8, 3) - color=(0.0, 0.5, 1.0, 1.0), # Bright blue - line_width=4.0, - draw_interface=draw_interface, - ) + # Draw wireframe boxes for the environment batch. + # Draw current insertive object bounding box edges (blue) + self._draw_obb_wireframe( + insertive_current_corners, # (num_envs, 8, 3) + color=(0.0, 0.5, 1.0, 1.0), # Bright blue + line_width=4.0, + draw_interface=draw_interface, + ) - # Draw initial insertive object bounding box edges (red) - self._draw_obb_wireframe( - insertive_initial_corners[env_idx], # (8, 3) - color=(1.0, 0.2, 0.0, 1.0), # Bright red - line_width=4.0, - draw_interface=draw_interface, - ) + # Draw initial insertive object bounding box edges (red) + self._draw_obb_wireframe( + insertive_initial_corners, # (num_envs, 8, 3) + color=(1.0, 0.2, 0.0, 1.0), # Bright red + line_width=4.0, + draw_interface=draw_interface, + ) def _draw_obb_wireframe( self, corners: torch.Tensor, color: tuple = (1.0, 1.0, 1.0, 1.0), line_width: float = 2.0, draw_interface=None @@ -622,7 +619,7 @@ def _draw_obb_wireframe( Draw wireframe edges of an oriented bounding box. Args: - corners: 8 corners of the OBB (8, 3) + corners: Corner positions [m], shape (num_envs, 8, 3) or (8, 3). color: RGBA color tuple for the lines line_width: Width of the lines draw_interface: Debug draw interface (optional, will acquire if not provided) @@ -665,20 +662,18 @@ def _draw_obb_wireframe( (2, 5), ] - # Create line segments for all edges - line_starts = [] - line_ends = [] - - for start_idx, end_idx in edge_indices: - line_starts.append(corners[start_idx].cpu().numpy().tolist()) - line_ends.append(corners[end_idx].cpu().numpy().tolist()) + # Create all line segments on-device, then transfer once for the debug-draw API. + edges = torch.tensor(edge_indices, device=corners.device) + lines = corners.reshape(-1, 8, 3)[:, edges].reshape(-1, 2, 3).detach().cpu() + line_starts = lines[:, 0].tolist() + line_ends = lines[:, 1].tolist() # Use provided interface or acquire new one if draw_interface is None: draw_interface = self._omni_debug_draw.acquire_debug_draw_interface() - colors = [list(color)] * len(edge_indices) - line_thicknesses = [line_width] * len(edge_indices) + colors = [list(color)] * len(line_starts) + line_thicknesses = [line_width] * len(line_starts) # Draw all edges at once draw_interface.draw_lines(line_starts, line_ends, colors, line_thicknesses) From defe8fb367f1c3357476dd4c0116515608efacee Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Mon, 28 Sep 2026 11:59:34 -0700 Subject: [PATCH 26/27] Summarize the migration as one unreleased update 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. --- docs/conf.py | 2 +- source/uwlab/docs/CHANGELOG.rst | 16 +-- source/uwlab_assets/docs/CHANGELOG.rst | 55 ++-------- source/uwlab_rl/docs/CHANGELOG.rst | 79 ++------------ source/uwlab_tasks/docs/CHANGELOG.rst | 137 +++---------------------- 5 files changed, 34 insertions(+), 255 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index b9eb58ee..a459bcbc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -264,7 +264,7 @@ { "name": "Isaac Sim", "url": "https://developer.nvidia.com/isaac-sim", - "icon": "https://img.shields.io/badge/IsaacSim-6.0.1-silver.svg", + "icon": "https://img.shields.io/badge/IsaacSim-6.1.0-silver.svg", "type": "url", }, { diff --git a/source/uwlab/docs/CHANGELOG.rst b/source/uwlab/docs/CHANGELOG.rst index a56e3c46..d8965b53 100644 --- a/source/uwlab/docs/CHANGELOG.rst +++ b/source/uwlab/docs/CHANGELOG.rst @@ -1,27 +1,19 @@ Changelog --------- -0.9.1 (2026-09-26) +0.9.1 (2026-09-28) ~~~~~~~~~~~~~~~~~~ Changed ^^^^^^^ +* Migrated to Isaac Lab 3.0 Early Access / Isaac Sim 6.1: scalar-last quaternions, + Warp-backed asset data (``.torch``), ``root_view`` / ``data`` accessors, and + ``isaaclab.sim.utils`` in place of deprecated Isaac Sim helpers. * Updated mesh conversion to enable Isaac Sim extensions through the Isaac Lab API. Launch the simulator before invoking conversion helpers. -0.9.0 (2026-09-16) -~~~~~~~~~~~~~~~~~~ - -Changed -^^^^^^^ - -* Ported to Isaac Lab 3.0: scalar-last quaternions, warp-backed asset data (``.torch``), - ``root_view`` / ``data`` accessors instead of ``root_physx_view``, and ``isaaclab.sim.utils`` - in place of the deprecated ``isaacsim.core.utils`` helpers. - - 0.8.6 (2025-10-09) ~~~~~~~~~~~~~~~~~~ diff --git a/source/uwlab_assets/docs/CHANGELOG.rst b/source/uwlab_assets/docs/CHANGELOG.rst index 50bf104e..db9a1b6d 100644 --- a/source/uwlab_assets/docs/CHANGELOG.rst +++ b/source/uwlab_assets/docs/CHANGELOG.rst @@ -7,56 +7,13 @@ Changelog Changed ^^^^^^^ -* Consolidated Isaac Lab 3.0 / Isaac Sim 6.1 asset publication on the ``isaaclab3`` - Hugging Face branch. The existing pinned commit and asset contents were unchanged. - Publish new assets on ``isaaclab3`` and update the commit pin deliberately; +* Migrated assets to Isaac Lab 3.0 Early Access / Isaac Sim 6.1 with scalar-last + ``(x, y, z, w)`` quaternions and compatible OmniReset datasets and checkpoints. +* Pinned cloud assets to the canonical ``isaaclab3`` Hugging Face branch's verified + snapshot. Publish new assets on ``isaaclab3`` and update the commit pin deliberately; ``main`` remains the legacy Isaac Lab 2.x asset line. - - -0.6.3 (2026-09-26) -~~~~~~~~~~~~~~~~~~ - -Changed -^^^^^^^ - -* Restored the original calibrated UR5e USD for compatibility with published OmniReset - checkpoints. Deferred the mass/inertia changes for issues #38 and #40. Use the original - filename with existing checkpoints; the experimental ``_v2.usd`` is not the default. - - -0.6.2 (2026-09-26) -~~~~~~~~~~~~~~~~~~ - -Changed -^^^^^^^ - -* Selected the versioned FactoryV2 UR5e/Robotiq asset with explicit knuckle mass and inertia, - camera/mount mass corrections, passive-link armature and the calibrated fingertip TCP. - The previous USD remains available under its original filename for reproducible comparisons. - Existing policies should be checked against the changed robot dynamics before deployment. - - -0.6.1 (2026-09-26) -~~~~~~~~~~~~~~~~~~ - -Changed -^^^^^^^ - -* Aligned the USD Python provider with Isaac Lab 3.0 Early Access using ``usd-exchange``. - Use a fresh environment when upgrading to avoid overlapping ``pxr`` files from ``usd-core``. - The robot and object asset contents were unchanged. -* Pinned the EA asset revision containing converted OmniReset checkpoints. The beta and 2.x - branches remain available for their original observation layouts. - - -0.6.0 (2026-09-16) -~~~~~~~~~~~~~~~~~~ - -Changed -^^^^^^^ - -* Ported to Isaac Lab 3.0: asset quaternions are scalar-last ``(x, y, z, w)``; cloud assets - are pinned to the ``isaaclab3`` revision of ``UW-Lab/uwlab-assets``. +* Aligned the USD Python provider using ``usd-exchange``. Use a fresh environment when + upgrading to avoid overlapping ``pxr`` files from ``usd-core``. 0.5.2 (2025-03-23) diff --git a/source/uwlab_rl/docs/CHANGELOG.rst b/source/uwlab_rl/docs/CHANGELOG.rst index 4eb27025..a6499bb3 100644 --- a/source/uwlab_rl/docs/CHANGELOG.rst +++ b/source/uwlab_rl/docs/CHANGELOG.rst @@ -4,83 +4,16 @@ Changelog 0.2.6 (2026-09-28) ~~~~~~~~~~~~~~~~~~ -Removed -^^^^^^^ - -* Removed the beta-to-EA checkpoint conversion utility and its migration-only tests - from the upcoming release. Use the already-compatible EA checkpoints linked in - the OmniReset quick start; beta checkpoint migration is no longer provided. - - -0.2.5 (2026-09-27) -~~~~~~~~~~~~~~~~~~ - -Changed -^^^^^^^ - -* Pinned the released ``uw-v5.4.1`` revision from the official UW-Lab RSL-RL repository, - including logger configuration and image-only normalization fixes. - Reinstall the pinned dependency with ``./uwlab.sh --install`` after updating. -* Changed the supported runtime metadata to Python 3.12 and Isaac Sim 6.1. - Use the ``isaaclab2`` branch for older environments. - - -0.2.4 (2026-09-27) -~~~~~~~~~~~~~~~~~~ - -Changed -^^^^^^^ - -* Updated the pinned RSL-RL 5.4.1 integration to target separate actor and critic models for the upgraded UWLab stack. - The legacy combined ``ActorCritic`` interface is not provided; retain the pinned 3.x stack for old callers. - Reinstall the pinned dependency with ``./uwlab.sh --install`` after updating. - - -0.2.3 (2026-09-26) -~~~~~~~~~~~~~~~~~~ - -Changed -^^^^^^^ - -* Updated the pinned RSL-RL 5.4.1 revision without changing its library code or runtime behavior. - Reinstall the pinned dependency with ``./uwlab.sh --install`` after updating. - - -0.2.2 (2026-09-26) -~~~~~~~~~~~~~~~~~~ - -Changed -^^^^^^^ - -* Pinned the integrated RSL-RL 5.4.1 fork, retaining deprecated legacy checkpoint inference - and distributed initialization fixes. New training uses the 5.x actor/critic configuration. - Reinstall the pinned dependency with ``./uwlab.sh --install`` after updating. - - -0.2.1 (2026-09-26) -~~~~~~~~~~~~~~~~~~ - -Added -^^^^^ - -* Added CPU conversion of OmniReset beta observation layouts to EA order, including - actor/critic normalization and Adam state without retraining or overwriting the original. - Changed ^^^^^^^ -* Updated the RSL-RL dependency to version 5.4.1 for Isaac Lab 3.0 Early Access. - Run ``./uwlab.sh --install`` to reinstall the pinned dependencies when upgrading. - - -0.2.0 (2026-09-16) -~~~~~~~~~~~~~~~~~~ - -Changed -^^^^^^^ +* Migrated to the official UW-Lab RSL-RL 5.4.1 release (``uw-v5.4.1``), using separate + actor and critic models with Isaac Lab 3.0 Early Access, Isaac Sim 6.1 and Python 3.12. +* Updated JIT export to support heteroscedastic Gaussian policies and their distributions. -* Ported to rsl-rl 5.x: explicit actor/critic model configs and the runner export API; the JIT - exporter supports heteroscedastic Gaussian actors. Requires Isaac Lab 3.0. +Run ``./uwlab.sh --install`` to install the pinned dependencies and use the compatible +checkpoints linked in the OmniReset quick start. Use ``isaaclab2`` / ``v1.3.0`` for +legacy RSL-RL 3.x callers, including the combined ``ActorCritic`` interface. 0.1.4 (2026-09-14) diff --git a/source/uwlab_tasks/docs/CHANGELOG.rst b/source/uwlab_tasks/docs/CHANGELOG.rst index e3cd9dfc..c89e25e2 100644 --- a/source/uwlab_tasks/docs/CHANGELOG.rst +++ b/source/uwlab_tasks/docs/CHANGELOG.rst @@ -4,133 +4,30 @@ Changelog 0.14.10 (2026-09-28) ~~~~~~~~~~~~~~~~~~~~ -Fixed -^^^^^ - -* Vectorized OmniReset OBB corner computation and debug drawing across environments, - avoiding per-environment host transfers. The termination decision and task settings - were unchanged; existing configurations require no migration. - - -0.14.9 (2026-09-28) -~~~~~~~~~~~~~~~~~~~ - -Changed -^^^^^^^ - -* Moved required OmniReset helper imports to module scope while retaining deferred - imports for optional collision dependencies and extension-dependent features. - No task configuration or caller changes are required. - - -0.14.8 (2026-09-27) -~~~~~~~~~~~~~~~~~~~ - -Fixed -^^^^^ - -* Fixed backend-specific assets bypassing velocity-stability checks during OmniReset grasp - and reset-state generation. Regenerate affected datasets to apply the restored stability filters. - - -0.14.7 (2026-09-26) -~~~~~~~~~~~~~~~~~~~ - -Changed -^^^^^^^ - -* Disabled added wrist armature by default when restoring the original robot for published - checkpoints. Keep ``robot_wrist_armature`` unset with those checkpoints; the experimental - mass/inertia changes are deferred. - - -0.14.6 (2026-09-26) -~~~~~~~~~~~~~~~~~~~ - -Changed -^^^^^^^ - -* Applied calibrated wrist motor armature at startup for the corrected UR5e asset, while - retaining Stage-1 shoulder/elbow settings and the existing policy rate, gains and action scales. - The values come from the robot's ``metadata.yaml``; keep this metadata with custom robot assets. -* Started armature ADR from the initialized robot model instead of erasing its inertia at zero - progress. Full-progress calibration and friction/motor-delay ramps remain unchanged. - - -0.14.5 (2026-09-26) -~~~~~~~~~~~~~~~~~~~ - Changed ^^^^^^^ -* Used authored or geometry-derived object masses for grasp sampling instead of requesting a - 1 g override. The override was ineffective for the released assets; all six objects retained - identical live masses and sampled grasp datasets in paired checks. Custom assets now retain - their own mass properties, so verify those properties when generating new grasp datasets. - - -0.14.4 (2026-09-26) -~~~~~~~~~~~~~~~~~~~ - -Fixed -^^^^^ - -* Resolved grasp-sampling and collision asset paths from the USD stage for both legacy and EA - environment namespace patterns, preserving natural environment-index ordering. -* Corrected cached collider-relative quaternions to scalar-last order and included complete - collider transforms in geometry hashes. Regenerate grasp datasets to use the corrected geometry checks. - - -0.14.3 (2026-09-26) -~~~~~~~~~~~~~~~~~~~ - -Fixed -^^^^^ - -* Fixed partial environment resets clearing consecutive-success counters in unrelated - environments. An empty reset selection leaves counters unchanged; ``None`` resets all. - - -0.14.2 (2026-09-26) -~~~~~~~~~~~~~~~~~~~ - -Changed -^^^^^^^ - -* Migrated OmniReset renderer configuration and extension loading to Isaac Lab 3.0 Early Access. - Preserved the legacy actuator execution path and existing task parameters during migration. - Use ``--visualizer none`` instead of ``--headless`` when disabling visualization. -* Deferred task MDP and ANYmal configuration imports until a task was selected, matching upstream - registration behavior while preserving the existing task IDs and configuration entry points. -* Adopted the EA observation declaration order for OmniReset. Use the converted EA experts; - convert beta checkpoints with ``convert_checkpoint_layout.py`` before loading them. +* Migrated tasks to Isaac Lab 3.0 Early Access / Isaac Sim 6.1, including ``sim.physics`` + configuration, scalar-last quaternions, Warp-backed data and ``JointWrenchSensor``. + Use ``--visualizer none`` instead of ``--headless`` to disable visualization. +* Adopted the EA observation order and compatible OmniReset datasets and checkpoints. + Use the pretrained experts linked in the updated quick start. +* Deferred task imports until selection while preserving existing task IDs and entry points. +* Preserved authored or geometry-derived object masses during grasp sampling instead of + requesting an ineffective 1 g override. Verify mass properties for custom assets. Fixed ^^^^^ -* Fixed renderer setup for physics-replicated scenes without changing scene replication settings. - - -0.14.1 (2026-09-21) -~~~~~~~~~~~~~~~~~~~ - -Fixed -^^^^^ - -* Fixed OmniReset and Factory extension velocity observations subtracting the robot's world position - from linear and angular velocities. Velocity vectors are now rotated into the root frame without translation. -* Added regression coverage for stationary and moving links, translated roots, rotated frames, and body selection. - - -0.14.0 (2026-09-16) -~~~~~~~~~~~~~~~~~~~ - -Changed -^^^^^^^ - -* Ported to Isaac Lab 3.0: ``sim.physics = PhysxCfg(...)`` replaces ``sim.physx``, scalar-last - quaternions in task and asset configs, warp-backed data accessors, ``JointWrenchSensor`` for - wrist wrenches, and Isaac Lab 3.0 convention-stamped OmniReset datasets. +* Corrected OmniReset and Factory velocity observations to rotate vectors into the root + frame without subtracting the robot's position. +* Fixed partial resets clearing consecutive-success counters in unrelated environments. +* Corrected grasp-sampling asset resolution, collider frames and geometry-cache hashes, + and restored backend-aware velocity-stability filters. Regenerate affected grasp and + reset-state datasets to apply these fixes. +* Preserved initialized joint armature when applying ADR. +* Fixed renderer setup for physics-replicated scenes. +* Batched OBB corner computation and debug drawing without changing the termination decision. 0.13.8 (2025-10-24) From 4d87238359dbc7a14ba28bb51639c8d617a427d9 Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Mon, 28 Sep 2026 12:08:13 -0700 Subject: [PATCH 27/27] Normalize versions for the unreleased migration 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. --- source/uwlab/config/extension.toml | 2 +- source/uwlab/docs/CHANGELOG.rst | 2 +- source/uwlab_assets/config/extension.toml | 2 +- source/uwlab_assets/docs/CHANGELOG.rst | 2 +- source/uwlab_rl/config/extension.toml | 2 +- source/uwlab_rl/docs/CHANGELOG.rst | 2 +- source/uwlab_tasks/config/extension.toml | 2 +- source/uwlab_tasks/docs/CHANGELOG.rst | 4 ++-- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/source/uwlab/config/extension.toml b/source/uwlab/config/extension.toml index 19087c2b..79ad16c1 100644 --- a/source/uwlab/config/extension.toml +++ b/source/uwlab/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.9.1" +version = "0.9.0" # Description title = "UW Lab framework for Robot Learning" diff --git a/source/uwlab/docs/CHANGELOG.rst b/source/uwlab/docs/CHANGELOG.rst index d8965b53..753c7717 100644 --- a/source/uwlab/docs/CHANGELOG.rst +++ b/source/uwlab/docs/CHANGELOG.rst @@ -1,7 +1,7 @@ Changelog --------- -0.9.1 (2026-09-28) +0.9.0 (2026-09-28) ~~~~~~~~~~~~~~~~~~ Changed diff --git a/source/uwlab_assets/config/extension.toml b/source/uwlab_assets/config/extension.toml index e3a3a9e6..bf4b4ff6 100644 --- a/source/uwlab_assets/config/extension.toml +++ b/source/uwlab_assets/config/extension.toml @@ -1,6 +1,6 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.6.4" +version = "0.6.0" # Description title = "UW Lab Assets" diff --git a/source/uwlab_assets/docs/CHANGELOG.rst b/source/uwlab_assets/docs/CHANGELOG.rst index db9a1b6d..fbcca60f 100644 --- a/source/uwlab_assets/docs/CHANGELOG.rst +++ b/source/uwlab_assets/docs/CHANGELOG.rst @@ -1,7 +1,7 @@ Changelog --------- -0.6.4 (2026-09-28) +0.6.0 (2026-09-28) ~~~~~~~~~~~~~~~~~~ Changed diff --git a/source/uwlab_rl/config/extension.toml b/source/uwlab_rl/config/extension.toml index daf77289..c81a7449 100644 --- a/source/uwlab_rl/config/extension.toml +++ b/source/uwlab_rl/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.2.6" +version = "0.2.0" # Description title = "UW Lab RL" diff --git a/source/uwlab_rl/docs/CHANGELOG.rst b/source/uwlab_rl/docs/CHANGELOG.rst index a6499bb3..7f95c567 100644 --- a/source/uwlab_rl/docs/CHANGELOG.rst +++ b/source/uwlab_rl/docs/CHANGELOG.rst @@ -1,7 +1,7 @@ Changelog --------- -0.2.6 (2026-09-28) +0.2.0 (2026-09-28) ~~~~~~~~~~~~~~~~~~ Changed diff --git a/source/uwlab_tasks/config/extension.toml b/source/uwlab_tasks/config/extension.toml index 0ef65aeb..b6b67257 100644 --- a/source/uwlab_tasks/config/extension.toml +++ b/source/uwlab_tasks/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.14.10" +version = "0.14.0" # Description title = "UW Lab Tasks" diff --git a/source/uwlab_tasks/docs/CHANGELOG.rst b/source/uwlab_tasks/docs/CHANGELOG.rst index c89e25e2..dd0fb8a2 100644 --- a/source/uwlab_tasks/docs/CHANGELOG.rst +++ b/source/uwlab_tasks/docs/CHANGELOG.rst @@ -1,8 +1,8 @@ Changelog --------- -0.14.10 (2026-09-28) -~~~~~~~~~~~~~~~~~~~~ +0.14.0 (2026-09-28) +~~~~~~~~~~~~~~~~~~~ Changed ^^^^^^^

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 diff --git a/docs/source/_static/publications/omnireset/leg_success_rate_seeds_walltime.jpg b/docs/source/_static/publications/omnireset/leg_success_rate_seeds_walltime.jpg index c2adbf3ed74e8b8c400c4dbcf6217619a96d4511..a596bcd69588a1648876e1f3b36fc5d889fea882 100644 GIT binary patch literal 39703 zcmeFZWmsI@vMxH21lK@tCqN*$YeNVgT!V%{a0%`-5`uex1P|^6hhV`8?j*RoG~Phd zoX)rGJ8SK;_g?4j`#kr@g=f&SdyXD+RL!b)yj7zn_doAf0DMJR1z7+I2?;Pq`~vs$ zfHZ*q@FCj62k2;MXc!pinAk)(*jQNDWQ33Kh^WYEsHw;)DQOuwm}%*sF;G&n2tIwr z#m&dZN5d>EF2p0o!OO?kkq#3hIN0Xy_Q2ScndF_y95z3JNkR%7X`}sEFQvi1Pp{ z!2?1%ZmEZl)J@Uoorrh>DEiA39ZCqU4+&w(Kyo29|d2qpM zZeD&tVNr2ObxmzueM4i@x6ZEap5DIx9|IGUQ`0lEKYz`wuB~ruZf)=E?wy>TonKsD zL9cIq%Y_7>{6(z4OZHE45g_D3Mny$IMf)um60!%Pp%9=xpyPf>D5Z{O>hy@7ClHTHy|B!1Az(zqr+&mNl00dm! zu;c__{*Sf-Wj>uT1+mjSweI|l1X;|YZ1V(F0BI?JMn-$`f(=K1%E-E*el~d{iEv)A znvS7pAc1unAX3-jXLpew52Di4uByVjl9+xM?{MS5z=z}?5wo;L(QH-0UJzsTMD1jd z;-Rhv4?05-`mu%@k_-`|X-v6gaLN-`lC8uITbo*6QLL|mY zA+kM@03Kz*?Q7}Q zhB-fr@?!g~bU)~DRH;RhehIBwy9WrBN^MfnK9n7ai5EUzc>A&J0AOZFe-xYMAYPL? z3(@W7#D|uy#x$(a9Na4K+X}ypn46m+!|d1Ld;7rSF=MhgUjDmOnb?RnYU@nK@$=hq zOg~(m6!(1gH49{-Qs2M^uTOw|-x6^X!~(~LCMb1&r(ahy^~mEZBj*rY%LaY<^lpy{z>l_Z`jy@S%#w?^H%gS>^Q@vF!} zBZh%f5x@%U0bZvUOzulT+FkKoBNesy?WI?VAdQ_l`QAlrxIbIyTK$)mMH1P`rakhuFKbk6Jpzws1aDaR zYWRzvVA9b+8PC__yhd#{H=v2@G$c@^?$o5h59N3tl9$#NvqtDwk)k%6gzUcr(z0Cg zH>@5b?PHyA_RfCGh!2&YVJ`?G>n`f)`U=PIj^Ulc+&*_i^Hqjyhg^)Jz1p3#yK$Qv zGHbV~ z`Y2?bjF~d?l_b^KY=mPc4enkW34~JLp~m*owx=JU`LkX1 zga)3J*XGv)M>5MvYVVpvn^4ayg1c{G!!KywXR?AH?WpbYGLnYSH@yn3Boo$f8h)q$ zIPC<>5GrW8ddHwLdF1MI2W{p>O(1&2{q}XYocT zp>AZK%Dms(Z6R}!a?BV@^^c0Pne`$tp>CL=kHFL5dCf$!3-GzZ?G>zXURcQFv!A$% zisxFDuO+0*@E&;2+%fk!+>UcuF)4MkyO{Jrm<59u8AYU7t1AtDZ7iXUci#;t$Q6XY zJ4hIoxg`_hIS>7?*0nh*ruHzpJ-RM~;`>}yn3!pS{(Ng1-V-}!!YBPgShbr~$wJ$O z`s?P<^7VZXp48g>DAsNkB`D94B$e28%b$Ki%o4CI#YRZyBtG}tx9Me zr?< zF{6Vl>Ph^b9Bq(`p-F_q<9!`}i77Fud@B*humk>w*3<*1>J%>yq~2iAx{cs^6LK## z<9%o&pQ?>)mA%!3j6{F&>W}Zh2_|voQF6441Ba5H^C6X=2w&tuJxUuwVaJC^(woBGk$$v4%R%eq;EsR~J-LY7G%V1A{dyco6dh-mRDu>wDW39qKv z`UqA}O~0H_j50TD<{Xd)giwn3qfbayXPSI+pfWHav*tF)UYRXr1^y6`+=m~uZc*lh zA~RY`M9|O*m>Og`{9>4OM2J1=&5OE5<@)}zJ~Z}Zvjl&`7#YC9*5r|xGO`5gD&3R=RI|z8w^uA zp;#TOn^~!uQ`vEFF`eNcy8O#lu3r3 zO2n#|{9sfwFv>D>dU&s$?82a(U{A#3!!SeXpFnpg(_k@ zN!lN294k+{9ipfNs|NZuM{YLicoA!b&}olg(7E(gA~)JDhlm`9!ZeE)t>GjSEvf~^ z{pR5uTLeEG6I3KDObngUS6s7kE0v%Fsi9rsCf)77f^Vgj%wv3BB(l8v$@rqwNxOkVz_duLL;5}eMcn|Eb8J36CM@X=E z`qPAX+`O+k)@^%cq^`!bn6W}AuuXewmU<43p~jtsnHE^%?+DP?CM;Q#t8dFuk4d5& ze;rks#_Jvp^-ljb6TJpT*@YBTT5=KgJYuAqaxQb$qI527!WP8@7NODW>@J;?b4)3B z!IYY^ukxoI>Z!h;Yhja~Ea)%?wz1j3*_&ou1*<1P4eVtbnF9u1WaS0#0N^Z+XK?I% z^ra3s))!~Z&#X^hF7nwqg|ZHvO}JCO@krX6*A%S3?8}hsAgT;ss7zMykf15j&>FuA z8-4MRBgXb^3fpdFHOYB!>}2X(?6pNH)Thf> z1R~dsrrSy=-tp}Pci$GTrS)rPl=LX~wIXQZszpN~^h{&6wi0hQlX3Eb z#M*cQ0ejC6Jh)NgM7GhGgQGmMao1O~y1`JDFYWcs^&jRnCl{U#q6W$5X~<(oC&tJ5 zWcD%hFVAMe_#iX+xueC#HvZ(}=e#1langlVmfsf)hW4)mAwpgF^{>;bWaAH8FH#9M3Cc^;U43wkKKzT4vT)+ruqRDq&Bs);H?|t1Hw-tD}C9E@TYU@S(DgxHRv#QFRDW`JVV2tEv^74c!t->}%_tLus?)Hs~ z_Gds(lIAlhVErqlYmu)oQ{2To(}0X6_RKgYE+iyVE}HW z_6&QiXKun4+mFZ6wO9ti4(K;w(_uHMsS|LldA*}IgeCGksADZE5+&ccZU}U2a_=s0 zCKcE0s|_-!*eutXN*;FLJ_ee_Y3&6q=K~9pwkL-l+f4vGAM8 z^;O~-&ARL^cza282ps)b%H8lx^L9C(+6L@%UgDE~4`g|PxZ!*bDR93HSRZu!{~zJM ztp^v9Wh`HeVw*%8U2h@{BW1c|xwE%w2Pz7z6qH#u`_ERYClA(YYd)~~Sn1k1y-3rR z%SO)m+pWrVZ9h9^-U9VT(l&E=72h3C#Qwf<+Ts)Uz-UX>r+a{0Q0X3!IQ2J!Syf|I zZ>MH0-Ld>}?==6bG5F(Be)jkO9HD3|oZNigWI3#Q?EmqPYm}?tw`FK;7+*ODP0cTZAo@rb ziG_r|WX4Q|JsTUAO)2Nmf6P-SCq|3p+4VnU`?ou2qY3AKk>UF51j%w~dTz80qt+Q1 z>KM*x^gnZGI~5rGp%Tft=#qs<7tUi^Z5PzHyViJ->uZ|R>VEJ|Y@#Y1>wJ`~IOSqt8j z7SY`OLMoYiKi-0*A!F8@Q7E*QMgL?}Dc6XDJ{~1^Q&l=xKr2a^i{Z5ztwP`c%-2>4EB?)fe z-V*vZbJgW}!nD4@#l^ne@Ef>WyvORDpkZCDNJ!Ji&MYRX6tZ4#f*sZ@7_9^a0?Z!X z1MSCfJ~lU=#8R*uoA*8NT?E7pYHQD+egpOci)@2dks!-3sNmf_06xiuUj1EDR3$E%+);^>eEOcHGOcwjO)+PKF+V&O zB0pt543}r*eHOrlNVJm*@plUb*G0BcXhqCT_=$`y&Kc=hJ1-{;ZVK!I@nkLKFf&`K ze5rMQ_P*dFem@FbdDm7=)%HwM4dFU*qY83W4s}{d9XXaJ(gk!7_gY{^bZkVek&MGj z!4QdIk_?`OP6$um=x8{xf-&BZ&{bKp3B{aE8{5SBFo#U?($>tHSJYPpqF~e5K~_o* z?S^(C+V$X$GGQ?WiK;@Iaj>~fJxK$(U2^=wo_ABThF+;1%8>6U191v|?=$7z9_#Rr;wqKy=?Fq> zNm6}hY}P<@^lpPIkGsRV+#m7?cQ7S$H3lZ>3F18AjMr*+13f~6QkOycAF01fXb7;;VZ(iVlvqV$Xhi4sQol9N&eUn>#1 zBxc#YsotE(PwX~ko%~d5UH+3XP6dfhPuA2aOZ~RK@78z<$nC2qfzyxG9@4vJvR&uD z(wApc?*G~x8uk_G!zRkR1>q~=Qj*A8;S27gH@!pI$?7J^6=z z?!xK5&9qQEoIj{(7=KZaAd9jw3x0vWIY;LQFSZm zaJLAWvy?o=7l0K>s?U1a;l791L=VS?xwX2V!u@a#O#P782KW-TnB71Bl1H<}N9scp zZ|c#TbZs?}n>jb=${%zgx#S~v>q~qlIp1G~VS(Mn_T#om%#{zRJ;!F!WYMNx*P7gD z_sZh&X$Mm7TRaM9Rjt=};@YKenksQR7{6_YU0BG)aeAZCzCN&3;56LZiV zAW`>xv~xyB&}pI1r>wcx`LUn=mKI3ck`_)M4elB(U$nmBwwd+zt>-u<3#5Pd>cc`j zJy$;&upZqTz_zo*+0Y7^POdEO&sfW5_5l#^bMsbrCONpfq;S&hnbB`uWeVF0@g9;veq);wGlSKboL1LXz|& z1uMF{cma)(7dPNFA;NjSLJUP1$<2(~l1dDe9Zryht#@yQcQO*&W#9ch#^2o1wmfLzgk@*8Z)tfVg)Hz$FE{po-YNrZxZ?z0pfSwE~ z%D_>kyyoim6TcQGV||-UYFp8;BYNk{>gypCv(1MxbSij5Xrl7Fy*TZ`{5$9D?oS=x zHZ}Vh@nbPIohH5I?oW8g#81lEV2u_S_UxgHd!WJ6+Nd18Mxp1#dLuf5qsVY&2SK$sJ)aRuhqd}=fldMwc z6L%sL_rS>&$!+xAQ)}jXAhxl6!Eskfm+F0IM2z)Xeb}H_F{N3l z@OR>1w{<_<#mgsy3xav*1{b?pi54!U=)Nj_GBVEXkj&k_BfUM&-Fl?aePzeTCd+~; zc~-g{cT4+Mufeg~s!5;kY*OUF(q%bK;+Z^Cyx)A3#qq2ref*oUJq>i@-hc^>lR%yf z#5qfEE+@d)G%GR1n=wxo8A|YUgbHdQdH!Yt5m`&m0NDPg*zY2y_Om<-hFPx|h3~i( zC1`d!jppAzz3bdYxyb1k-oFRvZ|{K>azP2Uv2q%_Zy%qu?`E3Z15yu*v#70Tx}4bj z=o}%XRlDSmqmhzUYJ<2t66~}6EppSk;g9S6YHami+WAm?>VUg4exv{BM7YSO9{+* zA!F&(jLo04Z;#cKY~Dy>wFTRM7LjULNxKIifmQ~d5%2DSAH26JI5A05C%yJIv*?5SL^fhk^nU#(EmX+E!j6$?tsg%ypWEVkOXXT%f-G4Z|_ ztE;i+0*oHKAW*rvV92>sd6-P$QOoycj|S+BQwy{r{Vq+~uf?9=$C=M`7TW#2Z&oaa9VDt6lCS)m+i|)MH ze+kcs?oiq9P%}cPO@0 zeL2am7c~;znP&LNwUs{R`jx=T778>>?%0@#Wvzqan!{5D7uY#jAnM! z1m+5k=KB@x&9_c%)x+#|o$(|T=2bX#4~W!gyWRuPbCcpyZDvDv1gF&?{Wo`Rk?bYb z5I+Cth;t&j`WZ`31n}p^nwMd6QtGCmQVE@Y@zSjj<}D3hDK5#=ycUS_Kav~3YvheE zslNv%Ywv-p9%rpywL%VsLG6t}wM1Q+64uIj@a`P=b}jbrUF0r5P+Yg8!KE)X4)k+A z6J^?&URH0{V3Tjd-r|-Ee751MYj!orx9u-0&?`*97I!^Ugy z;R=~NZt>P`Z@1w*=a$&bumMFZb8gL~#W+tg(h`ClSKUnM^}FXI%i5{%p~W8S*H=!X zk272>LZ$*Y1=EF@-_Zr`Py|LK^H#)$OHe7>?H=3%zh=u~%_{;3UoYfw3-_W8$ETl@ zX5-#OZ2Fq5DH*ZMS+keSTc?P`9G^FbC)1%SMIT||W1S+$YGy{*vUPfJLqk{nq6*cf z+{m&QxBY_E=-1>>VbM$wmk*jjU3GxRx$ct{w&u@={CXVu&BLv?jPA1|##?hdVbA3k zjz*MFl2=2Aob(0#*(b^zHtRq0^DN?d6QossFdAnC`HaY7roP6W z-tA%Vkbrkj*I<)0V1!|z86+uc(5?s^6#d=m4ZiB#UU-sO2W|%IT-03RRrJ#3?D)>FNI1woNZ?X1?&B2j^7L>Fywv?<-Sx{t%F| zC&#_j!iH;mN7&cne^DXNFD4CovP+KFnMtgBR74}CG|_Tv1PvFPOWSF~uTfUH!+p|d zb{poO=LXu&{J2iS9=(pn9xJtL*w%1@)kTgvA>~v2r7`xy2YmB)enLC`bwh~t24k%i zeAPyOA~S|7+)(4l#3jy!1`4Z4k%EG=tqA%qefYd|6WOAwK*!YJeC_N856)zQ#pSV{ z#I?(h>-I5`<%p}w!6urFUtjlZ(nQ#_^eOvCK_HoMqMb}LEB^Kld30z-J;O) zy8gULS07);I>ICCpB@&Z>#*Bc!(`Gzqw3xY@g4yRPy4B`TrIQ;(PON>{$j_PT)Ff>FA6vecxa;^^l*u|RYuid)uK>A z!Hvmgq~m2ucHxxsIkDS4@S%t52b$ukV<^Kw(B6V;!*qTW-b*gfOslyo@g_CK-BR6} zP%~3I2>u?_`OO;kY$B_RVR|PgVyOE!G_xh1Sdt%y&cjm`L0ok+x=+{O{NfMVcUMEV z9%y-R^?)&MDu<~aX50hR?GOf?y-dXNN?mxjuKSd{YxVaE!SZK-|L+{vXF2(QtPQ^+ z*;RV=_@8s>#DA;}--?-aVKzBTB9m}&x_jWA)-=vv*NWmlN{O_obd~K@78#VEU-pb& zmDR_TETVT{qcdc_r=IpMwn=S`iL~OV!wSTf>9##hwlo{p)*|e_0h9r=${^R-+V+Uk zwad%3>vgY6rjHoGvMyvAfzR#5qL6-wyJ+HJ_DE!TnHBG)CKo@LKsEKC#|fYeYSXX4 zedpoUkI0p<=~vB|#UG@aZ3@i3D&GkCc(G|Db;tHRfQuedYj5pgU9>lsS!(ZwV$dR( zz%&*;OF`gu4_Iy7PU(9D+aK_k8tEJ9YPB`j1u0oYFBE;3o%if4+OXfB+SthCp3w2@ zt#q`n(A(umNQ?YgkSYM!BeSPfyQIS*X2E0U*;tiC&g(WvR+1Gsn|x!#j!za*> zd+yrf#_xe#359v;4O%7zA=;J1C|ov2rRirEIJ(#!vGrP{kIsuvB9OAM5CU*FW@H*7`9$0C z1}nOXm@my=4xD}C0krGmgOHd#P-0YHj-d*)Jqnsxf`P5~G>n&t&gve1egRc&MAF6t zwgVbPV_XtdCw+N|Ka}1TyA&<&>6T&y2|H4O+{kFZYRhPou{H^fqNMsYM4T(Nik#kY zzIVR_pPX7ouUdJI4#l8g2XV)b+9WESP^XoRKwhPGYN5Z7Qr-@??_?+ny=7tF27lI4EAa)iAAO1?w{ z3ri^o=GOyX2P^6;+ym=JoL3Y#8q8nR2_5FC?YqVN>eE-FK>QA9RKE)X3i`!iVmxau_^tLQJ7X{%o|}p3B!AhP@?i$~ z4uez!vcv_?(Y{l^xDKYky!hKGxkbM3m(0<*G^)ML?KqwWs*s+b`Cre&oX)r?6ZceI zjtwG8+TA2?F!ePurjx@oisq`v9}ualS^Nb;)LTyauF~;rB9iEoU6k`$dK10r6@!$D z5(7L0vx}4zTz`@wO8zu;7#dzLv%eD5;g+-G{*_1k8&MMCxA?(soV4$$ zKCrO4FFeK+mn`*TDS?lCyDIt7)^;`vYkPj#nm`-z%ZyB{!P!QarrGqsdP>(wj9*0S zE`#4(I?>^v)C%mL6|G<5p0zjoGquU^vr-!&b>ykc4D_cK0~G1xH+UsC(NfxV4{%1e=(nZDIS!HU=0j=}edI4}SaP!eg4anW zu_XEw;K>!5PZcFij^yuLbJJTVZ)2OaPhReGgydWiM}Pwr~P($OnXlD zD^v}^q|b?2S?B zU|C@CVSgXVH#2QvL2-(TDkbP3R%hP`?aE|G=^~#=ai*Tbzf66S7f$(F;kFNuUlxvP zq*F|+_1J0+b-sxmiT*7js^>+1RqV^zEl68K-l(WG59iNXQMt(N{_ap7A;Q2$+$awp z?K>EGlS0-E8whuF2Ul!=xzQptW zaT$ih_|%kO4hu3EoMdRZC3GSFdy;~jMX()|NT@wKEY;#Gr`<{eie4+*rXd+mug8+G z%y+Z^pO|+dI>U?Y5vfNy)l=tIhv9c~%7p_*Xw4WOA3-ta7us^qa(@dQz+FarB4XS- z7n7T(Y{T2ie!v(#ibiVjIbfSAmL@~vL^-*^&!->~i%oP<0*zPI(aC+xE8*!wv3QD2 zsX?=t=Qpp<=l>yUymhsqG9*_zY(7tax2ZRLL%B8TOZd_+^*Ug=#aRGlL>^hTrD_t! zkZWk7eCaa}#_yaPN_mFDKBC}mHtE2nb^fb?cwh7%1Co{P(Lg>~pGd9xWN_-%DD+)M z(civy?S1h!$plC@H;Y3*vQ4VCmuY$G;^t>cq*E`!=2IHz$otZreV$C{r-YV}@HU-G z;6$s(-)}K+=Cv{ID_7!~rIB#hzDn&wA!^N8epXkY!05O0o$_FrMl5joOF0eJ{*|sj zlfA&QQDnD><1ccHR(WmxCCLF|vPtxwK(hcO3T5}(zt0qTT;aFLs}GBGf9`+gjS0LR z%0nXbyS#g#fc=~i(BfhqGLH{*nN6+v-A#(Eu~y@^b^PHcQqTYLW!c|G4rn*MZs4xL z2V@yD7ui0X;B_|}uoX=5Q7G{H>7sFWOUTFG+RwwzOTqXXQF z|G3Oh(NK8f{5AF{`|!xW@klkFHAJlhKnZw&^gN0M!0k*9SNO5_a%*{U-K!#zDZGr!pA9llXr{c%;iQ@;DQ)|A8R_Vk!t!OeU+ zIS4?LQj#HFN~-7i8zw%Te}{hVqRX02i6~o_)@2(S0547)*c+@7glRLL6U#nLRY(&@ z?=P;TJRqpl6)LJnKhnax-oCSq<*F2ZV}=fLXEzxhEd1gBb}~ZE{%ElD4>Xs%_64s$ zKm_gW{QP^RS2A8YS*I|ClLSPP!@vTz&VR1uPZLiBpS_s+6UL{Uv_DSO^tRy!Ggag? zfhq5SevY2@W-!4Wd5P$!H{cKk+n0#s;XQDyz4rxC{7{m3x7V(a`u_?c*M{Hv*-UGL z+m`i{`GXxEg$IY2Z%K};u)&RUrx*Y`f?9sDqL&Ts=ucH>*>E=AQFk> zucy^7t-#v}{@UzBdgyI`xqj?luU%}F^IhgIr?viiX(gG*$p6i$g{(Hbu(TRujY^P{ zGK>v{9eU_CO=V=*1rr6)zRSZcj|HEcm*bJ`aoXo&vH3ex#wL%e`v_qZQX=ukpI-vwsTEjDxac) zL(8|mcu%$R`iM<)jV6+D?0{kN{Nk+6c71ccTV&%(qB9oRlZPEk`PI=URiAghzc$4_ zQ*I}yn$Djc>&vpTeNK~NsqpfR=EQ`$)n*9b)f=gLxjxi?^)sPwHhul4`^~I^3^C5K zCeyr!DI$u)SC^3%{~ih840$8H(kaK}aw$59SC34rrsB&X9i(mzk#fYaI5TIgqDf+O z606)&n*Dmf`jeEjQsg6ZR7t6}P7qWRw!HJrJ5?aNNoVamCxUH;`){80x7VkA-II8i zdz+fZ90k-X(>d=xUskd`^R3hJl~%Z0Q+|Xf zCRhL;rLHPMWnLW%7hVmjexE!%y_9)>8`M&bm$H@>IXk6K0}HtaW-B#S8`%c^k9#VK zVvnV5z^A0d=d}_vDc59^x5il|;xC;au=5K?`v+xcy!lNWiHAIo;gatJuN>AvBj3EY z#1Nqx{nGK#DA}D&Zqo;5D9^b7Uwaetl=jW&1pJ^~U7zT4nFJBytMow;EZNBaM#HlH z9rDWmj(+Rn5jy`%t$<;R2|){kK>J-Nb(6zfVB!yg)%uj(S_y%~OzzCO@rAqu{b5Sg zYFSy#rS~y7zWtxGR_ilXSlBrp^^Dv4EG_rH9zR`fWsfpL#oo>yRk1?ZwU<+`nc%xV zzQFo)SWas+p+whNRAzz)z3qfQZSfJO(23dFd^E&Ox+K81hf>tP;aZ{EC-JoQ1k|-m z_R2a{yXSn){2qAI_~8XD$t!@P8CTw@x!H9)YL*=`ewejppSE+=Fn5tXp3GLdf9^b^ z!h4(d20#%a-7el(8AEHC*1bKvD5^7(*j9_+tDipRo6$_TEPX_BDe*=KR;64Yq-5** z!Jyb7PwGSF>o3a-he%*r)*L1!86xe3f6fN{hwmQ+CdydaehaepW*?rv2as3rG(3?% zKZ;9-{h4eIixtdP zvC!ykuU(w?Vfd9xh`Oe3ZCSCAo=!x=LpM-Z2R&YfmTcn14R5@1pmBb(^7V>2cBIvm zz)VJlRGSoKq8bLuLzDzK8OV`FYd4dS{kK7fE zg~PG$$nx_k!@+p_`ur)ml)Zh^T8Q0?sl35LNOn%d(|^e-{fBn+_bN_#J(M78f#kBc z-M5kF`2}BwY~=DqYW^j!#afCeUz{!}xd;5(>eL@m{C5qOxEES)TC`8@9u?~R@azbH z@9f~srXElQF$nKGRCdZFiQ4-%l3V&?K!K_M2OP136-$$(<&*w1blAqWawDc~2E_V{ zD2md2Y6@YU`L7Z85hdd!Hhc}z7VhNvlZTZmAhXO<9h$l+LFM^e$->A*LoQLXncD7j z5GE{)4tjYfktD5Q0##{aRKmCLW0rH1QNMcIc$}ps3~Sw=p$&f>NN*g$t>5k}us1xv z5zD%mpe{okAAnd8oIoG5IXS#B2U@Mv3igzDBBBg4;&u!4)T%&IYEq9xKb!A)<0&%K zTf9CM*t*(borumQ-qtMCCDGQdq}D6Xy=k9pD9*LPN*0Zrh+wJI`y+t;k5Yt%AQJVg zqJkeoC!AB06^+Tf@Uc7^{=Hb4%9M&q{d|eD*j>1sp+6DqvwO)RxFUGZW?JXlJ@5+e zwzoBX^zPS9-)|e_YXh~PGRGcap5e&bLkE39t$7Gu(f7SlHTFpN(>{Y^ug5*$C_{52 zh*)NfKTxb(<7Rb_zHC5f+^T(nW+1Pq+^aSe-c)&7Z1tNJ#swk5E(&bu^V^-Q8}eBx zJ!2j+NYXuU8+;EuCz{#PMr@mM$|`@MoDbe7rYm3KN`Alze%=zc;yLA@35s=f^KXWuDF^=FHCQAOS=Wk>z=LPE@6TN-f>gs;rNAgu3zRcxgmY z$*fMqoP^(U)`rz4DVy9o1eclq7cTQRPV@Vf)!1*s51lXW%yWBOMq9ui?K?)FSpkd8T#9Ub{Q54h!5i(RTr7ny#KsI;!eR*68 z=d%nvM|arV5tfdbzU!WKu}^bKJf?O z!rRIXwEOn^4kft8?d51yx3ZwzmZ$%ovO%y7saK%KI&mXkJS1S@U>)L%FCFS-I{=ML_ zRKO(2Nj;svk7zi1ysiBW+j**u?TY$ee$N*n{Xg0tflJ*VHeW(-W|b3B{rtb=Y^QAWgT*c>GH&;iV7tY>^7c)%ia0=q0}S^Gk(w2ZwHI1bw-=k zuW3fU?G-z?th$Br?iV3Ilv&F7X7gDY2S?uPVj{bZ%%8;DV2pC=Q!2S`-eST%5**gx zUp&uayS8Bas%vfePqKoRMi%aYJR8j?>1N^{Zg&qs!wtbwq2X=b^eMsWIK0DHK#1)+^vtG3yFVr`Tyt`8RLVqxQujR zY|?0}UgEJo(FB7txWdywXG;{Yk@rIWQ%{->2A5VWwO`MR}XRxzlcImis$@`AyC~fT5#r_ zQCUR!Nh}ulx1E=1+k@az5O5>wuz)!N+VW`2DhZ>YmKrqYM~Kv7ovmOuiUjo(S{WX! zxV*m<0+JT(WERmbyz}8auZU^NdYHZ|kah7LEV5hV6CVmEM7VGKS43tMsVDd{E3Es% zz>^z_c!CGTDBsDS>K>3kaj$#_-p-+g5pCb-T5B_;VU-y+*CT*kVdDQpDu{`@b69@t z^#!nMyyMkM5hQtlzyMF;j@WKR0W#^zb0HLMdOs>(?5y zvJ`lf;!jk>(bLm2ej*I0>B*mLyZ`GyJ5)*K)%?Cr$sfGr#Y=l4bshQts$4@?blrBe z#?#qK^Rq)(2(ahub;oN&?DTD)O0`$#F~)#Ca~AV$A3~L?Bfm2Z=F1ke^x{T(u8!2Bj>%LmkySVvYqwq^2qB^nd9>Rt& z3D(_j8om%~uC!2;!qlIbc#YS}-o94!A^5J^D5sVDP@}?O?-XN(wg(j#WYJwU)Xz8G z)4Vi~?QA97(*VNpMwYY7P8!2jcbg=#A`j0jCZad8zY(+~DAS#Wp|_aF)IO;pd9av9 z8DP`RjXs8?F`J~sepz1{ZvSK7wwaT$9!+OX+LY)4DN(Juai;2zCF{e@K8t z)GG7LXeXuanGudtK79Pno%0~JWVU@z_wGc;rtbJA5DqCu?0h5Yf^k!N!*gy6_l<4W z!6|DgA){C26=-k~+libV#Dio$h(r%0(!0+YbTSHWbzhYr-We!7Y0uj5WW~wWsl0On z-4MI+|A3Ni%OXOZ3Omrry3t!q0Lx zQ^Y@~%D*TL8o%f(96QgOu+vnnl2;dC0Un&A3$Tn4hBA0@>FV_}}NZ&eIFnSz38By%EIRRR#0 zt+WC4zP_V#+|;id^_(+d>ztLF#kx)h>)X1Bj7)97LOn$|*}Cf6PKsf@;BvQx#2bX^4a5Je-*{$CR@rN+W@48~S5t=U zN|ChJ?&&_%pQ$#vW%P>$5qbcgVnWPET|Xh#cj`vi^UaM2;C=I3_y4l_MeVje8u`sK z$n8-fN0v*`QXl!CNcZzR)@2Wu*DL8U+zZ~bs@c$-Wus}gR(|%)pl$gk{Fl}E9>_cu z+&=?s2mF~l8BAtclq#~Yl+232);)ILl49owEE}vKW_G;T$V6`YiG9*Wg)e z?bCS;m_eJ%>a8;7VwFp&5hJC$q_gT|ppis~Me@u$Y4XDuM$FtXGZ?p_*T;<_RxW6X zsPDJ-#=X39Tnk$%{BQs{KPO@*Uy(2S%Yz)@H2X!w{PfWg6!w3sUHm`2f6l|L`0yc1 zP9)ocshTmkuhgGdTnZ6rQjZ#X1+@`YLQOV|IHSE|LXULQVK3Lamk1nhd>GDpy!mKc zAjI1sBF`BZ)A9v@`t_{JgQavotk4r&L^O+dir5?^4I4)6;;O=eR$<`JrFFRrJx2&I zr9-5s5aU_y@f-~l^E)%=%$zfK zW`1-3xz9t`N!U-q-fOL|yzl#ctMh9{8T{E}pGOqF$FI2bAoK-9FGF`65gQV3pPGL! zfg=reVbNlUN;)DS7{`X)`=5{dJvyp2k+)?fHCmPNE&TPv3A(~>awFMUpQ+CF%Wz@d zP%*BRN7`0d)^2?NDj=8<<|TezmxAM@_c-mkRiFglO%GUK z>t|~;5cYg}eyXe`J<+Wdw)xQ|x+Ym@3Y~yuzC|2{_^M-@p!8Ox*2T1Hz)sXBE`j8+ ze398$EDhfXh0`#llpgFNUJ9X#p)0G*gYH5Z;`9+ui#m(Gerf8~O5c1zE$pXRCS7$4 z^lwIfy2c6y4`fX-8U-qw&j#^sESFW+Y>*e~nwt;L$*?&PYDEgHbdWcy%PsOxlRgq* zBYMUJB?&zyk)vt1pJ;q&Wx^uhIj8d-fIS00h zwP+U$q)m83;(4U)045 z?g${71E)?5k0^HQL&wc=dMBcW!E2DWc7$x$1dxr<6SQZ_37h#;fSPE@TWe1gj?vf! zbRvDm;;Z@)$l>?!hTcDnf2eheA%{pj<^Bp@lixTfp}v}C&oUU z>cF=J9MD?uqoP*x;3w$Pb2aL zU*?*W)%=`Gqs$Rjn6uv-XTjkI^jza@ZyAVH;kzNbP#+B-x_0WEl~ebuIWB)bHF#t~{NnTe(eLRGIHdILwb$O8k0QwvlzDw2GA9GR%+qO!OVmg-+%720 zG@&)x;(J~m*6Ns&L=hI1ENo5OM%A2alFPJ&A$uuc(T_@H?^4nf6;$Rpr*`eEM{Ac* zUo}UCB88-5w-jKZ*$ef{l_Zj6H!3(HBDGMnn|p+A$aK|+IaVT@UC!kAK= zWS%a3Ldvfn!Nm_(?D9b)Jt-Sn^vy@vwi8x|yx#z-nRUc-1+xzm^%CJy3$os(c z|0mS{1?|e!`-RI)y(t!YE0^=nCerEqo#;}LJ`w1IRfuBjy{iXt{SP9rQkF);udmRkBxFZhpc1`jU+cL2*!(>8@=!BPr*jcdt| zz^z%n%66zDV9o;~cf9#*%YBEad} zz71oJ%dCsxJ44V5bV1R=}7A4G?h{a@&NBCYRSVAv+?C>*D)sHtmKa1UzX zw0pi+WPxEA(vzw~r*zmy(rV+`8d)GXrdy+N>sYNnXcbLeb)FS{&wyC&8UoTKsbBri z--1Z)=vH72ZRkoiUv`OWwJ{r^L&~{*4f7kEA51sP4MjnjzPYcq+{`yfir014Y3%k| zTdoqU##H7TIJmh2ce?h@X_ombcyea+R6N!9OO^05Lm*rw>avAM_PFNO>JM$M44Lta z*cW_#8}i_V9n-Sm{9~U!Pw^Hh@rW1p0wuv8{F3Ea3N;eV$mdzkC{oEDGf(^4Y#$pA z;%#!(ZE{w=ERQz2cjs{KJT*)UKwYyy{-AUwlbOqRV?aYnb(K;A3eON&NZq3HQ#h$8iqCw%~qjs%3AKNI#vl`__>G z6rwKSkNZ{EyGk{!$gbDXDh-ONO*lKfl74z)PeFohX|$RLnQ5eCVacNW@~#$WkN9)$ zdvSN3OY?!60K$s$^P)_8BD>IF7fLIz)I*^-mh3V+>#KsfquSFzW0TRezZL*qN;wVy zWQoXSXfNN)WkphP;dtfgOM7pl=8#gF2S^d*A4g&~?dJYZ^e zpkhU*UUl~;D6GcQwzt08H5hObbWiW+gu{pLepRSV;Qk85-={IJK@HUrjI6$tn0Ncdo|uC z?&3#M5stdqg(u%MP!Pn|P@j+%TcJIs0`YJ6J1Pda2q*K%?KwO&zuM_)dYAWE@Q+Fd zPzs^NNYm&%fWXxip781wOWHz>&!hLGj!v!Gskivu1L^EL5`DctJNJcS`jMWR_M+-e z@)A75>*Krq2u92O=-vdOVx#KZYFUI@I{gOz@d zQxUGXSZXNE?NCF`fyi(IGx!?J3gVRA+WEndMAg#XCuPq9C-1Yw+X;-9P0N4ZY(ZX? z?DS>}C~eQzY?>4+^f{<4EUF6|Z8dkiyE+!7nHt+HtwrYdDXgVlr8zwS+dgdNKUMy`Ym#tW2eg6GVjH=E1x3NFkd4{*8q&T=}B*>D?f9>f>P zhU#FfwHda>1c(AI^Cw6|hI%1A-b1i6rscq9ua&Shr-^co|N3(C`P$B*6v-Z9A_%@> zGs1v&(;H1CJw=S~Wy@N%2>~+(pgX6zujj3<@}UnFsy| zL6&zvetgZ%oG2qRmNJom1BV1%C3iR~~W$RPgB2|*ykKI*`r9oC{5RZ=^A3*Q7l zMg#xAO#LHlVKK`_>8Um=9)Z2cpw(Xxqt(YhD?BBCOa0qd%ZDz>71QB9}%m%)GS{0*~gEvt&I~k%E_q5 zTEDcD?{IPXvdw;8AC<5X<;o5Ff{E_Ff}!!bSOcS-K5sYJy#DrN07j(Tqv#Or{HdLb z@Iy8?7btRIJOjuR&jf(hxm8+>W;3AHC{q5h%hYf?Ad>Qq-)c>-N;0>6SDnwJ*2-qevsbm8E-1r-Hq38C!P;RfdJS0i>&F- zxQT!IKKl4gk~*xy*4Fm|)VUUZgzBp3ewSPQH6F1EKe-4kE;h9SXaA#Ru5A?8nyKN@PKN3Lfm>S8fMAlK8|q*dd2AS>-Z}6op;(!elpAU)z$)Rb z`pKKZdC>#7(5iF4bB%upD5}r;ft%~-aKTxgi0?-arJ6GH&uWiuyVdMklfS_efu+SV=z@5&=xT%I@wt9@)N#|B$ zr7JXk=U|wBwVA!qmh6Y&H3F9 znyl=jnqNAmcy2@tswucc+n^JJM@$Y2-oaTkd0#lw^RCx}o{SdiIGFoxAY6L24@YiP1y zXmao#jj56NammF6{L`hElv`vgOGAv^g!{%Tyzw~iu^O68wj+;sKS2ulZgk7tv(I&L z9{_xTlSJ(P>zheh6Jo6?*Qiv+hhHa~AqRiXrBgEQk2mZoy~v*~l)q3CxA3*AXVn0l z5Axy)!?FdtEQ>)z2k^X3K0f(hOguTAW7JCQNXja;#B%o9=AGIKP&4|)GZVTBHRU}e zcT&}C#M-O5Orgl7~@2fq#VWso(8ey;o=r>rvc&Hsn7a>JcodI$?xP6j3WbHw>dnt2fjDrc4 zY|!9;qhk9iydiFTF^z6r3YB;>6)4kraA_d|bJGhfu2I2SW6?sRP+-3#Lhxja^P%bUgW@tzqdO^1xdZFFE zweVKB-AAA?=dH)yPYNNO3LvdP*W;vnxBA8mYWj^d)JF3jnhzg_%~`ZCe<`-=U}A^27e-eN{hD7BAxBw1CRDtd~j)3Ikz6)P74_ z%e)u#*+sak0GKV<@3Nt{SZFYI@jgdwW8USm&vSC6ot|rr#0{)04n+&tD`h+UPqpJb zWHHO&qlq;Oqal77(TpqA*%sjpHNk9z;$_}0SC4w!%Q;!FNp$bVUbRBZ`l7SAYR7G5 z;?Km`tA3KVnS2(HhB%C5{bb^!Mw9k&+C#qJ?N7!6K};2AOtMv?J)R`(u%;*DR&WN- zLkhDVY2`?PZr^%f*sBeqNCQ#0c{_V}NM>+xomvl->wjbw{+;)fr(FB`#3w}W;0$~9 zySG#bm;#?!;mvIb02D#`VauddS2VG}t*L=hwX9WtI|{&-zlY6>74RWWCgo7O;s}g# z-IcN}VjBeZyAU87<#&s1!3)_^mhrRLBBlbENQ+bM zq?jz>)tEqtEj)=56Jxo3#2xyc@YQlfZ}+Ax4`6+r`h8v_n)BKrxa)8-_V6nkDb|@ zsrd@3l+Gg;d8_Gmm&|BJB-o6rNJ)80(|s(?Vr2#sX4-Aqblt2lng#%ba0A)emupb8 z3=EC;%|A-9{#Qi0!Hs-)Ic`d&Xf+NavME2K~qy(Mt2$g#QZ=D)}v-Sn)!!%EB6zkRcoOuf(I3(?DVl2H&Ng)E69;oMKq+ww+p zdZ_x3yxBgEWsWPFdngr@vHeiUs^?evxe+97mpF4OG@#raq+*l28!sh)= z60eW(H7mMXH*hyQv)%laxW(J&ChknI_-6vs<`i0WLVxnyQa%ud_f>Nr1`%Q>-WjCa zm-F^9kLdRpxvhgn=_ST2lilN7Lf^l2hiY2bT6Yp$qe+KGzyt$1GPu=BTS%TjN zx4(CHze0<@9{)MSNUFxuaQ?>;geAU9*gAGY0;m{vRY+Cvho>Nc=u^+dM8 zZ}_PVRnLX~YbP7+?Zb}ss;!uXk-}}(atR6WGgq>SH@*0^&USR!Ck)kww4g%jF&1{G zO3m==SDf?<-Ea3WEn5y;(FSrzCnkIVO1{A1s~GIb_RVn0+sz|agDaUt`wWocUSbML zUZ;XEd7^*EVE);;%KoP_mG#a0GA8{of}ACu7u=*)eeZ*JAQ;ncOn=%{OK?U{MzOji zo)yWKf&$+nke$>Do^U5V!l7Fi{V$1a1rM1Uu;Gpkydbb`yW;Jm0dE;Vu*@#%P2wFZ zC#GN?4$#|L&&e_#m0bBaHuyGI_-bL{9vw+!BgYEFo@1)H5B_XwzP@8fO83QlsbGBb z==GnV%pzcpN_xGmi)~(G@oabi-ou=-T=nCk%R>g4=opDFqZvHn0se@b$?{F2 zpAZVEI`YDHe z<6o#&y~{!++6qS3e=}@k{Bvbf86(E9?#_8@rBh%y-;9Qhy?f#j#gdFBKsj8-xuXl7 zdjUqy^#aUz*@04D0&swXo$#EMCziLi>|`PDFn1bS5^556%!67+Gg}!3c1<;#4oBqJ zy6qAEo3o4ztA^r)cC%CXCkg+^LWV%!@BJ355F4B&-%SWInO@&>97+0wMMOq6YrWfBqj&RAp~wW2*c2hb@)Cb32-!vqZlo zNwaOh*K`5BCL5fvaX%j@R6M;%-mV|@L4p{yUD0fe-~%TFDHUGJ33Xr@30TZp>YBA_ zG%IB+tlI4w;Gx64`Mpd1#dxL~pD57kKYt)@S2l8j%P2Q1BwFX;oz$i|?$qaCl!v^K z#ea7=d>TLHK~O}gLObR}yJU3J#7|_u;4x-tCk>`nA)Xk@h^ak1*;45G*k;0BjxQNK z8!iTG9;M&D8MUnL0^xB0Hzx3Zp63lqy%dl%fodTXEeNDF zc*IGcoZ`nf`ZFmQ%O>Zbb6#qB$|7sQ@&KBX&`BTJ&DOl&i*-FoDxv<^gnH=?^GmR|Xz`sr$}c-L^XAPRG>& zOuB*wAY%9{U-VlF;vcx9-|eIHf5Fif+yp1__xoZ9UMA86FS;J^mf(AL`6IMkeH||T zy6m+t#JiG&(jH^{jv8040V#MYiCK1HD%}mgu1G_GXm$dEGTWM^CdA4Vy$ttLFB9vV z6;B8U?f9Wu=9)=r2Z9u&T-yTK0@~+4?p}rVBdh(D6!^z>WZ40)-4XcrYw16I{R$`? zIg@UVIhxuWFh=8FnVih%0P=ITscnjPMgUI_JyF_4N%P>i2siC?XCWc8b(BssxeJ7i zy;oS20!k7Gbf(S|JaFSy+CeFz^ij=CCZ{o^{&NMjS5>Q`duInf-v;Hp+nuc31L^(P z75)kGce6c+!Hb++%(0H%k*KEuHn-yc3DRb4S%ellRQbm?dloO$^(XdgzdJ%dpK?9n z9YB0{>>+Rx6im#qMW-Qd?Do=;eQnN^8}-Dx?s{ykhkF^l!2y3CCqHhs2!Gl3N#7HX zH?Q)BsFRFY810&$zRyAUl|h=I6RH)nO_Xod^Kd`^Mj|`=olieOML>G5 zI!Cx{Sc-hfZyD*oGn1gtRc9CpW9RLQhd7EA7`dsF6y$yyJ z94q>~aNbvM=ou!~cD)nyJQ5}988J6SVkZ)(x!|Ipc zuzVTjXdzozLzAHsjsz-h`Cr1>UR9MGGJ7zh;I`koms#1Fs(v!V3NDa#oehwhaM6s> z>s=~(r(M~fpk7&3`nc%Y1@ckNhXIN{&uf-u7MhWQaBP;RFsX)nS-$&hC@jdA$YF-* z=`m|tuipsvS3-Bqb5gSwaiC0>dnD%kFtajuDO7Xn=R{&9I(y%(^> zm!#{lw2wtQ`)Q*L)G9PJNBdU92CXZ3Xf*_4JQl775ShSF|9e{6r`6X0K(QC-gAo}? z#PvC)+V<<4MF)N{)TBKL{q~{t9dvzV)>BfiFeFmpNN+NBeukz=-!t2;#7`RFdwH*D zj>Fjxf#nM+1hTw;UgGf2yLA4OLRUJvfn@dczMmjxF^ASirAa82d7O{7|Lo{PKlcRd zkJSpr=f7e$de&QxHx3I6sw$_*6&99o_HaXIDrxc3|<170m5 zRQrf#b&B>aCFDqLJJr37@@m~xxPN!iw5LQI_ivT?XE+S5**6stb={Q(dEo&F4N!aijagWKX2h{atjibns zy%P#(fbV6mwe*5&BNr&7Mh7N~uxS&4& z=~%vv@xS9umPMD%VnaPcduu;$Y=)4;)&r9o$b8^`Qrf2OtOm6I=Wfjmv zXsh=sowqj-rb413^-Rh+^LV`M>s5<7=+syPb4<9S6+c#$Yi4*=z8*hx{4(itsDzp- z1Vloedwfld4?w!hskIc2;SyOb&z}E97V*cpELS}noFuQ22B z0;`sXCU@1e4+;t_Ui*6y-VZGr2HWcFiMTS>!dZs&@i>k81M04pUSnE~lIB zYt%^cF0pRjwFBQsHGsKKXe2+HW0H-a`F6PqcienCH!Q|h#r)t39@0!Cka*~#? zyLHAFL0x0~szx9A69mZW*3cQ~3v;8=@A>*kX`cu0){;nt^5!cj z7_rO%LY&KqzTp0pBdR51J%l&7|1ln%WUb3CU6lUGtO*Nr`%(v%i4fcV>V(&ai#$W- zljcXNQapB-QbPl0{XRTcR9u$jEvoed>cur3)*d`~I=>#W$<`Tp7a5Uf+hGfA>6=m> z{B)s`E85St$@y_sXWJ~)S7&9!)f}y}s^Tj&ayo6_o|bj|E!WZ3baQ}SQE`%SVh@XR zrvTxh?+5F+fVOj{H$Rv6#{>noALO<4M}Unp==Zr5+Ml`88YF<5vNbPzDw(z&C+2r| z$lAa$n))BzhjD_s(RvH7ryD^>)4O`>>E?w9i~byL`^T?e^7S@r-t8cTwr~0>%xzu1 z>|m8?vg{b?q0Sj-1-=W;LXP^f2mS;xFz=^$!KBZqsdF=O^(tv*+U(rG2px;maUCVY zU2+UZO==qt9641EKD6HEjj6@u&p?$&-lVX+W_dyhSm`Orye6FB3~rP9Zoz8(PTRa) z`VqE!&18QP)NA)FLOCxl&2_oW_GNGnHg%xKIC^#Dm0&ZBYD3#Lp1~P$Xn8@f0wEvC zLoUZ{d+@_<4@N$9r7q0A<$Z`>8!*TQ4$zsz^F~Z*cT*x3&!u><`BFj^rFpFro$m%5 z%|=-BN4n^maCAN`#UExjuhugqwBz z@d+t($c9O8AQ#|a0`Dl5?8tBUM%pkm==Q#FXtZOjERV1YyKUh7>eW`KS>}VB$kZ&N zdjX&g%>t`RApOw!Z8H1MH0uU}vwGs*o9~{JKCnL!kQED{B|NVRZ44!HndN;~+)8m> z)6z5s2*qg*Ddt)RoKol5LLsYI*n9!up5u~@EXrdCO&~&@c@bnVT7zzk5fAfcA6}-f zjBZhMD4D!{oM~}DdjiI#m?7WE+@}h{i+bd!1@;yUTYz`^?te!up@*59aCS2*t`3y> zgUehx^%hRf8wc-%y5)X?mTKL5GPC+sTzjuHjYt+3>zxbDxee4lriLnB|8HO_zxj-_ ze8eiR)>PcVJyyg7uksxvtle0x;01sz71-f(lV9u2|QwdO;8BaHfvLsfb24A&V6 zn$AcnXNeO9L-u@mA!Q?&HcPxd-J>*83)vvIdQ?S9tZuWCye(g+0WC zAYMRUdvo|r-3yZvm6wjvuN%HXM~=|SZ#yVEB%dtSeAwyhc3gljgqjwbe3=iNRDz1X zlaaL#-G#be&V3e$rnqy2=J&z`Hxz303@i9#3rCZey^aLaM3jnv&*8ag;>0LMu+PDr z;coPDZ2clQ`YS$<9%%=BeoXb%N%H{O0d}n}2C&)J!LxGpR39^K=#3vzMWdXmR6s`- zpc4gQO$y)pZYN7&H)LQJi#*n*@W%#OIXSoVh#onDHq_KcO`g3P9eV~BcsIjc8^<+- z^}BbX^@dxvS$BtR&MYE+I*C{*QpF0{a0NbljtGxQSiY6Ms)D7>Q8g*5HXIeZuHvGbRww zXJ9`EEq>WtSrJR0owP#}#3P64e&_`6sz6-!{O&;CD{CN1y7)&|Z8 zot*>7xq!7w_i<)|a;%~1YS~9yAr{_1pP2E40hFS1b^j9$19ubPT6r!2-u*Lh;s3P< zfch?!GO&!P5oQRFVC}X>m4WhvHiBL(Tj}Z#KPr*!`gY7KZS$=aimCUZy#2Xt`J%l1 z472MV;s=h#W8*fYf?^)$s%tvtxZpDdvzk|N8l2;k?EOGI^L)mTaIY#yp)AivhriUa zXW6A&4c&i^rWA^~ z!_aob3Rc}1JF(8@<#Bs99yhwjqi1O+BE(ZFv=7+$f2jiSpEtB#lDmz;E(Xsk z^ok^1#j2rSbv-i}pa)+(v9TZqqp1inhf7l{x zFN{Z~PLl?&83l8i;Wc#j?l{H)*xQ#J47h2HyKZ2|=Af`1UoG;O2$7n5!4EogD@Wr; z8_fLneo`v@wwc3h6Y zRsQvhqWTk;7ZBSaxb7x_vO2E1(vrTxmvN)5mzU;_8+YL?tY3E_!Rgis{=t@43lMfJ zz~(>{LJ2*oIXt%mUsG$F(KmLbBLTRGmgyJV=~rm|zjV9+v`sB3a=Aif0kkvbhfz2& zoz-`(LuWsnd%R7EL22kd`VzQeaZk77uIhY5aH$D=W-5r?u03^>hA^NC%P{Hz&n=oC zfPwPkO?B&!8al=|pPJyn4Q0{f{CiM|c}Q3kNNK?sW6}U>)aLOcQBhE{+q`f0OO@C~ z*KsWXI9%F80)3`#{{-b3`-#9mF}ppWOT?a%#d)W$ndo19{4r!(K*9E|jyX{$V!~oT z;eENe1^f~8g|W=k1hv(XMZE^JqB3}czW9Cx>O+t?%HH-OEeuWJ1+@43^0O~b7Wv4g&lSM+`ZwLqrK#CLcGWE<1#Jt3U>1uU@OHq; zlT^ki#FmoZNS-%0Q|$Zkl376|S>!1#QFI70fM`u!nq(pms;%#vPS{#gdXJbmv8{{} zH;n`F`Q^bXmD_Ixr7x+P`r^M(((& z@v1kiSlb7nG1irsl23})Vq0YEo@u}+vH8Dzykw+dzJk$C%yE4_>n|VwktB3L55Wzt zKI;9qPk1&qZmKdnaqn9{uwOE-O{yL8?8@S$%z@|~2?$aA-{ma(@SFN9# zcX)c=;Je?qpW`|O-n|IGxf*pKpZ$E;C<0~?tTK&g}4?O*y|yv8ip5LJd$ zwr8@<-qv~BgMIR7OmTpQueUP&AVqjDScMxY=Pv) zF1riPBkd!}yORHO@czm0>y%ei#57d}y+R(*is|=17}FG%?qEyCvpbDp@*VycgZIb7 z59MkoXJCHwQ3Rb`rdL}Xq}W$qtup^$?qm?+gZ-mxbUrPb>mem2p(6nRfxmTg0-iGx zZegy*zs5^?<(miJHn}BDvn5S^ChLGRbjeo|L+z&t>{?7&K66-NGS+ThX7r}gD9-v& z_U;uE&?mP08%b0llk|vYIkNiRjc3Z6>0_KXx@e2OJf=dQ^%w21hFrxc7GubiF=zX^|j$#Dy)ngPQ9=5|~ya^<#-ez}9! z`HmZv1JRu{HqGKvQAeR$yup~#$PeK>$=@gZ9IJJnMJ;tns_7w=uI0Tilk>OaU)CO-TRqaA_ zqRJLRgu1@^9G$2fp>2M5r%0Z!l^-10#~nyLe?OY^Ba(htLh+0>Ga>+a-&XOzKVeg>yEvI$d;Ei3TVX+?KC*BBq zQro3q8JJTxE}n3C!bLvu!N7beLmZ~|dq+{zCpWFzVbyjD!D`9u$I zfuYu<7_$~u$oS@Z^yLNl*3bz1_gv@obQptfM6Ai|X3{M9lBcm5@x31PqltAJ0e>{h zJ?dy)qSDrhPwq003^*D+s&2k_qk2;&6;}3RyEJ10PuUxgMVx!d;NqLJZj7f}Ynm9< zqDw66Yrm8ic{pF@--_N~QoQ~B0m!YjrPR)VcpLfM7#SpDrr@SLQ|hyZu8e3V7tbh) z1ZjC&MN9+~9R0p{ZZ{YH);lvMd&LP#psebDAu1hZN77akp?^Vxba}wid#S)1or(@0 z8}VGz#WWf(z4c|dG4I~@5^0i&wEtpsVfVUOWA#CIIdLXP6h*jw-bR#n%z@I(4A`cx zn%*NJ)s%h1H^9AF(ePP>vlQHTFN-T;aZ+-|5u=*Y8?2}!e9<#}D!|vmCIuJ#&D;MY zR4z8p)*K4g^C>mIe*XIPwBts?h7v1wL&`4NrphcM?1d43in1PDhwg6o%3XTv-$cti zZ;E}~kT!QF3|IPA#kotApfs;-$REpLring9`w$zf-DxzCD$RW9B^UHGel!(%BwG`G zR{!bU`DjuQ=NyMb6Ub>FMk5ffH|XjIZE#*m$cRAP{2Y0b|6CAlwj5X(v@V&AuLr$)oG9Yb8(0nHCZ8+hx`Q`?v<_AKpcQX)S2w; zF$D+<6g>WJxP)a?av|1L(v!n0Z7}xR6D;vIFLG)}l5ilH@yv@l(UtBLX#CNe5BvQq zf-H6yYk!z>c3;1KPr07^7%BG(o#CF$7o%gwsf5J&PeF{#Et}r&rpu>Yn_u{*+a)17 z@9fKuQ7rt7ivxcdU3Q!pZ}31`uQ(PdvAm6(62|9Nu#Q_@1>j|7bi$pUM!QA3#N?l;!tmcDA^T{B{N%*|p9zl_B!KM((PJCPYnk{mO>4GwCR z7buW#XA2~D<^AalM+ms zYg04}{iR8e7Uk{rqY`7zdv+Q#_WIXB9N=5m;;)@?YPr8+3J>r;(Zhxj_}JTAq_Hk>6MK8^@pF<3kQt%}&w{M!*EbSJOK_#V9y zB&h91;YPHRNy+a9?01OyZ_)FA>$xQ^UX6Jw2y4a{pgxfvi7FP3q?&fR%lzJ;L*E0< z%8OH)fsvY2GQ`;Sjg@&HI&nv0HWpDQy9Un&HN*1iXmOrN^Kxq?vhLp}&B5D@^T1{j zD-_vYIV+>CWf*hw(a|<%f+@Mok2m_$c3PSpUMy7F5b-&xu&VB0nfqBrW9>7QPf9;V z*|jCBj1z~^Yetz2CvzvuqS-Ng2nuXgsu2HTdbHQGr6*JLiayix&jVzW`3*D>I*A%@ z2t#Viv?4=o!XGWj82LWWQz~hX>s9T5DPV2QxPC%S>Q7M5lYGH&0{4K7;Iy8dfK}k) z{(@c2o`f|TdWTLH-X3Tli-l48&7Q1F z$ho_$BMP1=xY9Y^tCTHGRfyn{-kHQUe5s+Og>$G1(OWLE%}cG@*9ZTzG+dRM8`e3ni96cMbFpj@Lqv} zDRLRtCk@9o#2+{sULDhOrm|QWjwG7UHk}H^pa1NMUPp|@p}-^JhtkiVjn&(4RVn%} zqgZe>(`Lkt%zO!(X|_AI^im&oIBA4~hO^ebO2{Pd5pBgu6(nVUe1m{N-5SZVVF} zkLQS&3VyS;sPeGusr8WD>w>u8)v;_ zf(xIk^`BczkS;`iLrlLtf5Bf`>qG(Mt&adEdx@q%A`I%oVsGJ5_VF1-Lv(t!giM6& z>V$9aG?*5b+rUbWxkw03A09UxS=E#sKX4XPzRqCF6V*!088hw#i7LSBR;z=*_uzcg zLYIs%v}$}prjnPxQr@WuqiN&FI!-^n=yHYRt75kaWG_?lRSbrH0 z)S>1!cnd^j3`5#-hxryb$J3R+Rf(;WFrJ;K3Gm9PfJR`!g7iB3Gtm9nIUFB3{3K3Onp zpu&){tZGlnd0e)n^NQia8$tU5^KLH?v#hnbN;CQ>vGVQq`!y9$`_Db(YsuajNjrNS z`MHP8;_vMEzY3oGzdDaB3U_}-AZ2DMl);}pd9`z|@J2_Omg45Kupf@X6ajMg!26xSL(#PywRLeQkmj1wJEhhdKActAu(RWxk}DAUvc8GYDm2v@lSjggIa zS#;I&FIxhKGZv2IZRbpEMk^&apUp)QiKd8uKe1P5_$qd9O>El)2M8nYX;M2knPFELV0d&lReE-!ayjJ7d)Sp+34TE7oV z`7!a-%D0ma!)5HD$A5i%jGrkkZ-5$v`-vMHb5Tx=y&R zXWjQkHZE9Qj;R>Yq5tM4gTUu#+Q8d#m=-QpT>c4cX0p<5&Jb@jU90+|3!5J|Iy-r2 z*tncS>-;%6w8jD_-|1}${7c zSrktEoAFejjDimoIXT)rb0to=$xZ~dG+Mci;3jct;dGak@BR#Ala63=U#e^zRf9)@ zd$w$Pzq+TDeyO`9g*F43b9UFG{eq)V(2lf2P}RH~B_=rnZR}Nn7L+-DPA%7HHuGia zxqQoKQ5PMYQyxTqdx4{}kgP%TJjCAPWcoh6Z+$!hYgI6rT6-@Pv^!kKX4Z}oZ(_#o zm35~>jjanWD{d@ZNLL;qaU^SRO$FA{6%j46_tvlrZuxg+5N~TlMTe5n2^o#iUspIj4BWmePW_Q= zL6#`>cm`5%#PAx~?j%(j#RdSe-HJ>^7)(KM&QOj9Pc%@QwQI5H7APJD*4ncyuL-62kjk`l|Z-Rsb0v(({65JgU+$9hoK+wiDxI=Jn z{+)a0&fJ^bnL9f>yZb#KP)}9&sXkrrsaJpRTij0Gegp0+$jHk82nYy(CHxn-odKkP z`*-hQ-NU$#g^7jp;65%90|^lU0TCw+9XW##x5#5bZUKIAIYSlkCpyyn0&0%xIws~e zwl<>5uD&joK898{7C&x+@Bjyg2%m_ZgoNEfQb5w;zx;FC20TDRR6!y@LZAi^A0Qw- zK)C%3Pyzq~3VgLc7W|hV1Vkiclsl+s=ook56RPh6hzLkXh{#AND9Fh0+5YhB0P+JA zoQIqecW~9sP^n$E_BXnwfqO^@@XbSd0Ehv{7z|lK z|8iqasyaZKg>lyprwK?mDd_1k&ikOor+6QiLG&y_A0_H&Mc&bS_YGms7U38qQVXe4 zEY5Vq$|P0j2JZKwpVFF_+Jl=z<4KxtdfUksC6MEfk&=LBX)6PtX!*vb(2?l_t2C=w zNKrQp@<|t})ThFwah6A8v`~w5{#eXGimq?23q*UuLnvE}WnP&yANyTN*u$>X%cN-& zK@DcQlg!Rog110R0aATdMLLKC6pu2{N((w{eCo`o_tu*hAtEg}jvdz)YFwHEeyJ>+ z!W879n&%pEWgWy@P;#TH53Pz!cW#hVycrIbzXl$CeELkn)o=M#W$>;QRO#Wcwhr+m zwxLa#-w>*iG@XUwQa=Xi3#2VhXH-;#Fw~oGoR>p)#_$JxYCnhP*eRUG(-;}vYjdqv zI7l2+34Q;qSz%i<*w?B0NwX>Litgi9+LRUCDw~r{adKY#exJe5gkY5BlEm2dHESzp zUimIyGnmOy)ETdOM@p>*8aJ9g&m&!n5H%%Qmw|c7OdW`8JAOt;aJ0bUHggMWHibcZXcG_NY7a^(g$#Ywb4cU~0B-h|NY!boC(0*>XhhUsT4DebS(Uu(_cw*K+L>oYAxbu;C}EdDSWNwi znKpqAr^$+8tFIahH&2eQZ4t-t`y7l}KME=DpMtW9o5LlP*sr7nW;uKYmBwxeL8u)B z4N-+|5It_%4)6<5Z3Hol~9HEOqow zU53w3@MiXLH>UkR)i$(7(rJcjgBRFS9)z$r%v_&qx_{pg7dz2`a+I`&Y38b5K zaG;-!Pfy+uN(&9*VJPY6|11P5<_zsRu!_N)@v2A(pwjM}N}BKWjX@ml8bH{L;TFdo zHpEPaT+4gs3>J3UU+#wjtjFgqirzO_F26OGNuxz(5A!h|7%-74>@tCYYIE zq7zI$*Zv7BBUDB}t+yBbxCa2)gk78Rq}osS-U)fbL1?vXZlU=iHo|6=_ACRd1~Tx< z2ucq%P*bcTfXpaGVMJV-2HA@Ue+J9si^bZ2;}oaRm{g%uHt_rF|Emgwnb}|>W0(fV z(7;HMn3(;ZUxIHpZ48Q?G*u#PtQ%5+SvnZ-$A96y)Gsu$Wvegz9%n9C^|7l{)T75{ zkxn$sSq=AlJE)>wsv#9*K>&t-vK>{AvU&`L>zol*qGe6%xFR2F`!g$cCZ)F2E;_XC zgu{lYJnY&Ti44=#x46%B6h&k63>8KO^Ys;J{MUW(!!P5Q3=HlHQ!R~*+;ushTa_X7 zo*=hH>P=$yYo?fU;@xIgj+A(CS4r*_IahJ~#nE`pGl`ms&IX>#@}sAp(e75P$`kj{ zY)SCWvL)oxw%Bi;7C&-tlFWel6d6DKILbbbU(Uz!I-QI8OKmX)2bjzveIQ6sSa8QF z;L(g?UdSP_!J71R$+Mas{9!%SZ2pL{#o!UEF+@r}bCoV4;}_o0YUwN=>$MqOp|V2P zdv7t4siWrjx{103zImPQ8)4|_=R%F>s+e7tF&QFIX=YD$7!dWu#%hNq;(hcNj1rI5i?gS8Le0vq@iw?NP)3=g5lXL2U69XJ2AaA`6jJ*XiZI1G6HKqm+ zsC_+7)SnKQD;HN$zOj6M((nD2FL44wur*ISrXrqz1O$@U>*{s8o`&sG$)D~X5pa+a zb#YG+WuTqBTYD?h95o~AF22Y)nwn4aK?ut3A@>Z|&%vWSQhXmlUo55edyMPMCCLd> z;iLCvEU;&Ze1m-MYdi`DN1cERVd7!;_x9P@Jj(t%A{{XyQDUOivl|a&DPEas@M??? zCo*xyS9unD6O5m^`s#2<^Y{+*+~>HClqaEeEpaW%VnEQA0gy5fg9HL0CI{>Jx4?uf zOtREA#+Kl+1V`WDOh>ae*328|g5Bx0m$F{Lr(yvDpKn$77Hr%wdBj;Hd3PuD5Z^BkI@ z+6S23o$+(fk;vYSbKs>LTHqy4dq(DjDmpOx7@pWJX^XwXL-@2AKe;*2IgZuxz-TH$ znahcYHBDfT6H=P>$yGFA$(Luvvnu8R&hv=K&))*u0#m^vW09$Aq7x3tS76`r(C&4O zPCS<`ns5RhV@Ng-fQPW!ek3gl@HJWpCGITS3^oRM+mQ3!0wIcJ(!%GslCemnK7GD* z#6bLE{3XnDBYg@SxGy%u8t4bBJYzmOTaU80-OY%aHR!%)heq_EC@2GLkqh{~3neYS z5!GBGrGHN+fze@CULn^etQFAAJZhgqVx8_t|K8cc5%(7GrG`_5?-ca-3RL~QdN12k z$Ubg!qL2n1KqYu-Z`Oy%lG(tyDDAjW4-?w z0UwnAEGJwSmQ^DCgE$CpBwg4Y!^V$6d`H3>~O>p$9vfN-+hMBwREEf{g9aPpA-bZqR%+X4&QDYRT$eKQHRqJ8%Rdsb( zh&co^ci9C|ZISZ86IoUFn<%87L=teWCZM=(LPBR$%Bvj5YrMX5?vp9xALAjkZQbcp z8Ld_<6$4drJ&v-fZm5~{4tC3k-A+re-clsDX$L=@80pNZOK3`siGM(qa^3vAY{ZdW zwJ!c^TKl*j`oMaKF3eJ^V%k6%E!4m#C(J`eTno-Joj&e5-UpJpv1UFbe4TSuq{Kc0 z=-n#7wX~N|{&nyNvF#UdefKEU!NSfay+Z%foxK(bTe zyah+UbarxdwlQG>^%q!Fh~vu(3>s1nfsXaJ(qB2VMwT$sB1_R4@Kd{qJ|$Zh92DvI zN~}p7cYU|Zx)jXijUSE}?C&D_<_pg@sbwtd&hDa~44EuWL0}oGh%(^&sBFoIYy8_* zp{H<+FuX=<$^Aj4q1|NE@ zPY`Wu&gvT&J)y3zh1hmKiA6#BfTOF|tTF>o{SiXt`Z~X>XfE_@r7o?Q0PEe6Mnz#UdfDJE z&_JJO$UE=$Z%OsifVu5FN#&4roPoR(d9G3ES{)5#5PoUhB{aSI3BIv8ktM)^sUv|s zw=c5~e*CU=Jqf1e%NaPxdtGRVTj zl|KoYt62x`#dnI(gbZkg}o>h8NrkBlE%oUU9KiX@c!isYp+E5 zo7~%rhI=!IYnG`ZUZ~F->gl0fAG~-t4T*hgE#iZLp7l-lKayWicjpHkWA3izv}t@k z!x=McPNb51n?1`(u}M>GG|z*>X*Is^ogfjfAK)3H|3Y5$Ble56)&vSAlcWAXCN_k| z`N;X>U!P{t<7xlwovX~F)BVFke#ZgssJcNg8*=jRo@Mg=+V}jOs|_m=WoTanXui|n z8KOF!WqUWvbPdzX5ohY9;Karuage(RLzTv?d*38i7cfia0Dvy&3np(6YXX(T_)@>r0Fz79jmHV#xUaVW09c1!~tb zACGXXE-lv%VaP!IUArS@|7v}XJ)!pN)ZyM{nrqVgD=pVspe*oA_9TBuTJ=075c(D- zB73bOw%K*2K6{H43pBSD{Bs0%$}XlkaL5ylfP6=15tvd+3Xy0_w& zlR%Te_8#kMTw5DEGL*G$)&FR~{Yl)Gw>STx6q7Uy;k_{9lWg5l3T}!KG@6w70Y4qN zQvx@`*Y8=W?7HRkIdlUA`f+vjW|b;c?U3U>$ohOTJC7A7o3FS9Y%3;K>Y5XYSv#c3 zsNqgy7iYqTH;%8^D}{}SxXxVP!~zD6&rDfAs zs{m?nw5km;NYIh2hcc{J*~+b=&+dKBTbr*l;VdrQQEgt|Jc`G+v9gP1X7#$syb=w@ zXw^`YK07`PoT6y{LbPdchbSUcii8+rhqcP`L!LiV6^Tl+BUit3{zl@KRH}7~43bCCo%}a_yg4{> zI(FU>II?+ioA8~hCHdkx*BPW~?^dF70ZPlpm?5X5@+A)WHa$oqd|&(Q+2=T)e*5Ys z%(cBx?zIT{1WJKp(P})fX9<_&PmOp7gBQL1I~ z-2z!A%vU)3!eUioRVrewYrY-U!Z))4_+wS-P2n^$C7Y=cG79Tu*!B@q)5)10j+y*` zse+m_Wwbuf(E@_1Wcwi}@^f$#+k^&?-Os?s95idAuDus*AjZL{w%LeU@Fh<^U$;*n zO;OnU-LKJ5m%ZIBFxq;R7j)kPuj)lcZt;C}X*}TXH=d8=av4$udExg{oG4QnsE(R+ifB`N0?-%VsFGI1W93oqaDfqC9tFt*&OM)sm>D`{?KUo-J> zn1p6kbav&;(F6t1j(i-Y72qzhxCy%jy55d69(x}*V)~JIfCQm?q;DHj(#=sAptJ)4 z6Q1cNd~e4euAg!G-L&Frzt`EnFIuhds4#M8`iRXRl@}N>e@e_vgLTO1ysnX#is3)G zj5;NrziWA-78tb4wh^}NB?Z%`yjmGab^09Grx5_Lcdm3C7!o|~WSRlM2*-HMjZ+c} zD{S(&02j59d1vct9i^JINVOszF+ch_*=XK4R~>aGY%oNg8SmLGP{D9osozWK-g<$` z(!e7#Jr=V_o+Ap$dw=uM;KnGS16!l6SkVa;V4!Hv(Z%z`^V9457ClcEx6NLUPcxcp z(f=mHU-o>YC6hxSs{hLgTlVGHFv%r$?_2YzAa(owqO0_asJ_N)u`k)D7d^K?G?!=v z#v5ZYt1OxgcaYbIT(;p2#=~*H9{-MEyj!5kd=KrKQU4nME9ZOcN(9ieD%i$#p(Mjb zMgX3hmVx4TY)wAJeu?P4(xr&Nnkkqzv7?G=^JC6ipspU~St7o#Wc?DUe$=8&nc%~m z|H60qmDh8X9MT084WVMY@3LW!Y<(KS;ZCAbAX9_$Q`zgLj$6PVV!lOygG1mmL+;`( zT~1-*j%`IL)>J~Oy~~1mawoS|=w0gLweW2EwKghP!%7(&Y-(aX`QDES@ z$-uL;Z9D>@tS}3>!!n>#nkkNfy} zRx@XJs9*=%B6N~$=uTpJnStHunVIFCEi}FMH|Ci&ahYM?Y@*PS$JQF;o?_0f+tV6b z#7-i_>w-fPGis(gbE{+O40Z>}TFeVH)EG6;2Yi-mX>uLr^pcxN3?2!S7`Q(WeObnU zcvl2u=VThX*SE7^7tw=$#J^5N%a4SLDspwCpYYld^JeTOqSmX`+CX52{wwH+EU1-D z*h0hw?5a=b#W|19CGV09_T_H!z1*eYL9mYv(`NY$+>sY47QP}_fCaF_pSh3;jH$$) zKoZujD8&-X9CY^)dYg#g7r_npZE<`S-rT0R<98GSj$=k9iChnn_ona2s-V&aGj*S) z79*_m(pd)$WV%VH8lDce9+zA(-@PJNRBN!yZv=%S+ds=al0%IGx`e#8=d(tRlbiW> z)vH{;uv^%XLoul1(_^srj=J+js}QQq+)w*Or?;&KMd{+5+-s@GYz~UNl6vR1+zn_2 zLItinQ);o090iCrV|)h%il)KFJvkD&vy(>p=97|VcUffZ?nXp#iskanNH@ID!Xy1aAqbm ztGMuvNS=uznWomAKDOai8R=8AJ#Hj@ZAPZ=$INr}31>&6xC+bn3q6&l(^LAiU90Mm z$b^NIk_kJm5GGRAn0(gQ*kIuyR9R^}HH6l9u~-^0go?h~x4kbX56eC|n%T4{|A==O(#y(d(vnitTQ zazYsX_(c&q; zYA~7V-Ks`EwI_06`Ed^<*SA4&L{MR!5AOYh5*`g?i|Hnf0hrANr*t#NOK-0Twd2?P zHT>7p@Bp!U6AA!1kemHZu#s%x6y-X7`$RGC7VvBz`4D3I)OTc%YLCL)-H05|onzga z{+fE)#+Fbl`g{mR1f4`U^{G2X4x};g&{#8H^Z#o3eLM-B)sc8Gqi{lEWCB@FDt5uP zl!>7c%UV1!Mh4I#B1bjT)EJhN_&v+2s2oqbdFQnGR^&1;fWU;X zgLWrJR#DpBVTn21`sm@yCJNt(Cp9B)nMm!NIWSw!Z``H3!^)nVJ({QF682RxR;x*v zSI)CS@H5#r3vVT|Tx zxv!>{o@8ps#~{(L5BR5rPS8OvDK2DgIl~|e4PVifv8%=n7Km@VMXSK!H(w#}E-Gat zpqEt{Sj*Dd=nYRyXa*kOo5Lv{6lxFaf zFLmUyI@|eh%d-&Rn36$Yd!bYhTJ4uAH_M(tCOJkT{30b?z{`-bfiopteZv;X4bnHV zk8Dg-)zp{}X7D6Vo+wWB3p)MixbfR!mdgY0QJVO{YPOml0V_$;5P*zenk$fE6k$}| zuruZDgXv9@c%wnu+6t;9J~y>j8ZLxc%TZ}5(AfF$?SQiB2n~27z_Q86w?c4n2ceCq z?c&w4I5{hxx;V=3+h26rXad%U#u}VM!$e{4U%HgiTQ`75_<>xz0b7|>#Oc)GgZVR6SNvsX`^q&;$ z7Yqn!1yStGL@z?X8;f05iFP7VVw4H?EVfNSj1)>Pg1oqeM9k$y{0kaQd>jUu+G?#5 zau3BZvVuhrBeXu>8NfqGbHKiG(5gq-Lt_){kdlK0#y?lPU zFf-^R*ZV4Z-=9;h$Fp#2_nq350WPdU;wTo@ds_B#`ib1PgMC#w8mX9i(VVr{84Vi| z3{8yoi~8P)Qll49@?!dL&P`Nt?hp)4x=xnZ-^bS?Ly>MPHU$83 z6jr?OKbWU~luC8;&V$A`KSF}Lfw3XK=MMPzUceYx;CA}W@QuCft~$QyRcsKg>56r_ z1n#ifn#n%<&5?{1?C=&?;L)`l)e?Mr1&4K>4Zja;YCY>GK-BLyB33HrIji+XzZ;Gt zXrvHIj^2j6Je$<`>kQ(*%r|9v6cej7h%z_I$rCDt$hE_wqN*MnKlwn)4vmdA@orr(#uv@t-_uEtCw+_*at37WP*@Ty#&h9D|&-d~PH6w6grP$xGO-db@N-P$}Lw79W3yUWqq@L19 zwirSTWEcsv499uS)?y6HqeF!Qs;t|Fab@edyhpHFAv`>9-1PuAEzJ=QvCq)9PF5`j z+Kb#`)Q60=Sq<`k6pEq={*N<0B*!!e{qQObEoaJ3|^rPnWneGMK zI6R3J{&5o-2~d_>Kpc$WZeTy&`j{{rECykG!@eS|!)TZ<{$5MdO`(mV#&@nq79IFK|M=4LdWjfbc z^2qIdu7jAE2-#AX*Tcb6m*)7xrWgBpuuiaSK;Y$L-08x9ssc3?gx|*3d(sVk%d3|ZQF*C0=!j*@58$Ru=XI8&q`DxnJ@wU3u zVlo<5`U-J2!M%a!y3bb2Gew3SejcVZb!haVj^&cvXL_7R4~CYS zQLM$xa5Ikv-!^+iI4?i;cOY5+bm{r|s6J^=pp5cs(!5|fS!Bve1o&$F*tT4zJS#*R zK?|!*?G9UH$-KSWm$zV%&fu&So}9(zP%TjNf0yOPO^f7r#a|{$hu`G{{KmP3w<=QN zYF4!a&Z%)i z;$*v#3O7}}rkQwt_QXfDRma~3h*jVhMJ3iRv>3 zGGU@xMg?LY#y{>L*^_)ed-ZNn^oi*1wX%_9fi{K^0wg~#L{ZvoR9#yB;h##}PXX=U zoBtB#G=`@b>S;kBxM#^(|pD0ykuTbQzH^X5^ zSrsM3a7wveEs&K}U7wqwmuw*HBX<$&Eq2wNzHPvZS+x6-Vz;NTz-h^82QG(jgZJO4 zef|As|FLg2I_-X%H}(*&&Xs@ z_4keQO4Dv|I$7%_{LMdFt>5#+e>%>|Ky#)y z@bij|0`R32pTB#*O4;;ok7n2p!|KYv=#bf|ICUSku^~n>7Q$Dis;Shy{5IoK#<575 zRr=xVC)s6PP&zGJEkC3Y?G>?zDlaQ_1cs*&$4amSy%&5j_Hemp0E#9iT&KlH6-R)l-43>%HiWnrSP^MG01Jfk7M83r&S(NZk!9rCPJ2!jp%ttJB3`Z|AO3 zpXbQjoA<;**PQ~gs!PqN_N`{3@IW@NMGX`M#nw}29j~|I8ySVaK&!6yM4lIGYd~+@ z0~quM5INIOl$*lp zAE1op@3EIZ9T%)QmU9j;DGZETb51{1ZGAZ1swu(cr5t1Du-?zwvq|%;buTKRT>Gin z{r3AFY6K-iJ$a?~ErOJ#i3Y#=-2zN>!eJ8gIqJ_1qt6naWnbI^Chu#$=<73-Rs8Y< zl4(lp^%^wBvBP-LUCC3^ub-)OszuG0o@3Y<+8HHy8oVg6XUy-CtBu&JH}yfPSRWmq z3n_7xX{13XiJ*QSB(jA`qXZe4!{Kemk{2<&Od8Ewc*1x2(BWo{FqgcOeAs?;?P*kq{ny}?dYe(+l|Gpk8Y;`9u;APr zB)qL6tqU4cr$uQzP}YwKtM;zL(~(9Lz<+sWK8R|JSHR=S+n4MfwlVC*d<9Rk;Cjl! zTrmB6uWm})_-lJ|p{WzU;euJ|cb5iF=0XE5;F%iH1gJsB>S}VLSgs~ia-lJk0YMxo zBNr|}h?UhV3)x2OC63p{GDTaAExk`*-#hQR7`(r{yZ5o&`O*?~6LeztELk@G3etap z(f_?;Z{%t8XuuOlawnHBSo_m0koP3O5~J9!vwC0mF*D)Y9En@N@Y8jV*m%uWR4ieF z1xcW%b|4jsan9Kz{f}@z1MT0TZ-0M}KWsOC|M|`r9)zkdRNNW$hnE+I>nEKa317|| zJLU6?q%5%C(cxqdUR7J!h6%s1X;lE$ju}f=nm<-TJF3EqntDDh-D99lcM(%KVOlJG zrfA__I633vt$HQg=aRM9GVuD{(UC{lS`gQX5qLtW4lvd|I?Ux1GLGA;A4#rq1WJ3Gc%{;Ia0yRP3TEM6IbmeYi?=P zrN>v#yYK1T>N`KSFMFW|wg>S#J(G9D+^PAfKR+*z{yA@)e2IHQ1$@J7N)|DZys+V| zHn$ZUDRk=4v-fz0`JMb^P>npj04hcG250+zehDFKgG?B0MDqZLTn4&HHD3jfGp62# zMh|OFE!IdG6kg5ty$%1vf6*Q(=oc3lv6eOp2N+kOH!@d*Z2MQhgrB7|%A8Tmh1iQH z>(Do=K^@n5qSh&1d@L1uI*`=b)b(XXE$OLZkO(+QUS(bTtY4v-Io9tac{j6V zm;l01mi3Dgt50<^*(Fz)QPy~tW|fS3E_`ZI`OpPepp_7%!$hvCzJzu1!b+va~nwM-&_04 zNCF21=K?ihJhuQr>S>zJ^+_Dh^*~^*?BY@R2O8MwHq217N%C3W6(>!8u6o9$X8nCBNj z)J&mVH%N$HLV-Ggrl(;rW<4CMG>#FbIGuddYQVk01kxno=bm3x1CqD%W z91Kh!J25r|5o`c3T{W0Pa&3bfoIBqdy;HVk-gof5dRvZ zC-<69T&Ev>(mL#-EvNcsA?!o<^|4&~;Zp2i@>1e))M)zW)^kv*vQR3E)KfVTAb$iQ z2!++!`uCpSziqs-ubfX0Rziil-!vFUCJziZADlO8lk_)twjD0(KF&VFYLnj*@!uXP z%!OMwZ-2T+hmnBe?qg3q#`KN4LvtH}O+s3KNlR+y?Fs-e>o`bPC z&4U-W@)iD2&!+#>x?cuyfi=bh3O$D4)%D&A>lh*%k2F?wtn5#5ku#3eevisac^$+Y7ua0bHymKS zE$!N7sxd6>NoNk%4S9$Zca+@;H3IFdRqA0-=YX6m=tfpfOx9o0W_b$S@LK!^yW@#f zQg{Vf-?Owws8xx91@Z(UTsoS_VMhZ`M$k;**f1i1xLam z(9C?PJUCx+|D1>WQ(y461^lBPzSE9^!Xu`la6To{5nlFPtr?+8pwJ3;%08Orl6Y{G zmLB4v{dy@?!I7_PE`u{PZS^55Rd0b{k5~fW<|5DARcTQw>nh+kC!Yo3a><)D_4puD z_Rw=zzIxJH=6O|ZD<9|Q`!*lvvACnV8h?$Le;CyNG7Ip&V@eb$rWhif*<@2?%C|Hb z9ldP&3KG_hqJ6ha^Kl6WC7gophry1N(g_5s;Q@4*h89} z>x#Q>KHr3qnDqL&YGEdp+;*M(TnL^9s2!u!+ZVrzt)IGVI8N0*zhrB8N}_u}cUQ}} zOw~-c$I8Dj_E9$d)Nbt_L6DpH2Kp@^7NTLKry!!o7VG>d+a)QXkCR2$pbJb5zHunf zM$6PP#Rwju3U72m|8~y<-#XqKFSQ-Q@B{t$HJO?tg2_q;xRbQ@c;+f@y5Pbti3%Sx z@lT@%u2&t(UoKy2iPD3NXcf}I=n0>W*D1%#&aK(ml`9Pc`=}S*51tfXJ&IoBx6OjQ z_@Czs5I-arnl)@GRPxA25h(vKZ?l82<6vFhq@LH3n_DC$B=MN5WT@%Y-6k92>wduf zQYJG`nIN$=ySYgE*>}knS5d=vnu%nVajt_(I_`!P(Tj7Y_G;wXyNk7oHBD$`cjej1 zMe6Y9|3x3UU_HSsB*!8sn@65Y2A$S*Ul*!0of9f>$U1txzrDl2owA!X8?PE(X2b6m zK}aMX7!r7SQa+L$%n>H=sasXSy-v;Eh7R9L$fe?=+?6yR@8kGUs1||gSI!M4Qx4`N z^zpZkYYa%mJarlJnhJ^fILg3hpNDz+9UYKs*|5;UY`#Bg#CiHAnSb7A=v%Gmi=3XurQdZK_)2`RgQ|MeZ@&q)^s3p!Q>+Fq(uvso z?WS0JD-7Ov>@ul)o)%9%Ig4yx-uo<49Kb-pIrw#9o;sb(j;Ngh?^1a-aSyIFe}FcB zwWmME#Bp75C9z*18}cZ+mK635Ja-@A0Y&cs54`RrJ=80iyh=)*R~w8G)zWwxe^M3s zN964{4Cc@JKY+>1=?AH~W8=}J(@(79rWffs5#qkt(2!rk5{5vi5g(j*ZkR}4`_e`d ztRnYQs#6NW-XK6cgI%ga6e4uMP zNxo;llSuhHU>L$eXI>hCjYAk|*%Dp|ozuS0lh$ae57M-_6zthXn@YDKzmUqiXR0W!=l*DIpP0R-^&W-}eG z#X-w!rm4+AytCbiA9-1QZnAf3)Oo*NUx&F6-YicS4;C10Yx01&eEEtyW-X3Q4oXG1 z~i5u0z z;^EJ+H^b53xcHcqGHnAD3GXk*h$TTl8xdZW#^1%JGTCu^P6jtMr=sV|PwYdt!;{J7 z@SS)bWT+2mlEU)^{~J8S{+W;vbm?lOufr$ zgM&D*9ixLvler(=8zgANu2u&5&`K(doP1(+3ui1&3$l5qoZ~!SYDYCv|d4 zdlfC&NJnKt7$>n@kE}svpsv2;QB=sZAuZ<#`0{hVYD3@ z$?go|GWAoXE|`3gQj9d)Hq%g z{%7?F_WC`CYBsIAb2{`jRdQO0MTikh1#SA3@XXb3vikRW6o;@r)dxs4nWy_8+kX@O z{hwi-f560Dzyn1|{NbL3`SbDpw&B*F0;f)H0ly0!Uv*_i@`4 zZpb}a&t>+8z9farec?g`cYzOJo0O?wZJD9Zhb)mKJmF`$1#|(SIT;uvX_5I`pF|g) zR^nad)5%>++=;PGvQOr!DQY#Roe7~urYHVJ0ru{eh)?bZ5$WGeeyaqYF7He%}x#zj8`P2VWthzjA!b1 znUpcrI4-biN_l>83v7ehhybk7ui5+ZUzqSOR_LM6RTDlodGeH(4M!`i6khcfkrU*> z9pbU{GLy2@{Kxr;VocGRlb{#(i{v+$-z5xuSVAG1Ly6g(`~t>qZ&(V!_cHhnOJ12F zsJqCE*?)6czIzT@S9$Zr;&A!y=n4INPG;i^Z?pd?RqCFiU@XY`>n%|8qyQ z2WxWjN^>i%m_6Q%*#?z}QXf6O;%RYK*#SJ6e>6Px3Yr0{F4a1&Ybs`#AbKbhP`6fE z-X1UIHL5k16&BskCXDgMg^59ySmdIxI2r2$A^+&O5rm|FvJ#s2CQULNTx*IsrN%a`t;4|y#oD5VMb;Z5KFwoQYM)k0CTYJVSZJBqX0y9e)o~``_eE6q= zr=L;;|F+NkAyE8D%!qCZtJZgwi+<#>-u>*T{PNmr+vb^z)GZ)F3*0bkR5(Y!FP`b1 z!YhZpp%H4ujAW3Zrnnwa@V@_|`7vezYDU43lb2YCyE&;>UIR>K2&(af2u~PU#$wVs zv0z(AvQHt+JvzY$wSL#=0Z1OVk@I+!fBI(k)5g16&EwTp{mq~@zym*Wu~Ev=iUMY7 zbp$V0tC}4j)2d}M2*FdA`)joJn}7bl-TxsF`;Bvd>;F^FGYt5Gblh ziZGZgz#=w9mb8K1Mth9kH-l8@6TG$>1)9C!#6FFl7aM6Yz-=7m1K$_B7cGYE94>8+`9+hg!TxGwH7H8d+X& znrB&^Y+{B7g^ zFZ%ynU6vT>82O3FunP5desHFZ=(WH>#%Re&&($C1we>6&bXo+dzRS+`lp&V}Y}F0- z3YQd{8Pgm}NwmxLlmdL-yZN@6rn)#}B69@`QP?7UnEr>w0Ca$5-_@M2tnKoRe5rj; z`ORLjCwn#uWzbr+;i7yleQ(*YNsg?{F`FyCWLN&P`$^sR z(kpegFOwBPrttqblshJb9xCAsQUp)qG}gkU+PEH1$>RB0ki ztf;EvJc@q8p25VRHD9`B$AvBTTELAPIy9jv4Y*FHkgT3o8Sl$Fl#0&v)IN8zkaoky zni3RKg|&dYRYj+=WAKh}?;)&My7wze17;gP4yNb+JGrdT*Z?s>J_C(vwQ>BvnyeBu!L;E3(jqAp0MjihVCn*ll9B7_r9K#k!In6 zjSem8J_XFQaxd=c&a)-NOWQ*Cm3m(s@Ky=wh%HI2+v^(@te@q9DEj)HQ5D zWcSln{8^4w$4uQ3!?tPgPYgNHyw7}k*s7zG-naU8;T50W>w&fu&{1+J=bSJaZsqHZns4J*d z7WwNp%(-Q?dCysS{y(EderS~cOq2ZeSnNOWFW|w2XDurps3^cL1-ql!IQ)qk!VrR9 zLBLdrJk^?jY-0XGvu*wS4C)-Y1JjrwP2LS!UVY9A3r#Uaep1^3eus%+caA}vw^_c~ zH8YHt?L)ERY4pwvWte^opcoUu(;7hDe;aN)PEJ7L+WOZCcgb)ZF)>huCVWgZt_#naYm6s%&bikc_?&FOU{np0=e~| z=QWRJYv6~dWl0mzJ9(g!$)epq$`h6P4I5m4rNTv%mx-_snP2LWrtjSY#~d@JMtD0Y3uWqtyR3NCY+nD z$$swRi``#4Zel^DP0VKZ(ku!Snhp10&p@;4w2IY)hGEZ%lvO&|A+NCw8TUM%m>3*HbeeHW%^Y{qVYN$w%Gzh8}6@m-^_`$PT|F4?sjA{Z~!jUdTnv?(%At1Oy zR15+V35WzDN=2eKQmGef{~L%Kr+dYaFrW+PER9le-|9+~&?p5nann zQAmS#i<}It;G-*sEzBG8gcHX)y{h%ZVUE-@81%o{S^;<_C_>ij{LEj(>-804&t90g zz^i=ONunXC9OU;t$z8#mRy@4 zm$M+37$Sr%h`&OTzXGWz#&SNK9u-c{e)=F(x^el(=c=0S7Z%n=M-tl{b}efX08-?Z zB3<*`WOZ3*2QoMcVKEW{2#U2pt2n(Kvu?|^)`fj`pXsEWd$ADk3dUO@#%lVHDPuC+ zT3OjMe2L&EBBS?@EnVMRT~7Xk<3zOxz8xO~+_?{7OXMJ`h4OzT2K zmVDwkH-w!JV_NyP&}?Eg5%C5rX|5nAyz|3{#$}7-dlIM!H*Q1U!vi1d6T5gDxwX$5 z%r~fdj9u%c<_KbL(7R;j$eqto<9uQ)&5g_dp*G)NDaDY&&@E`lsZpal>dFFYZ#vd* zv-PK>Ff~=!`-cTY=j0zj2EYf8l%23=kl8iPw@#~tgpL`$Feu|Mjk^_4@<2D3b&YIxE5tkWN{#XW~PtypFJH{ z`(xmlKDLD}DAM+ew*kv{X`TOc4HLBK7YQ$i6)nRnc2|O7ogU(hu_J-FqKiG-D@z6N z^4ab+;m&R=27-Y0i9dVWQu%ddF|6aWol}F&`gxb8zs!9OU&6#apqkG-AXn+f4}&l7 z2+Q#%&%!j-hVB?u+lh(#eN?TS^kUn5_cY?KTW*G4^-M-0(G1BhhLrCr4JI>w4;b=;&hd)u*Rxc36Gg-PG7| zmTrDyNcP?=hA#G)kwo_iQ%e3E7wP&a)9E@m@G0BbPhM5hUnfOWRjy~H9V0po7!28v zn{}ioLe!)AuGntg5X9i~M-RsYRN92G+}wV3D1-l!!^4hj|L`lt<+Y`K6G`G?L^gg= zPOFaCuj%L|nI32>=*~IcZ0ub%IqpOJCa);U&y|*sqz&|N0jm=yxlvP!EM0$r&!oB^ zK-LS~L3|YQ~G+UkvLyI39FrsCOG3 zw5}K#ajq1LIS5%Q%=0`YaXl_VI!QKqiE+Sn)5P9=^UjC0+MIX4kvtyg_6JFBM3+r2 z!QHTB%S_s=`erkIVL{!7$Q7?>YcOd|BmzJoly5eiznQF{3cvmd*@wj-OAXZ_urZZ| zjrOAW+pTTWiCYBnNIwwj4sn)1`Y_bUZ!D78<%6fS4f)c0i$D3RtR_)EKm z47%@&gVbPKp;ovDo}U9%Q(u$0&<1ft#aB`|>BnE89S7|!V|LJt5F?elgUuMoLEjuSsD!!XL+?c64M=Zi~Aj$3GXoB#GC@#7o+Gc7g@7ZiaaE z##$B;-LrpLDqj^~Y^K7ON_TWmfM(6NwW}no(=*@v#h->!I+*W|=yMy4F~&T|GIjmBP@aa!gn`En0>d7g-#Xk@Nt?05fFRSPQ{`_tj zb$hy7V%Zbn)o^q}YFD+2;<{xWE8BwiCmS@%oVq?a2#_*AGf^|u=U#q-HW>qr`7~`| z?s`+oQTj`lo)=6)A`E(_T_Ho@&!DY|9F483e`oN_doI zyPP%E$zzD;5W7AH&tl_G9kAT-`fAMLPk8+driKkF9OXZ2VIflc62loHqQ6dkh>LqZ z6=eLvETN3_D$ zC(}~%QD2Zg*a}@YRW4E)z?k>Z?cTJXR;fmBMvr5+?bZ;~)`y45Pwe2R*5GTYerzV& z=Xx9s`t4nN3`5&ybOt|y;sAl7c~s|W9TNiXQ5h+JyaYT55H?dPaW{@E3bHESi22h(zQ#(5&fxFNf04dK;h z5=-vw%>h`hno)f1;?0up+|}%uAAoviR+30hq&1`86u6!n-f|?aFIqreoAI;482tf9 z)ij!e4n6J`W96uM&m7zXTutCmQ+OKR3@2~r^Wns2zl3M$|8OEN#%KTtlx*G61NbE4 zO7a#SwW&t6Um`!zXt1g`_PTa+)hN;nr+lkV))`6X;9}e20CRq#q9u`zecM*fb~Ha! zoERz1e>(sa=J`h(^h1KX z?fpwT?&6m06+p%(j%g~N4+dSR5~yyJFW;XOJ8&l^PiuQTJ;%Y{)r4HZG}P1x%W^1r zWFK@|QX8NySufLF2*Az-ruHr-=f>errpVVs%HT7EfphAtx%#u1jdtgo!`r(3RPc#?CAT^QV~_Xrf(M5XAh^4GH!e-{ zb@n;;?0xn<``q*0@y2-XkJpS^z1FItR?Vt8XZ@zEewck&1w48orzi(NKtKSzf&T#> z768ux=%}b@s3_=YXlNK1=$P0fz(uwDJf~_Ihkl^+36@LnT1%` zxq0~c`GHI#62iRVoP7MezdAv{z`(%9!Y0GPA>(~Q`GoiX`t$G&fRB!-gG7UbKnp;` zM?k_yc<2ED0RRLP_-KC(`0pPCL?mPsR5Wx9Oe}bV`bPjn1SBLxWF!<6WMp`2KX^R= z86Sn<36C@?p_(ZgtrHP%P<#$LolJEnvHBR8p3lrV7z2}pl#Ki_10xeN3oE~XppdYL z=(Fdta`Fm_FEn0jYH91}>Y2ZJYw^y~%G$-%&E3P(%RA(K=!dZIh{%M*Pf5uspHtIv z^YRM{K}E$SHMMp14UJ!$n!CDtdi(kZ2EUI_OioSD%+AfPt#52@ZSU;v?L$t_&Mz*n zu5WIC(S-m&`WspQpzKd{;lt@dL`FtJM*Bq<0-^`JAmJmUJmEnlkXA!8bt0tY4MHc9 ziO;F-#GvC-2NRn)k71I~^RF>Lev$SYW&asr!T&4D{z2I9bj<^>kr3dEhlCH10$klP z=LTZ_KU%UsBG9km=Kn;HRiAK+;nNM>9>1Uv+l_DFn;)quX*3|nUp>>d1ms47iuP~q z<1mMd_XU&Hc)Hqt3=t&mV&Oj}WiDbru@j(BI6kz`X>LelU<`h`J1e{vhW63g8^D|! z31BWsi!B9NUUuzhbktV|R!MWf|2J8L=509nD&$DZJf0!uP0ZBTx3_Oakg4B42DlNa zJw+kXWV?T-G``gs^=h*0aI?v*ilOI#{8RKBW_o+^*v#BO&M{dcfZG4J3c~gSfGS|~ zleO{1G~PW~{aRX5V@O>`*t}e6&VdlVXWfm3PIg8OC}Zy1jZ^MzLmvc1JBiw-1kwRhq_8#xVm6{a1S5@{goWT7A-ciF?}Z6uxrPt#$?1vD^E7(;{_HzcglA zN1Y^RB*dP?B&29<7Lb(@)3wJ27k(C=QjX!C$GCm6&CsT5^+(;5ABLSluXbpV;zN3+ zR08T?)R$|LQS$cr;fUw68fCzE;s$2T0fN07#wF1(B>Z zbX{?c0Vz8PXcH8r=dp2J&I#pJ-KDH(H6^BuLqLu1;y%oY>YYe;{;Hr=a~D( z7vk94(7XWwA(FH$e@cLLS}60llik*QM%H zAn-~U2Paetlt6FAz#?8c%Ip%;gXq3`Nxogr0ew=z)PJ`^sA&EGAkejYZsW8K;@G0y zus>RoreezkuLQ%MT;ty9j@3~}NFFFo0(p!VU!ui#B1G;u35!SLe-z2aGOqQ2Ml?6x zzn8j9({_PS^gDVYb(^dC1k^1K(|lOQS$HOhF(?s;bc1_Sh8Ju^I1PQWRxUGPSaU~z zX5>|rX|0$vn`t+D*S9;=ADvazcBir^8&_{ z#i?M)bE3Q9k(Fo&phmaF>*Ki;H~V6sODx~0z;|DrxE|5Q-Zl!=ueB5Q=C(Mz804+R zdF%nxYt0GVPO*UUC7Ui|d>9=S-3th3hIxV2vuaeb zvy`NcQ)@V#qC4YUj}|(X5kd(f6FHg>(sTYLs^ezuN@Q<<~!4uUg~~(`wCqzSh>j|t!#l>{@A(o={- zxXI7@82!G-{#g!Irs!#GF@jF4Dgd)@IQ__`-tiezy`WwPppmC{0Lk37@k{tBIFpLt zv5`k21xqgqqXoO)-fBQ`z>WH`6TMD0T42j*y{V=T9Fofp{4zZWz+xbmz1QHL?lg?( zx}flyap#-+t;!d{3^q~DT+Y{aF<)G;3GnE%)-!x7@k@61amE*E}%J>-S z>+;vgae?k4!nU|P=^?$2KzuhTq7~1?Z{X`n`G%^N$irrdvX;D$e7*6}3FPi)gLhrc zafH59ld9d7xO>e4JudsV^l{9K?q$PtsDAli?oOw4N0AaqCh%xa2f2+A>14ej?sw#> zuS1=7&Z*%J(Y4iFAuW_BOcY-G%t(2Vnck>!!rsy~KTI6%6y=*fmQ52z*zG)hDyG0xxVCt;7uk6o1n$>vfuXIwp9vNeT}wUtNuzHO%TSy6BO|@$ z!lcLUn`A~2Qa!}SI%@Uaubuf*3n{Ok6s9zmlg zyxf^*UR@deWZ&3vc`~{yZ1yGW+yuwCP@}uz+%bMn9@*9OISz#~Uq! z#6Xu5Z5aLa*=w+S{hE)2B$kNzlsz@ea2FpjLN1a$nF(~K!bb})x}A8x@d1G0s)}b- zEALXY$4>ddu9WkcJ*KLPe)L9=PCFgAvFC*JKoY(nG1P-3T~6&-Ht$hs$gvc9vydA^ zS%eo(2GI1^;k%PwTV+fx*x|ivxB!m1iC5-Uc&vEEp$R@zn10g@DNzq+L&B$<8f!|R zlEO->;ff>yC76wzw~?ZXl$^fuhoj3+?DZ;N-PJf^t1N>4*j6BM`T2w#!S?s{r>QrH zlmt&Z0o2*SV$+2MaH@%XWx%+l1=nfcN9EfSG=1nlsB&{IJ~9aQPLCBu8V_Xk)bCv( zXni_wUj%zRp7+y%;blAvVHx{3a#Z7VTyK}X*H8_JKMap->Dr~cYIk5-my|TEclHDA z2D#=Crvej|;z1v(b$>`)F9!(@Q}Ga${nTbl^AMo z(y?{C+lt#0q?W1n!E>Nfgbw+Uij7dW6n<;Kx@<#R?YOUy(>p%s^v`9pZT_WT1ztBK zCNe0SYUeUJ1UJdF(kP&dZS9^KW}`+GQ-^IJ=GzkyyN;RIm~&A9)VX%r0OA|z(NklL z`HG0UL;%%mnl*vJYy_xYtM7savT;ZIqzDC$#QMwE3=u~a6wN~4`o!o3Z~$p2xqh@~ zyV0NZ6EAp*sXN(!NH$wl} zDsNKF+9}Z!MchT{`>oov?=T&+3GC6?yb@AJaqX5zsqE&o-TRK{%QQkXwX>Wm6~?Ye zHg?B68%%My^8P)Xf5x1(69(;aDJrr0!Si>o0tkMP9$AM@5h$0avZIkNrN4D#TlDAm zG}nQ=3obvuCm21_R`gBe_qS$zL>KJbgImUy1sUzSyO-~5r*8SlP8ZU1Yv9Nhu1oi> zD`rJfCRqy*l4anQjoZD>6zLX+r8B2o5JTowHpJdsFc3isFkxQAB21hR?sd*Yxo#`= z4CxK)_AYNop3#swv2g*t7$)Q`w#z5*K^pOK-7fK!1{+7U>cB`Kh`X0pLJexHD^{e0 z*)nTE_8xYuvzz+`aeEmH- z^+*Pvp>mbYXATreICTU=ndm1gWF0&VK7iU+p{ zieDd&{6@zI(Vk_A0OGyJa#6FiB|=&`ex1n^q$MyD$o!?Id?L~&qo;Q7`qC`E?L&+X=hwvMkG_NN8TIilfHDhmiT_@y##ZE+b@6U z5H^M2HzLiq3I6YlyE6_c9f(9+-+S20T!Fr$F25=7D{hLn1Xh+BlMRgirSCY=N&;iYp`T?L*A4A_9XX_Y7 z{_3z(TC$rSM*PFlh!!Fj13^;&uY|klxLMYJL2{uiwXUjfjV$Z+HzIcgC63a8{1z$! z?UjX|iOMqqL#1~TMggKrWRGm0ntd-$rU`VK#T9)mNqOxdnYymz=c5lno}W6(sGL0< z(r0JG_Kgk97!HlO zJvpMK5ff0;gv<}UR6q@O=Vw*mB&c(yako-HZ5`lqULvFI)GTb6QtQZfJARx3^V@{> zUr*Fv)$F8YE#EW$)=*=K3wk$r69>t2?KnGO+Lr2zqG{puD!xA%j}wq;yVaB!e*lcO zW_^ADJQh-V07#ztn?o)C|33b&=R;)4e62Fr?Ot73Rb$LN^Hd!>0pqQ554JOLpafgq z1Uvr{NtYOo;53DjPWz@B;}q~dz}tQ=U}stNM?j3+jJ^uCa+Vq1Mecw$zwadMYES;x z8nOx4&n;Mg+q{>*p3pi~SG}dr_bx__qS+P@|Gf?B`hhO5*@W`@KB-8na3(NP+>c2< z)padkQ&rV7*y4|s0Zi>MXM>e@S5!>DGlnyv;dM0`O^Bkp*G+3TwB)rh!4I{~*7_*4 zPm!}914wLVBwiX(r#Bf?+|jRWe%@divh3*ex7~03{lOR&7mTs8N>6Jl0RtUuz;Bss zRIYG?%BaaF!!!pCrn~T*2=5wy=d9@V0w;^tujy^Tfb)(qX2-C9+0h?pjFNmjneKmP zFr|9eh+sw9MPQOxvi~K{#ogr=Gr#~eP8e``aIemE)$zUk+`au5lp7lqz`M?B2otBGHC7+RZZiIn&M9#Q+Bb2Gc@P$M*vW+Nd8f%;utc`gal2 z=3$H~Qbw1b=K3I(A6b4ATAV%hHiAep$8*!eCxz*pHm-bStw88h>CDnS>DKQ7u;r5T zyO3Ad!}OO}@kQ?ow`m;J+4=ASz9e2h{xDW?G0;0d=w}f*tMjJEi>@72MY1riT(S;y z#dSt#4QY+h*=koV;u-24in08m~`Ei7#lrW zU0JJ(purQj7ieG?rE%T|0Ihc20fq0(O@{XG9Oq;_o3=Ii#s1=8f^3&Y^F55-tyJmq zo{`6*+|Og%Z!X`}IrU0dDktxtZVN1@{s3q+J}^-Uu+!h}P|7g=y&o6%TiJ`U7+Px& zbwVhgQd7V=H4A6mmxCMptx5YFEa;<`_yOG6X_9aZtFi;14c75SrP~ay-#c&=t&Fm5 z1ILE7+ zUs`0S%y1%P`mw|_S}hgou93$gD_HjKWO=a?`~cuv_=C(337imJS4#WwEq-~ujbbaU{D2{mM|}R)@3krVOj4ljaWLcaG@hV}>8n)l zOmI1VC`2)R`dmsQU8^;Icc9*A=;Q$q=<^58_B?+q-zyMBYlDIW(;f0+6WYdQ=>S*w znimsF=B>YJh;QzcQG0=&|D`OGdW z`mLsf6Y9$5l$$vIMwALz`&-^`jW8CnGbfy)71hLq#frOb{}Jen`ssVl)d0nb-< z2|>b_H!c2QRX6{D2HJ^mAHupyDxtF7x)|C=?E7Tdck-7*i1KTZHO*nY`X9Qi9t%`S z52mRvj5bWK*E`K9YhSDwH?L;TPgS;_KLCCo&e_ur;z|sLR{pk%wg6*CuB}m;I&k#NUb|v_( zUv=QLniIrv^^PHW2Vs!inpbY9CP)}xoYEzOuKcfH@_(e{ll*D`0>R!5F&4i^SCm4YH-!8y^unU8B%e96PlMTrK%Wi_ir`P^U8d;Njfy z#STiR&R@^?jejAA*2chHz2tc6%5^cDaIRx)3bTf%#MSXxpFCii3xyHuXc6`rJ*WJ= z&zQLZVf#|IQ!V)^8kuDUSb9Po4%dQWQhylMk!t@$XNh9YuD8TUQ;9x`eoA=wS`1|D zOZ6p`Z#tVai)fqLdas=-$UFQ^f?Pn(lWO_uW7`}y!(DG35pp6;LxGAFr8=AIjaYEk z2iNc|Vz3a(<%so^+2DVR#1u1WL#>xyCziql)CftYlI)%gB5hJBD{V7f&774*b>Qta zZPrePWtr&U=0Dh0=*Wxe*gqPa`cNoW$51(>(9Ut#%?0+FQB_; zgm(uwGa?TFbi5A_fSt~cle-5%3=kZ6?Ev$ofIR>@t|#hz5{LC~w3p%hzK4MPhBC4r zLelIi%-*BbVcp!`tgqx5oh!hp`DNP~cPvyQVi&Moxp(VVk@P0n-RZ`W(Y<2bDKT+y zr?^CtA>>HZ_~R|2jibV@-wcw`#5E46PL^nm$aNIyw^gAgbzEZo^y@uZci z%y4%;Uu!yXZ~DXW_D+0aNYhGCYURv|e)`Lu&n`NCGTCxx1&ZNeNMO9|_ZPXvWn>l_Aa_6`6=T@~2Z z#_a-peO!Em740AqfRp5#~dThgrXmOVirRhAxWB24V{_Q+!w({aUWm zYM3)x93v^VI5PfOGn$ju3)MO5iD7g%TA)j3g+;$A1ZTQ_^~@uiBcnZ%A$HrLu5UHb zek_DcBjf!>5n6md@)QSB=Zv1irF&|T)#Liv>Lx`3u#NJiM)ehareY#ZEbh|hQQudn zeW4p6B`XI)gvlXFRY^GtBdN{|W|)D!1D*5<;#DnS#ErnHIuZVsVfmxz}r z@$bl%D43nnA^ifQ?J?^V4tO?WI`r{|iw9iJQA7g?O19%qOybh%cu@iACbwG8{qd$x zI9g4Cv&ZGy8r2Q4Kdc{z&A+jt<4vGy6kL9BPHzHP0Z=VhS9F5py&Nbb-N?!q+hR%N zXmXtru) z&&m%PQ_glB%&~S!N!0RFc*N>PzCRVy3B(l^IT~T@`%n4a3d!h=blh24R)Ye)1okbqT0gUn2e4?!R)z^;GGBX+Ar599`>}y zV3-k?FXiQx^>F|Ajm+FxCJ4(9>!iO3a0S};r>dWH!(bpyYgS^!LKn~v&ojVw3}2I1 z=?b*(J6L=kt(pGDz3fO|UztxO;jr(pG*lCbgDx>tmTEQua66@shpwYzDC?Z!U6;`3 zj67e^6YgI!A`O*Qti1NRD9w=E=FmG)P43Ou;HFo>;$BFop~DXPh%3BkN&JPcE{?Fb z$kTdAduni^cX(o+EQFkxo}lh2DJB59QXMdeB*E$f_jX!c3LajnVKqdlhp2oZf0dv} z`{X8aE%F38Xwl@OO~wS2t8xJrsf$_&i$h&86~c>GiP)3Lcn9mRMawoCFZ#$t7)_IUgUMRG+G4|osv^> z1)8AfkOYx(JH`iqeoH!zl3YVwqvch8mGKP}5=v*b5v(Fj7h4~NQdsF%ZY_GT{hk)? zr1qX&*qd0C8x~&H9pX)Xiu)9aDQARFvsEI;P|vdvYgp=OO82~3C+(8Hz;|8)5w==e zwOZDrZmLCUr^x(-S$T6Qs9!H^BjAOe;sapgnCpt-R((2t_9Z+y!0gX^D1N-*iz;O5 z>~VUV$4AmZdn)jR2c9%GE@KEu%36l-iglwBvhI8y`8x+$qy(!1zenSCbB~jTue16e zbG@G@tISWJ-|WjvveaYejf>P%=Ss)& zY&pK-;L9-k*E$7DJ%Klkq)!!231>t~39qrbJn(Cz!s@^j#R@XOA10BzMa4VGS4^4O zZKKrJF>s?q27DE|qB~ZGO-eGuqi|TmXNqMKO}H;>W|NjN8p*})01vy`nnp0BzTWuZ zF8s>RQ3Pr;-zsfN0$N*=>wCLId3pTapUS`OpidklTiL2YSD?3RVgIDq{AuSj|*}q1}+BLz2^(7MaOVxGjfY@wig1oOD!tqhhP%DE?ERe z{&V0H-7s=mAa}qwGAY=QL6e;tR*_( zl{Jh{>Zz@3Ls$yVOECQIs1>)bNx@O_m4cx8xMHr}*Kom0A(9 z3KV6DAAvAE)U?|3?Ap2_nM)u2DJKPC2QJ)?`q$dT)RAD)x9Nn{=SK2pv~|E90?S*s z-pTUzgK%kT@#R5a&?5oA8rn+OgsQqhzB*uWzw6NIJ6TvWRwj_ zib^`*>jScS0Gvch{-Y6ap3Gqz3cSIaQ>wO(e53AF9X3Cd`Geag3-U>{ZvJi2`1H}3 zeNrWDO{!U@0{0w#H65D!#3TU%V8-B00Wm}ElTu4pSMAKo$U}ZAM3@p`>7WnQ50dR6 zEvtfLv`?Yx(u;>*hkOfa>w<=9p-(%iCj@+=?gX1iKK5K*;qT1|#(zJRN~U9B=J?pF zqU|od`o^qCK4;9x3oq^hOUzHp=8n&UxFBSyUtG^^IE_>t?bEX3X2!PTm*+}o>hKBsa>JLzF5cj zF{93Vd`_XS>`%D{FeOyHS;{Ig7W>zMp_jZF&(tO@LOe1qah^s+P!gWh^^9+4&9UYiXz^OObDjB5P&hZmbvplE=RgB9tcCl zCp-S+DZ9F%40(@R!=9l>!3=#@DB&nK2=c|Fvit~BYDNz5xFPYP9+Z9JV%EWQa--V( zzGz(K?Uy0s<8HXb>SULi*2ed%(b5zVV9(?3g+{&vGVX^igyrLjEt9aN{)|u#GS`PHG<~7?waAR2z@;7 z7Z;x2nr8f{A>9Fz$ycS$#n@$qruQ8Dx3Aj+)I?ZL5gskFu+qD`Qc!}3KD|>DI z5M64|Tj#>FOu6#lB2H>sN^Sbet4Ju;JP<5DIEcUHK^W}EX57`Ng};9~_pV2x?Z2d-_}v2_ z?rX=Q!=94jKQ_0ohm3#J5dYQo*EdeW^GLx2`Pa`;Qa`T(L=%mS*Y1d~Bi4sH2=_5h ztw<8QL=AZHJ_Sud_7z4S07Yh_vGo)y_y=R2K!r~|6~W3XYu@?qa`BvTRVUqtJ-j6o z?Q*Rgb@Ui#&0b~u6PH}k`IpW4#CK@lkm8f@qel|U12El)wB(-161_tBdqFZpj<2DP zMi+o?R&C%UEP&8Btf^~1DoAg4j;c>bWYV;hR@gS+B|slf8ItHK2j z3qHH=hj37kfEdY~{ht)ftD*Kjw+Dd9G|q=)2U^~npr^hjvF-H}kI-pOabz7FsLG5C zo`#NiiIk`eKHTa<8P~~Hsv}!c{I*H$z^K@^d7R@FaH_+=v%PJuJn<1Npf-N>~2Hw z!K<&2dJN<`SS;Knh&83zRkM+QqKaNKDf=j0S8{SW*mGqHrJY(m{mlQ4CyAMeabn;b zW#WtgH@Hk=?D)`jS&MY1U<|YMU&`Q*gOkuYRgv z%1!B@MTfp2eCc~MvRz{|YpmRIn~I9!1{K4*MeEDU`K{Q5J(jO+kyd#os6T1vT9`ye zPf&#=@Lm9#A@ZE!17na0=MWut7;$9x)4Fl~Bh^>cu~QMctCrBd5l_2;*RcUDvs%MT zOKqX)Gal+?THu@nMKW*+s$voUkx{qiIPH|}G1Bb!53)(0vgi2{o&n^aO$XA9xw6^e zbH3CtFfcGw+A%O#{A$Hui-P>|Z%N8L6tyvc>Mvl6|VFD(Kw+ z@5rCoh@XESn`)8$@zEjsc1v@TSz{=6fWOW_aNQKb zD*DRQP>Mh^bR;C2cfv&=utap4$;8pg$q`K~)Og_r2YAc3nNfW#gZL&f7#BnM+j_%! zoBF8U1kI%D&C71+|fKuPTwj|vBz$H=Gw(|X{7DzU~ zvvn|$J|lA+FE_66Jv_UXj}n09Y?CF){_~^`cogpNb1#aHZDe2oL2F(P9XTB=ym>y1 zXg^^8WsTX6y|T90n#<4s)u{h?Q5MD(fHmhSC72YANn}_VbZx;#_1fCwaSW`$`w6!^ z#|G#)kDdgxs3ea;n~8kYMScFd^m+4y{mJ-^d1KA`<|swiPe^P(@y&V3YVtRwiDCo1Ad($E?Ei_NXbuBG3L3Y)M(=bg z(Xh&~>HPy-btj}E9c~xd566e8)FQAKnvRaNEOXn=(&7Ee{MoMgpRPGTzd#u6FFZCa z3!fHv2J|1wZ!Sgq62+@5NJ)5VNV%0H&E!!TZrD24VbEhBzh6A#nM<_a@#jwH0T70- z3XkBAJ$nFre`&m7*p|mNM|%^tM73`>v@a!UZO7&xUN4x`@!ZiE9O-!liv+^d&EUap zsWl?V$vu%2G`|-nuzYN+b~D!GC%>aQFU8e__v=8!ucR!~ulQl*^<+n#15v|WCB1A1 zef()G{8fiFU4Oo~7ovXY^M%EXpQf*rILZ$_?| zcP3p*_v7glXX^P!muU?75tJs1cl`i`6_Mz#PhKR}d2F|ZIp4;O#QY)=+4G{HI_~An zHn_bpe^kthmut38Og?I7peKx1m>}pYZnTGw<~g)bz24N{1! z2)c_Db#2E1O|z)tvR!RN(rIJcG9c&e^H>&<{e~9k6YD4nSE3z}X~$YMljoL45%=@T zpzp_MEf}8&uQ3-E+w;!yei0qWQ$_<3HR_v>&C6G|=4<0Pq>mXzBeO^i+@XpCW~f7y zlN^Q*22Ona9f9nw&5EPHMbWje#;a?^*alzTRF_ zU&N+zTXasu@|;>dV5QYr5NSjKQLeRm0!o)>V61%Uvk>s8YyL+HI}*o;qPzKoJ@@PL zxklmxvEMr+FWU!#KU+bh*L*U#v}+anFQaMiOkDe(zfCd*q`xu$h<M45tR;y_d{Xoq zGmTJW?VM#pd2@3o51yV^a^p?sn&j}k!T9~Y~MEHQ({K>{n9n1U;0sHBpC?P+B<%!vq33V$zeR`sp|KF z+$aRnzgMeWS_bSS_-k?y>7cj&tvaq2uJObZPm3*czsdfs`t?8hCqd-;dv)I7Pk25L zJ+wrRxeEX9^}xS9TYXG6FzWBsMSp*GawI#dPz1FY5Z8E-mQ}PzriwDy6YWfZG1Qv$ zS&!MMPpTlwn$jr^9wH~)LW ztmWeGd$F>lRsO^o|Fu->k}Uhq^PW%lrdyZxCpe;?Nqjj079s#+T;XY)X>vj4rog3O zVikFD%nflFxfY1W)A6uT+!Ul`6){wMBA`DJOklS@zb;a)W*oz}E0VeFNAO>Oc+7?X zIAmYuKj6B)8ZG7@G9oax;J@R#zA)~;nF&cbV8yC?chj?1T-T<(uLC!_mPP)mr+;T6 zVEs#&Z_sLt-%2OgaUVwAWIrF2IEcU2kg``NDVUhalUYBun4h3GOsQHUCx^NGJ{HG! zAT?{PA!C)9gOjj#%*JPVWx!+?}Ljp4Y` zldhsNW4!CTE*MLzj|7EQ?DiJn4<52*LAHIQqJd4<3e|o|mO6-3_X@eLRhnk+`TUy) zfZ5j%&uK_?0h}$k3WhB$t~=2)9N@8|taZCDyH}0#7ujRUY^4Y1&eJMFvHm)D^i|zBJKV+KZ ztSlZO1kkYNGAhXuX(qspRlvV1&ds}b@1k9m2(QfW95>E^MHMAY`oQy*aJ}ez_3#Uby%wg*u?H#%~&>rs@E}>C)8TW z)wXz03em4plOuEDjJ2?b5mdFVf1J&Zbw^28BAX+NH{TJvub0`ap!>4ymo3Q$EP32`h zVl@y4oOz1){tA_`boRL1>lMHidfb~Lvvsko($|+Aki)DOVCR)}jnn9k^L*E-x!cNt zv`FSk&+WhJ=HK1__kd3`pnXNJUeoxbaT;!hTINR9$oz#k{Y?ni_Q zlXyEFI=4s{cQ<^i&1kOHjU(7tpHe#J&#oh^$D=xP!4TyBEo44F8yj0qe>@nZ!fi+# zWq-T|=cDldQXzl!%{JmsLs;h7-<3)AvLrG1fRcof$J!y_=2lD%%7hki{~$miOOHCkqq)lAm6g{sW-DHQ;#4 zw9C*>Suf=NdBAZb*m-ollDXraB}2d;n6;}YOQhZE@=x&kk5K#HoRdua+TP-S?Q}M@ zU4LGWl8zOJa=ntutAzu&yR=SCR`_m?OT7FaNSQ3a!shlUE6mj<=EX%g8B@_Yn0u zKFHqR*6kbYxre}Bvis0GD@t@!B6s4_D|7p@xq0qJEmhe+d8Gb4Cn!i=OMa?nr5_&v z#j01b>i#Ll#s}JY4}jNM(nh$N(06YSQDN{Y(4dx{1rvSoOL3Ebh87_2lr*&f61Qj>c)M==cmea!PvB<`YNtxnZ9O%X0&L#MWv4JL<62!6AcCSme8}zs)Z7a8WhId)To-f$9gVNqkIJ|iufIoPvnMC%A z?MKMv?3|(QU`i!$dre7$#5|3}W&n&c`!AC_Fd-RqKepircv{)RnSJ4#&N zn)qWsUanwic9oej!KUA#-cWlzxtKUKoloD>it+yZ{l*c6D!`*per<9!kaZ2$;hDm- zFWS}PQ0DqHL+U%DW&?x$8CA!*eFSklkkdt_bjdV{n$;!u{L>us2$?`p%-R>Ksf!vZ z{9oXLoFAC`hfu?x&XFWlQjFE0`=44v4SgYhW(E9wP9g&)r!oP&XFB5du zWKKnMV+&#dWy9T5mRwj`LADGRp}q`+)?!<&iV$4AMQV;&?f_ zr`cv%hF@6;@?=?{s@nTkjQLFkh42~H*8Q`v{`0kkjVLT5N1yzp!aPF$YL*!~>~&cS zi5x7;Z}_Qs;wIw!kzGv$a~VYQ4m{%5Jk>{#JTT6`#qseZTy&~GyuQd6KVPBS2Sb2G z1ITXR+jOz%ACe=mvYRH*5NC@0=y`E9VxTDVIq?r)QE>dvx-$6L&eK3ek)Z{WPUlbkDvd)Yw$Vk1uAo(~p~WM$=#Sv_I@{(HeJ!Lyb(LAz+G z2YTM9aSr)bdqn8cBJ|apcWG1Z=mnowF&PAi7Tgv3lF1d%Cbbi3En=r10lrZp9B6Jd z@>wV%urJk)Cv(qec*S(#HM6dgkrA)UWL-wzm&@MOgDc=@J^&QIyE4bA`87P~6(=f+ z7+G%QB^`P%eSDM$T-b}?)A)}##6L3*QS|pn-Ed4)MTt-Vaws`H!ikaJx>PhZ)z3=m z5uhk+omUe!f*?!Rur3#XJ&jsjY@LMxC~ou zW0IL58JP#P`u-5D?pOE8Dz_OTgUT&dhxK=ukMPH#?^BCS=FhY$VXcMVNu;FKn?FlD z^SC-X=_lUxb_lLpk~HNPOin)5#<}z)#-L6`DsUxfh}Z3}q4C;R)zBDElIs<%NnSt) zXacYiz7f@_>Hg0O7Y-@N8>J35Z_BN;+(x0kjZJ!El~^nf0IweJ2f)#|D4Q=2tOc&O zjrK3T3OUDkR*Q4pGE3AioDOH0=Ep*+F}Kg-NHi^G~182J3B=v z&A(n$WJyD0+gnNwyshtF7NA1T}`(`c3keLr=m|{P)sD4PJ27#8YLo^{MQ(tW6^C5#CHa0Y-wk7$r>4YJ{ zex68)!vJp-V#+g)w$?;Rce&67>OhND9!c8kJ|LE!C(KW7t}gY0tF|GQLmLBEVIbv% zSZFq`F*hk*QSWKI-3-qlnI}2 z?3W?ow)a!*uZ_`u|I;ucy9H2^wL=76zVjuP0~%5Yqvn!#e9pXqfQ z5c3+s4$_@DJZJ9PePSvxA|-ntpm!KALtC_qilQ~J9aEy|yhkPJCtK3UG@L|3C0egX z4^Z4?EzeEi;&U_a_4<4_<=D+t-*K(=0Pqh#1{LhgR)ym`vP`NOy*JA(i@t&{^5@_` z1JFNQqqgK*8qTuD=FcR0w)6Th5{(8pik^$xm#aqHW-KlB zrLJ+XzKcCm^E(>^>a3EZo$YjhH`?qy*}4S%$!ggg>>pK;du+=~mIZ)p)23NuT_lFr zKaq;9n_E?J&PyFij>dCQdi*=GNLZx|=Q7|BB}Q$F6X`ihzxieOb$C zw;8B^<(i(r+LqLba26yWbxeOXEE{ez9#gLUwIcZ|1@r2kH~S*{X^+|rJ45x=zAi@l z$l28_+sVmSXu(#QgxB3@(QXR^0*1WHmun`Zq~m?!Up^Lx;=^|D$2xE1CF^&kaG}5o zPxk|ZDPP56ePiqSx_JI_+pkaQu+hMkQbO6gYy&WE_Oz6^3*eDbX->gjBMH8jQ{(sK z(>!uYY~UA1B+2WY$isFNJ>Wdd(5Je}BA`sy zlV;RZVQ4Lw);6S!SVc3(dGtLZ*)~-85RHnp;{%LJwZJoS!C+e8rao$jO|@FrV$MXz zY^O-wLlA>p60|_ILoTIl}>rdhFuiVkfHn?J#hi8yD^5kVE^ z{e&Ht;-bFt1jZ^K?@^rtK0@~j+}~;Wesq2Ue)~meN`OAWEH^@oj}Oy>TI4Xx6Vyt^NUFEVI9 zX>Y?b=C7!D$1yx6;UhZ7{&xa^SbI@!wDN2mG|3rD8=*w)hiW6!+StGEtF{rt)RpHl zx4^XEfUmkNL9BYSJLMS1H`(m8?H$%Vq(6%98S)Aen}hY-UP1qj|BD_`^VxJ@x5U9@ zNoESDzi?LGfglt!+XNe-4?x{jp(f%Y_I~TfFqp$*iJOAHZRR5Dzwj~g74*%&LD=k0uX_Bv|$0}0U6%|bqME5Oy z&BIr(-H>iUgWIXV%ziSdS~ z=HJp;$3o(M>C?T>q5sC+@mGfAe{+N2x~M}&LJAD`8yY=SYWB2-+}x30%Fvlxj>`1Y zAuT6%wu_9lx|ln;<%@S8o}zC>y3X&a()^$5zB{g|bZa+=2ueqgUZkotK~PF)(nO>; z=?X{-NR!@CdKUpHQlQbGwJT?OeyI)vU62oS1w>$x*$X3m^4bI$qhcmK$5?50+i|C$FD_^J)gBmf7yhG(B062kS_%I|<#|W~eh62z)QFK_3y^XtE)d(< z>~~oe7#bE##RzL)FF`|?sr=;+zkyn>*fz|YO$H8!QJIw(oebX1ID|q^o_y0TsAnr^HB2eGD=Cr14~?L?${`V>aGZ|>zAbeKnGB0Pnc%$Td&26L)o5#K-@*!3N8 zwykDB@CtA^ITk<7-S2Iw7X3tq%+R3`LfZsm_um`JaE-fOkj>DZ)7k}}D(1OnNTRQz zdV`m0g7slstb{ryJ9pH&U~>Q?g9O3I9E!2tdK#ouIBBW0*r8;m=7(K9%-AcH81DX( zZ4Gtb5x4GBq+nSo1{G+?TbTXc@&DOp3N!2SN`J8&A$W3;+IPQGe)ZoD;{bn$+wCJe z*L%@N0X?0avqtASU`r>DP%vEKxL6}XR21XV%*F0x&_s$KiYbY9Z#iO0<4v=nCg7t} zoVMb-s5dnl*C4J-9dUB?b~*ao(s7FU|Zd3aw;epNK*@N`Ij&Un3>FjSZg&4$EFcYAMjcYs50n)>uv8#>m=93z=E3S;H5 zE_{9|7o^J-iV(2LGH548*wD4zEPNyRc8_ZsZfnJkF}$p)v{Ef2PpM7&^Q8WPwTt|_ z>(aJAtJF?R6}D!LS-M~+ zNdUPI^^>gwWPo=Tjvc4hYwRy~%5}^Wm zZvVYS`sE%^wm=};-lNpRBW<4{Rw+_^TE52m*$`IVSu9-5%jB>Xe(O|Vra%a1y8m7` zm9hYi^e3(?sB+5;d8HZ+BsC^EPtnb!-Mw<+<-|o)+V%zp(3vJ?msE5wINl~_W*hO%VMAvZK;8SUp^Kxpt^u-diM<$y3rsc;Y8lO`cEFwN>;;bi?kgU@s znFrixC{DIYsVkpfH8Bx08PRBwU*|Rbkr&T+&ZsySNVaF)6abuLUU}S4e*4E(!L!|& zNeo?SLiIj^-XnUt#O=(u;XRYmp497;d-(}ZKNhxs8e{ZVtymeVaWmnDjKH7no2ZMHb&qy5m6B2cRb*yOneJv}R;l+)h|pe%sUScnd%E-8W)bn zZW!W&y#^Ov_;E7zkPkd)9%;O`POayjEXgz|-xF+hY*l+c#K#wjSf<$*VMvAgSRwhD z#23sBHhuAo>XO%)=#l##F>`CRfn-dbE8<#w@Qrh^^%$;9pMw%Qx7R!= zQ?JD{aB#EodhyOtsMYwVr*3R%P?0x9%%IuvSbrw3-aI6Rm zaP1KIz#MFlQ}HVO&Dg8_g{_u|Yeg)-OdS8nzPW#?fv-T*2(M&C0ixmlW1w*K;?F$w zzm8N(W~N*7S4Z_m&xhIPc)n$W4xi8L(}~C}v*{|eHV8=?pc&a2S9YGYvUcUp90>p? zba=(K)?(=S>DK(HY8o0wzVad{M3wT!ZwE~n71HZ?S?q``jOw9E^if+yIn#zK2DJSg zm1$3=5}=GmF&8Bavl(`qsX9H}=Q^YLe3a($(6SGKdDlO_9=K!45`^&85oK{~xMe)^ z94t|^+IS7^R#7A!=Wjc$U_Y-%I)IfmP@oT?+h>&>1VVIWVW_;9WFZWy% z#iR#G=UkVEi$=sgqu!SU4FUfg0_RST1aM|rff1<*_e$M0++No)ALaR2QtWg2!OD^T zrJ#e265-=}@zWC_;wks@-QLm6gPE$nU`gfBA!%s;hnX6KLhBIDs*vl8RUuE{77t%3 zRCl+Y52Cy&aq}z8GAH1gZJlpVHl>Yy$+S&r0mr5;C;x^|o716Ln*I5tkyRqN=G49C z#NcMxrrPmyXVSXSzgI^Sm7=~gQN_rnXd+kPIS{+Am+yx-(-|(jltmI?R?EvJ29I{- zm5DI}0%(Ou)cVmkkl5OyKOd*R%>B}NRT9lH?g}EYVi=h6eTgejM#iBLTgFK=={1Gf6i&j$LLakc6EQXWg3V&V>? z%frWB-dzAGEw4_DRD!8yBUAV~!@zgHfoz7KuqW}xlbs=B-W*D)OFZzyMdcR?M=NTh zi5KorYsoX%KAOKI&ism0HF0$%lJ30pxxfH?+oDg3Q{h^v5sR_YR&SUlHo32zXJK~q zI$DB$BGQbrh<^AyK3-Gf;bhB3ckQ5wy{dSy1$mL?hdpHFN={@j@PxkoXEl=Frj@^a zj}v-oHn>`_9h)bXbLq=bH1Lq>{+ZuA_lrg(i-*5*}N#rE|M#Jud5{dwA3(F%Jka@m}^-z!d*NB8AFFP}=uOlD*l;Un#@l70dl1lA6F1Nq?^?%!Hezu}c z(VSny7C(RUFMR%|Y$jxDj%Q=JHepMa{@#rAEh9kgg!j!e%f_^nZ4R6CqlLi}d*^-+ zpYb+-Z_gWsFr>4;Ol(K>hW)@m%k;Fsi-@0-e-x}ewkDw~@U?3P-jz>_ExAoz5zEU- z*FpizGT=kIXJwOjRQi#OGfc1Kl>93u$QYP7m^47pOx-H)=vlZ?$e!?39skaJCS@$4 zho90MlV!H(jvW%0ZG~Hc$3+l5{5QGHjqR zl&Fc!$Db>V&-q9-V~L)!lSonT$lu6I4+^3LT>#Bq8f%pQ48P+r2GwcO6o)*k4t)Gz z&O2j|mr|D#=O+*NzhwJsfd03){`af#IG-U|GuSSLcevb_8d?FZ=94Cawe?p6QiBMm zQj^U3r&q?LNE?nK);R3rZ+Tt1p>mf`%_8dNddg?xnZ@k$ril8Ns$Dw~Rq6(uU9J+n z!V->)eNL@K%AVf6%SEF)$0Nq)BCbK_Z^Fc}*|169B<4#tJR}9hCowK(P-Y}o9~r^X zQ|Q?el3Us4sg+|~Tkuru6I}Mu6d&>OUyOJx;mW%eFUE$q*Q<0u3@(A|Tb^9&hT0nHQ&Zg&_4Pn`Cobqu0KdQ~|4V&S ze`egTLFM0C&hMlM`JY(ZFMnJnh|rJCqFif3`}S9&%8s9hc$}1f1D(6-A1^fWb|{(M zsGib?kX|xg0`q*izQ$A4uc~jFdGZCLaX|4ABkXIXvbfKqxA#d$slYQ53rb@$=0>9F zX<4)I1dZdVChk~#l6&ov5sSg}+NAdlu0e-h>dNB*d0`Acvg}yjV#9#gy{_)@X{%>$Jz-ay|ANhM&g!8npq>q6~hS=nEzW)@X|7&P|t-anU ze`l%$T&FsCnQgrjL!~j<3`f_t3dVa2V2n#qZR_Qd z-acFS2GWhGv7r_GLaAZg0fgx4_?aGIr|@~|;4)IyfpJKV)HFaw6Q)`bUQSZnY+~5E z?iERVTSPML-8axk14(73{DO^E&JJ+e6@Qn9`KxRC<@Nm!?Efx7licXbzPEnyu!9oJJl)ql&m$0{=CQRNrTty(XOfdC?07GGqG%u zqF7g9+BIn77}Kj!(MqKz1Y74`=hJj`d_$<| z$YHIny*ifC*{I!<^`l!L#EQ3>S%a>eSxcq5E@pp<&rDxe^upq0xqgwO5>V@ky!G(+ zQsGaC08~!}Xv;&Nl}YKq!>?-Xfig#hhxNE;VVKu@5^~=_UBeUaGxuHEHOF4-j5x-= zIa~Y&I=`mWlCY|-Pl|E$RTAcCwTA=LzY3+NwW z0$HQg$%AR~$0LT8L!0zJ*#WtkAb0C=-1CyS8?H3c62&>0l}6hukuAqVWuA7S#NbB& zk&63Ev+~49QJA4P$4cGFgq7VWkG9fE@qq0W^_E>__j3vXNp3)Q=NhDE4;ED?k=Ht5 zBk-w6ElHcK!z~FnMpcBXZaEMGQ@#1BTJAez3}e`JtRjgkvDmFHCx(cj^s8Fpb;~3_ zV>PHM60{Z*U{~t5%pCFx>>!0V=nf+Aim@ZJ5J~>}_^FPSjX{A<0=BKA<$?##7E&>9 z2wO)anX8T^UMVp=dUW0h=ZyU*b#N-AS4+(;qi17Shag+~FSO(GoBuDJ&_6o%?>eZT z&Cp{xde5Ii8GXr^ur(nM5i7pEYmXZg8Dr#RHQ;gr4l-tU*6m zzr}DfW@eH30r^R=5`MF|cwslt?&d2z6hZiT2c+yZTO^etyk4nWp7uifQE9S0&S=U) z-wD|ug@ryp|C2yN&O7P$QUU7ztlX9TK9}FFSW}FQU+W_xiwv4Pcv^slCPgqRNsLjH zh(2x8xs)ya0rz`~C-V<0y}!*;|A*iIEfD=ngpIok!I2glnQ^;jlQ!h)q5r<{n(z`6 z4wDt2Wg`X6F$ZEHWt~>o-Y_+Di0PPsaX8;`W~y`;U`9z0?!2sAz|d z_sqyqF5DHG(L6oeS&@BX>>EHVuXKv}Bx3$Zr+q~et3L)*qZEEdgnk><{x5w0k8>rc zR;%uX7GF!jx$e{#yB0*ghqP$y)6O|#V>6qQ$Y}Y7r!$9_AdU{o)W8kz3;6&3hX0dN zhw!9P>wctu_M~3--Lz1=|= zuLkA(qeVrTm&>76odS?dGB7#Po^wW~{(bG>cF@Gd9lRX{p!rcS>rr6*C|vkL=!G&Q zEMiImFWpmMGWa=UYDvr>R;qK@HY^Rdsrr~|KmF*O@H^j+!VZjWq{P> zNh6zS%Hi$O%dU$JuLeHcPUsM9w@7%}VpM)nK8OV866d(fkC=JHD zk)MQ9S#7MIIN!wL1l&gIYbAtqROewLc|XkNKXi?MnWgux-jR{UYIj4%Zcz=d%R0Ly zgtbxBEW^9Qd*`NOEUxhN>-zk#rXMD~Bx6=ZW%a|FJipH|Fo0X*PY$R`aByj1H~4)^K=IlU)U|a|KWTj#t3#Y8(;C&;4B{+e+?n8(pqpgr6@klkYRrOT?>yZoNB1x;3 zkZ@XkWgoAQI@DZXyg-Tv~+^!s29TRG2EYkq=st+ z(huqO@z1e6YOAYyQxNd1;lZ>t>vP?gOYBKJ`GUuBKt``>AC~q4`)_ z6=ma>ZKlThogQIHU4ijSQe1r#2g5%kMdIrj7( z1cL-c0p^VNeEI-_6uEs4B4$~Yr!NCjJB<-qFC-plF?VbZ)b%UAUAXr_;s&8Za0W{s zLSPP3&kk=G!T8=)UfnpEjl33@zn}*`cOLR-K4CMCR1W1IjUT=x4E$f2O2UKT%33*h zH-~F+d>fljoB}?~?w^^}70-fk=Nc?W+x*zj3iS}i=;?BHGjaCU_a8^&;JT1p1V6(Z zK+pb)u>cr^$V?cMa1%-) zN0!5cq-c!R{HW1(lJxiXB&aMZla*hd30j8b_pP%W${eOW-;}1CM{cE2zi=fs*#+?a zrgwZ*Z3xnRM$5qAi?|Z17C{F ze*?jcfIehGuzV3#%>Yqj2=Vp%2GXZPxcOOIsMMorojRP@Tm}PsjQ~Zr7E&ZLtw*Tw z$O)hq81}T%ZIIVK_;XKltfaXhI>4pV#J3PvPaa!(aFi4c=m~a33$_|r8VjPgG}VM+ z0^^ACodreo z{8E7cr*+LlqGb6-WttVop-C#-fuK=HyBhw(DD+W#aZ48`y3fO9X~JLOEPYq zq(^EOe<#hgw9{tELESNXG@;iFBHl3~DLCYJb;Y3i&D@3BioV6fmuj0dmp5fvc5unG zXts!%g!_fRfyfQlZkL~k4J_3*h1^Wdot9lPESK-uh;GaNh^I<|2YS|c6+P7v?U`$H zC6#`SiDd{WSQcb_gGZXr@Y!2)Tq2xKaWz%$J7-t+QyYns4H8sq0r4mQinIp+@6+aN zY3p@|>V_NGD&lkIhcgb;e)jC9`-31}+XIEcFTqnqHDoC`x}e-98oXYU4}P=`0LMfN zdv^()GzONxU3*%|b28Z>cDB;=;G}K2KxSK-@f#=@;lu}rnPUBQ```BOm53y{RojfX zdQ312)&-DiWWq)ngFQ!IAf#YZK61lg8`x_9s)}&xnBmv5&pjW`y{!;L4|^OPyR20H zJmuQd6`vrFU7V=uCzU84tP=Tq-Nm`8Si7nfqLsN;vhM>z9RYQeRvWIbXa5 zCQ2vDc!kqy=%dt7g;t3PMLG~E=Tx0Ia8%CNDF2#<67p>=SNERO>r!;qPS|!H1WKB_?q`v}4X~yA zbV(IgQUHTgQ|lYk(?Te}iv7%0sLjS7#eiAycG2Ba3%BLRl!>=`f$J8}axM4=INm(c z4u}fs{xF;2@eQ=DcfA;UtNqA+CJM7je;+=?1J<~n_;h;H?D)E~`<85%?|hUOX&%so z{DQ4bk{C@AT88y&;dR)k6I)Hz?O1$d*46vEbn;QU(`c+0Xd6tA?2@AM@RBeXxPJ9; z{CZZxwmj>e*7^{0HY0ZylzYzq#kLRI+?}eS@mv1xt{e-iw4XbAK;xu7c+4@7s=q@0 z?|o#7Yz>TGIIkKArB)5S3~R4@P>y$=LO-PjWX>E`X1fe_a6v*Gh(7_{@QE+nQ%hsm zOaza&`3pMn!g0)7Hif%13sK z?25oHZU|eZx#pS)0Xq1FA77u)n;YZ1s%Wa2akeJ!s@RR}G#*CM?&)-2&sAxrPv)K% zav$6K+8%Find#^FZ*zlWPNLQHk4Td0xI!zZu3PNlC6>A!qoXG%`TQAlgMa4FQuY4m z!(k|oSnIkUbVwVPSTMv^d9OjRcU1EEKpov8!rE1ocec6;6TL|=_pE!#|}#b9%0AIJ8&)H#9gV{#(jj*!PS8UrUbmf`^jaD3SElF_pURr z7YSSx!%d`Fruo#PVy%XnF-2QQ3JnW;dps+XHHsnFvabxJ)o~{L5{wXiEr%D(Hyr^qZ%3OLR;@7H<>*L zm`?1C_s+LR1<&qgbT(0`si0ybz>3H>myX*~wGC7O1-4j>j;#+BkdqL5;FosOKfM+9s z8s~;tzwmK`l}e^cQ{NlStH4q5Ad%xUrsh^pf! zuOW#kmaz##I92a1He)2m7Wn*VA!l3zh$n@%j?MXNb(3)oWtkc5r_0cFjkr@ChAsKHla`MuBm{6pc;`!pl#(mu(IoL>GcK5^jSKJ}%zoRJgOE~I3 zw~sKLbwBC(2HGc+I+g%=%Tw(#2O{i?Jg8?^hlIMkZ5A`zRGzLnMzz|&73Lu%ei|le zPtf>nNA7LJQmu_V{iVDt!|GM(NiQoZtEXnGT**?vLjv7}D zw>YD%s;;T@G|@E-BC;cladadwt6A+(DgsLZN}mKi1gPP~SL526pV$jkbGE3N>_Qi{ z4_{+u)$yzQO{8WWB92C*pu)a%1VZ7$VZ6lciEVeERKE(!3ejtgdFWRajnXqfYa1}` z?G07m@_0JFg;ZWG@MK!0eXQH&vpI1fc2ouO{z5hDk80d|PQCx3yf5Sx*VsO;o8P3C z$W#;%<1wC!LX+EPDEGLT$yZZ#gHpj{(_cAurq=~4H3SDiX$%MltLO3rb=)={3z$=zB+rN)-|RqKS-M-ipipS~t)QC)TwLdOK&vLBGtS9_ycbH+z$agp@1O3ogwh)N~2>yV414qHjyYoJSyj@ic1C(OKGOm~ z(Zd$BNZx2NR5s>72sjnUTF3b&>%7C$7<%*`PpgtVMvO==r(c>OwABG$ZPuS4Ki<^? pu9cEuWpSQ0sq=H~GK1BciYw;7TPpjx{_$Tf$^AEu!~AXR{{ZoTn%w{Z literal 23914 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 literal 23937 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 Jm5u%Xn*bR!aJT>f diff --git a/docs/source/_static/publications/omnireset/rectangle_success_rate_seeds.jpg b/docs/source/_static/publications/omnireset/rectangle_success_rate_seeds.jpg index ff2d237a327ae514dd87d12e3cfcbc8895154f47..21297570e71d08653d28a4c18c9bbc6edfdf9a2f 100644 GIT binary patch literal 32406 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 literal 19582 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 diff --git a/docs/source/_static/publications/omnireset/rectangle_success_rate_seeds_walltime.jpg b/docs/source/_static/publications/omnireset/rectangle_success_rate_seeds_walltime.jpg index a7c7c0e184d5a07176490bce69455e418e6abc93..bbded9c40a257ff2d496e6235b0205f87a9b6ced 100644 GIT binary patch literal 33091 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 Date: Fri, 25 Sep 2026 13:05:54 -0700 Subject: [PATCH 06/27] Fix sim2real and distillation tools on Isaac Lab 3.0; drop 2.x checkpoint 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) Claude-Session: https://claude.ai/code/session_019ogU9ju7PGwhFwKH11djAC --- .../publications/omnireset/distillation.rst | 64 +------- docs/source/publications/omnireset/index.rst | 4 +- .../publications/omnireset/sim2real.rst | 151 +----------------- scripts_v2/tools/sim2real/align_cameras.py | 2 +- scripts_v2/tools/sim2real/collect_fk_pairs.py | 11 +- scripts_v2/tools/sim2real/eval_robustness.py | 5 +- scripts_v2/tools/sim2real/plot_sysid_fit.py | 19 +-- scripts_v2/tools/sim2real/sysid_ur5e_osc.py | 23 +-- .../datasets/zarr_dataset_file_handler.py | 3 +- 9 files changed, 41 insertions(+), 241 deletions(-) diff --git a/docs/source/publications/omnireset/distillation.rst b/docs/source/publications/omnireset/distillation.rst index 9b228ef8..d076ca58 100644 --- a/docs/source/publications/omnireset/distillation.rst +++ b/docs/source/publications/omnireset/distillation.rst @@ -28,67 +28,7 @@ Then install the dependencies into your UWLab conda environment (required even i cd /diffusion_policy conda activate env_uwlab python -m pip install -e . - python -m pip install dill hydra-core omegaconf zarr einops "diffusers<0.37" wandb accelerate - ----- - -Quick Start: Evaluate Pretrained RGB Policies ----------------------------------------------- - -Download our pretrained vision policy checkpoints and evaluate immediately. All commands in this section run in ``env_uwlab`` from the UWLab directory. - -.. tab-set:: - - .. tab-item:: Peg Insertion - - .. code:: bash - - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/distilled_rgb_policies/peg_distilled_rgb.ckpt - - python scripts_v2/tools/eval_distilled_policy.py \ - --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-RGB-Play-v0 \ - --checkpoint peg_distilled_rgb.ckpt \ - --num_envs 32 \ - --num_trajectories 100 \ - --headless \ - --enable_cameras \ - --save_video \ - env.scene.insertive_object=peg \ - env.scene.receptive_object=peghole - - .. tab-item:: Leg Twisting - - .. code:: bash - - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/distilled_rgb_policies/leg_distilled_rgb.ckpt - - python scripts_v2/tools/eval_distilled_policy.py \ - --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-RGB-Play-v0 \ - --checkpoint leg_distilled_rgb.ckpt \ - --num_envs 32 \ - --num_trajectories 100 \ - --headless \ - --enable_cameras \ - --save_video \ - env.scene.insertive_object=fbleg \ - env.scene.receptive_object=fbtabletop - - .. tab-item:: Drawer Assembly - - .. code:: bash - - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/distilled_rgb_policies/drawer_distilled_rgb.ckpt - - python scripts_v2/tools/eval_distilled_policy.py \ - --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-RGB-Play-v0 \ - --checkpoint drawer_distilled_rgb.ckpt \ - --num_envs 32 \ - --num_trajectories 100 \ - --headless \ - --enable_cameras \ - --save_video \ - env.scene.insertive_object=fbdrawerbottom \ - env.scene.receptive_object=fbdrawerbox + python -m pip install dill hydra-core omegaconf zarr einops "diffusers<0.37" wandb accelerate pandas ---- @@ -106,7 +46,7 @@ Collect Demonstrations **Step 1 — Export the expert policy** -Run ``play.py`` on a **Stage 2** (finetuned) checkpoint to export a JIT-traced ``policy.pt``. You can finetune your own (see :doc:`sim2real`) or download a pre-finetuned checkpoint from the :ref:`finetuned checkpoints ` section. +Run ``play.py`` on a **Stage 2** (finetuned) checkpoint to export a JIT-traced ``policy.pt``. You can finetune your own (see :doc:`sim2real`). .. code:: bash diff --git a/docs/source/publications/omnireset/index.rst b/docs/source/publications/omnireset/index.rst index 26184126..c246fc7c 100644 --- a/docs/source/publications/omnireset/index.rst +++ b/docs/source/publications/omnireset/index.rst @@ -372,8 +372,8 @@ The full OmniReset pipeline from custom task creation to real-robot deployment: - :doc:`new_task` -- Prepare USD assets, register object variants, verify in sim. - :doc:`rl_training` -- Collect reset states and train an RL policy from scratch. **Start here for most use cases.** -- :doc:`sim2real` -- Robot calibration & USD, system identification, camera calibration, then ADR finetuning, or use our pre-finetuned checkpoints. -- :doc:`distillation` -- Evaluate pretrained RGB checkpoints, or collect demos and train your own ResNet18-MLP vision policy. Deploy on real robot. +- :doc:`sim2real` -- Robot calibration & USD, system identification, camera calibration, then ADR finetuning. +- :doc:`distillation` -- Collect demos and train your own ResNet18-MLP vision policy. Deploy on real robot. .. toctree:: :maxdepth: 1 diff --git a/docs/source/publications/omnireset/sim2real.rst b/docs/source/publications/omnireset/sim2real.rst index 3446ca7d..70f45470 100644 --- a/docs/source/publications/omnireset/sim2real.rst +++ b/docs/source/publications/omnireset/sim2real.rst @@ -16,7 +16,7 @@ Pipeline overview 2. **System identification** — Collect chirp on real robot, run CMA-ES in UWLab, verify fit, write sysid params to metadata, teleop to verify. -3. **Finetune** — Select best Stage-1 checkpoint, finetune with ADR, evaluate. Or use our pre-finetuned checkpoints (next section) if your setup matches ours. +3. **Finetune** — Select best Stage-1 checkpoint, finetune with ADR, evaluate. 4. **Camera & hardware setup** — Mount cameras (D415/D435/D455), print task objects, calibrate camera extrinsics. @@ -200,7 +200,7 @@ To tune gains if the arm lags or stalls, add ``--osc_kp_pos`` and ``--osc_kp_rot Select Best Checkpoint & Finetune with ADR -------------------------------------------- -Either run the pipeline below or use our pre-finetuned checkpoints (next section) if your setup matches ours. Some policies transfer better than others. As an offline proxy, evaluate candidate checkpoints under action noise and pick the one with the highest success rate, then finetune it with `ADR (Automatic Domain Randomization) `__. Finetuning uses the identified sysid parameters as the center of a randomization range that ADR automatically expands, producing a policy robust to real-world variation. +Some policies transfer better than others. As an offline proxy, evaluate candidate checkpoints under action noise and pick the one with the highest success rate, then finetune it with `ADR (Automatic Domain Randomization) `__. Finetuning uses the identified sysid parameters as the center of a randomization range that ADR automatically expands, producing a policy robust to real-world variation. ADR shifts the training distribution from zero friction, armature, and motor delay toward a randomization band around the sys-id'd values. OSC gains increase to compensate for higher friction. Action scale is reduced over the curriculum to slow the policy down for safer real-world transfer. @@ -383,148 +383,6 @@ All commands below run in the ``env_uwlab`` environment from the UWLab directory ---- -.. _use-finetuned-checkpoints: - -Use our finetuned checkpoints ------------------------------ - -Pre-finetuned for our robot calibration and sys-id'd parameters. If your setup is similar, you can download and run these instead of finetuning yourself. - -All commands below run in ``env_uwlab`` from the UWLab directory. - -.. tab-set:: - - .. tab-item:: Peg Insertion - - .. tab-set:: - - .. tab-item:: Seed 42 - - .. code:: bash - - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts_finetuned/peg_state_rl_expert_finetuned_seed42.pt - - python scripts/reinforcement_learning/rsl_rl/play.py \ - --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Finetune-Play-v0 \ - --num_envs 1 \ - --checkpoint peg_state_rl_expert_finetuned_seed42.pt \ - env.scene.insertive_object=peg \ - env.scene.receptive_object=peghole - - .. tab-item:: Seed 0 - - .. code:: bash - - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts_finetuned/peg_state_rl_expert_finetuned_seed0.pt - - python scripts/reinforcement_learning/rsl_rl/play.py \ - --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Finetune-Play-v0 \ - --num_envs 1 \ - --checkpoint peg_state_rl_expert_finetuned_seed0.pt \ - env.scene.insertive_object=peg \ - env.scene.receptive_object=peghole - - .. tab-item:: Seed 1 - - .. code:: bash - - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts_finetuned/peg_state_rl_expert_finetuned_seed1.pt - - python scripts/reinforcement_learning/rsl_rl/play.py \ - --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Finetune-Play-v0 \ - --num_envs 1 \ - --checkpoint peg_state_rl_expert_finetuned_seed1.pt \ - env.scene.insertive_object=peg \ - env.scene.receptive_object=peghole - - .. tab-item:: Leg Twisting - - .. tab-set:: - - .. tab-item:: Seed 42 - - .. code:: bash - - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts_finetuned/leg_state_rl_expert_finetuned_seed42.pt - - python scripts/reinforcement_learning/rsl_rl/play.py \ - --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Finetune-Play-v0 \ - --num_envs 1 \ - --checkpoint leg_state_rl_expert_finetuned_seed42.pt \ - env.scene.insertive_object=fbleg \ - env.scene.receptive_object=fbtabletop - - .. tab-item:: Seed 0 - - .. code:: bash - - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts_finetuned/leg_state_rl_expert_finetuned_seed0.pt - - python scripts/reinforcement_learning/rsl_rl/play.py \ - --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Finetune-Play-v0 \ - --num_envs 1 \ - --checkpoint leg_state_rl_expert_finetuned_seed0.pt \ - env.scene.insertive_object=fbleg \ - env.scene.receptive_object=fbtabletop - - .. tab-item:: Seed 1 - - .. code:: bash - - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts_finetuned/leg_state_rl_expert_finetuned_seed1.pt - - python scripts/reinforcement_learning/rsl_rl/play.py \ - --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Finetune-Play-v0 \ - --num_envs 1 \ - --checkpoint leg_state_rl_expert_finetuned_seed1.pt \ - env.scene.insertive_object=fbleg \ - env.scene.receptive_object=fbtabletop - - .. tab-item:: Drawer Assembly - - .. tab-set:: - - .. tab-item:: Seed 42 - - .. code:: bash - - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts_finetuned/drawer_state_rl_expert_finetuned_seed42.pt - - python scripts/reinforcement_learning/rsl_rl/play.py \ - --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Finetune-Play-v0 \ - --num_envs 1 \ - --checkpoint drawer_state_rl_expert_finetuned_seed42.pt \ - env.scene.insertive_object=fbdrawerbottom \ - env.scene.receptive_object=fbdrawerbox - - .. tab-item:: Seed 0 - - .. code:: bash - - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts_finetuned/drawer_state_rl_expert_finetuned_seed0.pt - - python scripts/reinforcement_learning/rsl_rl/play.py \ - --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Finetune-Play-v0 \ - --num_envs 1 \ - --checkpoint drawer_state_rl_expert_finetuned_seed0.pt \ - env.scene.insertive_object=fbdrawerbottom \ - env.scene.receptive_object=fbdrawerbox - - .. tab-item:: Seed 1 - - .. code:: bash - - wget https://huggingface.co/datasets/UW-Lab/uwlab-assets/resolve/main/Policies/OmniReset/state_based_experts_finetuned/drawer_state_rl_expert_finetuned_seed1.pt - - python scripts/reinforcement_learning/rsl_rl/play.py \ - --task OmniReset-Ur5eRobotiq2f85-RelCartesianOSC-State-Finetune-Play-v0 \ - --num_envs 1 \ - --checkpoint drawer_state_rl_expert_finetuned_seed1.pt \ - env.scene.insertive_object=fbdrawerbottom \ - env.scene.receptive_object=fbdrawerbox - ----- - .. _camera-hardware-setup: Camera & Hardware Setup @@ -720,8 +578,9 @@ Update the ``TiledCameraCfg`` entries (``front_camera``, ``side_camera``, ``wris .. caution:: Since the Isaac Lab 3.0 bump, every ``rot`` / ``base_rotation`` in these configs is a quaternion in - ``(x, y, z, w)`` order. ``2_get_isaacsim_extrinsics.py`` in the diffusion_policy repo prints the 2.x - ``(w, x, y, z)`` order, so move the first element to the end before pasting (or convert with + ``(x, y, z, w)`` order. ``align_cameras.py`` prints its ``rot`` in that order. ``2_get_isaacsim_extrinsics.py`` + in the diffusion_policy repo prints the 2.x ``(w, x, y, z)`` order, so move the first element to the end + before pasting its output (or convert with ``isaaclab.utils.math.convert_quat(q, to="xyzw")``). A quaternion pasted in the old order is a different camera pose, not an error. diff --git a/scripts_v2/tools/sim2real/align_cameras.py b/scripts_v2/tools/sim2real/align_cameras.py index f2ddd8fa..f6237dae 100644 --- a/scripts_v2/tools/sim2real/align_cameras.py +++ b/scripts_v2/tools/sim2real/align_cameras.py @@ -289,7 +289,7 @@ def _print_params(self): print("--- Paste into data_collection_rgb_cfg.py ---") print("--- (same values for BOTH TiledCameraCfg.OffsetCfg AND BaseRGBEventCfg) ---") print(f" pos=({self.pos[0]:.7f}, {self.pos[1]:.7f}, {self.pos[2]:.7f}),") - print(f" rot=({self.rot[0]:.8f}, {self.rot[1]:.8f}, {self.rot[2]:.8f}, {self.rot[3]:.8f}),") + print(f" rot=({self.rot[1]:.8f}, {self.rot[2]:.8f}, {self.rot[3]:.8f}, {self.rot[0]:.8f}), # (x, y, z, w)") print(f" focal_length={fl:.2f}") print("=" * 60 + "\n") diff --git a/scripts_v2/tools/sim2real/collect_fk_pairs.py b/scripts_v2/tools/sim2real/collect_fk_pairs.py index fe31074f..99da6075 100644 --- a/scripts_v2/tools/sim2real/collect_fk_pairs.py +++ b/scripts_v2/tools/sim2real/collect_fk_pairs.py @@ -119,9 +119,9 @@ def main(): obs, _, _, _, _ = env.step(zero_action) # Read all envs at once - joint_pos = robot.data.joint_pos[:, :6].cpu().numpy() # (N, 6) - ee_pos_w = robot.data.body_link_pos_w[:, ee_idx] # (N, 3) - ee_quat_w = robot.data.body_link_quat_w[:, ee_idx] # (N, 4) + joint_pos = robot.data.joint_pos.torch[:, :6].cpu().numpy() # (N, 6) + ee_pos_w = robot.data.body_link_pos_w.torch[:, ee_idx] # (N, 3) + ee_quat_w = robot.data.body_link_quat_w.torch[:, ee_idx] # (N, 4) ee_pos_b, ee_quat_b = math_utils.subtract_frame_transforms( robot.data.root_pos_w.torch, robot.data.root_quat_w.torch, @@ -132,10 +132,11 @@ def main(): all_joint_pos.append(joint_pos) all_ee_pos.append(ee_pos_b.cpu().numpy()) - all_ee_quat.append(ee_quat_b.cpu().numpy()) + # diffusion_policy's FK code (test_fk_comparison.py) uses (w, x, y, z) + all_ee_quat.append(math_utils.convert_quat(ee_quat_b, to="wxyz").cpu().numpy()) all_ee_aa.append(ee_aa_b.cpu().numpy()) - print(f" Reset {r+1}/{args_cli.num_resets}: collected {len(joint_pos)} pairs") + print(f" Reset {r + 1}/{args_cli.num_resets}: collected {len(joint_pos)} pairs") all_joint_pos = np.concatenate(all_joint_pos, axis=0) all_ee_pos = np.concatenate(all_ee_pos, axis=0) diff --git a/scripts_v2/tools/sim2real/eval_robustness.py b/scripts_v2/tools/sim2real/eval_robustness.py index 4eec03da..188904fb 100644 --- a/scripts_v2/tools/sim2real/eval_robustness.py +++ b/scripts_v2/tools/sim2real/eval_robustness.py @@ -113,10 +113,7 @@ def main(env_cfg: ManagerBasedRLEnvCfg | DirectRLEnvCfg | DirectMARLEnvCfg, agen raise ValueError(f"Unsupported runner class: {agent_cfg.class_name}") runner.load(resume_path) policies.append(runner.get_inference_policy(device=env.unwrapped.device)) - try: - policy_nns.append(runner.alg.policy) - except AttributeError: - policy_nns.append(runner.alg.actor_critic) + policy_nns.append(runner.alg.actor) print(f"\n{'=' * 60}") print(f"Running {num_policies} policies across {num_envs} envs") diff --git a/scripts_v2/tools/sim2real/plot_sysid_fit.py b/scripts_v2/tools/sim2real/plot_sysid_fit.py index b2b1ada0..836c6b26 100644 --- a/scripts_v2/tools/sim2real/plot_sysid_fit.py +++ b/scripts_v2/tools/sim2real/plot_sysid_fit.py @@ -41,7 +41,7 @@ from isaaclab.actuators import DelayedPDActuatorCfg from isaaclab.assets import Articulation -from isaaclab.utils.math import subtract_frame_transforms +from isaaclab.utils.math import convert_quat, subtract_frame_transforms from uwlab_assets.robots.ur5e_robotiq_gripper.kinematics import ARM_JOINT_NAMES, EE_BODY_NAME, NUM_ARM_JOINTS @@ -125,8 +125,8 @@ def closed_loop_replay( while wp_idx + 1 < W and t >= wp_step_indices[wp_idx + 1]: wp_idx += 1 - ee_pos_w = robot.data.body_pos_w[:, ee_frame_idx] - ee_quat_w = robot.data.body_quat_w[:, ee_frame_idx] + ee_pos_w = robot.data.body_pos_w.torch[:, ee_frame_idx] + ee_quat_w = robot.data.body_quat_w.torch[:, ee_frame_idx] ee_pos_b, ee_quat_b = subtract_frame_transforms( robot.data.root_pos_w.torch, robot.data.root_quat_w.torch, ee_pos_w, ee_quat_w ) @@ -137,14 +137,14 @@ def closed_loop_replay( action = torch.cat([action_arm, torch.zeros(1, action_dim - 6, device=device)], dim=-1) env.step(action) - joint_pos = robot.data.joint_pos[:, arm_joint_ids] - joint_vel = robot.data.joint_vel[:, arm_joint_ids] + joint_pos = robot.data.joint_pos.torch[:, arm_joint_ids] + joint_vel = robot.data.joint_vel.torch[:, arm_joint_ids] sim_positions.append(joint_pos[0].cpu().numpy().copy()) sim_velocities.append(joint_vel[0].cpu().numpy().copy()) sim_ee_positions.append(ee_pos_b[0].cpu().numpy().copy()) if (t + 1) % max(1, T_steps // 20) == 0: - print(f" step {t+1}/{T_steps} ({100*(t+1)/T_steps:.0f}%)") + print(f" step {t + 1}/{T_steps} ({100 * (t + 1) / T_steps:.0f}%)") return { "joint_positions": np.array(sim_positions), @@ -249,14 +249,15 @@ def main(): initial_joint_pos = real_data["initial_joint_pos"] wp_step_indices = real_data["waypoint_step_indices"] wp_target_pos = real_data["waypoint_target_pos"] - wp_target_quat = real_data["waypoint_target_quat"] + # the real-robot collector (diffusion_policy) records (w, x, y, z) + wp_target_quat = convert_quat(real_data["waypoint_target_quat"], to="xyzw") dt = real_data["dt"] T_steps = real_joint_pos.shape[0] if args.max_steps is not None: T_steps = min(T_steps, args.max_steps) - print(f" {T_steps} steps ({T_steps*dt:.2f}s), dt={dt*1000:.1f}ms") + print(f" {T_steps} steps ({T_steps * dt:.2f}s), dt={dt * 1000:.1f}ms") # Move to GPU real_joint_pos_np = real_joint_pos[:T_steps].numpy() @@ -330,7 +331,7 @@ def main(): # Compute per-joint RMSE error_deg = np.degrees(sim_joints - real_joints) - print(f"\n{'='*60}") + print(f"\n{'=' * 60}") print("Per-joint RMSE (deg)") print("=" * 60) for j in range(NUM_ARM_JOINTS): diff --git a/scripts_v2/tools/sim2real/sysid_ur5e_osc.py b/scripts_v2/tools/sim2real/sysid_ur5e_osc.py index ac5cb654..a3cac5ec 100644 --- a/scripts_v2/tools/sim2real/sysid_ur5e_osc.py +++ b/scripts_v2/tools/sim2real/sysid_ur5e_osc.py @@ -53,7 +53,7 @@ from isaaclab.actuators import DelayedPDActuatorCfg from isaaclab.assets import Articulation -from isaaclab.utils.math import subtract_frame_transforms +from isaaclab.utils.math import convert_quat, subtract_frame_transforms from uwlab_assets.robots.ur5e_robotiq_gripper.kinematics import ARM_JOINT_NAMES, EE_BODY_NAME, NUM_ARM_JOINTS @@ -175,7 +175,8 @@ def main(): initial_joint_pos = real_data["initial_joint_pos"] wp_step_indices = real_data["waypoint_step_indices"] wp_target_pos = real_data["waypoint_target_pos"] - wp_target_quat = real_data["waypoint_target_quat"] + # the real-robot collector (diffusion_policy) records (w, x, y, z) + wp_target_quat = convert_quat(real_data["waypoint_target_quat"], to="xyzw") dt = real_data["dt"] T_steps = real_joint_pos.shape[0] @@ -183,7 +184,7 @@ def main(): T_steps = min(T_steps, args.max_steps) W = wp_step_indices.shape[0] - print(f" {T_steps} steps ({T_steps*dt:.2f}s), {W} waypoints, dt={dt*1000:.1f}ms") + print(f" {T_steps} steps ({T_steps * dt:.2f}s), {W} waypoints, dt={dt * 1000:.1f}ms") # Move to GPU real_joint_pos = real_joint_pos[:T_steps].to(device_str).float() @@ -275,8 +276,8 @@ def main(): while wp_idx + 1 < W and t >= wp_step_indices[wp_idx + 1]: wp_idx += 1 - ee_pos_w = robot.data.body_pos_w[:, ee_frame_idx] - ee_quat_w = robot.data.body_quat_w[:, ee_frame_idx] + ee_pos_w = robot.data.body_pos_w.torch[:, ee_frame_idx] + ee_quat_w = robot.data.body_quat_w.torch[:, ee_frame_idx] ee_pos_b, ee_quat_b = subtract_frame_transforms( robot.data.root_pos_w.torch, robot.data.root_quat_w.torch, ee_pos_w, ee_quat_w ) @@ -287,7 +288,7 @@ def main(): action = torch.cat([action_arm, torch.zeros(N, action_dim - 6, device=device)], dim=-1) env.step(action) - joint_pos = robot.data.joint_pos[:, arm_joint_ids] + joint_pos = robot.data.joint_pos.torch[:, arm_joint_ids] scores += torch.sum((joint_pos - real_joint_pos[t].unsqueeze(0)) ** 2, dim=1) scores = scores / T_steps @@ -309,7 +310,7 @@ def main(): best_delay = round(float(best_params_ever[24])) rmse_deg = np.degrees(np.sqrt(best_score_ever)) print( - f"[{iteration+1:3d}/{args.max_iter}] " + f"[{iteration + 1:3d}/{args.max_iter}] " f"min={min_score:.6f} mean={mean_score:.6f} best={best_score_ever:.6f} " f"({rmse_deg:.3f}\u00b0 delay={best_delay}) {iter_time:.1f}s" ) @@ -323,14 +324,14 @@ def main(): "bounds": bounds, "args": vars(args), } - ckpt_path = os.path.join(output_dir, f"checkpoint_{iteration+1:04d}.pt") + ckpt_path = os.path.join(output_dir, f"checkpoint_{iteration + 1:04d}.pt") torch.save(ckpt, ckpt_path) print(f" -> {ckpt_path}") # Final results - print(f"\n{'='*60}") + print(f"\n{'=' * 60}") print(f"DONE RMSE: {np.degrees(np.sqrt(best_score_ever)):.4f}\u00b0") - print(f"{'='*60}") + print(f"{'=' * 60}") arm = best_params_ever[:6] sfric = best_params_ever[6:12] @@ -342,7 +343,7 @@ def main(): print(f"\n {'Joint':<25s} {'Arm':>8s} {'SFric':>8s} {'DRat':>8s} {'DFric':>8s} {'VFric':>8s}") for i, name in enumerate(ARM_JOINT_NAMES): print(f" {name:<25s} {arm[i]:8.4f} {sfric[i]:8.4f} {dratio[i]:8.4f} {dfric[i]:8.4f} {vfric[i]:8.4f}") - print(f"\n Motor delay: {delay} steps ({delay*sim_dt*1000:.0f}ms at {1/sim_dt:.0f}Hz)") + print(f"\n Motor delay: {delay} steps ({delay * sim_dt * 1000:.0f}ms at {1 / sim_dt:.0f}Hz)") final = { "best_params": best_params_ever, diff --git a/source/uwlab/uwlab/utils/datasets/zarr_dataset_file_handler.py b/source/uwlab/uwlab/utils/datasets/zarr_dataset_file_handler.py index 219f4fd5..29ba650d 100644 --- a/source/uwlab/uwlab/utils/datasets/zarr_dataset_file_handler.py +++ b/source/uwlab/uwlab/utils/datasets/zarr_dataset_file_handler.py @@ -199,12 +199,13 @@ def get_num_episodes(self) -> int: """Get number of episodes in the file.""" return self._episode_count - def write_episode(self, episode: EpisodeData, demo_id: int | None = None): + def write_episode(self, episode: EpisodeData, demo_id: int | None = None, dataset_compression: bool = True): """Add an episode to the dataset. Args: episode: The episode data to add. demo_id: Custom index for the episode. If None, uses default index. + dataset_compression: Passed by :class:`isaaclab.managers.RecorderManager`; unused here. """ if self._dataset is None or episode.is_empty(): return From 950481a57e7b6d78a9b23cacfb216f451eef4a7a Mon Sep 17 00:00:00 2001 From: Patrick Yin Date: Sat, 26 Sep 2026 02:05:38 -0700 Subject: [PATCH 07/27] Align OmniReset with Isaac Lab EA and converted experts 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. --- docs/conf.py | 4 +- .../omnireset/cube_success_rate_seeds.jpg | Bin 33530 -> 137086 bytes .../cube_success_rate_seeds_walltime.jpg | Bin 33959 -> 139074 bytes .../omnireset/cupcake_success_rate_seeds.jpg | Bin 36250 -> 156923 bytes .../cupcake_success_rate_seeds_walltime.jpg | Bin 36823 -> 160599 bytes .../omnireset/drawer_success_rate_seeds.jpg | Bin 37117 -> 144759 bytes .../drawer_success_rate_seeds_walltime.jpg | Bin 37036 -> 145049 bytes .../omnireset/leg_success_rate_seeds.jpg | Bin 39114 -> 144198 bytes .../leg_success_rate_seeds_walltime.jpg | Bin 39703 -> 150029 bytes .../omnireset/peg_success_rate_seeds.jpg | Bin 33361 -> 131931 bytes .../peg_success_rate_seeds_walltime.jpg | Bin 32883 -> 135792 bytes .../rectangle_success_rate_seeds.jpg | Bin 32406 -> 131234 bytes .../rectangle_success_rate_seeds_walltime.jpg | Bin 33091 -> 133242 bytes .../publications/omnireset/distillation.rst | 33 ++-- docs/source/publications/omnireset/index.rst | 60 ++++--- .../publications/omnireset/new_task.rst | 6 +- .../publications/omnireset/rl_training.rst | 155 ++++++++++-------- .../publications/omnireset/sim2real.rst | 55 +++---- .../setup/installation/pip_installation.rst | 2 +- .../rsl_rl/convert_checkpoint_layout.py | 51 ++++++ .../reinforcement_learning/rsl_rl/train.py | 8 +- scripts_v2/tools/sim2real/align_cameras.py | 4 +- scripts_v2/tools/sim2real/plot_sysid_fit.py | 2 +- source/uwlab/config/extension.toml | 2 +- source/uwlab/docs/CHANGELOG.rst | 10 ++ .../uwlab/sim/converters/mesh_converter.py | 9 +- source/uwlab_assets/config/extension.toml | 2 +- source/uwlab_assets/docs/CHANGELOG.rst | 13 ++ source/uwlab_assets/setup.py | 2 +- source/uwlab_assets/uwlab_assets/__init__.py | 8 +- source/uwlab_rl/config/extension.toml | 2 +- source/uwlab_rl/docs/CHANGELOG.rst | 16 ++ source/uwlab_rl/setup.py | 2 +- .../uwlab_rl/test/test_checkpoint_layout.py | 70 ++++++++ .../uwlab_rl/rsl_rl/checkpoint_layout.py | 110 +++++++++++++ source/uwlab_tasks/config/extension.toml | 2 +- source/uwlab_tasks/docs/CHANGELOG.rst | 20 +++ source/uwlab_tasks/test/test_environments.py | 92 ++++++++++- .../test/test_task_registration.py | 56 +++++++ source/uwlab_tasks/uwlab_tasks/__init__.py | 2 +- .../velocity/config/anymal_c/__init__.py | 10 +- .../ur5e_robotiq_2f85/camera_align_cfg.py | 10 +- .../data_collection_rgb_cfg.py | 13 +- .../ur5e_robotiq_2f85/grasp_sampling_cfg.py | 14 +- .../partial_assemblies_cfg.py | 14 +- .../ur5e_robotiq_2f85/reset_states_cfg.py | 14 +- .../config/ur5e_robotiq_2f85/rl_state_cfg.py | 14 +- .../manipulation/omnireset/mdp/events.py | 32 +++- .../omnireset/mdp/terminations.py | 11 +- uwlab.sh | 45 ++++- 50 files changed, 765 insertions(+), 210 deletions(-) create mode 100644 scripts/reinforcement_learning/rsl_rl/convert_checkpoint_layout.py create mode 100644 source/uwlab_rl/test/test_checkpoint_layout.py create mode 100644 source/uwlab_rl/uwlab_rl/rsl_rl/checkpoint_layout.py create mode 100644 source/uwlab_tasks/test/test_task_registration.py diff --git a/docs/conf.py b/docs/conf.py index 83d2ebf3..45067ffc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -127,9 +127,9 @@ "numpy": ("https://numpy.org/doc/stable/", None), "trimesh": ("https://trimesh.org/", None), "torch": ("https://pytorch.org/docs/stable/", None), - "isaacsim": ("https://docs.isaacsim.omniverse.nvidia.com/6.0.1/py/", None), + "isaacsim": ("https://docs.isaacsim.omniverse.nvidia.com/6.1.0/py/", None), "gymnasium": ("https://gymnasium.farama.org/", None), - "warp": ("https://nvidia.github.io/warp/", None), + "warp": ("https://nvidia.github.io/warp/stable/", None), "dev-guide": ("https://docs.omniverse.nvidia.com/dev-guide/latest", None), } diff --git a/docs/source/_static/publications/omnireset/cube_success_rate_seeds.jpg b/docs/source/_static/publications/omnireset/cube_success_rate_seeds.jpg index 2bb89c40a973d6402e6c76f7a0f5758e44220611..2c0d1f694e2109a9bf5b90820751d8bd44e243fc 100644 GIT binary patch literal 137086 zcmeFZ2UJttwl*B3NfSYe6p0E7N>gc4Ol&lH6|o^8LrR9Hy(FPHo;y{*1ONv-9-CGduy zZ!2nz6d%77-)a*IjY9DW{$+W5sDJ0>kn{mN;R^v9 zw(hyPR_5US?BaS6RlO5T*^5_uMdj4=Y1>%8Mf;0n|D0fv|B_^X6YPJ=HHs4F=L5>) zmqKAtJZ{ci4b*?X{`c>}D-{hEE}AR#^b?%llBM>hPrq898vN2b^^U)Q*b~1{wJoRI z7Pr6lzL7=D`9@Z3DGc6JTlh@UpmV-LZtq7My$!=C5$qAKX9CvZ~ z8u#o|$(LAfDy)s>Zm?u;g@5>S^pOE{8Ih~1VpvsLUPbPOXzK?3gAZNpyhqOT^3YPf zrYSD}zIC(xKp?jqOgWq$o$?UuY*TNbvjyz}xq@jMlb2=x^)`7!it8+Dd);^V$0|xV ziz^BTveX>$TD)j8UpgiB0d-$(Qj>%Y&RLanRMnSckXJDJUhUYP>@NvSi|P2!D9O=R znk|qkdTfmC!>gvaC+M*oV1=pEnDw<4X^ZlMqE5CsU8t_E+V3fv;`akx-)5gEdi}n= zb-|K-A6UqH=u*#GyhAPQ#8E`vV|3yEO}F|EkIp)_vdznXHU!&vM-F}u-TEt3^>$Wu zK;(X`y9TK{30CXjDyMQ(fnau+?NFl`E=2w;e1Thqp7jiEKv3(ZbiYy(dn}tYAu6Mn}r4 z66)*E+;xh+a;;@;7ar(M_yVC1r;NQc2dj-wx4!FH@2zOw8qW>R5AkR+sYuo|-&c`p zQ2S{?@cxzFJ1V0Z8zc9WmaL*=3BX?JWwDc)IHvy$!F!d^|%g1}xV69yAf&Gs3nQyl+# zLn13yK4wwd(WX*os;s)wy-IptVdd$Eott%9_&p{rGx>NA>~I+n)2av7O=>2=JE#oP zmxLY{V_@w5A#t>AnXyrRUAQ#&)#O>Sw<7%H)OG*LJUWzIx1P(`AKpo z*Y~j0*;np33E-a-@)hQsXSkclEM0537hHN6c4Ecte^XihhUL*jmGChP#z1t(OCn#>KsL?6*4c^;25id%a$804_7?DmA`o1K;%WI{FeRMoE zLv4fpo}`^WHS(NGRCOFsd*8pWCs~nNlHjc*u8ci90PLt6R8P(l<>joRJSkGk$Ia=I zQe!aG$WDB|igKZtMW_U#|O9z70?YWw| zF^W){0LE+p*l8zK--;3=@STR#M->)?Tv8(hZwqGdz%H@j zT7Y#80~kL1Ca|8va4>DCX(QL1{?#3>bZ4oAjosNsPGo-SVjGqu9C*8SGD+|A!Z9&d zA^}|806ey17kJygin?rr9#3L|&NZZ%e9BVAN?CHeT9(bSFq){X3c257~+^pUdb|Wlgv#kBPCj3>%&FdFlzCK!E?W>*D z=fB%DV!j1dz0q=2_`B_F9I&JwYy~tMor8=)qTJJLTLJG;^Jd<7_uCVrM>jjkJH0JJ zE*9%+%iQdyKXz{KytNy}Hqm6+(}TGx;Y`J$spg(W>_`DyiA8K8NjN#zSkpuB`zws> zi!F|E;==g6^vc}UbbPViAlm|fTg)+)tAb^^Hm#z{Eu#>AEgsA6 zF$e#-pRSQ>RlT;Sdx+kDs-V@xMDeSoGi~88d9HK^^1y)url5WPu!>sVSv%z1JIgiC zaS4I!#C_)q-N;W=FI1Q$Ush=q7^3HMWs(pH0FjZ7NC)MOQH$iLF3m4_>N5)+S%>z% z(QCCG$?IdV1#SEexBCxQ%Fw@+@`-BTFe%F0JXcW`z> z^)FXZW$W@de1wiwRIx?vlry@;Bq)>4!!@~VfvefUcfC3*>KvPSsfM!B!-m20PET7m zqpQm7r?K_AunCS9%Q(ad3Nd2a^D-e~$4jo}ZV?KzeEC&r_HZkLW#y!p}A?N_bZ_4&bZ)LlrhVyQ| z@Ky<@K3WJ3)AIcixU71u@{w*w{O1S=Lph%Wn+CHl@LoZl&Pwb{yd3D#oHSmMC3$=C zY+3DA_A1KhsI9Hjx3g-;&%HlSPWe<_l2d%=k)Fh~aF=sz*Dbj~4jZL7?RGId7ax;JJ^WhkN>0xL}G^Na=w}0O|{fCWs+(OQbpTz-zrDSI8 z><*4USA}WBU4Lu{qL*sgDALBiG$$!5o-L_j$=c-8GHu6#pg8bz9E(;EwI>4s^3>0hk3 z8_NCgkbN7ee6Q3rBX3Ma>OG2AM#{wcpThDD`X;C3FzqxAe zNtSFFQF?oU`->iF{RHoMUe@^JU-34s#3B{K<9LzorlbE>{yh6(4 zV?}ueU)bxAuoD>;1La97UAYxW(zc>)qOXGWa0t=#qbg&kd;M$fY~`5eHQDIzxqSb0|5cOB*V!>w_8ZF<gCi^<+seP9!o zcUO8&$yx;-Roi=|{haV{53FU&RldOa9fG#ic)2sp>o$GIO4q54pUvY@qpxS4F;xoR z`Eg;oe0(Ab`exR0|}Q&Mx21h9C%UOlX=|3&Idn? zhVVPH?8?gq%Gy$#hXzOQy@B*P-1fVMUH`OAJaO!tWG^7rsazRbL?xLc_Z0+&CGHLY zX$PS4@`Qtph}0Zxg)QTfO1dvnXLwl>W5rKGT{rEy@j*Q#&M-Sw-q!tg`bzOX=3!~OgL1p$?EIFJS;F?2=NDsa3)tQpt~ zNn>NDtA^wTYUEXv;Dl#C=z2-D*W6U4BTSMdMV4e&0yrLozF0)W3Bdc{U>%ky2sH$Q zT#wjb;!I{+vQya}?B^rCugRfx=Mc-4E_j${xHP^WZE1&-f$F7z=HF16Fu;9e&u=y& z4v3!U3?ii~W0?yQJgC8$M`G6wwqY~Agg+STXyH`{k^h(}4}lucu(2f~N8-wDpF>1I zHY|=~OO|l0hRoDKWCQ_L%ik!NeWeQP#gSxRo$BQ1u28Vk)TIpN2tsZzZZlMW2FzVf zEuP~_n>MUC;jdSHG?Ng4MT-wz)3j<&8RWE3cXywSk$M)btUE)D z#ZE5nTXzi|XXXWju3=>nC&`ub6q6Ca+ku2M^_%T)9geS})+yN4 zIl?{cPXOeq2z*F4r7VlW*-hv|m+0Qb?DkRFIH;qadD5<8Xvn5Ki!JPyW$K(VbmG%i zlae%X&yCrdl|j`gLTxWDg~I%U1RD>%172|)H@2aXT8xfgMP2mYh}UO9cb?Wgv`txZ zzPmE2TQXuBLigVz=5>4{0tTz7JF6%u zErxdfU|FWo$)sbY{YRU8wANc+>Fs2gwy@fYx15(dwOkSuA=%fi$s)4xKn#kR5o^N~ zDGCwB2Z4?7g=gN$tLU>NQtm&Wu%zFr9nt>Su>ZlvpIQu&{e3$wK6~PU`h_i(LD`xA zAOGTuWtrAfnZ+2TkXQf@nz+s^}vAoPP9!ffSk5Jtp~ zs)L;L@{Vk#SM{4g3>uE%I0nd==sfe=>ZVtH-XezHbzu)W89&*1a82V%4=Iu|`I5@? zo15JMf~5`X5Z;CL#F287pjuva2%Au|`J&{DR~l!V88xq5D~F$I1e7>upL&1#^nT%S z`zj>*`PZui7FXohxi92aE}SqpV0JA!ZKH*(v;6et^AUJeFhdCbFjFTAphz?;9I2&u zVOk``xn~Cb%9o3N_8Ig8Ff5(jwveY~nX2-xt7h_o67kX0f)gS^WCcBB@gwVG{Z%}5 zx?Brer<6F`-8Vmeem8Xey(^aOjfLT3%nU@l7~VEXyrVY`Q`uZrcj=^9$0J|MdPmz> z)qWj=jZ#Z$@x}UHHyLX=nL~)B9>uD9a%-4Z{_VCPk6Gd z;zu~T_#RyA2-Y(4Ll@o|%P95b;Jk4a2Vs*5ZQ)~mKh1Vh*HOxDee<5z+i=BTH%+VID266PvBZAOwiQq9bPdR{fjmYF7Z$xtp_Hx zHpCwhGobGvY^evg;bHP5aozX3TDA$=fsgft2Z}cH=I*gpQC_26JILba&>FYa*w|)!Ag^PpstDO9t>I3SiG02=X0Wa_qBi<%?EqbDjOxT*F>A2 zHb0F9u2z=MRUmP8!~OKyp=RCT8TMONaQ*$@s|(NXR_z+pE@NMw)>b|@W-EhdlC*AJ zHF8Cv@IKjK6Xl`FiW~A=nK@c3gUWFX$)yFxCIsrnDaySJdkJ*qo8zVDBftKfQ>>L1 zHcb2$NzuTbC&C7LllikroTIQkyAq~wF2NkSe>`5H!2G3W z^e_1Ok27zROvQhwrJg*JYdl(#zt37hc##lc=D}uG@a~w|GS|$|z#4?@nVIB9s>=6W zU!@zT_E}#p)FHV^>Pu-i?g`y+Nhsu#$(|Z-yC`2$8)ei95ijE<<8e9EkRR;*yi)uj z+FAFCur5qb%bB2+mQ1o&pj{weq!q1|TXtc$SQ{1h0>?Z_g13|EvG7jPY#;U#HgRGn zYkOQ?J!$O68I#oLqVspZD81jBuFyM@9!Kq?wU+@0V7a3bHy{2{A+XwE=OlX-t*ZQjN!JeK=SB zL?UNp6{U`Of^MhyP$utVnFo?abPRg@i@jlw*&h3-p!kx=Vcx5eYvpp{;^p< zti|t?feDItjeURNnMR|~8w$<#8PbQ1LQ^(BF(nfp|PTpx3oc#XQSfzxLIMFc?-Ry)SokipTYj)-98JZ zh@^~)Jep}qT$3aqCOM0P&w*00CHqWI2{>U~99 zY7-l=%u|$&x>0_9W*tNc2Uz@|`?-ZmfKz|`G0gvESJ1c7x&>e#S>X8S7ZKKoRBu+m~9W!I6GlYy5#K1u$(q#cetDeUfbvCn0AfadJDtwd+(lxN*_L8c{`%L z{eS`~1M4vdZ;_k@Rt3RoO=zYyb=0!?2TON<B9(c7GAfUV@UbjU4say_x6$xdz?-tK}q_yen`UdIIRE*x{VC?5a3;`bEUT#rT4z}&DYB2l!8iuvt}+0Fp&t+BK+ENwgIOfg*vWORqH zv~#>Te|F9}ot|<~qwXMTG8B3qF3f(doCLSjLG|TS<|1)S?14=UjXQPr?J{(AHf_@(wb+?&i(N0w-uiC)7&{w? znu|} zb8y|;{_BGksV4{L#C9&b_%sLXd3pBT!o~QldTZYaFFJ6*nj3|Ia`S;P#KwXTK(Jd% zoU7nKqTj{e*cw8+B5oFNC9xqyc8=|z zsBLD>18}jnl}%3j>^NTkITY&!&VtMRs5Mg^E&bK1FMyb~z@RZ;Lx<7Dy0KVSBJ2b) zpFj=R7v4rV=6%2zp-Z74rLIny@*m+Yvwar~XF82ruISxGtzhcTg8>FtQSHDQJgFSj zl^Nv0zHqDyj^l%X>~9!Xf^C9ET#*e}*b<_h55aH_BI8Im2RDrA-C#Krs^UiQ8y^{| z)rT>6q6-i){EDp`EFO*gg#Odp>?L>!{)WGUYSHx_MEtS zBOURr171{bkDYuA@@XgP*h3ds5NM1C^Rl_<-s!mGL)UB9d@L-h4%0R<&OKz%HR{wA z7@C z5!m<##d|E>uabl2{N+3A?NSatoeJ0p_7<>E!Mm^r=Q7C3$qr0^Mm^_DNEn^id{q8W ze|{ayD0*=$Zf=%U`I%gn?!YMg>@ekA;;Rw#td~~Vfb>K44D|eYiYRvWjV_W-D%ilj z2hwv*M3{SY$jmg5smcEM5x>DBFXW=;rYk?{1dva4L*>}APe(EN``!&`pLRK*A8>nc zv+Q}7vk!cJ0xFfyl}00Id8Swc#807RV`H(o;ddSe_n=sDn^j% zAYRu}0QpIT=YV?uW^-lGNUTPNB?cG{>!HiH4xdh z2ncmw9epnWA(8<&)rjSRPbQeHc*m&5!TctbEpTPvbMG4u4~mzJIDV^;6s+9W>+*g2 z-C|k+LwC#{5wTuHNhE-!Vb~}0FvW)WbhvNCZ(~l<(A|w z4t9JYv5SXO9tKkHg6g#>v=2b-F)um0poT>tKr}CJDvlxr`9Tf4c@L+T*%kLfRcuH7 z^vJW-)|Vyap$>u%;i$1+`1-lM|H~_oI~s zo$uWI;49mS47>?BGlQ(FqeQVOJ{M?Tc)7o_UqSx&*{;u*Q>f=R%quhyN z9qGL5yeP`#=p1~}7TzgK<;pxnlnx=%{^dR@TYg7SJw&!=7z7jVZ4I*=96P>pzOMJl zG8WSvmu2RIth3}LLzD4XWr{ad!joD)$8dVZMZvAFLiUJ_VU?U znau=bdvwElx7a23Q)M^pTv1>0+7N=T(&l?@dhD7?ixvPrl}N;p($BdF}Vs>hmqR6MT^g zh-s+{g8;&nOPVseQ)7;9wz^J=cag91Rc!%DA5q$|C|`y>eCOi8th)oh3~KYe9IN;1 zMMQV;5Cawbb3qcQOFSR~V-;(n3WhSA%f z{-`@OS1ZKg{Mwxyp6mJEV5OdOm>ULnZ~zR|6VvlsbrVwU6_eu1Nil{V4wN)(SUCIW zjg5kz9xIo<8GGG1E^;+&NQyaxh?m1hudx(|T5#pDTp8UKsWKc<#<&TPD&Q31hAjO@NG~5ow4DQAoyk%YsaYCfReA~ot*pWGV zZ>}|cbQ_k;d>1h?4(ddJ%+^0p*} zQR&p2)0G6t30er$WnJd%`v4YZ6ENk>ZQKOex#(Fl0|CY4=KGg3ybJ{2&Ocd?QX4%# zW$M!p0ajsf=pC-umMcR#$g9D~5r(wP3}{I*-xX7CGP}5IrVB66MAFw@?#@|xSQev} zc}?$7npsV<^CuL+1xVCUhvOdJ5e@(Z%_hP7O98Fc?W88bmUSII>>f>jQ&21>^QiRk z2}=IBHr9g;OI}Vt2=D)kUwC2Kx5!b3p<%>ojEsKE(M^trgnGP}LH-BGk-%|Y5@oUo zBi}bPm09ufDNJb`oD+@(X?>ci&5yGVaT#7`%-t%<6TzW=d!7|1OzBKh%(&o4MCi=d zL5`XF6mWc__(e&^NlY3Z*obYbrnaf|nWte0S{~IP|#(N4;Z= zO)XU)BlMCH7eeos<*_`L=vWXu=`V*5`$#~4tEft9WH_RwVgG}y z#psrt!3WlUtS!?VTD?$cL%GC>jeUb|DLdRFt@3PM z+;6%le=2iH`czZ6BqB-#YDWKNrk-ecM;C~HrHIH)j#G&IVYoQg*~`9eGm~^T|I9<{ zfkJR5K0)92=F`&!-v>hTI$KT~>ukCeq5IoVKn4+Y5_<_6c48;>QhX%iC}r5&b=q)i zqhl;PHa41_pptgMKfKMUa?3(~O6dK>U)#@Tzq|N)zv{`q)Nq8}<4wW7MKL{Kk}&h4Yx-ye@_FSphI^q$e7BUvH@ws?d--_s;Jfw_-=_2HQNk_QGAvgfi-_rh zRlJ5dH2(-H^Q`2^5>36SOZZF-)j=fR(J8zn?C@JR&grt0xzEjetd(RpIIVH85arQ$ zYv3^Fe!Sh&vv7vR<2H{MBh7(6syj~fzP~vzIlpHuouY{0gX+^Le0VI2&`6JEM00#Y zs_Bd6nV+upi@Chic{QTee=m9ATqXN}mggnE85m6ClK6@7o3J3x% zEdR!R{8NI|JDZuQiFntkFoUYMNK3z4U1m$Fz#fwV@O+0_FF>mn8pTyRd$V0j*GDNBhRLz;E%O zJB7=2SbU(Tw)q}J5SrRqsp-yu7YQ9D_v_IB?DZ4ZZ#dJ1`w$VdpE>WR+6!n+H&yFi;y!C7*DohsL8aB-u* zTmR8c3m=;oI!~K|gG!qea?=j}9Hwe0In>3HBI?%8AX}~ADKPpMOf#s$^n!HI+N_8; ziXGh(PJ}qnrEb0MQBEA)9&|v!_5iNAJLYC>VH>DeheDGBBs{enq=3EiPP0_+d2ARP zGV(~9=5maDXJq)M(d6HFOGQNHn7@z9q!3lEE^8(pOWVzwPP(P9Ek^5(mCJq6^U}FF zKn-?K9xQ0Vq zy?pLgEOV$%goEbp>|x9?&x`SnsM$T2mE$kxnzMLkbIR`-hq^=Ux9Snh5dZ^V*| z$hCscXZJ%E)R_JyTP`&}pKXJEZG0qlr;Wc8{vR+ z%gXbNp{ZX`v-v9O7!Kws=X~*aPx(hizBt4^h5I$Vib?_?_wPeojn%_|LH?|ALt9we z_q7wA3UAY8Jga`Zb7u1F=PW8~8Rzo1Nly+!G*E~z?-`~{E$&W0e*GQ`*zljn`m^~I zQRq3VsC->6Aqjp#`349oI`@%r+Pv<+DtvZl&wc10`Q#7M-zGzL>aJV`F#mOW-6ee7 z-#Z=lKaPcS{+q~XmL1feieN1@uIYWo{WJdi<8PC#qVC2aPbjPv<3nl0tpIrbqk|^> zc{KYW++Sz=o7&oyJD27Ev9DMCZ7%Fzw>t6of3b!9zp7PZXtKQGjfHy#B4Wew+L`#8 zx~4@KId+orC!??ri9)2&vv6?(f_BT~eqyJN<`lq(++<$BMKg81i_S^qr zWXJtRcBwQ_@{T-#j2_7?FnU*fa~1V4d2!~iIP(#^9%?wmyKgvG>^l98!f8mfThNyo!` zzc&P7UjUA__+q$!-LtveNBDmVH^}meBYQV^ea?!yb`tQ=e~-g)+vWdNBa8dLE|wii zMZ}zZ1THyHCLd8M9=!P8#nd_veV#V`b6ibc48Dz}Z9(2=1P>R_|Dy6}_Wv`S0*CnL z2*5NI7wf$OK&PR0+F!Et!JI2tH)lKA6ne|i=kkknX6D;2~{idb63{wvG6%^ zYUi2s=)ILjy_%FtSy|)uUV9Ia)c->Y{Q{Zb1@@Ti!!&v-d z;#&|%l18tyRG!!}ROTd*ZmT0-TQwg=SvqiWPk6MA?`s#AZ$AngzNh~&SXAlsIA2>q zCHrQxeQByT<0Kp;U&+Y#(En=qwFHslqf<-F@Bi(P(F3R4 z9x}DAV3~XBs{dvzu^=|wisfMNyf~f>1byiJ&0Ke2C(F;wZ@!P6d<0e8KcgUk7gJ8+ zis$|P&V_sAqt_>3K3(c~Y_CB5y5n2m>$Yn5mM3H9axV;H}w z0q4UOtXcaFuu@B%(%^&cYZ7DMOdfo?y-gr8(bcv5roj5p$wA6r!M{Iq$H`Q!Wa49t zXSM#nmK>aH*ZG&@$A9MA_9aL?mP~F;f;F&>Niui~_!^Vang!|$w@h18C)N*L*S$Te z>==|Ml;?KpQW-}uBH5KIl1~QW9y~m3gW&4h|1zk&hJxsBQtZ>5B6=) zc$v@HMd(jYt%u?#{ZRa8qjjt(_LcdMG~a#?7)1v&qa`}SwPIlD$3>wSb=%gQ6S zb|~+3@?$UG9xeE_Pv*FA695HA$|AZXmX}4kiDj?UJ%MTZZ@9W271eiI-LY1QaT6e% zUO;o@NIc8gY|ztGFlo!HBR#JJg|s&90ptzz_46wy=_N~#3m4q;9n4)_eU$CYH=dm` zN1+6d7GtZhJ6X7~DE1V5jU&W0>?3UB+AyD!3r4=L^nJT`AX`m)tJQ@E&Rt*LNBM14 zjXY*W|J|T;I}z&!iaA?}Qdp)+<0|Sw!PvVigJEg3k9ck2y`}{P*QqZTmQ&@JU+nIN zT)wn@S9)n_?JRo)oo%{-lRKY#5xPz|z1&O3!h1RFfT)Aj84XxIyl>#k*W#Cb7u8G2 zk=CXnYSz!(a3`da%C8cID3hPHMbFM{`TZ!8N5TI_2f8>3t1(_9+aEqIFOPJ59DUC_I7}QzCoBD42C2s% zzCFbT#lM^#tPQIuzFF+@&g!0#Bt$HLV@epHZZg9%CF>zEyjT8r!q#-pLR|wZUjeDd zlMgPQYc(~}RNzO=n_nHIt=rbvo9y`5OQYFvB3-R$f|uBdRc5B_tkLLeZtnI~EB{D# ztN7ki8l=8tIqiTkVNoOM^m2Il1iM%{1VwCZg;ouRO|WKA<$rqy9??vk&F<^6t#gWO&H7qN1>6eTpjp8L0(H< zFlbLuqe880C9T)B1p)&xGE_H3aV?n&&yLrCI?|D_I zs`MYCYFA8WFTN8dfFlT|V}Y+^GX+gh3~6Okm~)KXw7F=sfDT~?97e~*;P(k71PAzd zx+gAK)JBfWeLAOFSZ%3g^)&CDmI!S>)|}!Ajf#P1|MQqmP3SVCR;rwYa6KYdD)0ES zm`4l=q78GjK12a2i86CChB2nifMPu`l)=e?;jB@7aj zSt`ja`FA%ik?8(WDHKUY^Cs5HgW!j{97u$PMAA967)^NmFx5M zfWLr~$1I&py*XF6oqGvRpn=jl?ElBwK;88)(LS=F<%8*KPxq{#vs0gbzA)O=v5Wt~ zj`USjGxe5>EF6Yz?vcUUGAA-<*01T+aZO7rA8SmmjlIvFdUUS(cKe=t?PG5a2uN!# zXd+Tay1;n*6clB{TH9CO@mAq58P?osw1@Pe*ionfsD4-+qC0 zwgZF0O;}J)7q63ny_Z_h>&={fpMOioYif6W8qwgFd?e0anXy?=LG2B{+TiJcjW^am z`rc)(?c}SLvO@msV<~aF>DaD3VRdb3>xvc6l$8tu@YZ`~R3@6Y_Vg%oi3b`4+$5zu z&n%39bMF9W z#9S+kGmm}0>-@|09bbeNlCV04OFb$&x_93O3#Rrco!lUQMD9xfp8ds3drRk{uaoV* zBp;E6C+6{;TO#vg9u%0)ztpjre?CzqO~^v#@EygecMzcRcu3jlBKV z18+ZvX1Q(qc&9sP$G7<4Up>RN>_T1vaMsckjn`}1hE^(YdSpH7sx6dJ#4ulb3lEbIcKs|fbJFQ>Xs?i(bTIs6DyJ~6mno7HTw>{cs8Id-CVxyv6-eq`1@=3ghCd-;e-f7IHqmSSn!m3i%pU= zY(r0p3(RTr(te&!yqs$5V`?otr~UcVnFZM-@v#gj(C*zlLmgS$#yS5@alj<;;S`B~ zZ2WAOGJD9YU_z&jPyBWMZ04zWp1F%@!rlVOgiJ++ZPqQ?MSj;wUmnCibXsJ*8nF)H#@cJ^~UzjeRDAe zG*e*+>jm8$^>3uyb}{RF9muhd3=QmXmY6w}X)j%7Rg&VJ425@sHqy3R_IG(@ve3%zk6(01By+sA zEl=y`1@}Jt{4wiiS7@5s6XSQwS&DW|U$RvGYtCU6bAPo8=1(SK{H3pNt1zZF2fSL8{KW2-) zBs{cV+(xbS%DcZN;;Q9OZo}HImImYC4~Z1FR5F*?H>zO;7UD1I{pOrypqneR=7f{w zzDFk zK;!<%sidmz18w3P15T$6vgFYR%w?#~y-M$XlHufJ>He8#DCc0=_(br=ht8Q3 zrTMx6{e7|*Nwtgi1fQX6U*=??dVh+iQ*Dq>k^pxXGd$*T2YQ5Iuve!jKYrGklV?r0 z7hICMb#4dhbEItzR~W3Rjw>*Tk#h7wm&xDF>BCnf1*;Gi zcF*0+0L}NudC50#Np1`ok~%20@N(?Zr3HmJ@(PCEcZ<*m89{-_tF~>E^HhbBPYroE z-(w~Cww(`_g5gK59Ujl)+%nE!ND65odTH*zzJ)11a-8<ifkJuj7`X79~cTkgE)GvyKB1M|?5*4HhNCzpgymSHSorrWI zARQzmDAJpBrA3-Z6X~5umnPDC3%vvqkPsxvd!P54Id{&SJLmopm`osf_Rik>S!?~u zx>!y<2+Z#=`~ZNC?+y4VQBvrc7aQY`8h8v_#wI%BNf{`>;tL7tHc z^dV^cM{iC9dLRCiZ0pW|P9Tn5ws(IHmw7Ca8W>J>tWGfc48F_ZpuM1 zl3e_!7bKUu(?%@6Vbi$M9+v}$yF<}sB@K^1yx&-5m1k|7sK^T=UP(^m8V8$P^U6hlb5p{M$ zc2AjmV|~ke#@~f&-V~olIUf_msgn?HV{v~W-Nght2bXhur>2Em>(kaATA|>Wp45@c z=dfj4AN#~AV5Cn_Yx&lSZ_mJ7`~OmK5h>-Xa8&1p_0yh5-@ZAB&}KFy`&YiE5Mlc8 zCSi6bItj5>-$=eeSPlU0!t+SH4I#{-q%W*NJ`DQgR~f=9Ia1w80yN(vL^X!=;z&y{ z>RDkSw8V`Fh=rt=8ps%U_)mGI5ngVMR+w8`&#vm_?AVJ38=Vby!XoWF63e24st|GuY(%GYn|gRYe6cx-Fu;{(P()s} zOL^T_RWMepaDNtiEkr}In!SiGqeg^rtjXylmXR(z(3LmE?o-yge5vhEi8|v0rX~8Q zKs0uOPdaP7MMHLbpl98_z@;PL zSb?gO&l-@5UEqkiGbQ;-;8UgJto6dk5HTjzw>I;2d%BrlGaJ|C^r*#SreqRS1j_6f`bqX4)qETfyRb$Fu;8G_ro zPL_u3_@2QY)%|!Z#tD*5l8s1#fC+%#3qS|G{ueizQNK`qm?hs|LhtT%J{b(smD>Dr zb%TTAg$QlMoTO5fpA;R;v2QAF*ym=td!MH5pETbrD+TndhL=s%n}GFhS6ha32Wh2* z)B9;g$o8o%&Pju%8gqA4JbdQOpTF^VRp9#5gG=$HxTvPJJd>WlY>Bm}>hZ4b?)Nd9 zM_jAEmUkTTnx%z&X#_VJft=n05dCG5lS~ExA)yrnfm_)9k22_^E=RlxVRKIl*868h zPJD0&K|}ChWU$(M?ygci;u`kx(Gb&zpW|)Hw6N)mCYayGYApFK?mVf%n;Xq=dw=%C zmO)n2#2e~Ssbl#vG1$~7k`F7RBba?KK;lx>LO)aE=3H8NkjEypFETXgw+U-Bjz4Ef z-LAE{$2X5}7wyXxemm+%{q!1}hGyDowzRG+;@0N|kI~{Sui9x)>FQ1JS~xb!&D1BtB7Ab7FnUYeA%N$+Ua?=kTz2*m$$A%$4dsPpQ5Y#osX9eEHu*tFrk6 zQPC86sQwe}ql__gmI^BBRpn|;EaM>tn={Z!A8(R|@4&ibpaYwmGdFs&&yq@@SLgd! zfEc)m$B`>flwbVA zlZp8!WdM}*y~3%?uIuejHmn5($lfSr2|U&0k%!TTEtd}^%ZL0A^!bO4J;goa+>QEE zJ~Ef4xGo83#QQx_l1O+V?}w;E5ZU4l0H-%W;Vv+Hu%bCmDyDvJvwmDyf}x|*-1Vwl zh@MJj4Ey3`=aWKQ;`Hf~${Lty%XCHNn`=z<$c0*l=Hyl&eBwx7W7SZ+!|G&7W5Xiq zQxe2&fKJl~2$zDWHmA%{^w#dH8bN{IzM11niEMTFlo?fho@Mw{c4XItq)Srwx&Ao1 zA{T-k6usRV8xYU;rrYM7#Cftb zI^gkLUDm*rz|F*=AGCzR{hf7L$Zo0?L9tf{dfiP`i@sC%?Plle-kL@qC(6&_;nyk& zs+-A~opq#Gb%1jy0(J+-1)^@qA2Y$M#)(hMD!=bO2#z=TZo{CvmN3Ba$&-puaye(N zV*B;VxlBL27BznQwpRB*Cg1VXaLTDXra%ru9GvFlHgZ#I|TSXr%7M`EIYYzD5$g7w>JBWdb<}q-61htrsU+0Rf?0@RUU3x0CDbOtGr;t8%{d)#Dtz%e;Ridl+cmVTJ@Yyj4%F1M z-8}m~-FcK!M5tV4G2`pgrMRZH&?fvi#t7ZX()Bx%W~+YRdganEXFET!^V~lAEgY~M zdCr&wpd|mXELqXV?+@1#>yUg_51!LO>uUk-yaBJ}BQG=8?m6uT02^(ZO z<;$0Zrhl>??ge=31*%h%Qo(CY{6Yj9QV9o!5)I-FPMX`peMxkM z;-Sf6PS;^4&vw^!*Ic*H#PnYU1LH((jKv}t)dhpaEeOtzenr6%J?Gr;q=^R&&6C;N zLh;*T6LjGPIkoJ!6-;3n_!7Vwmz8`Y*83|0I*O(0)~Vn6r-c!%ulFUuTdV6f`Kq^q}{ zy5%wUNeJWRX|hC2B4xm32>ToOcUYszb~XNj5GdM)Ywg{P!}ZCbEa}?2vc$N)#;-s7 zwFTF>FL&^Jz+JA7Jh55}?sHS;CGf1DzpsALHnGups;cK5D&PBTE4_eulm&C~n9^4r z`%`&fV)ZJpf>40W;II^JbDRL8^|uq~2{JEJ&j~B@fXlX~E^}%I1CxNC>_qy^6fQoMPR(ntl*g_HNS9kH7a9kVx+uDzGJDOmP# zlj|RIb{$cpEP17t(Af<1{#R6pmB`7-Kvo9ilXI>Q*#!CW>i~bA2F=iD^Qp&l$KrlQ z+se`T#K4v$kjGF{l9%x;bQ|l8(dP<3+h93~RA)uM4Da>L!ALd@{%JsX*^jJG!S+~N z6IrlvP{SzCCpt&m(>4NkJkP1=!ZqoOPtPmPa=PuW5i|-rc8GWQ8L*^+=6~V{?%6QW z?c1EDo^djtZ&DjDb_Aa%{{dWT){f)OP+ZXbn*^hEjJ=w~%c%f9`(eZSR3pJInv7yI z*FjoE)-eMgh+QPwo~wVb{DL>+IQXk+R-y5^BS0=D^H&e_?hvIkRnHy_Y6N(SpTQyV zr|R+qE#T-mB5a|hqW@N{_9EYrLEJmp5l^xn>tHZ;4^|wX)eXxMOI;L5#~+=QgdlT% zWZL0NJNWO_2G8Se5NN*@JST}cf*4Hx0c1<*()BhuS6}EPc#=i+L>H)@K3K+pSk;Aq z31KDQI#_V+v$L=vK+9~0eUuuTu#1VBoU2}@dX6szHEa{a2bm~NZfchu0@dUu@OO@w z2E*E=;9mgL*i-}cZQ|&>)#Bh6bul9)q|7Pu92NHbUkWiodz}b+q(^pO!{<}L*D3P? zgDkbLZPg)7bW?AvjXV~co9%3JlyE%Vl{dMSYz1GG4~CwUDcPyG4^@jxHnrO{mz53P`T&rd^y93qrY~(DG*NWK}sihUxoqI zJWiM$M>v^>{5zj-x*_(^{AAYf-EOS#Q|9zahw#n%r ztC8GyoPcEdqvzh!^+krTqI4vwTKs4${|0gX0iVo~f!?)L=x5R=ga@ExgLI859HWoQ z(A6>Ocd(d^K2Q8AhfYw1d+h_i_f{n?Cm(ADj+Qx3Zm5ax9xoh_=?pK~AiFieQtMe= zp~*3)yXQu>dmIbotXmI#_1h$SFk&a0SGE3T&>J$m9m@j~d7-#MHJ9~6lq;A)D0BQl zeO;D$Ug=x>hn5U8vk$y{otA=E75!3{^R_zg;{q*Wx=eZ;UZ;zRoDAJ6;od9d0*B1% z2;XyQ;gGX2ScZubaO;64g9cS>)`i~r3lr{*8C3?>i#De!D)R6=`!pP2jv%ktR|VQg zAT!|rT#je-o}}cTFeU4!P%)jGC)Z^Zv%jUX?eN4t;SifsSGxq(Ue^=ETFJxCu`34; zGh5d6%~#Gbu|6I`<5ChY10_Gyd*JTZWQbkKR8%o#n!m44gIenVHTE?YRV+O%B;3I? z=$*AB4Q*)TW&XaF#`~&?w$FxwWhogl?SmwDTzHdZ5p4;L(fDE!cE%KN;gG)PBiVO&&^qi!n^KUolsYr`LrTHp_Y zxo3YMdB|cOZ<69~evy)3Ie%Iouc*VS)&A^*c*_j|pXTHorC$uM;Vgs_T>s8<8%Q)+ zcKXj^o!jpvTepSxnW=g=Ug!?tYL9Fq*K%2k-aYy@sY$ABhkPa|cwb#43J^TMT4x{+ zE%F7he3_*oE+?4f`+l}Xc?7fPG@>UFb*i(4Fe!oxuqmGrl&jt0cL{oz;NYA`Q)lVq z-``s&$e;xc1%V(=Ux`y{;II6IMt^GkG)*9z5l3HEzTOFF@+V__g%5G%q!3>=V%3|_RIJA7vqTOjL`|V*{ak(W$C7tLrDU+ym zsY_G_?s#dY{XyBNa0j_ldboUM6U5SI8{yZ0Jf+&}ROzJ7v63LMuPe~Z62q=e7EaZRiu z3IqrzRKcZ|V#vS7Du=QMQ{8$r>9-A~?W&eF>8{?wC~aD7@VdvN^J)C0&FW}5Ke;Hi zD!plHGu@kNgT?BIh=>$dR=I}`HU%BM_KvZXVwUDA2G^E9w}dgg8E-e<$q;5^3sn@= z8QfhAN=&P*y#$amx=TJ_+3Ud7V4?L9ct1i{*&^Y|v4$CHk^@LeU(`CjC?wVk(ogc!O}#{~V(8Y#7?&R~c)J$5o9w@T*V3CPU~}DbiK%TMY@h_b zp0zWtsTY~Z-Mpl_LFw!vF+@7%YWurrM?y&U0PckJU%QhS@9Nck#gyhULUr*0E?5SOpqac(+y>fe3?yU}Tl7e&fkbC9w!mngdZikg>la1r7SOp-EOgeXEv zSEcs5R43X4z$lA;h@UE8lvW0KmT!mJH2PNFZEZ;rh*FNI%xz;AbL5R=i$Y;NM;8b$ z_Ynjrv(UHSMRPw^7?^)lzq3~6w5w58x{~$fMvv>&R74j=Cl`SlkUYk~Wyy26-o_a! zeZ2L3^FaK!8^#m*s)u|}9TPMS7zLWx!}?&Lk6RNZ5H3y=>rP$ccwg&N59C=`AfJ~k zE>yv%M@yuL-z7iQ?(gNX#n!5$7GP0bt1kQW(gqOYMv#iZZpTz^aHi=$b>2n6_Olx< zd1W>Wx{`Oa6BK+_hB%l91XM!YZlu?KrGHd$=|y}->Oj4MEZm*!Mq&+7$!So2&?F!& zUCQjFAjFsMt=RSGi4AxD(-NnnDUf{SQ#x$XC#yQYQvjGT6@)8-Cb)F~0Dj*hUS0l6 z!4I{L{2jG2+qHTV-I|>GB<;Zzo_FJ@>?M`XwS-ehz1AUh8GMvqo}V6<6{A_0#T@Iu zcpwxflrP(F%{L*#4rsB)_GWdHTQ3E_w8YP_#tvSW7214*aE{k z+g5k!#ruP>oV_DAZ5tOUETTwhT=}B7sHmw!8A4tTdt>+Qv=>~fNM!q^X02uq;Qa5V zykQ=xVfn{BuZgeY^u7A1W}e=@wEta|IK-|Az9UFa4;05QMS(#X${o|#2P5&>q%wdS z#4-62qV9y7?Jttm7whL2v_$9o34Z(hih}jzw25s)ofohrUzflIM88*+tsL+S{klBh z?iCO_BjT8`B;qdkV=h7!YY2)A_3mXP2%<15Sd*>|V_Z|uFe8h#tv%49%&u*Q$Tn}5X!>TVQ1Hc!_NRH64GFS z8AI!lyiHs6wEuWI8c#Q{)i))YRtVbgWorq(TYF{1Y1bpvDNibNX(Es=9}^DHV_nM( zMH7-|!c*bR9oogd8-71y#l=%kZt(uo_9=*x=lhLwa0HOh7%tGEXA;@VumgBl_VzD# zekJcS6NdIzgW;pCTj?3s!*w^Em}DNag#wB5J7@9&=vtA`??wu_XXox_dOqce}Grw6Te#0$!iXJSTq_C zu&VNzpRPs6gQ0v+t$)j9ept|5xjTI%7oYV=my|DhcPWUUZA7>Dv{`BtVg{oFhUr0` zM)7&ei@T}bka|D+EKUKM%rkGdxA)ri0}Jnu(K|dkujobkweNo>@vM0hZbQ14{WNN4 z;17u}ah$lTjeBX`EM1iCH^R;3p)t;qLyO6uBCjhb(0fURtA?OQ@FfqG67rQ^JxtUr zR~%(i_YO*xq&3oM%v(0VH%13>tsT6MVnNK$C(`SiDV>btC6v0YM_bBA6=%R#>x_cn zxC^^NBK@?yr?V>#85h~meq_IYG_m}xbWmB?DUr$X%*X!X@*3N{L zx#f!o_mi$KK#ki3YB}TVgb#RtIbqV$5gvKTB}KCMr$&wPf`4OIR(EB z<(2Gv`s_>@SYlA@Uh?iwqD@}fFYN5=uZ?G8Ph zM|{0T!>^|uV>3T&rz@L}>LNJocwd%$nb?QB1N~;Au!{YlMJWT)mwFKW0XHHVJ>@B- zs+`TMMEXWaTHZOB8F znH;ejznBWnc^%V0d4v>x!P2-N8*X|GPYKVf42-=VuCUn()DcXgWdW=9ji4Q;C5xWt zgV@!DIohRBWsRr)EuTx(>^kqMYXp2r8YiA&kwgw*GOgmentK0%8DQ>NWizK; zV`~dl=XliQdf!|*n^Byawnwxk=829VtKIS{k=OmwQlGtm57kv2js291a8YXN5Smx? z6&&rq=h^Obo#HfNqBZ`Qpcs$ti0)&MeGKG4?uLxZ!SGPT!&9?%>}Ht{PlZE@#Py_9 zhBgChr@@yGq|<`dU5U&Q=&__u0lkvo#&gXHqNuZSlD-d<>bb&&LnDnsUM&;V(+o3) z4^I7zySY#_HJy`XuHb7cdY_erbN`aVX@x4U0Fiqx#}$D(a_2gyuZ0u^(Cz$UjX}{# zSN*wbGrp8-90V)L2j(X!gjU$uFH-}a$?IyMUd@5$IO-qEfveAd>R}YM+oQG@!>Kmi zxfObRwO=S8LjKNX!I*&EI|QG3n4AbRsU*5jXm%7Hu=d{f4;75pkI*x7%nXkaOnpi5 z=-Lo`Z}8q*&Rq5ZhKDn!@hecE>VE#oXgNP1&i+qi&0Rad>JMOF60RKGH}$x_bH z^qC2hG=q~jZ3nfr)5ug*<1A36Uqo9BT&}VcRS10>qryEhqzs};u_3wztw)_S!&%~n zPV)V5lww!gd^vwsEivQ2xS%MRD~x`QZftq4-zVQ=7N~v_?qwZD;EX30 z)TGw`2J1qV%th{DQwLm1t_Vga+({f9lN^G){iRfG$c*NQ{V2)S<#1Bw;FwUtW9D0U zAv7`GcdC%R+yr`Ky&!s0{q!EXGMOPCEs)qVyswyCvjtt~6BouvraOoI2}+vHnI^je zmnMzyz&HZJY~lFoV>n1E)~4_GTxDZ?B`LwWq0ZK!iN^U<@df}94ygGJ9E=?n;r3AO zsPI-$|19?F_|4kcrQhc+fKEa*|KliDE2xE%FW9N}a^Od$3zu z8-rSgYL32MPke}+>&xh68GYJjspbUD=Ihr|=|JBQ&Ybc$4@hvEstw+*_umYL_BH zS+ZWkD_++5S-i8@W9BsDe0@b#h}^BMdqz5akH2hYC#o!K5@Vs*3jSD)TNbOxbjn*s zk0@b2K!yZJ%grupn7nE+3E@L*X6_>_!GC-$Mo|9;Q8@d*&k}4h`3rD;ic-s7 z=`C}EZ*|hb?htkgY=XTvgnRT^`?$kOezr8$&HC>iImW%HEYz^LPPH&1yW8IkAp~U| z3IipjXzVf2pg<2ozS|M|ANy@qpBJvecvIKRnQdODgdm&RX_NKR!*8bOhF)8o_p#f> z0UAYQ>A~M3lwmJTuq=RhpBsCy&-5zZ2HT%ZnRk}+j>{>|%z);$6O&oge_X>+u(LPe z&g@~zrJ6@;a*X=zN2@GH$9GO79B?k5u31|RG)s$8(a7XdIK6zW^t|O2sX!xW60M5Q zWVZ}PyADcBukN&7$oq{{bhj(oaM7D$Klnw(o>agl#xLwt{8jzPd|Q{mN*gaA0vT|( zF@RdeRC!+|1KXn3u!oUto^ZTAd$_#T!D>A@pFLnYK~(Xk$Fgf`itK;>X7Opbb&ZqPH-yfD{Z7t0!=0F9VZFijFx(zJe+M_gH=f4GFZpd5?ejPBs3M7E= zJHQbbL6}^3evhJ6Rjk}YFsd?OW98{`{1hs9U$5A$+V9_B9fE!AzAwu3{Pp~GKH~Y0 zvAI<;ZN();@I&wUP~g)Cei*V6Z%+o;EFvkI`kZH~0+0;WcD94Q{^#s8I1lD0C(Vh& zKen{5hf{#wj6VY11>6X0Kp4n|H!tiCsg`^N<^XuzVy<8(yVG{n?;@Dpg7nstIp^)Q zu5>nJDmg)OMEa)gqNz1giooKrSAOonZeacJyQIQSUgA>%7$`=7($>yU5k$|mVbsmi zXgG6YnJQYPx%l0-RdoPmGPw0a`Q1lt29|ZNsVC~6Q*R+K|G_o2z|aSX0HyMs_dXb_ zmuG=bB5g)5h^((ejBhH@0 ziCkMlECPP>d%&9n!e9hhoUZqKaIMALKh^R4GQS%_RKaMH`N>};OvB>WEw^fCw}mI4 zZIx2u`UyKUZ_KJeh%N=-K6(uJo8HhbA@=|@Io(9p_2V8!UJs+Wz6~U^{r=y`cCJwQ zWV5#K%}EPr%WvDMBGdQWG<$;rZruH%egudP0Pg)eUl?G;j&fRN?MBuiA1QLYUOxs5SyBZcSH_P{b z&``s={*)9OHmj#M6ny-zCxe*;lxzn+z=IDgJTe>prI19PU4qU&)72YkP~7^zKCD{D zV%8^)Jzp^!>j>u=&BAF#m41o2Ds?NSJbz!VJFfYDvd5D-AMKpTajf#40xt9!;Co21 zptXlZ8b6^wd_U^&!9bYFOThe?s)?^>HhhIi6Qo_)OVKoidZCxYg@Uz{x#~O51R@0Y zO|O>HMt;{38w6OB4vUZl*$u`+(uT@${NLk*7i~BdgTF!*6?XcbJY5onDH7RhoEsOX z+nQG&yx=&>CTI=Jd%`ZZEIC^zWSd)U*)huhu+c4l=(uSimie036+8_+R&pKEH` zDJm*op6t|c?CI%gSON!==TTQsu3>jWh#?yl+5wD*e_HA%98#Rxb5+>%zh6ULkGhDt zagzJJn$w#gdNX!|F~a^XVR`MCaX&kt@uNUftg0PouF9LQ%l4_D{p*ak^twWj#gbqY z&{ONKR^Yzqt2PII_ByOiAuVQFLA< zg4+mwpM%W;^!PN_g{Btm`iAXg%4h}Y6>jl-d{2AJOZa-KVRCpcA*EL-+PI2yZC7bf zL+8{mdn{8wL_JYUV+t=#@Ma){(wB`_-FFTUX_0Gj7!DXoTQqGluasoS zR`s5;0M>GM>Q=cWq+{gxmJvO@suhEP=hz6Ja@PQ-dJ*R2#?uH6J@e|q2hw@E z8Qkg4qC=Q6H@xnGdw}b#?&m}YGI?;UNVfx(? zJLP`c@hm~fj#)mnMUR|i#cw+U;47%LL?k7dpTUyoGFymSv=7Uiz|_3mLv6FuCTrSylk;S@W9 zf4ToIrA7KaOUhZW_^tLGsj1KX~1MLw#&e!tB-^NQWA z|GB!TH~G0K(elHG-dk4-EbEFu`T$4Rxp*p=enfNa?wb=bj?=hiceBrkdgkm z+qYFeZ}4|$Fi0&i@^Tq|v1Be)ik7a&;6 zu~-WZ@&jyA*~aKU)|r`qH#7(cIxQx1ii!~Pk3UwfnB+f9xG7Bx-AE>g0XE}prF#&1 z^6dq}hUKI{i)-z>gU9h&lf)@wKRL9>?fY%o5cv~M4CGTdSjVvE*)uWtC5Nswgmv4q zN<}VfW&9L^yXF4Utts+{MVWB1g_sV0S{dA;<_`{9w3_To{Pnr+C~4}akW&A|rzPdT z7DFID)LJdFW}wSP^iCR@H8|Ql!j!o)ex1e~Z$g`~+-f|0m0$bzPey8r6vzhzt3PtV zV51-4no$6f4^*Px{FpoSLh3+Yz7lj%MToh^3?ZhIdc%r?wvz4p;BT3oIuanvg7-sM z)ur80RO$kRtbrBb*)!-IdQu4M`JVmn;{cUSR<%J6<3|D(5_h#&6BNe7c`rXg7)}oP zIAZ(FGA!?ndiYFcp%lt0pp%}zhC)hXRUcE;wtq3@kW#F#3gA)k_*S$%-BP{i_s3fY z*x~&X5kx9NVF zE^VQ)yF7;zz~Mrc|32)(o+r#LOvGjKOVaM2lh9%Q28;8MH0S-W0vw8b6GVtDhh8FF zk0Ub8x%~}!w7_xS_^pJx-~H(E+GX9j51wguruguXQ4!}#15%JgMF zw(*G@SpwZNENJ5cLW9I^IE8(pv3kn6>4w&@xb~+M{|xv#p4bB6>8EzXbx<6f`*(vO zYjD1x-XgRuKJUqok6kBLg(hCwIy5lJ0Z@2S@H5tJ z?$xfflP2Y;XjKPV_@wMuh?q{rWXY`ylT~}SSB>XE2U7&b^(G=4luXOG7P4K79mCL7 z?#tNqIz};=&xivl)uzI3s_BbTii8&l(i^v#SN;bU9=(JIxBbH{l!j)cCwRSB8$=WY z`-c^TtCn5rjfC?Po`)TL#5EC_d&sm>&S;g3Kh^Uo?1K$AQb*j?1#8@%g)Vw$)-KmC z((G-s5c)T=|61Syon-_pbNjppexLM(h$z!cv*fAr?lOP#%7;^uErxvp^3?CP|GFM$ zcbz!Xx9DyDOb44D)qC=B-*!j;JU2?uX*iq$5SBD6$hXqAOoBuDCf1NG-=e}`^|~vx zt*O=5$GkSseHoHHdhcQqjYK5e1RF=JMT4*gcIpb;$gYZE{5=}?cC#{}B}q<(tZPwV#jk7EX4OAoRq*@- z9xP%#@BD`b)&h@uA2agCJI0HjOwA&zniBc(`y5Z<#6Y7#yj+=Ktrx3fuK9i|b&d*ExU7YDCdgJ1MLGy~s)OltTCr98 z#fZ78FHdgA-4Yw`FKhBRbRPOZHTkoPVw!P&7OzaoML3IxepSCtl$xwpXis!(X^oST z**2vPoNa~;-#ywCm%jF$tuGp9b3=>4IN-sNnJH4JF*1K?*&pM&IX&howVr&lcE0@| zndXNz8S9}#;!t;?nfzosujH;oS@MmYOTPpA`|7llDCcVK!C*;Mq|$D!M8ON$zVTj4 zpI?~E5Z+TrDX8|G$h@`(sgVE-=RgarhFDTk2fD5Ks3A|Qr{-cd^R0I9wK2)9kb--& z=P&+I9iVHI5JZM)U4Ky5{=EDXk6(tZm(n%i*>JE}7_2`O?Glh{6e;#Pk&V41c;!gX z(`H`H)AMhBhpjnlCLKd$iALY4FpWs3SCy4J0yRP?0-&(RQgbRjWWKZ~GjiTc(6l<8 zI*X~Zi`1>BVJi|N&$mMUrO1Tga!-+Ya4@2){dBL@DZBa*gEJr<-L0i>)rzm0FjDOd z0kojHjb01_<&qQW^QX6ba$?_ez z@$#M5XLc3oIYq9&(LW&A$76He>oYN98)^bJxP$`=i{|NuGED4;+O6&d)klo&S98}K z1wZIq#+3y}lOLTTejxtbv360v?c?H1c>`^0aV`PsS3tz>ZXB48zLxIVaN3{L5h^Lq zXdU%bEIAfDn*z=nbTyHw4$p-fi?HZ{Q)3$o)_HcFM?0Io?5B;%l#b{=TvDn0T(jTv znu6j7Et<#%*ec`TLu6319rTcvyVJ{piEE8gwrCBQv6TF{Wt4KD#_z{9M{O|G8uNK`K zfgVrf|MLD&@_@P=!L9-(6oC)KCZ&8ikfP5@EZ9x492vWnvw=`p68vP+%$QRoLz;L@ zYy$oxhdc}h*xz}O299nN2aI{#WwJh_v0*CeU~eZCs3J9lxJZago4*)`l|MjP!C}n8~Q%;P(9E7viAzN_jo%@j1|XbqCCe^6-vEQjpnDeaLujOj7cflKQG` z+aW)}E_|`k?TeDYD=`|BF(ye@`H6B4g?ilI`^oEmq-d#F=i z!YB;xIrAn1HV(r52rL9>z0m)FLA(pjkNpxE;KQQDHyV{CKeG2)a~WGXQ4iaEsi;Hc zH>(QIA_5G}ci!+}a9viEM7{S_qQtmlfVds+JWz);tk`?7pPsR_&54ylFLrr&;N3ptQ#`EHR;9MO`_Gz{e(BUw5a?Pe@8pxJGR0@x8%*evN4&fF=vc?1YvEYQG-pQp7xZtWanfl740x5ULbXB8-j~Tt4W!pjY>Y}~fM@M;} zr9hGtJxS(0L!eo((Y0G!d4Fc}R>y`RhWc_~8vikZa5a&Q6>rp7OE|_JbU!>wDW?$( zjl@Q^rtUNSQ}=oP{&QtTQGx4zx8SeEWban%V$@lI#$gC=sf7hs!aQ!awZHdx&2vz_90f~6;q{aapQaxQ--kDGzU77QH7Krx zQ>@W0RL5G4tZmVnZkX-;Dyo*!s0a;No%s9F2%C1h)JU_$qpq-F(|0n*Rf1)8Xr=Kt zaS$s-wjv;9)30N5*SvA=CW^?BcR9( z%cLxMp~*W~NS`71p1bD_J6&j74)jZ#%COf!>N~|dja%^N0+0`>BZ$XetGP>geav*@ zyjhOgL`u#DQ;sLF#}OhE{u>dA$RHu|xzOw&@&l-TmdKkYz$RzYXKsV3wOqRpqgFy3C( zUY=7Yi!UE&);9k+H8X&p!H1X_jV4RjcAxgbg`@aPcH-Y${u0k2*6)>8jY*b9s@^eS z*+0?ISX?rOl`sBF5o+IgUXq-uP6?bPtf&{q5slo=12JSi!wpZbZbJn-n?A(}9o{1g zO6yTB&+Oa2X8ei*33bfbf3Je(i}1k>*tb~9=pU;zi*BKtAKckjcpH=EwD;MNL#Ff1 zUya(hF0@Jl|5yy6PjeUfOn~CBFWmRd8;Pu+m#XYfQ@83n@;Ml2BRt{GJeW=l}{PlJ`G{$T) z2`S21jAJCe1w{7%m3H^Zw^`(v!m;0^>0a@4M)Ie2U~Jc8Ns(k8*z0J(q`8yBkiWzg zCRM*I>1m(?s2M&iW?Ft$qiqta)V!ak zBX6DL(7MQr-Tv&fHX|Lo^T4|b3K}JT?p(4PzwS{VKX@Q}&<8t4Bj%+3!GSS7)EKC6 zZ~RxUs^a=~Zn3=~M@M=(@1~K}T&A45rUZ0nVs%od7<^%stDOgc1cZRjmQ|tvQ9-l1 z+JDh1q4EAKzb#HMIeIlbNV;p_YNtRvbkqMe!OG=>UvlG@0_dKJy;hO6L}<0ZQLtuI zs10*ml7;+@Q0}Cl#`-_o)})3}>V!Z7iK){U+$e5@=W!(J2F$$>riz-91li1ZI%TUVT%mD#rliBQ?f>{x zfYNSp30vNa?sO-$AzZu{BJjn8nst)w`j=9l(DmUzQa+A8JPY>gh-|J)pCM^&C#) zUFIyeUxsv-faXT20kq&DM=C(L@x9bbzG*)y+BjL#_Ho5yB5Gk`__o*}zwcwlj-Q9^ zO?%1Fs*0b3pZ?Q;U5%0p4W*;wal>FFBwo^_{1eA^>&l!6MVR>Mt2XM~;P`aYd>`tk z3`YH?Q%)C4W=#__S^4L!akXhAap``i6+V}#^|Voo-bv#`Es;`6;jo5|jje{t%_DTD zKItPsEl+{d5E#*a2odPy_`i*9qjb#N;o3LkQ~qn-zy{RD7&bpq@$3_5#h5$(Hm(M4E_zSz z!l-d>dK?vz!W3^~QOr8nAS0=P__OYnb7zI@@lO^>SXhzIWx4yHESD z%mY);Ex#5`+Wd-eO=&yaKi=)(r}en^e;sm&CEE>jKV1&#)*I4p%p0%|6dP!`lBB|dAVOb@4Nm| zjuE<(Z+yNM!*2+HDc4l<9~bNMlp%lMnI=hq{+T}G zbFsW9t^3b5dpu3SQ{hi@KdEsh;FsWe6?|j!EG%T5#P|a)iq)*D2)?T439_I0bGa-g zvcsL9C;HfD>s{rzmK0s;BegmREl~??i23=^p4Kqk5~Pb!94!nAJcKumLjcV@_Q;zc=1t-~Cp+nz{7aEII{~mh!SiGIFN7-q zxQ-yop?U$5h7Py^1ymwx0HeoN)Fn6rk5nPONtO!w#IbzPl>e?1P;lh#$c#8dS7%HY z-LOARv#qK1gcwv=h16}ER) zP17jj&lx}E@jJaN@DWJ81*QiuJhNT7{vW+_Egyxg__I-{7v_i_6+l--#~j|vyBDk8 zd%&x3+9!TLVeMmr(?1*V*NkBsQVX+qGeQ7PW^Apg7qsBIj*r}s&?vG4cUzAo9C`+* z6bUKNV4O0Xedjs5b9dqhJ8NV8$i*GJ6mT<0h5aWTM!+W_4KB&J%N_(f(2&Jrg#$-9 z7J;cZWD52Ola$Ny+@A*tg<54~%YRC-+oDd{`tUCWClD{FBAh^r7I=WG_|E&_yp}wK zs^v(O2gm-cjujvzZa`vJ?#^f>q}hcYeB6QduxBXF9eL(>r}6rt<+SZyTc%#Q48U=q zU3(Dk`I*}YZ*frc&DixYsvp)C25xE|uzD36Ble@g!ag z7+NfO@EX37^bJE4z{;-A67PZPZdSHJ-l|_YXwB{4>C1*GvREBFS=cdb{O99S@osC` zOsDAEnJ%9hfi1UI47AflMuF<64`Xp@Xz<}Uu6o@&9xh6h{H^h)ld2Ub$Z=||EeSYD zZe>)B1WA`)6!WIvsY#n7`9We(O~;2VK=5(_1pVACz&ywEQ(-yY-*0dxc&>+O_2kQc zuX!tPLkc|6(`aAzEgH?X8UbM0R|9n0S3heike8oRk3g`ds{~QkXvA7J0@zCHPS&vd zt%OMQCBfSZ240f@o3k6Q%+J}#Z)yB_?*iYA!X2uCrh# zLpu04f&%5D3=~1V*><@N%G}qq+a27$REmdQ_fx+-C^4OuXP9xE$ig_@G(p~mgbelL-;>lWHNq5on+8g(G ze>X1+O0G)N=xI{)Q8*9*^4GfrqEjberl@ww4PQXjgspZnau9YNO$B&IH!XN4OTctW zpfz(e3;0zGQ_ufH-FwG1wXW-;QADI8MWjZhNs}g^v?xdu0qISQ(px}4nuNqg@1QX0 zN|hSvRYFHVML@c=P?Qo#C?P-+&v2gKT+2E4Tzju`@44sf`vyvHA9~?~ad}oeFZ|m+EmVpn|lt|>yh?Bs7r$x5As!_XS%adQVIO4a= zh@JC4K;7JAUG&8 zss;!S62DXZj!>wH+@~2%sge7A?JFop4iu3Qy<|76@fdn}go3uG)Ex8wSABO9(~JU? zL8`h1C`ocL#6>C`eN06$-miHWwwu}1HSuWHcH zlnX5{?D?ks^$N?e#p6%f?c{jxNbg=)7WGJK-pXBn-3tfu3QrR$09%eqZ7!FH?uztA zP2ITli2nu3TTV@GxzVWV%#ydjrR%61h&^(ul<=5b4RH&xH-8szQvDgW!8Jehu=FC2 z{>ZaSU)-CE#6|5)mQQhIO-7vVi4jLN00+NCVka)*W!D#Bb6p`f8R@MX6n(xo-SAFS ziLFh)(ddMnX_V+XAtK@b_AJLKKnRb)JI%n0H5>02XQBP0S(%lcZOmWgUs|6d|a{XUO1@Pp_aJp{9SNgk@lq` zF=A8Y@{1C2t>lq3O?fo%r1rwV1L!J1PZQJG4&gu{lqjD~zH`?Vj+d)NFU$x4ixENl zT;!dba)OT^9HVg^NC`Nfx}jg1;2#qg&L`@EYV4C`C=GvG5q2_13|6=A<5lWqaUhw9 zYn(-<79^Egc?nMzr}+)jy(H1JbLbiPtel{iogB>qn#?ZB+=#T*}WVFBgVs~+`J zpz$n^DnFMVJ-}ZXHBxNsXvbtOt|qalk_<;;R;F~C$(VC~ONP*;9H6geeEjm0T;6rNA?R(S116M%sCZ}5a8A%2l zqjnM5t`6s~bPb^AjM^P!nCe7&y9#5tFDlG<{Z`j^y#57qKU3#>ZUh~<6>=~BF@mP0 z9^k{>PZP$6Bn*bbO%|gk-EF1*C!GK)92a?u(iRo^s-YE6xVcGPDQdbw0dRlqiU7P7JY`5w zBqECf-@%oG@!)m>>tI=y-5Q3zp?s6`lb&NDPhU_+FY8T5gFC!B(mjSFHsJ7V=HdAf ziJDke9%X(0VR4vj&&LzDZMykSxV&jNW(orF+Q&RBcPYc(Z%Em^$l;jbl|Ju7Jj=D$ zhI&@oJL+P`afkZU@N!1Fx%FL@mU?r4w|yI!yAbNL3V!%aQF!5N*Q=6eQqA29<52^Z z#0*?A<&+$dG5pq+OdQ9AN9}r@w5==Pdsmp~gP4;mc4GY~KHV56t!Dd5E>%J!D3GUh zmmCL~j{#RhH*(%g2X61*8B;M^)VoiK1+Yf3W&Vx{`8m$@u~BdQoJ>~I4495_T|M07 zQ|OqT-teA6y>O8AxZmI@*$jB2wS%>WcP0lT;QE;(FGWX}o}&WWFP8eZR=GF%1hh7t zj=}H_a&gkAS++*&D+iDakK+tUY;A3uj!giTQq)v&IO_8A%`q~Mlo_E zVrFRf-k0U+IV5Nxc|Md~`*0@=oVbd$-Zj%QU~LjMGKu|d@^uu3vp!q;`ym&;n8Y4EK}DD*k#3zmARnlxrK6V)+4j&+kQKraTwJ{*I{RIA}i7 zMF2t-$_u(mUSl=ju`6R}ozl*hpd)7ZIpVV;(^X_mU1RBbA8IwnvAMp!t|bz7E9FD3 z>U%qh>%9=^K@W>=e5-EUptPl1pv~Q^M}B-W?(a*orLbP(fw&^||xZD&x()?$1V zZ%})X0~m@qAeIar0<83Te0cYC)^K}4cgdPUQgT9}RcH+WZ$T8mk&PDJT-_@CkYlNz zqDm^wc&)uO+25_oI|tt-43mdcq>{h%I1))695W(eh56~$jf$Jymq$_VP#b^eRhs7{ zalmV*3bZ%GIX~ZR*r@p^_DNZfUZ=Y5to`jbc~?b1Oa{7J*6c=5=qdF~cDu5aNXaBM zHQy}VM%|frHolMI718^KAA z?~f$VUtiTkfW3g@ydl4UZ0x~l0U4yx-SJ-NflyP<7&Dpo<&M;Unw0rngWD(PL5Qd; z+a_~?r0(@UF8Qv>ktwAMTvd;)eeJ5oPky7uG(jxkJC5C~5s&n&ko2sX%%l#I+=S)F zxmZ1YBgE_MGI(>(?IKmj50GO#QMhPB^XLq*-jo=6bd^L~H$>7cx2Cr>>^dy04k=wr zwh3cg3aK{A4jQ}ApWjo#{=)eBl*|Ch5x5)$WV<{?m2`WQA`90cr%6JAj^i1h@O+;l zF}5bU;g+c_sVM}`+wJ~XlA)NgBAyLuV04XN8=pa7AjhL!q@E~o0s&vZJkzsMqCm%I zYt021TYoTeL$fwQ!_%YiNs_x(oct*iTORd+?^8{qpY3$Bfb7QjhE>Tr|9Ns|D>EaH z={VNDZp<%B8~R1weZ4`zu8;of8YkPpa+saE=X7$W)4LKtNS)IXI9+C7eG!)b-lF09 zhSIBKF+sX@No}t1I)=}jN7*T>{uaS}XhuTG9W8cu=)7IoKvr2B+0PQqLJ@>36E)`F zX)LpxR6^suBiol<`s_nN2~E2EOHMqAFT;FJsf=^rqY2#Pm#q-^ z@y}={pyMj->oNH0g_l+Q;9F}{n>$RTYpOhFQmVzMWZmMh=M7={SiM^A4U6)>HW} zbcS?=S6KVFL%SUOKItqLgENpdBE9jafxfz}s)67In$8gZBg3JE#xqK{EE2W{5l6n*SURs&H>KBk+a329?8xm)L2802tEPBX5=B_K}H1Y0s$5zMA>X2sc+#S7( zFE=HZPDGxIflbr z+u;x5!B-5`?(-rxd=HqE#@|C~asXT!!JC}6C+Ti54!7km!icK(Lc&POT#Zekqw4o_ ze7dPFVY_q|-d-^mpcx+6Zt--sm|Q4s)T^>sKM2Y;cg|QoPzAe3zj@7%oi4(V>eZ_7 zQc;o*>8;YPrC=_aL#vatZog-{+FSfH?nc6xLm}0iogp^8vx<1$GoM`t8H_sF^6M>< z`YVjZ1M3+#Z{m|{Kp&>ftiqS}v4D-FhLg*FfZScr5$yq?lq8}SpJq8$5(^jg^Yt#9 z<50Oycs})kkC0WV6*EDnOZ}u2w?#QMcLXQd6Z5?CNw+?q`%H};LBayVZSmCa)~9n} zUpLc&sj*L$GI`@Et9=FTdwbTRo(RWSya-pCX%-W> z!vJj%EYCiJ_4Cr+y0Sq~l_CI3;nQ!#3=H#gn2PF=?DzEg@V)cJ0|2|UMZ?|wa_;fU z(5Q=$VD1#LfHR*yOXo?x{E8d@i3?z5ek$t%2sueQ2Q9vTq2X0FF>|04GMupZDTS45 z(T_Z9M9T_ax(vApwxsmU;dCLBRP&+OoGx)lc)e0;#KVq(0{2HNMS|O!7cI1M`WW7N zQMVe~_sgEV!@^zXfu4Vv^LDctk2WV3W6)0?c@`CyFImWHdV4>RSZ+M0tV4)C_hcW* zTE%Xs>nND?usACad5R2O^LZh@d$uZImBb0p{}#MPY4@jbx8%%_=OYbVswzTFTTsIbGLlZ_l)3MVHcd zdyU;Ii1+=PAeoIEiJnh^97Epc^O1_-o}MMs&jL-p&r z@?I1xqiXOfhs(|9oC>_u&nVZy&s8~$g_V!Zj*T1ES=v42peyCR@c7MRF#vggcHSb3 zGQximJ%-?ML!2fCp~%r)^(l%}o%Qs*h9Xm4CKt{wW|kS z^yNF^8v~Z#tRU~3Aj)&q)iYymjR@^5D-!S0V2dJCgh`+BQO#?~P3E(Q&FdlMOF1|r zscF4CuXy`T~@T%?1rOcdM4O$38mp?rpMTeZ=XDc8vDugr)h^wjbp$Y zqp0qqhZ6(Hg>|ylm0d>8-ZSyu#WU9`GzX_r;EA*kp2}R5Wfk-|u^k;UvM?8}Mum%u zEF!vhsBaXPWLO zpe(}UlDzC+J#(qP*&pK4=@e)HE>@B$EK*(<+^wyfBn^Jt0&s^LUPr=kZKA&W(XCTb zwNhZ0^pD*y4`*kcR4?5|i-rk-V1a_he4Wy;BTIX#-4qBF(Mh~Lh(D7(B3=4P#2tnC zuL1AvuI`@g5jVOJr*hz3@~vVh$`26&)O)1VK8o3W6BQE4zth-gv0dbtyP8Wjq>}C( z?Zp(B>rZZEyi4^=hd(zny&driBn{dSb;)gEd;C{IC*IV#V`G`pi`L+{Vp>+Mr4yX7(v+d1@vuM+xTd}RxZro;ng?g7zVu>!Ra z1|jm(?4kzYIz4tcD>eQ?{`^-nk8~UAGW45^JmX6y$n>2a!fZU5cA^;39`^||S6$&` zU8~YLv!Tt91AJbWMfPc;CI-pwS}J~L^^kg|yQ(d}Stp_L_A4LD1Q1o`csCTMu@&A_ z7?E?j#TMl%H}%PBWaGTvZ`_Kuxj}*_q-lt`q|yyk9QX{J8W-H|+%Z*tvC zoOmk!rFZ%4t%2ybzxCO1s-2N@%Z^36WCqnY>FIln9%kRAQtV!C5r}T@dA8JjllIG~ z(8g5ir7_rg!ANB}KztnsU-&he`s;fRCLkGkZaw}G$iKY*GWzT2^D#i*;Jwlur9oty zLtf+8!Jn9H9RHzYimF@(7!McFho~tuWzet}dSq{MzSkG~=wfdE+uXlz1x|%Q5+$LB z@sk>qL5sGWqY$V*90&!HY>LT0J*hsZEMPC)et^Cp`oV-ptpK`ddhO7C5k*RxFQ@Ka-WhWc= zh;-50N-X_1l^LF%`gHvx9LRVw0jKuV9XZ7M1%g9;K@-U#{F;lb~L(ZowRBsS04VVejw8MgptUXQ*LcUiws>0En%+nVK7 zc4orWrKm2VGcdb%$WKVN3uoog{KR-0TuR}#PWAWtbdHbHT~sXPE7Mxv+f!*Ov~&bw zvXO)^0Mm(pI6@=%&sGm3od@=bL2tT4R_5Hs)%UGj7fyBdSuVHSxK+tu!+^MbQr36i zCn)aOL&WJos-CSfQUI|P&2m|>GB7OqOsH>ui!W<|lhu5yeH#Pa%X49>r%tvurSNp< z-V-u5D=psYAO1FyTf?UsFlMW0JvSDs#_^Chb0x0q-bcF=zH-y^M(x4%tzb<~bj8j~Cw9qgx(N17{$*&r3zk$`MBwVp(-mG#7!; zbBlOW%6ePd2KBb>vyGjCT_QF%LK!skWof((gRX3?j5tI?s_Qo!8@&)NB>&;BEkLi} zspVDQj^aIttI6b!4>@D%2o=2?(loISbbTU9fy31x=6@yBEkSBIg>M;S#lAl3% zj!W%$?Q>X{R}hle{W?imTX&^OFFqY}W%?!Eqc;LuO+U%Y7$i0nS2BGKU`IO|PWoyS zQB+?I!BG!+a`-e}Lp%AuY&+H@ttdP-$&ps^xeSM$ZyJB$lOv667vZ6tf?*7!567dC z^S^Nt(rIF9<`@U;F{l&T!DXwyolZN~uo8!Ax$g^-bQYmC`8QDMrhSnhH6%0Xj3Qxx zIESn6%Bh2H09aUtAy*tqyWvYAkm6K3Pn=p~K1)O!yiKuOYKX* zCo~>=237~O0#y-{=-P1-`~Jc=?6)IL%KIk6wj5?SP|k18?JT@Q9PYFkhu^glJi=$2!~*v#q_FRZX9+!($gVs1G?6_ddHy7ekxC+=Tr(Of`2ZsjJ&c)%Gs zqgx?Fp%(kXwI3kP+Od&cLpm4lPWnF8{iF_?$Pd-!HU7A&%|xI{h>6f#bt;J?x%)0Z zzNkm)DUekV0t#`;hvvG5ZpJlTrsuv6-dv^|XKuX#ed+(~8dx0JZUS**2E-0~wul$NK%pMslDFkN zpYrO6k8EYEY<`RD4cp_>Y%yAhRXALm(xY$gD-<5v&H7B68+FB6Mh#~(;DDN(B1Mr) z)POu-J4{U(*)C9P2;4@<+x_qhW4jQV)mHvSVwyYN@K!M7jFoGZO$4$UE9kQP6tfJ& z?5K_1i<6gQv5FExG<~L7E+TQVb#~FFH3!6;OBMflS&1 zCB)Z|1z~(^GR79FPxN!dH?0hGPJL>ABRKqOVDQ z(++cH0S8H%4SrZbYa@OsJb~i01|z{VfIhd^kv2F!2V9#I{>ZQcCV6>|Gca%Q z`C;f7s$8?wP$FG^t)&OEXlTjcbHFN+a98VmG^_ZQ*Dr-;(CY8GuM0mp?Bxs{KWo3m z?$GU3Kz+aR2gthl*N#dc+rL}5QL*UxQb>*dU)wo3)*G$Kk?->Ew{y*PWhqvlW?J%$dB;q()X;9omC{nr91$xvx^?!dD)OCUaJ}=0 z8Cqk#LA8@64e4qpyLs5W9wiE!59Yj0?mgvkF`k+gio5bf!sXeqYiB`B9a(q7 z8F3VvFrV~5Ua?_ui!tMMkriNhcC1p_6vQwDusMy&Oca%6N9WrQi}xV{g5SRXBxlt` zshiU8$$`mrq8l5j~a6L ztylPrLgHiRzE4A+j;WSz2N2qTi>M;`lV7!-uLn|%lS(i{!=dFD6IQdXWBQj$Q8Fi` z-#62Dl*v@G&>GGHfZmRycz(l3JY0~RN^-Y%<$rlB`Y!%VGM&N5*QBv zI7ZifwzxmjP3f4!X#>SZARnigj87$`kL{H+-x@DS+V1JU*J(1wo+=e^IVnt9Ydd7j z(fP%h`<2#L1rO;dr^rAyyuu3<=s8WuCch%d6}x6jHCv5$S}VLN6d5j`IKj!P-p}Ra zx1+^NDn56h!5cr!apTT?Z7R@_#i&z@(X)jqX7RoY$#Kc01=BXu`hM#n^16~-_#i17 z`-W1M>bUdC-l^~Cl(xH-tq)6Go2pvl^w;90iN}sE!0E}qU19`O1Hz`X!ab%;{R21^ z#v%y=<*^A)IbLas6}G=ErEg+@q6clwU>u}su@A^c$5S{;H4*MMY*03{FXbYls?!00 zK++6@Fql^B@*7Qcafg>lyE>w!>^d8(++n_{=X`q4ej9&cPzL29ra+i&rjN-9CV!PW zFSjjz{D8!y8dUb0)-)+5z}YxDx#}u<%4<Qusz;sBDt*o$goGT}Q8KYORhz zuhz*?g&I>lx_!5EoPc?Ag!nR59}mC3z&y#efT(_>%Z@9|!$>MjKDKF&6qcF1*2edt z(_QZ^sp#XAMn@jRKClmh@_tGY=(Z#M9ZZw^baXE_#|v+}SITKqZeRwz`ZD4~Zm3Se zf={C8Iac?*Tdf6ZbPLR=o1&OX_)zG0r=hcOcHH5kS=CGN#hv|EFBxH{$XJ^<2im2S zW|Z8x-|meeC)3+B18ra|-Me3FOr^C4*SBB)k&OR$UjMxJuf;1+^S`tIFW;g5Q+4Uj zm8Z|Y7e(%x;i(8WiPU(-#nwc?N0>boJjm+Ga$O+bThN8K9b+C=4u(PA=|mYzOlL)=RaB0qHBM7%_Hs_ zXuRJ$&M{@#%0b-TMeH*n;ijaBt785;?B%1uviXgA*^j!i@m+5(?ktTq9$&{cwC}J&n8WtOM=73q5ATDAScsc z>UnL`eFNZWw6atYL+1II+pO;kPv02A)*Sg57`(T$90%%+O!}eS7I*=fo==SG?5iU& z>8>{k$;-jYS0<;Of*Z%g=`}iInyG1vu6`*tHquw*xhtOLS&^TP*077Zh#EHh`1D`F zkbZ7|{RO?m=MA8H!3W&wzYai`=MHFWet^bLP}B?GJp5(w>iDk*{M(8XLG|yXq1+s< zY=)pT*-caa8aV$kh8qGm9;jRy9bH6Dt`XUOfV@gq(Q#29arGusw7p4zK*0zM0Ia5z%ysGK&aV1+zCGxp}(2nmS^ zb}_ZPa&Gi(geqvdtq9psluU^Vh(_XoTQM=bY`>!ItNCCKSG)wYPtC#rf^|s3lYgM_ovhp=P zm5oTpphV7W-(#w$L_Pyq{P+odpwZ(Nx0QSS+!>LfJltBJ7h@5@B}*`N`Rl~N_j=fa{J-RjQGnH$29HZ+M;dE7#Y@g0ZxtfoPpPE1-Bk< zW*q5mmU}k-0C5x7b#Vo$gwP%oj6osw)Kq4Y!VQ-DX%mO{MCBoIDw;tH<>#f!a${${ zou=SePnyLA9$GBskl5KMboT+MW+Jh?j50V^wQdVUHp+g%l24Ma*9C30s4uDbT=3|V zX3;Ub-q`llfX9t8-U+`Ng<&uWRlcZgrMr>3S4C!nFko86+aL5W8k8?zRn`&@f=EeL zkdA7Cpi!5hQ;HNi)R8{1+KPCeCbYgy9890tH$SFj3*?KO|88ujv#zs80IV8`&AdfuW)_D)|_cLj< z(^7)sG|`h(P;wU9p$|~P&SuHb!;8f3Jt?_6G26TR^|~tyy(@d^s3EJ~+wImMhGQp~ ztJc30>!aOon)E-A)MnOyQ`kBjRXy&6+MiU;5pP#vQ)em4auOZjFuE!)nY*-EGo!0D zjrA{oH2?_CNaodqD_^)4o%{*ZRy3rE@NPV;YyY``K@|}rNFZnjPQMd_NW&Fj40}}R zI}cln7-DlZO67W4zz+w!FDcmcIGEqwu5p__E2?b6-;Ix7WDZkf3RE<~BO|4TXBkBd zf{*$NVqQc|Ne>ES`gPjSv#_dhID2J40fx%`t;a6;yBQUQE zk$bVS7S8o@{grG_hu((@Jis5sQDv6KmoJnR##(;qUCfgYD}1-wF8n2@GjB$*XwV$x zJ2vnjA^qi})e`TSQkU83gEZt@09vC*$ia(Xe}Irj#*_(e{`9)Lyraus%Jtk`-&7RC z0}5W(e@N1Kd%adrL&n00osOL}4KXPJykw1q;}R%5%33Q5^CQyqQ@R1LHZl zM~9=Ho7$f(6-;#uXx<^QN`H`}n~Zf-N-@_JtkY%x1>RCx`>XTNe3!QE4;x}hF zO4|8fe9zzA%YQZgH4^_%dmEc0qiRc$OhnIpo8~4UCL;kw<>lHH0~oH~=%*&7b$2NSRh%Q^1!5s)iw0fKR z)8Fhz`l=4oDqtEkjB5rmM^hFDcknp?*aaJWbR97au7Ln}Kp#C_5+9(Xy}IIBQZ?b3 z1FNkX;QyLbwvlnk=>W&2NOEQO0_zDIl~tuKLz7f>CMEdobM>kxK7 zzRR877;Ip)ZcO9OM!9KMIEd7cRS|xU?Qzgqlr0%pZ``E90R%yBJK%Fgs3|qmd35L& zS{=Lw8#P_H&QW8l>+jfij_(cEV1JBu_yU4WvG>6&+q&^f>(Pwtde4z$@0(;vrzY{$ z*Vw?Kn7(a_KzGY!`JgII4CF6lau* zVPQ?On}3A>O!h;LWC1VRO8<#B1^zD%GFj9ufGpX`J;dM~GtmEe5ug+uzH7_qQu6Dr zh%eG!R`8I_3>tpVge`Nr7`Y#CF7&PUd5#^$4cHMY+yZz?QsFk^q!0|4uRY&2XS!G_ zO1?QlFg-}P$r)BRG%t`at#LB(xI~oJCOf4U(Unsv(t)0^SumYrRO6n#yT-c4*|Tpo z=69hrWa&sfjvW+H0y5-HG_Ngboc89KrW-_(U4j~dH$R=r60lC6eC>ekeV%+>dGov<7;=8Jr3lW z`*Ql~l^frAa>@axDjC2ky$jz!9*Mdta1VxK>hQ>@`EUz7>_du^ctMIzr>66zg@%x< zJH6GL;j(W*?>Q`r*BdQA>5B4O5`b*5~tyGhD>lZjbA9}1HZ?_E(Eap|cAm1HW zrd$W^%yQAdi+{a@{MpR>o#py<+rPH@7ms6q{o=pz{y$mQ{^v;{d;oXfN*s2l&xX5zfnJRL^vsW8He zFD(79AMV#j%j9Hi9fZh59htX2B&R{Vz$f4jiF+96ets@>TfCvZbaZZ@Fajt?AC4^jcMmL015#7c{W6zNyZd5;aa&N^UPUC1RrK%QRHQkLWvEP6f@i8G83hcbb?o4h)o z_0mbnbIbX-_ASpPl~JB&}xc^8sLSKJ%6CGXsiI^W{)JxGsPr?rH_&#$FSGKOzn; zzh8+Z^f6Z7aLgM28fw|Mc>Goj3!^fHmhniY9hW-qPV&Ng#xhv%$Fk@<18Qc|A%ge1 z8U>bF-^%e7F%+@}0rI_*J+O3V6?bicwwmG*1HZ3%A2R)oYR6D}hIxj25*cFs+n#jg z+4jkPV)Ar!vdeBZjduq%59LSY_n^<Ydnh$*d8h zn{|pI41Ej8ix^HBPZKFb-?@AJpLfWj z?N{zx(n}rtv@Wg{wOquJ>*Ln2yQ2UoRp1@_0n=*T)2iZ z&5a^TXkBQ%)KY4m{33rEw&y_>p%3kxfAIOWx|np7uF#Mq3*fUxe*Wp{I|Oc8+TpUc zGUrdmh<$4myl3&Pz85+@PDlW{jIuM06QppE&MdZT)#CzjJtNk5g|y&c`S*c5iYfT^ z7u#mfpNp4j!Bb@i=u%}46-gZH1fZ9Olhm`O<0RphN`9fy7M5;yk%gP_13OH%Et=x3j%w#oM-1Q zFi+4B_$tXUZ~=_gxQY>HBpkZP=eK9bMttSk=Qi#+=@@BmtgaQaozN)oFiz_jo!aBv zr~?LsGDn)-x5zHNbe|dQa@CMvjjl^d#J2l*X=KToX@Cb{rI%zx|0%|0;r1s0(x2)3 zzi0&f6(0USlQ#bnadev+=*RoNbg=*GoEBR`khthuc(bgzu2MA9^@}6RM{?_4p5>2M z_ZeFDb}M?&S0VFFDWNKkxV0l*-9k4RASWw(4M})(U?4vz)S0PlA#M87KpX7WED|L2 zE_-|<1WN7TjZwQ$klIv{qmi$Y46a+_?Z_?)>y)U|sng!GqNv=_vQ3N{hMbCg9Gt z?h?=C{ymBZ^mF?gKdA$nJIHYwidNw-?;kTNQmz9Ky}fowLU9S-FM~I~@Ak(bQ2@0k z3g`rYcKZQ3Qibp#v9TfXf5#n2V^Yp>AJXIy0%$D%@U(cfvGNOZEW}QNC-K>W)TwTP zwW*?~Kx1W@3r8Qlg))oJp51zv`ZFjy&4z(?#zH8Jcp_}EnXEph%G`-&kWa*LCO+2l zbyi)QIY>Kdka=$q%)5_5uVbY60FMc9^X<2|0yDaezW)H70q_7O0OKNFeo{W3mvjb) z?6Q(j5vZ{3Z?E9Ck&hVQ{$LuE*m)Vy<^|Ec0$KjV*^uNhhP1$eI1r#!g!og-%>rEc z$0a@Ka~bYgTAP@!I}_~^H-b;!6+gO760HP$*GS;Y-d?~0&xTQqRHI+dIZk1jx(kSa zpgTjHY``3WPv?w()8&unNpbhu_`V;R`SAqy8%r?&*q?KOKOjF*qlJ6p4com~@48uU zh0OyBB9?wRC%$L1HP+Ww`bQl*;a`9HGIP_Uz1i_A9~|z%CoqjtQ#%w|T^tpmmN=J3 z`Jw={A8!>TNfPt&Tt4P?b6yxl*RZem@LVM91+I`rAS*b}$9 zw3^>St|Nq85HfhcC?Y$dOh4Hmr_d4de5`BJ>Uc$hLjZb`GfBOV@!RC``AaIrbbZTL z>5deVpSr&X1SE(e+HF!3*ND|nqE~5PbvM5>9!pZpRw72@>AR##-KR(i#X8j817fj> zrP4QUXx{FP+Ajf-GJtb@iuj1c-3C9Og^*L=dPn-mc0GW-4kIFmLOw_+wBL5)MqJSKlallD4^zMgKVh|Ko5LF0bhR8y>vY(5h;*cha}~8(AK*JQ=d? z^ef^3q}Ex6{OtP!B$N{Wk2_jgbDLV~AEUfKZloKQ{n+2$RjV=UfkBM;%o!)6rFVk>+{#*}*Zh_C_f@wDpSFb0grJ>`G8r&sF6oJ* zyYKhdSPZ4>`(2JyM|!Z4vC%{92V^thEIO3LwKbTbG%BmbVOcjnWT#r61UJwnH4h%;((rwhrB zA}LpLA{a3@IBE!>SJIvqlyP6qtx1{$kDkk zSW{ttY<(%jIqI@(_GuIYufuSjmTYl=-{3&d<&;@$&Y;H5G=)Cs=;qzP@ooeU`2|U_ zcrZjE;a=;w2iw#r|bN3cc#B4L#-hKbBT)CcP$NefLDWYC_LH16nVG3F} zk#y8{<xnzn-Sz4Dbr4*}M6jIO6ZG;^utl8(ps;4*HOWQ@BR8vDEevFy zM@2uhQMS>)8)9;Mc(2hR9-A!2{){!>t9n5DH`oX}cEGY}XO;32k8&2`PhOu#GrCfkaQUBI5AP=1GiGPpcXue| zsBO_XeGh zk&$CN`+-LQ<~z`A@Sn@lubk!`xrtwS(vgOzylww#cgp}Q1$#KR|(1U;43KyI_c98 zWNJq5GCs4$^N}$MYD9AzIOV}fz_6ev_NZ3$pQ$LSo z{ZflMrf2Z;fHp7@R*j3oub z@WBMP;d^7R@DA$xw}&MwunU$B-ihAy%_X|Lue=15pUDWEZ-ovvjH?XFlH`>p<%O(o z2V_coZL}Ts)}2F&%uXpILffs*=>BHsX7tIeNhZBUBsX5R+D*R{HiNP?1Gpz@+-^;t zwe!uYfTr%N=DO6ND9o5+k|NJ^Lcfl{S936yZ6QP%L(@UlUg#-)bJzMh%6h<6wflKg zvNqd!3o$E8s<7U3dnh2eIv+8|uHqc57)@btYf9$>>(oUZ8CKfpyy#X*s`{{^d3)1< z1^(e09jMzMiL*3}2Vn6s3utN}*tQgvMkrB^=>_Xs`RGp zevc&sG#sT=uKUJkyPx|mY4&45?MN`J$O)##*n3|^-AbN2axf!Zc2wNw=*BF;)vNX0 zpaB`s*>ju=hg5R5qgkw6)r6bBaCVuH3m0#H5zv_uJW^v-I2SsR^A7ekWT%(o!0^bP zGV%ii#MnR!c|K3dNyK2CQeor#5lok@^N>HWD8cKN!ws)Z9-ikO+pOH`i9KPm{pF4E zV}Rlqa%!tLf{c)K6CmZnao`l1I{R)2C7~MRL)-PrU~u@Xhkt!F9IE-hpR7 ze_kbW7bxv_{)h0Ws_6iCHvpdSpmUT zAQjci2LUHL*?585Nf`F6bR(6*R!Qj<@M7nXg+0nyw zkM2ERxoYCn3*vSB!r$68s(#7W$W|*=uF|5LU*VZfZELu`p#tHPyf6Lhsp}4BKWSe< zTs<7`0po6o=MXQdqOn4YA@qbiTvmB%sN+b5pF3B;^qm&Y0L3V~I=u{k{=6SazIQ0o)32X;Xss`9Y13kCyKR_ME>QcEP);!$6z-Fs?!F)+I3C$3h0+#zG~{_7c`iZs2%1+vqIz6Kr?>X;#*E9nkb>zLjR06jlYA(3$9mDK6b#tXlKXO1F4OC<}klf6}! zwmAeN@*Mr!s3c|{fI(I3SsVno9KmA1w(uu-PQqI1`;BZoXAJJMfXv7=MIBOallB_KIAh7w%birS5$5 zj4+oU?YT&mfdjp*siW|;Q|b{4EHOHE0ixEx8bUjV+uUk{R&I5ou&&NYJEos140ew!VQM2$q+@f@WRz6tH4GLO?9%z`KP??W@nk!iad3k-4vt+YMWB_?&T}}MwAQPY4`>-Je|t* z6Elg5;rIda&oK5L*L1fM1fGr%=x6UDc88?CVuv7oh2oK75mBJQZ9b-;uwuX2b6W6a z4Kx#i(?ah;r=l@x*;jg^rNEoBuPC+AK&96Y&_?ZoOciy2862CAD+jYjKA5nK{Wz^X z_j;O@Z4Xtec7oDB2Q*ehMyAI{BX|O>H>WM|^tLv(Gy25?V!w6fcX{}qb9}tSfR7@k zQt0(DhR*>?qQx7-l0dspQ2szvSM}=QrINQfYCQB7S`C6Rmu9N+?XN=K%|EbuBnxGb z+gJ~i{(7n8xxTRmnPCBNC{O+Afbdnir;+K+2N(xGbO*5!bYp{b*62lS0m@mYrSU|>{7A=xOQVf z7;_L_=vvBR3az_eK0VSd;W52ekw%Fd`yQ3tP_ZV{3irxks$~JgqjW;4qoZqy)$Njv zsgE5{D09#03vW!5SRa_(T%@3&IG+x%sS+>b{2{m-B}upr@7$kWg`)FgcN*ioSt-xt zvnbgJZ#Cse>pj0YD;+6)E_@L3trePu!rplHh||nN(Fw&B0Cy*C&Ick)j{CZX3R#{F z3T8QS1t;2=3BVHUHI9^z?Wev0uPDCo;6g!s;gU_$b{IG$$m@y@U!y~!GIu~J>ni{A zv6hc)h&bl;9uvH?xHduc!;3ZXiQHDojcD%aNO*@a*zi*JXLaN}D^*4uB|Fp| zH^QBLJ7(s7W*=_PECGO4L%d*mKAPs82f%-fW?K9tH+NpuvSg>O}ujhZvYFD9>>);44X@xN!AR#ndyn^qIqdHQkmnY)F4&V-SM zKR4=kC;C^*|8tHNAA~!`s}t8?uH99OE+RuL-wltjZN~IHJ2YgTaZ?DbKnCWj4k_71dgoya zlV0EERJHqpES!iZdes3Qx05`+1so-ALQN3fRStF!vLI!P9U$>ez%s^=Tob5C>_Nb+;KMofieC?f$SsGPA|goe3^*=IXQ%tD2O?QAJ_qU{y{yE zSOp(smVXdduD20)PJWQrzjkm^+^`c|P+BL7VRK$Tj5 z{xK=#WD>bIl8oSD>;l*v`S5W#eni7JF$u}Hb?#wl${H6$d5JtNIedzOc`;9HzgO5X zuyL5z)){-92n2q8eT}(YzNT2iUcac#rp7M0wA=p1g#VoGV|t-Qe@X`9y+CFK0CTSaxe6lF;uSd_PT;Xy%A>cAaAOD4$H_*0%5kLm`3Q}KHz8ve1*1B0UDlWcr znx5;TJsP}g#c@$c6tKJ=&IjotIEJlv$UWW&qpNSN1M$F&yicH=CB7P14(jyE^k~ z9Qdg%r=?0aHEj23KL;V(Ea_I^55XLOR4iaA=OK~n=(SqNW>JZfpE`u_1n4-A-X?_eQcAW!6<3lm(n)55*LAYvb$ zJDe;E4WEu9>IobirD_UT-8JG6W)M;Nz(rjo2J?OQHrx-VM@o@J%qZaQeS`7NZkS)+ zVn5+F!M{RwBM_7PZu4u7*Zi(C`|RF+v8KL@YK7*}@@bi{ZrJH% zOf@tCzp?gRcLsLpb$E<)B5&)!^@gvwx{5mYnUM0_nf8#wW|OY*cwCT9kdDp%$KwA5 z^8LLq@UK}|cz{pHzpxSi_#=sj@t|^`3!qg^L~0+pl07`RwJ`0T`ectEJ2 z;ribIRR0Jg^_$+xf1CJJdO%pj*_3qaay} z^0hDn+|hGS!2~$G2hbEs7KHVyfq*ZnVdhxL4ma58pJN-Lnx)vMx@`b*{n^udnBM## zR@~I+_nPha-N8uCe!=^+N$Z)=>HqqG!pO$n#y%w9>IQj1RM5XwQCjB!wIQmPc zZa+6N9rc3h(ZW@xd|Pul55f(NAV3fcVd7!hR^&v0cl@Hb`WVP(W`_d2u0iKQ?hSlU zlgfQJ8+YS#ue9iXj4`PMb``cjR+Jgk_cD8sqG*m>JDPp?9 zmg(~2_4MchM%QqrVGD)m7?xSShA5?;P;svi!);4ji>nFvP}eHe%;bV8gQ(x+8f{yM``s-u;pmfrV3@(WbMPygzmu?MoEXy(8EK- z$!aecd$l|F^xtB^hf_q+rRuXp3#?$@W6h?~`W$^tf@VEttJQmIzr0RV*`O%;yXlQY zUcbir@C~3-LT{9c6nU<=Uu@ggXCq(T{0+c4(JhY^xy&DB^rXL^q_2iBLG7@9!8<%H z%^X`@t4(Vy4ot7!Re+{vzBq@|aXc5xrY^?nbf~zc zr*Yq7UTu8apHNn4T-)U*&?+@h6yx7($kVhNe`0ydBrsmhCEyBmh>VHplz3f61Bb}> zrY1|)YM0B4`QBh_Vn3+{kS@9nP=od5AgIH*FcMiyeuZaooy~F9uh#_iFRSzCYZ!Y^KqvshRk$~_`1~| zdOJu5{|NWoV_Ec0DkFbwm%x`|JfO@verM7a885g?w|b0f1YD0*Uk|Z~HU3TmurK9_ zq9yTH$Z0FEuWG_m1NVR6r?k}%nUFT1^()oueM>G@J=|7$qJuR*AN(B0Z3xvDKFeJP zNIOjKoXm(ez%@{<62ppm&qQ6a@|;!lL)$xzeGSbN%S~Ed*OivrNzA2cA!QQ>;_Z?t zE?$dCRh*~;nuB!2d?J*x_dy9j>n@Q8Gu}OwvMd>U;u=$NEkhYBV>N+lhz_xlFk+~n zk}@=anIwzuV7_~NdjI<6G+z5UZFqUxKXtY6{uo6!<)tr_=H^a(H1VW5 zVgObdhsUTT6$7z>GVDg*JB>xO^<&6IOSkNnjcMkA**qjv+EA>O^4a@h&fe|WCs3i6 zvzUA$6V0M)qC_FS3~ORNeWey*_w2uqt}c zS}KSdDtRfoUh72|oZ+7sZ+}gY8_J!`-l+O{Vtb8IqO((`Pv`K6eQWxC^DNW^MPh<` z08&xA=o?FwpwHwh`ceU2YWl`oS`+n6(|5-Ywp0r^e_WN{tN2NEws*tXwR6`23_#r% zQxPAk`>MZheQv*sf%Mq`TDVBfk3nb3-WtBy@=jgO|@loXF9ub`S@u1HdL6uLYhUf+w<9J_Sp=6!b?Ch&6CyW zeZf1R5`CCg=Ied<2ud+@ulF{EcH zWc*w4Qm{Z12EBdZ&R6t9l#!+$w?9>zO#?&2XnECH^%p;V3=0qnYex^mRu4V^NcOA0 z2Lt~M2>p*@hTqryxn}bx_{o1dIJ(@q?*;Lqj(@@;|8Gq4@1MUxn*ST&%`hnNZsiOVV&Z!R~4(0`OH2()qum_59DCsklqH19Bq>X1BZRlkG!hU%PH( zhd=PJ@bX-4xzZYyJ<NF6QYbOHiXi$w$>sxx5?0cY<_1%vOhRiaA9dBB;KAiOh z+USY=SUU*%93g0P1S{GLuPyC>M8U339qOPZD$X|*-8kp|Sj^zTl~d~uUo0NimdqvI zR1VpLelI7}c83LE_Is>>?28_=Z!uPV31j)wWslaYw04FgOJJaoykiEHzFs_Rk z*^#7-Dt+SAlznRWameFf)4>2AA?n|)Vl+EWFMIn_ro_lH>$-w|nx|^-M6JRG)yR%!PtI#m8A$XkWRuFk}({tM} z>GH&G!MOi%_1b-Qp+RPKa{4g6e5_>0s9+*rrP=sj}7FpR<^tu~x9p zdg-AC%!TfUbV*R{>3-w@>=<~oapXxq*a*B3NvD7!_ z*%m@LS2RNzvhkASvk3$a`!EZveI>yrcuiP>e@sFkrn5YBmz*AKnvhUn>7ZY5Gq(Fh zTe0A|OW7o@XV-)8Hd5Ls_m=nOJx|zDXq*e!K-}J|y3x1n_pmqS{OVra`znuAh)Z_p z?9^}w8kY#iUt1tDk1uDUMX?2p$?*E*l*)}fj&D0l*-IdnI1A%xZ$4X%vpO9CPvo`Q zRw$&YlPG@-gSHR}2ZMHks2|y?@uwrF<~iR2931byP<&o|Bx=z$#aQANm?2#x@en8Q=O)1rmr&8q6Z8x`q6ZxurvZHNAK|_wORc!b&9@ZAm(mF zJ01Tt*OBXkeW^>=l_Lgr1mGY*zIn(LKi0s<2tiKNYi%#3`XsKyTz=H){G2tP^nh!* z5{;6Vyt&?H7)lP3LmA2x3gC4!V_+9!#Rm27+j8LS#V1CG{(KzE8|7*G{>}W zEGlwgfN^bL`%wh7L-(T4%Ii~}z$EW(H#iA`F+OHY-jP-Uqg!Y9($e* zYWkG*%0V!bKI3xOFl)%Mc^ix|2K)yOr9w>|^+WlNZzP`evgI>j5 z^!Q$ZgxLk2uOVVXGcH$*Oit3MO++vRM&s6%_l~w9j`YeVL3LHQP^&rXEser8HKoK4 ztzZKaXm))?=3dJde9JytIqwGWXB<_1sz{|*4~&pEaJVk64G`pxt|Y_$F_Ao{XW`Xtz6txi?n zM~)D+t~rDpUp&Y^@&+F;S()QG-V;abY1|P&%rF7O3?{&Aq0m2!8~$fvhOnR|NXo*6 zWni?Re*@OB?xtM8kKmV93$vtvP`qug?^DbZ=;vg4c z3t)f>l|_b3$4Icni{e0}Dj3ZsObq|D6c3;udX=sf7Teod@`!2>OauLBchC}7(gw3# zEW7!YKAuKt&)o#&=U-^&gMDw8CMAI*^cftr zz;XaR>j98(OT8V0E+(;bn=44kHDrYZrUHr1PS{&{jGqugN5?+nX4{|Gs{e|wYdapl zK&H1K7ydD~Tsw&oBrjOZu=#w?0;+y@pZ~LGTdjz%$Aa!)>=GB4U9;>5HOB>0I!YLl7qQW|4}=_8i922aRlFW{oKP_<#cq=GPY!cC%PP5dER^4Sa7xV>K#ZgxX< z#p>fiPq3r~Iqj8GU;{Z-*~XaFu{!)Oiq+Y{IQmcq$~1dJ0v&lUG-&%RMuhRyIUhjy zQEy+Yh}Ma9F)DyPYvs?s~rNZETWj zKfZ(@a#*0&BiohTtR=guPxmj4(EhCL;;mewRJLh-=gZIjLi!wmt%mnjyW^=h)bxC? z>X(mj?yvpA&2!Sz_UydMYY@&8#1xgK#QZC(C#z=kb(!Xe7Nd4E;&T-#<6!1Zg-Zr0 z0*56FQcj5y*cXHE^S@=k#nJ&iiZYr{?;*MR5%D*RKeo7wr;L4q^Af`_Jeg4}y%u?@ z08dx%n+A*Qz}g@Q^fqGr=o58{5b}cQc%=Nn)$92uG zi5lH_?iBIz_?)#>-F~@1Ky-7uz4_V+uMFUw6-gg}4C3KPqP67q42C^$>cB=k;BtM& zw`lVGlr#LwC3!){OIZv)A3po>CuJBvgEhjwfNKpB2%^MOn3N8Z8cML~n?Gy)gv5Qp zfltjr?mI5`x&nDa_#foO-&|(f;~+92$h4&ZgTtB|+#QspcBw{9aH1giKs#z+2&tOW zIk2*bwpwv8i{BB65PGntU4O!3Kf<~8UBDp2D6?g>usnTtM4{!_^Qgt`#p0uDdasn~ zYk!Q|FxmHOPOU^via*{cO>M7?;*&1O45Xk;)mfyoUWW;I8oOIF&Y^d$s4N&t-3;vf!PJYZiO5j^9YICOKE~6#fp99e;a0*2iZc|wQfT`a2FG{!pxB|BR(W2KZMSu8cc+Kp zjQPt-9V>h0r%%@`TGH0Yny`_cta(1h&L((mUR8DsPyxE7kh(h@;5uH?cmolYUn?0w zX2Toa#gslFikJRWaxQnV1L-$t7x4IY-RH{v(DG^}E!8snAYhy+AbLt=ys0vS=hY%b zPwmNMwrFa*C{tWcu8v*H?ix(axKg*KHTMts(626kbhH1}zyBB=`EUAcf3?wH{r2BW zpk=(P|2Wrt#E3aU{8>bm8g7y1pxod1rD^)BWkC*q;QXY1pYr+3<^PNB|8HcS5?w^h zj-bFqR-glm$ZFBGfH4~RZh^BOYnN*%#F)dQ=Y=ui>q%&T+HLvG7~{GL$GqJmU%?!{ zKK}bVNSeDlhHawz02%|IvRsO;1Pp^LP)B24?u6GZB$AnkYPEP_AE166I^E@^^H6T# z!p+e>||GGZlD8 zTmh!K56Y>voKJyY3)eE3zJ?VawA;GI7#k!Hzu)q_ee0b|qaS5dzxnZ*A3|&dng7%C z{m0V*u>iFUpkw@ZeF(zUcA&!X_cC!f4cowL>Kd#j{Qnz``PZK{tq(cz4qGmM&s5;; z^=tzDG!kE$AK}tjAGd&nU`RN|2zm}Syud8hs#*f5$zRwUX0{!6Cl!dNjxjvXf=k?O zk^VTFOxdrJhz}w%?=O~iGbZMPh$aO6;K8n->qXZM16)JI3vW|@eH$*ZE+vyF9c%4y zD=kG@CI6N8cKa1T4KBIZAed3ZWi9T!wjdh#$g z2YJ=Lqo9nqPNS}$?e^w2e-#C9X{AzY4z3IkZ5fG#Gu9hk!Z#X4j!kzx&pBRe&2`k_ zalEEzqSEqZh|Sb@=vIVI4{R>FYof;@NyG#F69$U!9_v7@S{K%tSJv+Dlj*|=_w|c5 zHVBfzyqim0DHjwcRrDVf-(=U+ypB8&lvaxIE!MV7hdIB9z!=7XF?WX_qa?S_gWU{S zHju4(a;dnnUlb;zLualOxTmaLN!CvJI<|@mp{JHw_Ws5+a|Ec8FHoz=!+s#@iHLfI z9$?0yp$bZz-u#0mjoEYlCpRs}6b&!Gv>?60f}>?~weGMBm)exu ze<|my<6Cn%z1kMChOimh@9DVL<^0M<*T^Hl`Y~d4Z+zVwqDb1Jg8ERtMSPu7|^YFHND1ZRuaSmc;$wRjUI{Y^H>?n1`IK`tG=yXz_GA%^%TxjNpzDCW?q zqLV68j$Wm1@(s9mW(?{W9hFAGL%IH3{0j)vvvh81N!Q`l>Z+D{PpgCW>ThV&E-eOc z`%vm)I@GiOeNx+;yup!IKtn>w`;}&iH0axn7aM_zy^4)q5+SPzpoz)%Le&E{UUT_% z`~?+}?KgodX(UgDW^OlPMD}~^87B%L7v}rf(^0$9QkNq)?RNGb-oO1Y?qamMT?gf9 zZcz0WHlIv?Whu!MR{(7LEciAKg0VV>a~C_<3ZTfeL2Fue$=qKQinZa5c=9PNQVRE) zD&1%}IG(PVG%35Tj2`4A>(7AsX1`qj(BndDh>Bl>#S;9;XMa&(^?)KpFMLK)8~+4b zu(r2l)P^nS?>g&^;hLUxkmVZ zbS}V$a&G$%daWit>T!#0d9^p3tjBAas>7eXBf9Fx?aa_6+wI`iaf{{kYlpg;pY3RL zG46)Ur4Q9{0hcTC$^tEbeA(j4KV+Hw*YvJ`<=+45xBnUSp+6`Z-XcD(cQFENO{HCP z5L6I49ozvz>UCM07lOM|SlpPc=R7z<^;kJR*lzfJxRf3X70Q$ULofgbe)>CDe;xzg2L-5INfOzN!5qN6S-^7lL>Mim6LM}Q*!4~e_S}4- z_*@g>lZ;CC6VKT!US;?53N`Oj^IO2>>Bj)6F|`};R=gtjEntk{Gj9M7C=1lB^7Glm z$zoyV__if+=5ftNOj3F`jtpvSnDml#ovfB%a8SJZM7$p?zo^ac#h|rGqHxA9_g+%y zTA=piRl{;u^5(wX2)YzSc++qBAgRcgrfO2|Sf6m6$VCDm35x}w57$b8LtC@}$Bri2 zW57KS4&)XuKi*=Ikv2H#3MM+r-BV?&)V)#3@y;luqWsix>R_g*be@$ZVpFnrH)a>> zy4aUMX6p%TKm(AZ%}d5#kGox#klI1qfn57|i#16iiy)cKlORR@l8?E)28dbSA)0AB<;mSqUGS>(BFEErxDMS_vTzw{P zi}bXeojetUbYi!dm&Ft*SoaiHg}s6hGd z@&SMcVfz^)53Ipp)6fDiLP%wF=M(FT-wAQ2_gsLTYSEdZIc!k2tqJL}TG zG8~I)CeXF;NnPX+FwM9xM724B7qHJED9#a8v7i*7)(^!CO#`29hP0j>8KYukReWqa zUuM_Q^@?b1$Mj{rScY=3hoc5MB&77B0@!SNO$!*zmUswOnM^-N&?i11B}yC&?mkNm zlltbr%k7!R>hHy2ip?J4vA=kgG_)^J{hHsczpEufIbZO=Z^@zyK@$eS`&ARK;o}N{ zRBZsusi3-{?ejh3~caN>lZ~nm>9dTtVQHQf{DP) z!ipv^2kw;V_8x*s0bZp2bpSTNMFf_9`(r@p?q7Db=W{%1*#;5=rY7ny4-Oa0CS7_w zT>bh+96fq@+FKOxsJ~q(L=oO$z5~Fl0fB(_%NbvJ(iR|AGu^Y_Nyjf6;X9(!N!^y~ z8BU57*7LbH`a|C}q`1aB5|tjoeA24hyd^o>55WkNyB6v>65$UGpPlrURp3ue>%ti} zug~@gM2!zf+TZ)S$S2|WoetDGGdIgk()0Ar$QVWT8hn3#b-jwBCk)6&PRHUQg+IX` z+w+$~Dy>Sf5{=<-QJD*mQp3}4_C2&&-|RlB25b+Cck~y<`Un6qQov8=bQt$ppk7}S z8u+x21>nT-4`vO*eIgJ+>!bHhK|t5P8`w9@)>V z&2!}orDgb~GM(*9+3-N2lsXs-2n~BK%x-A|oNydU^YSkOcypmHiFfqN44?AXTpt_8+UwX-XCN2KG@H5~`#0FseUUvf^EOkJMz;g+V zzF2KVDiBpxH8g2>@q{!vNm`reE8WrWTpmNXFBUVjXGkifw!Ebogs)}1AXy9%`MNn& zzBbVFC1zX3CuGm=-L`_ItiS*!fDSc;1Hfia?m^T(1JR1@LQD`7)y@-PT4lC2oJn&- z@nuggy6lZQCd<;N9q9!)+K*R6P`{y~uSNUgek`~*pD(NOkh<&mBk!(MeN=1A zHy7=!@bmMBC&PexpcYZ41nxFcnmH678)?oJx3%!$G?}ydIb!kE0_HA{D^3-kv{an{ z6T!cAT#9WqEKaZi^BJU0S!y>)UI~y`KK;-V`pE79gRz$(j_cv%<*lD|`5a2FFO(a==tRepDYVa&8t<54x93Nk z!Rd>?C@dG|3_~~mbl0apKbV_9bdM-7SD?tOb_Hd>-!V z{>fPVX;0s%|7BNG{)w8e0(v1Bu5EYKK^zRk6yjWjuKB9p@5&qcIy1@tXh8kHm4KW3 zCpY0w#P)w0LzCctck3hM|8+gyzwDXQ{I0Y6u~i*Ky5b)fTSwjn4D&8yXw#ppW5ho; zp8s$4zl8>W_9_4LwoE8x5}#Iqx1Ro@;Jf#`{dpGvVsu+Je4PM3c39XOZDVYsup5W3 z@IV0(B9>#i>{{7fMz?jth#X)&0$5Me29z{^^Jf3_$p6q6{?o0e`#=~C_#vboPRh$q zM&NqeoBtfyT>*S3Ye6zS1lhouNr!02OpZ)E;QaVErk7z>BV$V=4OR+^ue>s(GC2r4 zyyI>KVlii&c;lO#B!g`jZ4-7kq5AMuwrdv1?2=dgYa`HHO|971)vj~zC_3a0!o$LW zxQUVU1nv$2cssdUIS2vp4z>0hZuV68xkWF!t*)IssSl~^x3K0;;sZw7zpnNd@;sXV-z~!)CbTD zGoHMB7{(5IRb!j#i#o1Kw(6cCYHw`%>-UX#o;}q0e&$<;6J#u&LUe?vPq;=NAj{#) z-LbR1;99LNl1(4`IW9~5pb5q+@dV%;;bI7aGG);%Ix-t;ZZJ{-Vzk?B4Xtcd2M+yKclw=sU* zamAY)CiZeGHI^NZ__e2)&&(J_T+DpevDEIGD8o=IhC&|hpKUT4)fKj@7ZySeSCK{! zh&-8VA^A*3Z!`Nf8>*ze`xSdy8q&}+`S*x4c-1#V3cOB17zi^=>X}TA@y4qA1vL(* z`KMfQK~j9RJz$$Q2X)a8!;SEsDD>@~OowID{M&VD#;@;O&;fXwUo^a<^zD94`6PRE z@-T>%xvMz6Lc{816o!17GtG5CUF<}YwJ_z9p$>6;GDD{ z4b)98Kl1&gl0v+|h;znTbb@DQZSl*?^y;31-H%(`{S$QVJHK?twfpwTc=w*J7E64? zz-zx806}EDLD?(T0DP4({m}%oT=VO!J z75r=6*L>TlfoXL>&qM)W5p(p)em=ldHJqFn-gkVN{Uh8(&RxQx zA$8ioz4O%+yUYE2d8w=CDc9PcU;-OU@R^-T7O@BJR@;Z?{fPKA4k;^13!@)0&+P60Somsk$QpC2 z)Tv7j(+njB#YQxk_><6fby5@D5kyO#T&SClse1_w$%-&2UT!I;nuhZL5uHy56R~mI zdOvGptIvKv zsW4W%YxT~bpH!2vSHMkW2EDVHxtme@&Z4o!u#VQzagC1?&=i!{+Ma~nwITO{F*+da)+!y2h`Tc^pi z7lq583jHr@h=*k5W6X)fo1~8_9GFH!sJvB0r2}0lU-;xm2FDiR<8eIc8ur}J@dLe_ zYT3fG+L~0)`=UtN)n7+udPW zH8*>nIEzl!ob6>?Q@bX#rg&FEkNqW9&Y`}ok|U@FrnNDDQ6bX-Yc-MfsLMEQY`V41 zrhW~UQoygxmjs|CMF5tsVqf^BLw$wY7}@5j+HkhY+@iej$;s{~e9^L6E`g4p?@{vS zMOfHCc;FrWYC<}gT^!w{>|-E$(L=CqWrW^2cRI>yG(lh52~K~TA$BhQqsbKFe*XvG zAsK5$w~Z10Hi<*HKpB2MJSEy9%|Xi7V&!RiOI;mA;Vs5>yT!Q-cwC0y#qtc8>SRH4 zBLy3e}`+J}&2c9hlr_KHoqUg?afB&2J*3-mh`1Ce>s%px+Ddb^hp!_)rfz%B< z7MgUL)8vA7@oOUpS!T;37wr{up+}3{>55+&OHYG(n;7GH`I2YQb>*550#0xE@>5)R zc7`GxP&*JcA2)6sU7MEUYMZxJ&>doR%AYF*h_8S*rkFgHcLS61%n38Hy}sN(k}Npo zz>y7)skjU%VsXiE)j3!yus3SK1ysh8jy_O|i7tHc4Lz=Mrei&swRkLg7-)DWXz{vV zkAs=w;nw(?7jQS-;9dY+x(5D?cs-v!pj=1}ZDDiuEcD@&v!^0T{83>3i5sr##uu9S zV?LZG2`Ig~L-3)~Pq>zjy2Y&(4_j1~jVDwT9N~Uv^2#5hR+_Y<$_ECDLI$71SKl~3 z`Q`^|Jl}#%!xfM!$h5>$_+4(P;NgQL4jpWGZf(g{xbDeMv37^PsN~x;Geyp})M7q+ z5uRi4hqIn=pgFrEm?#zCPS?dY{}#0pci}$uV{PwQl{X*ha2Ad+^08s%{)*a znO~+Fy0USpm6agjYNa#xF)y!wmy7W+@GUiJ+}E+fT?dRuW%e{+Lp;I23_~Q`WrVSh z`O8y-apo&mu8Ni)-|OdNIx^K*ky^eitb&EqG_bRWnmxPZlKb$(?ChU0buS0mW8 zK2XpRLr9UbrKECTkM+o36g}fqKipxQh)FrGJq6;&M#B%*+$Yh&oRp-Io1Qr7cE;|D zVm#a}BFTBZ@m_&14>MQcS&LXI(+4q~)gS2*R?uUnK2Ipam~Gz$=DS+2y2|h0cg2(m z0gX&LeCu4$NB;!HdFoF(6Tg$fxcx(5@89qC_eLf&jh-!3#Ux)|6DOsh^Q4yRZtfML39;GSa zYh-757P#(2B7ouPg3OHAPQtishmaG`i_>eZ3bk=)vC)_``Y+Cj+GdET$h_~>jKE)u zgi&EZQU3WC!h*5luOdMgW(4vgN^aU~^W}DreV`Fx_!vd`!7!tbOE+x`CPXSz5kxT} zpZVC!nG8bSD@3n6ymw%aWI-%*jBs}hqU;7ld{Hk}f z)$1E2-v==M5Eh^%(&9hMA~@ibqp4a_JLA8R?X25VGjFX7=&1ztWr z52;ifK`QL((*ArIq>CMGtPQj-@tj^2Byu}rnZq4>@)^i%8;xREr20FEq4(?K8eOlk zYs*!qzR)yzkjy5aZ^y;1O?XoZGdO=2T3PgG!#AQ9Xtw}vo?X0X*7yNoCckt3;$((i zRuSdcg4Vdxy^b@Q)ZNGQ)1G!am!qyC-UOeCQVJ=)J5XD%q9SmOh;)~wMOAjdF$Y0Ddbu9%e1>k zp+_r6RRDY+wP~7bo$MC`HHXFNz7!fuQWWK{XjixGON3tifR)G(m;R_NzVae6S({p? zZ`JMs07mZ9XNDa=V1C&_D0=alq+Xqe@XAM~ppLc=7lqozf~ULbo!uI=w%H{wTh-Hk zd70q$`RiKvs~w8tWQuDo(nOvxZxLB{jV8T289VFtyh*x;rdO+G`d~;f=H5soqNXpJ zX!U*}IKg02MMt1QrzBXO$5^iIQ~FF;ssHIZBQJ*S)nNN90d>49nfArf2rzBJ)Giq2 zK&mGip09n3LNNRcO>QaQK&sI4D}=tD38;^}v7o4Z`s*FvGpB^iUhUjlkb!*#Q?>dK zV6d@0yaZv%KDRXZX?Gf+x^^kLc1^}!*H$Ht`Q7nKmrRscLOs_S=P5+E8Xb`yW4MhX z$Zh0Px6&5&c|Irz4*HUIc_ssj^dcbva%dm9OL*n=O|b;+lX;-H7sFpy41dnu|EaR-}h9-o$v_Wp??TM1}!Ox zmP7>wEe$*MuvU9Z3ixJZyr^xF)lIpEpUnEmlVvc&fmm$fy*veD0!mh`GFZJ^8XOJ0 z7f0(8#7UR5C3a4&&-!!9osu>FlV6Cr(lW$J!FE{6}-^HYEAHrsac^4`kkr{PSWeN)lxDjT3$) zJL0g<8XhKOKEHPRnY+wcBzlipy#M$n+9v(Dnq}Q&iD9on$!K-WV>Fyu$EMV~Z+I=Z z--UBy+GBbHInV(>j3OWXC4Tic{?mU=N|WC%;2&P#{|rzUl`=cKEQl_|&f@kl)j&T6 zP6WT}jES@&vm0U=mn3^=FbCF^#7hud3@)HPDXMkljzDU_^VXz+H|FNXElz~IcD+9U zH}^-7R7-um3pC`}UlbqUeX3k20Jyer+D*Y8#2j3$`*@hKM~SVwTzMljQj0KgC-?N| zAiI@iluPfF|}9NmT0fOdM;YcPp+L_$=nVBe7F(dowDtT%ov(&Jpzn83Z@fBxB^g9 zvSdzoP~KU*g%{lKUGUe{`jA8a`iZJthgdDQM!$?1=G9bLV}&Ooa zCTNnqeLk;UA!TCvp*F{zKWAE_ z(cJ&R5-yfirq(v6 z{Gw)mduK*{vla7`2&oMjs3n`dV)_;P=wT!vg;hX<=SF8%Q#&#nQw+$X}PjF#+D_ z*@LtF{L9X}cGtFd1KRsTdHH~fBPYJTB8-WY)aru;*s;6ZkEWVsKU&U}C}{YI$UeIM zh3~3);*$kV6&45|yrUUGRWJ^_gkQ(Km}IS=uP-l&Db1o8`e0KqEc5h-O4?vpUcj&r|kHyYjJ9O1wrzi zQU5!VOQpAUL#y%R{G16PFGFn*&jh@lC#3XtDtu7qBRBY&R!P4lFrDRWA7i3nH2T4W zxA)bXmA-ogXXe-WU#ESQ_C(H@O%%SnoOnUY+FEpv!CrwQ`TeGY$c@34panbSP;tiR z<<|8f`=)8opXiMNj$rUEd-nC6+J8an)3SEr^AEnP(%_wNi3)GO`8(<<&cG ztI-5K#7DXgiOHfkl`pfr4@kOtZE3m> z6CO(j#9TSt%4V+>3?zyqMlU1IR0itK$%hHNfN{Xq#zyfeP=5%OzDHJSt5V zY2w4E{rJ^r@O>ylwsV3OwIR{=12WMHu_!%GHY*JG+k0b9R7-!*7XgiIa9kki3Btt{ zh^J`?_re02$HLB4ZBX^hpPeF$+qc55j#pKqw@c!Y!8ko=Fm+!J%c-B%s+COV`q26? z8FB~W>>mc8F$m3viftE#cld;b6U;pGE=-!3V}d$&K_0d4)=rHL%b~Ua^3hg<%Y(U> z1O7!@ge$a}osA&%U((kiD%lg-dLo{vaQ)N0Bezs}>05gSU@@3nnLRxr6gDOg+_a$1 z@(~WbRl~q9&)v*f-U|D`$S%XPj{-%a1GzFqo}J>1-}ejaVoZ0gmoh6JqeCc0gMPcxtf=EGUXo?eLB7cb}}xxTEZ-xM)(Vus>F4m1KG2 zFjq)FLJy=NADg#wqc{!V6&BDk@qgrw@zJ-gRs zk(%vItPpRIQuUR~ea^Gfvrb*)Wj$8|dbA7X2#GKoMamc%5CcEGEOTuB@itd4%_b}* zs8ms$=liRc@J&}#T{`B1h>$B4k#P(J)S;Q9<`^`UvFip1a>NU}m8nHy#n*SqU&92D zWmWG#yW7;h;4w1fb}PJ;MdlK1H#(Mv!4A!`Jcg9UT_r7_@9N>px}~5n>7SF4pXyGE z1itq&VZ0MA0QO>zf*)yC;F|Pd@2JO3PIN!A+vOwn#1u;tPRHD2$Z-}EqeF}%n7*sS zBcU2MF^Qsz=~>=St?PT?QEH#hB6{gb!Q;Mk09m9gEcIB7QL(1-0-xJsRmsFcTXI3$ zfe8bm0@ju2G`_J_WN@W9XiZ7uhAek-!ogP<@*tR77gN)WI>zb3>*G7-4IajUMduCr z`LbOnQpa;qwI=Vg>hlO}B-&}O1IOm}6S7fT%K6R{JQksS8{6X@d04aOZi^LL0PmL( zQGyU{250@Urc&)`J$nijR&mMb-jZQM{H2TTL6984Re3yDONVHNEco)mW*{uP z8nNCWlaX^Rl13X_+9hz63E3*f1enXk233}+S+}p;NnvX6vy_j0b1b)RKRvzJ$0J2F z6vG~9Rk?YodNWVekeEl`_{tX##d-FX{m`Dxg|#4F!RHa^8eY;_Lf~tt7a<$d;yJYd zj;lLgfTNi`(~x5H?50CsemGl=Ka0ZgueZS}>$FREwLiQaelfJMQBg4wSN~dABk7u5 zCgMi{)+Ni9VBbx1@7+7$zFl|@f^@%d481f=K|52BxX@Xzm`_UTZ%eD}REsWGu4km! zi+sWPy)AwA;cDps;O0a*#WVp?U&_5>{=Cy{pji8>Rjk{SGws#Of#HDL9XH6h#D zhP~ew+?dqGJI2qMrfHe`M?*V0vl}AAg7@{OeRq#fRV5z z!N@t%urn$Z*fBV0Ri{(kv0^N<@Jk1@p7lIC+X7}e$kM%giN5FV3uXYnGvA~w3yiuG zg2o48zeN+JydaFqkV#ix0YU(j8q8Q&od-dU>Xmrvl-YhW*l11`-I9-qJ%PwM11jGI zva>~a07D+`3wsAfn#4AT0!007++6wuoq2dH1X~5KKzy6?w~e+>iPE_oKRoDn+K-48BrWQu}T1XKYh#Abz0W<47NpAxbiB!MbJ7R`o)h6+-2!;YJE7?>h5ulqk#YXgOhf8NE~ zY#bvxL;V52ef||dfI!AVENcPEMw@HHasUM2TGDNgOESbA-MO_G<}c%v z6IB7TO6jxPGJvp>u?nlNzjD`DKJPhK^C!)@_O!S4rMoQI>*RYa!tgxgR!u9SC2S~b zJX{XOb|LEwDi^qxk&Vp9llO%qZZ`C%-C9c1``~?t`I$?!7ts~g31J3%&hdII+mBW4 zB;vT z53DuRF{LC4O+7^`sc)Rl{h!Wx#kpOa8!7_Zw_l;6?3W;h#A76A#=Jme!=C5+G9tG zj(T~XTH1avc>NaIyYDXA=_8g9=6J==StAtj;cTZ;nX1lxI?8b~ zqNZoA_y{SC=n*ntr)uQJaX_0T8*HR`@c7$_O&=${^Ng&ES4mxz;WHvZq&XMZC>)j1 z#yrt#tPV6Goa4yZZAHr-$Yn-^ zF66Pm+is%g3-9aJ<#M4B?E`mh)>)cr?cLM6z9lau-#zPLDAkl$rRf*mDFLn*Jb@L9 z))c`Gb-WV<1WgO$iyT(GylI~o*$cBe9C;?0TulFhEriM@71jeZO|9<|&#dL18PR5i zN+XBlcE#tT7R|j%HVYM;Lm!E}4GutPFi1Y(Ni*!T5}NgzSL=_#Hne!E-J!WIKXUfz z**&!N`ebW=&<@&S#XqMzUG{F#MdfQJg!7h1qS`;6BOaF)y46o3#akPA<^pKw#b0*B zpu@^>g!IkLkjQ_wy!(H!{r$E@{#NjFJRB4L^Cjp1tJm}|LAZ3}p^Db40V7R|o!j_` znInh;9eGjxn7J6Jkyv{eBHBp~8{L^r%rwkYj1<#%BFRX5K&J zo?Z2)^Hsde_mx$yZ~HSHA5MsJLX3Ek5Joxf3?w;eI^h^V|;8xp@N(T0%S z=~F&-Ko1+@I)%zOb5Z(c)VKGldG0iM(kfKKxR0>T-`KPMDLGQo5IH9WKqg@Ayu&(A z9_zgC)KFp65H+t^EK+YlP`G}dMQSIk^B@{;{V2HjLCMYSm(n6ZRC28*oXfz|gB=Aj zzT+{KFoh5u%xtR50@DQ(&QDc0kLx`b2}u4?w;_^wQ6^z`ITga!xi0|yq1Znn`qbUZ z>h|+pvk5t{#X7-RBR_emAtHw_?f$i=_Vq~)sHN}0N+H(gp?aE^e2?E)z3ia&&ank9 zH&$l`GmqGGU)cF`&Au04bI zy5`&V9KLX#qXMP;(Gx^42Jtux99`E0VsdX3XiY1a3JGH1_LfdIlgW~gD~?gKI{xUc z+Pg}W{@{9mk%dQ5M>S7>O+@$NxM0L&g-ws2K9B2lpb)6V+C@D>$s<-p}SO{gU{EK3a-2|NGYXe}I_nP!Zv9LE+!M{$FK_`>$Tq zzfP-%)C-uwgdU=x2N>&sh-j4o4xfg^xBY-hBj%s)R&}&!^aPJ><*(!_csqp6I9*gw z=vcNB?R9&8SsI^oG&H$#ZumZdkHWzB%OD10-4aMbI66F;oC;Y0)HhjIHeQ7sZKIsR z)*TGQ2F4qC2tQvyBI7O#TKf76r3YDkczwjMiz-B)bZXHG_-KoewRz^~W-w7QWO=>< zwQ-7~^7%Fa@O-pK1BwF$1h=*HCJlX-8|rSzlshBsz9uib#2-JtKYE-DCWH|$QwHX^ zluMwh*!;z!h-Q=GHqUV-+mNtMd`7MQaTg0IVMQex#_t6&-H!TxkWA3YR%*Z+H)*Sr z!!?1fykk70fNP%_ z961Ac`?I+>a_bI@YXfnR8uU661E&cAHWK~RE6t+;2EukOwV}5%=S6Z73k}Zrmfw1) zH5=DPC|aBWV;}(Bg=8{XG3fwd`mUN)@WJ4VoItajl(<&xab1`ZtP7Cgl%s{W>B8qT zQ{ip;K*#g|S4b%lpGC+oSQC`Oj(71fbFH32X|pugZGvky>PF%MlV-;_<3KaVzG_t7 zWp}4r*W&zvAhC(z%W!TRNZHLuX;;qw#lXrQ!okthgtA{fv278-+qPy)%EcrH;yR#efTer(7= zhs8~^_Kt3!mWlEK-vWe<;NOm6v*W z&(+$J}fiWx`<41wRtJL>qcAjGB{ z&l~yPA>T>r>Mc~-m(#KjtGSOobxVf41Wnop1FUOpKdIpQgi%1J*jQJGTu=lbAc6LF z;EBKed003rE}Cd`4QL)GfVaK_4ddXtx~+Xc0D?k6;9i_4E`}dE&j0P5RR2>$nSn_h z9z($QV3yaz79E|o=ezf^99G7fU_XrSF-jo{$+K;S8%{dF1HFoU@C`v!@tT!w3BSxc z5ck!=e15^;X1K_7>#Xw?wAHyef(&zP;_~|1D}qJ`W=mGK*@k1>!@bZ%l6&KuaO?C& zzh=ll!Tr5;J7-^P2VM@yZd-(L{ zKdHc2_}m~xd3%|}v9{P+izVV6a5iz;e1xd(acfF@3X`NmtgT_IA*qD-bf#;Xvvsn( zJdcj*dp=N=3%6uul*^UJs!vn)Q7`w$*b=I_W7+~eKxuPWE8ofHU+ThjPbaw|H7{q( za$w_HauMgeA2+Snu_ls@ugvh2CfjmIJ$+-dP!O21K5;t zlq)2=xBfBueb|vb#*^w#d5Evja+*5WY;&xBdlfTbu@lceHA|@6UNGjJ)T1JYQx&^O z0Oa-SB{_aRJv54`L}2r#ArqJiDDQzvpICS+^L0;o?R>Ao2UXXf_BME}r7L}EpmH($ zsvvQiEx9uEBW!#@Q0nMY>~ra=mvsNPshV!?#E9mIx-owsDJpz5?Hs`&HnM<&rvJ?bt4BK9%y7Y67U0m z71HsO3Iw?I{bpNR7kC3K!G~AU;Gs1{^&c#$&om={3_NtNezP~9X#|0Gy(gM;SP=QR z)#L}<$^4?{f;Z$a6wtmWxLIp;>(FBXo);(c;bZur2Y=x|dD4H3yufZH#{!h21$_z3 zl*f|r4H*pzeEugDI-lg35fdn&`TYkqoEiITx|1<~%=iDHHT}nY|95u!e{5Y_9%^y^ zZDXJ<3sQJkB9x8(#dbz&3F$Qt7~Hj1Tvn> zi4hV27A4>!-D#Y&#hD)ejX3dFuiyNFepG#`np$2ciUQB)fv`5dzv2Kxum|MiYV`bA zEmm?1)BSSMQA0160y?$^np`wZ`nGafKSkWfH-4b2E0)8E6$J~ zt>l%0u(_*dIesW^kPzsUW0x1`J!$-JafZd#uVxT+^n4~z$7oXnyAPZQDeM6P4M!l* z;J}WzuQ4C@5>a7miwjn;}SIy%f&}P#4*trOd?$TNd=20*Z}kPZ;+3_SgN9l zs=tDaBU7kqyQI9CO8Svixteetu3*)k*JXZ+vd*O;>TsSx91-X*l$81!IbAn?q8Hh+hvisa%^) zm=(@va4q5_6P4G=O_8F{b2gfSgJ#F3O7?OLJ2qSjs63l(lYZ|_m$#DUCs&#$FKI_z@1&_YqTMNCJ58QDN9no$ONesDXDMH1h1$P&8$K%N0bfc`D;KCH^HWGBUBNzKBGZ_0*PF-4oRHy z5!j5{nTb2#_QF@KEM)HgU^%@w4*%=wDz*Rgya-Wqs~tojBPe#vaL?ht_98wMJ9J*e zq0f`_6hHEhKmXyGKZgCyBYCK#sZ->!sQ)bfI6NA-&0EZ#P2_AK?0o%JU30g$3k*ZEAenmknQc0a1Iu|!A4tq;_ zK=S+a8vI~Buh(+qpYJREjc*3|#c#xECWIoFr6|+qmHcjXbZxKVhmt05>P#^SW*&LXapDd&dI!UEV~$Wzu+$dRl$n15AX> zKGGq+jOog_se`l11;nRQg#w+Cg1#RveMJmtFcTzuNSwEZDfGi(Dz$*$kVD9tjDvkr zxjO@8tRbM>WXgrT#)S!q+;S7yVXhzKP0qzcIrtodef$N_G#!}q#gB{w+98M&@HP$b ze71@p{bxXVV~)8H7oA9v2>JGIx($P1D%hJi!*Zz6#g-imUD0*Cu(Xv zGAm~Dl!Sr|jKTDKSz(60;-)HWJT{ux zdm7eHS3Z^1nVBWL-cb!~ahkg{EHdhoACx5RWBabJpL%Z13Cz543|pxM_-<}ZaBe%} zMacSaNg~zsv1e2JMa&U9php8&N8rfi?j@k2!a|r@_?8;RHC4yV#O}IhV5dFz*g)rq z-n@(Zwo3k!U?}rQC9Y;561Wy*_-sYaRy1$y>QJ9))cFj}u`X}ov>Z>FYq6kAuu}gWnRT^Z} zj564noAmF518~0eTAa))-j4&3B;$o=u8p~S7e>ZEWle0xO7UG@8WePI!XPq|E}kYU z1JX(KCvXnkt;zsrGXrcAUGrhGWjW6G6>_{1dhvDlup>k4@w(?bE6xV(-780XKis1+ zS2KN24b)RGwD~|>*apN%^F{V_u}Hq79z|1gQ>&^$#!`+tz8*!FYnpY0sZ#oRoaCwB z%7hz=;is+;bTHmRJu0~>2))`|{MdWjGb6Gx`Cc)c&jdkz2^Q+K?6kfitt2);um%>qM#X)k4zW;e4^u;wpgu3Ith|a z)c+V;Mjtj)JiE1oBxSGo@1XH#$1+9~R~{kz6VJl~wMdWqG@>NS z7sEIi-?5c8pNtqSeuV~iE=Vrm*sH8&&Arjqn**r!o9^>>>##dkFKJ$7q*!0n<*=r^ z@C$%xCF4bL1h3)2Yc`(g$Ulop0%Vo{KuhKyb=v>tv{a5BPTFq#w!Ht*3I6>5|En4^ zfBw+_?DxNj1wR2k|1$5*-bVZaWYVS`gf&G2%9dS_21jA0gK3Tox!E z3Kr>YayXwm&2u9~dLhXvK#)6)5S`&#b&T7jz(!0B(8P zWH}Rgx70!7QK)7e4ciOY^LD844^7Ql#>;7%TFRk@Yvs;C6_Zow#`ObenM6pIFRNMc zaMIRb5NW`KfF#}{IT3)GIZY4FCleQ8|7OHDP%c(oFVhWPS7@Q$7)$KQMU^z4#XTeqqi zm!ZvS4Crf&P8>Sqsw2SYS#l*B$ccBp0<-oVmYGp~q6(7B%W`t7= z=VdXR__gu=vPlgi-K1sFN#raCur$mUhW&?`?zf%5gB@ z^Z9IpLE$Bxxo3Ys_SCqGe0D|Ax>e=S0W*L$<45f-K#%fox|e@VnN*Jc#pVOl`F|rO z{r82I;{HMe_K)GSR+E2u(|>l7Uw@bUM|3{_%4-rZqFfvY?Y03b10|)04qhBJ1}eUR zX!2c?uach8hYx=H(o%~E!ddh|)g+oSVA2C2Izybt|Cai-P$y}5a>q>9@FoCBqoXF8 zK|#2=9`qyo<#u>fo?!DuY>&feYd>C&Kg5aqHF_9YR$K^|a5={OEV)@GdC%pJe;lcS zP(}m_lZ9nKu=b8GP%9`N0Z2sdVpZa`6K^gM0%DLd zV4J~$jDZKLrgcvv(^u0~i^&MdIQDkf1Tz zf&_oN;g^KuTLJM>j@JgRH8w?ktSZl2j&qAL9MbVw%^tKpq2mm$R^EROCb2UEJ}J>T zBwh!*OyY!7=z}p}Zj$up-6ltCB7n{^IdQSTAtWoz!`jxuv{B=>J55aa=g1ph-aq>y zg&5}j?GgNU)zGbOjO}D+H{3amPArIQH+b2oFtbg}OMA9YbX%vIiNEel{4j|`w4LEvW67(+tplIA8RqO_s+^4$}Y z1~=LsBxDQsEF)+5MN}n39%uzWU>jL)oA+8Q#9Wc79f13oOl*P(l5_}fz@48cTaXK% zvc#s>KFD8n?o^-oaIf2XUP#k)s;-Ttm&d5jCjn!YHlboO1i@ZoCWuD2nSA*$8$#^h z9V@8_Dcqb1AnV(WG$S1!33;#`AG{c)nz}q`H??%ZvHt5fV7h1mq!qr8=T1;$=6-Qj zFvu#)C>aqV=X-}uu&xF5HbcgpxM`Edo5I=KH>2IBgVLYePJDZ?s5dCRBkqc-o~iMQ zdR7K%yrw4DaildbCM3N@8iZG&Z_X8z5Y4J>8Z%2BBUKp-oe^yC$y$sRP&LMeM+1+553`oh3?u=N}=0 zB%q$=KkJN}mS5>T3XZ;CLKKB{!;gVo;w$biVm`&*os8TVjB>Owf6IQI!8a}a*o{(7 z#iJ~=hTRK6mEdeO;^SIvL|u9g%ZA)-^LxI!UK-mKGwEpX=eI(MiWJ6P1&cIQ zOp>5XvX;@D+S5#JWyKm4!UHlovYvlPYI4j)0;t zuoEFVSRuUIn5JC*v_n05Aq+KGXE4p*!~PBsdVhFPR9X1wXG7`BQ9PVPQH%7kkA6GY zI#jCB@W5B(4w(K^?R9OV^wDl>*g89`CFA4w<_Rn+u~p6;i~>|No8BoB^xhlRF+eyy z8UxGvds}LeO<|eK3?%XS50-*K8)7tRAXMOfCg5mrkmI0A1q2_H$;Aczh)Os{=xweg z)^fc3{S#ZoP?JDjzx3pU!L2)_IQn@7v7Jw?MM=02Lst$gx5M_$#lF=8O6>kLVT%c? z_I)YPU)rUmP!cwLEg98xfNV|l0{GmdFo?lRe-36!aJ;71slpQF z*V|Kld>^Ilp~=SlXFBE$dV^whU=dJLLfSkc0>q@Li;G_HY0k2VB8k0pT+==?DjfUO zL4(iMDfAoA9Q4LuaEiVlNuFBMrVEZWmm`RwNNh#`1y9r?z-2m0MnUaLiy~#3Me?Us z1V!V!xh9=*q-85J*G1e-i`fiSUUO)O!)IURI8#wCQkb#;Gc3rwU#-DRk_A#f6qBl^ zvhC$xLM7qH;caZ-+j8ORTN~`ei)(OplE(Z1!&H|Fs+>9IU}J8=ImI2L^L2_x1lo62 zmX(jEZ=MZoR(zO*;wT_nA_F-uz);jw*Z{&Nl(303Z@4+h+ltVhcwv z78=xEhQG0D##?fyuk5W4+BcIE+=O-jyCH{TSQLAVb_O^aNOah->XJ2>=*Z%*FZ#_+ ziR?0Rcvd1|dqLTm`^;sStJ)8>GjH^nfkn_Z>+$ZJ|E;X zHrK4D)Sp$n;_s=jwM>BNPYKdvE7RtEkFT^ceJ+1dUo*6xkF2Xl#^`e>yo$8c<(Dj` zqEe?i=CQM;>;IFA#m9cmB$`eB}ufinBGP#eBAD-?g_i$NSOrKopxZ8MwFcC>V$pui?Bi zV(W-4SAJMT=)WD#QsSIQ<`tOJkS^nf5&CpR?#B@?p|$3x=~xC-dt5VL=U5ru8!ief zZqq2SQ{_XtJlF}ICLc|xCTTI|A5B~GGY?q&XkJjhq*A^Z^t3$7XUekz*(qIm!IdiY z;fYl*oCSqmW-*TyHUkjq8LQ%*uqR{vlnWyk`k)$jyg3U~40Gonw626lEcLJ?Y-&at zxhBWZM3Tb^8D(7s*F6-kHwr7vK6qt!eg5>N=Da%!Vk?mJIqW5GrdD~_444h=?tMkn z->blJI$xfcp&t4Dh6y@7mAP|#N9@@4(%b8XwanB zVgmofa>W>?x~soB7tu_I@uhOdYx84a>FMf0nFWBBT3`aduCF)!Mj}TL^Wt@n59_`_udW;5;*3L2sW#{iLcq zL5ei~jdkQ0)DKwQHb1GXh`^7D6~Y?ezTBK<4u!ZH)2=t!>y z@IXSRhI&zstT1b{G`I1qlgtXRn88p(05=ca0Z&A~LnDhKmBFB?5Ft#-Y>*X7sVV`y)Z4rb$M*W|Ii$0WO#6RTO)C2lf>1%<0BeOfIu%`xT% zE{Sb+tZ8vIZ%&6_q~YBjAOxe<8GcgfX<-3oex^d;LV94pf{mS5e%fu z3Bt?W;PAYo@H+qnX?E9reDcjxh?grU#dCW;SQeiP;!`l|>Gy0w4y_VX$}T z9p^bZz&KBOKu8ED^l$g;zpp-A8WO%>WK56$#wCfH?CtF+K68zE`I=Pb>vNUsApjzk zcoX&!U8~=<#k>NqV1y8@ z>z$OQn5}m`!)fcTX73jxI?6S&%iK2Pe5|UP`n-c$HuuzVQuM{cmQ%~M-&!h`e8(^l zS$NxZZOJtV1KI^C$UQC_uwmpd?!7Lvx$cw2vvB>~5U0zThf=IMNkh&p5A=sCVBWy} zcOwOdEy%Hi&|xA=LS5?BBd6n=M6J_p7h|Z`S>GKHZI*I{zuoIsQ{`0CxMF5zJ-eNf zlpEwtLR4X=q?6pbZEcO66f%@r#}ck1w;PSVJ^0n;F#fq!2uL(ahd_XA2Ya(`aQWxQ7W!#+fsT%bdXGKt!NxBv>TR1e^Kaz7t;3i1{YaHES5_Le=(IRsJ^|{W$QJbHC z>1M1momh#6f9`I6m5Fj?beO--((R-nJw1UK^NUqQy;!#XdpX){#toNPZF9Sk4@DC%4K06CwK%04KT3DYHfF8Bqk z$kh!ICw?%K*nZ(s`*Hmg`b3-{=r~lbwVCjsRJNdW*5gMdL9`y_z9D`4!lHcrSj6Ur zbXgRQc+YAYloPN8^yKtrG3*rnI;gI8e>fz5fg`nhOM*}4j<-)i)*M z8UgWz14bU;9d;+f`4tKcNrw>aH@^W}Zdd|7SNL#orXdxk^FlK z{9pMtE*4x**Ye|nA8R0o`^qIjM1TRgviVRtQhs01c%VfD=0!>+U5e$DEEE6{h}RdZo7c*%}i1 zB6`+^t^$^s;(zdf&^HJ{lsEw! z20GBuY*4p1nZ5xtoVyiH-HSYiG9wHOZp-A@#hWV#PjW<61bjXcQVq+)+RQt{h6PVI zX8E#^E)6ddm76+hG?t1xd~vH~y_c+`9<%4n_FOqUb4Jo6i4>|ab5@;5SxKiZdn zBP5{y*R?PIh3uj#qg4#v26%7)!yYX~b(S&!VuRlSF?+O%5AB{CMn3!a{A)e0<6`}w zZ*Z~hQM*Y4KFPjwy_VtJN0_J{=;*5OynGueE3;%L6v&vA_~hO8aiQX>T(Bqn7xN$c z9A1VH0Z@idD&Y||gCtA5QOGRs@Ht~0n~}4qn`v1_542}P&t5vuxcVZ=KaT1^H0}rB z9_Qgp$j{Mt;F0NbyZ}mvIld8`sHqUB@vgBDasDPpFSWZ%;=_~^mWrwTag|3UglOD8 zi~n~*e;8o*+q!2JyJpx7$gJ!TFoSdc-Um`8XmDT@N;QQ*A?QtH9B)_rNya?Pg&Dt38ML!#Sz*K5Y z)5MgCgJ7Y6SIUjD#MmPB2QsXv;fC zc{R*)yJQBnSNjp|(Xmi<3idG<{23e5`Hk( z-V89FixD+Rx&#JnSmzobqh)hnw7N7TJ6@`bIM%lf-x+O2j`@Q-}&~;pBt7ALo z-RgYGN2k}m=ATG|SFWhGG;erql?;zBW{^%Xn5W`_{8M;zh!h?&B=_|QAJI|q>KR(T zk5_gtP9;YWt7`cZ5^@4*Y}OE+0{#wzB$?u($1*94P7fqEjp>KXwoL;0uMXx5K0Gyf zUZ?`Dl~=orfSo59lHY3b;CLnEG;J1}1_W)LXh#-^S2I*k+)d12JUOcClz&9zYT`?3 zP%FXjVNNx7LYtwS3!T?qN)RkoESPeY;)iokd@TRvdUY4l{?#|sc31aGaH@}t+zLf`8R~YG4GDWh($~KjTtl|$8gc~dHFO>(=SA*|l zWa_7vozckXMbL0^9*8V3(HY{dMTB7zVSTc9l=%$3eZ5~3YdX$84bbi~1SP_*1B76C zfKjgnzu8)cFEA5C!0+THqT4Cwu_W;10l0l&5=gHtI2J^<#^-yo8w=lCRrh+?l(IT< z-SE+oMg>c=Cz*GdUjb*BL&RxI6M!g?#*1)l(S#53F|b%HBF{*b>!jT*A47jUx1m@H zw9I{9GwT4}6%3+lWm=(#5VjU+0HjLPe8g3vTRhY*m{Fx?J$*3s+x2M{24TO5@UM|a z6KsISi`L_m5eU`<5e}~vTlXXKLZt>Zz2~c#9jDwOT+PPiGd*6~*@e;?%Oe{LUd8c7 zGW`Y=`|_{8-5m+z18}S@^W!&FLleZs zNF4eU-qao-F*E>>(cgqm%3;PQ0Ht-BRnQcggTe#9?J=}}&rxh*$hXe0G3bY?q;s17 z`F*cl5YdbBQWd?o2vl?+XW@TWr{!!0ew=*C7rq6Y-wCl%b?_KSc+VjyEsn1;MNW-# zDl{22^QiGepqGuv$e&cE*>gky3^QK-lS#? z0hG{H+kjF68lXv%YwxUSRw2j7cYlgF0%Xu`*GQxSSR_+}FFJUX3 zdysgNiSzsblT%2(xt_c9OT{Z3Kk5S4AizoZ0J=hS5~v;(M>%arGRF2qdrR-|IY{I; z3~sn4>7|5<9Y?gr^|L+$1l%$-&zyST7G++e*O8K^tJ+7 z>_gR~DTd%+`V-4*P9{VL%J3{bIh!O?8nV}^$|N#%^~_-1v*qn?=(m@ps!cRZ+0&r{ zrT5t`<$Xd-vg4Nt%eYsI*KjJS+Eo~1X@~2!%7vLFeRz!tg-ri#@gUZZEH1aEbR?*Q z$1&IK7PKuol<-P>s}-R_EmdBqy0D4Woy`Y%CkTF7IAyRm=w9k@u7lIKhs@ICnr@Xd zkdF+n)y^)1Iu2?AQ3{I2^T4^u6EeARj-3;}Yk1;)*BixZ@e95hB099LFtadN)b^ zu$S=|cW8n5#+;uy?y{ri6XBn9%KRGq!&t0Hu#ZFCZhe-Wd$T{jkTC3pt$L?EhiJ|& zhIHg|k5n}e$kD2v`ec!FP`p_6O$q}isLH*=*N>suTczi|Gx;f*6nWeaTy=;Fd1$xv z_QDLx7bPYT6gQ8aug_J$RrPF5Wp_Yo<{s^GrO7PR)<+wMzHe97C}F&1NVO8voc}fg z>4;0np#V^eHf6N49r_mYM9KihsiD+q&__U6HZHP^$%VJdJvdX+s4=)?pc?ELjgRyR1PjSd+a{X_Poa_|BN`j1h6 zvaZ10;GR7_=KuOCxTZ>fW{r-hGh6xB8~Gi_OnL->Kpy_2`hKbM^RdH*6f_0dJ<$R* z?19Mln{=tn56_#y!*;o>&h(FghZhx?#q0c#C}_eae{(m2{Bp}d*{Bn|O_xnM`jhG< z{U3AsFMI!gd#(O4r~m2}{jV&)5%r|n=h}Ycv@l8mdMUbkuR{H|)~)pC<%=c{;Vw=; zsY)RGH`ldReGmC$CWSy@PkoN^R&1M7`G3QbK%;?(!aVgOl3eEUrN0U2-Wr@-r15he zYwfE_0?)?*?2>3t0A!&B7JzRgUX2zQKz@G}m(uJ|U*Duki%9+Lz(b1Q#H?ZwZn zXGnUV1Gu+dv)hW+mUeiK%Oaw;Nn?&g9oY*jZ{3QkjO!av%_xAkA|PGDRMWh>Eo~$r z{P=wM`HwJHz(HuEoWOP$VDcECX1E96s^kZeQG+{cGTQF>iT0aw10MX13Sit?0^@^K z;xOKnkXHzGCucP?8MXeRsX4lAx}1H`k>-m!*eTfnBBHEh(rORf4#r*p&j z+PWMYsimnbAq%?eFjoAk)t=&(1$3mn5!+BE8c;@qvW7z%#}?b~*S{2IfoOBM zpXy!w0I5x%QDQNo)%o%E%m+_ukdZB{7fn@{7k!}Lo{AkXL=T>O;M<3cu&6QYOJyK_ zlRlr^>iv;qcN*8_2gVxDO))HpZA7ZZh~efU0xHx(OfNY%4P{+GvCY(VmKgF>KVsDs zTxc!yRx)u;^#C3Gq|(>~_=-%n9(e7KN7kI={!l#j>5X6DDT(?SBh>Bng{SGs-%MK8 zku`=7KpZ$a_9bNT*DrmNzVsEEK}Q7`gD=(%20T#bFQ!!{-l%%G&S0}@t1{=& zQpV-ef|Z-LXJ7Pd$eW%xZOygeOmrmZ<8K3s)p@ZnsUaViXkApu5MStpu-NHx)3f|{ z?QKj=u$2xutdLX?5UXu$;PffV6e27= z<#VmyWp*p9=^Ro6K@iode@XmRp0?Zdoz!rQ`fmIEBYZ(OX;o{9#k;N=6--Ax=#m(H zot*hbAqDK>wNynAsUoqjbpV=d%k5LdsR1?tx2{&nZIhU-SB~{>_GvFXaR@&e>N#YX zapznPTS+^j#7kT8Ed5Lyo|G=Qs z{xkrn*w@+k3&QcwhUBm_`v=nTPZ_Mkpt}G2`d_1Y`*#pX|F6i9i>Db=bzKSVt9)Sk zRWA14;_#shc2iWhS;ui@38Aku{6vDCadH4&kLU`uAmkGbL)P%#>N|4t-gKRK3tNxw zZjho>zZXbU@5iOB(|yW4G`TN=s)pwX!rdk0YG4mrCD;WwX`JJ^F+jf8m<1-MpxH>F z1>l}79_U^2i?eR&Jy#o3ZNoACsK9SXUmB?$1!GZa$`Y&>-o~zMvLQzht?KxmxjmNZ ziB&l8MBSnL+KvvuG03$qk(eVp2IH=!8R%JC?>!ftg8AyrE>GiV1=B&o1=r}OYvN$d zStPt>KZT)#s73hwl% zR2J0_*&-9W($>0UYHK3BpJ|w!#=h^+YN+Z6Ie;1`VkuE(QH3Q95{(wY*QW<&$E{us z+PP1n{k8dfFmJf01+IR|K4?){e$|xTTB4x=>2LT3$Li-jYFuugo2Xgrfr-|Jg;nu+ zGQd3;<8&A}E<8C;NBr7%dfn{vUR7D3R9lh9IPW7wNcgE#SHC8AF&>g6>T$DDVTe?F zmRm%CuAj^673_rliR02|!8hwOYThNR6KkU7EJe2>xH$GA+OJm;|A+nbx zYo@X#NfJU#b`p|gsxecPeF-5Hl~7qGd$yVE$-Xm|*@_l2Q;e%->ApT^d3-+|(|(z3}siRit^V$7_5yZrL<$G+4%=@OYOnR5X;gi@?=F_YnuuPCF6GjN{ z#W(7#nFcfWqDMlmzi{*TGT^J74>{gjUX|~DxOMjS2dmdAE9$qqQ_;?@*jhZP7(qLM z0s9-Z3Ej-_WJ6a1u7T>Qdi+)_QQ`7q{#B5)p;N2=W?DZUQ#b@dp_ze07 zM_xZ7=2L0d+1IUyavkjbj8v$*j;b}Zl`0puu7wX(Wx)kVs4U}6w+L--F_RpXMSaGd z3j`O>^&ct?ml8U!8M=qv70X%mP`0^O`(D2GpxoiaD(U^$!S@T#=0BsGB%k-}8wIVe z)xT*G|M6`9)h7N2n(f~)U;h_q6aQ^2^gk;gg9DMov9C}8c+iCKAXj=#G@lsAR2;8w zH~t#m2`%=u>}lBWN0oxc<|exUXNaDG)m3NG>`2aK#oDEY$v%_VJVzYU zpyhkTE({YkxPSH8W}$Wi&!yWjI>>3 z3SJK<6%qW)R@n(X($6F}22)fylUR3lj=6vXQUTXs{8b`T1eE#8_l`Fnx4{=lVOie zg@q+4Kh0fq&0j$X)hLK&yF0q zvKG&?e&N0A01gI>(GB|$v~zsLT!0A0r6!pCo-RAxlAa$LqtKAAS>;)7llZ7yw?}bB z4mkW}0PmBLOcX>P#&m?CLaG2?$|2m+o>x;*1I!`wdDj9{jY7MtA*Rt;3LR2reRpqp z&jj~eBhqXawMQs3YfV&qT1&%&)|(!tU%r^;JE_PN4!kmZ<6wPIYUbk_A{99hJNONp zwMqEqns~o?MY^#qPuT}+6ke9$;dWR%hRA=xH_zX#T0{89l$oxhy{EOahvV3%tCako zZioU54e<*?XrXq=LnrY5Sb_5zc9fv;bx-qasKRsmppwpV{8_1CBij}y<64zA^g4>QJ zf1G^lh4WR#B}q3bs`kXUxYP?VwpL=_^3zQk1Jhq5SJ3SnIWZDhbFh${50kp7ExEiI zU8mGFTANt5tqN~u-Z#$uX!Mj0E^P5QW-<X))PGk@!cgTiuqTN>%b%%e;G zJTCWrzGh#X89OvR9T>oMhEeSt+}xvjwSHrA6O+0m`ij2NnIQ5&xeOuCKdbZ=>iQuYfg{)L)xB~1lce{6= zL7H@R;bg2mZ3mY5u6#_>SSUf29ez{86-&;=rNmx7x3G+7Tn*_J-M4@EnMadJ+^Mm# z&+V?!PY?5FrCsuOs8D;}QUAX9Y{8A-=8qU!IPum-F&|4CXkwlK-ksB0tKQc*s%4NxFul~%#61$0TE0Y3u(8I8GIt(xrElWwIT1X+A(Ac#e-vx?EYQcJB?4o8OXQ;^o@QMu(w0g>7v#^{s^yPt-M75X6#{lI098o?xtuv=$ke837I5r=**n#~-@(-)O}5fXi)rKz#Ni*sojoOt}ExAhO1?!RWh ze~sY(qjCCsgQfnbsr&ykBly3Imw%({R7GD&zlwzfg;#yMJYGWiq z?H>>ibS$8=vbL9k;0cme?KsTsm?iY$N1lWRm-@*IHe0XI-ml-^5R-3c;6J1z<5eWX zCx0<#pJdM^tV+)O^q5Eg+?>iP@c@CDx^I8K@40{D#lP2<*>jPNE z1G+=J%1p!B2`O?z#)x3&#KOSx!ikZ1eX^!^n5P4*Exuw7(#$cR-5;n`Zn_}IXAv4gZ z_b8zheemJ(!|1Nd@t(P-<8{T5g~nQR44&s^8~OSZG)WEn2X* z+ElmOVTY0PBM1NOrBb6|w9-MU;b2v;t+iIUzm%yxiplin%z)K&b0hQ^k=9_~Aac