From 3390e5450bde0725021aac718a0689af7ea51a69 Mon Sep 17 00:00:00 2001 From: Maciej Aleksandrowicz Date: Sun, 25 Jan 2026 21:05:28 +0100 Subject: [PATCH 01/11] grasp: added 'urdf_path' param to the robot config --- aegis_gym/rsl/grasp_cfgs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aegis_gym/rsl/grasp_cfgs.py b/aegis_gym/rsl/grasp_cfgs.py index f39fdd0..7ca1001 100644 --- a/aegis_gym/rsl/grasp_cfgs.py +++ b/aegis_gym/rsl/grasp_cfgs.py @@ -145,5 +145,6 @@ def get_task_cfgs(): "default_arm_dof": [0.0, -2.09, 2.09, -1.57, -1.57, 0.0], "default_gripper_dof": [0.025, 0.025], "ik_method": "dls_ik", + "urdf_path": "~/ceai_ws/aegis_urdf/aegis.urdf", } return env_cfg, reward_scales, robot_cfg From 7c9643a8b3910701dd0144dc6c3792d3f3717d0e Mon Sep 17 00:00:00 2001 From: Maciej Aleksandrowicz Date: Sun, 25 Jan 2026 21:06:50 +0100 Subject: [PATCH 02/11] grasp: replaced xacro with parametrized URDF path --- aegis_gym/rsl/envs/manipulator.py | 31 ++++++++++++++++++++++---- aegis_gym/rsl/envs/utils.py | 37 ------------------------------- 2 files changed, 27 insertions(+), 41 deletions(-) delete mode 100644 aegis_gym/rsl/envs/utils.py diff --git a/aegis_gym/rsl/envs/manipulator.py b/aegis_gym/rsl/envs/manipulator.py index c45ac5f..191b100 100644 --- a/aegis_gym/rsl/envs/manipulator.py +++ b/aegis_gym/rsl/envs/manipulator.py @@ -1,4 +1,7 @@ -from typing import Literal +import time +import warnings +from pathlib import Path +from typing import Literal, Optional import torch as th import genesis as gs @@ -7,8 +10,6 @@ xyz_to_quat, ) -from .utils import generate_aegis_urdf - class Manipulator: def __init__( @@ -25,10 +26,14 @@ def __init__( self._num_envs = num_envs self._args = args + # TODO can't automatically disable/enable cell - switch models? + self._urdf_path = self._resolve_aegis_urdf(args["urdf_path"]) + print(f"[GraspEnv::Manipulator] The robot's URDF path: {self._urdf_path}") + # == Genesis configurations == material: gs.materials.Rigid = gs.materials.Rigid() morph: gs.morphs.URDF = gs.morphs.URDF( - file=generate_aegis_urdf(show_cell), + file=self._urdf_path, fixed=True, pos=(0.0, 0.0, 0.0), quat=(1.0, 0.0, 0.0, 0.0), @@ -49,6 +54,24 @@ def __init__( self._init() + def _resolve_aegis_urdf(self, urdf_path_str: Optional[str] = None) -> Path: + default_path = Path("~/ceai_ws/aegis_urdf/aegis.urdf").expanduser().resolve() + + if urdf_path_str is not None: + urdf_path = Path(urdf_path_str).expanduser().resolve() + if urdf_path.exists(): + return urdf_path + warnings.warn( + f"The given URDF file '{default_path}' doesn't exist! Trying to read the default file in 5s..." + ) + time.sleep(5.0) + + if not default_path.exists(): + raise FileNotFoundError( + f"Couldn't resolve the path to the URDF file: Default file '{default_path}' doesn't exist!" + ) + return default_path + def set_pd_gains(self): # set control gains self._robot_entity.set_dofs_kp( diff --git a/aegis_gym/rsl/envs/utils.py b/aegis_gym/rsl/envs/utils.py deleted file mode 100644 index 76dca1b..0000000 --- a/aegis_gym/rsl/envs/utils.py +++ /dev/null @@ -1,37 +0,0 @@ -import re -import subprocess -import tempfile -from pathlib import Path - -from ament_index_python.packages import get_package_share_directory - - -def generate_aegis_urdf(show_cell: bool = True) -> Path: - pkg_share = Path(get_package_share_directory("aegis_description")) - xacro_path = pkg_share / "urdf" / "aegis.urdf.xacro" - _, urdf_path = tempfile.mkstemp(suffix=".urdf", prefix="aegis_urdf_", dir="/tmp") - - if show_cell: - xacro_args = ["disable_cell_collision:=true", "disable_cell:=false"] - else: - xacro_args = ["disable_cell:=true"] - - urdf_with_uris = subprocess.run( - ["xacro", str(xacro_path)] + xacro_args, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - check=True, - ).stdout - Path(urdf_path).write_bytes(_resolve_packages_paths(urdf_with_uris)) - - return Path(urdf_path) - - -def _resolve_packages_paths(urdf: bytes) -> bytes: - urdf_str = urdf.decode("utf-8") - pattern = r"package://([a-zA-Z0-9_]+)/" - matches = re.findall(pattern, urdf_str) - for match in matches: - package_path = get_package_share_directory(match) - urdf_str = urdf_str.replace(f"package://{match}/", f"{package_path}/") - return urdf_str.encode("utf-8") From 1e875bbf70d8d27b33fa5faa87e10dbf08b9a781 Mon Sep 17 00:00:00 2001 From: Maciej Aleksandrowicz Date: Sun, 25 Jan 2026 21:15:31 +0100 Subject: [PATCH 03/11] updated changelog --- CHANGELOG.md | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 341ec18..6791bb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,23 +9,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- [PR-46](https://github.com/AGH-CEAI/pull/46) - Added TCP-to-object Grasp environment. -- [PR-40](https://github.com/AGH-CEAI/pull/40) - Added scene and tool cameras setup for Grasp environment. -- [PR-39](https://github.com/AGH-CEAI/pull/39) - Added Grasp environment compatible with RSL-RL. -- [PR-32](https://github.com/AGH-CEAI/pull/32) - `ROSRoboticCommander`: Added servoing (twist/jog) with MoveIt2 Servo. -- [PR-31](https://github.com/AGH-CEAI/pull/31) - Introduced control frequency parameter to decouple policy updates from physics steps in Genesis. -- [PR-28](https://github.com/AGH-CEAI/pull/28) - `AegisReacher`: Observation normalization for TCP and Target positions. -- [PR-26](https://github.com/AGH-CEAI/pull/26) - Added support for multimodal observations in environments. -- [PR-26](https://github.com/AGH-CEAI/pull/26) - Added a scene camera to Genesis simulation for visual observations. -- [PR-21](https://github.com/AGH-CEAI/pull/21) - Added Cartesian control for Genesis robot commander. -- [PR-19](https://github.com/AGH-CEAI/pull/19) - Added Cartesian control for ROS robot commander. -- [PR-17](https://github.com/AGH-CEAI/pull/17) - Added Cartesian control for Reacher environment. +- [PR-46](https://github.com/AGH-CEAI/aegis_gym/pull/46) - Added TCP-to-object Grasp environment. +- [PR-40](https://github.com/AGH-CEAI/aegis_gym/pull/40) - Added scene and tool cameras setup for Grasp environment. +- [PR-39](https://github.com/AGH-CEAI/aegis_gym/pull/39) - Added Grasp environment compatible with RSL-RL. +- [PR-32](https://github.com/AGH-CEAI/aegis_gym/pull/32) - `ROSRoboticCommander`: Added servoing (twist/jog) with MoveIt2 Servo. +- [PR-31](https://github.com/AGH-CEAI/aegis_gym/pull/31) - Introduced control frequency parameter to decouple policy updates from physics steps in Genesis. +- [PR-28](https://github.com/AGH-CEAI/aegis_gym/pull/28) - `AegisReacher`: Observation normalization for TCP and Target positions. +- [PR-26](https://github.com/AGH-CEAI/aegis_gym/pull/26) - Added support for multimodal observations in environments. +- [PR-26](https://github.com/AGH-CEAI/aegis_gym/pull/26) - Added a scene camera to Genesis simulation for visual observations. +- [PR-21](https://github.com/AGH-CEAI/aegis_gym/pull/21) - Added Cartesian control for Genesis robot commander. +- [PR-19](https://github.com/AGH-CEAI/aegis_gym/pull/19) - Added Cartesian control for ROS robot commander. +- [PR-17](https://github.com/AGH-CEAI/aegis_gym/pull/17) - Added Cartesian control for Reacher environment. - [PR-11,12,13,14,15](https://github.com/AGH-CEAI/aegis_gym/pull/5) - Added Genesis simulator. - [PR-2](https://github.com/AGH-CEAI/aegis_gym/pull/2) - Added reinforcement learning Reacher environment for the Aegis robot station. - [PR-1](https://github.com/AGH-CEAI/aegis_gym/pull/1) - Initial package with boilerplate and gymnasium API. ### Changed +- [PR-49](https://github.com/AGH-CEAI/aegis_gym/pull/49) - The `AegisGrasp`'s rsl_rl robot config accepts path to a standalone URDF file (see [aegis_ros PR-95](https://github.com/AGH-CEAI/aegis_ros/pull/95)). - [PR-42](https://github.com/AGH-CEAI/aegis_gym/pull/42) - Extracted Grasp environment configs to a new file. - [PR-42](https://github.com/AGH-CEAI/aegis_gym/pull/42) - Ported Grasp environment to use `rsl-rl-lib==3.3.0`. - [PR-38](https://github.com/AGH-CEAI/aegis_gym/pull/38) - Changed `ur_base` frame to the `world` frame. @@ -43,10 +44,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed +- [PR-49](https://github.com/AGH-CEAI/aegis_gym/pull/49) - Removed automatic URDF generation with `xacro`. + ### Fixed -- [PR-46](https://github.com/AGH-CEAI/pull/46) - Fixed model sorting and typos. -- [PR-26](https://github.com/AGH-CEAI/pull/26) - Fixed pose retrieval for Genesis entities. +- [PR-46](https://github.com/AGH-CEAI/aegis_gym/pull/46) - Fixed model sorting and typos. +- [PR-26](https://github.com/AGH-CEAI/aegis_gym/pull/26) - Fixed pose retrieval for Genesis entities. - [PR-21](https://github.com/AGH-CEAI/aegis_gym/pull/21) - Fixed TCP link handling in Genesis. ### Security From 1d35648d07ac6764ba44daa16eb6a148c697e09e Mon Sep 17 00:00:00 2001 From: Maciej Aleksandrowicz Date: Mon, 26 Jan 2026 00:10:39 +0100 Subject: [PATCH 04/11] grasp: removed show_cell Manipulator arg --- aegis_gym/rsl/envs/grasp_env.py | 1 - aegis_gym/rsl/envs/manipulator.py | 1 - 2 files changed, 2 deletions(-) diff --git a/aegis_gym/rsl/envs/grasp_env.py b/aegis_gym/rsl/envs/grasp_env.py index dc90955..e199c65 100644 --- a/aegis_gym/rsl/envs/grasp_env.py +++ b/aegis_gym/rsl/envs/grasp_env.py @@ -109,7 +109,6 @@ def _init_scene(self, env_cfg: dict, robot_cfg: dict, show_viewer: bool) -> None num_envs=self.num_envs, scene=self.scene, args=robot_cfg, - show_cell=self.show_cell, device=gs.device, ) diff --git a/aegis_gym/rsl/envs/manipulator.py b/aegis_gym/rsl/envs/manipulator.py index 191b100..5f91007 100644 --- a/aegis_gym/rsl/envs/manipulator.py +++ b/aegis_gym/rsl/envs/manipulator.py @@ -17,7 +17,6 @@ def __init__( num_envs: int, scene: gs.Scene, args: dict, - show_cell: bool, device: str = "cpu", ): # == set members == From 140354224c94d8777f5b46866999a4e69938bba8 Mon Sep 17 00:00:00 2001 From: Maciej Aleksandrowicz Date: Mon, 26 Jan 2026 00:11:34 +0100 Subject: [PATCH 05/11] ADD: script for uploading URDF assets to ClearML --- utils/upload_urdf_to_clearml.py | 110 ++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 utils/upload_urdf_to_clearml.py diff --git a/utils/upload_urdf_to_clearml.py b/utils/upload_urdf_to_clearml.py new file mode 100644 index 0000000..6844bd3 --- /dev/null +++ b/utils/upload_urdf_to_clearml.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 +""" +Upload robot simulator assets to ClearML Dataset. +Handles URDF + STL/DAE models as a versioned dataset. +""" + +import argparse +import logging +from pathlib import Path +from typing import Optional + +from clearml import Dataset + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +def upload_robot_assets( + robot_folder_path: str, + dataset_name: str = "robot_simulator_assets", + dataset_project: str = "DeepRL", + parent: str = None, + output_storage: Optional[str] = None, # None = use default ClearML file server + description: Optional[str] = None, +): + """ + Upload robot simulator folder to ClearML Dataset. + + Args: + robot_folder_path: Path to folder containing URDF + models (STL/DAE) + dataset_name: Name of the dataset (version auto-incremented) + dataset_project: Project name in ClearML + output_storage: Target storage (None=default fileserver, or "/path", "s3://bucket", etc.) + description: Optional dataset description + """ + + folder_path = Path(robot_folder_path).resolve() + + if not folder_path.exists(): + raise FileNotFoundError(f"Folder not found: {robot_folder_path}") + + logger.info(f"šŸ“¦ Creating dataset: {dataset_project}/{dataset_name}") + if parent: + logger.info(f" Parent DatasetID: {parent}") + logger.info(f" Source folder: {folder_path}") + logger.info(f" Files to upload: {len(list(folder_path.rglob('*')))}") + + # Create dataset (automatically increments version if exists) + dataset = Dataset.create( + dataset_name=dataset_name, + dataset_project=dataset_project, + parent_datasets=[parent], + description=description or "Robot simulator assets", + ) + + logger.info(f"āœ“ Dataset created: {dataset.id}") + + # Add all files from folder (preserves structure) + logger.info("šŸ“„ Adding files to dataset...") + num_files = dataset.add_files(path=str(folder_path), recursive=True, verbose=True) + + logger.info(f"āœ“ Added {num_files} files") + + # Upload to storage + logger.info("ā¬†ļø Uploading to ClearML server...") + dataset.upload( + show_progress=True, + output_url=output_storage, # Uses default if None + ) + + logger.info("āœ“ Upload complete") + + # Finalize (lock version, prevents further modifications) + logger.info("šŸ”’ Finalizing dataset...") + dataset.finalize() + + logger.info("\nāœ… SUCCESS!") + logger.info(f" Dataset ID: {dataset.id}") + logger.info(f" Project: {dataset_project}") + logger.info(f" Name: {dataset_name}") + logger.info(f"\n Use in code: Dataset.get(dataset_id='{dataset.id}')") + + return dataset.id + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Upload robot assets to ClearML") + parser.add_argument("folder", help="Path to robot model folder") + parser.add_argument("--name", default="AegisURDFModel", help="Dataset name") + parser.add_argument("--project", default="AEGIS_GRASP", help="ClearML project") + parser.add_argument( + "--parent", + default=None, + help="Already existing dataset ID which will be the parent of this version.", + ) + parser.add_argument( + "--storage", default=None, help="Storage URL (s3://, /path, etc.)" + ) + parser.add_argument("--desc", default=None, help="Dataset description") + + args = parser.parse_args() + + upload_robot_assets( + robot_folder_path=args.folder, + dataset_name=args.name, + dataset_project=args.project, + parent=args.parent, + output_storage=args.storage, + description=args.desc, + ) From 06adb2c4d0f985afdcf41f40a059ed8ba0c5b298 Mon Sep 17 00:00:00 2001 From: Maciej Aleksandrowicz Date: Mon, 26 Jan 2026 00:15:17 +0100 Subject: [PATCH 06/11] grasp: URDF path changed to dataset ID --- aegis_gym/rsl/envs/manipulator.py | 42 +++++++++++++++++++++---------- aegis_gym/rsl/grasp_cfgs.py | 2 +- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/aegis_gym/rsl/envs/manipulator.py b/aegis_gym/rsl/envs/manipulator.py index 5f91007..03951d5 100644 --- a/aegis_gym/rsl/envs/manipulator.py +++ b/aegis_gym/rsl/envs/manipulator.py @@ -1,10 +1,11 @@ import time import warnings from pathlib import Path -from typing import Literal, Optional +from typing import Literal import torch as th import genesis as gs +from clearml import Dataset from genesis.utils.geom import ( transform_quat_by_quat, xyz_to_quat, @@ -24,10 +25,14 @@ def __init__( self._scene = scene self._num_envs = num_envs self._args = args + self._urdf_model_id = args["urdf_model_id"] - # TODO can't automatically disable/enable cell - switch models? - self._urdf_path = self._resolve_aegis_urdf(args["urdf_path"]) - print(f"[GraspEnv::Manipulator] The robot's URDF path: {self._urdf_path}") + if self._urdf_model_id: + print( + f"[GraspEnv::Manipulator] URDF ClearML dataset ID: {self._urdf_model_id}" + ) + self._urdf_path = self._resolve_aegis_urdf() + print(f"[GraspEnv::Manipulator] URDF path: {self._urdf_path}") # == Genesis configurations == material: gs.materials.Rigid = gs.materials.Rigid() @@ -53,17 +58,28 @@ def __init__( self._init() - def _resolve_aegis_urdf(self, urdf_path_str: Optional[str] = None) -> Path: + def _resolve_aegis_urdf(self) -> Path: default_path = Path("~/ceai_ws/aegis_urdf/aegis.urdf").expanduser().resolve() - if urdf_path_str is not None: - urdf_path = Path(urdf_path_str).expanduser().resolve() - if urdf_path.exists(): - return urdf_path - warnings.warn( - f"The given URDF file '{default_path}' doesn't exist! Trying to read the default file in 5s..." - ) - time.sleep(5.0) + if self._urdf_model_id is not None: + dataset = Dataset.get(dataset_id=self._urdf_model_id) + local_path = Path(dataset.get_local_copy()) + + urdf_files = list(local_path.rglob("*.urdf")) + if not urdf_files: + raise FileNotFoundError( + f"No URDF file in dataset {self._urdf_model_id}" + ) + if len(urdf_files) > 1: + raise RuntimeError( + f"Found {len(urdf_files)} URDF files in dataset {self._urdf_model_id}, expected just one" + ) + return str(urdf_files[0]) + + warnings.warn( + "There is no given ClearML dataset ID for the URDF assets! Trying to read the default directory in 5s.." + ) + time.sleep(5.0) if not default_path.exists(): raise FileNotFoundError( diff --git a/aegis_gym/rsl/grasp_cfgs.py b/aegis_gym/rsl/grasp_cfgs.py index 7ca1001..3f45205 100644 --- a/aegis_gym/rsl/grasp_cfgs.py +++ b/aegis_gym/rsl/grasp_cfgs.py @@ -145,6 +145,6 @@ def get_task_cfgs(): "default_arm_dof": [0.0, -2.09, 2.09, -1.57, -1.57, 0.0], "default_gripper_dof": [0.025, 0.025], "ik_method": "dls_ik", - "urdf_path": "~/ceai_ws/aegis_urdf/aegis.urdf", + "urdf_model_id": "16f3a020b5c746b2bf8673a5ab9ef27c", } return env_cfg, reward_scales, robot_cfg From 62a795b8ccb1968372f1ec4e44ffefcafacc04f6 Mon Sep 17 00:00:00 2001 From: Maciej Aleksandrowicz Date: Mon, 26 Jan 2026 00:15:31 +0100 Subject: [PATCH 07/11] updated docs --- CHANGELOG.md | 3 ++- README.md | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6791bb9..2fc286d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [PR-49](https://github.com/AGH-CEAI/aegis_gym/pull/49) - Utility script for uploading the URDF assets to the ClearML server as a dataset. - [PR-46](https://github.com/AGH-CEAI/aegis_gym/pull/46) - Added TCP-to-object Grasp environment. - [PR-40](https://github.com/AGH-CEAI/aegis_gym/pull/40) - Added scene and tool cameras setup for Grasp environment. - [PR-39](https://github.com/AGH-CEAI/aegis_gym/pull/39) - Added Grasp environment compatible with RSL-RL. @@ -26,7 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- [PR-49](https://github.com/AGH-CEAI/aegis_gym/pull/49) - The `AegisGrasp`'s rsl_rl robot config accepts path to a standalone URDF file (see [aegis_ros PR-95](https://github.com/AGH-CEAI/aegis_ros/pull/95)). +- [PR-49](https://github.com/AGH-CEAI/aegis_gym/pull/49) - The `AegisGrasp`'s rsl_rl robot config accepts ID to download URDF dataset from ClearML (see [aegis_ros PR-95](https://github.com/AGH-CEAI/aegis_ros/pull/95)). - [PR-42](https://github.com/AGH-CEAI/aegis_gym/pull/42) - Extracted Grasp environment configs to a new file. - [PR-42](https://github.com/AGH-CEAI/aegis_gym/pull/42) - Ported Grasp environment to use `rsl-rl-lib==3.3.0`. - [PR-38](https://github.com/AGH-CEAI/aegis_gym/pull/38) - Changed `ur_base` frame to the `world` frame. diff --git a/README.md b/README.md index 6ea118e..f9a8e4a 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,35 @@ poetry run pytest -v -s ```bash python3 ./test/sb3_run_train.py ``` + +--- +## URDF model for simulator + +### Uploading +1. Generate standalone URDF model with [aegis_ros/aegis_descrption]() launch command: +```bash +ros2 launch aegis_description generate_standalone_urdf.launch.py disable_cell:=true +``` +Which will generate the whole URDF file with 3D models in a default `~/ceai_ws/aegis_urdf` directory. + +2. Run the [`utils/upload_urdf_to_clearml.py`](./utils/upload_urdf_to_clearml.py) script with the following options: +```bash +python3 utils/upload_urdf_to_clearml.py ~/ceai_ws/aegis_urdf --name AegisURDFModel --project AEGIS_GRASP --desc "Aegis simulator assets" +``` +> [!WARNING] +> **To update the dataset** make sure to add an additional option: `--parent "PREVIOUS_DATASET_ID"` + +3. Check the ClearML server's datasets. + +### Usage + +In the robot's config set the `urdf_model_id` param to the ClearML's dataset ID. + +> [!IMPORTANT] +> In case of failure to obtain the model, the code will try to load URDF model from `~/ceai_ws/aegid_urdf` directory. + + + --- ## Development notes From 920e87a77486faa06f5bac82aa55aef5b8d07bed Mon Sep 17 00:00:00 2001 From: macmacal Date: Mon, 26 Jan 2026 18:54:11 +0100 Subject: [PATCH 08/11] fixed script with no parent dataset --- utils/upload_urdf_to_clearml.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/upload_urdf_to_clearml.py b/utils/upload_urdf_to_clearml.py index 6844bd3..8475203 100644 --- a/utils/upload_urdf_to_clearml.py +++ b/utils/upload_urdf_to_clearml.py @@ -46,10 +46,11 @@ def upload_robot_assets( logger.info(f" Files to upload: {len(list(folder_path.rglob('*')))}") # Create dataset (automatically increments version if exists) + parent_list = [parent] if parent else None dataset = Dataset.create( dataset_name=dataset_name, dataset_project=dataset_project, - parent_datasets=[parent], + parent_datasets=parent_list, description=description or "Robot simulator assets", ) From 0c738f4aca27f675b25010ceb06cf7437f8b3d66 Mon Sep 17 00:00:00 2001 From: macmacal Date: Mon, 26 Jan 2026 18:54:18 +0100 Subject: [PATCH 09/11] fmt --- utils/upload_urdf_to_clearml.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/utils/upload_urdf_to_clearml.py b/utils/upload_urdf_to_clearml.py index 8475203..0618677 100644 --- a/utils/upload_urdf_to_clearml.py +++ b/utils/upload_urdf_to_clearml.py @@ -39,11 +39,11 @@ def upload_robot_assets( if not folder_path.exists(): raise FileNotFoundError(f"Folder not found: {robot_folder_path}") - logger.info(f"šŸ“¦ Creating dataset: {dataset_project}/{dataset_name}") + logger.info(f"> Creating dataset: {dataset_project}/{dataset_name}") if parent: - logger.info(f" Parent DatasetID: {parent}") - logger.info(f" Source folder: {folder_path}") - logger.info(f" Files to upload: {len(list(folder_path.rglob('*')))}") + logger.info(f"> Parent DatasetID: {parent}") + logger.info(f"> Source folder: {folder_path}") + logger.info(f"> Files to upload: {len(list(folder_path.rglob('*')))}") # Create dataset (automatically increments version if exists) parent_list = [parent] if parent else None @@ -54,32 +54,32 @@ def upload_robot_assets( description=description or "Robot simulator assets", ) - logger.info(f"āœ“ Dataset created: {dataset.id}") + logger.info(f"> Dataset created: {dataset.id}") # Add all files from folder (preserves structure) - logger.info("šŸ“„ Adding files to dataset...") + logger.info("> Adding files to dataset...") num_files = dataset.add_files(path=str(folder_path), recursive=True, verbose=True) - logger.info(f"āœ“ Added {num_files} files") + logger.info(f"> Added {num_files} files") # Upload to storage - logger.info("ā¬†ļø Uploading to ClearML server...") + logger.info("> Uploading to ClearML server...") dataset.upload( show_progress=True, output_url=output_storage, # Uses default if None ) - logger.info("āœ“ Upload complete") + logger.info("> Upload complete") # Finalize (lock version, prevents further modifications) - logger.info("šŸ”’ Finalizing dataset...") + logger.info("> Finalizing dataset...") dataset.finalize() - logger.info("\nāœ… SUCCESS!") - logger.info(f" Dataset ID: {dataset.id}") - logger.info(f" Project: {dataset_project}") - logger.info(f" Name: {dataset_name}") - logger.info(f"\n Use in code: Dataset.get(dataset_id='{dataset.id}')") + logger.info("\n> SUCCESS!") + logger.info(f"> Dataset ID: {dataset.id}") + logger.info(f"> Project: {dataset_project}") + logger.info(f"> Name: {dataset_name}") + logger.info(f"> Use in code: Dataset.get(dataset_id='{dataset.id}')") return dataset.id From 3d8b6dd3b3867d6e6e32546e9e309b1e93e8f74d Mon Sep 17 00:00:00 2001 From: macmacal Date: Mon, 26 Jan 2026 18:55:20 +0100 Subject: [PATCH 10/11] parametrized urdf id for show_cell --- aegis_gym/rsl/envs/grasp_env.py | 1 + aegis_gym/rsl/envs/manipulator.py | 7 ++++++- aegis_gym/rsl/grasp_cfgs.py | 5 ++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/aegis_gym/rsl/envs/grasp_env.py b/aegis_gym/rsl/envs/grasp_env.py index 6f2aa79..8743a4d 100644 --- a/aegis_gym/rsl/envs/grasp_env.py +++ b/aegis_gym/rsl/envs/grasp_env.py @@ -108,6 +108,7 @@ def _init_scene(self, env_cfg: dict, robot_cfg: dict, show_viewer: bool) -> None num_envs=self.num_envs, scene=self.scene, args=robot_cfg, + show_cell=self.show_cell, device=gs.device, ) diff --git a/aegis_gym/rsl/envs/manipulator.py b/aegis_gym/rsl/envs/manipulator.py index 03951d5..56a10b6 100644 --- a/aegis_gym/rsl/envs/manipulator.py +++ b/aegis_gym/rsl/envs/manipulator.py @@ -18,6 +18,7 @@ def __init__( num_envs: int, scene: gs.Scene, args: dict, + show_cell: bool, device: str = "cpu", ): # == set members == @@ -25,7 +26,11 @@ def __init__( self._scene = scene self._num_envs = num_envs self._args = args - self._urdf_model_id = args["urdf_model_id"] + + if show_cell: + self._urdf_model_id = args["urdf_model_id"]["cell"] + else: + self._urdf_model_id = args["urdf_model_id"]["no_cell"] if self._urdf_model_id: print( diff --git a/aegis_gym/rsl/grasp_cfgs.py b/aegis_gym/rsl/grasp_cfgs.py index 3f45205..47f5178 100644 --- a/aegis_gym/rsl/grasp_cfgs.py +++ b/aegis_gym/rsl/grasp_cfgs.py @@ -145,6 +145,9 @@ def get_task_cfgs(): "default_arm_dof": [0.0, -2.09, 2.09, -1.57, -1.57, 0.0], "default_gripper_dof": [0.025, 0.025], "ik_method": "dls_ik", - "urdf_model_id": "16f3a020b5c746b2bf8673a5ab9ef27c", + "urdf_model_id": { + "cell": "08c47ceaacbf48bf8aaad7238a2525bf", + "no_cell": "16f3a020b5c746b2bf8673a5ab9ef27c", + }, } return env_cfg, reward_scales, robot_cfg From 45a8224383859a8c6a74faccdee5386eaf4cdba2 Mon Sep 17 00:00:00 2001 From: macmacal Date: Mon, 26 Jan 2026 19:16:28 +0100 Subject: [PATCH 11/11] setup urdf models for the geonosis PC --- aegis_gym/rsl/envs/manipulator.py | 10 ++++++++-- aegis_gym/rsl/grasp_cfgs.py | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/aegis_gym/rsl/envs/manipulator.py b/aegis_gym/rsl/envs/manipulator.py index 56a10b6..b377b6e 100644 --- a/aegis_gym/rsl/envs/manipulator.py +++ b/aegis_gym/rsl/envs/manipulator.py @@ -67,8 +67,14 @@ def _resolve_aegis_urdf(self) -> Path: default_path = Path("~/ceai_ws/aegis_urdf/aegis.urdf").expanduser().resolve() if self._urdf_model_id is not None: - dataset = Dataset.get(dataset_id=self._urdf_model_id) - local_path = Path(dataset.get_local_copy()) + try: + dataset = Dataset.get(dataset_id=self._urdf_model_id) + local_path = Path(dataset.get_local_copy()) + except ValueError: + warnings.warn( + "Failed to obtain the dataset: `{e}`. Fallbacking to the default path..." + ) + return default_path urdf_files = list(local_path.rglob("*.urdf")) if not urdf_files: diff --git a/aegis_gym/rsl/grasp_cfgs.py b/aegis_gym/rsl/grasp_cfgs.py index 47f5178..0173fdd 100644 --- a/aegis_gym/rsl/grasp_cfgs.py +++ b/aegis_gym/rsl/grasp_cfgs.py @@ -146,8 +146,8 @@ def get_task_cfgs(): "default_gripper_dof": [0.025, 0.025], "ik_method": "dls_ik", "urdf_model_id": { - "cell": "08c47ceaacbf48bf8aaad7238a2525bf", - "no_cell": "16f3a020b5c746b2bf8673a5ab9ef27c", + "cell": "4ae9243a9e294db998d3d6e0b5a0539b", + "no_cell": "3b30eed8cea6423a99d9bad3343740ed", }, } return env_cfg, reward_scales, robot_cfg