From e1421d10559c825e72bab0f3cbb517c333d67e16 Mon Sep 17 00:00:00 2001 From: motphys-developers Date: Thu, 2 Apr 2026 03:45:10 +0000 Subject: [PATCH] chore: release v0.3.0 --- .github/workflows/docker-build.yml | 8 +- .gitignore | 3 +- .prettierignore | 3 +- CLAUDE.md | 55 +- README.md | 18 +- README.zh-CN.md | 18 +- .../_static/images/poster/dm_lqr_2_1.jpg | 3 + .../_static/images/poster/dm_lqr_6_2.jpg | 3 + .../images/poster/dm_quadruped_escape.png | 3 + .../images/poster/dm_quadruped_fetch.png | 3 + .../images/poster/dm_quadruped_run.png | 3 + .../images/poster/dm_quadruped_walk.png | 3 + .../_static/images/poster/point_mass.jpg | 3 + .../images/poster/rm65_open_cabinet.png | 3 + docs/source/_static/videos/dm_lqr_2_1.mp4 | 3 + docs/source/_static/videos/dm_lqr_6_2.mp4 | 3 + .../_static/videos/dm_quadruped_escape.mp4 | 3 + .../_static/videos/dm_quadruped_fetch.mp4 | 3 + .../_static/videos/dm_quadruped_run.mp4 | 3 + .../_static/videos/dm_quadruped_walk.mp4 | 3 + docs/source/_static/videos/point_mass.mp4 | 3 + .../_static/videos/rm65_open_cabinet.mp4 | 3 + docs/source/en/index.md | 34 +- docs/source/en/user_guide/demo/dm_lqr.md | 199 +++ .../en/user_guide/demo/dm_point_mass.md | 159 ++ .../source/en/user_guide/demo/dm_quadruped.md | 290 ++++ .../en/user_guide/demo/rm65_open_cabinet.md | 257 +++ .../getting_started/installation.md | 24 +- docs/source/en/user_guide/index.md | 4 + .../en/user_guide/tutorial/basic_frame.md | 13 +- .../tutorial/training_and_result.md | 58 +- .../tutorial/training_environment_config.md | 241 +-- docs/source/zh_CN/index.md | 34 +- docs/source/zh_CN/user_guide/demo/acrobot.md | 43 +- docs/source/zh_CN/user_guide/demo/dm_lqr.md | 199 +++ .../zh_CN/user_guide/demo/dm_point_mass.md | 159 ++ .../zh_CN/user_guide/demo/dm_quadruped.md | 290 ++++ .../user_guide/demo/locomotion_unitree_go1.md | 23 +- .../locomotion_unitree_go1_rough_terrain.md | 23 +- docs/source/zh_CN/user_guide/demo/pendulum.md | 28 +- .../user_guide/demo/rm65_open_cabinet.md | 258 +++ .../getting_started/installation.md | 3 + docs/source/zh_CN/user_guide/index.md | 4 + .../zh_CN/user_guide/tutorial/basic_frame.md | 15 +- .../tutorial/training_and_result.md | 45 +- .../tutorial/training_environment_config.md | 208 +-- motrix_envs/pyproject.toml | 4 +- motrix_envs/src/motrix_envs/basic/__init__.py | 3 + .../src/motrix_envs/basic/acrobot/cfg.py | 4 + .../src/motrix_envs/basic/finger/cfg.py | 2 +- .../src/motrix_envs/basic/finger/finger_np.py | 2 - .../motrix_envs/basic/humanoid/humanoid_np.py | 224 +-- .../src/motrix_envs/basic/lqr/__init__.py | 20 + motrix_envs/src/motrix_envs/basic/lqr/cfg.py | 73 + .../src/motrix_envs/basic/lqr/lqr_2_1.xml | 70 + .../src/motrix_envs/basic/lqr/lqr_6_2.xml | 100 ++ .../src/motrix_envs/basic/lqr/lqr_np.py | 162 ++ .../src/motrix_envs/basic/manipulator/cfg.py | 2 +- .../src/motrix_envs/basic/pendulum/cfg.py | 2 + .../motrix_envs/basic/point_mass/__init__.py | 16 + .../src/motrix_envs/basic/point_mass/cfg.py | 32 + .../basic/point_mass/point_mass.xml | 43 + .../basic/point_mass/point_mass_np.py | 174 ++ .../motrix_envs/basic/quadruped/__init__.py | 23 + .../assets/quadruped_escape_heightfield.png | 3 + .../src/motrix_envs/basic/quadruped/cfg.py | 149 ++ .../basic/quadruped/quadruped_base.xml | 327 ++++ .../basic/quadruped/quadruped_escape.xml | 272 +++ .../basic/quadruped/quadruped_fetch.xml | 274 ++++ .../basic/quadruped/quadruped_materials.xml | 21 + .../basic/quadruped/quadruped_np.py | 893 ++++++++++ .../basic/quadruped/quadruped_walk.xml | 269 +++ .../motrix_envs/basic/reacher/reacher_np.py | 5 +- .../locomotion/anymal_c/anymal_c_np.py | 8 +- .../src/motrix_envs/locomotion/go1/cfg.py | 4 + .../src/motrix_envs/locomotion/go1/walk_np.py | 9 +- .../locomotion/go1/walk_rough_terrain.py | 2 +- .../locomotion/go1/walk_stairs_terrain.py | 2 +- .../src/motrix_envs/locomotion/go2/walk_np.py | 2 +- .../src/motrix_envs/manipulation/__init__.py | 7 +- .../franka_lift_cube/xmls/mjx_panda.xml | 49 +- .../franka_lift_cube/xmls/mjx_scene.xml | 28 +- .../rm65_open_cabinet/__init__.py | 16 + .../manipulation/rm65_open_cabinet/cfg.py | 153 ++ .../rm65_open_cabinet/gripper_logic.py | 62 + .../rm65_open_cabinet/rm65_open_cabinet_np.py | 1132 +++++++++++++ .../rm65_open_cabinet/xmls/LICENSE | 176 ++ .../rm65_open_cabinet/xmls/assets/box.obj | 3 + .../rm65_open_cabinet/xmls/assets/cabinet.obj | 3 + .../xmls/assets/door_left.mtl | 13 + .../xmls/assets/door_left.obj | 3 + .../xmls/assets/door_left.obj.mtl | 9 + .../xmls/assets/door_left.stl | 3 + .../xmls/assets/door_left.wrl | 553 +++++++ .../xmls/assets/door_left_nob.obj | 3 + .../xmls/assets/door_left_nob.obj.mtl | 9 + .../xmls/assets/door_left_nob.stl | 3 + .../xmls/assets/door_left_nob.wrl | 331 ++++ .../xmls/assets/door_right.mtl | 13 + .../xmls/assets/door_right.obj | 3 + .../xmls/assets/door_right.obj.mtl | 9 + .../xmls/assets/door_right.stl | 3 + .../xmls/assets/door_right.wrl | 553 +++++++ .../xmls/assets/door_right_nob.obj | 3 + .../xmls/assets/door_right_nob.obj.mtl | 9 + .../xmls/assets/door_right_nob.stl | 3 + .../xmls/assets/door_right_nob.wrl | 331 ++++ .../rm65_open_cabinet/xmls/assets/drawer.mtl | 13 + .../rm65_open_cabinet/xmls/assets/drawer.obj | 3 + .../xmls/assets/drawer.obj.mtl | 9 + .../rm65_open_cabinet/xmls/assets/drawer.stl | 3 + .../rm65_open_cabinet/xmls/assets/drawer.wrl | 148 ++ .../assets/drawer_convexdecomposition.obj | 3 + .../assets/drawer_convexdecomposition.wrl | 92 ++ .../assets/drawer_convexdecomposition0.obj | 3 + .../assets/drawer_convexdecomposition1.obj | 3 + .../assets/drawer_convexdecomposition2.obj | 3 + .../assets/drawer_convexdecomposition3.obj | 3 + .../assets/drawer_convexdecomposition4.obj | 3 + .../assets/drawer_convexdecomposition5.obj | 3 + .../assets/drawer_convexdecomposition6.obj | 3 + .../xmls/assets/drawer_handle.obj | 3 + .../xmls/assets/drawer_handle.obj.mtl | 9 + .../xmls/assets/drawer_handle.stl | 3 + .../xmls/assets/drawer_handle.wrl | 1118 +++++++++++++ .../drawer_handle_convexdecomposition.obj | 3 + .../drawer_handle_convexdecomposition.wrl | 111 ++ .../assets/gripper/meshes/Left_1_Link.STL | 3 + .../assets/gripper/meshes/Left_2_Link.STL | 3 + .../gripper/meshes/Left_Support_Link.STL | 3 + .../assets/gripper/meshes/Right_1_Link.STL | 3 + .../assets/gripper/meshes/Right_2_Link.STL | 3 + .../gripper/meshes/Right_Support_Link.STL | 3 + .../xmls/assets/gripper/meshes/base_link.STL | 3 + .../xmls/assets/rm65/meshes/base_link.STL | 3 + .../xmls/assets/rm65/meshes/camera_link.STL | 3 + .../xmls/assets/rm65/meshes/camera_rolink.STL | 3 + .../xmls/assets/rm65/meshes/link_1.STL | 3 + .../xmls/assets/rm65/meshes/link_2.STL | 3 + .../xmls/assets/rm65/meshes/link_3.STL | 3 + .../xmls/assets/rm65/meshes/link_4.STL | 3 + .../xmls/assets/rm65/meshes/link_5.STL | 3 + .../xmls/assets/rm65/meshes/link_6.STL | 3 + .../rm65_open_cabinet/xmls/assets/sektion.mtl | 10 + .../rm65_open_cabinet/xmls/assets/sektion.obj | 3 + .../xmls/assets/sektion.obj.mtl | 9 + .../rm65_open_cabinet/xmls/assets/sektion.stl | 3 + .../rm65_open_cabinet/xmls/assets/sektion.wrl | 224 +++ .../assets/sektion_convexdecomposition.obj | 3 + .../assets/sektion_convexdecomposition.wrl | 99 ++ .../assets/sektion_convexdecomposition0.obj | 3 + .../assets/sektion_convexdecomposition1.obj | 3 + .../assets/sektion_convexdecomposition2.obj | 3 + .../assets/sektion_convexdecomposition3.obj | 3 + .../assets/sektion_convexdecomposition4.obj | 3 + .../assets/sektion_convexdecomposition5.obj | 3 + .../assets/sektion_convexdecomposition6.obj | 3 + .../xmls/assets/table_top.obj | 3 + .../xmls/assets/table_top.obj.mtl | 9 + .../xmls/assets/table_top.stl | 3 + .../xmls/assets/table_top.wrl | 44 + .../xmls/assets/wavefront/door_left.obj | 3 + .../xmls/assets/wavefront/door_left.wrl | 618 +++++++ .../xmls/assets/wavefront/door_left_nob.obj | 3 + .../xmls/assets/wavefront/door_left_nob.wrl | 378 +++++ .../xmls/assets/wavefront/door_right.obj | 3 + .../xmls/assets/wavefront/door_right.wrl | 618 +++++++ .../xmls/assets/wavefront/door_right_nob.obj | 3 + .../xmls/assets/wavefront/door_right_nob.wrl | 378 +++++ .../xmls/assets/wavefront/drawer.obj | 3 + .../xmls/assets/wavefront/drawer_handle.obj | 3 + .../xmls/assets/wavefront/drawer_handle.wrl | 1461 +++++++++++++++++ .../xmls/assets/wavefront/sektion.obj | 3 + .../xmls/assets/wavefront/sektion.wrl | 261 +++ .../xmls/assets/wavefront/table_top.obj | 3 + .../xmls/assets/wavefront/table_top.wrl | 67 + .../xmls/assets/wood_table_worn_alb_1k.png | 3 + .../xmls/assets/wood_table_worn_arm_1k.png | 3 + .../xmls/assets/wood_table_worn_nor_gl_1k.png | 3 + .../rm65_open_cabinet/xmls/mjx_rm65.xml | 165 ++ .../rm65_open_cabinet/xmls/scene.xml | 36 + .../xmls/sektion_cabinet_2.urdf | 561 +++++++ .../xmls/sektion_cabinet_2.xml | 197 +++ .../shadow_hand/shadow_hand_np.py | 8 +- .../src/motrix_envs/math/quaternion.py | 20 +- motrix_envs/src/motrix_envs/np/env.py | 1 + motrix_rl/pyproject.toml | 10 +- motrix_rl/src/motrix_rl/__init__.py | 8 +- motrix_rl/src/motrix_rl/base.py | 42 - motrix_rl/src/motrix_rl/cfgs.py | 553 ------- motrix_rl/src/motrix_rl/registry.py | 48 +- motrix_rl/src/motrix_rl/rslrl/__init__.py | 40 + motrix_rl/src/motrix_rl/rslrl/cfg.py | 122 ++ .../src/motrix_rl/rslrl/torch/__init__.py | 20 + .../motrix_rl/rslrl/torch/train/__init__.py | 20 + .../src/motrix_rl/rslrl/torch/train/ppo.py | 172 ++ .../src/motrix_rl/rslrl/torch/wrap_vec_env.py | 168 ++ motrix_rl/src/motrix_rl/skrl/__init__.py | 28 +- motrix_rl/src/motrix_rl/skrl/cfg.py | 73 - motrix_rl/src/motrix_rl/skrl/config.py | 466 ++++++ motrix_rl/src/motrix_rl/skrl/jax/train/ppo.py | 209 ++- .../src/motrix_rl/skrl/torch/train/ppo.py | 366 +++-- motrix_rl/src/motrix_rl/tasks/__init__.py | 38 + motrix_rl/src/motrix_rl/tasks/acrobot.py | 123 ++ .../src/motrix_rl/tasks/anymal_navigation.py | 95 ++ motrix_rl/src/motrix_rl/tasks/bounce_ball.py | 66 + motrix_rl/src/motrix_rl/tasks/cartpole.py | 189 +++ motrix_rl/src/motrix_rl/tasks/dm_cheetah.py | 65 + motrix_rl/src/motrix_rl/tasks/dm_finger.py | 120 ++ motrix_rl/src/motrix_rl/tasks/dm_hopper.py | 117 ++ motrix_rl/src/motrix_rl/tasks/dm_humanoid.py | 98 ++ motrix_rl/src/motrix_rl/tasks/dm_lqr.py | 182 ++ .../src/motrix_rl/tasks/dm_manipulator.py | 94 ++ motrix_rl/src/motrix_rl/tasks/dm_quadruped.py | 94 ++ motrix_rl/src/motrix_rl/tasks/dm_reacher.py | 90 + motrix_rl/src/motrix_rl/tasks/dm_walker.py | 171 ++ .../src/motrix_rl/tasks/franka_lift_cube.py | 103 ++ .../motrix_rl/tasks/franka_open_cabinet.py | 77 + motrix_rl/src/motrix_rl/tasks/go1.py | 125 ++ motrix_rl/src/motrix_rl/tasks/go2.py | 74 + motrix_rl/src/motrix_rl/tasks/pendulum.py | 69 + motrix_rl/src/motrix_rl/tasks/point_mass.py | 82 + .../src/motrix_rl/tasks/rm65_open_cabinet.py | 74 + .../src/motrix_rl/tasks/shadow_hand_repose.py | 110 ++ motrix_rl/src/motrix_rl/utils.py | 149 ++ motrix_rl/template/rslrl_config.yaml | 85 + motrix_rl/template/skrl_config.yaml | 75 + motrix_rl/tests/test_utils.py | 158 ++ pyproject.toml | 4 +- scripts/play.py | 150 +- scripts/train.py | 63 +- uv.lock | 714 ++++---- 232 files changed, 20258 insertions(+), 2004 deletions(-) create mode 100644 docs/source/_static/images/poster/dm_lqr_2_1.jpg create mode 100644 docs/source/_static/images/poster/dm_lqr_6_2.jpg create mode 100644 docs/source/_static/images/poster/dm_quadruped_escape.png create mode 100644 docs/source/_static/images/poster/dm_quadruped_fetch.png create mode 100644 docs/source/_static/images/poster/dm_quadruped_run.png create mode 100644 docs/source/_static/images/poster/dm_quadruped_walk.png create mode 100644 docs/source/_static/images/poster/point_mass.jpg create mode 100644 docs/source/_static/images/poster/rm65_open_cabinet.png create mode 100644 docs/source/_static/videos/dm_lqr_2_1.mp4 create mode 100644 docs/source/_static/videos/dm_lqr_6_2.mp4 create mode 100644 docs/source/_static/videos/dm_quadruped_escape.mp4 create mode 100644 docs/source/_static/videos/dm_quadruped_fetch.mp4 create mode 100644 docs/source/_static/videos/dm_quadruped_run.mp4 create mode 100644 docs/source/_static/videos/dm_quadruped_walk.mp4 create mode 100644 docs/source/_static/videos/point_mass.mp4 create mode 100644 docs/source/_static/videos/rm65_open_cabinet.mp4 create mode 100644 docs/source/en/user_guide/demo/dm_lqr.md create mode 100644 docs/source/en/user_guide/demo/dm_point_mass.md create mode 100644 docs/source/en/user_guide/demo/dm_quadruped.md create mode 100644 docs/source/en/user_guide/demo/rm65_open_cabinet.md create mode 100644 docs/source/zh_CN/user_guide/demo/dm_lqr.md create mode 100644 docs/source/zh_CN/user_guide/demo/dm_point_mass.md create mode 100644 docs/source/zh_CN/user_guide/demo/dm_quadruped.md create mode 100644 docs/source/zh_CN/user_guide/demo/rm65_open_cabinet.md create mode 100644 motrix_envs/src/motrix_envs/basic/lqr/__init__.py create mode 100644 motrix_envs/src/motrix_envs/basic/lqr/cfg.py create mode 100644 motrix_envs/src/motrix_envs/basic/lqr/lqr_2_1.xml create mode 100644 motrix_envs/src/motrix_envs/basic/lqr/lqr_6_2.xml create mode 100644 motrix_envs/src/motrix_envs/basic/lqr/lqr_np.py create mode 100644 motrix_envs/src/motrix_envs/basic/point_mass/__init__.py create mode 100644 motrix_envs/src/motrix_envs/basic/point_mass/cfg.py create mode 100644 motrix_envs/src/motrix_envs/basic/point_mass/point_mass.xml create mode 100644 motrix_envs/src/motrix_envs/basic/point_mass/point_mass_np.py create mode 100644 motrix_envs/src/motrix_envs/basic/quadruped/__init__.py create mode 100644 motrix_envs/src/motrix_envs/basic/quadruped/assets/quadruped_escape_heightfield.png create mode 100644 motrix_envs/src/motrix_envs/basic/quadruped/cfg.py create mode 100644 motrix_envs/src/motrix_envs/basic/quadruped/quadruped_base.xml create mode 100644 motrix_envs/src/motrix_envs/basic/quadruped/quadruped_escape.xml create mode 100644 motrix_envs/src/motrix_envs/basic/quadruped/quadruped_fetch.xml create mode 100644 motrix_envs/src/motrix_envs/basic/quadruped/quadruped_materials.xml create mode 100644 motrix_envs/src/motrix_envs/basic/quadruped/quadruped_np.py create mode 100644 motrix_envs/src/motrix_envs/basic/quadruped/quadruped_walk.xml create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/__init__.py create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/cfg.py create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/gripper_logic.py create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/rm65_open_cabinet_np.py create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/LICENSE create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/box.obj create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/cabinet.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.mtl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.obj.mtl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.stl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.obj.mtl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.stl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.mtl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.obj.mtl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.stl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.obj.mtl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.stl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.mtl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.obj.mtl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.stl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition0.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition1.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition2.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition3.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition4.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition5.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition6.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.obj.mtl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.stl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle_convexdecomposition.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle_convexdecomposition.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Left_1_Link.STL create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Left_2_Link.STL create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Left_Support_Link.STL create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Right_1_Link.STL create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Right_2_Link.STL create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Right_Support_Link.STL create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/base_link.STL create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/base_link.STL create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/camera_link.STL create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/camera_rolink.STL create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_1.STL create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_2.STL create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_3.STL create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_4.STL create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_5.STL create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_6.STL create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.mtl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.obj.mtl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.stl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition0.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition1.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition2.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition3.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition4.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition5.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition6.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.obj.mtl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.stl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left_nob.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left_nob.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right_nob.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right_nob.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/drawer.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/drawer_handle.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/drawer_handle.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/sektion.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/sektion.wrl create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/table_top.obj create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/table_top.wrl create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wood_table_worn_alb_1k.png create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wood_table_worn_arm_1k.png create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wood_table_worn_nor_gl_1k.png create mode 100644 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/mjx_rm65.xml create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/scene.xml create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/sektion_cabinet_2.urdf create mode 100755 motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/sektion_cabinet_2.xml delete mode 100644 motrix_rl/src/motrix_rl/base.py delete mode 100644 motrix_rl/src/motrix_rl/cfgs.py create mode 100644 motrix_rl/src/motrix_rl/rslrl/__init__.py create mode 100644 motrix_rl/src/motrix_rl/rslrl/cfg.py create mode 100644 motrix_rl/src/motrix_rl/rslrl/torch/__init__.py create mode 100644 motrix_rl/src/motrix_rl/rslrl/torch/train/__init__.py create mode 100644 motrix_rl/src/motrix_rl/rslrl/torch/train/ppo.py create mode 100644 motrix_rl/src/motrix_rl/rslrl/torch/wrap_vec_env.py delete mode 100644 motrix_rl/src/motrix_rl/skrl/cfg.py create mode 100644 motrix_rl/src/motrix_rl/skrl/config.py create mode 100644 motrix_rl/src/motrix_rl/tasks/__init__.py create mode 100644 motrix_rl/src/motrix_rl/tasks/acrobot.py create mode 100644 motrix_rl/src/motrix_rl/tasks/anymal_navigation.py create mode 100644 motrix_rl/src/motrix_rl/tasks/bounce_ball.py create mode 100644 motrix_rl/src/motrix_rl/tasks/cartpole.py create mode 100644 motrix_rl/src/motrix_rl/tasks/dm_cheetah.py create mode 100644 motrix_rl/src/motrix_rl/tasks/dm_finger.py create mode 100644 motrix_rl/src/motrix_rl/tasks/dm_hopper.py create mode 100644 motrix_rl/src/motrix_rl/tasks/dm_humanoid.py create mode 100644 motrix_rl/src/motrix_rl/tasks/dm_lqr.py create mode 100644 motrix_rl/src/motrix_rl/tasks/dm_manipulator.py create mode 100644 motrix_rl/src/motrix_rl/tasks/dm_quadruped.py create mode 100644 motrix_rl/src/motrix_rl/tasks/dm_reacher.py create mode 100644 motrix_rl/src/motrix_rl/tasks/dm_walker.py create mode 100644 motrix_rl/src/motrix_rl/tasks/franka_lift_cube.py create mode 100644 motrix_rl/src/motrix_rl/tasks/franka_open_cabinet.py create mode 100644 motrix_rl/src/motrix_rl/tasks/go1.py create mode 100644 motrix_rl/src/motrix_rl/tasks/go2.py create mode 100644 motrix_rl/src/motrix_rl/tasks/pendulum.py create mode 100644 motrix_rl/src/motrix_rl/tasks/point_mass.py create mode 100644 motrix_rl/src/motrix_rl/tasks/rm65_open_cabinet.py create mode 100644 motrix_rl/src/motrix_rl/tasks/shadow_hand_repose.py create mode 100644 motrix_rl/template/rslrl_config.yaml create mode 100644 motrix_rl/template/skrl_config.yaml create mode 100644 motrix_rl/tests/test_utils.py diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 7026df3..c770883 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -21,17 +21,17 @@ jobs: run: | echo "Removing hosted toolcache..." sudo rm -rf /opt/hostedtoolcache || true - + echo "Removing .NET..." sudo rm -rf /usr/share/dotnet || true - + echo "Removing Android SDK..." sudo rm -rf /usr/local/lib/android || true - + echo "Removing GHC / Haskell..." sudo rm -rf /opt/ghc || true sudo rm -rf /usr/local/.ghcup || true - + echo "Docker prune (just in case runner had leftovers)..." sudo docker container prune -f || true sudo docker image prune -af || true diff --git a/.gitignore b/.gitignore index 015a406..e469c81 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ logs node_modules docs/build docs/source/user_guide -docs/source/index.md \ No newline at end of file +docs/source/index.md +.worktrees diff --git a/.prettierignore b/.prettierignore index e125a8c..db46dcb 100644 --- a/.prettierignore +++ b/.prettierignore @@ -7,4 +7,5 @@ node_modules .venv .gitlab-ci.yml docs/build/ -.readthedocs.yaml \ No newline at end of file +.readthedocs.yaml +CLAUDE.md \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md index aa0db05..e8fb65e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Project Overview -MotrixLab is a reinforcement learning framework built on top of MotrixSim simulation backend. It provides a unified interface for training RL agents using multiple simulation backends (MotrixSim) and primarily integrates with the SKRL library. The framework is designed for robotics simulation and supports various environments including basic cartpole, locomotion tasks, and manipulation tasks. +MotrixLab is a reinforcement learning framework built on top of MotrixSim simulation backend. It provides a unified interface for training RL agents using multiple simulation backends (MotrixSim) and integrates with SKRL and RSLRL libraries. The framework is designed for robotics simulation and supports various environments including basic cartpole, locomotion tasks, and manipulation tasks. ## Development Setup @@ -21,13 +21,18 @@ For SKRL framework with specific backend: ```bash uv sync --all-packages --extra skrl-jax # JAX backend uv sync --all-packages --extra skrl-torch # PyTorch backend + +``` + +For rslrl frame: + +```bash +uv sync --all-packages --extra rslrl ``` **Available dependency groups in MotrixLab:** -- `skrl-jax`: SKRL RL framework with JAX backend -- `skrl-torch`: SKRL RL framework with PyTorch backend -- `test`: Test dependencies (pytest) +see `pyproject.toml` **Note**: This is a workspace project with two main packages: `motrix_envs` (simulation environments) and `motrix_rl` (RL framework integration). @@ -35,10 +40,16 @@ uv sync --all-packages --extra skrl-torch # PyTorch backend ### Training +Train with SKRL (default): ```bash uv run scripts/train.py --env cartpole ``` +Train with RSLRL: +```bash +uv run scripts/train.py --env cartpole --rllib rslrl +``` + ### Environment Visualization View environment without training: @@ -84,13 +95,11 @@ uv run pytest ### Core Components 1. **Workspace Structure**: - - `motrix_envs/`: Simulation environment definitions using MotrixSim backend - `motrix_rl/`: RL framework integration (primarily SKRL) and training utilities 2. **Scripts** (`scripts/`): - - - `train.py`: Main training script with configurable environments and backends + - `train.py`: Main training script with configurable environments, frameworks, and backends (use `--rllib` to select) - `view.py`: Environment visualization without training - `play.py`: Policy evaluation and testing @@ -98,28 +107,28 @@ uv run pytest ### Key Architecture Points -- **Workspace Project**: Uses UV workspace with two packages sharing dependencies -- **MotrixSim Backend**: Built on MotrixSim simulation engine for physics simulation -- **SKRL Integration**: Primary RL framework supporting both JAX and PyTorch backends -- **Environment Naming**: Simple string-based environment identification (e.g., "cartpole") -- **Automatic Backend Selection**: Training script automatically selects JAX or PyTorch based on GPU availability -- **Multi-Backend Training**: Supports different simulation backends for the same environment +- **Workspace Project**: Uses UV workspace with two packages sharing dependencies +- **MotrixSim Backend**: Built on MotrixSim simulation engine for physics simulation +- **SKRL Integration**: RL framework supporting both JAX and PyTorch backends +- **RSLRL Integration**: RL framework supporting PyTorch backend (use `--rllib rslrl`) +- **Environment Naming**: Simple string-based environment identification (e.g., "cartpole") +- **Automatic Backend Selection**: For SKRL, training script automatically selects JAX or PyTorch based on GPU availability; RSLRL uses PyTorch only +- **Multi-Backend Training**: Supports different simulation backends for the same environment ### Environment Usage Pattern -```python -# Environment creation handled internally by scripts -# Use string names to specify environments -uv run scripts/train.py --env cartpole -``` - ## Results Storage Training results are saved to `runs/{env-name}/` directory structure with checkpoints and tensorboard logs. ## Important Notes -- **Python Version**: Requires exactly Python 3.10.\* -- **GPU Support**: Includes CUDA support for both JAX and PyTorch backends -- **Private PyPI**: Uses internal PyPI server for MotrixSim packages -- **No Manual Tests**: No test files found in the repository structure +- **Python Version**: Requires exactly Python 3.10.\* +- **GPU Support**: Includes CUDA support for both JAX and PyTorch backends +- **Private PyPI**: Uses internal PyPI server for MotrixSim packages +- **No Manual Tests**: No test files found in the repository structure + +### RSLRL Configuration + +- **Field Correspondence**: When modifying `RslrlRunnerCfg` in `motrix_rl/rslrl/cfg.py`, ensure fields match `template/rslrl_config.yaml` exactly - no extra or missing fields. This is critical for proper configuration serialization and deserialization. +- **Reference Template**: Use `template/rslrl_config.yaml` as the source of truth for valid runner configuration fields diff --git a/README.md b/README.md index c13267e..445a52c 100644 --- a/README.md +++ b/README.md @@ -12,14 +12,14 @@ The project is divided into two core components: - **motrix_envs**: Various RL simulation environments built on MotrixSim, defining observation, action, and reward. Framework-agnostic and currently supports MotrixSim's CPU backend -- **motrix_rl**: Integrates RL frameworks and uses various environment parameters from motrix_envs for training. Currently supports SKRL framework's PPO algorithm +- **motrix_rl**: Integrates RL frameworks and uses various environment parameters from motrix_envs for training. Currently supports SKRL framework (JAX/PyTorch) and RSLRL framework (PyTorch) PPO algorithms > Documentation: https://motrixlab.readthedocs.io ## Key Features - **Unified Interface**: Provides a concise and unified reinforcement learning training and evaluation interface -- **Multi-backend Support**: Supports JAX and PyTorch training backends, with flexible selection based on hardware environment +- **Multi-framework Support**: Supports SKRL (JAX/PyTorch) and RSLRL (PyTorch) training frameworks with flexible selection based on hardware environment - **Rich Environments**: Includes various robot simulation environments such as basic control, locomotion, and manipulation tasks - **High-performance Simulation**: Built on MotrixSim's high-performance physics simulation engine - **Visual Training**: Supports real-time rendering and training process visualization @@ -62,6 +62,12 @@ Install PyTorch as training backend: uv sync --all-packages --extra skrl-torch ``` +Install RSLRL framework (PyTorch backend only): + +```bash +uv sync --all-packages --extra rslrl +``` + ## 🎯 Usage Guide ### Environment Visualization @@ -74,10 +80,18 @@ uv run scripts/view.py --env cartpole ### Model Training +Train with SKRL framework (default): + ```bash uv run scripts/train.py --env cartpole ``` +Train with RSLRL framework: + +```bash +uv run scripts/train.py --env cartpole --rllib rslrl +``` + Training results are saved in the `runs/{env-name}/` directory. View training data through TensorBoard: diff --git a/README.zh-CN.md b/README.zh-CN.md index 7b51b92..cb1268e 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -12,14 +12,14 @@ 该项目分为两个核心部分: - **motrix_envs**: 基于 MotrixSim 构建的各种 RL 仿真环境,定义了 observation、action、reward。与具体的 RL 框架无关,目前支持 MotrixSim 的 CPU 后端 -- **motrix_rl**: 集成 RL 框架,并使用 motrix_envs 里的各种环境参数进行训练。目前支持 SKRL 框架的 PPO 算法 +- **motrix_rl**: 集成 RL 框架,并使用 motrix_envs 里的各种环境参数进行训练。目前支持 SKRL 框架(JAX/PyTorch)和 RSLRL 框架(PyTorch)的 PPO 算法 > 文档地址:https://motrixlab.readthedocs.io ## 主要特性 - **统一接口**: 提供简洁统一的强化学习训练和评估接口 -- **多后端支持**: 支持 JAX 和 PyTorch 训练后端,可根据硬件环境灵活选择 +- **多框架支持**: 支持 SKRL (JAX/PyTorch) 和 RSLRL (PyTorch) 训练框架,可根据硬件环境灵活选择 - **丰富环境**: 包含基础控制、运动、操作等多种机器人仿真环境 - **高性能仿真**: 基于 MotrixSim 的高性能物理仿真引擎 - **可视化训练**: 支持实时渲染和训练过程可视化 @@ -62,6 +62,12 @@ uv sync --all-packages --extra skrl-jax uv sync --all-packages --extra skrl-torch ``` +安装 RSLRL 框架(仅支持 PyTorch 后端): + +```bash +uv sync --all-packages --extra rslrl +``` + ## 🎯 使用指南 ### 环境可视化 @@ -74,10 +80,18 @@ uv run scripts/view.py --env cartpole ### 训练模型 +使用 SKRL 框架训练(默认): + ```bash uv run scripts/train.py --env cartpole ``` +使用 RSLRL 框架训练: + +```bash +uv run scripts/train.py --env cartpole --rllib rslrl +``` + 训练结果会保存在 `runs/{env-name}/` 目录下。 通过 TensorBoard 查看训练数据: diff --git a/docs/source/_static/images/poster/dm_lqr_2_1.jpg b/docs/source/_static/images/poster/dm_lqr_2_1.jpg new file mode 100644 index 0000000..4833590 --- /dev/null +++ b/docs/source/_static/images/poster/dm_lqr_2_1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48e8e5cecf80a0b8c640a70d51c64ef8416e4c46b1ac66e7594f30819fbf71d7 +size 2525404 diff --git a/docs/source/_static/images/poster/dm_lqr_6_2.jpg b/docs/source/_static/images/poster/dm_lqr_6_2.jpg new file mode 100644 index 0000000..ef0ca57 --- /dev/null +++ b/docs/source/_static/images/poster/dm_lqr_6_2.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e68b01048e54591da250d636cb7b8be1d5bb6cf8bebb3509484bf2ee4c61d386 +size 212340 diff --git a/docs/source/_static/images/poster/dm_quadruped_escape.png b/docs/source/_static/images/poster/dm_quadruped_escape.png new file mode 100644 index 0000000..0f28ef9 --- /dev/null +++ b/docs/source/_static/images/poster/dm_quadruped_escape.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0e769091ae74cf540c68dd531200f776553f09f0a15eaa51d349216e5053ec2 +size 2288132 diff --git a/docs/source/_static/images/poster/dm_quadruped_fetch.png b/docs/source/_static/images/poster/dm_quadruped_fetch.png new file mode 100644 index 0000000..7205b98 --- /dev/null +++ b/docs/source/_static/images/poster/dm_quadruped_fetch.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06cbce23b71c6d8ec00e67e41c57e83e75b47ac9330998c03fa6734da49a848d +size 1788861 diff --git a/docs/source/_static/images/poster/dm_quadruped_run.png b/docs/source/_static/images/poster/dm_quadruped_run.png new file mode 100644 index 0000000..0c23632 --- /dev/null +++ b/docs/source/_static/images/poster/dm_quadruped_run.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43e3894b9dc3a286e9983a2f4786cf47caaf4fbbf00bfb75ea61661d47b92258 +size 2066473 diff --git a/docs/source/_static/images/poster/dm_quadruped_walk.png b/docs/source/_static/images/poster/dm_quadruped_walk.png new file mode 100644 index 0000000..67a79f9 --- /dev/null +++ b/docs/source/_static/images/poster/dm_quadruped_walk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9de7df58544554f1a7b4c523490e52e016e4057794ac27112b28ebaef704534e +size 2678511 diff --git a/docs/source/_static/images/poster/point_mass.jpg b/docs/source/_static/images/poster/point_mass.jpg new file mode 100644 index 0000000..ec937c0 --- /dev/null +++ b/docs/source/_static/images/poster/point_mass.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c306cf5e29c1380b808ecb327d34fc68fead362695b241632b4858f893ab4de +size 777697 diff --git a/docs/source/_static/images/poster/rm65_open_cabinet.png b/docs/source/_static/images/poster/rm65_open_cabinet.png new file mode 100644 index 0000000..eb2a297 --- /dev/null +++ b/docs/source/_static/images/poster/rm65_open_cabinet.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe0d085abcf2e8acc9c17ac5bd9ae4019c8f625971633295d5ac78278c84cecd +size 2923711 diff --git a/docs/source/_static/videos/dm_lqr_2_1.mp4 b/docs/source/_static/videos/dm_lqr_2_1.mp4 new file mode 100644 index 0000000..70781c5 --- /dev/null +++ b/docs/source/_static/videos/dm_lqr_2_1.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8392355f75fef17266bb6b40169aa2fd868cd42a3649c63ab241008ab9993374 +size 519681 diff --git a/docs/source/_static/videos/dm_lqr_6_2.mp4 b/docs/source/_static/videos/dm_lqr_6_2.mp4 new file mode 100644 index 0000000..dd93e6f --- /dev/null +++ b/docs/source/_static/videos/dm_lqr_6_2.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8b679d72551575db86e836823416be9f9e7d06a44210dacb17803467676a1a4 +size 1377670 diff --git a/docs/source/_static/videos/dm_quadruped_escape.mp4 b/docs/source/_static/videos/dm_quadruped_escape.mp4 new file mode 100644 index 0000000..79b1498 --- /dev/null +++ b/docs/source/_static/videos/dm_quadruped_escape.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:078a36bafb869cef0244ef3e33b9eaa5c661d49eaa9d42a8534f711993ec2fd5 +size 1738757 diff --git a/docs/source/_static/videos/dm_quadruped_fetch.mp4 b/docs/source/_static/videos/dm_quadruped_fetch.mp4 new file mode 100644 index 0000000..65bbd9b --- /dev/null +++ b/docs/source/_static/videos/dm_quadruped_fetch.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b8b4097ccf1c2ac509baf2a29e37c1e288e966472cde220eae77fc47644c324 +size 508065 diff --git a/docs/source/_static/videos/dm_quadruped_run.mp4 b/docs/source/_static/videos/dm_quadruped_run.mp4 new file mode 100644 index 0000000..9fa653f --- /dev/null +++ b/docs/source/_static/videos/dm_quadruped_run.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29f418ee33792ecf4621a3d9b68341d6b0addfc5a248f5556bf6b310bfa4675c +size 3177164 diff --git a/docs/source/_static/videos/dm_quadruped_walk.mp4 b/docs/source/_static/videos/dm_quadruped_walk.mp4 new file mode 100644 index 0000000..4100514 --- /dev/null +++ b/docs/source/_static/videos/dm_quadruped_walk.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ecc0db612a958bcc20be30da04c131fe920818bd052eebeb3c8918551a28fe29 +size 11380668 diff --git a/docs/source/_static/videos/point_mass.mp4 b/docs/source/_static/videos/point_mass.mp4 new file mode 100644 index 0000000..29da910 --- /dev/null +++ b/docs/source/_static/videos/point_mass.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:388d28839dfa4792a9b8f5778cb7991ea00fd522990a77e6bf0b9e4b9c4580c8 +size 3663098 diff --git a/docs/source/_static/videos/rm65_open_cabinet.mp4 b/docs/source/_static/videos/rm65_open_cabinet.mp4 new file mode 100644 index 0000000..6fd9480 --- /dev/null +++ b/docs/source/_static/videos/rm65_open_cabinet.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:163f1c45d3cda32837e1f08dd403b96c8061ff1c38860e60421b7c5dd6c06222 +size 5637813 diff --git a/docs/source/en/index.md b/docs/source/en/index.md index 78618cf..0e65f60 100644 --- a/docs/source/en/index.md +++ b/docs/source/en/index.md @@ -7,8 +7,8 @@ MotrixLab is a general-purpose machine learning architecture designed for robot :::{grid-item-card} -```{video} _static/videos/cartpole.mp4 -:poster: _static/images/poster/cartpole.jpg +```{video} _static/videos/shadow_hand_repose.mp4 +:poster: _static/images/poster/shadow_hand_repose.jpg :nocontrols: :autoplay: :playsinline: @@ -147,8 +147,8 @@ MotrixLab is a general-purpose machine learning architecture designed for robot :::{grid-item-card} -```{video} _static/videos/dm_reacher.mp4 -:poster: _static/images/poster/dm_reacher.jpg +```{video} _static/videos/cartpole.mp4 +:poster: _static/images/poster/cartpole.jpg :nocontrols: :autoplay: :playsinline: @@ -185,6 +185,32 @@ MotrixLab is a general-purpose machine learning architecture designed for robot :width: 100% ``` +::: +:::{grid-item-card} + +```{video} _static/videos/dm_quadruped_fetch.mp4 +:poster: _static/images/poster/dm_quadruped_fetch.png +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +::: +:::{grid-item-card} + +```{video} _static/videos/dm_quadruped_run.mp4 +:poster: _static/images/poster/dm_quadruped_run.png +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + ::: :::: diff --git a/docs/source/en/user_guide/demo/dm_lqr.md b/docs/source/en/user_guide/demo/dm_lqr.md new file mode 100644 index 0000000..69f2a09 --- /dev/null +++ b/docs/source/en/user_guide/demo/dm_lqr.md @@ -0,0 +1,199 @@ +# Linear Quadratic Regulator + +LQR (Linear Quadratic Regulator) is a classic continuous control and stabilization task. This repository currently provides two variants: + +- `dm-lqr-2-1`: two masses connected by a rope, with only the last mass actuated +- `dm-lqr-6-2`: six masses connected as a chain, with only the last two masses actuated + +The goal is to drive the whole system back to the center and keep it near equilibrium with minimal control effort. + +```{video} /_static/videos/dm_lqr_2_1.mp4 +:poster: _static/images/poster/dm_lqr_2_1.jpg +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +```{video} /_static/videos/dm_lqr_6_2.mp4 +:poster: _static/images/poster/dm_lqr_6_2.jpg +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +--- + +## Task Description + +Both tasks can be viewed as one-dimensional spring-damper chain stabilization problems. Each mass has a single translational degree of freedom along the x-axis. Neighboring masses are coupled by rope-like spring forces, and the system is affected by: + +- body damping on each mass +- spring forces and relative damping between neighboring masses +- a center-restoring force pulling the system toward the origin +- control inputs applied only to the actuated terminal degrees of freedom + +In practice: + +- `dm-lqr-2-1` is the simpler version and is useful for verifying whether the policy can learn a stable equilibrium +- `dm-lqr-6-2` is more difficult because the controller must propagate its effect through a longer chain + +--- + +## Action Space + +### dm-lqr-2-1 + +| Item | Details | +| ------------- | ------------------------------- | +| **Type** | `Box(-1.0, 1.0, (1,), float32)` | +| **Dimension** | 1 | + +| Index | Action Description | Min | Max | XML Joint | +| ----- | -------------------------------------- | ---- | --- | --------- | +| 0 | Control input applied to the last mass | -1.0 | 1.0 | `q1` | + +### dm-lqr-6-2 + +| Item | Details | +| ------------- | ------------------------------- | +| **Type** | `Box(-1.0, 1.0, (2,), float32)` | +| **Dimension** | 2 | + +| Index | Action Description | Min | Max | XML Joint | +| ----- | --------------------------------------------- | ---- | --- | --------- | +| 0 | Control input applied to the second-last mass | -1.0 | 1.0 | `q4` | +| 1 | Control input applied to the last mass | -1.0 | 1.0 | `q5` | + +--- + +## Observation Space + +The observation is formed by concatenating all positions `qpos` and velocities `qvel`. + +### dm-lqr-2-1 + +| Item | Details | +| ------------- | ------------------------------- | +| **Type** | `Box(-inf, inf, (4,), float32)` | +| **Dimension** | 4 | + +| Index | Observation | Meaning | +| ----- | ----------- | --------------------------- | +| 0 | `q0` | Position of the first mass | +| 1 | `q1` | Position of the second mass | +| 2 | `dq0` | Velocity of the first mass | +| 3 | `dq1` | Velocity of the second mass | + +### dm-lqr-6-2 + +| Item | Details | +| ------------- | -------------------------------- | +| **Type** | `Box(-inf, inf, (12,), float32)` | +| **Dimension** | 12 | + +The first 6 dimensions are `q0 ~ q5`, and the last 6 dimensions are `dq0 ~ dq5`. + +--- + +## Reward Function Design + +The current reward is composed of state cost, velocity cost, control cost, success bonus, and out-of-bounds penalty: + +```python +state_cost = 0.5 * sum(qpos ** 2) +velocity_cost = 0.5 * velocity_cost_coef * sum(qvel ** 2) +control_cost = 0.5 * control_cost_coef * sum(action ** 2) + +reward = 1.0 - (state_cost + velocity_cost + control_cost) +reward += success_bonus +reward -= out_of_bounds_penalty +``` + +Intuitively: + +- the farther the system is from the origin, the lower the reward +- larger velocities reduce the reward +- aggressive control inputs reduce the reward +- entering a small stable region around the origin yields a success bonus +- leaving the valid state boundary triggers an additional penalty + +--- + +## Initial State + +At reset: + +- the position vector is sampled in a random direction and normalized to a fixed norm +- all initial velocities are set to zero + +With the current configuration: + +- `dm-lqr-2-1` starts with position norm around `0.8` +- `dm-lqr-6-2` starts with position norm around `1.0` + +--- + +## Episode Termination Conditions + +An episode terminates and resets when any of the following conditions is met: + +- success condition is reached: + the position norm is below the success distance threshold and the velocity norm is below the success velocity threshold +- out-of-bounds condition is reached: + any position exceeds the position boundary or any velocity exceeds the velocity boundary +- the full state is sufficiently close to zero +- `NaN` appears in the observation or action + +--- + +## Usage Guide + +### 1. Environment Preview + +```bash +uv run scripts/view.py --env dm-lqr-2-1 +uv run scripts/view.py --env dm-lqr-6-2 +``` + +### 2. Start Training + +```bash +uv run scripts/train.py --env dm-lqr-2-1 +uv run scripts/train.py --env dm-lqr-6-2 +``` + +### 3. View Training Progress + +```bash +uv run tensorboard --logdir runs/dm-lqr-2-1 +uv run tensorboard --logdir runs/dm-lqr-6-2 +``` + +### 4. Test Training Results + +```bash +uv run scripts/play.py --env dm-lqr-2-1 +uv run scripts/play.py --env dm-lqr-6-2 +``` + +--- + +## Expected Training Results + +### dm-lqr-2-1 + +1. The actuated mass pulls the unactuated mass back toward the center. +2. Both positions and velocities converge to a small neighborhood of zero. +3. The learned policy does not settle at a biased off-center equilibrium. + +### dm-lqr-6-2 + +1. The last two actuated masses gradually pull the entire chain back toward the center. +2. The chain remains stable without obvious divergence or persistent oscillation. +3. Success rate increases during training while the out-of-bounds rate decreases. diff --git a/docs/source/en/user_guide/demo/dm_point_mass.md b/docs/source/en/user_guide/demo/dm_point_mass.md new file mode 100644 index 0000000..16331d2 --- /dev/null +++ b/docs/source/en/user_guide/demo/dm_point_mass.md @@ -0,0 +1,159 @@ +# Point Mass Environment + +The Point Mass environment is a simple yet fundamental 2D navigation task where an agent controls a point mass to reach a target position. This environment serves as an excellent introduction to reinforcement learning concepts and continuous action spaces. + +```{video} /_static/videos/point_mass.mp4 +:poster: _static/images/poster/point_mass.jpg +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +## Task Description + +The Point Mass environment is a 2D navigation task. The agent needs to control a point mass by applying forces to move it to a randomly generated target position. This task requires the agent to learn efficient navigation strategies to reach the target with minimal control cost. + +--- + +## Action Space (Action Space) + +| Item | Details | +| ------------- | ------------------------------- | +| **Type** | `Box(-1.0, 1.0, (2,), float32)` | +| **Dimension** | 2 | + +Actions correspond to: + +| Index | Action Meaning (Applied Force) | Min | Max | XML Name | +| ----: | ------------------------------ | :-: | :-: | :-------: | +| 0 | x-direction force | -1 | 1 | `x_force` | +| 1 | y-direction force | -1 | 1 | `y_force` | + +--- + +## Observation Space + +| Item | Details | +| ------------- | ------------------------------- | +| **Type** | `Box(-inf, inf, (9,), float32)` | +| **Dimension** | 9 | + +The observation space of the Point Mass environment consists of the following components (in order): + +| Component | Description | Dimension | Notes | +| ------------ | ---------------------------- | --------- | ----- | +| **Position** | Point mass x, y coordinates | 2 | | +| **Velocity** | Point mass x, y velocities | 2 | | +| **Target** | Target x, y coordinates | 2 | | +| **Distance** | Distance vector to target | 2 | | +| **Distance** | Euclidean distance to target | 1 | | + +--- + +## Reward Function Design + +The Point Mass environment's reward function consists of the following components: + +### Distance Reward + +```python +# Exponential distance reward - stronger as agent gets closer +distance_reward = np.exp(-10 * dist_to_target) +``` + +### Target Arrival and Stay Reward + +```python +# Large bonus for reaching target +target_bonus = 100.0 * in_target + +# Continuous reward for staying in target +continuous_reward = 30.0 * in_target +``` + +### Control and Path Optimization + +```python +# Penalty for distance from target center when inside target +center_penalty = np.where(in_target, 10.0 * dist_to_target, 0.0) + +# Control penalty to encourage smooth movement +control_penalty = 0.1 * vel_magnitude + +# Path optimization reward for straight-line movement +path_reward = 0.5 * direction_alignment +``` + +### Total Reward Calculation + +```python +# Combine all reward components +rwd = distance_reward + target_bonus + continuous_reward + path_reward - center_penalty - control_penalty +``` + +--- + +## Initial State + +- Point mass position randomly initialized within [-1.0, 1.0] +- Target position randomly initialized within [-1.5, 1.5] +- Point mass velocity initialized to 0 + +## Episode Termination Conditions + +- Point mass reaches target and stays for 0.5 seconds +- Simulation time reaches 10 seconds +- Observation contains abnormal values (NaN) + +--- + +## Usage Guide + +### 1. Environment Preview + +```bash +uv run scripts/view.py --env point_mass +``` + +### 2. Start Training + +```bash +uv run scripts/train.py --env point_mass +``` + +### 3. View Training Progress + +```bash +uv run tensorboard --logdir runs/point_mass +``` + +### 4. Test Training Results + +```bash +uv run scripts/play.py --env point_mass +``` + +--- + +## Expected Training Results + +### Navigation Performance + +1. Agent learns to move directly towards the target +2. Smooth movement with minimal control effort +3. Consistent target reaching within episode duration + +### Learning Progress + +1. Rapid initial learning phase as agent discovers basic navigation +2. Gradual refinement of control strategy +3. Stable performance across different target positions + +### Behavior Characteristics + +1. Efficient path planning towards target +2. Smooth approach to target center +3. Minimal overshooting or oscillatory behavior diff --git a/docs/source/en/user_guide/demo/dm_quadruped.md b/docs/source/en/user_guide/demo/dm_quadruped.md new file mode 100644 index 0000000..5680b71 --- /dev/null +++ b/docs/source/en/user_guide/demo/dm_quadruped.md @@ -0,0 +1,290 @@ +# Quadruped Robot + +The Quadruped robot is a classic continuous control task in the DeepMind Control Suite. In MotrixLab, the `motrix_envs/src/motrix_envs/basic/quadruped` directory currently registers four directly trainable tasks: flat-ground walking `dm-quadruped-walk`, flat-ground running `dm-quadruped-run`, rough-terrain escape `dm-quadruped-escape`, and flat-ground ball pushing `dm-quadruped-fetch`. + +## Task Preview + +### Walk + +```{video} /_static/videos/dm_quadruped_walk.mp4 +:poster: _static/images/poster/dm_quadruped_walk.png +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +### Run + +```{video} /_static/videos/dm_quadruped_run.mp4 +:poster: _static/images/poster/dm_quadruped_run.png +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +### Escape + +```{video} /_static/videos/dm_quadruped_escape.mp4 +:poster: _static/images/poster/dm_quadruped_escape.png +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +### Fetch + +```{video} /_static/videos/dm_quadruped_fetch.mp4 +:poster: _static/images/poster/dm_quadruped_fetch.png +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +## Task Overview + +| Environment ID | Task Goal | Model File | Target Speed | Observation Dimension | +| --------------------- | ---------------------------------------------------------------------------- | ---------------------- | ------------ | --------------------- | +| `dm-quadruped-walk` | Walk forward stably on flat ground while maintaining heading | `quadruped_walk.xml` | 0.5 m/s | 54 | +| `dm-quadruped-run` | Run at high speed on flat ground while maintaining stable posture | `quadruped_walk.xml` | 5.0 m/s | 54 | +| `dm-quadruped-escape` | Escape outward from the origin area as quickly as possible on uneven terrain | `quadruped_escape.xml` | 3.0 m/s | 57 | +| `dm-quadruped-fetch` | Push a ball into the target area on flat ground | `quadruped_fetch.xml` | 2.0 m/s | 66 | + +## Task Description + +Quadruped is a 3D quadruped robot task. The robot consists of one torso and four legs, and each leg has control dimensions related to yaw, lift, and extension. The underlying XML defines the hip, knee, and ankle joint structure, while the action layer uses a coupled actuator design with 3 actuators per leg: + +- `yaw`: controls leg yaw +- `lift`: controls leg lifting through tendon coupling +- `extend`: controls leg extension/retraction through tendon coupling + +`walk` and `run` use the same flat-ground model, with the main difference being the target speed. `escape` uses `quadruped_escape.xml` with a heightfield terrain and requires the robot to move away from the world origin quickly while maintaining an upright torso and stable locomotion. `fetch` uses `quadruped_fetch.xml`, which adds a free ball and a target region to the scene, requiring the robot to first approach a suitable position and then push the ball toward the goal. + +--- + +## Action Space + +| Item | Details | +| ------------- | -------------------------------- | +| **Type** | `Box(low, high, (12,), float32)` | +| **Dimension** | 12 | + +Actions are arranged leg by leg, and each leg contains three actuators: `yaw / lift / extend`. + +| Index | Action Meaning | Min Value | Max Value | Corresponding Actuator | +| ----: | --------------------------------- | :-------: | :-------: | ---------------------- | +| 0 | Front-left leg yaw control | -1.0 | 1.0 | `yaw_front_left` | +| 1 | Front-left leg lift control | -1.0 | 1.1 | `lift_front_left` | +| 2 | Front-left leg extension control | -0.8 | 0.8 | `extend_front_left` | +| 3 | Front-right leg yaw control | -1.0 | 1.0 | `yaw_front_right` | +| 4 | Front-right leg lift control | -1.0 | 1.1 | `lift_front_right` | +| 5 | Front-right leg extension control | -0.8 | 0.8 | `extend_front_right` | +| 6 | Rear-right leg yaw control | -1.0 | 1.0 | `yaw_back_right` | +| 7 | Rear-right leg lift control | -1.0 | 1.1 | `lift_back_right` | +| 8 | Rear-right leg extension control | -0.8 | 0.8 | `extend_back_right` | +| 9 | Rear-left leg yaw control | -1.0 | 1.0 | `yaw_back_left` | +| 10 | Rear-left leg lift control | -1.0 | 1.1 | `lift_back_left` | +| 11 | Rear-left leg extension control | -0.8 | 0.8 | `extend_back_left` | + +--- + +## Observation Space + +| Environment | Details | +| --------------------- | -------------------------------- | +| `dm-quadruped-walk` | `Box(-inf, inf, (54,), float32)` | +| `dm-quadruped-run` | `Box(-inf, inf, (54,), float32)` | +| `dm-quadruped-escape` | `Box(-inf, inf, (57,), float32)` | +| `dm-quadruped-fetch` | `Box(-inf, inf, (66,), float32)` | + +All four tasks share nearly the same proprioceptive observations. `escape` adds 3 task-related dimensions associated with the origin, while `fetch` adds ball state and target position information: + +| Part | Description | Dimension | `walk/run` | `escape` | `fetch` | +| ---------------------- | --------------------------------------------------------- | --------- | ---------- | -------- | ------- | +| **egocentric dof pos** | Body generalized position state | 16 | Yes | Yes | Yes | +| **egocentric dof vel** | Body generalized velocity state | 16 | Yes | Yes | Yes | +| **actuator ctrl** | Current 12-dimensional actuator controls | 12 | Yes | Yes | Yes | +| **torso velocity** | Torso linear velocity sensor `velocimeter` | 3 | Yes | Yes | Yes | +| **torso upright** | Scalar representing torso uprightness | 1 | Yes | Yes | Yes | +| **imu** | IMU acceleration and angular velocity | 6 | Yes | Yes | Yes | +| **origin** | World origin position in the body frame | 3 | No | Yes | No | +| **ball state** | Ball position, relative linear velocity, angular velocity | 9 | No | No | Yes | +| **target** | Relative target position in the body frame | 3 | No | No | Yes | + +The XML also defines foot force/torque sensors and a center-of-mass sensor, but these values are not directly concatenated into the default observation in the current implementation. + +--- + +## Reward Function Design + +All four tasks use torso uprightness as the core constraint. In the implementation, `upright_reward` is computed first from `torso_upright`, encouraging the robot to keep the body close to upright. + +### Walk / Run + +`dm-quadruped-walk` and `dm-quadruped-run` use the same reward structure, with different target speeds: + +- `walk` tracks `0.5 m/s` +- `run` tracks `5.0 m/s` + +The total reward is composed of: + +```python +# Speed reward: reach the target forward speed +# Posture reward: keep the torso upright +# Auxiliary rewards: height, lateral stability, heading alignment, action smoothness +# Penalties: backward motion, excessive vertical speed, excessive roll/pitch angular velocity, deviation from default posture +total_reward = upright_reward * move_reward + shaping_terms - penalty_terms +``` + +The main shaping and penalty terms include: + +- `height_reward`: encourages the torso to stay near the standing height +- `lateral_reward`: suppresses excessive lateral velocity +- `heading_reward`: encourages forward motion along the +X direction +- `smooth_reward`: penalizes large action changes between consecutive timesteps +- `backward_penalty`: suppresses backward movement +- `lin_vel_z_penalty` and `ang_vel_xy_penalty`: suppress vertical bouncing and excessive torso roll/pitch +- `similar_to_default_penalty`: encourages joint posture to stay reasonably close to the default standing pose + +### Escape + +`dm-quadruped-escape` adds a task term for escaping away from the origin area on top of the locomotion reward. This task uses the heightfield terrain in `quadruped_escape.xml`: + +```python +# Base locomotion reward +# + reward for getting farther from the origin +# + reward for outward radial speed +total_reward = locomotion_reward + upright_reward * escape_reward + radial_speed_reward +``` + +Additional task terms include: + +- `escape_reward`: rewards the robot based on its distance from the origin area +- `radial_speed_reward`: encourages acceleration along the outward direction away from the origin + +This makes `escape` require not only fast locomotion, but also correct outward motion on rough terrain. + +### Fetch + +`dm-quadruped-fetch` uses a task-specific shaping structure centered on positioning and ball pushing. In the current implementation, the reward is mainly based on the geometric relationship between the robot, the ball, and the target: + +```python +# Positioning stage: encourage the robot to move behind or slightly behind the ball +# Ready stage: encourage facing the ball, getting close to it, and aligning with the ball-target line +# Pushing stage: encourage the ball to roll toward the target and eventually enter the target area +# Penalties: moving in the wrong direction, pushing the ball away from the target, getting the legs too close to the ball +total_reward = stage_terms + ready_terms + push_terms - penalty_terms +``` + +The main terms include: + +- `stage_move`: encourages movement toward the current stage waypoint +- `stage_reach`: encourages reaching a suitable waypoint behind or to the side of the ball +- `behind_align`: encourages the robot to position itself behind the ball relative to the target +- `face_ball`: encourages the torso heading to point toward the ball +- `near_ball`: encourages the robot to approach the ball +- `ready` and `ready_gate`: combine position, orientation, and distance into a readiness signal for active pushing +- `fetch`: encourages the ball to get closer to the target region +- `push`: encourages the ball to move along the target direction +- `backward`: penalizes moving opposite to the current stage target +- `away`: penalizes pushing the ball away from the target +- `leg_ball`: penalizes leg geometry getting too close to the ball, reducing ball trapping and squeezing behavior + +In addition, `fetch` uses a `stability` gate on torso uprightness and torso height so the agent cannot easily exploit obviously collapsed poses to collect task reward. + +--- + +## Initial State + +- `walk`, `run`, and `escape` reset from the default quadruped standing pose defined in the XML +- For these three tasks, the root orientation is fixed to the initial heading instead of being randomly rotated +- `fetch` randomizes the robot position and yaw on the plane, and also randomizes the ball position on the ground +- All tasks initialize joint velocities, and in `fetch` also ball velocities, to zero +- During reset, the robot is automatically lifted until there is no initial penetration/contact with the ground + +## Episode Termination Conditions + +- Maximum episode duration is 20 seconds +- The episode terminates when `NaN` appears in the observation +- `walk`, `run`, and `escape` do not currently define a separate fall termination condition +- `fetch` terminates early when the robot has clearly fallen, based on low torso uprightness or low torso height +- The current implementation does not yet define a separate success termination condition for "ball enters the target area" + +--- + +## Usage Guide + +### 1. Environment Preview + +```bash +uv run scripts/view.py --env dm-quadruped-walk +uv run scripts/view.py --env dm-quadruped-run +uv run scripts/view.py --env dm-quadruped-escape +uv run scripts/view.py --env dm-quadruped-fetch +``` + +### 2. Start Training + +```bash +uv run scripts/train.py --env dm-quadruped-walk +uv run scripts/train.py --env dm-quadruped-run +uv run scripts/train.py --env dm-quadruped-escape +uv run scripts/train.py --env dm-quadruped-fetch +``` + +### 3. View Training Progress + +```bash +uv run tensorboard --logdir runs/dm-quadruped-walk +uv run tensorboard --logdir runs/dm-quadruped-run +uv run tensorboard --logdir runs/dm-quadruped-escape +uv run tensorboard --logdir runs/dm-quadruped-fetch +``` + +### 4. Test Training Results + +```bash +uv run scripts/play.py --env dm-quadruped-walk +uv run scripts/play.py --env dm-quadruped-run +uv run scripts/play.py --env dm-quadruped-escape +uv run scripts/play.py --env dm-quadruped-fetch +``` + +--- + +## Expected Training Results + +### Walking Task (`dm-quadruped-walk`) + +1. Maintain a stable forward speed close to `0.5 m/s` +2. Keep body posture stable with small lateral sway +3. Sustain walking along the +X direction + +### Running Task (`dm-quadruped-run`) + +1. Increase speed to near or above `5.0 m/s` +2. Produce larger stride length and more explosive motions +3. Maintain good torso stability under high-speed locomotion + +### Escape Task (`dm-quadruped-escape`) + +1. Move away from the origin region quickly +2. Maintain stable footholds on the heightfield terrain without easily tipping over +3. Move primarily outward rather than spinning in place + +### Fetch Task (`dm-quadruped-fetch`) + +1. First move into a reasonable position along the ball-target line instead of randomly colliding with the ball from the side +2. Push the ball toward the target area consistently instead of kicking it away or repeatedly sending it off course +3. Maintain better body stability during pushing, with fewer collapsed poses, flips, or leg-ball entanglement behaviors diff --git a/docs/source/en/user_guide/demo/rm65_open_cabinet.md b/docs/source/en/user_guide/demo/rm65_open_cabinet.md new file mode 100644 index 0000000..99b7386 --- /dev/null +++ b/docs/source/en/user_guide/demo/rm65_open_cabinet.md @@ -0,0 +1,257 @@ +# RM65 Open Cabinet + +## Overview + +This document describes the `rm65-open-cabinet` manipulation task environment. The environment uses an RM65 6-DOF robotic arm with a parallel gripper. The goal is to approach the bottom drawer handle, establish a stable grasp, and pull the drawer open. + +```{video} /_static/videos/rm65_open_cabinet.mp4 +:poster: _static/images/poster/rm65_open_cabinet.png +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +--- + +## Environment Description + +This task is built on an RM65 arm and a cabinet drawer scene. Although the registered environment name is `rm65-open-cabinet`, the current implementation actually targets the bottom drawer, using `drawer_bottom_handle` and `drawer_bottom_joint` in code. + +### Robot Structure + +The RM65 robot in this environment contains the following major components: + +- **Base (`base_link`)**: Fixed in front of the workspace +- **6 arm joints**: `joint_1` to `joint_6` +- **Parallel gripper**: The main driven gripper joint is `gripper_Left_1_Joint`, while the other 5 gripper joints follow through mimic linkage +- **End effector (TCP)**: The `gripper` site, used to compute the relative pose between the tool center point and the drawer handle +- **Finger contact sites**: `left_finger_pad` and `right_finger_pad`, used to evaluate handle alignment and penetration + +### Scene Objects + +- **Cabinet**: Contains multiple doors and drawers +- **Target handle**: `drawer_bottom_handle` +- **Target joint**: `drawer_bottom_joint`, with a sliding range of `0.0 ~ 0.4 m` + +### Task Objective + +The robot is expected to complete the following stages: + +1. **Approach the handle**: Move the TCP close to the drawer handle +2. **Align the pose**: Match the gripper pose to the handle pose +3. **Secure the grasp**: Close the gripper and maintain a stable grasp +4. **Open the drawer**: Pull the bottom drawer along its sliding direction + +--- + +## Action Space + +The action space is `Box(-inf, inf, (7,), float32)`. + +The first 6 dimensions control arm joint targets, and the last dimension controls gripper opening and closing. + +### Control Mode + +- **Arm**: Uses `joint_target` mode by default, with normalized target actions + Arm actions are clipped to `[-1, 1]` first, then linearly mapped to each joint control range +- **Gripper**: Uses `binary` mode by default + The raw action is converted to a closing probability through a Sigmoid function, then turned into a binary open/close command with hysteresis + +### Action Dimension Details + +| Index | Action Description | Raw Input Range | Controlled Target | +| ----- | ------------------ | --------------- | ---------------------- | +| 0 | Joint 1 target | `(-inf, inf)` | `joint_1` | +| 1 | Joint 2 target | `(-inf, inf)` | `joint_2` | +| 2 | Joint 3 target | `(-inf, inf)` | `joint_3` | +| 3 | Joint 4 target | `(-inf, inf)` | `joint_4` | +| 4 | Joint 5 target | `(-inf, inf)` | `joint_5` | +| 5 | Joint 6 target | `(-inf, inf)` | `joint_6` | +| 6 | Gripper open/close | `(-inf, inf)` | `gripper_Left_1_Joint` | + +### Control Constraints + +- Control period: `ctrl_dt = 0.025s`, corresponding to 40 Hz +- The arm uses speed limits, acceleration limits, action delay, and first-order actuator lag by default +- During training, arm delay, lag, speed limits, and acceleration limits are randomized per episode to improve sim-to-real robustness +- The gripper uses hysteresis thresholds: + - Open-to-close threshold: `0.78` + - Close-to-open threshold: `0.62` + - Minimum switching interval: `0.25s` + +--- + +## Observation Space + +The observation space is `Box(-inf, inf, (84,), float32)`, and the final observation is clipped to `[-5, 5]`. + +### Observation Components + +The observation is composed of the following 4 parts: + +1. **Joint positions (7 dimensions)** + - 6 arm joints + - 1 primary gripper joint + - All normalized to `[-1, 1]` +2. **Joint velocities (7 dimensions)** + - Estimated by finite differences between consecutive joint positions + - Then divided by `2` for scaling +3. **Target relative pose (7 dimensions)** + - Relative position from TCP to handle + - Relative orientation from TCP to handle in quaternion form +4. **Action history (63 dimensions)** + - Raw actions from the most recent `9` steps + - `7` values per step, for `9 × 7 = 63` dimensions + +### Observation Dimension Details + +| Index Range | Description | Dimension | +| ----------- | ------------------------------------ | --------- | +| 0-6 | Normalized joint positions | 7 | +| 7-13 | Joint velocities | 7 | +| 14-16 | Relative position from TCP to handle | 3 | +| 17-20 | Relative orientation quaternion | 4 | +| 21-83 | Recent 9-step action history | 63 | + +### Observation Noise + +Sim-to-real observation perturbations are enabled by default, including: + +- Joint position and velocity noise +- Handle position and orientation noise +- Persistent handle observation bias +- Random handle observation dropout, optionally holding the previous observation on dropout + +--- + +## Reward Function + +The reward is a staged composite design that encourages approach, alignment, stable grasping, and continuous drawer opening. + +### Main Reward Terms + +1. **Distance reward** + + ```python + dist_reward = 15.0 * (1 - tanh(distance / 0.4)) + ``` + + Encourages the TCP to stay close to the handle. + +2. **Orientation reward** + + Computed from quaternion similarity between the TCP pose and the handle pose, and only applied when the TCP is sufficiently close to the handle. + +3. **Gripper closing reward** + + When the TCP is within `0.035m` and the two fingers are vertically aligned around the handle, closing the gripper is rewarded; otherwise it is penalized. This term is also scaled by the gripper closing amount. + +4. **Drawer opening reward** + + ```python + open_reward = (exp(open_dist) - 1.0) * 420.0 + ``` + + This reward is only active when the robot has already grasped the handle, or has entered the grasp-maintenance phase while still staying near the handle. + +5. **Open-distance delta reward** + + Provides extra reward for newly gained drawer displacement at the current step, encouraging stable and continuous pulling. + +6. **Stable grasp reward** + + When the TCP is within `0.03m`, the gripper close ratio exceeds `0.7`, and this condition is maintained for `6` consecutive steps, the environment considers the handle grasped and provides persistent reward. + +7. **Milestone rewards** + + - Reward `35` when drawer opening exceeds `0.15m` + - Additional reward `70` when drawer opening exceeds `0.22m` + +### Penalty Terms + +1. **Slip penalty** + + If the environment has entered the grasping phase but the robot later loses the grasp while the drawer is already open, an additional penalty is applied. + +2. **Finger penetration penalty** + + Applied when the finger contact points cross the upper or lower handle boundary, discouraging unrealistic penetration. + +3. **Gripper switching penalty** + + Penalizes frequent gripper toggling when the TCP is near the handle. + +4. **Action-change penalty** + + Penalizes the squared difference between consecutive actions. + +5. **Joint-velocity penalty** + + Penalizes the squared sum of joint velocities, with a larger weight in later training. + +6. **Termination penalty** + + Applies an additional `-10.0` penalty when a termination condition is triggered. + +--- + +## Initial State + +### Robot Initialization + +- The arm starts from its default zero pose +- The gripper starts in the open state +- No joint-position reset noise is added by default +- All joint velocities are initialized to zero + +### Scene Initialization + +- The target drawer starts fully closed +- The drawer and the rest of the cabinet remain at their default scene poses + +### Randomized Factors + +At reset, the environment re-samples a subset of sim-to-real parameters, including: + +- Arm action delay +- Arm actuator lag +- Arm speed and acceleration limits +- Handle observation bias + +--- + +## Episode Termination Conditions + +The episode terminates early if any of the following conditions is met: + +1. **TCP moves too far behind the handle** + - Threshold: `tcp_x - handle_x < -0.02` +2. **Joint velocity becomes too large** + - Any robot joint velocity magnitude exceeds `3.93 rad/s` + +In addition, the maximum episode length is `30s`. + +--- + +## Usage + +### Training + +```bash +uv run scripts/train.py --env rm65-open-cabinet --train-backend torch +``` + +### Policy Evaluation + +```bash +uv run scripts/play.py --env rm65-open-cabinet +``` + +### TensorBoard + +```bash +uv run tensorboard --logdir runs/rm65_open_cabinet +``` diff --git a/docs/source/en/user_guide/getting_started/installation.md b/docs/source/en/user_guide/getting_started/installation.md index e592d4b..90a7daa 100644 --- a/docs/source/en/user_guide/getting_started/installation.md +++ b/docs/source/en/user_guide/getting_started/installation.md @@ -1,9 +1,13 @@ # Installation Environment -## Installation Requirements +This document will guide you through the installation and configuration of MotrixLab. Please read the system requirements carefully and choose the appropriate installation method based on your use case. + +## System Requirements - **Python Version**: {bdg-danger-line}`3.10.*` + This project requires a specific Python version, other versions are not currently supported: + | Python Version | Support Status | | :------------: | :------------: | | ≤ 3.9 | ❌ | @@ -12,6 +16,8 @@ - **Package Manager**: {bdg-danger-line}`UV` + This project uses UV as the exclusive package management tool to provide fast, reproducible dependency management environment. For UV installation, please refer to the [official documentation](https://docs.astral.sh/uv/getting-started/installation/). + - **System and Architecture**: - {bdg-danger-line}`Windows(x86_64)` @@ -26,30 +32,34 @@ | Windows | ✅ | ✅ | 🛠️ In Development | ``` -## Installation Method +## Installation Steps -### Clone Project +### Clone Project Repository ```bash git clone https://github.com/Motphys/MotrixLab.git cd MotrixLab ``` -### Install Dependencies +### Configure Dependencies -Use UV to install project dependencies: +Execute the following command to install complete dependencies: ```bash # Install all dependencies uv sync --all-packages --all-extras ``` -If you only need to install one training backend, you can choose to install a specific backend type: +If you only need specific training frameworks, you can selectively install to reduce dependency size: ```bash -# Install SKRL JAX (support Linux only) + +# Install SKRL JAX (Linux only) uv sync --all-packages --extra skrl-jax # Install SKRL PyTorch uv sync --all-packages --extra skrl-torch + +# Install RSLRL (PyTorch only) +uv sync --all-packages --extra rslrl ``` diff --git a/docs/source/en/user_guide/index.md b/docs/source/en/user_guide/index.md index 542f16c..3ca7902 100644 --- a/docs/source/en/user_guide/index.md +++ b/docs/source/en/user_guide/index.md @@ -34,14 +34,18 @@ demo/dm_walker demo/dm_cheetah demo/dm_hopper demo/dm_reacher +demo/dm_lqr demo/dm_finger demo/dm_humanoid +demo/dm_quadruped +demo/dm_point_mass demo/bring_ball demo/locomotion_unitree_go1 demo/locomotion_unitree_go1_rough_terrain demo/anymal_c demo/franka_lift_cube demo/franka_open_cabinet +demo/rm65_open_cabinet demo/shadow_hand_repose ``` diff --git a/docs/source/en/user_guide/tutorial/basic_frame.md b/docs/source/en/user_guide/tutorial/basic_frame.md index 730ba04..d8489b9 100644 --- a/docs/source/en/user_guide/tutorial/basic_frame.md +++ b/docs/source/en/user_guide/tutorial/basic_frame.md @@ -16,6 +16,7 @@ MotrixLab/ │ └── registry.py # Environment registry system ├── motrix_rl/ # Training layer: RL algorithms and configuration │ ├── skrl/ # SKRL framework integration (JAX/PyTorch) +│ ├── rslrl/ # RSLRL framework integration (PyTorch) │ ├── base.py # RL configuration base class │ └── registry.py # RL configuration registry system └── scripts @@ -34,7 +35,7 @@ MotrixLab/ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ -│ Training Algorithm Layer (SKRL) │ +│ Training Algorithm Layer (SKRL / RSLRL) │ │ PPO Trainer │ Network Architecture │ Optimizer │ └─────────────────────────────────────────────────────────────────┘ │ @@ -128,13 +129,15 @@ Configuration parameters play a key connecting role throughout the process: - **Reward Configuration** affects learning signals (reward weights, calculation methods, etc.) - **Training Configuration** controls algorithm behavior (network structure, learning rate, batch size, etc.) -## Multi-Backend Support +## Multi-Framework Support -MotrixLab's layered design naturally supports multiple backends: +MotrixLab's layered design naturally supports multiple RL frameworks: - **Simulation Backends**: MotrixSim (CPU) -- **Training Backends**: JAX and PyTorch, supporting GPU acceleration -- **Algorithm Framework**: Mainly integrates SKRL, easy to extend to other algorithms +- **Training Frameworks**: + - **SKRL**: Supports JAX and PyTorch backends with GPU acceleration + - **RSLRL**: Supports PyTorch backend with GPU acceleration +- **Framework Selection**: Use `--rllib` parameter to choose between `skrl` (default) and `rslrl` ## Design Advantages diff --git a/docs/source/en/user_guide/tutorial/training_and_result.md b/docs/source/en/user_guide/tutorial/training_and_result.md index 683ae4e..a413efa 100644 --- a/docs/source/en/user_guide/tutorial/training_and_result.md +++ b/docs/source/en/user_guide/tutorial/training_and_result.md @@ -7,56 +7,64 @@ This section introduces how to execute reinforcement learning training and how t ### Basic Training Commands ```bash -# Train with default parameters +# Train with default parameters (SKRL framework) uv run scripts/train.py --env cartpole +# Specify RL framework +uv run scripts/train.py --env cartpole --rllib skrl +uv run scripts/train.py --env cartpole --rllib rslrl + # Specify simulation backend uv run scripts/train.py --env cartpole --sim-backend np -# Specify training backend -uv run scripts/train.py --env cartpole --train-backend jax -uv run scripts/train.py --env cartpole --train-backend torch +# Specify training backend (SKRL only) +uv run scripts/train.py --env cartpole --rllib skrl --train-backend jax +uv run scripts/train.py --env cartpole --rllib skrl --train-backend torch ``` ### Advanced Training Configuration ```bash -# Customize training parameters +# Customize training parameters with SKRL uv run scripts/train.py --env cartpole \ + --rllib skrl \ --num-envs 1024 \ --train-backend jax \ --sim-backend np +# Customize training parameters with RSLRL +uv run scripts/train.py --env cartpole \ + --rllib rslrl \ + --num-envs 1024 \ + --sim-backend np + +# Note: Parameters like learning rate need to be set through configuration files or code override + # Enable rendering to monitor training process uv run scripts/train.py --env cartpole --render ``` -### Different Backend Configuration Differences +### Different Framework Configuration -The system supports configuring different reinforcement learning parameters for different training backends (JAX/Torch). For example: +The system supports different RL frameworks with different configuration systems: -- **dm-walker environment**: +- **SKRL Framework**: Supports JAX and PyTorch training backends with configurable parameters per backend (via Python dataclasses) +- **RSLRL Framework**: Supports PyTorch backend with configuration via Python dataclasses (RslrlCfg) - - JAX backend: `mini_batches: 4` - - Torch backend: `mini_batches: 32` - -- **dm-runner environment**: - - JAX backend: `learning_epochs: 4` - - Torch backend: `learning_epochs: 2` - -These differences are implemented through the `@rlcfg(env_name, backend="jax/torch")` decorator in configuration classes. The system automatically applies the corresponding configuration based on the selected training backend. +For SKRL, the system supports configuring different reinforcement learning parameters for different training backends (JAX/Torch). ### Supported Command Line Parameters -| Parameter | Description | Default Value | -| ----------------- | ------------------------------- | ------------- | -| `--env` | Environment name | `cartpole` | -| `--sim-backend` | Simulation backend (np) | Auto select | -| `--train-backend` | Training backend (jax/torch) | Auto select | -| `--num-envs` | Number of parallel environments | 2048 | -| `--render` | Enable rendering | False | +| Parameter | Description | Default Value | +| ----------------- | --------------------------------------- | ------------- | +| `--env` | Environment name | `cartpole` | +| `--rllib` | RL framework (skrl/rslrl) | `skrl` | +| `--sim-backend` | Simulation backend (np) | Auto select | +| `--train-backend` | Training backend (jax/torch, SKRL only) | Auto select | +| `--num-envs` | Number of parallel environments | 2048 | +| `--render` | Enable rendering | False | -> **Note**: Other parameters such as learning rate, network structure, etc., can be set in configuration files. Some environments support configuring different parameters for different training backends. +> **Note**: Other parameters such as learning rate, network structure, etc., need to be set through separate configuration files. ## Training Process Monitoring @@ -83,7 +91,7 @@ uv run tensorboard --logdir runs/cartpole uv run scripts/play.py --env cartpole # Manually specify policy file for testing -uv run scripts/play.py --env cartpole --policy runs/cartpole/nn/best_policy.pickle +uv run scripts/play.py --env cartpole --policy runs/cartpole/nn/best_agent.pickle # Specify number of test environments uv run scripts/play.py --env cartpole --num-envs 100 diff --git a/docs/source/en/user_guide/tutorial/training_environment_config.md b/docs/source/en/user_guide/tutorial/training_environment_config.md index b0197b8..2c1304b 100644 --- a/docs/source/en/user_guide/tutorial/training_environment_config.md +++ b/docs/source/en/user_guide/tutorial/training_environment_config.md @@ -2,141 +2,80 @@ MotrixLab provides a flexible configuration system that allows users to customize reinforcement learning training parameters. This section introduces how to configure training environments and reinforcement learning algorithm parameters. -## RL Training Configuration (PPOCfg) +## RL Training Configuration -Training configuration defines parameters for reinforcement learning algorithms. MotrixLab now supports configuring different parameters for different training backends. +MotrixLab supports multiple RL frameworks with different configuration systems: -### Basic Training Configuration +- **SKRL Framework**: Uses Python dataclass configuration (SkrlCfg) +- **RSLRL Framework**: Uses Python dataclass configuration (RslrlCfg) -```python -from dataclasses import dataclass -from motrix_rl.skrl.cfg import PPOCfg -from motrix_rl import registry +### SKRL Configuration (SkrlCfg) -# Universal configuration (applies to all backends) -@registry.rlcfg("my-task") -@dataclass -class MyTaskRLCfg(PPOCfg): - # Environment parameters - num_envs: int = 2048 # Number of parallel environments during training - play_num_envs: int = 16 # Number of parallel environments during evaluation +Training configuration defines parameters for reinforcement learning algorithms based on PPO. MotrixLab now supports configuring different parameters for different training backends. - # PPO algorithm parameters - learning_rate: float = 3e-4 # Learning rate - rollouts: int = 32 # Experience replay rounds - learning_epochs: int = 10 # Number of epochs per update - mini_batches: int = 32 # Number of mini-batches - discount_factor: float = 0.99 # Discount factor - grad_norm_clip: float = 1.0 # Gradient clipping +#### Complete Configuration Example - # Network structure parameters - policy_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) # Policy network hidden layers - value_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) # Value network hidden layers +The following is the actual `CartPoleSkrlPpo` configuration, demonstrating complete explicit parameter filling. This configuration uses a smaller network `[32, 32]` suitable for simple tasks like CartPole. - # Training control parameters - max_env_steps: int = 1_000_000 # Maximum environment steps - check_point_interval: int = 10_000 # Checkpoint interval +```{literalinclude} ../../../../motrix_rl/src/motrix_rl/tasks/cartpole.py +:language: python +:start-after: docs-start: cartpole-skrl-config +:end-before: docs-end: cartpole-skrl-config ``` -### Different Backend Configurations +**Key Configuration Notes:** -```python -# JAX backend specific configuration -@registry.rlcfg("my-task", backend="jax") -@dataclass -class MyTaskJAXCfg(PPOCfg): - # JAX optimized configuration - learning_rate: float = 2e-4 # JAX backend uses smaller learning rate - mini_batches: int = 4 # JAX supports large batches, fewer mini-batches - learning_epochs: int = 4 # Training rounds - num_envs: int = 2048 # More parallel environments +- **Network Architecture**: `hiddens=[32, 32]` - CartPole is a simple task, a small network is sufficient (default: `[256, 128, 64]`) +- **Training Epochs**: `learning_epochs=5` - Higher than default value 2, ensuring thorough learning +- **Mini-batches**: `mini_batches=4` - Fewer than default 32, suitable for simple tasks +- **Training Duration**: `timesteps=5000` - Sufficient for CartPole (default: 10000) +- **All Parameters**: All parameters from parent classes are explicitly specified, no hidden defaults -# Torch backend specific configuration -@registry.rlcfg("my-task", backend="torch") -@dataclass -class MyTaskTorchCfg(PPOCfg): - # Torch optimized configuration - learning_rate: float = 1e-4 # Torch backend uses even smaller learning rate - mini_batches: int = 32 # Torch needs more mini-batches - learning_epochs: int = 2 # Fewer training rounds - num_envs: int = 1024 # Fewer parallel environments +For complete source code, see: [`motrix_rl/src/motrix_rl/tasks/cartpole.py`](https://github.com/Motphys/motrix-lab/blob/main/motrix_rl/src/motrix_rl/tasks/cartpole.py) + +### RSLRL Configuration (RslrlCfg) + +RSLRL is another high-performance reinforcement learning library, specifically designed for complex control tasks like quadruped robots. + +#### Complete Configuration Example + +The following is the actual `CartPoleRslrlPpo` configuration, demonstrating complete explicit parameter filling. This configuration uses a smaller network `[32, 32]` suitable for simple tasks like CartPole. + +```{literalinclude} ../../../../motrix_rl/src/motrix_rl/tasks/cartpole.py +:language: python +:start-after: docs-start: cartpole-rslrl-config +:end-before: docs-end: cartpole-rslrl-config ``` -### Complete Configuration Example +**Key Configuration Notes:** -```python -@dataclass -class CompletePPOConfig(PPOCfg): - """ - Complete reinforcement learning training configuration example - Contains all configuration parameters from basic to advanced - """ +- **Network Architecture**: `hidden_dims=[32, 32]` - CartPole is a simple task, a small network is sufficient (default: `[256, 128, 64]`) +- **Training Iterations**: `max_iterations=300` - Total of 300 training iterations +- **Steps per Environment**: `num_steps_per_env=16` - Number of steps to collect per environment +- **Learning Rate**: `learning_rate=5.0e-4` - Learning rate setting +- **Entropy Coefficient**: `entropy_coef=5e-3` - Entropy coefficient for exploration +- **All Parameters**: All parameters from parent classes are explicitly specified, no hidden defaults - # ===== Basic Training Parameters ===== - seed: Optional[int] = None # Random seed - num_envs: int = 2048 # Number of parallel environments during training - play_num_envs: int = 16 # Number of parallel environments during evaluation - max_env_steps: int = 2_048_000 # Maximum training steps - check_point_interval: int = 1000 # Checkpoint save interval +For detailed RSLRL configuration options and default values, refer to: - # ===== PPO Algorithm Core Parameters ===== - learning_rate: float = 3e-4 # Learning rate - rollouts: int = 32 # Experience replay rounds - learning_epochs: int = 2 # Number of training rounds per update - mini_batches: int = 32 # Number of mini-batches - discount_factor: float = 0.99 # Discount factor - lambda_param: float = 0.95 # GAE parameter - grad_norm_clip: float = 1.0 # Gradient clipping - - # ===== PPO Clipping Parameters ===== - ratio_clip: float = 0.2 # PPO clipping ratio - value_clip: float = 0.2 # Value clipping - clip_predicted_values: bool = True # Clip predicted values - - # ===== Loss Function Parameters ===== - entropy_loss_scale: float = 0.0 # Entropy loss coefficient - value_loss_scale: float = 2.0 # Value loss coefficient - kl_threshold: float = 0 # KL divergence threshold - - # ===== Learning Rate Scheduler ===== - learning_rate_scheduler_kl_threshold: float = 0.008 # Adaptive learning rate KL threshold - - # ===== Network Architecture Configuration ===== - # Small network (suitable for simple tasks like CartPole) - # policy_hidden_layer_sizes: tuple[int, ...] = (128, 64) - # value_hidden_layer_sizes: tuple[int, ...] = (128, 64) - - # Medium network (default configuration, suitable for most tasks) - policy_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - value_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - - # Large network (suitable for complex tasks like robot control) - # policy_hidden_layer_sizes: tuple[int, ...] = (512, 256, 128) - # value_hidden_layer_sizes: tuple[int, ...] = (512, 256, 128) - - # ===== Network Sharing Configuration ===== - share_policy_value_features: bool = True # Policy and value networks share feature extraction layers - - # ===== Training Control Parameters ===== - random_timesteps: int = 0 # Random timesteps - learning_starts: int = 0 # Timesteps to start learning - time_limit_bootstrap: bool = True # Time limit bootstrap - - # ===== Reward Shaping ===== - rewards_shaper_scale: float = 1.0 # Reward scaling factor -``` +- `motrix_rl/rslrl/cfg.py`: Configuration class definitions +- `motrix_rl/template/rslrl_config.yaml`: YAML reference template ## Configuration Usage Methods ### 1. Default Configuration Usage ```bash -# Use configuration given in code +# Use configuration given in code (default: SKRL framework) uv run scripts/train.py --env my-task -# Specify training backend, system will automatically select corresponding backend configuration -uv run scripts/train.py --env my-task --train-backend jax -uv run scripts/train.py --env my-task --train-backend torch +# Specify RL framework +uv run scripts/train.py --env my-task --rllib skrl +uv run scripts/train.py --env my-task --rllib rslrl + +# Specify training backend for SKRL, system will automatically select corresponding backend configuration +uv run scripts/train.py --env my-task --rllib skrl --train-backend jax +uv run scripts/train.py --env my-task --rllib skrl --train-backend torch ``` ### 2. Command Line Parameter Override @@ -144,88 +83,10 @@ uv run scripts/train.py --env my-task --train-backend torch ```bash # Override supported command line parameters uv run scripts/train.py --env my-task \ + --rllib skrl \ --num-envs 1024 \ --train-backend jax \ --sim-backend np # System will automatically select JAX backend configuration ``` - -### 3. Configuration Priority - -System selects configuration in the following priority: - -1. **Backend-specific configuration**: If there is a configuration decorated with `@rlcfg(env_name, backend="jax/torch")` -2. **Universal configuration**: If there is a configuration decorated with `@rlcfg(env_name)` (no backend parameter) -3. **Configuration override**: Command line `cfg_override` parameter - -For example: - -```python -# Highest priority - backend specific configuration -@rlcfg("my-task", backend="jax") -@dataclass -class MyTaskJAXCfg(PPOCfg): - mini_batches: int = 4 - -# Second priority - universal configuration -@rlcfg("my-task") -@dataclass -class MyTaskRLCfg(PPOCfg): - mini_batches: int = 32 - -# When using --train-backend jax, system will select MyTaskJAXCfg -# When using --train-backend torch, system will select MyTaskRLCfg -``` - -#### User Configurable Parameters - -| MotrixLab Configuration Class | SKRL Framework Parameter | Description | -| -------------------------------------- | --------------------------------------------- | ----------------------------------- | -| `learning_rate` | `learning_rate` | Learning rate | -| `rollouts` | `rollouts` | Experience replay rounds | -| `learning_epochs` | `learning_epochs` | Training rounds | -| `mini_batches` | `mini_batches` | Number of mini-batches | -| `discount_factor` | `discount_factor` | Discount factor | -| `grad_norm_clip` | `grad_norm_clip` | Gradient clipping | -| `lambda_param` | `lambda` | GAE parameter | -| `ratio_clip` | `ratio_clip` | PPO clipping ratio | -| `value_clip` | `value_clip` | Value clipping | -| `clip_predicted_values` | `clip_predicted_values` | Clip predicted values | -| `entropy_loss_scale` | `entropy_loss_scale` | Entropy loss coefficient | -| `value_loss_scale` | `value_loss_scale` | Value loss coefficient | -| `kl_threshold` | `kl_threshold` | KL divergence threshold | -| `random_timesteps` | `random_timesteps` | Random timesteps | -| `learning_starts` | `learning_starts` | Learning start timesteps | -| `time_limit_bootstrap` | `time_limit_bootstrap` | Time limit bootstrap | -| `learning_rate_scheduler_kl_threshold` | `learning_rate_scheduler_kwargs.kl_threshold` | Adaptive learning rate KL threshold | -| `check_point_interval` | `experiment.write_interval` | Log write interval | -| `check_point_interval` | `experiment.checkpoint_interval` | Checkpoint save interval | -| `rewards_shaper_scale` | `rewards_shaper` | Reward scaling function | - -#### Preprocessor Parameters - -| SKRL Framework Parameter | Type | Description | -| ------------------------ | --------------------- | ------------------- | -| `state_preprocessor` | RunningStandardScaler | State normalization | -| `value_preprocessor` | RunningStandardScaler | Value normalization | - -### Configuration Hierarchy Summary - -``` -User Configuration Class (PPOCfg) - ↓ Backend specific selection -Backend Configuration (JAX/Torch) - ↓ Parameter mapping -SKRL Framework Configuration Dictionary - ↓ Pass to -PPO Agent - ↓ Execute -Reinforcement Learning Training -``` - -This design allows users to: - -1. Control complex training parameters through simple configuration classes -2. Configure different parameters for different training backends to achieve optimal performance -3. Maintain full compatibility with the SKRL framework diff --git a/docs/source/zh_CN/index.md b/docs/source/zh_CN/index.md index 9dbc3d1..213c633 100644 --- a/docs/source/zh_CN/index.md +++ b/docs/source/zh_CN/index.md @@ -7,8 +7,8 @@ MotrixLab 是一个为机器人训练设计的机器学习通用架构。它基 :::{grid-item-card} -```{video} _static/videos/cartpole.mp4 -:poster: _static/images/poster/cartpole.jpg +```{video} _static/videos/shadow_hand_repose.mp4 +:poster: _static/images/poster/shadow_hand_repose.jpg :nocontrols: :autoplay: :playsinline: @@ -147,8 +147,8 @@ MotrixLab 是一个为机器人训练设计的机器学习通用架构。它基 :::{grid-item-card} -```{video} _static/videos/dm_reacher.mp4 -:poster: _static/images/poster/dm_reacher.jpg +```{video} _static/videos/cartpole.mp4 +:poster: _static/images/poster/cartpole.jpg :nocontrols: :autoplay: :playsinline: @@ -185,6 +185,32 @@ MotrixLab 是一个为机器人训练设计的机器学习通用架构。它基 :width: 100% ``` +::: +:::{grid-item-card} + +```{video} _static/videos/dm_quadruped_fetch.mp4 +:poster: _static/images/poster/dm_quadruped_fetch.png +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +::: +:::{grid-item-card} + +```{video} _static/videos/dm_quadruped_run.mp4 +:poster: _static/images/poster/dm_quadruped_run.png +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + ::: :::: diff --git a/docs/source/zh_CN/user_guide/demo/acrobot.md b/docs/source/zh_CN/user_guide/demo/acrobot.md index 7e13f08..2b2e4e1 100644 --- a/docs/source/zh_CN/user_guide/demo/acrobot.md +++ b/docs/source/zh_CN/user_guide/demo/acrobot.md @@ -103,45 +103,18 @@ uv run scripts/play.py --env acrobot --policy runs/acrobot/nn/best_policy.pickle ### 环境配置 -```python -@dataclass -class AcrobotEnvCfg(EnvCfg): - model_file: str = ".../acrobot.xml" # MJCF 模型 - max_episode_seconds: float = 10.0 - sim_dt: float = 0.01 - ctrl_dt: float = 0.02 - reset_noise_scale: float = 0.1 - render_spacing: float = 2.0 +```{literalinclude} ../../../../motrix_envs/src/motrix_envs/basic/acrobot/cfg.py +:language: python +:start-after: '# -- docs-tag-start: acrobot-env-cfg --' +:end-before: '# -- docs-tag-end: acrobot-env-cfg --' ``` ### 训练配置(PPO 示例) -```python -@rlcfg("acrobot", backend="jax") -@dataclass -class AcrobotPPO(PPOCfg): - max_env_steps: int = 60_000_000 - check_point_interval: int = 500 - - # 覆盖 PPO 配置 - policy_hidden_layer_sizes: tuple[int, ...] = (32, 32) - value_hidden_layer_sizes: tuple[int, ...] = (32, 32) - rollouts: int = 64 - learning_epochs: int = 5 - mini_batches: int = 8 - learning_rate: float = 3e-4 - grad_norm_clip: float = 0.1 - clip_predicted_values: bool = False - value_clip: float = 10.0 - entropy_loss_scale: float = 0.1 - learning_rate_scheduler_kl_threshold: float = 0.02 - discount_factor: float = 0.995 - lambda_param: float = 0.97 - ratio_clip: float = 0.2 - value_loss_scale: float = 0.5 - random_timesteps: int = 0 - learning_starts: int = 0 - kl_threshold: float = 0.03 +```{literalinclude} ../../../../motrix_rl/src/motrix_rl/tasks/acrobot.py +:language: python +:start-after: '# -- docs-tag-start: acrobot-train-cfg --' +:end-before: '# -- docs-tag-end: acrobot-train-cfg --' ``` --- diff --git a/docs/source/zh_CN/user_guide/demo/dm_lqr.md b/docs/source/zh_CN/user_guide/demo/dm_lqr.md new file mode 100644 index 0000000..a5d658b --- /dev/null +++ b/docs/source/zh_CN/user_guide/demo/dm_lqr.md @@ -0,0 +1,199 @@ +# 线性二次调节器 + +LQR(Linear Quadratic Regulator,线性二次调节器)是一个典型的连续控制与稳定化任务。本仓库当前提供两个变体: + +- `dm-lqr-2-1`:两个小球通过绳索相连,只有最后一个小球受控。 +- `dm-lqr-6-2`:六个小球串联成链,只有最后两个小球受控。 + +智能体需要在尽量小的控制代价下,将整条系统拉回中心附近并稳定停下。 + +```{video} /_static/videos/dm_lqr_2_1.mp4 +:poster: _static/images/poster/dm_lqr_2_1.jpg +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +```{video} /_static/videos/dm_lqr_6_2.mp4 +:poster: _static/images/poster/dm_lqr_6_2.jpg +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +--- + +## 任务描述 + +这两个任务都可以看作一维弹簧-阻尼链的平衡控制问题。每个小球只有一个沿 x 轴的滑动自由度,相邻小球之间通过“绳”形成耦合,系统同时受到: + +- 球体自身阻尼 +- 相邻球体之间的弹簧力和相对速度阻尼 +- 指向原点的中心回复力 +- 控制输入作用在末端受控自由度上 + +其中: + +- `dm-lqr-2-1` 更简单,适合先验证是否能学会稳定驻点。 +- `dm-lqr-6-2` 需要把控制作用沿链条传递到更远的非受控球,难度更高。 + +--- + +## 动作空间(Action Space) + +### dm-lqr-2-1 + +| 项目 | 详细信息 | +| -------- | ------------------------------- | +| **类型** | `Box(-1.0, 1.0, (1,), float32)` | +| **维度** | 1 | + +| 序号 | 动作含义 | 最小值 | 最大值 | 对应 XML 关节 | +| ---: | ------------------------ | :----: | :----: | :-----------: | +| 0 | 作用在末端球上的控制输入 | -1.0 | 1.0 | `q1` | + +### dm-lqr-6-2 + +| 项目 | 详细信息 | +| -------- | ------------------------------- | +| **类型** | `Box(-1.0, 1.0, (2,), float32)` | +| **维度** | 2 | + +| 序号 | 动作含义 | 最小值 | 最大值 | 对应 XML 关节 | +| ---: | ---------------------- | :----: | :----: | :-----------: | +| 0 | 倒数第二个球的控制输入 | -1.0 | 1.0 | `q4` | +| 1 | 最后一个球的控制输入 | -1.0 | 1.0 | `q5` | + +--- + +## 观察空间 + +观察由所有位置 `qpos` 和速度 `qvel` 直接拼接而成。 + +### dm-lqr-2-1 + +| 项目 | 详细信息 | +| -------- | ------------------------------- | +| **类型** | `Box(-inf, inf, (4,), float32)` | +| **维度** | 4 | + +| 序号 | 观察量 | 含义 | +| ---: | ------ | --------------- | +| 0 | `q0` | 第 1 个球的位置 | +| 1 | `q1` | 第 2 个球的位置 | +| 2 | `dq0` | 第 1 个球的速度 | +| 3 | `dq1` | 第 2 个球的速度 | + +### dm-lqr-6-2 + +| 项目 | 详细信息 | +| -------- | -------------------------------- | +| **类型** | `Box(-inf, inf, (12,), float32)` | +| **维度** | 12 | + +前 6 维为 `q0 ~ q5`,后 6 维为 `dq0 ~ dq5`。 + +--- + +## 奖励函数设计 + +当前实现的奖励由状态代价、速度代价、控制代价、成功奖励和越界惩罚组成: + +```python +state_cost = 0.5 * sum(qpos ** 2) +velocity_cost = 0.5 * velocity_cost_coef * sum(qvel ** 2) +control_cost = 0.5 * control_cost_coef * sum(action ** 2) + +reward = 1.0 - (state_cost + velocity_cost + control_cost) +reward += success_bonus +reward -= out_of_bounds_penalty +``` + +直观上: + +- 离中心越远,奖励越低 +- 速度越大,奖励越低 +- 控制越激进,奖励越低 +- 当系统进入“接近原点且速度足够小”的稳定区域时,会得到成功奖励 +- 越界时会受到额外惩罚 + +--- + +## 初始状态 + +每次重置时: + +- 位置向量从随机方向采样,再归一化到固定范数 +- 速度初始化为 0 + +当前配置中: + +- `dm-lqr-2-1` 的初始位置范数约为 `0.8` +- `dm-lqr-6-2` 的初始位置范数约为 `1.0` + +--- + +## Episode 终止条件 + +满足以下任一条件时,当前 episode 结束并重置: + +- 达到成功条件: + 位置范数小于成功距离阈值,且速度范数小于成功速度阈值 +- 超出边界: + 任意位置超过边界范围,或任意速度超过速度边界 +- 状态非常接近零点平衡态 +- 观察或动作中出现 `NaN` + +--- + +## 使用指南 + +### 1. 环境预览 + +```bash +uv run scripts/view.py --env dm-lqr-2-1 +uv run scripts/view.py --env dm-lqr-6-2 +``` + +### 2. 开始训练 + +```bash +uv run scripts/train.py --env dm-lqr-2-1 +uv run scripts/train.py --env dm-lqr-6-2 +``` + +### 3. 查看训练曲线 + +```bash +uv run tensorboard --logdir runs/dm-lqr-2-1 +uv run tensorboard --logdir runs/dm-lqr-6-2 +``` + +### 4. 测试训练结果 + +```bash +uv run scripts/play.py --env dm-lqr-2-1 +uv run scripts/play.py --env dm-lqr-6-2 +``` + +--- + +## 预期训练结果 + +### dm-lqr-2-1 + +1. 受控球能够带动未受控球一起回到中心附近。 +2. 两个球的位置和速度最终都收敛到较小范围内。 +3. 策略不会长期停在偏离中心的静止点。 + +### dm-lqr-6-2 + +1. 最后两个受控球能够把整条链逐步拉回中心。 +2. 链条传播过程中不会出现明显发散或持续振荡。 +3. 成功率随训练推进逐步上升,越界率逐步下降。 diff --git a/docs/source/zh_CN/user_guide/demo/dm_point_mass.md b/docs/source/zh_CN/user_guide/demo/dm_point_mass.md new file mode 100644 index 0000000..e60c4a2 --- /dev/null +++ b/docs/source/zh_CN/user_guide/demo/dm_point_mass.md @@ -0,0 +1,159 @@ +# 质点环境 + +质点(Point Mass)环境是一个简单但基础的 2D 导航任务,智能体通过控制一个质点来到达目标位置。这个环境是强化学习概念和连续动作空间的优秀入门案例。 + +```{video} /_static/videos/point_mass.mp4 +:poster: _static/images/poster/point_mass.jpg +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +## 任务描述 + +质点环境是一个 2D 导航任务。智能体需要通过施加力来控制一个质点,使其移动到随机生成的目标位置。该任务要求智能体学习高效的导航策略,以最小的控制成本到达目标。 + +--- + +## 动作空间(Action Space) + +| 项目 | 详细信息 | +| -------- | ------------------------------- | +| **类型** | `Box(-1.0, 1.0, (2,), float32)` | +| **维度** | 2 | + +动作对应如下: + +| 序号 | 动作含义(施加的力) | 最小值 | 最大值 | 对应 XML 中名称 | +| ---: | -------------------- | :----: | :----: | :-------------: | +| 0 | x 方向力 | -1 | 1 | `x_force` | +| 1 | y 方向力 | -1 | 1 | `y_force` | + +--- + +## 观察空间 + +| 项目 | 详细信息 | +| -------- | ------------------------------- | +| **类型** | `Box(-inf, inf, (9,), float32)` | +| **维度** | 9 | + +质点环境的观测空间由以下部分组成(按顺序): + +| 部分 | 内容说明 | 维度 | 备注 | +| -------- | -------------------------- | ---- | ---- | +| **位置** | 质点的 x、y 坐标 | 2 | | +| **速度** | 质点的 x、y 方向速度 | 2 | | +| **目标** | 目标的 x、y 坐标 | 2 | | +| **距离** | 到目标的 x、y 方向距离向量 | 2 | | +| **距离** | 到目标的欧几里得距离 | 1 | | + +--- + +## 奖励函数设计 + +质点环境的奖励函数由以下几个部分组成: + +### 距离奖励 + +```python +# 指数距离奖励 - 离目标越近奖励越强 +distance_reward = np.exp(-10 * dist_to_target) +``` + +### 目标到达和停留奖励 + +```python +# 到达目标的大额奖励 +target_bonus = 100.0 * in_target + +# 在目标内持续停留的奖励 +continuous_reward = 30.0 * in_target +``` + +### 控制和路径优化 + +```python +# 在目标内时,距离目标中心越远的惩罚 +center_penalty = np.where(in_target, 10.0 * dist_to_target, 0.0) + +# 控制惩罚,鼓励平滑移动 +control_penalty = 0.1 * vel_magnitude + +# 路径优化奖励,鼓励直线移动 +path_reward = 0.5 * direction_alignment +``` + +### 总奖励计算 + +```python +# 组合所有奖励组件 +rwd = distance_reward + target_bonus + continuous_reward + path_reward - center_penalty - control_penalty +``` + +--- + +## 初始状态 + +- 质点位置在[-1.0, 1.0]范围内随机初始化 +- 目标位置在[-1.5, 1.5]范围内随机初始化 +- 质点速度初始化为 0 + +## Episode 终止条件 + +- 质点到达目标并在目标内停留 0.5 秒 +- 模拟时间达到 10 秒 +- 观测值出现异常数值(NaN) + +--- + +## 使用指南 + +### 1. 环境预览 + +```bash +uv run scripts/view.py --env point_mass +``` + +### 2. 开始训练 + +```bash +uv run scripts/train.py --env point_mass +``` + +### 3. 查看训练进度 + +```bash +uv run tensorboard --logdir runs/point_mass +``` + +### 4. 测试训练结果 + +```bash +uv run scripts/play.py --env point_mass +``` + +--- + +## 预期训练结果 + +### 导航性能 + +1. 智能体学会直接向目标移动 +2. 移动平滑,控制 effort 最小 +3. 在 episode 持续时间内一致地到达目标 + +### 学习进度 + +1. 初始学习阶段迅速,智能体发现基本导航策略 +2. 控制策略逐渐精细化 +3. 在不同目标位置上表现稳定 + +### 行为特征 + +1. 朝向目标的高效路径规划 +2. 平滑接近目标中心 +3. 最小化过冲或振荡行为 diff --git a/docs/source/zh_CN/user_guide/demo/dm_quadruped.md b/docs/source/zh_CN/user_guide/demo/dm_quadruped.md new file mode 100644 index 0000000..9543d12 --- /dev/null +++ b/docs/source/zh_CN/user_guide/demo/dm_quadruped.md @@ -0,0 +1,290 @@ +# 四足机器人 + +四足机器人(Quadruped)是 DeepMind Control Suite 中的经典连续控制任务。在 MotrixLab 中,`motrix_envs/src/motrix_envs/basic/quadruped` 目录当前注册了四个可直接训练的任务:平地行走 `dm-quadruped-walk`、平地奔跑 `dm-quadruped-run`、复杂地形逃离 `dm-quadruped-escape`,以及平地推球到目标区 `dm-quadruped-fetch`。 + +## 任务预览 + +### Walk + +```{video} /_static/videos/dm_quadruped_walk.mp4 +:poster: _static/images/poster/dm_quadruped_walk.png +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +### Run + +```{video} /_static/videos/dm_quadruped_run.mp4 +:poster: _static/images/poster/dm_quadruped_run.png +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +### Escape + +```{video} /_static/videos/dm_quadruped_escape.mp4 +:poster: _static/images/poster/dm_quadruped_escape.png +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +### Fetch + +```{video} /_static/videos/dm_quadruped_fetch.mp4 +:poster: _static/images/poster/dm_quadruped_fetch.png +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +## 任务概览 + +| 环境 ID | 任务目标 | 模型文件 | 目标速度 | 观察维度 | +| --------------------- | -------------------------------- | ---------------------- | -------- | -------- | +| `dm-quadruped-walk` | 在平地上稳定向前行走并保持朝向 | `quadruped_walk.xml` | 0.5 m/s | 54 | +| `dm-quadruped-run` | 在平地上高速奔跑并保持稳定姿态 | `quadruped_walk.xml` | 5.0 m/s | 54 | +| `dm-quadruped-escape` | 在起伏地形上尽快向外逃离原点区域 | `quadruped_escape.xml` | 3.0 m/s | 57 | +| `dm-quadruped-fetch` | 在平地上将球体推动到目标区域 | `quadruped_fetch.xml` | 2.0 m/s | 66 | + +## 任务描述 + +Quadruped 是一个三维四足机器人任务。机器人主体由一个躯干和四条腿组成,每条腿具有偏航、抬升和伸展相关的控制能力。底层 XML 中定义了髋部、膝部和踝部的关节结构,而动作层采用每条腿 3 个执行器的耦合设计: + +- `yaw`:控制腿部偏航 +- `lift`:通过 tendon 耦合控制抬腿动作 +- `extend`:通过 tendon 耦合控制腿部伸展/收缩 + +`walk` 与 `run` 使用相同的平地模型,区别主要在目标速度;`escape` 使用带高度场的 `quadruped_escape.xml`,要求机器人在崎岖地形中快速远离世界原点,同时保持躯干直立和运动稳定;`fetch` 使用 `quadruped_fetch.xml`,在场景中额外引入自由球体与目标区域,要求机器人先调整到合适站位,再将球向目标方向推进。 + +--- + +## 动作空间(Action Space) + +| 项目 | 详细信息 | +| -------- | -------------------------------- | +| **类型** | `Box(low, high, (12,), float32)` | +| **维度** | 12 | + +动作按照四条腿依次排列,每条腿包含 `yaw / lift / extend` 三个执行器: + +| 序号 | 动作含义 | 最小值 | 最大值 | 对应执行器 | +| ---: | -------------- | :----: | :----: | -------------------- | +| 0 | 左前腿偏航控制 | -1.0 | 1.0 | `yaw_front_left` | +| 1 | 左前腿抬升控制 | -1.0 | 1.1 | `lift_front_left` | +| 2 | 左前腿伸展控制 | -0.8 | 0.8 | `extend_front_left` | +| 3 | 右前腿偏航控制 | -1.0 | 1.0 | `yaw_front_right` | +| 4 | 右前腿抬升控制 | -1.0 | 1.1 | `lift_front_right` | +| 5 | 右前腿伸展控制 | -0.8 | 0.8 | `extend_front_right` | +| 6 | 右后腿偏航控制 | -1.0 | 1.0 | `yaw_back_right` | +| 7 | 右后腿抬升控制 | -1.0 | 1.1 | `lift_back_right` | +| 8 | 右后腿伸展控制 | -0.8 | 0.8 | `extend_back_right` | +| 9 | 左后腿偏航控制 | -1.0 | 1.0 | `yaw_back_left` | +| 10 | 左后腿抬升控制 | -1.0 | 1.1 | `lift_back_left` | +| 11 | 左后腿伸展控制 | -0.8 | 0.8 | `extend_back_left` | + +--- + +## 观察空间 + +| 环境 | 详细信息 | +| --------------------- | -------------------------------- | +| `dm-quadruped-walk` | `Box(-inf, inf, (54,), float32)` | +| `dm-quadruped-run` | `Box(-inf, inf, (54,), float32)` | +| `dm-quadruped-escape` | `Box(-inf, inf, (57,), float32)` | +| `dm-quadruped-fetch` | `Box(-inf, inf, (66,), float32)` | + +四种任务共享绝大部分本体观测,`escape` 额外增加了 3 维与原点相关的任务信息,`fetch` 额外增加了球体状态与目标位置信息: + +| 部分 | 内容说明 | 维度 | `walk/run` | `escape` | `fetch` | +| ---------------------- | ------------------------------------ | ---- | ---------- | -------- | ------- | +| **egocentric dof pos** | 身体广义位置状态 | 16 | 是 | 是 | 是 | +| **egocentric dof vel** | 身体广义速度状态 | 16 | 是 | 是 | 是 | +| **actuator ctrl** | 当前 12 维执行器控制量 | 12 | 是 | 是 | 是 | +| **torso velocity** | 躯干线速度传感器 `velocimeter` | 3 | 是 | 是 | 是 | +| **torso upright** | 躯干朝上程度标量 | 1 | 是 | 是 | 是 | +| **imu** | IMU 加速度与角速度 | 6 | 是 | 是 | 是 | +| **origin** | 世界原点在本体坐标系中的位置 | 3 | 否 | 是 | 否 | +| **ball state** | 球相对本体的位置、相对线速度与角速度 | 9 | 否 | 否 | 是 | +| **target** | 目标区域在本体坐标系中的相对位置 | 3 | 否 | 否 | 是 | + +环境还在 XML 中定义了足端力/力矩传感器与质心传感器,但当前实现的默认观测并未直接拼接这些量。 + +--- + +## 奖励函数设计 + +四种任务都以“保持躯干直立”为核心约束。实现中首先根据 `torso_upright` 计算 `upright_reward`,要求机器人主体保持接近直立的姿态。 + +### Walk / Run + +`dm-quadruped-walk` 与 `dm-quadruped-run` 使用相同的奖励结构,只是目标速度不同: + +- `walk` 追踪 `0.5 m/s` +- `run` 追踪 `5.0 m/s` + +总奖励由以下部分组成: + +```python +# 速度奖励:沿前向达到目标速度 +# 姿态奖励:保持躯干直立 +# 辅助奖励:高度、横向稳定性、朝向一致性、动作平滑性 +# 惩罚项:后退、竖直速度过大、横滚/俯仰角速度过大、偏离默认姿态 +total_reward = upright_reward * move_reward + shaping_terms - penalty_terms +``` + +其中主要 shaping/penalty 项包括: + +- `height_reward`:鼓励躯干保持在站立高度附近 +- `lateral_reward`:抑制过大的横向速度 +- `heading_reward`:鼓励机器人持续朝 +X 方向前进 +- `smooth_reward`:惩罚相邻时刻动作变化过大 +- `backward_penalty`:抑制向后运动 +- `lin_vel_z_penalty` 与 `ang_vel_xy_penalty`:抑制上下颠簸和躯干横滚/俯仰过大 +- `similar_to_default_penalty`:鼓励关节姿态不要偏离默认站姿太远 + +### Escape + +`dm-quadruped-escape` 在 locomotion 奖励基础上,增加了“尽快逃离原点区域”的任务项。该任务使用 `quadruped_escape.xml` 中的高度场地形: + +```python +# 基础 locomotion 奖励 +# + 远离原点奖励 +# + 径向外逃速度奖励 +total_reward = locomotion_reward + upright_reward * escape_reward + radial_speed_reward +``` + +额外任务项包括: + +- `escape_reward`:根据机器人离原点区域的距离给出奖励 +- `radial_speed_reward`:鼓励沿着“远离原点”的方向加速前进 + +这使得 `escape` 不仅要求机器人跑得快,还要求它在复杂地形上沿正确方向脱离中心区域。 + +### Fetch + +`dm-quadruped-fetch` 使用一套面向“站位 + 推球”的专用 shaping 结构。当前实现中,奖励主要围绕机器人相对球和目标的几何关系展开: + +```python +# 站位阶段:鼓励机器人先移动到球后方或侧后方 +# 就绪阶段:鼓励机器人面向球、贴近球,并与球-目标连线对齐 +# 推球阶段:鼓励球向目标方向滚动,并最终进入目标区域 +# 惩罚项:反向移动、把球推离目标方向、腿部与球体过近 +total_reward = stage_terms + ready_terms + push_terms - penalty_terms +``` + +其中主要项包括: + +- `stage_move`:鼓励机器人朝当前阶段目标点移动 +- `stage_reach`:鼓励机器人先到达球后方或侧后方的站位点 +- `behind_align`:鼓励机器人站到球和目标连线的后方 +- `face_ball`:鼓励机体朝向球体 +- `near_ball`:鼓励机器人接近球体 +- `ready` 与 `ready_gate`:综合站位、朝向和距离关系,决定是否进入更积极的推球阶段 +- `fetch`:鼓励球体靠近目标区域 +- `push`:鼓励球沿目标方向滚动 +- `backward`:惩罚朝阶段目标的反向运动 +- `away`:惩罚把球推向远离目标的方向 +- `leg_ball`:惩罚腿部几何体与球体过近,减少“缠球”或挤球现象 + +此外,`fetch` 还通过 `stability` 门控同时约束躯干直立程度和机体高度,避免机器人通过明显跌倒或趴地的方式获取任务奖励。 + +--- + +## 初始状态 + +- `walk`、`run` 和 `escape` 都从 XML 中的默认四足站姿开始重置 +- 这三个任务的根关节朝向固定为初始朝向,不随机旋转 +- `fetch` 会在平面上随机初始化机器人位置与偏航角,同时随机初始化球体在地面上的位置 +- 所有任务的关节速度与球体速度都初始化为 0 +- 重置时会自动抬高机体,直到机器人与地面不发生初始穿透/碰撞 + +## Episode 终止条件 + +- 最大时长为 20 秒 +- 当观测中出现 `NaN` 时,episode 终止 +- `walk`、`run` 与 `escape` 当前实现没有单独设置“跌倒即终止”的条件 +- `fetch` 在机体明显跌倒时会提前终止,条件包括躯干直立程度过低或躯干高度过低 +- 当前实现尚未单独设置“球进入目标区域即成功终止”的条件 + +--- + +## 使用指南 + +### 1. 环境预览 + +```bash +uv run scripts/view.py --env dm-quadruped-walk +uv run scripts/view.py --env dm-quadruped-run +uv run scripts/view.py --env dm-quadruped-escape +uv run scripts/view.py --env dm-quadruped-fetch +``` + +### 2. 开始训练 + +```bash +uv run scripts/train.py --env dm-quadruped-walk +uv run scripts/train.py --env dm-quadruped-run +uv run scripts/train.py --env dm-quadruped-escape +uv run scripts/train.py --env dm-quadruped-fetch +``` + +### 3. 查看训练进度 + +```bash +uv run tensorboard --logdir runs/dm-quadruped-walk +uv run tensorboard --logdir runs/dm-quadruped-run +uv run tensorboard --logdir runs/dm-quadruped-escape +uv run tensorboard --logdir runs/dm-quadruped-fetch +``` + +### 4. 测试训练结果 + +```bash +uv run scripts/play.py --env dm-quadruped-walk +uv run scripts/play.py --env dm-quadruped-run +uv run scripts/play.py --env dm-quadruped-escape +uv run scripts/play.py --env dm-quadruped-fetch +``` + +--- + +## 预期训练结果 + +### 行走任务(`dm-quadruped-walk`) + +1. 稳定维持接近 `0.5 m/s` 的平地前进速度 +2. 身体姿态平稳,横向摆动较小 +3. 能够持续保持朝 +X 方向行走 + +### 奔跑任务(`dm-quadruped-run`) + +1. 速度提升到接近或超过 `5.0 m/s` +2. 步幅明显增大,动作具有更强爆发性 +3. 高速运动下仍能保持较好的躯干稳定性 + +### 逃离任务(`dm-quadruped-escape`) + +1. 能够快速离开原点附近区域 +2. 在高度场地形上保持稳定落脚,不易侧翻 +3. 运动方向以向外逃离为主,而不是原地打转 + +### 推球任务(`dm-quadruped-fetch`) + +1. 能够先调整到球和目标连线的合理站位,而不是直接从侧面乱撞球 +2. 能够稳定地将球向目标区域推进,而不是把球踢飞或持续推离目标 +3. 在推球过程中保持较好的机体稳定性,减少趴地、翻倒和腿部缠球现象 diff --git a/docs/source/zh_CN/user_guide/demo/locomotion_unitree_go1.md b/docs/source/zh_CN/user_guide/demo/locomotion_unitree_go1.md index 22d49a9..b496d9c 100644 --- a/docs/source/zh_CN/user_guide/demo/locomotion_unitree_go1.md +++ b/docs/source/zh_CN/user_guide/demo/locomotion_unitree_go1.md @@ -61,25 +61,14 @@ GO1 环境的观测空间由以下部分组成(按顺序): GO1 的奖励函数是一个复杂的复合函数,包含多个组件: -```python -# 主要奖励组件 -reward_config.scales = { - "tracking_lin_vel": 1.0, # 线速度跟踪奖励 - "tracking_ang_vel": 0.5, # 角速度跟踪奖励 - "feet_air_time": 1.0, # 足部空中时间奖励 - "lin_vel_z": -2.0, # Z轴线速度惩罚 - "ang_vel_xy": -0.05, # XY轴角速度惩罚 - "orientation": -0.0, # 姿态偏离惩罚 - "torques": -0.00001, # 力矩消耗惩罚 - "dof_acc": -2.5e-7, # 关节加速度惩罚 - "action_rate": -0.001, # 动作变化率惩罚 - "hip_pos": -1, # 髋关节位置惩罚 - "calf_pos": -0.3, # 腿关节位置惩罚 -} - -# 总奖励 = 加权组合以上所有项 +```{literalinclude} ../../../../motrix_envs/src/motrix_envs/locomotion/go1/cfg.py +:language: python +:start-after: '# -- docs-tag-start: go1-reward-config --' +:end-before: '# -- docs-tag-end: go1-reward-config --' ``` +_总奖励 = 加权组合以上所有项_ + --- ## 初始状态 diff --git a/docs/source/zh_CN/user_guide/demo/locomotion_unitree_go1_rough_terrain.md b/docs/source/zh_CN/user_guide/demo/locomotion_unitree_go1_rough_terrain.md index 54dd9e3..97f3628 100644 --- a/docs/source/zh_CN/user_guide/demo/locomotion_unitree_go1_rough_terrain.md +++ b/docs/source/zh_CN/user_guide/demo/locomotion_unitree_go1_rough_terrain.md @@ -86,25 +86,14 @@ Unitree GO1 复杂地形行走环境是一个四足机器人强化学习任务 GO1 复杂地形的奖励函数采用多目标加权设计: -```python -# 核心奖励组件 -reward_config.scales = { - "tracking_lin_vel": 1.0, # 线速度跟踪精度 - "tracking_ang_vel": 0.5, # 角速度跟踪精度 - "orientation": -0.0, # 身体姿态稳定性惩罚 - "torques": -0.00001, # 关节力矩惩罚(能量效率) - "dof_acc": -2.5e-7, # 关节加速度惩罚 - "action_rate": -0.001, # 动作平滑性惩罚 - "feet_air_time": 1.0, # 足部空中时间奖励(鼓励大步幅) - "stand_still": 0.0, # 静止指令的关节位置保持 - "hip_pos": -1, # 髋关节位置偏好 - "calf_pos": -0.3, # 小腿关节位置偏好 - "feet_stumble": -0.5, # 当足部横向触碰障碍物时施加惩罚 -} - -# 总奖励 = 加权组合以上所有项 +```{literalinclude} ../../../../motrix_envs/src/motrix_envs/locomotion/go1/cfg.py +:language: python +:start-after: '# -- docs-tag-start: go1-reward-config --' +:end-before: '# -- docs-tag-end: go1-reward-config --' ``` +_总奖励 = 加权组合以上所有项_ + --- ## 初始状态 diff --git a/docs/source/zh_CN/user_guide/demo/pendulum.md b/docs/source/zh_CN/user_guide/demo/pendulum.md index f7a5394..eb483b1 100644 --- a/docs/source/zh_CN/user_guide/demo/pendulum.md +++ b/docs/source/zh_CN/user_guide/demo/pendulum.md @@ -104,30 +104,18 @@ uv run scripts/play.py --env pendulum --policy runs/pendulum/nn/best_policy.pick ### 环境配置(示例) -```python -@dataclass -class PendulumEnvCfg(EnvCfg): - model_file: str = ".../pendulum.xml" # MJCF 模型,默认 gear=5 - max_episode_seconds: float = 20.0 - sim_dt: float = 0.0125 - ctrl_dt: float = 0.025 +```{literalinclude} ../../../../motrix_envs/src/motrix_envs/basic/pendulum/cfg.py +:language: python +:start-after: '# -- docs-tag-start: pendulum-env-cfg --' +:end-before: '# -- docs-tag-end: pendulum-env-cfg --' ``` ### 训练配置(示例 PPO) -```python -@rlcfg("pendulum") -@dataclass -class PendulumPPO(PPOCfg): - seed: int = 42 - max_env_steps: int = 10_000_000 - num_envs: int = 1024 - learning_rate: float = 3e-4 - rollouts: int = 32 - learning_epochs: int = 5 - mini_batches: int = 4 - policy_hidden_layer_sizes: tuple[int, ...] = (64, 64) - value_hidden_layer_sizes: tuple[int, ...] = (64, 64) +```{literalinclude} ../../../../motrix_rl/src/motrix_rl/tasks/pendulum.py +:language: python +:start-after: '# -- docs-tag-start: pendulum-train-cfg --' +:end-before: '# -- docs-tag-end: pendulum-train-cfg --' ``` --- diff --git a/docs/source/zh_CN/user_guide/demo/rm65_open_cabinet.md b/docs/source/zh_CN/user_guide/demo/rm65_open_cabinet.md new file mode 100644 index 0000000..9ba8ec4 --- /dev/null +++ b/docs/source/zh_CN/user_guide/demo/rm65_open_cabinet.md @@ -0,0 +1,258 @@ +# RM65 打开抽屉 + +## 概述 + +本文档描述 `rm65-open-cabinet` 操作任务环境。该环境使用 RM65 六自由度机械臂与并联夹爪,目标是接近柜体底部抽屉把手、完成抓取并将抽屉拉开。 + +```{video} /_static/videos/rm65_open_cabinet.mp4 +:poster: _static/images/poster/rm65_open_cabinet.png +:nocontrols: +:autoplay: +:playsinline: +:muted: +:loop: +:width: 100% +``` + +--- + +## 环境描述 + +该任务基于 RM65 机械臂和柜体抽屉场景构建。虽然环境注册名为 `rm65-open-cabinet`,但当前实际操作对象是柜体底部抽屉,代码中对应目标为 `drawer_bottom_handle` 与 `drawer_bottom_joint`。 + +### 机器人结构 + +RM65 机器人在该环境中包含以下主要部分: + +- **基座(base_link)**:固定在工作台前方 +- **6 个机械臂关节**:`joint_1` ~ `joint_6` +- **并联夹爪**:主驱动关节为 `gripper_Left_1_Joint`,其余 5 个夹爪关节通过联动关系同步 +- **末端执行器(TCP)**:`gripper` 站点,用于计算末端与把手的相对位姿 +- **手指接触点**:`left_finger_pad`、`right_finger_pad`,用于判定是否对准把手以及是否发生穿透 + +### 场景物体 + +- **柜体**:包含多个门和抽屉 +- **目标把手**:`drawer_bottom_handle` +- **目标关节**:`drawer_bottom_joint`,滑动范围为 `0.0 ~ 0.4 m` + +### 任务目标 + +机器人需要完成以下阶段: + +1. **靠近把手**:将末端执行器移动到抽屉把手附近 +2. **姿态对齐**:让夹爪姿态与把手姿态匹配 +3. **稳定抓取**:闭合夹爪并连续保持抓取 +4. **打开抽屉**:沿抽屉滑动方向将底部抽屉拉开 + +--- + +## 动作空间 + +动作空间为 `Box(-inf, inf, (7,), float32)`。 + +其中前 6 维控制机械臂关节目标,最后 1 维控制夹爪开合。 + +### 控制模式 + +- **机械臂**:默认使用 `joint_target` 模式,并启用归一化目标控制 + 机械臂动作会先裁剪到 `[-1, 1]`,再线性映射到各关节控制范围 +- **夹爪**:默认使用 `binary` 模式 + 原始动作经过 Sigmoid 映射为闭合概率,再通过带迟滞的二值开关决定夹爪开闭 + +### 动作维度详细说明 + +| 编号 | 动作说明 | 原始输入范围 | 实际控制对象 | +| ---- | ------------ | ------------- | ---------------------- | +| 0 | 关节 1 目标 | `(-inf, inf)` | `joint_1` | +| 1 | 关节 2 目标 | `(-inf, inf)` | `joint_2` | +| 2 | 关节 3 目标 | `(-inf, inf)` | `joint_3` | +| 3 | 关节 4 目标 | `(-inf, inf)` | `joint_4` | +| 4 | 关节 5 目标 | `(-inf, inf)` | `joint_5` | +| 5 | 关节 6 目标 | `(-inf, inf)` | `joint_6` | +| 6 | 夹爪开合命令 | `(-inf, inf)` | `gripper_Left_1_Joint` | + +### 控制约束 + +- 控制周期 `ctrl_dt = 0.025s`,对应 40Hz 控制频率 +- 机械臂默认启用速度限制、加速度限制、动作延迟与执行器一阶滞后 +- 训练时会在每个 episode 内随机化机械臂延迟、滞后、速度上限和加速度上限,以增强 sim2real 鲁棒性 +- 夹爪使用迟滞阈值控制: + - 开启到闭合阈值:`0.78` + - 闭合到开启阈值:`0.62` + - 最小切换间隔:`0.25s` + +--- + +## 观测空间 + +观测空间为 `Box(-inf, inf, (84,), float32)`,最终观测会裁剪到 `[-5, 5]`。 + +### 观测组成 + +观测由以下 4 部分拼接而成: + +1. **关节位置(7 维)** + - 6 个机械臂关节 + - 1 个夹爪主驱动关节 + - 统一归一化到 `[-1, 1]` +2. **关节速度(7 维)** + - 使用相邻两帧关节位置差分估计 + - 再除以 `2` 做缩放 +3. **目标相对位姿(7 维)** + - 末端到把手的相对位置 `Δx, Δy, Δz` + - 把手相对末端的四元数姿态差 +4. **动作历史(63 维)** + - 最近 `9` 步原始动作历史 + - 每步 `7` 维,共 `9 × 7 = 63` 维 + +### 观测维度详细说明 + +| 编号范围 | 内容说明 | 维度 | +| -------- | -------------------------- | ---- | +| 0-6 | 归一化关节位置 | 7 | +| 7-13 | 关节速度 | 7 | +| 14-16 | 末端到把手的相对位置 | 3 | +| 17-20 | 末端到把手的相对姿态四元数 | 4 | +| 21-83 | 最近 9 步动作历史 | 63 | + +### 观测噪声 + +该环境默认开启 sim2real 观测扰动,主要包括: + +- 关节位置与速度噪声 +- 把手位置与姿态噪声 +- 把手观测偏置 +- 把手观测随机丢帧,并在丢帧时保持上一帧结果 + +--- + +## 奖励函数 + +奖励函数采用分阶段复合设计,既鼓励接近与对齐,也鼓励稳定抓取和持续拉开抽屉。 + +### 主要奖励项 + +1. **距离奖励** + + ```python + dist_reward = 15.0 * (1 - tanh(distance / 0.4)) + ``` + + 鼓励末端执行器持续靠近把手。 + +2. **姿态奖励** + + 基于末端姿态与把手姿态的四元数相似度计算,并仅在末端距离把手较近时生效。 + +3. **夹爪闭合奖励** + + 当末端距离小于 `0.035m` 且左右手指在把手上下方对齐时,闭合夹爪可获得正奖励; + 否则闭合会受到惩罚。该项还会随夹爪闭合程度缩放。 + +4. **抽屉打开奖励** + + ```python + open_reward = (exp(open_dist) - 1.0) * 420.0 + ``` + + 只有在满足“已经抓住或进入抓取阶段”且末端仍靠近把手时才生效。 + +5. **抽屉增量奖励** + + 对本步新增的打开距离给予额外奖励,鼓励稳定、连续地拉动抽屉。 + +6. **稳定抓取奖励** + + 当末端距离小于 `0.03m`、夹爪闭合比例大于 `0.7`,并持续保持 `6` 步后,环境认为已经抓住把手,并提供持续奖励。 + +7. **里程碑奖励** + + - 抽屉打开超过 `0.15m` 时奖励 `35` + - 抽屉打开超过 `0.22m` 时额外奖励 `70` + +### 惩罚项 + +1. **滑脱惩罚** + + 如果已经进入抓取阶段但后来失去抓取,同时抽屉已经被拉开,则施加额外惩罚。 + +2. **手指穿透惩罚** + + 当手指接触点穿过把手上下边界时施加惩罚,用于抑制不合理接触。 + +3. **夹爪频繁切换惩罚** + + 当末端靠近把手时,频繁在开合之间切换会触发惩罚。 + +4. **动作变化惩罚** + + 对相邻两步动作差的平方和施加惩罚。 + +5. **关节速度惩罚** + + 对关节速度平方和施加惩罚,后期训练权重更高。 + +6. **终止惩罚** + + 当触发终止条件时,额外施加 `-10.0` 惩罚。 + +--- + +## 初始状态 + +### 机器人初始化 + +- 机械臂默认关节初值为零位姿 +- 夹爪默认处于张开状态 +- 复位时默认不添加关节角随机噪声 +- 所有关节速度初始化为零 + +### 场景初始化 + +- 目标抽屉初始为完全关闭状态 +- 抽屉与柜体其余部分固定在场景默认位置 + +### 随机化内容 + +每次 reset 会重新采样部分 sim2real 参数,包括: + +- 机械臂动作延迟 +- 机械臂执行器滞后 +- 机械臂速度/加速度上限 +- 把手观测偏置 + +--- + +## Episode 终止条件 + +以下任一条件满足时,episode 会提前终止: + +1. **TCP 落到把手后方过多** + - 终止阈值:`tcp_x - handle_x < -0.02` +2. **关节速度过大** + - 任意机器人关节速度绝对值超过 `3.93 rad/s` + +此外,环境最大时长为 `30s`。 + +--- + +## 使用方法 + +### 训练 + +```bash +uv run scripts/train.py --env rm65-open-cabinet --train-backend torch +``` + +### 策略评估 + +```bash +uv run scripts/play.py --env rm65-open-cabinet +``` + +### TensorBoard + +```bash +uv run tensorboard --logdir runs/rm65_open_cabinet +``` diff --git a/docs/source/zh_CN/user_guide/getting_started/installation.md b/docs/source/zh_CN/user_guide/getting_started/installation.md index b1304fc..c30697a 100644 --- a/docs/source/zh_CN/user_guide/getting_started/installation.md +++ b/docs/source/zh_CN/user_guide/getting_started/installation.md @@ -89,4 +89,7 @@ uv sync --all-packages --extra skrl-jax # 安装 SKRL PyTorch uv sync --all-packages --extra skrl-torch + +# 安装 RSLRL(仅支持 PyTorch) +uv sync --all-packages --extra rslrl ``` diff --git a/docs/source/zh_CN/user_guide/index.md b/docs/source/zh_CN/user_guide/index.md index 418089d..90e6cf0 100644 --- a/docs/source/zh_CN/user_guide/index.md +++ b/docs/source/zh_CN/user_guide/index.md @@ -34,14 +34,18 @@ demo/dm_walker demo/dm_cheetah demo/dm_hopper demo/dm_reacher +demo/dm_lqr demo/dm_finger demo/dm_humanoid +demo/dm_quadruped demo/bring_ball +demo/dm_point_mass demo/locomotion_unitree_go1 demo/locomotion_unitree_go1_rough_terrain demo/anymal_c demo/franka_lift_cube demo/franka_open_cabinet +demo/rm65_open_cabinet demo/shadow_hand_repose ``` diff --git a/docs/source/zh_CN/user_guide/tutorial/basic_frame.md b/docs/source/zh_CN/user_guide/tutorial/basic_frame.md index ee12e05..d33c4f5 100644 --- a/docs/source/zh_CN/user_guide/tutorial/basic_frame.md +++ b/docs/source/zh_CN/user_guide/tutorial/basic_frame.md @@ -16,6 +16,7 @@ MotrixLab/ │ └── registry.py # 环境注册系统 ├── motrix_rl/ # 训练层:RL算法和配置 │ ├── skrl/ # SKRL框架集成(JAX/PyTorch) +│ ├── rslrl/ # RSLRL框架集成(PyTorch) │ ├── base.py # RL配置基类 │ └── registry.py # RL配置注册系统 └── scripts @@ -34,7 +35,7 @@ MotrixLab/ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ -│ 训练算法层 (SKRL) │ +│ 训练算法层 (SKRL / RSLRL) │ │ PPO训练器 │ 网络架构 │ 优化器 │ └─────────────────────────────────────────────────────────────────┘ │ @@ -128,13 +129,15 @@ train.py --env cartpole - **奖励配置**影响学习信号(奖励权重、计算方式等) - **训练配置**控制算法行为(网络结构、学习率、批次大小等) -## 多后端支持 +## 多框架支持 -MotrixLab 的分层设计天然支持多种后端: +MotrixLab 的分层设计天然支持多种 RL 框架: -- **仿真后端**:MotrixSim -- **训练后端**:JAX 和 PyTorch,支持 GPU 加速 -- **算法框架**:主要集成 SKRL,易于扩展其他算法 +- **仿真后端**:MotrixSim(CPU) +- **训练框架**: + - **SKRL**:支持 JAX 和 PyTorch 后端,支持 GPU 加速 + - **RSLRL**:支持 PyTorch 后端,支持 GPU 加速 +- **框架选择**:使用 `--rllib` 参数在 `skrl`(默认)和 `rslrl` 之间选择 ## 设计优势 diff --git a/docs/source/zh_CN/user_guide/tutorial/training_and_result.md b/docs/source/zh_CN/user_guide/tutorial/training_and_result.md index 66b09c0..28d1474 100644 --- a/docs/source/zh_CN/user_guide/tutorial/training_and_result.md +++ b/docs/source/zh_CN/user_guide/tutorial/training_and_result.md @@ -7,41 +7,62 @@ ### 基本训练命令 ```bash -# 使用默认参数训练 +# 使用默认参数训练(SKRL 框架) uv run scripts/train.py --env cartpole +# 指定 RL 框架 +uv run scripts/train.py --env cartpole --rllib skrl +uv run scripts/train.py --env cartpole --rllib rslrl + # 指定仿真后端 uv run scripts/train.py --env cartpole --sim-backend np -# 指定训练后端 -uv run scripts/train.py --env cartpole --train-backend jax -uv run scripts/train.py --env cartpole --train-backend torch +# 指定训练后端(仅 SKRL) +uv run scripts/train.py --env cartpole --rllib skrl --train-backend jax +uv run scripts/train.py --env cartpole --rllib skrl --train-backend torch ``` ### 高级训练配置 ```bash -# 自定义训练参数 +# 使用 SKRL 自定义训练参数 uv run scripts/train.py --env cartpole \ + --rllib skrl \ --num-envs 1024 \ --train-backend jax \ --sim-backend np +# 使用 RSLRL 自定义训练参数 +uv run scripts/train.py --env cartpole \ + --rllib rslrl \ + --num-envs 1024 \ + --sim-backend np + # 注意:学习率等参数需要通过配置文件或代码覆盖设置 # 启用渲染监控训练过程 uv run scripts/train.py --env cartpole --render ``` +### 不同框架配置 + +系统支持不同的 RL 框架,具有不同的配置系统: + +- **SKRL 框架**:支持 JAX 和 PyTorch 训练后端,可通过 Python 数据类为每个后端配置参数 +- **RSLRL 框架**:支持 PyTorch 后端,通过 Python 数据类(RslrlCfg)进行配置 + +对于 SKRL,系统支持为不同训练后端(JAX/Torch)配置不同的强化学习参数。例如: + ### 支持的命令行参数 -| 参数 | 说明 | 默认值 | -| ----------------- | -------------------- | ---------- | -| `--env` | 环境名称 | `cartpole` | -| `--sim-backend` | 仿真后端 (np) | 自动选择 | -| `--train-backend` | 训练后端 (jax/torch) | 自动选择 | -| `--num-envs` | 并行环境数量 | 2048 | -| `--render` | 启用渲染 | False | +| 参数 | 说明 | 默认值 | +| ----------------- | ----------------------------- | ---------- | +| `--env` | 环境名称 | `cartpole` | +| `--rllib` | RL 框架 (skrl/rslrl) | `skrl` | +| `--sim-backend` | 仿真后端 (np) | 自动选择 | +| `--train-backend` | 训练后端 (jax/torch,仅 SKRL) | 自动选择 | +| `--num-envs` | 并行环境数量 | 2048 | +| `--render` | 启用渲染 | False | > **注意**: 其他参数如学习率、网络结构等需要通过单独文件设置。 diff --git a/docs/source/zh_CN/user_guide/tutorial/training_environment_config.md b/docs/source/zh_CN/user_guide/tutorial/training_environment_config.md index 9da2ad1..f6b6630 100644 --- a/docs/source/zh_CN/user_guide/tutorial/training_environment_config.md +++ b/docs/source/zh_CN/user_guide/tutorial/training_environment_config.md @@ -2,85 +2,80 @@ MotrixLab 提供了灵活的配置系统,允许用户自定义强化学习训练参数。本节介绍如何配置训练环境和强化学习算法参数。 -## RL 训练配置 (PPOCfg) +## RL 训练配置 + +MotrixLab 支持多个 RL 框架,具有不同的配置系统: + +- **SKRL 框架**:使用 Python 数据类配置(SkrlCfg) +- **RSLRL 框架**:使用 Python 数据类配置(RslrlCfg) + +### SKRL 配置 (SkrlCfg) 训练配置定义了基于 PPO 算法的强化学习算法的参数。MotrixLab 现在支持为不同训练后端配置不同的参数。 -### 完整配置示例 +#### 完整配置示例 -```python -@dataclass -class CompletePPOConfig(PPOCfg): - """ - 完整的强化学习训练配置示例 - 包含了从基础到高级的所有配置参数 - """ +以下是 `CartPoleSkrlPpo` 的实际配置,展示了完整的显式参数填充方法。该配置使用较小的网络 `[32, 32]`,适合 CartPole 这样的简单任务。 - # ===== 基础训练参数 ===== - seed: Optional[int] = None # 随机种子 - num_envs: int = 2048 # 训练时并行环境数量 - play_num_envs: int = 16 # 评估时并行环境数量 - max_env_steps: int = 2_048_000 # 最大训练步数 - check_point_interval: int = 1000 # 检查点保存间隔 - - # ===== PPO算法核心参数 ===== - learning_rate: float = 3e-4 # 学习率 - rollouts: int = 32 # 经验回放轮数 - learning_epochs: int = 2 # 每次更新的训练轮数 - mini_batches: int = 32 # 小批量数量 - discount_factor: float = 0.99 # 折扣因子 - lambda_param: float = 0.95 # GAE参数 - grad_norm_clip: float = 1.0 # 梯度裁剪 - - # ===== PPO裁剪参数 ===== - ratio_clip: float = 0.2 # PPO裁剪比率 - value_clip: float = 0.2 # 价值裁剪 - clip_predicted_values: bool = True # 裁剪预测值 - - # ===== 损失函数参数 ===== - entropy_loss_scale: float = 0.0 # 熵损失系数 - value_loss_scale: float = 2.0 # 价值损失系数 - kl_threshold: float = 0 # KL散度阈值 - - # ===== 学习率调度器 ===== - learning_rate_scheduler_kl_threshold: float = 0.008 # 自适应学习率KL阈值 - - # ===== 网络架构配置 ===== - # 小型网络(适合简单任务如 CartPole) - # policy_hidden_layer_sizes: tuple[int, ...] = (128, 64) - # value_hidden_layer_sizes: tuple[int, ...] = (128, 64) - - # 中型网络(默认配置,适合大部分任务) - policy_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - value_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - - # 大型网络(适合复杂任务如机器人控制) - # policy_hidden_layer_sizes: tuple[int, ...] = (512, 256, 128) - # value_hidden_layer_sizes: tuple[int, ...] = (512, 256, 128) - - # ===== 网络共享配置 ===== - share_policy_value_features: bool = True # 策略和价值网络共享特征提取层 - - # ===== 训练控制参数 ===== - random_timesteps: int = 0 # 随机步数 - learning_starts: int = 0 # 开始学习的步数 - time_limit_bootstrap: bool = True # 时间限制引导 - - # ===== 奖励整形 ===== - rewards_shaper_scale: float = 1.0 # 奖励缩放因子 +```{literalinclude} ../../../../motrix_rl/src/motrix_rl/tasks/cartpole.py +:language: python +:start-after: docs-start: cartpole-skrl-config +:end-before: docs-end: cartpole-skrl-config ``` +**关键配置说明:** + +- **网络架构**: `hiddens=[32, 32]` - CartPole 是简单任务,使用小网络即可(默认: `[256, 128, 64]`) +- **训练轮数**: `learning_epochs=5` - 比默认值 2 更高,确保充分学习 +- **小批量数量**: `mini_batches=4` - 比默认值 32 更少,适合简单任务 +- **训练时长**: `timesteps=5000` - 对于 CartPole 来说已经足够(默认: 10000) +- **所有参数**: 从父类继承的所有参数都被显式指定,无隐藏默认值 + +完整的源代码请参考: [`motrix_rl/src/motrix_rl/tasks/cartpole.py`](https://github.com/Motphys/motrix-lab/blob/main/motrix_rl/src/motrix_rl/tasks/cartpole.py) + +### RSLRL 配置 (RslrlCfg) + +RSLRL 是另一个高性能强化学习库,专门用于四足机器人等复杂控制任务。 + +#### 完整配置示例 + +以下是 `CartPoleRslrlPpo` 的实际配置,展示了完整的显式参数填充方法。该配置使用较小的网络 `[32, 32]`,适合 CartPole 这样的简单任务。 + +```{literalinclude} ../../../../motrix_rl/src/motrix_rl/tasks/cartpole.py +:language: python +:start-after: docs-start: cartpole-rslrl-config +:end-before: docs-end: cartpole-rslrl-config +``` + +**关键配置说明:** + +- **网络架构**: `hidden_dims=[32, 32]` - CartPole 是简单任务,使用小网络即可(默认: `[256, 128, 64]`) +- **训练迭代**: `max_iterations=300` - 总共训练 300 次迭代 +- **每轮步数**: `num_steps_per_env=16` - 每个环境收集 16 步 +- **学习率**: `learning_rate=5.0e-4` - 学习率设置 +- **熵系数**: `entropy_coef=5e-3` - 熵系数,用于探索 +- **所有参数**: 从父类继承的所有参数都被显式指定,无隐藏默认值 + +详细的 RSLRL 配置选项和默认值,请参考: + +- `motrix_rl/rslrl/cfg.py`:配置类定义 +- `motrix_rl/template/rslrl_config.yaml`:YAML 参考模板 + ## 配置使用方法 ### 1. 默认配置使用 ```bash -# 使用代码中给定的配置 +# 使用代码中给定的配置(默认:SKRL 框架) uv run scripts/train.py --env my-task -# 指定训练后端,系统会自动选择对应的后端配置 -uv run scripts/train.py --env my-task --train-backend jax -uv run scripts/train.py --env my-task --train-backend torch +# 指定 RL 框架 +uv run scripts/train.py --env my-task --rllib skrl +uv run scripts/train.py --env my-task --rllib rslrl + +# 指定 SKRL 的训练后端,系统会自动选择对应的后端配置 +uv run scripts/train.py --env my-task --rllib skrl --train-backend jax +uv run scripts/train.py --env my-task --rllib skrl --train-backend torch ``` ### 2. 命令行参数覆盖 @@ -88,91 +83,10 @@ uv run scripts/train.py --env my-task --train-backend torch ```bash # 覆盖支持的命令行参数 uv run scripts/train.py --env my-task \ + --rllib skrl \ --num-envs 1024 \ --train-backend jax \ --sim-backend np # 系统会自动选择JAX后端对应的配置 ``` - -### 3. 配置优先级 - -系统按以下优先级选择配置: - -1. **后端特定配置**: 如果存在 `@rlcfg(env_name, backend="jax/torch")` 装饰的配置 -2. **通用配置**: 如果存在 `@rlcfg(env_name)` 装饰的配置(无 backend 参数) - -例如: - -```python -# 最高优先级 - 后端特定配置 -@rlcfg("my-task", backend="jax") -@dataclass -class MyTaskJAXCfg(PPOCfg): - mini_batches: int = 4 - -# 次优先级 - 通用配置 -@rlcfg("my-task") -@dataclass -class MyTaskRLCfg(PPOCfg): - mini_batches: int = 32 - -# 当使用 --train-backend jax 时,系统会选择 MyTaskJAXCfg -# 当使用 --train-backend torch 时,系统会选择 MyTaskRLCfg -``` - -## SKRL 框架配置映射 - -在 MotrixLab 中,用户通过 `PPOCfg` 配置类设置参数,这些参数会被映射到 SKRL 框架的配置字典中。 - -### 用户可配置参数 - -| MotrixLab 配置类 | SKRL 框架参数 | 说明 | -| -------------------------------------- | --------------------------------------------- | -------------------- | -| `learning_rate` | `learning_rate` | 学习率 | -| `rollouts` | `rollouts` | 经验回放轮数 | -| `learning_epochs` | `learning_epochs` | 训练轮数 | -| `mini_batches` | `mini_batches` | 小批量数量 | -| `discount_factor` | `discount_factor` | 折扣因子 | -| `grad_norm_clip` | `grad_norm_clip` | 梯度裁剪 | -| `lambda_param` | `lambda` | GAE 参数 | -| `ratio_clip` | `ratio_clip` | PPO 裁剪比率 | -| `value_clip` | `value_clip` | 价值裁剪 | -| `clip_predicted_values` | `clip_predicted_values` | 裁剪预测值 | -| `entropy_loss_scale` | `entropy_loss_scale` | 熵损失系数 | -| `value_loss_scale` | `value_loss_scale` | 价值损失系数 | -| `kl_threshold` | `kl_threshold` | KL 散度阈值 | -| `random_timesteps` | `random_timesteps` | 随机步数 | -| `learning_starts` | `learning_starts` | 开始学习的步数 | -| `time_limit_bootstrap` | `time_limit_bootstrap` | 时间限制引导 | -| `learning_rate_scheduler_kl_threshold` | `learning_rate_scheduler_kwargs.kl_threshold` | 自适应学习率 KL 阈值 | -| `check_point_interval` | `experiment.write_interval` | 日志写入间隔 | -| `check_point_interval` | `experiment.checkpoint_interval` | 检查点保存间隔 | -| `rewards_shaper_scale` | `rewards_shaper` | 奖励缩放函数 | - -### 预处理器参数 - -| SKRL 框架参数 | 类型 | 说明 | -| -------------------- | --------------------- | ---------- | -| `state_preprocessor` | RunningStandardScaler | 状态标准化 | -| `value_preprocessor` | RunningStandardScaler | 价值标准化 | - -### 配置层次总结 - -``` -用户配置类 (PPOCfg) - ↓ 后端特定选择 -后端配置 (JAX/Torch) - ↓ 参数映射 -SKRL 框架配置字典 - ↓ 传递给 -PPO Agent - ↓ 执行 -强化学习训练 -``` - -这种设计允许用户: - -1. 通过简单的配置类来控制复杂的训练参数 -2. 为不同训练后端配置不同的参数以获得最佳性能 -3. 保持与 SKRL 框架的完全兼容性 diff --git a/motrix_envs/pyproject.toml b/motrix_envs/pyproject.toml index 1503cde..7f3d2f9 100644 --- a/motrix_envs/pyproject.toml +++ b/motrix_envs/pyproject.toml @@ -4,12 +4,12 @@ build-backend = "uv_build" [project] name = "motrix-envs" -version = "0.2.0" +version = "0.3.0" description = "Robot simulation environment library based on MotrixSim providing multi-task RL environments." authors = [{ name = "Motphys", email = "developers@motphys.com" }] requires-python = "==3.10.*" readme = "README.md" license = "Apache-2.0" dependencies = [ - "motrixsim>=0.6.0b1", + "motrixsim>=0.7.0", ] diff --git a/motrix_envs/src/motrix_envs/basic/__init__.py b/motrix_envs/src/motrix_envs/basic/__init__.py index ae1b43d..ac1a3fc 100644 --- a/motrix_envs/src/motrix_envs/basic/__init__.py +++ b/motrix_envs/src/motrix_envs/basic/__init__.py @@ -21,8 +21,11 @@ from . import ( # noqa: F401 import to register envs finger, hopper, humanoid, + lqr, manipulator, pendulum, + point_mass, + quadruped, reacher, walker, ) diff --git a/motrix_envs/src/motrix_envs/basic/acrobot/cfg.py b/motrix_envs/src/motrix_envs/basic/acrobot/cfg.py index 14ba97e..21e4549 100644 --- a/motrix_envs/src/motrix_envs/basic/acrobot/cfg.py +++ b/motrix_envs/src/motrix_envs/basic/acrobot/cfg.py @@ -22,6 +22,7 @@ from motrix_envs.base import EnvCfg model_file = os.path.dirname(__file__) + "/acrobot.xml" +# -- docs-tag-start: acrobot-env-cfg -- @registry.envcfg("acrobot") @dataclass class AcrobotEnvCfg(EnvCfg): @@ -31,3 +32,6 @@ class AcrobotEnvCfg(EnvCfg): render_spacing: float = 2.0 sim_dt: float = 0.01 ctrl_dt: float = 0.02 + + +# -- docs-tag-end: acrobot-env-cfg -- diff --git a/motrix_envs/src/motrix_envs/basic/finger/cfg.py b/motrix_envs/src/motrix_envs/basic/finger/cfg.py index 63d9e11..2ce50a7 100644 --- a/motrix_envs/src/motrix_envs/basic/finger/cfg.py +++ b/motrix_envs/src/motrix_envs/basic/finger/cfg.py @@ -28,7 +28,7 @@ turn_hard_model_file = os.path.dirname(__file__) + "/finger_turn_hard.xml" @dataclass class FingerBaseCfg(EnvCfg): model_file: str = model_file - max_episode_seconds: float = 20.0 + max_episode_seconds: float = 10.0 sim_dt: float = 0.01 ctrl_dt: float = 0.02 diff --git a/motrix_envs/src/motrix_envs/basic/finger/finger_np.py b/motrix_envs/src/motrix_envs/basic/finger/finger_np.py index 11a6aee..b8bc8c2 100644 --- a/motrix_envs/src/motrix_envs/basic/finger/finger_np.py +++ b/motrix_envs/src/motrix_envs/basic/finger/finger_np.py @@ -23,8 +23,6 @@ from motrix_envs.np.env import NpEnv, NpEnvState def _sanitize_joint_limits(low: np.ndarray, high: np.ndarray) -> tuple[np.ndarray, np.ndarray]: - low = low.copy() - high = high.copy() low = np.where(np.isfinite(low), low, -np.pi) high = np.where(np.isfinite(high), high, np.pi) return low, high diff --git a/motrix_envs/src/motrix_envs/basic/humanoid/humanoid_np.py b/motrix_envs/src/motrix_envs/basic/humanoid/humanoid_np.py index d15e680..4e3e913 100644 --- a/motrix_envs/src/motrix_envs/basic/humanoid/humanoid_np.py +++ b/motrix_envs/src/motrix_envs/basic/humanoid/humanoid_np.py @@ -54,7 +54,7 @@ class Humanoid3DEnv(NpEnv): def _build_qpos_limits(self, model) -> tuple[np.ndarray, np.ndarray]: num_dof_pos = int(model.num_dof_pos) - jl = np.asarray(model.joint_limits, dtype=np.float32) + jl = model.joint_limits if jl.ndim != 2 or jl.shape[0] != 2: low = np.full((num_dof_pos,), -np.inf, dtype=np.float32) high = np.full((num_dof_pos,), np.inf, dtype=np.float32) @@ -168,17 +168,17 @@ class Humanoid3DEnv(NpEnv): return obs, {} def _get_obs(self, data: mtx.SceneData) -> np.ndarray: - joint_angles = np.asarray(data.dof_pos[:, 7:], dtype=np.float32) - head_height = self._get_head_height(data).astype(np.float32)[:, None] - extremities = self._get_extremities(data).astype(np.float32) + joint_angles = data.dof_pos[:, 7:] + head_height = self._get_head_height(data)[:, None] + extremities = self._get_extremities(data) torso_rot = self._torso.get_rotation_mat(data) - torso_vertical = np.asarray(torso_rot[:, 2, :], dtype=np.float32) + torso_vertical = torso_rot[:, 2, :] - com_vel = np.asarray(self._model.get_sensor_value("torso_subtreelinvel", data), dtype=np.float32) + com_vel = self._model.get_sensor_value("torso_subtreelinvel", data) - qvel = np.asarray(data.dof_vel, dtype=np.float32) - target_direction_local = self._get_target_direction_local(data).astype(np.float32) + qvel = data.dof_vel + target_direction_local = self._get_target_direction_local(data) obs = np.concatenate( [joint_angles, head_height, extremities, torso_vertical, com_vel, qvel, target_direction_local], axis=-1 @@ -186,14 +186,14 @@ class Humanoid3DEnv(NpEnv): return obs def _get_head_height(self, data: mtx.SceneData) -> np.ndarray: - return np.asarray(self._head.get_position(data)[:, 2], dtype=np.float32) + return self._head.get_position(data)[:, 2] def _get_pelvis_height(self, data: mtx.SceneData) -> np.ndarray: - return np.asarray(self._pelvis.get_position(data)[:, 2], dtype=np.float32) + return self._pelvis.get_position(data)[:, 2] def _get_torso_upright(self, data: mtx.SceneData) -> np.ndarray: torso_rot = self._torso.get_rotation_mat(data) - return np.asarray(torso_rot[:, 2, 2], dtype=np.float32) + return torso_rot[:, 2, 2] def _get_extremities(self, data: mtx.SceneData) -> np.ndarray: torso_rot = self._torso.get_rotation_mat(data) @@ -206,12 +206,10 @@ class Humanoid3DEnv(NpEnv): self._right_foot.get_position(data), ] out = [] - torso_rot_f32 = np.asarray(torso_rot, dtype=np.float32) - torso_pos_f32 = np.asarray(torso_pos, dtype=np.float32) for p in parts: - torso_to_limb = np.asarray(p, dtype=np.float32) - torso_pos_f32 - v_body = np.einsum("ni,nij->nj", torso_to_limb, torso_rot_f32) + torso_to_limb = p - torso_pos + v_body = np.einsum("ni,nij->nj", torso_to_limb, torso_rot) out.append(v_body) return np.concatenate(out, axis=-1) @@ -219,9 +217,8 @@ class Humanoid3DEnv(NpEnv): def _get_target_direction_local(self, data: mtx.SceneData) -> np.ndarray: n = int(data.shape[0]) torso_rot = self._torso.get_rotation_mat(data) - torso_rot_f32 = np.asarray(torso_rot, dtype=np.float32) target_world = np.ones((n, 3), dtype=np.float32) * self._target_direction[None, :] - target_local = np.einsum("ni,nij->nj", target_world, torso_rot_f32) + target_local = np.einsum("ni,nij->nj", target_world, torso_rot) return target_local def _compute_reward( @@ -251,39 +248,27 @@ class Humanoid3DEnv(NpEnv): torso_upright: np.ndarray, pelvis_height: np.ndarray, ) -> np.ndarray: - stand_reward = ( - reward.tolerance( - head_height, - bounds=(self._head_height_min, float("inf")), - margin=0.5, - ) - .astype(np.float32) - .flatten() - ) + stand_reward = reward.tolerance( + head_height, + bounds=(self._head_height_min, float("inf")), + margin=0.5, + ).flatten() - upright_reward = ( - reward.tolerance( - torso_upright, - bounds=(0.9, float("inf")), - sigmoid="linear", - margin=0.9, - ) - .astype(np.float32) - .flatten() - ) + upright_reward = reward.tolerance( + torso_upright, + bounds=(0.9, float("inf")), + sigmoid="linear", + margin=0.9, + ).flatten() - pelvis_height_reward = ( - reward.tolerance( - pelvis_height, - bounds=(self._pelvis_height_min, float("inf")), - sigmoid="linear", - margin=self._pelvis_height_margin, - ) - .astype(np.float32) - .flatten() - ) + pelvis_height_reward = reward.tolerance( + pelvis_height, + bounds=(self._pelvis_height_min, float("inf")), + sigmoid="linear", + margin=self._pelvis_height_margin, + ).flatten() - return (stand_reward * upright_reward * pelvis_height_reward).astype(np.float32) + return stand_reward * upright_reward * pelvis_height_reward def _compute_speed_and_energy_reward( self, @@ -291,50 +276,38 @@ class Humanoid3DEnv(NpEnv): ) -> tuple[np.ndarray, np.ndarray]: target_dir_xy = self._target_direction_xy - ctrls = np.asarray(data.actuator_ctrls, dtype=np.float32) - com_vel = np.asarray(self._model.get_sensor_value("torso_subtreelinvel", data), dtype=np.float32) + ctrls = data.actuator_ctrls + com_vel = self._model.get_sensor_value("torso_subtreelinvel", data) if self._move_speed <= 0.0: - energy_reward = np.exp(-1.0 * np.mean(np.square(ctrls), axis=-1)).astype(np.float32) - actual_speed = np.linalg.norm(com_vel[:, :2], axis=-1).astype(np.float32) - speed_reward = ( - reward.tolerance( - actual_speed, - bounds=(self._move_speed, self._move_speed), - margin=1.0, - value_at_margin=0.01, - ) - .astype(np.float32) - .flatten() - ) + energy_reward = np.exp(-1.0 * np.mean(np.square(ctrls), axis=-1)) + actual_speed = np.linalg.norm(com_vel[:, :2], axis=-1) + speed_reward = reward.tolerance( + actual_speed, + bounds=(self._move_speed, self._move_speed), + margin=1.0, + value_at_margin=0.01, + ).flatten() elif self._move_speed <= 3.0: - energy_reward = np.exp(-0.5 * np.mean(np.square(ctrls), axis=-1)).astype(np.float32) - actual_speed = np.sum(com_vel[:, :2] * target_dir_xy, axis=-1).astype(np.float32) - speed_reward = ( - reward.tolerance( - actual_speed, - bounds=(self._move_speed, self._move_speed), - margin=self._move_speed, - value_at_margin=0.0, - sigmoid="linear", - ) - .astype(np.float32) - .flatten() - ) + energy_reward = np.exp(-0.5 * np.mean(np.square(ctrls), axis=-1)) + actual_speed = np.sum(com_vel[:, :2] * target_dir_xy, axis=-1) + speed_reward = reward.tolerance( + actual_speed, + bounds=(self._move_speed, self._move_speed), + margin=self._move_speed, + value_at_margin=0.0, + sigmoid="linear", + ).flatten() else: - energy_reward = np.exp(-0.3 * np.mean(np.square(ctrls), axis=-1)).astype(np.float32) - actual_speed = np.sum(com_vel[:, :2] * target_dir_xy, axis=-1).astype(np.float32) - speed_reward = ( - reward.tolerance( - actual_speed, - bounds=(self._move_speed, float("inf")), - margin=self._move_speed, - value_at_margin=0.0, - sigmoid="linear", - ) - .astype(np.float32) - .flatten() - ) + energy_reward = np.exp(-0.3 * np.mean(np.square(ctrls), axis=-1)) + actual_speed = np.sum(com_vel[:, :2] * target_dir_xy, axis=-1) + speed_reward = reward.tolerance( + actual_speed, + bounds=(self._move_speed, float("inf")), + margin=self._move_speed, + value_at_margin=0.0, + sigmoid="linear", + ).flatten() return speed_reward, energy_reward @@ -346,17 +319,13 @@ class Humanoid3DEnv(NpEnv): margin, ) -> np.ndarray: dot = np.sum(forward_vec * target_dir, axis=-1) - return ( - reward.tolerance( - dot, - bounds=bounds, - margin=margin, - value_at_margin=0.0, - sigmoid="linear", - ) - .astype(np.float32) - .flatten() - ) + return reward.tolerance( + dot, + bounds=bounds, + margin=margin, + value_at_margin=0.0, + sigmoid="linear", + ).flatten() def _compute_gait_reward(self, data: mtx.SceneData) -> np.ndarray: target_dir = self._target_direction @@ -365,49 +334,36 @@ class Humanoid3DEnv(NpEnv): head_rot = self._head.get_rotation_mat(data) pelvis_rot = self._pelvis.get_rotation_mat(data) - torso_forward = np.asarray(torso_rot[:, 0, 0:3], dtype=np.float32) + torso_forward = torso_rot[:, 0, 0:3] torso_heading_reward = self._compute_heading_reward(torso_forward, target_dir, bounds=(0.9, 1.0), margin=0.3) - head_forward = np.asarray(head_rot[:, 0, 0:3], dtype=np.float32) + head_forward = head_rot[:, 0, 0:3] head_heading_reward = self._compute_heading_reward(head_forward, target_dir, bounds=(0.9, 1.0), margin=0.3) - pelvis_forward = np.asarray(pelvis_rot[:, 0, 0:3], dtype=np.float32) + pelvis_forward = pelvis_rot[:, 0, 0:3] pelvis_yaw_reward = self._compute_heading_reward(pelvis_forward, target_dir, bounds=(0.9, 1.0), margin=0.3) - pelvis_up = np.asarray(pelvis_rot[:, 2, 2], dtype=np.float32) - pelvis_level_reward = ( - reward.tolerance( - pelvis_up, - bounds=(0.9, 1.0), - margin=0.3, - sigmoid="linear", - value_at_margin=0.0, - ) - .astype(np.float32) - .flatten() - ) + pelvis_up = pelvis_rot[:, 2, 2] + pelvis_level_reward = reward.tolerance( + pelvis_up, + bounds=(0.9, 1.0), + margin=0.3, + sigmoid="linear", + value_at_margin=0.0, + ).flatten() left_foot_pos = self._left_foot.get_position(data) right_foot_pos = self._right_foot.get_position(data) - max_foot_h = np.maximum( - np.asarray(left_foot_pos[:, 2], dtype=np.float32), - np.asarray(right_foot_pos[:, 2], dtype=np.float32), - ) - feet_height_reward = ( - reward.tolerance( - max_foot_h, - bounds=(0.0, 0.3), - margin=0.5, - sigmoid="quadratic", - value_at_margin=0.0, - ) - .astype(np.float32) - .flatten() - ) + max_foot_h = np.maximum(left_foot_pos[:, 2], right_foot_pos[:, 2]) + feet_height_reward = reward.tolerance( + max_foot_h, + bounds=(0.0, 0.3), + margin=0.5, + sigmoid="quadratic", + value_at_margin=0.0, + ).flatten() - return ( - torso_heading_reward * head_heading_reward * pelvis_yaw_reward * pelvis_level_reward * feet_height_reward - ).astype(np.float32) + return torso_heading_reward * head_heading_reward * pelvis_yaw_reward * pelvis_level_reward * feet_height_reward def _compute_terminated( self, @@ -415,13 +371,13 @@ class Humanoid3DEnv(NpEnv): head_height: np.ndarray, torso_upright: np.ndarray, ) -> np.ndarray: - qpos = np.asarray(data.dof_pos, dtype=np.float32) - qvel = np.asarray(data.dof_vel, dtype=np.float32) + qpos = data.dof_pos + qvel = data.dof_vel bad = ~np.isfinite(qpos).all(axis=-1) | ~np.isfinite(qvel).all(axis=-1) too_low = head_height < self._term_head_height_min too_tilted = torso_upright < self._term_torso_upright_threshold extreme_vel = np.abs(qvel).max(axis=-1) > self._term_extreme_vel_threshold - return (bad | too_low | too_tilted | extreme_vel).astype(bool) + return bad | too_low | too_tilted | extreme_vel def _init_joint_randomization_config(self, cfg: HumanoidWalkCfg) -> None: init_cfg = cfg.init_state diff --git a/motrix_envs/src/motrix_envs/basic/lqr/__init__.py b/motrix_envs/src/motrix_envs/basic/lqr/__init__.py new file mode 100644 index 0000000..c45234a --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/lqr/__init__.py @@ -0,0 +1,20 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from . import lqr_np # noqa: F401 +from .cfg import Lqr21Cfg, Lqr62Cfg +from .lqr_np import LqrEnv + +__all__ = ["Lqr21Cfg", "Lqr62Cfg", "LqrEnv"] diff --git a/motrix_envs/src/motrix_envs/basic/lqr/cfg.py b/motrix_envs/src/motrix_envs/basic/lqr/cfg.py new file mode 100644 index 0000000..343a6a9 --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/lqr/cfg.py @@ -0,0 +1,73 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import os +from dataclasses import dataclass + +from motrix_envs import registry +from motrix_envs.base import EnvCfg + +_DIR = os.path.dirname(__file__) + + +@dataclass +class LqrBaseCfg(EnvCfg): + sim_dt: float = 0.01 + ctrl_dt: float = 0.03 + max_episode_seconds: float = None + control_cost_coef: float = 0.1 + velocity_cost_coef: float = 0.05 + reset_position_norm: float = 2.0**0.5 + boundary_position_limit: float = 1.2 + boundary_velocity_limit: float = 8.0 + success_position_tol: float = 0.06 + success_velocity_tol: float = 0.05 + success_bonus: float = 3.0 + out_of_bounds_penalty: float = 2.0 + expected_nq: int = 0 + expected_nu: int = 0 + + +@registry.envcfg("dm-lqr-2-1") +@dataclass +class Lqr21Cfg(LqrBaseCfg): + model_file: str = os.path.join(_DIR, "lqr_2_1.xml") + reset_position_norm: float = 0.8 + control_cost_coef: float = 0.15 + velocity_cost_coef: float = 0.15 + boundary_position_limit: float = 1.15 + boundary_velocity_limit: float = 6.0 + success_position_tol: float = 0.04 + success_velocity_tol: float = 0.03 + success_bonus: float = 4.0 + out_of_bounds_penalty: float = 3.0 + expected_nq: int = 2 + expected_nu: int = 1 + + +@registry.envcfg("dm-lqr-6-2") +@dataclass +class Lqr62Cfg(LqrBaseCfg): + model_file: str = os.path.join(_DIR, "lqr_6_2.xml") + reset_position_norm: float = 1.0 + velocity_cost_coef: float = 0.08 + boundary_position_limit: float = 1.2 + boundary_velocity_limit: float = 8.0 + success_position_tol: float = 0.1 + success_velocity_tol: float = 0.06 + success_bonus: float = 5.0 + out_of_bounds_penalty: float = 3.0 + expected_nq: int = 6 + expected_nu: int = 2 diff --git a/motrix_envs/src/motrix_envs/basic/lqr/lqr_2_1.xml b/motrix_envs/src/motrix_envs/basic/lqr/lqr_2_1.xml new file mode 100644 index 0000000..70b4d6c --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/lqr/lqr_2_1.xml @@ -0,0 +1,70 @@ + + + + + diff --git a/motrix_envs/src/motrix_envs/basic/lqr/lqr_6_2.xml b/motrix_envs/src/motrix_envs/basic/lqr/lqr_6_2.xml new file mode 100644 index 0000000..e86761e --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/lqr/lqr_6_2.xml @@ -0,0 +1,100 @@ + + + + + diff --git a/motrix_envs/src/motrix_envs/basic/lqr/lqr_np.py b/motrix_envs/src/motrix_envs/basic/lqr/lqr_np.py new file mode 100644 index 0000000..78851af --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/lqr/lqr_np.py @@ -0,0 +1,162 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import gymnasium as gym +import motrixsim as mtx +import numpy as np +from motrixsim.render import Color + +from motrix_envs import registry +from motrix_envs.np.env import NpEnv, NpEnvState + +from .cfg import LqrBaseCfg + + +def _normalize_actions(actions: np.ndarray, num_envs: int, num_actuators: int) -> np.ndarray: + actions = np.asarray(actions, dtype=np.float32) + if actions.ndim == 1: + if num_envs != 1 or actions.shape[0] != num_actuators: + raise ValueError(f"Expected action shape ({num_envs}, {num_actuators}) or ({num_actuators},).") + actions = actions.reshape(1, num_actuators) + if actions.shape != (num_envs, num_actuators): + raise ValueError(f"Expected action shape ({num_envs}, {num_actuators}), got {actions.shape}.") + return np.ascontiguousarray(actions) + + +@registry.env("dm-lqr-2-1", "np") +@registry.env("dm-lqr-6-2", "np") +class LqrEnv(NpEnv): + _cfg: LqrBaseCfg + + def __init__(self, cfg: LqrBaseCfg, num_envs: int = 1): + super().__init__(cfg, num_envs=num_envs) + + self._nq = int(self._model.num_dof_pos) + self._nv = int(self._model.num_dof_vel) + self._nu = int(self._model.num_actuators) + + if self._nq != cfg.expected_nq or self._nv != cfg.expected_nq: + raise ValueError(f"LQR model mismatch: expected nq=nv={cfg.expected_nq}, got nq={self._nq}, nv={self._nv}.") + if self._nu != cfg.expected_nu: + raise ValueError(f"LQR model mismatch: expected nu={cfg.expected_nu}, got nu={self._nu}.") + + obs_dim = self._nq + self._nv + self._action_low = np.asarray(self._model.actuator_ctrl_limits[0], dtype=np.float32) + self._action_high = np.asarray(self._model.actuator_ctrl_limits[1], dtype=np.float32) + self._observation_space = gym.spaces.Box(-np.inf, np.inf, (obs_dim,), dtype=np.float32) + self._action_space = gym.spaces.Box(self._action_low, self._action_high, (self._nu,), dtype=np.float32) + self._rope_geom_pairs = [ + (self._model.get_geom(f"geom_{i}"), self._model.get_geom(f"geom_{i + 1}")) for i in range(self._nq - 1) + ] + self._rope_color = Color.rgb(0.85, 0.75, 0.65) + + @property + def observation_space(self): + return self._observation_space + + @property + def action_space(self): + return self._action_space + + def apply_action(self, actions: np.ndarray, state: NpEnvState) -> NpEnvState: + actions = _normalize_actions(actions, self._num_envs, self._nu) + state.data.actuator_ctrls = np.clip(actions, self._action_low, self._action_high) + return state + + def _get_obs(self, data: mtx.SceneData) -> np.ndarray: + qpos = np.asarray(data.dof_pos, dtype=np.float32) + qvel = np.asarray(data.dof_vel, dtype=np.float32) + return np.concatenate([qpos, qvel], axis=-1) + + def draw_gizmos(self, gizmos, render_offsets: np.ndarray) -> None: + if self.state is None: + return + + offsets = np.asarray(render_offsets, dtype=np.float32) + data = self.state.data + gizmos.line_width = 6.0 + for geom_a, geom_b in self._rope_geom_pairs: + start = np.asarray(geom_a.get_pose(data), dtype=np.float32)[..., :3] + end = np.asarray(geom_b.get_pose(data), dtype=np.float32)[..., :3] + for env_i in range(self._num_envs): + gizmos.draw_line( + start[env_i] + offsets[env_i], + end[env_i] + offsets[env_i], + color=self._rope_color, + ) + + def update_state(self, state: NpEnvState) -> NpEnvState: + data = state.data + qpos = np.asarray(data.dof_pos, dtype=np.float32) + qvel = np.asarray(data.dof_vel, dtype=np.float32) + ctrl = np.asarray(data.actuator_ctrls, dtype=np.float32) + + obs = self._get_obs(data) + out_of_bounds = np.any(np.abs(qpos) > self._cfg.boundary_position_limit, axis=-1) + out_of_bounds |= np.any(np.abs(qvel) > self._cfg.boundary_velocity_limit, axis=-1) + position_norm = np.linalg.norm(qpos, axis=-1) + velocity_norm = np.linalg.norm(qvel, axis=-1) + state_cost = 0.5 * np.sum(np.square(qpos), axis=-1) + velocity_cost = 0.5 * self._cfg.velocity_cost_coef * np.sum(np.square(qvel), axis=-1) + control_cost = 0.5 * self._cfg.control_cost_coef * np.sum(np.square(ctrl), axis=-1) + success = (position_norm <= self._cfg.success_position_tol) & (velocity_norm <= self._cfg.success_velocity_tol) + success &= ~out_of_bounds + success_reward = self._cfg.success_bonus * success.astype(np.float32) + boundary_penalty = self._cfg.out_of_bounds_penalty * out_of_bounds.astype(np.float32) + reward = 1.0 - (state_cost + velocity_cost + control_cost) + success_reward - boundary_penalty + + terminated = success | out_of_bounds + terminated |= np.isnan(obs).any(axis=-1) + terminated |= np.isnan(ctrl).any(axis=-1) + + state.info["metrics"] = { + "position_norm": position_norm.astype(np.float32), + "velocity_norm": velocity_norm.astype(np.float32), + "success": success.astype(np.float32), + "out_of_bounds": out_of_bounds.astype(np.float32), + } + state.info["Reward"] = { + "state_cost": (-state_cost).astype(np.float32), + "velocity_cost": (-velocity_cost).astype(np.float32), + "control_cost": (-control_cost).astype(np.float32), + "success_bonus": success_reward.astype(np.float32), + "out_of_bounds_penalty": (-boundary_penalty).astype(np.float32), + } + + return state.replace( + obs=obs, + reward=reward.astype(np.float32), + terminated=terminated, + ) + + def reset(self, data: mtx.SceneData) -> tuple[np.ndarray, dict]: + data.reset(self._model) + num_envs = int(data.shape[0]) + + qpos = np.random.standard_normal((num_envs, self._nq)).astype(np.float32) + norms = np.linalg.norm(qpos, axis=-1, keepdims=True) + zero_norm = norms[:, 0] < 1e-8 + if np.any(zero_norm): + qpos[zero_norm, 0] = 1.0 + norms = np.linalg.norm(qpos, axis=-1, keepdims=True) + qpos *= self._cfg.reset_position_norm / np.clip(norms, 1e-8, None) + + qvel = np.zeros((num_envs, self._nv), dtype=np.float32) + data.set_dof_pos(qpos, self._model) + data.set_dof_vel(qvel) + + self._model.forward_kinematic(data) + + return np.concatenate([qpos, qvel], axis=-1), {} diff --git a/motrix_envs/src/motrix_envs/basic/manipulator/cfg.py b/motrix_envs/src/motrix_envs/basic/manipulator/cfg.py index 54578d8..ff20764 100644 --- a/motrix_envs/src/motrix_envs/basic/manipulator/cfg.py +++ b/motrix_envs/src/motrix_envs/basic/manipulator/cfg.py @@ -28,7 +28,7 @@ class BringBallCfg(EnvCfg): # Simulation model_file: str = bring_ball_model_file max_episode_seconds: float = 10.0 - sim_dt: float = 0.001 + sim_dt: float = 0.01 ctrl_dt: float = 0.01 render_spacing: float = 2.5 diff --git a/motrix_envs/src/motrix_envs/basic/pendulum/cfg.py b/motrix_envs/src/motrix_envs/basic/pendulum/cfg.py index a868327..2232ec1 100644 --- a/motrix_envs/src/motrix_envs/basic/pendulum/cfg.py +++ b/motrix_envs/src/motrix_envs/basic/pendulum/cfg.py @@ -24,6 +24,7 @@ from motrix_envs.base import EnvCfg model_file = os.path.dirname(__file__) + "/pendulum.xml" +# -- docs-tag-start: pendulum-env-cfg -- @registry.envcfg("pendulum") @dataclass class PendulumEnvCfg(EnvCfg): @@ -34,6 +35,7 @@ class PendulumEnvCfg(EnvCfg): angle_bound: float = 8.0 cosing_bound: float = 0.0 # reset_noise_scale: float = 0.01 + # -- docs-tag-end: pendulum-env-cfg -- def __post_init__(self): self.cosing_bound = float(np.cos(np.deg2rad(self.angle_bound))) diff --git a/motrix_envs/src/motrix_envs/basic/point_mass/__init__.py b/motrix_envs/src/motrix_envs/basic/point_mass/__init__.py new file mode 100644 index 0000000..c7cbac7 --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/point_mass/__init__.py @@ -0,0 +1,16 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from . import point_mass_np # noqa: F401 diff --git a/motrix_envs/src/motrix_envs/basic/point_mass/cfg.py b/motrix_envs/src/motrix_envs/basic/point_mass/cfg.py new file mode 100644 index 0000000..d5f694f --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/point_mass/cfg.py @@ -0,0 +1,32 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import os +from dataclasses import dataclass + +from motrix_envs import registry +from motrix_envs.base import EnvCfg + +model_file = os.path.dirname(__file__) + "/point_mass.xml" + + +@registry.envcfg("point_mass") +@dataclass +class PointMassEnvCfg(EnvCfg): + model_file: str = model_file + reset_noise_scale: float = 0.01 + max_episode_seconds: float = 10 + render_spacing: float = 2.0 + target_radius: float = 0.1 diff --git a/motrix_envs/src/motrix_envs/basic/point_mass/point_mass.xml b/motrix_envs/src/motrix_envs/basic/point_mass/point_mass.xml new file mode 100644 index 0000000..d6d46f4 --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/point_mass/point_mass.xml @@ -0,0 +1,43 @@ + + + diff --git a/motrix_envs/src/motrix_envs/basic/point_mass/point_mass_np.py b/motrix_envs/src/motrix_envs/basic/point_mass/point_mass_np.py new file mode 100644 index 0000000..bbc28f6 --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/point_mass/point_mass_np.py @@ -0,0 +1,174 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import gymnasium as gym +import motrixsim as mtx +import numpy as np + +from motrix_envs import registry +from motrix_envs.np.env import NpEnv, NpEnvState + +from .cfg import PointMassEnvCfg + + +@registry.env("point_mass", "np") +class PointMassEnv(NpEnv): + _cfg: PointMassEnvCfg + + def __init__(self, cfg: PointMassEnvCfg, num_envs: int = 1): + super().__init__(cfg, num_envs=num_envs) + self._action_space = gym.spaces.Box(-1.0, 1.0, (2,), dtype=np.float32) + self._observation_space = gym.spaces.Box(-np.inf, np.inf, (9,), dtype=np.float32) + self._num_dof_pos = self._model.num_dof_pos + self._num_dof_vel = self._model.num_dof_vel + + self._point_mass = self._model.get_body("point_mass") + self._target = self._model.get_body("target") + + self._target_radius = cfg.target_radius + + # Target stay counter, used to control reset after 0.5 seconds of overlap + self._in_target_steps = np.zeros(self._num_envs, dtype=np.int32) + self._required_in_target_steps = int(0.5 / cfg.ctrl_dt) + + @property + def observation_space(self): + return self._observation_space + + @property + def action_space(self): + return self._action_space + + def apply_action(self, actions: np.ndarray, state: NpEnvState): + actions = np.clip(actions, -1.0, 1.0) + state.data.actuator_ctrls = actions + return state + + def _get_obs(self, data: mtx.SceneData) -> np.ndarray: + dof_pos = data.dof_pos[:, :2] # Only x and y positions + dof_vel = data.dof_vel[:, :2] # Only x and y velocities + + # Get target position + target_pos = self._target.get_pose(data)[:, :2] + + # Calculate distance and direction to target + delta = target_pos - dof_pos + distance = np.linalg.norm(delta, axis=-1, keepdims=True) + + obs = np.concatenate([dof_pos, dof_vel, target_pos, delta, distance], axis=-1) + return obs + + def update_state(self, state: NpEnvState) -> NpEnvState: + data = state.data + obs = self._get_obs(data) + + # Get positions of point mass and target + point_pos = self._point_mass.get_pose(data)[:, :2] + target_pos = self._target.get_pose(data)[:, :2] + dist_to_target = np.linalg.norm(point_pos - target_pos, axis=-1) + + # Calculate effective target radius for complete overlap + # Blue ball radius is 0.05, red ball radius is 0.1 + # For complete overlap, center distance should be very small + effective_target_radius = 0.02 # Smaller radius for complete overlap + + # Fine-grained distance reward - exponential function, reward grows faster as distance decreases + distance_reward = np.exp(-10 * dist_to_target) # Stronger exponential reward + + # Large bonus for complete target entry + in_target = dist_to_target < effective_target_radius + target_bonus = 100.0 * in_target # Significantly increased reward + + # Continuous stay reward + continuous_reward = 30.0 * in_target # Increased continuous reward + + # Penalty for distance from target center - encourages complete overlap + # When inside target, penalty increases with distance from center + center_penalty = np.where(in_target, 10.0 * dist_to_target, 0.0) + + # Control penalty - increased penalty to encourage smoother movement + dof_vel = data.dof_vel[:, :2] + vel_magnitude = np.linalg.norm(dof_vel, axis=-1) + control_penalty = 0.1 * vel_magnitude # Increased penalty to reduce excessive movement + + # Path optimization reward - encourages straight-line movement + # Calculate alignment between velocity direction and target direction + if dist_to_target.max() > 0: + delta = target_pos - point_pos + delta_norm = np.linalg.norm(delta, axis=-1, keepdims=True) + delta_normalized = delta / delta_norm + vel_normalized = dof_vel / (np.linalg.norm(dof_vel, axis=-1, keepdims=True) + 1e-6) + direction_alignment = np.sum(delta_normalized * vel_normalized, axis=-1) + path_reward = 0.5 * direction_alignment + else: + path_reward = 0.0 + + # Total reward + rwd = distance_reward + target_bonus + continuous_reward + path_reward - center_penalty - control_penalty + + # Update target stay steps + self._in_target_steps = np.where(in_target, self._in_target_steps + 1, 0) + + # Check if stayed in target long enough + in_target_long_enough = self._in_target_steps >= self._required_in_target_steps + + # Check termination conditions - terminate when reaching target for 0.5 seconds or when NaN encountered + terminated = np.zeros((self._num_envs,), dtype=bool) + terminated = np.logical_or(in_target_long_enough, terminated) + terminated = np.logical_or(np.isnan(obs).any(axis=-1), terminated) + + state.obs = obs + state.reward = rwd + state.terminated = terminated + return state + + def reset(self, data: mtx.SceneData) -> tuple[np.ndarray, dict]: + data.reset(self._model) + num_reset = data.shape[0] + + # Get the actual number of DOF from the model + num_dof_pos = self._model.num_dof_pos + num_dof_vel = self._model.num_dof_vel + + # Random initial position within a range for the point mass (only x, y) + x_pos = np.random.uniform(-1.0, 1.0, size=num_reset).astype(np.float32) + y_pos = np.random.uniform(-1.0, 1.0, size=num_reset).astype(np.float32) + + # Create dof_pos with the correct length (point mass x, y and target x, y) + dof_pos = np.zeros((num_reset, num_dof_pos), dtype=np.float32) + dof_pos[:, 0] = x_pos # point_mass_x + dof_pos[:, 1] = y_pos # point_mass_y + + dof_vel = np.zeros((num_reset, num_dof_vel), dtype=np.float32) + + data.set_dof_vel(dof_vel) + data.set_dof_pos(dof_pos, self._model) + + # Randomize target position using its slide joints + target_x = np.random.uniform(-1.5, 1.5, size=num_reset).astype(np.float32) + target_y = np.random.uniform(-1.5, 1.5, size=num_reset).astype(np.float32) + + # Set target position via its slide joints (indices 2 and 3) + dof_pos[:, 2] = target_x # target_x + dof_pos[:, 3] = target_y # target_y + data.set_dof_pos(dof_pos, self._model) + + self._model.forward_kinematic(data) + + # Reset target stay counter for the environments being reset + self._in_target_steps[:num_reset] = 0 + + obs = self._get_obs(data) + return obs, {} diff --git a/motrix_envs/src/motrix_envs/basic/quadruped/__init__.py b/motrix_envs/src/motrix_envs/basic/quadruped/__init__.py new file mode 100644 index 0000000..ff74360 --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/quadruped/__init__.py @@ -0,0 +1,23 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from . import quadruped_np # noqa: F401 +from .cfg import ( # noqa: F401 + QuadrupedBaseCfg, + QuadrupedEscapeCfg, + QuadrupedFetchCfg, + QuadrupedRunCfg, + QuadrupedWalkCfg, +) diff --git a/motrix_envs/src/motrix_envs/basic/quadruped/assets/quadruped_escape_heightfield.png b/motrix_envs/src/motrix_envs/basic/quadruped/assets/quadruped_escape_heightfield.png new file mode 100644 index 0000000..938fde2 --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/quadruped/assets/quadruped_escape_heightfield.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:775bf911a0d5ce8703f1a1f766da870a1dd717a3b9366c118bad91474bbeebf0 +size 13996 diff --git a/motrix_envs/src/motrix_envs/basic/quadruped/cfg.py b/motrix_envs/src/motrix_envs/basic/quadruped/cfg.py new file mode 100644 index 0000000..b34e5bc --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/quadruped/cfg.py @@ -0,0 +1,149 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import os +from dataclasses import dataclass + +from motrix_envs import registry +from motrix_envs.base import EnvCfg + +_DIR = os.path.dirname(__file__) +_WALK_MODEL = os.path.join(_DIR, "quadruped_walk.xml") +_ESCAPE_MODEL = os.path.join(_DIR, "quadruped_escape.xml") +_FETCH_MODEL = os.path.join(_DIR, "quadruped_fetch.xml") + + +@dataclass +class QuadrupedBaseCfg(EnvCfg): + model_file: str = _WALK_MODEL + max_episode_seconds: float = 20.0 + sim_dt: float = 0.01 + ctrl_dt: float = 0.01 + render_spacing: float = 2.0 + + # Task parameters + desired_speed: float = 0.0 + deviation_angle: float = 0.0 + fix_heading: bool = False + clip_env_actions: bool = True + + # Observation toggles + include_origin: bool = False + include_rangefinder: bool = False + include_ball: bool = False + include_target: bool = False + + # Task geometry (fallbacks when sites/geom metadata are unavailable) + target_radius: float = 0.7 + terrain_size: float = 30.0 + + # Gait shaping (walk/run) + stand_height: float = 0.55 + stand_height_margin: float = 0.25 + height_reward_weight: float = 0.1 + + lateral_velocity_limit: float = 0.2 + lateral_velocity_margin: float = 0.5 + lateral_reward_weight: float = 0.05 + + heading_reward_margin: float = 1.0 + heading_reward_weight: float = 0.0 + + action_smoothness_margin: float = 5.0 + action_smoothness_weight: float = 0.08 + + lin_vel_z_weight: float = 0.05 + ang_vel_xy_weight: float = 0.02 + similar_to_default_weight: float = 0.025 + + # Forward motion shaping (walk/run) + backward_penalty_weight: float = 0.2 + + # Radial motion shaping (escape) + radial_velocity_weight: float = 0.2 + + # Fetch shaping + fetch_reward_margin: float = 10.0 + fetch_reward_weight: float = 1.0 + fetch_behind_distance: float = 0.7 + fetch_ahead_distance: float = 0.2 + fetch_side_stage_offset: float = 0.6 + fetch_side_stage_ball_distance: float = 1.0 + fetch_side_stage_gate_threshold: float = 0.5 + fetch_side_stage_align_threshold: float = 0.8 + fetch_stage_radius: float = 0.5 + fetch_stage_speed: float = 0.5 + fetch_stage_reward_weight: float = 0.5 + fetch_corridor_width: float = 0.3 + fetch_behind_align_margin: float = 1.0 + fetch_heading_margin: float = 1.0 + fetch_heading_weight: float = 0.2 + fetch_ready_ball_distance: float = 0.5 + fetch_ready_weight: float = 0.3 + fetch_ready_threshold: float = 0.7 + fetch_push_speed: float = 0.2 + fetch_push_reward_weight: float = 0.3 + fetch_backward_penalty_weight: float = 0.2 + fetch_away_penalty_weight: float = 0.4 + fetch_leg_ball_penalty_weight: float = 0.1 + fetch_leg_ball_penalty_margin = 0.03 + fetch_stability_upright_min: float = 0.8 + fetch_stability_upright_margin: float = 0.5 + fetch_stability_height_min: float = 0.45 + fetch_stability_height_margin: float = 0.2 + fetch_fall_upright_min: float = 0.2 + fetch_fall_height_min: float = 0.25 + + +@registry.envcfg("dm-quadruped-walk") +@dataclass +class QuadrupedWalkCfg(QuadrupedBaseCfg): + model_file: str = _WALK_MODEL + desired_speed: float = 0.5 + fix_heading: bool = True + heading_reward_weight: float = 0.2 + + +@registry.envcfg("dm-quadruped-run") +@dataclass +class QuadrupedRunCfg(QuadrupedBaseCfg): + model_file: str = _WALK_MODEL + desired_speed: float = 5.0 + fix_heading: bool = True + heading_reward_weight: float = 0.2 + + +@registry.envcfg("dm-quadruped-escape") +@dataclass +class QuadrupedEscapeCfg(QuadrupedBaseCfg): + model_file: str = _ESCAPE_MODEL + render_camera_name: str = "global" + desired_speed: float = 3.0 + include_origin: bool = True + include_rangefinder: bool = False + deviation_angle: float = 20.0 + fix_heading: bool = True + heading_reward_weight: float = 0.2 + radial_velocity_weight: float = 0.5 + similar_to_default_weight: float = 0.01 + + +@registry.envcfg("dm-quadruped-fetch") +@dataclass +class QuadrupedFetchCfg(QuadrupedBaseCfg): + model_file: str = _FETCH_MODEL + desired_speed: float = 2.0 + include_ball: bool = True + include_target: bool = True diff --git a/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_base.xml b/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_base.xml new file mode 100644 index 0000000..cd7a588 --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_base.xml @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + diff --git a/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_escape.xml b/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_escape.xml new file mode 100644 index 0000000..98f1dda --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_escape.xml @@ -0,0 +1,272 @@ + + + + + + + + + + + + + + + + diff --git a/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_fetch.xml b/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_fetch.xml new file mode 100644 index 0000000..87f31c0 --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_fetch.xml @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + diff --git a/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_materials.xml b/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_materials.xml new file mode 100644 index 0000000..7cb7594 --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_materials.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_np.py b/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_np.py new file mode 100644 index 0000000..2eee1f4 --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_np.py @@ -0,0 +1,893 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import gymnasium as gym +import motrixsim as mtx +import numpy as np + +from motrix_envs import registry +from motrix_envs.basic.quadruped.cfg import QuadrupedBaseCfg +from motrix_envs.math import quaternion +from motrix_envs.np import reward +from motrix_envs.np.env import NpEnv, NpEnvState + +_RANGEFINDER_SENSORS = [f"rf_{row}{col}" for row in range(4) for col in range(5)] + + +class QuadrupedEnv(NpEnv): + _cfg: QuadrupedBaseCfg + _observation_space: gym.spaces.Box + _action_space: gym.spaces.Box + + def __init__(self, cfg: QuadrupedBaseCfg, num_envs: int = 1): + super().__init__(cfg, num_envs) + self._cfg = cfg + self._torso = self._model.get_link("torso") + self._floor_geom = self._model.get_geom("floor") + + self._workspace_site = None + if cfg.include_origin: + self._workspace_site = self._model.get_site("workspace") + + self._target_site = None + if cfg.include_target: + self._target_site = self._model.get_site("target") + + self._ball_body = None + self._ball_geom = None + if cfg.include_ball: + self._ball_body = self._model.get_body("ball") + self._ball_geom = self._model.get_geom("ball") + + self._leg_ball_geoms = [] + self._leg_ball_geom_count = 0 + self._leg_ball_geom_slices = [] + if cfg.include_ball: + try: + leg_body_geom_names = [ + ["thigh_front_left", "shin_front_left", "foot_front_left", "toe_front_left"], + ["thigh_front_right", "shin_front_right", "foot_front_right", "toe_front_right"], + ["thigh_back_right", "shin_back_right", "foot_back_right", "toe_back_right"], + ["thigh_back_left", "shin_back_left", "foot_back_left", "toe_back_left"], + ] + leg_geoms = [] + start = 0 + for geom_names in leg_body_geom_names: + stop = start + for name in geom_names: + try: + geom = self._model.get_geom(name) + except Exception: + continue + leg_geoms.append(geom) + stop += 1 + self._leg_ball_geom_slices.append(slice(start, stop)) + start = stop + if leg_geoms: + self._leg_ball_geoms = leg_geoms + self._leg_ball_geom_count = len(leg_geoms) + except Exception: + self._leg_ball_geom_slices = [] + + self._body_dof_pos = self._model.num_dof_pos - 7 - (7 if cfg.include_ball else 0) + self._body_dof_vel = self._model.num_dof_vel - 6 - (6 if cfg.include_ball else 0) + self._dof_pos_slice = slice(7, 7 + self._body_dof_pos) + self._dof_vel_slice = slice(6, 6 + self._body_dof_vel) + self._ball_pos_slice = None + self._ball_vel_slice = None + if cfg.include_ball: + self._ball_pos_slice = slice(self._model.num_dof_pos - 7, self._model.num_dof_pos) + self._ball_vel_slice = slice(self._model.num_dof_vel - 6, self._model.num_dof_vel) + + self._init_dof_pos = self._model.compute_init_dof_pos().astype(np.float32) + self._default_body_dof_pos = self._init_dof_pos[self._dof_pos_slice].copy() + self._terrain_size = float(cfg.terrain_size) + try: + if self._model.num_hfields: + hfield = self._model.get_hfield(0) + self._terrain_size = max(self._terrain_size, float(abs(hfield.bound[3]))) + except Exception: + pass + + self._init_obs_space() + self._init_action_space() + + def _init_obs_space(self): + num_obs = self._body_dof_pos + self._body_dof_vel + self._model.num_actuators + num_obs += 3 # torso velocity + num_obs += 1 # torso upright + num_obs += 6 # imu accel + gyro + + if self._cfg.include_origin: + num_obs += 3 + if self._cfg.include_rangefinder: + num_obs += len(_RANGEFINDER_SENSORS) + if self._cfg.include_ball: + num_obs += 9 + if self._cfg.include_target: + num_obs += 3 + + self._observation_space = gym.spaces.Box(-np.inf, np.inf, (num_obs,), dtype=np.float32) + + def _init_action_space(self): + low, high = self._model.actuator_ctrl_limits + self._action_space = gym.spaces.Box(low, high, (self._model.num_actuators,), dtype=np.float32) + + @property + def observation_space(self) -> gym.spaces.Box: + return self._observation_space + + @property + def action_space(self) -> gym.spaces.Box: + return self._action_space + + def apply_action(self, actions: np.ndarray, state: NpEnvState) -> NpEnvState: + if self._cfg.clip_env_actions: + actions = np.clip(actions, self._action_space.low, self._action_space.high) + actions = actions.astype(np.float32) + if "actions" not in state.info: + state.info["actions"] = np.zeros_like(actions, dtype=np.float32) + if "last_actions" not in state.info: + state.info["last_actions"] = np.zeros_like(actions, dtype=np.float32) + state.info["last_actions"] = state.info["actions"] + state.info["actions"] = actions + state.data.actuator_ctrls = actions + return state + + def _sensor_value(self, data: mtx.SceneData, name: str) -> np.ndarray: + value = np.asarray(self._model.get_sensor_value(name, data)) + return value.reshape(data.shape[0], -1) + + def _sensor_vector(self, data: mtx.SceneData, names: list[str]) -> np.ndarray: + if not names: + return np.zeros((data.shape[0], 0), dtype=np.float32) + values = [self._sensor_value(data, name) for name in names] + return np.concatenate(values, axis=-1) + + def _egocentric_state(self, data: mtx.SceneData) -> np.ndarray: + dof_pos = data.dof_pos[:, self._dof_pos_slice] + dof_vel = data.dof_vel[:, self._dof_vel_slice] + act = data.actuator_ctrls + return np.concatenate([dof_pos, dof_vel, act], axis=-1) + + def _torso_upright(self, data: mtx.SceneData) -> np.ndarray: + return self._torso.get_rotation_mat(data)[:, 2, 2] + + def _torso_velocity(self, data: mtx.SceneData) -> np.ndarray: + return self._sensor_value(data, "velocimeter") + + def _imu(self, data: mtx.SceneData) -> np.ndarray: + accel = self._sensor_value(data, "imu_accel") + gyro = self._sensor_value(data, "imu_gyro") + return np.concatenate([accel, gyro], axis=-1) + + def _rangefinder(self, data: mtx.SceneData) -> np.ndarray: + readings = self._sensor_vector(data, _RANGEFINDER_SENSORS) + no_intersection = -1.0 + return np.where(readings == no_intersection, 1.0, np.tanh(readings)) + + def _origin(self, data: mtx.SceneData) -> np.ndarray: + torso_pos = self._torso.get_position(data) + torso_frame = self._torso.get_rotation_mat(data) + return -np.einsum("ni,nij->nj", torso_pos, torso_frame) + + def _origin_distance(self, data: mtx.SceneData) -> np.ndarray: + workspace_pos = self._workspace_site.get_position(data) + return np.linalg.norm(workspace_pos, axis=-1) + + def _ball_state(self, data: mtx.SceneData) -> np.ndarray: + ball_pose = self._ball_body.get_pose(data) + ball_pos = ball_pose[:, :3] + torso_pos = self._torso.get_position(data) + torso_frame = self._torso.get_rotation_mat(data) + + ball_rel_pos = ball_pos - torso_pos + root_linvel = data.dof_vel[:, :3] + ball_vel = data.dof_vel[:, self._ball_vel_slice] + ball_rel_vel = ball_vel[:, :3] - root_linvel + ball_rot_vel = ball_vel[:, 3:] + + stacked = np.stack([ball_rel_pos, ball_rel_vel, ball_rot_vel], axis=1) + local = np.einsum("nij,njk->nik", stacked, torso_frame) + return local.reshape(data.shape[0], -1) + + def _target_position(self, data: mtx.SceneData) -> np.ndarray: + torso_pos = self._torso.get_position(data) + torso_frame = self._torso.get_rotation_mat(data) + to_target = self._target_site.get_position(data) - torso_pos + return np.einsum("ni,nij->nj", to_target, torso_frame) + + def _ball_to_target_distance(self, data: mtx.SceneData) -> np.ndarray: + ball_pos = self._ball_body.get_pose(data)[:, :3] + target_pos = self._target_site.get_position(data) + return np.linalg.norm((target_pos - ball_pos)[:, :2], axis=-1) + + def _aggregate_leg_ball_proximity(self, geom_penalties: np.ndarray) -> np.ndarray: + num_legs = len(self._leg_ball_geom_slices) + if num_legs == 0: + return np.zeros((geom_penalties.shape[0], 0), dtype=np.float32) + + leg_penalties = [] + for geom_slice in self._leg_ball_geom_slices: + if geom_slice.start == geom_slice.stop: + leg_penalties.append(np.zeros((geom_penalties.shape[0],), dtype=np.float32)) + else: + leg_penalties.append(geom_penalties[:, geom_slice].max(axis=-1)) + return np.stack(leg_penalties, axis=-1) + + def _point_to_segment_distance(self, point: np.ndarray, start: np.ndarray, end: np.ndarray) -> np.ndarray: + segment = end - start + segment_sq_norm = np.sum(segment * segment, axis=-1) + safe_norm = np.where(segment_sq_norm > 1e-8, segment_sq_norm, 1.0) + t = np.sum((point - start) * segment, axis=-1) / safe_norm + t = np.where(segment_sq_norm > 1e-8, np.clip(t, 0.0, 1.0), 0.0) + closest = start + t[:, None] * segment + return np.linalg.norm(point - closest, axis=-1) + + def _geom_ball_surface_clearance( + self, geom: mtx.Geom, ball_pos: np.ndarray, ball_radius: float, data: mtx.SceneData + ) -> np.ndarray: + geom_pose = geom.get_pose(data) + geom_pos = geom_pose[:, :3] + geom_quat = geom_pose[:, 3:] + geom_size = np.atleast_1d(np.asarray(geom.size, dtype=np.float32)) + geom_radius = float(geom_size[0]) + + if getattr(geom, "shape", None) == mtx.Shape.Capsule and geom_size.shape[0] > 1 and geom_size[1] > 0.0: + half_length = float(geom_size[1]) + axis = quaternion.rotate_vector(geom_quat, np.array([0.0, 0.0, 1.0], dtype=np.float32)) + start = geom_pos - axis * half_length + end = geom_pos + axis * half_length + center_distance = self._point_to_segment_distance(ball_pos, start, end) + else: + center_distance = np.linalg.norm(ball_pos - geom_pos, axis=-1) + + return center_distance - (ball_radius + geom_radius) + + def _leg_body_ball_penalty(self, data: mtx.SceneData) -> np.ndarray: + num_legs = len(self._leg_ball_geom_slices) + if self._ball_geom is None or self._leg_ball_geom_count == 0 or num_legs == 0: + return np.zeros((data.shape[0],), dtype=np.float32) + + ball_pos = self._ball_geom.get_pose(data)[:, :3] + ball_radius = float(np.atleast_1d(self._ball_geom.size)[0]) + geom_penalties = [] + for geom in self._leg_ball_geoms: + clearance = self._geom_ball_surface_clearance(geom, ball_pos, ball_radius, data) + geom_penalties.append( + reward.tolerance( + -clearance, + bounds=(0.0, float("inf")), + margin=self._cfg.fetch_leg_ball_penalty_margin, + value_at_margin=0.0, + sigmoid="linear", + ) + ) + + proximity = np.stack(geom_penalties, axis=-1).astype(np.float32) + leg_penalties = self._aggregate_leg_ball_proximity(proximity) + return leg_penalties.sum(axis=-1).astype(np.float32) + + def _fetch_stability_gate(self, torso_upright: np.ndarray, torso_height: np.ndarray) -> np.ndarray: + upright_gate = reward.tolerance( + torso_upright, + bounds=(self._cfg.fetch_stability_upright_min, float("inf")), + margin=self._cfg.fetch_stability_upright_margin, + value_at_margin=0.0, + sigmoid="linear", + ) + height_gate = reward.tolerance( + torso_height, + bounds=(self._cfg.fetch_stability_height_min, float("inf")), + margin=self._cfg.fetch_stability_height_margin, + value_at_margin=0.0, + sigmoid="linear", + ) + return upright_gate * height_gate + + def _fetch_fall_terminated(self, torso_upright: np.ndarray, torso_height: np.ndarray) -> np.ndarray: + return (torso_upright < self._cfg.fetch_fall_upright_min) | (torso_height < self._cfg.fetch_fall_height_min) + + def _upright_reward(self, torso_upright: np.ndarray) -> np.ndarray: + deviation = float(np.cos(np.deg2rad(self._cfg.deviation_angle))) + return reward.tolerance( + torso_upright, + bounds=(deviation, float("inf")), + margin=1 + deviation, + value_at_margin=0.0, + sigmoid="linear", + ) + + def _move_reward(self, torso_vel: np.ndarray) -> np.ndarray: + return reward.tolerance( + torso_vel[:, 0], + bounds=(self._cfg.desired_speed, float("inf")), + margin=self._cfg.desired_speed, + value_at_margin=0.5, + sigmoid="linear", + ) + + def _backward_penalty(self, torso_vel: np.ndarray) -> np.ndarray: + return np.maximum(0.0, -torso_vel[:, 0]) + + def _escape_reward(self, data: mtx.SceneData) -> np.ndarray: + return reward.tolerance( + self._origin_distance(data), + bounds=(self._terrain_size, float("inf")), + margin=self._terrain_size, + value_at_margin=0.0, + sigmoid="linear", + ) + + def _radial_speed_reward(self, data: mtx.SceneData) -> np.ndarray: + radial_speed_reward = np.zeros((data.shape[0],), dtype=np.float32) + if not self._cfg.include_origin: + return radial_speed_reward + + torso_pos = self._torso.get_position(data) + radial_vec = torso_pos[:, :2] + radial_norm = np.linalg.norm(radial_vec, axis=-1, keepdims=True) + radial_dir = np.divide(radial_vec, radial_norm, out=np.zeros_like(radial_vec), where=radial_norm > 1e-6) + radial_speed = np.sum(data.dof_vel[:, :2] * radial_dir, axis=-1) + radial_speed = np.maximum(0.0, radial_speed) + return reward.tolerance( + radial_speed, + bounds=(self._cfg.desired_speed, float("inf")), + margin=self._cfg.desired_speed, + value_at_margin=0.5, + sigmoid="linear", + ) + + def _heading_reward(self, data: mtx.SceneData) -> np.ndarray: + heading_reward = np.zeros((data.shape[0],), dtype=np.float32) + if self._cfg.heading_reward_weight <= 0.0: + return heading_reward + + torso_frame = self._torso.get_rotation_mat(data) + heading_xy = torso_frame[:, 0, :2] + heading_norm = np.linalg.norm(heading_xy, axis=-1, keepdims=True) + heading_dir = np.divide(heading_xy, heading_norm, out=np.zeros_like(heading_xy), where=heading_norm > 1e-6) + heading_align = heading_dir[:, 0] + return reward.tolerance( + heading_align, + bounds=(1.0, 1.0), + margin=self._cfg.heading_reward_margin, + value_at_margin=0.0, + sigmoid="linear", + ) + + def _height_reward(self, data: mtx.SceneData) -> np.ndarray: + torso_height = self._torso.get_position(data)[:, 2] + return reward.tolerance( + torso_height, + bounds=(self._cfg.stand_height, float("inf")), + margin=self._cfg.stand_height_margin, + value_at_margin=0.0, + sigmoid="linear", + ) + + def _lateral_reward(self, torso_vel: np.ndarray) -> np.ndarray: + return reward.tolerance( + np.abs(torso_vel[:, 1]), + bounds=(0.0, self._cfg.lateral_velocity_limit), + margin=self._cfg.lateral_velocity_margin, + value_at_margin=0.0, + sigmoid="linear", + ) + + def _smooth_reward(self, state: NpEnvState) -> np.ndarray: + smooth_reward = np.zeros((state.data.shape[0],), dtype=np.float32) + if "actions" not in state.info or "last_actions" not in state.info: + return smooth_reward + + delta = state.info["actions"] - state.info["last_actions"] + delta_norm = np.linalg.norm(delta, axis=-1) + return reward.tolerance( + delta_norm, + bounds=(0.0, 0.0), + margin=self._cfg.action_smoothness_margin, + value_at_margin=0.0, + sigmoid="linear", + ) + + def _lin_vel_z_penalty(self, torso_vel: np.ndarray) -> np.ndarray: + return np.square(torso_vel[:, 2]).astype(np.float32) + + def _ang_vel_xy_penalty(self, data: mtx.SceneData) -> np.ndarray: + imu = self._imu(data) + return np.sum(np.square(imu[:, 3:5]), axis=1).astype(np.float32) + + def _similar_to_default_penalty(self, data: mtx.SceneData) -> np.ndarray: + body_dof_pos = data.dof_pos[:, self._dof_pos_slice] + return np.sum(np.abs(body_dof_pos - self._default_body_dof_pos), axis=1).astype(np.float32) + + def _locomotion_reward_terms( + self, + upright_reward: np.ndarray, + move_reward: np.ndarray, + backward_penalty: np.ndarray, + height_reward: np.ndarray, + lateral_reward: np.ndarray, + heading_reward: np.ndarray, + smooth_reward: np.ndarray, + lin_vel_z_penalty: np.ndarray, + ang_vel_xy_penalty: np.ndarray, + similar_to_default_penalty: np.ndarray, + ) -> dict[str, np.ndarray]: + return { + "move": upright_reward * move_reward, + "backward": backward_penalty, + "height": height_reward, + "lateral": lateral_reward, + "heading": heading_reward, + "smooth": smooth_reward, + "lin_vel_z": lin_vel_z_penalty, + "ang_vel_xy": ang_vel_xy_penalty, + "similar_to_default": similar_to_default_penalty, + } + + def _locomotion_reward_scales(self) -> dict[str, float]: + return { + "move": 1.0, + "backward": -self._cfg.backward_penalty_weight, + "height": self._cfg.height_reward_weight, + "lateral": self._cfg.lateral_reward_weight, + "heading": self._cfg.heading_reward_weight, + "smooth": self._cfg.action_smoothness_weight, + "lin_vel_z": -self._cfg.lin_vel_z_weight, + "ang_vel_xy": -self._cfg.ang_vel_xy_weight, + "similar_to_default": -self._cfg.similar_to_default_weight, + } + + def _escape_reward_terms( + self, upright_reward: np.ndarray, escape_reward: np.ndarray, radial_speed_reward: np.ndarray + ) -> dict[str, np.ndarray]: + return { + "escape": upright_reward * escape_reward, + "radial": radial_speed_reward, + } + + def _escape_reward_scales(self) -> dict[str, float]: + return { + "escape": 1.0, + "radial": self._cfg.radial_velocity_weight, + } + + def _sum_scaled_rewards(self, reward_terms: dict[str, np.ndarray], reward_scales: dict[str, float]) -> np.ndarray: + rewards = {name: value * reward_scales[name] for name, value in reward_terms.items()} + return sum(rewards.values()) + + def _get_obs(self, data: mtx.SceneData) -> np.ndarray: + parts = [ + self._egocentric_state(data), + self._torso_velocity(data), + self._torso_upright(data).reshape(data.shape[0], 1), + self._imu(data), + ] + + if self._cfg.include_origin: + parts.append(self._origin(data)) + if self._cfg.include_rangefinder: + parts.append(self._rangefinder(data)) + if self._cfg.include_ball: + parts.append(self._ball_state(data)) + if self._cfg.include_target: + parts.append(self._target_position(data)) + + return np.concatenate(parts, axis=-1).astype(np.float32) + + def _locomotion_reward_info(self, num_envs: int) -> dict: + return { + "upright": np.zeros((num_envs,), dtype=np.float32), + "move": np.zeros((num_envs,), dtype=np.float32), + "backward": np.zeros((num_envs,), dtype=np.float32), + "height": np.zeros((num_envs,), dtype=np.float32), + "lateral": np.zeros((num_envs,), dtype=np.float32), + "heading": np.zeros((num_envs,), dtype=np.float32), + "smooth": np.zeros((num_envs,), dtype=np.float32), + "lin_vel_z": np.zeros((num_envs,), dtype=np.float32), + "ang_vel_xy": np.zeros((num_envs,), dtype=np.float32), + "similar_to_default": np.zeros((num_envs,), dtype=np.float32), + "total": np.zeros((num_envs,), dtype=np.float32), + } + + def _escape_reward_info(self, num_envs: int) -> dict: + info = self._locomotion_reward_info(num_envs) + info.update( + { + "escape": np.zeros((num_envs,), dtype=np.float32), + "radial": np.zeros((num_envs,), dtype=np.float32), + } + ) + return info + + def _fetch_reward_info(self, num_envs: int) -> dict: + return { + "upright": np.zeros((num_envs,), dtype=np.float32), + "stage_move": np.zeros((num_envs,), dtype=np.float32), + "stage_reach": np.zeros((num_envs,), dtype=np.float32), + "stability": np.zeros((num_envs,), dtype=np.float32), + "behind_align": np.zeros((num_envs,), dtype=np.float32), + "face_ball": np.zeros((num_envs,), dtype=np.float32), + "near_ball": np.zeros((num_envs,), dtype=np.float32), + "ready": np.zeros((num_envs,), dtype=np.float32), + "ready_gate": np.zeros((num_envs,), dtype=np.float32), + "fetch": np.zeros((num_envs,), dtype=np.float32), + "push": np.zeros((num_envs,), dtype=np.float32), + "away": np.zeros((num_envs,), dtype=np.float32), + "leg_ball": np.zeros((num_envs,), dtype=np.float32), + "backward": np.zeros((num_envs,), dtype=np.float32), + "total": np.zeros((num_envs,), dtype=np.float32), + } + + def _base_locomotion_components(self, data: mtx.SceneData, state: NpEnvState) -> dict[str, np.ndarray]: + torso_vel = self._torso_velocity(data) + return { + "move": self._move_reward(torso_vel), + "backward": self._backward_penalty(torso_vel), + "height": self._height_reward(data), + "lateral": self._lateral_reward(torso_vel), + "heading": self._heading_reward(data), + "smooth": self._smooth_reward(state), + "lin_vel_z": self._lin_vel_z_penalty(torso_vel), + "ang_vel_xy": self._ang_vel_xy_penalty(data), + "similar_to_default": self._similar_to_default_penalty(data), + } + + def _locomotion_reward(self, upright_reward: np.ndarray, components: dict[str, np.ndarray]) -> np.ndarray: + reward_terms = self._locomotion_reward_terms( + upright_reward, + components["move"], + components["backward"], + components["height"], + components["lateral"], + components["heading"], + components["smooth"], + components["lin_vel_z"], + components["ang_vel_xy"], + components["similar_to_default"], + ) + return self._sum_scaled_rewards(reward_terms, self._locomotion_reward_scales()) + + def _build_reset_info(self, num_envs: int) -> dict: + return { + "Reward": self._init_reward_info(num_envs), + "actions": np.zeros((num_envs, self._model.num_actuators), dtype=np.float32), + "last_actions": np.zeros((num_envs, self._model.num_actuators), dtype=np.float32), + } + + def _random_quaternion(self, num: int) -> np.ndarray: + q = np.random.randn(num, 4).astype(np.float32) + q /= np.linalg.norm(q, axis=-1, keepdims=True) + return q + + def _yaw_quaternion(self, yaw: np.ndarray) -> np.ndarray: + zeros = np.zeros_like(yaw) + half = yaw * 0.5 + return np.stack([zeros, zeros, np.sin(half), np.cos(half)], axis=-1).astype(np.float32) + + def _lift_non_contacting(self, data: mtx.SceneData, dof_pos: np.ndarray) -> np.ndarray: + z = dof_pos[:, 2].copy() + pending = np.ones((data.shape[0],), dtype=bool) + for _ in range(1000): + if not pending.any(): + break + dof_pos[pending, 2] = z[pending] + data.set_dof_pos(dof_pos, self._model) + self._model.forward_kinematic(data) + num_contacts = self._model.get_contact_query(data).num_contacts + pending = num_contacts > 0 + z[pending] += 0.01 + return dof_pos + + def _finish_reset(self, data: mtx.SceneData, dof_pos: np.ndarray, dof_vel: np.ndarray) -> tuple[np.ndarray, dict]: + dof_pos = self._lift_non_contacting(data, dof_pos) + data.set_dof_pos(dof_pos, self._model) + data.set_dof_vel(dof_vel) + self._model.forward_kinematic(data) + + obs = self._get_obs(data) + info = self._build_reset_info(int(data.shape[0])) + return obs, info + + +@registry.env("dm-quadruped-walk", "np") +@registry.env("dm-quadruped-run", "np") +class QuadrupedLocomotionEnv(QuadrupedEnv): + def _init_reward_info(self, num_envs: int) -> dict: + return self._locomotion_reward_info(num_envs) + + def update_state(self, state: NpEnvState) -> NpEnvState: + data = state.data + obs = self._get_obs(data) + + torso_upright = self._torso_upright(data) + upright_reward = self._upright_reward(torso_upright) + locomotion_components = self._base_locomotion_components(data, state) + rwd = self._locomotion_reward(upright_reward, locomotion_components) + + reward_components = {"upright": upright_reward} + reward_components.update(locomotion_components) + reward_components["total"] = rwd + + terminated = np.isnan(obs).any(axis=-1) + rwd = np.where(terminated, 0.0, rwd).astype(np.float32) + state.info["Reward"] = reward_components + + return state.replace(obs=obs, reward=rwd, terminated=terminated) + + def reset(self, data: mtx.SceneData) -> tuple[np.ndarray, dict]: + data.reset(self._model) + num = int(data.shape[0]) + dof_pos = np.tile(self._init_dof_pos, (num, 1)) + dof_vel = np.zeros((num, self._model.num_dof_vel), dtype=np.float32) + + if self._cfg.fix_heading: + dof_pos[:, 3:7] = np.tile(np.array([0.0, 0.0, 0.0, 1.0], dtype=np.float32), (num, 1)) + else: + dof_pos[:, 3:7] = self._random_quaternion(num) + + return self._finish_reset(data, dof_pos, dof_vel) + + +@registry.env("dm-quadruped-escape", "np") +class QuadrupedEscapeEnv(QuadrupedLocomotionEnv): + def _init_reward_info(self, num_envs: int) -> dict: + return self._escape_reward_info(num_envs) + + def update_state(self, state: NpEnvState) -> NpEnvState: + data = state.data + obs = self._get_obs(data) + + torso_upright = self._torso_upright(data) + upright_reward = self._upright_reward(torso_upright) + locomotion_components = self._base_locomotion_components(data, state) + escape_reward = self._escape_reward(data) + radial_speed_reward = self._radial_speed_reward(data) + + reward_terms = self._locomotion_reward_terms( + upright_reward, + locomotion_components["move"], + locomotion_components["backward"], + locomotion_components["height"], + locomotion_components["lateral"], + locomotion_components["heading"], + locomotion_components["smooth"], + locomotion_components["lin_vel_z"], + locomotion_components["ang_vel_xy"], + locomotion_components["similar_to_default"], + ) + reward_scales = self._locomotion_reward_scales() + reward_terms.update(self._escape_reward_terms(upright_reward, escape_reward, radial_speed_reward)) + reward_scales.update(self._escape_reward_scales()) + rwd = self._sum_scaled_rewards(reward_terms, reward_scales) + + reward_components = {"upright": upright_reward} + reward_components.update(locomotion_components) + reward_components.update( + { + "escape": escape_reward, + "radial": radial_speed_reward, + "total": rwd, + } + ) + + terminated = np.isnan(obs).any(axis=-1) + rwd = np.where(terminated, 0.0, rwd).astype(np.float32) + state.info["Reward"] = reward_components + + return state.replace(obs=obs, reward=rwd, terminated=terminated) + + +@registry.env("dm-quadruped-fetch", "np") +class QuadrupedFetchEnv(QuadrupedEnv): + def _init_reward_info(self, num_envs: int) -> dict: + return self._fetch_reward_info(num_envs) + + def update_state(self, state: NpEnvState) -> NpEnvState: + data = state.data + obs = self._get_obs(data) + + torso_upright = self._torso_upright(data) + upright_reward = self._upright_reward(torso_upright) + torso_height = self._torso.get_position(data)[:, 2] + stability_gate = self._fetch_stability_gate(torso_upright, torso_height) + target_radius = float(self._cfg.target_radius) + if self._target_site is not None: + try: + target_radius = float(np.atleast_1d(self._target_site.size)[0]) + except Exception: + pass + + ball_pos = self._ball_body.get_pose(data)[:, :3] + target_pos = self._target_site.get_position(data) + torso_pos = self._torso.get_position(data) + to_target = target_pos[:, :2] - ball_pos[:, :2] + to_target_norm = np.linalg.norm(to_target, axis=-1, keepdims=True) + to_target_dir = np.where(to_target_norm > 1e-6, to_target / to_target_norm, 0.0) + torso_frame = self._torso.get_rotation_mat(data) + heading_xy = torso_frame[:, 0, :2] + heading_norm = np.linalg.norm(heading_xy, axis=-1, keepdims=True) + heading_dir = np.where(heading_norm > 1e-6, heading_xy / heading_norm, 0.0) + to_ball = ball_pos[:, :2] - torso_pos[:, :2] + to_ball_norm = np.linalg.norm(to_ball, axis=-1, keepdims=True) + to_ball_dir = np.where(to_ball_norm > 1e-6, to_ball / to_ball_norm, 0.0) + + behind_align = np.sum(to_ball_dir * to_target_dir, axis=-1) + behind_align_reward = reward.tolerance( + behind_align, + bounds=(1.0, 1.0), + margin=self._cfg.fetch_behind_align_margin, + value_at_margin=0.0, + sigmoid="linear", + ) + heading_align = np.sum(heading_dir * to_ball_dir, axis=-1) + face_ball_reward = reward.tolerance( + heading_align, + bounds=(1.0, 1.0), + margin=self._cfg.fetch_heading_margin, + value_at_margin=0.0, + sigmoid="linear", + ) + ball_to_robot = torso_pos[:, :2] - ball_pos[:, :2] + back_dir = -to_target_dir + corridor_lat = np.linalg.norm( + ball_to_robot - np.sum(ball_to_robot * back_dir, axis=-1, keepdims=True) * back_dir, + axis=-1, + ) + corridor_reward = reward.tolerance( + corridor_lat, + bounds=(0.0, self._cfg.fetch_corridor_width), + margin=self._cfg.fetch_corridor_width, + value_at_margin=0.0, + sigmoid="linear", + ) + ball_dist = np.linalg.norm(to_ball, axis=-1) + near_ball_reward = reward.tolerance( + ball_dist, + bounds=(0.0, self._cfg.fetch_ready_ball_distance), + margin=self._cfg.fetch_ready_ball_distance, + value_at_margin=0.0, + sigmoid="linear", + ) + ready = behind_align_reward * face_ball_reward * corridor_reward * near_ball_reward + ready_gate = reward.tolerance( + ready, + bounds=(self._cfg.fetch_ready_threshold, 1.0), + margin=1.0 - self._cfg.fetch_ready_threshold, + value_at_margin=0.0, + sigmoid="linear", + ) + + behind_pos = ball_pos[:, :2] + back_dir * self._cfg.fetch_behind_distance + ahead_pos = ball_pos[:, :2] + to_target_dir * self._cfg.fetch_ahead_distance + stage_pos = (1.0 - ready_gate)[:, None] * behind_pos + ready_gate[:, None] * ahead_pos + if self._cfg.fetch_side_stage_offset > 0.0: + side_dir = np.stack([-back_dir[:, 1], back_dir[:, 0]], axis=-1) + ball_to_robot_side = np.sum(ball_to_robot * side_dir, axis=-1) + side_sign = np.where(ball_to_robot_side >= 0.0, 1.0, -1.0) + side_pos = behind_pos + (side_sign[:, None] * side_dir * self._cfg.fetch_side_stage_offset) + use_side_stage = ( + (ready_gate < self._cfg.fetch_side_stage_gate_threshold) + & (ball_dist < self._cfg.fetch_side_stage_ball_distance) + & (behind_align < self._cfg.fetch_side_stage_align_threshold) + ) + stage_pos = np.where(use_side_stage[:, None], side_pos, stage_pos) + + to_stage = stage_pos - torso_pos[:, :2] + stage_dist = np.linalg.norm(to_stage, axis=-1) + stage_dir = np.where(stage_dist[:, None] > 1e-6, to_stage / stage_dist[:, None], 0.0) + + speed_to_stage = np.sum(data.dof_vel[:, :2] * stage_dir, axis=-1) + stage_move = reward.tolerance( + speed_to_stage, + bounds=(self._cfg.fetch_stage_speed, float("inf")), + margin=self._cfg.fetch_stage_speed, + value_at_margin=0.0, + sigmoid="linear", + ) + backward_penalty = np.maximum(0.0, -speed_to_stage) + stage_reach = reward.tolerance( + stage_dist, + bounds=(0.0, self._cfg.fetch_stage_radius), + margin=self._cfg.fetch_stage_radius, + value_at_margin=0.0, + sigmoid="linear", + ) + + fetch_reward = reward.tolerance( + self._ball_to_target_distance(data), + bounds=(0.0, target_radius), + margin=self._cfg.fetch_reward_margin, + value_at_margin=0.0, + sigmoid="linear", + ) + ball_vel = data.dof_vel[:, self._ball_vel_slice][:, :2] + ball_speed_to_target = np.sum(ball_vel * to_target_dir, axis=-1) + push_reward = reward.tolerance( + np.maximum(0.0, ball_speed_to_target), + bounds=(self._cfg.fetch_push_speed, float("inf")), + margin=self._cfg.fetch_push_speed, + value_at_margin=0.0, + sigmoid="linear", + ) + away_penalty = (1.0 - ready_gate) * np.maximum(0.0, -ball_speed_to_target) + leg_ball_penalty = self._leg_body_ball_penalty(data) + + rwd = stability_gate * upright_reward * stage_move + rwd -= self._cfg.fetch_backward_penalty_weight * backward_penalty + rwd += self._cfg.fetch_stage_reward_weight * (stability_gate * stage_reach) + rwd += self._cfg.fetch_heading_weight * (stability_gate * face_ball_reward) + rwd += self._cfg.fetch_ready_weight * (stability_gate * ready) + rwd += self._cfg.fetch_reward_weight * (stability_gate * ready_gate * fetch_reward) + rwd += self._cfg.fetch_push_reward_weight * (stability_gate * ready_gate * push_reward) + rwd -= self._cfg.fetch_away_penalty_weight * away_penalty + rwd -= self._cfg.fetch_leg_ball_penalty_weight * leg_ball_penalty + + reward_components = { + "upright": upright_reward, + "stage_move": stage_move, + "stage_reach": stage_reach, + "stability": stability_gate, + "behind_align": behind_align_reward, + "face_ball": face_ball_reward, + "near_ball": near_ball_reward, + "ready": ready, + "ready_gate": ready_gate, + "fetch": fetch_reward, + "push": push_reward, + "away": away_penalty, + "leg_ball": leg_ball_penalty, + "backward": backward_penalty, + "total": rwd, + } + + terminated = np.isnan(obs).any(axis=-1) + terminated |= self._fetch_fall_terminated(torso_upright, torso_height) + rwd = np.where(terminated, 0.0, rwd).astype(np.float32) + for key, value in reward_components.items(): + reward_components[key] = np.where(terminated, 0.0, value).astype(np.float32) + state.info["Reward"] = reward_components + + return state.replace(obs=obs, reward=rwd, terminated=terminated) + + def reset(self, data: mtx.SceneData) -> tuple[np.ndarray, dict]: + data.reset(self._model) + num = int(data.shape[0]) + dof_pos = np.tile(self._init_dof_pos, (num, 1)) + dof_vel = np.zeros((num, self._model.num_dof_vel), dtype=np.float32) + + floor_radius = float(self._floor_geom.size[0]) + if floor_radius <= 0.0: + floor_radius = self._terrain_size + spawn_radius = 0.12 * floor_radius + yaw = np.random.uniform(0.0, 2 * np.pi, size=(num,)) + dof_pos[:, 0] = np.random.uniform(-spawn_radius, spawn_radius, size=(num,)) + dof_pos[:, 1] = np.random.uniform(-spawn_radius, spawn_radius, size=(num,)) + dof_pos[:, 3:7] = self._yaw_quaternion(yaw) + + ball_xy = np.random.uniform(-spawn_radius, spawn_radius, size=(num, 2)) + ball_qpos = self._ball_pos_slice + dof_pos[:, ball_qpos.start : ball_qpos.start + 2] = ball_xy + ball_radius = float(self._ball_geom.size[0]) if self._ball_geom is not None else 0.15 + dof_pos[:, ball_qpos.start + 2] = ball_radius + dof_pos[:, ball_qpos.start + 3 : ball_qpos.stop] = np.tile( + np.array([0.0, 0.0, 0.0, 1.0], dtype=np.float32), (num, 1) + ) + + ball_qvel = self._ball_vel_slice + dof_vel[:, ball_qvel.start : ball_qvel.stop] = 0.0 + + return self._finish_reset(data, dof_pos, dof_vel) diff --git a/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_walk.xml b/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_walk.xml new file mode 100644 index 0000000..66fa32d --- /dev/null +++ b/motrix_envs/src/motrix_envs/basic/quadruped/quadruped_walk.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + diff --git a/motrix_envs/src/motrix_envs/basic/reacher/reacher_np.py b/motrix_envs/src/motrix_envs/basic/reacher/reacher_np.py index f3087ce..8735a67 100644 --- a/motrix_envs/src/motrix_envs/basic/reacher/reacher_np.py +++ b/motrix_envs/src/motrix_envs/basic/reacher/reacher_np.py @@ -79,7 +79,6 @@ class Reacher2DEnv(NpEnv): terminated = np.isnan(obs).any(axis=-1) rwd[terminated] = 0.0 - state.info["target_info"] = {"positions": self._target_xyz.copy(), "size": self._target_size} state.info["Reward"] = {"distance": dist, "tolerance": rwd.copy()} return state.replace(obs=obs, reward=rwd, terminated=terminated) @@ -110,6 +109,8 @@ class Reacher2DEnv(NpEnv): obs = self._get_obs(data) rewards = {"distance": np.zeros((num_reset,)), "tolerance": np.zeros((num_reset,))} - info = {"Reward": rewards, "target_info": {"positions": self._target_xyz.copy(), "size": self._target_size}} + info = { + "Reward": rewards, + } return obs, info diff --git a/motrix_envs/src/motrix_envs/locomotion/anymal_c/anymal_c_np.py b/motrix_envs/src/motrix_envs/locomotion/anymal_c/anymal_c_np.py index b8077c7..e3a9bbd 100644 --- a/motrix_envs/src/motrix_envs/locomotion/anymal_c/anymal_c_np.py +++ b/motrix_envs/src/motrix_envs/locomotion/anymal_c/anymal_c_np.py @@ -500,25 +500,25 @@ class AnymalCEnv(NpEnv): pos_range[0], pos_range[2], # x_min, x_max num_envs, - ) + ).astype(np.float32) robot_init_y = np.random.uniform( pos_range[1], pos_range[3], # y_min, y_max num_envs, - ) + ).astype(np.float32) robot_init_pos = np.stack([robot_init_x, robot_init_y], axis=1) # [num_envs, 2] # Generate target position: offset relative to robot initial position # pose_command_range now represents offset range relative to robot target_offset = np.random.uniform( low=cfg.commands.pose_command_range[:2], high=cfg.commands.pose_command_range[3:5], size=(num_envs, 2) - ) + ).astype(np.float32) target_positions = robot_init_pos + target_offset # Target position in world coordinates # Generate target heading (absolute heading, random in horizontal direction) target_headings = np.random.uniform( low=cfg.commands.pose_command_range[2], high=cfg.commands.pose_command_range[5], size=(num_envs, 1) - ) + ).astype(np.float32) pose_commands = np.concatenate([target_positions, target_headings], axis=1) diff --git a/motrix_envs/src/motrix_envs/locomotion/go1/cfg.py b/motrix_envs/src/motrix_envs/locomotion/go1/cfg.py index 87ffea1..fa02f07 100644 --- a/motrix_envs/src/motrix_envs/locomotion/go1/cfg.py +++ b/motrix_envs/src/motrix_envs/locomotion/go1/cfg.py @@ -92,6 +92,7 @@ class Sensor: feet = ["FR", "FL", "RR", "RL"] +# -- docs-tag-start: go1-reward-config -- @dataclass class RewardConfig: scales: dict[str, float] = field( @@ -119,6 +120,9 @@ class RewardConfig: max_foot_height: float = 0.1 +# -- docs-tag-end: go1-reward-config -- + + @registry.envcfg("go1-flat-terrain-walk") @dataclass class Go1WalkNpEnvCfg(EnvCfg): diff --git a/motrix_envs/src/motrix_envs/locomotion/go1/walk_np.py b/motrix_envs/src/motrix_envs/locomotion/go1/walk_np.py index 706fa2b..1694a98 100644 --- a/motrix_envs/src/motrix_envs/locomotion/go1/walk_np.py +++ b/motrix_envs/src/motrix_envs/locomotion/go1/walk_np.py @@ -244,7 +244,7 @@ class Go1WalkTask(NpEnv): high=self.cfg.commands.vel_limit[1], size=(num_envs, 3), ) - return commands + return commands.astype(np.float32) def update_reward(self, state: NpEnvState) -> NpEnvState: data = state.data @@ -266,12 +266,9 @@ class Go1WalkTask(NpEnv): def reset(self, data) -> tuple[np.ndarray, dict]: num_reset = data.shape[0] - dof_pos = np.tile(self._init_dof_pos, (num_reset, 1)) - dof_vel = np.tile(self._init_dof_vel, (num_reset, 1)) - data.reset(self._model) - data.set_dof_vel(dof_vel) - data.set_dof_pos(dof_pos, self._model) + data.set_dof_vel(self._init_dof_vel) + data.set_dof_pos(self._init_dof_pos, self._model) self._model.forward_kinematic(data) info = { diff --git a/motrix_envs/src/motrix_envs/locomotion/go1/walk_rough_terrain.py b/motrix_envs/src/motrix_envs/locomotion/go1/walk_rough_terrain.py index 6957c2a..48b9640 100644 --- a/motrix_envs/src/motrix_envs/locomotion/go1/walk_rough_terrain.py +++ b/motrix_envs/src/motrix_envs/locomotion/go1/walk_rough_terrain.py @@ -271,7 +271,7 @@ class Go1WalkRoughTask(NpEnv): size=(num_envs, 3), ) # commands[:, 2] = 0 - return commands + return commands.astype(np.float32) def update_reward(self, state: NpEnvState) -> NpEnvState: data = state.data diff --git a/motrix_envs/src/motrix_envs/locomotion/go1/walk_stairs_terrain.py b/motrix_envs/src/motrix_envs/locomotion/go1/walk_stairs_terrain.py index 270a752..505379d 100644 --- a/motrix_envs/src/motrix_envs/locomotion/go1/walk_stairs_terrain.py +++ b/motrix_envs/src/motrix_envs/locomotion/go1/walk_stairs_terrain.py @@ -287,7 +287,7 @@ class Go1WalkStairsTask(NpEnv): high=self.cfg.commands.vel_limit[1], size=(num_envs, 3), ) - return commands + return commands.astype(np.float32) def update_reward(self, state: NpEnvState) -> NpEnvState: data = state.data diff --git a/motrix_envs/src/motrix_envs/locomotion/go2/walk_np.py b/motrix_envs/src/motrix_envs/locomotion/go2/walk_np.py index c0cba5d..e81b3b8 100644 --- a/motrix_envs/src/motrix_envs/locomotion/go2/walk_np.py +++ b/motrix_envs/src/motrix_envs/locomotion/go2/walk_np.py @@ -234,7 +234,7 @@ class Go2WalkTask(NpEnv): high=self.cfg.commands.vel_limit[1], size=(num_envs, 3), ) - return commands + return commands.astype(np.float32) def update_reward(self, state: NpEnvState) -> NpEnvState: data = state.data diff --git a/motrix_envs/src/motrix_envs/manipulation/__init__.py b/motrix_envs/src/motrix_envs/manipulation/__init__.py index de6eec1..4425c61 100755 --- a/motrix_envs/src/motrix_envs/manipulation/__init__.py +++ b/motrix_envs/src/motrix_envs/manipulation/__init__.py @@ -13,4 +13,9 @@ # limitations under the License. # ============================================================================== -from . import franka_lift_cube, franka_open_cabinet, shadow_hand # noqa: F401 import to register envs +from . import ( + franka_lift_cube, + franka_open_cabinet, + rm65_open_cabinet, + shadow_hand, +) diff --git a/motrix_envs/src/motrix_envs/manipulation/franka_lift_cube/xmls/mjx_panda.xml b/motrix_envs/src/motrix_envs/manipulation/franka_lift_cube/xmls/mjx_panda.xml index fc21267..06dd2fa 100755 --- a/motrix_envs/src/motrix_envs/manipulation/franka_lift_cube/xmls/mjx_panda.xml +++ b/motrix_envs/src/motrix_envs/manipulation/franka_lift_cube/xmls/mjx_panda.xml @@ -117,8 +117,7 @@ - + @@ -132,29 +131,25 @@ - + - + - + - + @@ -162,8 +157,7 @@ - + @@ -172,8 +166,7 @@ - + @@ -194,8 +187,7 @@ - + @@ -214,9 +206,7 @@ - + @@ -258,21 +248,14 @@ - - - - - - + + + + + + - + diff --git a/motrix_envs/src/motrix_envs/manipulation/franka_lift_cube/xmls/mjx_scene.xml b/motrix_envs/src/motrix_envs/manipulation/franka_lift_cube/xmls/mjx_scene.xml index 4441268..b1e2f29 100755 --- a/motrix_envs/src/motrix_envs/manipulation/franka_lift_cube/xmls/mjx_scene.xml +++ b/motrix_envs/src/motrix_envs/manipulation/franka_lift_cube/xmls/mjx_scene.xml @@ -15,43 +15,33 @@ - + - - - + + + - + - + - + - - + + diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/__init__.py b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/__init__.py new file mode 100755 index 0000000..8725f5f --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/__init__.py @@ -0,0 +1,16 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from . import rm65_open_cabinet_np # noqa: F401 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/cfg.py b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/cfg.py new file mode 100644 index 0000000..66dbb9d --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/cfg.py @@ -0,0 +1,153 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import os +from dataclasses import dataclass, field + +from motrix_envs import registry +from motrix_envs.base import EnvCfg + +model_file = os.path.dirname(__file__) + "/xmls/scene.xml" + + +@dataclass +class ResetConfig: + joint_pos_noise_scale: float = 0 + + +@dataclass +class ArmControlConfig: + action_mode: str = "joint_target" + action_in_degrees: bool = False + target_action_normalized: bool = True + max_joint_speed: float = 1.15 + max_joint_acc: float = 10.47 + use_speed_limit: bool = True + use_acc_limit: bool = True + target_smoothing_alpha: float = 0.0 + action_delay_steps: int = 6 + actuator_lag_alpha: float = 0.062 + delay_lag_randomization_enabled: bool = True + action_delay_steps_min: int = 6 + action_delay_steps_max: int = 7 + actuator_lag_alpha_min: float = 0.059 + actuator_lag_alpha_max: float = 0.064 + speed_acc_randomization_enabled: bool = True + max_joint_speed_min: float = 0.95 + max_joint_speed_max: float = 1.35 + max_joint_acc_min: float = 8.5 + max_joint_acc_max: float = 12.0 + + +@dataclass +class GripperControlConfig: + action_mode: str = "binary" + use_sigmoid: bool = True + close_threshold: float = 0.7 + close_on_threshold: float = 0.78 + open_off_threshold: float = 0.62 + min_switch_interval_s: float = 0.25 + max_speed: float = 4.0 + use_speed_limit: bool = True + actuator_lag_alpha: float = 0.062 + + +@dataclass +class RewardConfig: + dist_std: float = 0.4 + dist_scale: float = 15.0 + + gripper_close_dist: float = 0.035 + gripper_close_reward: float = 140.0 + gripper_close_penalty: float = -8.0 + + grasp_dist: float = 0.03 + grasp_close_ratio: float = 0.7 + grasp_hold_steps: int = 6 + + open_reward_scale: float = 420.0 + open_delta_reward_scale: float = 260.0 + open_reward_strict_dist: float = 0.08 + + grasp_hold_reward_scale: float = 8.0 + + grasp_hold_open_scale: float = 10.0 + + open_bonus_dist_1: float = 0.15 + open_bonus_reward_1: float = 35.0 + open_bonus_dist_2: float = 0.22 + open_bonus_reward_2: float = 70.0 + + slip_penalty: float = 20.0 + slip_penalty_open_scale: float = 65.0 + slip_open_dist_thresh: float = 0.002 + + action_penalty_rate_late: float = 4e-3 + + finger_penalty_weight: float = 6.0 + finger_penalty_dist: float = 0.6 + finger_align_reward: float = 8.0 + finger_align_close_amount_thresh: float = 0.05 + gripper_switch_penalty: float = 0.8 + gripper_switch_penalty_dist: float = 0.10 + quat_reward_scale: float = 12 + quat_reward_dist_thresh: float = 0.5 + wrong_open_dist: float = 0.032 + action_penalty_switch_step: int = 12000 + action_penalty_rate_early: float = 8e-4 + joint_vel_penalty_rate_early: float = 0.0 + joint_vel_penalty_rate_late: float = 5e-3 + truncation_penalty: float = 10.0 + + +@dataclass +class TerminationConfig: + tcp_behind_handle_threshold: float = -0.02 + max_joint_vel: float = 3.93 + + +@dataclass +class ObservationNoiseConfig: + enabled: bool = True + joint_noise_enabled: bool = True + handle_pose_noise_enabled: bool = True + joint_pos_std: float = 2e-5 + joint_vel_std: float = 1e-4 + target_pos_std: float = 0.01 + target_rot_std: float = 0.017 + target_pos_bias_std: float = 0.015 + target_rot_bias_std: float = 0.03 + bias_resample_prob: float = 0.0 + dropout_prob: float = 0.091 + latency_steps: int = 0 + hold_last_on_dropout: bool = True + + +@registry.envcfg("rm65-open-cabinet") +@dataclass +class RM65OpenCabinetEnvCfg(EnvCfg): + model_file: str = model_file + max_episode_seconds: float = 30.0 + sim_dt: float = 0.005 + ctrl_dt: float = 0.025 + render_spacing: float = 2.0 + action_scale = (0.05, 0.05, 0.05, 0.05, 0.05, 0.05) + action_history_len: int = 9 + reset: ResetConfig = field(default_factory=ResetConfig) + reward: RewardConfig = field(default_factory=RewardConfig) + termination: TerminationConfig = field(default_factory=TerminationConfig) + arm_control: ArmControlConfig = field(default_factory=ArmControlConfig) + gripper_control: GripperControlConfig = field(default_factory=GripperControlConfig) + observation_noise: ObservationNoiseConfig = field(default_factory=ObservationNoiseConfig) diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/gripper_logic.py b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/gripper_logic.py new file mode 100644 index 0000000..a536d54 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/gripper_logic.py @@ -0,0 +1,62 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +from __future__ import annotations + +import numpy as np + + +def raw_action_to_close_ratio(raw_gripper_action: np.ndarray, use_sigmoid: bool) -> np.ndarray: + raw = np.asarray(raw_gripper_action, dtype=np.float32) + if bool(use_sigmoid): + return 1.0 / (1.0 + np.exp(-raw)) + return np.clip((raw + 1.0) * 0.5, 0.0, 1.0) + + +def binary_hysteresis_step( + *, + close_ratio: np.ndarray, + prev_closed: np.ndarray, + steps_since_switch: np.ndarray, + close_on_threshold: float, + open_off_threshold: float, + min_switch_interval_steps: int, +) -> tuple[np.ndarray, np.ndarray]: + close_ratio = np.asarray(close_ratio, dtype=np.float32) + prev_closed = np.asarray(prev_closed, dtype=bool) + steps_since_switch = np.asarray(steps_since_switch, dtype=np.int32) + + close_on = float(np.clip(close_on_threshold, 0.0, 1.0)) + open_off = float(np.clip(open_off_threshold, 0.0, 1.0)) + if open_off > close_on: + open_off = close_on + min_steps = max(int(min_switch_interval_steps), 0) + + can_switch = steps_since_switch >= min_steps + want_close = close_ratio > close_on + want_open = close_ratio < open_off + + next_closed = prev_closed.copy() + next_closed = np.where( + np.logical_and(np.logical_not(prev_closed), np.logical_and(can_switch, want_close)), + True, + next_closed, + ) + next_closed = np.where( + np.logical_and(prev_closed, np.logical_and(can_switch, want_open)), + False, + next_closed, + ) + switched = next_closed != prev_closed + return next_closed.astype(bool), switched.astype(bool) diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/rm65_open_cabinet_np.py b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/rm65_open_cabinet_np.py new file mode 100755 index 0000000..b3a0c77 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/rm65_open_cabinet_np.py @@ -0,0 +1,1132 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import gymnasium as gym +import motrixsim as mtx +import numpy as np + +from motrix_envs import registry +from motrix_envs.math import quaternion +from motrix_envs.np.env import NpEnv, NpEnvState + +from .cfg import RM65OpenCabinetEnvCfg +from .gripper_logic import binary_hysteresis_step, raw_action_to_close_ratio + + +@registry.env("rm65-open-cabinet", "np") +class RM65OpenCabinetEnv(NpEnv): + _cfg: RM65OpenCabinetEnvCfg + + def __init__(self, cfg: RM65OpenCabinetEnvCfg, num_envs: int = 1): + super().__init__(cfg, num_envs=num_envs) + self.gripper_open_pos = 0.0 + self.gripper_closed_pos = -0.91 + gripper_open = self.gripper_open_pos + gripper_mirror = -self.gripper_open_pos + self.robot_default_joint_pos = np.array( + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + gripper_open, + gripper_mirror, + gripper_open, + gripper_mirror, + gripper_mirror, + gripper_mirror, + ], + np.float32, + ) + self._gripper_mimic_multipliers = np.array([-1.0, 1.0, -1.0, -1.0, -1.0], dtype=np.float32) + + self._init_action_spaces() + self._parse_arm_control_config() + self._obs_noise_cfg = self._cfg.observation_noise + self._parse_gripper_control_config() + + self._num_dof_pos = 12 # 6 arm + 6 gripper joints + self._num_dof_vel = 12 + self._init_dof_pos = self.robot_default_joint_pos + self._init_dof_vel = np.zeros(self._num_dof_vel, dtype=np.float32) + self._init_model_handles() + + self.count = 0 + np.set_printoptions(precision=2) + + def _init_action_spaces(self) -> None: + self._action_dim = len(self._cfg.action_scale) + 1 + self._arm_action_dim = self._action_dim - 1 + self.action_scale = np.array(self._cfg.action_scale, np.float32) + self._action_history_len = max(int(getattr(self._cfg, "action_history_len", 0)), 0) + base_obs_dim = self._action_dim * 2 + 7 # action_dim*2 + 7 + self._obs_dim = base_obs_dim + self._action_dim * self._action_history_len + self._action_space = gym.spaces.Box(-np.inf, np.inf, (self._action_dim,), dtype=np.float32) + self._observation_space = gym.spaces.Box(-np.inf, np.inf, (self._obs_dim,), dtype=np.float32) + + def _parse_arm_control_config(self) -> None: + arm_cfg = self._cfg.arm_control + ctrl_dt = float(self._cfg.ctrl_dt) + + self._arm_action_mode = arm_cfg.action_mode + self._arm_action_in_degrees = arm_cfg.action_in_degrees + self._arm_target_action_normalized = arm_cfg.target_action_normalized + self._arm_use_speed_limit = arm_cfg.use_speed_limit + self._arm_max_step = float(arm_cfg.max_joint_speed) * ctrl_dt + self._arm_use_acc_limit = bool(arm_cfg.use_acc_limit) + self._arm_max_acc_step = float(arm_cfg.max_joint_acc) * (ctrl_dt**2) + self._arm_action_delay_steps = int(arm_cfg.action_delay_steps) + self._arm_actuator_lag_alpha = float(np.clip(float(arm_cfg.actuator_lag_alpha), 0.0, 1.0)) + self._arm_delay_lag_randomization_enabled = bool(getattr(arm_cfg, "delay_lag_randomization_enabled", False)) + + delay_min = int(getattr(arm_cfg, "action_delay_steps_min", self._arm_action_delay_steps)) + delay_max = int(getattr(arm_cfg, "action_delay_steps_max", self._arm_action_delay_steps)) + if delay_min > delay_max: + delay_min, delay_max = delay_max, delay_min + self._arm_action_delay_steps_min = max(delay_min, 0) + self._arm_action_delay_steps_max = max(delay_max, self._arm_action_delay_steps_min) + self._arm_action_delay_buffer_len = ( + max(int(self._arm_action_delay_steps), self._arm_action_delay_steps_max, 0) + 1 + ) + + lag_min = float(getattr(arm_cfg, "actuator_lag_alpha_min", self._arm_actuator_lag_alpha)) + lag_max = float(getattr(arm_cfg, "actuator_lag_alpha_max", self._arm_actuator_lag_alpha)) + if lag_min > lag_max: + lag_min, lag_max = lag_max, lag_min + self._arm_actuator_lag_alpha_min = float(np.clip(lag_min, 0.0, 1.0)) + self._arm_actuator_lag_alpha_max = float(np.clip(lag_max, 0.0, 1.0)) + + self._arm_speed_acc_randomization_enabled = bool(getattr(arm_cfg, "speed_acc_randomization_enabled", False)) + speed_min = float(getattr(arm_cfg, "max_joint_speed_min", arm_cfg.max_joint_speed)) + speed_max = float(getattr(arm_cfg, "max_joint_speed_max", arm_cfg.max_joint_speed)) + if speed_min > speed_max: + speed_min, speed_max = speed_max, speed_min + speed_min = max(speed_min, 0.0) + speed_max = max(speed_max, speed_min) + self._arm_max_step_min = float(speed_min * ctrl_dt) + self._arm_max_step_max = float(speed_max * ctrl_dt) + + acc_min = float(getattr(arm_cfg, "max_joint_acc_min", arm_cfg.max_joint_acc)) + acc_max = float(getattr(arm_cfg, "max_joint_acc_max", arm_cfg.max_joint_acc)) + if acc_min > acc_max: + acc_min, acc_max = acc_max, acc_min + acc_min = max(acc_min, 0.0) + acc_max = max(acc_max, acc_min) + self._arm_max_acc_step_min = float(acc_min * (ctrl_dt**2)) + self._arm_max_acc_step_max = float(acc_max * (ctrl_dt**2)) + self._arm_target_smoothing_alpha = float(np.clip(float(arm_cfg.target_smoothing_alpha), 0.0, 1.0)) + + def _parse_gripper_control_config(self) -> None: + self._gripper_cfg = self._cfg.gripper_control + self._gripper_action_mode = self._gripper_cfg.action_mode + self._gripper_use_sigmoid = bool(self._gripper_cfg.use_sigmoid) + self._gripper_close_threshold = float(self._gripper_cfg.close_threshold) + self._gripper_close_on_threshold = float( + getattr(self._gripper_cfg, "close_on_threshold", self._gripper_close_threshold) + ) + self._gripper_open_off_threshold = float( + getattr(self._gripper_cfg, "open_off_threshold", self._gripper_close_threshold) + ) + if self._gripper_open_off_threshold > self._gripper_close_on_threshold: + self._gripper_open_off_threshold = self._gripper_close_on_threshold + min_switch_interval_s = float(getattr(self._gripper_cfg, "min_switch_interval_s", 0.0)) + self._gripper_min_switch_interval_steps = max(int(round(min_switch_interval_s / self._cfg.ctrl_dt)), 0) + self._gripper_use_speed_limit = bool(self._gripper_cfg.use_speed_limit) + self._gripper_max_step = float(self._gripper_cfg.max_speed) * self._cfg.ctrl_dt + self._gripper_actuator_lag_alpha = float(np.clip(float(self._gripper_cfg.actuator_lag_alpha), 0.0, 1.0)) + + def _init_model_handles(self) -> None: + self.robot = self._model.get_body("base_link") + self.gripper_tcp = self._model.get_site("gripper") + self.left_finger_pad = self._model.get_site("left_finger_pad") + self.right_finger_pad = self._model.get_site("right_finger_pad") + self.robot_joint_pos_min_limit = self._model.actuator_ctrl_limits[0] + self.robot_joint_pos_max_limit = self._model.actuator_ctrl_limits[1] + self._obs_joint_pos_min_limit = self.robot_joint_pos_min_limit[: self._action_dim].astype(np.float32, copy=True) + self._obs_joint_pos_max_limit = self.robot_joint_pos_max_limit[: self._action_dim].astype(np.float32, copy=True) + self._obs_joint_pos_range = np.maximum( + self._obs_joint_pos_max_limit - self._obs_joint_pos_min_limit, + 1e-6, + ) + + self.drawer_top_joint = self._model.get_joint("drawer_bottom_joint") + self.drawer_top_handle = self._model.get_site("drawer_bottom_handle") + + def _compute_hold_action(self, dof_pos: np.ndarray) -> np.ndarray: + num_envs = dof_pos.shape[0] + arm_pos = dof_pos[:, : self._arm_action_dim] + if self._arm_action_mode == "delta": + arm_action = np.zeros((num_envs, self._arm_action_dim), dtype=np.float32) + elif self._arm_action_mode == "joint_target": + if self._arm_action_in_degrees: + arm_action = np.rad2deg(arm_pos).astype(np.float32) + elif self._arm_target_action_normalized: + arm_min = self.robot_joint_pos_min_limit[: self._arm_action_dim] + arm_max = self.robot_joint_pos_max_limit[: self._arm_action_dim] + denom = np.maximum(arm_max - arm_min, 1e-6) + arm_action = (2.0 * (arm_pos - arm_min) / denom - 1.0).astype(np.float32) + else: + arm_action = arm_pos.astype(np.float32) + else: + raise ValueError(f"Unsupported arm action mode: {self._arm_action_mode}") + + gripper_pos = dof_pos[:, self._arm_action_dim] + open_pos = float(self.gripper_open_pos) + closed_pos = float(self.gripper_closed_pos) + gripper_range = closed_pos - open_pos + if abs(gripper_range) < 1e-6: + gripper_range = -1.0 + close_ratio = (gripper_pos - open_pos) / gripper_range + close_ratio = np.clip(close_ratio, 0.0, 1.0) + if self._gripper_action_mode == "binary": + close_mask = close_ratio > self._gripper_close_threshold + if self._gripper_use_sigmoid: + gripper_action = np.where(close_mask, 10.0, -10.0) + else: + gripper_action = np.where(close_mask, 1.0, -1.0) + elif self._gripper_action_mode == "continuous": + if self._gripper_use_sigmoid: + eps = 1e-4 + cr = np.clip(close_ratio, eps, 1.0 - eps) + gripper_action = np.log(cr / (1.0 - cr)) + else: + gripper_action = close_ratio * 2.0 - 1.0 + else: + raise ValueError(f"Unsupported gripper action mode: {self._gripper_action_mode}") + gripper_action = gripper_action.astype(np.float32) + return np.concatenate([arm_action, gripper_action[:, None]], axis=-1) + + @property + def observation_space(self): + return self._observation_space + + @property + def action_space(self): + return self._action_space + + def _sample_arm_delay_lag(self, num_envs: int) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]: + if self._arm_delay_lag_randomization_enabled: + delay_steps = np.random.randint( + self._arm_action_delay_steps_min, + self._arm_action_delay_steps_max + 1, + size=(num_envs,), + ).astype(np.int32) + lag_alpha = np.random.uniform( + self._arm_actuator_lag_alpha_min, + self._arm_actuator_lag_alpha_max, + size=(num_envs,), + ).astype(np.float32) + else: + delay_steps = np.full((num_envs,), int(self._arm_action_delay_steps), dtype=np.int32) + lag_alpha = np.full((num_envs,), float(self._arm_actuator_lag_alpha), dtype=np.float32) + if self._arm_speed_acc_randomization_enabled: + max_step = np.random.uniform( + self._arm_max_step_min, + self._arm_max_step_max, + size=(num_envs,), + ).astype(np.float32) + max_acc_step = np.random.uniform( + self._arm_max_acc_step_min, + self._arm_max_acc_step_max, + size=(num_envs,), + ).astype(np.float32) + else: + max_step = np.full((num_envs,), float(self._arm_max_step), dtype=np.float32) + max_acc_step = np.full((num_envs,), float(self._arm_max_acc_step), dtype=np.float32) + return delay_steps, lag_alpha, max_step, max_acc_step + + def _apply_action_delay(self, actions: np.ndarray, info: dict) -> np.ndarray: + num_envs = actions.shape[0] + delay_steps = info.get("arm_action_delay_steps") + if not isinstance(delay_steps, np.ndarray) or delay_steps.shape != (num_envs,): + delay_steps = np.full((num_envs,), int(self._arm_action_delay_steps), dtype=np.int32) + else: + delay_steps = delay_steps.astype(np.int32, copy=False) + delay_steps = np.maximum(delay_steps, 0) + buffer_len = max(int(self._arm_action_delay_buffer_len), 1) + delay_steps = np.minimum(delay_steps, buffer_len - 1) + + buffer = info.get("action_delay_buffer") + expected_shape = (num_envs, buffer_len, actions.shape[1]) + if buffer is None or buffer.shape != expected_shape: + buffer = np.repeat(actions[:, None, :], buffer_len, axis=1) + else: + buffer = np.roll(buffer, 1, axis=1) + buffer[:, 0, :] = actions + steps = info.get("steps") + if isinstance(steps, np.ndarray) and steps.shape == (num_envs,): + reset_mask = steps == 0 + if np.any(reset_mask): + buffer[reset_mask] = np.repeat(actions[reset_mask][:, None, :], buffer_len, axis=1) + info["action_delay_buffer"] = buffer + return buffer[np.arange(num_envs), delay_steps, :] + + def _update_action_history(self, raw_actions: np.ndarray, delayed_actions: np.ndarray, info: dict) -> None: + if self._action_history_len <= 0: + return + + hist = info.get("action_history") + expected_shape = (delayed_actions.shape[0], self._action_history_len, delayed_actions.shape[1]) + if hist is None or hist.shape != expected_shape: + hist = np.repeat(raw_actions[:, None, :], self._action_history_len, axis=1) + else: + hist = np.roll(hist, 1, axis=1) + hist[:, 0, :] = raw_actions + steps = info.get("steps") + if isinstance(steps, np.ndarray) and steps.shape == (delayed_actions.shape[0],): + reset_mask = steps == 0 + if np.any(reset_mask): + hist[reset_mask] = np.repeat(raw_actions[reset_mask][:, None, :], self._action_history_len, axis=1) + info["action_history"] = hist + + def _apply_arm_action(self, arm_action: np.ndarray, old_joint_pos: np.ndarray, info: dict) -> np.ndarray: + arm_min_limit = self.robot_joint_pos_min_limit[: self._arm_action_dim] + arm_max_limit = self.robot_joint_pos_max_limit[: self._arm_action_dim] + smoothing_active = self._arm_action_mode == "joint_target" and self._arm_target_smoothing_alpha > 0.0 + + if self._arm_action_mode == "delta": + action_delta = arm_action * self.action_scale + target_joint_pos = old_joint_pos + action_delta + target_joint_pos = np.clip(target_joint_pos, arm_min_limit, arm_max_limit) + elif self._arm_action_mode == "joint_target": + if self._arm_action_in_degrees: + target_joint_pos = np.deg2rad(arm_action) + elif self._arm_target_action_normalized: + arm_action = np.clip(arm_action, -1.0, 1.0) + target_joint_pos = arm_min_limit + (arm_action + 1.0) * 0.5 * (arm_max_limit - arm_min_limit) + else: + target_joint_pos = arm_action + target_joint_pos = np.clip(target_joint_pos, arm_min_limit, arm_max_limit) + if smoothing_active: + prev_target = info.get("arm_target_smooth", old_joint_pos) + if not isinstance(prev_target, np.ndarray) or prev_target.shape != target_joint_pos.shape: + prev_target = old_joint_pos + target_joint_pos = ( + 1.0 - self._arm_target_smoothing_alpha + ) * prev_target + self._arm_target_smoothing_alpha * target_joint_pos + else: + raise ValueError(f"Unsupported arm action mode: {self._arm_action_mode}") + + action_delta = target_joint_pos - old_joint_pos + if self._arm_use_speed_limit: + max_step = info.get("arm_max_step") + if isinstance(max_step, np.ndarray) and max_step.shape == (action_delta.shape[0],): + max_step_vec = np.maximum(max_step.astype(np.float32, copy=False), 0.0) + action_delta = np.clip(action_delta, -max_step_vec[:, None], max_step_vec[:, None]) + else: + action_delta = np.clip(action_delta, -self._arm_max_step, self._arm_max_step) + + if self._arm_use_acc_limit: + prev_delta = info.get("arm_prev_delta", np.zeros_like(action_delta)) + if not isinstance(prev_delta, np.ndarray) or prev_delta.shape != action_delta.shape: + prev_delta = np.zeros_like(action_delta) + max_delta_change = info.get("arm_max_acc_step") + if isinstance(max_delta_change, np.ndarray) and max_delta_change.shape == (action_delta.shape[0],): + max_delta_change_vec = np.maximum(max_delta_change.astype(np.float32, copy=False), 0.0) + delta_change = np.clip( + action_delta - prev_delta, + -max_delta_change_vec[:, None], + max_delta_change_vec[:, None], + ) + action_delta = prev_delta + delta_change + else: + max_delta_change_scalar = float(self._arm_max_acc_step) + if max_delta_change_scalar > 0.0: + delta_change = np.clip( + action_delta - prev_delta, + -max_delta_change_scalar, + max_delta_change_scalar, + ) + action_delta = prev_delta + delta_change + else: + action_delta = prev_delta + + info["arm_prev_delta"] = action_delta + target_joint_pos = old_joint_pos + action_delta + if smoothing_active: + info["arm_target_smooth"] = target_joint_pos + + lag_alpha = info.get("arm_actuator_lag_alpha", self._arm_actuator_lag_alpha) + if isinstance(lag_alpha, np.ndarray) and lag_alpha.shape == (target_joint_pos.shape[0],): + lag_alpha_vec = np.clip(lag_alpha.astype(np.float32, copy=False), 0.0, 1.0) + else: + lag_alpha_vec = np.full((target_joint_pos.shape[0],), float(self._arm_actuator_lag_alpha), dtype=np.float32) + if np.any(lag_alpha_vec > 0.0): + prev_cmd = info.get("arm_actuator_target", old_joint_pos) + if not isinstance(prev_cmd, np.ndarray) or prev_cmd.shape != target_joint_pos.shape: + prev_cmd = old_joint_pos + target_joint_pos = (1.0 - lag_alpha_vec[:, None]) * prev_cmd + (lag_alpha_vec[:, None] * target_joint_pos) + + target_joint_pos = target_joint_pos.astype(np.float32, copy=False) + info["arm_actuator_target"] = target_joint_pos + return target_joint_pos + + def _apply_gripper_action(self, gripper_action: np.ndarray, info: dict) -> np.ndarray: + close_ratio = raw_action_to_close_ratio(gripper_action, use_sigmoid=self._gripper_use_sigmoid) + gripper_closed_cmd = None + if self._gripper_action_mode == "binary": + prev_closed = info.get("gripper_binary_closed") + if not isinstance(prev_closed, np.ndarray) or prev_closed.shape != close_ratio.shape: + prev_closed = close_ratio > self._gripper_close_on_threshold + steps_since_switch = info.get("gripper_steps_since_switch") + if not isinstance(steps_since_switch, np.ndarray) or steps_since_switch.shape != close_ratio.shape: + steps_since_switch = np.full( + close_ratio.shape, + self._gripper_min_switch_interval_steps, + dtype=np.int32, + ) + gripper_closed_cmd, switched = binary_hysteresis_step( + close_ratio=close_ratio, + prev_closed=prev_closed, + steps_since_switch=steps_since_switch, + close_on_threshold=self._gripper_close_on_threshold, + open_off_threshold=self._gripper_open_off_threshold, + min_switch_interval_steps=self._gripper_min_switch_interval_steps, + ) + steps_since_switch = np.where(switched, 0, steps_since_switch + 1).astype(np.int32) + info["gripper_binary_closed"] = gripper_closed_cmd + info["gripper_steps_since_switch"] = steps_since_switch + gripper_pos = np.where(gripper_closed_cmd, self.gripper_closed_pos, self.gripper_open_pos) + elif self._gripper_action_mode == "continuous": + gripper_pos = self.gripper_open_pos + (self.gripper_closed_pos - self.gripper_open_pos) * close_ratio + gripper_closed_cmd = close_ratio > self._gripper_close_threshold + else: + raise ValueError(f"Unsupported gripper action mode: {self._gripper_action_mode}") + + prev_gripper = info.get("gripper_target_smooth", gripper_pos) + if not isinstance(prev_gripper, np.ndarray) or prev_gripper.shape != gripper_pos.shape: + prev_gripper = gripper_pos + if self._gripper_use_speed_limit and self._gripper_max_step > 0.0: + delta = np.clip(gripper_pos - prev_gripper, -self._gripper_max_step, self._gripper_max_step) + gripper_pos = prev_gripper + delta + if self._gripper_actuator_lag_alpha > 0.0: + gripper_pos = (1.0 - self._gripper_actuator_lag_alpha) * prev_gripper + ( + self._gripper_actuator_lag_alpha * gripper_pos + ) + + gripper_pos = gripper_pos.astype(np.float32, copy=False) + info["gripper_target_smooth"] = gripper_pos + if gripper_closed_cmd is not None: + info["gripper_closed_cmd"] = np.asarray(gripper_closed_cmd, dtype=bool) + info["gripper_close_ratio"] = np.asarray(close_ratio, dtype=np.float32) + info["current_gripper_action"] = gripper_pos + return gripper_pos[:, None] + + def apply_action(self, actions: np.ndarray, state: NpEnvState): + assert not np.isnan(actions).any(), "actions contain nan" + + raw_actions = np.array(actions, copy=True) + delayed_actions = self._apply_action_delay(actions, state.info) + self._update_action_history(raw_actions, delayed_actions, state.info) + state.info["last_actions"] = state.info["current_actions"] + state.info["current_actions"] = delayed_actions + + old_joint_pos = self.get_robot_joint_pos(state.data)[:, : self._arm_action_dim] + target_joint_pos = self._apply_arm_action(delayed_actions[:, : self._arm_action_dim], old_joint_pos, state.info) + gripper_action_cmd = self._apply_gripper_action(delayed_actions[:, -1], state.info) + + new_pos = np.concatenate([target_joint_pos, gripper_action_cmd], axis=-1) + + # step action + cliped_new_pos = np.clip( + new_pos, self.robot_joint_pos_min_limit, self.robot_joint_pos_max_limit, dtype=np.float32 + ) # clip new pos to limit + + # actuator1~8 by order + state.data.actuator_ctrls = cliped_new_pos + + return state + + def update_state(self, state: NpEnvState): + self._enforce_drawer_grasp_constraint(state) + # compute obs + obs = self._compute_observation(state.data, state.info) + # compute truncated + truncated = self._check_termination(state) + + # compute reward + reward = self._compute_reward(state, truncated) + + state.obs = obs + state.reward = reward + state.terminated = truncated + + self.count += 1 + + return state + + def _enforce_drawer_grasp_constraint(self, state: NpEnvState): + reward_cfg = self._cfg.reward + robot_grasp_pose = self.gripper_tcp.get_pose(state.data) + drawer_grasp_pose = self.drawer_top_handle.get_pose(state.data) + gripper_drawer_dist = np.linalg.norm(drawer_grasp_pose[:, :3] - robot_grasp_pose[:, :3], axis=-1) + gripper_range = max(abs(self.gripper_open_pos - self.gripper_closed_pos), 1e-6) + close_ratio = np.clip( + (self.gripper_open_pos - state.info["current_gripper_action"]) / gripper_range, + 0.0, + 1.0, + ) + left_z = self.left_finger_pad.get_pose(state.data)[:, 2] + right_z = self.right_finger_pad.get_pose(state.data)[:, 2] + align_mask = np.logical_and(drawer_grasp_pose[:, 2] - left_z >= 0.0, right_z - drawer_grasp_pose[:, 2] >= 0.0) + grasp_candidate = np.logical_and( + gripper_drawer_dist < reward_cfg.grasp_dist, + close_ratio > reward_cfg.grasp_close_ratio, + ) + grasp_candidate = np.logical_and(grasp_candidate, align_mask) + + hold_steps = state.info.get("grasp_hold_steps") + if not isinstance(hold_steps, np.ndarray) or hold_steps.shape != grasp_candidate.shape: + hold_steps = np.zeros_like(grasp_candidate, dtype=np.int32) + hold_steps = np.where(grasp_candidate, hold_steps + 1, 0) + required_steps = max(int(getattr(reward_cfg, "grasp_hold_steps", 1)), 1) + grasped = hold_steps >= required_steps + + state.info["grasp_hold_steps"] = hold_steps + state.info["grasped"] = grasped + phase2_mask = state.info.get("phase2_mask", grasped) + phase2_mask = np.logical_or(phase2_mask, grasped) + state.info["phase2_mask"] = phase2_mask + + def reset(self, data: mtx.SceneData): + num_reset = data.shape[0] + + noise_scale = self._cfg.reset.joint_pos_noise_scale + noise_pos = np.random.uniform(-noise_scale, noise_scale, (num_reset, self._action_dim)) + + dof_pos = np.tile(self._init_dof_pos, (num_reset, 1)) + dof_pos[:, : self._action_dim] += noise_pos # Add noise in range [-0.125, 0.125] + gripper_left = dof_pos[:, self._action_dim - 1] + mimic_pos = gripper_left[:, None] * self._gripper_mimic_multipliers[None, :] + dof_pos[:, self._action_dim :] = mimic_pos + data.reset(self._model) + data.set_dof_vel(np.zeros((num_reset, self._num_dof_vel + 4), dtype=np.float32)) # Includes robot and cabinet + data.set_dof_pos(np.concatenate([dof_pos, np.zeros((num_reset, 4), dtype=np.float32)], axis=-1), self._model) + self._model.forward_kinematic(data) + + hold_action = self._compute_hold_action(dof_pos) + gripper_range = max(abs(self.gripper_open_pos - self.gripper_closed_pos), 1e-6) + init_close_ratio = np.clip((self.gripper_open_pos - gripper_left) / gripper_range, 0.0, 1.0).astype(np.float32) + init_binary_closed = init_close_ratio > self._gripper_close_on_threshold + arm_delay_steps, arm_lag_alpha, arm_max_step, arm_max_acc_step = self._sample_arm_delay_lag(num_reset) + obs_noise_cfg = self._obs_noise_cfg + bias_pos = np.zeros((num_reset, 3), dtype=np.float32) + if obs_noise_cfg.target_pos_bias_std > 0.0: + bias_pos = np.random.normal(0.0, obs_noise_cfg.target_pos_bias_std, size=(num_reset, 3)).astype(np.float32) + bias_quat = self._sample_quat_bias(num_reset, obs_noise_cfg.target_rot_bias_std) + handle_pose = self.drawer_top_handle.get_pose(data).astype(np.float32) + info = { + "current_actions": hold_action.copy(), + "last_actions": hold_action.copy(), + "phase2_mask": np.zeros(num_reset, dtype=bool), # 1D array + "grasped": np.zeros(num_reset, dtype=bool), + "grasp_hold_steps": np.zeros(num_reset, dtype=np.int32), + "current_gripper_action": np.full(num_reset, self.gripper_open_pos, dtype=np.float32), # 1D array + "obs_handle_bias_pos": bias_pos, + "obs_handle_bias_quat": bias_quat, + "obs_handle_pose_last": handle_pose.copy(), + "handle_pose_override": np.zeros((num_reset, handle_pose.shape[1]), dtype=np.float32), + "handle_pose_override_mask": np.zeros(num_reset, dtype=bool), + "arm_action_delay_steps": arm_delay_steps, + "arm_actuator_lag_alpha": arm_lag_alpha, + "arm_max_step": arm_max_step, + "arm_max_acc_step": arm_max_acc_step, + "arm_target_smooth": dof_pos[:, : self._arm_action_dim], + "arm_prev_delta": np.zeros((num_reset, self._arm_action_dim), dtype=np.float32), + "arm_actuator_target": dof_pos[:, : self._arm_action_dim], + "gripper_target_smooth": gripper_left.copy(), + "gripper_binary_closed": init_binary_closed.astype(bool, copy=False), + "gripper_closed_cmd": init_binary_closed.astype(bool, copy=False), + "gripper_steps_since_switch": np.full( + num_reset, + self._gripper_min_switch_interval_steps, + dtype=np.int32, + ), + "gripper_close_ratio": init_close_ratio.copy(), + "prev_gripper_closed_cmd": init_binary_closed.astype(bool, copy=True), + "prev_open_dist": np.zeros(num_reset, dtype=np.float32), + "open_bonus_progress": np.zeros(num_reset, dtype=np.int32), + "Reward": { + "dist": np.zeros(num_reset, dtype=np.float32), + "quat": np.zeros(num_reset, dtype=np.float32), + "close_gripper": np.zeros(num_reset, dtype=np.float32), + "open_reward": np.zeros(num_reset, dtype=np.float32), + "open_delta_reward": np.zeros(num_reset, dtype=np.float32), + "slip_penalty": np.zeros(num_reset, dtype=np.float32), + "finger_penalty": np.zeros(num_reset, dtype=np.float32), + "action_penalty": np.zeros(num_reset, dtype=np.float32), + "joint_vel_penalty": np.zeros(num_reset, dtype=np.float32), + "gripper_switch_penalty": np.zeros(num_reset, dtype=np.float32), + "truncation_penalty": np.zeros(num_reset, dtype=np.float32), + }, + "metrics": { + "open_dist": np.zeros(num_reset, dtype=np.float32), + "gripper_drawer_dist": np.zeros(num_reset, dtype=np.float32), + "gripper_close_rate": np.zeros(num_reset, dtype=np.float32), + "close_amount": np.zeros(num_reset, dtype=np.float32), + "wrong_open": np.zeros(num_reset, dtype=np.float32), + "gripper_switch": np.zeros(num_reset, dtype=np.float32), + "action_penalty_rate": np.zeros(num_reset, dtype=np.float32), + "joint_vel_penalty_rate": np.zeros(num_reset, dtype=np.float32), + }, + } + buffer_len = max(int(self._arm_action_delay_buffer_len), 1) + info["action_delay_buffer"] = np.repeat(hold_action[:, None, :], buffer_len, axis=1) + if self._action_history_len > 0: + info["action_history"] = np.repeat(hold_action[:, None, :], self._action_history_len, axis=1) + latency_steps = max(int(obs_noise_cfg.latency_steps), 0) + if latency_steps > 0: + info["obs_handle_pose_buffer"] = np.repeat(handle_pose[:, None, :], latency_steps + 1, axis=1) + obs = self._compute_observation(data, info) + return obs, info + + def _compute_observation(self, data: mtx.SceneData, info: dict): + num_envs = data.shape[0] + obs_noise_cfg = self._obs_noise_cfg + + # dof_pos: (num_envs, 7) range: [-1 ~ 1] + dof_pos = self.get_robot_joint_pos(data) # shape: (num_envs, 7) + dof_pos_rel_raw = self._get_robot_joint_pos_rel(dof_pos)[:, : self._action_dim] + dof_pos_rel = dof_pos_rel_raw.copy() + if obs_noise_cfg.enabled and obs_noise_cfg.joint_noise_enabled and obs_noise_cfg.joint_pos_std > 0.0: + dof_pos_rel = dof_pos_rel + np.random.normal( + 0.0, obs_noise_cfg.joint_pos_std, size=dof_pos_rel.shape + ).astype(np.float32) + + dof_pos_abs = dof_pos_rel + self.robot_default_joint_pos[: self._action_dim] + dof_pos_abs_raw = dof_pos_rel_raw + self.robot_default_joint_pos[: self._action_dim] + dof_pos_scaled = 2.0 * (dof_pos_abs - self._obs_joint_pos_min_limit) / self._obs_joint_pos_range - 1.0 + # relative vel: finite-difference from consecutive joint positions + # to reduce dependency on simulator/driver-specific velocity channels. + dt = max(float(self._cfg.ctrl_dt), 1e-6) + prev_dof_pos_abs_raw = info.get("obs_prev_dof_pos_abs_raw") + if isinstance(prev_dof_pos_abs_raw, np.ndarray) and prev_dof_pos_abs_raw.shape == dof_pos_abs_raw.shape: + dof_vel_rel = (dof_pos_abs_raw - prev_dof_pos_abs_raw) / dt + else: + dof_vel_rel = np.zeros_like(dof_pos_abs_raw, dtype=np.float32) + + steps = info.get("steps") + if isinstance(steps, np.ndarray) and steps.shape == (num_envs,): + reset_mask = steps == 0 + if np.any(reset_mask): + dof_vel_rel[reset_mask] = 0.0 + info["obs_prev_dof_pos_abs_raw"] = dof_pos_abs_raw.astype(np.float32, copy=True) + + if obs_noise_cfg.enabled and obs_noise_cfg.joint_noise_enabled and obs_noise_cfg.joint_vel_std > 0.0: + dof_vel_rel = dof_vel_rel + np.random.normal( + 0.0, obs_noise_cfg.joint_vel_std, size=dof_vel_rel.shape + ).astype(np.float32) + dof_vel_rel = dof_vel_rel / 2 + + # relative pose: position delta + relative quaternion (target * current.inverse) + robot_grasp_pose = self.gripper_tcp.get_pose(data) + drawer_grasp_pose = self._resolve_handle_pose(data, info) + if obs_noise_cfg.enabled and obs_noise_cfg.handle_pose_noise_enabled: + drawer_grasp_pose = self._get_noisy_handle_pose(drawer_grasp_pose, info) + pos_delta = drawer_grasp_pose[:, :3] - robot_grasp_pose[:, :3] + quat_target = drawer_grasp_pose[:, 3:] + quat_current = robot_grasp_pose[:, 3:] + q_rel = quaternion.mul(quat_target, quaternion.inverse(quat_current)) + q_norm = np.linalg.norm(q_rel, axis=-1, keepdims=True) + q_rel = q_rel / np.maximum(q_norm, 1e-6) + # Enforce a consistent hemisphere to avoid sign flips. + sign = np.where(q_rel[:, 3:4] < 0.0, -1.0, 1.0) + q_rel = q_rel * sign + to_target = np.concatenate([pos_delta, q_rel], axis=-1) + + obs = np.concatenate([dof_pos_scaled, dof_vel_rel, to_target], axis=-1) + if self._action_history_len > 0: + history = info.get("action_history") + expected_shape = (num_envs, self._action_history_len, self._action_dim) + if history is None or history.shape != expected_shape: + history = np.zeros(expected_shape, dtype=np.float32) + else: + history = history.astype(np.float32, copy=False) + obs = np.concatenate([obs, history.reshape(num_envs, -1)], axis=-1) + + assert obs.shape == (num_envs, self._obs_dim) + assert not np.isnan(obs).any(), "obs contain nan" + return np.clip(obs, -5, 5) + + def _resolve_handle_pose(self, data: mtx.SceneData, info: dict): + handle_pose = self.drawer_top_handle.get_pose(data) + override = info.get("handle_pose_override") + if override is not None: + override_pose = np.asarray(override, dtype=np.float32) + if override_pose.ndim == 1 and override_pose.shape[0] == handle_pose.shape[1]: + override_pose = np.tile(override_pose, (handle_pose.shape[0], 1)) + if override_pose.shape != handle_pose.shape: + return handle_pose + override_mask = info.get("handle_pose_override_mask") + if override_mask is not None: + mask = np.asarray(override_mask, dtype=bool) + if mask.shape != (handle_pose.shape[0],): + return handle_pose + if np.any(mask): + return np.where(mask[:, None], override_pose, handle_pose) + if np.any(override_pose): + return override_pose + return handle_pose + return override_pose + return handle_pose + + def _sample_quat_bias(self, num_envs: int, rot_std: float): + identity = np.array([0.0, 0.0, 0.0, 1.0], dtype=np.float32) + base = np.tile(identity, (num_envs, 1)) + if rot_std <= 0.0: + return base + return self._apply_quat_noise(base, rot_std) + + def _apply_quat_noise(self, quat: np.ndarray, rot_std: float): + num_envs = quat.shape[0] + axes = np.random.normal(0.0, 1.0, (num_envs, 3)).astype(np.float32) + axis_norm = np.linalg.norm(axes, axis=-1, keepdims=True) + safe_axis = np.array([1.0, 0.0, 0.0], dtype=np.float32) + axes = np.where(axis_norm < 1e-6, safe_axis, axes) + axes = axes / np.maximum(axis_norm, 1e-6) + angles = np.random.normal(0.0, rot_std, (num_envs,)).astype(np.float32) + half_angles = angles * 0.5 + sin_half = np.sin(half_angles).astype(np.float32) + cos_half = np.cos(half_angles).astype(np.float32) + delta_q = np.concatenate([axes * sin_half[:, None], cos_half[:, None]], axis=-1) + noisy_quat = quaternion.mul(delta_q, quat) + quat_norm = np.linalg.norm(noisy_quat, axis=-1, keepdims=True) + return noisy_quat / np.maximum(quat_norm, 1e-6) + + def _get_noisy_handle_pose(self, handle_pose: np.ndarray, info: dict): + cfg = self._obs_noise_cfg + if not cfg.enabled or not cfg.handle_pose_noise_enabled: + return handle_pose + + num_envs = handle_pose.shape[0] + noisy_pose = handle_pose.copy() + + bias_resample_prob = float(np.clip(cfg.bias_resample_prob, 0.0, 1.0)) + if cfg.target_pos_bias_std > 0.0: + bias_pos = info.get("obs_handle_bias_pos") + if not isinstance(bias_pos, np.ndarray) or bias_pos.shape != (num_envs, 3): + bias_pos = np.random.normal(0.0, cfg.target_pos_bias_std, size=(num_envs, 3)).astype(np.float32) + if bias_resample_prob > 0.0: + resample_mask = np.random.rand(num_envs) < bias_resample_prob + if np.any(resample_mask): + bias_pos[resample_mask] = np.random.normal( + 0.0, cfg.target_pos_bias_std, size=(resample_mask.sum(), 3) + ).astype(np.float32) + info["obs_handle_bias_pos"] = bias_pos + noisy_pose[:, :3] = noisy_pose[:, :3] + bias_pos + + if cfg.target_rot_bias_std > 0.0: + bias_quat = info.get("obs_handle_bias_quat") + if not isinstance(bias_quat, np.ndarray) or bias_quat.shape != (num_envs, 4): + bias_quat = self._sample_quat_bias(num_envs, cfg.target_rot_bias_std) + if bias_resample_prob > 0.0: + resample_mask = np.random.rand(num_envs) < bias_resample_prob + if np.any(resample_mask): + bias_quat[resample_mask] = self._sample_quat_bias(int(resample_mask.sum()), cfg.target_rot_bias_std) + info["obs_handle_bias_quat"] = bias_quat + noisy_pose[:, 3:] = quaternion.mul(bias_quat, noisy_pose[:, 3:]) + + if cfg.target_pos_std > 0.0: + noisy_pose[:, :3] = noisy_pose[:, :3] + np.random.normal( + 0.0, cfg.target_pos_std, size=(num_envs, 3) + ).astype(np.float32) + if cfg.target_rot_std > 0.0: + noisy_pose[:, 3:] = self._apply_quat_noise(noisy_pose[:, 3:], cfg.target_rot_std) + + dropout_prob = float(np.clip(cfg.dropout_prob, 0.0, 1.0)) + if dropout_prob > 0.0: + dropout_mask = np.random.rand(num_envs) < dropout_prob + if np.any(dropout_mask): + last_pose = info.get("obs_handle_pose_last") + if cfg.hold_last_on_dropout and isinstance(last_pose, np.ndarray): + noisy_pose[dropout_mask] = last_pose[dropout_mask] + else: + noisy_pose[dropout_mask] = handle_pose[dropout_mask] + + info["obs_handle_pose_last"] = noisy_pose.copy() + + latency_steps = max(int(cfg.latency_steps), 0) + if latency_steps > 0: + buffer = info.get("obs_handle_pose_buffer") + expected_shape = (num_envs, latency_steps + 1, noisy_pose.shape[1]) + if buffer is None or buffer.shape != expected_shape: + buffer = np.repeat(noisy_pose[:, None, :], latency_steps + 1, axis=1) + else: + buffer = np.roll(buffer, 1, axis=1) + buffer[:, 0, :] = noisy_pose + info["obs_handle_pose_buffer"] = buffer + return buffer[:, -1, :] + + return noisy_pose + + def _compute_distance_alignment_terms( + self, + state: NpEnvState, + reward_cfg, + robot_grasp_pose: np.ndarray, + drawer_grasp_pose: np.ndarray, + gripper_drawer_dist: np.ndarray, + ) -> dict[str, np.ndarray]: + dist_reward = 1 - np.tanh(gripper_drawer_dist / reward_cfg.dist_std) + dist_reward *= reward_cfg.dist_scale + + quat_reward = quaternion.similarity(robot_grasp_pose[:, -4:], drawer_grasp_pose[:, -4:]) + if reward_cfg.quat_reward_dist_thresh > 0.0: + quat_reward = np.where(gripper_drawer_dist < reward_cfg.quat_reward_dist_thresh, quat_reward, 0.0) + quat_reward = quat_reward * reward_cfg.quat_reward_scale + + lfinger_dist = drawer_grasp_pose[:, 2] - self.left_finger_pad.get_pose(state.data)[:, 2] + rfinger_dist = self.right_finger_pad.get_pose(state.data)[:, 2] - drawer_grasp_pose[:, 2] + align_mask = np.logical_and(lfinger_dist >= 0.0, rfinger_dist >= 0.0) + + gripper_range = max(abs(self.gripper_open_pos - self.gripper_closed_pos), 1e-6) + close_amount_raw = self.gripper_open_pos - state.info["current_gripper_action"] + close_amount_raw = np.clip(close_amount_raw, 0.0, gripper_range) + close_ratio = close_amount_raw / gripper_range + close_amount = close_amount_raw * (0.04 / gripper_range) + close_gripper = ( + np.where( + np.logical_and(gripper_drawer_dist < reward_cfg.gripper_close_dist, align_mask), + reward_cfg.gripper_close_reward, + reward_cfg.gripper_close_penalty, + ) + * close_amount + ) + + return { + "dist_reward": dist_reward, + "quat_reward": quat_reward, + "lfinger_dist": lfinger_dist, + "rfinger_dist": rfinger_dist, + "align_mask": align_mask, + "close_ratio": close_ratio, + "close_amount": close_amount, + "close_gripper": close_gripper, + } + + def _compute_open_reward_terms( + self, + state: NpEnvState, + reward_cfg, + gripper_drawer_dist: np.ndarray, + align_mask: np.ndarray, + ) -> dict[str, np.ndarray]: + open_dist = self.drawer_top_joint.get_dof_pos(state.data) + open_dist = np.asarray(open_dist).reshape(-1) + open_dist = np.clip(open_dist, 0.0, 1.0) + + open_reward = (np.exp(open_dist) - 1.0) * reward_cfg.open_reward_scale + if reward_cfg.wrong_open_dist > 0.0: + wrong_open = np.logical_and(open_dist > 0.0, gripper_drawer_dist > reward_cfg.wrong_open_dist) + else: + wrong_open = np.zeros_like(open_dist, dtype=bool) + open_reward = np.where(np.logical_not(wrong_open), open_reward, 0.0) + + grasped = state.info.get("grasped") + if grasped is None: + grasped = align_mask + phase2_mask = state.info.get("phase2_mask") + if not isinstance(phase2_mask, np.ndarray) or phase2_mask.shape != grasped.shape: + phase2_mask = grasped + + strict_open_gate = np.logical_or(grasped, phase2_mask) + strict_open_dist = float(getattr(reward_cfg, "open_reward_strict_dist", 0.0)) + if strict_open_dist > 0.0: + near_mask = gripper_drawer_dist < strict_open_dist + else: + near_mask = np.ones_like(open_dist, dtype=bool) + + open_gate = np.logical_and(strict_open_gate, near_mask) + open_reward = np.where(open_gate, open_reward, 0.0) + + prev_open_dist = state.info.get("prev_open_dist") + if not isinstance(prev_open_dist, np.ndarray) or prev_open_dist.shape != open_dist.shape: + prev_open_dist = np.zeros_like(open_dist, dtype=np.float32) + open_delta = np.clip(open_dist - prev_open_dist, 0.0, None) + open_delta_reward = open_delta * reward_cfg.open_delta_reward_scale + open_delta_reward = np.where(open_gate, open_delta_reward, 0.0) + open_delta_reward = np.where(np.logical_not(wrong_open), open_delta_reward, 0.0) + + state.info["prev_open_dist"] = open_dist.astype(np.float32, copy=True) + + return { + "open_dist": open_dist, + "wrong_open": wrong_open, + "grasped": grasped, + "phase2_mask": phase2_mask, + "open_reward": open_reward, + "open_delta_reward": open_delta_reward, + } + + def _compute_progress_reward_terms( + self, + state: NpEnvState, + reward_cfg, + open_dist: np.ndarray, + grasped: np.ndarray, + phase2_mask: np.ndarray, + ) -> dict[str, np.ndarray]: + grasp_hold_reward_scale = float(getattr(reward_cfg, "grasp_hold_reward_scale", 0.0)) + grasp_hold_open_scale = float(getattr(reward_cfg, "grasp_hold_open_scale", 0.0)) + grasp_hold_reward = np.where(grasped, grasp_hold_reward_scale + grasp_hold_open_scale * open_dist, 0.0) + + prev_open_bonus = state.info.get("open_bonus_progress") + if not isinstance(prev_open_bonus, np.ndarray) or prev_open_bonus.shape != open_dist.shape: + prev_open_bonus = np.zeros_like(open_dist, dtype=np.int32) + + bonus1_dist = float(getattr(reward_cfg, "open_bonus_dist_1", 0.0)) + bonus1_reward = float(getattr(reward_cfg, "open_bonus_reward_1", 0.0)) + bonus2_dist = float(getattr(reward_cfg, "open_bonus_dist_2", 0.0)) + bonus2_reward = float(getattr(reward_cfg, "open_bonus_reward_2", 0.0)) + + bonus_progress = prev_open_bonus.copy() + pass_bonus1 = np.logical_and(open_dist >= bonus1_dist, bonus_progress < 1) + pass_bonus2 = np.logical_and(open_dist >= bonus2_dist, bonus_progress < 2) + open_bonus_reward = np.where(pass_bonus1, bonus1_reward, 0.0) + open_bonus_reward += np.where(pass_bonus2, bonus2_reward, 0.0) + open_bonus_reward = np.where(grasped, open_bonus_reward, 0.0) + bonus_progress = np.where(pass_bonus1, 1, bonus_progress) + bonus_progress = np.where(pass_bonus2, 2, bonus_progress) + state.info["open_bonus_progress"] = bonus_progress.astype(np.int32) + + slip_open_dist_thresh = float(np.clip(reward_cfg.slip_open_dist_thresh, 0.0, 1.0)) + slipped = np.logical_and( + np.logical_and(phase2_mask, np.logical_not(grasped)), + open_dist > slip_open_dist_thresh, + ) + slip_penalty_open_scale = float(getattr(reward_cfg, "slip_penalty_open_scale", 0.0)) + slip_penalty = np.where( + slipped, + -(reward_cfg.slip_penalty + slip_penalty_open_scale * open_dist), + 0.0, + ) + + return { + "grasp_hold_reward": grasp_hold_reward, + "open_bonus_reward": open_bonus_reward, + "slip_penalty": slip_penalty, + } + + def _compute_penalty_terms( + self, + state: NpEnvState, + reward_cfg, + gripper_drawer_dist: np.ndarray, + lfinger_dist: np.ndarray, + rfinger_dist: np.ndarray, + align_mask: np.ndarray, + close_amount: np.ndarray, + close_ratio: np.ndarray, + open_dist: np.ndarray, + ) -> dict[str, np.ndarray]: + action_penalty = np.sum(np.square(state.info["current_actions"] - state.info["last_actions"]), axis=-1) + joint_vel_penalty = np.sum(np.square(state.data.dof_vel[:, : self._action_dim]), axis=-1) + + finger_penalty = np.zeros_like(lfinger_dist) + finger_penalty += np.where(lfinger_dist < 0.0, lfinger_dist, 0.0) + finger_penalty += np.where(rfinger_dist < 0.0, rfinger_dist, 0.0) + finger_penalty = finger_penalty * reward_cfg.finger_penalty_weight + close_mask = gripper_drawer_dist < reward_cfg.finger_penalty_dist + finger_penalty = np.where(close_mask, finger_penalty, 0.0) + + align_open_mask = close_amount < reward_cfg.finger_align_close_amount_thresh + finger_align_reward = np.where( + np.logical_and(close_mask, np.logical_and(align_mask, align_open_mask)), + reward_cfg.finger_align_reward, + 0.0, + ) + + gripper_closed_cmd = state.info.get("gripper_closed_cmd") + if not isinstance(gripper_closed_cmd, np.ndarray) or gripper_closed_cmd.shape != close_ratio.shape: + gripper_closed_cmd = close_ratio > self._gripper_close_threshold + gripper_closed_cmd = np.asarray(gripper_closed_cmd, dtype=bool) + prev_gripper_closed_cmd = state.info.get("prev_gripper_closed_cmd") + if not isinstance(prev_gripper_closed_cmd, np.ndarray) or ( + prev_gripper_closed_cmd.shape != gripper_closed_cmd.shape + ): + prev_gripper_closed_cmd = gripper_closed_cmd.copy() + switch_mask = gripper_closed_cmd != prev_gripper_closed_cmd + switch_penalty_dist = float(getattr(reward_cfg, "gripper_switch_penalty_dist", 0.0)) + if switch_penalty_dist > 0.0: + switch_gate = gripper_drawer_dist < switch_penalty_dist + else: + switch_gate = np.ones_like(switch_mask, dtype=bool) + gripper_switch_penalty_scale = float(getattr(reward_cfg, "gripper_switch_penalty", 0.0)) + gripper_switch_penalty = np.where( + np.logical_and(switch_mask, switch_gate), + -gripper_switch_penalty_scale, + 0.0, + ).astype(np.float32) + state.info["prev_gripper_closed_cmd"] = gripper_closed_cmd.copy() + + if self.count < reward_cfg.action_penalty_switch_step: + action_penalty_rate = reward_cfg.action_penalty_rate_early + joint_vel_penalty_rate = reward_cfg.joint_vel_penalty_rate_early + else: + action_penalty_rate = reward_cfg.action_penalty_rate_late + joint_vel_penalty_rate = reward_cfg.joint_vel_penalty_rate_late + + action_penalty_term = -action_penalty_rate * action_penalty + joint_vel_penalty_term = -joint_vel_penalty_rate * joint_vel_penalty + + return { + "finger_penalty": finger_penalty, + "finger_align_reward": finger_align_reward, + "gripper_switch_penalty": gripper_switch_penalty, + "switch_mask": switch_mask, + "action_penalty_term": action_penalty_term, + "joint_vel_penalty_term": joint_vel_penalty_term, + "action_penalty_rate": np.full_like(open_dist, action_penalty_rate, dtype=np.float32), + "joint_vel_penalty_rate": np.full_like(open_dist, joint_vel_penalty_rate, dtype=np.float32), + } + + def _update_reward_info( + self, + state: NpEnvState, + *, + reward_cfg, + alignment_terms: dict[str, np.ndarray], + open_terms: dict[str, np.ndarray], + progress_terms: dict[str, np.ndarray], + penalty_terms: dict[str, np.ndarray], + gripper_drawer_dist: np.ndarray, + truncation_penalty: np.ndarray, + ) -> None: + grasped = open_terms["grasped"] + state.info["Reward"] = { + "dist": alignment_terms["dist_reward"], + "quat": alignment_terms["quat_reward"], + "close_gripper": alignment_terms["close_gripper"], + "open_reward": open_terms["open_reward"], + "open_delta_reward": open_terms["open_delta_reward"], + "grasp_hold_reward": progress_terms["grasp_hold_reward"], + "open_bonus_reward": progress_terms["open_bonus_reward"], + "slip_penalty": progress_terms["slip_penalty"], + "finger_penalty": penalty_terms["finger_penalty"], + "finger_align_reward": penalty_terms["finger_align_reward"], + "gripper_switch_penalty": penalty_terms["gripper_switch_penalty"], + "grasped_rate": grasped.astype(np.float32), + "action_penalty": penalty_terms["action_penalty_term"], + "joint_vel_penalty": penalty_terms["joint_vel_penalty_term"], + "truncation_penalty": truncation_penalty, + } + state.info["metrics"] = { + "open_dist": open_terms["open_dist"], + "gripper_drawer_dist": gripper_drawer_dist, + "gripper_close_rate": (gripper_drawer_dist < reward_cfg.gripper_close_dist).astype(np.float32), + "grasp_dist_hit_rate": (gripper_drawer_dist < reward_cfg.grasp_dist).astype(np.float32), + "grasp_close_hit_rate": (alignment_terms["close_ratio"] > reward_cfg.grasp_close_ratio).astype(np.float32), + "grasp_align_hit_rate": alignment_terms["align_mask"].astype(np.float32), + "close_amount": alignment_terms["close_amount"], + "wrong_open": open_terms["wrong_open"].astype(np.float32), + "gripper_switch": penalty_terms["switch_mask"].astype(np.float32), + "grasped_rate": grasped.astype(np.float32), + "action_penalty_rate": penalty_terms["action_penalty_rate"], + "joint_vel_penalty_rate": penalty_terms["joint_vel_penalty_rate"], + } + + def _compute_reward(self, state: NpEnvState, truncated: np.ndarray): + robot_grasp_pose = self.gripper_tcp.get_pose(state.data) + drawer_grasp_pose = self.drawer_top_handle.get_pose(state.data) + + gripper_drawer_dist = np.linalg.norm(drawer_grasp_pose[:, :3] - robot_grasp_pose[:, :3], axis=-1) + reward_cfg = self._cfg.reward + alignment_terms = self._compute_distance_alignment_terms( + state, + reward_cfg, + robot_grasp_pose, + drawer_grasp_pose, + gripper_drawer_dist, + ) + open_terms = self._compute_open_reward_terms( + state, + reward_cfg, + gripper_drawer_dist, + alignment_terms["align_mask"], + ) + progress_terms = self._compute_progress_reward_terms( + state, + reward_cfg, + open_terms["open_dist"], + open_terms["grasped"], + open_terms["phase2_mask"], + ) + penalty_terms = self._compute_penalty_terms( + state, + reward_cfg, + gripper_drawer_dist, + alignment_terms["lfinger_dist"], + alignment_terms["rfinger_dist"], + alignment_terms["align_mask"], + alignment_terms["close_amount"], + alignment_terms["close_ratio"], + open_terms["open_dist"], + ) + + step2_reward = ( + alignment_terms["dist_reward"] + + alignment_terms["quat_reward"] + + alignment_terms["close_gripper"] + + open_terms["open_reward"] + + open_terms["open_delta_reward"] + + progress_terms["grasp_hold_reward"] + + progress_terms["open_bonus_reward"] + + progress_terms["slip_penalty"] + + penalty_terms["finger_penalty"] + + penalty_terms["finger_align_reward"] + + penalty_terms["gripper_switch_penalty"] + ) + reward = step2_reward + penalty_terms["action_penalty_term"] + penalty_terms["joint_vel_penalty_term"] + truncation_penalty = np.where(truncated, -reward_cfg.truncation_penalty, 0.0) + reward = reward + truncation_penalty + + self._update_reward_info( + state, + reward_cfg=reward_cfg, + alignment_terms=alignment_terms, + open_terms=open_terms, + progress_terms=progress_terms, + penalty_terms=penalty_terms, + gripper_drawer_dist=gripper_drawer_dist, + truncation_penalty=truncation_penalty, + ) + + return reward + + def _check_termination(self, state: NpEnvState): + # Check if robot arm extends too far forward causing collision + robot_grasp_pos_x = self.gripper_tcp.get_pose(state.data)[:, 0] + drawer_grasp_pos_x = self.drawer_top_handle.get_pose(state.data)[:, 0] + termination_cfg = self._cfg.termination + truncated = robot_grasp_pos_x - drawer_grasp_pos_x < termination_cfg.tcp_behind_handle_threshold + + # Check that joint velocity doesn't exceed threshold of 5 rad/s + joint_vel = self.get_robot_joint_vel(state.data) + truncated = np.logical_or(truncated, np.abs(joint_vel).max(axis=-1) > termination_cfg.max_joint_vel) + return truncated + + def get_robot_joint_pos(self, data: mtx.SceneModel): + return self.robot.get_joint_dof_pos(data)[:, : self._num_dof_pos] + + def get_robot_joint_vel(self, data: mtx.SceneModel): + return self.robot.get_joint_dof_vel(data)[:, : self._num_dof_pos] + + def _get_robot_joint_pos_rel(self, dof_pos: np.ndarray): + return dof_pos - self.robot_default_joint_pos + + def _get_robot_joint_vel_rel(self, dof_vel: np.ndarray): + return dof_vel - self._init_dof_vel diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/LICENSE b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/LICENSE new file mode 100755 index 0000000..d9a10c0 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/LICENSE @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/box.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/box.obj new file mode 100755 index 0000000..701a67a --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/box.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9d29e9a8cd2187d4cc54c17d261a8f0dba4fd75f43c3913194b1d4ad87c74b4 +size 444 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/cabinet.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/cabinet.obj new file mode 100644 index 0000000..3847288 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/cabinet.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2416faaf6f93732f15dc8748a830621ceef393822f388a2f1e5335f05128a35 +size 16120 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.mtl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.mtl new file mode 100755 index 0000000..b557d8b --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl Material.001 +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.840000 0.80000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 +# map_Kd WoodFine0035_1_S.jpg diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.obj new file mode 100755 index 0000000..351a8da --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:faac6910a79c21389ed9ad3cb4177c51bb674b77b30b1717bdbbf6ca2ee23227 +size 65480 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.obj.mtl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.obj.mtl new file mode 100755 index 0000000..21b46cf --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.obj.mtl @@ -0,0 +1,9 @@ +# File produced by Open Asset Import Library (http://www.assimp.sf.net) +# (assimp v3.1.187496374) + +newmtl DefaultMaterial +Kd 0.6 0.6 0.6 +Ka 0.05 0.05 0.05 +Ks 0.6 0.6 0.6 +illum 1 + diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.stl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.stl new file mode 100755 index 0000000..098c89c --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.stl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5883b7c6f94df7ec293b4f56f9cdbf1cb78cde84b7ffc8d20154e1d8f0c8cf93 +size 17184 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.wrl new file mode 100755 index 0000000..527c2b1 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left.wrl @@ -0,0 +1,553 @@ +#VRML V2.0 utf8 +Group { + children [ + Shape { + appearance Appearance { + material Material { + diffuseColor 0.975 0.486 0.975 + specularColor 0.7 0.7 1.0 + } + } + geometry IndexedFaceSet { + solid FALSE + coord Coordinate { + point [ +-0.010282 -0.189491 0.188934, +-0.008882 -0.190891 0.188934, +-0.006123 -0.190891 0.188934, +-0.010282 -0.184131 0.188934, +-0.006123 -0.190891 0.210934, +-0.010282 -0.184131 0.210934, +-0.006123 -0.184131 0.210934, +-0.010282 -0.189491 -0.189757, +-0.010282 -0.184131 -0.189757, +-0.006123 -0.190891 -0.189757, +-0.008882 -0.190891 -0.189757, +-0.006123 -0.190891 -0.211757, +-0.010282 -0.184131 -0.211757, +-0.010282 -0.189491 -0.211757, +-0.008882 -0.190891 -0.211757, +-0.008882 -0.190891 0.210934, +-0.010282 -0.189491 0.210934, +-0.006123 -0.184131 0.188934, +-0.006123 -0.184131 -0.189757, +-0.006123 -0.184131 -0.211757, +0.009747 -0.106958 -0.165943, +0.009747 0.104562 -0.165943, +0.009747 0.104562 0.165120, +0.009747 -0.106958 0.165120, +-0.010282 -0.139733 0.195593, +-0.010282 0.137337 0.195593, +-0.010282 0.137337 -0.196416, +-0.010282 -0.139733 -0.196416, +0.003847 -0.139733 0.195593, +0.003847 0.137337 0.195593, +0.003847 0.137337 -0.196416, +0.003847 -0.139733 -0.196416, +0.003847 -0.116058 0.175151, +0.009324 -0.107677 0.166763, +0.009324 0.105281 0.166763, +0.003847 0.113662 0.175151, +0.003847 -0.119309 -0.172721, +0.009324 -0.110927 -0.164332, +0.009324 -0.110927 0.163509, +0.003847 -0.119309 0.171898, +0.003847 0.113662 -0.175974, +0.009324 0.105281 -0.167586, +0.009324 -0.107677 -0.167586, +0.003847 -0.116058 -0.175974, +0.003847 0.116913 0.171898, +0.009324 0.108531 0.163509, +0.009324 0.108531 -0.164332, +0.003847 0.116913 -0.172721, +0.003847 -0.117480 0.174948, +0.009324 -0.109099 0.166560, +0.003847 -0.118496 0.174338, +0.009324 -0.110115 0.165949, +0.009324 0.106703 0.166560, +0.003847 0.115084 0.174948, +0.009324 0.107719 0.165949, +0.003847 0.116100 0.174338, +0.003847 -0.119106 -0.174144, +0.009324 -0.110724 -0.165755, +0.003847 -0.118496 -0.175161, +0.009324 -0.110115 -0.166772, +0.009324 -0.110724 0.164933, +0.003847 -0.119106 0.173321, +0.003847 0.115084 -0.175771, +0.009324 0.106703 -0.167382, +0.003847 0.116100 -0.175161, +0.009324 0.107719 -0.166772, +0.009324 -0.109099 -0.167382, +0.003847 -0.117480 -0.175771, +0.003847 0.116710 0.173321, +0.009324 0.108328 0.164933, +0.009324 0.108328 -0.165755, +0.003847 0.116710 -0.174144, +0.009747 -0.108112 0.164955, +0.009747 -0.108742 0.164576, +0.009747 -0.109121 0.163945, +0.009747 -0.109286 0.162790, +0.009747 -0.108743 -0.165399, +0.009747 -0.109121 -0.164767, +0.009747 -0.108112 -0.165778, +0.009747 0.105716 -0.165778, +0.009747 0.106347 -0.165399, +0.009747 0.106725 -0.164767, +0.009747 0.106890 -0.163613, +0.009747 0.106890 0.162790, +0.009747 0.106725 0.163945, +0.009747 0.106347 0.164576, +0.009747 0.105716 0.164955, +0.008363 0.136073 0.253550, +-0.008882 0.136073 0.253550, +-0.008882 -0.138469 0.253550, +0.008363 -0.138469 0.253550, +-0.008882 0.136073 -0.254373, +0.008363 0.136073 -0.254373, +0.008363 -0.138469 -0.254373, +-0.008882 -0.138469 -0.254373, +0.009763 -0.138469 -0.252973, +0.009763 0.136073 -0.252973, +0.009763 0.136073 -0.197681, +0.009763 -0.138469 -0.197681, +-0.010282 -0.138469 -0.252973, +-0.010282 -0.138469 -0.197681, +-0.010282 0.136073 -0.197681, +-0.010282 0.136073 -0.252973, +0.009763 0.136073 0.252150, +0.009763 -0.138469 0.252150, +0.009763 -0.138469 0.196858, +0.009763 0.136073 0.196858, +-0.010282 0.136073 0.252150, +-0.010282 0.136073 0.196858, +-0.010282 -0.138469 0.196858, +-0.010282 -0.138469 0.252150, +0.008363 -0.139733 0.252150, +-0.008882 -0.139733 0.252150, +-0.008882 -0.139733 0.196858, +0.008363 -0.139733 0.196858, +-0.008882 0.137337 0.252150, +0.008363 0.137337 0.252150, +0.008363 0.137337 0.196858, +-0.008882 0.137337 0.196858, +-0.008882 0.136073 0.195593, +0.008363 0.136073 0.195593, +0.008363 -0.138469 0.195593, +-0.008882 -0.138469 0.195593, +0.008363 0.137337 -0.252973, +-0.008882 0.137337 -0.252973, +-0.008882 0.137337 -0.197681, +0.008363 0.137337 -0.197681, +-0.008882 -0.139733 -0.252973, +0.008363 -0.139733 -0.252973, +0.008363 -0.139733 -0.197681, +-0.008882 -0.139733 -0.197681, +-0.008882 -0.138469 -0.196416, +0.008363 -0.138469 -0.196416, +0.008363 0.136073 -0.196416, +-0.008882 0.136073 -0.196416, +0.008363 0.190111 0.252150, +0.008363 0.190111 -0.252973, +-0.008882 0.190111 -0.252973, +-0.008882 0.190111 0.252150, +0.008363 0.188711 0.253550, +-0.008882 0.188711 0.253550, +-0.008882 0.138601 0.253550, +0.008363 0.138601 0.253550, +-0.008882 0.188711 -0.254373, +0.008363 0.188711 -0.254373, +0.008363 0.138601 -0.254373, +-0.008882 0.138601 -0.254373, +0.009763 0.138601 -0.252973, +0.009763 0.188711 -0.252973, +0.009763 0.188711 0.252150, +0.009763 0.138601 0.252150, +-0.010282 0.138601 0.252150, +-0.010282 0.188711 0.252150, +-0.010282 0.188711 -0.252973, +-0.010282 0.138601 -0.252973, +0.009763 -0.189491 0.252150, +0.008363 -0.189491 0.253550, +0.008363 -0.190891 0.252150, +-0.008882 -0.189491 0.253550, +-0.010282 -0.189491 0.252150, +-0.008882 -0.190891 0.252150, +0.009763 -0.140997 0.252150, +0.008363 -0.140997 0.253550, +-0.008882 -0.140997 0.253550, +-0.010282 -0.140997 0.252150, +0.008363 -0.190891 0.188934, +0.009763 -0.189491 0.188934, +0.009763 -0.140997 0.188934, +0.008363 -0.139733 0.188934, +-0.008882 -0.139733 0.188934, +-0.010282 -0.140997 0.188934, +0.009763 -0.140997 -0.189757, +0.008363 -0.139733 -0.189757, +0.009763 -0.189491 -0.189757, +0.009763 -0.189491 -0.252973, +0.008363 -0.190891 -0.252973, +0.008363 -0.189491 -0.254373, +-0.008882 -0.189491 -0.254373, +-0.008882 -0.190891 -0.252973, +-0.010282 -0.189491 -0.252973, +0.009763 -0.140997 -0.252973, +0.008363 -0.140997 -0.254373, +-0.008882 -0.140997 -0.254373, +-0.010282 -0.140997 -0.252973, +0.008363 -0.190891 -0.189757, +-0.008882 -0.139733 -0.189757, +-0.010282 -0.140997 -0.189757, + + ] + } + coordIndex [ +0, 1, 2, -1, +0, 2, 3, -1, +4, 5, 6, -1, +7, 8, 9, -1, +7, 9, 10, -1, +11, 12, 13, -1, +11, 13, 14, -1, +4, 15, 16, -1, +4, 16, 5, -1, +2, 17, 3, -1, +8, 18, 9, -1, +11, 19, 12, -1, +20, 21, 22, -1, +20, 22, 23, -1, +24, 25, 26, -1, +24, 26, 27, -1, +24, 28, 29, -1, +24, 29, 25, -1, +25, 29, 30, -1, +25, 30, 26, -1, +26, 30, 31, -1, +26, 31, 27, -1, +27, 31, 28, -1, +27, 28, 24, -1, +29, 28, 31, -1, +29, 31, 30, -1, +32, 33, 34, -1, +32, 34, 35, -1, +36, 37, 38, -1, +36, 38, 39, -1, +40, 41, 42, -1, +40, 42, 43, -1, +44, 45, 46, -1, +44, 46, 47, -1, +32, 48, 49, -1, +32, 49, 33, -1, +48, 50, 51, -1, +48, 51, 49, -1, +35, 34, 52, -1, +35, 52, 53, -1, +53, 52, 54, -1, +53, 54, 55, -1, +36, 56, 57, -1, +36, 57, 37, -1, +56, 58, 59, -1, +56, 59, 57, -1, +39, 38, 60, -1, +39, 60, 61, -1, +61, 60, 51, -1, +61, 51, 50, -1, +40, 62, 63, -1, +40, 63, 41, -1, +62, 64, 65, -1, +62, 65, 63, -1, +43, 42, 66, -1, +43, 66, 67, -1, +67, 66, 59, -1, +67, 59, 58, -1, +44, 68, 69, -1, +44, 69, 45, -1, +68, 55, 54, -1, +68, 54, 69, -1, +47, 46, 70, -1, +47, 70, 71, -1, +71, 70, 65, -1, +71, 65, 64, -1, +72, 23, 33, -1, +72, 33, 49, -1, +73, 72, 49, -1, +73, 49, 51, -1, +74, 73, 51, -1, +74, 51, 60, -1, +75, 74, 60, -1, +75, 60, 38, -1, +76, 77, 57, -1, +76, 57, 59, -1, +78, 76, 59, -1, +78, 59, 66, -1, +20, 78, 66, -1, +20, 66, 42, -1, +21, 20, 42, -1, +21, 42, 41, -1, +79, 21, 41, -1, +79, 41, 63, -1, +80, 79, 63, -1, +80, 63, 65, -1, +81, 80, 65, -1, +81, 65, 70, -1, +82, 81, 70, -1, +82, 70, 46, -1, +83, 82, 46, -1, +83, 46, 45, -1, +84, 83, 45, -1, +84, 45, 69, -1, +85, 84, 69, -1, +85, 69, 54, -1, +86, 85, 54, -1, +86, 54, 52, -1, +86, 52, 34, -1, +86, 34, 22, -1, +23, 22, 34, -1, +23, 34, 33, -1, +84, 86, 22, -1, +84, 22, 83, -1, +79, 81, 82, -1, +79, 82, 21, -1, +82, 83, 22, -1, +82, 22, 21, -1, +72, 74, 75, -1, +72, 75, 23, -1, +77, 76, 78, -1, +72, 73, 74, -1, +84, 85, 86, -1, +79, 80, 81, -1, +87, 88, 89, -1, +87, 89, 90, -1, +91, 92, 93, -1, +91, 93, 94, -1, +95, 96, 97, -1, +95, 97, 98, -1, +99, 100, 101, -1, +99, 101, 102, -1, +103, 104, 105, -1, +103, 105, 106, -1, +107, 108, 109, -1, +107, 109, 110, -1, +111, 112, 113, -1, +111, 113, 114, -1, +115, 116, 117, -1, +115, 117, 118, -1, +119, 120, 121, -1, +119, 121, 122, -1, +123, 124, 125, -1, +123, 125, 126, -1, +127, 128, 129, -1, +127, 129, 130, -1, +131, 132, 133, -1, +131, 133, 134, -1, +97, 126, 133, -1, +120, 117, 106, -1, +105, 114, 121, -1, +132, 129, 98, -1, +131, 100, 130, -1, +113, 109, 122, -1, +119, 108, 118, -1, +125, 101, 134, -1, +116, 87, 103, -1, +104, 90, 111, -1, +112, 89, 110, -1, +107, 88, 115, -1, +128, 93, 95, -1, +96, 92, 123, -1, +124, 91, 102, -1, +99, 94, 127, -1, +103, 87, 90, -1, +103, 90, 104, -1, +110, 89, 88, -1, +110, 88, 107, -1, +95, 93, 92, -1, +95, 92, 96, -1, +102, 91, 94, -1, +102, 94, 99, -1, +105, 121, 120, -1, +105, 120, 106, -1, +97, 133, 132, -1, +97, 132, 98, -1, +108, 119, 122, -1, +108, 122, 109, -1, +100, 131, 134, -1, +100, 134, 101, -1, +87, 116, 115, -1, +87, 115, 88, -1, +89, 112, 111, -1, +89, 111, 90, -1, +91, 124, 123, -1, +91, 123, 92, -1, +93, 128, 127, -1, +93, 127, 94, -1, +98, 129, 128, -1, +98, 128, 95, -1, +99, 127, 130, -1, +99, 130, 100, -1, +101, 125, 124, -1, +101, 124, 102, -1, +96, 123, 126, -1, +96, 126, 97, -1, +106, 117, 116, -1, +106, 116, 103, -1, +107, 115, 118, -1, +107, 118, 108, -1, +109, 113, 112, -1, +109, 112, 110, -1, +104, 111, 114, -1, +104, 114, 105, -1, +113, 122, 121, -1, +113, 121, 114, -1, +117, 120, 119, -1, +117, 119, 118, -1, +125, 134, 133, -1, +125, 133, 126, -1, +129, 132, 131, -1, +129, 131, 130, -1, +135, 136, 137, -1, +135, 137, 138, -1, +139, 140, 141, -1, +139, 141, 142, -1, +143, 144, 145, -1, +143, 145, 146, -1, +147, 148, 149, -1, +147, 149, 150, -1, +151, 152, 153, -1, +151, 153, 154, -1, +116, 115, 124, -1, +116, 124, 123, -1, +148, 144, 136, -1, +135, 139, 149, -1, +138, 152, 140, -1, +143, 153, 137, -1, +142, 116, 150, -1, +151, 115, 141, -1, +147, 123, 145, -1, +146, 124, 154, -1, +143, 137, 136, -1, +143, 136, 144, -1, +148, 136, 135, -1, +148, 135, 149, -1, +152, 138, 137, -1, +152, 137, 153, -1, +139, 135, 138, -1, +139, 138, 140, -1, +149, 139, 142, -1, +149, 142, 150, -1, +153, 143, 146, -1, +153, 146, 154, -1, +151, 141, 140, -1, +151, 140, 152, -1, +141, 115, 116, -1, +141, 116, 142, -1, +147, 145, 144, -1, +147, 144, 148, -1, +145, 123, 124, -1, +145, 124, 146, -1, +154, 124, 115, -1, +154, 115, 151, -1, +150, 116, 123, -1, +150, 123, 147, -1, +155, 156, 157, -1, +158, 159, 160, -1, +161, 111, 162, -1, +163, 112, 164, -1, +155, 157, 165, -1, +155, 165, 166, -1, +160, 159, 16, -1, +160, 16, 15, -1, +111, 161, 167, -1, +111, 167, 168, -1, +164, 112, 169, -1, +164, 169, 170, -1, +160, 157, 156, -1, +160, 156, 158, -1, +162, 111, 112, -1, +162, 112, 163, -1, +160, 15, 4, -1, +160, 4, 157, -1, +168, 169, 112, -1, +168, 112, 111, -1, +163, 164, 159, -1, +163, 159, 158, -1, +156, 155, 161, -1, +156, 161, 162, -1, +164, 5, 16, -1, +164, 16, 159, -1, +166, 167, 161, -1, +166, 161, 155, -1, +163, 158, 156, -1, +163, 156, 162, -1, +3, 17, 6, -1, +3, 6, 5, -1, +6, 17, 2, -1, +6, 2, 4, -1, +1, 0, 7, -1, +1, 7, 10, -1, +167, 171, 172, -1, +167, 172, 168, -1, +2, 1, 10, -1, +2, 10, 9, -1, +167, 166, 173, -1, +167, 173, 171, -1, +174, 175, 176, -1, +177, 178, 179, -1, +180, 181, 128, -1, +182, 183, 127, -1, +184, 175, 174, -1, +184, 174, 173, -1, +13, 179, 178, -1, +13, 178, 14, -1, +171, 180, 128, -1, +171, 128, 172, -1, +185, 127, 183, -1, +185, 183, 186, -1, +176, 175, 178, -1, +176, 178, 177, -1, +127, 128, 181, -1, +127, 181, 182, -1, +11, 14, 178, -1, +11, 178, 175, -1, +11, 175, 184, -1, +11, 184, 9, -1, +127, 185, 172, -1, +127, 172, 128, -1, +179, 183, 182, -1, +179, 182, 177, -1, +180, 174, 176, -1, +180, 176, 181, -1, +13, 12, 183, -1, +13, 183, 179, -1, +180, 171, 173, -1, +180, 173, 174, -1, +176, 177, 182, -1, +176, 182, 181, -1, +19, 18, 8, -1, +19, 8, 12, -1, +9, 18, 19, -1, +9, 19, 11, -1, +166, 165, 184, -1, +166, 184, 173, -1, +169, 185, 186, -1, +169, 186, 170, -1, +2, 9, 184, -1, +2, 184, 165, -1, +172, 185, 169, -1, +172, 169, 168, -1, +3, 170, 186, -1, +3, 186, 8, -1, +3, 8, 7, -1, +3, 7, 0, -1, +4, 2, 165, -1, +4, 165, 157, -1, +170, 3, 5, -1, +170, 5, 164, -1, +12, 8, 186, -1, +12, 186, 183, -1 + + ] + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.obj new file mode 100755 index 0000000..c255453 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9f7a054ca51219b672cf78fcd3caa405b9e6b7cf77f2249f2b2e04452c7433c +size 25719 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.obj.mtl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.obj.mtl new file mode 100755 index 0000000..21b46cf --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.obj.mtl @@ -0,0 +1,9 @@ +# File produced by Open Asset Import Library (http://www.assimp.sf.net) +# (assimp v3.1.187496374) + +newmtl DefaultMaterial +Kd 0.6 0.6 0.6 +Ka 0.05 0.05 0.05 +Ks 0.6 0.6 0.6 +illum 1 + diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.stl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.stl new file mode 100755 index 0000000..76b6fa2 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.stl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d67bb603014782235a64ae851089f7d867c64ba1fa4c699283d2e91a812bd8a +size 9984 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.wrl new file mode 100755 index 0000000..87fcb63 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_left_nob.wrl @@ -0,0 +1,331 @@ +#VRML V2.0 utf8 +Group { + children [ + Shape { + appearance Appearance { + material Material { + diffuseColor 0.975 0.486 0.975 + specularColor 0.7 0.7 1.0 + } + } + geometry IndexedFaceSet { + solid FALSE + coord Coordinate { + point [ +0.010346 0.176606 0.184551, +0.010346 0.175985 0.188075, +0.016218 0.175985 0.188075, +0.016218 0.176606 0.184551, +0.010346 0.174195 0.191174, +0.016218 0.174195 0.191174, +0.010346 0.171454 0.193474, +0.016218 0.171454 0.193474, +0.010346 0.168092 0.194698, +0.016218 0.168092 0.194698, +0.010346 0.164514 0.194698, +0.016218 0.164514 0.194698, +0.010346 0.161151 0.193474, +0.016218 0.161151 0.193474, +0.010346 0.158410 0.191174, +0.016218 0.158410 0.191174, +0.010346 0.156621 0.188075, +0.016218 0.156621 0.188075, +0.010346 0.156000 0.184551, +0.016218 0.156000 0.184551, +0.010346 0.156621 0.181028, +0.016218 0.156621 0.181028, +0.010346 0.158410 0.177929, +0.016218 0.158410 0.177929, +0.010346 0.161151 0.175629, +0.016218 0.161151 0.175629, +0.010346 0.164514 0.174405, +0.016218 0.164514 0.174405, +0.010346 0.168092 0.174405, +0.016218 0.168092 0.174405, +0.010346 0.171454 0.175629, +0.016218 0.171454 0.175629, +0.010346 0.174195 0.177929, +0.016218 0.174195 0.177929, +0.010346 0.175985 0.181027, +0.016218 0.175985 0.181027, +0.021149 0.177090 0.188478, +0.021149 0.177782 0.184551, +0.021149 0.175097 0.191930, +0.021149 0.172043 0.194493, +0.021149 0.168296 0.195857, +0.021149 0.164309 0.195857, +0.021149 0.160563 0.194493, +0.021149 0.157509 0.191930, +0.021149 0.155515 0.188478, +0.021149 0.154823 0.184551, +0.021149 0.155515 0.180625, +0.021149 0.157509 0.177172, +0.021149 0.160563 0.174610, +0.021149 0.164309 0.173246, +0.021149 0.168296 0.173246, +0.021149 0.172043 0.174610, +0.021149 0.175097 0.177172, +0.021149 0.177090 0.180625, +0.026081 0.181180 0.184551, +0.026081 0.180283 0.189640, +0.036057 0.180283 0.189640, +0.036057 0.181180 0.184551, +0.026081 0.177700 0.194114, +0.036057 0.177700 0.194114, +0.026081 0.173742 0.197436, +0.036057 0.173742 0.197436, +0.026081 0.168886 0.199203, +0.036057 0.168886 0.199203, +0.026081 0.163719 0.199203, +0.036057 0.163719 0.199203, +0.026081 0.158864 0.197436, +0.036057 0.158864 0.197436, +0.026081 0.154906 0.194114, +0.036057 0.154906 0.194114, +0.026081 0.152322 0.189640, +0.036057 0.152322 0.189640, +0.026081 0.151425 0.184551, +0.036057 0.151425 0.184551, +0.026081 0.152322 0.179463, +0.036057 0.152322 0.179463, +0.026081 0.154906 0.174988, +0.036057 0.154906 0.174988, +0.026081 0.158864 0.171667, +0.036057 0.158864 0.171667, +0.026081 0.163719 0.169900, +0.036057 0.163719 0.169900, +0.026081 0.168886 0.169900, +0.036057 0.168886 0.169900, +0.026081 0.173741 0.171667, +0.036057 0.173741 0.171667, +0.026081 0.177700 0.174988, +0.036057 0.177700 0.174988, +0.026081 0.180283 0.179463, +0.036057 0.180283 0.179463, +0.036843 0.179751 0.189446, +0.036843 0.180614 0.184551, +0.036843 0.177266 0.193750, +0.036843 0.173458 0.196945, +0.036843 0.168788 0.198645, +0.036843 0.163818 0.198645, +0.036843 0.159147 0.196945, +0.036843 0.155340 0.193750, +0.036843 0.152855 0.189446, +0.036843 0.151992 0.184551, +0.036843 0.152855 0.179657, +0.036843 0.155340 0.175352, +0.036843 0.159147 0.172158, +0.036843 0.163818 0.170458, +0.036843 0.168788 0.170458, +0.036843 0.173458 0.172158, +0.036843 0.177266 0.175352, +0.036843 0.179751 0.179657, +0.036843 0.166303 0.184551, + + ] + } + coordIndex [ +0, 1, 2, -1, +0, 2, 3, -1, +1, 4, 5, -1, +1, 5, 2, -1, +4, 6, 7, -1, +4, 7, 5, -1, +6, 8, 9, -1, +6, 9, 7, -1, +8, 10, 11, -1, +8, 11, 9, -1, +10, 12, 13, -1, +10, 13, 11, -1, +12, 14, 15, -1, +12, 15, 13, -1, +14, 16, 17, -1, +14, 17, 15, -1, +16, 18, 19, -1, +16, 19, 17, -1, +18, 20, 21, -1, +18, 21, 19, -1, +20, 22, 23, -1, +20, 23, 21, -1, +22, 24, 25, -1, +22, 25, 23, -1, +24, 26, 27, -1, +24, 27, 25, -1, +26, 28, 29, -1, +26, 29, 27, -1, +28, 30, 31, -1, +28, 31, 29, -1, +30, 32, 33, -1, +30, 33, 31, -1, +32, 34, 35, -1, +32, 35, 33, -1, +34, 0, 3, -1, +34, 3, 35, -1, +2, 36, 37, -1, +2, 37, 3, -1, +5, 38, 36, -1, +5, 36, 2, -1, +7, 39, 38, -1, +7, 38, 5, -1, +9, 40, 39, -1, +9, 39, 7, -1, +11, 41, 40, -1, +11, 40, 9, -1, +13, 42, 41, -1, +13, 41, 11, -1, +15, 43, 42, -1, +15, 42, 13, -1, +17, 44, 43, -1, +17, 43, 15, -1, +19, 45, 44, -1, +19, 44, 17, -1, +21, 46, 45, -1, +21, 45, 19, -1, +23, 47, 46, -1, +23, 46, 21, -1, +25, 48, 47, -1, +25, 47, 23, -1, +27, 49, 48, -1, +27, 48, 25, -1, +29, 50, 49, -1, +29, 49, 27, -1, +31, 51, 50, -1, +31, 50, 29, -1, +33, 52, 51, -1, +33, 51, 31, -1, +35, 53, 52, -1, +35, 52, 33, -1, +3, 37, 53, -1, +3, 53, 35, -1, +54, 55, 56, -1, +54, 56, 57, -1, +55, 58, 59, -1, +55, 59, 56, -1, +58, 60, 61, -1, +58, 61, 59, -1, +60, 62, 63, -1, +60, 63, 61, -1, +62, 64, 65, -1, +62, 65, 63, -1, +64, 66, 67, -1, +64, 67, 65, -1, +66, 68, 69, -1, +66, 69, 67, -1, +68, 70, 71, -1, +68, 71, 69, -1, +70, 72, 73, -1, +70, 73, 71, -1, +72, 74, 75, -1, +72, 75, 73, -1, +74, 76, 77, -1, +74, 77, 75, -1, +76, 78, 79, -1, +76, 79, 77, -1, +78, 80, 81, -1, +78, 81, 79, -1, +80, 82, 83, -1, +80, 83, 81, -1, +82, 84, 85, -1, +82, 85, 83, -1, +84, 86, 87, -1, +84, 87, 85, -1, +86, 88, 89, -1, +86, 89, 87, -1, +88, 54, 57, -1, +88, 57, 89, -1, +56, 90, 91, -1, +56, 91, 57, -1, +59, 92, 90, -1, +59, 90, 56, -1, +61, 93, 92, -1, +61, 92, 59, -1, +63, 94, 93, -1, +63, 93, 61, -1, +65, 95, 94, -1, +65, 94, 63, -1, +67, 96, 95, -1, +67, 95, 65, -1, +69, 97, 96, -1, +69, 96, 67, -1, +71, 98, 97, -1, +71, 97, 69, -1, +73, 99, 98, -1, +73, 98, 71, -1, +75, 100, 99, -1, +75, 99, 73, -1, +77, 101, 100, -1, +77, 100, 75, -1, +79, 102, 101, -1, +79, 101, 77, -1, +81, 103, 102, -1, +81, 102, 79, -1, +83, 104, 103, -1, +83, 103, 81, -1, +85, 105, 104, -1, +85, 104, 83, -1, +87, 106, 105, -1, +87, 105, 85, -1, +89, 107, 106, -1, +89, 106, 87, -1, +57, 91, 107, -1, +57, 107, 89, -1, +91, 90, 108, -1, +90, 92, 108, -1, +92, 93, 108, -1, +93, 94, 108, -1, +94, 95, 108, -1, +95, 96, 108, -1, +96, 97, 108, -1, +97, 98, 108, -1, +98, 99, 108, -1, +99, 100, 108, -1, +100, 101, 108, -1, +101, 102, 108, -1, +102, 103, 108, -1, +103, 104, 108, -1, +104, 105, 108, -1, +105, 106, 108, -1, +106, 107, 108, -1, +107, 91, 108, -1, +55, 54, 37, -1, +55, 37, 36, -1, +58, 55, 36, -1, +58, 36, 38, -1, +60, 58, 38, -1, +60, 38, 39, -1, +62, 60, 39, -1, +62, 39, 40, -1, +64, 62, 40, -1, +64, 40, 41, -1, +66, 64, 41, -1, +66, 41, 42, -1, +68, 66, 42, -1, +68, 42, 43, -1, +70, 68, 43, -1, +70, 43, 44, -1, +72, 70, 44, -1, +72, 44, 45, -1, +74, 72, 45, -1, +74, 45, 46, -1, +76, 74, 46, -1, +76, 46, 47, -1, +78, 76, 47, -1, +78, 47, 48, -1, +80, 78, 48, -1, +80, 48, 49, -1, +82, 80, 49, -1, +82, 49, 50, -1, +84, 82, 50, -1, +84, 50, 51, -1, +86, 84, 51, -1, +86, 51, 52, -1, +88, 86, 52, -1, +88, 52, 53, -1, +54, 88, 53, -1, +54, 53, 37, -1 + + ] + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.mtl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.mtl new file mode 100755 index 0000000..4431b1a --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl Material.002 +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.840000 0.80000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 +# map_Kd WoodFine0035_1_S.jpg diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.obj new file mode 100755 index 0000000..9af2f8c --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acf69c4665732fbec4fd8c1fee1956575a645394fd6ed12070870e8f13249fd8 +size 64676 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.obj.mtl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.obj.mtl new file mode 100755 index 0000000..21b46cf --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.obj.mtl @@ -0,0 +1,9 @@ +# File produced by Open Asset Import Library (http://www.assimp.sf.net) +# (assimp v3.1.187496374) + +newmtl DefaultMaterial +Kd 0.6 0.6 0.6 +Ka 0.05 0.05 0.05 +Ks 0.6 0.6 0.6 +illum 1 + diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.stl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.stl new file mode 100755 index 0000000..37cd143 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.stl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57b5f8fda4f3e0249276794aeaf5f319071e00fb5cbf3df135f7f42cdbc1d999 +size 17184 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.wrl new file mode 100755 index 0000000..1e8abd7 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right.wrl @@ -0,0 +1,553 @@ +#VRML V2.0 utf8 +Group { + children [ + Shape { + appearance Appearance { + material Material { + diffuseColor 0.975 0.486 0.975 + specularColor 0.7 0.7 1.0 + } + } + geometry IndexedFaceSet { + solid FALSE + coord Coordinate { + point [ +-0.010282 0.189491 -0.188934, +-0.008882 0.190891 -0.188934, +-0.006123 0.190891 -0.188934, +-0.010282 0.184131 -0.188934, +-0.006123 0.190891 -0.210934, +-0.010282 0.184131 -0.210934, +-0.006123 0.184131 -0.210934, +-0.010282 0.189491 0.189757, +-0.010282 0.184131 0.189757, +-0.006123 0.190891 0.189757, +-0.008882 0.190891 0.189757, +-0.006123 0.190891 0.211757, +-0.010282 0.184131 0.211757, +-0.010282 0.189491 0.211757, +-0.008882 0.190891 0.211757, +-0.008882 0.190891 -0.210934, +-0.010282 0.189491 -0.210934, +-0.006123 0.184131 -0.188934, +-0.006123 0.184131 0.189757, +-0.006123 0.184131 0.211757, +0.009747 0.106958 0.165943, +0.009747 -0.104562 0.165943, +0.009747 -0.104562 -0.165120, +0.009747 0.106958 -0.165120, +-0.010282 0.139733 -0.195593, +-0.010282 -0.137337 -0.195593, +-0.010282 -0.137337 0.196416, +-0.010282 0.139733 0.196416, +0.003847 0.139733 -0.195593, +0.003847 -0.137337 -0.195593, +0.003847 -0.137337 0.196416, +0.003847 0.139733 0.196416, +0.003847 0.116058 -0.175151, +0.009324 0.107677 -0.166763, +0.009324 -0.105281 -0.166763, +0.003847 -0.113662 -0.175151, +0.003847 0.119309 0.172721, +0.009324 0.110927 0.164332, +0.009324 0.110927 -0.163509, +0.003847 0.119309 -0.171898, +0.003847 -0.113662 0.175974, +0.009324 -0.105281 0.167586, +0.009324 0.107677 0.167586, +0.003847 0.116058 0.175974, +0.003847 -0.116913 -0.171898, +0.009324 -0.108531 -0.163509, +0.009324 -0.108531 0.164332, +0.003847 -0.116913 0.172721, +0.003847 0.117480 -0.174948, +0.009324 0.109099 -0.166560, +0.003847 0.118496 -0.174338, +0.009324 0.110115 -0.165949, +0.009324 -0.106703 -0.166560, +0.003847 -0.115084 -0.174948, +0.009324 -0.107719 -0.165949, +0.003847 -0.116100 -0.174338, +0.003847 0.119106 0.174144, +0.009324 0.110724 0.165755, +0.003847 0.118496 0.175161, +0.009324 0.110115 0.166772, +0.009324 0.110724 -0.164933, +0.003847 0.119106 -0.173321, +0.003847 -0.115084 0.175771, +0.009324 -0.106703 0.167382, +0.003847 -0.116100 0.175161, +0.009324 -0.107719 0.166772, +0.009324 0.109099 0.167382, +0.003847 0.117480 0.175771, +0.003847 -0.116710 -0.173321, +0.009324 -0.108328 -0.164933, +0.009324 -0.108328 0.165755, +0.003847 -0.116710 0.174144, +0.009747 0.108112 -0.164955, +0.009747 0.108742 -0.164576, +0.009747 0.109121 -0.163945, +0.009747 0.109286 -0.162790, +0.009747 0.108743 0.165399, +0.009747 0.109121 0.164767, +0.009747 0.108112 0.165778, +0.009747 -0.105716 0.165778, +0.009747 -0.106347 0.165399, +0.009747 -0.106725 0.164767, +0.009747 -0.106890 0.163613, +0.009747 -0.106890 -0.162790, +0.009747 -0.106725 -0.163945, +0.009747 -0.106347 -0.164576, +0.009747 -0.105716 -0.164955, +0.008363 -0.136073 -0.253550, +-0.008882 -0.136073 -0.253550, +-0.008882 0.138469 -0.253550, +0.008363 0.138469 -0.253550, +-0.008882 -0.136073 0.254373, +0.008363 -0.136073 0.254373, +0.008363 0.138469 0.254373, +-0.008882 0.138469 0.254373, +0.009763 0.138469 0.252973, +0.009763 -0.136073 0.252973, +0.009763 -0.136073 0.197681, +0.009763 0.138469 0.197681, +-0.010282 0.138469 0.252973, +-0.010282 0.138469 0.197681, +-0.010282 -0.136073 0.197681, +-0.010282 -0.136073 0.252973, +0.009763 -0.136073 -0.252150, +0.009763 0.138469 -0.252150, +0.009763 0.138469 -0.196858, +0.009763 -0.136073 -0.196858, +-0.010282 -0.136073 -0.252150, +-0.010282 -0.136073 -0.196858, +-0.010282 0.138469 -0.196858, +-0.010282 0.138469 -0.252150, +0.008363 0.139733 -0.252150, +-0.008882 0.139733 -0.252150, +-0.008882 0.139733 -0.196858, +0.008363 0.139733 -0.196858, +-0.008882 -0.137337 -0.252150, +0.008363 -0.137337 -0.252150, +0.008363 -0.137337 -0.196858, +-0.008882 -0.137337 -0.196858, +-0.008882 -0.136073 -0.195593, +0.008363 -0.136073 -0.195593, +0.008363 0.138469 -0.195593, +-0.008882 0.138469 -0.195593, +0.008363 -0.137337 0.252973, +-0.008882 -0.137337 0.252973, +-0.008882 -0.137337 0.197681, +0.008363 -0.137337 0.197681, +-0.008882 0.139733 0.252973, +0.008363 0.139733 0.252973, +0.008363 0.139733 0.197681, +-0.008882 0.139733 0.197681, +-0.008882 0.138469 0.196416, +0.008363 0.138469 0.196416, +0.008363 -0.136073 0.196416, +-0.008882 -0.136073 0.196416, +0.008363 -0.190111 -0.252150, +0.008363 -0.190111 0.252973, +-0.008882 -0.190111 0.252973, +-0.008882 -0.190111 -0.252150, +0.008363 -0.188711 -0.253550, +-0.008882 -0.188711 -0.253550, +-0.008882 -0.138601 -0.253550, +0.008363 -0.138601 -0.253550, +-0.008882 -0.188711 0.254373, +0.008363 -0.188711 0.254373, +0.008363 -0.138601 0.254373, +-0.008882 -0.138601 0.254373, +0.009763 -0.138601 0.252973, +0.009763 -0.188711 0.252973, +0.009763 -0.188711 -0.252150, +0.009763 -0.138601 -0.252150, +-0.010282 -0.138601 -0.252150, +-0.010282 -0.188711 -0.252150, +-0.010282 -0.188711 0.252973, +-0.010282 -0.138601 0.252973, +0.009763 0.189491 -0.252150, +0.008363 0.189491 -0.253550, +0.008363 0.190891 -0.252150, +-0.008882 0.189491 -0.253550, +-0.010282 0.189491 -0.252150, +-0.008882 0.190891 -0.252150, +0.009763 0.140997 -0.252150, +0.008363 0.140997 -0.253550, +-0.008882 0.140997 -0.253550, +-0.010282 0.140997 -0.252150, +0.008363 0.190891 -0.188934, +0.009763 0.189491 -0.188934, +0.009763 0.140997 -0.188934, +0.008363 0.139733 -0.188934, +-0.008882 0.139733 -0.188934, +-0.010282 0.140997 -0.188934, +0.009763 0.140997 0.189757, +0.008363 0.139733 0.189757, +0.009763 0.189491 0.189757, +0.009763 0.189491 0.252973, +0.008363 0.190891 0.252973, +0.008363 0.189491 0.254373, +-0.008882 0.189491 0.254373, +-0.008882 0.190891 0.252973, +-0.010282 0.189491 0.252973, +0.009763 0.140997 0.252973, +0.008363 0.140997 0.254373, +-0.008882 0.140997 0.254373, +-0.010282 0.140997 0.252973, +0.008363 0.190891 0.189757, +-0.008882 0.139733 0.189757, +-0.010282 0.140997 0.189757, + + ] + } + coordIndex [ +0, 1, 2, -1, +0, 2, 3, -1, +4, 5, 6, -1, +7, 8, 9, -1, +7, 9, 10, -1, +11, 12, 13, -1, +11, 13, 14, -1, +4, 15, 16, -1, +4, 16, 5, -1, +2, 17, 3, -1, +8, 18, 9, -1, +11, 19, 12, -1, +20, 21, 22, -1, +20, 22, 23, -1, +24, 25, 26, -1, +24, 26, 27, -1, +24, 28, 29, -1, +24, 29, 25, -1, +25, 29, 30, -1, +25, 30, 26, -1, +26, 30, 31, -1, +26, 31, 27, -1, +27, 31, 28, -1, +27, 28, 24, -1, +29, 28, 31, -1, +29, 31, 30, -1, +32, 33, 34, -1, +32, 34, 35, -1, +36, 37, 38, -1, +36, 38, 39, -1, +40, 41, 42, -1, +40, 42, 43, -1, +44, 45, 46, -1, +44, 46, 47, -1, +32, 48, 49, -1, +32, 49, 33, -1, +48, 50, 51, -1, +48, 51, 49, -1, +35, 34, 52, -1, +35, 52, 53, -1, +53, 52, 54, -1, +53, 54, 55, -1, +36, 56, 57, -1, +36, 57, 37, -1, +56, 58, 59, -1, +56, 59, 57, -1, +39, 38, 60, -1, +39, 60, 61, -1, +61, 60, 51, -1, +61, 51, 50, -1, +40, 62, 63, -1, +40, 63, 41, -1, +62, 64, 65, -1, +62, 65, 63, -1, +43, 42, 66, -1, +43, 66, 67, -1, +67, 66, 59, -1, +67, 59, 58, -1, +44, 68, 69, -1, +44, 69, 45, -1, +68, 55, 54, -1, +68, 54, 69, -1, +47, 46, 70, -1, +47, 70, 71, -1, +71, 70, 65, -1, +71, 65, 64, -1, +72, 23, 33, -1, +72, 33, 49, -1, +73, 72, 49, -1, +73, 49, 51, -1, +74, 73, 51, -1, +74, 51, 60, -1, +75, 74, 60, -1, +75, 60, 38, -1, +76, 77, 57, -1, +76, 57, 59, -1, +78, 76, 59, -1, +78, 59, 66, -1, +20, 78, 66, -1, +20, 66, 42, -1, +21, 20, 42, -1, +21, 42, 41, -1, +79, 21, 41, -1, +79, 41, 63, -1, +80, 79, 63, -1, +80, 63, 65, -1, +81, 80, 65, -1, +81, 65, 70, -1, +82, 81, 70, -1, +82, 70, 46, -1, +83, 82, 46, -1, +83, 46, 45, -1, +84, 83, 45, -1, +84, 45, 69, -1, +85, 84, 69, -1, +85, 69, 54, -1, +86, 85, 54, -1, +86, 54, 52, -1, +86, 52, 34, -1, +86, 34, 22, -1, +23, 22, 34, -1, +23, 34, 33, -1, +84, 86, 22, -1, +84, 22, 83, -1, +79, 81, 82, -1, +79, 82, 21, -1, +82, 83, 22, -1, +82, 22, 21, -1, +72, 74, 75, -1, +72, 75, 23, -1, +77, 76, 78, -1, +72, 73, 74, -1, +84, 85, 86, -1, +79, 80, 81, -1, +87, 88, 89, -1, +87, 89, 90, -1, +91, 92, 93, -1, +91, 93, 94, -1, +95, 96, 97, -1, +95, 97, 98, -1, +99, 100, 101, -1, +99, 101, 102, -1, +103, 104, 105, -1, +103, 105, 106, -1, +107, 108, 109, -1, +107, 109, 110, -1, +111, 112, 113, -1, +111, 113, 114, -1, +115, 116, 117, -1, +115, 117, 118, -1, +119, 120, 121, -1, +119, 121, 122, -1, +123, 124, 125, -1, +123, 125, 126, -1, +127, 128, 129, -1, +127, 129, 130, -1, +131, 132, 133, -1, +131, 133, 134, -1, +97, 126, 133, -1, +120, 117, 106, -1, +105, 114, 121, -1, +132, 129, 98, -1, +131, 100, 130, -1, +113, 109, 122, -1, +119, 108, 118, -1, +125, 101, 134, -1, +116, 87, 103, -1, +104, 90, 111, -1, +112, 89, 110, -1, +107, 88, 115, -1, +128, 93, 95, -1, +96, 92, 123, -1, +124, 91, 102, -1, +99, 94, 127, -1, +103, 87, 90, -1, +103, 90, 104, -1, +110, 89, 88, -1, +110, 88, 107, -1, +95, 93, 92, -1, +95, 92, 96, -1, +102, 91, 94, -1, +102, 94, 99, -1, +105, 121, 120, -1, +105, 120, 106, -1, +97, 133, 132, -1, +97, 132, 98, -1, +108, 119, 122, -1, +108, 122, 109, -1, +100, 131, 134, -1, +100, 134, 101, -1, +87, 116, 115, -1, +87, 115, 88, -1, +89, 112, 111, -1, +89, 111, 90, -1, +91, 124, 123, -1, +91, 123, 92, -1, +93, 128, 127, -1, +93, 127, 94, -1, +98, 129, 128, -1, +98, 128, 95, -1, +99, 127, 130, -1, +99, 130, 100, -1, +101, 125, 124, -1, +101, 124, 102, -1, +96, 123, 126, -1, +96, 126, 97, -1, +106, 117, 116, -1, +106, 116, 103, -1, +107, 115, 118, -1, +107, 118, 108, -1, +109, 113, 112, -1, +109, 112, 110, -1, +104, 111, 114, -1, +104, 114, 105, -1, +113, 122, 121, -1, +113, 121, 114, -1, +117, 120, 119, -1, +117, 119, 118, -1, +125, 134, 133, -1, +125, 133, 126, -1, +129, 132, 131, -1, +129, 131, 130, -1, +135, 136, 137, -1, +135, 137, 138, -1, +139, 140, 141, -1, +139, 141, 142, -1, +143, 144, 145, -1, +143, 145, 146, -1, +147, 148, 149, -1, +147, 149, 150, -1, +151, 152, 153, -1, +151, 153, 154, -1, +116, 115, 124, -1, +116, 124, 123, -1, +148, 144, 136, -1, +135, 139, 149, -1, +138, 152, 140, -1, +143, 153, 137, -1, +142, 116, 150, -1, +151, 115, 141, -1, +147, 123, 145, -1, +146, 124, 154, -1, +143, 137, 136, -1, +143, 136, 144, -1, +148, 136, 135, -1, +148, 135, 149, -1, +152, 138, 137, -1, +152, 137, 153, -1, +139, 135, 138, -1, +139, 138, 140, -1, +149, 139, 142, -1, +149, 142, 150, -1, +153, 143, 146, -1, +153, 146, 154, -1, +151, 141, 140, -1, +151, 140, 152, -1, +141, 115, 116, -1, +141, 116, 142, -1, +147, 145, 144, -1, +147, 144, 148, -1, +145, 123, 124, -1, +145, 124, 146, -1, +154, 124, 115, -1, +154, 115, 151, -1, +150, 116, 123, -1, +150, 123, 147, -1, +155, 156, 157, -1, +158, 159, 160, -1, +161, 111, 162, -1, +163, 112, 164, -1, +155, 157, 165, -1, +155, 165, 166, -1, +160, 159, 16, -1, +160, 16, 15, -1, +111, 161, 167, -1, +111, 167, 168, -1, +164, 112, 169, -1, +164, 169, 170, -1, +160, 157, 156, -1, +160, 156, 158, -1, +162, 111, 112, -1, +162, 112, 163, -1, +160, 15, 4, -1, +160, 4, 157, -1, +168, 169, 112, -1, +168, 112, 111, -1, +163, 164, 159, -1, +163, 159, 158, -1, +156, 155, 161, -1, +156, 161, 162, -1, +164, 5, 16, -1, +164, 16, 159, -1, +166, 167, 161, -1, +166, 161, 155, -1, +163, 158, 156, -1, +163, 156, 162, -1, +3, 17, 6, -1, +3, 6, 5, -1, +6, 17, 2, -1, +6, 2, 4, -1, +1, 0, 7, -1, +1, 7, 10, -1, +167, 171, 172, -1, +167, 172, 168, -1, +2, 1, 10, -1, +2, 10, 9, -1, +167, 166, 173, -1, +167, 173, 171, -1, +174, 175, 176, -1, +177, 178, 179, -1, +180, 181, 128, -1, +182, 183, 127, -1, +184, 175, 174, -1, +184, 174, 173, -1, +13, 179, 178, -1, +13, 178, 14, -1, +171, 180, 128, -1, +171, 128, 172, -1, +185, 127, 183, -1, +185, 183, 186, -1, +176, 175, 178, -1, +176, 178, 177, -1, +127, 128, 181, -1, +127, 181, 182, -1, +11, 14, 178, -1, +11, 178, 175, -1, +11, 175, 184, -1, +11, 184, 9, -1, +127, 185, 172, -1, +127, 172, 128, -1, +179, 183, 182, -1, +179, 182, 177, -1, +180, 174, 176, -1, +180, 176, 181, -1, +13, 12, 183, -1, +13, 183, 179, -1, +180, 171, 173, -1, +180, 173, 174, -1, +176, 177, 182, -1, +176, 182, 181, -1, +19, 18, 8, -1, +19, 8, 12, -1, +9, 18, 19, -1, +9, 19, 11, -1, +166, 165, 184, -1, +166, 184, 173, -1, +169, 185, 186, -1, +169, 186, 170, -1, +2, 9, 184, -1, +2, 184, 165, -1, +172, 185, 169, -1, +172, 169, 168, -1, +3, 170, 186, -1, +3, 186, 8, -1, +3, 8, 7, -1, +3, 7, 0, -1, +4, 2, 165, -1, +4, 165, 157, -1, +170, 3, 5, -1, +170, 5, 164, -1, +12, 8, 186, -1, +12, 186, 183, -1 + + ] + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.obj new file mode 100755 index 0000000..780ae15 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9cdf43594348ebb79565eeb2ae9d69c8b180cb7bf42e2153fdb473db55612eee +size 26515 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.obj.mtl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.obj.mtl new file mode 100755 index 0000000..21b46cf --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.obj.mtl @@ -0,0 +1,9 @@ +# File produced by Open Asset Import Library (http://www.assimp.sf.net) +# (assimp v3.1.187496374) + +newmtl DefaultMaterial +Kd 0.6 0.6 0.6 +Ka 0.05 0.05 0.05 +Ks 0.6 0.6 0.6 +illum 1 + diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.stl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.stl new file mode 100755 index 0000000..7926b64 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.stl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c3bf9db55c73ebefdfcd839af10d2a17c3f9789df4aef5d4d0b22a684a66600 +size 9984 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.wrl new file mode 100755 index 0000000..ff8904b --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/door_right_nob.wrl @@ -0,0 +1,331 @@ +#VRML V2.0 utf8 +Group { + children [ + Shape { + appearance Appearance { + material Material { + diffuseColor 0.975 0.486 0.975 + specularColor 0.7 0.7 1.0 + } + } + geometry IndexedFaceSet { + solid FALSE + coord Coordinate { + point [ +0.010357 -0.177380 0.185066, +0.016228 -0.177380 0.185066, +0.016228 -0.176759 0.188590, +0.010357 -0.176759 0.188590, +0.016228 -0.174970 0.191689, +0.010357 -0.174970 0.191689, +0.016228 -0.172229 0.193989, +0.010357 -0.172229 0.193989, +0.016228 -0.168866 0.195213, +0.010357 -0.168866 0.195213, +0.016228 -0.165288 0.195213, +0.010357 -0.165288 0.195213, +0.016228 -0.161925 0.193989, +0.010357 -0.161925 0.193989, +0.016228 -0.159184 0.191689, +0.010357 -0.159184 0.191689, +0.016228 -0.157395 0.188590, +0.010357 -0.157395 0.188590, +0.016228 -0.156774 0.185066, +0.010357 -0.156774 0.185066, +0.016228 -0.157395 0.181542, +0.010357 -0.157395 0.181542, +0.016228 -0.159184 0.178443, +0.010357 -0.159184 0.178443, +0.016228 -0.161925 0.176143, +0.010357 -0.161925 0.176143, +0.016228 -0.165288 0.174920, +0.010357 -0.165288 0.174920, +0.016228 -0.168866 0.174920, +0.010357 -0.168866 0.174920, +0.016228 -0.172229 0.176143, +0.010357 -0.172229 0.176143, +0.016228 -0.174970 0.178443, +0.010357 -0.174970 0.178443, +0.016228 -0.176759 0.181542, +0.010357 -0.176759 0.181542, +0.021160 -0.178557 0.185066, +0.021160 -0.177864 0.188992, +0.021160 -0.175871 0.192445, +0.021160 -0.172817 0.195008, +0.021160 -0.169070 0.196371, +0.021160 -0.165084 0.196371, +0.021160 -0.161337 0.195008, +0.021160 -0.158283 0.192445, +0.021160 -0.156290 0.188992, +0.021160 -0.155597 0.185066, +0.021160 -0.156290 0.181140, +0.021160 -0.158283 0.177687, +0.021160 -0.161337 0.175124, +0.021160 -0.165084 0.173761, +0.021160 -0.169070 0.173761, +0.021160 -0.172817 0.175124, +0.021160 -0.175871 0.177687, +0.021160 -0.177864 0.181140, +0.026091 -0.181955 0.185066, +0.036068 -0.181955 0.185066, +0.036068 -0.181057 0.190155, +0.026091 -0.181057 0.190155, +0.036068 -0.178474 0.194629, +0.026091 -0.178474 0.194629, +0.036068 -0.174516 0.197950, +0.026091 -0.174516 0.197950, +0.036068 -0.169660 0.199718, +0.026091 -0.169660 0.199718, +0.036068 -0.164494 0.199718, +0.026091 -0.164494 0.199718, +0.036068 -0.159638 0.197950, +0.026091 -0.159638 0.197950, +0.036068 -0.155680 0.194629, +0.026091 -0.155680 0.194629, +0.036068 -0.153097 0.190155, +0.026091 -0.153097 0.190155, +0.036068 -0.152200 0.185066, +0.026091 -0.152200 0.185066, +0.036068 -0.153097 0.179978, +0.026091 -0.153097 0.179978, +0.036068 -0.155680 0.175503, +0.026091 -0.155680 0.175503, +0.036068 -0.159638 0.172182, +0.026091 -0.159638 0.172182, +0.036068 -0.164494 0.170415, +0.026091 -0.164494 0.170415, +0.036068 -0.169660 0.170415, +0.026091 -0.169660 0.170415, +0.036068 -0.174516 0.172182, +0.026091 -0.174516 0.172182, +0.036068 -0.178474 0.175503, +0.026091 -0.178474 0.175503, +0.036068 -0.181057 0.179978, +0.026091 -0.181057 0.179978, +0.036854 -0.181388 0.185066, +0.036854 -0.180525 0.189961, +0.036854 -0.178040 0.194265, +0.036854 -0.174233 0.197460, +0.036854 -0.169562 0.199160, +0.036854 -0.164592 0.199160, +0.036854 -0.159921 0.197460, +0.036854 -0.156114 0.194265, +0.036854 -0.153629 0.189961, +0.036854 -0.152766 0.185066, +0.036854 -0.153629 0.180172, +0.036854 -0.156114 0.175867, +0.036854 -0.159921 0.172672, +0.036854 -0.164592 0.170973, +0.036854 -0.169562 0.170973, +0.036854 -0.174233 0.172672, +0.036854 -0.178040 0.175867, +0.036854 -0.180525 0.180172, +0.036854 -0.167077 0.185066, + + ] + } + coordIndex [ +0, 1, 2, -1, +0, 2, 3, -1, +3, 2, 4, -1, +3, 4, 5, -1, +5, 4, 6, -1, +5, 6, 7, -1, +7, 6, 8, -1, +7, 8, 9, -1, +9, 8, 10, -1, +9, 10, 11, -1, +11, 10, 12, -1, +11, 12, 13, -1, +13, 12, 14, -1, +13, 14, 15, -1, +15, 14, 16, -1, +15, 16, 17, -1, +17, 16, 18, -1, +17, 18, 19, -1, +19, 18, 20, -1, +19, 20, 21, -1, +21, 20, 22, -1, +21, 22, 23, -1, +23, 22, 24, -1, +23, 24, 25, -1, +25, 24, 26, -1, +25, 26, 27, -1, +27, 26, 28, -1, +27, 28, 29, -1, +29, 28, 30, -1, +29, 30, 31, -1, +31, 30, 32, -1, +31, 32, 33, -1, +33, 32, 34, -1, +33, 34, 35, -1, +35, 34, 1, -1, +35, 1, 0, -1, +36, 37, 2, -1, +36, 2, 1, -1, +37, 38, 4, -1, +37, 4, 2, -1, +38, 39, 6, -1, +38, 6, 4, -1, +39, 40, 8, -1, +39, 8, 6, -1, +40, 41, 10, -1, +40, 10, 8, -1, +41, 42, 12, -1, +41, 12, 10, -1, +42, 43, 14, -1, +42, 14, 12, -1, +43, 44, 16, -1, +43, 16, 14, -1, +44, 45, 18, -1, +44, 18, 16, -1, +45, 46, 20, -1, +45, 20, 18, -1, +46, 47, 22, -1, +46, 22, 20, -1, +47, 48, 24, -1, +47, 24, 22, -1, +48, 49, 26, -1, +48, 26, 24, -1, +49, 50, 28, -1, +49, 28, 26, -1, +50, 51, 30, -1, +50, 30, 28, -1, +51, 52, 32, -1, +51, 32, 30, -1, +52, 53, 34, -1, +52, 34, 32, -1, +53, 36, 1, -1, +53, 1, 34, -1, +54, 55, 56, -1, +54, 56, 57, -1, +57, 56, 58, -1, +57, 58, 59, -1, +59, 58, 60, -1, +59, 60, 61, -1, +61, 60, 62, -1, +61, 62, 63, -1, +63, 62, 64, -1, +63, 64, 65, -1, +65, 64, 66, -1, +65, 66, 67, -1, +67, 66, 68, -1, +67, 68, 69, -1, +69, 68, 70, -1, +69, 70, 71, -1, +71, 70, 72, -1, +71, 72, 73, -1, +73, 72, 74, -1, +73, 74, 75, -1, +75, 74, 76, -1, +75, 76, 77, -1, +77, 76, 78, -1, +77, 78, 79, -1, +79, 78, 80, -1, +79, 80, 81, -1, +81, 80, 82, -1, +81, 82, 83, -1, +83, 82, 84, -1, +83, 84, 85, -1, +85, 84, 86, -1, +85, 86, 87, -1, +87, 86, 88, -1, +87, 88, 89, -1, +89, 88, 55, -1, +89, 55, 54, -1, +56, 55, 90, -1, +56, 90, 91, -1, +58, 56, 91, -1, +58, 91, 92, -1, +60, 58, 92, -1, +60, 92, 93, -1, +62, 60, 93, -1, +62, 93, 94, -1, +64, 62, 94, -1, +64, 94, 95, -1, +66, 64, 95, -1, +66, 95, 96, -1, +68, 66, 96, -1, +68, 96, 97, -1, +70, 68, 97, -1, +70, 97, 98, -1, +72, 70, 98, -1, +72, 98, 99, -1, +74, 72, 99, -1, +74, 99, 100, -1, +76, 74, 100, -1, +76, 100, 101, -1, +78, 76, 101, -1, +78, 101, 102, -1, +80, 78, 102, -1, +80, 102, 103, -1, +82, 80, 103, -1, +82, 103, 104, -1, +84, 82, 104, -1, +84, 104, 105, -1, +86, 84, 105, -1, +86, 105, 106, -1, +88, 86, 106, -1, +88, 106, 107, -1, +55, 88, 107, -1, +55, 107, 90, -1, +90, 108, 91, -1, +91, 108, 92, -1, +92, 108, 93, -1, +93, 108, 94, -1, +94, 108, 95, -1, +95, 108, 96, -1, +96, 108, 97, -1, +97, 108, 98, -1, +98, 108, 99, -1, +99, 108, 100, -1, +100, 108, 101, -1, +101, 108, 102, -1, +102, 108, 103, -1, +103, 108, 104, -1, +104, 108, 105, -1, +105, 108, 106, -1, +106, 108, 107, -1, +107, 108, 90, -1, +36, 54, 57, -1, +36, 57, 37, -1, +37, 57, 59, -1, +37, 59, 38, -1, +38, 59, 61, -1, +38, 61, 39, -1, +39, 61, 63, -1, +39, 63, 40, -1, +40, 63, 65, -1, +40, 65, 41, -1, +41, 65, 67, -1, +41, 67, 42, -1, +42, 67, 69, -1, +42, 69, 43, -1, +43, 69, 71, -1, +43, 71, 44, -1, +44, 71, 73, -1, +44, 73, 45, -1, +45, 73, 75, -1, +45, 75, 46, -1, +46, 75, 77, -1, +46, 77, 47, -1, +47, 77, 79, -1, +47, 79, 48, -1, +48, 79, 81, -1, +48, 81, 49, -1, +49, 81, 83, -1, +49, 83, 50, -1, +50, 83, 85, -1, +50, 85, 51, -1, +51, 85, 87, -1, +51, 87, 52, -1, +52, 87, 89, -1, +52, 89, 53, -1, +53, 89, 54, -1, +53, 54, 36, -1 + + ] + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.mtl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.mtl new file mode 100755 index 0000000..3d124ba --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl Material.003 +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.840000 0.80000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 +# map_Kd WoodFine0035_1_S.jpg diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.obj new file mode 100755 index 0000000..b57e961 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45d43f6540ab3e1dec9c9abe324f2df79ad7113568be4846b2e9bdf512c7fa57 +size 14685 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.obj.mtl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.obj.mtl new file mode 100755 index 0000000..21b46cf --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.obj.mtl @@ -0,0 +1,9 @@ +# File produced by Open Asset Import Library (http://www.assimp.sf.net) +# (assimp v3.1.187496374) + +newmtl DefaultMaterial +Kd 0.6 0.6 0.6 +Ka 0.05 0.05 0.05 +Ks 0.6 0.6 0.6 +illum 1 + diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.stl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.stl new file mode 100755 index 0000000..5df36d2 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.stl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a38b920d147518363a463d0c2d2623da4e322191aae876e4e578f6ea1e712e96 +size 4884 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.wrl new file mode 100755 index 0000000..4255be2 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer.wrl @@ -0,0 +1,148 @@ +#VRML V2.0 utf8 +Group { + children [ + Shape { + appearance Appearance { + material Material { + diffuseColor 0.975 0.486 0.975 + specularColor 0.7 0.7 1.0 + } + } + geometry IndexedFaceSet { + solid FALSE + coord Coordinate { + point [ +-0.253246 -0.345280 -0.041860, +-0.253246 0.345280 -0.041860, +-0.253246 0.345280 0.042860, +-0.253246 -0.345280 0.042860, +0.254200 0.346280 -0.042860, +0.254200 -0.346280 -0.042860, +-0.254200 -0.346280 -0.042860, +-0.254200 0.346280 -0.042860, +0.254200 0.345280 0.042860, +0.254200 0.346280 0.042860, +-0.254200 0.346280 0.042860, +-0.254200 -0.346280 0.042860, +0.254200 -0.346280 0.042860, +0.254200 -0.345280 0.042860, +0.254200 0.345280 -0.041860, +0.254200 -0.345280 -0.041860, +-0.257500 -0.346280 0.042860, +-0.257500 -0.346280 -0.042860, +-0.257500 0.346280 -0.042860, +-0.257500 0.346280 0.042860, +0.254200 0.349580 0.042860, +-0.254200 0.349580 0.042860, +0.254200 0.349580 -0.042860, +0.254200 -0.379410 -0.061912, +0.254200 -0.379410 0.061912, +0.254200 0.379410 0.061912, +0.254200 0.379410 -0.061912, +0.273200 0.379410 0.061912, +0.273200 0.379410 -0.061912, +0.273200 -0.379410 0.061912, +0.273200 -0.379410 -0.061912, +-0.254200 -0.349575 0.042860, +0.254200 -0.349575 0.042860, +0.254200 -0.349575 -0.042860, +-0.254200 -0.349575 -0.042860, +-0.257471 -0.346280 -0.042860, +-0.257471 -0.346280 0.042860, +-0.254200 0.349580 -0.042860, +-0.257454 0.349580 0.042860, +-0.257454 0.346280 0.042860, +-0.257471 -0.349575 -0.042860, +-0.257471 -0.349575 0.042860, +-0.257454 0.346280 -0.042860, +-0.257454 0.349580 -0.042860, + + ] + } + coordIndex [ +0, 1, 2, -1, +2, 3, 0, -1, +4, 5, 6, -1, +6, 7, 4, -1, +8, 9, 10, -1, +11, 12, 13, -1, +11, 13, 3, -1, +2, 8, 10, -1, +11, 3, 2, -1, +10, 11, 2, -1, +4, 9, 8, -1, +4, 8, 14, -1, +13, 12, 5, -1, +4, 14, 15, -1, +15, 13, 5, -1, +4, 15, 5, -1, +11, 6, 6, -1, +11, 6, 11, -1, +5, 12, 12, -1, +5, 12, 5, -1, +6, 11, 16, -1, +6, 16, 17, -1, +10, 7, 18, -1, +10, 18, 19, -1, +10, 9, 20, -1, +10, 20, 21, -1, +9, 4, 22, -1, +9, 22, 20, -1, +0, 15, 14, -1, +14, 1, 0, -1, +2, 1, 14, -1, +14, 8, 2, -1, +15, 0, 3, -1, +3, 13, 15, -1, +23, 24, 25, -1, +25, 26, 23, -1, +26, 25, 27, -1, +27, 28, 26, -1, +28, 27, 29, -1, +29, 30, 28, -1, +24, 23, 30, -1, +30, 29, 24, -1, +30, 23, 26, -1, +26, 28, 30, -1, +27, 25, 24, -1, +24, 29, 27, -1, +11, 6, 6, -1, +11, 6, 11, -1, +12, 11, 11, -1, +12, 11, 12, -1, +6, 5, 5, -1, +6, 5, 6, -1, +12, 11, 11, -1, +12, 11, 12, -1, +12, 11, 31, -1, +12, 31, 32, -1, +6, 5, 33, -1, +6, 33, 34, -1, +5, 12, 12, -1, +5, 12, 5, -1, +6, 5, 5, -1, +6, 5, 6, -1, +33, 32, 31, -1, +31, 34, 33, -1, +11, 6, 35, -1, +11, 35, 36, -1, +5, 12, 32, -1, +5, 32, 33, -1, +20, 22, 37, -1, +37, 21, 20, -1, +4, 7, 37, -1, +4, 37, 22, -1, +10, 21, 38, -1, +10, 38, 39, -1, +17, 16, 19, -1, +19, 18, 17, -1, +7, 6, 17, -1, +7, 17, 18, -1, +11, 10, 19, -1, +11, 19, 16, -1 + + ] + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition.obj new file mode 100755 index 0000000..3d09580 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ca449eaff0949f2dd4bbf0aac638fd4175930b701cd1dd8c5981329b3cb60c8 +size 3024 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition.wrl new file mode 100755 index 0000000..d1eb032 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition.wrl @@ -0,0 +1,92 @@ +#VRML V2.0 utf8 + +# Generated by VCGLIB, (C)Copyright 1999-2001 VCG, IEI-CNR + +NavigationInfo { + type [ "EXAMINE", "ANY" ] +} +Transform { + scale 1 1 1 + translation 0 0 0 + children + [ + Shape + { + geometry IndexedFaceSet + { + creaseAngle .5 + solid FALSE + coord Coordinate + { + point + [ + 0.246736 -0.334919 -0.04286, 0.2732 0.343763 0.058129, 0.250769 0.381796 0.064545, 0.250769 0.381796 -0.064286, + 0.2732 -0.343696 -0.057857, 0.250769 -0.381796 0.064545, 0.2732 0.343763 -0.057869, 0.2732 -0.343696 0.058117, + 0.245999 0.353094 0.045453, 0.250769 -0.381796 -0.064286, 0.245999 -0.353094 0.045453, 0.246736 0.334919 -0.04286, + -0.24594 -0.344106 -0.04286, -0.250343 -0.004807 0.045468, -0.259883 -0.004807 0.045468, -0.259883 -0.353127 0.045468, + -0.259883 -0.004807 -0.045208, -0.245317 0.00132 -0.04186, -0.245569 -0.353127 0.045468, -0.259883 -0.353127 -0.045208, + -0.259883 -0.004772 -0.045208, -0.245569 0.353162 0.045468, -0.259883 0.353162 0.045468, -0.259883 0.353162 -0.045208, + -0.245317 -0.011068 -0.04186, -0.259883 -0.004772 0.045468, -0.24594 0.343891 -0.04286, -0.250343 -0.004772 0.045468, + 0.2542 -0.343539 0.046982, -0.245569 -0.353162 -0.045208, -0.232838 -0.339216 -0.04286, 0.2542 -0.338607 -0.046722, + 0.2542 -0.353401 -0.046722, -0.245569 -0.353162 0.045468, 0.2542 -0.353401 0.046982, -0.245569 -0.343618 0.045468, + -0.253246 -0.338622 -0.0417, -0.245569 -0.338844 -0.045208, 0.2542 0.000805 -0.040356, -0.253246 0.000445 -0.040361, + 0.2542 -0.344421 -0.040356, -0.253246 -0.344062 -0.040361, -0.245569 -0.004772 -0.045208, -0.245569 -0.004772 -0.045208, + 0.2542 0.344581 -0.040356, -0.253246 0.344211 -0.040361, 0.2542 -0.010509 -0.040356, -0.253246 -0.010139 -0.040361, + -0.245569 0.338844 -0.045208, 0.2542 0.343539 0.046982, -0.232838 0.339216 -0.04286, -0.245569 0.353162 -0.045208, + 0.2542 0.338607 -0.046722, 0.2542 0.353401 -0.046722, -0.245569 0.353162 0.045468, 0.2542 0.353401 0.046982, + -0.245569 0.343618 0.045468, -0.253246 0.338622 -0.0417 + ] + } + color Color + { + color + [ + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941 + ] + } + coordIndex + [ + 0,8,11,-1, 2,1,3,-1, 1,2,5,-1, 3,1,6,-1, 1,4,6,-1, 4,1,7,-1, + 1,5,7,-1, 5,4,7,-1, 2,3,8,-1, 5,2,8,-1, 0,3,9,-1, 4,5,9,-1, + 3,6,9,-1, 6,4,9,-1, 8,0,10,-1, 5,8,10,-1, 0,9,10,-1, 9,5,10,-1, + 3,0,11,-1, 8,3,11,-1, 12,18,19,-1, 13,14,15,-1, 15,14,16,-1, 16,14,17,-1, + 14,13,17,-1, 12,16,17,-1, 12,17,18,-1, 13,15,18,-1, 17,13,18,-1, 18,15,19,-1, + 16,12,19,-1, 15,16,19,-1, 25,24,27,-1, 22,21,23,-1, 20,22,23,-1, 22,20,25,-1, + 21,22,25,-1, 20,24,25,-1, 23,21,26,-1, 20,23,26,-1, 24,20,26,-1, 21,24,26,-1, + 24,21,27,-1, 21,25,27,-1, 35,28,36,-1, 29,30,31,-1, 31,28,32,-1, 29,31,32,-1, + 29,32,33,-1, 32,28,34,-1, 33,32,34,-1, 28,33,34,-1, 33,28,35,-1, 33,35,36,-1, + 30,29,36,-1, 31,30,36,-1, 28,31,36,-1, 29,33,36,-1, 39,38,42,-1, 38,39,40,-1, + 37,38,40,-1, 37,40,41,-1, 39,37,41,-1, 40,39,41,-1, 37,39,42,-1, 38,37,42,-1, + 45,44,48,-1, 44,45,46,-1, 43,44,46,-1, 43,46,47,-1, 45,43,47,-1, 46,45,47,-1, + 43,45,48,-1, 44,43,48,-1, 49,56,57,-1, 50,51,52,-1, 49,52,53,-1, 52,51,53,-1, + 53,51,54,-1, 54,49,55,-1, 49,53,55,-1, 53,54,55,-1, 49,54,56,-1, 56,54,57,-1, + 51,50,57,-1, 50,52,57,-1, 52,49,57,-1, 54,51,57,-1 + ] + } + appearance Appearance + { + material Material + { + ambientIntensity 0.2 + diffuseColor 0.9 0.9 0.9 + specularColor .1 .1 .1 + shininess .5 + } + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition0.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition0.obj new file mode 100755 index 0000000..85a94de --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition0.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41065b59579cd98df0ad6af3896c84e110b90921ceab593b8e743fff4781758f +size 564 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition1.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition1.obj new file mode 100755 index 0000000..8bf4cac --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition1.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a00e9073372ce38c96578e125e96a34dc7fc82b3c4aecb3d2325ce9e32d3b78 +size 358 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition2.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition2.obj new file mode 100755 index 0000000..5bbd253 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition2.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d35ab30caf5eecdd020f88ab5c1ef071d3bccfb00cca98b6ba73bf63d7ee841f +size 355 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition3.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition3.obj new file mode 100755 index 0000000..3f2d1b8 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition3.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8db539911359bdd49871465fec53939ecd16ee6b9e002593d40226c658c08c2b +size 403 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition4.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition4.obj new file mode 100755 index 0000000..a88ff94 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition4.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:609e21fcb2a3ec415de08b2f3132bb15f04f8be222b9f1a2714c63fb07505e49 +size 263 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition5.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition5.obj new file mode 100755 index 0000000..db07581 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition5.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f7bc1f4c477ffb96db189ba24b1f16c868474305b871efefa8ec9ee558abf37 +size 262 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition6.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition6.obj new file mode 100755 index 0000000..4404ea9 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_convexdecomposition6.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed6fced79e57e0e3b1db0c714d81b0c7812e8fe59ade78abb7caf3b19217a1a9 +size 394 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.obj new file mode 100755 index 0000000..c6101b6 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba84b51cda8363a3df8765423f8d6fbea9407ee5dae6be51f7e5fd917d359ced +size 101173 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.obj.mtl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.obj.mtl new file mode 100755 index 0000000..21b46cf --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.obj.mtl @@ -0,0 +1,9 @@ +# File produced by Open Asset Import Library (http://www.assimp.sf.net) +# (assimp v3.1.187496374) + +newmtl DefaultMaterial +Kd 0.6 0.6 0.6 +Ka 0.05 0.05 0.05 +Ks 0.6 0.6 0.6 +illum 1 + diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.stl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.stl new file mode 100755 index 0000000..5fd2dcf --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.stl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c549fdf19e95f53a0362df7ad85031fa55b533fb59bbf20e8019a13a84f60b76 +size 42484 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.wrl new file mode 100755 index 0000000..f7ac1c3 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle.wrl @@ -0,0 +1,1118 @@ +#VRML V2.0 utf8 +Group { + children [ + Shape { + appearance Appearance { + material Material { + diffuseColor 0.975 0.486 0.975 + specularColor 0.7 0.7 1.0 + } + } + geometry IndexedFaceSet { + solid FALSE + coord Coordinate { + point [ +0.311329 -0.072230 -0.002405, +0.273229 -0.072230 -0.002405, +0.273229 -0.049179 -0.002405, +0.275196 -0.049210 -0.002405, +0.273229 0.049179 -0.002405, +0.273229 0.072230 -0.002405, +0.311329 0.072230 -0.002405, +0.275196 0.049210 -0.002405, +0.277343 -0.049176 -0.002405, +0.279469 -0.049076 -0.002405, +0.277343 0.049176 -0.002405, +0.279469 0.049076 -0.002405, +0.281554 -0.048910 -0.002405, +0.283578 -0.048680 -0.002405, +0.281554 0.048910 -0.002405, +0.283578 0.048680 -0.002405, +0.285522 -0.048388 -0.002405, +0.287366 -0.048036 -0.002405, +0.285522 0.048388 -0.002405, +0.287366 0.048036 -0.002405, +0.289092 -0.047629 -0.002405, +0.290685 -0.047171 -0.002405, +0.289092 0.047629 -0.002405, +0.290685 0.047171 -0.002405, +0.292129 -0.046664 -0.002405, +0.293409 -0.046115 -0.002405, +0.292129 0.046664 -0.002405, +0.293409 0.046115 -0.002405, +0.294514 -0.045529 -0.002405, +0.295433 -0.044912 -0.002405, +0.294514 0.045529 -0.002405, +0.295433 0.044912 -0.002405, +0.296158 -0.044268 -0.002405, +0.296680 -0.043605 -0.002405, +0.296158 0.044268 -0.002405, +0.296680 0.043605 -0.002405, +0.296995 -0.042929 -0.002405, +0.297101 -0.042247 -0.002405, +0.296995 0.042929 -0.002405, +0.297101 0.042247 -0.002405, +0.311329 0.071063 -0.002348, +0.273229 0.071063 -0.002348, +0.311329 0.069907 -0.002176, +0.311329 0.061231 0.004944, +0.311329 -0.070989 -0.002337, +0.311329 -0.071063 -0.002348, +0.311329 0.068774 -0.001892, +0.311329 0.061731 0.003888, +0.311329 0.062331 0.002886, +0.311329 0.067674 -0.001499, +0.311329 0.066618 -0.000999, +0.311329 0.063027 0.001948, +0.311329 0.063812 0.001082, +0.311329 0.065616 -0.000399, +0.311329 0.064678 0.000297, +0.273229 0.084078 0.010667, +0.273229 0.084135 0.009500, +0.273229 0.084078 0.008333, +0.273229 0.083906 0.007177, +0.273229 0.083622 0.006044, +0.273229 0.083229 0.004944, +0.273229 0.082729 0.003888, +0.273229 0.082129 0.002886, +0.273229 0.081433 0.001948, +0.273229 0.080648 0.001082, +0.273229 0.079782 0.000297, +0.273229 0.078844 -0.000399, +0.273229 0.077842 -0.000999, +0.273229 0.076786 -0.001499, +0.273229 0.075686 -0.001892, +0.273229 0.074553 -0.002176, +0.273229 0.073397 -0.002348, +0.273229 0.069907 -0.002176, +0.273229 0.068774 -0.001892, +0.273229 0.067674 -0.001499, +0.273229 0.066618 -0.000999, +0.273229 0.065616 -0.000399, +0.273229 0.064678 0.000297, +0.273229 0.063812 0.001082, +0.273229 0.063027 0.001948, +0.273229 0.062331 0.002886, +0.273229 0.061731 0.003888, +0.273229 0.061231 0.004944, +0.273229 0.060838 0.006044, +0.273229 0.060554 0.007177, +0.273229 0.060382 0.008333, +0.273229 0.060325 0.009500, +0.273229 0.060382 0.010667, +0.273229 0.060554 0.011823, +0.273229 0.060838 0.012956, +0.273229 0.061231 0.014056, +0.273229 0.061731 0.015112, +0.273229 0.062331 0.016114, +0.273229 0.063027 0.017052, +0.273229 0.063812 0.017918, +0.273229 0.064678 0.018703, +0.273229 0.065616 0.019399, +0.273229 0.066618 0.019999, +0.273229 0.067674 0.020499, +0.273229 0.068774 0.020892, +0.273229 0.069907 0.021176, +0.273229 0.071063 0.021348, +0.273229 0.072230 0.021405, +0.273229 0.073397 0.021348, +0.273229 0.074553 0.021176, +0.273229 0.075686 0.020892, +0.273229 0.076786 0.020499, +0.273229 0.077842 0.019999, +0.273229 0.078844 0.019399, +0.273229 0.079782 0.018703, +0.273229 0.080648 0.017918, +0.273229 0.081433 0.017052, +0.273229 0.082129 0.016114, +0.273229 0.082729 0.015112, +0.273229 0.083229 0.014056, +0.273229 0.083622 0.012956, +0.273229 0.083906 0.011823, +0.311329 0.073397 -0.002348, +0.311329 0.083906 0.007177, +0.311329 0.084078 0.008333, +0.311329 0.084135 0.009500, +0.311329 0.084078 0.010667, +0.311329 0.083906 0.011823, +0.311329 0.083622 0.012956, +0.311329 0.083229 0.014056, +0.311329 0.082729 0.015112, +0.311329 0.082129 0.016114, +0.311329 0.081433 0.017052, +0.311329 0.080648 0.017918, +0.311329 0.079782 0.018703, +0.311329 0.078844 0.019399, +0.311329 0.077842 0.019999, +0.311329 0.076786 0.020499, +0.311329 0.075686 0.020892, +0.311329 0.074553 0.021176, +0.311329 0.073397 0.021348, +0.311329 0.072230 0.021405, +0.311329 0.071063 0.021348, +0.311329 0.069907 0.021176, +0.311329 0.083229 0.004944, +0.311329 0.083622 0.006044, +0.311329 0.082129 0.002886, +0.311329 0.082729 0.003888, +0.311329 0.080648 0.001082, +0.311329 0.081433 0.001948, +0.311329 0.078844 -0.000399, +0.311329 0.079782 0.000297, +0.311329 0.076786 -0.001499, +0.311329 0.077842 -0.000999, +0.311329 0.074553 -0.002176, +0.311329 0.075686 -0.001892, +0.311329 0.060554 0.007177, +0.311329 0.060838 0.006044, +0.311329 0.060325 0.009500, +0.311329 0.060382 0.008333, +0.311329 0.060554 0.011823, +0.311329 0.060382 0.010667, +0.311329 0.061231 0.014056, +0.311329 0.060838 0.012956, +0.311329 0.062331 0.016114, +0.311329 0.061731 0.015112, +0.311329 0.063812 0.017918, +0.311329 0.063027 0.017052, +0.311329 0.065616 0.019399, +0.311329 0.064678 0.018703, +0.311329 0.067674 0.020499, +0.311329 0.066618 0.019999, +0.311329 0.068774 0.020892, +0.273229 0.049179 0.004281, +0.273229 -0.070866 -0.002318, +0.273229 -0.049179 -0.000941, +0.273229 -0.049179 -0.001136, +0.273229 -0.070989 -0.002337, +0.273229 -0.070710 -0.002295, +0.273229 -0.049179 -0.000742, +0.273229 -0.070511 -0.002266, +0.273229 -0.049179 -0.000539, +0.273229 -0.070252 -0.002227, +0.273229 -0.049179 -0.000335, +0.273229 -0.070511 0.021266, +0.273229 -0.049179 0.019539, +0.273229 -0.049179 0.019335, +0.273229 -0.070252 0.021227, +0.273229 -0.070710 0.021295, +0.273229 -0.049179 0.019742, +0.273229 -0.070866 0.021318, +0.273229 -0.049179 0.019941, +0.273229 -0.070989 0.021337, +0.273229 -0.049179 0.020136, +0.273229 0.049179 0.014720, +0.273229 0.049179 0.021405, +0.311329 -0.072230 0.021405, +0.311329 -0.071063 0.021348, +0.311329 -0.070989 0.021337, +0.311329 -0.070865 0.021318, +0.311329 -0.070710 0.021295, +0.311329 -0.070511 0.021266, +0.311329 -0.070252 0.021227, +0.311329 -0.070511 -0.002266, +0.311329 -0.070252 -0.002227, +0.311329 -0.070710 -0.002295, +0.311329 -0.070865 -0.002318, +0.273229 0.049179 0.008499, +0.273229 0.049179 0.010501, +0.273229 -0.072230 0.021405, +0.275196 0.049210 0.021405, +0.273229 -0.049179 0.021405, +0.275196 -0.049210 0.021405, +0.277343 0.049176 0.021405, +0.279469 0.049076 0.021405, +0.277343 -0.049176 0.021405, +0.279469 -0.049076 0.021405, +0.281554 0.048910 0.021405, +0.283578 0.048680 0.021405, +0.281554 -0.048910 0.021405, +0.283578 -0.048680 0.021405, +0.285522 0.048388 0.021405, +0.287366 0.048036 0.021405, +0.285522 -0.048388 0.021405, +0.287366 -0.048036 0.021405, +0.289092 0.047629 0.021405, +0.290685 0.047171 0.021405, +0.289092 -0.047629 0.021405, +0.290685 -0.047171 0.021405, +0.292129 0.046664 0.021405, +0.293409 0.046115 0.021405, +0.292129 -0.046664 0.021405, +0.293409 -0.046115 0.021405, +0.294514 0.045529 0.021405, +0.295433 0.044912 0.021405, +0.294514 -0.045529 0.021405, +0.295433 -0.044912 0.021405, +0.296158 0.044268 0.021405, +0.296680 0.043605 0.021405, +0.296158 -0.044268 0.021405, +0.296680 -0.043605 0.021405, +0.296995 0.042929 0.021405, +0.297101 0.042247 0.021405, +0.296995 -0.042929 0.021405, +0.297101 -0.042247 0.021405, +0.311329 -0.069907 -0.002176, +0.311329 -0.069907 0.021176, +0.311329 -0.068774 0.020892, +0.311329 -0.068774 -0.001892, +0.311329 -0.067674 -0.001499, +0.311329 -0.067674 0.020499, +0.311329 -0.066618 0.019999, +0.311329 -0.066618 -0.000999, +0.311329 -0.065616 -0.000399, +0.311329 -0.065616 0.019399, +0.311329 -0.064678 0.018703, +0.311329 -0.064678 0.000297, +0.311329 -0.063812 0.001082, +0.311329 -0.063812 0.017918, +0.311329 -0.063027 0.017052, +0.311329 -0.063027 0.001948, +0.311329 -0.062331 0.002886, +0.311329 -0.062331 0.016114, +0.311329 -0.061731 0.015112, +0.311329 -0.061731 0.003888, +0.311329 -0.061231 0.004944, +0.311329 -0.061231 0.014056, +0.311329 -0.060838 0.012956, +0.311329 -0.060838 0.006044, +0.311329 -0.060554 0.007177, +0.311329 -0.060554 0.011823, +0.311329 -0.060382 0.010667, +0.311329 -0.060382 0.008333, +0.311329 -0.060325 0.009500, +0.273229 -0.060382 0.010667, +0.273229 -0.060325 0.009500, +0.273229 -0.060382 0.008333, +0.273229 -0.060554 0.007177, +0.273229 -0.060838 0.006044, +0.273229 -0.061231 0.004944, +0.273229 -0.061731 0.003888, +0.273229 -0.062331 0.002886, +0.273229 -0.063027 0.001948, +0.273229 -0.063812 0.001082, +0.273229 -0.064678 0.000297, +0.273229 -0.065616 -0.000399, +0.273229 -0.066618 -0.000999, +0.273229 -0.067674 -0.001499, +0.273229 -0.068774 -0.001892, +0.273229 -0.069907 -0.002176, +0.273229 -0.071063 -0.002348, +0.273229 -0.073397 -0.002348, +0.273229 -0.074553 -0.002176, +0.273229 -0.075686 -0.001892, +0.273229 -0.076786 -0.001499, +0.273229 -0.077842 -0.000999, +0.273229 -0.078844 -0.000399, +0.273229 -0.079782 0.000297, +0.273229 -0.080648 0.001082, +0.273229 -0.081433 0.001948, +0.273229 -0.082129 0.002886, +0.273229 -0.082729 0.003888, +0.273229 -0.083229 0.004944, +0.273229 -0.083622 0.006044, +0.273229 -0.083906 0.007177, +0.273229 -0.084078 0.008333, +0.273229 -0.084135 0.009500, +0.273229 -0.084078 0.010667, +0.273229 -0.083906 0.011823, +0.273229 -0.083622 0.012956, +0.273229 -0.083229 0.014056, +0.273229 -0.082729 0.015112, +0.273229 -0.082129 0.016114, +0.273229 -0.081433 0.017052, +0.273229 -0.080648 0.017918, +0.273229 -0.079782 0.018703, +0.273229 -0.078844 0.019399, +0.273229 -0.077842 0.019999, +0.273229 -0.076786 0.020499, +0.273229 -0.075686 0.020892, +0.273229 -0.074553 0.021176, +0.273229 -0.073397 0.021348, +0.273229 -0.071063 0.021348, +0.273229 -0.069907 0.021176, +0.273229 -0.068774 0.020892, +0.273229 -0.067674 0.020499, +0.273229 -0.066618 0.019999, +0.273229 -0.065616 0.019399, +0.273229 -0.064678 0.018703, +0.273229 -0.063812 0.017918, +0.273229 -0.063027 0.017052, +0.273229 -0.062331 0.016114, +0.273229 -0.061731 0.015112, +0.273229 -0.061231 0.014056, +0.273229 -0.060838 0.012956, +0.273229 -0.060554 0.011823, +0.311329 -0.073397 -0.002348, +0.311329 -0.074553 -0.002176, +0.311329 -0.075686 -0.001892, +0.311329 -0.076786 -0.001499, +0.311329 -0.077842 -0.000999, +0.311329 -0.078844 -0.000399, +0.311329 -0.079782 0.000297, +0.311329 -0.080648 0.001082, +0.311329 -0.081433 0.001948, +0.311329 -0.082129 0.002886, +0.311329 -0.082729 0.003888, +0.311329 -0.083229 0.004944, +0.311329 -0.083622 0.006044, +0.311329 -0.083906 0.007177, +0.311329 -0.084078 0.008333, +0.311329 -0.084135 0.009500, +0.311329 -0.084078 0.010667, +0.311329 -0.083906 0.011823, +0.311329 -0.083622 0.012956, +0.311329 -0.083229 0.014056, +0.311329 -0.082729 0.015112, +0.311329 -0.082129 0.016114, +0.311329 -0.081433 0.017052, +0.311329 -0.080648 0.017918, +0.311329 -0.079782 0.018703, +0.311329 -0.078844 0.019399, +0.311329 -0.077842 0.019999, +0.311329 -0.076786 0.020499, +0.311329 -0.075686 0.020892, +0.311329 -0.074553 0.021176, +0.311329 -0.073397 0.021348, +0.273229 0.049179 0.012643, +0.273229 0.049179 0.013696, +0.273229 0.049179 0.007426, +0.273229 0.049179 0.011574, +0.273229 0.049179 0.006357, +0.273229 0.049179 0.005304, + + ] + } + coordIndex [ +0, 1, 2, -1, +0, 2, 3, -1, +4, 5, 6, -1, +7, 4, 6, -1, +0, 3, 8, -1, +0, 8, 9, -1, +10, 7, 6, -1, +11, 10, 6, -1, +0, 9, 12, -1, +0, 12, 13, -1, +14, 11, 6, -1, +15, 14, 6, -1, +0, 13, 16, -1, +0, 16, 17, -1, +18, 15, 6, -1, +19, 18, 6, -1, +0, 17, 20, -1, +0, 20, 21, -1, +22, 19, 6, -1, +23, 22, 6, -1, +0, 21, 24, -1, +0, 24, 25, -1, +26, 23, 6, -1, +27, 26, 6, -1, +0, 25, 28, -1, +0, 28, 29, -1, +30, 27, 6, -1, +31, 30, 6, -1, +0, 29, 32, -1, +0, 32, 33, -1, +34, 31, 6, -1, +35, 34, 6, -1, +0, 33, 36, -1, +0, 36, 37, -1, +38, 35, 6, -1, +39, 39, 39, -1, +39, 38, 6, -1, +6, 0, 37, -1, +37, 37, 39, -1, +39, 39, 6, -1, +6, 37, 39, -1, +6, 40, 6, -1, +41, 41, 5, -1, +6, 6, 5, -1, +5, 41, 5, -1, +5, 6, 5, -1, +0, 6, 40, -1, +0, 40, 42, -1, +43, 44, 45, -1, +45, 0, 42, -1, +45, 42, 46, -1, +47, 43, 45, -1, +48, 47, 45, -1, +45, 46, 49, -1, +45, 49, 50, -1, +51, 48, 45, -1, +52, 51, 45, -1, +45, 50, 53, -1, +54, 52, 45, -1, +53, 54, 45, -1, +0, 1, 1, -1, +55, 56, 57, -1, +57, 58, 59, -1, +59, 60, 61, -1, +61, 62, 63, -1, +63, 64, 65, -1, +65, 66, 67, -1, +67, 68, 69, -1, +69, 70, 71, -1, +71, 5, 41, -1, +41, 72, 73, -1, +73, 74, 75, -1, +75, 76, 77, -1, +77, 78, 79, -1, +79, 80, 81, -1, +81, 82, 83, -1, +83, 84, 85, -1, +85, 86, 87, -1, +87, 88, 89, -1, +89, 90, 91, -1, +91, 92, 93, -1, +93, 94, 95, -1, +95, 96, 97, -1, +97, 98, 99, -1, +99, 100, 101, -1, +101, 102, 103, -1, +103, 104, 105, -1, +105, 106, 107, -1, +107, 108, 109, -1, +109, 110, 111, -1, +111, 112, 113, -1, +113, 114, 115, -1, +115, 116, 55, -1, +55, 57, 59, -1, +59, 61, 63, -1, +63, 65, 67, -1, +67, 69, 71, -1, +71, 41, 73, -1, +73, 75, 77, -1, +77, 79, 81, -1, +81, 83, 85, -1, +85, 87, 89, -1, +89, 91, 93, -1, +93, 95, 97, -1, +97, 99, 101, -1, +101, 103, 105, -1, +105, 107, 109, -1, +109, 111, 113, -1, +113, 115, 55, -1, +55, 59, 63, -1, +63, 67, 71, -1, +71, 73, 77, -1, +77, 81, 85, -1, +85, 89, 93, -1, +93, 97, 101, -1, +101, 105, 109, -1, +109, 113, 55, -1, +55, 63, 71, -1, +71, 77, 85, -1, +85, 93, 101, -1, +101, 109, 55, -1, +55, 71, 85, -1, +85, 101, 55, -1, +71, 117, 6, -1, +6, 5, 71, -1, +118, 119, 120, -1, +120, 121, 122, -1, +122, 123, 124, -1, +124, 125, 126, -1, +126, 127, 128, -1, +128, 129, 130, -1, +130, 131, 132, -1, +132, 133, 134, -1, +134, 135, 136, -1, +136, 137, 138, -1, +134, 136, 136, -1, +130, 132, 134, -1, +126, 128, 130, -1, +122, 124, 126, -1, +118, 120, 122, -1, +139, 140, 118, -1, +141, 142, 139, -1, +143, 144, 141, -1, +145, 146, 143, -1, +147, 148, 145, -1, +149, 150, 147, -1, +6, 117, 149, -1, +42, 40, 6, -1, +49, 46, 42, -1, +53, 50, 49, -1, +52, 54, 53, -1, +48, 51, 52, -1, +43, 47, 48, -1, +151, 152, 43, -1, +153, 154, 151, -1, +155, 156, 153, -1, +157, 158, 155, -1, +159, 160, 157, -1, +161, 162, 159, -1, +163, 164, 161, -1, +165, 166, 163, -1, +138, 167, 165, -1, +134, 136, 138, -1, +126, 130, 134, -1, +118, 122, 126, -1, +141, 139, 118, -1, +145, 143, 141, -1, +149, 147, 145, -1, +42, 6, 149, -1, +53, 49, 42, -1, +48, 52, 53, -1, +151, 43, 48, -1, +155, 153, 151, -1, +159, 157, 155, -1, +163, 161, 159, -1, +138, 165, 163, -1, +126, 134, 138, -1, +141, 118, 126, -1, +149, 145, 141, -1, +53, 42, 149, -1, +151, 48, 53, -1, +159, 155, 151, -1, +138, 163, 159, -1, +141, 126, 138, -1, +53, 149, 141, -1, +159, 151, 53, -1, +141, 138, 159, -1, +159, 53, 141, -1, +41, 41, 72, -1, +72, 72, 41, -1, +1, 1, 1, -1, +55, 121, 120, -1, +120, 56, 55, -1, +56, 120, 119, -1, +119, 57, 56, -1, +57, 119, 118, -1, +118, 58, 57, -1, +58, 118, 140, -1, +140, 59, 58, -1, +59, 140, 139, -1, +139, 60, 59, -1, +60, 139, 142, -1, +142, 61, 60, -1, +61, 142, 141, -1, +141, 62, 61, -1, +62, 141, 144, -1, +144, 63, 62, -1, +63, 144, 143, -1, +143, 64, 63, -1, +64, 143, 146, -1, +146, 65, 64, -1, +65, 146, 145, -1, +145, 66, 65, -1, +66, 145, 148, -1, +148, 67, 66, -1, +67, 148, 147, -1, +147, 68, 67, -1, +68, 147, 150, -1, +150, 69, 68, -1, +69, 150, 149, -1, +149, 70, 69, -1, +70, 149, 117, -1, +117, 71, 70, -1, +72, 72, 73, -1, +73, 73, 72, -1, +73, 73, 74, -1, +74, 74, 73, -1, +74, 74, 75, -1, +75, 75, 74, -1, +75, 75, 76, -1, +76, 76, 75, -1, +76, 76, 77, -1, +77, 77, 76, -1, +77, 77, 78, -1, +78, 78, 77, -1, +78, 78, 79, -1, +79, 79, 78, -1, +79, 79, 80, -1, +80, 80, 79, -1, +80, 80, 81, -1, +81, 81, 80, -1, +81, 81, 82, -1, +82, 82, 81, -1, +82, 82, 83, -1, +83, 83, 82, -1, +83, 83, 84, -1, +102, 136, 136, -1, +102, 101, 102, -1, +102, 136, 102, -1, +102, 136, 135, -1, +135, 103, 102, -1, +103, 135, 134, -1, +134, 104, 103, -1, +104, 134, 133, -1, +133, 105, 104, -1, +105, 133, 132, -1, +132, 106, 105, -1, +106, 132, 131, -1, +131, 107, 106, -1, +107, 131, 130, -1, +130, 108, 107, -1, +108, 130, 129, -1, +129, 109, 108, -1, +109, 129, 128, -1, +128, 110, 109, -1, +110, 128, 127, -1, +127, 111, 110, -1, +111, 127, 126, -1, +126, 112, 111, -1, +112, 126, 125, -1, +125, 113, 112, -1, +113, 125, 124, -1, +124, 114, 113, -1, +114, 124, 123, -1, +123, 115, 114, -1, +115, 123, 122, -1, +122, 116, 115, -1, +116, 122, 121, -1, +121, 55, 116, -1, +1, 1, 1, -1, +41, 5, 4, -1, +4, 168, 82, -1, +4, 82, 81, -1, +72, 41, 4, -1, +73, 72, 4, -1, +4, 81, 80, -1, +4, 80, 79, -1, +74, 73, 4, -1, +75, 74, 4, -1, +4, 79, 78, -1, +4, 78, 77, -1, +76, 75, 4, -1, +76, 4, 77, -1, +169, 170, 171, -1, +171, 172, 169, -1, +173, 174, 170, -1, +170, 169, 173, -1, +175, 176, 174, -1, +174, 173, 175, -1, +177, 178, 176, -1, +176, 175, 177, -1, +179, 180, 181, -1, +181, 182, 179, -1, +183, 184, 180, -1, +180, 179, 183, -1, +185, 186, 184, -1, +184, 183, 185, -1, +187, 188, 186, -1, +186, 185, 187, -1, +91, 90, 189, -1, +190, 102, 101, -1, +190, 101, 100, -1, +91, 189, 190, -1, +92, 91, 190, -1, +190, 100, 99, -1, +190, 99, 98, -1, +93, 92, 190, -1, +94, 93, 190, -1, +190, 98, 97, -1, +190, 97, 96, -1, +95, 94, 190, -1, +190, 96, 95, -1, +102, 136, 136, -1, +137, 136, 136, -1, +136, 191, 192, -1, +192, 193, 157, -1, +192, 157, 160, -1, +137, 136, 192, -1, +138, 137, 192, -1, +192, 160, 159, -1, +192, 159, 162, -1, +167, 138, 192, -1, +165, 167, 192, -1, +192, 162, 161, -1, +192, 161, 164, -1, +166, 165, 192, -1, +192, 164, 163, -1, +192, 163, 166, -1, +194, 158, 157, -1, +157, 193, 194, -1, +195, 155, 158, -1, +158, 194, 195, -1, +196, 156, 155, -1, +155, 195, 196, -1, +197, 153, 156, -1, +156, 196, 197, -1, +198, 154, 153, -1, +153, 199, 198, -1, +200, 151, 154, -1, +154, 198, 200, -1, +201, 152, 151, -1, +151, 200, 201, -1, +44, 43, 152, -1, +152, 201, 44, -1, +1, 1, 1, -1, +1, 1, 1, -1, +86, 202, 203, -1, +204, 204, 204, -1, +136, 102, 190, -1, +136, 190, 205, -1, +206, 204, 191, -1, +207, 206, 191, -1, +136, 205, 208, -1, +136, 208, 209, -1, +210, 207, 191, -1, +211, 210, 191, -1, +136, 209, 212, -1, +136, 212, 213, -1, +214, 211, 191, -1, +215, 214, 191, -1, +136, 213, 216, -1, +136, 216, 217, -1, +218, 215, 191, -1, +219, 218, 191, -1, +136, 217, 220, -1, +136, 220, 221, -1, +222, 219, 191, -1, +223, 222, 191, -1, +136, 221, 224, -1, +136, 224, 225, -1, +226, 223, 191, -1, +227, 226, 191, -1, +136, 225, 228, -1, +136, 228, 229, -1, +230, 227, 191, -1, +231, 230, 191, -1, +136, 229, 232, -1, +136, 232, 233, -1, +234, 231, 191, -1, +235, 234, 191, -1, +136, 233, 236, -1, +136, 236, 237, -1, +238, 235, 191, -1, +239, 238, 191, -1, +191, 136, 237, -1, +237, 237, 239, -1, +239, 239, 191, -1, +237, 239, 191, -1, +240, 199, 153, -1, +153, 197, 241, -1, +153, 241, 242, -1, +243, 240, 153, -1, +244, 243, 153, -1, +153, 242, 245, -1, +153, 245, 246, -1, +247, 244, 153, -1, +248, 247, 153, -1, +153, 246, 249, -1, +153, 249, 250, -1, +251, 248, 153, -1, +252, 251, 153, -1, +153, 250, 253, -1, +153, 253, 254, -1, +255, 252, 153, -1, +256, 255, 153, -1, +153, 254, 257, -1, +153, 257, 258, -1, +259, 256, 153, -1, +260, 259, 153, -1, +153, 258, 261, -1, +153, 261, 262, -1, +263, 260, 153, -1, +264, 263, 153, -1, +153, 262, 265, -1, +153, 265, 266, -1, +267, 264, 153, -1, +153, 266, 268, -1, +153, 268, 267, -1, +1, 1, 1, -1, +204, 204, 204, -1, +191, 204, 204, -1, +204, 204, 204, -1, +204, 204, 204, -1, +204, 204, 204, -1, +269, 270, 271, -1, +271, 272, 273, -1, +273, 274, 275, -1, +275, 276, 277, -1, +277, 278, 279, -1, +279, 280, 281, -1, +281, 282, 283, -1, +283, 284, 285, -1, +285, 1, 286, -1, +286, 287, 288, -1, +288, 289, 290, -1, +290, 291, 292, -1, +292, 293, 294, -1, +294, 295, 296, -1, +296, 297, 298, -1, +298, 299, 300, -1, +300, 301, 302, -1, +302, 303, 304, -1, +304, 305, 306, -1, +306, 307, 308, -1, +308, 309, 310, -1, +310, 311, 312, -1, +312, 313, 314, -1, +314, 315, 316, -1, +316, 204, 317, -1, +317, 318, 319, -1, +319, 320, 321, -1, +321, 322, 323, -1, +323, 324, 325, -1, +325, 326, 327, -1, +327, 328, 329, -1, +329, 330, 269, -1, +269, 271, 273, -1, +273, 275, 277, -1, +277, 279, 281, -1, +281, 283, 285, -1, +285, 286, 288, -1, +288, 290, 292, -1, +292, 294, 296, -1, +296, 298, 300, -1, +300, 302, 304, -1, +304, 306, 308, -1, +308, 310, 312, -1, +312, 314, 316, -1, +316, 317, 319, -1, +319, 321, 323, -1, +323, 325, 327, -1, +327, 329, 269, -1, +269, 273, 277, -1, +277, 281, 285, -1, +285, 288, 292, -1, +292, 296, 300, -1, +300, 304, 308, -1, +308, 312, 316, -1, +316, 319, 323, -1, +323, 327, 269, -1, +269, 277, 285, -1, +285, 292, 300, -1, +300, 308, 316, -1, +316, 323, 269, -1, +269, 285, 300, -1, +300, 316, 269, -1, +177, 175, 173, -1, +285, 284, 177, -1, +177, 173, 169, -1, +169, 172, 285, -1, +177, 169, 285, -1, +285, 1, 1, -1, +1, 1, 1, -1, +1, 1, 1, -1, +1, 285, 1, -1, +0, 45, 0, -1, +1, 1, 1, -1, +1, 0, 0, -1, +1, 1, 1, -1, +1, 0, 1, -1, +1, 0, 331, -1, +331, 286, 1, -1, +286, 331, 332, -1, +332, 287, 286, -1, +287, 332, 333, -1, +333, 288, 287, -1, +288, 333, 334, -1, +334, 289, 288, -1, +289, 334, 335, -1, +335, 290, 289, -1, +290, 335, 336, -1, +336, 291, 290, -1, +291, 336, 337, -1, +337, 292, 291, -1, +292, 337, 338, -1, +338, 293, 292, -1, +293, 338, 339, -1, +339, 294, 293, -1, +294, 339, 340, -1, +340, 295, 294, -1, +295, 340, 341, -1, +341, 296, 295, -1, +296, 341, 342, -1, +342, 297, 296, -1, +297, 342, 343, -1, +343, 298, 297, -1, +298, 343, 344, -1, +344, 299, 298, -1, +299, 344, 345, -1, +345, 300, 299, -1, +300, 345, 346, -1, +346, 301, 300, -1, +301, 346, 347, -1, +347, 302, 301, -1, +302, 347, 348, -1, +348, 303, 302, -1, +303, 348, 349, -1, +349, 304, 303, -1, +304, 349, 350, -1, +350, 305, 304, -1, +305, 350, 351, -1, +351, 306, 305, -1, +306, 351, 352, -1, +352, 307, 306, -1, +307, 352, 353, -1, +353, 308, 307, -1, +308, 353, 354, -1, +354, 309, 308, -1, +309, 354, 355, -1, +355, 310, 309, -1, +310, 355, 356, -1, +356, 311, 310, -1, +311, 356, 357, -1, +357, 312, 311, -1, +312, 357, 358, -1, +358, 313, 312, -1, +313, 358, 359, -1, +359, 314, 313, -1, +314, 359, 360, -1, +360, 315, 314, -1, +315, 360, 361, -1, +361, 316, 315, -1, +204, 316, 361, -1, +361, 191, 191, -1, +361, 191, 204, -1, +204, 191, 204, -1, +204, 204, 204, -1, +204, 204, 204, -1, +204, 204, 204, -1, +204, 317, 204, -1, +204, 204, 204, -1, +204, 204, 204, -1, +185, 183, 179, -1, +317, 187, 185, -1, +185, 179, 182, -1, +182, 318, 317, -1, +317, 185, 182, -1, +45, 44, 201, -1, +201, 200, 198, -1, +198, 199, 240, -1, +240, 45, 201, -1, +240, 201, 198, -1, +264, 267, 268, -1, +268, 266, 265, -1, +265, 262, 261, -1, +261, 258, 257, -1, +257, 254, 253, -1, +253, 250, 249, -1, +249, 246, 245, -1, +245, 242, 241, -1, +241, 192, 191, -1, +191, 361, 360, -1, +360, 359, 358, -1, +358, 357, 356, -1, +356, 355, 354, -1, +354, 353, 352, -1, +352, 351, 350, -1, +350, 349, 348, -1, +348, 347, 346, -1, +346, 345, 344, -1, +344, 343, 342, -1, +342, 341, 340, -1, +340, 339, 338, -1, +338, 337, 336, -1, +336, 335, 334, -1, +334, 333, 332, -1, +332, 331, 0, -1, +0, 45, 240, -1, +240, 243, 244, -1, +244, 247, 248, -1, +248, 251, 252, -1, +252, 255, 256, -1, +256, 259, 260, -1, +260, 263, 264, -1, +264, 268, 265, -1, +265, 261, 257, -1, +257, 253, 249, -1, +249, 245, 241, -1, +241, 191, 360, -1, +360, 358, 356, -1, +356, 354, 352, -1, +352, 350, 348, -1, +348, 346, 344, -1, +344, 342, 340, -1, +340, 338, 336, -1, +336, 334, 332, -1, +332, 0, 240, -1, +240, 244, 248, -1, +248, 252, 256, -1, +256, 260, 264, -1, +264, 265, 257, -1, +257, 249, 241, -1, +241, 360, 356, -1, +356, 352, 348, -1, +348, 344, 340, -1, +340, 336, 332, -1, +332, 240, 248, -1, +248, 256, 264, -1, +264, 257, 241, -1, +241, 356, 348, -1, +348, 340, 332, -1, +332, 248, 264, -1, +264, 241, 348, -1, +348, 332, 264, -1, +191, 191, 192, -1, +192, 192, 191, -1, +267, 267, 264, -1, +264, 264, 267, -1, +268, 268, 267, -1, +267, 267, 268, -1, +266, 266, 268, -1, +268, 268, 266, -1, +265, 265, 266, -1, +266, 266, 265, -1, +262, 262, 265, -1, +265, 265, 262, -1, +261, 261, 262, -1, +262, 262, 261, -1, +258, 258, 261, -1, +261, 261, 258, -1, +257, 257, 258, -1, +258, 258, 257, -1, +254, 254, 257, -1, +257, 257, 254, -1, +253, 253, 254, -1, +254, 254, 253, -1, +250, 250, 253, -1, +253, 253, 250, -1, +249, 249, 250, -1, +250, 250, 249, -1, +246, 246, 249, -1, +249, 249, 246, -1, +245, 245, 246, -1, +246, 246, 245, -1, +242, 242, 245, -1, +245, 245, 242, -1, +241, 241, 242, -1, +242, 242, 241, -1, +193, 192, 192, -1, +192, 241, 241, -1, +197, 196, 195, -1, +192, 241, 197, -1, +194, 193, 192, -1, +197, 195, 194, -1, +192, 197, 194, -1, +263, 263, 260, -1, +264, 264, 263, -1, +263, 263, 264, -1, +178, 177, 284, -1, +178, 284, 283, -1, +318, 182, 181, -1, +319, 318, 181, -1, +178, 283, 282, -1, +178, 282, 281, -1, +320, 319, 181, -1, +321, 320, 181, -1, +178, 281, 280, -1, +178, 280, 279, -1, +322, 321, 181, -1, +323, 322, 181, -1, +178, 279, 278, -1, +178, 278, 277, -1, +324, 323, 181, -1, +325, 324, 181, -1, +181, 178, 277, -1, +181, 277, 276, -1, +326, 325, 181, -1, +327, 326, 181, -1, +181, 276, 275, -1, +181, 275, 274, -1, +328, 327, 181, -1, +329, 328, 181, -1, +181, 274, 273, -1, +181, 273, 272, -1, +330, 329, 181, -1, +269, 330, 181, -1 + + ] + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle_convexdecomposition.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle_convexdecomposition.obj new file mode 100755 index 0000000..adedd77 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle_convexdecomposition.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46738e1fac2c61283c3882f3b089e0529d1833543611882a262f49b6ef62cd81 +size 4264 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle_convexdecomposition.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle_convexdecomposition.wrl new file mode 100755 index 0000000..7acf292 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/drawer_handle_convexdecomposition.wrl @@ -0,0 +1,111 @@ +#VRML V2.0 utf8 + +# Generated by VCGLIB, (C)Copyright 1999-2001 VCG, IEI-CNR + +NavigationInfo { + type [ "EXAMINE", "ANY" ] +} +Transform { + scale 1 1 1 + translation 0 0 0 + children + [ + Shape + { + geometry IndexedFaceSet + { + creaseAngle .5 + solid FALSE + coord Coordinate + { + point + [ + 0.273353 -0.083513 0.00574, 0.295333 -0.083513 0.00574, 0.273229 -0.049378 0.020858, 0.295243 -0.07641 0.020633, + 0.273229 -0.049378 -0.002386, 0.295088 -0.075261 -0.001999, 0.273429 -0.078417 0.019655, 0.273599 -0.075261 -0.001999, + 0.294921 -0.04339 -0.002934, 0.295246 -0.083359 0.013693, 0.294921 -0.04339 0.021407, 0.273444 -0.07641 0.020633, + 0.273441 -0.083359 0.013693, 0.273475 -0.081322 0.001825, 0.295149 -0.079252 -9.6e-05, 0.295258 -0.082386 0.015684, + 0.295258 -0.078417 0.019655, 0.273429 -0.082386 0.015684, 0.295212 -0.081322 0.001825, 0.273538 -0.079252 -9.6e-05, + 0.296194 -0.083475 0.005632, 0.311329 0.002299 0.020597, 0.311857 0.005292 -0.002934, 0.311857 -0.080429 -0.000816, + 0.297343 0.003336 -0.002405, 0.296317 -0.075672 0.020896, 0.311857 -0.07725 0.021407, 0.297101 0.004917 0.021305, + 0.296436 -0.074115 -0.002241, 0.311857 -0.076193 -0.002934, 0.296224 -0.083302 0.01385, 0.311329 -0.081672 0.013678, + 0.296299 -0.078813 -0.000417, 0.296272 -0.077934 0.019944, 0.311329 -0.081672 0.00578, 0.296227 -0.082256 0.015902, + 0.296253 -0.081089 0.001569, 0.273475 0.081322 0.001825, 0.295243 0.07641 0.020633, 0.273444 0.07641 0.020633, + 0.294921 0.04339 -0.002934, 0.273229 0.049378 0.020858, 0.294921 0.04339 0.021407, 0.272704 0.048687 -0.002934, + 0.295088 0.075261 -0.001999, 0.295246 0.083359 0.013693, 0.273441 0.083359 0.013693, 0.273599 0.075261 -0.001999, + 0.295333 0.083513 0.00574, 0.273353 0.083513 0.00574, 0.295149 0.079252 -9.6e-05, 0.273429 0.078417 0.019655, + 0.295258 0.082386 0.015684, 0.273429 0.082386 0.015684, 0.295258 0.078417 0.019655, 0.295212 0.081322 0.001825, + 0.273538 0.079252 -9.6e-05, 0.296284 0.081117 0.0016, 0.311857 0.077246 0.021407, 0.311857 0.079359 0.020347, + 0.311857 0.005299 -0.002934, 0.297101 0.00563 0.021305, 0.311857 0.076189 -0.002934, 0.297343 0.007024 -0.002405, + 0.311329 0.007939 0.020597, 0.296343 0.075786 0.020856, 0.295984 0.042337 -0.002934, 0.296254 0.083309 0.013833, + 0.311329 0.082017 0.00578, 0.296457 0.07433 -0.002209, 0.295984 0.042337 0.021407, 0.311857 0.080423 -0.000816, + 0.29622 0.083479 0.005644, 0.311329 0.082017 0.013678, 0.296216 0.079388 0.018995, 0.296331 0.078874 -0.000377, + 0.311857 0.080423 0.019289, 0.296256 0.082271 0.015877, 0.296298 0.077997 0.019906 + ] + } + color Color + { + color + [ + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941 + ] + } + coordIndex + [ + 14,13,19,-1, 0,2,4,-1, 2,0,6,-1, 5,7,8,-1, 4,2,8,-1, 1,5,8,-1, + 7,4,8,-1, 0,1,9,-1, 3,1,10,-1, 1,8,10,-1, 8,2,10,-1, 2,6,11,-1, + 6,3,11,-1, 10,2,11,-1, 3,10,11,-1, 0,9,12,-1, 1,0,13,-1, 0,4,13,-1, + 7,5,14,-1, 9,1,15,-1, 12,9,15,-1, 1,3,16,-1, 3,6,16,-1, 15,1,16,-1, + 6,15,16,-1, 6,0,17,-1, 0,12,17,-1, 15,6,17,-1, 12,15,17,-1, 5,1,18,-1, + 1,13,18,-1, 13,14,18,-1, 14,5,18,-1, 4,7,19,-1, 13,4,19,-1, 7,14,19,-1, + 27,32,36,-1, 22,21,26,-1, 23,22,26,-1, 25,26,27,-1, 21,22,27,-1, 22,24,27,-1, + 26,21,27,-1, 28,24,29,-1, 22,23,29,-1, 24,22,29,-1, 23,26,31,-1, 30,20,31,-1, + 27,24,32,-1, 24,28,32,-1, 28,29,32,-1, 29,23,32,-1, 26,25,33,-1, 25,27,33,-1, + 27,20,33,-1, 20,23,34,-1, 31,20,34,-1, 23,31,34,-1, 20,30,35,-1, 31,26,35,-1, + 30,31,35,-1, 26,33,35,-1, 33,20,35,-1, 23,20,36,-1, 20,27,36,-1, 32,23,36,-1, + 50,47,56,-1, 38,39,42,-1, 39,41,42,-1, 42,41,43,-1, 40,42,43,-1, 40,43,44,-1, + 44,43,47,-1, 38,42,48,-1, 42,40,48,-1, 40,44,48,-1, 46,45,48,-1, 46,48,49,-1, + 37,43,49,-1, 48,37,49,-1, 44,47,50,-1, 39,38,51,-1, 41,39,51,-1, 43,41,51,-1, + 45,46,52,-1, 48,45,52,-1, 51,52,53,-1, 46,49,53,-1, 49,43,53,-1, 43,51,53,-1, + 52,46,53,-1, 38,48,54,-1, 51,38,54,-1, 48,52,54,-1, 52,51,54,-1, 48,44,55,-1, + 37,48,55,-1, 50,37,55,-1, 44,50,55,-1, 43,37,56,-1, 47,43,56,-1, 37,50,56,-1, + 74,65,78,-1, 59,58,60,-1, 59,60,62,-1, 60,61,63,-1, 60,58,64,-1, 61,60,64,-1, + 58,61,64,-1, 62,60,66,-1, 60,63,66,-1, 63,61,66,-1, 62,66,69,-1, 61,58,70,-1, + 58,65,70,-1, 66,61,70,-1, 59,62,71,-1, 57,66,72,-1, 66,70,72,-1, 71,57,72,-1, + 68,71,72,-1, 71,68,73,-1, 72,67,73,-1, 68,72,73,-1, 70,65,74,-1, 67,72,74,-1, + 72,70,74,-1, 66,57,75,-1, 62,69,75,-1, 69,66,75,-1, 71,62,75,-1, 57,71,75,-1, + 59,71,76,-1, 73,67,76,-1, 71,73,76,-1, 74,59,76,-1, 74,76,77,-1, 67,74,77,-1, + 76,67,77,-1, 58,59,78,-1, 65,58,78,-1, 59,74,78,-1 + ] + } + appearance Appearance + { + material Material + { + ambientIntensity 0.2 + diffuseColor 0.9 0.9 0.9 + specularColor .1 .1 .1 + shininess .5 + } + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Left_1_Link.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Left_1_Link.STL new file mode 100755 index 0000000..787d9f2 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Left_1_Link.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dc04080b3c27816c22f1270aaffbd6e3462e760ed70a9063c8beeab6531fb6e +size 165584 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Left_2_Link.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Left_2_Link.STL new file mode 100755 index 0000000..58ccee3 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Left_2_Link.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14f804a49108b6943d29ca0acf1d3bd729c92633a8c9349469b38cda174ea6df +size 165584 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Left_Support_Link.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Left_Support_Link.STL new file mode 100755 index 0000000..f5546dc --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Left_Support_Link.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4c3248cf9f2c925d18aa9bb2e3659ef0d6a703252b006a3d9f1bc8ec2e917fb +size 653284 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Right_1_Link.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Right_1_Link.STL new file mode 100755 index 0000000..3c00cba --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Right_1_Link.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93c508d0575ebd1a57550fa81f71fe62d98adfa04bf63748fd7fc4185988e97d +size 165584 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Right_2_Link.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Right_2_Link.STL new file mode 100755 index 0000000..ecdb88c --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Right_2_Link.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1bbd7dce7071851482eb7c47e17934847c98f3ead2cc1a148387dbec969ba4c4 +size 165584 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Right_Support_Link.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Right_Support_Link.STL new file mode 100755 index 0000000..9f2444f --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/Right_Support_Link.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:136475599e901768a0195df51634cb3f007d0d5a0c647855056aac31dc62a73b +size 653284 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/base_link.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/base_link.STL new file mode 100755 index 0000000..bc176ba --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/gripper/meshes/base_link.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc86b6a32e9471c70a3d61c32647e94ef1757a49af21b81167c1723a8c95f9eb +size 849934 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/base_link.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/base_link.STL new file mode 100644 index 0000000..53113a8 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/base_link.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a99f73338c90276cd7a90573714300c4a1383c5514d3a5e0671fb60b440ac5d4 +size 368984 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/camera_link.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/camera_link.STL new file mode 100644 index 0000000..8101e09 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/camera_link.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f86f502db343c512a1b1307189d1b0b2d448af4886e84bd9d09e8e125d9ad165 +size 51884 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/camera_rolink.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/camera_rolink.STL new file mode 100644 index 0000000..5751bbe --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/camera_rolink.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1fbc2fef86689e5a5b1d5b8a8d6c5e68cc9a548dee461de0c759a18e5023317 +size 280684 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_1.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_1.STL new file mode 100644 index 0000000..e32d8c3 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_1.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:008894df7deb20d9aec98b4dbc3ac8e12dbc31b90e6a8485542140eb0ab3ded5 +size 189684 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_2.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_2.STL new file mode 100644 index 0000000..a23c3b8 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_2.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3a46b4b619bfd28d8948d5335f8bd62284ea0742ec4fb2b7ac5e5ab858d67f8 +size 368484 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_3.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_3.STL new file mode 100644 index 0000000..c426a9b --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_3.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d903745e9369009ac064bc24c080d03f503b3386b8e14325a318cf8fde0959d +size 185784 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_4.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_4.STL new file mode 100644 index 0000000..1d2736c --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_4.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2fc93b2bc970eadca950afa3120129766e2bead60234c6d8752d3b223e407046 +size 184184 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_5.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_5.STL new file mode 100644 index 0000000..f0eba0e --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_5.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9d0216056f7e1512858033163b0415973e1db573a1fee5af1609171967c043f +size 195784 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_6.STL b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_6.STL new file mode 100644 index 0000000..ebb3b0b --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/rm65/meshes/link_6.STL @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f902cd207e284336242946a7fb519f8a499b4278048ba4646d64feba14dbdea +size 732484 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.mtl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.mtl new file mode 100755 index 0000000..d90b5cb --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.mtl @@ -0,0 +1,10 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl None +Ns 0 +Ka 0.000000 0.000000 0.000000 +Kd 0.425 0.5 0.725 +Ks 0.8 0.8 0.8 +d 1 +illum 2 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.obj new file mode 100755 index 0000000..2670c91 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:330af0191f900598a8c73d19111e60b08d2f0e1c3b32c27a0767fc747644082d +size 15408 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.obj.mtl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.obj.mtl new file mode 100755 index 0000000..21b46cf --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.obj.mtl @@ -0,0 +1,9 @@ +# File produced by Open Asset Import Library (http://www.assimp.sf.net) +# (assimp v3.1.187496374) + +newmtl DefaultMaterial +Kd 0.6 0.6 0.6 +Ka 0.05 0.05 0.05 +Ks 0.6 0.6 0.6 +illum 1 + diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.stl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.stl new file mode 100755 index 0000000..c5bef5f --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.stl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb79767adb659686ebde7b0b81ce853b9be9bb43bb6668f83395155c687d4cee +size 6484 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.wrl new file mode 100755 index 0000000..eee15c8 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion.wrl @@ -0,0 +1,224 @@ +#VRML V2.0 utf8 +Group { + children [ + Shape { + appearance Appearance { + material Material { + diffuseColor 0.975 0.486 0.975 + specularColor 0.7 0.7 1.0 + } + } + geometry IndexedFaceSet { + solid FALSE + coord Coordinate { + point [ +-0.284800 -0.381000 0.402000, +-0.284800 0.381000 0.402000, +-0.284800 0.381000 0.382000, +-0.284800 -0.381000 0.382000, +0.324800 0.381000 0.402000, +0.324800 0.381000 0.382000, +0.324800 -0.381000 0.402000, +0.324800 -0.381000 0.382000, +-0.286000 -0.362000 -0.362000, +-0.286000 0.362000 -0.362000, +-0.286000 0.362000 0.381000, +-0.286000 -0.362000 0.381000, +0.305000 0.381000 -0.381000, +0.305000 -0.381000 -0.381000, +-0.305000 -0.381000 -0.381000, +-0.305000 0.381000 -0.381000, +0.305000 0.362000 0.381000, +0.305000 0.381000 0.381000, +-0.305000 0.381000 0.381000, +-0.305000 -0.381000 0.381000, +0.305000 -0.381000 0.381000, +0.305000 -0.362000 0.381000, +0.305000 -0.362000 -0.362000, +0.305000 0.362000 -0.362000, +-0.292304 -0.362018 0.380000, +-0.292304 -0.362018 0.382000, +-0.292304 0.362042 0.382000, +-0.292304 0.362042 0.380000, +-0.265316 0.362042 0.382000, +-0.265316 0.362042 0.380000, +-0.266771 0.362113 0.380000, +-0.266771 0.362113 0.382000, +-0.265316 -0.362018 0.382000, +-0.265316 -0.362018 0.380000, +-0.290766 -0.362113 0.382000, +-0.266854 -0.362113 0.382000, +-0.266854 -0.362113 0.380000, +-0.290766 -0.362113 0.380000, +-0.266854 -0.380979 0.380000, +-0.290766 -0.380979 0.380000, +-0.266854 -0.380979 0.382000, +-0.290766 -0.380979 0.382000, +-0.266771 0.381007 0.380000, +-0.266771 0.381007 0.382000, +-0.290849 0.362113 0.380000, +-0.290849 0.362113 0.382000, +-0.290849 0.381007 0.380000, +-0.290849 0.381007 0.382000, +0.271506 -0.362018 0.380000, +0.271506 -0.362018 0.382000, +0.271506 0.362042 0.382000, +0.271506 0.362042 0.380000, +0.298494 0.362042 0.382000, +0.298494 0.362042 0.380000, +0.297039 0.362113 0.380000, +0.297039 0.362113 0.382000, +0.298494 -0.362018 0.382000, +0.298494 -0.362018 0.380000, +0.273044 -0.362113 0.382000, +0.296956 -0.362113 0.382000, +0.296956 -0.362113 0.380000, +0.273044 -0.362113 0.380000, +0.296956 -0.380979 0.380000, +0.273044 -0.380979 0.380000, +0.296956 -0.380979 0.382000, +0.273044 -0.380979 0.382000, +0.297039 0.381007 0.380000, +0.297039 0.381007 0.382000, +0.272961 0.362113 0.380000, +0.272961 0.362113 0.382000, +0.272961 0.381007 0.380000, +0.272961 0.381007 0.382000, + + ] + } + coordIndex [ +0, 1, 2, -1, +0, 2, 3, -1, +1, 4, 5, -1, +1, 5, 2, -1, +4, 6, 7, -1, +4, 7, 5, -1, +6, 0, 3, -1, +6, 3, 7, -1, +3, 2, 5, -1, +3, 5, 7, -1, +6, 4, 1, -1, +6, 1, 0, -1, +8, 9, 10, -1, +8, 10, 11, -1, +12, 13, 14, -1, +12, 14, 15, -1, +16, 17, 10, -1, +10, 17, 18, -1, +10, 18, 11, -1, +11, 18, 19, -1, +11, 19, 20, -1, +11, 20, 21, -1, +22, 21, 20, -1, +22, 20, 13, -1, +22, 13, 12, -1, +22, 12, 23, -1, +16, 23, 12, -1, +16, 12, 17, -1, +13, 20, 19, -1, +13, 19, 14, -1, +14, 19, 18, -1, +14, 18, 15, -1, +17, 12, 15, -1, +17, 15, 18, -1, +23, 9, 8, -1, +23, 8, 22, -1, +10, 9, 23, -1, +10, 23, 16, -1, +22, 8, 11, -1, +22, 11, 21, -1, +24, 25, 26, -1, +24, 26, 27, -1, +28, 29, 30, -1, +28, 30, 31, -1, +29, 28, 32, -1, +29, 32, 33, -1, +32, 25, 34, -1, +32, 34, 35, -1, +27, 29, 33, -1, +27, 33, 24, -1, +28, 26, 25, -1, +28, 25, 32, -1, +33, 32, 35, -1, +33, 35, 36, -1, +25, 24, 37, -1, +25, 37, 34, -1, +24, 33, 36, -1, +24, 36, 37, -1, +37, 36, 38, -1, +37, 38, 39, -1, +38, 40, 41, -1, +38, 41, 39, -1, +34, 37, 39, -1, +34, 39, 41, -1, +35, 34, 41, -1, +35, 41, 40, -1, +36, 35, 40, -1, +36, 40, 38, -1, +31, 30, 42, -1, +31, 42, 43, -1, +29, 27, 44, -1, +29, 44, 30, -1, +26, 28, 31, -1, +26, 31, 45, -1, +27, 26, 45, -1, +27, 45, 44, -1, +46, 47, 43, -1, +46, 43, 42, -1, +30, 44, 46, -1, +30, 46, 42, -1, +45, 31, 43, -1, +45, 43, 47, -1, +44, 45, 47, -1, +44, 47, 46, -1, +48, 49, 50, -1, +48, 50, 51, -1, +52, 53, 54, -1, +52, 54, 55, -1, +53, 52, 56, -1, +53, 56, 57, -1, +56, 49, 58, -1, +56, 58, 59, -1, +51, 53, 57, -1, +51, 57, 48, -1, +52, 50, 49, -1, +52, 49, 56, -1, +57, 56, 59, -1, +57, 59, 60, -1, +49, 48, 61, -1, +49, 61, 58, -1, +48, 57, 60, -1, +48, 60, 61, -1, +61, 60, 62, -1, +61, 62, 63, -1, +62, 64, 65, -1, +62, 65, 63, -1, +58, 61, 63, -1, +58, 63, 65, -1, +59, 58, 65, -1, +59, 65, 64, -1, +60, 59, 64, -1, +60, 64, 62, -1, +55, 54, 66, -1, +55, 66, 67, -1, +53, 51, 68, -1, +53, 68, 54, -1, +50, 52, 55, -1, +50, 55, 69, -1, +51, 50, 69, -1, +51, 69, 68, -1, +70, 71, 67, -1, +70, 67, 66, -1, +54, 68, 70, -1, +54, 70, 66, -1, +69, 55, 67, -1, +69, 67, 71, -1, +68, 69, 71, -1, +68, 71, 70, -1 + + ] + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition.obj new file mode 100755 index 0000000..f2b45a5 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a2c709df5cc24bdabc8895676bd1e5bc7c38d6189e3921388040b0f8070bfc8 +size 8655 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition.wrl new file mode 100755 index 0000000..2a10295 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition.wrl @@ -0,0 +1,99 @@ +#VRML V2.0 utf8 + +# Generated by VCGLIB, (C)Copyright 1999-2001 VCG, IEI-CNR + +NavigationInfo { + type [ "EXAMINE", "ANY" ] +} +Transform { + scale 1 1 1 + translation 0 0 0 + children + [ + Shape + { + geometry IndexedFaceSet + { + creaseAngle .5 + solid FALSE + coord Coordinate + { + point + [ + 0.335071 0.383357 0.408209, -0.305 -0.379805 0.358978, 0.335071 -0.387214 0.408209, 0.305 0.376628 0.358934, + -0.286289 0.383357 0.408209, 0.305 -0.380485 0.358934, -0.305 0.375948 0.358978, -0.286289 -0.387214 0.408209, + 0.335071 0.383357 0.370932, 0.335071 -0.387214 0.370932, -0.299263 -0.381 -0.338461, 0.310214 -0.064103 -0.349937, + 0.310214 -0.064103 -0.387214, 0.310214 -0.387214 -0.387214, -0.311214 -0.064103 -0.387214, -0.286 -0.056932 -0.336402, + 0.298263 -0.381 -0.338461, -0.311214 -0.387214 -0.387214, 0.310214 -0.349893 -0.337505, -0.305 -0.067334 -0.338002, + -0.311214 -0.064071 -0.387214, 0.305 0.379603 -0.337922, 0.310214 0.383357 -0.387214, 0.310214 -0.064071 -0.387214, + -0.286 -0.074002 -0.336402, -0.305 0.378883 -0.338002, -0.311214 0.383357 -0.387214, 0.310214 -0.064071 -0.349937, + 0.310214 0.358481 -0.337505, -0.305 -0.059597 -0.338002, -0.273165 -0.054122 0.38, -0.311209 -0.387214 -0.3375, + -0.262456 -0.381 -0.324114, -0.273058 -0.052729 -0.362, -0.259822 -0.358283 0.382, -0.311209 -0.064103 0.3585, + -0.311209 -0.387214 0.3585, -0.311209 -0.064103 -0.3375, -0.25975 -0.35864 -0.362, -0.262456 -0.381 0.345114, + -0.2615 -0.387211 -0.3375, 0.310214 -0.349929 0.3585, 0.310214 -0.387211 0.3585, -0.279161 -0.348777 0.38, + 0.310214 -0.349929 -0.3375, -0.281625 -0.348616 -0.362, -0.2615 -0.387211 0.3585, 0.310214 -0.387211 -0.3375, + -0.261762 0.381 0.354833, -0.311209 -0.064071 -0.3375, -0.273058 -0.079821 -0.362, -0.273165 -0.077893 0.38, + -0.311209 0.383357 -0.3375, -0.311209 0.383357 0.3585, -0.26106 0.362 -0.34366, -0.311209 -0.064071 0.3585, + -0.261762 0.381 -0.333833, -0.26106 0.362 0.36466, -0.281625 0.357625 -0.362, 0.310214 0.383357 0.3585, + 0.310214 0.3585 0.3585, -0.279161 0.357732 0.38, -0.2615 0.383357 -0.3375, 0.310214 0.383357 -0.3375, + 0.310214 0.3585 -0.3375, -0.2615 0.383357 0.3585 + ] + } + color Color + { + color + [ + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941 + ] + } + coordIndex + [ + 5,8,9,-1, 2,0,4,-1, 1,3,5,-1, 3,1,6,-1, 1,4,6,-1, 4,1,7,-1, + 2,4,7,-1, 0,2,8,-1, 4,0,8,-1, 5,3,8,-1, 3,6,8,-1, 6,4,8,-1, + 1,5,9,-1, 7,1,9,-1, 2,7,9,-1, 8,2,9,-1, 14,17,19,-1, 12,11,13,-1, + 12,13,14,-1, 12,14,15,-1, 11,12,15,-1, 10,13,16,-1, 13,10,17,-1, 14,13,17,-1, + 13,11,18,-1, 11,15,18,-1, 15,10,18,-1, 10,16,18,-1, 16,13,18,-1, 15,14,19,-1, + 10,15,19,-1, 17,10,19,-1, 25,20,29,-1, 20,22,23,-1, 20,23,24,-1, 22,20,26,-1, + 21,22,26,-1, 25,21,26,-1, 20,25,26,-1, 23,22,27,-1, 24,23,27,-1, 24,27,28,-1, + 22,21,28,-1, 21,25,28,-1, 25,24,28,-1, 27,22,28,-1, 20,24,29,-1, 24,25,29,-1, + 32,38,39,-1, 33,30,34,-1, 30,33,35,-1, 31,32,36,-1, 34,30,36,-1, 35,31,36,-1, + 30,35,36,-1, 33,31,37,-1, 31,35,37,-1, 35,33,37,-1, 32,31,38,-1, 31,33,38,-1, + 33,34,38,-1, 38,34,39,-1, 36,32,39,-1, 34,36,39,-1, 40,45,47,-1, 42,41,43,-1, + 41,42,44,-1, 41,44,45,-1, 43,41,45,-1, 45,40,46,-1, 40,42,46,-1, 42,43,46,-1, + 43,45,46,-1, 42,40,47,-1, 44,42,47,-1, 45,44,47,-1, 54,48,57,-1, 50,49,52,-1, + 52,49,53,-1, 48,52,53,-1, 50,52,54,-1, 49,50,55,-1, 50,51,55,-1, 53,49,55,-1, + 51,53,55,-1, 52,48,56,-1, 48,54,56,-1, 54,52,56,-1, 51,50,57,-1, 53,51,57,-1, + 48,53,57,-1, 50,54,57,-1, 59,62,65,-1, 60,59,61,-1, 58,60,61,-1, 62,59,63,-1, + 59,60,63,-1, 58,62,63,-1, 63,60,64,-1, 60,58,64,-1, 58,63,64,-1, 61,59,65,-1, + 58,61,65,-1, 62,58,65,-1 + ] + } + appearance Appearance + { + material Material + { + ambientIntensity 0.2 + diffuseColor 0.9 0.9 0.9 + specularColor .1 .1 .1 + shininess .5 + } + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition0.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition0.obj new file mode 100755 index 0000000..b023945 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition0.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba5d00c384bda018db357bfb452e151a0a3c97e16a62c298f0aaa0ed9ebe1260 +size 511 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition1.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition1.obj new file mode 100755 index 0000000..ceeef3f --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition1.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:315c29d649234c1f71e230ee7195c51631ec31654a63c5792e4e7e589277743c +size 475 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition2.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition2.obj new file mode 100755 index 0000000..9cf540a --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition2.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ee8f45b94424820d08aaab0b05f48149467272b88e75edc722d006d6746254b +size 468 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition3.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition3.obj new file mode 100755 index 0000000..21b7aa1 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition3.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5a31fe7f0c61721b173408d24887b4e513343ff279d44abe9e6059b5141f996 +size 472 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition4.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition4.obj new file mode 100755 index 0000000..8b76df7 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition4.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e9f4e5e44444e76708693f7f9ba587df0e2585dbfeda868311f46e72c667919 +size 364 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition5.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition5.obj new file mode 100755 index 0000000..0c097e5 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition5.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59867df0870b247c4621754ced871c87898c9eba7d7ea5710842085afd4cfb09 +size 466 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition6.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition6.obj new file mode 100755 index 0000000..a846fa8 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/sektion_convexdecomposition6.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:baf686cb12e708dc7041130b603173f0513518fad6ed341eda2db12da101ebbb +size 356 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.obj new file mode 100755 index 0000000..bd6bd39 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ac1457b024e4b8746be4bf9603f56e892627c3d3633cce33faa88cfcb6b9db6 +size 2736 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.obj.mtl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.obj.mtl new file mode 100755 index 0000000..21b46cf --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.obj.mtl @@ -0,0 +1,9 @@ +# File produced by Open Asset Import Library (http://www.assimp.sf.net) +# (assimp v3.1.187496374) + +newmtl DefaultMaterial +Kd 0.6 0.6 0.6 +Ka 0.05 0.05 0.05 +Ks 0.6 0.6 0.6 +illum 1 + diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.stl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.stl new file mode 100755 index 0000000..1cd2be5 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.stl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8f77725664f2a5eb1bd9af71402c758a5074e9f3960c8058444d20eb4784329 +size 684 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.wrl new file mode 100755 index 0000000..2da55f0 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/table_top.wrl @@ -0,0 +1,44 @@ +#VRML V2.0 utf8 +Group { + children [ + Shape { + appearance Appearance { + material Material { + diffuseColor 0.975 0.486 0.975 + specularColor 0.7 0.7 1.0 + } + } + geometry IndexedFaceSet { + solid FALSE + coord Coordinate { + point [ +0.100000 0.100000 -0.020000, +0.100000 -0.100000 -0.020000, +-0.100000 -0.100000 -0.020000, +-0.100000 0.100000 -0.020000, +0.100000 0.100000 0.020000, +-0.100000 0.100000 0.020000, +-0.100000 -0.100000 0.020000, +0.100000 -0.100000 0.020000, + + ] + } + coordIndex [ +0, 1, 2, -1, +0, 2, 3, -1, +4, 5, 6, -1, +4, 6, 7, -1, +0, 4, 7, -1, +0, 7, 1, -1, +1, 7, 6, -1, +1, 6, 2, -1, +2, 6, 5, -1, +2, 5, 3, -1, +4, 0, 3, -1, +4, 3, 5, -1 + + ] + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left.obj new file mode 100755 index 0000000..eaa8ba7 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:818260d8fbdff6648bfb4bdb904465e6517a66499e2a0f5bf2767d0161c63195 +size 75286 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left.wrl new file mode 100755 index 0000000..ebb0f84 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left.wrl @@ -0,0 +1,618 @@ +#VRML V2.0 utf8 + +# Generated by VCGLIB, (C)Copyright 1999-2001 VCG, IEI-CNR + +NavigationInfo { + type [ "EXAMINE", "ANY" ] +} +Transform { + scale 1 1 1 + translation 0 0 0 + children + [ + Shape + { + geometry IndexedFaceSet + { + creaseAngle .5 + solid FALSE + coord Coordinate + { + point + [ + -0.010282 -0.189491 0.188934, -0.008882 -0.190891 0.188934, -0.006123 -0.190891 0.188934, -0.010282 -0.189491 0.188934, + -0.006123 -0.190891 0.188934, -0.010282 -0.184131 0.188934, -0.006123 -0.190891 0.210934, -0.010282 -0.184131 0.210934, + -0.006123 -0.184131 0.210934, -0.010282 -0.189491 -0.189757, -0.010282 -0.184131 -0.189757, -0.006123 -0.190891 -0.189757, + -0.010282 -0.189491 -0.189757, -0.006123 -0.190891 -0.189757, -0.008882 -0.190891 -0.189757, -0.006123 -0.190891 -0.211757, + -0.010282 -0.184131 -0.211757, -0.010282 -0.189491 -0.211757, -0.006123 -0.190891 -0.211757, -0.010282 -0.189491 -0.211757, + -0.008882 -0.190891 -0.211757, -0.006123 -0.190891 0.210934, -0.008882 -0.190891 0.210934, -0.010282 -0.189491 0.210934, + -0.006123 -0.190891 0.210934, -0.010282 -0.189491 0.210934, -0.010282 -0.184131 0.210934, -0.006123 -0.190891 0.188934, + -0.006123 -0.184131 0.188934, -0.010282 -0.184131 0.188934, -0.010282 -0.184131 -0.189757, -0.006123 -0.184131 -0.189757, + -0.006123 -0.190891 -0.189757, -0.006123 -0.190891 -0.211757, -0.006123 -0.184131 -0.211757, -0.010282 -0.184131 -0.211757, + 0.009747 -0.106958 -0.165943, 0.009747 0.104562 -0.165943, 0.009747 0.104562 0.16512, 0.009747 -0.106958 -0.165943, + 0.009747 0.104562 0.16512, 0.009747 -0.106958 0.16512, -0.010282 -0.139733 0.195593, -0.010282 0.137337 0.195593, + -0.010282 0.137337 -0.196416, -0.010282 -0.139733 0.195593, -0.010282 0.137337 -0.196416, -0.010282 -0.139733 -0.196416, + -0.010282 -0.139733 0.195593, 0.003847 -0.139733 0.195593, 0.003847 0.137337 0.195593, -0.010282 -0.139733 0.195593, + 0.003847 0.137337 0.195593, -0.010282 0.137337 0.195593, -0.010282 0.137337 0.195593, 0.003847 0.137337 0.195593, + 0.003847 0.137337 -0.196416, -0.010282 0.137337 0.195593, 0.003847 0.137337 -0.196416, -0.010282 0.137337 -0.196416, + -0.010282 0.137337 -0.196416, 0.003847 0.137337 -0.196416, 0.003847 -0.139733 -0.196416, -0.010282 0.137337 -0.196416, + 0.003847 -0.139733 -0.196416, -0.010282 -0.139733 -0.196416, -0.010282 -0.139733 -0.196416, 0.003847 -0.139733 -0.196416, + 0.003847 -0.139733 0.195593, -0.010282 -0.139733 -0.196416, 0.003847 -0.139733 0.195593, -0.010282 -0.139733 0.195593, + 0.003847 0.137337 0.195593, 0.003847 -0.139733 0.195593, 0.003847 -0.139733 -0.196416, 0.003847 0.137337 0.195593, + 0.003847 -0.139733 -0.196416, 0.003847 0.137337 -0.196416, 0.003847 -0.116058 0.175151, 0.009324 -0.107677 0.166763, + 0.009324 0.105281 0.166763, 0.003847 -0.116058 0.175151, 0.009324 0.105281 0.166763, 0.003847 0.113662 0.175151, + 0.003847 -0.119309 -0.172721, 0.009324 -0.110927 -0.164332, 0.009324 -0.110927 0.163509, 0.003847 -0.119309 -0.172721, + 0.009324 -0.110927 0.163509, 0.003847 -0.119309 0.171898, 0.003847 0.113662 -0.175974, 0.009324 0.105281 -0.167586, + 0.009324 -0.107677 -0.167586, 0.003847 0.113662 -0.175974, 0.009324 -0.107677 -0.167586, 0.003847 -0.116058 -0.175974, + 0.003847 0.116913 0.171898, 0.009324 0.108531 0.163509, 0.009324 0.108531 -0.164332, 0.003847 0.116913 0.171898, + 0.009324 0.108531 -0.164332, 0.003847 0.116913 -0.172721, 0.003847 -0.116058 0.175151, 0.003847 -0.11748 0.174948, + 0.009324 -0.109099 0.16656, 0.003847 -0.116058 0.175151, 0.009324 -0.109099 0.16656, 0.009324 -0.107677 0.166763, + 0.003847 -0.11748 0.174948, 0.003847 -0.118496 0.174338, 0.009324 -0.110115 0.165949, 0.003847 -0.11748 0.174948, + 0.009324 -0.110115 0.165949, 0.009324 -0.109099 0.16656, 0.003847 0.113662 0.175151, 0.009324 0.105281 0.166763, + 0.009324 0.106703 0.16656, 0.003847 0.113662 0.175151, 0.009324 0.106703 0.16656, 0.003847 0.115084 0.174948, + 0.003847 0.115084 0.174948, 0.009324 0.106703 0.16656, 0.009324 0.107719 0.165949, 0.003847 0.115084 0.174948, + 0.009324 0.107719 0.165949, 0.003847 0.1161 0.174338, 0.003847 -0.119309 -0.172721, 0.003847 -0.119106 -0.174144, + 0.009324 -0.110724 -0.165755, 0.003847 -0.119309 -0.172721, 0.009324 -0.110724 -0.165755, 0.009324 -0.110927 -0.164332, + 0.003847 -0.119106 -0.174144, 0.003847 -0.118496 -0.175161, 0.009324 -0.110115 -0.166772, 0.003847 -0.119106 -0.174144, + 0.009324 -0.110115 -0.166772, 0.009324 -0.110724 -0.165755, 0.003847 -0.119309 0.171898, 0.009324 -0.110927 0.163509, + 0.009324 -0.110724 0.164933, 0.003847 -0.119309 0.171898, 0.009324 -0.110724 0.164933, 0.003847 -0.119106 0.173321, + 0.003847 -0.119106 0.173321, 0.009324 -0.110724 0.164933, 0.009324 -0.110115 0.165949, 0.003847 -0.119106 0.173321, + 0.009324 -0.110115 0.165949, 0.003847 -0.118496 0.174338, 0.003847 0.113662 -0.175974, 0.003847 0.115084 -0.175771, + 0.009324 0.106703 -0.167382, 0.003847 0.113662 -0.175974, 0.009324 0.106703 -0.167382, 0.009324 0.105281 -0.167586, + 0.003847 0.115084 -0.175771, 0.003847 0.1161 -0.175161, 0.009324 0.107719 -0.166772, 0.003847 0.115084 -0.175771, + 0.009324 0.107719 -0.166772, 0.009324 0.106703 -0.167382, 0.003847 -0.116058 -0.175974, 0.009324 -0.107677 -0.167586, + 0.009324 -0.109099 -0.167382, 0.003847 -0.116058 -0.175974, 0.009324 -0.109099 -0.167382, 0.003847 -0.11748 -0.175771, + 0.003847 -0.11748 -0.175771, 0.009324 -0.109099 -0.167382, 0.009324 -0.110115 -0.166772, 0.003847 -0.11748 -0.175771, + 0.009324 -0.110115 -0.166772, 0.003847 -0.118496 -0.175161, 0.003847 0.116913 0.171898, 0.003847 0.11671 0.173321, + 0.009324 0.108328 0.164933, 0.003847 0.116913 0.171898, 0.009324 0.108328 0.164933, 0.009324 0.108531 0.163509, + 0.003847 0.11671 0.173321, 0.003847 0.1161 0.174338, 0.009324 0.107719 0.165949, 0.003847 0.11671 0.173321, + 0.009324 0.107719 0.165949, 0.009324 0.108328 0.164933, 0.003847 0.116913 -0.172721, 0.009324 0.108531 -0.164332, + 0.009324 0.108328 -0.165755, 0.003847 0.116913 -0.172721, 0.009324 0.108328 -0.165755, 0.003847 0.11671 -0.174144, + 0.003847 0.11671 -0.174144, 0.009324 0.108328 -0.165755, 0.009324 0.107719 -0.166772, 0.003847 0.11671 -0.174144, + 0.009324 0.107719 -0.166772, 0.003847 0.1161 -0.175161, 0.009747 -0.108112 0.164955, 0.009747 -0.106958 0.16512, + 0.009324 -0.107677 0.166763, 0.009747 -0.108112 0.164955, 0.009324 -0.107677 0.166763, 0.009324 -0.109099 0.16656, + 0.009747 -0.108742 0.164576, 0.009747 -0.108112 0.164955, 0.009324 -0.109099 0.16656, 0.009747 -0.108742 0.164576, + 0.009324 -0.109099 0.16656, 0.009324 -0.110115 0.165949, 0.009747 -0.109121 0.163945, 0.009747 -0.108742 0.164576, + 0.009324 -0.110115 0.165949, 0.009747 -0.109121 0.163945, 0.009324 -0.110115 0.165949, 0.009324 -0.110724 0.164933, + 0.009747 -0.109286 0.16279, 0.009747 -0.109121 0.163945, 0.009324 -0.110724 0.164933, 0.009747 -0.109286 0.16279, + 0.009324 -0.110724 0.164933, 0.009324 -0.110927 0.163509, 0.009747 -0.108743 -0.165399, 0.009747 -0.109121 -0.164767, + 0.009324 -0.110724 -0.165755, 0.009747 -0.108743 -0.165399, 0.009324 -0.110724 -0.165755, 0.009324 -0.110115 -0.166772, + 0.009747 -0.108112 -0.165778, 0.009747 -0.108743 -0.165399, 0.009324 -0.110115 -0.166772, 0.009747 -0.108112 -0.165778, + 0.009324 -0.110115 -0.166772, 0.009324 -0.109099 -0.167382, 0.009747 -0.106958 -0.165943, 0.009747 -0.108112 -0.165778, + 0.009324 -0.109099 -0.167382, 0.009747 -0.106958 -0.165943, 0.009324 -0.109099 -0.167382, 0.009324 -0.107677 -0.167586, + 0.009747 0.104562 -0.165943, 0.009747 -0.106958 -0.165943, 0.009324 -0.107677 -0.167586, 0.009747 0.104562 -0.165943, + 0.009324 -0.107677 -0.167586, 0.009324 0.105281 -0.167586, 0.009747 0.105716 -0.165778, 0.009747 0.104562 -0.165943, + 0.009324 0.105281 -0.167586, 0.009747 0.105716 -0.165778, 0.009324 0.105281 -0.167586, 0.009324 0.106703 -0.167382, + 0.009747 0.106347 -0.165399, 0.009747 0.105716 -0.165778, 0.009324 0.106703 -0.167382, 0.009747 0.106347 -0.165399, + 0.009324 0.106703 -0.167382, 0.009324 0.107719 -0.166772, 0.009747 0.106725 -0.164767, 0.009747 0.106347 -0.165399, + 0.009324 0.107719 -0.166772, 0.009747 0.106725 -0.164767, 0.009324 0.107719 -0.166772, 0.009324 0.108328 -0.165755, + 0.009747 0.10689 -0.163613, 0.009747 0.106725 -0.164767, 0.009324 0.108328 -0.165755, 0.009747 0.10689 -0.163613, + 0.009324 0.108328 -0.165755, 0.009324 0.108531 -0.164332, 0.009747 0.10689 0.16279, 0.009747 0.10689 -0.163613, + 0.009324 0.108531 -0.164332, 0.009747 0.10689 0.16279, 0.009324 0.108531 -0.164332, 0.009324 0.108531 0.163509, + 0.009747 0.106725 0.163945, 0.009747 0.10689 0.16279, 0.009324 0.108531 0.163509, 0.009747 0.106725 0.163945, + 0.009324 0.108531 0.163509, 0.009324 0.108328 0.164933, 0.009747 0.106347 0.164576, 0.009747 0.106725 0.163945, + 0.009324 0.108328 0.164933, 0.009747 0.106347 0.164576, 0.009324 0.108328 0.164933, 0.009324 0.107719 0.165949, + 0.009747 0.105716 0.164955, 0.009747 0.106347 0.164576, 0.009324 0.107719 0.165949, 0.009747 0.105716 0.164955, + 0.009324 0.107719 0.165949, 0.009324 0.106703 0.16656, 0.009747 0.105716 0.164955, 0.009324 0.106703 0.16656, + 0.009324 0.105281 0.166763, 0.009747 0.105716 0.164955, 0.009324 0.105281 0.166763, 0.009747 0.104562 0.16512, + 0.009747 -0.106958 0.16512, 0.009747 0.104562 0.16512, 0.009324 0.105281 0.166763, 0.009747 -0.106958 0.16512, + 0.009324 0.105281 0.166763, 0.009324 -0.107677 0.166763, 0.009747 0.106725 0.163945, 0.009747 0.105716 0.164955, + 0.009747 0.104562 0.16512, 0.009747 0.106725 0.163945, 0.009747 0.104562 0.16512, 0.009747 0.10689 0.16279, + 0.009747 0.105716 -0.165778, 0.009747 0.106725 -0.164767, 0.009747 0.10689 -0.163613, 0.009747 0.105716 -0.165778, + 0.009747 0.10689 -0.163613, 0.009747 0.104562 -0.165943, 0.009747 0.10689 -0.163613, 0.009747 0.10689 0.16279, + 0.009747 0.104562 0.16512, 0.009747 0.10689 -0.163613, 0.009747 0.104562 0.16512, 0.009747 0.104562 -0.165943, + 0.009747 -0.108112 0.164955, 0.009747 -0.109121 0.163945, 0.009747 -0.109286 0.16279, 0.009747 -0.108112 0.164955, + 0.009747 -0.109286 0.16279, 0.009747 -0.106958 0.16512, 0.009747 -0.109121 -0.164767, 0.009747 -0.108743 -0.165399, + 0.009747 -0.108112 -0.165778, 0.009747 -0.108112 0.164955, 0.009747 -0.108742 0.164576, 0.009747 -0.109121 0.163945, + 0.009747 0.106725 0.163945, 0.009747 0.106347 0.164576, 0.009747 0.105716 0.164955, 0.009747 0.105716 -0.165778, + 0.009747 0.106347 -0.165399, 0.009747 0.106725 -0.164767, 0.008363 0.136073 0.25355, -0.008882 0.136073 0.25355, + -0.008882 -0.138469 0.25355, 0.008363 0.136073 0.25355, -0.008882 -0.138469 0.25355, 0.008363 -0.138469 0.25355, + -0.008882 0.136073 -0.254373, 0.008363 0.136073 -0.254373, 0.008363 -0.138469 -0.254373, -0.008882 0.136073 -0.254373, + 0.008363 -0.138469 -0.254373, -0.008882 -0.138469 -0.254373, 0.009763 -0.138469 -0.252973, 0.009763 0.136073 -0.252973, + 0.009763 0.136073 -0.197681, 0.009763 -0.138469 -0.252973, 0.009763 0.136073 -0.197681, 0.009763 -0.138469 -0.197681, + -0.010282 -0.138469 -0.252973, -0.010282 -0.138469 -0.197681, -0.010282 0.136073 -0.197681, -0.010282 -0.138469 -0.252973, + -0.010282 0.136073 -0.197681, -0.010282 0.136073 -0.252973, 0.009763 0.136073 0.25215, 0.009763 -0.138469 0.25215, + 0.009763 -0.138469 0.196858, 0.009763 0.136073 0.25215, 0.009763 -0.138469 0.196858, 0.009763 0.136073 0.196858, + -0.010282 0.136073 0.25215, -0.010282 0.136073 0.196858, -0.010282 -0.138469 0.196858, -0.010282 0.136073 0.25215, + -0.010282 -0.138469 0.196858, -0.010282 -0.138469 0.25215, 0.008363 -0.139733 0.25215, -0.008882 -0.139733 0.25215, + -0.008882 -0.139733 0.196858, 0.008363 -0.139733 0.25215, -0.008882 -0.139733 0.196858, 0.008363 -0.139733 0.196858, + -0.008882 0.137337 0.25215, 0.008363 0.137337 0.25215, 0.008363 0.137337 0.196858, -0.008882 0.137337 0.25215, + 0.008363 0.137337 0.196858, -0.008882 0.137337 0.196858, -0.008882 0.136073 0.195593, 0.008363 0.136073 0.195593, + 0.008363 -0.138469 0.195593, -0.008882 0.136073 0.195593, 0.008363 -0.138469 0.195593, -0.008882 -0.138469 0.195593, + 0.008363 0.137337 -0.252973, -0.008882 0.137337 -0.252973, -0.008882 0.137337 -0.197681, 0.008363 0.137337 -0.252973, + -0.008882 0.137337 -0.197681, 0.008363 0.137337 -0.197681, -0.008882 -0.139733 -0.252973, 0.008363 -0.139733 -0.252973, + 0.008363 -0.139733 -0.197681, -0.008882 -0.139733 -0.252973, 0.008363 -0.139733 -0.197681, -0.008882 -0.139733 -0.197681, + -0.008882 -0.138469 -0.196416, 0.008363 -0.138469 -0.196416, 0.008363 0.136073 -0.196416, -0.008882 -0.138469 -0.196416, + 0.008363 0.136073 -0.196416, -0.008882 0.136073 -0.196416, 0.009763 0.136073 -0.197681, 0.008363 0.137337 -0.197681, + 0.008363 0.136073 -0.196416, 0.008363 0.136073 0.195593, 0.008363 0.137337 0.196858, 0.009763 0.136073 0.196858, + 0.009763 -0.138469 0.196858, 0.008363 -0.139733 0.196858, 0.008363 -0.138469 0.195593, 0.008363 -0.138469 -0.196416, + 0.008363 -0.139733 -0.197681, 0.009763 -0.138469 -0.197681, -0.008882 -0.138469 -0.196416, -0.010282 -0.138469 -0.197681, + -0.008882 -0.139733 -0.197681, -0.008882 -0.139733 0.196858, -0.010282 -0.138469 0.196858, -0.008882 -0.138469 0.195593, + -0.008882 0.136073 0.195593, -0.010282 0.136073 0.196858, -0.008882 0.137337 0.196858, -0.008882 0.137337 -0.197681, + -0.010282 0.136073 -0.197681, -0.008882 0.136073 -0.196416, 0.008363 0.137337 0.25215, 0.008363 0.136073 0.25355, + 0.009763 0.136073 0.25215, 0.009763 -0.138469 0.25215, 0.008363 -0.138469 0.25355, 0.008363 -0.139733 0.25215, + -0.008882 -0.139733 0.25215, -0.008882 -0.138469 0.25355, -0.010282 -0.138469 0.25215, -0.010282 0.136073 0.25215, + -0.008882 0.136073 0.25355, -0.008882 0.137337 0.25215, 0.008363 -0.139733 -0.252973, 0.008363 -0.138469 -0.254373, + 0.009763 -0.138469 -0.252973, 0.009763 0.136073 -0.252973, 0.008363 0.136073 -0.254373, 0.008363 0.137337 -0.252973, + -0.008882 0.137337 -0.252973, -0.008882 0.136073 -0.254373, -0.010282 0.136073 -0.252973, -0.010282 -0.138469 -0.252973, + -0.008882 -0.138469 -0.254373, -0.008882 -0.139733 -0.252973, 0.009763 0.136073 0.25215, 0.008363 0.136073 0.25355, + 0.008363 -0.138469 0.25355, 0.009763 0.136073 0.25215, 0.008363 -0.138469 0.25355, 0.009763 -0.138469 0.25215, + -0.010282 -0.138469 0.25215, -0.008882 -0.138469 0.25355, -0.008882 0.136073 0.25355, -0.010282 -0.138469 0.25215, + -0.008882 0.136073 0.25355, -0.010282 0.136073 0.25215, 0.009763 -0.138469 -0.252973, 0.008363 -0.138469 -0.254373, + 0.008363 0.136073 -0.254373, 0.009763 -0.138469 -0.252973, 0.008363 0.136073 -0.254373, 0.009763 0.136073 -0.252973, + -0.010282 0.136073 -0.252973, -0.008882 0.136073 -0.254373, -0.008882 -0.138469 -0.254373, -0.010282 0.136073 -0.252973, + -0.008882 -0.138469 -0.254373, -0.010282 -0.138469 -0.252973, 0.009763 -0.138469 0.196858, 0.008363 -0.138469 0.195593, + 0.008363 0.136073 0.195593, 0.009763 -0.138469 0.196858, 0.008363 0.136073 0.195593, 0.009763 0.136073 0.196858, + 0.009763 0.136073 -0.197681, 0.008363 0.136073 -0.196416, 0.008363 -0.138469 -0.196416, 0.009763 0.136073 -0.197681, + 0.008363 -0.138469 -0.196416, 0.009763 -0.138469 -0.197681, -0.010282 0.136073 0.196858, -0.008882 0.136073 0.195593, + -0.008882 -0.138469 0.195593, -0.010282 0.136073 0.196858, -0.008882 -0.138469 0.195593, -0.010282 -0.138469 0.196858, + -0.010282 -0.138469 -0.197681, -0.008882 -0.138469 -0.196416, -0.008882 0.136073 -0.196416, -0.010282 -0.138469 -0.197681, + -0.008882 0.136073 -0.196416, -0.010282 0.136073 -0.197681, 0.008363 0.136073 0.25355, 0.008363 0.137337 0.25215, + -0.008882 0.137337 0.25215, 0.008363 0.136073 0.25355, -0.008882 0.137337 0.25215, -0.008882 0.136073 0.25355, + -0.008882 -0.138469 0.25355, -0.008882 -0.139733 0.25215, 0.008363 -0.139733 0.25215, -0.008882 -0.138469 0.25355, + 0.008363 -0.139733 0.25215, 0.008363 -0.138469 0.25355, -0.008882 0.136073 -0.254373, -0.008882 0.137337 -0.252973, + 0.008363 0.137337 -0.252973, -0.008882 0.136073 -0.254373, 0.008363 0.137337 -0.252973, 0.008363 0.136073 -0.254373, + 0.008363 -0.138469 -0.254373, 0.008363 -0.139733 -0.252973, -0.008882 -0.139733 -0.252973, 0.008363 -0.138469 -0.254373, + -0.008882 -0.139733 -0.252973, -0.008882 -0.138469 -0.254373, 0.009763 -0.138469 -0.197681, 0.008363 -0.139733 -0.197681, + 0.008363 -0.139733 -0.252973, 0.009763 -0.138469 -0.197681, 0.008363 -0.139733 -0.252973, 0.009763 -0.138469 -0.252973, + -0.010282 -0.138469 -0.252973, -0.008882 -0.139733 -0.252973, -0.008882 -0.139733 -0.197681, -0.010282 -0.138469 -0.252973, + -0.008882 -0.139733 -0.197681, -0.010282 -0.138469 -0.197681, -0.010282 0.136073 -0.197681, -0.008882 0.137337 -0.197681, + -0.008882 0.137337 -0.252973, -0.010282 0.136073 -0.197681, -0.008882 0.137337 -0.252973, -0.010282 0.136073 -0.252973, + 0.009763 0.136073 -0.252973, 0.008363 0.137337 -0.252973, 0.008363 0.137337 -0.197681, 0.009763 0.136073 -0.252973, + 0.008363 0.137337 -0.197681, 0.009763 0.136073 -0.197681, 0.009763 0.136073 0.196858, 0.008363 0.137337 0.196858, + 0.008363 0.137337 0.25215, 0.009763 0.136073 0.196858, 0.008363 0.137337 0.25215, 0.009763 0.136073 0.25215, + -0.010282 0.136073 0.25215, -0.008882 0.137337 0.25215, -0.008882 0.137337 0.196858, -0.010282 0.136073 0.25215, + -0.008882 0.137337 0.196858, -0.010282 0.136073 0.196858, -0.010282 -0.138469 0.196858, -0.008882 -0.139733 0.196858, + -0.008882 -0.139733 0.25215, -0.010282 -0.138469 0.196858, -0.008882 -0.139733 0.25215, -0.010282 -0.138469 0.25215, + 0.009763 -0.138469 0.25215, 0.008363 -0.139733 0.25215, 0.008363 -0.139733 0.196858, 0.009763 -0.138469 0.25215, + 0.008363 -0.139733 0.196858, 0.009763 -0.138469 0.196858, -0.008882 -0.139733 0.196858, -0.008882 -0.138469 0.195593, + 0.008363 -0.138469 0.195593, -0.008882 -0.139733 0.196858, 0.008363 -0.138469 0.195593, 0.008363 -0.139733 0.196858, + 0.008363 0.137337 0.196858, 0.008363 0.136073 0.195593, -0.008882 0.136073 0.195593, 0.008363 0.137337 0.196858, + -0.008882 0.136073 0.195593, -0.008882 0.137337 0.196858, -0.008882 0.137337 -0.197681, -0.008882 0.136073 -0.196416, + 0.008363 0.136073 -0.196416, -0.008882 0.137337 -0.197681, 0.008363 0.136073 -0.196416, 0.008363 0.137337 -0.197681, + 0.008363 -0.139733 -0.197681, 0.008363 -0.138469 -0.196416, -0.008882 -0.138469 -0.196416, 0.008363 -0.139733 -0.197681, + -0.008882 -0.138469 -0.196416, -0.008882 -0.139733 -0.197681, 0.008363 0.190111 0.25215, 0.008363 0.190111 -0.252973, + -0.008882 0.190111 -0.252973, 0.008363 0.190111 0.25215, -0.008882 0.190111 -0.252973, -0.008882 0.190111 0.25215, + 0.008363 0.188711 0.25355, -0.008882 0.188711 0.25355, -0.008882 0.138601 0.25355, 0.008363 0.188711 0.25355, + -0.008882 0.138601 0.25355, 0.008363 0.138601 0.25355, -0.008882 0.188711 -0.254373, 0.008363 0.188711 -0.254373, + 0.008363 0.138601 -0.254373, -0.008882 0.188711 -0.254373, 0.008363 0.138601 -0.254373, -0.008882 0.138601 -0.254373, + 0.009763 0.138601 -0.252973, 0.009763 0.188711 -0.252973, 0.009763 0.188711 0.25215, 0.009763 0.138601 -0.252973, + 0.009763 0.188711 0.25215, 0.009763 0.138601 0.25215, -0.010282 0.138601 0.25215, -0.010282 0.188711 0.25215, + -0.010282 0.188711 -0.252973, -0.010282 0.138601 0.25215, -0.010282 0.188711 -0.252973, -0.010282 0.138601 -0.252973, + 0.008363 0.137337 0.25215, -0.008882 0.137337 0.25215, -0.008882 0.137337 -0.252973, 0.008363 0.137337 0.25215, + -0.008882 0.137337 -0.252973, 0.008363 0.137337 -0.252973, 0.009763 0.188711 -0.252973, 0.008363 0.188711 -0.254373, + 0.008363 0.190111 -0.252973, 0.008363 0.190111 0.25215, 0.008363 0.188711 0.25355, 0.009763 0.188711 0.25215, + -0.008882 0.190111 0.25215, -0.010282 0.188711 0.25215, -0.008882 0.188711 0.25355, -0.008882 0.188711 -0.254373, + -0.010282 0.188711 -0.252973, -0.008882 0.190111 -0.252973, 0.008363 0.138601 0.25355, 0.008363 0.137337 0.25215, + 0.009763 0.138601 0.25215, -0.010282 0.138601 0.25215, -0.008882 0.137337 0.25215, -0.008882 0.138601 0.25355, + 0.009763 0.138601 -0.252973, 0.008363 0.137337 -0.252973, 0.008363 0.138601 -0.254373, -0.008882 0.138601 -0.254373, + -0.008882 0.137337 -0.252973, -0.010282 0.138601 -0.252973, -0.008882 0.188711 -0.254373, -0.008882 0.190111 -0.252973, + 0.008363 0.190111 -0.252973, -0.008882 0.188711 -0.254373, 0.008363 0.190111 -0.252973, 0.008363 0.188711 -0.254373, + 0.009763 0.188711 -0.252973, 0.008363 0.190111 -0.252973, 0.008363 0.190111 0.25215, 0.009763 0.188711 -0.252973, + 0.008363 0.190111 0.25215, 0.009763 0.188711 0.25215, -0.010282 0.188711 0.25215, -0.008882 0.190111 0.25215, + -0.008882 0.190111 -0.252973, -0.010282 0.188711 0.25215, -0.008882 0.190111 -0.252973, -0.010282 0.188711 -0.252973, + 0.008363 0.188711 0.25355, 0.008363 0.190111 0.25215, -0.008882 0.190111 0.25215, 0.008363 0.188711 0.25355, + -0.008882 0.190111 0.25215, -0.008882 0.188711 0.25355, 0.009763 0.188711 0.25215, 0.008363 0.188711 0.25355, + 0.008363 0.138601 0.25355, 0.009763 0.188711 0.25215, 0.008363 0.138601 0.25355, 0.009763 0.138601 0.25215, + -0.010282 0.188711 -0.252973, -0.008882 0.188711 -0.254373, -0.008882 0.138601 -0.254373, -0.010282 0.188711 -0.252973, + -0.008882 0.138601 -0.254373, -0.010282 0.138601 -0.252973, -0.010282 0.138601 0.25215, -0.008882 0.138601 0.25355, + -0.008882 0.188711 0.25355, -0.010282 0.138601 0.25215, -0.008882 0.188711 0.25355, -0.010282 0.188711 0.25215, + -0.008882 0.138601 0.25355, -0.008882 0.137337 0.25215, 0.008363 0.137337 0.25215, -0.008882 0.138601 0.25355, + 0.008363 0.137337 0.25215, 0.008363 0.138601 0.25355, 0.009763 0.138601 -0.252973, 0.008363 0.138601 -0.254373, + 0.008363 0.188711 -0.254373, 0.009763 0.138601 -0.252973, 0.008363 0.188711 -0.254373, 0.009763 0.188711 -0.252973, + 0.008363 0.138601 -0.254373, 0.008363 0.137337 -0.252973, -0.008882 0.137337 -0.252973, 0.008363 0.138601 -0.254373, + -0.008882 0.137337 -0.252973, -0.008882 0.138601 -0.254373, -0.010282 0.138601 -0.252973, -0.008882 0.137337 -0.252973, + -0.008882 0.137337 0.25215, -0.010282 0.138601 -0.252973, -0.008882 0.137337 0.25215, -0.010282 0.138601 0.25215, + 0.009763 0.138601 0.25215, 0.008363 0.137337 0.25215, 0.008363 0.137337 -0.252973, 0.009763 0.138601 0.25215, + 0.008363 0.137337 -0.252973, 0.009763 0.138601 -0.252973, 0.009763 -0.189491 0.25215, 0.008363 -0.189491 0.25355, + 0.008363 -0.190891 0.25215, -0.008882 -0.189491 0.25355, -0.010282 -0.189491 0.25215, -0.008882 -0.190891 0.25215, + 0.009763 -0.140997 0.25215, 0.008363 -0.139733 0.25215, 0.008363 -0.140997 0.25355, -0.008882 -0.140997 0.25355, + -0.008882 -0.139733 0.25215, -0.010282 -0.140997 0.25215, 0.009763 -0.189491 0.25215, 0.008363 -0.190891 0.25215, + 0.008363 -0.190891 0.188934, 0.009763 -0.189491 0.25215, 0.008363 -0.190891 0.188934, 0.009763 -0.189491 0.188934, + -0.008882 -0.190891 0.25215, -0.010282 -0.189491 0.25215, -0.010282 -0.189491 0.210934, -0.008882 -0.190891 0.25215, + -0.010282 -0.189491 0.210934, -0.008882 -0.190891 0.210934, 0.008363 -0.139733 0.25215, 0.009763 -0.140997 0.25215, + 0.009763 -0.140997 0.188934, 0.008363 -0.139733 0.25215, 0.009763 -0.140997 0.188934, 0.008363 -0.139733 0.188934, + -0.010282 -0.140997 0.25215, -0.008882 -0.139733 0.25215, -0.008882 -0.139733 0.188934, -0.010282 -0.140997 0.25215, + -0.008882 -0.139733 0.188934, -0.010282 -0.140997 0.188934, -0.008882 -0.190891 0.25215, 0.008363 -0.190891 0.25215, + 0.008363 -0.189491 0.25355, -0.008882 -0.190891 0.25215, 0.008363 -0.189491 0.25355, -0.008882 -0.189491 0.25355, + 0.008363 -0.140997 0.25355, 0.008363 -0.139733 0.25215, -0.008882 -0.139733 0.25215, 0.008363 -0.140997 0.25355, + -0.008882 -0.139733 0.25215, -0.008882 -0.140997 0.25355, -0.008882 -0.190891 0.25215, -0.008882 -0.190891 0.210934, + -0.006123 -0.190891 0.210934, -0.008882 -0.190891 0.25215, -0.006123 -0.190891 0.210934, 0.008363 -0.190891 0.25215, + 0.008363 -0.139733 0.188934, -0.008882 -0.139733 0.188934, -0.008882 -0.139733 0.25215, 0.008363 -0.139733 0.188934, + -0.008882 -0.139733 0.25215, 0.008363 -0.139733 0.25215, -0.008882 -0.140997 0.25355, -0.010282 -0.140997 0.25215, + -0.010282 -0.189491 0.25215, -0.008882 -0.140997 0.25355, -0.010282 -0.189491 0.25215, -0.008882 -0.189491 0.25355, + 0.008363 -0.189491 0.25355, 0.009763 -0.189491 0.25215, 0.009763 -0.140997 0.25215, 0.008363 -0.189491 0.25355, + 0.009763 -0.140997 0.25215, 0.008363 -0.140997 0.25355, -0.010282 -0.140997 0.25215, -0.010282 -0.184131 0.210934, + -0.010282 -0.189491 0.210934, -0.010282 -0.140997 0.25215, -0.010282 -0.189491 0.210934, -0.010282 -0.189491 0.25215, + 0.009763 -0.189491 0.188934, 0.009763 -0.140997 0.188934, 0.009763 -0.140997 0.25215, 0.009763 -0.189491 0.188934, + 0.009763 -0.140997 0.25215, 0.009763 -0.189491 0.25215, -0.008882 -0.140997 0.25355, -0.008882 -0.189491 0.25355, + 0.008363 -0.189491 0.25355, -0.008882 -0.140997 0.25355, 0.008363 -0.189491 0.25355, 0.008363 -0.140997 0.25355, + -0.010282 -0.184131 0.188934, -0.006123 -0.184131 0.188934, -0.006123 -0.184131 0.210934, -0.010282 -0.184131 0.188934, + -0.006123 -0.184131 0.210934, -0.010282 -0.184131 0.210934, -0.006123 -0.184131 0.210934, -0.006123 -0.184131 0.188934, + -0.006123 -0.190891 0.188934, -0.006123 -0.184131 0.210934, -0.006123 -0.190891 0.188934, -0.006123 -0.190891 0.210934, + -0.008882 -0.190891 0.188934, -0.010282 -0.189491 0.188934, -0.010282 -0.189491 -0.189757, -0.008882 -0.190891 0.188934, + -0.010282 -0.189491 -0.189757, -0.008882 -0.190891 -0.189757, 0.009763 -0.140997 0.188934, 0.009763 -0.140997 -0.189757, + 0.008363 -0.139733 -0.189757, 0.009763 -0.140997 0.188934, 0.008363 -0.139733 -0.189757, 0.008363 -0.139733 0.188934, + -0.006123 -0.190891 0.188934, -0.008882 -0.190891 0.188934, -0.008882 -0.190891 -0.189757, -0.006123 -0.190891 0.188934, + -0.008882 -0.190891 -0.189757, -0.006123 -0.190891 -0.189757, 0.009763 -0.140997 0.188934, 0.009763 -0.189491 0.188934, + 0.009763 -0.189491 -0.189757, 0.009763 -0.140997 0.188934, 0.009763 -0.189491 -0.189757, 0.009763 -0.140997 -0.189757, + 0.009763 -0.189491 -0.252973, 0.008363 -0.190891 -0.252973, 0.008363 -0.189491 -0.254373, -0.008882 -0.189491 -0.254373, + -0.008882 -0.190891 -0.252973, -0.010282 -0.189491 -0.252973, 0.009763 -0.140997 -0.252973, 0.008363 -0.140997 -0.254373, + 0.008363 -0.139733 -0.252973, -0.008882 -0.140997 -0.254373, -0.010282 -0.140997 -0.252973, -0.008882 -0.139733 -0.252973, + 0.008363 -0.190891 -0.189757, 0.008363 -0.190891 -0.252973, 0.009763 -0.189491 -0.252973, 0.008363 -0.190891 -0.189757, + 0.009763 -0.189491 -0.252973, 0.009763 -0.189491 -0.189757, -0.010282 -0.189491 -0.211757, -0.010282 -0.189491 -0.252973, + -0.008882 -0.190891 -0.252973, -0.010282 -0.189491 -0.211757, -0.008882 -0.190891 -0.252973, -0.008882 -0.190891 -0.211757, + 0.009763 -0.140997 -0.189757, 0.009763 -0.140997 -0.252973, 0.008363 -0.139733 -0.252973, 0.009763 -0.140997 -0.189757, + 0.008363 -0.139733 -0.252973, 0.008363 -0.139733 -0.189757, -0.008882 -0.139733 -0.189757, -0.008882 -0.139733 -0.252973, + -0.010282 -0.140997 -0.252973, -0.008882 -0.139733 -0.189757, -0.010282 -0.140997 -0.252973, -0.010282 -0.140997 -0.189757, + 0.008363 -0.189491 -0.254373, 0.008363 -0.190891 -0.252973, -0.008882 -0.190891 -0.252973, 0.008363 -0.189491 -0.254373, + -0.008882 -0.190891 -0.252973, -0.008882 -0.189491 -0.254373, -0.008882 -0.139733 -0.252973, 0.008363 -0.139733 -0.252973, + 0.008363 -0.140997 -0.254373, -0.008882 -0.139733 -0.252973, 0.008363 -0.140997 -0.254373, -0.008882 -0.140997 -0.254373, + -0.006123 -0.190891 -0.211757, -0.008882 -0.190891 -0.211757, -0.008882 -0.190891 -0.252973, -0.006123 -0.190891 -0.211757, + -0.008882 -0.190891 -0.252973, 0.008363 -0.190891 -0.252973, -0.006123 -0.190891 -0.211757, 0.008363 -0.190891 -0.252973, + 0.008363 -0.190891 -0.189757, -0.006123 -0.190891 -0.211757, 0.008363 -0.190891 -0.189757, -0.006123 -0.190891 -0.189757, + -0.008882 -0.139733 -0.252973, -0.008882 -0.139733 -0.189757, 0.008363 -0.139733 -0.189757, -0.008882 -0.139733 -0.252973, + 0.008363 -0.139733 -0.189757, 0.008363 -0.139733 -0.252973, -0.010282 -0.189491 -0.252973, -0.010282 -0.140997 -0.252973, + -0.008882 -0.140997 -0.254373, -0.010282 -0.189491 -0.252973, -0.008882 -0.140997 -0.254373, -0.008882 -0.189491 -0.254373, + 0.009763 -0.140997 -0.252973, 0.009763 -0.189491 -0.252973, 0.008363 -0.189491 -0.254373, 0.009763 -0.140997 -0.252973, + 0.008363 -0.189491 -0.254373, 0.008363 -0.140997 -0.254373, -0.010282 -0.189491 -0.211757, -0.010282 -0.184131 -0.211757, + -0.010282 -0.140997 -0.252973, -0.010282 -0.189491 -0.211757, -0.010282 -0.140997 -0.252973, -0.010282 -0.189491 -0.252973, + 0.009763 -0.140997 -0.252973, 0.009763 -0.140997 -0.189757, 0.009763 -0.189491 -0.189757, 0.009763 -0.140997 -0.252973, + 0.009763 -0.189491 -0.189757, 0.009763 -0.189491 -0.252973, 0.008363 -0.189491 -0.254373, -0.008882 -0.189491 -0.254373, + -0.008882 -0.140997 -0.254373, 0.008363 -0.189491 -0.254373, -0.008882 -0.140997 -0.254373, 0.008363 -0.140997 -0.254373, + -0.006123 -0.184131 -0.211757, -0.006123 -0.184131 -0.189757, -0.010282 -0.184131 -0.189757, -0.006123 -0.184131 -0.211757, + -0.010282 -0.184131 -0.189757, -0.010282 -0.184131 -0.211757, -0.006123 -0.190891 -0.189757, -0.006123 -0.184131 -0.189757, + -0.006123 -0.184131 -0.211757, -0.006123 -0.190891 -0.189757, -0.006123 -0.184131 -0.211757, -0.006123 -0.190891 -0.211757, + 0.009763 -0.189491 0.188934, 0.008363 -0.190891 0.188934, 0.008363 -0.190891 -0.189757, 0.009763 -0.189491 0.188934, + 0.008363 -0.190891 -0.189757, 0.009763 -0.189491 -0.189757, -0.008882 -0.139733 0.188934, -0.008882 -0.139733 -0.189757, + -0.010282 -0.140997 -0.189757, -0.008882 -0.139733 0.188934, -0.010282 -0.140997 -0.189757, -0.010282 -0.140997 0.188934, + -0.006123 -0.190891 0.188934, -0.006123 -0.190891 -0.189757, 0.008363 -0.190891 -0.189757, -0.006123 -0.190891 0.188934, + 0.008363 -0.190891 -0.189757, 0.008363 -0.190891 0.188934, 0.008363 -0.139733 -0.189757, -0.008882 -0.139733 -0.189757, + -0.008882 -0.139733 0.188934, 0.008363 -0.139733 -0.189757, -0.008882 -0.139733 0.188934, 0.008363 -0.139733 0.188934, + -0.010282 -0.184131 0.188934, -0.010282 -0.140997 0.188934, -0.010282 -0.140997 -0.189757, -0.010282 -0.184131 0.188934, + -0.010282 -0.140997 -0.189757, -0.010282 -0.184131 -0.189757, -0.010282 -0.184131 0.188934, -0.010282 -0.184131 -0.189757, + -0.010282 -0.189491 -0.189757, -0.010282 -0.184131 0.188934, -0.010282 -0.189491 -0.189757, -0.010282 -0.189491 0.188934, + -0.006123 -0.190891 0.210934, -0.006123 -0.190891 0.188934, 0.008363 -0.190891 0.188934, -0.006123 -0.190891 0.210934, + 0.008363 -0.190891 0.188934, 0.008363 -0.190891 0.25215, -0.010282 -0.140997 0.188934, -0.010282 -0.184131 0.188934, + -0.010282 -0.184131 0.210934, -0.010282 -0.140997 0.188934, -0.010282 -0.184131 0.210934, -0.010282 -0.140997 0.25215, + -0.010282 -0.184131 -0.211757, -0.010282 -0.184131 -0.189757, -0.010282 -0.140997 -0.189757, -0.010282 -0.184131 -0.211757, + -0.010282 -0.140997 -0.189757, -0.010282 -0.140997 -0.252973 + ] + } + color Color + { + color + [ + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941 + ] + } + coordIndex + [ + 0,1,2,-1, 3,4,5,-1, 6,7,8,-1, 9,10,11,-1, 12,13,14,-1, 15,16,17,-1, + 18,19,20,-1, 21,22,23,-1, 24,25,26,-1, 27,28,29,-1, 30,31,32,-1, 33,34,35,-1, + 36,37,38,-1, 39,40,41,-1, 42,43,44,-1, 45,46,47,-1, 48,49,50,-1, 51,52,53,-1, + 54,55,56,-1, 57,58,59,-1, 60,61,62,-1, 63,64,65,-1, 66,67,68,-1, 69,70,71,-1, + 72,73,74,-1, 75,76,77,-1, 78,79,80,-1, 81,82,83,-1, 84,85,86,-1, 87,88,89,-1, + 90,91,92,-1, 93,94,95,-1, 96,97,98,-1, 99,100,101,-1, 102,103,104,-1, 105,106,107,-1, + 108,109,110,-1, 111,112,113,-1, 114,115,116,-1, 117,118,119,-1, 120,121,122,-1, 123,124,125,-1, + 126,127,128,-1, 129,130,131,-1, 132,133,134,-1, 135,136,137,-1, 138,139,140,-1, 141,142,143,-1, + 144,145,146,-1, 147,148,149,-1, 150,151,152,-1, 153,154,155,-1, 156,157,158,-1, 159,160,161,-1, + 162,163,164,-1, 165,166,167,-1, 168,169,170,-1, 171,172,173,-1, 174,175,176,-1, 177,178,179,-1, + 180,181,182,-1, 183,184,185,-1, 186,187,188,-1, 189,190,191,-1, 192,193,194,-1, 195,196,197,-1, + 198,199,200,-1, 201,202,203,-1, 204,205,206,-1, 207,208,209,-1, 210,211,212,-1, 213,214,215,-1, + 216,217,218,-1, 219,220,221,-1, 222,223,224,-1, 225,226,227,-1, 228,229,230,-1, 231,232,233,-1, + 234,235,236,-1, 237,238,239,-1, 240,241,242,-1, 243,244,245,-1, 246,247,248,-1, 249,250,251,-1, + 252,253,254,-1, 255,256,257,-1, 258,259,260,-1, 261,262,263,-1, 264,265,266,-1, 267,268,269,-1, + 270,271,272,-1, 273,274,275,-1, 276,277,278,-1, 279,280,281,-1, 282,283,284,-1, 285,286,287,-1, + 288,289,290,-1, 291,292,293,-1, 294,295,296,-1, 297,298,299,-1, 300,301,302,-1, 303,304,305,-1, + 306,307,308,-1, 309,310,311,-1, 312,313,314,-1, 315,316,317,-1, 318,319,320,-1, 321,322,323,-1, + 324,325,326,-1, 327,328,329,-1, 330,331,332,-1, 333,334,335,-1, 336,337,338,-1, 339,340,341,-1, + 342,343,344,-1, 345,346,347,-1, 348,349,350,-1, 351,352,353,-1, 354,355,356,-1, 357,358,359,-1, + 360,361,362,-1, 363,364,365,-1, 366,367,368,-1, 369,370,371,-1, 372,373,374,-1, 375,376,377,-1, + 378,379,380,-1, 381,382,383,-1, 384,385,386,-1, 387,388,389,-1, 390,391,392,-1, 393,394,395,-1, + 396,397,398,-1, 399,400,401,-1, 402,403,404,-1, 405,406,407,-1, 408,409,410,-1, 411,412,413,-1, + 414,415,416,-1, 417,418,419,-1, 420,421,422,-1, 423,424,425,-1, 426,427,428,-1, 429,430,431,-1, + 432,433,434,-1, 435,436,437,-1, 438,439,440,-1, 441,442,443,-1, 444,445,446,-1, 447,448,449,-1, + 450,451,452,-1, 453,454,455,-1, 456,457,458,-1, 459,460,461,-1, 462,463,464,-1, 465,466,467,-1, + 468,469,470,-1, 471,472,473,-1, 474,475,476,-1, 477,478,479,-1, 480,481,482,-1, 483,484,485,-1, + 486,487,488,-1, 489,490,491,-1, 492,493,494,-1, 495,496,497,-1, 498,499,500,-1, 501,502,503,-1, + 504,505,506,-1, 507,508,509,-1, 510,511,512,-1, 513,514,515,-1, 516,517,518,-1, 519,520,521,-1, + 522,523,524,-1, 525,526,527,-1, 528,529,530,-1, 531,532,533,-1, 534,535,536,-1, 537,538,539,-1, + 540,541,542,-1, 543,544,545,-1, 546,547,548,-1, 549,550,551,-1, 552,553,554,-1, 555,556,557,-1, + 558,559,560,-1, 561,562,563,-1, 564,565,566,-1, 567,568,569,-1, 570,571,572,-1, 573,574,575,-1, + 576,577,578,-1, 579,580,581,-1, 582,583,584,-1, 585,586,587,-1, 588,589,590,-1, 591,592,593,-1, + 594,595,596,-1, 597,598,599,-1, 600,601,602,-1, 603,604,605,-1, 606,607,608,-1, 609,610,611,-1, + 612,613,614,-1, 615,616,617,-1, 618,619,620,-1, 621,622,623,-1, 624,625,626,-1, 627,628,629,-1, + 630,631,632,-1, 633,634,635,-1, 636,637,638,-1, 639,640,641,-1, 642,643,644,-1, 645,646,647,-1, + 648,649,650,-1, 651,652,653,-1, 654,655,656,-1, 657,658,659,-1, 660,661,662,-1, 663,664,665,-1, + 666,667,668,-1, 669,670,671,-1, 672,673,674,-1, 675,676,677,-1, 678,679,680,-1, 681,682,683,-1, + 684,685,686,-1, 687,688,689,-1, 690,691,692,-1, 693,694,695,-1, 696,697,698,-1, 699,700,701,-1, + 702,703,704,-1, 705,706,707,-1, 708,709,710,-1, 711,712,713,-1, 714,715,716,-1, 717,718,719,-1, + 720,721,722,-1, 723,724,725,-1, 726,727,728,-1, 729,730,731,-1, 732,733,734,-1, 735,736,737,-1, + 738,739,740,-1, 741,742,743,-1, 744,745,746,-1, 747,748,749,-1, 750,751,752,-1, 753,754,755,-1, + 756,757,758,-1, 759,760,761,-1, 762,763,764,-1, 765,766,767,-1, 768,769,770,-1, 771,772,773,-1, + 774,775,776,-1, 777,778,779,-1, 780,781,782,-1, 783,784,785,-1, 786,787,788,-1, 789,790,791,-1, + 792,793,794,-1, 795,796,797,-1, 798,799,800,-1, 801,802,803,-1, 804,805,806,-1, 807,808,809,-1, + 810,811,812,-1, 813,814,815,-1, 816,817,818,-1, 819,820,821,-1, 822,823,824,-1, 825,826,827,-1, + 828,829,830,-1, 831,832,833,-1, 834,835,836,-1, 837,838,839,-1, 840,841,842,-1, 843,844,845,-1, + 846,847,848,-1, 849,850,851,-1, 852,853,854,-1, 855,856,857,-1, 858,859,860,-1, 861,862,863,-1, + 864,865,866,-1, 867,868,869,-1, 870,871,872,-1, 873,874,875,-1, 876,877,878,-1, 879,880,881,-1, + 882,883,884,-1, 885,886,887,-1, 888,889,890,-1, 891,892,893,-1, 894,895,896,-1, 897,898,899,-1, + 900,901,902,-1, 903,904,905,-1, 906,907,908,-1, 909,910,911,-1, 912,913,914,-1, 915,916,917,-1, + 918,919,920,-1, 921,922,923,-1, 924,925,926,-1, 927,928,929,-1, 930,931,932,-1, 933,934,935,-1, + 936,937,938,-1, 939,940,941,-1, 942,943,944,-1, 945,946,947,-1, 948,949,950,-1, 951,952,953,-1, + 954,955,956,-1, 957,958,959,-1, 960,961,962,-1, 963,964,965,-1, 966,967,968,-1, 969,970,971,-1, + 972,973,974,-1, 975,976,977,-1, 978,979,980,-1, 981,982,983,-1, 984,985,986,-1, 987,988,989,-1, + 990,991,992,-1, 993,994,995,-1, 996,997,998,-1, 999,1000,1001,-1, 1002,1003,1004,-1, 1005,1006,1007,-1, + 1008,1009,1010,-1, 1011,1012,1013,-1, 1014,1015,1016,-1, 1017,1018,1019,-1, 1020,1021,1022,-1, 1023,1024,1025,-1 + ] + } + appearance Appearance + { + material Material + { + ambientIntensity 0.2 + diffuseColor 0.9 0.9 0.9 + specularColor .1 .1 .1 + shininess .5 + } + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left_nob.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left_nob.obj new file mode 100755 index 0000000..d659fc8 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left_nob.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e609f9f7ddd2c6fcfd90059879e15eec25227227bbc3f7cf37d573cbcc4189a +size 42890 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left_nob.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left_nob.wrl new file mode 100755 index 0000000..2564349 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_left_nob.wrl @@ -0,0 +1,378 @@ +#VRML V2.0 utf8 + +# Generated by VCGLIB, (C)Copyright 1999-2001 VCG, IEI-CNR + +NavigationInfo { + type [ "EXAMINE", "ANY" ] +} +Transform { + scale 1 1 1 + translation 0 0 0 + children + [ + Shape + { + geometry IndexedFaceSet + { + creaseAngle .5 + solid FALSE + coord Coordinate + { + point + [ + 0.010346 0.176606 0.184551, 0.010346 0.175985 0.188075, 0.016218 0.175985 0.188075, 0.010346 0.176606 0.184551, + 0.016218 0.175985 0.188075, 0.016218 0.176606 0.184551, 0.010346 0.175985 0.188075, 0.010346 0.174195 0.191174, + 0.016218 0.174195 0.191174, 0.010346 0.175985 0.188075, 0.016218 0.174195 0.191174, 0.016218 0.175985 0.188075, + 0.010346 0.174195 0.191174, 0.010346 0.171454 0.193474, 0.016218 0.171454 0.193474, 0.010346 0.174195 0.191174, + 0.016218 0.171454 0.193474, 0.016218 0.174195 0.191174, 0.010346 0.171454 0.193474, 0.010346 0.168092 0.194698, + 0.016218 0.168092 0.194698, 0.010346 0.171454 0.193474, 0.016218 0.168092 0.194698, 0.016218 0.171454 0.193474, + 0.010346 0.168092 0.194698, 0.010346 0.164514 0.194698, 0.016218 0.164514 0.194698, 0.010346 0.168092 0.194698, + 0.016218 0.164514 0.194698, 0.016218 0.168092 0.194698, 0.010346 0.164514 0.194698, 0.010346 0.161151 0.193474, + 0.016218 0.161151 0.193474, 0.010346 0.164514 0.194698, 0.016218 0.161151 0.193474, 0.016218 0.164514 0.194698, + 0.010346 0.161151 0.193474, 0.010346 0.15841 0.191174, 0.016218 0.15841 0.191174, 0.010346 0.161151 0.193474, + 0.016218 0.15841 0.191174, 0.016218 0.161151 0.193474, 0.010346 0.15841 0.191174, 0.010346 0.156621 0.188075, + 0.016218 0.156621 0.188075, 0.010346 0.15841 0.191174, 0.016218 0.156621 0.188075, 0.016218 0.15841 0.191174, + 0.010346 0.156621 0.188075, 0.010346 0.156 0.184551, 0.016218 0.156 0.184551, 0.010346 0.156621 0.188075, + 0.016218 0.156 0.184551, 0.016218 0.156621 0.188075, 0.010346 0.156 0.184551, 0.010346 0.156621 0.181028, + 0.016218 0.156621 0.181028, 0.010346 0.156 0.184551, 0.016218 0.156621 0.181028, 0.016218 0.156 0.184551, + 0.010346 0.156621 0.181028, 0.010346 0.15841 0.177929, 0.016218 0.15841 0.177929, 0.010346 0.156621 0.181028, + 0.016218 0.15841 0.177929, 0.016218 0.156621 0.181028, 0.010346 0.15841 0.177929, 0.010346 0.161151 0.175629, + 0.016218 0.161151 0.175629, 0.010346 0.15841 0.177929, 0.016218 0.161151 0.175629, 0.016218 0.15841 0.177929, + 0.010346 0.161151 0.175629, 0.010346 0.164514 0.174405, 0.016218 0.164514 0.174405, 0.010346 0.161151 0.175629, + 0.016218 0.164514 0.174405, 0.016218 0.161151 0.175629, 0.010346 0.164514 0.174405, 0.010346 0.168092 0.174405, + 0.016218 0.168092 0.174405, 0.010346 0.164514 0.174405, 0.016218 0.168092 0.174405, 0.016218 0.164514 0.174405, + 0.010346 0.168092 0.174405, 0.010346 0.171454 0.175629, 0.016218 0.171454 0.175629, 0.010346 0.168092 0.174405, + 0.016218 0.171454 0.175629, 0.016218 0.168092 0.174405, 0.010346 0.171454 0.175629, 0.010346 0.174195 0.177929, + 0.016218 0.174195 0.177929, 0.010346 0.171454 0.175629, 0.016218 0.174195 0.177929, 0.016218 0.171454 0.175629, + 0.010346 0.174195 0.177929, 0.010346 0.175985 0.181027, 0.016218 0.175985 0.181027, 0.010346 0.174195 0.177929, + 0.016218 0.175985 0.181027, 0.016218 0.174195 0.177929, 0.010346 0.175985 0.181027, 0.010346 0.176606 0.184551, + 0.016218 0.176606 0.184551, 0.010346 0.175985 0.181027, 0.016218 0.176606 0.184551, 0.016218 0.175985 0.181027, + 0.016218 0.175985 0.188075, 0.021149 0.17709 0.188478, 0.021149 0.177782 0.184551, 0.016218 0.175985 0.188075, + 0.021149 0.177782 0.184551, 0.016218 0.176606 0.184551, 0.016218 0.174195 0.191174, 0.021149 0.175097 0.19193, + 0.021149 0.17709 0.188478, 0.016218 0.174195 0.191174, 0.021149 0.17709 0.188478, 0.016218 0.175985 0.188075, + 0.016218 0.171454 0.193474, 0.021149 0.172043 0.194493, 0.021149 0.175097 0.19193, 0.016218 0.171454 0.193474, + 0.021149 0.175097 0.19193, 0.016218 0.174195 0.191174, 0.016218 0.168092 0.194698, 0.021149 0.168296 0.195857, + 0.021149 0.172043 0.194493, 0.016218 0.168092 0.194698, 0.021149 0.172043 0.194493, 0.016218 0.171454 0.193474, + 0.016218 0.164514 0.194698, 0.021149 0.164309 0.195857, 0.021149 0.168296 0.195857, 0.016218 0.164514 0.194698, + 0.021149 0.168296 0.195857, 0.016218 0.168092 0.194698, 0.016218 0.161151 0.193474, 0.021149 0.160563 0.194493, + 0.021149 0.164309 0.195857, 0.016218 0.161151 0.193474, 0.021149 0.164309 0.195857, 0.016218 0.164514 0.194698, + 0.016218 0.15841 0.191174, 0.021149 0.157509 0.19193, 0.021149 0.160563 0.194493, 0.016218 0.15841 0.191174, + 0.021149 0.160563 0.194493, 0.016218 0.161151 0.193474, 0.016218 0.156621 0.188075, 0.021149 0.155515 0.188478, + 0.021149 0.157509 0.19193, 0.016218 0.156621 0.188075, 0.021149 0.157509 0.19193, 0.016218 0.15841 0.191174, + 0.016218 0.156 0.184551, 0.021149 0.154823 0.184551, 0.021149 0.155515 0.188478, 0.016218 0.156 0.184551, + 0.021149 0.155515 0.188478, 0.016218 0.156621 0.188075, 0.016218 0.156621 0.181028, 0.021149 0.155515 0.180625, + 0.021149 0.154823 0.184551, 0.016218 0.156621 0.181028, 0.021149 0.154823 0.184551, 0.016218 0.156 0.184551, + 0.016218 0.15841 0.177929, 0.021149 0.157509 0.177172, 0.021149 0.155515 0.180625, 0.016218 0.15841 0.177929, + 0.021149 0.155515 0.180625, 0.016218 0.156621 0.181028, 0.016218 0.161151 0.175629, 0.021149 0.160563 0.17461, + 0.021149 0.157509 0.177172, 0.016218 0.161151 0.175629, 0.021149 0.157509 0.177172, 0.016218 0.15841 0.177929, + 0.016218 0.164514 0.174405, 0.021149 0.164309 0.173246, 0.021149 0.160563 0.17461, 0.016218 0.164514 0.174405, + 0.021149 0.160563 0.17461, 0.016218 0.161151 0.175629, 0.016218 0.168092 0.174405, 0.021149 0.168296 0.173246, + 0.021149 0.164309 0.173246, 0.016218 0.168092 0.174405, 0.021149 0.164309 0.173246, 0.016218 0.164514 0.174405, + 0.016218 0.171454 0.175629, 0.021149 0.172043 0.17461, 0.021149 0.168296 0.173246, 0.016218 0.171454 0.175629, + 0.021149 0.168296 0.173246, 0.016218 0.168092 0.174405, 0.016218 0.174195 0.177929, 0.021149 0.175097 0.177172, + 0.021149 0.172043 0.17461, 0.016218 0.174195 0.177929, 0.021149 0.172043 0.17461, 0.016218 0.171454 0.175629, + 0.016218 0.175985 0.181027, 0.021149 0.17709 0.180625, 0.021149 0.175097 0.177172, 0.016218 0.175985 0.181027, + 0.021149 0.175097 0.177172, 0.016218 0.174195 0.177929, 0.016218 0.176606 0.184551, 0.021149 0.177782 0.184551, + 0.021149 0.17709 0.180625, 0.016218 0.176606 0.184551, 0.021149 0.17709 0.180625, 0.016218 0.175985 0.181027, + 0.026081 0.18118 0.184551, 0.026081 0.180283 0.18964, 0.036057 0.180283 0.18964, 0.026081 0.18118 0.184551, + 0.036057 0.180283 0.18964, 0.036057 0.18118 0.184551, 0.026081 0.180283 0.18964, 0.026081 0.1777 0.194114, + 0.036057 0.1777 0.194114, 0.026081 0.180283 0.18964, 0.036057 0.1777 0.194114, 0.036057 0.180283 0.18964, + 0.026081 0.1777 0.194114, 0.026081 0.173742 0.197436, 0.036057 0.173742 0.197436, 0.026081 0.1777 0.194114, + 0.036057 0.173742 0.197436, 0.036057 0.1777 0.194114, 0.026081 0.173742 0.197436, 0.026081 0.168886 0.199203, + 0.036057 0.168886 0.199203, 0.026081 0.173742 0.197436, 0.036057 0.168886 0.199203, 0.036057 0.173742 0.197436, + 0.026081 0.168886 0.199203, 0.026081 0.163719 0.199203, 0.036057 0.163719 0.199203, 0.026081 0.168886 0.199203, + 0.036057 0.163719 0.199203, 0.036057 0.168886 0.199203, 0.026081 0.163719 0.199203, 0.026081 0.158864 0.197436, + 0.036057 0.158864 0.197436, 0.026081 0.163719 0.199203, 0.036057 0.158864 0.197436, 0.036057 0.163719 0.199203, + 0.026081 0.158864 0.197436, 0.026081 0.154906 0.194114, 0.036057 0.154906 0.194114, 0.026081 0.158864 0.197436, + 0.036057 0.154906 0.194114, 0.036057 0.158864 0.197436, 0.026081 0.154906 0.194114, 0.026081 0.152322 0.18964, + 0.036057 0.152322 0.18964, 0.026081 0.154906 0.194114, 0.036057 0.152322 0.18964, 0.036057 0.154906 0.194114, + 0.026081 0.152322 0.18964, 0.026081 0.151425 0.184551, 0.036057 0.151425 0.184551, 0.026081 0.152322 0.18964, + 0.036057 0.151425 0.184551, 0.036057 0.152322 0.18964, 0.026081 0.151425 0.184551, 0.026081 0.152322 0.179463, + 0.036057 0.152322 0.179463, 0.026081 0.151425 0.184551, 0.036057 0.152322 0.179463, 0.036057 0.151425 0.184551, + 0.026081 0.152322 0.179463, 0.026081 0.154906 0.174988, 0.036057 0.154906 0.174988, 0.026081 0.152322 0.179463, + 0.036057 0.154906 0.174988, 0.036057 0.152322 0.179463, 0.026081 0.154906 0.174988, 0.026081 0.158864 0.171667, + 0.036057 0.158864 0.171667, 0.026081 0.154906 0.174988, 0.036057 0.158864 0.171667, 0.036057 0.154906 0.174988, + 0.026081 0.158864 0.171667, 0.026081 0.163719 0.1699, 0.036057 0.163719 0.1699, 0.026081 0.158864 0.171667, + 0.036057 0.163719 0.1699, 0.036057 0.158864 0.171667, 0.026081 0.163719 0.1699, 0.026081 0.168886 0.1699, + 0.036057 0.168886 0.1699, 0.026081 0.163719 0.1699, 0.036057 0.168886 0.1699, 0.036057 0.163719 0.1699, + 0.026081 0.168886 0.1699, 0.026081 0.173741 0.171667, 0.036057 0.173741 0.171667, 0.026081 0.168886 0.1699, + 0.036057 0.173741 0.171667, 0.036057 0.168886 0.1699, 0.026081 0.173741 0.171667, 0.026081 0.1777 0.174988, + 0.036057 0.1777 0.174988, 0.026081 0.173741 0.171667, 0.036057 0.1777 0.174988, 0.036057 0.173741 0.171667, + 0.026081 0.1777 0.174988, 0.026081 0.180283 0.179463, 0.036057 0.180283 0.179463, 0.026081 0.1777 0.174988, + 0.036057 0.180283 0.179463, 0.036057 0.1777 0.174988, 0.026081 0.180283 0.179463, 0.026081 0.18118 0.184551, + 0.036057 0.18118 0.184551, 0.026081 0.180283 0.179463, 0.036057 0.18118 0.184551, 0.036057 0.180283 0.179463, + 0.036057 0.180283 0.18964, 0.036843 0.179751 0.189446, 0.036843 0.180614 0.184551, 0.036057 0.180283 0.18964, + 0.036843 0.180614 0.184551, 0.036057 0.18118 0.184551, 0.036057 0.1777 0.194114, 0.036843 0.177266 0.19375, + 0.036843 0.179751 0.189446, 0.036057 0.1777 0.194114, 0.036843 0.179751 0.189446, 0.036057 0.180283 0.18964, + 0.036057 0.173742 0.197436, 0.036843 0.173458 0.196945, 0.036843 0.177266 0.19375, 0.036057 0.173742 0.197436, + 0.036843 0.177266 0.19375, 0.036057 0.1777 0.194114, 0.036057 0.168886 0.199203, 0.036843 0.168788 0.198645, + 0.036843 0.173458 0.196945, 0.036057 0.168886 0.199203, 0.036843 0.173458 0.196945, 0.036057 0.173742 0.197436, + 0.036057 0.163719 0.199203, 0.036843 0.163818 0.198645, 0.036843 0.168788 0.198645, 0.036057 0.163719 0.199203, + 0.036843 0.168788 0.198645, 0.036057 0.168886 0.199203, 0.036057 0.158864 0.197436, 0.036843 0.159147 0.196945, + 0.036843 0.163818 0.198645, 0.036057 0.158864 0.197436, 0.036843 0.163818 0.198645, 0.036057 0.163719 0.199203, + 0.036057 0.154906 0.194114, 0.036843 0.15534 0.19375, 0.036843 0.159147 0.196945, 0.036057 0.154906 0.194114, + 0.036843 0.159147 0.196945, 0.036057 0.158864 0.197436, 0.036057 0.152322 0.18964, 0.036843 0.152855 0.189446, + 0.036843 0.15534 0.19375, 0.036057 0.152322 0.18964, 0.036843 0.15534 0.19375, 0.036057 0.154906 0.194114, + 0.036057 0.151425 0.184551, 0.036843 0.151992 0.184551, 0.036843 0.152855 0.189446, 0.036057 0.151425 0.184551, + 0.036843 0.152855 0.189446, 0.036057 0.152322 0.18964, 0.036057 0.152322 0.179463, 0.036843 0.152855 0.179657, + 0.036843 0.151992 0.184551, 0.036057 0.152322 0.179463, 0.036843 0.151992 0.184551, 0.036057 0.151425 0.184551, + 0.036057 0.154906 0.174988, 0.036843 0.15534 0.175352, 0.036843 0.152855 0.179657, 0.036057 0.154906 0.174988, + 0.036843 0.152855 0.179657, 0.036057 0.152322 0.179463, 0.036057 0.158864 0.171667, 0.036843 0.159147 0.172158, + 0.036843 0.15534 0.175352, 0.036057 0.158864 0.171667, 0.036843 0.15534 0.175352, 0.036057 0.154906 0.174988, + 0.036057 0.163719 0.1699, 0.036843 0.163818 0.170458, 0.036843 0.159147 0.172158, 0.036057 0.163719 0.1699, + 0.036843 0.159147 0.172158, 0.036057 0.158864 0.171667, 0.036057 0.168886 0.1699, 0.036843 0.168788 0.170458, + 0.036843 0.163818 0.170458, 0.036057 0.168886 0.1699, 0.036843 0.163818 0.170458, 0.036057 0.163719 0.1699, + 0.036057 0.173741 0.171667, 0.036843 0.173458 0.172158, 0.036843 0.168788 0.170458, 0.036057 0.173741 0.171667, + 0.036843 0.168788 0.170458, 0.036057 0.168886 0.1699, 0.036057 0.1777 0.174988, 0.036843 0.177266 0.175352, + 0.036843 0.173458 0.172158, 0.036057 0.1777 0.174988, 0.036843 0.173458 0.172158, 0.036057 0.173741 0.171667, + 0.036057 0.180283 0.179463, 0.036843 0.179751 0.179657, 0.036843 0.177266 0.175352, 0.036057 0.180283 0.179463, + 0.036843 0.177266 0.175352, 0.036057 0.1777 0.174988, 0.036057 0.18118 0.184551, 0.036843 0.180614 0.184551, + 0.036843 0.179751 0.179657, 0.036057 0.18118 0.184551, 0.036843 0.179751 0.179657, 0.036057 0.180283 0.179463, + 0.036843 0.180614 0.184551, 0.036843 0.179751 0.189446, 0.036843 0.166303 0.184551, 0.036843 0.179751 0.189446, + 0.036843 0.177266 0.19375, 0.036843 0.166303 0.184551, 0.036843 0.177266 0.19375, 0.036843 0.173458 0.196945, + 0.036843 0.166303 0.184551, 0.036843 0.173458 0.196945, 0.036843 0.168788 0.198645, 0.036843 0.166303 0.184551, + 0.036843 0.168788 0.198645, 0.036843 0.163818 0.198645, 0.036843 0.166303 0.184551, 0.036843 0.163818 0.198645, + 0.036843 0.159147 0.196945, 0.036843 0.166303 0.184551, 0.036843 0.159147 0.196945, 0.036843 0.15534 0.19375, + 0.036843 0.166303 0.184551, 0.036843 0.15534 0.19375, 0.036843 0.152855 0.189446, 0.036843 0.166303 0.184551, + 0.036843 0.152855 0.189446, 0.036843 0.151992 0.184551, 0.036843 0.166303 0.184551, 0.036843 0.151992 0.184551, + 0.036843 0.152855 0.179657, 0.036843 0.166303 0.184551, 0.036843 0.152855 0.179657, 0.036843 0.15534 0.175352, + 0.036843 0.166303 0.184551, 0.036843 0.15534 0.175352, 0.036843 0.159147 0.172158, 0.036843 0.166303 0.184551, + 0.036843 0.159147 0.172158, 0.036843 0.163818 0.170458, 0.036843 0.166303 0.184551, 0.036843 0.163818 0.170458, + 0.036843 0.168788 0.170458, 0.036843 0.166303 0.184551, 0.036843 0.168788 0.170458, 0.036843 0.173458 0.172158, + 0.036843 0.166303 0.184551, 0.036843 0.173458 0.172158, 0.036843 0.177266 0.175352, 0.036843 0.166303 0.184551, + 0.036843 0.177266 0.175352, 0.036843 0.179751 0.179657, 0.036843 0.166303 0.184551, 0.036843 0.179751 0.179657, + 0.036843 0.180614 0.184551, 0.036843 0.166303 0.184551, 0.026081 0.180283 0.18964, 0.026081 0.18118 0.184551, + 0.021149 0.177782 0.184551, 0.026081 0.180283 0.18964, 0.021149 0.177782 0.184551, 0.021149 0.17709 0.188478, + 0.026081 0.1777 0.194114, 0.026081 0.180283 0.18964, 0.021149 0.17709 0.188478, 0.026081 0.1777 0.194114, + 0.021149 0.17709 0.188478, 0.021149 0.175097 0.19193, 0.026081 0.173742 0.197436, 0.026081 0.1777 0.194114, + 0.021149 0.175097 0.19193, 0.026081 0.173742 0.197436, 0.021149 0.175097 0.19193, 0.021149 0.172043 0.194493, + 0.026081 0.168886 0.199203, 0.026081 0.173742 0.197436, 0.021149 0.172043 0.194493, 0.026081 0.168886 0.199203, + 0.021149 0.172043 0.194493, 0.021149 0.168296 0.195857, 0.026081 0.163719 0.199203, 0.026081 0.168886 0.199203, + 0.021149 0.168296 0.195857, 0.026081 0.163719 0.199203, 0.021149 0.168296 0.195857, 0.021149 0.164309 0.195857, + 0.026081 0.158864 0.197436, 0.026081 0.163719 0.199203, 0.021149 0.164309 0.195857, 0.026081 0.158864 0.197436, + 0.021149 0.164309 0.195857, 0.021149 0.160563 0.194493, 0.026081 0.154906 0.194114, 0.026081 0.158864 0.197436, + 0.021149 0.160563 0.194493, 0.026081 0.154906 0.194114, 0.021149 0.160563 0.194493, 0.021149 0.157509 0.19193, + 0.026081 0.152322 0.18964, 0.026081 0.154906 0.194114, 0.021149 0.157509 0.19193, 0.026081 0.152322 0.18964, + 0.021149 0.157509 0.19193, 0.021149 0.155515 0.188478, 0.026081 0.151425 0.184551, 0.026081 0.152322 0.18964, + 0.021149 0.155515 0.188478, 0.026081 0.151425 0.184551, 0.021149 0.155515 0.188478, 0.021149 0.154823 0.184551, + 0.026081 0.152322 0.179463, 0.026081 0.151425 0.184551, 0.021149 0.154823 0.184551, 0.026081 0.152322 0.179463, + 0.021149 0.154823 0.184551, 0.021149 0.155515 0.180625, 0.026081 0.154906 0.174988, 0.026081 0.152322 0.179463, + 0.021149 0.155515 0.180625, 0.026081 0.154906 0.174988, 0.021149 0.155515 0.180625, 0.021149 0.157509 0.177172, + 0.026081 0.158864 0.171667, 0.026081 0.154906 0.174988, 0.021149 0.157509 0.177172, 0.026081 0.158864 0.171667, + 0.021149 0.157509 0.177172, 0.021149 0.160563 0.17461, 0.026081 0.163719 0.1699, 0.026081 0.158864 0.171667, + 0.021149 0.160563 0.17461, 0.026081 0.163719 0.1699, 0.021149 0.160563 0.17461, 0.021149 0.164309 0.173246, + 0.026081 0.168886 0.1699, 0.026081 0.163719 0.1699, 0.021149 0.164309 0.173246, 0.026081 0.168886 0.1699, + 0.021149 0.164309 0.173246, 0.021149 0.168296 0.173246, 0.026081 0.173741 0.171667, 0.026081 0.168886 0.1699, + 0.021149 0.168296 0.173246, 0.026081 0.173741 0.171667, 0.021149 0.168296 0.173246, 0.021149 0.172043 0.17461, + 0.026081 0.1777 0.174988, 0.026081 0.173741 0.171667, 0.021149 0.172043 0.17461, 0.026081 0.1777 0.174988, + 0.021149 0.172043 0.17461, 0.021149 0.175097 0.177172, 0.026081 0.180283 0.179463, 0.026081 0.1777 0.174988, + 0.021149 0.175097 0.177172, 0.026081 0.180283 0.179463, 0.021149 0.175097 0.177172, 0.021149 0.17709 0.180625, + 0.026081 0.18118 0.184551, 0.026081 0.180283 0.179463, 0.021149 0.17709 0.180625, 0.026081 0.18118 0.184551, + 0.021149 0.17709 0.180625, 0.021149 0.177782 0.184551 + ] + } + color Color + { + color + [ + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941 + ] + } + coordIndex + [ + 0,1,2,-1, 3,4,5,-1, 6,7,8,-1, 9,10,11,-1, 12,13,14,-1, 15,16,17,-1, + 18,19,20,-1, 21,22,23,-1, 24,25,26,-1, 27,28,29,-1, 30,31,32,-1, 33,34,35,-1, + 36,37,38,-1, 39,40,41,-1, 42,43,44,-1, 45,46,47,-1, 48,49,50,-1, 51,52,53,-1, + 54,55,56,-1, 57,58,59,-1, 60,61,62,-1, 63,64,65,-1, 66,67,68,-1, 69,70,71,-1, + 72,73,74,-1, 75,76,77,-1, 78,79,80,-1, 81,82,83,-1, 84,85,86,-1, 87,88,89,-1, + 90,91,92,-1, 93,94,95,-1, 96,97,98,-1, 99,100,101,-1, 102,103,104,-1, 105,106,107,-1, + 108,109,110,-1, 111,112,113,-1, 114,115,116,-1, 117,118,119,-1, 120,121,122,-1, 123,124,125,-1, + 126,127,128,-1, 129,130,131,-1, 132,133,134,-1, 135,136,137,-1, 138,139,140,-1, 141,142,143,-1, + 144,145,146,-1, 147,148,149,-1, 150,151,152,-1, 153,154,155,-1, 156,157,158,-1, 159,160,161,-1, + 162,163,164,-1, 165,166,167,-1, 168,169,170,-1, 171,172,173,-1, 174,175,176,-1, 177,178,179,-1, + 180,181,182,-1, 183,184,185,-1, 186,187,188,-1, 189,190,191,-1, 192,193,194,-1, 195,196,197,-1, + 198,199,200,-1, 201,202,203,-1, 204,205,206,-1, 207,208,209,-1, 210,211,212,-1, 213,214,215,-1, + 216,217,218,-1, 219,220,221,-1, 222,223,224,-1, 225,226,227,-1, 228,229,230,-1, 231,232,233,-1, + 234,235,236,-1, 237,238,239,-1, 240,241,242,-1, 243,244,245,-1, 246,247,248,-1, 249,250,251,-1, + 252,253,254,-1, 255,256,257,-1, 258,259,260,-1, 261,262,263,-1, 264,265,266,-1, 267,268,269,-1, + 270,271,272,-1, 273,274,275,-1, 276,277,278,-1, 279,280,281,-1, 282,283,284,-1, 285,286,287,-1, + 288,289,290,-1, 291,292,293,-1, 294,295,296,-1, 297,298,299,-1, 300,301,302,-1, 303,304,305,-1, + 306,307,308,-1, 309,310,311,-1, 312,313,314,-1, 315,316,317,-1, 318,319,320,-1, 321,322,323,-1, + 324,325,326,-1, 327,328,329,-1, 330,331,332,-1, 333,334,335,-1, 336,337,338,-1, 339,340,341,-1, + 342,343,344,-1, 345,346,347,-1, 348,349,350,-1, 351,352,353,-1, 354,355,356,-1, 357,358,359,-1, + 360,361,362,-1, 363,364,365,-1, 366,367,368,-1, 369,370,371,-1, 372,373,374,-1, 375,376,377,-1, + 378,379,380,-1, 381,382,383,-1, 384,385,386,-1, 387,388,389,-1, 390,391,392,-1, 393,394,395,-1, + 396,397,398,-1, 399,400,401,-1, 402,403,404,-1, 405,406,407,-1, 408,409,410,-1, 411,412,413,-1, + 414,415,416,-1, 417,418,419,-1, 420,421,422,-1, 423,424,425,-1, 426,427,428,-1, 429,430,431,-1, + 432,433,434,-1, 435,436,437,-1, 438,439,440,-1, 441,442,443,-1, 444,445,446,-1, 447,448,449,-1, + 450,451,452,-1, 453,454,455,-1, 456,457,458,-1, 459,460,461,-1, 462,463,464,-1, 465,466,467,-1, + 468,469,470,-1, 471,472,473,-1, 474,475,476,-1, 477,478,479,-1, 480,481,482,-1, 483,484,485,-1, + 486,487,488,-1, 489,490,491,-1, 492,493,494,-1, 495,496,497,-1, 498,499,500,-1, 501,502,503,-1, + 504,505,506,-1, 507,508,509,-1, 510,511,512,-1, 513,514,515,-1, 516,517,518,-1, 519,520,521,-1, + 522,523,524,-1, 525,526,527,-1, 528,529,530,-1, 531,532,533,-1, 534,535,536,-1, 537,538,539,-1, + 540,541,542,-1, 543,544,545,-1, 546,547,548,-1, 549,550,551,-1, 552,553,554,-1, 555,556,557,-1, + 558,559,560,-1, 561,562,563,-1, 564,565,566,-1, 567,568,569,-1, 570,571,572,-1, 573,574,575,-1, + 576,577,578,-1, 579,580,581,-1, 582,583,584,-1, 585,586,587,-1, 588,589,590,-1, 591,592,593,-1 + ] + } + appearance Appearance + { + material Material + { + ambientIntensity 0.2 + diffuseColor 0.9 0.9 0.9 + specularColor .1 .1 .1 + shininess .5 + } + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right.obj new file mode 100755 index 0000000..f1d618f --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ae9f281836fe3c08c7e2a87e55c7153b4b7d183acb6e0557ef40fb7c4f4abb8 +size 75119 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right.wrl new file mode 100755 index 0000000..9006ec7 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right.wrl @@ -0,0 +1,618 @@ +#VRML V2.0 utf8 + +# Generated by VCGLIB, (C)Copyright 1999-2001 VCG, IEI-CNR + +NavigationInfo { + type [ "EXAMINE", "ANY" ] +} +Transform { + scale 1 1 1 + translation 0 0 0 + children + [ + Shape + { + geometry IndexedFaceSet + { + creaseAngle .5 + solid FALSE + coord Coordinate + { + point + [ + -0.010282 0.189491 -0.188934, -0.008882 0.190891 -0.188934, -0.006123 0.190891 -0.188934, -0.010282 0.189491 -0.188934, + -0.006123 0.190891 -0.188934, -0.010282 0.184131 -0.188934, -0.006123 0.190891 -0.210934, -0.010282 0.184131 -0.210934, + -0.006123 0.184131 -0.210934, -0.010282 0.189491 0.189757, -0.010282 0.184131 0.189757, -0.006123 0.190891 0.189757, + -0.010282 0.189491 0.189757, -0.006123 0.190891 0.189757, -0.008882 0.190891 0.189757, -0.006123 0.190891 0.211757, + -0.010282 0.184131 0.211757, -0.010282 0.189491 0.211757, -0.006123 0.190891 0.211757, -0.010282 0.189491 0.211757, + -0.008882 0.190891 0.211757, -0.006123 0.190891 -0.210934, -0.008882 0.190891 -0.210934, -0.010282 0.189491 -0.210934, + -0.006123 0.190891 -0.210934, -0.010282 0.189491 -0.210934, -0.010282 0.184131 -0.210934, -0.006123 0.190891 -0.188934, + -0.006123 0.184131 -0.188934, -0.010282 0.184131 -0.188934, -0.010282 0.184131 0.189757, -0.006123 0.184131 0.189757, + -0.006123 0.190891 0.189757, -0.006123 0.190891 0.211757, -0.006123 0.184131 0.211757, -0.010282 0.184131 0.211757, + 0.009747 0.106958 0.165943, 0.009747 -0.104562 0.165943, 0.009747 -0.104562 -0.16512, 0.009747 0.106958 0.165943, + 0.009747 -0.104562 -0.16512, 0.009747 0.106958 -0.16512, -0.010282 0.139733 -0.195593, -0.010282 -0.137337 -0.195593, + -0.010282 -0.137337 0.196416, -0.010282 0.139733 -0.195593, -0.010282 -0.137337 0.196416, -0.010282 0.139733 0.196416, + -0.010282 0.139733 -0.195593, 0.003847 0.139733 -0.195593, 0.003847 -0.137337 -0.195593, -0.010282 0.139733 -0.195593, + 0.003847 -0.137337 -0.195593, -0.010282 -0.137337 -0.195593, -0.010282 -0.137337 -0.195593, 0.003847 -0.137337 -0.195593, + 0.003847 -0.137337 0.196416, -0.010282 -0.137337 -0.195593, 0.003847 -0.137337 0.196416, -0.010282 -0.137337 0.196416, + -0.010282 -0.137337 0.196416, 0.003847 -0.137337 0.196416, 0.003847 0.139733 0.196416, -0.010282 -0.137337 0.196416, + 0.003847 0.139733 0.196416, -0.010282 0.139733 0.196416, -0.010282 0.139733 0.196416, 0.003847 0.139733 0.196416, + 0.003847 0.139733 -0.195593, -0.010282 0.139733 0.196416, 0.003847 0.139733 -0.195593, -0.010282 0.139733 -0.195593, + 0.003847 -0.137337 -0.195593, 0.003847 0.139733 -0.195593, 0.003847 0.139733 0.196416, 0.003847 -0.137337 -0.195593, + 0.003847 0.139733 0.196416, 0.003847 -0.137337 0.196416, 0.003847 0.116058 -0.175151, 0.009324 0.107677 -0.166763, + 0.009324 -0.105281 -0.166763, 0.003847 0.116058 -0.175151, 0.009324 -0.105281 -0.166763, 0.003847 -0.113662 -0.175151, + 0.003847 0.119309 0.172721, 0.009324 0.110927 0.164332, 0.009324 0.110927 -0.163509, 0.003847 0.119309 0.172721, + 0.009324 0.110927 -0.163509, 0.003847 0.119309 -0.171898, 0.003847 -0.113662 0.175974, 0.009324 -0.105281 0.167586, + 0.009324 0.107677 0.167586, 0.003847 -0.113662 0.175974, 0.009324 0.107677 0.167586, 0.003847 0.116058 0.175974, + 0.003847 -0.116913 -0.171898, 0.009324 -0.108531 -0.163509, 0.009324 -0.108531 0.164332, 0.003847 -0.116913 -0.171898, + 0.009324 -0.108531 0.164332, 0.003847 -0.116913 0.172721, 0.003847 0.116058 -0.175151, 0.003847 0.11748 -0.174948, + 0.009324 0.109099 -0.16656, 0.003847 0.116058 -0.175151, 0.009324 0.109099 -0.16656, 0.009324 0.107677 -0.166763, + 0.003847 0.11748 -0.174948, 0.003847 0.118496 -0.174338, 0.009324 0.110115 -0.165949, 0.003847 0.11748 -0.174948, + 0.009324 0.110115 -0.165949, 0.009324 0.109099 -0.16656, 0.003847 -0.113662 -0.175151, 0.009324 -0.105281 -0.166763, + 0.009324 -0.106703 -0.16656, 0.003847 -0.113662 -0.175151, 0.009324 -0.106703 -0.16656, 0.003847 -0.115084 -0.174948, + 0.003847 -0.115084 -0.174948, 0.009324 -0.106703 -0.16656, 0.009324 -0.107719 -0.165949, 0.003847 -0.115084 -0.174948, + 0.009324 -0.107719 -0.165949, 0.003847 -0.1161 -0.174338, 0.003847 0.119309 0.172721, 0.003847 0.119106 0.174144, + 0.009324 0.110724 0.165755, 0.003847 0.119309 0.172721, 0.009324 0.110724 0.165755, 0.009324 0.110927 0.164332, + 0.003847 0.119106 0.174144, 0.003847 0.118496 0.175161, 0.009324 0.110115 0.166772, 0.003847 0.119106 0.174144, + 0.009324 0.110115 0.166772, 0.009324 0.110724 0.165755, 0.003847 0.119309 -0.171898, 0.009324 0.110927 -0.163509, + 0.009324 0.110724 -0.164933, 0.003847 0.119309 -0.171898, 0.009324 0.110724 -0.164933, 0.003847 0.119106 -0.173321, + 0.003847 0.119106 -0.173321, 0.009324 0.110724 -0.164933, 0.009324 0.110115 -0.165949, 0.003847 0.119106 -0.173321, + 0.009324 0.110115 -0.165949, 0.003847 0.118496 -0.174338, 0.003847 -0.113662 0.175974, 0.003847 -0.115084 0.175771, + 0.009324 -0.106703 0.167382, 0.003847 -0.113662 0.175974, 0.009324 -0.106703 0.167382, 0.009324 -0.105281 0.167586, + 0.003847 -0.115084 0.175771, 0.003847 -0.1161 0.175161, 0.009324 -0.107719 0.166772, 0.003847 -0.115084 0.175771, + 0.009324 -0.107719 0.166772, 0.009324 -0.106703 0.167382, 0.003847 0.116058 0.175974, 0.009324 0.107677 0.167586, + 0.009324 0.109099 0.167382, 0.003847 0.116058 0.175974, 0.009324 0.109099 0.167382, 0.003847 0.11748 0.175771, + 0.003847 0.11748 0.175771, 0.009324 0.109099 0.167382, 0.009324 0.110115 0.166772, 0.003847 0.11748 0.175771, + 0.009324 0.110115 0.166772, 0.003847 0.118496 0.175161, 0.003847 -0.116913 -0.171898, 0.003847 -0.11671 -0.173321, + 0.009324 -0.108328 -0.164933, 0.003847 -0.116913 -0.171898, 0.009324 -0.108328 -0.164933, 0.009324 -0.108531 -0.163509, + 0.003847 -0.11671 -0.173321, 0.003847 -0.1161 -0.174338, 0.009324 -0.107719 -0.165949, 0.003847 -0.11671 -0.173321, + 0.009324 -0.107719 -0.165949, 0.009324 -0.108328 -0.164933, 0.003847 -0.116913 0.172721, 0.009324 -0.108531 0.164332, + 0.009324 -0.108328 0.165755, 0.003847 -0.116913 0.172721, 0.009324 -0.108328 0.165755, 0.003847 -0.11671 0.174144, + 0.003847 -0.11671 0.174144, 0.009324 -0.108328 0.165755, 0.009324 -0.107719 0.166772, 0.003847 -0.11671 0.174144, + 0.009324 -0.107719 0.166772, 0.003847 -0.1161 0.175161, 0.009747 0.108112 -0.164955, 0.009747 0.106958 -0.16512, + 0.009324 0.107677 -0.166763, 0.009747 0.108112 -0.164955, 0.009324 0.107677 -0.166763, 0.009324 0.109099 -0.16656, + 0.009747 0.108742 -0.164576, 0.009747 0.108112 -0.164955, 0.009324 0.109099 -0.16656, 0.009747 0.108742 -0.164576, + 0.009324 0.109099 -0.16656, 0.009324 0.110115 -0.165949, 0.009747 0.109121 -0.163945, 0.009747 0.108742 -0.164576, + 0.009324 0.110115 -0.165949, 0.009747 0.109121 -0.163945, 0.009324 0.110115 -0.165949, 0.009324 0.110724 -0.164933, + 0.009747 0.109286 -0.16279, 0.009747 0.109121 -0.163945, 0.009324 0.110724 -0.164933, 0.009747 0.109286 -0.16279, + 0.009324 0.110724 -0.164933, 0.009324 0.110927 -0.163509, 0.009747 0.108743 0.165399, 0.009747 0.109121 0.164767, + 0.009324 0.110724 0.165755, 0.009747 0.108743 0.165399, 0.009324 0.110724 0.165755, 0.009324 0.110115 0.166772, + 0.009747 0.108112 0.165778, 0.009747 0.108743 0.165399, 0.009324 0.110115 0.166772, 0.009747 0.108112 0.165778, + 0.009324 0.110115 0.166772, 0.009324 0.109099 0.167382, 0.009747 0.106958 0.165943, 0.009747 0.108112 0.165778, + 0.009324 0.109099 0.167382, 0.009747 0.106958 0.165943, 0.009324 0.109099 0.167382, 0.009324 0.107677 0.167586, + 0.009747 -0.104562 0.165943, 0.009747 0.106958 0.165943, 0.009324 0.107677 0.167586, 0.009747 -0.104562 0.165943, + 0.009324 0.107677 0.167586, 0.009324 -0.105281 0.167586, 0.009747 -0.105716 0.165778, 0.009747 -0.104562 0.165943, + 0.009324 -0.105281 0.167586, 0.009747 -0.105716 0.165778, 0.009324 -0.105281 0.167586, 0.009324 -0.106703 0.167382, + 0.009747 -0.106347 0.165399, 0.009747 -0.105716 0.165778, 0.009324 -0.106703 0.167382, 0.009747 -0.106347 0.165399, + 0.009324 -0.106703 0.167382, 0.009324 -0.107719 0.166772, 0.009747 -0.106725 0.164767, 0.009747 -0.106347 0.165399, + 0.009324 -0.107719 0.166772, 0.009747 -0.106725 0.164767, 0.009324 -0.107719 0.166772, 0.009324 -0.108328 0.165755, + 0.009747 -0.10689 0.163613, 0.009747 -0.106725 0.164767, 0.009324 -0.108328 0.165755, 0.009747 -0.10689 0.163613, + 0.009324 -0.108328 0.165755, 0.009324 -0.108531 0.164332, 0.009747 -0.10689 -0.16279, 0.009747 -0.10689 0.163613, + 0.009324 -0.108531 0.164332, 0.009747 -0.10689 -0.16279, 0.009324 -0.108531 0.164332, 0.009324 -0.108531 -0.163509, + 0.009747 -0.106725 -0.163945, 0.009747 -0.10689 -0.16279, 0.009324 -0.108531 -0.163509, 0.009747 -0.106725 -0.163945, + 0.009324 -0.108531 -0.163509, 0.009324 -0.108328 -0.164933, 0.009747 -0.106347 -0.164576, 0.009747 -0.106725 -0.163945, + 0.009324 -0.108328 -0.164933, 0.009747 -0.106347 -0.164576, 0.009324 -0.108328 -0.164933, 0.009324 -0.107719 -0.165949, + 0.009747 -0.105716 -0.164955, 0.009747 -0.106347 -0.164576, 0.009324 -0.107719 -0.165949, 0.009747 -0.105716 -0.164955, + 0.009324 -0.107719 -0.165949, 0.009324 -0.106703 -0.16656, 0.009747 -0.105716 -0.164955, 0.009324 -0.106703 -0.16656, + 0.009324 -0.105281 -0.166763, 0.009747 -0.105716 -0.164955, 0.009324 -0.105281 -0.166763, 0.009747 -0.104562 -0.16512, + 0.009747 0.106958 -0.16512, 0.009747 -0.104562 -0.16512, 0.009324 -0.105281 -0.166763, 0.009747 0.106958 -0.16512, + 0.009324 -0.105281 -0.166763, 0.009324 0.107677 -0.166763, 0.009747 -0.106725 -0.163945, 0.009747 -0.105716 -0.164955, + 0.009747 -0.104562 -0.16512, 0.009747 -0.106725 -0.163945, 0.009747 -0.104562 -0.16512, 0.009747 -0.10689 -0.16279, + 0.009747 -0.105716 0.165778, 0.009747 -0.106725 0.164767, 0.009747 -0.10689 0.163613, 0.009747 -0.105716 0.165778, + 0.009747 -0.10689 0.163613, 0.009747 -0.104562 0.165943, 0.009747 -0.10689 0.163613, 0.009747 -0.10689 -0.16279, + 0.009747 -0.104562 -0.16512, 0.009747 -0.10689 0.163613, 0.009747 -0.104562 -0.16512, 0.009747 -0.104562 0.165943, + 0.009747 0.108112 -0.164955, 0.009747 0.109121 -0.163945, 0.009747 0.109286 -0.16279, 0.009747 0.108112 -0.164955, + 0.009747 0.109286 -0.16279, 0.009747 0.106958 -0.16512, 0.009747 0.109121 0.164767, 0.009747 0.108743 0.165399, + 0.009747 0.108112 0.165778, 0.009747 0.108112 -0.164955, 0.009747 0.108742 -0.164576, 0.009747 0.109121 -0.163945, + 0.009747 -0.106725 -0.163945, 0.009747 -0.106347 -0.164576, 0.009747 -0.105716 -0.164955, 0.009747 -0.105716 0.165778, + 0.009747 -0.106347 0.165399, 0.009747 -0.106725 0.164767, 0.008363 -0.136073 -0.25355, -0.008882 -0.136073 -0.25355, + -0.008882 0.138469 -0.25355, 0.008363 -0.136073 -0.25355, -0.008882 0.138469 -0.25355, 0.008363 0.138469 -0.25355, + -0.008882 -0.136073 0.254373, 0.008363 -0.136073 0.254373, 0.008363 0.138469 0.254373, -0.008882 -0.136073 0.254373, + 0.008363 0.138469 0.254373, -0.008882 0.138469 0.254373, 0.009763 0.138469 0.252973, 0.009763 -0.136073 0.252973, + 0.009763 -0.136073 0.197681, 0.009763 0.138469 0.252973, 0.009763 -0.136073 0.197681, 0.009763 0.138469 0.197681, + -0.010282 0.138469 0.252973, -0.010282 0.138469 0.197681, -0.010282 -0.136073 0.197681, -0.010282 0.138469 0.252973, + -0.010282 -0.136073 0.197681, -0.010282 -0.136073 0.252973, 0.009763 -0.136073 -0.25215, 0.009763 0.138469 -0.25215, + 0.009763 0.138469 -0.196858, 0.009763 -0.136073 -0.25215, 0.009763 0.138469 -0.196858, 0.009763 -0.136073 -0.196858, + -0.010282 -0.136073 -0.25215, -0.010282 -0.136073 -0.196858, -0.010282 0.138469 -0.196858, -0.010282 -0.136073 -0.25215, + -0.010282 0.138469 -0.196858, -0.010282 0.138469 -0.25215, 0.008363 0.139733 -0.25215, -0.008882 0.139733 -0.25215, + -0.008882 0.139733 -0.196858, 0.008363 0.139733 -0.25215, -0.008882 0.139733 -0.196858, 0.008363 0.139733 -0.196858, + -0.008882 -0.137337 -0.25215, 0.008363 -0.137337 -0.25215, 0.008363 -0.137337 -0.196858, -0.008882 -0.137337 -0.25215, + 0.008363 -0.137337 -0.196858, -0.008882 -0.137337 -0.196858, -0.008882 -0.136073 -0.195593, 0.008363 -0.136073 -0.195593, + 0.008363 0.138469 -0.195593, -0.008882 -0.136073 -0.195593, 0.008363 0.138469 -0.195593, -0.008882 0.138469 -0.195593, + 0.008363 -0.137337 0.252973, -0.008882 -0.137337 0.252973, -0.008882 -0.137337 0.197681, 0.008363 -0.137337 0.252973, + -0.008882 -0.137337 0.197681, 0.008363 -0.137337 0.197681, -0.008882 0.139733 0.252973, 0.008363 0.139733 0.252973, + 0.008363 0.139733 0.197681, -0.008882 0.139733 0.252973, 0.008363 0.139733 0.197681, -0.008882 0.139733 0.197681, + -0.008882 0.138469 0.196416, 0.008363 0.138469 0.196416, 0.008363 -0.136073 0.196416, -0.008882 0.138469 0.196416, + 0.008363 -0.136073 0.196416, -0.008882 -0.136073 0.196416, 0.009763 -0.136073 0.197681, 0.008363 -0.137337 0.197681, + 0.008363 -0.136073 0.196416, 0.008363 -0.136073 -0.195593, 0.008363 -0.137337 -0.196858, 0.009763 -0.136073 -0.196858, + 0.009763 0.138469 -0.196858, 0.008363 0.139733 -0.196858, 0.008363 0.138469 -0.195593, 0.008363 0.138469 0.196416, + 0.008363 0.139733 0.197681, 0.009763 0.138469 0.197681, -0.008882 0.138469 0.196416, -0.010282 0.138469 0.197681, + -0.008882 0.139733 0.197681, -0.008882 0.139733 -0.196858, -0.010282 0.138469 -0.196858, -0.008882 0.138469 -0.195593, + -0.008882 -0.136073 -0.195593, -0.010282 -0.136073 -0.196858, -0.008882 -0.137337 -0.196858, -0.008882 -0.137337 0.197681, + -0.010282 -0.136073 0.197681, -0.008882 -0.136073 0.196416, 0.008363 -0.137337 -0.25215, 0.008363 -0.136073 -0.25355, + 0.009763 -0.136073 -0.25215, 0.009763 0.138469 -0.25215, 0.008363 0.138469 -0.25355, 0.008363 0.139733 -0.25215, + -0.008882 0.139733 -0.25215, -0.008882 0.138469 -0.25355, -0.010282 0.138469 -0.25215, -0.010282 -0.136073 -0.25215, + -0.008882 -0.136073 -0.25355, -0.008882 -0.137337 -0.25215, 0.008363 0.139733 0.252973, 0.008363 0.138469 0.254373, + 0.009763 0.138469 0.252973, 0.009763 -0.136073 0.252973, 0.008363 -0.136073 0.254373, 0.008363 -0.137337 0.252973, + -0.008882 -0.137337 0.252973, -0.008882 -0.136073 0.254373, -0.010282 -0.136073 0.252973, -0.010282 0.138469 0.252973, + -0.008882 0.138469 0.254373, -0.008882 0.139733 0.252973, 0.009763 -0.136073 -0.25215, 0.008363 -0.136073 -0.25355, + 0.008363 0.138469 -0.25355, 0.009763 -0.136073 -0.25215, 0.008363 0.138469 -0.25355, 0.009763 0.138469 -0.25215, + -0.010282 0.138469 -0.25215, -0.008882 0.138469 -0.25355, -0.008882 -0.136073 -0.25355, -0.010282 0.138469 -0.25215, + -0.008882 -0.136073 -0.25355, -0.010282 -0.136073 -0.25215, 0.009763 0.138469 0.252973, 0.008363 0.138469 0.254373, + 0.008363 -0.136073 0.254373, 0.009763 0.138469 0.252973, 0.008363 -0.136073 0.254373, 0.009763 -0.136073 0.252973, + -0.010282 -0.136073 0.252973, -0.008882 -0.136073 0.254373, -0.008882 0.138469 0.254373, -0.010282 -0.136073 0.252973, + -0.008882 0.138469 0.254373, -0.010282 0.138469 0.252973, 0.009763 0.138469 -0.196858, 0.008363 0.138469 -0.195593, + 0.008363 -0.136073 -0.195593, 0.009763 0.138469 -0.196858, 0.008363 -0.136073 -0.195593, 0.009763 -0.136073 -0.196858, + 0.009763 -0.136073 0.197681, 0.008363 -0.136073 0.196416, 0.008363 0.138469 0.196416, 0.009763 -0.136073 0.197681, + 0.008363 0.138469 0.196416, 0.009763 0.138469 0.197681, -0.010282 -0.136073 -0.196858, -0.008882 -0.136073 -0.195593, + -0.008882 0.138469 -0.195593, -0.010282 -0.136073 -0.196858, -0.008882 0.138469 -0.195593, -0.010282 0.138469 -0.196858, + -0.010282 0.138469 0.197681, -0.008882 0.138469 0.196416, -0.008882 -0.136073 0.196416, -0.010282 0.138469 0.197681, + -0.008882 -0.136073 0.196416, -0.010282 -0.136073 0.197681, 0.008363 -0.136073 -0.25355, 0.008363 -0.137337 -0.25215, + -0.008882 -0.137337 -0.25215, 0.008363 -0.136073 -0.25355, -0.008882 -0.137337 -0.25215, -0.008882 -0.136073 -0.25355, + -0.008882 0.138469 -0.25355, -0.008882 0.139733 -0.25215, 0.008363 0.139733 -0.25215, -0.008882 0.138469 -0.25355, + 0.008363 0.139733 -0.25215, 0.008363 0.138469 -0.25355, -0.008882 -0.136073 0.254373, -0.008882 -0.137337 0.252973, + 0.008363 -0.137337 0.252973, -0.008882 -0.136073 0.254373, 0.008363 -0.137337 0.252973, 0.008363 -0.136073 0.254373, + 0.008363 0.138469 0.254373, 0.008363 0.139733 0.252973, -0.008882 0.139733 0.252973, 0.008363 0.138469 0.254373, + -0.008882 0.139733 0.252973, -0.008882 0.138469 0.254373, 0.009763 0.138469 0.197681, 0.008363 0.139733 0.197681, + 0.008363 0.139733 0.252973, 0.009763 0.138469 0.197681, 0.008363 0.139733 0.252973, 0.009763 0.138469 0.252973, + -0.010282 0.138469 0.252973, -0.008882 0.139733 0.252973, -0.008882 0.139733 0.197681, -0.010282 0.138469 0.252973, + -0.008882 0.139733 0.197681, -0.010282 0.138469 0.197681, -0.010282 -0.136073 0.197681, -0.008882 -0.137337 0.197681, + -0.008882 -0.137337 0.252973, -0.010282 -0.136073 0.197681, -0.008882 -0.137337 0.252973, -0.010282 -0.136073 0.252973, + 0.009763 -0.136073 0.252973, 0.008363 -0.137337 0.252973, 0.008363 -0.137337 0.197681, 0.009763 -0.136073 0.252973, + 0.008363 -0.137337 0.197681, 0.009763 -0.136073 0.197681, 0.009763 -0.136073 -0.196858, 0.008363 -0.137337 -0.196858, + 0.008363 -0.137337 -0.25215, 0.009763 -0.136073 -0.196858, 0.008363 -0.137337 -0.25215, 0.009763 -0.136073 -0.25215, + -0.010282 -0.136073 -0.25215, -0.008882 -0.137337 -0.25215, -0.008882 -0.137337 -0.196858, -0.010282 -0.136073 -0.25215, + -0.008882 -0.137337 -0.196858, -0.010282 -0.136073 -0.196858, -0.010282 0.138469 -0.196858, -0.008882 0.139733 -0.196858, + -0.008882 0.139733 -0.25215, -0.010282 0.138469 -0.196858, -0.008882 0.139733 -0.25215, -0.010282 0.138469 -0.25215, + 0.009763 0.138469 -0.25215, 0.008363 0.139733 -0.25215, 0.008363 0.139733 -0.196858, 0.009763 0.138469 -0.25215, + 0.008363 0.139733 -0.196858, 0.009763 0.138469 -0.196858, -0.008882 0.139733 -0.196858, -0.008882 0.138469 -0.195593, + 0.008363 0.138469 -0.195593, -0.008882 0.139733 -0.196858, 0.008363 0.138469 -0.195593, 0.008363 0.139733 -0.196858, + 0.008363 -0.137337 -0.196858, 0.008363 -0.136073 -0.195593, -0.008882 -0.136073 -0.195593, 0.008363 -0.137337 -0.196858, + -0.008882 -0.136073 -0.195593, -0.008882 -0.137337 -0.196858, -0.008882 -0.137337 0.197681, -0.008882 -0.136073 0.196416, + 0.008363 -0.136073 0.196416, -0.008882 -0.137337 0.197681, 0.008363 -0.136073 0.196416, 0.008363 -0.137337 0.197681, + 0.008363 0.139733 0.197681, 0.008363 0.138469 0.196416, -0.008882 0.138469 0.196416, 0.008363 0.139733 0.197681, + -0.008882 0.138469 0.196416, -0.008882 0.139733 0.197681, 0.008363 -0.190111 -0.25215, 0.008363 -0.190111 0.252973, + -0.008882 -0.190111 0.252973, 0.008363 -0.190111 -0.25215, -0.008882 -0.190111 0.252973, -0.008882 -0.190111 -0.25215, + 0.008363 -0.188711 -0.25355, -0.008882 -0.188711 -0.25355, -0.008882 -0.138601 -0.25355, 0.008363 -0.188711 -0.25355, + -0.008882 -0.138601 -0.25355, 0.008363 -0.138601 -0.25355, -0.008882 -0.188711 0.254373, 0.008363 -0.188711 0.254373, + 0.008363 -0.138601 0.254373, -0.008882 -0.188711 0.254373, 0.008363 -0.138601 0.254373, -0.008882 -0.138601 0.254373, + 0.009763 -0.138601 0.252973, 0.009763 -0.188711 0.252973, 0.009763 -0.188711 -0.25215, 0.009763 -0.138601 0.252973, + 0.009763 -0.188711 -0.25215, 0.009763 -0.138601 -0.25215, -0.010282 -0.138601 -0.25215, -0.010282 -0.188711 -0.25215, + -0.010282 -0.188711 0.252973, -0.010282 -0.138601 -0.25215, -0.010282 -0.188711 0.252973, -0.010282 -0.138601 0.252973, + 0.008363 -0.137337 -0.25215, -0.008882 -0.137337 -0.25215, -0.008882 -0.137337 0.252973, 0.008363 -0.137337 -0.25215, + -0.008882 -0.137337 0.252973, 0.008363 -0.137337 0.252973, 0.009763 -0.188711 0.252973, 0.008363 -0.188711 0.254373, + 0.008363 -0.190111 0.252973, 0.008363 -0.190111 -0.25215, 0.008363 -0.188711 -0.25355, 0.009763 -0.188711 -0.25215, + -0.008882 -0.190111 -0.25215, -0.010282 -0.188711 -0.25215, -0.008882 -0.188711 -0.25355, -0.008882 -0.188711 0.254373, + -0.010282 -0.188711 0.252973, -0.008882 -0.190111 0.252973, 0.008363 -0.138601 -0.25355, 0.008363 -0.137337 -0.25215, + 0.009763 -0.138601 -0.25215, -0.010282 -0.138601 -0.25215, -0.008882 -0.137337 -0.25215, -0.008882 -0.138601 -0.25355, + 0.009763 -0.138601 0.252973, 0.008363 -0.137337 0.252973, 0.008363 -0.138601 0.254373, -0.008882 -0.138601 0.254373, + -0.008882 -0.137337 0.252973, -0.010282 -0.138601 0.252973, -0.008882 -0.188711 0.254373, -0.008882 -0.190111 0.252973, + 0.008363 -0.190111 0.252973, -0.008882 -0.188711 0.254373, 0.008363 -0.190111 0.252973, 0.008363 -0.188711 0.254373, + 0.009763 -0.188711 0.252973, 0.008363 -0.190111 0.252973, 0.008363 -0.190111 -0.25215, 0.009763 -0.188711 0.252973, + 0.008363 -0.190111 -0.25215, 0.009763 -0.188711 -0.25215, -0.010282 -0.188711 -0.25215, -0.008882 -0.190111 -0.25215, + -0.008882 -0.190111 0.252973, -0.010282 -0.188711 -0.25215, -0.008882 -0.190111 0.252973, -0.010282 -0.188711 0.252973, + 0.008363 -0.188711 -0.25355, 0.008363 -0.190111 -0.25215, -0.008882 -0.190111 -0.25215, 0.008363 -0.188711 -0.25355, + -0.008882 -0.190111 -0.25215, -0.008882 -0.188711 -0.25355, 0.009763 -0.188711 -0.25215, 0.008363 -0.188711 -0.25355, + 0.008363 -0.138601 -0.25355, 0.009763 -0.188711 -0.25215, 0.008363 -0.138601 -0.25355, 0.009763 -0.138601 -0.25215, + -0.010282 -0.188711 0.252973, -0.008882 -0.188711 0.254373, -0.008882 -0.138601 0.254373, -0.010282 -0.188711 0.252973, + -0.008882 -0.138601 0.254373, -0.010282 -0.138601 0.252973, -0.010282 -0.138601 -0.25215, -0.008882 -0.138601 -0.25355, + -0.008882 -0.188711 -0.25355, -0.010282 -0.138601 -0.25215, -0.008882 -0.188711 -0.25355, -0.010282 -0.188711 -0.25215, + -0.008882 -0.138601 -0.25355, -0.008882 -0.137337 -0.25215, 0.008363 -0.137337 -0.25215, -0.008882 -0.138601 -0.25355, + 0.008363 -0.137337 -0.25215, 0.008363 -0.138601 -0.25355, 0.009763 -0.138601 0.252973, 0.008363 -0.138601 0.254373, + 0.008363 -0.188711 0.254373, 0.009763 -0.138601 0.252973, 0.008363 -0.188711 0.254373, 0.009763 -0.188711 0.252973, + 0.008363 -0.138601 0.254373, 0.008363 -0.137337 0.252973, -0.008882 -0.137337 0.252973, 0.008363 -0.138601 0.254373, + -0.008882 -0.137337 0.252973, -0.008882 -0.138601 0.254373, -0.010282 -0.138601 0.252973, -0.008882 -0.137337 0.252973, + -0.008882 -0.137337 -0.25215, -0.010282 -0.138601 0.252973, -0.008882 -0.137337 -0.25215, -0.010282 -0.138601 -0.25215, + 0.009763 -0.138601 -0.25215, 0.008363 -0.137337 -0.25215, 0.008363 -0.137337 0.252973, 0.009763 -0.138601 -0.25215, + 0.008363 -0.137337 0.252973, 0.009763 -0.138601 0.252973, 0.009763 0.189491 -0.25215, 0.008363 0.189491 -0.25355, + 0.008363 0.190891 -0.25215, -0.008882 0.189491 -0.25355, -0.010282 0.189491 -0.25215, -0.008882 0.190891 -0.25215, + 0.009763 0.140997 -0.25215, 0.008363 0.139733 -0.25215, 0.008363 0.140997 -0.25355, -0.008882 0.140997 -0.25355, + -0.008882 0.139733 -0.25215, -0.010282 0.140997 -0.25215, 0.009763 0.189491 -0.25215, 0.008363 0.190891 -0.25215, + 0.008363 0.190891 -0.188934, 0.009763 0.189491 -0.25215, 0.008363 0.190891 -0.188934, 0.009763 0.189491 -0.188934, + -0.008882 0.190891 -0.25215, -0.010282 0.189491 -0.25215, -0.010282 0.189491 -0.210934, -0.008882 0.190891 -0.25215, + -0.010282 0.189491 -0.210934, -0.008882 0.190891 -0.210934, 0.008363 0.139733 -0.25215, 0.009763 0.140997 -0.25215, + 0.009763 0.140997 -0.188934, 0.008363 0.139733 -0.25215, 0.009763 0.140997 -0.188934, 0.008363 0.139733 -0.188934, + -0.010282 0.140997 -0.25215, -0.008882 0.139733 -0.25215, -0.008882 0.139733 -0.188934, -0.010282 0.140997 -0.25215, + -0.008882 0.139733 -0.188934, -0.010282 0.140997 -0.188934, -0.008882 0.190891 -0.25215, 0.008363 0.190891 -0.25215, + 0.008363 0.189491 -0.25355, -0.008882 0.190891 -0.25215, 0.008363 0.189491 -0.25355, -0.008882 0.189491 -0.25355, + 0.008363 0.140997 -0.25355, 0.008363 0.139733 -0.25215, -0.008882 0.139733 -0.25215, 0.008363 0.140997 -0.25355, + -0.008882 0.139733 -0.25215, -0.008882 0.140997 -0.25355, -0.008882 0.190891 -0.25215, -0.008882 0.190891 -0.210934, + -0.006123 0.190891 -0.210934, -0.008882 0.190891 -0.25215, -0.006123 0.190891 -0.210934, 0.008363 0.190891 -0.25215, + 0.008363 0.139733 -0.188934, -0.008882 0.139733 -0.188934, -0.008882 0.139733 -0.25215, 0.008363 0.139733 -0.188934, + -0.008882 0.139733 -0.25215, 0.008363 0.139733 -0.25215, -0.008882 0.140997 -0.25355, -0.010282 0.140997 -0.25215, + -0.010282 0.189491 -0.25215, -0.008882 0.140997 -0.25355, -0.010282 0.189491 -0.25215, -0.008882 0.189491 -0.25355, + 0.008363 0.189491 -0.25355, 0.009763 0.189491 -0.25215, 0.009763 0.140997 -0.25215, 0.008363 0.189491 -0.25355, + 0.009763 0.140997 -0.25215, 0.008363 0.140997 -0.25355, -0.010282 0.140997 -0.25215, -0.010282 0.184131 -0.210934, + -0.010282 0.189491 -0.210934, -0.010282 0.140997 -0.25215, -0.010282 0.189491 -0.210934, -0.010282 0.189491 -0.25215, + 0.009763 0.189491 -0.188934, 0.009763 0.140997 -0.188934, 0.009763 0.140997 -0.25215, 0.009763 0.189491 -0.188934, + 0.009763 0.140997 -0.25215, 0.009763 0.189491 -0.25215, -0.008882 0.140997 -0.25355, -0.008882 0.189491 -0.25355, + 0.008363 0.189491 -0.25355, -0.008882 0.140997 -0.25355, 0.008363 0.189491 -0.25355, 0.008363 0.140997 -0.25355, + -0.010282 0.184131 -0.188934, -0.006123 0.184131 -0.188934, -0.006123 0.184131 -0.210934, -0.010282 0.184131 -0.188934, + -0.006123 0.184131 -0.210934, -0.010282 0.184131 -0.210934, -0.006123 0.184131 -0.210934, -0.006123 0.184131 -0.188934, + -0.006123 0.190891 -0.188934, -0.006123 0.184131 -0.210934, -0.006123 0.190891 -0.188934, -0.006123 0.190891 -0.210934, + -0.008882 0.190891 -0.188934, -0.010282 0.189491 -0.188934, -0.010282 0.189491 0.189757, -0.008882 0.190891 -0.188934, + -0.010282 0.189491 0.189757, -0.008882 0.190891 0.189757, 0.009763 0.140997 -0.188934, 0.009763 0.140997 0.189757, + 0.008363 0.139733 0.189757, 0.009763 0.140997 -0.188934, 0.008363 0.139733 0.189757, 0.008363 0.139733 -0.188934, + -0.006123 0.190891 -0.188934, -0.008882 0.190891 -0.188934, -0.008882 0.190891 0.189757, -0.006123 0.190891 -0.188934, + -0.008882 0.190891 0.189757, -0.006123 0.190891 0.189757, 0.009763 0.140997 -0.188934, 0.009763 0.189491 -0.188934, + 0.009763 0.189491 0.189757, 0.009763 0.140997 -0.188934, 0.009763 0.189491 0.189757, 0.009763 0.140997 0.189757, + 0.009763 0.189491 0.252973, 0.008363 0.190891 0.252973, 0.008363 0.189491 0.254373, -0.008882 0.189491 0.254373, + -0.008882 0.190891 0.252973, -0.010282 0.189491 0.252973, 0.009763 0.140997 0.252973, 0.008363 0.140997 0.254373, + 0.008363 0.139733 0.252973, -0.008882 0.140997 0.254373, -0.010282 0.140997 0.252973, -0.008882 0.139733 0.252973, + 0.008363 0.190891 0.189757, 0.008363 0.190891 0.252973, 0.009763 0.189491 0.252973, 0.008363 0.190891 0.189757, + 0.009763 0.189491 0.252973, 0.009763 0.189491 0.189757, -0.010282 0.189491 0.211757, -0.010282 0.189491 0.252973, + -0.008882 0.190891 0.252973, -0.010282 0.189491 0.211757, -0.008882 0.190891 0.252973, -0.008882 0.190891 0.211757, + 0.009763 0.140997 0.189757, 0.009763 0.140997 0.252973, 0.008363 0.139733 0.252973, 0.009763 0.140997 0.189757, + 0.008363 0.139733 0.252973, 0.008363 0.139733 0.189757, -0.008882 0.139733 0.189757, -0.008882 0.139733 0.252973, + -0.010282 0.140997 0.252973, -0.008882 0.139733 0.189757, -0.010282 0.140997 0.252973, -0.010282 0.140997 0.189757, + 0.008363 0.189491 0.254373, 0.008363 0.190891 0.252973, -0.008882 0.190891 0.252973, 0.008363 0.189491 0.254373, + -0.008882 0.190891 0.252973, -0.008882 0.189491 0.254373, -0.008882 0.139733 0.252973, 0.008363 0.139733 0.252973, + 0.008363 0.140997 0.254373, -0.008882 0.139733 0.252973, 0.008363 0.140997 0.254373, -0.008882 0.140997 0.254373, + -0.006123 0.190891 0.211757, -0.008882 0.190891 0.211757, -0.008882 0.190891 0.252973, -0.006123 0.190891 0.211757, + -0.008882 0.190891 0.252973, 0.008363 0.190891 0.252973, -0.006123 0.190891 0.211757, 0.008363 0.190891 0.252973, + 0.008363 0.190891 0.189757, -0.006123 0.190891 0.211757, 0.008363 0.190891 0.189757, -0.006123 0.190891 0.189757, + -0.008882 0.139733 0.252973, -0.008882 0.139733 0.189757, 0.008363 0.139733 0.189757, -0.008882 0.139733 0.252973, + 0.008363 0.139733 0.189757, 0.008363 0.139733 0.252973, -0.010282 0.189491 0.252973, -0.010282 0.140997 0.252973, + -0.008882 0.140997 0.254373, -0.010282 0.189491 0.252973, -0.008882 0.140997 0.254373, -0.008882 0.189491 0.254373, + 0.009763 0.140997 0.252973, 0.009763 0.189491 0.252973, 0.008363 0.189491 0.254373, 0.009763 0.140997 0.252973, + 0.008363 0.189491 0.254373, 0.008363 0.140997 0.254373, -0.010282 0.189491 0.211757, -0.010282 0.184131 0.211757, + -0.010282 0.140997 0.252973, -0.010282 0.189491 0.211757, -0.010282 0.140997 0.252973, -0.010282 0.189491 0.252973, + 0.009763 0.140997 0.252973, 0.009763 0.140997 0.189757, 0.009763 0.189491 0.189757, 0.009763 0.140997 0.252973, + 0.009763 0.189491 0.189757, 0.009763 0.189491 0.252973, 0.008363 0.189491 0.254373, -0.008882 0.189491 0.254373, + -0.008882 0.140997 0.254373, 0.008363 0.189491 0.254373, -0.008882 0.140997 0.254373, 0.008363 0.140997 0.254373, + -0.006123 0.184131 0.211757, -0.006123 0.184131 0.189757, -0.010282 0.184131 0.189757, -0.006123 0.184131 0.211757, + -0.010282 0.184131 0.189757, -0.010282 0.184131 0.211757, -0.006123 0.190891 0.189757, -0.006123 0.184131 0.189757, + -0.006123 0.184131 0.211757, -0.006123 0.190891 0.189757, -0.006123 0.184131 0.211757, -0.006123 0.190891 0.211757, + 0.009763 0.189491 -0.188934, 0.008363 0.190891 -0.188934, 0.008363 0.190891 0.189757, 0.009763 0.189491 -0.188934, + 0.008363 0.190891 0.189757, 0.009763 0.189491 0.189757, -0.008882 0.139733 -0.188934, -0.008882 0.139733 0.189757, + -0.010282 0.140997 0.189757, -0.008882 0.139733 -0.188934, -0.010282 0.140997 0.189757, -0.010282 0.140997 -0.188934, + -0.006123 0.190891 -0.188934, -0.006123 0.190891 0.189757, 0.008363 0.190891 0.189757, -0.006123 0.190891 -0.188934, + 0.008363 0.190891 0.189757, 0.008363 0.190891 -0.188934, 0.008363 0.139733 0.189757, -0.008882 0.139733 0.189757, + -0.008882 0.139733 -0.188934, 0.008363 0.139733 0.189757, -0.008882 0.139733 -0.188934, 0.008363 0.139733 -0.188934, + -0.010282 0.184131 -0.188934, -0.010282 0.140997 -0.188934, -0.010282 0.140997 0.189757, -0.010282 0.184131 -0.188934, + -0.010282 0.140997 0.189757, -0.010282 0.184131 0.189757, -0.010282 0.184131 -0.188934, -0.010282 0.184131 0.189757, + -0.010282 0.189491 0.189757, -0.010282 0.184131 -0.188934, -0.010282 0.189491 0.189757, -0.010282 0.189491 -0.188934, + -0.006123 0.190891 -0.210934, -0.006123 0.190891 -0.188934, 0.008363 0.190891 -0.188934, -0.006123 0.190891 -0.210934, + 0.008363 0.190891 -0.188934, 0.008363 0.190891 -0.25215, -0.010282 0.140997 -0.188934, -0.010282 0.184131 -0.188934, + -0.010282 0.184131 -0.210934, -0.010282 0.140997 -0.188934, -0.010282 0.184131 -0.210934, -0.010282 0.140997 -0.25215, + -0.010282 0.184131 0.211757, -0.010282 0.184131 0.189757, -0.010282 0.140997 0.189757, -0.010282 0.184131 0.211757, + -0.010282 0.140997 0.189757, -0.010282 0.140997 0.252973 + ] + } + color Color + { + color + [ + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941 + ] + } + coordIndex + [ + 0,1,2,-1, 3,4,5,-1, 6,7,8,-1, 9,10,11,-1, 12,13,14,-1, 15,16,17,-1, + 18,19,20,-1, 21,22,23,-1, 24,25,26,-1, 27,28,29,-1, 30,31,32,-1, 33,34,35,-1, + 36,37,38,-1, 39,40,41,-1, 42,43,44,-1, 45,46,47,-1, 48,49,50,-1, 51,52,53,-1, + 54,55,56,-1, 57,58,59,-1, 60,61,62,-1, 63,64,65,-1, 66,67,68,-1, 69,70,71,-1, + 72,73,74,-1, 75,76,77,-1, 78,79,80,-1, 81,82,83,-1, 84,85,86,-1, 87,88,89,-1, + 90,91,92,-1, 93,94,95,-1, 96,97,98,-1, 99,100,101,-1, 102,103,104,-1, 105,106,107,-1, + 108,109,110,-1, 111,112,113,-1, 114,115,116,-1, 117,118,119,-1, 120,121,122,-1, 123,124,125,-1, + 126,127,128,-1, 129,130,131,-1, 132,133,134,-1, 135,136,137,-1, 138,139,140,-1, 141,142,143,-1, + 144,145,146,-1, 147,148,149,-1, 150,151,152,-1, 153,154,155,-1, 156,157,158,-1, 159,160,161,-1, + 162,163,164,-1, 165,166,167,-1, 168,169,170,-1, 171,172,173,-1, 174,175,176,-1, 177,178,179,-1, + 180,181,182,-1, 183,184,185,-1, 186,187,188,-1, 189,190,191,-1, 192,193,194,-1, 195,196,197,-1, + 198,199,200,-1, 201,202,203,-1, 204,205,206,-1, 207,208,209,-1, 210,211,212,-1, 213,214,215,-1, + 216,217,218,-1, 219,220,221,-1, 222,223,224,-1, 225,226,227,-1, 228,229,230,-1, 231,232,233,-1, + 234,235,236,-1, 237,238,239,-1, 240,241,242,-1, 243,244,245,-1, 246,247,248,-1, 249,250,251,-1, + 252,253,254,-1, 255,256,257,-1, 258,259,260,-1, 261,262,263,-1, 264,265,266,-1, 267,268,269,-1, + 270,271,272,-1, 273,274,275,-1, 276,277,278,-1, 279,280,281,-1, 282,283,284,-1, 285,286,287,-1, + 288,289,290,-1, 291,292,293,-1, 294,295,296,-1, 297,298,299,-1, 300,301,302,-1, 303,304,305,-1, + 306,307,308,-1, 309,310,311,-1, 312,313,314,-1, 315,316,317,-1, 318,319,320,-1, 321,322,323,-1, + 324,325,326,-1, 327,328,329,-1, 330,331,332,-1, 333,334,335,-1, 336,337,338,-1, 339,340,341,-1, + 342,343,344,-1, 345,346,347,-1, 348,349,350,-1, 351,352,353,-1, 354,355,356,-1, 357,358,359,-1, + 360,361,362,-1, 363,364,365,-1, 366,367,368,-1, 369,370,371,-1, 372,373,374,-1, 375,376,377,-1, + 378,379,380,-1, 381,382,383,-1, 384,385,386,-1, 387,388,389,-1, 390,391,392,-1, 393,394,395,-1, + 396,397,398,-1, 399,400,401,-1, 402,403,404,-1, 405,406,407,-1, 408,409,410,-1, 411,412,413,-1, + 414,415,416,-1, 417,418,419,-1, 420,421,422,-1, 423,424,425,-1, 426,427,428,-1, 429,430,431,-1, + 432,433,434,-1, 435,436,437,-1, 438,439,440,-1, 441,442,443,-1, 444,445,446,-1, 447,448,449,-1, + 450,451,452,-1, 453,454,455,-1, 456,457,458,-1, 459,460,461,-1, 462,463,464,-1, 465,466,467,-1, + 468,469,470,-1, 471,472,473,-1, 474,475,476,-1, 477,478,479,-1, 480,481,482,-1, 483,484,485,-1, + 486,487,488,-1, 489,490,491,-1, 492,493,494,-1, 495,496,497,-1, 498,499,500,-1, 501,502,503,-1, + 504,505,506,-1, 507,508,509,-1, 510,511,512,-1, 513,514,515,-1, 516,517,518,-1, 519,520,521,-1, + 522,523,524,-1, 525,526,527,-1, 528,529,530,-1, 531,532,533,-1, 534,535,536,-1, 537,538,539,-1, + 540,541,542,-1, 543,544,545,-1, 546,547,548,-1, 549,550,551,-1, 552,553,554,-1, 555,556,557,-1, + 558,559,560,-1, 561,562,563,-1, 564,565,566,-1, 567,568,569,-1, 570,571,572,-1, 573,574,575,-1, + 576,577,578,-1, 579,580,581,-1, 582,583,584,-1, 585,586,587,-1, 588,589,590,-1, 591,592,593,-1, + 594,595,596,-1, 597,598,599,-1, 600,601,602,-1, 603,604,605,-1, 606,607,608,-1, 609,610,611,-1, + 612,613,614,-1, 615,616,617,-1, 618,619,620,-1, 621,622,623,-1, 624,625,626,-1, 627,628,629,-1, + 630,631,632,-1, 633,634,635,-1, 636,637,638,-1, 639,640,641,-1, 642,643,644,-1, 645,646,647,-1, + 648,649,650,-1, 651,652,653,-1, 654,655,656,-1, 657,658,659,-1, 660,661,662,-1, 663,664,665,-1, + 666,667,668,-1, 669,670,671,-1, 672,673,674,-1, 675,676,677,-1, 678,679,680,-1, 681,682,683,-1, + 684,685,686,-1, 687,688,689,-1, 690,691,692,-1, 693,694,695,-1, 696,697,698,-1, 699,700,701,-1, + 702,703,704,-1, 705,706,707,-1, 708,709,710,-1, 711,712,713,-1, 714,715,716,-1, 717,718,719,-1, + 720,721,722,-1, 723,724,725,-1, 726,727,728,-1, 729,730,731,-1, 732,733,734,-1, 735,736,737,-1, + 738,739,740,-1, 741,742,743,-1, 744,745,746,-1, 747,748,749,-1, 750,751,752,-1, 753,754,755,-1, + 756,757,758,-1, 759,760,761,-1, 762,763,764,-1, 765,766,767,-1, 768,769,770,-1, 771,772,773,-1, + 774,775,776,-1, 777,778,779,-1, 780,781,782,-1, 783,784,785,-1, 786,787,788,-1, 789,790,791,-1, + 792,793,794,-1, 795,796,797,-1, 798,799,800,-1, 801,802,803,-1, 804,805,806,-1, 807,808,809,-1, + 810,811,812,-1, 813,814,815,-1, 816,817,818,-1, 819,820,821,-1, 822,823,824,-1, 825,826,827,-1, + 828,829,830,-1, 831,832,833,-1, 834,835,836,-1, 837,838,839,-1, 840,841,842,-1, 843,844,845,-1, + 846,847,848,-1, 849,850,851,-1, 852,853,854,-1, 855,856,857,-1, 858,859,860,-1, 861,862,863,-1, + 864,865,866,-1, 867,868,869,-1, 870,871,872,-1, 873,874,875,-1, 876,877,878,-1, 879,880,881,-1, + 882,883,884,-1, 885,886,887,-1, 888,889,890,-1, 891,892,893,-1, 894,895,896,-1, 897,898,899,-1, + 900,901,902,-1, 903,904,905,-1, 906,907,908,-1, 909,910,911,-1, 912,913,914,-1, 915,916,917,-1, + 918,919,920,-1, 921,922,923,-1, 924,925,926,-1, 927,928,929,-1, 930,931,932,-1, 933,934,935,-1, + 936,937,938,-1, 939,940,941,-1, 942,943,944,-1, 945,946,947,-1, 948,949,950,-1, 951,952,953,-1, + 954,955,956,-1, 957,958,959,-1, 960,961,962,-1, 963,964,965,-1, 966,967,968,-1, 969,970,971,-1, + 972,973,974,-1, 975,976,977,-1, 978,979,980,-1, 981,982,983,-1, 984,985,986,-1, 987,988,989,-1, + 990,991,992,-1, 993,994,995,-1, 996,997,998,-1, 999,1000,1001,-1, 1002,1003,1004,-1, 1005,1006,1007,-1, + 1008,1009,1010,-1, 1011,1012,1013,-1, 1014,1015,1016,-1, 1017,1018,1019,-1, 1020,1021,1022,-1, 1023,1024,1025,-1 + ] + } + appearance Appearance + { + material Material + { + ambientIntensity 0.2 + diffuseColor 0.9 0.9 0.9 + specularColor .1 .1 .1 + shininess .5 + } + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right_nob.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right_nob.obj new file mode 100755 index 0000000..e8a6532 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right_nob.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4239c6d85ae9b8ecf3532a1eb820c45621f19218ea71a13c5f71893a0b6bfd1a +size 43485 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right_nob.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right_nob.wrl new file mode 100755 index 0000000..4fd11a5 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/door_right_nob.wrl @@ -0,0 +1,378 @@ +#VRML V2.0 utf8 + +# Generated by VCGLIB, (C)Copyright 1999-2001 VCG, IEI-CNR + +NavigationInfo { + type [ "EXAMINE", "ANY" ] +} +Transform { + scale 1 1 1 + translation 0 0 0 + children + [ + Shape + { + geometry IndexedFaceSet + { + creaseAngle .5 + solid FALSE + coord Coordinate + { + point + [ + 0.010357 -0.17738 0.185066, 0.016228 -0.17738 0.185066, 0.016228 -0.176759 0.18859, 0.010357 -0.17738 0.185066, + 0.016228 -0.176759 0.18859, 0.010357 -0.176759 0.18859, 0.010357 -0.176759 0.18859, 0.016228 -0.176759 0.18859, + 0.016228 -0.17497 0.191689, 0.010357 -0.176759 0.18859, 0.016228 -0.17497 0.191689, 0.010357 -0.17497 0.191689, + 0.010357 -0.17497 0.191689, 0.016228 -0.17497 0.191689, 0.016228 -0.172229 0.193989, 0.010357 -0.17497 0.191689, + 0.016228 -0.172229 0.193989, 0.010357 -0.172229 0.193989, 0.010357 -0.172229 0.193989, 0.016228 -0.172229 0.193989, + 0.016228 -0.168866 0.195213, 0.010357 -0.172229 0.193989, 0.016228 -0.168866 0.195213, 0.010357 -0.168866 0.195213, + 0.010357 -0.168866 0.195213, 0.016228 -0.168866 0.195213, 0.016228 -0.165288 0.195213, 0.010357 -0.168866 0.195213, + 0.016228 -0.165288 0.195213, 0.010357 -0.165288 0.195213, 0.010357 -0.165288 0.195213, 0.016228 -0.165288 0.195213, + 0.016228 -0.161925 0.193989, 0.010357 -0.165288 0.195213, 0.016228 -0.161925 0.193989, 0.010357 -0.161925 0.193989, + 0.010357 -0.161925 0.193989, 0.016228 -0.161925 0.193989, 0.016228 -0.159184 0.191689, 0.010357 -0.161925 0.193989, + 0.016228 -0.159184 0.191689, 0.010357 -0.159184 0.191689, 0.010357 -0.159184 0.191689, 0.016228 -0.159184 0.191689, + 0.016228 -0.157395 0.18859, 0.010357 -0.159184 0.191689, 0.016228 -0.157395 0.18859, 0.010357 -0.157395 0.18859, + 0.010357 -0.157395 0.18859, 0.016228 -0.157395 0.18859, 0.016228 -0.156774 0.185066, 0.010357 -0.157395 0.18859, + 0.016228 -0.156774 0.185066, 0.010357 -0.156774 0.185066, 0.010357 -0.156774 0.185066, 0.016228 -0.156774 0.185066, + 0.016228 -0.157395 0.181542, 0.010357 -0.156774 0.185066, 0.016228 -0.157395 0.181542, 0.010357 -0.157395 0.181542, + 0.010357 -0.157395 0.181542, 0.016228 -0.157395 0.181542, 0.016228 -0.159184 0.178443, 0.010357 -0.157395 0.181542, + 0.016228 -0.159184 0.178443, 0.010357 -0.159184 0.178443, 0.010357 -0.159184 0.178443, 0.016228 -0.159184 0.178443, + 0.016228 -0.161925 0.176143, 0.010357 -0.159184 0.178443, 0.016228 -0.161925 0.176143, 0.010357 -0.161925 0.176143, + 0.010357 -0.161925 0.176143, 0.016228 -0.161925 0.176143, 0.016228 -0.165288 0.17492, 0.010357 -0.161925 0.176143, + 0.016228 -0.165288 0.17492, 0.010357 -0.165288 0.17492, 0.010357 -0.165288 0.17492, 0.016228 -0.165288 0.17492, + 0.016228 -0.168866 0.17492, 0.010357 -0.165288 0.17492, 0.016228 -0.168866 0.17492, 0.010357 -0.168866 0.17492, + 0.010357 -0.168866 0.17492, 0.016228 -0.168866 0.17492, 0.016228 -0.172229 0.176143, 0.010357 -0.168866 0.17492, + 0.016228 -0.172229 0.176143, 0.010357 -0.172229 0.176143, 0.010357 -0.172229 0.176143, 0.016228 -0.172229 0.176143, + 0.016228 -0.17497 0.178443, 0.010357 -0.172229 0.176143, 0.016228 -0.17497 0.178443, 0.010357 -0.17497 0.178443, + 0.010357 -0.17497 0.178443, 0.016228 -0.17497 0.178443, 0.016228 -0.176759 0.181542, 0.010357 -0.17497 0.178443, + 0.016228 -0.176759 0.181542, 0.010357 -0.176759 0.181542, 0.010357 -0.176759 0.181542, 0.016228 -0.176759 0.181542, + 0.016228 -0.17738 0.185066, 0.010357 -0.176759 0.181542, 0.016228 -0.17738 0.185066, 0.010357 -0.17738 0.185066, + 0.02116 -0.178557 0.185066, 0.02116 -0.177864 0.188992, 0.016228 -0.176759 0.18859, 0.02116 -0.178557 0.185066, + 0.016228 -0.176759 0.18859, 0.016228 -0.17738 0.185066, 0.02116 -0.177864 0.188992, 0.02116 -0.175871 0.192445, + 0.016228 -0.17497 0.191689, 0.02116 -0.177864 0.188992, 0.016228 -0.17497 0.191689, 0.016228 -0.176759 0.18859, + 0.02116 -0.175871 0.192445, 0.02116 -0.172817 0.195008, 0.016228 -0.172229 0.193989, 0.02116 -0.175871 0.192445, + 0.016228 -0.172229 0.193989, 0.016228 -0.17497 0.191689, 0.02116 -0.172817 0.195008, 0.02116 -0.16907 0.196371, + 0.016228 -0.168866 0.195213, 0.02116 -0.172817 0.195008, 0.016228 -0.168866 0.195213, 0.016228 -0.172229 0.193989, + 0.02116 -0.16907 0.196371, 0.02116 -0.165084 0.196371, 0.016228 -0.165288 0.195213, 0.02116 -0.16907 0.196371, + 0.016228 -0.165288 0.195213, 0.016228 -0.168866 0.195213, 0.02116 -0.165084 0.196371, 0.02116 -0.161337 0.195008, + 0.016228 -0.161925 0.193989, 0.02116 -0.165084 0.196371, 0.016228 -0.161925 0.193989, 0.016228 -0.165288 0.195213, + 0.02116 -0.161337 0.195008, 0.02116 -0.158283 0.192445, 0.016228 -0.159184 0.191689, 0.02116 -0.161337 0.195008, + 0.016228 -0.159184 0.191689, 0.016228 -0.161925 0.193989, 0.02116 -0.158283 0.192445, 0.02116 -0.15629 0.188992, + 0.016228 -0.157395 0.18859, 0.02116 -0.158283 0.192445, 0.016228 -0.157395 0.18859, 0.016228 -0.159184 0.191689, + 0.02116 -0.15629 0.188992, 0.02116 -0.155597 0.185066, 0.016228 -0.156774 0.185066, 0.02116 -0.15629 0.188992, + 0.016228 -0.156774 0.185066, 0.016228 -0.157395 0.18859, 0.02116 -0.155597 0.185066, 0.02116 -0.15629 0.18114, + 0.016228 -0.157395 0.181542, 0.02116 -0.155597 0.185066, 0.016228 -0.157395 0.181542, 0.016228 -0.156774 0.185066, + 0.02116 -0.15629 0.18114, 0.02116 -0.158283 0.177687, 0.016228 -0.159184 0.178443, 0.02116 -0.15629 0.18114, + 0.016228 -0.159184 0.178443, 0.016228 -0.157395 0.181542, 0.02116 -0.158283 0.177687, 0.02116 -0.161337 0.175124, + 0.016228 -0.161925 0.176143, 0.02116 -0.158283 0.177687, 0.016228 -0.161925 0.176143, 0.016228 -0.159184 0.178443, + 0.02116 -0.161337 0.175124, 0.02116 -0.165084 0.173761, 0.016228 -0.165288 0.17492, 0.02116 -0.161337 0.175124, + 0.016228 -0.165288 0.17492, 0.016228 -0.161925 0.176143, 0.02116 -0.165084 0.173761, 0.02116 -0.16907 0.173761, + 0.016228 -0.168866 0.17492, 0.02116 -0.165084 0.173761, 0.016228 -0.168866 0.17492, 0.016228 -0.165288 0.17492, + 0.02116 -0.16907 0.173761, 0.02116 -0.172817 0.175124, 0.016228 -0.172229 0.176143, 0.02116 -0.16907 0.173761, + 0.016228 -0.172229 0.176143, 0.016228 -0.168866 0.17492, 0.02116 -0.172817 0.175124, 0.02116 -0.175871 0.177687, + 0.016228 -0.17497 0.178443, 0.02116 -0.172817 0.175124, 0.016228 -0.17497 0.178443, 0.016228 -0.172229 0.176143, + 0.02116 -0.175871 0.177687, 0.02116 -0.177864 0.18114, 0.016228 -0.176759 0.181542, 0.02116 -0.175871 0.177687, + 0.016228 -0.176759 0.181542, 0.016228 -0.17497 0.178443, 0.02116 -0.177864 0.18114, 0.02116 -0.178557 0.185066, + 0.016228 -0.17738 0.185066, 0.02116 -0.177864 0.18114, 0.016228 -0.17738 0.185066, 0.016228 -0.176759 0.181542, + 0.026091 -0.181955 0.185066, 0.036068 -0.181955 0.185066, 0.036068 -0.181057 0.190155, 0.026091 -0.181955 0.185066, + 0.036068 -0.181057 0.190155, 0.026091 -0.181057 0.190155, 0.026091 -0.181057 0.190155, 0.036068 -0.181057 0.190155, + 0.036068 -0.178474 0.194629, 0.026091 -0.181057 0.190155, 0.036068 -0.178474 0.194629, 0.026091 -0.178474 0.194629, + 0.026091 -0.178474 0.194629, 0.036068 -0.178474 0.194629, 0.036068 -0.174516 0.19795, 0.026091 -0.178474 0.194629, + 0.036068 -0.174516 0.19795, 0.026091 -0.174516 0.19795, 0.026091 -0.174516 0.19795, 0.036068 -0.174516 0.19795, + 0.036068 -0.16966 0.199718, 0.026091 -0.174516 0.19795, 0.036068 -0.16966 0.199718, 0.026091 -0.16966 0.199718, + 0.026091 -0.16966 0.199718, 0.036068 -0.16966 0.199718, 0.036068 -0.164494 0.199718, 0.026091 -0.16966 0.199718, + 0.036068 -0.164494 0.199718, 0.026091 -0.164494 0.199718, 0.026091 -0.164494 0.199718, 0.036068 -0.164494 0.199718, + 0.036068 -0.159638 0.19795, 0.026091 -0.164494 0.199718, 0.036068 -0.159638 0.19795, 0.026091 -0.159638 0.19795, + 0.026091 -0.159638 0.19795, 0.036068 -0.159638 0.19795, 0.036068 -0.15568 0.194629, 0.026091 -0.159638 0.19795, + 0.036068 -0.15568 0.194629, 0.026091 -0.15568 0.194629, 0.026091 -0.15568 0.194629, 0.036068 -0.15568 0.194629, + 0.036068 -0.153097 0.190155, 0.026091 -0.15568 0.194629, 0.036068 -0.153097 0.190155, 0.026091 -0.153097 0.190155, + 0.026091 -0.153097 0.190155, 0.036068 -0.153097 0.190155, 0.036068 -0.1522 0.185066, 0.026091 -0.153097 0.190155, + 0.036068 -0.1522 0.185066, 0.026091 -0.1522 0.185066, 0.026091 -0.1522 0.185066, 0.036068 -0.1522 0.185066, + 0.036068 -0.153097 0.179978, 0.026091 -0.1522 0.185066, 0.036068 -0.153097 0.179978, 0.026091 -0.153097 0.179978, + 0.026091 -0.153097 0.179978, 0.036068 -0.153097 0.179978, 0.036068 -0.15568 0.175503, 0.026091 -0.153097 0.179978, + 0.036068 -0.15568 0.175503, 0.026091 -0.15568 0.175503, 0.026091 -0.15568 0.175503, 0.036068 -0.15568 0.175503, + 0.036068 -0.159638 0.172182, 0.026091 -0.15568 0.175503, 0.036068 -0.159638 0.172182, 0.026091 -0.159638 0.172182, + 0.026091 -0.159638 0.172182, 0.036068 -0.159638 0.172182, 0.036068 -0.164494 0.170415, 0.026091 -0.159638 0.172182, + 0.036068 -0.164494 0.170415, 0.026091 -0.164494 0.170415, 0.026091 -0.164494 0.170415, 0.036068 -0.164494 0.170415, + 0.036068 -0.16966 0.170415, 0.026091 -0.164494 0.170415, 0.036068 -0.16966 0.170415, 0.026091 -0.16966 0.170415, + 0.026091 -0.16966 0.170415, 0.036068 -0.16966 0.170415, 0.036068 -0.174516 0.172182, 0.026091 -0.16966 0.170415, + 0.036068 -0.174516 0.172182, 0.026091 -0.174516 0.172182, 0.026091 -0.174516 0.172182, 0.036068 -0.174516 0.172182, + 0.036068 -0.178474 0.175503, 0.026091 -0.174516 0.172182, 0.036068 -0.178474 0.175503, 0.026091 -0.178474 0.175503, + 0.026091 -0.178474 0.175503, 0.036068 -0.178474 0.175503, 0.036068 -0.181057 0.179978, 0.026091 -0.178474 0.175503, + 0.036068 -0.181057 0.179978, 0.026091 -0.181057 0.179978, 0.026091 -0.181057 0.179978, 0.036068 -0.181057 0.179978, + 0.036068 -0.181955 0.185066, 0.026091 -0.181057 0.179978, 0.036068 -0.181955 0.185066, 0.026091 -0.181955 0.185066, + 0.036068 -0.181057 0.190155, 0.036068 -0.181955 0.185066, 0.036854 -0.181388 0.185066, 0.036068 -0.181057 0.190155, + 0.036854 -0.181388 0.185066, 0.036854 -0.180525 0.189961, 0.036068 -0.178474 0.194629, 0.036068 -0.181057 0.190155, + 0.036854 -0.180525 0.189961, 0.036068 -0.178474 0.194629, 0.036854 -0.180525 0.189961, 0.036854 -0.17804 0.194265, + 0.036068 -0.174516 0.19795, 0.036068 -0.178474 0.194629, 0.036854 -0.17804 0.194265, 0.036068 -0.174516 0.19795, + 0.036854 -0.17804 0.194265, 0.036854 -0.174233 0.19746, 0.036068 -0.16966 0.199718, 0.036068 -0.174516 0.19795, + 0.036854 -0.174233 0.19746, 0.036068 -0.16966 0.199718, 0.036854 -0.174233 0.19746, 0.036854 -0.169562 0.19916, + 0.036068 -0.164494 0.199718, 0.036068 -0.16966 0.199718, 0.036854 -0.169562 0.19916, 0.036068 -0.164494 0.199718, + 0.036854 -0.169562 0.19916, 0.036854 -0.164592 0.19916, 0.036068 -0.159638 0.19795, 0.036068 -0.164494 0.199718, + 0.036854 -0.164592 0.19916, 0.036068 -0.159638 0.19795, 0.036854 -0.164592 0.19916, 0.036854 -0.159921 0.19746, + 0.036068 -0.15568 0.194629, 0.036068 -0.159638 0.19795, 0.036854 -0.159921 0.19746, 0.036068 -0.15568 0.194629, + 0.036854 -0.159921 0.19746, 0.036854 -0.156114 0.194265, 0.036068 -0.153097 0.190155, 0.036068 -0.15568 0.194629, + 0.036854 -0.156114 0.194265, 0.036068 -0.153097 0.190155, 0.036854 -0.156114 0.194265, 0.036854 -0.153629 0.189961, + 0.036068 -0.1522 0.185066, 0.036068 -0.153097 0.190155, 0.036854 -0.153629 0.189961, 0.036068 -0.1522 0.185066, + 0.036854 -0.153629 0.189961, 0.036854 -0.152766 0.185066, 0.036068 -0.153097 0.179978, 0.036068 -0.1522 0.185066, + 0.036854 -0.152766 0.185066, 0.036068 -0.153097 0.179978, 0.036854 -0.152766 0.185066, 0.036854 -0.153629 0.180172, + 0.036068 -0.15568 0.175503, 0.036068 -0.153097 0.179978, 0.036854 -0.153629 0.180172, 0.036068 -0.15568 0.175503, + 0.036854 -0.153629 0.180172, 0.036854 -0.156114 0.175867, 0.036068 -0.159638 0.172182, 0.036068 -0.15568 0.175503, + 0.036854 -0.156114 0.175867, 0.036068 -0.159638 0.172182, 0.036854 -0.156114 0.175867, 0.036854 -0.159921 0.172672, + 0.036068 -0.164494 0.170415, 0.036068 -0.159638 0.172182, 0.036854 -0.159921 0.172672, 0.036068 -0.164494 0.170415, + 0.036854 -0.159921 0.172672, 0.036854 -0.164592 0.170973, 0.036068 -0.16966 0.170415, 0.036068 -0.164494 0.170415, + 0.036854 -0.164592 0.170973, 0.036068 -0.16966 0.170415, 0.036854 -0.164592 0.170973, 0.036854 -0.169562 0.170973, + 0.036068 -0.174516 0.172182, 0.036068 -0.16966 0.170415, 0.036854 -0.169562 0.170973, 0.036068 -0.174516 0.172182, + 0.036854 -0.169562 0.170973, 0.036854 -0.174233 0.172672, 0.036068 -0.178474 0.175503, 0.036068 -0.174516 0.172182, + 0.036854 -0.174233 0.172672, 0.036068 -0.178474 0.175503, 0.036854 -0.174233 0.172672, 0.036854 -0.17804 0.175867, + 0.036068 -0.181057 0.179978, 0.036068 -0.178474 0.175503, 0.036854 -0.17804 0.175867, 0.036068 -0.181057 0.179978, + 0.036854 -0.17804 0.175867, 0.036854 -0.180525 0.180172, 0.036068 -0.181955 0.185066, 0.036068 -0.181057 0.179978, + 0.036854 -0.180525 0.180172, 0.036068 -0.181955 0.185066, 0.036854 -0.180525 0.180172, 0.036854 -0.181388 0.185066, + 0.036854 -0.181388 0.185066, 0.036854 -0.167077 0.185066, 0.036854 -0.180525 0.189961, 0.036854 -0.180525 0.189961, + 0.036854 -0.167077 0.185066, 0.036854 -0.17804 0.194265, 0.036854 -0.17804 0.194265, 0.036854 -0.167077 0.185066, + 0.036854 -0.174233 0.19746, 0.036854 -0.174233 0.19746, 0.036854 -0.167077 0.185066, 0.036854 -0.169562 0.19916, + 0.036854 -0.169562 0.19916, 0.036854 -0.167077 0.185066, 0.036854 -0.164592 0.19916, 0.036854 -0.164592 0.19916, + 0.036854 -0.167077 0.185066, 0.036854 -0.159921 0.19746, 0.036854 -0.159921 0.19746, 0.036854 -0.167077 0.185066, + 0.036854 -0.156114 0.194265, 0.036854 -0.156114 0.194265, 0.036854 -0.167077 0.185066, 0.036854 -0.153629 0.189961, + 0.036854 -0.153629 0.189961, 0.036854 -0.167077 0.185066, 0.036854 -0.152766 0.185066, 0.036854 -0.152766 0.185066, + 0.036854 -0.167077 0.185066, 0.036854 -0.153629 0.180172, 0.036854 -0.153629 0.180172, 0.036854 -0.167077 0.185066, + 0.036854 -0.156114 0.175867, 0.036854 -0.156114 0.175867, 0.036854 -0.167077 0.185066, 0.036854 -0.159921 0.172672, + 0.036854 -0.159921 0.172672, 0.036854 -0.167077 0.185066, 0.036854 -0.164592 0.170973, 0.036854 -0.164592 0.170973, + 0.036854 -0.167077 0.185066, 0.036854 -0.169562 0.170973, 0.036854 -0.169562 0.170973, 0.036854 -0.167077 0.185066, + 0.036854 -0.174233 0.172672, 0.036854 -0.174233 0.172672, 0.036854 -0.167077 0.185066, 0.036854 -0.17804 0.175867, + 0.036854 -0.17804 0.175867, 0.036854 -0.167077 0.185066, 0.036854 -0.180525 0.180172, 0.036854 -0.180525 0.180172, + 0.036854 -0.167077 0.185066, 0.036854 -0.181388 0.185066, 0.02116 -0.178557 0.185066, 0.026091 -0.181955 0.185066, + 0.026091 -0.181057 0.190155, 0.02116 -0.178557 0.185066, 0.026091 -0.181057 0.190155, 0.02116 -0.177864 0.188992, + 0.02116 -0.177864 0.188992, 0.026091 -0.181057 0.190155, 0.026091 -0.178474 0.194629, 0.02116 -0.177864 0.188992, + 0.026091 -0.178474 0.194629, 0.02116 -0.175871 0.192445, 0.02116 -0.175871 0.192445, 0.026091 -0.178474 0.194629, + 0.026091 -0.174516 0.19795, 0.02116 -0.175871 0.192445, 0.026091 -0.174516 0.19795, 0.02116 -0.172817 0.195008, + 0.02116 -0.172817 0.195008, 0.026091 -0.174516 0.19795, 0.026091 -0.16966 0.199718, 0.02116 -0.172817 0.195008, + 0.026091 -0.16966 0.199718, 0.02116 -0.16907 0.196371, 0.02116 -0.16907 0.196371, 0.026091 -0.16966 0.199718, + 0.026091 -0.164494 0.199718, 0.02116 -0.16907 0.196371, 0.026091 -0.164494 0.199718, 0.02116 -0.165084 0.196371, + 0.02116 -0.165084 0.196371, 0.026091 -0.164494 0.199718, 0.026091 -0.159638 0.19795, 0.02116 -0.165084 0.196371, + 0.026091 -0.159638 0.19795, 0.02116 -0.161337 0.195008, 0.02116 -0.161337 0.195008, 0.026091 -0.159638 0.19795, + 0.026091 -0.15568 0.194629, 0.02116 -0.161337 0.195008, 0.026091 -0.15568 0.194629, 0.02116 -0.158283 0.192445, + 0.02116 -0.158283 0.192445, 0.026091 -0.15568 0.194629, 0.026091 -0.153097 0.190155, 0.02116 -0.158283 0.192445, + 0.026091 -0.153097 0.190155, 0.02116 -0.15629 0.188992, 0.02116 -0.15629 0.188992, 0.026091 -0.153097 0.190155, + 0.026091 -0.1522 0.185066, 0.02116 -0.15629 0.188992, 0.026091 -0.1522 0.185066, 0.02116 -0.155597 0.185066, + 0.02116 -0.155597 0.185066, 0.026091 -0.1522 0.185066, 0.026091 -0.153097 0.179978, 0.02116 -0.155597 0.185066, + 0.026091 -0.153097 0.179978, 0.02116 -0.15629 0.18114, 0.02116 -0.15629 0.18114, 0.026091 -0.153097 0.179978, + 0.026091 -0.15568 0.175503, 0.02116 -0.15629 0.18114, 0.026091 -0.15568 0.175503, 0.02116 -0.158283 0.177687, + 0.02116 -0.158283 0.177687, 0.026091 -0.15568 0.175503, 0.026091 -0.159638 0.172182, 0.02116 -0.158283 0.177687, + 0.026091 -0.159638 0.172182, 0.02116 -0.161337 0.175124, 0.02116 -0.161337 0.175124, 0.026091 -0.159638 0.172182, + 0.026091 -0.164494 0.170415, 0.02116 -0.161337 0.175124, 0.026091 -0.164494 0.170415, 0.02116 -0.165084 0.173761, + 0.02116 -0.165084 0.173761, 0.026091 -0.164494 0.170415, 0.026091 -0.16966 0.170415, 0.02116 -0.165084 0.173761, + 0.026091 -0.16966 0.170415, 0.02116 -0.16907 0.173761, 0.02116 -0.16907 0.173761, 0.026091 -0.16966 0.170415, + 0.026091 -0.174516 0.172182, 0.02116 -0.16907 0.173761, 0.026091 -0.174516 0.172182, 0.02116 -0.172817 0.175124, + 0.02116 -0.172817 0.175124, 0.026091 -0.174516 0.172182, 0.026091 -0.178474 0.175503, 0.02116 -0.172817 0.175124, + 0.026091 -0.178474 0.175503, 0.02116 -0.175871 0.177687, 0.02116 -0.175871 0.177687, 0.026091 -0.178474 0.175503, + 0.026091 -0.181057 0.179978, 0.02116 -0.175871 0.177687, 0.026091 -0.181057 0.179978, 0.02116 -0.177864 0.18114, + 0.02116 -0.177864 0.18114, 0.026091 -0.181057 0.179978, 0.026091 -0.181955 0.185066, 0.02116 -0.177864 0.18114, + 0.026091 -0.181955 0.185066, 0.02116 -0.178557 0.185066 + ] + } + color Color + { + color + [ + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941 + ] + } + coordIndex + [ + 0,1,2,-1, 3,4,5,-1, 6,7,8,-1, 9,10,11,-1, 12,13,14,-1, 15,16,17,-1, + 18,19,20,-1, 21,22,23,-1, 24,25,26,-1, 27,28,29,-1, 30,31,32,-1, 33,34,35,-1, + 36,37,38,-1, 39,40,41,-1, 42,43,44,-1, 45,46,47,-1, 48,49,50,-1, 51,52,53,-1, + 54,55,56,-1, 57,58,59,-1, 60,61,62,-1, 63,64,65,-1, 66,67,68,-1, 69,70,71,-1, + 72,73,74,-1, 75,76,77,-1, 78,79,80,-1, 81,82,83,-1, 84,85,86,-1, 87,88,89,-1, + 90,91,92,-1, 93,94,95,-1, 96,97,98,-1, 99,100,101,-1, 102,103,104,-1, 105,106,107,-1, + 108,109,110,-1, 111,112,113,-1, 114,115,116,-1, 117,118,119,-1, 120,121,122,-1, 123,124,125,-1, + 126,127,128,-1, 129,130,131,-1, 132,133,134,-1, 135,136,137,-1, 138,139,140,-1, 141,142,143,-1, + 144,145,146,-1, 147,148,149,-1, 150,151,152,-1, 153,154,155,-1, 156,157,158,-1, 159,160,161,-1, + 162,163,164,-1, 165,166,167,-1, 168,169,170,-1, 171,172,173,-1, 174,175,176,-1, 177,178,179,-1, + 180,181,182,-1, 183,184,185,-1, 186,187,188,-1, 189,190,191,-1, 192,193,194,-1, 195,196,197,-1, + 198,199,200,-1, 201,202,203,-1, 204,205,206,-1, 207,208,209,-1, 210,211,212,-1, 213,214,215,-1, + 216,217,218,-1, 219,220,221,-1, 222,223,224,-1, 225,226,227,-1, 228,229,230,-1, 231,232,233,-1, + 234,235,236,-1, 237,238,239,-1, 240,241,242,-1, 243,244,245,-1, 246,247,248,-1, 249,250,251,-1, + 252,253,254,-1, 255,256,257,-1, 258,259,260,-1, 261,262,263,-1, 264,265,266,-1, 267,268,269,-1, + 270,271,272,-1, 273,274,275,-1, 276,277,278,-1, 279,280,281,-1, 282,283,284,-1, 285,286,287,-1, + 288,289,290,-1, 291,292,293,-1, 294,295,296,-1, 297,298,299,-1, 300,301,302,-1, 303,304,305,-1, + 306,307,308,-1, 309,310,311,-1, 312,313,314,-1, 315,316,317,-1, 318,319,320,-1, 321,322,323,-1, + 324,325,326,-1, 327,328,329,-1, 330,331,332,-1, 333,334,335,-1, 336,337,338,-1, 339,340,341,-1, + 342,343,344,-1, 345,346,347,-1, 348,349,350,-1, 351,352,353,-1, 354,355,356,-1, 357,358,359,-1, + 360,361,362,-1, 363,364,365,-1, 366,367,368,-1, 369,370,371,-1, 372,373,374,-1, 375,376,377,-1, + 378,379,380,-1, 381,382,383,-1, 384,385,386,-1, 387,388,389,-1, 390,391,392,-1, 393,394,395,-1, + 396,397,398,-1, 399,400,401,-1, 402,403,404,-1, 405,406,407,-1, 408,409,410,-1, 411,412,413,-1, + 414,415,416,-1, 417,418,419,-1, 420,421,422,-1, 423,424,425,-1, 426,427,428,-1, 429,430,431,-1, + 432,433,434,-1, 435,436,437,-1, 438,439,440,-1, 441,442,443,-1, 444,445,446,-1, 447,448,449,-1, + 450,451,452,-1, 453,454,455,-1, 456,457,458,-1, 459,460,461,-1, 462,463,464,-1, 465,466,467,-1, + 468,469,470,-1, 471,472,473,-1, 474,475,476,-1, 477,478,479,-1, 480,481,482,-1, 483,484,485,-1, + 486,487,488,-1, 489,490,491,-1, 492,493,494,-1, 495,496,497,-1, 498,499,500,-1, 501,502,503,-1, + 504,505,506,-1, 507,508,509,-1, 510,511,512,-1, 513,514,515,-1, 516,517,518,-1, 519,520,521,-1, + 522,523,524,-1, 525,526,527,-1, 528,529,530,-1, 531,532,533,-1, 534,535,536,-1, 537,538,539,-1, + 540,541,542,-1, 543,544,545,-1, 546,547,548,-1, 549,550,551,-1, 552,553,554,-1, 555,556,557,-1, + 558,559,560,-1, 561,562,563,-1, 564,565,566,-1, 567,568,569,-1, 570,571,572,-1, 573,574,575,-1, + 576,577,578,-1, 579,580,581,-1, 582,583,584,-1, 585,586,587,-1, 588,589,590,-1, 591,592,593,-1 + ] + } + appearance Appearance + { + material Material + { + ambientIntensity 0.2 + diffuseColor 0.9 0.9 0.9 + specularColor .1 .1 .1 + shininess .5 + } + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/drawer.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/drawer.obj new file mode 100755 index 0000000..7f9630f --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/drawer.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f1ddb9c49c1e708a53b92cbc1b6c2671873cca24147b512d5895ea3ade79652 +size 21005 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/drawer_handle.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/drawer_handle.obj new file mode 100755 index 0000000..4f9e938 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/drawer_handle.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d865d7c471f62b529aad9be0f1f2d902617e0584e1ecdcc223d3885ebe9315e6 +size 187330 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/drawer_handle.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/drawer_handle.wrl new file mode 100755 index 0000000..2054a30 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/drawer_handle.wrl @@ -0,0 +1,1461 @@ +#VRML V2.0 utf8 + +# Generated by VCGLIB, (C)Copyright 1999-2001 VCG, IEI-CNR + +NavigationInfo { + type [ "EXAMINE", "ANY" ] +} +Transform { + scale 1 1 1 + translation 0 0 0 + children + [ + Shape + { + geometry IndexedFaceSet + { + creaseAngle .5 + solid FALSE + coord Coordinate + { + point + [ + 0.311329 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.049179 -0.002405, 0.311329 -0.07223 -0.002405, + 0.273229 -0.049179 -0.002405, 0.275196 -0.04921 -0.002405, 0.273229 0.049179 -0.002405, 0.273229 0.07223 -0.002405, + 0.311329 0.07223 -0.002405, 0.275196 0.04921 -0.002405, 0.273229 0.049179 -0.002405, 0.311329 0.07223 -0.002405, + 0.311329 -0.07223 -0.002405, 0.275196 -0.04921 -0.002405, 0.277343 -0.049176 -0.002405, 0.311329 -0.07223 -0.002405, + 0.277343 -0.049176 -0.002405, 0.279469 -0.049076 -0.002405, 0.277343 0.049176 -0.002405, 0.275196 0.04921 -0.002405, + 0.311329 0.07223 -0.002405, 0.279469 0.049076 -0.002405, 0.277343 0.049176 -0.002405, 0.311329 0.07223 -0.002405, + 0.311329 -0.07223 -0.002405, 0.279469 -0.049076 -0.002405, 0.281554 -0.04891 -0.002405, 0.311329 -0.07223 -0.002405, + 0.281554 -0.04891 -0.002405, 0.283578 -0.04868 -0.002405, 0.281554 0.04891 -0.002405, 0.279469 0.049076 -0.002405, + 0.311329 0.07223 -0.002405, 0.283578 0.04868 -0.002405, 0.281554 0.04891 -0.002405, 0.311329 0.07223 -0.002405, + 0.311329 -0.07223 -0.002405, 0.283578 -0.04868 -0.002405, 0.285522 -0.048388 -0.002405, 0.311329 -0.07223 -0.002405, + 0.285522 -0.048388 -0.002405, 0.287366 -0.048036 -0.002405, 0.285522 0.048388 -0.002405, 0.283578 0.04868 -0.002405, + 0.311329 0.07223 -0.002405, 0.287366 0.048036 -0.002405, 0.285522 0.048388 -0.002405, 0.311329 0.07223 -0.002405, + 0.311329 -0.07223 -0.002405, 0.287366 -0.048036 -0.002405, 0.289092 -0.047629 -0.002405, 0.311329 -0.07223 -0.002405, + 0.289092 -0.047629 -0.002405, 0.290685 -0.047171 -0.002405, 0.289092 0.047629 -0.002405, 0.287366 0.048036 -0.002405, + 0.311329 0.07223 -0.002405, 0.290685 0.047171 -0.002405, 0.289092 0.047629 -0.002405, 0.311329 0.07223 -0.002405, + 0.311329 -0.07223 -0.002405, 0.290685 -0.047171 -0.002405, 0.292129 -0.046664 -0.002405, 0.311329 -0.07223 -0.002405, + 0.292129 -0.046664 -0.002405, 0.293409 -0.046115 -0.002405, 0.292129 0.046664 -0.002405, 0.290685 0.047171 -0.002405, + 0.311329 0.07223 -0.002405, 0.293409 0.046115 -0.002405, 0.292129 0.046664 -0.002405, 0.311329 0.07223 -0.002405, + 0.311329 -0.07223 -0.002405, 0.293409 -0.046115 -0.002405, 0.294514 -0.045529 -0.002405, 0.311329 -0.07223 -0.002405, + 0.294514 -0.045529 -0.002405, 0.295433 -0.044912 -0.002405, 0.294514 0.045529 -0.002405, 0.293409 0.046115 -0.002405, + 0.311329 0.07223 -0.002405, 0.295433 0.044912 -0.002405, 0.294514 0.045529 -0.002405, 0.311329 0.07223 -0.002405, + 0.311329 -0.07223 -0.002405, 0.295433 -0.044912 -0.002405, 0.296158 -0.044268 -0.002405, 0.311329 -0.07223 -0.002405, + 0.296158 -0.044268 -0.002405, 0.29668 -0.043605 -0.002405, 0.296158 0.044268 -0.002405, 0.295433 0.044912 -0.002405, + 0.311329 0.07223 -0.002405, 0.29668 0.043605 -0.002405, 0.296158 0.044268 -0.002405, 0.311329 0.07223 -0.002405, + 0.311329 -0.07223 -0.002405, 0.29668 -0.043605 -0.002405, 0.296995 -0.042929 -0.002405, 0.311329 -0.07223 -0.002405, + 0.296995 -0.042929 -0.002405, 0.297101 -0.042247 -0.002405, 0.296995 0.042929 -0.002405, 0.29668 0.043605 -0.002405, + 0.311329 0.07223 -0.002405, 0.297101 0.042247 -0.002405, 0.297101 0.042247 -0.002405, 0.297101 0.042247 -0.002405, + 0.297101 0.042247 -0.002405, 0.296995 0.042929 -0.002405, 0.311329 0.07223 -0.002405, 0.311329 0.07223 -0.002405, + 0.311329 -0.07223 -0.002405, 0.297101 -0.042247 -0.002405, 0.297101 -0.042247 -0.002405, 0.297101 -0.042247 -0.002405, + 0.297101 0.042247 -0.002405, 0.297101 0.042247 -0.002405, 0.297101 0.042247 -0.002405, 0.311329 0.07223 -0.002405, + 0.311329 0.07223 -0.002405, 0.297101 -0.042247 -0.002405, 0.297101 0.042247 -0.002405, 0.311329 0.07223 -0.002405, + 0.311329 0.071063 -0.002348, 0.311329 0.07223 -0.002405, 0.273229 0.071063 -0.002348, 0.273229 0.071063 -0.002348, + 0.273229 0.07223 -0.002405, 0.311329 0.07223 -0.002405, 0.311329 0.07223 -0.002405, 0.273229 0.07223 -0.002405, + 0.273229 0.07223 -0.002405, 0.273229 0.071063 -0.002348, 0.273229 0.07223 -0.002405, 0.273229 0.07223 -0.002405, + 0.311329 0.07223 -0.002405, 0.273229 0.07223 -0.002405, 0.311329 -0.07223 -0.002405, 0.311329 0.07223 -0.002405, + 0.311329 0.071063 -0.002348, 0.311329 -0.07223 -0.002405, 0.311329 0.071063 -0.002348, 0.311329 0.069907 -0.002176, + 0.311329 0.061231 0.004944, 0.311329 -0.070989 -0.002337, 0.311329 -0.071063 -0.002348, 0.311329 -0.071063 -0.002348, + 0.311329 -0.07223 -0.002405, 0.311329 0.069907 -0.002176, 0.311329 -0.071063 -0.002348, 0.311329 0.069907 -0.002176, + 0.311329 0.068774 -0.001892, 0.311329 0.061731 0.003888, 0.311329 0.061231 0.004944, 0.311329 -0.071063 -0.002348, + 0.311329 0.062331 0.002886, 0.311329 0.061731 0.003888, 0.311329 -0.071063 -0.002348, 0.311329 -0.071063 -0.002348, + 0.311329 0.068774 -0.001892, 0.311329 0.067674 -0.001499, 0.311329 -0.071063 -0.002348, 0.311329 0.067674 -0.001499, + 0.311329 0.066618 -0.000999, 0.311329 0.063027 0.001948, 0.311329 0.062331 0.002886, 0.311329 -0.071063 -0.002348, + 0.311329 0.063812 0.001082, 0.311329 0.063027 0.001948, 0.311329 -0.071063 -0.002348, 0.311329 -0.071063 -0.002348, + 0.311329 0.066618 -0.000999, 0.311329 0.065616 -0.000399, 0.311329 0.064678 0.000297, 0.311329 0.063812 0.001082, + 0.311329 -0.071063 -0.002348, 0.311329 0.065616 -0.000399, 0.311329 0.064678 0.000297, 0.311329 -0.071063 -0.002348, + 0.311329 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 0.084078 0.010667, + 0.273229 0.084135 0.0095, 0.273229 0.084078 0.008333, 0.273229 0.084078 0.008333, 0.273229 0.083906 0.007177, + 0.273229 0.083622 0.006044, 0.273229 0.083622 0.006044, 0.273229 0.083229 0.004944, 0.273229 0.082729 0.003888, + 0.273229 0.082729 0.003888, 0.273229 0.082129 0.002886, 0.273229 0.081433 0.001948, 0.273229 0.081433 0.001948, + 0.273229 0.080648 0.001082, 0.273229 0.079782 0.000297, 0.273229 0.079782 0.000297, 0.273229 0.078844 -0.000399, + 0.273229 0.077842 -0.000999, 0.273229 0.077842 -0.000999, 0.273229 0.076786 -0.001499, 0.273229 0.075686 -0.001892, + 0.273229 0.075686 -0.001892, 0.273229 0.074553 -0.002176, 0.273229 0.073397 -0.002348, 0.273229 0.073397 -0.002348, + 0.273229 0.07223 -0.002405, 0.273229 0.071063 -0.002348, 0.273229 0.071063 -0.002348, 0.273229 0.069907 -0.002176, + 0.273229 0.068774 -0.001892, 0.273229 0.068774 -0.001892, 0.273229 0.067674 -0.001499, 0.273229 0.066618 -0.000999, + 0.273229 0.066618 -0.000999, 0.273229 0.065616 -0.000399, 0.273229 0.064678 0.000297, 0.273229 0.064678 0.000297, + 0.273229 0.063812 0.001082, 0.273229 0.063027 0.001948, 0.273229 0.063027 0.001948, 0.273229 0.062331 0.002886, + 0.273229 0.061731 0.003888, 0.273229 0.061731 0.003888, 0.273229 0.061231 0.004944, 0.273229 0.060838 0.006044, + 0.273229 0.060838 0.006044, 0.273229 0.060554 0.007177, 0.273229 0.060382 0.008333, 0.273229 0.060382 0.008333, + 0.273229 0.060325 0.0095, 0.273229 0.060382 0.010667, 0.273229 0.060382 0.010667, 0.273229 0.060554 0.011823, + 0.273229 0.060838 0.012956, 0.273229 0.060838 0.012956, 0.273229 0.061231 0.014056, 0.273229 0.061731 0.015112, + 0.273229 0.061731 0.015112, 0.273229 0.062331 0.016114, 0.273229 0.063027 0.017052, 0.273229 0.063027 0.017052, + 0.273229 0.063812 0.017918, 0.273229 0.064678 0.018703, 0.273229 0.064678 0.018703, 0.273229 0.065616 0.019399, + 0.273229 0.066618 0.019999, 0.273229 0.066618 0.019999, 0.273229 0.067674 0.020499, 0.273229 0.068774 0.020892, + 0.273229 0.068774 0.020892, 0.273229 0.069907 0.021176, 0.273229 0.071063 0.021348, 0.273229 0.071063 0.021348, + 0.273229 0.07223 0.021405, 0.273229 0.073397 0.021348, 0.273229 0.073397 0.021348, 0.273229 0.074553 0.021176, + 0.273229 0.075686 0.020892, 0.273229 0.075686 0.020892, 0.273229 0.076786 0.020499, 0.273229 0.077842 0.019999, + 0.273229 0.077842 0.019999, 0.273229 0.078844 0.019399, 0.273229 0.079782 0.018703, 0.273229 0.079782 0.018703, + 0.273229 0.080648 0.017918, 0.273229 0.081433 0.017052, 0.273229 0.081433 0.017052, 0.273229 0.082129 0.016114, + 0.273229 0.082729 0.015112, 0.273229 0.082729 0.015112, 0.273229 0.083229 0.014056, 0.273229 0.083622 0.012956, + 0.273229 0.083622 0.012956, 0.273229 0.083906 0.011823, 0.273229 0.084078 0.010667, 0.273229 0.084078 0.010667, + 0.273229 0.084078 0.008333, 0.273229 0.083622 0.006044, 0.273229 0.083622 0.006044, 0.273229 0.082729 0.003888, + 0.273229 0.081433 0.001948, 0.273229 0.081433 0.001948, 0.273229 0.079782 0.000297, 0.273229 0.077842 -0.000999, + 0.273229 0.077842 -0.000999, 0.273229 0.075686 -0.001892, 0.273229 0.073397 -0.002348, 0.273229 0.073397 -0.002348, + 0.273229 0.071063 -0.002348, 0.273229 0.068774 -0.001892, 0.273229 0.068774 -0.001892, 0.273229 0.066618 -0.000999, + 0.273229 0.064678 0.000297, 0.273229 0.064678 0.000297, 0.273229 0.063027 0.001948, 0.273229 0.061731 0.003888, + 0.273229 0.061731 0.003888, 0.273229 0.060838 0.006044, 0.273229 0.060382 0.008333, 0.273229 0.060382 0.008333, + 0.273229 0.060382 0.010667, 0.273229 0.060838 0.012956, 0.273229 0.060838 0.012956, 0.273229 0.061731 0.015112, + 0.273229 0.063027 0.017052, 0.273229 0.063027 0.017052, 0.273229 0.064678 0.018703, 0.273229 0.066618 0.019999, + 0.273229 0.066618 0.019999, 0.273229 0.068774 0.020892, 0.273229 0.071063 0.021348, 0.273229 0.071063 0.021348, + 0.273229 0.073397 0.021348, 0.273229 0.075686 0.020892, 0.273229 0.075686 0.020892, 0.273229 0.077842 0.019999, + 0.273229 0.079782 0.018703, 0.273229 0.079782 0.018703, 0.273229 0.081433 0.017052, 0.273229 0.082729 0.015112, + 0.273229 0.082729 0.015112, 0.273229 0.083622 0.012956, 0.273229 0.084078 0.010667, 0.273229 0.084078 0.010667, + 0.273229 0.083622 0.006044, 0.273229 0.081433 0.001948, 0.273229 0.081433 0.001948, 0.273229 0.077842 -0.000999, + 0.273229 0.073397 -0.002348, 0.273229 0.073397 -0.002348, 0.273229 0.068774 -0.001892, 0.273229 0.064678 0.000297, + 0.273229 0.064678 0.000297, 0.273229 0.061731 0.003888, 0.273229 0.060382 0.008333, 0.273229 0.060382 0.008333, + 0.273229 0.060838 0.012956, 0.273229 0.063027 0.017052, 0.273229 0.063027 0.017052, 0.273229 0.066618 0.019999, + 0.273229 0.071063 0.021348, 0.273229 0.071063 0.021348, 0.273229 0.075686 0.020892, 0.273229 0.079782 0.018703, + 0.273229 0.079782 0.018703, 0.273229 0.082729 0.015112, 0.273229 0.084078 0.010667, 0.273229 0.084078 0.010667, + 0.273229 0.081433 0.001948, 0.273229 0.073397 -0.002348, 0.273229 0.073397 -0.002348, 0.273229 0.064678 0.000297, + 0.273229 0.060382 0.008333, 0.273229 0.060382 0.008333, 0.273229 0.063027 0.017052, 0.273229 0.071063 0.021348, + 0.273229 0.071063 0.021348, 0.273229 0.079782 0.018703, 0.273229 0.084078 0.010667, 0.273229 0.084078 0.010667, + 0.273229 0.073397 -0.002348, 0.273229 0.060382 0.008333, 0.273229 0.060382 0.008333, 0.273229 0.071063 0.021348, + 0.273229 0.084078 0.010667, 0.273229 0.073397 -0.002348, 0.311329 0.073397 -0.002348, 0.311329 0.07223 -0.002405, + 0.311329 0.07223 -0.002405, 0.273229 0.07223 -0.002405, 0.273229 0.073397 -0.002348, 0.311329 0.083906 0.007177, + 0.311329 0.084078 0.008333, 0.311329 0.084135 0.0095, 0.311329 0.084135 0.0095, 0.311329 0.084078 0.010667, + 0.311329 0.083906 0.011823, 0.311329 0.083906 0.011823, 0.311329 0.083622 0.012956, 0.311329 0.083229 0.014056, + 0.311329 0.083229 0.014056, 0.311329 0.082729 0.015112, 0.311329 0.082129 0.016114, 0.311329 0.082129 0.016114, + 0.311329 0.081433 0.017052, 0.311329 0.080648 0.017918, 0.311329 0.080648 0.017918, 0.311329 0.079782 0.018703, + 0.311329 0.078844 0.019399, 0.311329 0.078844 0.019399, 0.311329 0.077842 0.019999, 0.311329 0.076786 0.020499, + 0.311329 0.076786 0.020499, 0.311329 0.075686 0.020892, 0.311329 0.074553 0.021176, 0.311329 0.074553 0.021176, + 0.311329 0.073397 0.021348, 0.311329 0.07223 0.021405, 0.311329 0.07223 0.021405, 0.311329 0.071063 0.021348, + 0.311329 0.069907 0.021176, 0.311329 0.074553 0.021176, 0.311329 0.07223 0.021405, 0.311329 0.07223 0.021405, + 0.311329 0.078844 0.019399, 0.311329 0.076786 0.020499, 0.311329 0.074553 0.021176, 0.311329 0.082129 0.016114, + 0.311329 0.080648 0.017918, 0.311329 0.078844 0.019399, 0.311329 0.083906 0.011823, 0.311329 0.083229 0.014056, + 0.311329 0.082129 0.016114, 0.311329 0.083906 0.007177, 0.311329 0.084135 0.0095, 0.311329 0.083906 0.011823, + 0.311329 0.083229 0.004944, 0.311329 0.083622 0.006044, 0.311329 0.083906 0.007177, 0.311329 0.082129 0.002886, + 0.311329 0.082729 0.003888, 0.311329 0.083229 0.004944, 0.311329 0.080648 0.001082, 0.311329 0.081433 0.001948, + 0.311329 0.082129 0.002886, 0.311329 0.078844 -0.000399, 0.311329 0.079782 0.000297, 0.311329 0.080648 0.001082, + 0.311329 0.076786 -0.001499, 0.311329 0.077842 -0.000999, 0.311329 0.078844 -0.000399, 0.311329 0.074553 -0.002176, + 0.311329 0.075686 -0.001892, 0.311329 0.076786 -0.001499, 0.311329 0.07223 -0.002405, 0.311329 0.073397 -0.002348, + 0.311329 0.074553 -0.002176, 0.311329 0.069907 -0.002176, 0.311329 0.071063 -0.002348, 0.311329 0.07223 -0.002405, + 0.311329 0.067674 -0.001499, 0.311329 0.068774 -0.001892, 0.311329 0.069907 -0.002176, 0.311329 0.065616 -0.000399, + 0.311329 0.066618 -0.000999, 0.311329 0.067674 -0.001499, 0.311329 0.063812 0.001082, 0.311329 0.064678 0.000297, + 0.311329 0.065616 -0.000399, 0.311329 0.062331 0.002886, 0.311329 0.063027 0.001948, 0.311329 0.063812 0.001082, + 0.311329 0.061231 0.004944, 0.311329 0.061731 0.003888, 0.311329 0.062331 0.002886, 0.311329 0.060554 0.007177, + 0.311329 0.060838 0.006044, 0.311329 0.061231 0.004944, 0.311329 0.060325 0.0095, 0.311329 0.060382 0.008333, + 0.311329 0.060554 0.007177, 0.311329 0.060554 0.011823, 0.311329 0.060382 0.010667, 0.311329 0.060325 0.0095, + 0.311329 0.061231 0.014056, 0.311329 0.060838 0.012956, 0.311329 0.060554 0.011823, 0.311329 0.062331 0.016114, + 0.311329 0.061731 0.015112, 0.311329 0.061231 0.014056, 0.311329 0.063812 0.017918, 0.311329 0.063027 0.017052, + 0.311329 0.062331 0.016114, 0.311329 0.065616 0.019399, 0.311329 0.064678 0.018703, 0.311329 0.063812 0.017918, + 0.311329 0.067674 0.020499, 0.311329 0.066618 0.019999, 0.311329 0.065616 0.019399, 0.311329 0.069907 0.021176, + 0.311329 0.068774 0.020892, 0.311329 0.067674 0.020499, 0.311329 0.074553 0.021176, 0.311329 0.07223 0.021405, + 0.311329 0.069907 0.021176, 0.311329 0.082129 0.016114, 0.311329 0.078844 0.019399, 0.311329 0.074553 0.021176, + 0.311329 0.083906 0.007177, 0.311329 0.083906 0.011823, 0.311329 0.082129 0.016114, 0.311329 0.082129 0.002886, + 0.311329 0.083229 0.004944, 0.311329 0.083906 0.007177, 0.311329 0.078844 -0.000399, 0.311329 0.080648 0.001082, + 0.311329 0.082129 0.002886, 0.311329 0.074553 -0.002176, 0.311329 0.076786 -0.001499, 0.311329 0.078844 -0.000399, + 0.311329 0.069907 -0.002176, 0.311329 0.07223 -0.002405, 0.311329 0.074553 -0.002176, 0.311329 0.065616 -0.000399, + 0.311329 0.067674 -0.001499, 0.311329 0.069907 -0.002176, 0.311329 0.062331 0.002886, 0.311329 0.063812 0.001082, + 0.311329 0.065616 -0.000399, 0.311329 0.060554 0.007177, 0.311329 0.061231 0.004944, 0.311329 0.062331 0.002886, + 0.311329 0.060554 0.011823, 0.311329 0.060325 0.0095, 0.311329 0.060554 0.007177, 0.311329 0.062331 0.016114, + 0.311329 0.061231 0.014056, 0.311329 0.060554 0.011823, 0.311329 0.065616 0.019399, 0.311329 0.063812 0.017918, + 0.311329 0.062331 0.016114, 0.311329 0.069907 0.021176, 0.311329 0.067674 0.020499, 0.311329 0.065616 0.019399, + 0.311329 0.082129 0.016114, 0.311329 0.074553 0.021176, 0.311329 0.069907 0.021176, 0.311329 0.082129 0.002886, + 0.311329 0.083906 0.007177, 0.311329 0.082129 0.016114, 0.311329 0.074553 -0.002176, 0.311329 0.078844 -0.000399, + 0.311329 0.082129 0.002886, 0.311329 0.065616 -0.000399, 0.311329 0.069907 -0.002176, 0.311329 0.074553 -0.002176, + 0.311329 0.060554 0.007177, 0.311329 0.062331 0.002886, 0.311329 0.065616 -0.000399, 0.311329 0.062331 0.016114, + 0.311329 0.060554 0.011823, 0.311329 0.060554 0.007177, 0.311329 0.069907 0.021176, 0.311329 0.065616 0.019399, + 0.311329 0.062331 0.016114, 0.311329 0.082129 0.002886, 0.311329 0.082129 0.016114, 0.311329 0.069907 0.021176, + 0.311329 0.065616 -0.000399, 0.311329 0.074553 -0.002176, 0.311329 0.082129 0.002886, 0.311329 0.062331 0.016114, + 0.311329 0.060554 0.007177, 0.311329 0.065616 -0.000399, 0.311329 0.082129 0.002886, 0.311329 0.069907 0.021176, + 0.311329 0.062331 0.016114, 0.311329 0.062331 0.016114, 0.311329 0.065616 -0.000399, 0.311329 0.082129 0.002886, + 0.273229 0.071063 -0.002348, 0.273229 0.071063 -0.002348, 0.273229 0.069907 -0.002176, 0.273229 0.069907 -0.002176, + 0.273229 0.069907 -0.002176, 0.273229 0.071063 -0.002348, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, + 0.273229 -0.07223 -0.002405, 0.273229 0.084078 0.010667, 0.311329 0.084078 0.010667, 0.311329 0.084135 0.0095, + 0.311329 0.084135 0.0095, 0.273229 0.084135 0.0095, 0.273229 0.084078 0.010667, 0.273229 0.084135 0.0095, + 0.311329 0.084135 0.0095, 0.311329 0.084078 0.008333, 0.311329 0.084078 0.008333, 0.273229 0.084078 0.008333, + 0.273229 0.084135 0.0095, 0.273229 0.084078 0.008333, 0.311329 0.084078 0.008333, 0.311329 0.083906 0.007177, + 0.311329 0.083906 0.007177, 0.273229 0.083906 0.007177, 0.273229 0.084078 0.008333, 0.273229 0.083906 0.007177, + 0.311329 0.083906 0.007177, 0.311329 0.083622 0.006044, 0.311329 0.083622 0.006044, 0.273229 0.083622 0.006044, + 0.273229 0.083906 0.007177, 0.273229 0.083622 0.006044, 0.311329 0.083622 0.006044, 0.311329 0.083229 0.004944, + 0.311329 0.083229 0.004944, 0.273229 0.083229 0.004944, 0.273229 0.083622 0.006044, 0.273229 0.083229 0.004944, + 0.311329 0.083229 0.004944, 0.311329 0.082729 0.003888, 0.311329 0.082729 0.003888, 0.273229 0.082729 0.003888, + 0.273229 0.083229 0.004944, 0.273229 0.082729 0.003888, 0.311329 0.082729 0.003888, 0.311329 0.082129 0.002886, + 0.311329 0.082129 0.002886, 0.273229 0.082129 0.002886, 0.273229 0.082729 0.003888, 0.273229 0.082129 0.002886, + 0.311329 0.082129 0.002886, 0.311329 0.081433 0.001948, 0.311329 0.081433 0.001948, 0.273229 0.081433 0.001948, + 0.273229 0.082129 0.002886, 0.273229 0.081433 0.001948, 0.311329 0.081433 0.001948, 0.311329 0.080648 0.001082, + 0.311329 0.080648 0.001082, 0.273229 0.080648 0.001082, 0.273229 0.081433 0.001948, 0.273229 0.080648 0.001082, + 0.311329 0.080648 0.001082, 0.311329 0.079782 0.000297, 0.311329 0.079782 0.000297, 0.273229 0.079782 0.000297, + 0.273229 0.080648 0.001082, 0.273229 0.079782 0.000297, 0.311329 0.079782 0.000297, 0.311329 0.078844 -0.000399, + 0.311329 0.078844 -0.000399, 0.273229 0.078844 -0.000399, 0.273229 0.079782 0.000297, 0.273229 0.078844 -0.000399, + 0.311329 0.078844 -0.000399, 0.311329 0.077842 -0.000999, 0.311329 0.077842 -0.000999, 0.273229 0.077842 -0.000999, + 0.273229 0.078844 -0.000399, 0.273229 0.077842 -0.000999, 0.311329 0.077842 -0.000999, 0.311329 0.076786 -0.001499, + 0.311329 0.076786 -0.001499, 0.273229 0.076786 -0.001499, 0.273229 0.077842 -0.000999, 0.273229 0.076786 -0.001499, + 0.311329 0.076786 -0.001499, 0.311329 0.075686 -0.001892, 0.311329 0.075686 -0.001892, 0.273229 0.075686 -0.001892, + 0.273229 0.076786 -0.001499, 0.273229 0.075686 -0.001892, 0.311329 0.075686 -0.001892, 0.311329 0.074553 -0.002176, + 0.311329 0.074553 -0.002176, 0.273229 0.074553 -0.002176, 0.273229 0.075686 -0.001892, 0.273229 0.074553 -0.002176, + 0.311329 0.074553 -0.002176, 0.311329 0.073397 -0.002348, 0.311329 0.073397 -0.002348, 0.273229 0.073397 -0.002348, + 0.273229 0.074553 -0.002176, 0.273229 0.069907 -0.002176, 0.273229 0.069907 -0.002176, 0.273229 0.068774 -0.001892, + 0.273229 0.068774 -0.001892, 0.273229 0.068774 -0.001892, 0.273229 0.069907 -0.002176, 0.273229 0.068774 -0.001892, + 0.273229 0.068774 -0.001892, 0.273229 0.067674 -0.001499, 0.273229 0.067674 -0.001499, 0.273229 0.067674 -0.001499, + 0.273229 0.068774 -0.001892, 0.273229 0.067674 -0.001499, 0.273229 0.067674 -0.001499, 0.273229 0.066618 -0.000999, + 0.273229 0.066618 -0.000999, 0.273229 0.066618 -0.000999, 0.273229 0.067674 -0.001499, 0.273229 0.066618 -0.000999, + 0.273229 0.066618 -0.000999, 0.273229 0.065616 -0.000399, 0.273229 0.065616 -0.000399, 0.273229 0.065616 -0.000399, + 0.273229 0.066618 -0.000999, 0.273229 0.065616 -0.000399, 0.273229 0.065616 -0.000399, 0.273229 0.064678 0.000297, + 0.273229 0.064678 0.000297, 0.273229 0.064678 0.000297, 0.273229 0.065616 -0.000399, 0.273229 0.064678 0.000297, + 0.273229 0.064678 0.000297, 0.273229 0.063812 0.001082, 0.273229 0.063812 0.001082, 0.273229 0.063812 0.001082, + 0.273229 0.064678 0.000297, 0.273229 0.063812 0.001082, 0.273229 0.063812 0.001082, 0.273229 0.063027 0.001948, + 0.273229 0.063027 0.001948, 0.273229 0.063027 0.001948, 0.273229 0.063812 0.001082, 0.273229 0.063027 0.001948, + 0.273229 0.063027 0.001948, 0.273229 0.062331 0.002886, 0.273229 0.062331 0.002886, 0.273229 0.062331 0.002886, + 0.273229 0.063027 0.001948, 0.273229 0.062331 0.002886, 0.273229 0.062331 0.002886, 0.273229 0.061731 0.003888, + 0.273229 0.061731 0.003888, 0.273229 0.061731 0.003888, 0.273229 0.062331 0.002886, 0.273229 0.061731 0.003888, + 0.273229 0.061731 0.003888, 0.273229 0.061231 0.004944, 0.273229 0.061231 0.004944, 0.273229 0.061231 0.004944, + 0.273229 0.061731 0.003888, 0.273229 0.061231 0.004944, 0.273229 0.061231 0.004944, 0.273229 0.060838 0.006044, + 0.273229 0.060838 0.006044, 0.273229 0.060838 0.006044, 0.273229 0.061231 0.004944, 0.273229 0.060838 0.006044, + 0.273229 0.060838 0.006044, 0.273229 0.060554 0.007177, 0.273229 0.07223 0.021405, 0.311329 0.07223 0.021405, + 0.311329 0.07223 0.021405, 0.273229 0.07223 0.021405, 0.273229 0.071063 0.021348, 0.273229 0.07223 0.021405, + 0.273229 0.07223 0.021405, 0.311329 0.07223 0.021405, 0.273229 0.07223 0.021405, 0.273229 0.07223 0.021405, + 0.311329 0.07223 0.021405, 0.311329 0.073397 0.021348, 0.311329 0.073397 0.021348, 0.273229 0.073397 0.021348, + 0.273229 0.07223 0.021405, 0.273229 0.073397 0.021348, 0.311329 0.073397 0.021348, 0.311329 0.074553 0.021176, + 0.311329 0.074553 0.021176, 0.273229 0.074553 0.021176, 0.273229 0.073397 0.021348, 0.273229 0.074553 0.021176, + 0.311329 0.074553 0.021176, 0.311329 0.075686 0.020892, 0.311329 0.075686 0.020892, 0.273229 0.075686 0.020892, + 0.273229 0.074553 0.021176, 0.273229 0.075686 0.020892, 0.311329 0.075686 0.020892, 0.311329 0.076786 0.020499, + 0.311329 0.076786 0.020499, 0.273229 0.076786 0.020499, 0.273229 0.075686 0.020892, 0.273229 0.076786 0.020499, + 0.311329 0.076786 0.020499, 0.311329 0.077842 0.019999, 0.311329 0.077842 0.019999, 0.273229 0.077842 0.019999, + 0.273229 0.076786 0.020499, 0.273229 0.077842 0.019999, 0.311329 0.077842 0.019999, 0.311329 0.078844 0.019399, + 0.311329 0.078844 0.019399, 0.273229 0.078844 0.019399, 0.273229 0.077842 0.019999, 0.273229 0.078844 0.019399, + 0.311329 0.078844 0.019399, 0.311329 0.079782 0.018703, 0.311329 0.079782 0.018703, 0.273229 0.079782 0.018703, + 0.273229 0.078844 0.019399, 0.273229 0.079782 0.018703, 0.311329 0.079782 0.018703, 0.311329 0.080648 0.017918, + 0.311329 0.080648 0.017918, 0.273229 0.080648 0.017918, 0.273229 0.079782 0.018703, 0.273229 0.080648 0.017918, + 0.311329 0.080648 0.017918, 0.311329 0.081433 0.017052, 0.311329 0.081433 0.017052, 0.273229 0.081433 0.017052, + 0.273229 0.080648 0.017918, 0.273229 0.081433 0.017052, 0.311329 0.081433 0.017052, 0.311329 0.082129 0.016114, + 0.311329 0.082129 0.016114, 0.273229 0.082129 0.016114, 0.273229 0.081433 0.017052, 0.273229 0.082129 0.016114, + 0.311329 0.082129 0.016114, 0.311329 0.082729 0.015112, 0.311329 0.082729 0.015112, 0.273229 0.082729 0.015112, + 0.273229 0.082129 0.016114, 0.273229 0.082729 0.015112, 0.311329 0.082729 0.015112, 0.311329 0.083229 0.014056, + 0.311329 0.083229 0.014056, 0.273229 0.083229 0.014056, 0.273229 0.082729 0.015112, 0.273229 0.083229 0.014056, + 0.311329 0.083229 0.014056, 0.311329 0.083622 0.012956, 0.311329 0.083622 0.012956, 0.273229 0.083622 0.012956, + 0.273229 0.083229 0.014056, 0.273229 0.083622 0.012956, 0.311329 0.083622 0.012956, 0.311329 0.083906 0.011823, + 0.311329 0.083906 0.011823, 0.273229 0.083906 0.011823, 0.273229 0.083622 0.012956, 0.273229 0.083906 0.011823, + 0.311329 0.083906 0.011823, 0.311329 0.084078 0.010667, 0.311329 0.084078 0.010667, 0.273229 0.084078 0.010667, + 0.273229 0.083906 0.011823, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, + 0.273229 0.071063 -0.002348, 0.273229 0.07223 -0.002405, 0.273229 0.049179 -0.002405, 0.273229 0.049179 -0.002405, + 0.273229 0.049179 0.004281, 0.273229 0.061231 0.004944, 0.273229 0.049179 -0.002405, 0.273229 0.061231 0.004944, + 0.273229 0.061731 0.003888, 0.273229 0.069907 -0.002176, 0.273229 0.071063 -0.002348, 0.273229 0.049179 -0.002405, + 0.273229 0.068774 -0.001892, 0.273229 0.069907 -0.002176, 0.273229 0.049179 -0.002405, 0.273229 0.049179 -0.002405, + 0.273229 0.061731 0.003888, 0.273229 0.062331 0.002886, 0.273229 0.049179 -0.002405, 0.273229 0.062331 0.002886, + 0.273229 0.063027 0.001948, 0.273229 0.067674 -0.001499, 0.273229 0.068774 -0.001892, 0.273229 0.049179 -0.002405, + 0.273229 0.066618 -0.000999, 0.273229 0.067674 -0.001499, 0.273229 0.049179 -0.002405, 0.273229 0.049179 -0.002405, + 0.273229 0.063027 0.001948, 0.273229 0.063812 0.001082, 0.273229 0.049179 -0.002405, 0.273229 0.063812 0.001082, + 0.273229 0.064678 0.000297, 0.273229 0.065616 -0.000399, 0.273229 0.066618 -0.000999, 0.273229 0.049179 -0.002405, + 0.273229 0.065616 -0.000399, 0.273229 0.049179 -0.002405, 0.273229 0.064678 0.000297, 0.273229 -0.070866 -0.002318, + 0.273229 -0.049179 -0.000941, 0.273229 -0.049179 -0.001136, 0.273229 -0.049179 -0.001136, 0.273229 -0.070989 -0.002337, + 0.273229 -0.070866 -0.002318, 0.273229 -0.07071 -0.002295, 0.273229 -0.049179 -0.000742, 0.273229 -0.049179 -0.000941, + 0.273229 -0.049179 -0.000941, 0.273229 -0.070866 -0.002318, 0.273229 -0.07071 -0.002295, 0.273229 -0.070511 -0.002266, + 0.273229 -0.049179 -0.000539, 0.273229 -0.049179 -0.000742, 0.273229 -0.049179 -0.000742, 0.273229 -0.07071 -0.002295, + 0.273229 -0.070511 -0.002266, 0.273229 -0.070252 -0.002227, 0.273229 -0.049179 -0.000335, 0.273229 -0.049179 -0.000539, + 0.273229 -0.049179 -0.000539, 0.273229 -0.070511 -0.002266, 0.273229 -0.070252 -0.002227, 0.273229 -0.070511 0.021266, + 0.273229 -0.049179 0.019539, 0.273229 -0.049179 0.019335, 0.273229 -0.049179 0.019335, 0.273229 -0.070252 0.021227, + 0.273229 -0.070511 0.021266, 0.273229 -0.07071 0.021295, 0.273229 -0.049179 0.019742, 0.273229 -0.049179 0.019539, + 0.273229 -0.049179 0.019539, 0.273229 -0.070511 0.021266, 0.273229 -0.07071 0.021295, 0.273229 -0.070866 0.021318, + 0.273229 -0.049179 0.019941, 0.273229 -0.049179 0.019742, 0.273229 -0.049179 0.019742, 0.273229 -0.07071 0.021295, + 0.273229 -0.070866 0.021318, 0.273229 -0.070989 0.021337, 0.273229 -0.049179 0.020136, 0.273229 -0.049179 0.019941, + 0.273229 -0.049179 0.019941, 0.273229 -0.070866 0.021318, 0.273229 -0.070989 0.021337, 0.273229 0.061731 0.015112, + 0.273229 0.061231 0.014056, 0.273229 0.049179 0.01472, 0.273229 0.049179 0.021405, 0.273229 0.07223 0.021405, + 0.273229 0.071063 0.021348, 0.273229 0.049179 0.021405, 0.273229 0.071063 0.021348, 0.273229 0.069907 0.021176, + 0.273229 0.061731 0.015112, 0.273229 0.049179 0.01472, 0.273229 0.049179 0.021405, 0.273229 0.062331 0.016114, + 0.273229 0.061731 0.015112, 0.273229 0.049179 0.021405, 0.273229 0.049179 0.021405, 0.273229 0.069907 0.021176, + 0.273229 0.068774 0.020892, 0.273229 0.049179 0.021405, 0.273229 0.068774 0.020892, 0.273229 0.067674 0.020499, + 0.273229 0.063027 0.017052, 0.273229 0.062331 0.016114, 0.273229 0.049179 0.021405, 0.273229 0.063812 0.017918, + 0.273229 0.063027 0.017052, 0.273229 0.049179 0.021405, 0.273229 0.049179 0.021405, 0.273229 0.067674 0.020499, + 0.273229 0.066618 0.019999, 0.273229 0.049179 0.021405, 0.273229 0.066618 0.019999, 0.273229 0.065616 0.019399, + 0.273229 0.064678 0.018703, 0.273229 0.063812 0.017918, 0.273229 0.049179 0.021405, 0.273229 0.049179 0.021405, + 0.273229 0.065616 0.019399, 0.273229 0.064678 0.018703, 0.273229 0.07223 0.021405, 0.311329 0.07223 0.021405, + 0.311329 0.07223 0.021405, 0.311329 0.071063 0.021348, 0.311329 0.07223 0.021405, 0.311329 0.07223 0.021405, + 0.311329 0.07223 0.021405, 0.311329 -0.07223 0.021405, 0.311329 -0.071063 0.021348, 0.311329 -0.071063 0.021348, + 0.311329 -0.070989 0.021337, 0.311329 0.061231 0.014056, 0.311329 -0.071063 0.021348, 0.311329 0.061231 0.014056, + 0.311329 0.061731 0.015112, 0.311329 0.071063 0.021348, 0.311329 0.07223 0.021405, 0.311329 -0.071063 0.021348, + 0.311329 0.069907 0.021176, 0.311329 0.071063 0.021348, 0.311329 -0.071063 0.021348, 0.311329 -0.071063 0.021348, + 0.311329 0.061731 0.015112, 0.311329 0.062331 0.016114, 0.311329 -0.071063 0.021348, 0.311329 0.062331 0.016114, + 0.311329 0.063027 0.017052, 0.311329 0.068774 0.020892, 0.311329 0.069907 0.021176, 0.311329 -0.071063 0.021348, + 0.311329 0.067674 0.020499, 0.311329 0.068774 0.020892, 0.311329 -0.071063 0.021348, 0.311329 -0.071063 0.021348, + 0.311329 0.063027 0.017052, 0.311329 0.063812 0.017918, 0.311329 -0.071063 0.021348, 0.311329 0.063812 0.017918, + 0.311329 0.064678 0.018703, 0.311329 0.066618 0.019999, 0.311329 0.067674 0.020499, 0.311329 -0.071063 0.021348, + 0.311329 -0.071063 0.021348, 0.311329 0.064678 0.018703, 0.311329 0.065616 0.019399, 0.311329 -0.071063 0.021348, + 0.311329 0.065616 0.019399, 0.311329 0.066618 0.019999, 0.311329 -0.070865 0.021318, 0.311329 0.060838 0.012956, + 0.311329 0.061231 0.014056, 0.311329 0.061231 0.014056, 0.311329 -0.070989 0.021337, 0.311329 -0.070865 0.021318, + 0.311329 -0.07071 0.021295, 0.311329 0.060554 0.011823, 0.311329 0.060838 0.012956, 0.311329 0.060838 0.012956, + 0.311329 -0.070865 0.021318, 0.311329 -0.07071 0.021295, 0.311329 -0.070511 0.021266, 0.311329 0.060382 0.010667, + 0.311329 0.060554 0.011823, 0.311329 0.060554 0.011823, 0.311329 -0.07071 0.021295, 0.311329 -0.070511 0.021266, + 0.311329 -0.070252 0.021227, 0.311329 0.060325 0.0095, 0.311329 0.060382 0.010667, 0.311329 0.060382 0.010667, + 0.311329 -0.070511 0.021266, 0.311329 -0.070252 0.021227, 0.311329 -0.070511 -0.002266, 0.311329 0.060382 0.008333, + 0.311329 0.060325 0.0095, 0.311329 0.060325 0.0095, 0.311329 -0.070252 -0.002227, 0.311329 -0.070511 -0.002266, + 0.311329 -0.07071 -0.002295, 0.311329 0.060554 0.007177, 0.311329 0.060382 0.008333, 0.311329 0.060382 0.008333, + 0.311329 -0.070511 -0.002266, 0.311329 -0.07071 -0.002295, 0.311329 -0.070865 -0.002318, 0.311329 0.060838 0.006044, + 0.311329 0.060554 0.007177, 0.311329 0.060554 0.007177, 0.311329 -0.07071 -0.002295, 0.311329 -0.070865 -0.002318, + 0.311329 -0.070989 -0.002337, 0.311329 0.061231 0.004944, 0.311329 0.060838 0.006044, 0.311329 0.060838 0.006044, + 0.311329 -0.070865 -0.002318, 0.311329 -0.070989 -0.002337, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, + 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.072229 -0.002405, + 0.273229 0.060325 0.0095, 0.273229 0.049179 0.008499, 0.273229 0.049179 0.010501, 0.273229 -0.07223 0.021405, + 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.311329 0.07223 0.021405, 0.273229 0.07223 0.021405, + 0.273229 0.049179 0.021405, 0.311329 0.07223 0.021405, 0.273229 0.049179 0.021405, 0.275196 0.04921 0.021405, + 0.273229 -0.049179 0.021405, 0.273229 -0.07223 0.021405, 0.311329 -0.07223 0.021405, 0.275196 -0.04921 0.021405, + 0.273229 -0.049179 0.021405, 0.311329 -0.07223 0.021405, 0.311329 0.07223 0.021405, 0.275196 0.04921 0.021405, + 0.277343 0.049176 0.021405, 0.311329 0.07223 0.021405, 0.277343 0.049176 0.021405, 0.279469 0.049076 0.021405, + 0.277343 -0.049176 0.021405, 0.275196 -0.04921 0.021405, 0.311329 -0.07223 0.021405, 0.279469 -0.049076 0.021405, + 0.277343 -0.049176 0.021405, 0.311329 -0.07223 0.021405, 0.311329 0.07223 0.021405, 0.279469 0.049076 0.021405, + 0.281554 0.04891 0.021405, 0.311329 0.07223 0.021405, 0.281554 0.04891 0.021405, 0.283578 0.04868 0.021405, + 0.281554 -0.04891 0.021405, 0.279469 -0.049076 0.021405, 0.311329 -0.07223 0.021405, 0.283578 -0.04868 0.021405, + 0.281554 -0.04891 0.021405, 0.311329 -0.07223 0.021405, 0.311329 0.07223 0.021405, 0.283578 0.04868 0.021405, + 0.285522 0.048388 0.021405, 0.311329 0.07223 0.021405, 0.285522 0.048388 0.021405, 0.287366 0.048036 0.021405, + 0.285522 -0.048388 0.021405, 0.283578 -0.04868 0.021405, 0.311329 -0.07223 0.021405, 0.287366 -0.048036 0.021405, + 0.285522 -0.048388 0.021405, 0.311329 -0.07223 0.021405, 0.311329 0.07223 0.021405, 0.287366 0.048036 0.021405, + 0.289092 0.047629 0.021405, 0.311329 0.07223 0.021405, 0.289092 0.047629 0.021405, 0.290685 0.047171 0.021405, + 0.289092 -0.047629 0.021405, 0.287366 -0.048036 0.021405, 0.311329 -0.07223 0.021405, 0.290685 -0.047171 0.021405, + 0.289092 -0.047629 0.021405, 0.311329 -0.07223 0.021405, 0.311329 0.07223 0.021405, 0.290685 0.047171 0.021405, + 0.292129 0.046664 0.021405, 0.311329 0.07223 0.021405, 0.292129 0.046664 0.021405, 0.293409 0.046115 0.021405, + 0.292129 -0.046664 0.021405, 0.290685 -0.047171 0.021405, 0.311329 -0.07223 0.021405, 0.293409 -0.046115 0.021405, + 0.292129 -0.046664 0.021405, 0.311329 -0.07223 0.021405, 0.311329 0.07223 0.021405, 0.293409 0.046115 0.021405, + 0.294514 0.045529 0.021405, 0.311329 0.07223 0.021405, 0.294514 0.045529 0.021405, 0.295433 0.044912 0.021405, + 0.294514 -0.045529 0.021405, 0.293409 -0.046115 0.021405, 0.311329 -0.07223 0.021405, 0.295433 -0.044912 0.021405, + 0.294514 -0.045529 0.021405, 0.311329 -0.07223 0.021405, 0.311329 0.07223 0.021405, 0.295433 0.044912 0.021405, + 0.296158 0.044268 0.021405, 0.311329 0.07223 0.021405, 0.296158 0.044268 0.021405, 0.29668 0.043605 0.021405, + 0.296158 -0.044268 0.021405, 0.295433 -0.044912 0.021405, 0.311329 -0.07223 0.021405, 0.29668 -0.043605 0.021405, + 0.296158 -0.044268 0.021405, 0.311329 -0.07223 0.021405, 0.311329 0.07223 0.021405, 0.29668 0.043605 0.021405, + 0.296995 0.042929 0.021405, 0.311329 0.07223 0.021405, 0.296995 0.042929 0.021405, 0.297101 0.042247 0.021405, + 0.296995 -0.042929 0.021405, 0.29668 -0.043605 0.021405, 0.311329 -0.07223 0.021405, 0.297101 -0.042247 0.021405, + 0.296995 -0.042929 0.021405, 0.311329 -0.07223 0.021405, 0.311329 -0.07223 0.021405, 0.311329 0.07223 0.021405, + 0.297101 0.042247 0.021405, 0.297101 0.042247 0.021405, 0.297101 0.042247 0.021405, 0.297101 -0.042247 0.021405, + 0.297101 -0.042247 0.021405, 0.297101 -0.042247 0.021405, 0.311329 -0.07223 0.021405, 0.297101 0.042247 0.021405, + 0.297101 -0.042247 0.021405, 0.311329 -0.07223 0.021405, 0.311329 -0.069907 -0.002176, 0.311329 -0.070252 -0.002227, + 0.311329 0.060325 0.0095, 0.311329 0.060325 0.0095, 0.311329 -0.070252 0.021227, 0.311329 -0.069907 0.021176, + 0.311329 0.060325 0.0095, 0.311329 -0.069907 0.021176, 0.311329 -0.068774 0.020892, 0.311329 -0.068774 -0.001892, + 0.311329 -0.069907 -0.002176, 0.311329 0.060325 0.0095, 0.311329 -0.067674 -0.001499, 0.311329 -0.068774 -0.001892, + 0.311329 0.060325 0.0095, 0.311329 0.060325 0.0095, 0.311329 -0.068774 0.020892, 0.311329 -0.067674 0.020499, + 0.311329 0.060325 0.0095, 0.311329 -0.067674 0.020499, 0.311329 -0.066618 0.019999, 0.311329 -0.066618 -0.000999, + 0.311329 -0.067674 -0.001499, 0.311329 0.060325 0.0095, 0.311329 -0.065616 -0.000399, 0.311329 -0.066618 -0.000999, + 0.311329 0.060325 0.0095, 0.311329 0.060325 0.0095, 0.311329 -0.066618 0.019999, 0.311329 -0.065616 0.019399, + 0.311329 0.060325 0.0095, 0.311329 -0.065616 0.019399, 0.311329 -0.064678 0.018703, 0.311329 -0.064678 0.000297, + 0.311329 -0.065616 -0.000399, 0.311329 0.060325 0.0095, 0.311329 -0.063812 0.001082, 0.311329 -0.064678 0.000297, + 0.311329 0.060325 0.0095, 0.311329 0.060325 0.0095, 0.311329 -0.064678 0.018703, 0.311329 -0.063812 0.017918, + 0.311329 0.060325 0.0095, 0.311329 -0.063812 0.017918, 0.311329 -0.063027 0.017052, 0.311329 -0.063027 0.001948, + 0.311329 -0.063812 0.001082, 0.311329 0.060325 0.0095, 0.311329 -0.062331 0.002886, 0.311329 -0.063027 0.001948, + 0.311329 0.060325 0.0095, 0.311329 0.060325 0.0095, 0.311329 -0.063027 0.017052, 0.311329 -0.062331 0.016114, + 0.311329 0.060325 0.0095, 0.311329 -0.062331 0.016114, 0.311329 -0.061731 0.015112, 0.311329 -0.061731 0.003888, + 0.311329 -0.062331 0.002886, 0.311329 0.060325 0.0095, 0.311329 -0.061231 0.004944, 0.311329 -0.061731 0.003888, + 0.311329 0.060325 0.0095, 0.311329 0.060325 0.0095, 0.311329 -0.061731 0.015112, 0.311329 -0.061231 0.014056, + 0.311329 0.060325 0.0095, 0.311329 -0.061231 0.014056, 0.311329 -0.060838 0.012956, 0.311329 -0.060838 0.006044, + 0.311329 -0.061231 0.004944, 0.311329 0.060325 0.0095, 0.311329 -0.060554 0.007177, 0.311329 -0.060838 0.006044, + 0.311329 0.060325 0.0095, 0.311329 0.060325 0.0095, 0.311329 -0.060838 0.012956, 0.311329 -0.060554 0.011823, + 0.311329 0.060325 0.0095, 0.311329 -0.060554 0.011823, 0.311329 -0.060382 0.010667, 0.311329 -0.060382 0.008333, + 0.311329 -0.060554 0.007177, 0.311329 0.060325 0.0095, 0.311329 0.060325 0.0095, 0.311329 -0.060382 0.010667, + 0.311329 -0.060325 0.0095, 0.311329 0.060325 0.0095, 0.311329 -0.060325 0.0095, 0.311329 -0.060382 0.008333, + 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 0.021405, + 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.311329 -0.07223 0.021405, 0.273229 -0.07223 0.021405, + 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, + 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, + 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.273229 -0.060382 0.010667, 0.273229 -0.060325 0.0095, + 0.273229 -0.060382 0.008333, 0.273229 -0.060382 0.008333, 0.273229 -0.060554 0.007177, 0.273229 -0.060838 0.006044, + 0.273229 -0.060838 0.006044, 0.273229 -0.061231 0.004944, 0.273229 -0.061731 0.003888, 0.273229 -0.061731 0.003888, + 0.273229 -0.062331 0.002886, 0.273229 -0.063027 0.001948, 0.273229 -0.063027 0.001948, 0.273229 -0.063812 0.001082, + 0.273229 -0.064678 0.000297, 0.273229 -0.064678 0.000297, 0.273229 -0.065616 -0.000399, 0.273229 -0.066618 -0.000999, + 0.273229 -0.066618 -0.000999, 0.273229 -0.067674 -0.001499, 0.273229 -0.068774 -0.001892, 0.273229 -0.068774 -0.001892, + 0.273229 -0.069907 -0.002176, 0.273229 -0.071063 -0.002348, 0.273229 -0.071063 -0.002348, 0.273229 -0.07223 -0.002405, + 0.273229 -0.073397 -0.002348, 0.273229 -0.073397 -0.002348, 0.273229 -0.074553 -0.002176, 0.273229 -0.075686 -0.001892, + 0.273229 -0.075686 -0.001892, 0.273229 -0.076786 -0.001499, 0.273229 -0.077842 -0.000999, 0.273229 -0.077842 -0.000999, + 0.273229 -0.078844 -0.000399, 0.273229 -0.079782 0.000297, 0.273229 -0.079782 0.000297, 0.273229 -0.080648 0.001082, + 0.273229 -0.081433 0.001948, 0.273229 -0.081433 0.001948, 0.273229 -0.082129 0.002886, 0.273229 -0.082729 0.003888, + 0.273229 -0.082729 0.003888, 0.273229 -0.083229 0.004944, 0.273229 -0.083622 0.006044, 0.273229 -0.083622 0.006044, + 0.273229 -0.083906 0.007177, 0.273229 -0.084078 0.008333, 0.273229 -0.084078 0.008333, 0.273229 -0.084135 0.0095, + 0.273229 -0.084078 0.010667, 0.273229 -0.084078 0.010667, 0.273229 -0.083906 0.011823, 0.273229 -0.083622 0.012956, + 0.273229 -0.083622 0.012956, 0.273229 -0.083229 0.014056, 0.273229 -0.082729 0.015112, 0.273229 -0.082729 0.015112, + 0.273229 -0.082129 0.016114, 0.273229 -0.081433 0.017052, 0.273229 -0.081433 0.017052, 0.273229 -0.080648 0.017918, + 0.273229 -0.079782 0.018703, 0.273229 -0.079782 0.018703, 0.273229 -0.078844 0.019399, 0.273229 -0.077842 0.019999, + 0.273229 -0.077842 0.019999, 0.273229 -0.076786 0.020499, 0.273229 -0.075686 0.020892, 0.273229 -0.075686 0.020892, + 0.273229 -0.074553 0.021176, 0.273229 -0.073397 0.021348, 0.273229 -0.073397 0.021348, 0.273229 -0.07223 0.021405, + 0.273229 -0.071063 0.021348, 0.273229 -0.071063 0.021348, 0.273229 -0.069907 0.021176, 0.273229 -0.068774 0.020892, + 0.273229 -0.068774 0.020892, 0.273229 -0.067674 0.020499, 0.273229 -0.066618 0.019999, 0.273229 -0.066618 0.019999, + 0.273229 -0.065616 0.019399, 0.273229 -0.064678 0.018703, 0.273229 -0.064678 0.018703, 0.273229 -0.063812 0.017918, + 0.273229 -0.063027 0.017052, 0.273229 -0.063027 0.017052, 0.273229 -0.062331 0.016114, 0.273229 -0.061731 0.015112, + 0.273229 -0.061731 0.015112, 0.273229 -0.061231 0.014056, 0.273229 -0.060838 0.012956, 0.273229 -0.060838 0.012956, + 0.273229 -0.060554 0.011823, 0.273229 -0.060382 0.010667, 0.273229 -0.060382 0.010667, 0.273229 -0.060382 0.008333, + 0.273229 -0.060838 0.006044, 0.273229 -0.060838 0.006044, 0.273229 -0.061731 0.003888, 0.273229 -0.063027 0.001948, + 0.273229 -0.063027 0.001948, 0.273229 -0.064678 0.000297, 0.273229 -0.066618 -0.000999, 0.273229 -0.066618 -0.000999, + 0.273229 -0.068774 -0.001892, 0.273229 -0.071063 -0.002348, 0.273229 -0.071063 -0.002348, 0.273229 -0.073397 -0.002348, + 0.273229 -0.075686 -0.001892, 0.273229 -0.075686 -0.001892, 0.273229 -0.077842 -0.000999, 0.273229 -0.079782 0.000297, + 0.273229 -0.079782 0.000297, 0.273229 -0.081433 0.001948, 0.273229 -0.082729 0.003888, 0.273229 -0.082729 0.003888, + 0.273229 -0.083622 0.006044, 0.273229 -0.084078 0.008333, 0.273229 -0.084078 0.008333, 0.273229 -0.084078 0.010667, + 0.273229 -0.083622 0.012956, 0.273229 -0.083622 0.012956, 0.273229 -0.082729 0.015112, 0.273229 -0.081433 0.017052, + 0.273229 -0.081433 0.017052, 0.273229 -0.079782 0.018703, 0.273229 -0.077842 0.019999, 0.273229 -0.077842 0.019999, + 0.273229 -0.075686 0.020892, 0.273229 -0.073397 0.021348, 0.273229 -0.073397 0.021348, 0.273229 -0.071063 0.021348, + 0.273229 -0.068774 0.020892, 0.273229 -0.068774 0.020892, 0.273229 -0.066618 0.019999, 0.273229 -0.064678 0.018703, + 0.273229 -0.064678 0.018703, 0.273229 -0.063027 0.017052, 0.273229 -0.061731 0.015112, 0.273229 -0.061731 0.015112, + 0.273229 -0.060838 0.012956, 0.273229 -0.060382 0.010667, 0.273229 -0.060382 0.010667, 0.273229 -0.060838 0.006044, + 0.273229 -0.063027 0.001948, 0.273229 -0.063027 0.001948, 0.273229 -0.066618 -0.000999, 0.273229 -0.071063 -0.002348, + 0.273229 -0.071063 -0.002348, 0.273229 -0.075686 -0.001892, 0.273229 -0.079782 0.000297, 0.273229 -0.079782 0.000297, + 0.273229 -0.082729 0.003888, 0.273229 -0.084078 0.008333, 0.273229 -0.084078 0.008333, 0.273229 -0.083622 0.012956, + 0.273229 -0.081433 0.017052, 0.273229 -0.081433 0.017052, 0.273229 -0.077842 0.019999, 0.273229 -0.073397 0.021348, + 0.273229 -0.073397 0.021348, 0.273229 -0.068774 0.020892, 0.273229 -0.064678 0.018703, 0.273229 -0.064678 0.018703, + 0.273229 -0.061731 0.015112, 0.273229 -0.060382 0.010667, 0.273229 -0.060382 0.010667, 0.273229 -0.063027 0.001948, + 0.273229 -0.071063 -0.002348, 0.273229 -0.071063 -0.002348, 0.273229 -0.079782 0.000297, 0.273229 -0.084078 0.008333, + 0.273229 -0.084078 0.008333, 0.273229 -0.081433 0.017052, 0.273229 -0.073397 0.021348, 0.273229 -0.073397 0.021348, + 0.273229 -0.064678 0.018703, 0.273229 -0.060382 0.010667, 0.273229 -0.060382 0.010667, 0.273229 -0.071063 -0.002348, + 0.273229 -0.084078 0.008333, 0.273229 -0.084078 0.008333, 0.273229 -0.073397 0.021348, 0.273229 -0.060382 0.010667, + 0.273229 -0.070252 -0.002227, 0.273229 -0.070511 -0.002266, 0.273229 -0.07071 -0.002295, 0.273229 -0.071063 -0.002348, + 0.273229 -0.069907 -0.002176, 0.273229 -0.070252 -0.002227, 0.273229 -0.070252 -0.002227, 0.273229 -0.07071 -0.002295, + 0.273229 -0.070866 -0.002318, 0.273229 -0.070866 -0.002318, 0.273229 -0.070989 -0.002337, 0.273229 -0.071063 -0.002348, + 0.273229 -0.070252 -0.002227, 0.273229 -0.070866 -0.002318, 0.273229 -0.071063 -0.002348, 0.273229 -0.071063 -0.002348, + 0.273229 -0.072229 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, + 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, + 0.273229 -0.07223 -0.002405, 0.273229 -0.071063 -0.002348, 0.273229 -0.07223 -0.002405, 0.311329 -0.07223 -0.002405, + 0.311329 -0.071063 -0.002348, 0.311329 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, + 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.311329 -0.07223 -0.002405, 0.311329 -0.07223 -0.002405, + 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, + 0.311329 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.07223 -0.002405, 0.311329 -0.07223 -0.002405, + 0.311329 -0.073397 -0.002348, 0.311329 -0.073397 -0.002348, 0.273229 -0.073397 -0.002348, 0.273229 -0.07223 -0.002405, + 0.273229 -0.073397 -0.002348, 0.311329 -0.073397 -0.002348, 0.311329 -0.074553 -0.002176, 0.311329 -0.074553 -0.002176, + 0.273229 -0.074553 -0.002176, 0.273229 -0.073397 -0.002348, 0.273229 -0.074553 -0.002176, 0.311329 -0.074553 -0.002176, + 0.311329 -0.075686 -0.001892, 0.311329 -0.075686 -0.001892, 0.273229 -0.075686 -0.001892, 0.273229 -0.074553 -0.002176, + 0.273229 -0.075686 -0.001892, 0.311329 -0.075686 -0.001892, 0.311329 -0.076786 -0.001499, 0.311329 -0.076786 -0.001499, + 0.273229 -0.076786 -0.001499, 0.273229 -0.075686 -0.001892, 0.273229 -0.076786 -0.001499, 0.311329 -0.076786 -0.001499, + 0.311329 -0.077842 -0.000999, 0.311329 -0.077842 -0.000999, 0.273229 -0.077842 -0.000999, 0.273229 -0.076786 -0.001499, + 0.273229 -0.077842 -0.000999, 0.311329 -0.077842 -0.000999, 0.311329 -0.078844 -0.000399, 0.311329 -0.078844 -0.000399, + 0.273229 -0.078844 -0.000399, 0.273229 -0.077842 -0.000999, 0.273229 -0.078844 -0.000399, 0.311329 -0.078844 -0.000399, + 0.311329 -0.079782 0.000297, 0.311329 -0.079782 0.000297, 0.273229 -0.079782 0.000297, 0.273229 -0.078844 -0.000399, + 0.273229 -0.079782 0.000297, 0.311329 -0.079782 0.000297, 0.311329 -0.080648 0.001082, 0.311329 -0.080648 0.001082, + 0.273229 -0.080648 0.001082, 0.273229 -0.079782 0.000297, 0.273229 -0.080648 0.001082, 0.311329 -0.080648 0.001082, + 0.311329 -0.081433 0.001948, 0.311329 -0.081433 0.001948, 0.273229 -0.081433 0.001948, 0.273229 -0.080648 0.001082, + 0.273229 -0.081433 0.001948, 0.311329 -0.081433 0.001948, 0.311329 -0.082129 0.002886, 0.311329 -0.082129 0.002886, + 0.273229 -0.082129 0.002886, 0.273229 -0.081433 0.001948, 0.273229 -0.082129 0.002886, 0.311329 -0.082129 0.002886, + 0.311329 -0.082729 0.003888, 0.311329 -0.082729 0.003888, 0.273229 -0.082729 0.003888, 0.273229 -0.082129 0.002886, + 0.273229 -0.082729 0.003888, 0.311329 -0.082729 0.003888, 0.311329 -0.083229 0.004944, 0.311329 -0.083229 0.004944, + 0.273229 -0.083229 0.004944, 0.273229 -0.082729 0.003888, 0.273229 -0.083229 0.004944, 0.311329 -0.083229 0.004944, + 0.311329 -0.083622 0.006044, 0.311329 -0.083622 0.006044, 0.273229 -0.083622 0.006044, 0.273229 -0.083229 0.004944, + 0.273229 -0.083622 0.006044, 0.311329 -0.083622 0.006044, 0.311329 -0.083906 0.007177, 0.311329 -0.083906 0.007177, + 0.273229 -0.083906 0.007177, 0.273229 -0.083622 0.006044, 0.273229 -0.083906 0.007177, 0.311329 -0.083906 0.007177, + 0.311329 -0.084078 0.008333, 0.311329 -0.084078 0.008333, 0.273229 -0.084078 0.008333, 0.273229 -0.083906 0.007177, + 0.273229 -0.084078 0.008333, 0.311329 -0.084078 0.008333, 0.311329 -0.084135 0.0095, 0.311329 -0.084135 0.0095, + 0.273229 -0.084135 0.0095, 0.273229 -0.084078 0.008333, 0.273229 -0.084135 0.0095, 0.311329 -0.084135 0.0095, + 0.311329 -0.084078 0.010667, 0.311329 -0.084078 0.010667, 0.273229 -0.084078 0.010667, 0.273229 -0.084135 0.0095, + 0.273229 -0.084078 0.010667, 0.311329 -0.084078 0.010667, 0.311329 -0.083906 0.011823, 0.311329 -0.083906 0.011823, + 0.273229 -0.083906 0.011823, 0.273229 -0.084078 0.010667, 0.273229 -0.083906 0.011823, 0.311329 -0.083906 0.011823, + 0.311329 -0.083622 0.012956, 0.311329 -0.083622 0.012956, 0.273229 -0.083622 0.012956, 0.273229 -0.083906 0.011823, + 0.273229 -0.083622 0.012956, 0.311329 -0.083622 0.012956, 0.311329 -0.083229 0.014056, 0.311329 -0.083229 0.014056, + 0.273229 -0.083229 0.014056, 0.273229 -0.083622 0.012956, 0.273229 -0.083229 0.014056, 0.311329 -0.083229 0.014056, + 0.311329 -0.082729 0.015112, 0.311329 -0.082729 0.015112, 0.273229 -0.082729 0.015112, 0.273229 -0.083229 0.014056, + 0.273229 -0.082729 0.015112, 0.311329 -0.082729 0.015112, 0.311329 -0.082129 0.016114, 0.311329 -0.082129 0.016114, + 0.273229 -0.082129 0.016114, 0.273229 -0.082729 0.015112, 0.273229 -0.082129 0.016114, 0.311329 -0.082129 0.016114, + 0.311329 -0.081433 0.017052, 0.311329 -0.081433 0.017052, 0.273229 -0.081433 0.017052, 0.273229 -0.082129 0.016114, + 0.273229 -0.081433 0.017052, 0.311329 -0.081433 0.017052, 0.311329 -0.080648 0.017918, 0.311329 -0.080648 0.017918, + 0.273229 -0.080648 0.017918, 0.273229 -0.081433 0.017052, 0.273229 -0.080648 0.017918, 0.311329 -0.080648 0.017918, + 0.311329 -0.079782 0.018703, 0.311329 -0.079782 0.018703, 0.273229 -0.079782 0.018703, 0.273229 -0.080648 0.017918, + 0.273229 -0.079782 0.018703, 0.311329 -0.079782 0.018703, 0.311329 -0.078844 0.019399, 0.311329 -0.078844 0.019399, + 0.273229 -0.078844 0.019399, 0.273229 -0.079782 0.018703, 0.273229 -0.078844 0.019399, 0.311329 -0.078844 0.019399, + 0.311329 -0.077842 0.019999, 0.311329 -0.077842 0.019999, 0.273229 -0.077842 0.019999, 0.273229 -0.078844 0.019399, + 0.273229 -0.077842 0.019999, 0.311329 -0.077842 0.019999, 0.311329 -0.076786 0.020499, 0.311329 -0.076786 0.020499, + 0.273229 -0.076786 0.020499, 0.273229 -0.077842 0.019999, 0.273229 -0.076786 0.020499, 0.311329 -0.076786 0.020499, + 0.311329 -0.075686 0.020892, 0.311329 -0.075686 0.020892, 0.273229 -0.075686 0.020892, 0.273229 -0.076786 0.020499, + 0.273229 -0.075686 0.020892, 0.311329 -0.075686 0.020892, 0.311329 -0.074553 0.021176, 0.311329 -0.074553 0.021176, + 0.273229 -0.074553 0.021176, 0.273229 -0.075686 0.020892, 0.273229 -0.074553 0.021176, 0.311329 -0.074553 0.021176, + 0.311329 -0.073397 0.021348, 0.311329 -0.073397 0.021348, 0.273229 -0.073397 0.021348, 0.273229 -0.074553 0.021176, + 0.273229 -0.07223 0.021405, 0.273229 -0.073397 0.021348, 0.311329 -0.073397 0.021348, 0.311329 -0.073397 0.021348, + 0.311329 -0.07223 0.021405, 0.311329 -0.07223 0.021405, 0.311329 -0.073397 0.021348, 0.311329 -0.07223 0.021405, + 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.311329 -0.07223 0.021405, 0.273229 -0.07223 0.021405, + 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, + 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, + 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.273229 -0.071063 0.021348, 0.273229 -0.07223 0.021405, + 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, + 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.273229 -0.070866 0.021318, 0.273229 -0.07071 0.021295, + 0.273229 -0.070511 0.021266, 0.273229 -0.071063 0.021348, 0.273229 -0.070989 0.021337, 0.273229 -0.070866 0.021318, + 0.273229 -0.070866 0.021318, 0.273229 -0.070511 0.021266, 0.273229 -0.070252 0.021227, 0.273229 -0.070252 0.021227, + 0.273229 -0.069907 0.021176, 0.273229 -0.071063 0.021348, 0.273229 -0.071063 0.021348, 0.273229 -0.070866 0.021318, + 0.273229 -0.070252 0.021227, 0.311329 -0.071063 -0.002348, 0.311329 -0.070989 -0.002337, 0.311329 -0.070865 -0.002318, + 0.311329 -0.070865 -0.002318, 0.311329 -0.07071 -0.002295, 0.311329 -0.070511 -0.002266, 0.311329 -0.070511 -0.002266, + 0.311329 -0.070252 -0.002227, 0.311329 -0.069907 -0.002176, 0.311329 -0.069907 -0.002176, 0.311329 -0.071063 -0.002348, + 0.311329 -0.070865 -0.002318, 0.311329 -0.069907 -0.002176, 0.311329 -0.070865 -0.002318, 0.311329 -0.070511 -0.002266, + 0.311329 -0.060554 0.007177, 0.311329 -0.060382 0.008333, 0.311329 -0.060325 0.0095, 0.311329 -0.060325 0.0095, + 0.311329 -0.060382 0.010667, 0.311329 -0.060554 0.011823, 0.311329 -0.060554 0.011823, 0.311329 -0.060838 0.012956, + 0.311329 -0.061231 0.014056, 0.311329 -0.061231 0.014056, 0.311329 -0.061731 0.015112, 0.311329 -0.062331 0.016114, + 0.311329 -0.062331 0.016114, 0.311329 -0.063027 0.017052, 0.311329 -0.063812 0.017918, 0.311329 -0.063812 0.017918, + 0.311329 -0.064678 0.018703, 0.311329 -0.065616 0.019399, 0.311329 -0.065616 0.019399, 0.311329 -0.066618 0.019999, + 0.311329 -0.067674 0.020499, 0.311329 -0.067674 0.020499, 0.311329 -0.068774 0.020892, 0.311329 -0.069907 0.021176, + 0.311329 -0.069907 0.021176, 0.311329 -0.071063 0.021348, 0.311329 -0.07223 0.021405, 0.311329 -0.07223 0.021405, + 0.311329 -0.073397 0.021348, 0.311329 -0.074553 0.021176, 0.311329 -0.074553 0.021176, 0.311329 -0.075686 0.020892, + 0.311329 -0.076786 0.020499, 0.311329 -0.076786 0.020499, 0.311329 -0.077842 0.019999, 0.311329 -0.078844 0.019399, + 0.311329 -0.078844 0.019399, 0.311329 -0.079782 0.018703, 0.311329 -0.080648 0.017918, 0.311329 -0.080648 0.017918, + 0.311329 -0.081433 0.017052, 0.311329 -0.082129 0.016114, 0.311329 -0.082129 0.016114, 0.311329 -0.082729 0.015112, + 0.311329 -0.083229 0.014056, 0.311329 -0.083229 0.014056, 0.311329 -0.083622 0.012956, 0.311329 -0.083906 0.011823, + 0.311329 -0.083906 0.011823, 0.311329 -0.084078 0.010667, 0.311329 -0.084135 0.0095, 0.311329 -0.084135 0.0095, + 0.311329 -0.084078 0.008333, 0.311329 -0.083906 0.007177, 0.311329 -0.083906 0.007177, 0.311329 -0.083622 0.006044, + 0.311329 -0.083229 0.004944, 0.311329 -0.083229 0.004944, 0.311329 -0.082729 0.003888, 0.311329 -0.082129 0.002886, + 0.311329 -0.082129 0.002886, 0.311329 -0.081433 0.001948, 0.311329 -0.080648 0.001082, 0.311329 -0.080648 0.001082, + 0.311329 -0.079782 0.000297, 0.311329 -0.078844 -0.000399, 0.311329 -0.078844 -0.000399, 0.311329 -0.077842 -0.000999, + 0.311329 -0.076786 -0.001499, 0.311329 -0.076786 -0.001499, 0.311329 -0.075686 -0.001892, 0.311329 -0.074553 -0.002176, + 0.311329 -0.074553 -0.002176, 0.311329 -0.073397 -0.002348, 0.311329 -0.07223 -0.002405, 0.311329 -0.07223 -0.002405, + 0.311329 -0.071063 -0.002348, 0.311329 -0.069907 -0.002176, 0.311329 -0.069907 -0.002176, 0.311329 -0.068774 -0.001892, + 0.311329 -0.067674 -0.001499, 0.311329 -0.067674 -0.001499, 0.311329 -0.066618 -0.000999, 0.311329 -0.065616 -0.000399, + 0.311329 -0.065616 -0.000399, 0.311329 -0.064678 0.000297, 0.311329 -0.063812 0.001082, 0.311329 -0.063812 0.001082, + 0.311329 -0.063027 0.001948, 0.311329 -0.062331 0.002886, 0.311329 -0.062331 0.002886, 0.311329 -0.061731 0.003888, + 0.311329 -0.061231 0.004944, 0.311329 -0.061231 0.004944, 0.311329 -0.060838 0.006044, 0.311329 -0.060554 0.007177, + 0.311329 -0.060554 0.007177, 0.311329 -0.060325 0.0095, 0.311329 -0.060554 0.011823, 0.311329 -0.060554 0.011823, + 0.311329 -0.061231 0.014056, 0.311329 -0.062331 0.016114, 0.311329 -0.062331 0.016114, 0.311329 -0.063812 0.017918, + 0.311329 -0.065616 0.019399, 0.311329 -0.065616 0.019399, 0.311329 -0.067674 0.020499, 0.311329 -0.069907 0.021176, + 0.311329 -0.069907 0.021176, 0.311329 -0.07223 0.021405, 0.311329 -0.074553 0.021176, 0.311329 -0.074553 0.021176, + 0.311329 -0.076786 0.020499, 0.311329 -0.078844 0.019399, 0.311329 -0.078844 0.019399, 0.311329 -0.080648 0.017918, + 0.311329 -0.082129 0.016114, 0.311329 -0.082129 0.016114, 0.311329 -0.083229 0.014056, 0.311329 -0.083906 0.011823, + 0.311329 -0.083906 0.011823, 0.311329 -0.084135 0.0095, 0.311329 -0.083906 0.007177, 0.311329 -0.083906 0.007177, + 0.311329 -0.083229 0.004944, 0.311329 -0.082129 0.002886, 0.311329 -0.082129 0.002886, 0.311329 -0.080648 0.001082, + 0.311329 -0.078844 -0.000399, 0.311329 -0.078844 -0.000399, 0.311329 -0.076786 -0.001499, 0.311329 -0.074553 -0.002176, + 0.311329 -0.074553 -0.002176, 0.311329 -0.07223 -0.002405, 0.311329 -0.069907 -0.002176, 0.311329 -0.069907 -0.002176, + 0.311329 -0.067674 -0.001499, 0.311329 -0.065616 -0.000399, 0.311329 -0.065616 -0.000399, 0.311329 -0.063812 0.001082, + 0.311329 -0.062331 0.002886, 0.311329 -0.062331 0.002886, 0.311329 -0.061231 0.004944, 0.311329 -0.060554 0.007177, + 0.311329 -0.060554 0.007177, 0.311329 -0.060554 0.011823, 0.311329 -0.062331 0.016114, 0.311329 -0.062331 0.016114, + 0.311329 -0.065616 0.019399, 0.311329 -0.069907 0.021176, 0.311329 -0.069907 0.021176, 0.311329 -0.074553 0.021176, + 0.311329 -0.078844 0.019399, 0.311329 -0.078844 0.019399, 0.311329 -0.082129 0.016114, 0.311329 -0.083906 0.011823, + 0.311329 -0.083906 0.011823, 0.311329 -0.083906 0.007177, 0.311329 -0.082129 0.002886, 0.311329 -0.082129 0.002886, + 0.311329 -0.078844 -0.000399, 0.311329 -0.074553 -0.002176, 0.311329 -0.074553 -0.002176, 0.311329 -0.069907 -0.002176, + 0.311329 -0.065616 -0.000399, 0.311329 -0.065616 -0.000399, 0.311329 -0.062331 0.002886, 0.311329 -0.060554 0.007177, + 0.311329 -0.060554 0.007177, 0.311329 -0.062331 0.016114, 0.311329 -0.069907 0.021176, 0.311329 -0.069907 0.021176, + 0.311329 -0.078844 0.019399, 0.311329 -0.083906 0.011823, 0.311329 -0.083906 0.011823, 0.311329 -0.082129 0.002886, + 0.311329 -0.074553 -0.002176, 0.311329 -0.074553 -0.002176, 0.311329 -0.065616 -0.000399, 0.311329 -0.060554 0.007177, + 0.311329 -0.060554 0.007177, 0.311329 -0.069907 0.021176, 0.311329 -0.083906 0.011823, 0.311329 -0.083906 0.011823, + 0.311329 -0.074553 -0.002176, 0.311329 -0.060554 0.007177, 0.311329 -0.07223 0.021405, 0.311329 -0.07223 0.021405, + 0.311329 -0.071063 0.021348, 0.311329 -0.071063 0.021348, 0.311329 -0.071063 0.021348, 0.311329 -0.07223 0.021405, + 0.311329 -0.060382 0.008333, 0.311329 -0.060382 0.008333, 0.311329 -0.060554 0.007177, 0.311329 -0.060554 0.007177, + 0.311329 -0.060554 0.007177, 0.311329 -0.060382 0.008333, 0.311329 -0.060325 0.0095, 0.311329 -0.060325 0.0095, + 0.311329 -0.060382 0.008333, 0.311329 -0.060382 0.008333, 0.311329 -0.060382 0.008333, 0.311329 -0.060325 0.0095, + 0.311329 -0.060382 0.010667, 0.311329 -0.060382 0.010667, 0.311329 -0.060325 0.0095, 0.311329 -0.060325 0.0095, + 0.311329 -0.060325 0.0095, 0.311329 -0.060382 0.010667, 0.311329 -0.060554 0.011823, 0.311329 -0.060554 0.011823, + 0.311329 -0.060382 0.010667, 0.311329 -0.060382 0.010667, 0.311329 -0.060382 0.010667, 0.311329 -0.060554 0.011823, + 0.311329 -0.060838 0.012956, 0.311329 -0.060838 0.012956, 0.311329 -0.060554 0.011823, 0.311329 -0.060554 0.011823, + 0.311329 -0.060554 0.011823, 0.311329 -0.060838 0.012956, 0.311329 -0.061231 0.014056, 0.311329 -0.061231 0.014056, + 0.311329 -0.060838 0.012956, 0.311329 -0.060838 0.012956, 0.311329 -0.060838 0.012956, 0.311329 -0.061231 0.014056, + 0.311329 -0.061731 0.015112, 0.311329 -0.061731 0.015112, 0.311329 -0.061231 0.014056, 0.311329 -0.061231 0.014056, + 0.311329 -0.061231 0.014056, 0.311329 -0.061731 0.015112, 0.311329 -0.062331 0.016114, 0.311329 -0.062331 0.016114, + 0.311329 -0.061731 0.015112, 0.311329 -0.061731 0.015112, 0.311329 -0.061731 0.015112, 0.311329 -0.062331 0.016114, + 0.311329 -0.063027 0.017052, 0.311329 -0.063027 0.017052, 0.311329 -0.062331 0.016114, 0.311329 -0.062331 0.016114, + 0.311329 -0.062331 0.016114, 0.311329 -0.063027 0.017052, 0.311329 -0.063812 0.017918, 0.311329 -0.063812 0.017918, + 0.311329 -0.063027 0.017052, 0.311329 -0.063027 0.017052, 0.311329 -0.063027 0.017052, 0.311329 -0.063812 0.017918, + 0.311329 -0.064678 0.018703, 0.311329 -0.064678 0.018703, 0.311329 -0.063812 0.017918, 0.311329 -0.063812 0.017918, + 0.311329 -0.063812 0.017918, 0.311329 -0.064678 0.018703, 0.311329 -0.065616 0.019399, 0.311329 -0.065616 0.019399, + 0.311329 -0.064678 0.018703, 0.311329 -0.064678 0.018703, 0.311329 -0.064678 0.018703, 0.311329 -0.065616 0.019399, + 0.311329 -0.066618 0.019999, 0.311329 -0.066618 0.019999, 0.311329 -0.065616 0.019399, 0.311329 -0.065616 0.019399, + 0.311329 -0.065616 0.019399, 0.311329 -0.066618 0.019999, 0.311329 -0.067674 0.020499, 0.311329 -0.067674 0.020499, + 0.311329 -0.066618 0.019999, 0.311329 -0.066618 0.019999, 0.311329 -0.066618 0.019999, 0.311329 -0.067674 0.020499, + 0.311329 -0.068774 0.020892, 0.311329 -0.068774 0.020892, 0.311329 -0.067674 0.020499, 0.311329 -0.067674 0.020499, + 0.311329 -0.067674 0.020499, 0.311329 -0.068774 0.020892, 0.311329 -0.069907 0.021176, 0.311329 -0.069907 0.021176, + 0.311329 -0.068774 0.020892, 0.311329 -0.068774 0.020892, 0.311329 -0.068774 0.020892, 0.311329 -0.069907 0.021176, + 0.311329 -0.070989 0.021337, 0.311329 -0.071063 0.021348, 0.311329 -0.071063 0.021348, 0.311329 -0.071063 0.021348, + 0.311329 -0.069907 0.021176, 0.311329 -0.069907 0.021176, 0.311329 -0.070252 0.021227, 0.311329 -0.070511 0.021266, + 0.311329 -0.07071 0.021295, 0.311329 -0.071063 0.021348, 0.311329 -0.069907 0.021176, 0.311329 -0.070252 0.021227, + 0.311329 -0.070865 0.021318, 0.311329 -0.070989 0.021337, 0.311329 -0.071063 0.021348, 0.311329 -0.070252 0.021227, + 0.311329 -0.07071 0.021295, 0.311329 -0.070865 0.021318, 0.311329 -0.071063 0.021348, 0.311329 -0.070252 0.021227, + 0.311329 -0.070865 0.021318, 0.311329 -0.060838 0.006044, 0.311329 -0.060838 0.006044, 0.311329 -0.061231 0.004944, + 0.311329 -0.060554 0.007177, 0.311329 -0.060554 0.007177, 0.311329 -0.060838 0.006044, 0.311329 -0.060838 0.006044, + 0.311329 -0.060838 0.006044, 0.311329 -0.060554 0.007177, 0.273229 -0.049179 -0.000335, 0.273229 -0.070252 -0.002227, + 0.273229 -0.069907 -0.002176, 0.273229 -0.049179 -0.000335, 0.273229 -0.069907 -0.002176, 0.273229 -0.068774 -0.001892, + 0.273229 -0.069907 0.021176, 0.273229 -0.070252 0.021227, 0.273229 -0.049179 0.019335, 0.273229 -0.068774 0.020892, + 0.273229 -0.069907 0.021176, 0.273229 -0.049179 0.019335, 0.273229 -0.049179 -0.000335, 0.273229 -0.068774 -0.001892, + 0.273229 -0.067674 -0.001499, 0.273229 -0.049179 -0.000335, 0.273229 -0.067674 -0.001499, 0.273229 -0.066618 -0.000999, + 0.273229 -0.067674 0.020499, 0.273229 -0.068774 0.020892, 0.273229 -0.049179 0.019335, 0.273229 -0.066618 0.019999, + 0.273229 -0.067674 0.020499, 0.273229 -0.049179 0.019335, 0.273229 -0.049179 -0.000335, 0.273229 -0.066618 -0.000999, + 0.273229 -0.065616 -0.000399, 0.273229 -0.049179 -0.000335, 0.273229 -0.065616 -0.000399, 0.273229 -0.064678 0.000297, + 0.273229 -0.065616 0.019399, 0.273229 -0.066618 0.019999, 0.273229 -0.049179 0.019335, 0.273229 -0.064678 0.018703, + 0.273229 -0.065616 0.019399, 0.273229 -0.049179 0.019335, 0.273229 -0.049179 -0.000335, 0.273229 -0.064678 0.000297, + 0.273229 -0.063812 0.001082, 0.273229 -0.049179 -0.000335, 0.273229 -0.063812 0.001082, 0.273229 -0.063027 0.001948, + 0.273229 -0.063812 0.017918, 0.273229 -0.064678 0.018703, 0.273229 -0.049179 0.019335, 0.273229 -0.063027 0.017052, + 0.273229 -0.063812 0.017918, 0.273229 -0.049179 0.019335, 0.273229 -0.049179 0.019335, 0.273229 -0.049179 -0.000335, + 0.273229 -0.063027 0.001948, 0.273229 -0.049179 0.019335, 0.273229 -0.063027 0.001948, 0.273229 -0.062331 0.002886, + 0.273229 -0.062331 0.016114, 0.273229 -0.063027 0.017052, 0.273229 -0.049179 0.019335, 0.273229 -0.061731 0.015112, + 0.273229 -0.062331 0.016114, 0.273229 -0.049179 0.019335, 0.273229 -0.049179 0.019335, 0.273229 -0.062331 0.002886, + 0.273229 -0.061731 0.003888, 0.273229 -0.049179 0.019335, 0.273229 -0.061731 0.003888, 0.273229 -0.061231 0.004944, + 0.273229 -0.061231 0.014056, 0.273229 -0.061731 0.015112, 0.273229 -0.049179 0.019335, 0.273229 -0.060838 0.012956, + 0.273229 -0.061231 0.014056, 0.273229 -0.049179 0.019335, 0.273229 -0.049179 0.019335, 0.273229 -0.061231 0.004944, + 0.273229 -0.060838 0.006044, 0.273229 -0.049179 0.019335, 0.273229 -0.060838 0.006044, 0.273229 -0.060554 0.007177, + 0.273229 -0.060554 0.011823, 0.273229 -0.060838 0.012956, 0.273229 -0.049179 0.019335, 0.273229 -0.060382 0.010667, + 0.273229 -0.060554 0.011823, 0.273229 -0.049179 0.019335, 0.273229 -0.049179 0.019335, 0.273229 -0.060554 0.007177, + 0.273229 -0.060382 0.008333, 0.273229 -0.060325 0.0095, 0.273229 -0.060382 0.010667, 0.273229 -0.049179 0.019335, + 0.273229 -0.049179 0.019335, 0.273229 -0.060382 0.008333, 0.273229 -0.060325 0.0095, 0.273229 0.049179 0.012643, + 0.273229 0.049179 0.013696, 0.273229 0.060838 0.012956, 0.273229 0.060838 0.012956, 0.273229 0.060554 0.011823, + 0.273229 0.049179 0.012643, 0.295433 0.044912 0.021405, 0.295433 0.044912 -0.002405, 0.296158 0.044268 -0.002405, + 0.296158 0.044268 -0.002405, 0.296158 0.044268 0.021405, 0.295433 0.044912 0.021405, 0.297101 -0.042247 0.021405, + 0.297101 -0.042247 -0.002405, 0.296995 -0.042929 -0.002405, 0.296995 -0.042929 -0.002405, 0.296995 -0.042929 0.021405, + 0.297101 -0.042247 0.021405, 0.295433 -0.044912 0.021405, 0.295433 -0.044912 -0.002405, 0.294514 -0.045529 -0.002405, + 0.294514 -0.045529 -0.002405, 0.294514 -0.045529 0.021405, 0.295433 -0.044912 0.021405, 0.294514 -0.045529 0.021405, + 0.294514 -0.045529 -0.002405, 0.293409 -0.046115 -0.002405, 0.293409 -0.046115 -0.002405, 0.293409 -0.046115 0.021405, + 0.294514 -0.045529 0.021405, 0.277343 -0.049176 0.021405, 0.277343 -0.049176 -0.002405, 0.275196 -0.04921 -0.002405, + 0.275196 -0.04921 -0.002405, 0.275196 -0.04921 0.021405, 0.277343 -0.049176 0.021405, 0.281554 -0.04891 0.021405, + 0.281554 -0.04891 -0.002405, 0.279469 -0.049076 -0.002405, 0.279469 -0.049076 -0.002405, 0.279469 -0.049076 0.021405, + 0.281554 -0.04891 0.021405, 0.29668 0.043605 0.021405, 0.29668 0.043605 -0.002405, 0.296995 0.042929 -0.002405, + 0.296995 0.042929 -0.002405, 0.296995 0.042929 0.021405, 0.29668 0.043605 0.021405, 0.277343 0.049176 0.021405, + 0.277343 0.049176 -0.002405, 0.279469 0.049076 -0.002405, 0.279469 0.049076 -0.002405, 0.279469 0.049076 0.021405, + 0.277343 0.049176 0.021405, 0.287366 -0.048036 0.021405, 0.287366 -0.048036 -0.002405, 0.285522 -0.048388 -0.002405, + 0.285522 -0.048388 -0.002405, 0.285522 -0.048388 0.021405, 0.287366 -0.048036 0.021405, 0.290685 0.047171 0.021405, + 0.290685 0.047171 -0.002405, 0.292129 0.046664 -0.002405, 0.292129 0.046664 -0.002405, 0.292129 0.046664 0.021405, + 0.290685 0.047171 0.021405, 0.297101 -0.042247 -0.002405, 0.297101 -0.042247 0.021405, 0.297101 0.042247 0.021405, + 0.297101 0.042247 0.021405, 0.297101 0.042247 -0.002405, 0.297101 -0.042247 -0.002405, 0.290685 -0.047171 0.021405, + 0.290685 -0.047171 -0.002405, 0.289092 -0.047629 -0.002405, 0.289092 -0.047629 -0.002405, 0.289092 -0.047629 0.021405, + 0.290685 -0.047171 0.021405, 0.297101 0.042247 0.021405, 0.297101 0.042247 -0.002405, 0.297101 0.042247 -0.002405, + 0.297101 0.042247 -0.002405, 0.297101 0.042247 0.021405, 0.297101 0.042247 0.021405, 0.283578 0.04868 0.021405, + 0.283578 0.04868 -0.002405, 0.285522 0.048388 -0.002405, 0.285522 0.048388 -0.002405, 0.285522 0.048388 0.021405, + 0.283578 0.04868 0.021405, 0.273229 0.049179 0.007426, 0.273229 0.049179 0.008499, 0.273229 0.060325 0.0095, + 0.273229 0.060325 0.0095, 0.273229 0.060382 0.008333, 0.273229 0.049179 0.007426, 0.287366 0.048036 0.021405, + 0.287366 0.048036 -0.002405, 0.289092 0.047629 -0.002405, 0.289092 0.047629 -0.002405, 0.289092 0.047629 0.021405, + 0.287366 0.048036 0.021405, 0.296995 -0.042929 0.021405, 0.296995 -0.042929 -0.002405, 0.29668 -0.043605 -0.002405, + 0.29668 -0.043605 -0.002405, 0.29668 -0.043605 0.021405, 0.296995 -0.042929 0.021405, 0.293409 -0.046115 0.021405, + 0.293409 -0.046115 -0.002405, 0.292129 -0.046664 -0.002405, 0.292129 -0.046664 -0.002405, 0.292129 -0.046664 0.021405, + 0.293409 -0.046115 0.021405, 0.281554 0.04891 0.021405, 0.281554 0.04891 -0.002405, 0.283578 0.04868 -0.002405, + 0.283578 0.04868 -0.002405, 0.283578 0.04868 0.021405, 0.281554 0.04891 0.021405, 0.296158 0.044268 0.021405, + 0.296158 0.044268 -0.002405, 0.29668 0.043605 -0.002405, 0.29668 0.043605 -0.002405, 0.29668 0.043605 0.021405, + 0.296158 0.044268 0.021405, 0.283578 -0.04868 0.021405, 0.283578 -0.04868 -0.002405, 0.281554 -0.04891 -0.002405, + 0.281554 -0.04891 -0.002405, 0.281554 -0.04891 0.021405, 0.283578 -0.04868 0.021405, 0.275196 0.04921 0.021405, + 0.275196 0.04921 -0.002405, 0.277343 0.049176 -0.002405, 0.277343 0.049176 -0.002405, 0.277343 0.049176 0.021405, + 0.275196 0.04921 0.021405, 0.285522 -0.048388 0.021405, 0.285522 -0.048388 -0.002405, 0.283578 -0.04868 -0.002405, + 0.283578 -0.04868 -0.002405, 0.283578 -0.04868 0.021405, 0.285522 -0.048388 0.021405, 0.273229 0.049179 -0.002405, + 0.275196 0.04921 -0.002405, 0.275196 0.04921 0.021405, 0.275196 0.04921 0.021405, 0.273229 0.049179 0.021405, + 0.273229 0.049179 0.01472, 0.273229 0.049179 0.013696, 0.273229 0.049179 0.012643, 0.273229 0.049179 0.011574, + 0.275196 0.04921 0.021405, 0.273229 0.049179 0.01472, 0.273229 0.049179 0.013696, 0.273229 0.049179 0.004281, + 0.273229 0.049179 -0.002405, 0.275196 0.04921 0.021405, 0.273229 0.049179 0.007426, 0.273229 0.049179 0.006357, + 0.273229 0.049179 0.005304, 0.273229 0.049179 0.005304, 0.273229 0.049179 0.004281, 0.275196 0.04921 0.021405, + 0.275196 0.04921 0.021405, 0.273229 0.049179 0.013696, 0.273229 0.049179 0.011574, 0.275196 0.04921 0.021405, + 0.273229 0.049179 0.011574, 0.273229 0.049179 0.010501, 0.273229 0.049179 0.007426, 0.273229 0.049179 0.005304, + 0.275196 0.04921 0.021405, 0.275196 0.04921 0.021405, 0.273229 0.049179 0.010501, 0.273229 0.049179 0.008499, + 0.275196 0.04921 0.021405, 0.273229 0.049179 0.008499, 0.273229 0.049179 0.007426, 0.294514 0.045529 0.021405, + 0.294514 0.045529 -0.002405, 0.295433 0.044912 -0.002405, 0.295433 0.044912 -0.002405, 0.295433 0.044912 0.021405, + 0.294514 0.045529 0.021405, 0.273229 -0.049179 0.021405, 0.273229 -0.049179 0.020136, 0.273229 -0.070989 0.021337, + 0.273229 -0.071063 0.021348, 0.273229 -0.07223 0.021405, 0.273229 -0.07223 0.021405, 0.273229 -0.049179 0.021405, + 0.273229 -0.070989 0.021337, 0.273229 -0.071063 0.021348, 0.273229 -0.049179 0.021405, 0.273229 -0.071063 0.021348, + 0.273229 -0.07223 0.021405, 0.289092 -0.047629 0.021405, 0.289092 -0.047629 -0.002405, 0.287366 -0.048036 -0.002405, + 0.287366 -0.048036 -0.002405, 0.287366 -0.048036 0.021405, 0.289092 -0.047629 0.021405, 0.296158 -0.044268 0.021405, + 0.296158 -0.044268 -0.002405, 0.295433 -0.044912 -0.002405, 0.295433 -0.044912 -0.002405, 0.295433 -0.044912 0.021405, + 0.296158 -0.044268 0.021405, 0.293409 0.046115 0.021405, 0.293409 0.046115 -0.002405, 0.294514 0.045529 -0.002405, + 0.294514 0.045529 -0.002405, 0.294514 0.045529 0.021405, 0.293409 0.046115 0.021405, 0.285522 0.048388 0.021405, + 0.285522 0.048388 -0.002405, 0.287366 0.048036 -0.002405, 0.287366 0.048036 -0.002405, 0.287366 0.048036 0.021405, + 0.285522 0.048388 0.021405, 0.273229 0.049179 0.004281, 0.273229 0.049179 0.005304, 0.273229 0.060838 0.006044, + 0.273229 0.060838 0.006044, 0.273229 0.061231 0.004944, 0.273229 0.049179 0.004281, 0.297101 -0.042247 0.021405, + 0.297101 -0.042247 -0.002405, 0.297101 -0.042247 -0.002405, 0.297101 -0.042247 -0.002405, 0.297101 -0.042247 0.021405, + 0.297101 -0.042247 0.021405, 0.29668 -0.043605 0.021405, 0.29668 -0.043605 -0.002405, 0.296158 -0.044268 -0.002405, + 0.296158 -0.044268 -0.002405, 0.296158 -0.044268 0.021405, 0.29668 -0.043605 0.021405, 0.292129 -0.046664 0.021405, + 0.292129 -0.046664 -0.002405, 0.290685 -0.047171 -0.002405, 0.290685 -0.047171 -0.002405, 0.290685 -0.047171 0.021405, + 0.292129 -0.046664 0.021405, 0.273229 0.049179 0.005304, 0.273229 0.049179 0.006357, 0.273229 0.060554 0.007177, + 0.273229 0.060554 0.007177, 0.273229 0.060838 0.006044, 0.273229 0.049179 0.005304, 0.297101 0.042247 0.021405, + 0.297101 0.042247 -0.002405, 0.297101 0.042247 -0.002405, 0.273229 0.049179 0.010501, 0.273229 0.049179 0.011574, + 0.273229 0.060382 0.010667, 0.273229 0.060382 0.010667, 0.273229 0.060325 0.0095, 0.273229 0.049179 0.010501, + 0.273229 0.049179 0.013696, 0.273229 0.049179 0.01472, 0.273229 0.061231 0.014056, 0.273229 0.061231 0.014056, + 0.273229 0.060838 0.012956, 0.273229 0.049179 0.013696, 0.292129 0.046664 0.021405, 0.292129 0.046664 -0.002405, + 0.293409 0.046115 -0.002405, 0.293409 0.046115 -0.002405, 0.293409 0.046115 0.021405, 0.292129 0.046664 0.021405, + 0.273229 0.049179 0.006357, 0.273229 0.049179 0.007426, 0.273229 0.060382 0.008333, 0.273229 0.060382 0.008333, + 0.273229 0.060554 0.007177, 0.273229 0.049179 0.006357, 0.289092 0.047629 0.021405, 0.289092 0.047629 -0.002405, + 0.290685 0.047171 -0.002405, 0.290685 0.047171 -0.002405, 0.290685 0.047171 0.021405, 0.289092 0.047629 0.021405, + 0.279469 -0.049076 0.021405, 0.279469 -0.049076 -0.002405, 0.277343 -0.049176 -0.002405, 0.277343 -0.049176 -0.002405, + 0.277343 -0.049176 0.021405, 0.279469 -0.049076 0.021405, 0.279469 0.049076 0.021405, 0.279469 0.049076 -0.002405, + 0.281554 0.04891 -0.002405, 0.281554 0.04891 -0.002405, 0.281554 0.04891 0.021405, 0.279469 0.049076 0.021405, + 0.273229 -0.049179 0.021405, 0.275196 -0.04921 0.021405, 0.275196 -0.04921 -0.002405, 0.275196 -0.04921 -0.002405, + 0.273229 -0.049179 -0.002405, 0.273229 -0.049179 -0.001136, 0.273229 -0.049179 -0.000941, 0.273229 -0.049179 -0.000742, + 0.273229 -0.049179 -0.000539, 0.275196 -0.04921 -0.002405, 0.273229 -0.049179 -0.001136, 0.273229 -0.049179 -0.000941, + 0.273229 -0.049179 0.020136, 0.273229 -0.049179 0.021405, 0.275196 -0.04921 -0.002405, 0.273229 -0.049179 0.019742, + 0.273229 -0.049179 0.019941, 0.273229 -0.049179 0.020136, 0.273229 -0.049179 -0.000335, 0.273229 -0.049179 0.019335, + 0.273229 -0.049179 0.019539, 0.273229 -0.049179 0.019539, 0.273229 -0.049179 0.019742, 0.273229 -0.049179 0.020136, + 0.275196 -0.04921 -0.002405, 0.273229 -0.049179 -0.000941, 0.273229 -0.049179 -0.000539, 0.273229 -0.049179 -0.000335, + 0.273229 -0.049179 0.019539, 0.273229 -0.049179 0.020136, 0.275196 -0.04921 -0.002405, 0.273229 -0.049179 -0.000539, + 0.273229 -0.049179 -0.000335, 0.275196 -0.04921 -0.002405, 0.273229 -0.049179 -0.000335, 0.273229 -0.049179 0.020136, + 0.273229 0.049179 0.011574, 0.273229 0.049179 0.012643, 0.273229 0.060554 0.011823, 0.273229 0.060554 0.011823, + 0.273229 0.060382 0.010667, 0.273229 0.049179 0.011574, 0.273229 -0.070989 -0.002337, 0.273229 -0.049179 -0.001136, + 0.273229 -0.049179 -0.002405, 0.273229 -0.049179 -0.002405, 0.273229 -0.07223 -0.002405, 0.273229 -0.072229 -0.002405, + 0.273229 -0.071063 -0.002348, 0.273229 -0.070989 -0.002337, 0.273229 -0.049179 -0.002405, 0.273229 -0.049179 -0.002405, + 0.273229 -0.072229 -0.002405, 0.273229 -0.071063 -0.002348, 0.296995 0.042929 0.021405, 0.296995 0.042929 -0.002405, + 0.297101 0.042247 -0.002405, 0.297101 0.042247 -0.002405, 0.297101 0.042247 0.021405, 0.296995 0.042929 0.021405 + ] + } + color Color + { + color + [ + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941 + ] + } + coordIndex + [ + 0,1,2,-1, 3,4,5,-1, 6,7,8,-1, 9,10,11,-1, 12,13,14,-1, 15,16,17,-1, + 18,19,20,-1, 21,22,23,-1, 24,25,26,-1, 27,28,29,-1, 30,31,32,-1, 33,34,35,-1, + 36,37,38,-1, 39,40,41,-1, 42,43,44,-1, 45,46,47,-1, 48,49,50,-1, 51,52,53,-1, + 54,55,56,-1, 57,58,59,-1, 60,61,62,-1, 63,64,65,-1, 66,67,68,-1, 69,70,71,-1, + 72,73,74,-1, 75,76,77,-1, 78,79,80,-1, 81,82,83,-1, 84,85,86,-1, 87,88,89,-1, + 90,91,92,-1, 93,94,95,-1, 96,97,98,-1, 99,100,101,-1, 102,103,104,-1, 105,106,107,-1, + 108,109,110,-1, 111,112,113,-1, 114,115,116,-1, 117,118,119,-1, 120,121,122,-1, 123,124,125,-1, + 126,127,128,-1, 129,130,131,-1, 132,133,134,-1, 135,136,137,-1, 138,139,140,-1, 141,142,143,-1, + 144,145,146,-1, 147,148,149,-1, 150,151,152,-1, 153,154,155,-1, 156,157,158,-1, 159,160,161,-1, + 162,163,164,-1, 165,166,167,-1, 168,169,170,-1, 171,172,173,-1, 174,175,176,-1, 177,178,179,-1, + 180,181,182,-1, 183,184,185,-1, 186,187,188,-1, 189,190,191,-1, 192,193,194,-1, 195,196,197,-1, + 198,199,200,-1, 201,202,203,-1, 204,205,206,-1, 207,208,209,-1, 210,211,212,-1, 213,214,215,-1, + 216,217,218,-1, 219,220,221,-1, 222,223,224,-1, 225,226,227,-1, 228,229,230,-1, 231,232,233,-1, + 234,235,236,-1, 237,238,239,-1, 240,241,242,-1, 243,244,245,-1, 246,247,248,-1, 249,250,251,-1, + 252,253,254,-1, 255,256,257,-1, 258,259,260,-1, 261,262,263,-1, 264,265,266,-1, 267,268,269,-1, + 270,271,272,-1, 273,274,275,-1, 276,277,278,-1, 279,280,281,-1, 282,283,284,-1, 285,286,287,-1, + 288,289,290,-1, 291,292,293,-1, 294,295,296,-1, 297,298,299,-1, 300,301,302,-1, 303,304,305,-1, + 306,307,308,-1, 309,310,311,-1, 312,313,314,-1, 315,316,317,-1, 318,319,320,-1, 321,322,323,-1, + 324,325,326,-1, 327,328,329,-1, 330,331,332,-1, 333,334,335,-1, 336,337,338,-1, 339,340,341,-1, + 342,343,344,-1, 345,346,347,-1, 348,349,350,-1, 351,352,353,-1, 354,355,356,-1, 357,358,359,-1, + 360,361,362,-1, 363,364,365,-1, 366,367,368,-1, 369,370,371,-1, 372,373,374,-1, 375,376,377,-1, + 378,379,380,-1, 381,382,383,-1, 384,385,386,-1, 387,388,389,-1, 390,391,392,-1, 393,394,395,-1, + 396,397,398,-1, 399,400,401,-1, 402,403,404,-1, 405,406,407,-1, 408,409,410,-1, 411,412,413,-1, + 414,415,416,-1, 417,418,419,-1, 420,421,422,-1, 423,424,425,-1, 426,427,428,-1, 429,430,431,-1, + 432,433,434,-1, 435,436,437,-1, 438,439,440,-1, 441,442,443,-1, 444,445,446,-1, 447,448,449,-1, + 450,451,452,-1, 453,454,455,-1, 456,457,458,-1, 459,460,461,-1, 462,463,464,-1, 465,466,467,-1, + 468,469,470,-1, 471,472,473,-1, 474,475,476,-1, 477,478,479,-1, 480,481,482,-1, 483,484,485,-1, + 486,487,488,-1, 489,490,491,-1, 492,493,494,-1, 495,496,497,-1, 498,499,500,-1, 501,502,503,-1, + 504,505,506,-1, 507,508,509,-1, 510,511,512,-1, 513,514,515,-1, 516,517,518,-1, 519,520,521,-1, + 522,523,524,-1, 525,526,527,-1, 528,529,530,-1, 531,532,533,-1, 534,535,536,-1, 537,538,539,-1, + 540,541,542,-1, 543,544,545,-1, 546,547,548,-1, 549,550,551,-1, 552,553,554,-1, 555,556,557,-1, + 558,559,560,-1, 561,562,563,-1, 564,565,566,-1, 567,568,569,-1, 570,571,572,-1, 573,574,575,-1, + 576,577,578,-1, 579,580,581,-1, 582,583,584,-1, 585,586,587,-1, 588,589,590,-1, 591,592,593,-1, + 594,595,596,-1, 597,598,599,-1, 600,601,602,-1, 603,604,605,-1, 606,607,608,-1, 609,610,611,-1, + 612,613,614,-1, 615,616,617,-1, 618,619,620,-1, 621,622,623,-1, 624,625,626,-1, 627,628,629,-1, + 630,631,632,-1, 633,634,635,-1, 636,637,638,-1, 639,640,641,-1, 642,643,644,-1, 645,646,647,-1, + 648,649,650,-1, 651,652,653,-1, 654,655,656,-1, 657,658,659,-1, 660,661,662,-1, 663,664,665,-1, + 666,667,668,-1, 669,670,671,-1, 672,673,674,-1, 675,676,677,-1, 678,679,680,-1, 681,682,683,-1, + 684,685,686,-1, 687,688,689,-1, 690,691,692,-1, 693,694,695,-1, 696,697,698,-1, 699,700,701,-1, + 702,703,704,-1, 705,706,707,-1, 708,709,710,-1, 711,712,713,-1, 714,715,716,-1, 717,718,719,-1, + 720,721,722,-1, 723,724,725,-1, 726,727,728,-1, 729,730,731,-1, 732,733,734,-1, 735,736,737,-1, + 738,739,740,-1, 741,742,743,-1, 744,745,746,-1, 747,748,749,-1, 750,751,752,-1, 753,754,755,-1, + 756,757,758,-1, 759,760,761,-1, 762,763,764,-1, 765,766,767,-1, 768,769,770,-1, 771,772,773,-1, + 774,775,776,-1, 777,778,779,-1, 780,781,782,-1, 783,784,785,-1, 786,787,788,-1, 789,790,791,-1, + 792,793,794,-1, 795,796,797,-1, 798,799,800,-1, 801,802,803,-1, 804,805,806,-1, 807,808,809,-1, + 810,811,812,-1, 813,814,815,-1, 816,817,818,-1, 819,820,821,-1, 822,823,824,-1, 825,826,827,-1, + 828,829,830,-1, 831,832,833,-1, 834,835,836,-1, 837,838,839,-1, 840,841,842,-1, 843,844,845,-1, + 846,847,848,-1, 849,850,851,-1, 852,853,854,-1, 855,856,857,-1, 858,859,860,-1, 861,862,863,-1, + 864,865,866,-1, 867,868,869,-1, 870,871,872,-1, 873,874,875,-1, 876,877,878,-1, 879,880,881,-1, + 882,883,884,-1, 885,886,887,-1, 888,889,890,-1, 891,892,893,-1, 894,895,896,-1, 897,898,899,-1, + 900,901,902,-1, 903,904,905,-1, 906,907,908,-1, 909,910,911,-1, 912,913,914,-1, 915,916,917,-1, + 918,919,920,-1, 921,922,923,-1, 924,925,926,-1, 927,928,929,-1, 930,931,932,-1, 933,934,935,-1, + 936,937,938,-1, 939,940,941,-1, 942,943,944,-1, 945,946,947,-1, 948,949,950,-1, 951,952,953,-1, + 954,955,956,-1, 957,958,959,-1, 960,961,962,-1, 963,964,965,-1, 966,967,968,-1, 969,970,971,-1, + 972,973,974,-1, 975,976,977,-1, 978,979,980,-1, 981,982,983,-1, 984,985,986,-1, 987,988,989,-1, + 990,991,992,-1, 993,994,995,-1, 996,997,998,-1, 999,1000,1001,-1, 1002,1003,1004,-1, 1005,1006,1007,-1, + 1008,1009,1010,-1, 1011,1012,1013,-1, 1014,1015,1016,-1, 1017,1018,1019,-1, 1020,1021,1022,-1, 1023,1024,1025,-1, + 1026,1027,1028,-1, 1029,1030,1031,-1, 1032,1033,1034,-1, 1035,1036,1037,-1, 1038,1039,1040,-1, 1041,1042,1043,-1, + 1044,1045,1046,-1, 1047,1048,1049,-1, 1050,1051,1052,-1, 1053,1054,1055,-1, 1056,1057,1058,-1, 1059,1060,1061,-1, + 1062,1063,1064,-1, 1065,1066,1067,-1, 1068,1069,1070,-1, 1071,1072,1073,-1, 1074,1075,1076,-1, 1077,1078,1079,-1, + 1080,1081,1082,-1, 1083,1084,1085,-1, 1086,1087,1088,-1, 1089,1090,1091,-1, 1092,1093,1094,-1, 1095,1096,1097,-1, + 1098,1099,1100,-1, 1101,1102,1103,-1, 1104,1105,1106,-1, 1107,1108,1109,-1, 1110,1111,1112,-1, 1113,1114,1115,-1, + 1116,1117,1118,-1, 1119,1120,1121,-1, 1122,1123,1124,-1, 1125,1126,1127,-1, 1128,1129,1130,-1, 1131,1132,1133,-1, + 1134,1135,1136,-1, 1137,1138,1139,-1, 1140,1141,1142,-1, 1143,1144,1145,-1, 1146,1147,1148,-1, 1149,1150,1151,-1, + 1152,1153,1154,-1, 1155,1156,1157,-1, 1158,1159,1160,-1, 1161,1162,1163,-1, 1164,1165,1166,-1, 1167,1168,1169,-1, + 1170,1171,1172,-1, 1173,1174,1175,-1, 1176,1177,1178,-1, 1179,1180,1181,-1, 1182,1183,1184,-1, 1185,1186,1187,-1, + 1188,1189,1190,-1, 1191,1192,1193,-1, 1194,1195,1196,-1, 1197,1198,1199,-1, 1200,1201,1202,-1, 1203,1204,1205,-1, + 1206,1207,1208,-1, 1209,1210,1211,-1, 1212,1213,1214,-1, 1215,1216,1217,-1, 1218,1219,1220,-1, 1221,1222,1223,-1, + 1224,1225,1226,-1, 1227,1228,1229,-1, 1230,1231,1232,-1, 1233,1234,1235,-1, 1236,1237,1238,-1, 1239,1240,1241,-1, + 1242,1243,1244,-1, 1245,1246,1247,-1, 1248,1249,1250,-1, 1251,1252,1253,-1, 1254,1255,1256,-1, 1257,1258,1259,-1, + 1260,1261,1262,-1, 1263,1264,1265,-1, 1266,1267,1268,-1, 1269,1270,1271,-1, 1272,1273,1274,-1, 1275,1276,1277,-1, + 1278,1279,1280,-1, 1281,1282,1283,-1, 1284,1285,1286,-1, 1287,1288,1289,-1, 1290,1291,1292,-1, 1293,1294,1295,-1, + 1296,1297,1298,-1, 1299,1300,1301,-1, 1302,1303,1304,-1, 1305,1306,1307,-1, 1308,1309,1310,-1, 1311,1312,1313,-1, + 1314,1315,1316,-1, 1317,1318,1319,-1, 1320,1321,1322,-1, 1323,1324,1325,-1, 1326,1327,1328,-1, 1329,1330,1331,-1, + 1332,1333,1334,-1, 1335,1336,1337,-1, 1338,1339,1340,-1, 1341,1342,1343,-1, 1344,1345,1346,-1, 1347,1348,1349,-1, + 1350,1351,1352,-1, 1353,1354,1355,-1, 1356,1357,1358,-1, 1359,1360,1361,-1, 1362,1363,1364,-1, 1365,1366,1367,-1, + 1368,1369,1370,-1, 1371,1372,1373,-1, 1374,1375,1376,-1, 1377,1378,1379,-1, 1380,1381,1382,-1, 1383,1384,1385,-1, + 1386,1387,1388,-1, 1389,1390,1391,-1, 1392,1393,1394,-1, 1395,1396,1397,-1, 1398,1399,1400,-1, 1401,1402,1403,-1, + 1404,1405,1406,-1, 1407,1408,1409,-1, 1410,1411,1412,-1, 1413,1414,1415,-1, 1416,1417,1418,-1, 1419,1420,1421,-1, + 1422,1423,1424,-1, 1425,1426,1427,-1, 1428,1429,1430,-1, 1431,1432,1433,-1, 1434,1435,1436,-1, 1437,1438,1439,-1, + 1440,1441,1442,-1, 1443,1444,1445,-1, 1446,1447,1448,-1, 1449,1450,1451,-1, 1452,1453,1454,-1, 1455,1456,1457,-1, + 1458,1459,1460,-1, 1461,1462,1463,-1, 1464,1465,1466,-1, 1467,1468,1469,-1, 1470,1471,1472,-1, 1473,1474,1475,-1, + 1476,1477,1478,-1, 1479,1480,1481,-1, 1482,1483,1484,-1, 1485,1486,1487,-1, 1488,1489,1490,-1, 1491,1492,1493,-1, + 1494,1495,1496,-1, 1497,1498,1499,-1, 1500,1501,1502,-1, 1503,1504,1505,-1, 1506,1507,1508,-1, 1509,1510,1511,-1, + 1512,1513,1514,-1, 1515,1516,1517,-1, 1518,1519,1520,-1, 1521,1522,1523,-1, 1524,1525,1526,-1, 1527,1528,1529,-1, + 1530,1531,1532,-1, 1533,1534,1535,-1, 1536,1537,1538,-1, 1539,1540,1541,-1, 1542,1543,1544,-1, 1545,1546,1547,-1, + 1548,1549,1550,-1, 1551,1552,1553,-1, 1554,1555,1556,-1, 1557,1558,1559,-1, 1560,1561,1562,-1, 1563,1564,1565,-1, + 1566,1567,1568,-1, 1569,1570,1571,-1, 1572,1573,1574,-1, 1575,1576,1577,-1, 1578,1579,1580,-1, 1581,1582,1583,-1, + 1584,1585,1586,-1, 1587,1588,1589,-1, 1590,1591,1592,-1, 1593,1594,1595,-1, 1596,1597,1598,-1, 1599,1600,1601,-1, + 1602,1603,1604,-1, 1605,1606,1607,-1, 1608,1609,1610,-1, 1611,1612,1613,-1, 1614,1615,1616,-1, 1617,1618,1619,-1, + 1620,1621,1622,-1, 1623,1624,1625,-1, 1626,1627,1628,-1, 1629,1630,1631,-1, 1632,1633,1634,-1, 1635,1636,1637,-1, + 1638,1639,1640,-1, 1641,1642,1643,-1, 1644,1645,1646,-1, 1647,1648,1649,-1, 1650,1651,1652,-1, 1653,1654,1655,-1, + 1656,1657,1658,-1, 1659,1660,1661,-1, 1662,1663,1664,-1, 1665,1666,1667,-1, 1668,1669,1670,-1, 1671,1672,1673,-1, + 1674,1675,1676,-1, 1677,1678,1679,-1, 1680,1681,1682,-1, 1683,1684,1685,-1, 1686,1687,1688,-1, 1689,1690,1691,-1, + 1692,1693,1694,-1, 1695,1696,1697,-1, 1698,1699,1700,-1, 1701,1702,1703,-1, 1704,1705,1706,-1, 1707,1708,1709,-1, + 1710,1711,1712,-1, 1713,1714,1715,-1, 1716,1717,1718,-1, 1719,1720,1721,-1, 1722,1723,1724,-1, 1725,1726,1727,-1, + 1728,1729,1730,-1, 1731,1732,1733,-1, 1734,1735,1736,-1, 1737,1738,1739,-1, 1740,1741,1742,-1, 1743,1744,1745,-1, + 1746,1747,1748,-1, 1749,1750,1751,-1, 1752,1753,1754,-1, 1755,1756,1757,-1, 1758,1759,1760,-1, 1761,1762,1763,-1, + 1764,1765,1766,-1, 1767,1768,1769,-1, 1770,1771,1772,-1, 1773,1774,1775,-1, 1776,1777,1778,-1, 1779,1780,1781,-1, + 1782,1783,1784,-1, 1785,1786,1787,-1, 1788,1789,1790,-1, 1791,1792,1793,-1, 1794,1795,1796,-1, 1797,1798,1799,-1, + 1800,1801,1802,-1, 1803,1804,1805,-1, 1806,1807,1808,-1, 1809,1810,1811,-1, 1812,1813,1814,-1, 1815,1816,1817,-1, + 1818,1819,1820,-1, 1821,1822,1823,-1, 1824,1825,1826,-1, 1827,1828,1829,-1, 1830,1831,1832,-1, 1833,1834,1835,-1, + 1836,1837,1838,-1, 1839,1840,1841,-1, 1842,1843,1844,-1, 1845,1846,1847,-1, 1848,1849,1850,-1, 1851,1852,1853,-1, + 1854,1855,1856,-1, 1857,1858,1859,-1, 1860,1861,1862,-1, 1863,1864,1865,-1, 1866,1867,1868,-1, 1869,1870,1871,-1, + 1872,1873,1874,-1, 1875,1876,1877,-1, 1878,1879,1880,-1, 1881,1882,1883,-1, 1884,1885,1886,-1, 1887,1888,1889,-1, + 1890,1891,1892,-1, 1893,1894,1895,-1, 1896,1897,1898,-1, 1899,1900,1901,-1, 1902,1903,1904,-1, 1905,1906,1907,-1, + 1908,1909,1910,-1, 1911,1912,1913,-1, 1914,1915,1916,-1, 1917,1918,1919,-1, 1920,1921,1922,-1, 1923,1924,1925,-1, + 1926,1927,1928,-1, 1929,1930,1931,-1, 1932,1933,1934,-1, 1935,1936,1937,-1, 1938,1939,1940,-1, 1941,1942,1943,-1, + 1944,1945,1946,-1, 1947,1948,1949,-1, 1950,1951,1952,-1, 1953,1954,1955,-1, 1956,1957,1958,-1, 1959,1960,1961,-1, + 1962,1963,1964,-1, 1965,1966,1967,-1, 1968,1969,1970,-1, 1971,1972,1973,-1, 1974,1975,1976,-1, 1977,1978,1979,-1, + 1980,1981,1982,-1, 1983,1984,1985,-1, 1986,1987,1988,-1, 1989,1990,1991,-1, 1992,1993,1994,-1, 1995,1996,1997,-1, + 1998,1999,2000,-1, 2001,2002,2003,-1, 2004,2005,2006,-1, 2007,2008,2009,-1, 2010,2011,2012,-1, 2013,2014,2015,-1, + 2016,2017,2018,-1, 2019,2020,2021,-1, 2022,2023,2024,-1, 2025,2026,2027,-1, 2028,2029,2030,-1, 2031,2032,2033,-1, + 2034,2035,2036,-1, 2037,2038,2039,-1, 2040,2041,2042,-1, 2043,2044,2045,-1, 2046,2047,2048,-1, 2049,2050,2051,-1, + 2052,2053,2054,-1, 2055,2056,2057,-1, 2058,2059,2060,-1, 2061,2062,2063,-1, 2064,2065,2066,-1, 2067,2068,2069,-1, + 2070,2071,2072,-1, 2073,2074,2075,-1, 2076,2077,2078,-1, 2079,2080,2081,-1, 2082,2083,2084,-1, 2085,2086,2087,-1, + 2088,2089,2090,-1, 2091,2092,2093,-1, 2094,2095,2096,-1, 2097,2098,2099,-1, 2100,2101,2102,-1, 2103,2104,2105,-1, + 2106,2107,2108,-1, 2109,2110,2111,-1, 2112,2113,2114,-1, 2115,2116,2117,-1, 2118,2119,2120,-1, 2121,2122,2123,-1, + 2124,2125,2126,-1, 2127,2128,2129,-1, 2130,2131,2132,-1, 2133,2134,2135,-1, 2136,2137,2138,-1, 2139,2140,2141,-1, + 2142,2143,2144,-1, 2145,2146,2147,-1, 2148,2149,2150,-1, 2151,2152,2153,-1, 2154,2155,2156,-1, 2157,2158,2159,-1, + 2160,2161,2162,-1, 2163,2164,2165,-1, 2166,2167,2168,-1, 2169,2170,2171,-1, 2172,2173,2174,-1, 2175,2176,2177,-1, + 2178,2179,2180,-1, 2181,2182,2183,-1, 2184,2185,2186,-1, 2187,2188,2189,-1, 2190,2191,2192,-1, 2193,2194,2195,-1, + 2196,2197,2198,-1, 2199,2200,2201,-1, 2202,2203,2204,-1, 2205,2206,2207,-1, 2208,2209,2210,-1, 2211,2212,2213,-1, + 2214,2215,2216,-1, 2217,2218,2219,-1, 2220,2221,2222,-1, 2223,2224,2225,-1, 2226,2227,2228,-1, 2229,2230,2231,-1, + 2232,2233,2234,-1, 2235,2236,2237,-1, 2238,2239,2240,-1, 2241,2242,2243,-1, 2244,2245,2246,-1, 2247,2248,2249,-1, + 2250,2251,2252,-1, 2253,2254,2255,-1, 2256,2257,2258,-1, 2259,2260,2261,-1, 2262,2263,2264,-1, 2265,2266,2267,-1, + 2268,2269,2270,-1, 2271,2272,2273,-1, 2274,2275,2276,-1, 2277,2278,2279,-1, 2280,2281,2282,-1, 2283,2284,2285,-1, + 2286,2287,2288,-1, 2289,2290,2291,-1, 2292,2293,2294,-1, 2295,2296,2297,-1, 2298,2299,2300,-1, 2301,2302,2303,-1, + 2304,2305,2306,-1, 2307,2308,2309,-1, 2310,2311,2312,-1, 2313,2314,2315,-1, 2316,2317,2318,-1, 2319,2320,2321,-1, + 2322,2323,2324,-1, 2325,2326,2327,-1, 2328,2329,2330,-1, 2331,2332,2333,-1, 2334,2335,2336,-1, 2337,2338,2339,-1, + 2340,2341,2342,-1, 2343,2344,2345,-1, 2346,2347,2348,-1, 2349,2350,2351,-1, 2352,2353,2354,-1, 2355,2356,2357,-1, + 2358,2359,2360,-1, 2361,2362,2363,-1, 2364,2365,2366,-1, 2367,2368,2369,-1, 2370,2371,2372,-1, 2373,2374,2375,-1, + 2376,2377,2378,-1, 2379,2380,2381,-1, 2382,2383,2384,-1, 2385,2386,2387,-1, 2388,2389,2390,-1, 2391,2392,2393,-1, + 2394,2395,2396,-1, 2397,2398,2399,-1, 2400,2401,2402,-1, 2403,2404,2405,-1, 2406,2407,2408,-1, 2409,2410,2411,-1, + 2412,2413,2414,-1, 2415,2416,2417,-1, 2418,2419,2420,-1, 2421,2422,2423,-1, 2424,2425,2426,-1, 2427,2428,2429,-1, + 2430,2431,2432,-1, 2433,2434,2435,-1, 2436,2437,2438,-1, 2439,2440,2441,-1, 2442,2443,2444,-1, 2445,2446,2447,-1, + 2448,2449,2450,-1, 2451,2452,2453,-1, 2454,2455,2456,-1, 2457,2458,2459,-1, 2460,2461,2462,-1, 2463,2464,2465,-1, + 2466,2467,2468,-1, 2469,2470,2471,-1, 2472,2473,2474,-1, 2475,2476,2477,-1, 2478,2479,2480,-1, 2481,2482,2483,-1, + 2484,2485,2486,-1, 2487,2488,2489,-1, 2490,2491,2492,-1, 2493,2494,2495,-1, 2496,2497,2498,-1, 2499,2500,2501,-1, + 2502,2503,2504,-1, 2505,2506,2507,-1, 2508,2509,2510,-1, 2511,2512,2513,-1, 2514,2515,2516,-1, 2517,2518,2519,-1, + 2520,2521,2522,-1, 2523,2524,2525,-1, 2526,2527,2528,-1, 2529,2530,2531,-1, 2532,2533,2534,-1, 2535,2536,2537,-1, + 2538,2539,2540,-1, 2541,2542,2543,-1 + ] + } + appearance Appearance + { + material Material + { + ambientIntensity 0.2 + diffuseColor 0.9 0.9 0.9 + specularColor .1 .1 .1 + shininess .5 + } + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/sektion.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/sektion.obj new file mode 100755 index 0000000..fcd65b8 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/sektion.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24de2b50b3156e8c7e703ffd97f183e9ca07dbd89a09c5e6b36ee03022d3c976 +size 27872 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/sektion.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/sektion.wrl new file mode 100755 index 0000000..efc90f2 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/sektion.wrl @@ -0,0 +1,261 @@ +#VRML V2.0 utf8 + +# Generated by VCGLIB, (C)Copyright 1999-2001 VCG, IEI-CNR + +NavigationInfo { + type [ "EXAMINE", "ANY" ] +} +Transform { + scale 1 1 1 + translation 0 0 0 + children + [ + Shape + { + geometry IndexedFaceSet + { + creaseAngle .5 + solid FALSE + coord Coordinate + { + point + [ + -0.2848 -0.381 0.402, -0.2848 0.381 0.402, -0.2848 0.381 0.382, -0.2848 -0.381 0.402, + -0.2848 0.381 0.382, -0.2848 -0.381 0.382, -0.2848 0.381 0.402, 0.3248 0.381 0.402, + 0.3248 0.381 0.382, -0.2848 0.381 0.402, 0.3248 0.381 0.382, -0.2848 0.381 0.382, + 0.3248 0.381 0.402, 0.3248 -0.381 0.402, 0.3248 -0.381 0.382, 0.3248 0.381 0.402, + 0.3248 -0.381 0.382, 0.3248 0.381 0.382, 0.3248 -0.381 0.402, -0.2848 -0.381 0.402, + -0.2848 -0.381 0.382, 0.3248 -0.381 0.402, -0.2848 -0.381 0.382, 0.3248 -0.381 0.382, + -0.2848 -0.381 0.382, -0.2848 0.381 0.382, 0.3248 0.381 0.382, -0.2848 -0.381 0.382, + 0.3248 0.381 0.382, 0.3248 -0.381 0.382, 0.3248 -0.381 0.402, 0.3248 0.381 0.402, + -0.2848 0.381 0.402, 0.3248 -0.381 0.402, -0.2848 0.381 0.402, -0.2848 -0.381 0.402, + -0.286 -0.362 -0.362, -0.286 0.362 -0.362, -0.286 0.362 0.381, -0.286 -0.362 -0.362, + -0.286 0.362 0.381, -0.286 -0.362 0.381, 0.305 0.381 -0.381, 0.305 -0.381 -0.381, + -0.305 -0.381 -0.381, 0.305 0.381 -0.381, -0.305 -0.381 -0.381, -0.305 0.381 -0.381, + 0.305 0.362 0.381, 0.305 0.381 0.381, -0.286 0.362 0.381, -0.286 0.362 0.381, + 0.305 0.381 0.381, -0.305 0.381 0.381, -0.286 0.362 0.381, -0.305 0.381 0.381, + -0.286 -0.362 0.381, -0.286 -0.362 0.381, -0.305 0.381 0.381, -0.305 -0.381 0.381, + -0.286 -0.362 0.381, -0.305 -0.381 0.381, 0.305 -0.381 0.381, -0.286 -0.362 0.381, + 0.305 -0.381 0.381, 0.305 -0.362 0.381, 0.305 -0.362 -0.362, 0.305 -0.362 0.381, + 0.305 -0.381 0.381, 0.305 -0.362 -0.362, 0.305 -0.381 0.381, 0.305 -0.381 -0.381, + 0.305 -0.362 -0.362, 0.305 -0.381 -0.381, 0.305 0.381 -0.381, 0.305 -0.362 -0.362, + 0.305 0.381 -0.381, 0.305 0.362 -0.362, 0.305 0.362 0.381, 0.305 0.362 -0.362, + 0.305 0.381 -0.381, 0.305 0.362 0.381, 0.305 0.381 -0.381, 0.305 0.381 0.381, + 0.305 -0.381 -0.381, 0.305 -0.381 0.381, -0.305 -0.381 0.381, 0.305 -0.381 -0.381, + -0.305 -0.381 0.381, -0.305 -0.381 -0.381, -0.305 -0.381 -0.381, -0.305 -0.381 0.381, + -0.305 0.381 0.381, -0.305 -0.381 -0.381, -0.305 0.381 0.381, -0.305 0.381 -0.381, + 0.305 0.381 0.381, 0.305 0.381 -0.381, -0.305 0.381 -0.381, 0.305 0.381 0.381, + -0.305 0.381 -0.381, -0.305 0.381 0.381, 0.305 0.362 -0.362, -0.286 0.362 -0.362, + -0.286 -0.362 -0.362, 0.305 0.362 -0.362, -0.286 -0.362 -0.362, 0.305 -0.362 -0.362, + -0.286 0.362 0.381, -0.286 0.362 -0.362, 0.305 0.362 -0.362, -0.286 0.362 0.381, + 0.305 0.362 -0.362, 0.305 0.362 0.381, 0.305 -0.362 -0.362, -0.286 -0.362 -0.362, + -0.286 -0.362 0.381, 0.305 -0.362 -0.362, -0.286 -0.362 0.381, 0.305 -0.362 0.381, + -0.292304 -0.362018 0.38, -0.292304 -0.362018 0.382, -0.292304 0.362042 0.382, -0.292304 -0.362018 0.38, + -0.292304 0.362042 0.382, -0.292304 0.362042 0.38, -0.265316 0.362042 0.382, -0.265316 0.362042 0.38, + -0.266771 0.362113 0.38, -0.265316 0.362042 0.382, -0.266771 0.362113 0.38, -0.266771 0.362113 0.382, + -0.265316 0.362042 0.38, -0.265316 0.362042 0.382, -0.265316 -0.362018 0.382, -0.265316 0.362042 0.38, + -0.265316 -0.362018 0.382, -0.265316 -0.362018 0.38, -0.265316 -0.362018 0.382, -0.292304 -0.362018 0.382, + -0.290766 -0.362113 0.382, -0.265316 -0.362018 0.382, -0.290766 -0.362113 0.382, -0.266854 -0.362113 0.382, + -0.292304 0.362042 0.38, -0.265316 0.362042 0.38, -0.265316 -0.362018 0.38, -0.292304 0.362042 0.38, + -0.265316 -0.362018 0.38, -0.292304 -0.362018 0.38, -0.265316 0.362042 0.382, -0.292304 0.362042 0.382, + -0.292304 -0.362018 0.382, -0.265316 0.362042 0.382, -0.292304 -0.362018 0.382, -0.265316 -0.362018 0.382, + -0.265316 -0.362018 0.38, -0.265316 -0.362018 0.382, -0.266854 -0.362113 0.382, -0.265316 -0.362018 0.38, + -0.266854 -0.362113 0.382, -0.266854 -0.362113 0.38, -0.292304 -0.362018 0.382, -0.292304 -0.362018 0.38, + -0.290766 -0.362113 0.38, -0.292304 -0.362018 0.382, -0.290766 -0.362113 0.38, -0.290766 -0.362113 0.382, + -0.292304 -0.362018 0.38, -0.265316 -0.362018 0.38, -0.266854 -0.362113 0.38, -0.292304 -0.362018 0.38, + -0.266854 -0.362113 0.38, -0.290766 -0.362113 0.38, -0.290766 -0.362113 0.38, -0.266854 -0.362113 0.38, + -0.266854 -0.380979 0.38, -0.290766 -0.362113 0.38, -0.266854 -0.380979 0.38, -0.290766 -0.380979 0.38, + -0.266854 -0.380979 0.38, -0.266854 -0.380979 0.382, -0.290766 -0.380979 0.382, -0.266854 -0.380979 0.38, + -0.290766 -0.380979 0.382, -0.290766 -0.380979 0.38, -0.290766 -0.362113 0.382, -0.290766 -0.362113 0.38, + -0.290766 -0.380979 0.38, -0.290766 -0.362113 0.382, -0.290766 -0.380979 0.38, -0.290766 -0.380979 0.382, + -0.266854 -0.362113 0.382, -0.290766 -0.362113 0.382, -0.290766 -0.380979 0.382, -0.266854 -0.362113 0.382, + -0.290766 -0.380979 0.382, -0.266854 -0.380979 0.382, -0.266854 -0.362113 0.38, -0.266854 -0.362113 0.382, + -0.266854 -0.380979 0.382, -0.266854 -0.362113 0.38, -0.266854 -0.380979 0.382, -0.266854 -0.380979 0.38, + -0.266771 0.362113 0.382, -0.266771 0.362113 0.38, -0.266771 0.381007 0.38, -0.266771 0.362113 0.382, + -0.266771 0.381007 0.38, -0.266771 0.381007 0.382, -0.265316 0.362042 0.38, -0.292304 0.362042 0.38, + -0.290849 0.362113 0.38, -0.265316 0.362042 0.38, -0.290849 0.362113 0.38, -0.266771 0.362113 0.38, + -0.292304 0.362042 0.382, -0.265316 0.362042 0.382, -0.266771 0.362113 0.382, -0.292304 0.362042 0.382, + -0.266771 0.362113 0.382, -0.290849 0.362113 0.382, -0.292304 0.362042 0.38, -0.292304 0.362042 0.382, + -0.290849 0.362113 0.382, -0.292304 0.362042 0.38, -0.290849 0.362113 0.382, -0.290849 0.362113 0.38, + -0.290849 0.381007 0.38, -0.290849 0.381007 0.382, -0.266771 0.381007 0.382, -0.290849 0.381007 0.38, + -0.266771 0.381007 0.382, -0.266771 0.381007 0.38, -0.266771 0.362113 0.38, -0.290849 0.362113 0.38, + -0.290849 0.381007 0.38, -0.266771 0.362113 0.38, -0.290849 0.381007 0.38, -0.266771 0.381007 0.38, + -0.290849 0.362113 0.382, -0.266771 0.362113 0.382, -0.266771 0.381007 0.382, -0.290849 0.362113 0.382, + -0.266771 0.381007 0.382, -0.290849 0.381007 0.382, -0.290849 0.362113 0.38, -0.290849 0.362113 0.382, + -0.290849 0.381007 0.382, -0.290849 0.362113 0.38, -0.290849 0.381007 0.382, -0.290849 0.381007 0.38, + 0.271506 -0.362018 0.38, 0.271506 -0.362018 0.382, 0.271506 0.362042 0.382, 0.271506 -0.362018 0.38, + 0.271506 0.362042 0.382, 0.271506 0.362042 0.38, 0.298494 0.362042 0.382, 0.298494 0.362042 0.38, + 0.297039 0.362113 0.38, 0.298494 0.362042 0.382, 0.297039 0.362113 0.38, 0.297039 0.362113 0.382, + 0.298494 0.362042 0.38, 0.298494 0.362042 0.382, 0.298494 -0.362018 0.382, 0.298494 0.362042 0.38, + 0.298494 -0.362018 0.382, 0.298494 -0.362018 0.38, 0.298494 -0.362018 0.382, 0.271506 -0.362018 0.382, + 0.273044 -0.362113 0.382, 0.298494 -0.362018 0.382, 0.273044 -0.362113 0.382, 0.296956 -0.362113 0.382, + 0.271506 0.362042 0.38, 0.298494 0.362042 0.38, 0.298494 -0.362018 0.38, 0.271506 0.362042 0.38, + 0.298494 -0.362018 0.38, 0.271506 -0.362018 0.38, 0.298494 0.362042 0.382, 0.271506 0.362042 0.382, + 0.271506 -0.362018 0.382, 0.298494 0.362042 0.382, 0.271506 -0.362018 0.382, 0.298494 -0.362018 0.382, + 0.298494 -0.362018 0.38, 0.298494 -0.362018 0.382, 0.296956 -0.362113 0.382, 0.298494 -0.362018 0.38, + 0.296956 -0.362113 0.382, 0.296956 -0.362113 0.38, 0.271506 -0.362018 0.382, 0.271506 -0.362018 0.38, + 0.273044 -0.362113 0.38, 0.271506 -0.362018 0.382, 0.273044 -0.362113 0.38, 0.273044 -0.362113 0.382, + 0.271506 -0.362018 0.38, 0.298494 -0.362018 0.38, 0.296956 -0.362113 0.38, 0.271506 -0.362018 0.38, + 0.296956 -0.362113 0.38, 0.273044 -0.362113 0.38, 0.273044 -0.362113 0.38, 0.296956 -0.362113 0.38, + 0.296956 -0.380979 0.38, 0.273044 -0.362113 0.38, 0.296956 -0.380979 0.38, 0.273044 -0.380979 0.38, + 0.296956 -0.380979 0.38, 0.296956 -0.380979 0.382, 0.273044 -0.380979 0.382, 0.296956 -0.380979 0.38, + 0.273044 -0.380979 0.382, 0.273044 -0.380979 0.38, 0.273044 -0.362113 0.382, 0.273044 -0.362113 0.38, + 0.273044 -0.380979 0.38, 0.273044 -0.362113 0.382, 0.273044 -0.380979 0.38, 0.273044 -0.380979 0.382, + 0.296956 -0.362113 0.382, 0.273044 -0.362113 0.382, 0.273044 -0.380979 0.382, 0.296956 -0.362113 0.382, + 0.273044 -0.380979 0.382, 0.296956 -0.380979 0.382, 0.296956 -0.362113 0.38, 0.296956 -0.362113 0.382, + 0.296956 -0.380979 0.382, 0.296956 -0.362113 0.38, 0.296956 -0.380979 0.382, 0.296956 -0.380979 0.38, + 0.297039 0.362113 0.382, 0.297039 0.362113 0.38, 0.297039 0.381007 0.38, 0.297039 0.362113 0.382, + 0.297039 0.381007 0.38, 0.297039 0.381007 0.382, 0.298494 0.362042 0.38, 0.271506 0.362042 0.38, + 0.272961 0.362113 0.38, 0.298494 0.362042 0.38, 0.272961 0.362113 0.38, 0.297039 0.362113 0.38, + 0.271506 0.362042 0.382, 0.298494 0.362042 0.382, 0.297039 0.362113 0.382, 0.271506 0.362042 0.382, + 0.297039 0.362113 0.382, 0.272961 0.362113 0.382, 0.271506 0.362042 0.38, 0.271506 0.362042 0.382, + 0.272961 0.362113 0.382, 0.271506 0.362042 0.38, 0.272961 0.362113 0.382, 0.272961 0.362113 0.38, + 0.272961 0.381007 0.38, 0.272961 0.381007 0.382, 0.297039 0.381007 0.382, 0.272961 0.381007 0.38, + 0.297039 0.381007 0.382, 0.297039 0.381007 0.38, 0.297039 0.362113 0.38, 0.272961 0.362113 0.38, + 0.272961 0.381007 0.38, 0.297039 0.362113 0.38, 0.272961 0.381007 0.38, 0.297039 0.381007 0.38, + 0.272961 0.362113 0.382, 0.297039 0.362113 0.382, 0.297039 0.381007 0.382, 0.272961 0.362113 0.382, + 0.297039 0.381007 0.382, 0.272961 0.381007 0.382, 0.272961 0.362113 0.38, 0.272961 0.362113 0.382, + 0.272961 0.381007 0.382, 0.272961 0.362113 0.38, 0.272961 0.381007 0.382, 0.272961 0.381007 0.38 + ] + } + color Color + { + color + [ + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941 + ] + } + coordIndex + [ + 0,1,2,-1, 3,4,5,-1, 6,7,8,-1, 9,10,11,-1, 12,13,14,-1, 15,16,17,-1, + 18,19,20,-1, 21,22,23,-1, 24,25,26,-1, 27,28,29,-1, 30,31,32,-1, 33,34,35,-1, + 36,37,38,-1, 39,40,41,-1, 42,43,44,-1, 45,46,47,-1, 48,49,50,-1, 51,52,53,-1, + 54,55,56,-1, 57,58,59,-1, 60,61,62,-1, 63,64,65,-1, 66,67,68,-1, 69,70,71,-1, + 72,73,74,-1, 75,76,77,-1, 78,79,80,-1, 81,82,83,-1, 84,85,86,-1, 87,88,89,-1, + 90,91,92,-1, 93,94,95,-1, 96,97,98,-1, 99,100,101,-1, 102,103,104,-1, 105,106,107,-1, + 108,109,110,-1, 111,112,113,-1, 114,115,116,-1, 117,118,119,-1, 120,121,122,-1, 123,124,125,-1, + 126,127,128,-1, 129,130,131,-1, 132,133,134,-1, 135,136,137,-1, 138,139,140,-1, 141,142,143,-1, + 144,145,146,-1, 147,148,149,-1, 150,151,152,-1, 153,154,155,-1, 156,157,158,-1, 159,160,161,-1, + 162,163,164,-1, 165,166,167,-1, 168,169,170,-1, 171,172,173,-1, 174,175,176,-1, 177,178,179,-1, + 180,181,182,-1, 183,184,185,-1, 186,187,188,-1, 189,190,191,-1, 192,193,194,-1, 195,196,197,-1, + 198,199,200,-1, 201,202,203,-1, 204,205,206,-1, 207,208,209,-1, 210,211,212,-1, 213,214,215,-1, + 216,217,218,-1, 219,220,221,-1, 222,223,224,-1, 225,226,227,-1, 228,229,230,-1, 231,232,233,-1, + 234,235,236,-1, 237,238,239,-1, 240,241,242,-1, 243,244,245,-1, 246,247,248,-1, 249,250,251,-1, + 252,253,254,-1, 255,256,257,-1, 258,259,260,-1, 261,262,263,-1, 264,265,266,-1, 267,268,269,-1, + 270,271,272,-1, 273,274,275,-1, 276,277,278,-1, 279,280,281,-1, 282,283,284,-1, 285,286,287,-1, + 288,289,290,-1, 291,292,293,-1, 294,295,296,-1, 297,298,299,-1, 300,301,302,-1, 303,304,305,-1, + 306,307,308,-1, 309,310,311,-1, 312,313,314,-1, 315,316,317,-1, 318,319,320,-1, 321,322,323,-1, + 324,325,326,-1, 327,328,329,-1, 330,331,332,-1, 333,334,335,-1, 336,337,338,-1, 339,340,341,-1, + 342,343,344,-1, 345,346,347,-1, 348,349,350,-1, 351,352,353,-1, 354,355,356,-1, 357,358,359,-1, + 360,361,362,-1, 363,364,365,-1, 366,367,368,-1, 369,370,371,-1, 372,373,374,-1, 375,376,377,-1, + 378,379,380,-1, 381,382,383,-1 + ] + } + appearance Appearance + { + material Material + { + ambientIntensity 0.2 + diffuseColor 0.9 0.9 0.9 + specularColor .1 .1 .1 + shininess .5 + } + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/table_top.obj b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/table_top.obj new file mode 100755 index 0000000..bd6bd39 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/table_top.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ac1457b024e4b8746be4bf9603f56e892627c3d3633cce33faa88cfcb6b9db6 +size 2736 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/table_top.wrl b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/table_top.wrl new file mode 100755 index 0000000..a0672c1 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wavefront/table_top.wrl @@ -0,0 +1,67 @@ +#VRML V2.0 utf8 + +# Generated by VCGLIB, (C)Copyright 1999-2001 VCG, IEI-CNR + +NavigationInfo { + type [ "EXAMINE", "ANY" ] +} +Transform { + scale 1 1 1 + translation 0 0 0 + children + [ + Shape + { + geometry IndexedFaceSet + { + creaseAngle .5 + solid FALSE + coord Coordinate + { + point + [ + 0.1 0.1 -0.02, 0.1 -0.1 -0.02, -0.1 -0.1 -0.02, 0.1 0.1 -0.02, + -0.1 -0.1 -0.02, -0.1 0.1 -0.02, 0.1 0.1 0.02, -0.1 0.1 0.02, + -0.1 -0.1 0.02, 0.1 0.1 0.02, -0.1 -0.1 0.02, 0.1 -0.1 0.02, + 0.1 0.1 -0.02, 0.1 0.1 0.02, 0.1 -0.1 0.02, 0.1 0.1 -0.02, + 0.1 -0.1 0.02, 0.1 -0.1 -0.02, 0.1 -0.1 -0.02, 0.1 -0.1 0.02, + -0.1 -0.1 0.02, 0.1 -0.1 -0.02, -0.1 -0.1 0.02, -0.1 -0.1 -0.02, + -0.1 -0.1 -0.02, -0.1 -0.1 0.02, -0.1 0.1 0.02, -0.1 -0.1 -0.02, + -0.1 0.1 0.02, -0.1 0.1 -0.02, 0.1 0.1 0.02, 0.1 0.1 -0.02, + -0.1 0.1 -0.02, 0.1 0.1 0.02, -0.1 0.1 -0.02, -0.1 0.1 0.02 + ] + } + color Color + { + color + [ + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, + 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941, 0.752941 0.752941 0.752941 + ] + } + coordIndex + [ + 0,1,2,-1, 3,4,5,-1, 6,7,8,-1, 9,10,11,-1, 12,13,14,-1, 15,16,17,-1, + 18,19,20,-1, 21,22,23,-1, 24,25,26,-1, 27,28,29,-1, 30,31,32,-1, 33,34,35,-1 + ] + } + appearance Appearance + { + material Material + { + ambientIntensity 0.2 + diffuseColor 0.9 0.9 0.9 + specularColor .1 .1 .1 + shininess .5 + } + } + } + ] +} diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wood_table_worn_alb_1k.png b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wood_table_worn_alb_1k.png new file mode 100644 index 0000000..5a866bb --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wood_table_worn_alb_1k.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:361370e6c1bfb2940cde6fa70d4b0c2d45574d5774f9f0a02c365199cd59fe2f +size 5475985 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wood_table_worn_arm_1k.png b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wood_table_worn_arm_1k.png new file mode 100644 index 0000000..3e6e900 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wood_table_worn_arm_1k.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:548f6f397326a2436d083ecea7e65898f6abf3dfb6f957a394f232c7b856a5e4 +size 4532082 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wood_table_worn_nor_gl_1k.png b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wood_table_worn_nor_gl_1k.png new file mode 100644 index 0000000..5c3ecfe --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/assets/wood_table_worn_nor_gl_1k.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da1cef297fa82ca80a82d3af41780aae6354323e57cfe32df82e93f28e419ed1 +size 5413368 diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/mjx_rm65.xml b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/mjx_rm65.xml new file mode 100644 index 0000000..1c4d94a --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/mjx_rm65.xml @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/scene.xml b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/scene.xml new file mode 100755 index 0000000..ffbc2e8 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/scene.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/sektion_cabinet_2.urdf b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/sektion_cabinet_2.urdf new file mode 100755 index 0000000..c2780c0 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/sektion_cabinet_2.urdf @@ -0,0 +1,561 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + + + + false + Gazebo/Ivory + + /cabinet + /cabinet_description + + + + diff --git a/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/sektion_cabinet_2.xml b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/sektion_cabinet_2.xml new file mode 100755 index 0000000..0e4bae2 --- /dev/null +++ b/motrix_envs/src/motrix_envs/manipulation/rm65_open_cabinet/xmls/sektion_cabinet_2.xml @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/motrix_envs/src/motrix_envs/manipulation/shadow_hand/shadow_hand_np.py b/motrix_envs/src/motrix_envs/manipulation/shadow_hand/shadow_hand_np.py index feae3ce..4e122eb 100644 --- a/motrix_envs/src/motrix_envs/manipulation/shadow_hand/shadow_hand_np.py +++ b/motrix_envs/src/motrix_envs/manipulation/shadow_hand/shadow_hand_np.py @@ -333,12 +333,12 @@ class ShadowHandReposeEnv(NpEnv): -cfg.reset_dof_pos_noise, cfg.reset_dof_pos_noise, (num_resets, self._num_hand_dofs), - ) + ).astype(np.float32) # Add noise to DOF velocities dof_vel_noise = np.random.uniform( -cfg.reset_dof_vel_noise, cfg.reset_dof_vel_noise, (num_resets, self._num_hand_dofs) - ) + ).astype(np.float32) # Set DOF states for all envs in data (already filtered) dof_pos = np.tile(init_dof_pos, (num_resets, 1)) @@ -350,7 +350,9 @@ class ShadowHandReposeEnv(NpEnv): data.set_dof_vel(dof_vel) # Reset cube position with small noise - cube_pos_noise = np.random.uniform(-cfg.reset_position_noise, cfg.reset_position_noise, (num_resets, 3)) + cube_pos_noise = np.random.uniform(-cfg.reset_position_noise, cfg.reset_position_noise, (num_resets, 3)).astype( + np.float32 + ) cube_pos = np.tile(self._in_hand_pos, (num_resets, 1)) cube_pos += cube_pos_noise diff --git a/motrix_envs/src/motrix_envs/math/quaternion.py b/motrix_envs/src/motrix_envs/math/quaternion.py index cb3a2ea..ac9a8ea 100644 --- a/motrix_envs/src/motrix_envs/math/quaternion.py +++ b/motrix_envs/src/motrix_envs/math/quaternion.py @@ -58,6 +58,24 @@ def conjugate(q): return q * np.array([-1, -1, -1, 1], dtype=q.dtype) +def inverse(q): + """ + Compute the inverse of a quaternion. + + For unit quaternions, this is equal to the conjugate. For non-unit + quaternions, divide the conjugate by the squared norm. + + Args: + q: Input quaternion(s). Shape: (..., 4) + + Returns: + Inverse quaternion(s). Shape: (..., 4) + """ + q = np.asarray(q) + norm_sq = np.sum(np.square(q), axis=-1, keepdims=True) + return conjugate(q) / np.maximum(norm_sq, 1e-12) + + def from_euler(roll: np.ndarray, pitch: np.ndarray, yaw: np.ndarray): """ Euler convert to quaternion, with [x, y, z, w] format @@ -287,7 +305,7 @@ def generate_random_shoemake(size): size = tuple(size) # Generate three uniform random numbers - u1, u2, u3 = np.random.uniform(0, 1, size=(3, *size)) + u1, u2, u3 = np.random.uniform(0, 1, size=(3, *size)).astype(np.float32) # Shoemake's method sqrt1_u1 = np.sqrt(1 - u1) diff --git a/motrix_envs/src/motrix_envs/np/env.py b/motrix_envs/src/motrix_envs/np/env.py index 03810cd..6d58a71 100644 --- a/motrix_envs/src/motrix_envs/np/env.py +++ b/motrix_envs/src/motrix_envs/np/env.py @@ -182,6 +182,7 @@ class NpEnv(ABEnv): pass def physics_step(self): + # motrixsim.SceneModel.step only supports single step, so we loop for _ in range(self._cfg.sim_substeps): self._model.step(self._state.data) diff --git a/motrix_rl/pyproject.toml b/motrix_rl/pyproject.toml index 0ac6142..7050869 100644 --- a/motrix_rl/pyproject.toml +++ b/motrix_rl/pyproject.toml @@ -4,8 +4,8 @@ build-backend = "uv_build" [project] name = "motrix-rl" -version = "0.2.0" -description = "Reinforcement learning training framework based on SKRL with multi-backend unified training interface." +version = "0.3.0" +description = "Reinforcement learning training framework with multi-backend unified training interface." authors = [{ name = "Motphys", email = "developers@motphys.com" }] requires-python = "==3.10.*" readme = "README.md" @@ -25,6 +25,12 @@ skrl-torch = [ "torchvision===v0.22.0+cu128", "torchaudio===2.7.0+cu128", ] +rslrl = [ + "rsl-rl-lib>=4.0.0", + "torch===2.7.0+cu128", + "torchvision===v0.22.0+cu128", + "torchaudio===2.7.0+cu128", +] test = ["pytest~=8.3.3"] [tool.uv.sources] diff --git a/motrix_rl/src/motrix_rl/__init__.py b/motrix_rl/src/motrix_rl/__init__.py index 8eb3dcd..3a6ae2d 100644 --- a/motrix_rl/src/motrix_rl/__init__.py +++ b/motrix_rl/src/motrix_rl/__init__.py @@ -13,4 +13,10 @@ # limitations under the License. # ============================================================================== -from . import cfgs, skrl # noqa: F401 +from . import tasks # noqa: F401 +from .rslrl.cfg import ( # noqa: F401 + RslRlActorCfg, + RslRlCriticCfg, + RslRlPpoAlgorithmCfg, + RslrlRunnerCfg, +) diff --git a/motrix_rl/src/motrix_rl/base.py b/motrix_rl/src/motrix_rl/base.py deleted file mode 100644 index 2686471..0000000 --- a/motrix_rl/src/motrix_rl/base.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -import dataclasses -from typing import Optional - - -@dataclasses.dataclass -class BaseRLCfg: - """ - Config for the reinforcement learning algorithm - """ - - # Basic training parameters - seed: Optional[int] = None - num_envs: int = 2048 - play_num_envs: int = 16 - max_env_steps: int = 20480000 - check_point_interval: int = 1000 - - def replace(self, **updates) -> "BaseRLCfg": - return dataclasses.replace(self, **updates) - - @property - def max_batch_env_steps(self) -> int: - """ - The max batched environment steps for the RL algorithm. - """ - n = int(self.max_env_steps / self.num_envs) - return (int)(n / self.check_point_interval) * self.check_point_interval diff --git a/motrix_rl/src/motrix_rl/cfgs.py b/motrix_rl/src/motrix_rl/cfgs.py deleted file mode 100644 index 9c8d5c9..0000000 --- a/motrix_rl/src/motrix_rl/cfgs.py +++ /dev/null @@ -1,553 +0,0 @@ -# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -from dataclasses import dataclass - -from motrix_rl.registry import rlcfg -from motrix_rl.skrl.cfg import PPOCfg - - -class basic: - @rlcfg("cartpole") - @dataclass - class CartPolePPO(PPOCfg): - max_env_steps: int = 10_000_000 - check_point_interval: int = 500 - - # Override PPO configuration - policy_hidden_layer_sizes: tuple[int, ...] = (32, 32) - value_hidden_layer_sizes: tuple[int, ...] = (32, 32) - rollouts: int = 32 - learning_epochs: int = 5 - mini_batches: int = 4 - - @rlcfg("acrobot", backend="jax") - @dataclass - class AcrobotPPO(PPOCfg): - max_env_steps: int = 60_000_000 - check_point_interval: int = 500 - - # Override PPO configuration - policy_hidden_layer_sizes: tuple[int, ...] = (32, 32) - value_hidden_layer_sizes: tuple[int, ...] = (32, 32) - rollouts: int = 64 - learning_epochs: int = 5 - mini_batches: int = 8 - learning_rate: float = 3e-4 - grad_norm_clip: float = 0.5 - clip_predicted_values: bool = False - value_clip: float = 10.0 - entropy_loss_scale: float = 0.05 - learning_rate_scheduler_kl_threshold: float = 0.02 - discount_factor: float = 0.995 - lambda_param: float = 0.97 - ratio_clip: float = 0.2 - value_loss_scale: float = 0.5 - random_timesteps: int = 0 - learning_starts: int = 0 - kl_threshold: float = 0.03 - grad_norm_clip: float = 0.1 - entropy_loss_scale: float = 0.1 - - @rlcfg("acrobot", backend="torch") - @dataclass - class AcrobotPPOTorch(PPOCfg): - max_env_steps: int = 60_000_000 - check_point_interval: int = 500 - - # Override PPO configuration - policy_hidden_layer_sizes: tuple[int, ...] = (32, 32) - value_hidden_layer_sizes: tuple[int, ...] = (32, 32) - rollouts: int = 64 - learning_epochs: int = 5 - mini_batches: int = 8 - learning_rate: float = 0.0003 - learning_rate_scheduler_kl_threshold: float = 0.02 - entropy_loss_scale: float = 0.2 - discount_factor: float = 0.995 - lambda_param: float = 0.97 - - @rlcfg("pendulum") - @dataclass - class PendulumPPO(PPOCfg): - seed: int = 42 - max_env_steps: int = 5_000_000 - num_envs: int = 1024 - - # Override PPO configuration - policy_hidden_layer_sizes: tuple[int, ...] = (64, 64) - value_hidden_layer_sizes: tuple[int, ...] = (64, 64) - learning_rate: float = 3e-4 - rollouts: int = 32 - learning_epochs: int = 5 - mini_batches: int = 4 - - @rlcfg("bounce_ball") - @dataclass - class BounceBallPPO(PPOCfg): - max_env_steps: int = 100_000_000 - check_point_interval: int = 5000 - - # Override PPO configuration for bounce ball task - policy_hidden_layer_sizes: tuple[int, ...] = (64, 64, 64) - value_hidden_layer_sizes: tuple[int, ...] = (64, 64, 64) - rollouts: int = 128 - learning_epochs: int = 15 - mini_batches: int = 16 - learning_rate: float = 2e-4 - num_envs: int = 1024 - - @rlcfg("dm-walker", backend="jax") - @rlcfg("dm-stander", backend="jax") - @rlcfg("dm-runner", backend="jax") - @dataclass - class WalkerPPO(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 40000 - num_envs: int = 2048 - - # Override PPO configuration - learning_rate: float = 2e-4 - rollouts: int = 24 - learning_epochs: int = 4 - mini_batches: int = 4 - - @rlcfg("dm-stander", backend="torch") - @rlcfg("dm-walker", backend="torch") - @dataclass - class WalkerPPOTorch(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 40000 - num_envs: int = 2048 - - # Override PPO configuration - learning_rate: float = 2e-4 - rollouts: int = 24 - learning_epochs: int = 4 - mini_batches: int = 32 - - @rlcfg("dm-runner", backend="torch") - @dataclass - class RunnerPPOTorch(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 40000 - num_envs: int = 2048 - - # Override PPO configuration - learning_rate: float = 2e-4 - rollouts: int = 24 - learning_epochs: int = 2 - mini_batches: int = 32 - - @rlcfg("dm-cheetah", backend="jax") - @dataclass - class CheetahPPO(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 40000 - num_envs: int = 2048 - - # Override PPO configuration - learning_rate: float = 2e-4 - rollouts: int = 24 - learning_epochs: int = 4 - mini_batches: int = 32 - policy_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - value_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - - @rlcfg("dm-cheetah", backend="torch") - @dataclass - class CheetahPPOTorch(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 40000 - num_envs: int = 2048 - - # Override PPO configuration - learning_rate: float = 2e-4 - rollouts: int = 24 - learning_epochs: int = 4 - mini_batches: int = 32 - policy_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - value_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - - @rlcfg("dm-hopper-stand", backend="jax") - @dataclass - class HopperStandPPO(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 40000 - num_envs: int = 2048 - - # Override PPO configuration - learning_rate: float = 2e-4 - rollouts: int = 24 - learning_epochs: int = 4 - mini_batches: int = 4 - policy_hidden_layer_sizes: tuple[int, ...] = (32, 32, 32) - value_hidden_layer_sizes: tuple[int, ...] = (32, 32, 32) - - @rlcfg("dm-hopper-hop", backend="jax") - @dataclass - class HopperPPO(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 40000 - num_envs: int = 2048 - - # Override PPO configuration - learning_rate: float = 2e-4 - rollouts: int = 24 - learning_epochs: int = 5 - mini_batches: int = 32 - policy_hidden_layer_sizes: tuple[int, ...] = (32, 32, 32) - value_hidden_layer_sizes: tuple[int, ...] = (32, 32, 32) - - @rlcfg("dm-hopper-stand", backend="torch") - @rlcfg("dm-hopper-hop", backend="torch") - @dataclass - class HopperPPOTorch(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 40000 - num_envs: int = 2048 - - # Override PPO configuration - learning_rate: float = 2e-4 - rollouts: int = 24 - learning_epochs: int = 5 - mini_batches: int = 32 - policy_hidden_layer_sizes: tuple[int, ...] = (32, 32, 32) - value_hidden_layer_sizes: tuple[int, ...] = (32, 32, 32) - - @rlcfg("dm-reacher", backend="jax") - @dataclass - class ReacherPPO(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 40000 - num_envs: int = 2048 - - # Override PPO configuration - learning_rate: float = 2e-4 - rollouts: int = 24 - learning_epochs: int = 4 - mini_batches: int = 32 - policy_hidden_layer_sizes: tuple[int, ...] = (32, 32, 32) - value_hidden_layer_sizes: tuple[int, ...] = (32, 32, 32) - - @rlcfg("dm-reacher", backend="torch") - @dataclass - class ReacherPPOTorch(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 40000 - num_envs: int = 2048 - - # Override PPO configuration - learning_rate: float = 2e-4 - rollouts: int = 24 - learning_epochs: int = 4 - mini_batches: int = 32 - policy_hidden_layer_sizes: tuple[int, ...] = (64, 64, 64) - value_hidden_layer_sizes: tuple[int, ...] = (64, 64, 64) - - @rlcfg("dm-finger-spin") - @rlcfg("dm-finger-turn-easy") - @rlcfg("dm-finger-turn-hard") - @dataclass - class FingerPPO(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 40000 - num_envs: int = 2048 - - # Similar to other dm_* configs - learning_rate: float = 2e-4 - rollouts: int = 24 - learning_epochs: int = 4 - mini_batches: int = 4 - - # JAX-only overrides (keep torch + turn-easy unaffected) - @rlcfg("dm-finger-spin", backend="jax") - @dataclass - class FingerSpinPPOJax(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 40000 - num_envs: int = 2048 - - # More conservative PPO for stability (spin can collapse mid-training in JAX) - learning_rate: float = 7.5e-5 - learning_rate_scheduler_kl_threshold: float = 0.003 - entropy_loss_scale: float = 5e-4 - rollouts: int = 24 - learning_epochs: int = 1 - mini_batches: int = 16 - ratio_clip: float = 0.08 - value_clip: float = 0.1 - value_loss_scale: float = 0.5 - grad_norm_clip: float = 0.25 - - @rlcfg("dm-finger-turn-hard", backend="jax") - @dataclass - class FingerTurnHardPPOJax(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 40000 - num_envs: int = 2048 - - # Extra conservative to avoid late-stage collapses - learning_rate: float = 5e-5 - learning_rate_scheduler_kl_threshold: float = 0.004 - rollouts: int = 24 - learning_epochs: int = 1 - mini_batches: int = 16 - ratio_clip: float = 0.08 - value_loss_scale: float = 0.5 - grad_norm_clip: float = 0.25 - - @rlcfg("dm-manipulator-bring-ball", backend="jax") - @dataclass - class ManipulatorPPOJax(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 20000 - num_envs: int = 256 - learning_rate: float = 3e-4 - rollouts: int = 24 - learning_epochs: int = 4 - mini_batches: int = 4 - ratio_clip: float = 0.2 - entropy_loss_scale: float = 1e-3 - grad_norm_clip: float = 1.0 - policy_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - value_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - - @rlcfg("dm-manipulator-bring-ball", backend="torch") - @dataclass - class ManipulatorPPOTorch(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 20000 - num_envs: int = 256 - learning_rate: float = 2e-4 - rollouts: int = 24 - learning_epochs: int = 4 - mini_batches: int = 4 - policy_hidden_layer_sizes: tuple[int, ...] = (256, 256) - value_hidden_layer_sizes: tuple[int, ...] = (256, 256) - - @rlcfg("dm-humanoid-stand", backend="jax") - @rlcfg("dm-humanoid-walk", backend="jax") - @rlcfg("dm-humanoid-run", backend="jax") - @dataclass - class HumanoidPPO(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 40000 - num_envs: int = 2048 - - learning_rate: float = 3e-4 - rollouts: int = 24 - learning_epochs: int = 8 - mini_batches: int = 2 - policy_hidden_layer_sizes: tuple[int, ...] = (512, 256, 128) - value_hidden_layer_sizes: tuple[int, ...] = (512, 256, 128) - - @rlcfg("dm-humanoid-stand", backend="torch") - @rlcfg("dm-humanoid-walk", backend="torch") - @rlcfg("dm-humanoid-run", backend="torch") - @dataclass - class HumanoidPPOTorch(PPOCfg): - seed: int = 42 - max_env_steps: int = 1024 * 40000 - num_envs: int = 2048 - - learning_rate: float = 3e-4 - rollouts: int = 24 - learning_epochs: int = 8 - mini_batches: int = 2 - policy_hidden_layer_sizes: tuple[int, ...] = (512, 256, 128) - value_hidden_layer_sizes: tuple[int, ...] = (512, 256, 128) - - -class locomotion: - @rlcfg("go1-flat-terrain-walk") - @dataclass - class Go1WalkPPO(PPOCfg): - """ - Go1 Walk RL config - """ - - seed: int = 42 - share_policy_value_features: bool = False - max_env_steps: int = 1024 * 60_000 - num_envs: int = 2048 - - # Override PPO configuration - rollouts: int = 24 - policy_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - value_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - learning_epochs: int = 5 - mini_batches: int = 3 - learning_rate: float = 3e-4 - - @rlcfg("go2-flat-terrain-walk") - @dataclass - class Go2WalkPPO(PPOCfg): - """ - Go2 Walk RL config - """ - - seed: int = 42 - share_policy_value_features: bool = False - max_env_steps: int = 1024 * 60_000 - num_envs: int = 2048 - - # Override PPO configuration - rollouts: int = 24 - policy_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - value_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - learning_epochs: int = 5 - mini_batches: int = 3 - learning_rate: float = 3e-4 - - @rlcfg("go1-rough-terrain-walk") - @dataclass - class Go1WalkRoughPPO(Go1WalkPPO): - policy_hidden_layer_sizes: tuple[int, ...] = (512, 256, 128) - value_hidden_layer_sizes: tuple[int, ...] = (512, 256, 128) - - @rlcfg("go1-stairs-terrain-walk") - @dataclass - class Go1WalkStairsPPO(Go1WalkRoughPPO): ... - - -class manipulation: - @rlcfg("franka-lift-cube", "jax") - @dataclass - class FrankaLiftPPOJax(PPOCfg): - seed: int = 42 - max_env_steps: int = 4096 * 50000 - share_policy_value_features: bool = True - - # Override PPO configuration - policy_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - value_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - rollouts: int = 24 - learning_epochs: int = 4 - mini_batches: int = 32 - learning_rate: float = 1e-3 - - @rlcfg("franka-lift-cube", "torch") - @dataclass - class FrankaLiftPPOTorch(PPOCfg): - seed: int = 42 - max_env_steps: int = 4096 * 50000 - share_policy_value_features: bool = True - - # Override PPO configuration - policy_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - value_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - rollouts: int = 24 - learning_epochs: int = 8 - mini_batches: int = 4 - learning_rate: float = 3e-4 - learning_rate_scheduler_kl_threshold: float = 0.01 - entropy_loss_scale: float = 0.001 - rewards_shaper_scale: float = 0.01 - - @rlcfg("franka-open-cabinet") - @dataclass - class FrankaOpenCabinetPPO(PPOCfg): - seed: int = 64 - max_env_steps: int = 2048 * 24000 - share_policy_value_features: bool = False - - # Override PPO configuration - policy_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - value_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - rollouts: int = 16 - learning_epochs: int = 5 - mini_batches: int = 32 - learning_rate: float = 3e-4 - rewards_shaper_scale: float = 1e-1 - entropy_loss_scale: float = 0.001 - - @rlcfg("shadow-hand-repose") - @dataclass - class ShadowHandReposePPO(PPOCfg): - """ - Shadow Hand Repose PPO configuration - """ - - # ===== Basic Settings ===== - seed: int = 42 - num_envs: int = 8192 - play_num_envs: int = 16 - max_env_steps: int = 200_000_000 - check_point_interval: int = 1000 - - # ===== Network Architecture ===== - policy_hidden_layer_sizes: tuple[int, ...] = (512, 512, 256, 128) - value_hidden_layer_sizes: tuple[int, ...] = (512, 512, 256, 128) - share_policy_value_features: bool = True - - # ===== PPO Core Parameters ===== - rollouts: int = 16 - learning_epochs: int = 5 - mini_batches: int = 4 - discount_factor: 0.99 - lambda_param: 0.95 - - # ===== Learning Rate ===== - learning_rate: float = 5.0e-04 - learning_rate_scheduler_kl_threshold: float = 0.016 - - # ===== Clipping ===== - ratio_clip: float = 0.2 - value_clip: float = 0.2 - clip_predicted_values: bool = True - grad_norm_clip: float = 1.0 - - # ===== Loss Coefficients ===== - entropy_loss_scale: float = 0.0 - value_loss_scale: float = 2.0 - kl_threshold: float = 0.0 - - # ===== Reward Shaping ===== - rewards_shaper_scale: float = 0.01 - - # ===== Training Control ===== - random_timesteps: int = 0 - learning_starts: int = 0 - time_limit_bootstrap: bool = False - - -class navigation: - @rlcfg("anymal_c_navigation_flat") - @dataclass - class AnymalCPPOConfig(PPOCfg): - # ===== Basic Training Parameters ===== - seed: int = 42 # Random seed - num_envs: int = 2048 # Number of parallel environments during training - play_num_envs: int = 16 # Number of parallel environments during evaluation - max_env_steps: int = 100_000_000 # Maximum training steps - - # ===== PPO Algorithm Core Parameters ===== - learning_rate: float = 3e-4 # Learning rate - rollouts: int = 48 # Number of experience replay rollouts - learning_epochs: int = 6 # Number of training epochs per update - mini_batches: int = 32 # Number of mini-batches - discount_factor: float = 0.99 # Discount factor - lambda_param: float = 0.95 # GAE parameter - grad_norm_clip: float = 1.0 # Gradient clipping - - # ===== PPO Clipping Parameters ===== - ratio_clip: float = 0.2 # PPO clipping ratio - value_clip: float = 0.2 # Value clipping - clip_predicted_values: bool = True # Clip predicted values - - # Medium-sized network (default configuration, suitable for most tasks) - policy_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - value_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) diff --git a/motrix_rl/src/motrix_rl/registry.py b/motrix_rl/src/motrix_rl/registry.py index 85d15d8..03bafe0 100644 --- a/motrix_rl/src/motrix_rl/registry.py +++ b/motrix_rl/src/motrix_rl/registry.py @@ -15,19 +15,18 @@ import logging from dataclasses import dataclass, field -from typing import Callable, Type, TypeVar +from typing import Any, Callable, Type, TypeVar from motrix_envs import registry as env_registry -from motrix_rl.base import BaseRLCfg logger = logging.getLogger(__name__) -TRLCfg = TypeVar("TRLCfg", bound=BaseRLCfg) +TRLCfg = TypeVar("TRLCfg") @dataclass class EnvRlCfgs: - cfgs: dict[str, dict[str, Type[BaseRLCfg]]] = field(default_factory=dict) + cfgs: dict[str, dict[str, Type]] = field(default_factory=dict) """ The RL configuration classes available for this environment. Structure: {rl_framework: {backend: config_class}} @@ -39,7 +38,7 @@ class EnvRlCfgs: _rlcfgs: dict[str, EnvRlCfgs] = {} -def _register_rlcfg(env_name: str, rllib: str, backend: str, train_cfg_cls: Type[BaseRLCfg]): +def _register_rlcfg(env_name: str, rllib: str, backend: str, train_cfg_cls: Type): """ Register a training configuration class for an environment, reinforcement learning framework, and backend. @@ -60,9 +59,39 @@ def _register_rlcfg(env_name: str, rllib: str, backend: str, train_cfg_cls: Type _rlcfgs[env_name].cfgs[rllib][backend] = train_cfg_cls +def _infer_framework_from_class(cls: Type) -> str: + """Infer RL framework name from the class's parent class. + + Args: + cls: Configuration class to inspect + + Returns: + Framework name ("skrl" or "rslrl") + + Raises: + ValueError: If framework cannot be determined from parent class + """ + # Import here to avoid circular imports + from motrix_rl.rslrl.cfg import RslrlCfg + from motrix_rl.skrl.config import SkrlCfg + + # Check entire MRO (Method Resolution Order) for framework base classes + for base in cls.__mro__: + if base is SkrlCfg: + return "skrl" + elif base is RslrlCfg: + return "rslrl" + + raise ValueError( + f"Cannot infer RL framework from {cls.__name__}. Class must inherit from either SkrlCfg or RslrlCfg." + ) + + def rlcfg(env_name: str, backend: str = None) -> Callable[[Type[TRLCfg]], Type[TRLCfg]]: """ - Decorator to register a training configuration class for an environment, RL framework, and backend. + Decorator to register a training configuration class for an environment and backend. + + The RL framework (skrl/rslrl) is automatically inferred from the parent class. Args: env_name: Environment name @@ -70,15 +99,18 @@ def rlcfg(env_name: str, backend: str = None) -> Callable[[Type[TRLCfg]], Type[T """ def decorator(cls: Type[TRLCfg]) -> Type[TRLCfg]: + # Infer framework from parent class + rl_framework = _infer_framework_from_class(cls) + backends = ["jax", "torch"] if backend is None else [backend] for b in backends: - _register_rlcfg(env_name, "skrl", b, cls) + _register_rlcfg(env_name, rl_framework, b, cls) return cls return decorator -def default_rl_cfg(env_name: str, rllib: str, backend: str) -> BaseRLCfg: +def default_rl_cfg(env_name: str, rllib: str, backend: str) -> Any: """ Get the default training configuration for an environment, reinforcement learning framework, and backend. diff --git a/motrix_rl/src/motrix_rl/rslrl/__init__.py b/motrix_rl/src/motrix_rl/rslrl/__init__.py new file mode 100644 index 0000000..7412e1d --- /dev/null +++ b/motrix_rl/src/motrix_rl/rslrl/__init__.py @@ -0,0 +1,40 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""RSLRL integration module for MotrixLab. + +This module provides configuration classes and utilities for using RSLRL +(ETH Zurich's RL library) with MotrixLab. + +The configuration structure matches rsl_rl's flat format with separate +actor and critic configs at the top level. +""" + +from motrix_rl.rslrl.cfg import ( + RslRlActorCfg, + RslRlCriticCfg, + RslRlPpoAlgorithmCfg, + RslrlRunnerCfg, +) + +__all__ = [ + "RslRlActorCfg", + "RslRlCriticCfg", + "RslRlPpoAlgorithmCfg", + "RslrlRunnerCfg", + "field_override", + "inherit_field", + "configclass", +] diff --git a/motrix_rl/src/motrix_rl/rslrl/cfg.py b/motrix_rl/src/motrix_rl/rslrl/cfg.py new file mode 100644 index 0000000..3b3910a --- /dev/null +++ b/motrix_rl/src/motrix_rl/rslrl/cfg.py @@ -0,0 +1,122 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + + +"""PPO Agent Configuration for RSLRL + +This module provides configuration classes for PPO agents using the +RSLRL (ETH Zurich RL library) framework. + +The configuration structure matches rsl_rl's flat format with separate +actor and critic configs at the top level. +""" + +from dataclasses import dataclass, field +from typing import Literal + +from motrix_rl.utils import class_to_dict + + +@dataclass +class RslRlActorCfg: + """Configuration for the actor network.""" + + class_name: str = "MLPModel" + hidden_dims: list[int] = field(default_factory=lambda: [256, 128, 64]) + activation: str = "elu" + obs_normalization: bool = True + stochastic: bool = True + init_noise_std: float = 1.0 + noise_std_type: Literal["scalar", "log"] = "scalar" + state_dependent_std: bool = False + + +@dataclass +class RslRlCriticCfg: + """Configuration for the critic network.""" + + class_name: str = "MLPModel" + hidden_dims: list[int] = field(default_factory=lambda: [256, 128, 64]) + activation: str = "elu" + obs_normalization: bool = True + stochastic: bool = False + + +@dataclass +class RslRlPpoAlgorithmCfg: + """Configuration for the PPO algorithm.""" + + class_name: str = "PPO" + optimizer: str = "adam" + learning_rate: float = 3e-4 + num_learning_epochs: int = 5 + num_mini_batches: int = 4 + schedule: str = "adaptive" + value_loss_coef: float = 1.0 + clip_param: float = 0.2 + use_clipped_value_loss: bool = True + desired_kl: float = 0.008 + entropy_coef: float = 0.01 + gamma: float = 0.99 + lam: float = 0.95 + max_grad_norm: float = 1.0 + normalize_advantage_per_mini_batch: bool = False + rnd_cfg: dict | None = None + symmetry_cfg: dict | None = None + + +@dataclass +class RslrlRunnerCfg: + """Configuration matching rsl_rl's flat structure. + + This configuration provides separate actor and critic configs at the top level, + matching the structure expected by rsl_rl's OnPolicyRunner. + """ + + # Runner settings + class_name: str = "OnPolicyRunner" + seed: int = 42 + device: str = "cuda:0" + num_steps_per_env: int = 24 + max_iterations: int = 10000 + save_interval: int = 50 + experiment_name: str = "experiment" + run_name: str = "" + logger: Literal["tensorboard", "neptune", "wandb"] = "tensorboard" + + # Observation groups + obs_groups: dict[str, list[str]] = field(default_factory=lambda: {"actor": ["policy"], "critic": ["policy"]}) + + # Network configs - TOP LEVEL + actor: RslRlActorCfg = field(default_factory=RslRlActorCfg) + critic: RslRlCriticCfg = field(default_factory=RslRlCriticCfg) + algorithm: RslRlPpoAlgorithmCfg = field(default_factory=RslRlPpoAlgorithmCfg) + + def to_dict(self) -> dict: + """Convert config to dictionary for OnPolicyRunner. + + Returns: + Dictionary representation matching rsl_rl's expected format. + """ + return class_to_dict(self) + + +@dataclass +class RslrlCfg: + """Configuration for RSLRL.""" + + num_envs: int = 2048 + play_num_envs: int = 16 + runner: RslrlRunnerCfg = field(default_factory=RslrlRunnerCfg) diff --git a/motrix_rl/src/motrix_rl/rslrl/torch/__init__.py b/motrix_rl/src/motrix_rl/rslrl/torch/__init__.py new file mode 100644 index 0000000..eae3c27 --- /dev/null +++ b/motrix_rl/src/motrix_rl/rslrl/torch/__init__.py @@ -0,0 +1,20 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""PyTorch backend for RSLRL integration.""" + +from motrix_rl.rslrl.torch.wrap_vec_env import RslrlNpEnvWrap + +__all__ = ["RslrlNpEnvWrap"] diff --git a/motrix_rl/src/motrix_rl/rslrl/torch/train/__init__.py b/motrix_rl/src/motrix_rl/rslrl/torch/train/__init__.py new file mode 100644 index 0000000..38616ca --- /dev/null +++ b/motrix_rl/src/motrix_rl/rslrl/torch/train/__init__.py @@ -0,0 +1,20 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Training module for RSLRL integration.""" + +from motrix_rl.rslrl.torch.train.ppo import Trainer + +__all__ = ["Trainer"] diff --git a/motrix_rl/src/motrix_rl/rslrl/torch/train/ppo.py b/motrix_rl/src/motrix_rl/rslrl/torch/train/ppo.py new file mode 100644 index 0000000..0f7238a --- /dev/null +++ b/motrix_rl/src/motrix_rl/rslrl/torch/train/ppo.py @@ -0,0 +1,172 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""PPO Trainer for RSLRL integration.""" + +import logging + +import torch +from rsl_rl.runners import OnPolicyRunner + +from motrix_envs import registry as env_registry +from motrix_rl import registry as rl_registry +from motrix_rl import utils +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.rslrl.torch.wrap_vec_env import RslrlNpEnvWrap +from motrix_rl.skrl import get_log_dir + +logger = logging.getLogger(__name__) + + +class Trainer: + """RSLRL PPO Trainer. + + This class wraps RSLRL's OnPolicyRunner to provide a training interface + consistent with the SKRL trainer implementation. + """ + + _env_name: str + _sim_backend: str + _rlcfg: RslrlCfg + _enable_render: bool + + def __init__( + self, + env_name: str, + sim_backend: str = None, + enable_render: bool = False, + cfg_override: dict = None, + ) -> None: + """Initialize the RSLRL PPO trainer. + + Args: + env_name: Name of the environment to train + sim_backend: Simulation backend to use (e.g., "mujoco", "npcm") + enable_render: Whether to enable rendering during training + cfg_override: Optional configuration overrides + """ + rlcfg = rl_registry.default_rl_cfg(env_name, "rslrl", backend="torch") + if cfg_override is not None: + rlcfg = utils.cfg_override(rlcfg, cfg_override) + self._rlcfg = rlcfg + self._env_name = env_name + self._sim_backend = sim_backend + self._enable_render = enable_render + + def train(self) -> None: + """Start training the agent. + + Creates the environment, wraps it for RSLRL, and runs the training loop. + """ + rlcfg = self._rlcfg + + # Create environment + env = env_registry.make(self._env_name, sim_backend=self._sim_backend, num_envs=rlcfg.num_envs) + + # Set random seed + if rlcfg.runner.seed is not None: + torch.manual_seed(rlcfg.runner.seed) + + # Determine device + device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + logger.info(f"Using device: {device}") + + # Wrap environment for RSLRL + vec_env = RslrlNpEnvWrap(env, device) + + # Create RSLRL config - use to_dict() method + rslrl_cfg = self._create_rslrl_config() + + # Create RSLRL runner + runner = OnPolicyRunner( + vec_env, rslrl_cfg, log_dir=get_log_dir(self._env_name, rllib="rslrl", agent_name="PPO"), device=device + ) + + # Start training + logger.info(f"Starting training for {self._env_name}") + logger.info(f"Number of environments: {rlcfg.num_envs}") + + # Get max_iterations from config + total_iterations = rslrl_cfg["max_iterations"] + logger.info(f"Number of learning iterations: {total_iterations}") + + runner.learn(num_learning_iterations=total_iterations) + + logger.info("Training completed") + + def play(self, policy_path: str) -> None: + """Evaluate a trained policy. + + Args: + policy_path: Path to the saved policy file + """ + import time + + rlcfg = self._rlcfg + + # Create environment with play_num_envs + env = env_registry.make(self._env_name, sim_backend=self._sim_backend, num_envs=rlcfg.play_num_envs) + + # Set random seed + if rlcfg.runner.seed is not None: + torch.manual_seed(rlcfg.runner.seed) + + # Determine device + device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + + # Wrap environment for RSLRL + vec_env = RslrlNpEnvWrap(env, device) + + # Create RSLRL config (minimal for evaluation) + rslrl_cfg = self._create_rslrl_config() + + # Create RSLRL runner with log_dir=None to disable logging (no git diff storage in play mode) + runner = OnPolicyRunner(vec_env, rslrl_cfg, log_dir=None, device=device) + + # Load policy + logger.info(f"Loading policy from {policy_path}") + runner.load(policy_path) + + # Run evaluation loop + logger.info("Starting evaluation loop...") + logger.info("Press Ctrl+C to stop") + obs, _ = vec_env.reset() + fps = 60 + + try: + while True: + t = time.time() + + # Get actions from policy + with torch.no_grad(): + policy = runner.get_inference_policy(device=device) + # MLPModel is callable, returns distribution mean for deterministic evaluation + actions = policy(obs) + + # Step environment + obs, rewards, dones, infos = vec_env.step(actions) + + # Render the environment + vec_env.render() + + delta_time = time.time() - t + if delta_time < 1.0 / fps: + time.sleep(1.0 / fps - delta_time) + + except KeyboardInterrupt: + logger.info("Evaluation interrupted by user") + + def _create_rslrl_config(self) -> dict: + return self._rlcfg.runner.to_dict() diff --git a/motrix_rl/src/motrix_rl/rslrl/torch/wrap_vec_env.py b/motrix_rl/src/motrix_rl/rslrl/torch/wrap_vec_env.py new file mode 100644 index 0000000..919c2ef --- /dev/null +++ b/motrix_rl/src/motrix_rl/rslrl/torch/wrap_vec_env.py @@ -0,0 +1,168 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""VecEnv wrapper for adapting NpEnv to RSLRL's VecEnv interface.""" + +import numpy as np +import torch +from rsl_rl.env.vec_env import VecEnv +from tensordict import TensorDict + +from motrix_envs.np.env import NpEnv + + +class RslrlNpEnvWrap(VecEnv): + """Adapter class that wraps NpEnv to RSLRL's VecEnv interface. + + RSLRL expects a VecEnv interface with specific methods for stepping, + resetting, and accessing observations. This adapter converts between + NpEnv's NpEnvState format and RSLRL's expected format. + """ + + def __init__(self, env: NpEnv, device: torch.device): + """Initialize the VecEnv adapter. + + Args: + env: The NpEnv instance to wrap + device: PyTorch device for tensors + """ + self._env = env + self._device = device + self._state = None + self._num_envs = env.num_envs + self._viewer = None # Will be initialized lazily when render() is called + + # Set max_episode_length from env config + self.max_episode_length = self._env.cfg.max_episode_steps if self._env.cfg.max_episode_steps else 10000 + + # Episode length buffer for tracking + self.episode_length_buf = torch.zeros(self._num_envs, dtype=torch.long, device=self._device) + + # Configuration dict for RSLRL logger + self.cfg = { + "env_name": self._env.cfg.__class__.__name__, + } + + # Initialize the environment state + self.reset() + + @property + def num_envs(self) -> int: + """Number of parallel environments.""" + return self._num_envs + + @property + def num_obs(self) -> int: + """Size of observation space.""" + return self._env.observation_space.shape[0] + + @property + def num_actions(self) -> int: + """Size of action space.""" + return self._env.action_space.shape[0] + + @property + def device(self) -> torch.device: + """PyTorch device for tensors.""" + return self._device + + @property + def unwrapped(self) -> "RslrlNpEnvWrap": + """Return the unwrapped environment (self for this wrapper).""" + return self + + def step(self, actions: torch.Tensor) -> tuple[TensorDict, torch.Tensor, torch.Tensor, dict]: + # Convert torch actions to numpy + actions_np = actions.cpu().numpy() + + # Step the environment + state = self._env.step(actions_np) + self._state = state + + # Update episode length buffer + self.episode_length_buf += 1 + # Reset episode length for done environments + dones_np = state.done.astype(bool) + self.episode_length_buf[dones_np] = 0 + + # Convert to torch tensors + obs_tensor = torch.from_numpy(state.obs).to(self._device) + rewards = torch.from_numpy(state.reward).to(self._device) + + # Merge terminated and truncated into dones + dones = torch.from_numpy(state.done.astype(np.float32)).to(self._device) + + # Create TensorDict for observations + obs = TensorDict({"policy": obs_tensor}, batch_size=[self._num_envs], device=self._device) + + # Build extras dict (RSLRL calls it "extras" not "infos") + extras = {} + if "time_outs" in state.info: + extras["time_outs"] = torch.from_numpy(state.info["time_outs"]).to(self._device) + + return obs, rewards, dones, extras + + def reset(self) -> tuple[TensorDict, dict]: + """Reset all environments. + + Returns: + Tuple of (observations, extras) + - observations: TensorDict with observation groups + - extras: dict with episode information + """ + state = self._env.init_state() + self._state = state + + # Reset episode length buffer + self.episode_length_buf.zero_() + + obs_tensor = torch.from_numpy(state.obs).to(self._device) + + # Create TensorDict for observations + obs = TensorDict({"policy": obs_tensor}, batch_size=[self._num_envs], device=self._device) + + # Build extras dict + extras = {} + + return obs, extras + + def get_observations(self) -> TensorDict: + """Get current observations without stepping the environment. + + Returns: + Current observations as TensorDict + """ + if self._state is None: + obs, _ = self.reset() + return obs + + obs_tensor = torch.from_numpy(self._state.obs).to(self._device) + obs = TensorDict({"policy": obs_tensor}, batch_size=[self._num_envs], device=self._device) + return obs + + def render(self) -> None: + """Render the environment. + + For NpEnv, this triggers the motrixsim viewer to display the scene. + The viewer window must be kept alive by calling this method regularly. + """ + # Initialize viewer on first call + if self._viewer is None: + from motrix_envs.np.renderer import NpRenderer + + self._viewer = NpRenderer(env=self._env) + + # Render the current state + self._viewer.render() diff --git a/motrix_rl/src/motrix_rl/skrl/__init__.py b/motrix_rl/src/motrix_rl/skrl/__init__.py index c35dbb5..2d26836 100644 --- a/motrix_rl/src/motrix_rl/skrl/__init__.py +++ b/motrix_rl/src/motrix_rl/skrl/__init__.py @@ -13,9 +13,31 @@ # limitations under the License. # ============================================================================== +from datetime import datetime + LOG_DIR_PREFIX = "runs" -def get_log_dir(env_name: str) -> str: - """Get the log directory for the given environment name.""" - return f"{LOG_DIR_PREFIX}/{env_name}" +def get_log_dir(env_name: str, rllib: str = "skrl", agent_name: str = "PPO") -> str: + """Get the log directory for the given environment name and RL framework. + + Args: + env_name: Name of the environment + rllib: RL framework name (e.g., "skrl", "rslrl") + agent_name: Name of the agent (e.g., "PPO") + + Returns: + Log directory path: + - For SKRL: runs/{env_name}/{rllib}/ (SKRL creates its own timestamp subdirectory) + - For RSLRL: runs/{env_name}/{rllib}/{time}_{agent}/ (RSLRL doesn't create subdirectories) + """ + if rllib == "skrl": + # SKRL creates its own timestamp subdirectory, so we just provide the base path + return f"{LOG_DIR_PREFIX}/{env_name}/{rllib}" + else: + # RSLRL doesn't create subdirectories, so we add the timestamp here + now = datetime.now() + time_str = now.strftime("%y-%m-%d_%H-%M-%S") + microseconds = now.microsecond + time_str = f"{time_str}-_{microseconds:05d}" + return f"{LOG_DIR_PREFIX}/{env_name}/{rllib}/{time_str}_{agent_name}" diff --git a/motrix_rl/src/motrix_rl/skrl/cfg.py b/motrix_rl/src/motrix_rl/skrl/cfg.py deleted file mode 100644 index 23b9066..0000000 --- a/motrix_rl/src/motrix_rl/skrl/cfg.py +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - - -"""PPO Agent Configuration for SKRL - -This module provides configuration classes for PPO agents that match the -YAML configuration structure used in SKRL. -""" - -from dataclasses import dataclass - -from motrix_rl.base import BaseRLCfg - - -@dataclass -class PPOCfg(BaseRLCfg): - """PPO configuration . - - This class provides all the parameters needed to configure a PPO agent - in SKRL - """ - - # Model architecture settings - policy_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - value_hidden_layer_sizes: tuple[int, ...] = (256, 128, 64) - # Whether to share feature extraction layers between policy and value networks. only works if: - # 1. both networks have the same architecture - # 2. the backend is torch - share_policy_value_features: bool = True - - # Agent settings - rollouts: int = 32 - learning_epochs: int = 2 - mini_batches: int = 32 - discount_factor: float = 0.99 - lambda_param: float = 0.95 - - # Learning rate settings - learning_rate: float = 1e-3 - learning_rate_scheduler_kl_threshold: float = 0.008 - - # Training settings - random_timesteps: int = 0 - learning_starts: int = 0 - grad_norm_clip: float = 1.0 - - time_limit_bootstrap: bool = True - - # PPO clipping settings - ratio_clip: float = 0.2 - value_clip: float = 0.2 - clip_predicted_values: bool = True - - # Loss settings - entropy_loss_scale: float = 0.0 - value_loss_scale: float = 2.0 - kl_threshold: float = 0 - - # Reward shaping - rewards_shaper_scale: float = 1.0 diff --git a/motrix_rl/src/motrix_rl/skrl/config.py b/motrix_rl/src/motrix_rl/skrl/config.py new file mode 100644 index 0000000..75e0aec --- /dev/null +++ b/motrix_rl/src/motrix_rl/skrl/config.py @@ -0,0 +1,466 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + + +"""SKRL Configuration Classes + +This module provides configuration classes for SKRL RL framework integration. +The configuration structure matches template/skrl_config.yaml with a hierarchical +design following the same pattern as RslrlConfig. + +Configuration Hierarchy: + SkrlCfg (top-level) -> SkrlRunnerCfg (runner-level) + -> SkrlModelsCfg (models) + -> SkrlPolicyCfg (policy model) + -> SkrlValueCfg (value model) + -> SkrlMemoryCfg (memory) + -> SkrlAgentCfg (PPO agent) + -> SkrlAgentExperimentCfg (experiment settings) + -> SkrlTrainerCfg (trainer) +""" + +import dataclasses +from dataclasses import dataclass, field + + +@dataclass +class SkrlPolicyCfg: + """Configuration for SKRL policy (GaussianMixin) model. + + Corresponds to the policy section in template/skrl_config.yaml. + """ + + class_name: str = "GaussianMixin" + clip_actions: bool = False + clip_log_std: bool = True + initial_log_std: float = 1.0 + min_log_std: float = -20.0 + max_log_std: float = 2.0 + reduction: str = "sum" + input: str = "STATES" + hiddens: list[int] = field(default_factory=lambda: [256, 128, 64]) + hidden_activation: list[str] = field(default_factory=lambda: ["elu"]) + output: str = "ACTIONS" + output_activation: str = "" + output_scale: float = 1.0 + + def _normalize_activations(self, num_layers: int) -> str | list[str]: + """Normalize hidden_activation to match num_layers. + + SKRL requires either a single activation string (applied to all layers) + or a list with length matching the number of layers. + + Args: + num_layers: Number of hidden layers (len(self.hiddens)) + + Returns: + str or list[str] suitable for SKRL's network format + + Raises: + ValueError: If activation list length > 1 and doesn't match num_layers + """ + activations = self.hidden_activation + + # Empty list -> no activations + if isinstance(activations, list) and len(activations) == 0: + return [""] * num_layers + + # Single element list -> convert to string (SKRL will replicate) + if isinstance(activations, list) and len(activations) == 1: + return activations[0] + + # String -> return as-is (SKRL will replicate) + if isinstance(activations, str): + return activations + + # List with matching length -> use as-is + if isinstance(activations, list) and len(activations) == num_layers: + return activations + + # List with mismatched length > 1 -> raise error + if isinstance(activations, list) and len(activations) > 1: + raise ValueError( + f"hidden_activation length ({len(activations)}) must match " + f"the number of hidden layers ({num_layers}), or be a single value " + f"to apply to all layers. Got hiddens={self.hiddens}, " + f"hidden_activation={activations}" + ) + + return activations + + def to_network(self) -> tuple[list[dict], str]: + """Convert configuration to SKRL's network and output format. + + Returns: + (network, output) tuple where: + - network: SKRL network definition list of dicts + - output: SKRL output expression string (e.g., "tanh(ACTIONS)", "ONE") + + Examples: + Policy with hiddens=[256,128,64], output_activation="tanh", output_scale=1.0: + network = [{"name": "net", "input": "STATES", "layers": [256,128,64], "activations": "elu"}] + output = "tanh(ACTIONS)" + + Value with hiddens=[256,128,64], output_activation="", output_scale=0.5: + network = [{"name": "net", "input": "STATES", "layers": [256,128,64], "activations": "elu"}] + output = "0.5 * ONE" + """ + # Normalize activations to match hiddens length + num_layers = len(self.hiddens) + activations = self._normalize_activations(num_layers) + + # Build network definition + network = [ + { + "name": "net", + "input": "STATES", + "layers": self.hiddens, + "activations": activations, + } + ] + + # Build output expression + # Use output field directly (already in correct format) + + # Apply scale if not 1.0 + scale_prefix = f"{self.output_scale} * " if self.output_scale != 1.0 else "" + + # Apply activation if specified + if self.output_activation: + output = f"{scale_prefix}{self.output_activation}({self.output})" + else: + output = f"{scale_prefix}{self.output}" + + return network, output + + def to_dict(self) -> dict: + """Convert to dict, mapping class_name to class.""" + from motrix_rl.utils import class_to_dict + + return class_to_dict(self) + + +@dataclass +class SkrlValueCfg: + """Configuration for SKRL value (DeterministicMixin) model. + + Corresponds to the value section in template/skrl_config.yaml. + """ + + class_name: str = "DeterministicMixin" + clip_actions: bool = False + input: str = "STATES" + hiddens: list[int] = field(default_factory=lambda: [256, 128, 64]) + hidden_activation: list[str] = field(default_factory=lambda: ["elu"]) + output: str = "ONE" + output_activation: str = "" + output_scale: float = 1.0 + + def _normalize_activations(self, num_layers: int) -> str | list[str]: + """Normalize hidden_activation to match num_layers. + + SKRL requires either a single activation string (applied to all layers) + or a list with length matching the number of layers. + + Args: + num_layers: Number of hidden layers (len(self.hiddens)) + + Returns: + str or list[str] suitable for SKRL's network format + + Raises: + ValueError: If activation list length > 1 and doesn't match num_layers + """ + activations = self.hidden_activation + + # Empty list -> no activations + if isinstance(activations, list) and len(activations) == 0: + return [""] * num_layers + + # Single element list -> convert to string (SKRL will replicate) + if isinstance(activations, list) and len(activations) == 1: + return activations[0] + + # String -> return as-is (SKRL will replicate) + if isinstance(activations, str): + return activations + + # List with matching length -> use as-is + if isinstance(activations, list) and len(activations) == num_layers: + return activations + + # List with mismatched length > 1 -> raise error + if isinstance(activations, list) and len(activations) > 1: + raise ValueError( + f"hidden_activation length ({len(activations)}) must match " + f"the number of hidden layers ({num_layers}), or be a single value " + f"to apply to all layers. Got hiddens={self.hiddens}, " + f"hidden_activation={activations}" + ) + + return activations + + def to_network(self) -> tuple[list[dict], str]: + """Convert configuration to SKRL's network and output format. + + Returns: + (network, output) tuple where: + - network: SKRL network definition list of dicts + - output: SKRL output expression string (e.g., "tanh(ACTIONS)", "ONE") + + Examples: + Policy with hiddens=[256,128,64], output_activation="tanh", output_scale=1.0: + network = [{"name": "net", "input": "STATES", "layers": [256,128,64], "activations": "elu"}] + output = "tanh(ACTIONS)" + + Value with hiddens=[256,128,64], output_activation="", output_scale=0.5: + network = [{"name": "net", "input": "STATES", "layers": [256,128,64], "activations": "elu"}] + output = "0.5 * ONE" + """ + # Normalize activations to match hiddens length + num_layers = len(self.hiddens) + activations = self._normalize_activations(num_layers) + + # Build network definition + network = [ + { + "name": "net", + "input": "STATES", + "layers": self.hiddens, + "activations": activations, + } + ] + + # Build output expression + # Use output field directly (already in correct format) + + # Apply scale if not 1.0 + scale_prefix = f"{self.output_scale} * " if self.output_scale != 1.0 else "" + + # Apply activation if specified + if self.output_activation: + output = f"{scale_prefix}{self.output_activation}({self.output})" + else: + output = f"{scale_prefix}{self.output}" + + return network, output + + def to_dict(self) -> dict: + """Convert to dict, mapping class_name to class.""" + from motrix_rl.utils import class_to_dict + + return class_to_dict(self) + + +@dataclass +class SkrlModelsCfg: + """Configuration for SKRL models section. + + Corresponds to the models section in template/skrl_config.yaml. + """ + + separate: bool = False + policy: SkrlPolicyCfg = field(default_factory=SkrlPolicyCfg) + value: SkrlValueCfg = field(default_factory=SkrlValueCfg) + + def to_dict(self) -> dict: + """Convert to dict with nested configs.""" + return { + "separate": self.separate, + "policy": self.policy.to_dict(), + "value": self.value.to_dict(), + } + + +@dataclass +class SkrlMemoryCfg: + """Configuration for SKRL memory. + + Corresponds to the memory section in template/skrl_config.yaml. + """ + + class_name: str = "RandomMemory" + memory_size: int = -1 # -1: automatically determined + + def to_dict(self) -> dict: + """Convert to dict, mapping class_name to class.""" + from motrix_rl.utils import class_to_dict + + return class_to_dict(self) + + +@dataclass +class SkrlAgentExperimentCfg: + """Experiment settings within agent config. + + Corresponds to the experiment subsection in template/skrl_config.yaml. + """ + + directory: str = "runs" + experiment_name: str = "" + write_interval: int = -1 + checkpoint_interval: int = -1 + + +@dataclass +class SkrlAgentCfg: + """Configuration for SKRL PPO agent. + + Corresponds to the agent section in template/skrl_config.yaml. + Field names match PPO_DEFAULT_CONFIG from SKRL. + """ + + class_name: str = "PPO" + rollouts: int = 32 + learning_epochs: int = 2 + mini_batches: int = 32 + discount_factor: float = 0.99 + lam: float = 0.95 + learning_rate: float = 1e-3 + learning_rate_scheduler: str = "KLAdaptiveLR" + learning_rate_scheduler_kwargs: dict = field(default_factory=lambda: {"kl_threshold": 0.008}) + random_timesteps: int = 0 + learning_starts: int = 0 + grad_norm_clip: float = 1.0 + ratio_clip: float = 0.2 + value_clip: float = 0.2 + clip_predicted_values: bool = True + entropy_loss_scale: float = 0.0 + value_loss_scale: float = 2.0 + kl_threshold: int = 0 + rewards_shaper_scale: float = 1.0 + time_limit_bootstrap: bool = True + experiment: SkrlAgentExperimentCfg = field(default_factory=SkrlAgentExperimentCfg) + + def to_dict(self) -> dict: + """Convert configuration to dictionary for SKRL PPO agent. + + Returns: + Dictionary representation matching SKRL's PPO agent configuration format. + Maps class_name -> class and lam -> lambda for SKRL compatibility. + + Note: + - Maps 'class_name' to 'class' (SKRL convention) + - Maps 'lam' to 'lambda' (Python keyword conflict) + - Converts nested experiment config to dict + - Excludes state/value preprocessor fields (added dynamically during training) + """ + # Build base configuration dict + result = { + "class": self.class_name, + "rollouts": self.rollouts, + "learning_epochs": self.learning_epochs, + "mini_batches": self.mini_batches, + "discount_factor": self.discount_factor, + "lambda": self.lam, + "learning_rate": self.learning_rate, + "learning_rate_scheduler": self.learning_rate_scheduler, + "learning_rate_scheduler_kwargs": self.learning_rate_scheduler_kwargs, + "random_timesteps": self.random_timesteps, + "learning_starts": self.learning_starts, + "grad_norm_clip": self.grad_norm_clip, + "ratio_clip": self.ratio_clip, + "value_clip": self.value_clip, + "clip_predicted_values": self.clip_predicted_values, + "entropy_loss_scale": self.entropy_loss_scale, + "value_loss_scale": self.value_loss_scale, + "kl_threshold": self.kl_threshold, + "rewards_shaper_scale": self.rewards_shaper_scale, + "time_limit_bootstrap": self.time_limit_bootstrap, + "experiment": { + "directory": self.experiment.directory, + "experiment_name": self.experiment.experiment_name, + "write_interval": self.experiment.write_interval, + "checkpoint_interval": self.experiment.checkpoint_interval, + }, + } + + return result + + +@dataclass +class SkrlTrainerCfg: + """Configuration for SKRL sequential trainer. + + Corresponds to the trainer section in template/skrl_config.yaml. + """ + + class_name: str = "SequentialTrainer" + timesteps: int = 10000 + """ + The max number of batch env steps to run + """ + + def to_dict(self) -> dict: + """Convert to dict, mapping class_name to class.""" + from motrix_rl.utils import class_to_dict + + return class_to_dict(self) + + +@dataclass +class SkrlRunnerCfg: + """Main SKRL runner configuration. + + This mirrors the structure in template/skrl_config.yaml. + Follows the same pattern as RslrlRunnerCfg with nested configs + and a to_dict() method for dictionary conversion. + """ + + seed: int = 42 + models: SkrlModelsCfg = field(default_factory=SkrlModelsCfg) + memory: SkrlMemoryCfg = field(default_factory=SkrlMemoryCfg) + agent: SkrlAgentCfg = field(default_factory=SkrlAgentCfg) + trainer: SkrlTrainerCfg = field(default_factory=SkrlTrainerCfg) + + def to_dict(self) -> dict: + """Convert config to dictionary for SKRL. + + Returns: + Dictionary representation matching SKRL's expected format. + Maps class_name -> class for all nested configs. + + Note: + This method ensures that the output dictionary matches the exact + structure of template/skrl_config.yaml, including the 'class' field + names (instead of 'class_name' used in Python to avoid keyword conflicts). + """ + result = { + "seed": self.seed, + "models": self.models.to_dict(), + "memory": self.memory.to_dict(), + "agent": self.agent.to_dict(), + "trainer": self.trainer.to_dict(), + } + return result + + +@dataclass +class SkrlCfg: + """Top-level SKRL configuration. + + Follows the same pattern as RslrlCfg with environment-level settings + at the top level and runner configuration nested. + """ + + # Basic training parameters + num_envs: int = 2048 + play_num_envs: int = 16 + + runner: SkrlRunnerCfg = field(default_factory=SkrlRunnerCfg) + + def replace(self, **updates) -> "SkrlCfg": + """Replace specified fields and return a new instance.""" + return dataclasses.replace(self, **updates) diff --git a/motrix_rl/src/motrix_rl/skrl/jax/train/ppo.py b/motrix_rl/src/motrix_rl/skrl/jax/train/ppo.py index 6690d5a..6f421d6 100644 --- a/motrix_rl/src/motrix_rl/skrl/jax/train/ppo.py +++ b/motrix_rl/src/motrix_rl/skrl/jax/train/ppo.py @@ -19,9 +19,7 @@ import flax.linen as nn import jax.numpy as jnp import numpy as np from skrl.agents.jax.ppo import PPO as BasePPO -from skrl.agents.jax.ppo import PPO_DEFAULT_CONFIG from skrl.envs.jax import Wrapper -from skrl.memories.jax import RandomMemory from skrl.models.jax import DeterministicMixin, GaussianMixin, Model from skrl.resources.preprocessors.jax import RunningStandardScaler from skrl.resources.schedulers.jax import KLAdaptiveRL @@ -29,42 +27,69 @@ from skrl.trainers.jax import SequentialTrainer from skrl.utils import set_seed from motrix_envs import registry as env_registry -from motrix_rl import registry +from motrix_rl import registry, utils from motrix_rl.skrl import get_log_dir -from motrix_rl.skrl.cfg import PPOCfg +from motrix_rl.skrl.config import SkrlCfg, SkrlMemoryCfg from motrix_rl.skrl.jax import wrap_env -def _get_cfg( - rlcfg: PPOCfg, +def _instantiate_memory(memory_cfg: SkrlMemoryCfg, memory_size: int, num_envs: int, device) -> Any: + """Instantiate a SKRL Memory class based on configuration. + + Args: + memory_cfg: Memory configuration with class_name and settings + memory_size: Size of the memory buffer + num_envs: Number of parallel environments + device: Device to place memory on + + Returns: + Instantiated SKRL Memory object + + Raises: + ValueError: If class_name is not supported + """ + from skrl.memories.jax import RandomMemory + + # Map class_name to actual Memory class + memory_classes = { + "RandomMemory": RandomMemory, + } + + class_name = memory_cfg.class_name + if class_name not in memory_classes: + raise ValueError(f"Unsupported memory class_name: {class_name}. Supported: {list(memory_classes.keys())}") + + MemoryClass = memory_classes[class_name] + return MemoryClass(memory_size=memory_size, num_envs=num_envs, device=device) + + +def _add_runtime_config( + cfg: dict, env: Wrapper, log_dir: str = None, ) -> dict: - # configure and instantiate the agent (visit its documentation to see all the options) - # https://skrl.readthedocs.io/en/latest/api/agents/ppo.html#configuration-and-hyperparameters - cfg = PPO_DEFAULT_CONFIG.copy() - cfg["rollouts"] = rlcfg.rollouts # memory_size - cfg["learning_epochs"] = rlcfg.learning_epochs - cfg["mini_batches"] = rlcfg.mini_batches # mini_batch_size = rollouts * num_envs / mini_batches - cfg["discount_factor"] = rlcfg.discount_factor - cfg["lambda"] = rlcfg.lambda_param - cfg["learning_rate"] = rlcfg.learning_rate - cfg["learning_rate_scheduler"] = KLAdaptiveRL - cfg["learning_rate_scheduler_kwargs"] = {"kl_threshold": rlcfg.learning_rate_scheduler_kl_threshold} - cfg["random_timesteps"] = rlcfg.random_timesteps - cfg["learning_starts"] = rlcfg.learning_starts - cfg["grad_norm_clip"] = rlcfg.grad_norm_clip - cfg["ratio_clip"] = rlcfg.ratio_clip - cfg["value_clip"] = rlcfg.value_clip - cfg["clip_predicted_values"] = rlcfg.clip_predicted_values - cfg["entropy_loss_scale"] = rlcfg.entropy_loss_scale - cfg["value_loss_scale"] = rlcfg.value_loss_scale - cfg["kl_threshold"] = rlcfg.kl_threshold - if rlcfg.rewards_shaper_scale != 1.0: - cfg["rewards_shaper"] = lambda reward, timestep, timesteps: reward * rlcfg.rewards_shaper_scale + """Add runtime-specific configuration to the base agent config. + + Args: + cfg: Base configuration from agent.to_dict() (will be modified in-place) + env: SKRL environment wrapper + log_dir: Optional logging directory path + + Returns: + The same cfg dict with runtime values added (modified in-place for convenience) + """ + # Convert learning_rate_scheduler from string to actual class (if configured) + if cfg.get("learning_rate_scheduler") == "KLAdaptiveLR": + cfg["learning_rate_scheduler"] = KLAdaptiveRL + # Otherwise keep as-is (None or other scheduler type) + + # Add rewards shaper (conditional based on rewards_shaper_scale in cfg) + if cfg.get("rewards_shaper_scale", 1.0) != 1.0: + cfg["rewards_shaper"] = lambda reward, timestep, timesteps: reward * cfg["rewards_shaper_scale"] else: cfg["rewards_shaper"] = None - cfg["time_limit_bootstrap"] = rlcfg.time_limit_bootstrap + + # Add preprocessors (require runtime env values) cfg["state_preprocessor"] = RunningStandardScaler cfg["state_preprocessor_kwargs"] = { "size": env.observation_space, @@ -72,10 +97,15 @@ def _get_cfg( } cfg["value_preprocessor"] = RunningStandardScaler cfg["value_preprocessor_kwargs"] = {"size": 1, "device": env.device} - # logging to TensorBoard and write checkpoints (in timesteps) + + # Add experiment configuration (handle -1 -> "auto" conversion) if log_dir: - cfg["experiment"]["write_interval"] = rlcfg.check_point_interval - cfg["experiment"]["checkpoint_interval"] = rlcfg.check_point_interval + cfg["experiment"]["write_interval"] = ( + "auto" if cfg["experiment"]["write_interval"] == -1 else cfg["experiment"]["write_interval"] + ) + cfg["experiment"]["checkpoint_interval"] = ( + "auto" if cfg["experiment"]["checkpoint_interval"] == -1 else cfg["experiment"]["checkpoint_interval"] + ) cfg["experiment"]["directory"] = log_dir else: cfg["experiment"]["write_interval"] = 0 @@ -146,7 +176,7 @@ class Trainer: _trainer: SequentialTrainer _env_name: str _sim_backend: str - _rlcfg: PPOCfg + _rlcfg: SkrlCfg _enable_render: bool def __init__( @@ -158,7 +188,7 @@ class Trainer: ) -> None: rlcfg = registry.default_rl_cfg(env_name, "skrl", backend="jax") if cfg_override is not None: - rlcfg = rlcfg.replace(**cfg_override) + rlcfg = utils.cfg_override(rlcfg, cfg_override) self._rlcfg = rlcfg self._env_name = env_name self._sim_backend = sim_backend @@ -171,13 +201,16 @@ class Trainer: rlcfg = self._rlcfg env = env_registry.make(self._env_name, sim_backend=self._sim_backend, num_envs=rlcfg.num_envs) - set_seed(rlcfg.seed) + set_seed(rlcfg.runner.seed) skrl_env = wrap_env(env, self._enable_render) models = self._make_model(skrl_env, rlcfg) - ppo_cfg = _get_cfg(rlcfg, skrl_env, log_dir=get_log_dir(self._env_name)) - agent = self._make_agent(models, skrl_env, ppo_cfg) + # Get base configuration from config object + ppo_cfg = rlcfg.runner.agent.to_dict() + # Add runtime-specific configuration + _add_runtime_config(ppo_cfg, skrl_env, log_dir=get_log_dir(self._env_name, rllib="skrl", agent_name="PPO")) + agent = self._make_agent(models, skrl_env, ppo_cfg, rlcfg.runner.memory) cfg_trainer = { - "timesteps": rlcfg.max_batch_env_steps, + "timesteps": rlcfg.runner.trainer.timesteps, "headless": not self._enable_render, } trainer = SequentialTrainer(cfg=cfg_trainer, env=skrl_env, agents=agent) @@ -189,11 +222,14 @@ class Trainer: rlcfg = self._rlcfg env = env_registry.make(self._env_name, sim_backend=self._sim_backend, num_envs=rlcfg.play_num_envs) - set_seed(rlcfg.seed) + set_seed(rlcfg.runner.seed) env = wrap_env(env, self._enable_render) models = self._make_model(env, rlcfg) - ppo_cfg = _get_cfg(rlcfg, env) - agent = self._make_agent(models, env, ppo_cfg) + # Get base configuration from config object + ppo_cfg = rlcfg.runner.agent.to_dict() + # Add runtime-specific configuration + _add_runtime_config(ppo_cfg, env) + agent = self._make_agent(models, env, ppo_cfg, rlcfg.runner.memory) agent.load(policy) obs, _ = env.reset() @@ -208,57 +244,63 @@ class Trainer: if delta_time < 1.0 / fps: time.sleep(1.0 / fps - delta_time) - def _make_model(self, env: Wrapper, rlcfg: PPOCfg) -> dict[str, Model]: - # define models (stochastic and deterministic models) using mixins + def _make_model(self, env: Wrapper, rlcfg: SkrlCfg) -> dict[str, Model]: + _activation_fn = { + "elu": nn.elu, + "relu": nn.relu, + "tanh": nn.tanh, + "sigmoid": nn.sigmoid, + "leaky_relu": nn.leaky_relu, + "selu": nn.selu, + } + + policy_cfg = rlcfg.runner.models.policy + value_cfg = rlcfg.runner.models.value + + def resolve_activations(activation_names: list[str], hiddens: list[int]) -> list: + if len(activation_names) == 1: + return [_activation_fn[activation_names[0]]] * len(hiddens) + if len(activation_names) != len(hiddens): + raise ValueError( + f"hidden_activation length ({len(activation_names)}) must be 1 or " + f"match hiddens length ({len(hiddens)})" + ) + return [_activation_fn[name] for name in activation_names] + + policy_acts = resolve_activations(policy_cfg.hidden_activation, policy_cfg.hiddens) + value_acts = resolve_activations(value_cfg.hidden_activation, value_cfg.hiddens) + class Policy(GaussianMixin, Model): - def __init__( - self, - observation_space, - action_space, - device=None, - clip_actions=False, - clip_log_std=True, - min_log_std=-20, - max_log_std=2, - reduction="sum", - **kwargs, - ): + def __init__(self, observation_space, action_space, device=None, **kwargs): Model.__init__(self, observation_space, action_space, device, **kwargs) GaussianMixin.__init__( self, - clip_actions, - clip_log_std, - min_log_std, - max_log_std, - reduction, + policy_cfg.clip_actions, + policy_cfg.clip_log_std, + policy_cfg.min_log_std, + policy_cfg.max_log_std, + policy_cfg.reduction, ) - @nn.compact # marks the given module method allowing inlined submodules + @nn.compact def __call__(self, inputs, role): x = inputs["states"] - for size in rlcfg.policy_hidden_layer_sizes: - x = nn.elu(nn.Dense(size)(x)) + for size, act in zip(policy_cfg.hiddens, policy_acts): + x = act(nn.Dense(size)(x)) x = nn.Dense(self.num_actions)(x) - log_std = self.param("log_std", lambda _: jnp.ones(self.num_actions)) + log_std = self.param("log_std", lambda _: jnp.full(self.num_actions, float(policy_cfg.initial_log_std))) return x, log_std, {} class Value(DeterministicMixin, Model): - def __init__( - self, - observation_space, - action_space, - device=None, - clip_actions=False, - **kwargs, - ): + def __init__(self, observation_space, action_space, device=None, **kwargs): Model.__init__(self, observation_space, action_space, device, **kwargs) - DeterministicMixin.__init__(self, clip_actions) + DeterministicMixin.__init__(self, value_cfg.clip_actions) - @nn.compact # marks the given module method allowing inlined submodules + @nn.compact def __call__(self, inputs, role): x = inputs["states"] - for size in rlcfg.value_hidden_layer_sizes: - x = nn.elu(nn.Dense(size)(x)) + for size, act in zip(value_cfg.hiddens, value_acts): + x = act(nn.Dense(size)(x)) x = nn.Dense(1)(x) return x, {} @@ -268,21 +310,26 @@ class Trainer: action_space=env.action_space, device=env.device, ) - models["value"] = Value( observation_space=env.observation_space, action_space=env.action_space, device=env.device, ) - # instantiate models' state dict - for role, model in models.items(): model.init_state_dict(role) + return models - def _make_agent(self, models: dict[str, Model], env: Wrapper, ppo_cfg: dict[str, Any]) -> PPO: - memory = RandomMemory(memory_size=ppo_cfg["rollouts"], num_envs=env.num_envs, device=env.device) + def _make_agent( + self, models: dict[str, Model], env: Wrapper, ppo_cfg: dict[str, Any], memory_cfg: SkrlMemoryCfg + ) -> PPO: + # Use memory_size from SkrlMemoryCfg, fall back to rollouts if -1 + memory_size = memory_cfg.memory_size + if memory_size == -1: + memory_size = ppo_cfg["rollouts"] + + memory = _instantiate_memory(memory_cfg, memory_size, env.num_envs, env.device) agent = PPO( models=models, diff --git a/motrix_rl/src/motrix_rl/skrl/torch/train/ppo.py b/motrix_rl/src/motrix_rl/skrl/torch/train/ppo.py index 5710561..d4cb614 100644 --- a/motrix_rl/src/motrix_rl/skrl/torch/train/ppo.py +++ b/motrix_rl/src/motrix_rl/skrl/torch/train/ppo.py @@ -18,9 +18,7 @@ from typing import Any import torch import torch.nn as nn from skrl.agents.torch.ppo import PPO as BasePPO -from skrl.agents.torch.ppo import PPO_DEFAULT_CONFIG from skrl.envs.torch import Wrapper -from skrl.memories.torch import RandomMemory from skrl.models.torch import DeterministicMixin, GaussianMixin, Model from skrl.resources.preprocessors.torch import RunningStandardScaler from skrl.resources.schedulers.torch import KLAdaptiveRL @@ -28,42 +26,69 @@ from skrl.trainers.torch import SequentialTrainer from skrl.utils import set_seed from motrix_envs import registry as env_registry -from motrix_rl import registry +from motrix_rl import registry, utils from motrix_rl.skrl import get_log_dir -from motrix_rl.skrl.cfg import PPOCfg +from motrix_rl.skrl.config import SkrlCfg, SkrlMemoryCfg from motrix_rl.skrl.torch import wrap_env -def _get_cfg( - rlcfg: PPOCfg, +def _instantiate_memory(memory_cfg: SkrlMemoryCfg, memory_size: int, num_envs: int, device) -> Any: + """Instantiate a SKRL Memory class based on configuration. + + Args: + memory_cfg: Memory configuration with class_name and settings + memory_size: Size of the memory buffer + num_envs: Number of parallel environments + device: Device to place memory on + + Returns: + Instantiated SKRL Memory object + + Raises: + ValueError: If class_name is not supported + """ + from skrl.memories.torch import RandomMemory + + # Map class_name to actual Memory class + memory_classes = { + "RandomMemory": RandomMemory, + } + + class_name = memory_cfg.class_name + if class_name not in memory_classes: + raise ValueError(f"Unsupported memory class_name: {class_name}. Supported: {list(memory_classes.keys())}") + + MemoryClass = memory_classes[class_name] + return MemoryClass(memory_size=memory_size, num_envs=num_envs, device=device) + + +def _add_runtime_config( + cfg: dict, env: Wrapper, log_dir: str = None, ) -> dict: - # configure and instantiate the agent (visit its documentation to see all the options) - # https://skrl.readthedocs.io/en/latest/api/agents/ppo.html#configuration-and-hyperparameters - cfg = PPO_DEFAULT_CONFIG.copy() - cfg["rollouts"] = rlcfg.rollouts # memory_size - cfg["learning_epochs"] = rlcfg.learning_epochs - cfg["mini_batches"] = rlcfg.mini_batches # mini_batch_size = rollouts * num_envs / mini_batches - cfg["discount_factor"] = rlcfg.discount_factor - cfg["lambda"] = rlcfg.lambda_param - cfg["learning_rate"] = rlcfg.learning_rate - cfg["learning_rate_scheduler"] = KLAdaptiveRL - cfg["learning_rate_scheduler_kwargs"] = {"kl_threshold": rlcfg.learning_rate_scheduler_kl_threshold} - cfg["random_timesteps"] = rlcfg.random_timesteps - cfg["learning_starts"] = rlcfg.learning_starts - cfg["grad_norm_clip"] = rlcfg.grad_norm_clip - cfg["ratio_clip"] = rlcfg.ratio_clip - cfg["value_clip"] = rlcfg.value_clip - cfg["clip_predicted_values"] = rlcfg.clip_predicted_values - cfg["entropy_loss_scale"] = rlcfg.entropy_loss_scale - cfg["value_loss_scale"] = rlcfg.value_loss_scale - cfg["kl_threshold"] = rlcfg.kl_threshold - if rlcfg.rewards_shaper_scale != 1.0: - cfg["rewards_shaper"] = lambda reward, timestep, timesteps: reward * rlcfg.rewards_shaper_scale + """Add runtime-specific configuration to the base agent config. + + Args: + cfg: Base configuration from agent.to_dict() (will be modified in-place) + env: SKRL environment wrapper + log_dir: Optional logging directory path + + Returns: + The same cfg dict with runtime values added (modified in-place for convenience) + """ + # Convert learning_rate_scheduler from string to actual class (if configured) + if cfg.get("learning_rate_scheduler") == "KLAdaptiveLR": + cfg["learning_rate_scheduler"] = KLAdaptiveRL + # Otherwise keep as-is (None or other scheduler type) + + # Add rewards shaper (conditional based on rewards_shaper_scale in cfg) + if cfg.get("rewards_shaper_scale", 1.0) != 1.0: + cfg["rewards_shaper"] = lambda reward, timestep, timesteps: reward * cfg["rewards_shaper_scale"] else: cfg["rewards_shaper"] = None - cfg["time_limit_bootstrap"] = rlcfg.time_limit_bootstrap + + # Add preprocessors (require runtime env values) cfg["state_preprocessor"] = RunningStandardScaler cfg["state_preprocessor_kwargs"] = { "size": env.observation_space, @@ -71,10 +96,15 @@ def _get_cfg( } cfg["value_preprocessor"] = RunningStandardScaler cfg["value_preprocessor_kwargs"] = {"size": 1, "device": env.device} - # logging to TensorBoard and write checkpoints (in timesteps) + + # Add experiment configuration (handle -1 -> "auto" conversion) if log_dir: - cfg["experiment"]["write_interval"] = rlcfg.check_point_interval - cfg["experiment"]["checkpoint_interval"] = rlcfg.check_point_interval + cfg["experiment"]["write_interval"] = ( + "auto" if cfg["experiment"]["write_interval"] == -1 else cfg["experiment"]["write_interval"] + ) + cfg["experiment"]["checkpoint_interval"] = ( + "auto" if cfg["experiment"]["checkpoint_interval"] == -1 else cfg["experiment"]["checkpoint_interval"] + ) cfg["experiment"]["directory"] = log_dir else: cfg["experiment"]["write_interval"] = 0 @@ -146,7 +176,7 @@ class Trainer: _trainer: SequentialTrainer _env_name: str _sim_backend: str - _rlcfg: PPOCfg + _rlcfg: SkrlCfg _enable_render: bool def __init__( @@ -158,7 +188,7 @@ class Trainer: ) -> None: rlcfg = registry.default_rl_cfg(env_name, "skrl", backend="torch") if cfg_override is not None: - rlcfg = rlcfg.replace(**cfg_override) + rlcfg = utils.cfg_override(rlcfg, cfg_override) self._rlcfg = rlcfg self._env_name = env_name self._sim_backend = sim_backend @@ -170,13 +200,16 @@ class Trainer: """ rlcfg = self._rlcfg env = env_registry.make(self._env_name, sim_backend=self._sim_backend, num_envs=rlcfg.num_envs) - set_seed(rlcfg.seed) + set_seed(rlcfg.runner.seed) skrl_env = wrap_env(env, self._enable_render) models = self._make_model(skrl_env, rlcfg) - ppo_cfg = _get_cfg(rlcfg, skrl_env, log_dir=get_log_dir(self._env_name)) - agent = self._make_agent(models, skrl_env, ppo_cfg) + # Get base configuration from config object + ppo_cfg = rlcfg.runner.agent.to_dict() + # Add runtime-specific configuration + _add_runtime_config(ppo_cfg, skrl_env, log_dir=get_log_dir(self._env_name, rllib="skrl", agent_name="PPO")) + agent = self._make_agent(models, skrl_env, ppo_cfg, rlcfg.runner.memory) cfg_trainer = { - "timesteps": rlcfg.max_batch_env_steps, + "timesteps": rlcfg.runner.trainer.timesteps, "headless": not self._enable_render, } trainer = SequentialTrainer(cfg=cfg_trainer, env=skrl_env, agents=agent) @@ -187,11 +220,14 @@ class Trainer: rlcfg = self._rlcfg env = env_registry.make(self._env_name, sim_backend=self._sim_backend, num_envs=rlcfg.play_num_envs) - set_seed(rlcfg.seed) + set_seed(rlcfg.runner.seed) env = wrap_env(env, self._enable_render) models = self._make_model(env, rlcfg) - ppo_cfg = _get_cfg(rlcfg, env) - agent = self._make_agent(models, env, ppo_cfg) + # Get base configuration from config object + ppo_cfg = rlcfg.runner.agent.to_dict() + # Add runtime-specific configuration + _add_runtime_config(ppo_cfg, env) + agent = self._make_agent(models, env, ppo_cfg, rlcfg.runner.memory) agent.load(policy) with torch.no_grad(): obs, _ = env.reset() @@ -206,143 +242,139 @@ class Trainer: if delta_time < 1.0 / fps: time.sleep(1.0 / fps - delta_time) - def _make_model(self, env: Wrapper, rlcfg: PPOCfg) -> dict[str, Model]: - def build_mlp( - input_size: int, - hidden_sizes: tuple[int, ...], - output_size: int, - activation=nn.ELU, - ): - """Helper function to build MLP layers.""" + def _make_model(self, env: Wrapper, rlcfg: SkrlCfg) -> dict[str, Model]: + _activation_fn = { + "elu": nn.ELU, + "relu": nn.ReLU, + "tanh": nn.Tanh, + "sigmoid": nn.Sigmoid, + "leaky_relu": nn.LeakyReLU, + "selu": nn.SELU, + } + + policy_cfg = rlcfg.runner.models.policy + value_cfg = rlcfg.runner.models.value + separate = rlcfg.runner.models.separate + + def resolve_activations(activation_names: list[str], hiddens: list[int]) -> list: + if len(activation_names) == 1: + return [_activation_fn[activation_names[0]]] * len(hiddens) + if len(activation_names) != len(hiddens): + raise ValueError( + f"hidden_activation length ({len(activation_names)}) must be 1 or " + f"match hiddens length ({len(hiddens)})" + ) + return [_activation_fn[name] for name in activation_names] + + policy_acts = resolve_activations(policy_cfg.hidden_activation, policy_cfg.hiddens) + value_acts = resolve_activations(value_cfg.hidden_activation, value_cfg.hiddens) + + def build_mlp(input_size: int, hidden_sizes: list[int], activations: list) -> nn.Sequential: layers = [] current_size = input_size - - for hidden_size in hidden_sizes: + for hidden_size, act in zip(hidden_sizes, activations): layers.append(nn.Linear(current_size, hidden_size)) - layers.append(activation()) + layers.append(act()) current_size = hidden_size - - layers.append(nn.Linear(current_size, output_size)) return nn.Sequential(*layers) - # define shared model (stochastic and deterministic models) using mixins - class Shared(GaussianMixin, DeterministicMixin, Model): - def __init__( - self, - observation_space, - action_space, - device, - policy_hidden_sizes, - value_hidden_sizes, - share_features=True, - clip_actions=False, - clip_log_std=True, - min_log_std=-20, - max_log_std=2, - reduction="sum", - ): - Model.__init__(self, observation_space, action_space, device) - GaussianMixin.__init__( - self, - clip_actions, - clip_log_std, - min_log_std, - max_log_std, - reduction, - ) - DeterministicMixin.__init__(self, clip_actions) - - # Use configured share_features setting - self.share_features = share_features and policy_hidden_sizes == value_hidden_sizes - - if self.share_features: - # Build shared feature extraction layers - shared_layers = [] - current_size = self.num_observations - - for hidden_size in policy_hidden_sizes: - shared_layers.append(nn.Linear(current_size, hidden_size)) - shared_layers.append(nn.ELU()) - current_size = hidden_size - - self.net = nn.Sequential(*shared_layers) - self.mean_layer = nn.Linear(current_size, self.num_actions) - self.log_std_parameter = nn.Parameter(torch.ones(self.num_actions)) - self.value_layer = nn.Linear(current_size, 1) - else: - # Build separate networks for policy and value - self.policy_net = build_mlp( - self.num_observations, - policy_hidden_sizes[:-1], - policy_hidden_sizes[-1] if len(policy_hidden_sizes) > 0 else self.num_actions, - ) - self.value_net = build_mlp( - self.num_observations, - value_hidden_sizes[:-1], - value_hidden_sizes[-1] if len(value_hidden_sizes) > 0 else 1, - ) - - # Output layers - if len(policy_hidden_sizes) > 0: - self.mean_layer = nn.Linear(policy_hidden_sizes[-1], self.num_actions) - else: - self.mean_layer = nn.Linear(self.num_observations, self.num_actions) - self.log_std_parameter = nn.Parameter(torch.ones(self.num_actions)) - - if len(value_hidden_sizes) > 0: - self.value_layer = nn.Linear(value_hidden_sizes[-1], 1) - else: - self.value_layer = nn.Linear(self.num_observations, 1) - - def act(self, inputs, role): - if role == "policy": - return GaussianMixin.act(self, inputs, role) - elif role == "value": - return DeterministicMixin.act(self, inputs, role) - - def compute(self, inputs, role): - if role == "policy": - if self.share_features: - self._shared_output = self.net(inputs["states"]) - return ( - self.mean_layer(self._shared_output), - self.log_std_parameter, - {}, - ) - else: - policy_features = self.policy_net(inputs["states"]) - return ( - self.mean_layer(policy_features), - self.log_std_parameter, - {}, - ) - elif role == "value": - if self.share_features: - shared_output = ( - self.net(inputs["states"]) if self._shared_output is None else self._shared_output - ) - self._shared_output = None - return self.value_layer(shared_output), {} - else: - value_features = self.value_net(inputs["states"]) - return self.value_layer(value_features), {} - models = {} - models["policy"] = Shared( - observation_space=env.observation_space, - action_space=env.action_space, - device=env.device, - policy_hidden_sizes=rlcfg.policy_hidden_layer_sizes, - value_hidden_sizes=rlcfg.value_hidden_layer_sizes, - share_features=rlcfg.share_policy_value_features, - ) - models["value"] = models["policy"] + if separate: + + class Policy(GaussianMixin, Model): + def __init__(self, observation_space, action_space, device, **kwargs): + Model.__init__(self, observation_space, action_space, device, **kwargs) + GaussianMixin.__init__( + self, + policy_cfg.clip_actions, + policy_cfg.clip_log_std, + policy_cfg.min_log_std, + policy_cfg.max_log_std, + policy_cfg.reduction, + ) + self.net = build_mlp(self.num_observations, policy_cfg.hiddens, policy_acts) + self.mean_layer = nn.Linear(policy_cfg.hiddens[-1], self.num_actions) + self.log_std_parameter = nn.Parameter(torch.full((self.num_actions,), policy_cfg.initial_log_std)) + + def compute(self, inputs, role): + x = self.net(inputs["states"]) + return self.mean_layer(x), self.log_std_parameter, {} + + class Value(DeterministicMixin, Model): + def __init__(self, observation_space, action_space, device, **kwargs): + Model.__init__(self, observation_space, action_space, device, **kwargs) + DeterministicMixin.__init__(self, value_cfg.clip_actions) + self.net = build_mlp(self.num_observations, value_cfg.hiddens, value_acts) + self.value_layer = nn.Linear(value_cfg.hiddens[-1], 1) + + def compute(self, inputs, role): + x = self.net(inputs["states"]) + return self.value_layer(x), {} + + models["policy"] = Policy( + observation_space=env.observation_space, + action_space=env.action_space, + device=env.device, + ) + models["value"] = Value( + observation_space=env.observation_space, + action_space=env.action_space, + device=env.device, + ) + else: + + class Shared(GaussianMixin, DeterministicMixin, Model): + def __init__(self, observation_space, action_space, device, **kwargs): + Model.__init__(self, observation_space, action_space, device, **kwargs) + GaussianMixin.__init__( + self, + policy_cfg.clip_actions, + policy_cfg.clip_log_std, + policy_cfg.min_log_std, + policy_cfg.max_log_std, + policy_cfg.reduction, + ) + DeterministicMixin.__init__(self, value_cfg.clip_actions) + self.net = build_mlp(self.num_observations, policy_cfg.hiddens, policy_acts) + self.mean_layer = nn.Linear(policy_cfg.hiddens[-1], self.num_actions) + self.log_std_parameter = nn.Parameter(torch.full((self.num_actions,), policy_cfg.initial_log_std)) + self.value_layer = nn.Linear(policy_cfg.hiddens[-1], 1) + self._shared_output = None + + def act(self, inputs, role): + if role == "policy": + return GaussianMixin.act(self, inputs, role) + elif role == "value": + return DeterministicMixin.act(self, inputs, role) + + def compute(self, inputs, role): + if role == "policy": + self._shared_output = self.net(inputs["states"]) + return self.mean_layer(self._shared_output), self.log_std_parameter, {} + elif role == "value": + shared = self._shared_output if self._shared_output is not None else self.net(inputs["states"]) + self._shared_output = None + return self.value_layer(shared), {} + + models["policy"] = Shared( + observation_space=env.observation_space, + action_space=env.action_space, + device=env.device, + ) + models["value"] = models["policy"] return models - def _make_agent(self, models: dict[str, Model], env: Wrapper, ppo_cfg: dict[str, Any]) -> PPO: - memory = RandomMemory(memory_size=ppo_cfg["rollouts"], num_envs=env.num_envs, device=env.device) + def _make_agent( + self, models: dict[str, Model], env: Wrapper, ppo_cfg: dict[str, Any], memory_cfg: SkrlMemoryCfg + ) -> PPO: + # Use memory_size from SkrlMemoryCfg, fall back to rollouts if -1 + memory_size = memory_cfg.memory_size + if memory_size == -1: + memory_size = ppo_cfg["rollouts"] + + memory = _instantiate_memory(memory_cfg, memory_size, env.num_envs, env.device) agent = PPO( models=models, diff --git a/motrix_rl/src/motrix_rl/tasks/__init__.py b/motrix_rl/src/motrix_rl/tasks/__init__.py new file mode 100644 index 0000000..88e4bd8 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/__init__.py @@ -0,0 +1,38 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from . import ( + acrobot, # noqa: F401 + anymal_navigation, # noqa: F401 + bounce_ball, # noqa: F401 + cartpole, # noqa: F401 + dm_cheetah, # noqa: F401 + dm_finger, # noqa: F401 + dm_hopper, # noqa: F401 + dm_humanoid, # noqa: F401 + dm_lqr, # noqa: F401 + dm_manipulator, # noqa: F401 + dm_quadruped, # noqa: F401 + dm_reacher, # noqa: F401 + dm_walker, # noqa: F401 + franka_lift_cube, # noqa: F401 + franka_open_cabinet, # noqa: F401 + go1, # noqa: F401 + go2, # noqa: F401 + pendulum, # noqa: F401 + point_mass, # noqa: F401 + rm65_open_cabinet, # noqa: F401 + shadow_hand_repose, # noqa: F401 +) diff --git a/motrix_rl/src/motrix_rl/tasks/acrobot.py b/motrix_rl/src/motrix_rl/tasks/acrobot.py new file mode 100644 index 0000000..7eb40f6 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/acrobot.py @@ -0,0 +1,123 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +# -- docs-tag-start: acrobot-train-cfg -- +@rlcfg("acrobot", backend="jax") +@dataclass +class AcrobotSkrlPpo(SkrlCfg): + """Acrobot SKRL configuration with nested structure. + + Configuration overrides: + - Network architecture: 32x32 hidden layers for both policy and value + - PPO parameters: 64 rollouts, 5 learning epochs, 8 mini-batches + - Training: 60M timesteps + """ + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + + # Configure model architectures + runner.models.policy.hiddens = [32, 32] + runner.models.value.hiddens = [32, 32] + + # Configure PPO agent parameters + agent = runner.agent + agent.rollouts = 64 + agent.learning_epochs = 5 + agent.mini_batches = 8 + agent.learning_rate = 3e-4 + agent.grad_norm_clip = 0.1 + agent.entropy_loss_scale = 0.1 + agent.discount_factor = 0.995 + agent.lam = 0.97 + agent.ratio_clip = 0.2 + agent.value_loss_scale = 0.5 + agent.value_clip = 10.0 + agent.clip_predicted_values = False + agent.learning_rate_scheduler_kwargs = {"kl_threshold": 0.02} + agent.kl_threshold = 0.03 + + # Configure training parameters + runner.trainer.timesteps = 29000 + + +# -- docs-tag-end: acrobot-train-cfg -- + + +@rlcfg("acrobot", backend="torch") +@dataclass +class AcrobotSkrlPpoTorch(SkrlCfg): + """Acrobot SKRL Torch configuration with nested structure. + + Configuration overrides: + - Network architecture: 32x32 hidden layers for both policy and value + - PPO parameters: 64 rollouts, 5 learning epochs, 8 mini-batches + - Training: 60M timesteps + - Torch-specific: entropy_loss_scale=0.2 (vs 0.1 for JAX) + """ + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + + # Configure model architectures + runner.models.policy.hiddens = [32, 32] + runner.models.value.hiddens = [32, 32] + + # Configure PPO agent parameters + agent = runner.agent + agent.rollouts = 64 + agent.learning_epochs = 5 + agent.mini_batches = 8 + agent.learning_rate = 3e-4 + agent.grad_norm_clip = 0.1 + agent.entropy_loss_scale = 0.2 # Torch-specific: higher than JAX (0.1) + agent.discount_factor = 0.995 + agent.lam = 0.97 + agent.ratio_clip = 0.2 + agent.value_loss_scale = 0.5 + agent.value_clip = 10.0 + agent.clip_predicted_values = False + agent.learning_rate_scheduler_kwargs = {"kl_threshold": 0.02} + agent.kl_threshold = 0.03 + + # Configure training parameters + runner.trainer.timesteps = 29000 + + +@rlcfg("acrobot") +@dataclass +class AcrobotRslrlPpo(RslrlCfg): + """Acrobot RSLRL configuration.""" + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + runner.seed = 42 + runner.max_iterations = 900 + runner.num_steps_per_env = 32 + runner.experiment_name = "acrobot" + runner.actor.hidden_dims = [32, 32] + runner.critic.hidden_dims = [32, 32] + algo.learning_rate = 1e-4 + algo.entropy_coef = 0.005 diff --git a/motrix_rl/src/motrix_rl/tasks/anymal_navigation.py b/motrix_rl/src/motrix_rl/tasks/anymal_navigation.py new file mode 100644 index 0000000..d443fe1 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/anymal_navigation.py @@ -0,0 +1,95 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +class skrl: + @rlcfg("anymal_c_navigation_flat") + @dataclass + class AnymalCPPO(SkrlCfg): + """Anymal C Navigation SKRL PPO configuration. + + Configuration for training ANYmal C robot for flat terrain navigation. + Uses medium-sized network suitable for most locomotion tasks. + """ + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + self.num_envs = 2048 + self.play_num_envs = 16 + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # ===== Basic Training Parameters ===== + runner.seed = 42 + + # ===== Network Architecture ===== + # Medium-sized network (default configuration, suitable for most tasks) + models.policy.hiddens = [256, 128, 64] + models.value.hiddens = [256, 128, 64] + + # ===== PPO Core Parameters ===== + agent.rollouts = 48 + agent.learning_epochs = 6 + agent.mini_batches = 32 + agent.learning_rate = 3e-4 + agent.discount_factor = 0.99 + agent.lam = 0.95 + agent.grad_norm_clip = 1.0 + + # ===== PPO Clipping Parameters ===== + agent.ratio_clip = 0.2 + agent.value_clip = 0.2 + agent.clip_predicted_values = True + + # ===== Training Parameters ===== + trainer.timesteps = 48000 + + +class rslrl: + @rlcfg("anymal_c_navigation_flat") + @dataclass + class AnymalCPpoRslrl(RslrlCfg): + """Anymal C Navigation RSLRL PPO configuration.""" + + def __post_init__(self): + """Configure RSLRL runner and algorithm settings.""" + self.num_envs = 2048 + self.play_num_envs = 16 + runner = self.runner + algo = runner.algorithm + + # ===== Basic Training Parameters ===== + runner.seed = 42 + # max_iterations = max_env_steps / num_envs / roll_out = 100000000 / 2048 / 48 ≈ 1017 + runner.max_iterations = 1017 + runner.num_steps_per_env = 48 + runner.experiment_name = "anymal_c_navigation_flat" + + # ===== Network Architecture ===== + runner.actor.hidden_dims = [256, 128, 64] + runner.critic.hidden_dims = [256, 128, 64] + + # ===== Algorithm Parameters ===== + algo.learning_rate = 3e-4 + algo.num_learning_epochs = 6 + algo.num_mini_batches = 4 diff --git a/motrix_rl/src/motrix_rl/tasks/bounce_ball.py b/motrix_rl/src/motrix_rl/tasks/bounce_ball.py new file mode 100644 index 0000000..704ef42 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/bounce_ball.py @@ -0,0 +1,66 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +@rlcfg("bounce_ball") +@dataclass +class BounceBallSkrlPpo(SkrlCfg): + """BounceBall SKRL configuration with nested structure.""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + runner.seed = 42 + + # Configure model architectures + runner.models.policy.hiddens = [64, 64, 64] + runner.models.value.hiddens = [64, 64, 64] + + # Configure PPO agent parameters + agent = runner.agent + agent.rollouts = 128 + agent.learning_epochs = 15 + agent.mini_batches = 16 + agent.learning_rate = 2e-4 + + # Configure training parameters + # trainer.timesteps = max_env_steps / num_envs + runner.trainer.timesteps = 45000 + + +@rlcfg("bounce_ball") +@dataclass +class BounceBallRslrlPpo(RslrlCfg): + """BounceBall RSLRL configuration.""" + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + runner.seed = 42 + runner.max_iterations = 400 + runner.num_steps_per_env = 128 + runner.experiment_name = "bounce_ball" + runner.actor.hidden_dims = [64, 64, 64] + runner.critic.hidden_dims = [64, 64, 64] + algo.learning_rate = 1e-3 + algo.entropy_coef = 0.005 + algo.num_learning_epochs = 2 + algo.num_mini_batches = 4 diff --git a/motrix_rl/src/motrix_rl/tasks/cartpole.py b/motrix_rl/src/motrix_rl/tasks/cartpole.py new file mode 100644 index 0000000..d183e7a --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/cartpole.py @@ -0,0 +1,189 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import ( + RslrlCfg, +) +from motrix_rl.skrl.config import ( + SkrlCfg, +) + + +# docs-start: cartpole-skrl-config +@rlcfg("cartpole") +@dataclass +class CartPoleSkrlPpo(SkrlCfg): + """CartPole SKRL configuration with complete explicit parameter filling. + + All parameters from parent classes are explicitly specified. + """ + + def __post_init__(self): + """Configure SKRL runner settings with explicit parameters.""" + # Environment settings + self.num_envs = 2048 # Number of parallel environments during training + self.play_num_envs = 16 # Number of parallel environments during evaluation + + # Get runner and nested configs + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # Random seed + runner.seed = 42 # Random seed for reproducibility + + # Models configuration + models.separate = False # Share features between policy and value networks + + # Policy network configuration + models.policy.class_name = "GaussianMixin" # Use Gaussian policy for continuous actions + models.policy.clip_actions = False # Don't clip actions to action space + models.policy.clip_log_std = True # Clip log standard deviation + models.policy.initial_log_std = 1.0 # Initial log standard deviation + models.policy.min_log_std = -20.0 # Minimum log standard deviation + models.policy.max_log_std = 2.0 # Maximum log standard deviation + models.policy.reduction = "sum" # Reduction method for loss computation + models.policy.input = "STATES" # Input to policy network + models.policy.hiddens = [32, 32] # Hidden layer sizes (small network for simple task) + models.policy.hidden_activation = ["elu"] # Activation function for hidden layers + models.policy.output = "ACTIONS" # Output of policy network + models.policy.output_activation = "" # No activation for output layer + models.policy.output_scale = 1.0 # Scale factor for output + + # Value network configuration + models.value.class_name = "DeterministicMixin" # Use deterministic value function + models.value.clip_actions = False # Don't clip actions + models.value.input = "STATES" # Input to value network + models.value.hiddens = [32, 32] # Hidden layer sizes (small network for simple task) + models.value.hidden_activation = ["elu"] # Activation function for hidden layers + models.value.output = "ONE" # Output single value + models.value.output_activation = "" # No activation for output layer + models.value.output_scale = 1.0 # Scale factor for output + + # Memory configuration + runner.memory.class_name = "RandomMemory" # Use random sampling memory + runner.memory.memory_size = -1 # Unlimited memory size (-1 means auto-calculate) + + # Agent configuration + agent.class_name = "PPO" # Use Proximal Policy Optimization algorithm + agent.rollouts = 32 # Number of experience rollouts to collect + agent.learning_epochs = 5 # Number of learning epochs per update (higher than default 2) + agent.mini_batches = 4 # Number of mini-batches (fewer than default 32 for simple task) + agent.discount_factor = 0.99 # Discount factor (gamma) for future rewards + agent.lam = 0.95 # GAE (Generalized Advantage Estimation) lambda parameter + agent.learning_rate = 1e-3 # Learning rate for optimizer + agent.learning_rate_scheduler = "KLAdaptiveLR" # Use KL-divergence adaptive learning rate + agent.learning_rate_scheduler_kwargs = {"kl_threshold": 0.008} # KL threshold for adaptive LR + agent.random_timesteps = 0 # Number of random timesteps before using policy + agent.learning_starts = 0 # Timesteps before learning starts + agent.grad_norm_clip = 1.0 # Maximum gradient norm for clipping + agent.ratio_clip = 0.2 # PPO clipping ratio for policy update + agent.value_clip = 0.2 # Clipping parameter for value function loss + agent.clip_predicted_values = True # Clip predicted values in value loss + agent.entropy_loss_scale = 0.0 # Coefficient for entropy loss (disabled) + agent.value_loss_scale = 2.0 # Coefficient for value function loss + agent.kl_threshold = 0 # KL divergence threshold (0 means disabled) + agent.rewards_shaper_scale = 1.0 # Scale factor for reward shaping + agent.time_limit_bootstrap = True # Use bootstrapping for time-limited episodes + + # Experiment configuration + agent.experiment.directory = "runs" # Directory to save experiment results + agent.experiment.experiment_name = "" # Experiment name (empty means auto-generated) + agent.experiment.write_interval = -1 # TensorBoard write interval (-1 means default) + agent.experiment.checkpoint_interval = -1 # Checkpoint save interval (-1 means default) + + # Trainer configuration + trainer.class_name = "SequentialTrainer" # Use sequential trainer + trainer.timesteps = 5000 # Total training timesteps (sufficient for CartPole) + + +# docs-end: cartpole-skrl-config + + +# docs-start: cartpole-rslrl-config +@rlcfg("cartpole") +@dataclass +class CartPoleRslrlPpo(RslrlCfg): + """CartPole RSLRL configuration with complete explicit parameter filling. + + All parameters from parent classes are explicitly specified. + """ + + def __post_init__(self): + """Configure RSLRL runner settings with explicit parameters.""" + # Environment settings + self.num_envs = 2048 # Number of parallel environments during training + self.play_num_envs = 16 # Number of parallel environments during evaluation + + # Get runner and nested configs + runner = self.runner + actor = runner.actor + critic = runner.critic + algo = runner.algorithm + + # Runner settings + runner.class_name = "OnPolicyRunner" # Use on-policy runner + runner.seed = 42 # Random seed for reproducibility + runner.device = "cuda:0" # Device to use for training + runner.num_steps_per_env = 16 # Number of steps to collect per environment + runner.max_iterations = 300 # Total number of training iterations + runner.save_interval = 50 # Checkpoint save interval + runner.experiment_name = "cartpole" # Experiment name for logging + runner.run_name = "" # Run name (empty means auto-generated) + runner.logger = "tensorboard" # Logger type + runner.obs_groups = {"actor": ["policy"], "critic": ["policy"]} # Observation groups + + # Actor network configuration + actor.class_name = "MLPModel" # Use MLP model + actor.hidden_dims = [32, 32] # Hidden layer sizes (small network for simple task) + actor.activation = "elu" # Activation function for hidden layers + actor.obs_normalization = True # Normalize observations + actor.stochastic = True # Use stochastic policy + actor.init_noise_std = 1.0 # Initial noise standard deviation + actor.noise_std_type = "scalar" # Noise std type (scalar or log) + actor.state_dependent_std = False # Use state-dependent std + + # Critic network configuration + critic.class_name = "MLPModel" # Use MLP model + critic.hidden_dims = [32, 32] # Hidden layer sizes (small network for simple task) + critic.activation = "elu" # Activation function for hidden layers + critic.obs_normalization = True # Normalize observations + critic.stochastic = False # Use deterministic value function + + # PPO algorithm configuration + algo.class_name = "PPO" # Use PPO algorithm + algo.optimizer = "adam" # Optimizer type + algo.learning_rate = 5.0e-4 # Learning rate for optimizer + algo.num_learning_epochs = 2 # Number of learning epochs per iteration + algo.num_mini_batches = 4 # Number of mini-batches for optimization + algo.schedule = "adaptive" # Learning rate schedule + algo.value_loss_coef = 1.0 # Value loss coefficient + algo.clip_param = 0.2 # PPO clipping parameter + algo.use_clipped_value_loss = True # Use clipped value loss + algo.desired_kl = 0.008 # Desired KL divergence for adaptive learning + algo.entropy_coef = 5e-3 # Entropy coefficient for exploration + algo.gamma = 0.99 # Discount factor + algo.lam = 0.95 # GAE lambda parameter + algo.max_grad_norm = 1.0 # Maximum gradient norm for clipping + algo.normalize_advantage_per_mini_batch = False # Normalize advantage per mini-batch + algo.rnd_cfg = None # RND configuration (disabled) + algo.symmetry_cfg = None # Symmetry configuration (disabled) + + +# docs-end: cartpole-rslrl-config diff --git a/motrix_rl/src/motrix_rl/tasks/dm_cheetah.py b/motrix_rl/src/motrix_rl/tasks/dm_cheetah.py new file mode 100644 index 0000000..6160397 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/dm_cheetah.py @@ -0,0 +1,65 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +@rlcfg("dm-cheetah") +@dataclass +class CheetahSkrlPpo(SkrlCfg): + """Cheetah SKRL configuration with nested structure.""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # Configure model architectures + models.policy.hiddens = [256, 128, 64] + models.value.hiddens = [256, 128, 64] + + # Configure PPO agent parameters + agent.rollouts = 24 + agent.learning_epochs = 4 + agent.mini_batches = 32 + agent.learning_rate = 2e-4 + + # Configure training parameters + trainer.timesteps = 20000 + + +@rlcfg("dm-cheetah") +@dataclass +class CheetahRslrlPpo(RslrlCfg): + """Cheetah RSLRL configuration.""" + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + runner.seed = 42 + runner.max_iterations = 900 + runner.num_steps_per_env = 24 + runner.experiment_name = "dm_cheetah" + runner.actor.hidden_dims = [256, 128, 64] + runner.critic.hidden_dims = [256, 128, 64] + algo.learning_rate = 2e-4 + algo.num_learning_epochs = 4 + algo.num_mini_batches = 32 diff --git a/motrix_rl/src/motrix_rl/tasks/dm_finger.py b/motrix_rl/src/motrix_rl/tasks/dm_finger.py new file mode 100644 index 0000000..d426159 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/dm_finger.py @@ -0,0 +1,120 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +@rlcfg("dm-finger-spin") +@rlcfg("dm-finger-turn-easy") +@rlcfg("dm-finger-turn-hard") +@dataclass +class FingerSkrlPpo(SkrlCfg): + """Finger SKRL configuration with nested structure.""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + agent = runner.agent + trainer = runner.trainer + + # Configure PPO agent parameters + agent.rollouts = 24 + agent.learning_epochs = 4 + agent.mini_batches = 4 + agent.learning_rate = 2e-4 + + # Configure training parameters + trainer.timesteps = 20000 + + +# @rlcfg("dm-finger-spin", backend="jax") +# @dataclass +# class FingerSpinSkrlPpoJax(SkrlCfg): +# """Finger Spin SKRL configuration for JAX backend. + +# More conservative PPO for stability (spin can collapse mid-training in JAX). +# """ + +# def __post_init__(self): +# """Configure nested SKRL runner settings.""" +# runner = self.runner +# agent = runner.agent +# trainer = runner.trainer + +# # Configure PPO agent parameters (conservative for stability) +# agent.rollouts = 24 +# agent.learning_epochs = 1 +# agent.mini_batches = 16 +# agent.learning_rate = 7.5e-5 +# agent.ratio_clip = 0.08 +# agent.value_clip = 0.1 +# agent.value_loss_scale = 0.5 +# agent.grad_norm_clip = 0.25 +# agent.entropy_loss_scale = 5e-4 +# agent.learning_rate_scheduler_kwargs = {"kl_threshold": 0.003} + +# # Configure training parameters +# trainer.timesteps = 20000 + + +# @rlcfg("dm-finger-turn-hard", backend="jax") +# @dataclass +# class FingerTurnHardSkrlPpoJax(SkrlCfg): +# """Finger Turn Hard SKRL configuration for JAX backend. + +# Extra conservative to avoid late-stage collapses. +# """ + +# def __post_init__(self): +# """Configure nested SKRL runner settings.""" +# runner = self.runner +# agent = runner.agent +# trainer = runner.trainer + +# # Configure PPO agent parameters (extra conservative) +# agent.rollouts = 24 +# agent.learning_epochs = 1 +# agent.mini_batches = 16 +# agent.learning_rate = 5e-5 +# agent.ratio_clip = 0.08 +# agent.value_loss_scale = 0.5 +# agent.grad_norm_clip = 0.25 +# agent.learning_rate_scheduler_kwargs = {"kl_threshold": 0.004} + +# # Configure training parameters +# trainer.timesteps = 20000 + + +@rlcfg("dm-finger-spin") +@rlcfg("dm-finger-turn-easy") +@rlcfg("dm-finger-turn-hard") +@dataclass +class FingerRslrlPpo(RslrlCfg): + """Finger RSLRL configuration.""" + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + runner.seed = 42 + runner.max_iterations = 500 + runner.num_steps_per_env = 24 + runner.experiment_name = "dm_finger" + algo.learning_rate = 2e-4 + algo.num_learning_epochs = 4 + algo.num_mini_batches = 4 diff --git a/motrix_rl/src/motrix_rl/tasks/dm_hopper.py b/motrix_rl/src/motrix_rl/tasks/dm_hopper.py new file mode 100644 index 0000000..08b3328 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/dm_hopper.py @@ -0,0 +1,117 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +@rlcfg("dm-hopper-stand", backend="jax") +@dataclass +class HopperStandSkrlJaxPpo(SkrlCfg): + """Hopper Stand SKRL JAX configuration with nested structure.""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # Configure model architectures + models.policy.hiddens = [32, 32, 32] + models.value.hiddens = [32, 32, 32] + + # Configure PPO agent parameters + agent.rollouts = 24 + agent.learning_epochs = 4 + agent.mini_batches = 4 + agent.learning_rate = 2e-4 + + # Configure training parameters + trainer.timesteps = 20000 + + +@rlcfg("dm-hopper-stand", backend="torch") +@rlcfg("dm-hopper-hop", backend="torch") +@rlcfg("dm-hopper-hop", backend="jax") +@dataclass +class HopperSkrlTorchPpo(SkrlCfg): + """Hopper SKRL Torch configuration (shared for stand and hop tasks).""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # Configure model architectures + models.policy.hiddens = [32, 32, 32] + models.value.hiddens = [32, 32, 32] + + # Configure PPO agent parameters + agent.rollouts = 24 + agent.learning_epochs = 5 + agent.mini_batches = 32 + agent.learning_rate = 2e-4 + + # Configure training parameters + trainer.timesteps = 20000 + + +# ============================================================================== +# RSLRL Configurations +# ============================================================================== + + +@rlcfg("dm-hopper-stand") +@dataclass +class HopperStandRslrlPpo(RslrlCfg): + """Hopper Stand RSLRL configuration.""" + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + runner.seed = 42 + runner.max_iterations = 833 + runner.num_steps_per_env = 24 + runner.experiment_name = "dm_hopper_stand" + runner.actor.hidden_dims = [32, 32, 32] + runner.critic.hidden_dims = [32, 32, 32] + algo.learning_rate = 2e-4 + algo.num_learning_epochs = 4 + algo.num_mini_batches = 4 + + +@rlcfg("dm-hopper-hop") +@dataclass +class HopperHopRslrlPpo(RslrlCfg): + """Hopper Hop RSLRL configuration.""" + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + runner.seed = 42 + runner.max_iterations = 833 + runner.num_steps_per_env = 24 + runner.experiment_name = "dm_hopper_hop" + runner.actor.hidden_dims = [32, 32, 32] + runner.critic.hidden_dims = [32, 32, 32] + algo.learning_rate = 2e-4 + algo.num_learning_epochs = 5 + algo.num_mini_batches = 32 diff --git a/motrix_rl/src/motrix_rl/tasks/dm_humanoid.py b/motrix_rl/src/motrix_rl/tasks/dm_humanoid.py new file mode 100644 index 0000000..e5d1308 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/dm_humanoid.py @@ -0,0 +1,98 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +@rlcfg("dm-humanoid-stand", backend="jax") +@rlcfg("dm-humanoid-walk", backend="jax") +@rlcfg("dm-humanoid-run", backend="jax") +@dataclass +class HumanoidSkrlPpo(SkrlCfg): + """Humanoid SKRL configuration with nested structure (JAX).""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # Configure model architectures + models.policy.hiddens = [512, 256, 128] + models.value.hiddens = [512, 256, 128] + + # Configure PPO agent parameters + agent.rollouts = 24 + agent.learning_epochs = 8 + agent.mini_batches = 2 + agent.learning_rate = 3e-4 + + # Configure training parameters + trainer.timesteps = 20000 + + +@rlcfg("dm-humanoid-stand", backend="torch") +@rlcfg("dm-humanoid-walk", backend="torch") +@rlcfg("dm-humanoid-run", backend="torch") +@dataclass +class HumanoidSkrlPpoTorch(SkrlCfg): + """Humanoid SKRL configuration with nested structure (PyTorch).""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # Configure model architectures + models.policy.hiddens = [512, 256, 128] + models.value.hiddens = [512, 256, 128] + + # Configure PPO agent parameters + agent.rollouts = 24 + agent.learning_epochs = 8 + agent.mini_batches = 2 + agent.learning_rate = 3e-4 + + # Configure training parameters + trainer.timesteps = 20000 + + +@rlcfg("dm-humanoid-stand") +@rlcfg("dm-humanoid-walk") +@rlcfg("dm-humanoid-run") +@dataclass +class HumanoidRslrlPpo(RslrlCfg): + """Humanoid RSLRL configuration.""" + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + runner.seed = 42 + runner.max_iterations = 400 + runner.num_steps_per_env = 64 + runner.experiment_name = "dm_humanoid" + runner.actor.hidden_dims = [512, 256, 128] + runner.critic.hidden_dims = [512, 256, 128] + algo.learning_rate = 3e-4 + algo.num_learning_epochs = 5 + algo.num_mini_batches = 4 + algo.entropy_coef = 0.001 diff --git a/motrix_rl/src/motrix_rl/tasks/dm_lqr.py b/motrix_rl/src/motrix_rl/tasks/dm_lqr.py new file mode 100644 index 0000000..acb19b0 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/dm_lqr.py @@ -0,0 +1,182 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +@rlcfg("dm-lqr-2-1", backend="jax") +@dataclass +class Lqr21SkrlJaxPpo(SkrlCfg): + def __post_init__(self): + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + models.policy.hiddens = [128, 128, 64] + models.value.hiddens = [128, 128, 64] + + agent.rollouts = 64 + agent.learning_epochs = 8 + agent.mini_batches = 8 + agent.learning_rate = 1.5e-4 + agent.discount_factor = 0.995 + agent.lam = 0.97 + agent.grad_norm_clip = 0.5 + agent.ratio_clip = 0.12 + agent.value_clip = 0.1 + agent.value_loss_scale = 1.0 + agent.entropy_loss_scale = 1e-3 + agent.learning_rate_scheduler_kwargs = {"kl_threshold": 0.01} + + trainer.timesteps = 2500 + + +@rlcfg("dm-lqr-2-1", backend="torch") +@dataclass +class Lqr21SkrlTorchPpo(SkrlCfg): + def __post_init__(self): + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + models.policy.hiddens = [128, 128, 64] + models.value.hiddens = [128, 128, 64] + + agent.rollouts = 64 + agent.learning_epochs = 8 + agent.mini_batches = 8 + agent.learning_rate = 1.5e-4 + agent.discount_factor = 0.995 + agent.lam = 0.97 + agent.grad_norm_clip = 0.5 + agent.ratio_clip = 0.12 + agent.value_clip = 0.1 + agent.value_loss_scale = 1.0 + agent.entropy_loss_scale = 1e-3 + agent.learning_rate_scheduler_kwargs = {"kl_threshold": 0.01} + + trainer.timesteps = 2500 + + +@rlcfg("dm-lqr-6-2", backend="jax") +@dataclass +class Lqr62SkrlJaxPpo(SkrlCfg): + def __post_init__(self): + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + models.policy.hiddens = [256, 128, 64] + models.value.hiddens = [256, 128, 64] + + agent.rollouts = 96 + agent.learning_epochs = 8 + agent.mini_batches = 16 + agent.learning_rate = 1.0e-4 + agent.discount_factor = 0.995 + agent.lam = 0.97 + agent.grad_norm_clip = 0.5 + agent.ratio_clip = 0.12 + agent.value_clip = 0.1 + agent.value_loss_scale = 1.0 + agent.entropy_loss_scale = 1e-3 + agent.learning_rate_scheduler_kwargs = {"kl_threshold": 0.01} + + trainer.timesteps = 20000 + + +@rlcfg("dm-lqr-6-2", backend="torch") +@dataclass +class Lqr62SkrlTorchPpo(SkrlCfg): + def __post_init__(self): + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + models.policy.hiddens = [256, 128, 64] + models.value.hiddens = [256, 128, 64] + + agent.rollouts = 96 + agent.learning_epochs = 8 + agent.mini_batches = 16 + agent.learning_rate = 1.0e-4 + agent.discount_factor = 0.995 + agent.lam = 0.97 + agent.grad_norm_clip = 0.5 + agent.ratio_clip = 0.12 + agent.value_clip = 0.1 + agent.value_loss_scale = 1.0 + agent.entropy_loss_scale = 1e-3 + agent.learning_rate_scheduler_kwargs = {"kl_threshold": 0.01} + + trainer.timesteps = 20000 + + +@rlcfg("dm-lqr-2-1") +@dataclass +class Lqr21RslrlPpo(RslrlCfg): + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + + runner.seed = 42 + runner.max_iterations = 1500 + runner.num_steps_per_env = 64 + runner.experiment_name = "dm_lqr_2_1" + runner.actor.hidden_dims = [128, 128, 64] + runner.critic.hidden_dims = [128, 128, 64] + + algo.learning_rate = 1.5e-4 + algo.num_learning_epochs = 8 + algo.num_mini_batches = 8 + algo.gamma = 0.995 + algo.lam = 0.97 + algo.clip_param = 0.12 + algo.desired_kl = 0.01 + algo.entropy_coef = 1e-3 + algo.max_grad_norm = 0.5 + + +@rlcfg("dm-lqr-6-2") +@dataclass +class Lqr62RslrlPpo(RslrlCfg): + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + + runner.seed = 42 + runner.max_iterations = 2000 + runner.num_steps_per_env = 96 + runner.experiment_name = "dm_lqr_6_2" + runner.actor.hidden_dims = [256, 128, 64] + runner.critic.hidden_dims = [256, 128, 64] + + algo.learning_rate = 1.0e-4 + algo.num_learning_epochs = 8 + algo.num_mini_batches = 16 + algo.gamma = 0.995 + algo.lam = 0.97 + algo.clip_param = 0.12 + algo.desired_kl = 0.01 + algo.entropy_coef = 1e-3 + algo.max_grad_norm = 0.5 diff --git a/motrix_rl/src/motrix_rl/tasks/dm_manipulator.py b/motrix_rl/src/motrix_rl/tasks/dm_manipulator.py new file mode 100644 index 0000000..f83a700 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/dm_manipulator.py @@ -0,0 +1,94 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +@rlcfg("dm-manipulator-bring-ball", backend="jax") +@dataclass +class ManipulatorSkrlPpoJax(SkrlCfg): + """Manipulator SKRL configuration with nested structure (JAX).""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # Configure model architectures + models.policy.hiddens = [256, 128, 64] + models.value.hiddens = [256, 128, 64] + + # Configure PPO agent parameters + agent.rollouts = 24 + agent.learning_epochs = 4 + agent.mini_batches = 4 + agent.learning_rate = 3e-4 + agent.ratio_clip = 0.2 + agent.entropy_loss_scale = 1e-3 + agent.grad_norm_clip = 1.0 + + # Configure training parameters + trainer.timesteps = 20000 + + +@rlcfg("dm-manipulator-bring-ball", backend="torch") +@dataclass +class ManipulatorSkrlPpoTorch(SkrlCfg): + """Manipulator SKRL configuration with nested structure (PyTorch).""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # Configure model architectures (PyTorch - different network) + models.policy.hiddens = [256, 256] + models.value.hiddens = [256, 256] + + # Configure PPO agent parameters + agent.rollouts = 24 + agent.learning_epochs = 4 + agent.mini_batches = 4 + agent.learning_rate = 2e-4 + + # Configure training parameters + trainer.timesteps = 20000 + + +@rlcfg("dm-manipulator-bring-ball") +@dataclass +class ManipulatorRslrlPpo(RslrlCfg): + """Manipulator RSLRL configuration""" + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + runner.seed = 42 + runner.max_iterations = 500 + runner.num_steps_per_env = 24 + runner.experiment_name = "dm_manipulator" + runner.actor.hidden_dims = [256, 128, 64] + runner.critic.hidden_dims = [256, 128, 64] + algo.learning_rate = 3e-4 + algo.num_learning_epochs = 4 + algo.num_mini_batches = 4 diff --git a/motrix_rl/src/motrix_rl/tasks/dm_quadruped.py b/motrix_rl/src/motrix_rl/tasks/dm_quadruped.py new file mode 100644 index 0000000..5ac69fd --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/dm_quadruped.py @@ -0,0 +1,94 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +class skrl: + @rlcfg("dm-quadruped-walk", backend="jax") + @rlcfg("dm-quadruped-run", backend="jax") + @rlcfg("dm-quadruped-escape", backend="jax") + @rlcfg("dm-quadruped-fetch", backend="jax") + @dataclass + class QuadrupedSkrlPpoJax(SkrlCfg): + """DM quadruped tasks - SKRL PPO configuration (JAX).""" + + def __post_init__(self): + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + models.policy.clip_actions = False + models.policy.hiddens = [256, 128, 64] + models.value.hiddens = [256, 128, 64] + + agent.rollouts = 24 + agent.learning_epochs = 4 + agent.mini_batches = 32 + agent.learning_rate = 2e-4 + + trainer.timesteps = 20000 + + @rlcfg("dm-quadruped-walk", backend="torch") + @rlcfg("dm-quadruped-run", backend="torch") + @rlcfg("dm-quadruped-escape", backend="torch") + @rlcfg("dm-quadruped-fetch", backend="torch") + @dataclass + class QuadrupedSkrlPpoTorch(SkrlCfg): + """DM quadruped tasks - SKRL PPO configuration (PyTorch).""" + + def __post_init__(self): + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + models.policy.clip_actions = False + models.policy.hiddens = [256, 128, 64] + models.value.hiddens = [256, 128, 64] + + agent.rollouts = 24 + agent.learning_epochs = 4 + agent.mini_batches = 32 + agent.learning_rate = 2e-4 + + trainer.timesteps = 27000 + + +class rslrl: + @rlcfg("dm-quadruped-walk") + @rlcfg("dm-quadruped-run") + @rlcfg("dm-quadruped-escape") + @dataclass + class QuadrupedRslrlPpo(RslrlCfg): + """DM quadruped tasks - RSLRL PPO configuration.""" + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + runner.seed = 42 + runner.max_iterations = 1667 + runner.num_steps_per_env = 24 + runner.experiment_name = "dm_quadruped" + runner.actor.hidden_dims = [256, 128, 64] + runner.critic.hidden_dims = [256, 128, 64] + algo.learning_rate = 2e-4 + algo.num_learning_epochs = 4 + algo.num_mini_batches = 32 diff --git a/motrix_rl/src/motrix_rl/tasks/dm_reacher.py b/motrix_rl/src/motrix_rl/tasks/dm_reacher.py new file mode 100644 index 0000000..612a14b --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/dm_reacher.py @@ -0,0 +1,90 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +@rlcfg("dm-reacher") +@dataclass +class ReacherSkrlPpo(SkrlCfg): + """Reacher SKRL configuration with nested structure (JAX/PyTorch).""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # Configure model architectures (JAX backend) + models.policy.hiddens = [32, 32, 32] + models.value.hiddens = [32, 32, 32] + + # Configure PPO agent parameters + agent.rollouts = 24 + agent.learning_epochs = 4 + agent.mini_batches = 32 + agent.learning_rate = 2e-4 + + trainer.timesteps = 3000 + + +@rlcfg("dm-reacher") +@dataclass +class ReacherSkrlPpoTorch(SkrlCfg): + """Reacher SKRL configuration with nested structure (PyTorch).""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # Configure model architectures (PyTorch backend - larger network) + models.policy.hiddens = [64, 64, 64] + models.value.hiddens = [64, 64, 64] + + # Configure PPO agent parameters + agent.rollouts = 24 + agent.learning_epochs = 4 + agent.mini_batches = 32 + agent.learning_rate = 2e-4 + + # Configure training parameters + trainer.timesteps = 3000 + + +@rlcfg("dm-reacher") +@dataclass +class ReacherRslrlPpo(RslrlCfg): + """Reacher RSLRL configuration.""" + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + runner.seed = 42 + runner.max_iterations = 100 + runner.num_steps_per_env = 24 + runner.experiment_name = "dm_reacher" + runner.actor.hidden_dims = [32, 32, 32] + runner.critic.hidden_dims = [32, 32, 32] + algo.learning_rate = 2e-4 + algo.num_learning_epochs = 4 + algo.num_mini_batches = 4 diff --git a/motrix_rl/src/motrix_rl/tasks/dm_walker.py b/motrix_rl/src/motrix_rl/tasks/dm_walker.py new file mode 100644 index 0000000..8ffe9e5 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/dm_walker.py @@ -0,0 +1,171 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Configuration for dm-walker, dm-stander, and dm-runner tasks. + +These three tasks share similar configurations: +- JAX: dm-walker, dm-stander, dm-runner all use the same config +- Torch: dm-walker and dm-stander share one config, dm-runner has a different config +- RSLRL: Each task has its own config +""" + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + +# ============================================================================= +# SKRL JAX Configurations +# ============================================================================= + + +@rlcfg("dm-walker", backend="jax") +@rlcfg("dm-stander", backend="jax") +@rlcfg("dm-runner", backend="jax") +@dataclass +class DmRunnerSkrlJaxCfg(SkrlCfg): + """Shared SKRL JAX configuration for dm-walker, dm-stander, and dm-runner.""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + runner.seed = 42 + + # Configure PPO agent parameters + agent = runner.agent + agent.rollouts = 24 + agent.learning_epochs = 4 + agent.mini_batches = 4 + agent.learning_rate = 2e-4 + + # Configure training parameters + # trainer.timesteps = max_env_steps / num_envs + runner.trainer.timesteps = 20000 + + +# ============================================================================= +# SKRL Torch Configurations +# ============================================================================= + + +@rlcfg("dm-walker", backend="torch") +@rlcfg("dm-stander", backend="torch") +@dataclass +class DmWalkerStanderSkrlTorchCfg(SkrlCfg): + """Shared SKRL Torch configuration for dm-walker and dm-stander.""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + runner.seed = 42 + + # Configure PPO agent parameters + agent = runner.agent + agent.rollouts = 24 + agent.learning_epochs = 4 + agent.mini_batches = 32 + agent.learning_rate = 2e-4 + + # Configure training parameters + runner.trainer.timesteps = 20000 + + +@rlcfg("dm-runner", backend="torch") +@dataclass +class DmRunnerSkrlTorchCfg(SkrlCfg): + """dm-runner SKRL Torch configuration with nested structure.""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + runner.seed = 42 + + # Configure PPO agent parameters + agent = runner.agent + agent.rollouts = 24 + agent.learning_epochs = 2 + agent.mini_batches = 32 + agent.learning_rate = 2e-4 + + runner.trainer.timesteps = 20000 + + +# ============================================================================= +# RSLRL Configurations +# ============================================================================= + + +@rlcfg("dm-walker") +@dataclass +class WalkerRslrlPpo(RslrlCfg): + """dm-walker RSLRL configuration. + + Note: max_iterations = max_env_steps / num_envs / roll_out + = 1024 * 40000 / 2048 / 24 ≈ 833 + """ + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + runner.seed = 42 + runner.max_iterations = 833 + runner.num_steps_per_env = 24 + runner.experiment_name = "dm_walker" + algo.learning_rate = 2e-4 + algo.num_learning_epochs = 4 + algo.num_mini_batches = 4 + + +@rlcfg("dm-stander") +@dataclass +class StanderRslrlPpo(RslrlCfg): + """dm-stander RSLRL configuration. + + Note: max_iterations = max_env_steps / num_envs / roll_out + = 1024 * 40000 / 2048 / 24 ≈ 833 + """ + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + runner.seed = 42 + runner.max_iterations = 833 + runner.num_steps_per_env = 24 + runner.experiment_name = "dm_stander" + algo.learning_rate = 2e-4 + algo.num_learning_epochs = 4 + algo.num_mini_batches = 32 + + +@rlcfg("dm-runner") +@dataclass +class RunnerRslrlPpo(RslrlCfg): + """dm-runner RSLRL configuration. + + Note: max_iterations = max_env_steps / num_envs / roll_out + = 1024 * 40000 / 2048 / 24 ≈ 833 + """ + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + runner.seed = 42 + runner.max_iterations = 833 + runner.num_steps_per_env = 24 + runner.experiment_name = "dm_runner" + algo.learning_rate = 2e-4 + algo.num_learning_epochs = 2 + algo.num_mini_batches = 32 diff --git a/motrix_rl/src/motrix_rl/tasks/franka_lift_cube.py b/motrix_rl/src/motrix_rl/tasks/franka_lift_cube.py new file mode 100644 index 0000000..42a3db8 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/franka_lift_cube.py @@ -0,0 +1,103 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +class skrl: + @rlcfg("franka-lift-cube", "jax") + @dataclass + class FrankaLiftPPOJax(SkrlCfg): + """Franka lift cube - SKRL JAX PPO configuration.""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # Configure model architectures + models.policy.hiddens = [256, 128, 64] + models.value.hiddens = [256, 128, 64] + + # Configure PPO agent parameters + agent.rollouts = 24 + agent.learning_epochs = 4 + agent.mini_batches = 32 + agent.learning_rate = 1e-3 + + # Configure training parameters + trainer.timesteps = 100000 + + @rlcfg("franka-lift-cube", "torch") + @dataclass + class FrankaLiftPPOTorch(SkrlCfg): + """Franka lift cube - SKRL Torch PPO configuration.""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # Configure model architectures + models.policy.hiddens = [256, 128, 64] + models.value.hiddens = [256, 128, 64] + + # Configure PPO agent parameters + agent.rollouts = 24 + agent.learning_epochs = 8 + agent.mini_batches = 4 + agent.learning_rate = 3e-4 + agent.learning_rate_scheduler_kwargs = {"kl_threshold": 0.01} + agent.entropy_loss_scale = 0.001 + agent.rewards_shaper_scale = 0.01 + + # Configure training parameters + trainer.timesteps = 100000 + + +class rslrl: + @rlcfg("franka-lift-cube") + @dataclass + class FrankaLiftRslrlPpo(RslrlCfg): + """Franka lift cube - RSLRL PPO configuration.""" + + def __post_init__(self): + """Configure RSLRL runner and algorithm settings.""" + runner = self.runner + algo = runner.algorithm + + # Runner settings + runner.seed = 42 + runner.max_iterations = 500 + runner.num_steps_per_env = 64 + runner.experiment_name = "franka_lift_cube" + + # Network architecture + runner.actor.hidden_dims = [256, 128, 128] + runner.critic.hidden_dims = [256, 128, 128] + + # Algorithm parameters (match SKRL Torch config) + algo.learning_rate = 5e-4 + algo.num_learning_epochs = 5 + algo.num_mini_batches = 4 + algo.entropy_coef = 1e-3 diff --git a/motrix_rl/src/motrix_rl/tasks/franka_open_cabinet.py b/motrix_rl/src/motrix_rl/tasks/franka_open_cabinet.py new file mode 100644 index 0000000..cae0a26 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/franka_open_cabinet.py @@ -0,0 +1,77 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +class skrl: + @rlcfg("franka-open-cabinet") + @dataclass + class FrankaOpenCabinetPPO(SkrlCfg): + """Franka open cabinet - SKRL PPO configuration.""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # Configure model architectures + models.policy.hiddens = [256, 128, 64] + models.value.hiddens = [256, 128, 64] + + # Configure PPO agent parameters + agent.rollouts = 16 + agent.learning_epochs = 5 + agent.mini_batches = 32 + agent.learning_rate = 3e-4 + agent.entropy_loss_scale = 0.001 + agent.rewards_shaper_scale = 1e-1 + + # Configure training parameters + runner.seed = 64 + trainer.timesteps = 24000 + + +class rslrl: + @rlcfg("franka-open-cabinet") + @dataclass + class FrankaOpenCabinetRslrlPpo(RslrlCfg): + """Franka open cabinet - RSLRL PPO configuration.""" + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + + # Runner settings + runner.seed = 64 + runner.max_iterations = 1500 + runner.num_steps_per_env = 16 + runner.experiment_name = "franka_open_cabinet" + + # Network architecture + runner.actor.hidden_dims = [256, 128, 64] + runner.critic.hidden_dims = [256, 128, 64] + + # Algorithm parameters + algo.learning_rate = 3e-4 + algo.num_learning_epochs = 5 + algo.num_mini_batches = 32 + algo.entropy_coef = 0.001 diff --git a/motrix_rl/src/motrix_rl/tasks/go1.py b/motrix_rl/src/motrix_rl/tasks/go1.py new file mode 100644 index 0000000..b100268 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/go1.py @@ -0,0 +1,125 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +class skrl: + @rlcfg("go1-flat-terrain-walk") + @dataclass + class Go1WalkFlatSkrlPpo(SkrlCfg): + """Go1 robot walk on flat terrain - SKRL PPO configuration.""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # Configure model architectures (medium size network) + models.policy.hiddens = [256, 128, 64] + models.value.hiddens = [256, 128, 64] + + # Configure PPO agent parameters + agent.rollouts = 24 + agent.learning_epochs = 5 + agent.mini_batches = 3 + agent.learning_rate = 3e-4 + + # Configure training parameters + trainer.timesteps = 30000 + + @rlcfg("go1-rough-terrain-walk") + @dataclass + class Go1WalkRoughSkrlPpo(Go1WalkFlatSkrlPpo): + """Go1 robot walk on rough terrain - SKRL PPO configuration. + + Uses larger network than flat terrain for more complex terrain handling. + """ + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + models = runner.models + # Configure model architectures (larger network for rough terrain) + models.policy.hiddens = [512, 256, 128] + models.value.hiddens = [512, 256, 128] + + @rlcfg("go1-stairs-terrain-walk") + @dataclass + class Go1WalkStairsPPO(Go1WalkRoughSkrlPpo): ... + + +class rslrl: + @rlcfg("go1-flat-terrain-walk") + @dataclass + class Go1WalkFlatRslrlPpo(RslrlCfg): + """Go1 robot walk on flat terrain - RSLRL PPO configuration.""" + + def __post_init__(self): + """Configure RSLRL runner and algorithm settings.""" + runner = self.runner + algo = runner.algorithm + + # Runner settings + runner.seed = 42 + runner.max_iterations = 1000 + runner.num_steps_per_env = 24 + runner.experiment_name = "go1_flat_terrain_walk" + + # Network architecture (medium size for flat terrain) + runner.actor.hidden_dims = [256, 128, 64] + runner.critic.hidden_dims = [256, 128, 64] + + # Algorithm parameters (match SKRL config) + algo.learning_rate = 3e-4 + algo.num_learning_epochs = 5 + algo.num_mini_batches = 3 + + @rlcfg("go1-rough-terrain-walk") + @dataclass + class Go1WalkRoughRslrlPpo(Go1WalkFlatRslrlPpo): + """Go1 robot walk on rough terrain - RSLRL PPO configuration. + + Uses larger network than flat terrain for more complex terrain handling. + """ + + def __post_init__(self): + """Override network architecture for rough terrain.""" + super().__post_init__() + + # Override experiment name + self.runner.experiment_name = "go1_rough_terrain_walk" + + # Override network architecture (larger for rough terrain) + self.runner.actor.hidden_dims = [512, 256, 128] + self.runner.critic.hidden_dims = [512, 256, 128] + + @rlcfg("go1-stairs-terrain-walk") + @dataclass + class Go1WalkStairsRslrlPpo(Go1WalkRoughRslrlPpo): + """Go1 robot walk on stairs terrain - RSLRL PPO configuration. + + Uses same configuration as rough terrain since stairs also require complex handling. + """ + + def __post_init__(self): + super().__post_init__() + self.runner.experiment_name = "go1_stairs_terrain_walk" diff --git a/motrix_rl/src/motrix_rl/tasks/go2.py b/motrix_rl/src/motrix_rl/tasks/go2.py new file mode 100644 index 0000000..4205179 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/go2.py @@ -0,0 +1,74 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +class skrl: + @rlcfg("go2-flat-terrain-walk") + @dataclass + class Go2WalkFlatSkrlPpo(SkrlCfg): + """Go2 robot walk on flat terrain - SKRL PPO configuration.""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # Configure model architectures (medium size network) + models.policy.hiddens = [256, 128, 64] + models.value.hiddens = [256, 128, 64] + + # Configure PPO agent parameters + agent.rollouts = 24 + agent.learning_epochs = 5 + agent.mini_batches = 3 + agent.learning_rate = 3e-4 + + # Configure training parameters + trainer.timesteps = 30000 + + +class rslrl: + @rlcfg("go2-flat-terrain-walk") + @dataclass + class Go2WalkFlatRslrlPpo(RslrlCfg): + """Go2 robot walk on flat terrain - RSLRL PPO configuration.""" + + def __post_init__(self): + """Configure RSLRL runner and algorithm settings.""" + runner = self.runner + algo = runner.algorithm + + # Runner settings + runner.seed = 42 + runner.max_iterations = 1000 + runner.num_steps_per_env = 24 + runner.experiment_name = "go2_flat_terrain_walk" + + # Network architecture (medium size for flat terrain) + runner.actor.hidden_dims = [256, 128, 64] + runner.critic.hidden_dims = [256, 128, 64] + + # Algorithm parameters + algo.learning_rate = 3e-4 + algo.num_learning_epochs = 5 + algo.num_mini_batches = 3 diff --git a/motrix_rl/src/motrix_rl/tasks/pendulum.py b/motrix_rl/src/motrix_rl/tasks/pendulum.py new file mode 100644 index 0000000..9db06f3 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/pendulum.py @@ -0,0 +1,69 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +# -- docs-tag-start: pendulum-train-cfg -- +@rlcfg("pendulum") +@dataclass +class PendulumSkrlPpo(SkrlCfg): + """Pendulum SKRL configuration with nested structure.""" + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + runner = self.runner + + # Configure model architectures + runner.models.policy.hiddens = [64, 64] + runner.models.value.hiddens = [64, 64] + + # Configure PPO agent parameters + agent = runner.agent + agent.rollouts = 32 + agent.learning_epochs = 5 + agent.mini_batches = 4 + agent.learning_rate = 3e-4 + # Configure training parameters + # trainer.timesteps = max_env_steps / num_envs + runner.trainer.timesteps = 5000 + + +# -- docs-tag-end: pendulum-train-cfg -- + + +@rlcfg("pendulum") +@dataclass +class PendulumRslrlPpo(RslrlCfg): + """Pendulum RSLRL configuration.""" + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + runner.seed = 42 + runner.max_iterations = 150 + runner.num_steps_per_env = 32 + runner.experiment_name = "pendulum" + runner.actor.hidden_dims = [64, 64] + runner.critic.hidden_dims = [64, 64] + + algo.learning_rate = 3e-4 + algo.entropy_coef = 0.005 + algo.num_learning_epochs = 5 + algo.num_mini_batches = 4 diff --git a/motrix_rl/src/motrix_rl/tasks/point_mass.py b/motrix_rl/src/motrix_rl/tasks/point_mass.py new file mode 100644 index 0000000..fae4197 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/point_mass.py @@ -0,0 +1,82 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.skrl.config import SkrlCfg + + +def _configure_point_mass_runner(runner) -> None: + models = runner.models + agent = runner.agent + trainer = runner.trainer + + models.separate = True + models.policy.hiddens = [32, 32] + models.value.hiddens = [32, 32] + + agent.rollouts = 16 + agent.learning_epochs = 4 + agent.mini_batches = 4 + + trainer.timesteps = 20000 + + +@rlcfg("point_mass", backend="jax") +@dataclass +class PointMassSkrlPpoJax(SkrlCfg): + """Point mass SKRL configuration for the JAX backend.""" + + def __post_init__(self): + self.num_envs = 256 + runner = self.runner + agent = runner.agent + + _configure_point_mass_runner(runner) + agent.learning_rate = 1e-3 + agent.entropy_loss_scale = 0.01 + agent.rewards_shaper_scale = 0.05 + agent.grad_norm_clip = 0.1 + agent.discount_factor = 0.995 + agent.lam = 0.97 + agent.value_loss_scale = 0.5 + agent.value_clip = 10.0 + agent.clip_predicted_values = False + agent.learning_rate_scheduler_kwargs = {"kl_threshold": 0.02} + agent.kl_threshold = 0.03 + + +@rlcfg("point_mass", backend="torch") +@dataclass +class PointMassSkrlPpoTorch(SkrlCfg): + """Point mass SKRL configuration for the PyTorch backend.""" + + def __post_init__(self): + runner = self.runner + agent = runner.agent + + models = runner.models + + models.separate = False + models.policy.hiddens = [32, 32] + models.value.hiddens = [32, 32] + + agent.rollouts = 32 + agent.learning_epochs = 5 + agent.mini_batches = 4 + runner.trainer.timesteps = 3500 + agent.learning_rate = 3e-4 + agent.entropy_loss_scale = 0.1 diff --git a/motrix_rl/src/motrix_rl/tasks/rm65_open_cabinet.py b/motrix_rl/src/motrix_rl/tasks/rm65_open_cabinet.py new file mode 100644 index 0000000..fca8c30 --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/rm65_open_cabinet.py @@ -0,0 +1,74 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +class skrl: + @rlcfg("rm65-open-cabinet", "torch") + @dataclass + class RM65OpenCabinetPPOTorch(SkrlCfg): + """RM65 open cabinet - SKRL Torch PPO configuration.""" + + def __post_init__(self): + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + models.separate = True + models.policy.hiddens = [512, 256, 128] + models.value.hiddens = [512, 256, 128] + + agent.rollouts = 32 + agent.learning_epochs = 5 + agent.mini_batches = 32 + agent.learning_rate = 8e-5 + agent.learning_rate_scheduler_kwargs = {"kl_threshold": 0.005} + agent.ratio_clip = 0.10 + agent.grad_norm_clip = 0.4 + agent.entropy_loss_scale = 2e-4 + agent.rewards_shaper_scale = 5e-2 + + runner.seed = 64 + trainer.timesteps = 21000 + + +class rslrl: + @rlcfg("rm65-open-cabinet") + @dataclass + class RM65OpenCabinetRslrlPpo(RslrlCfg): + """RM65 open cabinet - RSLRL PPO configuration.""" + + def __post_init__(self): + runner = self.runner + algo = runner.algorithm + + runner.seed = 64 + runner.max_iterations = 1500 + runner.num_steps_per_env = 24 + runner.experiment_name = "rm65_open_cabinet" + + runner.actor.hidden_dims = [256, 128, 64] + runner.critic.hidden_dims = [256, 128, 64] + + algo.learning_rate = 3e-4 + algo.num_learning_epochs = 5 + algo.num_mini_batches = 8 + algo.entropy_coef = 0.001 diff --git a/motrix_rl/src/motrix_rl/tasks/shadow_hand_repose.py b/motrix_rl/src/motrix_rl/tasks/shadow_hand_repose.py new file mode 100644 index 0000000..2e1124c --- /dev/null +++ b/motrix_rl/src/motrix_rl/tasks/shadow_hand_repose.py @@ -0,0 +1,110 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from dataclasses import dataclass + +from motrix_rl.registry import rlcfg +from motrix_rl.rslrl.cfg import RslrlCfg +from motrix_rl.skrl.config import SkrlCfg + + +class skrl: + @rlcfg("shadow-hand-repose") + @dataclass + class ShadowHandReposePPO(SkrlCfg): + """Shadow Hand Repose PPO configuration. + + Configuration for training Shadow Hand to reach target hand pose. + Uses large-scale parallel training with 8192 environments. + """ + + def __post_init__(self): + """Configure nested SKRL runner settings.""" + self.num_envs = 8192 + runner = self.runner + models = runner.models + agent = runner.agent + trainer = runner.trainer + + # ===== Basic Settings ===== + runner.seed = 42 + + # ===== Network Architecture ===== + models.policy.hiddens = [512, 512, 256, 128] + models.value.hiddens = [512, 512, 256, 128] + + # ===== PPO Core Parameters ===== + agent.rollouts = 16 + agent.learning_epochs = 5 + agent.mini_batches = 4 + agent.discount_factor = 0.99 + agent.lam = 0.95 + + # ===== Learning Rate ===== + agent.learning_rate = 5.0e-04 + agent.learning_rate_scheduler_kwargs = {"kl_threshold": 0.016} + + # ===== Clipping ===== + agent.ratio_clip = 0.2 + agent.value_clip = 0.2 + agent.clip_predicted_values = True + agent.grad_norm_clip = 1.0 + + # ===== Loss Coefficients ===== + agent.entropy_loss_scale = 0.0 + agent.value_loss_scale = 2.0 + agent.kl_threshold = 0.0 + + # ===== Reward Shaping ===== + agent.rewards_shaper_scale = 0.01 + + # ===== Training Control ===== + agent.random_timesteps = 0 + agent.learning_starts = 0 + agent.time_limit_bootstrap = False + + # ===== Training Parameters ===== + trainer.timesteps = 24000 + + +class rslrl: + @rlcfg("shadow-hand-repose") + @dataclass + class ShadowHandReposeRslrlPpo(RslrlCfg): + """Shadow Hand Repose RSLRL PPO configuration.""" + + def __post_init__(self): + """Configure RSLRL runner and algorithm settings.""" + self.num_envs = 8192 + runner = self.runner + algo = runner.algorithm + + # ===== Basic Settings ===== + runner.seed = 42 + + # max_iterations = max_env_steps / num_envs / roll_out = 200000000 / 8192 / 16 ≈ 1525 + runner.max_iterations = 1500 + runner.num_steps_per_env = 16 + runner.experiment_name = "shadow_hand_repose" + + # ===== Network Architecture ===== + runner.actor.hidden_dims = [512, 512, 256, 128] + runner.critic.hidden_dims = [512, 512, 256, 128] + + # ===== Algorithm Parameters ===== + algo.learning_rate = 5.0e-4 + algo.num_learning_epochs = 5 + algo.num_mini_batches = 4 + algo.entropy_coef = 0.0 diff --git a/motrix_rl/src/motrix_rl/utils.py b/motrix_rl/src/motrix_rl/utils.py index f756009..a207f32 100644 --- a/motrix_rl/src/motrix_rl/utils.py +++ b/motrix_rl/src/motrix_rl/utils.py @@ -13,7 +13,11 @@ # limitations under the License. # ============================================================================== +import dataclasses from dataclasses import dataclass +from typing import Any, TypeVar + +T = TypeVar("T") @dataclass @@ -59,3 +63,148 @@ def get_device_supports() -> DeviceSupports: pass return supports + + +def class_to_dict(obj) -> dict | list | Any: + """Recursively convert a dataclass to a dictionary. + + Args: + obj: The object to convert (dataclass, list, dict, or primitive) + + Returns: + Dictionary representation with nested dataclasses recursively converted + """ + if dataclasses.is_dataclass(obj): + return {k: class_to_dict(v) for k, v in dataclasses.asdict(obj).items()} + elif isinstance(obj, list): + return [class_to_dict(item) for item in obj] + elif isinstance(obj, dict): + return {k: class_to_dict(v) for k, v in obj.items()} + else: + return obj + + +def cfg_override(cfg: T, overrides: dict[str, Any]) -> T: + """Override dataclass fields using dot-notation path keys. + + This function creates a new dataclass instance with specified field values + overridden, leaving the original config unchanged. Nested dataclasses are + handled using dot notation in the key path. + + Args: + cfg: The original dataclass configuration object + overrides: Dictionary with path keys (e.g., "runner.seed", "num_envs") + where each key is a dot-separated path to the field to override + + Returns: + A new dataclass instance with overrides applied + + Raises: + KeyError: If a path key is invalid or references a non-existent field + TypeError: If an intermediate field is not a dataclass or if a value + type doesn't match the expected field type + + Examples: + >>> from motrix_rl.rslrl.cfg import RslrlCfg + >>> base_cfg = RslrlCfg() + >>> overrides = { + ... "num_envs": 4096, + ... "runner.seed": 123, + ... "runner.algorithm.num_learning_epochs": 10, + ... } + >>> new_cfg = cfg_override(base_cfg, overrides) + >>> assert new_cfg.num_envs == 4096 + >>> assert new_cfg.runner.seed == 123 + >>> assert new_cfg.runner.algorithm.num_learning_epochs == 10 + """ + if not overrides: + return cfg + + if not dataclasses.is_dataclass(cfg): + raise TypeError(f"cfg must be a dataclass, got {type(cfg).__name__}") + + # Group overrides by their parent paths to apply them efficiently + # Structure: {parent_path: {field_name: value}} + # For "num_envs": parent_path=[], field_name="num_envs" + # For "runner.seed": parent_path=["runner"], field_name="seed" + override_tree: dict[tuple[str, ...], dict[str, Any]] = {} + + for key, value in overrides.items(): + parts = key.split(".") + if len(parts) == 1: + # Top-level field + parent_path = tuple() + field_name = parts[0] + else: + # Nested field + parent_path = tuple(parts[:-1]) + field_name = parts[-1] + + if parent_path not in override_tree: + override_tree[parent_path] = {} + override_tree[parent_path][field_name] = value + + # Apply overrides from deepest to shallowest to minimize object copies + sorted_paths = sorted(override_tree.keys(), key=lambda p: len(p), reverse=True) + + def apply_overrides_at_path( + obj: Any, path: tuple[str, ...], field_overrides: dict[str, Any], parent_path: tuple[str, ...] = () + ) -> Any: + """Apply overrides to an object at a specific path. + + Args: + obj: The current object (dataclass or primitive) + path: Tuple of field names to navigate through + field_overrides: Dict of field names to values to apply at the target + parent_path: The full path from the root (for error messages) + + Returns: + New object with overrides applied + """ + if not path: + # We're at the target - apply the overrides + if not dataclasses.is_dataclass(obj): + # Build the full path for the error message + full_path_parts = list(parent_path) if parent_path else ["(root)"] + raise TypeError( + f"Cannot navigate into non-dataclass field '{full_path_parts[-1]}' of type {type(obj).__name__}" + ) + + # Validate field names exist - use set difference for efficiency + obj_fields = {f.name for f in dataclasses.fields(obj)} + invalid_fields = set(field_overrides.keys()) - obj_fields + if invalid_fields: + raise KeyError( + f"Invalid fields {sorted(invalid_fields)} for {type(obj).__name__}. " + f"Valid fields: {sorted(obj_fields)}" + ) + + # Use dataclasses.replace to create a new instance with overrides + return dataclasses.replace(obj, **field_overrides) + + # Need to navigate deeper - recurse to modify nested dataclass + if not dataclasses.is_dataclass(obj): + raise TypeError(f"Cannot navigate into non-dataclass field '{path[0]}' of type {type(obj).__name__}") + + # Validate the navigation path exists + obj_fields = {f.name: f for f in dataclasses.fields(obj)} + if path[0] not in obj_fields: + valid_fields = sorted(obj_fields.keys()) + raise KeyError(f"Invalid path component '{path[0]}' for {type(obj).__name__}. Valid fields: {valid_fields}") + + # Get the nested object + nested_obj = getattr(obj, path[0]) + + # Recursively apply overrides to the nested object + new_nested_obj = apply_overrides_at_path(nested_obj, path[1:], field_overrides, parent_path + (path[0],)) + + # Return a new instance of the current object with the nested field replaced + return dataclasses.replace(obj, **{path[0]: new_nested_obj}) + + # Start with the original cfg and apply each group of overrides + result = cfg + for path in sorted_paths: + field_overrides = override_tree[path] + result = apply_overrides_at_path(result, path, field_overrides, parent_path=path) + + return result diff --git a/motrix_rl/template/rslrl_config.yaml b/motrix_rl/template/rslrl_config.yaml new file mode 100644 index 0000000..ea63754 --- /dev/null +++ b/motrix_rl/template/rslrl_config.yaml @@ -0,0 +1,85 @@ +runner: + class_name: OnPolicyRunner + # General + num_steps_per_env: 24 # Number of steps per environment per iteration + max_iterations: 1500 # Number of policy updates + seed: 1 + # Observations + obs_groups: { "actor": ["policy"], "critic": ["policy", "privileged"] } # Maps from observation sets to groups. See `vec_env.py` for more information + # Logging parameters + save_interval: 50 # Check for potential saves every `save_interval` iterations + experiment_name: walking_experiment + run_name: "" + # Logging writer + logger: tensorboard # tensorboard, neptune, wandb + neptune_project: rsl_rl + wandb_project: rsl_rl + + # Actor + actor: + class_name: MLPModel + hidden_dims: [256, 256, 256] + activation: elu + obs_normalization: false + stochastic: true + init_noise_std: 1.0 + noise_std_type: "scalar" # 'scalar' or 'log' + state_dependent_std: false + + # Critic + critic: + class_name: MLPModel + hidden_dims: [256, 256, 256] + activation: elu + obs_normalization: false + stochastic: false + + # Algorithm + algorithm: + class_name: PPO + # Training + optimizer: adam # adam, adamw, sgd, rmsprop + learning_rate: 0.001 + num_learning_epochs: 5 + num_mini_batches: 4 # mini batch size = num_envs * num_steps / num_mini_batches + schedule: adaptive # adaptive, fixed + # Value function + value_loss_coef: 1.0 + clip_param: 0.2 + use_clipped_value_loss: true + # Surrogate loss + desired_kl: 0.01 + entropy_coef: 0.01 + gamma: 0.99 + lam: 0.95 + max_grad_norm: 1.0 + # Miscellaneous + normalize_advantage_per_mini_batch: false + + # Random network distillation + rnd_cfg: + weight: 0.0 # Initial weight of the RND reward + weight_schedule: null # This is a dictionary with a required key called "mode". Please check the RND module for more information + reward_normalization: false # Whether to normalize RND reward + # Learning parameters + learning_rate: 0.001 # Learning rate for RND + # Network parameters + num_outputs: 1 # Number of outputs of RND network. Note: if -1, then the network will use dimensions of the observation + predictor_hidden_dims: [-1] # Hidden dimensions of predictor network + target_hidden_dims: [-1] # Hidden dimensions of target network + + # Symmetry augmentation + symmetry_cfg: + use_data_augmentation: true # This adds symmetric trajectories to the batch + use_mirror_loss: false # This adds symmetry loss term to the loss function + data_augmentation_func: null # String containing the module and function name to import + # Example: "legged_gym.envs.locomotion.anymal_c.symmetry:get_symmetric_states" + # + # .. code-block:: python + # + # @torch.no_grad() + # def get_symmetric_states( + # env: VecEnv, obs: Optional[torch.Tensor] = None, actions: Optional[torch.Tensor] = None, + # ) -> Tuple[torch.Tensor, torch.Tensor]: + # + mirror_loss_coeff: 0.0 # Coefficient for symmetry loss term. If 0, no symmetry loss is used diff --git a/motrix_rl/template/skrl_config.yaml b/motrix_rl/template/skrl_config.yaml new file mode 100644 index 0000000..e8d5fb7 --- /dev/null +++ b/motrix_rl/template/skrl_config.yaml @@ -0,0 +1,75 @@ +seed: 42 + +# Models are instantiated using skrl's model instantiator utility +# https://skrl.readthedocs.io/en/latest/api/utils/model_instantiators.html +models: + separate: False + policy: # gaussian model + class: "GaussianMixin" + clip_actions: True + clip_log_std: True + initial_log_std: 0.0 + min_log_std: -20.0 + max_log_std: 2.0 + input: "STATES" + hiddens: [32, 32] + hidden_activation: ["elu", "elu"] + output: "ACTIONS" + output_activation: "tanh" + output_scale: 1.0 + value: # deterministic model + class: "DeterministicMixin" + clip_actions: False + input: "STATES" + hiddens: [32, 32] + hidden_activation: ["elu", "elu"] + output: "ONE" + output_activation: "" + output_scale: 1.0 + +# Memory +# https://skrl.readthedocs.io/en/latest/api/memories/random.html +memory: + class: "RandomMemory" + memory_size: -1 # -1: automatically determined value + +# PPO agent configuration (field names are from PPO_DEFAULT_CONFIG) +# https://skrl.readthedocs.io/en/latest/api/agents/ppo.html +agent: + class: "PPO" + rollouts: 16 + learning_epochs: 8 + mini_batches: 1 + discount_factor: 0.99 + lambda: 0.95 + learning_rate: 3.e-4 + learning_rate_scheduler: "KLAdaptiveLR" + learning_rate_scheduler_kwargs: + kl_threshold: 0.008 + random_timesteps: 0 # random exploration steps + learning_starts: 0 # learning starts after this many steps + grad_norm_clip: 1.0 + ratio_clip: 0.2 + value_clip: 0.2 + clip_predicted_values: True + entropy_loss_scale: 0.0 + value_loss_scale: 2.0 + kl_threshold: 0 + rewards_shaper_scale: 1.0 + time_limit_bootstrap: False + # logging and checkpoint + experiment: + directory: "runs" + experiment_name: "" + write_interval: 16 + checkpoint_interval: 80 + store_separately: False + wandb: False + wandb_kwargs: null + +# Sequential trainer +# https://skrl.readthedocs.io/en/latest/api/trainers/sequential.html +trainer: + class: "SequentialTrainer" + timesteps: 1600 + environment_info: "log" diff --git a/motrix_rl/tests/test_utils.py b/motrix_rl/tests/test_utils.py new file mode 100644 index 0000000..c7c2d59 --- /dev/null +++ b/motrix_rl/tests/test_utils.py @@ -0,0 +1,158 @@ +# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tests for motrix_rl.utils.cfg_override function.""" + +import dataclasses +from dataclasses import dataclass + +import pytest + +from motrix_rl.utils import cfg_override + + +@dataclass +class NestedConfig: + value: int = 10 + name: str = "default" + + +@dataclass +class MiddleConfig: + nested: NestedConfig = dataclasses.field(default_factory=NestedConfig) + flag: bool = True + + +@dataclass +class RootConfig: + middle: MiddleConfig = dataclasses.field(default_factory=MiddleConfig) + count: int = 5 + label: str = "root" + + +class TestCfgOverride: + """Tests for cfg_override function.""" + + def test_nested_overrides(self): + """Test overriding fields at all nesting levels.""" + cfg = RootConfig() + + # Top-level + result = cfg_override(cfg, {"count": 42}) + assert result.count == 42 + assert result.label == "root" + + # One-level nested + result = cfg_override(cfg, {"middle.flag": False}) + assert result.middle.flag is False + + # Deep nested + result = cfg_override(cfg, {"middle.nested.value": 99}) + assert result.middle.nested.value == 99 + + def test_multiple_overrides(self): + """Test overriding multiple fields at different levels.""" + cfg = RootConfig() + overrides = { + "count": 42, + "label": "modified", + "middle.flag": False, + "middle.nested.name": "custom", + } + result = cfg_override(cfg, overrides) + + assert result.count == 42 + assert result.label == "modified" + assert result.middle.flag is False + assert result.middle.nested.name == "custom" + + def test_type_and_list_fields(self): + """Test overriding different field types.""" + cfg = RootConfig() + + # String + result = cfg_override(cfg, {"label": "new_label"}) + assert result.label == "new_label" + + # Bool + result = cfg_override(cfg, {"middle.flag": False}) + assert result.middle.flag is False + + # Float (Python dataclasses don't enforce types) + result = cfg_override(cfg, {"count": 3.14}) + assert result.count == 3.14 + + # List + result = cfg_override(cfg, {"count": [1, 2, 3]}) + assert result.count == [1, 2, 3] + + def test_immutability_and_empty_overrides(self): + """Test immutability and empty overrides.""" + cfg = RootConfig() + original_count = cfg.count + + # Empty overrides returns original + result = cfg_override(cfg, {}) + assert result is cfg + + # Original unchanged + result = cfg_override(cfg, {"count": 42}) + assert cfg.count == original_count + assert result.count == 42 + + def test_error_handling(self): + """Test error handling for invalid inputs.""" + cfg = RootConfig() + + # Non-existent top-level field + with pytest.raises(KeyError, match="Invalid field"): + cfg_override(cfg, {"nonexistent": 1}) + + # Non-existent nested field + with pytest.raises(KeyError, match="Invalid field"): + cfg_override(cfg, {"middle.nonexistent": 1}) + + # Non-existent intermediate path + with pytest.raises(KeyError, match="Invalid path component"): + cfg_override(cfg, {"invalid.path": 1}) + + # Navigate into non-dataclass field + with pytest.raises(TypeError, match="Cannot navigate into non-dataclass"): + cfg_override(cfg, {"count.something": 1}) + + # Non-dataclass cfg + with pytest.raises(TypeError, match="cfg must be a dataclass"): + cfg_override({"foo": "bar"}, {"foo": "baz"}) + + def test_rslrl_config(self): + """Test with actual RSLRL configuration classes.""" + from motrix_rl.rslrl.cfg import RslrlCfg + + cfg = RslrlCfg() + overrides = { + "num_envs": 4096, + "runner.seed": 123, + "runner.algorithm.num_learning_epochs": 10, + "runner.algorithm.learning_rate": 1e-4, + "runner.actor.hidden_dims": [512, 256, 128], + } + result = cfg_override(cfg, overrides) + + assert result.num_envs == 4096 + assert result.play_num_envs == 16 # Unchanged + assert result.runner.seed == 123 + assert result.runner.algorithm.num_learning_epochs == 10 + assert result.runner.algorithm.learning_rate == 1e-4 + assert result.runner.actor.hidden_dims == [512, 256, 128] diff --git a/pyproject.toml b/pyproject.toml index c36a77f..5654af0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "motrix-lab" -version = "0.2.0" +version = "0.3.0" description = "A general-purpose machine learning architecture designed for robot training" authors = [{ name = "Motphys", email = "developers@motphys.com" }] requires-python = "==3.10.*" @@ -22,4 +22,4 @@ docs = [ members = ["motrix_envs", "motrix_rl"] [tool.uv] -package = false \ No newline at end of file +package = false diff --git a/scripts/play.py b/scripts/play.py index 00807a2..47a92cc 100644 --- a/scripts/play.py +++ b/scripts/play.py @@ -20,7 +20,6 @@ from absl import app, flags from skrl import config from motrix_rl import utils -from motrix_rl.skrl import get_log_dir logger = logging.getLogger(__name__) @@ -34,77 +33,109 @@ _POLICY = flags.DEFINE_string("policy", None, "The policy to load") _NUM_ENVS = flags.DEFINE_integer("num-envs", 2048, "Number of envs to play") _SEED = flags.DEFINE_integer("seed", None, "Random seed for reproducibility") _RAND_SEED = flags.DEFINE_bool("rand-seed", False, "Generate random seed") +_RLLIB = flags.DEFINE_string( + "rllib", None, "The RL framework (skrl/rslrl). Auto-discovered from latest training if not specified." +) -def get_inference_backend(policy_path: str): - if policy_path.endswith(".pt"): +def get_inference_backend(policy_path: Path | str, rllib: str): + """Determine the backend from RL framework and policy file extension.""" + if rllib == "rslrl": + # RSLRL always uses torch backend return "torch" - if policy_path.endswith(".pickle"): + # Handle both Path and str types + suffix = policy_path.suffix if isinstance(policy_path, Path) else Path(policy_path).suffix + if suffix == ".pt": + return "torch" + if suffix == ".pickle": return "jax" else: raise Exception(f"Unknown policy format: {policy_path}") -def find_best_policy(env_name: str) -> str: +def discover_rllib(env_name: str) -> tuple[str, Path]: """ - Find the most recent best policy for the given environment. + Discover the RL framework and best policy from the most recent training run. Args: env_name: The name of the environment Returns: - Path to the best policy file + Tuple of (RL framework name, path to best policy) Raises: - FileNotFoundError: If no policy files are found + FileNotFoundError: If no training results are found """ - # Base runs directory + base_dir = Path(f"runs/{env_name}") - env_dir = Path(get_log_dir(env_name)) + if not base_dir.exists(): + raise FileNotFoundError(f"No training results found for environment '{env_name}' in {base_dir}") - if not env_dir.exists(): - raise FileNotFoundError(f"No training results found for environment '{env_name}' in {env_dir}") + frameworks = [] + for framework in ["skrl", "rslrl"]: + framework_dir = base_dir / framework + if framework_dir.exists() and framework_dir.is_dir(): + # Get all training run directories + training_runs = [d for d in framework_dir.iterdir() if d.is_dir()] + if training_runs: + # Find the most recent run for this framework + latest_run = max(training_runs, key=lambda x: x.stat().st_mtime) + frameworks.append((framework, latest_run.stat().st_mtime, latest_run)) - # Find all training run directories (pattern: YY-MM-DD_HH-MM-SS-_XXXXX_PPO) - training_runs = [d for d in env_dir.iterdir() if d.is_dir()] + if not frameworks: + raise FileNotFoundError(f"No training runs found for environment '{env_name}' in {base_dir}") - if not training_runs: - raise FileNotFoundError(f"No training runs found for environment '{env_name}'") + # Return the framework with the most recent training run and its best policy + latest_framework, _, latest_run_dir = max(frameworks, key=lambda x: x[1]) + logger.info(f"Auto-discovered RL framework: {latest_framework}") - # Sort by modification time to get the most recent - latest_run = max(training_runs, key=lambda x: x.stat().st_mtime) - checkpoints_dir = latest_run / "checkpoints" + # Find best policy in the latest run directory + if latest_framework == "rslrl": + # RSLRL uses model_*.pt format + model_files = list(latest_run_dir.glob("model_*.pt")) + if not model_files: + raise FileNotFoundError(f"No policy files found in {latest_run_dir}") - if not checkpoints_dir.exists(): - raise FileNotFoundError(f"No checkpoints directory found in {latest_run}") + def extract_iteration(filename): + stem = Path(filename).stem + parts = stem.split("_") + if len(parts) >= 2: + try: + return int(parts[1]) + except ValueError: + return 0 + return 0 - # First, try to find best_agent files (highest performance models) - best_files = list(checkpoints_dir.glob("best_agent.*")) + best_policy = max(model_files, key=lambda f: (f.stat().st_mtime, extract_iteration(f))) + else: + # SKRL uses checkpoints subdirectory + checkpoints_dir = latest_run_dir / "checkpoints" + if not checkpoints_dir.exists(): + raise FileNotFoundError(f"No checkpoints directory found in {latest_run_dir}") - if best_files: - # Return the first best_agent file found (there should only be one) - return str(best_files[0]) + # First, try to find best_agent files + best_files = list(checkpoints_dir.glob("best_agent.*")) + if best_files: + best_policy = best_files[0] + else: + # Find checkpoint with highest timestep + checkpoint_files = list(checkpoints_dir.glob("agent_*.pt")) + list(checkpoints_dir.glob("agent_*.pickle")) + if not checkpoint_files: + raise FileNotFoundError(f"No policy files found in {checkpoints_dir}") - # If no best_agent files, find the checkpoint with the highest timestep - checkpoint_files = list(checkpoints_dir.glob("agent_*.pt")) + list(checkpoints_dir.glob("agent_*.pickle")) - - if not checkpoint_files: - raise FileNotFoundError(f"No policy files found in {checkpoints_dir}") - - # Extract timestep from filename and find the highest - def extract_timestep(filename): - # Pattern: agent_{timestep}.ext - stem = Path(filename).stem # agent_{timestep} - parts = stem.split("_") - if len(parts) >= 2: - try: - return int(parts[1]) - except ValueError: + def extract_timestep(filename): + stem = Path(filename).stem + parts = stem.split("_") + if len(parts) >= 2: + try: + return int(parts[1]) + except ValueError: + return 0 return 0 - return 0 - latest_checkpoint = max(checkpoint_files, key=extract_timestep) - return str(latest_checkpoint) + best_policy = max(checkpoint_files, key=extract_timestep) + + return latest_framework, best_policy def main(argv): @@ -119,28 +150,45 @@ def main(argv): rl_override["play_num_envs"] = _NUM_ENVS.value if _RAND_SEED.value: - rl_override["seed"] = None + rl_override["runner.seed"] = None elif _SEED.present: - rl_override["seed"] = _SEED.value + rl_override["runner.seed"] = _SEED.value sim_backend = _SIM_BACKEND.value + rllib = None + policy_path = None - # Determine policy path: use explicit policy if provided, otherwise auto-discover if _POLICY.present: + if not _RLLIB.present: + logger.error("Error: --policy specified but --rllib not specified") + return + rllib = _RLLIB.value policy_path = _POLICY.value + logger.info(f"Using specified RL framework: {rllib}") logger.info(f"Using specified policy: {policy_path}") else: + # if policy is not specified, search for the lastest training run and use its best policy try: - policy_path = find_best_policy(env_name) + rllib, policy_path = discover_rllib(env_name) + logger.info(f"Auto-discovered RL framework: {rllib}") logger.info(f"Auto-discovered best policy: {policy_path}") except FileNotFoundError as e: logger.error(f"Error: {e}") - logger.error("Please specify a policy using --policy flag or train a model first") + logger.error("Please specify --rllib or train a model first") return - backend = get_inference_backend(policy_path) + backend = get_inference_backend(policy_path, rllib) - if backend == "jax": + if rllib == "rslrl": + # RSLRL evaluation flow (always uses torch backend) + assert device_supports.torch, "PyTorch is not available on your device" + from motrix_rl.rslrl.torch.train import ppo + + config.torch.backend = "torch" + trainer = ppo.Trainer(env_name, sim_backend, cfg_override=rl_override, enable_render=enable_render) + trainer.play(policy_path) + + elif backend == "jax": assert device_supports.jax, "jax is not avaliable on your device " from motrix_rl.skrl.jax.train import ppo diff --git a/scripts/train.py b/scripts/train.py index 63b13af..0ad21ac 100644 --- a/scripts/train.py +++ b/scripts/train.py @@ -31,12 +31,45 @@ _SIM_BACKEND = flags.DEFINE_string( ) _NUM_ENVS = flags.DEFINE_integer("num-envs", 2048, "Number of envs to train") _RENDER = flags.DEFINE_bool("render", False, "Render the env") -_TRAIN_BACKEND = flags.DEFINE_string("train-backend", "jax", "The learning backend. (jax/torch)") +_TRAIN_BACKEND = flags.DEFINE_string("train-backend", None, "The learning backend. (jax/torch)") _SEED = flags.DEFINE_integer("seed", None, "Random seed for reproducibility") _RAND_SEED = flags.DEFINE_bool("rand-seed", False, "Generate random seed") +_RLLIB = flags.DEFINE_string("rllib", "skrl", "The RL framework (skrl/rslrl)") -def get_train_backend(supports: utils.DeviceSupports): +def get_train_backend(supports: utils.DeviceSupports, train_backend_arg: str | None, rllib: str): + """ + Determine the training backend based on device supports, user input, and RL framework. + + Args: + supports: Device support information + train_backend_arg: User-specified backend via --train-backend flag (None if not provided) + rllib: RL framework to use ("skrl" or "rslrl") + + Returns: + The determined backend name ("jax" or "torch") + + Raises: + Exception: If user specifies incompatible backend or no backend is available + """ + # RSLRL only supports PyTorch + if rllib == "rslrl": + if train_backend_arg is not None and train_backend_arg != "torch": + raise Exception("RSLRL only supports PyTorch backend.") + if not supports.torch: + raise Exception("RSLRL requires PyTorch, but it is not available on your device.") + return "torch" + + # User explicitly specified backend + if train_backend_arg is not None: + backend = train_backend_arg + if backend == "jax" and not supports.jax: + raise Exception("JAX is not available on your device.") + if backend == "torch" and not supports.torch: + raise Exception("PyTorch is not available on your device.") + return backend + + # Auto-select backend based on device priority if supports.jax and supports.jax_gpu: return "jax" elif supports.torch and supports.torch_gpu: @@ -46,7 +79,7 @@ def get_train_backend(supports: utils.DeviceSupports): elif supports.torch: return "torch" else: - raise Exception("neither jax nor torch not avaliable on the device.") + raise Exception("Neither JAX nor PyTorch is available on the device.") def main(argv): @@ -61,19 +94,26 @@ def main(argv): rl_override["num_envs"] = _NUM_ENVS.value if _RAND_SEED.value: - rl_override["seed"] = None + rl_override["runner.seed"] = None elif _SEED.present: - rl_override["seed"] = _SEED.value + rl_override["runner.seed"] = _SEED.value sim_backend = _SIM_BACKEND.value - train_backend = "jax" - if not _TRAIN_BACKEND.present: - train_backend = get_train_backend(device_supports) - else: - train_backend = _TRAIN_BACKEND.value + rllib = _RLLIB.value + + # Determine the training backend + train_backend = get_train_backend(device_supports, _TRAIN_BACKEND.value, rllib) trainer = None - if train_backend == "jax": + if rllib == "rslrl": + # RSLRL training flow + assert device_supports.torch, "PyTorch is not available on your device" + assert train_backend == "torch", "RSLRL only supports PyTorch backend" + from motrix_rl.rslrl.torch.train import ppo + + trainer = ppo.Trainer(env_name, sim_backend, cfg_override=rl_override, enable_render=enable_render) + + elif train_backend == "jax": from motrix_rl.skrl.jax.train import ppo config.jax.backend = "jax" # or "numpy" @@ -82,7 +122,6 @@ def main(argv): elif train_backend == "torch": from motrix_rl.skrl.torch.train import ppo - config.torch.backend = "torch" trainer = ppo.Trainer(env_name, sim_backend, cfg_override=rl_override, enable_render=enable_render) else: raise Exception(f"Unknown train backend: {train_backend}") diff --git a/uv.lock b/uv.lock index cb96a0b..f19a5ae 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 1 +revision = 3 requires-python = "==3.10.*" [options] @@ -16,9 +16,9 @@ members = [ name = "absl-py" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7a/8f/fc001b92ecc467cc32ab38398bd0bfb45df46e7523bf33c2ad22a505f06e/absl-py-2.1.0.tar.gz", hash = "sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff", size = 118055 } +sdist = { url = "https://files.pythonhosted.org/packages/7a/8f/fc001b92ecc467cc32ab38398bd0bfb45df46e7523bf33c2ad22a505f06e/absl-py-2.1.0.tar.gz", hash = "sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff", size = 118055, upload-time = "2024-01-16T22:14:26.154Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl", hash = "sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308", size = 133706 }, + { url = "https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl", hash = "sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308", size = 133706, upload-time = "2024-01-16T22:14:24.055Z" }, ] [[package]] @@ -28,18 +28,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/c1/bbac6a50d02774f91572938964c582fff4270eee73ab822a4aeea4d8b11b/accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872", size = 1377899 } +sdist = { url = "https://files.pythonhosted.org/packages/bc/c1/bbac6a50d02774f91572938964c582fff4270eee73ab822a4aeea4d8b11b/accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872", size = 1377899, upload-time = "2024-05-10T11:23:10.216Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7", size = 1395903 }, + { url = "https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7", size = 1395903, upload-time = "2024-05-10T11:23:08.421Z" }, ] [[package]] name = "alabaster" version = "0.7.16" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776 } +sdist = { url = "https://files.pythonhosted.org/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776, upload-time = "2024-01-10T00:56:10.189Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511 }, + { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511, upload-time = "2024-01-10T00:56:08.388Z" }, ] [[package]] @@ -50,9 +50,9 @@ dependencies = [ { name = "six" }, { name = "wheel" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/af/4182184d3c338792894f34a62672919db7ca008c89abee9b564dd34d8029/astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872", size = 18290 } +sdist = { url = "https://files.pythonhosted.org/packages/f3/af/4182184d3c338792894f34a62672919db7ca008c89abee9b564dd34d8029/astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872", size = 18290, upload-time = "2019-12-22T18:12:13.129Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8", size = 12732 }, + { url = "https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8", size = 12732, upload-time = "2019-12-22T18:12:11.297Z" }, ] [[package]] @@ -62,31 +62,31 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/03/96/92afe8a7912b327c01f0a8b6408c9556ee13b1aba5b98d587ac7327ff32d/autodocsumm-0.2.14.tar.gz", hash = "sha256:2839a9d4facc3c4eccd306c08695540911042b46eeafcdc3203e6d0bab40bc77", size = 46357 } +sdist = { url = "https://files.pythonhosted.org/packages/03/96/92afe8a7912b327c01f0a8b6408c9556ee13b1aba5b98d587ac7327ff32d/autodocsumm-0.2.14.tar.gz", hash = "sha256:2839a9d4facc3c4eccd306c08695540911042b46eeafcdc3203e6d0bab40bc77", size = 46357, upload-time = "2024-10-23T18:51:47.369Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/bc/3f66af9beb683728e06ca08797e4e9d3e44f432f339718cae3ba856a9cad/autodocsumm-0.2.14-py3-none-any.whl", hash = "sha256:3bad8717fc5190802c60392a7ab04b9f3c97aa9efa8b3780b3d81d615bfe5dc0", size = 14640 }, + { url = "https://files.pythonhosted.org/packages/87/bc/3f66af9beb683728e06ca08797e4e9d3e44f432f339718cae3ba856a9cad/autodocsumm-0.2.14-py3-none-any.whl", hash = "sha256:3bad8717fc5190802c60392a7ab04b9f3c97aa9efa8b3780b3d81d615bfe5dc0", size = 14640, upload-time = "2024-10-23T18:51:45.115Z" }, ] [[package]] name = "babel" -version = "2.18.0" +version = "2.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554 } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845 }, + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, ] [[package]] name = "beautifulsoup4" -version = "4.14.3" +version = "4.14.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737 } +sdist = { url = "https://files.pythonhosted.org/packages/77/e9/df2358efd7659577435e2177bfa69cba6c33216681af51a707193dec162a/beautifulsoup4-4.14.2.tar.gz", hash = "sha256:2a98ab9f944a11acee9cc848508ec28d9228abfd522ef0fad6a02a72e0ded69e", size = 625822, upload-time = "2025-09-29T10:05:42.613Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721 }, + { url = "https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl", hash = "sha256:5ef6fa3a8cbece8488d66985560f97ed091e22bbc4e9c2338508a9d5de6d4515", size = 106392, upload-time = "2025-09-29T10:05:43.771Z" }, ] [[package]] @@ -117,18 +117,18 @@ dependencies = [ { name = "toolz" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/70/53c7d404ce9e2a94009aea7f77ef6e392f6740e071c62683a506647c520f/chex-0.1.90.tar.gz", hash = "sha256:d3c375aeb6154b08f1cccd2bee4ed83659ee2198a6acf1160d2fe2e4a6c87b5c", size = 92363 } +sdist = { url = "https://files.pythonhosted.org/packages/77/70/53c7d404ce9e2a94009aea7f77ef6e392f6740e071c62683a506647c520f/chex-0.1.90.tar.gz", hash = "sha256:d3c375aeb6154b08f1cccd2bee4ed83659ee2198a6acf1160d2fe2e4a6c87b5c", size = 92363, upload-time = "2025-07-23T19:50:47.945Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/3d/46bb04776c465cea2dd8aa2d4b61ab610b707f798f47838ef7e6105b025c/chex-0.1.90-py3-none-any.whl", hash = "sha256:fce3de82588f72d4796e545e574a433aa29229cbdcf792555e41bead24b704ae", size = 101047 }, + { url = "https://files.pythonhosted.org/packages/6f/3d/46bb04776c465cea2dd8aa2d4b61ab610b707f798f47838ef7e6105b025c/chex-0.1.90-py3-none-any.whl", hash = "sha256:fce3de82588f72d4796e545e574a433aa29229cbdcf792555e41bead24b704ae", size = 101047, upload-time = "2025-07-23T19:50:46.603Z" }, ] [[package]] name = "cloudpickle" version = "3.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330 } +sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330, upload-time = "2025-11-03T09:25:26.604Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228 }, + { url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload-time = "2025-11-03T09:25:25.534Z" }, ] [[package]] @@ -143,18 +143,18 @@ wheels = [ name = "docutils" version = "0.21.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444 } +sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408 }, + { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, ] [[package]] name = "etils" version = "1.13.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9b/a0/522bbff0f3cdd37968f90dd7f26c7aa801ed87f5ba335f156de7f2b88a48/etils-1.13.0.tar.gz", hash = "sha256:a5b60c71f95bcd2d43d4e9fb3dc3879120c1f60472bb5ce19f7a860b1d44f607", size = 106368 } +sdist = { url = "https://files.pythonhosted.org/packages/9b/a0/522bbff0f3cdd37968f90dd7f26c7aa801ed87f5ba335f156de7f2b88a48/etils-1.13.0.tar.gz", hash = "sha256:a5b60c71f95bcd2d43d4e9fb3dc3879120c1f60472bb5ce19f7a860b1d44f607", size = 106368, upload-time = "2025-07-15T10:29:10.563Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/98/87b5946356095738cb90a6df7b35ff69ac5750f6e783d5fbcc5cb3b6cbd7/etils-1.13.0-py3-none-any.whl", hash = "sha256:d9cd4f40fbe77ad6613b7348a18132cc511237b6c076dbb89105c0b520a4c6bb", size = 170603 }, + { url = "https://files.pythonhosted.org/packages/e7/98/87b5946356095738cb90a6df7b35ff69ac5750f6e783d5fbcc5cb3b6cbd7/etils-1.13.0-py3-none-any.whl", hash = "sha256:d9cd4f40fbe77ad6613b7348a18132cc511237b6c076dbb89105c0b520a4c6bb", size = 170603, upload-time = "2025-07-15T10:29:09.076Z" }, ] [package.optional-dependencies] @@ -175,18 +175,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371 } +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740 }, + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, ] [[package]] name = "farama-notifications" version = "0.0.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2e/2c/8384832b7a6b1fd6ba95bbdcae26e7137bb3eedc955c42fd5cdcc086cfbf/Farama-Notifications-0.0.4.tar.gz", hash = "sha256:13fceff2d14314cf80703c8266462ebf3733c7d165336eee998fc58e545efd18", size = 2131 } +sdist = { url = "https://files.pythonhosted.org/packages/2e/2c/8384832b7a6b1fd6ba95bbdcae26e7137bb3eedc955c42fd5cdcc086cfbf/Farama-Notifications-0.0.4.tar.gz", hash = "sha256:13fceff2d14314cf80703c8266462ebf3733c7d165336eee998fc58e545efd18", size = 2131, upload-time = "2023-02-27T18:28:41.047Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/2c/ffc08c54c05cdce6fbed2aeebc46348dbe180c6d2c541c7af7ba0aa5f5f8/Farama_Notifications-0.0.4-py3-none-any.whl", hash = "sha256:14de931035a41961f7c056361dc7f980762a143d05791ef5794a751a2caf05ae", size = 2511 }, + { url = "https://files.pythonhosted.org/packages/05/2c/ffc08c54c05cdce6fbed2aeebc46348dbe180c6d2c541c7af7ba0aa5f5f8/Farama_Notifications-0.0.4-py3-none-any.whl", hash = "sha256:14de931035a41961f7c056361dc7f980762a143d05791ef5794a751a2caf05ae", size = 2511, upload-time = "2023-02-27T18:28:39.447Z" }, ] [[package]] @@ -200,10 +200,11 @@ wheels = [ [[package]] name = "flatbuffers" -version = "25.12.19" +version = "25.9.23" source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/1f/3ee70b0a55137442038f2a33469cc5fddd7e0ad2abf83d7497c18a2b6923/flatbuffers-25.9.23.tar.gz", hash = "sha256:676f9fa62750bb50cf531b42a0a2a118ad8f7f797a511eda12881c016f093b12", size = 22067, upload-time = "2025-09-24T05:25:30.106Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl", hash = "sha256:7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4", size = 26661 }, + { url = "https://files.pythonhosted.org/packages/ee/1b/00a78aa2e8fbd63f9af08c9c19e6deb3d5d66b4dda677a0f61654680ee89/flatbuffers-25.9.23-py2.py3-none-any.whl", hash = "sha256:255538574d6cb6d0a79a17ec8bc0d30985913b87513a01cce8bcdb6b4c44d0e2", size = 30869, upload-time = "2025-09-24T05:25:28.912Z" }, ] [[package]] @@ -221,27 +222,51 @@ dependencies = [ { name = "treescope" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/45/5d/6fa18b5dcb737f0c454ad3c116c4faebbb51f164d81109255391a0462c5e/flax-0.10.4.tar.gz", hash = "sha256:57ae44d3f111fc85cff9049adb9684ce8ebd44e87bd8ca776ed52422c2d85021", size = 5179580 } +sdist = { url = "https://files.pythonhosted.org/packages/45/5d/6fa18b5dcb737f0c454ad3c116c4faebbb51f164d81109255391a0462c5e/flax-0.10.4.tar.gz", hash = "sha256:57ae44d3f111fc85cff9049adb9684ce8ebd44e87bd8ca776ed52422c2d85021", size = 5179580, upload-time = "2025-02-27T00:11:00.913Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/d3/c2de519b6b1f0292727406c5c12964fbe0f46bdbdbf92857716e358f1df3/flax-0.10.4-py3-none-any.whl", hash = "sha256:8cc83d91654ff943909730e02e858b4cd4577531373f83abe6597c58c581032d", size = 451817 }, + { url = "https://files.pythonhosted.org/packages/02/d3/c2de519b6b1f0292727406c5c12964fbe0f46bdbdbf92857716e358f1df3/flax-0.10.4-py3-none-any.whl", hash = "sha256:8cc83d91654ff943909730e02e858b4cd4577531373f83abe6597c58c581032d", size = 451817, upload-time = "2025-02-27T00:10:58.636Z" }, ] [[package]] name = "fsspec" -version = "2025.12.0" +version = "2025.10.0" source = { registry = "https://download.pytorch.org/whl/cu128" } -sdist = { url = "https://files.pythonhosted.org/packages/b6/27/954057b0d1f53f086f681755207dda6de6c660ce133c829158e8e8fe7895/fsspec-2025.12.0.tar.gz", hash = "sha256:c505de011584597b1060ff778bb664c1bc022e87921b0e4f10cc9c44f9635973" } +sdist = { url = "https://files.pythonhosted.org/packages/24/7f/2747c0d332b9acfa75dc84447a066fdf812b5a6b8d30472b74d309bfe8cb/fsspec-2025.10.0.tar.gz", hash = "sha256:b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/c7/b64cae5dba3a1b138d7123ec36bb5ccd39d39939f18454407e5468f4763f/fsspec-2025.12.0-py3-none-any.whl", hash = "sha256:8bf1fe301b7d8acfa6e8571e3b1c3d158f909666642431cc78a1b7b4dbc5ec5b" }, + { url = "https://files.pythonhosted.org/packages/eb/02/a6b21098b1d5d6249b7c5ab69dde30108a71e4e819d4a9778f1de1d5b70d/fsspec-2025.10.0-py3-none-any.whl", hash = "sha256:7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d" }, ] [[package]] name = "gast" -version = "0.7.0" +version = "0.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/91/f6/e73969782a2ecec280f8a176f2476149dd9dba69d5f8779ec6108a7721e6/gast-0.7.0.tar.gz", hash = "sha256:0bb14cd1b806722e91ddbab6fb86bba148c22b40e7ff11e248974e04c8adfdae", size = 33630 } +sdist = { url = "https://files.pythonhosted.org/packages/3c/14/c566f5ca00c115db7725263408ff952b8ae6d6a4e792ef9c84e77d9af7a1/gast-0.6.0.tar.gz", hash = "sha256:88fc5300d32c7ac6ca7b515310862f71e6fdf2c029bbec7c66c0f5dd47b6b1fb", size = 27708, upload-time = "2024-06-27T20:31:49.527Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/33/f1c6a276de27b7d7339a34749cc33fa87f077f921969c47185d34a887ae2/gast-0.7.0-py3-none-any.whl", hash = "sha256:99cbf1365633a74099f69c59bd650476b96baa5ef196fec88032b00b31ba36f7", size = 22966 }, + { url = "https://files.pythonhosted.org/packages/a3/61/8001b38461d751cd1a0c3a6ae84346796a5758123f3ed97a1b121dfbf4f3/gast-0.6.0-py3-none-any.whl", hash = "sha256:52b182313f7330389f72b069ba00f174cfe2a06411099547288839c6cbafbd54", size = 21173, upload-time = "2024-07-09T13:15:15.615Z" }, +] + +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, +] + +[[package]] +name = "gitpython" +version = "3.1.46" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/b5/59d16470a1f0dfe8c793f9ef56fd3826093fc52b3bd96d6b9d6c26c7e27b/gitpython-3.1.46.tar.gz", hash = "sha256:400124c7d0ef4ea03f7310ac2fbf7151e09ff97f2a3288d64a440c584a29c37f", size = 215371, upload-time = "2026-01-01T15:37:32.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl", hash = "sha256:79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058", size = 208620, upload-time = "2026-01-01T15:37:30.574Z" }, ] [[package]] @@ -251,30 +276,30 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/35/4a/0bd53b36ff0323d10d5f24ebd67af2de10a1117f5cf4d7add90df92756f1/google-pasta-0.2.0.tar.gz", hash = "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e", size = 40430 } +sdist = { url = "https://files.pythonhosted.org/packages/35/4a/0bd53b36ff0323d10d5f24ebd67af2de10a1117f5cf4d7add90df92756f1/google-pasta-0.2.0.tar.gz", hash = "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e", size = 40430, upload-time = "2020-03-13T18:57:50.34Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl", hash = "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed", size = 57471 }, + { url = "https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl", hash = "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed", size = 57471, upload-time = "2020-03-13T18:57:48.872Z" }, ] [[package]] name = "grpcio" -version = "1.78.0" +version = "1.76.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/06/8a/3d098f35c143a89520e568e6539cc098fcd294495910e359889ce8741c84/grpcio-1.78.0.tar.gz", hash = "sha256:7382b95189546f375c174f53a5fa873cef91c4b8005faa05cc5b3beea9c4f1c5", size = 12852416 } +sdist = { url = "https://files.pythonhosted.org/packages/b6/e0/318c1ce3ae5a17894d5791e87aea147587c9e702f24122cc7a5c8bbaeeb1/grpcio-1.76.0.tar.gz", hash = "sha256:7be78388d6da1a25c0d5ec506523db58b18be22d9c37d8d3a32c08be4987bd73", size = 12785182, upload-time = "2025-10-21T16:23:12.106Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/a8/690a085b4d1fe066130de97a87de32c45062cf2ecd218df9675add895550/grpcio-1.78.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:7cc47943d524ee0096f973e1081cb8f4f17a4615f2116882a5f1416e4cfe92b5", size = 5946986 }, - { url = "https://files.pythonhosted.org/packages/c7/1b/e5213c5c0ced9d2d92778d30529ad5bb2dcfb6c48c4e2d01b1f302d33d64/grpcio-1.78.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:c3f293fdc675ccba4db5a561048cca627b5e7bd1c8a6973ffedabe7d116e22e2", size = 11816533 }, - { url = "https://files.pythonhosted.org/packages/18/37/1ba32dccf0a324cc5ace744c44331e300b000a924bf14840f948c559ede7/grpcio-1.78.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:10a9a644b5dd5aec3b82b5b0b90d41c0fa94c85ef42cb42cf78a23291ddb5e7d", size = 6519964 }, - { url = "https://files.pythonhosted.org/packages/ed/f5/c0e178721b818072f2e8b6fde13faaba942406c634009caf065121ce246b/grpcio-1.78.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4c5533d03a6cbd7f56acfc9cfb44ea64f63d29091e40e44010d34178d392d7eb", size = 7198058 }, - { url = "https://files.pythonhosted.org/packages/5b/b2/40d43c91ae9cd667edc960135f9f08e58faa1576dc95af29f66ec912985f/grpcio-1.78.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ff870aebe9a93a85283837801d35cd5f8814fe2ad01e606861a7fb47c762a2b7", size = 6727212 }, - { url = "https://files.pythonhosted.org/packages/ed/88/9da42eed498f0efcfcd9156e48ae63c0cde3bea398a16c99fb5198c885b6/grpcio-1.78.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:391e93548644e6b2726f1bb84ed60048d4bcc424ce5e4af0843d28ca0b754fec", size = 7300845 }, - { url = "https://files.pythonhosted.org/packages/23/3f/1c66b7b1b19a8828890e37868411a6e6925df5a9030bfa87ab318f34095d/grpcio-1.78.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:df2c8f3141f7cbd112a6ebbd760290b5849cda01884554f7c67acc14e7b1758a", size = 8284605 }, - { url = "https://files.pythonhosted.org/packages/94/c4/ca1bd87394f7b033e88525384b4d1e269e8424ab441ea2fba1a0c5b50986/grpcio-1.78.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd8cb8026e5f5b50498a3c4f196f57f9db344dad829ffae16b82e4fdbaea2813", size = 7726672 }, - { url = "https://files.pythonhosted.org/packages/41/09/f16e487d4cc65ccaf670f6ebdd1a17566b965c74fc3d93999d3b2821e052/grpcio-1.78.0-cp310-cp310-win32.whl", hash = "sha256:f8dff3d9777e5d2703a962ee5c286c239bf0ba173877cc68dc02c17d042e29de", size = 4076715 }, - { url = "https://files.pythonhosted.org/packages/2a/32/4ce60d94e242725fd3bcc5673c04502c82a8e87b21ea411a63992dc39f8f/grpcio-1.78.0-cp310-cp310-win_amd64.whl", hash = "sha256:94f95cf5d532d0e717eed4fc1810e8e6eded04621342ec54c89a7c2f14b581bf", size = 4799157 }, + { url = "https://files.pythonhosted.org/packages/88/17/ff4795dc9a34b6aee6ec379f1b66438a3789cd1315aac0cbab60d92f74b3/grpcio-1.76.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:65a20de41e85648e00305c1bb09a3598f840422e522277641145a32d42dcefcc", size = 5840037, upload-time = "2025-10-21T16:20:25.069Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ff/35f9b96e3fa2f12e1dcd58a4513a2e2294a001d64dec81677361b7040c9a/grpcio-1.76.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:40ad3afe81676fd9ec6d9d406eda00933f218038433980aa19d401490e46ecde", size = 11836482, upload-time = "2025-10-21T16:20:30.113Z" }, + { url = "https://files.pythonhosted.org/packages/3e/1c/8374990f9545e99462caacea5413ed783014b3b66ace49e35c533f07507b/grpcio-1.76.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:035d90bc79eaa4bed83f524331d55e35820725c9fbb00ffa1904d5550ed7ede3", size = 6407178, upload-time = "2025-10-21T16:20:32.733Z" }, + { url = "https://files.pythonhosted.org/packages/1e/77/36fd7d7c75a6c12542c90a6d647a27935a1ecaad03e0ffdb7c42db6b04d2/grpcio-1.76.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4215d3a102bd95e2e11b5395c78562967959824156af11fa93d18fdd18050990", size = 7075684, upload-time = "2025-10-21T16:20:35.435Z" }, + { url = "https://files.pythonhosted.org/packages/38/f7/e3cdb252492278e004722306c5a8935eae91e64ea11f0af3437a7de2e2b7/grpcio-1.76.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:49ce47231818806067aea3324d4bf13825b658ad662d3b25fada0bdad9b8a6af", size = 6611133, upload-time = "2025-10-21T16:20:37.541Z" }, + { url = "https://files.pythonhosted.org/packages/7e/20/340db7af162ccd20a0893b5f3c4a5d676af7b71105517e62279b5b61d95a/grpcio-1.76.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8cc3309d8e08fd79089e13ed4819d0af72aa935dd8f435a195fd152796752ff2", size = 7195507, upload-time = "2025-10-21T16:20:39.643Z" }, + { url = "https://files.pythonhosted.org/packages/10/f0/b2160addc1487bd8fa4810857a27132fb4ce35c1b330c2f3ac45d697b106/grpcio-1.76.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:971fd5a1d6e62e00d945423a567e42eb1fa678ba89072832185ca836a94daaa6", size = 8160651, upload-time = "2025-10-21T16:20:42.492Z" }, + { url = "https://files.pythonhosted.org/packages/2c/2c/ac6f98aa113c6ef111b3f347854e99ebb7fb9d8f7bb3af1491d438f62af4/grpcio-1.76.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d9adda641db7207e800a7f089068f6f645959f2df27e870ee81d44701dd9db3", size = 7620568, upload-time = "2025-10-21T16:20:45.995Z" }, + { url = "https://files.pythonhosted.org/packages/90/84/7852f7e087285e3ac17a2703bc4129fafee52d77c6c82af97d905566857e/grpcio-1.76.0-cp310-cp310-win32.whl", hash = "sha256:063065249d9e7e0782d03d2bca50787f53bd0fb89a67de9a7b521c4a01f1989b", size = 3998879, upload-time = "2025-10-21T16:20:48.592Z" }, + { url = "https://files.pythonhosted.org/packages/10/30/d3d2adcbb6dd3ff59d6ac3df6ef830e02b437fb5c90990429fd180e52f30/grpcio-1.76.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6ae758eb08088d36812dd5d9af7a9859c05b1e0f714470ea243694b49278e7b", size = 4706892, upload-time = "2025-10-21T16:20:50.697Z" }, ] [[package]] @@ -287,9 +312,9 @@ dependencies = [ { name = "numpy" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/90/69/70cd29e9fc4953d013b15981ee71d4c9ef4d8b2183e6ef2fe89756746dce/gymnasium-1.1.1.tar.gz", hash = "sha256:8bd9ea9bdef32c950a444ff36afc785e1d81051ec32d30435058953c20d2456d", size = 829326 } +sdist = { url = "https://files.pythonhosted.org/packages/90/69/70cd29e9fc4953d013b15981ee71d4c9ef4d8b2183e6ef2fe89756746dce/gymnasium-1.1.1.tar.gz", hash = "sha256:8bd9ea9bdef32c950a444ff36afc785e1d81051ec32d30435058953c20d2456d", size = 829326, upload-time = "2025-03-06T16:30:36.428Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/68/2bdc7b46b5f543dd865575f9d19716866bdb76e50dd33b71ed1a3dd8bb42/gymnasium-1.1.1-py3-none-any.whl", hash = "sha256:9c167ec0a2b388666e37f63b2849cd2552f7f5b71938574c637bb36487eb928a", size = 965410 }, + { url = "https://files.pythonhosted.org/packages/f9/68/2bdc7b46b5f543dd865575f9d19716866bdb76e50dd33b71ed1a3dd8bb42/gymnasium-1.1.1-py3-none-any.whl", hash = "sha256:9c167ec0a2b388666e37f63b2849cd2552f7f5b71938574c637bb36487eb928a", size = 965410, upload-time = "2025-03-06T16:30:34.443Z" }, ] [[package]] @@ -299,21 +324,21 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4d/6a/0d79de0b025aa85dc8864de8e97659c94cf3d23148394a954dc5ca52f8c8/h5py-3.15.1.tar.gz", hash = "sha256:c86e3ed45c4473564de55aa83b6fc9e5ead86578773dfbd93047380042e26b69", size = 426236 } +sdist = { url = "https://files.pythonhosted.org/packages/4d/6a/0d79de0b025aa85dc8864de8e97659c94cf3d23148394a954dc5ca52f8c8/h5py-3.15.1.tar.gz", hash = "sha256:c86e3ed45c4473564de55aa83b6fc9e5ead86578773dfbd93047380042e26b69", size = 426236, upload-time = "2025-10-16T10:35:27.404Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/2e/f1bb7de9b05112bfd14d5206090f0f92f1e75bbb412fbec5d4653c3d44dd/h5py-3.15.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c45802bcb711e128a6839cb6c01e9ac648dc55df045c9542a675c771f15c8d5", size = 4523605 }, - { url = "https://files.pythonhosted.org/packages/05/8a/63f4b08f3628171ce8da1a04681a65ee7ac338fde3cb3e9e3c9f7818e4da/h5py-3.15.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64ce3f6470adb87c06e3a8dd1b90e973699f1759ad79bfa70c230939bff356c9", size = 4735346 }, - { url = "https://files.pythonhosted.org/packages/74/48/f16d12d9de22277605bcc11c0dcab5e35f06a54be4798faa2636b5d44b3c/h5py-3.15.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4411c1867b9899a25e983fff56d820a66f52ac326bbe10c7cdf7d832c9dcd883", size = 4175305 }, - { url = "https://files.pythonhosted.org/packages/d6/2f/47cdbff65b2ce53c27458c6df63a232d7bb1644b97df37b2342442342c84/h5py-3.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2cbc4104d3d4aca9d6db8c0c694555e255805bfeacf9eb1349bda871e26cacbe", size = 4653602 }, + { url = "https://files.pythonhosted.org/packages/fc/2e/f1bb7de9b05112bfd14d5206090f0f92f1e75bbb412fbec5d4653c3d44dd/h5py-3.15.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c45802bcb711e128a6839cb6c01e9ac648dc55df045c9542a675c771f15c8d5", size = 4523605, upload-time = "2025-10-16T10:33:31.168Z" }, + { url = "https://files.pythonhosted.org/packages/05/8a/63f4b08f3628171ce8da1a04681a65ee7ac338fde3cb3e9e3c9f7818e4da/h5py-3.15.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64ce3f6470adb87c06e3a8dd1b90e973699f1759ad79bfa70c230939bff356c9", size = 4735346, upload-time = "2025-10-16T10:33:34.759Z" }, + { url = "https://files.pythonhosted.org/packages/74/48/f16d12d9de22277605bcc11c0dcab5e35f06a54be4798faa2636b5d44b3c/h5py-3.15.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4411c1867b9899a25e983fff56d820a66f52ac326bbe10c7cdf7d832c9dcd883", size = 4175305, upload-time = "2025-10-16T10:33:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/47cdbff65b2ce53c27458c6df63a232d7bb1644b97df37b2342442342c84/h5py-3.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2cbc4104d3d4aca9d6db8c0c694555e255805bfeacf9eb1349bda871e26cacbe", size = 4653602, upload-time = "2025-10-16T10:33:42.188Z" }, ] [[package]] name = "humanize" -version = "4.15.0" +version = "4.14.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/66/a3921783d54be8a6870ac4ccffcd15c4dc0dd7fcce51c6d63b8c63935276/humanize-4.15.0.tar.gz", hash = "sha256:1dd098483eb1c7ee8e32eb2e99ad1910baefa4b75c3aff3a82f4d78688993b10", size = 83599 } +sdist = { url = "https://files.pythonhosted.org/packages/b6/43/50033d25ad96a7f3845f40999b4778f753c3901a11808a584fed7c00d9f5/humanize-4.14.0.tar.gz", hash = "sha256:2fa092705ea640d605c435b1ca82b2866a1b601cdf96f076d70b79a855eba90d", size = 82939, upload-time = "2025-10-15T13:04:51.214Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl", hash = "sha256:b1186eb9f5a9749cd9cb8565aee77919dd7c8d076161cf44d70e59e3301e1769", size = 132203 }, + { url = "https://files.pythonhosted.org/packages/c3/5b/9512c5fb6c8218332b530f13500c6ff5f3ce3342f35e0dd7be9ac3856fd3/humanize-4.14.0-py3-none-any.whl", hash = "sha256:d57701248d040ad456092820e6fde56c930f17749956ac47f4f655c0c547bfff", size = 132092, upload-time = "2025-10-15T13:04:49.404Z" }, ] [[package]] @@ -328,27 +353,38 @@ wheels = [ name = "imagesize" version = "1.4.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026 } +sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload-time = "2022-07-01T12:21:05.687Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769 }, + { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload-time = "2022-07-01T12:21:02.467Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "7.1.0" +source = { registry = "https://download.pytorch.org/whl/cu128" } +dependencies = [ + { name = "zipp" }, +] +wheels = [ + { url = "https://download.pytorch.org/whl/importlib_metadata-7.1.0-py3-none-any.whl" }, ] [[package]] name = "importlib-resources" version = "6.5.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693 } +sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693, upload-time = "2025-01-03T18:51:56.698Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461 }, + { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461, upload-time = "2025-01-03T18:51:54.306Z" }, ] [[package]] name = "iniconfig" version = "2.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503 } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484 }, + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] [[package]] @@ -362,9 +398,9 @@ dependencies = [ { name = "opt-einsum" }, { name = "scipy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/19/6a/cacfcdf77841a4562e555ef35e0dbc5f8ca79c9f1010aaa4cf3973e79c69/jax-0.4.34.tar.gz", hash = "sha256:44196854f40c5f9cea3142824b9f1051f85afc3fcf7593ec5479fc8db01c58db", size = 1848472 } +sdist = { url = "https://files.pythonhosted.org/packages/19/6a/cacfcdf77841a4562e555ef35e0dbc5f8ca79c9f1010aaa4cf3973e79c69/jax-0.4.34.tar.gz", hash = "sha256:44196854f40c5f9cea3142824b9f1051f85afc3fcf7593ec5479fc8db01c58db", size = 1848472, upload-time = "2024-10-04T14:37:12.698Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/06/f3/c499d358dd7f267a63d7d38ef54aadad82e28d2c28bafff15360c3091946/jax-0.4.34-py3-none-any.whl", hash = "sha256:b957ca1fc91f7343f91a186af9f19c7f342c946f95a8c11c7f1e5cdfe2e58d9e", size = 2144294 }, + { url = "https://files.pythonhosted.org/packages/06/f3/c499d358dd7f267a63d7d38ef54aadad82e28d2c28bafff15360c3091946/jax-0.4.34-py3-none-any.whl", hash = "sha256:b957ca1fc91f7343f91a186af9f19c7f342c946f95a8c11c7f1e5cdfe2e58d9e", size = 2144294, upload-time = "2024-10-04T14:37:10.265Z" }, ] [package.optional-dependencies] @@ -378,8 +414,8 @@ name = "jax-cuda12-pjrt" version = "0.4.34" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/85/87273c8afc5ce34d338dec6f6e78d058b6354b5df700f8a81e66626bd3cc/jax_cuda12_pjrt-0.4.34-py3-none-manylinux2014_aarch64.whl", hash = "sha256:6247459827550e7d11480f5707d7d2843cbf57bcda5d833565493456075cd143", size = 83805052 }, - { url = "https://files.pythonhosted.org/packages/2c/96/6c7162d57d13bf14cd2e70780c583bf5056e7cbc21a07ade6397ac80b3d4/jax_cuda12_pjrt-0.4.34-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0c7cc98f962cc7fc8e0a5ea6331b42a0cee516f202f1c3019f6aa5cd9530cca0", size = 100255215 }, + { url = "https://files.pythonhosted.org/packages/a2/85/87273c8afc5ce34d338dec6f6e78d058b6354b5df700f8a81e66626bd3cc/jax_cuda12_pjrt-0.4.34-py3-none-manylinux2014_aarch64.whl", hash = "sha256:6247459827550e7d11480f5707d7d2843cbf57bcda5d833565493456075cd143", size = 83805052, upload-time = "2024-10-04T14:39:22.382Z" }, + { url = "https://files.pythonhosted.org/packages/2c/96/6c7162d57d13bf14cd2e70780c583bf5056e7cbc21a07ade6397ac80b3d4/jax_cuda12_pjrt-0.4.34-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0c7cc98f962cc7fc8e0a5ea6331b42a0cee516f202f1c3019f6aa5cd9530cca0", size = 100255215, upload-time = "2024-10-04T14:39:29.397Z" }, ] [[package]] @@ -390,8 +426,8 @@ dependencies = [ { name = "jax-cuda12-pjrt" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/d7/149043aad22811f11ae5339fcfd3ce9176cf00a09cc05d6a0e4d3a3f7e8a/jax_cuda12_plugin-0.4.34-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:1b037a408b9d9de59367c9513a9445b705da526657a0c4d593e84234312261e7", size = 14884290 }, - { url = "https://files.pythonhosted.org/packages/37/b9/0d3bf6bb5909bde61e76e7ce9ee84c30c907e7d2005fb2b41e04c0c09444/jax_cuda12_plugin-0.4.34-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:b2099a4407225122ff76f6dcdc8dbdae47e6f29343bdfd21460ad337dc34a209", size = 14888359 }, + { url = "https://files.pythonhosted.org/packages/0e/d7/149043aad22811f11ae5339fcfd3ce9176cf00a09cc05d6a0e4d3a3f7e8a/jax_cuda12_plugin-0.4.34-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:1b037a408b9d9de59367c9513a9445b705da526657a0c4d593e84234312261e7", size = 14884290, upload-time = "2024-10-04T14:39:36.188Z" }, + { url = "https://files.pythonhosted.org/packages/37/b9/0d3bf6bb5909bde61e76e7ce9ee84c30c907e7d2005fb2b41e04c0c09444/jax_cuda12_plugin-0.4.34-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:b2099a4407225122ff76f6dcdc8dbdae47e6f29343bdfd21460ad337dc34a209", size = 14888359, upload-time = "2024-10-04T14:39:39.239Z" }, ] [package.optional-dependencies] @@ -418,8 +454,8 @@ dependencies = [ { name = "scipy" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/dd/ea/12c836126419ca80248228f2236831617eedb1e3640c34c942606f33bb08/jaxlib-0.4.34-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:3e60bc826933082e99b19b87c21818a8d26fcdb01f418d47cedff554746fd6cc", size = 69391770 }, - { url = "https://files.pythonhosted.org/packages/e4/b0/a5bd34643c070e50829beec217189eab1acdfea334df1f9ddb4e5f8bec0f/jaxlib-0.4.34-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:d840e64b85f8865404d6d225b9bb340e158df1457152a361b05680e24792b232", size = 86094116 }, + { url = "https://files.pythonhosted.org/packages/dd/ea/12c836126419ca80248228f2236831617eedb1e3640c34c942606f33bb08/jaxlib-0.4.34-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:3e60bc826933082e99b19b87c21818a8d26fcdb01f418d47cedff554746fd6cc", size = 69391770, upload-time = "2024-10-04T14:37:38.448Z" }, + { url = "https://files.pythonhosted.org/packages/e4/b0/a5bd34643c070e50829beec217189eab1acdfea334df1f9ddb4e5f8bec0f/jaxlib-0.4.34-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:d840e64b85f8865404d6d225b9bb340e158df1457152a361b05680e24792b232", size = 86094116, upload-time = "2024-10-04T14:37:44.001Z" }, ] [[package]] @@ -433,18 +469,9 @@ wheels = [ { url = "https://download.pytorch.org/whl/jinja2-3.1.6-py3-none-any.whl" }, ] -[[package]] -name = "joblib" -version = "1.5.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071 }, -] - [[package]] name = "keras" -version = "3.12.1" +version = "3.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "absl-py" }, @@ -456,30 +483,30 @@ dependencies = [ { name = "packaging" }, { name = "rich" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/85/1d/b64986120f5de68b921aa9bc2b69cb53ad20c1a6ebe5431a73def28525ef/keras-3.12.1.tar.gz", hash = "sha256:3cb760b3fec105db4d893dd717daafdd0e35457a8201502c1ba8bedfaf334a71", size = 1127003 } +sdist = { url = "https://files.pythonhosted.org/packages/9b/b8/8df141314a64a31d3a21762658826f716cdf4c261c7fcdb3f729958def55/keras-3.12.0.tar.gz", hash = "sha256:536e3f8385a05ae04e82e08715a1a59988578087e187b04cb0a6fad11743f07f", size = 1129187, upload-time = "2025-10-27T20:23:11.574Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/7a/40096b1e1c29ffa830497a80800775ada5ba93f15cd52e0f1a84b4f22cd4/keras-3.12.1-py3-none-any.whl", hash = "sha256:c340f8a25362398b20500c64e290f6ee280c6aeec51e1044eb8d759b32dc272a", size = 1475784 }, + { url = "https://files.pythonhosted.org/packages/ba/61/cc8be27bd65082440754be443b17b6f7c185dec5e00dfdaeab4f8662e4a8/keras-3.12.0-py3-none-any.whl", hash = "sha256:02b69e007d5df8042286c3bcc2a888539e3e487590ffb08f6be1b4354df50aa8", size = 1474424, upload-time = "2025-10-27T20:23:09.571Z" }, ] [[package]] name = "libclang" version = "18.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6e/5c/ca35e19a4f142adffa27e3d652196b7362fa612243e2b916845d801454fc/libclang-18.1.1.tar.gz", hash = "sha256:a1214966d08d73d971287fc3ead8dfaf82eb07fb197680d8b3859dbbbbf78250", size = 39612 } +sdist = { url = "https://files.pythonhosted.org/packages/6e/5c/ca35e19a4f142adffa27e3d652196b7362fa612243e2b916845d801454fc/libclang-18.1.1.tar.gz", hash = "sha256:a1214966d08d73d971287fc3ead8dfaf82eb07fb197680d8b3859dbbbbf78250", size = 39612, upload-time = "2024-03-17T16:04:37.434Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/fc/716c1e62e512ef1c160e7984a73a5fc7df45166f2ff3f254e71c58076f7c/libclang-18.1.1-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:c533091d8a3bbf7460a00cb6c1a71da93bffe148f172c7d03b1c31fbf8aa2a0b", size = 24515943 }, - { url = "https://files.pythonhosted.org/packages/3c/3d/f0ac1150280d8d20d059608cf2d5ff61b7c3b7f7bcf9c0f425ab92df769a/libclang-18.1.1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:54dda940a4a0491a9d1532bf071ea3ef26e6dbaf03b5000ed94dd7174e8f9592", size = 23784972 }, - { url = "https://files.pythonhosted.org/packages/fe/2f/d920822c2b1ce9326a4c78c0c2b4aa3fde610c7ee9f631b600acb5376c26/libclang-18.1.1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:cf4a99b05376513717ab5d82a0db832c56ccea4fd61a69dbb7bccf2dfb207dbe", size = 20259606 }, - { url = "https://files.pythonhosted.org/packages/2d/c2/de1db8c6d413597076a4259cea409b83459b2db997c003578affdd32bf66/libclang-18.1.1-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:69f8eb8f65c279e765ffd28aaa7e9e364c776c17618af8bff22a8df58677ff4f", size = 24921494 }, + { url = "https://files.pythonhosted.org/packages/1d/fc/716c1e62e512ef1c160e7984a73a5fc7df45166f2ff3f254e71c58076f7c/libclang-18.1.1-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:c533091d8a3bbf7460a00cb6c1a71da93bffe148f172c7d03b1c31fbf8aa2a0b", size = 24515943, upload-time = "2024-03-17T16:03:45.942Z" }, + { url = "https://files.pythonhosted.org/packages/3c/3d/f0ac1150280d8d20d059608cf2d5ff61b7c3b7f7bcf9c0f425ab92df769a/libclang-18.1.1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:54dda940a4a0491a9d1532bf071ea3ef26e6dbaf03b5000ed94dd7174e8f9592", size = 23784972, upload-time = "2024-03-17T16:12:47.677Z" }, + { url = "https://files.pythonhosted.org/packages/fe/2f/d920822c2b1ce9326a4c78c0c2b4aa3fde610c7ee9f631b600acb5376c26/libclang-18.1.1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:cf4a99b05376513717ab5d82a0db832c56ccea4fd61a69dbb7bccf2dfb207dbe", size = 20259606, upload-time = "2024-03-17T16:17:42.437Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c2/de1db8c6d413597076a4259cea409b83459b2db997c003578affdd32bf66/libclang-18.1.1-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:69f8eb8f65c279e765ffd28aaa7e9e364c776c17618af8bff22a8df58677ff4f", size = 24921494, upload-time = "2024-03-17T16:14:20.132Z" }, ] [[package]] name = "markdown" -version = "3.10.2" +version = "3.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805 } +sdist = { url = "https://files.pythonhosted.org/packages/7d/ab/7dd27d9d863b3376fcf23a5a13cb5d024aed1db46f963f1b5735ae43b3be/markdown-3.10.tar.gz", hash = "sha256:37062d4f2aa4b2b6b32aefb80faa300f82cc790cb949a35b8caede34f2b68c0e", size = 364931, upload-time = "2025-11-03T19:51:15.007Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180 }, + { url = "https://files.pythonhosted.org/packages/70/81/54e3ce63502cd085a0c556652a4e1b919c45a446bd1e5300e10c44c8c521/markdown-3.10-py3-none-any.whl", hash = "sha256:b5b99d6951e2e4948d939255596523444c0e677c669700b1d17aa4a8a464cb7c", size = 107678, upload-time = "2025-11-03T19:51:13.887Z" }, ] [[package]] @@ -489,23 +516,20 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, ] [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.3" source = { registry = "https://download.pytorch.org/whl/cu128" } -sdist = { url = "https://download.pytorch.org/whl/MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b" } wheels = [ - { url = "https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc" }, - { url = "https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5" }, - { url = "https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46" }, - { url = "https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f" }, - { url = "https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900" }, - { url = "https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp310-cp310-win_amd64.whl" }, ] [[package]] @@ -515,18 +539,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655 } +sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205 }, + { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] [[package]] @@ -536,26 +560,28 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0e/4a/c27b42ed9b1c7d13d9ba8b6905dece787d6259152f2309338aed29b2447b/ml_dtypes-0.5.4.tar.gz", hash = "sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453", size = 692314 } +sdist = { url = "https://files.pythonhosted.org/packages/0e/4a/c27b42ed9b1c7d13d9ba8b6905dece787d6259152f2309338aed29b2447b/ml_dtypes-0.5.4.tar.gz", hash = "sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453", size = 692314, upload-time = "2025-11-17T22:32:31.031Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/79/7433f30ee04bd4faa303844048f55e1eb939131c8e5195a00a96a0939b64/ml_dtypes-0.5.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4b801ebe0b477be666696bda493a9be8356f1f0057a57f1e35cd26928823e5a", size = 5051883 }, - { url = "https://files.pythonhosted.org/packages/10/b1/8938e8830b0ee2e167fc75a094dea766a1152bde46752cd9bfc57ee78a82/ml_dtypes-0.5.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:388d399a2152dd79a3f0456a952284a99ee5c93d3e2f8dfe25977511e0515270", size = 5030369 }, + { url = "https://files.pythonhosted.org/packages/fe/3a/c5b855752a70267ff729c349e650263adb3c206c29d28cc8ea7ace30a1d5/ml_dtypes-0.5.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b95e97e470fe60ed493fd9ae3911d8da4ebac16bd21f87ffa2b7c588bf22ea2c", size = 679735, upload-time = "2025-11-17T22:31:31.367Z" }, + { url = "https://files.pythonhosted.org/packages/41/79/7433f30ee04bd4faa303844048f55e1eb939131c8e5195a00a96a0939b64/ml_dtypes-0.5.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4b801ebe0b477be666696bda493a9be8356f1f0057a57f1e35cd26928823e5a", size = 5051883, upload-time = "2025-11-17T22:31:33.658Z" }, + { url = "https://files.pythonhosted.org/packages/10/b1/8938e8830b0ee2e167fc75a094dea766a1152bde46752cd9bfc57ee78a82/ml_dtypes-0.5.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:388d399a2152dd79a3f0456a952284a99ee5c93d3e2f8dfe25977511e0515270", size = 5030369, upload-time = "2025-11-17T22:31:35.595Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a3/51886727bd16e2f47587997b802dd56398692ce8c6c03c2e5bb32ecafe26/ml_dtypes-0.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:4ff7f3e7ca2972e7de850e7b8fcbb355304271e2933dd90814c1cb847414d6e2", size = 210738, upload-time = "2025-11-17T22:31:37.43Z" }, ] [[package]] name = "motrix-envs" -version = "0.2.0" +version = "0.3.0" source = { editable = "motrix_envs" } dependencies = [ { name = "motrixsim" }, ] [package.metadata] -requires-dist = [{ name = "motrixsim", specifier = ">=0.6.0b1" }] +requires-dist = [{ name = "motrixsim", specifier = ">=0.7.0" }] [[package]] name = "motrix-lab" -version = "0.2.0" +version = "0.3.0" source = { virtual = "." } [package.optional-dependencies] @@ -587,7 +613,7 @@ provides-extras = ["docs"] [[package]] name = "motrix-rl" -version = "0.2.0" +version = "0.3.0" source = { editable = "motrix_rl" } dependencies = [ { name = "gymnasium" }, @@ -596,6 +622,12 @@ dependencies = [ ] [package.optional-dependencies] +rslrl = [ + { name = "rsl-rl-lib" }, + { name = "torch" }, + { name = "torchaudio" }, + { name = "torchvision" }, +] skrl-jax = [ { name = "flax", marker = "sys_platform == 'linux'" }, { name = "jax", extra = ["cuda12"], marker = "sys_platform == 'linux'" }, @@ -620,26 +652,31 @@ requires-dist = [ { name = "motrix-envs", editable = "motrix_envs" }, { name = "pytest", marker = "extra == 'test'", specifier = "~=8.3.3" }, { name = "python-abc", specifier = ">=0.2.0" }, + { name = "rsl-rl-lib", marker = "extra == 'rslrl'", specifier = ">=4.0.0" }, { name = "skrl", marker = "sys_platform == 'linux' and extra == 'skrl-jax'", specifier = "===1.4.3" }, { name = "skrl", marker = "extra == 'skrl-torch'", specifier = "===1.4.3" }, { name = "tensorflow", marker = "sys_platform == 'linux' and extra == 'skrl-jax'", specifier = "===2.20.0" }, + { name = "torch", marker = "extra == 'rslrl'", specifier = "===2.7.0+cu128" }, { name = "torch", marker = "extra == 'skrl-torch'", specifier = "===2.7.0+cu128" }, + { name = "torchaudio", marker = "extra == 'rslrl'", specifier = "===2.7.0+cu128" }, { name = "torchaudio", marker = "extra == 'skrl-torch'", specifier = "===2.7.0+cu128" }, + { name = "torchvision", marker = "extra == 'rslrl'", specifier = "===0.22.0+cu128" }, { name = "torchvision", marker = "extra == 'skrl-torch'", specifier = "===0.22.0+cu128" }, ] -provides-extras = ["skrl-jax", "skrl-torch", "test"] +provides-extras = ["skrl-jax", "skrl-torch", "rslrl", "test"] [[package]] name = "motrixsim" -version = "0.6.0b1" +version = "0.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "absl-py" }, { name = "numpy" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/55/b15321da9cb050125d1fb9a3b8b00ec3d274ee03f20838a54e76264d6f40/motrixsim-0.6.0b1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3bcde4fc9bfa5e2c2b0a7d2ca81741a156b77b4cfe878610b4e5324aaedaa336", size = 47955197 }, - { url = "https://files.pythonhosted.org/packages/2f/cf/dd99f3110806f91a19af2a95b5baff9c79fc36d5f93123788d072e469ac2/motrixsim-0.6.0b1-cp310-cp310-win_amd64.whl", hash = "sha256:740e0b33d4024a0ebbcdfa9797f77d63761c122a47b406f9058181abe1debb6d", size = 35048996 }, + { url = "https://files.pythonhosted.org/packages/cb/2b/69fe9443521a42da9f5973779034c3ee28aa730fe3dd9894118380441a63/motrixsim-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:748017b620147f73ed72c92280882cc368ff91a96975a52813a4111ad702fbce", size = 46057868, upload-time = "2026-04-01T08:21:32.539Z" }, + { url = "https://files.pythonhosted.org/packages/9b/21/fe648f9f4b2bf46cb66171a3abe9ad2e5500b0dfc7889622edce4880f8fb/motrixsim-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:348d558052271213b2dd66ab69c03c0a89e037d0eac603b91e44ec533b3a200f", size = 52020443, upload-time = "2026-04-01T08:20:43.24Z" }, + { url = "https://files.pythonhosted.org/packages/6e/57/6f43ff8eabea2b4a0756064a7b9235301dc5337dfac22a3bb729efd85c87/motrixsim-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:69d1d045826577d387be4bb6e174b1d6c7365e8ad60fe461bfce258445bd578d", size = 37920776, upload-time = "2026-04-01T08:21:23.767Z" }, ] [[package]] @@ -655,12 +692,12 @@ wheels = [ name = "msgpack" version = "1.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581 } +sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload-time = "2025-10-08T09:15:56.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/71/e5/c2241de64bfceac456b140737812a2ab310b10538a7b34a1d393b748e095/msgpack-1.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b696e83c9f1532b4af884045ba7f3aa741a63b2bc22617293a2c6a7c645f251", size = 398240 }, - { url = "https://files.pythonhosted.org/packages/b7/09/2a06956383c0fdebaef5aa9246e2356776f12ea6f2a44bd1368abf0e46c4/msgpack-1.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:365c0bbe981a27d8932da71af63ef86acc59ed5c01ad929e09a0b88c6294e28a", size = 406070 }, - { url = "https://files.pythonhosted.org/packages/0e/74/2957703f0e1ef20637d6aead4fbb314330c26f39aa046b348c7edcf6ca6b/msgpack-1.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41d1a5d875680166d3ac5c38573896453bbbea7092936d2e107214daf43b1d4f", size = 393403 }, - { url = "https://files.pythonhosted.org/packages/a5/09/3bfc12aa90f77b37322fc33e7a8a7c29ba7c8edeadfa27664451801b9860/msgpack-1.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354e81bcdebaab427c3df4281187edc765d5d76bfb3a7c125af9da7a27e8458f", size = 398947 }, + { url = "https://files.pythonhosted.org/packages/71/e5/c2241de64bfceac456b140737812a2ab310b10538a7b34a1d393b748e095/msgpack-1.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b696e83c9f1532b4af884045ba7f3aa741a63b2bc22617293a2c6a7c645f251", size = 398240, upload-time = "2025-10-08T09:14:41.151Z" }, + { url = "https://files.pythonhosted.org/packages/b7/09/2a06956383c0fdebaef5aa9246e2356776f12ea6f2a44bd1368abf0e46c4/msgpack-1.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:365c0bbe981a27d8932da71af63ef86acc59ed5c01ad929e09a0b88c6294e28a", size = 406070, upload-time = "2025-10-08T09:14:42.821Z" }, + { url = "https://files.pythonhosted.org/packages/0e/74/2957703f0e1ef20637d6aead4fbb314330c26f39aa046b348c7edcf6ca6b/msgpack-1.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41d1a5d875680166d3ac5c38573896453bbbea7092936d2e107214daf43b1d4f", size = 393403, upload-time = "2025-10-08T09:14:44.38Z" }, + { url = "https://files.pythonhosted.org/packages/a5/09/3bfc12aa90f77b37322fc33e7a8a7c29ba7c8edeadfa27664451801b9860/msgpack-1.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354e81bcdebaab427c3df4281187edc765d5d76bfb3a7c125af9da7a27e8458f", size = 398947, upload-time = "2025-10-08T09:14:45.56Z" }, ] [[package]] @@ -675,27 +712,27 @@ dependencies = [ { name = "pyyaml" }, { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985 } +sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload-time = "2025-02-12T10:53:03.833Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579 }, + { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload-time = "2025-02-12T10:53:02.078Z" }, ] [[package]] name = "namex" version = "0.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0c/c0/ee95b28f029c73f8d49d8f52edaed02a1d4a9acb8b69355737fdb1faa191/namex-0.1.0.tar.gz", hash = "sha256:117f03ccd302cc48e3f5c58a296838f6b89c83455ab8683a1e85f2a430aa4306", size = 6649 } +sdist = { url = "https://files.pythonhosted.org/packages/0c/c0/ee95b28f029c73f8d49d8f52edaed02a1d4a9acb8b69355737fdb1faa191/namex-0.1.0.tar.gz", hash = "sha256:117f03ccd302cc48e3f5c58a296838f6b89c83455ab8683a1e85f2a430aa4306", size = 6649, upload-time = "2025-05-26T23:17:38.918Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/bc/465daf1de06409cdd4532082806770ee0d8d7df434da79c76564d0f69741/namex-0.1.0-py3-none-any.whl", hash = "sha256:e2012a474502f1e2251267062aae3114611f07df4224b6e06334c57b0f2ce87c", size = 5905 }, + { url = "https://files.pythonhosted.org/packages/b2/bc/465daf1de06409cdd4532082806770ee0d8d7df434da79c76564d0f69741/namex-0.1.0-py3-none-any.whl", hash = "sha256:e2012a474502f1e2251267062aae3114611f07df4224b6e06334c57b0f2ce87c", size = 5905, upload-time = "2025-05-26T23:17:37.695Z" }, ] [[package]] name = "nest-asyncio" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, ] [[package]] @@ -752,8 +789,8 @@ name = "nvidia-cuda-nvcc-cu12" version = "12.9.86" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/48/b54a06168a2190572a312bfe4ce443687773eb61367ced31e064953dd2f7/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:5d6a0d32fdc7ea39917c20065614ae93add6f577d840233237ff08e9a38f58f0", size = 40546229 }, - { url = "https://files.pythonhosted.org/packages/d6/5c/8cc072436787104bbbcbde1f76ab4a0d89e68f7cebc758dd2ad7913a43d0/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:44e1eca4d08926193a558d2434b1bf83d57b4d5743e0c431c0c83d51da1df62b", size = 39411138 }, + { url = "https://files.pythonhosted.org/packages/25/48/b54a06168a2190572a312bfe4ce443687773eb61367ced31e064953dd2f7/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:5d6a0d32fdc7ea39917c20065614ae93add6f577d840233237ff08e9a38f58f0", size = 40546229, upload-time = "2025-06-05T20:01:53.357Z" }, + { url = "https://files.pythonhosted.org/packages/d6/5c/8cc072436787104bbbcbde1f76ab4a0d89e68f7cebc758dd2ad7913a43d0/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:44e1eca4d08926193a558d2434b1bf83d57b4d5743e0c431c0c83d51da1df62b", size = 39411138, upload-time = "2025-06-05T20:01:43.182Z" }, ] [[package]] @@ -873,13 +910,70 @@ wheels = [ { url = "https://pypi.nvidia.com/nvidia-nvtx-cu12/nvidia_nvtx_cu12-12.8.55-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2dd0780f1a55c21d8e06a743de5bd95653de630decfff40621dbde78cc307102" }, ] +[[package]] +name = "onnx" +version = "1.20.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "protobuf" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/8a/335c03a8683a88a32f9a6bb98899ea6df241a41df64b37b9696772414794/onnx-1.20.1.tar.gz", hash = "sha256:ded16de1df563d51fbc1ad885f2a426f814039d8b5f4feb77febe09c0295ad67", size = 12048980, upload-time = "2026-01-10T01:40:03.043Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/cc/4ba3c80cfaffdb541dc5a23eaccb045a627361e94ecaeba30496270f15b3/onnx-1.20.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3fe243e83ad737637af6512708454e720d4b0864def2b28e6b0ee587b80a50be", size = 17904206, upload-time = "2026-01-10T01:38:58.574Z" }, + { url = "https://files.pythonhosted.org/packages/f3/fc/3a1c4ae2cd5cfab2d0ebc1842769b04b417fe13946144a7c8ce470dd9c85/onnx-1.20.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e24e96b48f27e4d6b44cb0b195b367a2665da2d819621eec51903d575fc49d38", size = 17414849, upload-time = "2026-01-10T01:39:01.494Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ab/5017945291b981f2681fb620f2d5b6070e02170c648770711ef1eac79d56/onnx-1.20.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0903e6088ed5e8f59ebd381ab2a6e9b2a60b4c898f79aa2fe76bb79cf38a5031", size = 17513600, upload-time = "2026-01-10T01:39:04.348Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b0/063e79dc365972af876d786bacc6acd8909691af2b9296615ff74ad182f3/onnx-1.20.1-cp310-cp310-win32.whl", hash = "sha256:17483e59082b2ca6cadd2b48fd8dce937e5b2c985ed5583fefc38af928be1826", size = 16239159, upload-time = "2026-01-10T01:39:07.254Z" }, + { url = "https://files.pythonhosted.org/packages/2a/73/a992271eb3683e676239d71b5a78ad3cf4d06d2223c387e701bf305da199/onnx-1.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:e2b0cf797faedfd3b83491dc168ab5f1542511448c65ceb482f20f04420cbf3a", size = 16391718, upload-time = "2026-01-10T01:39:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/7c/4c/4b17e82f91ab9aa07ff595771e935ca73547b035030dc5f5a76e63fbfea9/onnx-1.20.1-cp312-abi3-macosx_12_0_universal2.whl", hash = "sha256:1d923bb4f0ce1b24c6859222a7e6b2f123e7bfe7623683662805f2e7b9e95af2", size = 17903547, upload-time = "2026-01-10T01:39:31.015Z" }, + { url = "https://files.pythonhosted.org/packages/64/5e/1bfa100a9cb3f2d3d5f2f05f52f7e60323b0e20bb0abace1ae64dbc88f25/onnx-1.20.1-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ddc0b7d8b5a94627dc86c533d5e415af94cbfd103019a582669dad1f56d30281", size = 17412021, upload-time = "2026-01-10T01:39:33.885Z" }, + { url = "https://files.pythonhosted.org/packages/fb/71/d3fec0dcf9a7a99e7368112d9c765154e81da70fcba1e3121131a45c245b/onnx-1.20.1-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9336b6b8e6efcf5c490a845f6afd7e041c89a56199aeda384ed7d58fb953b080", size = 17510450, upload-time = "2026-01-10T01:39:36.589Z" }, + { url = "https://files.pythonhosted.org/packages/74/a7/edce1403e05a46e59b502fae8e3350ceeac5841f8e8f1561e98562ed9b09/onnx-1.20.1-cp312-abi3-win32.whl", hash = "sha256:564c35a94811979808ab5800d9eb4f3f32c12daedba7e33ed0845f7c61ef2431", size = 16238216, upload-time = "2026-01-10T01:39:39.46Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c7/8690c81200ae652ac550c1df52f89d7795e6cc941f3cb38c9ef821419e80/onnx-1.20.1-cp312-abi3-win_amd64.whl", hash = "sha256:9fe7f9a633979d50984b94bda8ceb7807403f59a341d09d19342dc544d0ca1d5", size = 16389207, upload-time = "2026-01-10T01:39:41.955Z" }, + { url = "https://files.pythonhosted.org/packages/01/a0/4fb0e6d36eaf079af366b2c1f68bafe92df6db963e2295da84388af64abc/onnx-1.20.1-cp312-abi3-win_arm64.whl", hash = "sha256:21d747348b1c8207406fa2f3e12b82f53e0d5bb3958bcd0288bd27d3cb6ebb00", size = 16344155, upload-time = "2026-01-10T01:39:45.536Z" }, +] + +[[package]] +name = "onnx-ir" +version = "0.1.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "onnx" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d5/19/367df21add30ba9a3e0b183e8327f0424d13e4415450682ef3a7f1a0d163/onnx_ir-0.1.16.tar.gz", hash = "sha256:dda5c90f9d941767d3bba43adca20923b7fc020eee0cbf947b847a21701f93d9", size = 137287, upload-time = "2026-02-09T21:04:23.285Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/b3/80c001c9737a75795e4601bfaf79175ce8f190a14f225b8df03dd4b48ff3/onnx_ir-0.1.16-py3-none-any.whl", hash = "sha256:a8182f2ba716640aafdd10c5c973a02e2a4f7c10ed57b6b000a3be90e9ea6d38", size = 159314, upload-time = "2026-02-09T21:04:21.948Z" }, +] + +[[package]] +name = "onnxscript" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "onnx" }, + { name = "onnx-ir" }, + { name = "packaging" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/ad/43766d44ca704176a793e90fa6aabeeee27832735baeca78b8cdda61ee06/onnxscript-0.6.1.tar.gz", hash = "sha256:c035eeba4b6afbba8a1dbd69ab4a5969647ce25aa3f93d5d7b48497a36501028", size = 590860, upload-time = "2026-02-09T21:43:01.132Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/bd/07e60ec51de60607a70f643039b9de016437b1393ffd431e33490d177d19/onnxscript-0.6.1-py3-none-any.whl", hash = "sha256:16d2a82d356b2d9c9c2fd0a4ef8a4e96210d956081548a1b1a765ab5201728ab", size = 689021, upload-time = "2026-02-09T21:43:02.902Z" }, +] + [[package]] name = "opt-einsum" version = "3.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/b9/2ac072041e899a52f20cf9510850ff58295003aa75525e58343591b0cbfb/opt_einsum-3.4.0.tar.gz", hash = "sha256:96ca72f1b886d148241348783498194c577fa30a8faac108586b14f1ba4473ac", size = 63004 } +sdist = { url = "https://files.pythonhosted.org/packages/8c/b9/2ac072041e899a52f20cf9510850ff58295003aa75525e58343591b0cbfb/opt_einsum-3.4.0.tar.gz", hash = "sha256:96ca72f1b886d148241348783498194c577fa30a8faac108586b14f1ba4473ac", size = 63004, upload-time = "2024-09-26T14:33:24.483Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl", hash = "sha256:69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd", size = 71932 }, + { url = "https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl", hash = "sha256:69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd", size = 71932, upload-time = "2024-09-26T14:33:23.039Z" }, ] [[package]] @@ -893,9 +987,9 @@ dependencies = [ { name = "jaxlib" }, { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/75/1e011953c48be502d4d84fa8458e91be7c6f983002511669bddd7b1a065f/optax-0.2.5.tar.gz", hash = "sha256:b2e38c7aea376186deae758ba7a258e6ef760c6f6131e9e11bc561c65386d594", size = 258548 } +sdist = { url = "https://files.pythonhosted.org/packages/c0/75/1e011953c48be502d4d84fa8458e91be7c6f983002511669bddd7b1a065f/optax-0.2.5.tar.gz", hash = "sha256:b2e38c7aea376186deae758ba7a258e6ef760c6f6131e9e11bc561c65386d594", size = 258548, upload-time = "2025-06-10T17:00:47.544Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/33/f86091c706db1a5459f501830241afff2ecab3532725c188ea57be6e54de/optax-0.2.5-py3-none-any.whl", hash = "sha256:966deae936207f268ac8f564d8ed228d645ac1aaddefbbf194096d2299b24ba8", size = 354324 }, + { url = "https://files.pythonhosted.org/packages/b9/33/f86091c706db1a5459f501830241afff2ecab3532725c188ea57be6e54de/optax-0.2.5-py3-none-any.whl", hash = "sha256:966deae936207f268ac8f564d8ed228d645ac1aaddefbbf194096d2299b24ba8", size = 354324, upload-time = "2025-06-10T17:00:46.062Z" }, ] [[package]] @@ -905,14 +999,14 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/8e/09d899ad531d50b79aa24e7558f604980fe4048350172e643bb1b9983aec/optree-0.18.0.tar.gz", hash = "sha256:3804fb6ddc923855db2dc4805b4524c66e00f1ef30b166be4aadd52822b13e06", size = 165178 } +sdist = { url = "https://files.pythonhosted.org/packages/83/8e/09d899ad531d50b79aa24e7558f604980fe4048350172e643bb1b9983aec/optree-0.18.0.tar.gz", hash = "sha256:3804fb6ddc923855db2dc4805b4524c66e00f1ef30b166be4aadd52822b13e06", size = 165178, upload-time = "2025-11-14T08:58:31.234Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/73/93/463a531b863bffae92d6d1c7857f655234f12ad46fe088bf5bd5cd37cd67/optree-0.18.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e058cc51d9d57b45801060af9f74765b95bedfc59fd6df1c7489ae0825126be5", size = 349724 }, - { url = "https://files.pythonhosted.org/packages/b9/4f/7d54f0eeea24f5893422d65fce835d80e644ebac8a4570d762f994cfe97c/optree-0.18.0-cp310-cp310-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:daab231cf768937ce4675376ea3e214d399116d9867a6737372c31c58630bdfc", size = 404190 }, - { url = "https://files.pythonhosted.org/packages/66/af/044080368dc8ab809c5b089ad3132e7775043c5a8a165465df1f0c99dd62/optree-0.18.0-cp310-cp310-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ea357657143f364a764b63b2b1ce12d77156d48a1f32def990b696d755acb629", size = 401798 }, - { url = "https://files.pythonhosted.org/packages/0b/97/c449712ccb50af3cb2608718e503e31b259aa55de40ee83bebb159b07593/optree-0.18.0-cp310-cp310-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f81f5340c8df50662abaf753ab07095901e40b934efb27da50032a4ae71c5a97", size = 397477 }, - { url = "https://files.pythonhosted.org/packages/66/8e/bdda357f31e2b7c80b61b9785e6dea25e94c01e7237c7a8b1af38f369ee4/optree-0.18.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:66f142c743732cd4e630ea84415f654a00c792793c7f80d4511167f0f89796a6", size = 386631 }, - { url = "https://files.pythonhosted.org/packages/a8/2f/32575d5ac11993c19a6b60f6e15cafcc807adabf92caf06824bc3b5d50f9/optree-0.18.0-cp310-cp310-manylinux_2_39_riscv64.whl", hash = "sha256:55a2ccd121fccc9df961e982db2f4e8f2b4f7015e814ef70b1140514cdffe214", size = 347972 }, + { url = "https://files.pythonhosted.org/packages/73/93/463a531b863bffae92d6d1c7857f655234f12ad46fe088bf5bd5cd37cd67/optree-0.18.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e058cc51d9d57b45801060af9f74765b95bedfc59fd6df1c7489ae0825126be5", size = 349724, upload-time = "2025-11-14T08:56:34.475Z" }, + { url = "https://files.pythonhosted.org/packages/b9/4f/7d54f0eeea24f5893422d65fce835d80e644ebac8a4570d762f994cfe97c/optree-0.18.0-cp310-cp310-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:daab231cf768937ce4675376ea3e214d399116d9867a6737372c31c58630bdfc", size = 404190, upload-time = "2025-11-14T08:56:35.622Z" }, + { url = "https://files.pythonhosted.org/packages/66/af/044080368dc8ab809c5b089ad3132e7775043c5a8a165465df1f0c99dd62/optree-0.18.0-cp310-cp310-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ea357657143f364a764b63b2b1ce12d77156d48a1f32def990b696d755acb629", size = 401798, upload-time = "2025-11-14T08:56:37.001Z" }, + { url = "https://files.pythonhosted.org/packages/0b/97/c449712ccb50af3cb2608718e503e31b259aa55de40ee83bebb159b07593/optree-0.18.0-cp310-cp310-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f81f5340c8df50662abaf753ab07095901e40b934efb27da50032a4ae71c5a97", size = 397477, upload-time = "2025-11-14T08:56:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/66/8e/bdda357f31e2b7c80b61b9785e6dea25e94c01e7237c7a8b1af38f369ee4/optree-0.18.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:66f142c743732cd4e630ea84415f654a00c792793c7f80d4511167f0f89796a6", size = 386631, upload-time = "2025-11-14T08:56:39.707Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2f/32575d5ac11993c19a6b60f6e15cafcc807adabf92caf06824bc3b5d50f9/optree-0.18.0-cp310-cp310-manylinux_2_39_riscv64.whl", hash = "sha256:55a2ccd121fccc9df961e982db2f4e8f2b4f7015e814ef70b1140514cdffe214", size = 347972, upload-time = "2025-11-14T08:56:40.656Z" }, ] [[package]] @@ -933,9 +1027,30 @@ dependencies = [ { name = "tensorstore" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7e/b4/262439a3fe00064b53a5182c0149447304f5a2d5a328a92d64390c18d189/orbax_checkpoint-0.11.5.tar.gz", hash = "sha256:8331ff594980a241ba43eb59dd683e5b590b339cff32a7b72d78cb5a350030b4", size = 249258 } +sdist = { url = "https://files.pythonhosted.org/packages/7e/b4/262439a3fe00064b53a5182c0149447304f5a2d5a328a92d64390c18d189/orbax_checkpoint-0.11.5.tar.gz", hash = "sha256:8331ff594980a241ba43eb59dd683e5b590b339cff32a7b72d78cb5a350030b4", size = 249258, upload-time = "2025-02-11T19:33:45.364Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/80/e659696b5b1c2ced427efedd2d9d29c1bc31d841ac8a031215aa38f6b2ae/orbax_checkpoint-0.11.5-py3-none-any.whl", hash = "sha256:b55a7a254ea0ab18237e8234a6ca8bf5522f589fcc2ac698cf6893d5e7ae3500", size = 342800 }, + { url = "https://files.pythonhosted.org/packages/66/80/e659696b5b1c2ced427efedd2d9d29c1bc31d841ac8a031215aa38f6b2ae/orbax_checkpoint-0.11.5-py3-none-any.whl", hash = "sha256:b55a7a254ea0ab18237e8234a6ca8bf5522f589fcc2ac698cf6893d5e7ae3500", size = 342800, upload-time = "2025-02-11T19:33:43.507Z" }, +] + +[[package]] +name = "orjson" +version = "3.11.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/45/b268004f745ede84e5798b48ee12b05129d19235d0e15267aa57dcdb400b/orjson-3.11.7.tar.gz", hash = "sha256:9b1a67243945819ce55d24a30b59d6a168e86220452d2c96f4d1f093e71c0c49", size = 6144992, upload-time = "2026-02-02T15:38:49.29Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/1a/a373746fa6d0e116dd9e54371a7b54622c44d12296d5d0f3ad5e3ff33490/orjson-3.11.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a02c833f38f36546ba65a452127633afce4cf0dd7296b753d3bb54e55e5c0174", size = 229140, upload-time = "2026-02-02T15:37:06.082Z" }, + { url = "https://files.pythonhosted.org/packages/52/a2/fa129e749d500f9b183e8a3446a193818a25f60261e9ce143ad61e975208/orjson-3.11.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63c6e6738d7c3470ad01601e23376aa511e50e1f3931395b9f9c722406d1a67", size = 128670, upload-time = "2026-02-02T15:37:08.002Z" }, + { url = "https://files.pythonhosted.org/packages/08/93/1e82011cd1e0bd051ef9d35bed1aa7fb4ea1f0a055dc2c841b46b43a9ebd/orjson-3.11.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:043d3006b7d32c7e233b8cfb1f01c651013ea079e08dcef7189a29abd8befe11", size = 123832, upload-time = "2026-02-02T15:37:09.191Z" }, + { url = "https://files.pythonhosted.org/packages/fe/d8/a26b431ef962c7d55736674dddade876822f3e33223c1f47a36879350d04/orjson-3.11.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57036b27ac8a25d81112eb0cc9835cd4833c5b16e1467816adc0015f59e870dc", size = 129171, upload-time = "2026-02-02T15:37:11.112Z" }, + { url = "https://files.pythonhosted.org/packages/a7/19/f47819b84a580f490da260c3ee9ade214cf4cf78ac9ce8c1c758f80fdfc9/orjson-3.11.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:733ae23ada68b804b222c44affed76b39e30806d38660bf1eb200520d259cc16", size = 141967, upload-time = "2026-02-02T15:37:12.282Z" }, + { url = "https://files.pythonhosted.org/packages/5b/cd/37ece39a0777ba077fdcdbe4cccae3be8ed00290c14bf8afdc548befc260/orjson-3.11.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5fdfad2093bdd08245f2e204d977facd5f871c88c4a71230d5bcbd0e43bf6222", size = 130991, upload-time = "2026-02-02T15:37:13.465Z" }, + { url = "https://files.pythonhosted.org/packages/8f/ed/f2b5d66aa9b6b5c02ff5f120efc7b38c7c4962b21e6be0f00fd99a5c348e/orjson-3.11.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cededd6738e1c153530793998e31c05086582b08315db48ab66649768f326baa", size = 133674, upload-time = "2026-02-02T15:37:14.694Z" }, + { url = "https://files.pythonhosted.org/packages/c4/6e/baa83e68d1aa09fa8c3e5b2c087d01d0a0bd45256de719ed7bc22c07052d/orjson-3.11.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:14f440c7268c8f8633d1b3d443a434bd70cb15686117ea6beff8fdc8f5917a1e", size = 138722, upload-time = "2026-02-02T15:37:16.501Z" }, + { url = "https://files.pythonhosted.org/packages/0c/47/7f8ef4963b772cd56999b535e553f7eb5cd27e9dd6c049baee6f18bfa05d/orjson-3.11.7-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:3a2479753bbb95b0ebcf7969f562cdb9668e6d12416a35b0dda79febf89cdea2", size = 409056, upload-time = "2026-02-02T15:37:17.895Z" }, + { url = "https://files.pythonhosted.org/packages/38/eb/2df104dd2244b3618f25325a656f85cc3277f74bbd91224752410a78f3c7/orjson-3.11.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:71924496986275a737f38e3f22b4e0878882b3f7a310d2ff4dc96e812789120c", size = 144196, upload-time = "2026-02-02T15:37:19.349Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2a/ee41de0aa3a6686598661eae2b4ebdff1340c65bfb17fcff8b87138aab21/orjson-3.11.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4a9eefdc70bf8bf9857f0290f973dec534ac84c35cd6a7f4083be43e7170a8f", size = 134979, upload-time = "2026-02-02T15:37:20.906Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fa/92fc5d3d402b87a8b28277a9ed35386218a6a5287c7fe5ee9b9f02c53fb2/orjson-3.11.7-cp310-cp310-win32.whl", hash = "sha256:ae9e0b37a834cef7ce8f99de6498f8fad4a2c0bf6bfc3d02abd8ed56aa15b2de", size = 127968, upload-time = "2026-02-02T15:37:23.178Z" }, + { url = "https://files.pythonhosted.org/packages/07/29/a576bf36d73d60df06904d3844a9df08e25d59eba64363aaf8ec2f9bff41/orjson-3.11.7-cp310-cp310-win_amd64.whl", hash = "sha256:d772afdb22555f0c58cfc741bdae44180122b3616faa1ecadb595cd526e4c993", size = 125128, upload-time = "2026-02-02T15:37:24.329Z" }, ] [[package]] @@ -969,24 +1084,24 @@ wheels = [ name = "pluggy" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] [[package]] name = "protobuf" -version = "7.34.0rc2" +version = "6.33.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cb/3d/5df238df33cd0360db3eac7df05c0c1cb4cdf2d3eab1820b577f2bd19359/protobuf-7.34.0rc2.tar.gz", hash = "sha256:3a031d0653c173c42719b61595448eb0f4f1dfe7bd11bd680f589b6fe6cc908f", size = 454758 } +sdist = { url = "https://files.pythonhosted.org/packages/0a/03/a1440979a3f74f16cab3b75b0da1a1a7f922d56a8ddea96092391998edc0/protobuf-6.33.1.tar.gz", hash = "sha256:97f65757e8d09870de6fd973aeddb92f85435607235d20b2dfed93405d00c85b", size = 443432, upload-time = "2025-11-13T16:44:18.895Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/88/fd12386b07bdd1a6fdc4e74624b02adc8ea21621522d6b982deb43c13395/protobuf-7.34.0rc2-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:d8fca27e0727148ac1bf15a204c42994ccb3021fe2ee3a68328e5451b7aa75b9", size = 429269 }, - { url = "https://files.pythonhosted.org/packages/e9/cd/00ee5d482aede27fbf6fbe39937a4e000b3210f84cbfb8c4a18ae3f3c47f/protobuf-7.34.0rc2-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:6147669c0185c62d0df905452dc5a9369c8ba693762a3a59b7fcaa77df50a5ec", size = 325819 }, - { url = "https://files.pythonhosted.org/packages/81/11/f3982c401304eff5724a3be6ed34c8aa6f45c5776966983f6ccc1ed09d08/protobuf-7.34.0rc2-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:f4e8cd647b2c589556abb542a947b30f4d0913cd65b942ec56b65784ed5d2918", size = 340247 }, - { url = "https://files.pythonhosted.org/packages/82/a3/5b545fd90b2c4aaf1530f3696f2121c6e3001f084875e0a5338d24b11e5a/protobuf-7.34.0rc2-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:ae323c21e00c96c1b46c35e8c7cef5ed11adc211e2a286a04336c9dec55a3bee", size = 324302 }, - { url = "https://files.pythonhosted.org/packages/da/1c/280e71d494d70763c5770f5fcd4d5bb7274021a5e47ce78ee53bc661c650/protobuf-7.34.0rc2-cp310-abi3-win32.whl", hash = "sha256:64e9215e8abf419b75c09eb8e619eff58373d2cc7e68a41703f8bd9e3fe0f099", size = 426729 }, - { url = "https://files.pythonhosted.org/packages/ac/09/e84ba89a9408ef5da4651c6e920c0a60bd2273a3a76a3c945595a7baa37d/protobuf-7.34.0rc2-cp310-abi3-win_amd64.whl", hash = "sha256:d50f63454f324a902b74eaa0171ff48a2815dac198b9efdbf92f4d8f24cbe031", size = 437967 }, - { url = "https://files.pythonhosted.org/packages/c8/ae/2f946219574f7d5d62484a5899004b0bd49275f667fc0fb28b2282085243/protobuf-7.34.0rc2-py3-none-any.whl", hash = "sha256:81418bcf285231aeebf541938d798000899550f6d7d3fa15e956717a3ee549b2", size = 170818 }, + { url = "https://files.pythonhosted.org/packages/06/f1/446a9bbd2c60772ca36556bac8bfde40eceb28d9cc7838755bc41e001d8f/protobuf-6.33.1-cp310-abi3-win32.whl", hash = "sha256:f8d3fdbc966aaab1d05046d0240dd94d40f2a8c62856d41eaa141ff64a79de6b", size = 425593, upload-time = "2025-11-13T16:44:06.275Z" }, + { url = "https://files.pythonhosted.org/packages/a6/79/8780a378c650e3df849b73de8b13cf5412f521ca2ff9b78a45c247029440/protobuf-6.33.1-cp310-abi3-win_amd64.whl", hash = "sha256:923aa6d27a92bf44394f6abf7ea0500f38769d4b07f4be41cb52bd8b1123b9ed", size = 436883, upload-time = "2025-11-13T16:44:09.222Z" }, + { url = "https://files.pythonhosted.org/packages/cd/93/26213ff72b103ae55bb0d73e7fb91ea570ef407c3ab4fd2f1f27cac16044/protobuf-6.33.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:fe34575f2bdde76ac429ec7b570235bf0c788883e70aee90068e9981806f2490", size = 427522, upload-time = "2025-11-13T16:44:10.475Z" }, + { url = "https://files.pythonhosted.org/packages/c2/32/df4a35247923393aa6b887c3b3244a8c941c32a25681775f96e2b418f90e/protobuf-6.33.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:f8adba2e44cde2d7618996b3fc02341f03f5bc3f2748be72dc7b063319276178", size = 324445, upload-time = "2025-11-13T16:44:11.869Z" }, + { url = "https://files.pythonhosted.org/packages/8e/d0/d796e419e2ec93d2f3fa44888861c3f88f722cde02b7c3488fcc6a166820/protobuf-6.33.1-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:0f4cf01222c0d959c2b399142deb526de420be8236f22c71356e2a544e153c53", size = 339161, upload-time = "2025-11-13T16:44:12.778Z" }, + { url = "https://files.pythonhosted.org/packages/1d/2a/3c5f05a4af06649547027d288747f68525755de692a26a7720dced3652c0/protobuf-6.33.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:8fd7d5e0eb08cd5b87fd3df49bc193f5cfd778701f47e11d127d0afc6c39f1d1", size = 323171, upload-time = "2025-11-13T16:44:14.035Z" }, + { url = "https://files.pythonhosted.org/packages/08/b4/46310463b4f6ceef310f8348786f3cff181cea671578e3d9743ba61a459e/protobuf-6.33.1-py3-none-any.whl", hash = "sha256:d595a9fd694fdeb061a62fbe10eb039cc1e444df81ec9bb70c7fc59ebcb1eafa", size = 170477, upload-time = "2025-11-13T16:44:17.633Z" }, ] [[package]] @@ -1002,18 +1117,18 @@ dependencies = [ { name = "sphinx" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/20/bb50f9de3a6de69e6abd6b087b52fa2418a0418b19597601605f855ad044/pydata_sphinx_theme-0.16.1.tar.gz", hash = "sha256:a08b7f0b7f70387219dc659bff0893a7554d5eb39b59d3b8ef37b8401b7642d7", size = 2412693 } +sdist = { url = "https://files.pythonhosted.org/packages/00/20/bb50f9de3a6de69e6abd6b087b52fa2418a0418b19597601605f855ad044/pydata_sphinx_theme-0.16.1.tar.gz", hash = "sha256:a08b7f0b7f70387219dc659bff0893a7554d5eb39b59d3b8ef37b8401b7642d7", size = 2412693, upload-time = "2024-12-17T10:53:39.537Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl", hash = "sha256:225331e8ac4b32682c18fcac5a57a6f717c4e632cea5dd0e247b55155faeccde", size = 6723264 }, + { url = "https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl", hash = "sha256:225331e8ac4b32682c18fcac5a57a6f717c4e632cea5dd0e247b55155faeccde", size = 6723264, upload-time = "2024-12-17T10:53:35.645Z" }, ] [[package]] name = "pygments" version = "2.19.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631 } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 }, + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] [[package]] @@ -1028,38 +1143,41 @@ dependencies = [ { name = "pluggy" }, { name = "tomli" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891 } +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 }, + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, ] [[package]] name = "python-abc" -version = "0.3.0" +version = "0.2.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "joblib" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f7/3d/95cd3d0eacbd9a7e1b050dd735d770c9647479ae6c0bc8c52292b4ca1357/python_abc-0.3.0.tar.gz", hash = "sha256:7bb44833912e34d097074977a642a1187b0e5d4d6be39a7f5cd042e31a5edcbe", size = 14267 } +sdist = { url = "https://files.pythonhosted.org/packages/17/e3/5973ccea7302dfe994331e2824bfc8cc4e4c8ba7f0b9d1f16bcda5ef26a3/python-abc-0.2.0.tar.gz", hash = "sha256:90017d09fbac7bde4b64b2c7e1b5d22da9055b64b821d1a2b4dc805b450b251a", size = 7423, upload-time = "2022-06-26T21:36:06.156Z" } + +[[package]] +name = "pyvers" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/32/99/23c73a1298b1c642d8ebdd78e1db4daf1e474152e6839df4f5c93357a3db/pyvers-0.2.2.tar.gz", hash = "sha256:205026bcd0b4c09198cb3a32f243fd179ef012882ce16d93dcb755320acd56f7", size = 12104, upload-time = "2026-01-23T14:12:07.619Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/e6/37877e2545db0e55d0530dee4e5c79d645756398b846d7306e2c2080ba88/python_abc-0.3.0-py3-none-any.whl", hash = "sha256:ba6c8133da022e2632bfa7b84069a17c4a9f35fb2dee5f082c270a88e3f147e6", size = 8894 }, + { url = "https://files.pythonhosted.org/packages/36/bf/ea840f706b7824dd57220484465995309c8c217995ddb7ce4b262240e912/pyvers-0.2.2-py3-none-any.whl", hash = "sha256:c4696408a0b15fbaa90df33d3bc579cf23a74a73541858f5470216f12f51f3b1", size = 11569, upload-time = "2026-01-23T14:12:06.246Z" }, ] [[package]] name = "pyyaml" version = "6.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960 } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227 }, - { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019 }, - { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646 }, - { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793 }, - { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293 }, - { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872 }, - { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828 }, - { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415 }, - { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561 }, + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, ] [[package]] @@ -1078,15 +1196,33 @@ wheels = [ [[package]] name = "rich" -version = "14.3.2" +version = "14.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/99/a4cab2acbb884f80e558b0771e97e21e939c5dfb460f488d19df485e8298/rich-14.3.2.tar.gz", hash = "sha256:e712f11c1a562a11843306f5ed999475f09ac31ffb64281f73ab29ffdda8b3b8", size = 230143 } +sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/45/615f5babd880b4bd7d405cc0dc348234c5ffb6ed1ea33e152ede08b2072d/rich-14.3.2-py3-none-any.whl", hash = "sha256:08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69", size = 309963 }, + { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, +] + +[[package]] +name = "rsl-rl-lib" +version = "4.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitpython" }, + { name = "numpy" }, + { name = "onnx" }, + { name = "onnxscript" }, + { name = "tensordict" }, + { name = "torch" }, + { name = "torchvision" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/5b/5bea7c110c389f9336ebe5ad7cd9abbcbbb64d7de0d0f50c2af8fa2ce321/rsl_rl_lib-4.0.1.tar.gz", hash = "sha256:76a194e4834946716cc0e44dcd2be8b2254ac969c2452b145cd268c9cc908bf7", size = 41069, upload-time = "2026-02-09T09:15:10.927Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/db/8fa8832e6e02e5c4dc8321eb1596d5968b86a214fca03af361c94b8b045f/rsl_rl_lib-4.0.1-py3-none-any.whl", hash = "sha256:e840c8587acaad4ba3ab34fc7b07a203b34dd44a831ea9dc5de1769bfc14b148", size = 53803, upload-time = "2026-02-09T09:15:09.705Z" }, ] [[package]] @@ -1096,12 +1232,12 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214 } +sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617 }, - { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964 }, - { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749 }, - { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383 }, + { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617, upload-time = "2025-05-08T16:04:43.546Z" }, + { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964, upload-time = "2025-05-08T16:04:49.431Z" }, + { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749, upload-time = "2025-05-08T16:04:55.215Z" }, + { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383, upload-time = "2025-05-08T16:05:01.914Z" }, ] [[package]] @@ -1116,26 +1252,26 @@ wheels = [ name = "simplejson" version = "3.20.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/41/f4/a1ac5ed32f7ed9a088d62a59d410d4c204b3b3815722e2ccfb491fa8251b/simplejson-3.20.2.tar.gz", hash = "sha256:5fe7a6ce14d1c300d80d08695b7f7e633de6cd72c80644021874d985b3393649", size = 85784 } +sdist = { url = "https://files.pythonhosted.org/packages/41/f4/a1ac5ed32f7ed9a088d62a59d410d4c204b3b3815722e2ccfb491fa8251b/simplejson-3.20.2.tar.gz", hash = "sha256:5fe7a6ce14d1c300d80d08695b7f7e633de6cd72c80644021874d985b3393649", size = 85784, upload-time = "2025-09-26T16:29:36.64Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/42/6c9af551e5a8d0f171d6dce3d9d1260068927f7b80f1f09834e07887c8c4/simplejson-3.20.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e22a5fb7b1437ffb057e02e1936a3bfb19084ae9d221ec5e9f4cf85f69946b6", size = 138827 }, - { url = "https://files.pythonhosted.org/packages/2b/22/5e268bbcbe9f75577491e406ec0a5536f5b2fa91a3b52031fea51cd83e1d/simplejson-3.20.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8b6ff02fc7b8555c906c24735908854819b0d0dc85883d453e23ca4c0445d01", size = 146772 }, - { url = "https://files.pythonhosted.org/packages/71/b4/800f14728e2ad666f420dfdb57697ca128aeae7f991b35759c09356b829a/simplejson-3.20.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2bfc1c396ad972ba4431130b42307b2321dba14d988580c1ac421ec6a6b7cee3", size = 134497 }, - { url = "https://files.pythonhosted.org/packages/c1/b9/c54eef4226c6ac8e9a389bbe5b21fef116768f97a2dc1a683c716ffe66ef/simplejson-3.20.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a97249ee1aee005d891b5a211faf58092a309f3d9d440bc269043b08f662eda", size = 138172 }, - { url = "https://files.pythonhosted.org/packages/09/36/4e282f5211b34620f1b2e4b51d9ddaab5af82219b9b7b78360a33f7e5387/simplejson-3.20.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f1036be00b5edaddbddbb89c0f80ed229714a941cfd21e51386dc69c237201c2", size = 140272 }, - { url = "https://files.pythonhosted.org/packages/aa/b0/94ad2cf32f477c449e1f63c863d8a513e2408d651c4e58fe4b6a7434e168/simplejson-3.20.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5d6f5bacb8cdee64946b45f2680afa3f54cd38e62471ceda89f777693aeca4e4", size = 140468 }, - { url = "https://files.pythonhosted.org/packages/e5/46/827731e4163be3f987cb8ee90f5d444161db8f540b5e735355faa098d9bc/simplejson-3.20.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8db6841fb796ec5af632f677abf21c6425a1ebea0d9ac3ef1a340b8dc69f52b8", size = 148700 }, - { url = "https://files.pythonhosted.org/packages/c7/28/c32121064b1ec2fb7b5d872d9a1abda62df064d35e0160eddfa907118343/simplejson-3.20.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0a341f7cc2aae82ee2b31f8a827fd2e51d09626f8b3accc441a6907c88aedb7", size = 141323 }, - { url = "https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl", hash = "sha256:3b6bb7fb96efd673eac2e4235200bfffdc2353ad12c54117e1e4e2fc485ac017", size = 57309 }, + { url = "https://files.pythonhosted.org/packages/4b/42/6c9af551e5a8d0f171d6dce3d9d1260068927f7b80f1f09834e07887c8c4/simplejson-3.20.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e22a5fb7b1437ffb057e02e1936a3bfb19084ae9d221ec5e9f4cf85f69946b6", size = 138827, upload-time = "2025-09-26T16:27:32.486Z" }, + { url = "https://files.pythonhosted.org/packages/2b/22/5e268bbcbe9f75577491e406ec0a5536f5b2fa91a3b52031fea51cd83e1d/simplejson-3.20.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8b6ff02fc7b8555c906c24735908854819b0d0dc85883d453e23ca4c0445d01", size = 146772, upload-time = "2025-09-26T16:27:34.036Z" }, + { url = "https://files.pythonhosted.org/packages/71/b4/800f14728e2ad666f420dfdb57697ca128aeae7f991b35759c09356b829a/simplejson-3.20.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2bfc1c396ad972ba4431130b42307b2321dba14d988580c1ac421ec6a6b7cee3", size = 134497, upload-time = "2025-09-26T16:27:35.211Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b9/c54eef4226c6ac8e9a389bbe5b21fef116768f97a2dc1a683c716ffe66ef/simplejson-3.20.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a97249ee1aee005d891b5a211faf58092a309f3d9d440bc269043b08f662eda", size = 138172, upload-time = "2025-09-26T16:27:36.44Z" }, + { url = "https://files.pythonhosted.org/packages/09/36/4e282f5211b34620f1b2e4b51d9ddaab5af82219b9b7b78360a33f7e5387/simplejson-3.20.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f1036be00b5edaddbddbb89c0f80ed229714a941cfd21e51386dc69c237201c2", size = 140272, upload-time = "2025-09-26T16:27:37.605Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b0/94ad2cf32f477c449e1f63c863d8a513e2408d651c4e58fe4b6a7434e168/simplejson-3.20.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5d6f5bacb8cdee64946b45f2680afa3f54cd38e62471ceda89f777693aeca4e4", size = 140468, upload-time = "2025-09-26T16:27:39.015Z" }, + { url = "https://files.pythonhosted.org/packages/e5/46/827731e4163be3f987cb8ee90f5d444161db8f540b5e735355faa098d9bc/simplejson-3.20.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8db6841fb796ec5af632f677abf21c6425a1ebea0d9ac3ef1a340b8dc69f52b8", size = 148700, upload-time = "2025-09-26T16:27:40.171Z" }, + { url = "https://files.pythonhosted.org/packages/c7/28/c32121064b1ec2fb7b5d872d9a1abda62df064d35e0160eddfa907118343/simplejson-3.20.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0a341f7cc2aae82ee2b31f8a827fd2e51d09626f8b3accc441a6907c88aedb7", size = 141323, upload-time = "2025-09-26T16:27:41.324Z" }, + { url = "https://files.pythonhosted.org/packages/05/5b/83e1ff87eb60ca706972f7e02e15c0b33396e7bdbd080069a5d1b53cf0d8/simplejson-3.20.2-py3-none-any.whl", hash = "sha256:3b6bb7fb96efd673eac2e4235200bfffdc2353ad12c54117e1e4e2fc485ac017", size = 57309, upload-time = "2025-09-26T16:29:35.312Z" }, ] [[package]] name = "six" version = "1.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] [[package]] @@ -1148,27 +1284,36 @@ dependencies = [ { name = "tensorboard" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2c/6e/2f9260949187316e91643f69a2c503d96e1b8287baa12560d6ff07ff7716/skrl-1.4.3.tar.gz", hash = "sha256:24770278730c7ee8a7834ab9d7f737f44c4f3e2495c8316a879e11be1e33ec57", size = 214958 } +sdist = { url = "https://files.pythonhosted.org/packages/2c/6e/2f9260949187316e91643f69a2c503d96e1b8287baa12560d6ff07ff7716/skrl-1.4.3.tar.gz", hash = "sha256:24770278730c7ee8a7834ab9d7f737f44c4f3e2495c8316a879e11be1e33ec57", size = 214958, upload-time = "2025-03-30T01:29:20.271Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/82/86a1f8ba0aeafc76e842c5c5e6608a8877b68ccfcfc20410d0adee982d66/skrl-1.4.3-py3-none-any.whl", hash = "sha256:7f6396f626c8ecbef6dfcdaea0332e71d0c104149682b3bd9658c07315c4ea36", size = 403710 }, + { url = "https://files.pythonhosted.org/packages/08/82/86a1f8ba0aeafc76e842c5c5e6608a8877b68ccfcfc20410d0adee982d66/skrl-1.4.3-py3-none-any.whl", hash = "sha256:7f6396f626c8ecbef6dfcdaea0332e71d0c104149682b3bd9658c07315c4ea36", size = 403710, upload-time = "2025-03-30T01:29:18.264Z" }, +] + +[[package]] +name = "smmap" +version = "5.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload-time = "2025-01-02T07:14:40.909Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload-time = "2025-01-02T07:14:38.724Z" }, ] [[package]] name = "snowballstemmer" version = "3.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575 } +sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload-time = "2025-05-09T16:34:51.843Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274 }, + { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, ] [[package]] name = "soupsieve" -version = "2.8.3" +version = "2.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627 } +sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload-time = "2025-08-27T15:39:51.78Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016 }, + { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" }, ] [[package]] @@ -1194,9 +1339,9 @@ dependencies = [ { name = "sphinxcontrib-serializinghtml" }, { name = "tomli" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b7/0a/b88033900b1582f5ed8f880263363daef968d1cd064175e32abfd9714410/sphinx-7.3.7.tar.gz", hash = "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc", size = 7094808 } +sdist = { url = "https://files.pythonhosted.org/packages/b7/0a/b88033900b1582f5ed8f880263363daef968d1cd064175e32abfd9714410/sphinx-7.3.7.tar.gz", hash = "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc", size = 7094808, upload-time = "2024-04-19T04:44:48.297Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/fa/130c32ed94cf270e3d0b9ded16fb7b2c8fea86fa7263c29a696a30c1dde7/sphinx-7.3.7-py3-none-any.whl", hash = "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3", size = 3335650 }, + { url = "https://files.pythonhosted.org/packages/b4/fa/130c32ed94cf270e3d0b9ded16fb7b2c8fea86fa7263c29a696a30c1dde7/sphinx-7.3.7-py3-none-any.whl", hash = "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3", size = 3335650, upload-time = "2024-04-19T04:44:43.839Z" }, ] [[package]] @@ -1206,9 +1351,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039 } +sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039, upload-time = "2023-04-14T08:10:22.998Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343 }, + { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343, upload-time = "2023-04-14T08:10:20.844Z" }, ] [[package]] @@ -1218,9 +1363,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2b/69/b34e0cb5336f09c6866d53b4a19d76c227cdec1bbc7ac4de63ca7d58c9c7/sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632", size = 2193689 } +sdist = { url = "https://files.pythonhosted.org/packages/2b/69/b34e0cb5336f09c6866d53b4a19d76c227cdec1bbc7ac4de63ca7d58c9c7/sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632", size = 2193689, upload-time = "2024-08-02T13:48:44.277Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c", size = 2215338 }, + { url = "https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c", size = 2215338, upload-time = "2024-08-02T13:48:42.106Z" }, ] [[package]] @@ -1230,14 +1375,14 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/b9/fbacae5a5439fc08b5403c9b6f3253ad2fb3af8dd3234e358be3fa3ab272/sphinx_subfigure-0.2.4.tar.gz", hash = "sha256:d106193d0076bf29bb9594dbda23d3c13e9b2490e4344bc8018b6059a195de3b", size = 576230 } +sdist = { url = "https://files.pythonhosted.org/packages/c7/b9/fbacae5a5439fc08b5403c9b6f3253ad2fb3af8dd3234e358be3fa3ab272/sphinx_subfigure-0.2.4.tar.gz", hash = "sha256:d106193d0076bf29bb9594dbda23d3c13e9b2490e4344bc8018b6059a195de3b", size = 576230, upload-time = "2022-09-28T07:54:30.246Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/4a/3dcdf5e9bbc05dce85ee154b1ec3507427a2c2332834bd4e5f0541626c3e/sphinx_subfigure-0.2.4-py3-none-any.whl", hash = "sha256:535c890e0c431e9d0ad635f96b91b311560b02300197accc1ec664cb28af44f3", size = 9152 }, + { url = "https://files.pythonhosted.org/packages/0d/4a/3dcdf5e9bbc05dce85ee154b1ec3507427a2c2332834bd4e5f0541626c3e/sphinx_subfigure-0.2.4-py3-none-any.whl", hash = "sha256:535c890e0c431e9d0ad635f96b91b311560b02300197accc1ec664cb28af44f3", size = 9152, upload-time = "2022-09-28T07:54:20.958Z" }, ] [[package]] name = "sphinx-togglebutton" -version = "0.4.4" +version = "0.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1245,75 +1390,75 @@ dependencies = [ { name = "sphinx" }, { name = "wheel" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/89/6b/19def5241b45a7ae90fd91052bb91fa7b8fbcc0606a0cf65ac4ea70fb93b/sphinx_togglebutton-0.4.4.tar.gz", hash = "sha256:04c332692fd5f5363ad02a001e693369767d6c1f0e58279770a2aeb571b472a1", size = 17883 } +sdist = { url = "https://files.pythonhosted.org/packages/f0/df/d151dfbbe588116e450ca7e898750cb218dca6b2e557ced8de6f9bd7242b/sphinx-togglebutton-0.3.2.tar.gz", hash = "sha256:ab0c8b366427b01e4c89802d5d078472c427fa6e9d12d521c34fa0442559dc7a", size = 8324, upload-time = "2022-07-15T12:08:50.286Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/cb/9f6ceb4308ebfe5f393a271ee6206e17883edee0662a9b5c1a371878064b/sphinx_togglebutton-0.4.4-py3-none-any.whl", hash = "sha256:820658cd4c4c34c2ee7a21105e638b2f65a9e1d43ee991090715eb7fd9683cdf", size = 44892 }, + { url = "https://files.pythonhosted.org/packages/e9/18/267ce39f29d26cdc7177231428ba823fe5ca94db8c56d1bed69033b364c8/sphinx_togglebutton-0.3.2-py3-none-any.whl", hash = "sha256:9647ba7874b7d1e2d43413d8497153a85edc6ac95a3fea9a75ef9c1e08aaae2b", size = 8249, upload-time = "2022-07-15T12:08:48.8Z" }, ] [[package]] name = "sphinxcontrib-applehelp" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053 } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300 }, + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" }, ] [[package]] name = "sphinxcontrib-devhelp" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967 } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530 }, + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" }, ] [[package]] name = "sphinxcontrib-htmlhelp" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617 } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705 }, + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" }, ] [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787 } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071 }, + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, ] [[package]] name = "sphinxcontrib-qthelp" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165 } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743 }, + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" }, ] [[package]] name = "sphinxcontrib-serializinghtml" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080 } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, ] [[package]] name = "sphinxcontrib-video" -version = "0.4.2" +version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cc/18/ca17d2f66d519f1a9d0020da0bcdf33881e02471096377b3e993d1acb952/sphinxcontrib_video-0.4.2.tar.gz", hash = "sha256:18477fd9454ac8c69259e6d24e782d8b802345b6475de6216351c2305b06c898", size = 11992 } +sdist = { url = "https://files.pythonhosted.org/packages/16/48/063e167b6e692bc84bbad74df30bcb27e460a7c620af7824729db8dba606/sphinxcontrib_video-0.4.1.tar.gz", hash = "sha256:75a033e71b7de124cc5902430b7ba818a1c6c377be6401d07e9f2329a95d5ca4", size = 11362, upload-time = "2025-02-19T17:06:13.632Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/85/5a61ac88dc21df340a5999ca3ab94edaf58287010c62020be426703b8dd3/sphinxcontrib_video-0.4.2-py3-none-any.whl", hash = "sha256:7dfd01e5e2025de39536457854052b18723575d6213d96ca35f83e3154dc0315", size = 10275 }, + { url = "https://files.pythonhosted.org/packages/5d/8b/a0271fe65357860ccc52168181891e9fc9d354bfdc9be273e6a77b84f905/sphinxcontrib_video-0.4.1-py3-none-any.whl", hash = "sha256:d63ec68983dac36960557973281a616b5d9e68838369763313fc80533b1ad774", size = 10066, upload-time = "2025-02-19T17:06:12.561Z" }, ] [[package]] @@ -1345,7 +1490,7 @@ dependencies = [ { name = "werkzeug" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/d9/a5db55f88f258ac669a92858b70a714bbbd5acd993820b41ec4a96a4d77f/tensorboard-2.20.0-py3-none-any.whl", hash = "sha256:9dc9f978cb84c0723acf9a345d96c184f0293d18f166bb8d59ee098e6cfaaba6", size = 5525680 }, + { url = "https://files.pythonhosted.org/packages/9c/d9/a5db55f88f258ac669a92858b70a714bbbd5acd993820b41ec4a96a4d77f/tensorboard-2.20.0-py3-none-any.whl", hash = "sha256:9dc9f978cb84c0723acf9a345d96c184f0293d18f166bb8d59ee098e6cfaaba6", size = 5525680, upload-time = "2025-07-17T19:20:49.638Z" }, ] [[package]] @@ -1353,9 +1498,29 @@ name = "tensorboard-data-server" version = "0.7.2" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb", size = 2356 }, - { url = "https://files.pythonhosted.org/packages/b7/85/dabeaf902892922777492e1d253bb7e1264cadce3cea932f7ff599e53fea/tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60", size = 4823598 }, - { url = "https://files.pythonhosted.org/packages/73/c6/825dab04195756cf8ff2e12698f22513b3db2f64925bdd41671bfb33aaa5/tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530", size = 6590363 }, + { url = "https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb", size = 2356, upload-time = "2023-10-23T21:23:32.16Z" }, + { url = "https://files.pythonhosted.org/packages/b7/85/dabeaf902892922777492e1d253bb7e1264cadce3cea932f7ff599e53fea/tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60", size = 4823598, upload-time = "2023-10-23T21:23:33.714Z" }, + { url = "https://files.pythonhosted.org/packages/73/c6/825dab04195756cf8ff2e12698f22513b3db2f64925bdd41671bfb33aaa5/tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530", size = 6590363, upload-time = "2023-10-23T21:23:35.583Z" }, +] + +[[package]] +name = "tensordict" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cloudpickle" }, + { name = "importlib-metadata" }, + { name = "numpy" }, + { name = "orjson" }, + { name = "packaging" }, + { name = "pyvers" }, + { name = "torch" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/bc/2411956883bf1c7531e107dd79225ca47ce4a42d9306da015f625a6f08c5/tensordict-0.11.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:269a94f6afd8229718f8a657bf093f2c861dd24223625fdadfed446cf4cdf86e", size = 813584, upload-time = "2026-01-26T11:35:55.172Z" }, + { url = "https://files.pythonhosted.org/packages/8f/0b/c2d98efc3491bb5c6600640bb9a49187896b982dfb4950973ff066d1ffb1/tensordict-0.11.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:10c3617d1f9427e0a3ca0571190ef4a0d39f5cd3d35e84c290326691e0954de3", size = 458449, upload-time = "2026-01-26T11:35:56.549Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1f/72fc06c9f52174ca05499ecc6d8fe27e94e63b95728373c459fe35bd4970/tensordict-0.11.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:05b5ed6ac3282b84c07b65a7a131450928408ef6a3b0b9b950415e9cdd1a5d4c", size = 461677, upload-time = "2026-01-26T11:35:58.322Z" }, + { url = "https://files.pythonhosted.org/packages/d0/fe/2792fb8a4013ab5318e2207aadd24919097ab6adda9eb52db43b5e84be29/tensordict-0.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:102e4c389b57baff68824075b1b6c4477a2b8cec7d80a25da2780af175995c15", size = 506657, upload-time = "2026-01-26T11:35:59.438Z" }, ] [[package]] @@ -1386,8 +1551,8 @@ dependencies = [ { name = "wrapt" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/07/ea91ac67a9fd36d3372099f5a3e69860ded544f877f5f2117802388f4212/tensorflow-2.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02a0293d94f5c8b7125b66abf622cc4854a33ae9d618a0d41309f95e091bbaea", size = 259307122 }, - { url = "https://files.pythonhosted.org/packages/e5/9e/0d57922cf46b9e91de636cd5b5e0d7a424ebe98f3245380a713f1f6c2a0b/tensorflow-2.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7abd7f3a010e0d354dc804182372779a722d474c4d8a3db8f4a3f5baef2a591e", size = 620425510 }, + { url = "https://files.pythonhosted.org/packages/ff/07/ea91ac67a9fd36d3372099f5a3e69860ded544f877f5f2117802388f4212/tensorflow-2.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02a0293d94f5c8b7125b66abf622cc4854a33ae9d618a0d41309f95e091bbaea", size = 259307122, upload-time = "2025-08-13T16:50:47.909Z" }, + { url = "https://files.pythonhosted.org/packages/e5/9e/0d57922cf46b9e91de636cd5b5e0d7a424ebe98f3245380a713f1f6c2a0b/tensorflow-2.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7abd7f3a010e0d354dc804182372779a722d474c4d8a3db8f4a3f5baef2a591e", size = 620425510, upload-time = "2025-08-13T16:51:02.608Z" }, ] [[package]] @@ -1398,37 +1563,37 @@ dependencies = [ { name = "ml-dtypes" }, { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/ee/05eb424437f4db63331c90e4605025eedc0f71da3faff97161d5d7b405af/tensorstore-0.1.78.tar.gz", hash = "sha256:e26074ffe462394cf54197eb76d6569b500f347573cd74da3f4dd5f510a4ad7c", size = 6913502 } +sdist = { url = "https://files.pythonhosted.org/packages/9f/ee/05eb424437f4db63331c90e4605025eedc0f71da3faff97161d5d7b405af/tensorstore-0.1.78.tar.gz", hash = "sha256:e26074ffe462394cf54197eb76d6569b500f347573cd74da3f4dd5f510a4ad7c", size = 6913502, upload-time = "2025-10-06T17:44:29.649Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/b8/ab0d0b2afc53f47fbfd95c10d9ae21d393019aca45c8513657b8d7002f1f/tensorstore-0.1.78-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e92195db0c8c3ca749f24b1e930ab93382ac27430ac4ad2e3f53fc8f739323f", size = 18154513 }, - { url = "https://files.pythonhosted.org/packages/f7/ea/c1b4cc6a089a39f63e8d189a55c715e393995628b12b4c8560b3ae4874ba/tensorstore-0.1.78-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90570b867f9100f7405e4116c73910d0bd283a101500ea5680c5a8a881ea05c6", size = 20048971 }, + { url = "https://files.pythonhosted.org/packages/be/b8/ab0d0b2afc53f47fbfd95c10d9ae21d393019aca45c8513657b8d7002f1f/tensorstore-0.1.78-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e92195db0c8c3ca749f24b1e930ab93382ac27430ac4ad2e3f53fc8f739323f", size = 18154513, upload-time = "2025-10-06T17:43:51.694Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ea/c1b4cc6a089a39f63e8d189a55c715e393995628b12b4c8560b3ae4874ba/tensorstore-0.1.78-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90570b867f9100f7405e4116c73910d0bd283a101500ea5680c5a8a881ea05c6", size = 20048971, upload-time = "2025-10-06T17:43:54.358Z" }, ] [[package]] name = "termcolor" -version = "3.3.0" +version = "3.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/46/79/cf31d7a93a8fdc6aa0fbb665be84426a8c5a557d9240b6239e9e11e35fc5/termcolor-3.3.0.tar.gz", hash = "sha256:348871ca648ec6a9a983a13ab626c0acce02f515b9e1983332b17af7979521c5", size = 14434 } +sdist = { url = "https://files.pythonhosted.org/packages/87/56/ab275c2b56a5e2342568838f0d5e3e66a32354adcc159b495e374cda43f5/termcolor-3.2.0.tar.gz", hash = "sha256:610e6456feec42c4bcd28934a8c87a06c3fa28b01561d46aa09a9881b8622c58", size = 14423, upload-time = "2025-10-25T19:11:42.586Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/d1/8bb87d21e9aeb323cc03034f5eaf2c8f69841e40e4853c2627edf8111ed3/termcolor-3.3.0-py3-none-any.whl", hash = "sha256:cf642efadaf0a8ebbbf4bc7a31cec2f9b5f21a9f726f4ccbb08192c9c26f43a5", size = 7734 }, + { url = "https://files.pythonhosted.org/packages/f9/d5/141f53d7c1eb2a80e6d3e9a390228c3222c27705cbe7f048d3623053f3ca/termcolor-3.2.0-py3-none-any.whl", hash = "sha256:a10343879eba4da819353c55cb8049b0933890c2ebf9ad5d3ecd2bb32ea96ea6", size = 7698, upload-time = "2025-10-25T19:11:41.536Z" }, ] [[package]] name = "tomli" -version = "2.4.0" +version = "2.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477 } +sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392, upload-time = "2025-10-08T22:01:47.119Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477 }, + { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" }, ] [[package]] name = "toolz" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/d6/114b492226588d6ff54579d95847662fc69196bdeec318eb45393b24c192/toolz-1.1.0.tar.gz", hash = "sha256:27a5c770d068c110d9ed9323f24f1543e83b2f300a687b7891c1a6d56b697b5b", size = 52613 } +sdist = { url = "https://files.pythonhosted.org/packages/11/d6/114b492226588d6ff54579d95847662fc69196bdeec318eb45393b24c192/toolz-1.1.0.tar.gz", hash = "sha256:27a5c770d068c110d9ed9323f24f1543e83b2f300a687b7891c1a6d56b697b5b", size = 52613, upload-time = "2025-10-17T04:03:21.661Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl", hash = "sha256:15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8", size = 58093 }, + { url = "https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl", hash = "sha256:15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8", size = 58093, upload-time = "2025-10-17T04:03:20.435Z" }, ] [[package]] @@ -1472,8 +1637,8 @@ dependencies = [ { name = "torch" }, ] wheels = [ - { url = "https://download.pytorch.org/whl/cu128/torchaudio-2.7.0%2Bcu128-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:d62b6e9b792ad37af6d1289ba283e1029e71b4ff9cd3c6cf7f0e7776f23254b2" }, - { url = "https://download.pytorch.org/whl/cu128/torchaudio-2.7.0%2Bcu128-cp310-cp310-win_amd64.whl", hash = "sha256:f96c2be8aff6c827e76fd3a85e69a54ba5b9a37090853ed886f056ddfbca09a4" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.7.0%2Bcu128-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:d62b6e9b792ad37af6d1289ba283e1029e71b4ff9cd3c6cf7f0e7776f23254b2" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.7.0%2Bcu128-cp310-cp310-win_amd64.whl", hash = "sha256:f96c2be8aff6c827e76fd3a85e69a54ba5b9a37090853ed886f056ddfbca09a4" }, ] [[package]] @@ -1486,8 +1651,8 @@ dependencies = [ { name = "torch" }, ] wheels = [ - { url = "https://download.pytorch.org/whl/cu128/torchvision-0.22.0%2Bcu128-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:59df5a550113a80ce523047066eaaedb168c69482da88c3ab246716ab45ba092" }, - { url = "https://download.pytorch.org/whl/cu128/torchvision-0.22.0%2Bcu128-cp310-cp310-win_amd64.whl", hash = "sha256:cdd90b768b01b0d638cb06a6c211b550b275c0c207b5210b7cbb5cea8dde11db" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.22.0%2Bcu128-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:59df5a550113a80ce523047066eaaedb168c69482da88c3ab246716ab45ba092" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.22.0%2Bcu128-cp310-cp310-win_amd64.whl", hash = "sha256:cdd90b768b01b0d638cb06a6c211b550b275c0c207b5210b7cbb5cea8dde11db" }, ] [[package]] @@ -1508,9 +1673,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f0/2a/d13d3c38862632742d2fe2f7ae307c431db06538fd05ca03020d207b5dcc/treescope-0.1.10.tar.gz", hash = "sha256:20f74656f34ab2d8716715013e8163a0da79bdc2554c16d5023172c50d27ea95", size = 138870 } +sdist = { url = "https://files.pythonhosted.org/packages/f0/2a/d13d3c38862632742d2fe2f7ae307c431db06538fd05ca03020d207b5dcc/treescope-0.1.10.tar.gz", hash = "sha256:20f74656f34ab2d8716715013e8163a0da79bdc2554c16d5023172c50d27ea95", size = 138870, upload-time = "2025-08-08T05:43:48.048Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/2b/36e984399089c026a6499ac8f7401d38487cf0183839a4aa78140d373771/treescope-0.1.10-py3-none-any.whl", hash = "sha256:dde52f5314f4c29d22157a6fe4d3bd103f9cae02791c9e672eefa32c9aa1da51", size = 182255 }, + { url = "https://files.pythonhosted.org/packages/43/2b/36e984399089c026a6499ac8f7401d38487cf0183839a4aa78140d373771/treescope-0.1.10-py3-none-any.whl", hash = "sha256:dde52f5314f4c29d22157a6fe4d3bd103f9cae02791c9e672eefa32c9aa1da51", size = 182255, upload-time = "2025-08-08T05:43:46.673Z" }, ] [[package]] @@ -1521,8 +1686,8 @@ dependencies = [ { name = "setuptools" }, ] wheels = [ - { url = "https://download.pytorch.org/whl/triton-3.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6cbb1b3c214d17e06e2c12399747f645fb7e8b72cb24271557cdce0893c764c6" }, - { url = "https://download.pytorch.org/whl/triton-3.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4198996c9fa3fd811e3bc007f0fc9853c784be3dae6d30714f579c5106d70616" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6cbb1b3c214d17e06e2c12399747f645fb7e8b72cb24271557cdce0893c764c6" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4198996c9fa3fd811e3bc007f0fc9853c784be3dae6d30714f579c5106d70616" }, ] [[package]] @@ -1543,39 +1708,38 @@ wheels = [ [[package]] name = "werkzeug" -version = "3.1.5" +version = "3.1.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5a/70/1469ef1d3542ae7c2c7b72bd5e3a4e6ee69d7978fa8a3af05a38eca5becf/werkzeug-3.1.5.tar.gz", hash = "sha256:6a548b0e88955dd07ccb25539d7d0cc97417ee9e179677d22c7041c8f078ce67", size = 864754 } +sdist = { url = "https://files.pythonhosted.org/packages/9f/69/83029f1f6300c5fb2471d621ab06f6ec6b3324685a2ce0f9777fd4a8b71e/werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746", size = 806925, upload-time = "2024-11-08T15:52:18.093Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/e4/8d97cca767bcc1be76d16fb76951608305561c6e056811587f36cb1316a8/werkzeug-3.1.5-py3-none-any.whl", hash = "sha256:5111e36e91086ece91f93268bb39b4a35c1e6f1feac762c9c822ded0a4e322dc", size = 225025 }, + { url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", size = 224498, upload-time = "2024-11-08T15:52:16.132Z" }, ] [[package]] name = "wheel" -version = "0.46.3" +version = "0.45.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/89/24/a2eb353a6edac9a0303977c4cb048134959dd2a51b48a269dfc9dde00c8a/wheel-0.46.3.tar.gz", hash = "sha256:e3e79874b07d776c40bd6033f8ddf76a7dad46a7b8aa1b2787a83083519a1803", size = 60605 } +sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload-time = "2024-11-23T00:18:23.513Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/22/b76d483683216dde3d67cba61fb2444be8d5be289bf628c13fc0fd90e5f9/wheel-0.46.3-py3-none-any.whl", hash = "sha256:4b399d56c9d9338230118d705d9737a2a468ccca63d5e813e2a4fc7815d8bc4d", size = 30557 }, + { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload-time = "2024-11-23T00:18:21.207Z" }, ] [[package]] name = "wrapt" -version = "2.1.1" +version = "2.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f7/37/ae31f40bec90de2f88d9597d0b5281e23ffe85b893a47ca5d9c05c63a4f6/wrapt-2.1.1.tar.gz", hash = "sha256:5fdcb09bf6db023d88f312bd0767594b414655d58090fc1c46b3414415f67fac", size = 81329 } +sdist = { url = "https://files.pythonhosted.org/packages/49/2a/6de8a50cb435b7f42c46126cf1a54b2aab81784e74c8595c8e025e8f36d3/wrapt-2.0.1.tar.gz", hash = "sha256:9c9c635e78497cacb81e84f8b11b23e0aacac7a136e73b8e5b2109a1d9fc468f", size = 82040, upload-time = "2025-11-07T00:45:33.312Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/79/4c755b45df6ef30c0dd628ecfaa0c808854be147ca438429da70a162833c/wrapt-2.1.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b2be3fa5f4efaf16ee7c77d0556abca35f5a18ad4ac06f0ef3904c3399010ce9", size = 113528 }, - { url = "https://files.pythonhosted.org/packages/9f/63/23ce28f7b841217d9a6337a340fbb8d4a7fbd67a89d47f377c8550fa34aa/wrapt-2.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67c90c1ae6489a6cb1a82058902caa8006706f7b4e8ff766f943e9d2c8e608d0", size = 115536 }, - { url = "https://files.pythonhosted.org/packages/23/7b/5ca8d3b12768670d16c8329e29960eedd56212770365a02a8de8bf73dc01/wrapt-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:05c0db35ccffd7480143e62df1e829d101c7b86944ae3be7e4869a7efa621f53", size = 114716 }, - { url = "https://files.pythonhosted.org/packages/c7/3a/9789ccb14a096d30bb847bf3ee137bf682cc9750c2ce155f4c5ae1962abf/wrapt-2.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0c2ec9f616755b2e1e0bf4d0961f59bb5c2e7a77407e7e2c38ef4f7d2fdde12c", size = 113200 }, - { url = "https://files.pythonhosted.org/packages/c4/da/5a086bf4c22a41995312db104ec2ffeee2cf6accca9faaee5315c790377d/wrapt-2.1.1-py3-none-any.whl", hash = "sha256:3b0f4629eb954394a3d7c7a1c8cca25f0b07cefe6aa8545e862e9778152de5b7", size = 43886 }, + { url = "https://files.pythonhosted.org/packages/c6/93/5cf92edd99617095592af919cb81d4bff61c5dbbb70d3c92099425a8ec34/wrapt-2.0.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:36982b26f190f4d737f04a492a68accbfc6fa042c3f42326fdfbb6c5b7a20a31", size = 113688, upload-time = "2025-11-07T00:43:18.275Z" }, + { url = "https://files.pythonhosted.org/packages/a0/0a/e38fc0cee1f146c9fb266d8ef96ca39fb14a9eef165383004019aa53f88a/wrapt-2.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23097ed8bc4c93b7bf36fa2113c6c733c976316ce0ee2c816f64ca06102034ef", size = 115698, upload-time = "2025-11-07T00:43:19.407Z" }, + { url = "https://files.pythonhosted.org/packages/b0/85/bef44ea018b3925fb0bcbe9112715f665e4d5309bd945191da814c314fd1/wrapt-2.0.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8bacfe6e001749a3b64db47bcf0341da757c95959f592823a93931a422395013", size = 112096, upload-time = "2025-11-07T00:43:16.5Z" }, + { url = "https://files.pythonhosted.org/packages/7c/0b/733a2376e413117e497aa1a5b1b78e8f3a28c0e9537d26569f67d724c7c5/wrapt-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8ec3303e8a81932171f455f792f8df500fc1a09f20069e5c16bd7049ab4e8e38", size = 114878, upload-time = "2025-11-07T00:43:20.81Z" }, + { url = "https://files.pythonhosted.org/packages/da/03/d81dcb21bbf678fcda656495792b059f9d56677d119ca022169a12542bd0/wrapt-2.0.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:3f373a4ab5dbc528a94334f9fe444395b23c2f5332adab9ff4ea82f5a9e33bc1", size = 111298, upload-time = "2025-11-07T00:43:22.229Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d5/5e623040e8056e1108b787020d56b9be93dbbf083bf2324d42cde80f3a19/wrapt-2.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f49027b0b9503bf6c8cdc297ca55006b80c2f5dd36cecc72c6835ab6e10e8a25", size = 113361, upload-time = "2025-11-07T00:43:24.301Z" }, + { url = "https://files.pythonhosted.org/packages/15/d1/b51471c11592ff9c012bd3e2f7334a6ff2f42a7aed2caffcf0bdddc9cb89/wrapt-2.0.1-py3-none-any.whl", hash = "sha256:4d2ce1bf1a48c5277d7969259232b57645aae5686dba1eaeade39442277afbca", size = 44046, upload-time = "2025-11-07T00:45:32.116Z" }, ] [[package]]