diff --git a/agent_context/topics/data-assets/data-assets.md b/agent_context/topics/data-assets/data-assets.md index 83fa3d919..ff768dd93 100644 --- a/agent_context/topics/data-assets/data-assets.md +++ b/agent_context/topics/data-assets/data-assets.md @@ -58,6 +58,11 @@ when needed. Solver/planner checkpoint download helpers can have separate paths. ZIP bundles must include directory entries before nested files for Open3D extraction. Validate new bundles through `get_data_path()` with an empty cache. +`UniversalRobots` selects the V4 archive with corrected UR3/UR3e material +colors. Its versioned `UniversalRobotsV4` cache directory changes source paths +so URDF assembly also refreshes previously copied mesh materials; public +`UniversalRobots/...` asset references remain unchanged. + Demo classes live in `assets/demo_assets.py` and are exported through the existing asset registry. `TabletopFourBases/scene_export` resolves the four-support rigid tabletop example from `demo/tabletop_four_bases.zip`. Its portable source contains diff --git a/docs/source/_static/robots/aloha_mini_2_pro.png b/docs/source/_static/robots/aloha_mini_2_pro.png index 895afec0c..bc0b8e808 100644 Binary files a/docs/source/_static/robots/aloha_mini_2_pro.png and b/docs/source/_static/robots/aloha_mini_2_pro.png differ diff --git a/docs/source/_static/robots/aloha_mini_render.json b/docs/source/_static/robots/aloha_mini_render.json new file mode 100644 index 000000000..5a8abe6bc --- /dev/null +++ b/docs/source/_static/robots/aloha_mini_render.json @@ -0,0 +1,239 @@ +{ + "robot": "AlohaMini", + "model": "Aloha Mini 2 Pro", + "configuration": "AlohaMini catalog defaults", + "source_asset": "AlohaMini/alohamini2pro.urdf", + "source_commit": "66033036bea07486a33b7027810956681287b4a3", + "source_urdf_sha256": "444805be9200095dcd972c1e39fc2c6f7b95d2d675af074ca5ce16febd7e7210", + "configured_control_dof": 15, + "native_articulation_dof": 21, + "control_parts": { + "left_arm": [ + "left_shoulder_pan", + "left_shoulder_lift", + "left_elbow_flex", + "left_wrist_flex", + "left_wrist_yaw_joint", + "left_wrist_roll" + ], + "right_arm": [ + "right_shoulder_pan", + "right_shoulder_lift", + "right_elbow_flex", + "right_wrist_flex", + "right_wrist_yaw_joint", + "right_wrist_roll" + ], + "left_eef": [ + "left_gripper" + ], + "right_eef": [ + "right_gripper" + ], + "torso": [ + "vertical_move" + ] + }, + "additional_source_joints": [ + "root_x_axis_joint", + "root_y_axis_joint", + "root_z_rotation_joint", + "wheel1_joint", + "wheel2_joint", + "wheel3_joint" + ], + "render_cfg": { + "renderer": "rt", + "spp": 1, + "denoising": { + "window": "dlss", + "offscreen": "dlss" + }, + "dlss": { + "dlss_quality": 2, + "upsample_ratio": null, + "render_width": 0, + "render_height": 0, + "target_width": 0, + "target_height": 0, + "tiled_enabled": true, + "exposure_compensation": 1.0 + }, + "nrd": { + "max_indirect_bounces": 1, + "denoising_range": 500000.0, + "disocclusion_threshold": 0.01, + "disocclusion_threshold_alternate": 0.05, + "disocclusion_threshold_mix_enabled": true, + "history_confidence_enabled": true, + "history_confidence_probe_stride": 5, + "history_confidence_sigma_scale": 2.0, + "history_confidence_sensitivity": 1.0, + "max_accumulated_frame_num": 30, + "max_fast_accumulated_frame_num": 6, + "history_fix_frame_num": 3, + "diffuse_prepass_blur_radius": 30.0, + "specular_prepass_blur_radius": 50.0, + "anti_firefly_enabled": false, + "sh_mode_enabled": false, + "validation_enabled": false, + "max_stabilized_frame_num": 63, + "min_blur_radius": 1.0, + "max_blur_radius": 30.0, + "antilag_luminance_sigma_scale": 2.0, + "antilag_luminance_sensitivity": 3.0, + "taa_min_current_weight": 0.0625, + "taa_sigma_scale": 2.0, + "taa_depth_rejection_enabled": true, + "taa_tone_mapping_enabled": false + }, + "tone_mapping_enabled": false, + "tone_mapping_exposure": 1.0, + "min_bounces": 4, + "max_bounces": 8 + }, + "camera": { + "width": 960, + "height": 1200, + "intrinsics": [ + 2350.0, + 2350.0, + 480.0, + 600.0 + ], + "eye": [ + 2.423019975423813, + -1.5453052818775177, + 1.4318970441818237 + ], + "target": [ + 0.10995551943778992, + -0.0032623112201690674, + 0.5507296323776245 + ], + "up": [ + 0.0, + 0.0, + 1.0 + ], + "near": 0.03, + "far": 60.0 + }, + "scene": { + "presentation": "SimulationManager defaults with studio area lights", + "direct_lights": [ + "studio_key", + "studio_fill", + "studio_rim" + ], + "emission_color": [ + 0.92, + 0.95, + 1.0 + ], + "emission_intensity": 80.0, + "studio_lights": [ + { + "uid": "studio_key", + "light_type": "rect", + "init_pos": [ + 1.4, + -1.0, + 2.0 + ], + "direction": [ + -0.6028605644882187, + 0.4637388957601683, + -0.6492344540642356 + ], + "color": [ + 1.0, + 1.0, + 1.0 + ], + "intensity": 40.0, + "rect_width": 1.6, + "rect_height": 1.8, + "enable_shadow": true + }, + { + "uid": "studio_fill", + "light_type": "rect", + "init_pos": [ + 1.1, + 1.2, + 1.5 + ], + "direction": [ + -0.5547001962252291, + -0.665640235470275, + -0.49923017660270624 + ], + "color": [ + 1.0, + 1.0, + 1.0 + ], + "intensity": 25.0, + "rect_width": 1.4, + "rect_height": 1.6, + "enable_shadow": true + }, + { + "uid": "studio_rim", + "light_type": "rect", + "init_pos": [ + -1.0, + 0.3, + 1.8 + ], + "direction": [ + 0.6645343026631946, + -0.18123662799905305, + -0.7249465119962123 + ], + "color": [ + 1.0, + 1.0, + 1.0 + ], + "intensity": 40.0, + "rect_width": 1.4, + "rect_height": 1.5, + "enable_shadow": true + } + ] + }, + "root_position": [ + 0.0, + 0.0, + 0.0 + ], + "joint_positions": { + "root_x_axis_joint": 0.0, + "root_y_axis_joint": 0.0, + "root_z_rotation_joint": 0.0, + "vertical_move": 0.0, + "wheel1_joint": 0.0, + "wheel2_joint": 0.0, + "wheel3_joint": 0.0, + "left_shoulder_pan": -0.15000000596046448, + "right_shoulder_pan": 0.15000000596046448, + "left_shoulder_lift": -0.6000000238418579, + "right_shoulder_lift": -0.6000000238418579, + "left_elbow_flex": 0.800000011920929, + "right_elbow_flex": 0.800000011920929, + "left_wrist_flex": 0.0, + "right_wrist_flex": 0.0, + "left_wrist_yaw_joint": 0.0, + "right_wrist_yaw_joint": 0.0, + "left_wrist_roll": 0.0, + "right_wrist_roll": 0.0, + "left_gripper": -0.5, + "right_gripper": -0.5 + }, + "physics_stepped": false, + "warmup_frames": 48, + "image": "aloha_mini_2_pro.png", + "description": "Aloha Mini 2 Pro documentation illustration with native OfflineRT rendering, a display pose and three rectangular studio lights." +} diff --git a/docs/source/_static/robots/cobotmagic.jpg b/docs/source/_static/robots/cobotmagic.jpg index 0f4891ff7..59085a514 100644 Binary files a/docs/source/_static/robots/cobotmagic.jpg and b/docs/source/_static/robots/cobotmagic.jpg differ diff --git a/docs/source/_static/robots/cobotmagic_render.json b/docs/source/_static/robots/cobotmagic_render.json new file mode 100644 index 000000000..6c0d7b8c8 --- /dev/null +++ b/docs/source/_static/robots/cobotmagic_render.json @@ -0,0 +1,198 @@ +{ + "robot": "CobotMagic", + "configuration": "CobotMagic catalog defaults", + "gripper_asset": "CobotMagicWithGripperV100.urdf", + "layout": "Default parallel arm mounts", + "source_commit": "66033036bea07486a33b7027810956681287b4a3", + "source_urdf_sha256": "4340728998d271c3fbc677016baeac1bea014888e1c08fe40e6969b27b61dee6", + "independent_control_dof": 14, + "render_cfg": { + "renderer": "rt", + "spp": 1, + "denoising": { + "window": "dlss", + "offscreen": "dlss" + }, + "dlss": { + "dlss_quality": 2, + "upsample_ratio": null, + "render_width": 0, + "render_height": 0, + "target_width": 0, + "target_height": 0, + "tiled_enabled": true, + "exposure_compensation": 1.0 + }, + "nrd": { + "max_indirect_bounces": 1, + "denoising_range": 500000.0, + "disocclusion_threshold": 0.01, + "disocclusion_threshold_alternate": 0.05, + "disocclusion_threshold_mix_enabled": true, + "history_confidence_enabled": true, + "history_confidence_probe_stride": 5, + "history_confidence_sigma_scale": 2.0, + "history_confidence_sensitivity": 1.0, + "max_accumulated_frame_num": 30, + "max_fast_accumulated_frame_num": 6, + "history_fix_frame_num": 3, + "diffuse_prepass_blur_radius": 30.0, + "specular_prepass_blur_radius": 50.0, + "anti_firefly_enabled": false, + "sh_mode_enabled": false, + "validation_enabled": false, + "max_stabilized_frame_num": 63, + "min_blur_radius": 1.0, + "max_blur_radius": 30.0, + "antilag_luminance_sigma_scale": 2.0, + "antilag_luminance_sensitivity": 3.0, + "taa_min_current_weight": 0.0625, + "taa_sigma_scale": 2.0, + "taa_depth_rejection_enabled": true, + "taa_tone_mapping_enabled": false + }, + "tone_mapping_enabled": false, + "tone_mapping_exposure": 1.0, + "min_bounces": 4, + "max_bounces": 8 + }, + "camera": { + "width": 1600, + "height": 1080, + "intrinsics": [ + 2100.0, + 2100.0, + 800.0, + 540.0 + ], + "eye": [ + 1.624465823173523, + -0.6709766089916229, + 0.907782394438982 + ], + "target": [ + 0.2825125455856323, + 2.9802322387695312e-08, + 0.2368057556450367 + ], + "up": [ + 0.0, + 0.0, + 1.0 + ], + "near": 0.03, + "far": 60.0 + }, + "scene": { + "presentation": "SimulationManager defaults", + "direct_lights": [ + "studio_key", + "studio_fill", + "studio_rim" + ], + "emission_color": [ + 0.92, + 0.95, + 1.0 + ], + "emission_intensity": 80.0, + "studio_lights": [ + { + "uid": "studio_key", + "light_type": "rect", + "init_pos": [ + 1.0, + -0.9, + 1.5 + ], + "direction": [ + -0.4137378871958792, + 0.5319487121089875, + -0.7388176557069271 + ], + "color": [ + 1.0, + 1.0, + 1.0 + ], + "intensity": 180.0, + "rect_width": 1.2, + "rect_height": 1.2, + "enable_shadow": true + }, + { + "uid": "studio_fill", + "light_type": "rect", + "init_pos": [ + 1.2, + 0.9, + 1.1 + ], + "direction": [ + -0.588034368346321, + -0.5880343683463211, + -0.555365792327081 + ], + "color": [ + 1.0, + 1.0, + 1.0 + ], + "intensity": 90.0, + "rect_width": 1.3, + "rect_height": 1.1, + "enable_shadow": true + }, + { + "uid": "studio_rim", + "light_type": "rect", + "init_pos": [ + -0.6, + 0.3, + 1.4 + ], + "direction": [ + 0.6037006238149838, + -0.2012335412716613, + -0.7713952415413683 + ], + "color": [ + 1.0, + 1.0, + 1.0 + ], + "intensity": 160.0, + "rect_width": 1.2, + "rect_height": 0.9, + "enable_shadow": true + } + ] + }, + "root_position": [ + 0.0, + 0.0, + 0.0 + ], + "joint_positions": { + "left_joint1": -0.30000001192092896, + "right_joint1": 0.30000001192092896, + "left_joint2": 1.0, + "right_joint2": 1.0, + "left_joint3": -1.2000000476837158, + "right_joint3": -1.2000000476837158, + "left_joint4": 0.0, + "right_joint4": 0.0, + "left_joint5": 0.6000000238418579, + "right_joint5": 0.6000000238418579, + "left_joint6": 0.0, + "right_joint6": 0.0, + "left_joint7": 0.05000000074505806, + "left_joint8": 0.05000000074505806, + "right_joint7": 0.05000000074505806, + "right_joint8": 0.05000000074505806 + }, + "physics_stepped": false, + "warmup_frames": 48, + "image": "cobotmagic.jpg", + "description": "CobotMagic V100 documentation illustration with native OfflineRT rendering and three rectangular studio lights." +} diff --git a/docs/source/_static/robots/ur/render_manifest.json b/docs/source/_static/robots/ur/render_manifest.json new file mode 100644 index 000000000..b459d5a56 --- /dev/null +++ b/docs/source/_static/robots/ur/render_manifest.json @@ -0,0 +1,173 @@ +{ + "asset_archive": "UniversalRobots_v4.zip", + "asset_md5": "a92eda28a1d2f9034252cdb2936ceffc", + "asset_revision": "07048cb12b89fe93eb3d2f3d22ea62493d3ab3e6", + "render_cfg": { + "renderer": "rt", + "spp": 1, + "denoising": { + "window": "dlss", + "offscreen": "dlss" + }, + "dlss": { + "dlss_quality": 2, + "upsample_ratio": null, + "render_width": 0, + "render_height": 0, + "target_width": 0, + "target_height": 0, + "tiled_enabled": true, + "exposure_compensation": 1.0 + }, + "nrd": { + "max_indirect_bounces": 1, + "denoising_range": 500000.0, + "disocclusion_threshold": 0.01, + "disocclusion_threshold_alternate": 0.05, + "disocclusion_threshold_mix_enabled": true, + "history_confidence_enabled": true, + "history_confidence_probe_stride": 5, + "history_confidence_sigma_scale": 2.0, + "history_confidence_sensitivity": 1.0, + "max_accumulated_frame_num": 30, + "max_fast_accumulated_frame_num": 6, + "history_fix_frame_num": 3, + "diffuse_prepass_blur_radius": 30.0, + "specular_prepass_blur_radius": 50.0, + "anti_firefly_enabled": false, + "sh_mode_enabled": false, + "validation_enabled": false, + "max_stabilized_frame_num": 63, + "min_blur_radius": 1.0, + "max_blur_radius": 30.0, + "antilag_luminance_sigma_scale": 2.0, + "antilag_luminance_sensitivity": 3.0, + "taa_min_current_weight": 0.0625, + "taa_sigma_scale": 2.0, + "taa_depth_rejection_enabled": true, + "taa_tone_mapping_enabled": false + }, + "tone_mapping_enabled": false, + "tone_mapping_exposure": 1.0, + "min_bounces": 4, + "max_bounces": 8 + }, + "scene": { + "presentation": "SimulationManager defaults", + "direct_lights": [], + "emission_color": [ + 0.92, + 0.95, + 1.0 + ], + "emission_intensity": 80.0 + }, + "camera": { + "width": 1200, + "height": 960, + "intrinsics": [ + 1720.0, + 1720.0, + 600.0, + 480.0 + ], + "up": [ + 0.0, + 0.0, + 1.0 + ], + "near": 0.02, + "far": 60.0, + "framing": "Shared view direction and intrinsics; distance scaled to link-position bounds." + }, + "display_joint_angles_degrees": [ + 0, + -90, + 90, + -90, + -90, + 0 + ], + "physics_stepped": false, + "warmup_frames": 48, + "images": { + "ur3.png": { + "variant": "ur3", + "camera_eye": [ + 0.5037342473053111, + -1.0645680833958007, + 0.8508093965839915 + ], + "camera_target": [ + -0.1493000088739791, + -0.05989999696612358, + 0.19777514040470123 + ] + }, + "ur3e.png": { + "variant": "ur3e", + "camera_eye": [ + 0.5047770905062695, + -1.0713111578704602, + 0.8517774211896555 + ], + "camera_target": [ + -0.14900016784349646, + -0.06549999117851257, + 0.19800016283988953 + ] + }, + "ur5.png": { + "variant": "ur5", + "camera_eye": [ + 0.6054015064259426, + -1.373850264460621, + 1.1059308999796764 + ], + "camera_target": [ + -0.24344991147518158, + -0.06792500615119934, + 0.25707948207855225 + ] + }, + "ur5e.png": { + "variant": "ur5e", + "camera_eye": [ + 0.7247597532450866, + -1.5624767275543872, + 1.2647600131213377 + ], + "camera_target": [ + -0.24600011110305786, + -0.0690000131726265, + 0.29400014877319336 + ] + }, + "ur10.png": { + "variant": "ur10", + "camera_eye": [ + 0.8765489171099321, + -1.9882382960117213, + 1.5901992315697302 + ], + "camera_target": [ + -0.3440000995492909, + -0.11047057807445526, + 0.3696502149105072 + ] + }, + "ur10e.png": { + "variant": "ur10e", + "camera_eye": [ + 0.9653564589536838, + -2.1047021093258156, + 1.707856689623659 + ], + "camera_target": [ + -0.3454999178647995, + -0.08799999114353335, + 0.3970003128051758 + ] + } + } +} diff --git a/docs/source/_static/robots/ur/ur10.png b/docs/source/_static/robots/ur/ur10.png index aa98dbf1d..d699d0c73 100644 Binary files a/docs/source/_static/robots/ur/ur10.png and b/docs/source/_static/robots/ur/ur10.png differ diff --git a/docs/source/_static/robots/ur/ur10e.png b/docs/source/_static/robots/ur/ur10e.png index 8b4a7277c..2b625f2c2 100644 Binary files a/docs/source/_static/robots/ur/ur10e.png and b/docs/source/_static/robots/ur/ur10e.png differ diff --git a/docs/source/_static/robots/ur/ur3.png b/docs/source/_static/robots/ur/ur3.png index 4c0770a70..a7bd041a8 100644 Binary files a/docs/source/_static/robots/ur/ur3.png and b/docs/source/_static/robots/ur/ur3.png differ diff --git a/docs/source/_static/robots/ur/ur3e.png b/docs/source/_static/robots/ur/ur3e.png index f1fd414bb..d8314675a 100644 Binary files a/docs/source/_static/robots/ur/ur3e.png and b/docs/source/_static/robots/ur/ur3e.png differ diff --git a/docs/source/_static/robots/ur/ur5.png b/docs/source/_static/robots/ur/ur5.png index 50d877ee3..4053d474a 100644 Binary files a/docs/source/_static/robots/ur/ur5.png and b/docs/source/_static/robots/ur/ur5.png differ diff --git a/docs/source/_static/robots/ur/ur5e.png b/docs/source/_static/robots/ur/ur5e.png index 9e73e43f7..354a5242a 100644 Binary files a/docs/source/_static/robots/ur/ur5e.png and b/docs/source/_static/robots/ur/ur5e.png differ diff --git a/docs/source/resources/robot/aloha_mini.md b/docs/source/resources/robot/aloha_mini.md index 792661e5b..443de0991 100644 --- a/docs/source/resources/robot/aloha_mini.md +++ b/docs/source/resources/robot/aloha_mini.md @@ -3,10 +3,22 @@ `AlohaMiniCfg` loads the complete `AlohaMini/alohamini2pro.urdf` asset without renaming its joints or assembling separate arms. -
- Aloha Mini 2 Pro dual-arm robot -

Aloha Mini 2 Pro

-
+
+ Aloha Mini 2 Pro with its complete base, vertical column and two bent arms, rendered with soft studio lighting +
Aloha Mini 2 Pro · 15 DOFs across five control groups
+
+ +The image uses the registered `AlohaMini` preset in a display pose, rendered +with `RenderCfg(renderer="rt")` (OfflineRT). Three soft area lights reveal +the dark arm details while retaining the white body's surface definition. + +:::{dropdown} Image rendering settings +960 × 1200; 1 sample per pixel; DLSS offscreen reconstruction (quality 2); +tone mapping off; exposure 1.0. The default ground and environment emission +are supplemented by neutral key, fill and rim rectangular lights. Exact +camera, lighting and joint settings are recorded in the +[render manifest](../../_static/robots/aloha_mini_render.json). +::: ```python from embodichain_robots import AlohaMiniCfg diff --git a/docs/source/resources/robot/cobotmagic.md b/docs/source/resources/robot/cobotmagic.md index 8efe3d52b..1b998cef4 100644 --- a/docs/source/resources/robot/cobotmagic.md +++ b/docs/source/resources/robot/cobotmagic.md @@ -1,12 +1,26 @@ # CobotMagic -CobotMagic is a versatile dual-arm collaborative robot developed by AgileX Robotics. It is widely used in simulation, education, industry, and service scenarios. All examples in this document are based on the latest PourWater task environment. - -
- CobotMagic -

CobotMagic

-
- +CobotMagic is a fixed-base dual-arm robot from AgileX Robotics. EmbodiChain's +default preset combines two 6-DOF arms with V100 parallel grippers. + +
+ CobotMagic with two V100 grippers, shown in an open-gripper display pose with both arm bases on the ground +
CobotMagic · V100 grippers · 14 independent control DOFs
+
+ +The image uses the registered `CobotMagic` preset, its default parallel arm +mounts and a display pose with open grippers. It is rendered with +`RenderCfg(renderer="rt")` (OfflineRT) and three soft area lights to reveal +the dark grippers and joint housings. The illustrated bases are at ground +level; task deployments configure their mounting height through `init_pos`. + +:::{dropdown} Image rendering settings +1600 × 1080; 1 sample per pixel; DLSS offscreen reconstruction (quality 2); +tone mapping off; exposure 1.0. The default ground and environment emission +are supplemented by neutral key, fill and rim rectangular lights. Exact +camera, lighting and joint settings are recorded in the +[render manifest](../../_static/robots/cobotmagic_render.json). +::: ## Key Features @@ -27,7 +41,7 @@ CobotMagic is a versatile dual-arm collaborative robot developed by AgileX Robot | Independent control DOF | 14 (six arm joints and one gripper command per side) | | Gripper models | V70 / V100 | | Layout types | NORMAL (standard) / FACE_TO_FACE / CUSTOM | -| Initial base height | 0.7775m (adjustable) | +| Example mounting height | 0.7775 m in the reusable CobotMagic embodiment; adjustable through `init_pos` | | Mobile base support | **Not supported** in the current version (fixed base only) | > **Note:** The current version of CobotMagic does **not** support a mobile base. All examples and environments assume a fixed base configuration. diff --git a/docs/source/resources/robot/ur_robot.md b/docs/source/resources/robot/ur_robot.md index e3cda364a..30bc28299 100644 --- a/docs/source/resources/robot/ur_robot.md +++ b/docs/source/resources/robot/ur_robot.md @@ -3,8 +3,7 @@ `URRobotCfg` covers six Universal Robots manipulators in one configuration class: `ur3`, `ur3e`, `ur5`, `ur5e`, `ur10`, and `ur10e`. The images below show the exact variants currently documented in EmbodiChain: the compact UR3 pair, the mid-reach -UR5 pair, and the long-reach UR10 pair, with darker classic models and brighter -silver-arm e-series renders. +UR5 pair, and the long-reach UR10 pair, using their versioned asset materials.
@@ -33,11 +32,16 @@ silver-arm e-series renders.
+Images use `RenderCfg(renderer="rt")` (OfflineRT), default lighting and a common +display pose. The V4 asset bundle corrects the UR3/UR3e material colors while +preserving geometry and kinematics. Camera and rendering settings are recorded +in the [render manifest](../../_static/robots/ur/render_manifest.json). + ## Key Features - **One config, six UR variants** selected through `robot_type`. - **Image-matched family lineup** from the shortest-reach UR3 pair to the longest-reach UR10 pair. -- **Classic and e-series styling** with darker legacy arms and brighter silver-arm e-series renders. +- **Distinct link and joint materials** with silver links, grey housings and blue joint covers. - **Analytic UR inverse kinematics** through `URSolverCfg` and the Warp-based UR solver path. - **Simulation-ready defaults** for URDF selection, control parts, drive properties, and rigid-body attributes. @@ -46,8 +50,8 @@ silver-arm e-series renders. - **UR3 / UR3e** are the most compact renders in the set and keep the wrist close to the base. - **UR5 / UR5e** extend the shoulder-to-wrist span while keeping the same 6-axis arm layout. - **UR10 / UR10e** show the longest upper-arm and forearm links, matching the largest reach tier in the family. -- **Classic models (`ur3`, `ur5`, `ur10`)** appear darker overall, especially on the arm links. -- **e-series models (`ur3e`, `ur5e`, `ur10e`)** use brighter silver links and lighter joint accents in these renders. +- **UR3 / UR3e materials** use the corrected V4 palette, removing the legacy + darkening of the silver links and blue joint covers. ## Usage diff --git a/embodichain/data/assets/robot_assets.py b/embodichain/data/assets/robot_assets.py index 635f6ed03..9319e464f 100644 --- a/embodichain/data/assets/robot_assets.py +++ b/embodichain/data/assets/robot_assets.py @@ -278,6 +278,9 @@ def __init__(self, data_root: str = None): class UniversalRobots(EmbodiChainDataset): """Dataset class for the Universal Robots. + V4 corrects the legacy UR3/UR3e material palette without changing robot + geometry, collision meshes, kinematics or inertial properties. + Reference: https://www.universal-robots.com/products/ur-series/ @@ -304,13 +307,19 @@ class UniversalRobots(EmbodiChainDataset): """ def __init__(self, data_root: str = None): + filename = f"{robot_assets}/UniversalRobots_v4.zip" + hub_prefix = ( + "https://huggingface.co/datasets/DexForceAI/embodichain_data/resolve/main/" + ) + urls = [f"{EMBODICHAIN_DOWNLOAD_PREFIX}{filename}"] + if EMBODICHAIN_DOWNLOAD_PREFIX != hub_prefix: + urls.append(f"{hub_prefix}{filename}") data_descriptor = o3d.data.DataDescriptor( - os.path.join( - EMBODICHAIN_DOWNLOAD_PREFIX, robot_assets, "UniversalRobots_v3.zip" - ), - "08af8f2d80f1c3c4280e9747082a5a2b", + urls, "a92eda28a1d2f9034252cdb2936ceffc" ) - prefix = type(self).__name__ + # Assembly signatures include URDF paths, not referenced mesh contents. + # A versioned source directory also invalidates old assembled materials. + prefix = f"{type(self).__name__}V4" path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root super().__init__(prefix, data_descriptor, path) diff --git a/tests/data/test_download_prefix.py b/tests/data/test_download_prefix.py index 11422e10a..d8c6e0dd0 100644 --- a/tests/data/test_download_prefix.py +++ b/tests/data/test_download_prefix.py @@ -36,7 +36,7 @@ _COLLECT_URLS = """ import json from embodichain.data import dataset -from embodichain.data.assets import CobotMagicArm, UnitreeGo2Locomotion +from embodichain.data.assets import CobotMagicArm, UnitreeGo2Locomotion, UniversalRobots urls = {} @@ -48,7 +48,7 @@ def capture(self, prefix, descriptor, path): raise Captured # stop before anything is downloaded dataset.EmbodiChainDataset.__init__ = capture -for cls in (CobotMagicArm, UnitreeGo2Locomotion): +for cls in (CobotMagicArm, UnitreeGo2Locomotion, UniversalRobots): try: cls() except Captured: @@ -112,11 +112,19 @@ def test_assets_download_from_the_configured_prefix(prefix: str) -> None: f"{MIRROR}robot_assets/UnitreeGo2Locomotion.zip", f"{HF_PREFIX}robot_assets/UnitreeGo2Locomotion.zip", ] + # The corrected UR3 palette is versioned independently of older downloads. + assert urls["UniversalRobotsV4"] == [ + f"{MIRROR}robot_assets/UniversalRobots_v4.zip", + f"{HF_PREFIX}robot_assets/UniversalRobots_v4.zip", + ] @pytest.mark.no_sim -def test_locomotion_does_not_repeat_the_hub_url() -> None: +def test_assets_do_not_repeat_the_hub_url() -> None: urls = _consumer_urls(HF_PREFIX) assert urls["UnitreeGo2Locomotion"] == [ f"{HF_PREFIX}robot_assets/UnitreeGo2Locomotion.zip" ] + assert urls["UniversalRobotsV4"] == [ + f"{HF_PREFIX}robot_assets/UniversalRobots_v4.zip" + ]