From 4fd77a94ab659dcc3d92a8d3aff40c9601c0ee04 Mon Sep 17 00:00:00 2001 From: Zhengyi Date: Tue, 19 Mar 2024 14:53:43 -0400 Subject: [PATCH] first commit --- .gitignore | 144 ++ README.MD | 175 +- download_data.sh | 9 + phc/__init__.py | 0 .../geom/Chest.stl | Bin 0 -> 4984 bytes .../geom/Head.stl | Bin 0 -> 4984 bytes .../geom/L_Ankle.stl | Bin 0 -> 4884 bytes .../geom/L_Elbow.stl | Bin 0 -> 4984 bytes .../geom/L_Hand.stl | Bin 0 -> 4984 bytes .../geom/L_Hip.stl | Bin 0 -> 4884 bytes .../geom/L_Knee.stl | Bin 0 -> 4884 bytes .../geom/L_Shoulder.stl | Bin 0 -> 4584 bytes .../geom/L_Thorax.stl | Bin 0 -> 4884 bytes .../geom/L_Toe.stl | Bin 0 -> 4584 bytes .../geom/L_Wrist.stl | Bin 0 -> 4884 bytes .../geom/Neck.stl | Bin 0 -> 4684 bytes .../geom/Pelvis.stl | Bin 0 -> 4984 bytes .../geom/R_Ankle.stl | Bin 0 -> 4584 bytes .../geom/R_Elbow.stl | Bin 0 -> 4984 bytes .../geom/R_Hand.stl | Bin 0 -> 4984 bytes .../geom/R_Hip.stl | Bin 0 -> 4884 bytes .../geom/R_Knee.stl | Bin 0 -> 4884 bytes .../geom/R_Shoulder.stl | Bin 0 -> 4884 bytes .../geom/R_Thorax.stl | Bin 0 -> 4884 bytes .../geom/R_Toe.stl | Bin 0 -> 4684 bytes .../geom/R_Wrist.stl | Bin 0 -> 4884 bytes .../geom/Spine.stl | Bin 0 -> 4884 bytes .../geom/Torso.stl | Bin 0 -> 4884 bytes .../assets/mjcf/humanoid_template_local.xml | 39 + phc/data/assets/mjcf/mesh_humanoid.xml | 295 +++ phc/data/assets/mjcf/smpl_0_humanoid.xml | 243 +++ phc/data/assets/mjcf/smpl_1_humanoid.xml | 243 +++ phc/data/assets/mjcf/smpl_2_humanoid.xml | 243 +++ phc/data/assets/mjcf/smpl_humanoid.xml | 243 +++ phc/data/assets/mjcf/smpl_humanoid_1.xml | 243 +++ phc/data/assets/urdf/ball_medium.urdf | 21 + phc/data/assets/urdf/block_projectile.urdf | 21 + .../assets/urdf/block_projectile_large.urdf | 21 + phc/data/assets/urdf/capsule.urdf | 20 + phc/data/assets/urdf/heading_marker.urdf | 21 + phc/data/assets/urdf/location_marker.urdf | 21 + phc/data/assets/urdf/traj_marker.urdf | 21 + phc/data/assets/urdf/traj_marker_small.urdf | 21 + phc/data/cfg/config.yaml | 47 + phc/data/cfg/env/env_im.yaml | 52 + phc/data/cfg/env/env_im_getup_mcp.yaml | 96 + phc/data/cfg/env/env_im_pnn.yaml | 65 + phc/data/cfg/env/env_im_vae.yaml | 112 + phc/data/cfg/env/env_vr.yaml | 53 + phc/data/cfg/env/phc_kp_mcp_iccv.yaml | 106 + phc/data/cfg/env/phc_kp_pnn_iccv.yaml | 102 + phc/data/cfg/env/phc_prim_iccv.yaml | 89 + phc/data/cfg/env/phc_prim_vr.yaml | 93 + phc/data/cfg/env/phc_shape_mcp_iccv.yaml | 108 + phc/data/cfg/env/phc_shape_pnn_iccv.yaml | 102 + .../cfg/env/phc_shape_pnn_train_iccv.yaml | 100 + phc/data/cfg/env/pulse_amp.yaml | 90 + phc/data/cfg/learning/im.yaml | 94 + phc/data/cfg/learning/im_big.yaml | 97 + phc/data/cfg/learning/im_mcp.yaml | 97 + phc/data/cfg/learning/im_mcp_big.yaml | 99 + phc/data/cfg/learning/im_pnn.yaml | 94 + phc/data/cfg/learning/im_pnn_big.yaml | 96 + phc/data/cfg/learning/im_z_fit.yaml | 106 + phc/data/cfg/robot/smpl_humanoid.yaml | 28 + phc/data/cfg/robot/smpl_humanoid_shape.yaml | 28 + phc/data/cfg/robot/smplx_humanoid.yaml | 28 + phc/data/cfg/sim/default_sim.yaml | 22 + phc/data/cfg/train/rlg/im.yaml | 95 + phc/data/cfg/train/rlg/im_big.yaml | 98 + phc/data/cfg/train/rlg/im_mcp.yaml | 97 + phc/data/cfg/train/rlg/im_pnn.yaml | 95 + phc/data/cfg/train/rlg/im_pnn_big.yaml | 97 + phc/env/__init__.py | 0 phc/env/tasks/__init__.py | 27 + phc/env/tasks/base_task.py | 722 +++++++ phc/env/tasks/humanoid.py | 1849 +++++++++++++++++ phc/env/tasks/humanoid_amp.py | 1009 +++++++++ phc/env/tasks/humanoid_amp_getup.py | 170 ++ phc/env/tasks/humanoid_amp_task.py | 116 ++ phc/env/tasks/humanoid_amp_z.py | 232 +++ phc/env/tasks/humanoid_im.py | 1676 +++++++++++++++ phc/env/tasks/humanoid_im_demo.py | 169 ++ phc/env/tasks/humanoid_im_distill.py | 233 +++ phc/env/tasks/humanoid_im_distill_getup.py | 36 + phc/env/tasks/humanoid_im_getup.py | 210 ++ phc/env/tasks/humanoid_im_mcp.py | 92 + phc/env/tasks/humanoid_im_mcp_demo.py | 322 +++ phc/env/tasks/humanoid_im_mcp_getup.py | 31 + .../tasks/humanoid_pedestrain_terrain_z.py | 162 ++ phc/env/tasks/humanoid_pedestrian_terrain.py | 1737 ++++++++++++++++ phc/env/tasks/humanoid_reach.py | 417 ++++ phc/env/tasks/humanoid_speed.py | 565 +++++ phc/env/tasks/humanoid_strike.py | 591 ++++++ phc/env/tasks/vec_task.py | 162 ++ phc/env/tasks/vec_task_wrappers.py | 81 + phc/env/util/gym_util.py | 212 ++ phc/env/util/traj_generator.py | 208 ++ phc/learning/__init__.py | 0 phc/learning/amp_agent.py | 1105 ++++++++++ phc/learning/amp_datasets.py | 101 + phc/learning/amp_models.py | 109 + phc/learning/amp_network_builder.py | 253 +++ phc/learning/amp_network_mcp_builder.py | 87 + phc/learning/amp_network_pnn_builder.py | 89 + phc/learning/amp_network_z_builder.py | 598 ++++++ phc/learning/amp_players.py | 312 +++ phc/learning/ar_prior.py | 16 + phc/learning/common_agent.py | 1124 ++++++++++ phc/learning/common_player.py | 418 ++++ phc/learning/im_amp.py | 359 ++++ phc/learning/im_amp_players.py | 332 +++ phc/learning/loss_functions.py | 11 + phc/learning/network_builder.py | 986 +++++++++ phc/learning/network_loader.py | 176 ++ phc/learning/pnn.py | 131 ++ phc/learning/replay_buffer.py | 85 + phc/learning/running_norm.py | 44 + phc/learning/transformer.py | 314 +++ phc/learning/transformer_layers.py | 281 +++ phc/learning/unrealego/__init__.py | 0 phc/learning/unrealego/base_model.py | 107 + phc/learning/unrealego/egoglass_model.py | 207 ++ phc/learning/unrealego/models.py | 21 + phc/learning/unrealego/network.py | 619 ++++++ phc/learning/unrealego/network_debug.py | 571 +++++ .../unrealego/unrealego_autoencoder_model.py | 173 ++ .../unrealego_heatmap_shared_model.py | 146 ++ phc/learning/vq_quantizer.py | 166 ++ phc/run.py | 297 +++ phc/run_hydra.py | 345 +++ phc/utils/__init__.py | 27 + phc/utils/benchmarking.py | 71 + phc/utils/config.py | 487 +++++ phc/utils/data_tree.py | 198 ++ phc/utils/draw_utils.py | 77 + phc/utils/flags.py | 13 + phc/utils/logger.py | 116 ++ phc/utils/motion_lib_base.py | 564 +++++ phc/utils/motion_lib_smpl.py | 170 ++ phc/utils/o3d_utils.py | 40 + phc/utils/parse_task.py | 65 + phc/utils/plot_script.py | 130 ++ phc/utils/pytorch3d_transforms.py | 676 ++++++ phc/utils/running_mean_std.py | 128 ++ phc/utils/torch_utils.py | 260 +++ phc/utils/traj_generator.py | 193 ++ poselib/.gitignore | 107 + poselib/README.md | 20 + poselib/__init__.py | 0 poselib/poselib/__init__.py | 3 + poselib/poselib/core/__init__.py | 3 + poselib/poselib/core/backend/__init__.py | 3 + poselib/poselib/core/backend/abstract.py | 128 ++ poselib/poselib/core/backend/logger.py | 20 + poselib/poselib/core/rotation3d.py | 473 +++++ poselib/poselib/core/tensor_utils.py | 45 + poselib/poselib/core/tests/__init__.py | 0 poselib/poselib/core/tests/test_rotation.py | 56 + poselib/poselib/skeleton/__init__.py | 0 poselib/poselib/skeleton/backend/__init__.py | 0 .../poselib/skeleton/backend/fbx/__init__.py | 0 .../skeleton/backend/fbx/fbx_py27_backend.py | 308 +++ .../skeleton/backend/fbx/fbx_read_wrapper.py | 75 + poselib/poselib/skeleton/skeleton3d.py | 1264 +++++++++++ poselib/poselib/skeleton/tests/__init__.py | 0 poselib/poselib/skeleton/tests/ant.xml | 71 + .../poselib/skeleton/tests/test_skeleton.py | 132 ++ .../poselib/skeleton/tests/transfer_npy.py | 31 + poselib/poselib/visualization/__init__.py | 0 poselib/poselib/visualization/common.py | 189 ++ poselib/poselib/visualization/core.py | 78 + poselib/poselib/visualization/plt_plotter.py | 402 ++++ .../visualization/simple_plotter_tasks.py | 192 ++ .../visualization/skeleton_plotter_tasks.py | 194 ++ .../poselib/visualization/tests/__init__.py | 0 .../visualization/tests/test_plotter.py | 16 + poselib/setup.py | 19 + requirement.txt | 39 + scripts/data_process/convert_amass_data.py | 152 ++ scripts/data_process/convert_amass_isaac.py | 156 ++ scripts/data_process/convert_data_mdm.py | 158 ++ scripts/data_process/convert_data_smpl.py | 140 ++ scripts/data_process/process_amass_db.py | 289 +++ scripts/data_process/process_amass_raw.py | 188 ++ scripts/demo/video_to_pose_server.py | 394 ++++ scripts/joint_monkey_smpl.py | 295 +++ scripts/mdm_test.py | 42 + scripts/mjcf_to_urdf.py | 28 + scripts/pmcp/forward_pmcp.py | 67 + scripts/quest_camera.py | 42 + scripts/render_smpl_o3d.py | 142 ++ scripts/vis/vis_motion.py | 382 ++++ scripts/vis/vis_smpl_o3d.py | 262 +++ scripts/vis/vis_smpl_o3d_ego.py | 260 +++ scripts/vis/vis_smpl_o3d_multi.py | 279 +++ scripts/vis/vis_smpl_o3d_single.py | 262 +++ scripts/ws_client.py | 69 + 198 files changed, 35830 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 download_data.sh create mode 100644 phc/__init__.py create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/Chest.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/Head.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Ankle.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Elbow.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Hand.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Hip.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Knee.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Shoulder.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Thorax.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Toe.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Wrist.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/Neck.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/Pelvis.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Ankle.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Elbow.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Hand.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Hip.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Knee.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Shoulder.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Thorax.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Toe.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Wrist.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/Spine.stl create mode 100644 phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/Torso.stl create mode 100644 phc/data/assets/mjcf/humanoid_template_local.xml create mode 100644 phc/data/assets/mjcf/mesh_humanoid.xml create mode 100644 phc/data/assets/mjcf/smpl_0_humanoid.xml create mode 100644 phc/data/assets/mjcf/smpl_1_humanoid.xml create mode 100644 phc/data/assets/mjcf/smpl_2_humanoid.xml create mode 100644 phc/data/assets/mjcf/smpl_humanoid.xml create mode 100644 phc/data/assets/mjcf/smpl_humanoid_1.xml create mode 100644 phc/data/assets/urdf/ball_medium.urdf create mode 100644 phc/data/assets/urdf/block_projectile.urdf create mode 100644 phc/data/assets/urdf/block_projectile_large.urdf create mode 100644 phc/data/assets/urdf/capsule.urdf create mode 100644 phc/data/assets/urdf/heading_marker.urdf create mode 100644 phc/data/assets/urdf/location_marker.urdf create mode 100644 phc/data/assets/urdf/traj_marker.urdf create mode 100644 phc/data/assets/urdf/traj_marker_small.urdf create mode 100644 phc/data/cfg/config.yaml create mode 100644 phc/data/cfg/env/env_im.yaml create mode 100644 phc/data/cfg/env/env_im_getup_mcp.yaml create mode 100644 phc/data/cfg/env/env_im_pnn.yaml create mode 100644 phc/data/cfg/env/env_im_vae.yaml create mode 100644 phc/data/cfg/env/env_vr.yaml create mode 100644 phc/data/cfg/env/phc_kp_mcp_iccv.yaml create mode 100644 phc/data/cfg/env/phc_kp_pnn_iccv.yaml create mode 100644 phc/data/cfg/env/phc_prim_iccv.yaml create mode 100644 phc/data/cfg/env/phc_prim_vr.yaml create mode 100644 phc/data/cfg/env/phc_shape_mcp_iccv.yaml create mode 100644 phc/data/cfg/env/phc_shape_pnn_iccv.yaml create mode 100644 phc/data/cfg/env/phc_shape_pnn_train_iccv.yaml create mode 100644 phc/data/cfg/env/pulse_amp.yaml create mode 100644 phc/data/cfg/learning/im.yaml create mode 100644 phc/data/cfg/learning/im_big.yaml create mode 100644 phc/data/cfg/learning/im_mcp.yaml create mode 100644 phc/data/cfg/learning/im_mcp_big.yaml create mode 100644 phc/data/cfg/learning/im_pnn.yaml create mode 100644 phc/data/cfg/learning/im_pnn_big.yaml create mode 100644 phc/data/cfg/learning/im_z_fit.yaml create mode 100644 phc/data/cfg/robot/smpl_humanoid.yaml create mode 100644 phc/data/cfg/robot/smpl_humanoid_shape.yaml create mode 100644 phc/data/cfg/robot/smplx_humanoid.yaml create mode 100644 phc/data/cfg/sim/default_sim.yaml create mode 100644 phc/data/cfg/train/rlg/im.yaml create mode 100644 phc/data/cfg/train/rlg/im_big.yaml create mode 100644 phc/data/cfg/train/rlg/im_mcp.yaml create mode 100644 phc/data/cfg/train/rlg/im_pnn.yaml create mode 100644 phc/data/cfg/train/rlg/im_pnn_big.yaml create mode 100644 phc/env/__init__.py create mode 100644 phc/env/tasks/__init__.py create mode 100644 phc/env/tasks/base_task.py create mode 100644 phc/env/tasks/humanoid.py create mode 100644 phc/env/tasks/humanoid_amp.py create mode 100644 phc/env/tasks/humanoid_amp_getup.py create mode 100644 phc/env/tasks/humanoid_amp_task.py create mode 100644 phc/env/tasks/humanoid_amp_z.py create mode 100644 phc/env/tasks/humanoid_im.py create mode 100644 phc/env/tasks/humanoid_im_demo.py create mode 100644 phc/env/tasks/humanoid_im_distill.py create mode 100644 phc/env/tasks/humanoid_im_distill_getup.py create mode 100644 phc/env/tasks/humanoid_im_getup.py create mode 100644 phc/env/tasks/humanoid_im_mcp.py create mode 100644 phc/env/tasks/humanoid_im_mcp_demo.py create mode 100644 phc/env/tasks/humanoid_im_mcp_getup.py create mode 100644 phc/env/tasks/humanoid_pedestrain_terrain_z.py create mode 100644 phc/env/tasks/humanoid_pedestrian_terrain.py create mode 100644 phc/env/tasks/humanoid_reach.py create mode 100644 phc/env/tasks/humanoid_speed.py create mode 100644 phc/env/tasks/humanoid_strike.py create mode 100644 phc/env/tasks/vec_task.py create mode 100644 phc/env/tasks/vec_task_wrappers.py create mode 100644 phc/env/util/gym_util.py create mode 100644 phc/env/util/traj_generator.py create mode 100644 phc/learning/__init__.py create mode 100644 phc/learning/amp_agent.py create mode 100644 phc/learning/amp_datasets.py create mode 100644 phc/learning/amp_models.py create mode 100644 phc/learning/amp_network_builder.py create mode 100644 phc/learning/amp_network_mcp_builder.py create mode 100644 phc/learning/amp_network_pnn_builder.py create mode 100644 phc/learning/amp_network_z_builder.py create mode 100644 phc/learning/amp_players.py create mode 100644 phc/learning/ar_prior.py create mode 100644 phc/learning/common_agent.py create mode 100644 phc/learning/common_player.py create mode 100644 phc/learning/im_amp.py create mode 100644 phc/learning/im_amp_players.py create mode 100644 phc/learning/loss_functions.py create mode 100644 phc/learning/network_builder.py create mode 100644 phc/learning/network_loader.py create mode 100644 phc/learning/pnn.py create mode 100644 phc/learning/replay_buffer.py create mode 100644 phc/learning/running_norm.py create mode 100644 phc/learning/transformer.py create mode 100644 phc/learning/transformer_layers.py create mode 100644 phc/learning/unrealego/__init__.py create mode 100644 phc/learning/unrealego/base_model.py create mode 100644 phc/learning/unrealego/egoglass_model.py create mode 100644 phc/learning/unrealego/models.py create mode 100644 phc/learning/unrealego/network.py create mode 100644 phc/learning/unrealego/network_debug.py create mode 100644 phc/learning/unrealego/unrealego_autoencoder_model.py create mode 100644 phc/learning/unrealego/unrealego_heatmap_shared_model.py create mode 100644 phc/learning/vq_quantizer.py create mode 100644 phc/run.py create mode 100644 phc/run_hydra.py create mode 100644 phc/utils/__init__.py create mode 100644 phc/utils/benchmarking.py create mode 100644 phc/utils/config.py create mode 100644 phc/utils/data_tree.py create mode 100644 phc/utils/draw_utils.py create mode 100644 phc/utils/flags.py create mode 100644 phc/utils/logger.py create mode 100644 phc/utils/motion_lib_base.py create mode 100644 phc/utils/motion_lib_smpl.py create mode 100644 phc/utils/o3d_utils.py create mode 100644 phc/utils/parse_task.py create mode 100644 phc/utils/plot_script.py create mode 100644 phc/utils/pytorch3d_transforms.py create mode 100644 phc/utils/running_mean_std.py create mode 100644 phc/utils/torch_utils.py create mode 100644 phc/utils/traj_generator.py create mode 100644 poselib/.gitignore create mode 100644 poselib/README.md create mode 100644 poselib/__init__.py create mode 100644 poselib/poselib/__init__.py create mode 100644 poselib/poselib/core/__init__.py create mode 100644 poselib/poselib/core/backend/__init__.py create mode 100644 poselib/poselib/core/backend/abstract.py create mode 100644 poselib/poselib/core/backend/logger.py create mode 100644 poselib/poselib/core/rotation3d.py create mode 100644 poselib/poselib/core/tensor_utils.py create mode 100644 poselib/poselib/core/tests/__init__.py create mode 100644 poselib/poselib/core/tests/test_rotation.py create mode 100644 poselib/poselib/skeleton/__init__.py create mode 100644 poselib/poselib/skeleton/backend/__init__.py create mode 100644 poselib/poselib/skeleton/backend/fbx/__init__.py create mode 100644 poselib/poselib/skeleton/backend/fbx/fbx_py27_backend.py create mode 100644 poselib/poselib/skeleton/backend/fbx/fbx_read_wrapper.py create mode 100644 poselib/poselib/skeleton/skeleton3d.py create mode 100644 poselib/poselib/skeleton/tests/__init__.py create mode 100644 poselib/poselib/skeleton/tests/ant.xml create mode 100644 poselib/poselib/skeleton/tests/test_skeleton.py create mode 100644 poselib/poselib/skeleton/tests/transfer_npy.py create mode 100644 poselib/poselib/visualization/__init__.py create mode 100644 poselib/poselib/visualization/common.py create mode 100644 poselib/poselib/visualization/core.py create mode 100644 poselib/poselib/visualization/plt_plotter.py create mode 100644 poselib/poselib/visualization/simple_plotter_tasks.py create mode 100644 poselib/poselib/visualization/skeleton_plotter_tasks.py create mode 100644 poselib/poselib/visualization/tests/__init__.py create mode 100644 poselib/poselib/visualization/tests/test_plotter.py create mode 100644 poselib/setup.py create mode 100644 requirement.txt create mode 100644 scripts/data_process/convert_amass_data.py create mode 100644 scripts/data_process/convert_amass_isaac.py create mode 100644 scripts/data_process/convert_data_mdm.py create mode 100644 scripts/data_process/convert_data_smpl.py create mode 100644 scripts/data_process/process_amass_db.py create mode 100644 scripts/data_process/process_amass_raw.py create mode 100644 scripts/demo/video_to_pose_server.py create mode 100644 scripts/joint_monkey_smpl.py create mode 100644 scripts/mdm_test.py create mode 100644 scripts/mjcf_to_urdf.py create mode 100644 scripts/pmcp/forward_pmcp.py create mode 100644 scripts/quest_camera.py create mode 100644 scripts/render_smpl_o3d.py create mode 100644 scripts/vis/vis_motion.py create mode 100644 scripts/vis/vis_smpl_o3d.py create mode 100644 scripts/vis/vis_smpl_o3d_ego.py create mode 100644 scripts/vis/vis_smpl_o3d_multi.py create mode 100644 scripts/vis/vis_smpl_o3d_single.py create mode 100644 scripts/ws_client.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ca0e80a --- /dev/null +++ b/.gitignore @@ -0,0 +1,144 @@ + +*.json + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class +out/ +# C extensions +*.so +*.pkl + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +wandb/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +.vscode/* +.vscode/settings.json + + + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +venv/ +env.bak/ +venv.bak/ + + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + + # Pyre type checker +.pyre/ +checkpoints/ +data/* +output/ +log/ + +*.png +*.jpg +stageroom_train/ # tensorboard log +trials/ +output_videos/ +*.pkl +*.pt +new_trials +gh-md-toc \ No newline at end of file diff --git a/README.MD b/README.MD index 814d229..b85d1a9 100644 --- a/README.MD +++ b/README.MD @@ -1,7 +1,11 @@ -[Repo still under construction] + # Universal Humanoid Motion Representations for Physics-Based Control -Official implementation of ICLR 2023 spotlight paper: "Universal Humanoid Motion Representations for Physics-Based Control". +Official implementation of ICLR 2023 spotlight paper: "Universal Humanoid Motion Representations for Physics-Based Control". In this work, we develop a humanoi motion latent space that is low dimensional (32), high coverage (99.8% of AMASS motion), can speed up downstream task for hierarchical RL, and can be randomly sampled as a generative model. + +Our proposed Physics-based Universal motion Latent SpacE (PULSE) is akin to a foundation model for control where downstream tasks ranging from simple locomotion, complex terrain traversal, to free-form motion tracking can all reuse this representation + +This repo has a large amount of code overlap with [PHC](https://github.com/ZhengyiLuo/PHC); PULSE is more focused on the generative tasks. [[paper]](https://arxiv.org/abs/2310.04582) [[website]](https://www.zhengyiluo.com/PULSE/) @@ -9,3 +13,170 @@ Official implementation of ICLR 2023 spotlight paper: "Universal Humanoid Motion +## News 🚩 + +[March 19, 2024] Training and Evaluation code released. + +## TODOs + +- [ ] Add support for smplx/h (fingers!!!). + +- [ ] Add suppport for more downstream tasks. + +### Dependencies + +To create the environment, follow the following instructions: + +1. Create new conda environment and install pytroch: + + +``` +conda create -n isaac python=3.8 +conda install pytorch torchvision torchaudio pytorch-cuda=11.6 -c pytorch -c nvidia +pip install -r requirement.txt +``` + +2. Download and setup [Isaac Gym](https://developer.nvidia.com/isaac-gym). + + +3. [Optional if only inference] Download SMPL paramters from [SMPL](https://smpl.is.tue.mpg.de/). Put them in the `data/smpl` folder, unzip them into 'data/smpl' folder. Please download the v1.1.0 version, which contains the neutral humanoid. Rename the files `basicmodel_neutral_lbs_10_207_0_v1.1.0`, `basicmodel_m_lbs_10_207_0_v1.1.0.pkl`, `basicmodel_f_lbs_10_207_0_v1.1.0.pkl` to `SMPL_NEUTRAL.pkl`, `SMPL_MALE.pkl` and `SMPL_FEMALE.pkl`. Rename The file structure should look like this: + +``` + +|-- data + |-- smpl + |-- SMPL_FEMALE.pkl + |-- SMPL_NEUTRAL.pkl + |-- SMPL_MALE.pkl +``` + +4. Use the following script to download trained models and sample data. + +``` +bash download_data.sh +``` + +this wil download amass_isaac_standing_upright_slim.pkl, which is a standing still pose for testing. + +## Evaluation + +### Viewer Shortcuts + +| Keyboard | Function | +| ---- | --- | +| f | focus on humanoid | +| Right click + WASD | change view port | +| Shift + Right click + WASD | change view port fast | +| r | reset episode | +| i | start random sampling PULSE | +| j | apply large force to the humanoid | +| l | record screenshot, press again to stop recording| +| ; | cancel screen shot| +| m | cancel termination based on imitation | + +... more shortcut can be found in `phc/env/tasks/base_task.py` + +Notes on rendering: I am using pyvirtualdisplay to record the video such that you can see all humanoids at the same time (default function will only capture the first environment). You can disable it using the flag `no_virtual_display=True`. + + +### Run PULSE + +``` +python phc/run_hydra.py env.task=HumanoidImDistillGetup env=env_im_vae exp_name=pulse_vae_iclr robot.real_weight_porpotion_boxes=False learning=im_z_fit env.models=['output/HumanoidIm/phc_3/Humanoid_00258000.pth','output/HumanoidIm/phc_comp_3/Humanoid_00023501.pth'] env.motion_file=sample_data//amass_isaac_standing_upright_slim.pkl test=True env.num_envs=1 headless=False epoch=-1 +``` + +Press M (disable termination), and press I (start sampling), to see ramdomly sampled motion. + + +### Train Downstream Tasks + +(more coming soon!) + +Speed: +``` +python phc/run_hydra.py env.task=HumanoidSpeedZ env=env_im_vae exp_name=pulse_vae_iclr robot.real_weight_porpotion_boxes=False learning=im_z_fit env.models=['output/HumanoidIm/phc_3/Humanoid_00258000.pth','output/HumanoidIm/phc_comp_3/Humanoid_00023501.pth'] env.motion_file=sample_data//amass_isaac_standing_upright_slim.pkl test=True env.num_envs=1 headless=False epoch=-1 +``` + + + + + +## Training + + + +### Data Processing AMASS + +We train on a subset of the [AMASS](https://amass.is.tue.mpg.de/) dataset. + +For processing the AMASS, first, download the AMASS dataset from [AMASS](https://amass.is.tue.mpg.de/). Then, run the following script on the unzipped data: + + +After downloading AMASS, use the script `python scripts/data_process/convert_amass_data.py` + +### Training PULSE + +``` +python phc/run_hydra.py env.task=HumanoidImDistillGetup env=env_im_vae exp_name=pulse_vae robot.real_weight_porpotion_boxes=False learning=im_z_fit env.models=['output/HumanoidIm/phc_3/Humanoid_00258000.pth','output/HumanoidIm/phc_comp_3/Humanoid_00023501.pth'] env.motion_file=[insert data pkl] +``` + + +## Citation +If you find this work useful for your research, please cite our paper: +``` +@inproceedings{ +luo2024universal, +title={Universal Humanoid Motion Representations for Physics-Based Control}, +author={Zhengyi Luo and Jinkun Cao and Josh Merel and Alexander Winkler and Jing Huang and Kris M. Kitani and Weipeng Xu}, +booktitle={The Twelfth International Conference on Learning Representations}, +year={2024}, +url={https://openreview.net/forum?id=OrOd8PxOO2} +} +``` + +Also consider citing these prior works that are used in this project: + +``` + +@inproceedings{Luo2023PerpetualHC, + author={Zhengyi Luo and Jinkun Cao and Alexander W. Winkler and Kris Kitani and Weipeng Xu}, + title={Perpetual Humanoid Control for Real-time Simulated Avatars}, + booktitle={International Conference on Computer Vision (ICCV)}, + year={2023} +} + +@inproceedings{rempeluo2023tracepace, + author={Rempe, Davis and Luo, Zhengyi and Peng, Xue Bin and Yuan, Ye and Kitani, Kris and Kreis, Karsten and Fidler, Sanja and Litany, Or}, + title={Trace and Pace: Controllable Pedestrian Animation via Guided Trajectory Diffusion}, + booktitle={Conference on Computer Vision and Pattern Recognition (CVPR)}, + year={2023} +} + +@inproceedings{Luo2022EmbodiedSH, + title={Embodied Scene-aware Human Pose Estimation}, + author={Zhengyi Luo and Shun Iwase and Ye Yuan and Kris Kitani}, + booktitle={Advances in Neural Information Processing Systems}, + year={2022} +} + +@inproceedings{Luo2021DynamicsRegulatedKP, + title={Dynamics-Regulated Kinematic Policy for Egocentric Pose Estimation}, + author={Zhengyi Luo and Ryo Hachiuma and Ye Yuan and Kris Kitani}, + booktitle={Advances in Neural Information Processing Systems}, + year={2021} +} + +``` + +## References +This repository is built on top of the following amazing repositories: +* Main code framework is from: [IsaacGymEnvs](https://github.com/NVIDIA-Omniverse/IsaacGymEnvs) +* Large amount of code is from: [PHC](https://github.com/ZhengyiLuo/PHC) +* SMPL models and layer is from: [SMPL-X model](https://github.com/vchoutas/smplx) + +Please follow the lisence of the above repositories for usage. + + + + + diff --git a/download_data.sh b/download_data.sh new file mode 100644 index 0000000..1fbda90 --- /dev/null +++ b/download_data.sh @@ -0,0 +1,9 @@ +mkdir sample_data +mkdir -p output output/HumanoidIm/ output/HumanoidIm/phc_3 output/HumanoidIm/phc_comp_3 output/HumanoidIm/pulse_vae_iclr +gdown https://drive.google.com/uc?id=1bLp4SNIZROMB7Sxgt0Mh4-4BLOPGV9_U -O sample_data/ # filtered shapes from AMASS +gdown https://drive.google.com/uc?id=1arpCsue3Knqttj75Nt9Mwo32TKC4TYDx -O sample_data/ # all shapes from AMASS +gdown https://drive.google.com/uc?id=1fFauJE0W0nJfihUvjViq9OzmFfHo_rq0 -O sample_data/ # sample standing neutral data. +gdown https://drive.google.com/uc?id=1uzFkT2s_zVdnAohPWHOLFcyRDq372Fmc -O sample_data/ # amass_occlusion_v3 +gdown https://drive.google.com/uc?id=1ztyljPCzeRwQEJqtlME90gZwMXLhGTOQ -O output/HumanoidIm/pulse_vae_iclr/ +gdown https://drive.google.com/uc?id=1JbK9Vzo1bEY8Pig6D92yAUv8l-1rKWo3 -O output/HumanoidIm/phc_comp_3/ +gdown https://drive.google.com/uc?id=1pS1bRUbKFDp6o6ZJ9XSFaBlXv6_PrhNc -O output/HumanoidIm/phc_3/ \ No newline at end of file diff --git a/phc/__init__.py b/phc/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/Chest.stl b/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/Chest.stl new file mode 100644 index 0000000000000000000000000000000000000000..27d555a3c7e061bde76de4a947a53481aa1851b9 GIT binary patch literal 4984 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

uHe=p3L06c@ H8Uy$r{M4!; literal 0 HcmV?d00001 diff --git a/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Hand.stl b/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Hand.stl new file mode 100644 index 0000000000000000000000000000000000000000..83fa38973c9587dbcd617ca709cbaab2bb64bed6 GIT binary patch literal 4984 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

ay8zRBe23T4e%eX CvNJ9K literal 0 HcmV?d00001 diff --git a/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Shoulder.stl b/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Shoulder.stl new file mode 100644 index 0000000000000000000000000000000000000000..594e7e93a8eec0e8348bcbadac2861c68fdca352 GIT binary patch literal 4584 zcma)7Tde*YxlAsrS~cTW@_Go19}z zNJ}nEFeGPYXrnVT(^8WS+N8vcM16uGak(~XR-iT{IV};os6q z?)Zc#=JPrd&|Xi*yT&Tomky+%c)N0bik_Mm|J~nG8lV95KVHatBivcVl7VX5Z;rG) zI)-W7ciXf(a;bJ_Jux2^Hknwy%$?S>=ZTt$CF)eq5GCF+ngo3Rt+X!o1DKY6jQ#7- zaOKtbOkq~D8{vZvVx{{Pco9a*A0H;pWmU?|0*!KAEhl68p0Zb!Gw2{oeB>l{T?iEy zX5Ao~N981|WRv6}6a8KsXV!r&>Srl&5+SLOA3$S^hF^5JL&y5hm539%1d`K~%fcpc z$q(Rc%y+6w$3(U#JVTf}du@{+7qA_(z=8*C>Y zeATOZvn66rRbS=H{w4*|dq`e{q@Z+G-QuIl?FrSS9b{ z*B^bTQooYEU0~w4Dy+g?u=ncVF4|vf;;MT;I`!kDB*opxpj{``j`w6g^Eu0SiP@PQ zNbF>oz^XM)(`ido(YSJ3G63(7&q(rN3VUEe(ZXQXmIZ! zu{{PBFnzBL(*Q?ZtLb~Y(}hTCR9|{dP~syOle#rWqVH?U)AG#*Wb8k4yL;`kMsr9IuNf6rgr%H*Mu5JUV5QL|_#@ ze}HFyc4xMrRs4(Q2Tj-mtMI%5>|E!~F8LJmEVmC7Okfr68-U{6y`c}z1uJ;Qbx8zP$$1qUlOay6)6sV)Pf7$<#XihX>LL}I zMVbBm=s9;@x&2`YKi;R3p1$d&-1p6A&3?WL&JvtN0L3mIqHB-`%hrVoOkkCKf)1`; zB7LuhJ-_EK5m<%005GKAYh{1HDxUdpFI~R*g>B5&In3&CpWv#nH-L7`2(`7lh_5JW zkO-`r<&mJA^fs`_#M3r_(UTp-@Z*lu_243oJ@8wC{Q#D=Joi65(=} zMw*{GQvCgZ?>xXwZ4ZgCl!)1>?Gk}i*bkt-bDZ$C_M@o{{v3PY3b7x+G<3v9(rFVFKbg2AFDTMPSi->KC(xBY>*lpSR^bPDkK8GqIkvt z1_h7dOSiVtli{4d8hV#l>-Um?AIDMrX5hC3KxZ1pZ=7kRUhOj^0;}+A2QcrNfra*_ zQHN3a5`k6nJNUeN9J@C!S9tZtFLX8neWVtZa$ED!eBEue-(k-lv1u z-VsGKYJ>v~8WO``a$ytxPQ-5_!1c;verv)|7CuKNuu6WT4An;Q)+d{AokeX)DO7yF z-AF8xbqc=Q@_Ecn%N1qGPn7AAg%W{P_$30^)m9*kiQkb~fBCCKU={WQ2=yrxIa>}B zbNhVtEfgrlU5{v_#!;#Y(*Wi@dE%!ht7*`jB8k8^6=x+t`l39cjS8bVrK=?ZtK_QA znoJ^N#Uy&=%v6f2!tX2g16Ukp66E9XBWWmlxPt>vyCQw<03GDlN0*^_zd+I4fp%9 zs10K!0I6rWO_PpBYD8@R5^8tsdCBn1s z=Sq2aHiI9g`C}U3m+K{B)tPD3{9Y}^9(Y~3yAzX&#M@nCsNZ@bd0-VzB7ixXOfhie zB)aePF^Rw`oO}Ss21khA^TAZRY+8NAjvVHKtU z-fYR|QQZsK{bRQ&CUDl`FF<=0Fx`Cd0k^a z{+RuVsTEhqB})zileG!&7WWO{)F-*TzRSqo1UX9t?i;27uHDu1omcbO%zY6Of!D<} Gz<&WR@Z0_X literal 0 HcmV?d00001 diff --git a/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Thorax.stl b/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Thorax.stl new file mode 100644 index 0000000000000000000000000000000000000000..21898676ae30f1544ed93f926375c0a5614e7e36 GIT binary patch literal 4884 zcma)MkgMofYgG=_s6;B|Q0=@bI!hECOgfE14x>?Q zL>d_yDLOpQN_I{;WOnFsNHI~eyP9%JjcdOj@AYlJpYPxL-|M;m>%Z3P6|!k_KxjyO zKukzPxN1d2MCitl7*&uaToWA-qgki&aIse{4hhx3|M~OR*7@4T(W!|GdD$Hk{yMr@ zw$n4N+N-;W)b;krv5&?RI6tJiJS~9~?Mf##u761Y5AGyW&mlv3m%Nl)RJ6)2Iv)A<)8!8aLP^c(hs1vuk?^{h2FSGxVxy}b&=(f> zWK7^HtPOBBCW4v97Soi+?F19JN}% zzS?98!vtP8F7KRNTjwgNmY>yXcs=)`^Xhzf*sTvV{jZd2`S@Gu_M$(8PDG8Dohp9C z#gadWsZoA)?vla&u#}u%Dd9Qe4gm}n__2R)oGUjb^wFxDu4L=|wWPb$nc#VN{%J|x zB`QQ!lCJHlY{yo*Q}>}_ZRXFLGs@-WMYqV+k0WF}XFMB#8kaa4+SjJc`g*nCD@=<- z^VtMu^URu@zp10BV>gq6o(fWUxKeNlo-DxCGtsPM^)AW+r%_DcDskp>>O$Do8$D$B znd=nq5br!Ka}IIion-Gouy*IWPi$a1Mdfsq**rS-yBTEZQ(da>vy9+%vBvi#IBZhex_|Z!xcR}Zx-mB zFEtMOg-mg%CD<{dOYWM*al4Z$I-!0B-SfCp?&>om$@?Y2CD=UxC#|CR=@*{V;hQvp zz*VCMn&jUN7|FSyO(Q7Y+en|Ry(H=VCzy@R;*!gfQWE^LO#D1&SKa%mgiIUrkl=0s zj-*VITHBIX$;Boq%WQ;XXs1if6RHW`IsR?{=_ZZxjxFENCwsOrm-la~0NRlf)XuEOUApgQb0 z?YO;;e_T}{5O@Yy4?y4EhM6CUQ8J&a8SV;yA4~%TWry=Izg5uIsm@ZF|2Y|2`bkUa zH3{cDKJx%eJHnY%x}Lsr*dv?|>`KvBxrGs|D>Io|slKXyhVIDXu0d57Y=Y?rM67`j*0)eY0{@ozM z(eu*Y>r&S3J^2>G6 z3_A{IJ3fy9bB|x7MPpydad*Q60$1Vr1B9Pi!wP??LYt*tb4)B^3>_)H|JiKUz!%+!fxF_ExhDRu-3RV)MX*4$Ge;7v}X5_qUgY zo!7rTCJz*TBrQLCXnobSEm;XKie!13P=UZzi5bE2n}r`p(WifDiTNvXl+f1!^wNuP zhBa_@iCx*WR49&ab~LvjL?E!QFb%*v0=b{`j2bx@C>hs_23E#CiB>+xk zY~ZWz)zh($?PN^gDx5I@k)~>8P;Wfj;r*ICnounNFsqN`?jKL^&c%KBB~Mj0e2HiI zJ#7Mkt3(Y0_efqoIiF72HicphoND;)0%(~X$uC%(pzVuB3j|&l(*Q~Rf!y7D7QN~F zi1s?w%m4LoBANa^1SgT0B?UUc+=;r-19ugHz{!AVfRSk~+#^j*_t_dU{JMK?T`J2~ z4rEzJ4iPoH)XVv*s6t{~rY{h<3a1^w^aDfrw@a+qrj~ZPXGykfTKV=D(jf;71p-%z8q>BpvULHzO5$^4A${--hqDVH zqhDe5Jx8O2^ug~3>@k3s8^6%YKCblFDJum6ClRIr z>_7cY{RYfwyREN4;Pk;Xz?nWnR=zBkLajY}_eYPUDt<$n+6#r3jHuyPttS7QdXd|5)67Sv#Fh=l=M&K;W#!G=Sa^4;I+oL{|EZ z7P`WnU>e}kPy=pqFqDoN>C7e>WyuqR?a4rPCBbQjJqGZP>ub14SvS3Qb%wHI;xSpB z@`2cW_puu16;369)S;f-SFe|zyt7Xr@c$1?1DHFNlktVoOz%Rz(i@p8>!%H(HBouh z_%(@XfP-u1@n@ISY*~7+K;SCeEkJblnd zo+>x>w@OaeZwUWCu=BNF_r+Jd(_jTPPxllET!qh#_Kpg=t4vPIP<+h%1p;@1UjqQm zx4-56M<&tQKzo6}>tb4ab0#|R#TH}PR~8n+n*qC0bi0>NICt>cO&fKig?ZqqiMR9r E0I#vF%K!iX literal 0 HcmV?d00001 diff --git a/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Toe.stl b/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/L_Toe.stl new file mode 100644 index 0000000000000000000000000000000000000000..40b8e2ccee7590c069fff1805e0d806da9474962 GIT binary patch literal 4584 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 HFb(iO+qatX literal 0 HcmV?d00001 diff --git a/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/Neck.stl b/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/Neck.stl new file mode 100644 index 0000000000000000000000000000000000000000..9913d33f81dd34ba666f5cffba6bd2f8dc0c5705 GIT binary patch literal 4684 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 literal 0 HcmV?d00001 diff --git a/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Elbow.stl b/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Elbow.stl new file mode 100644 index 0000000000000000000000000000000000000000..b869bbee3784709ce325fd7aecbadf6fb014032c GIT binary patch literal 4984 zcma)=dt8m_7ROhdlR88y(zvvxK{=-q2OfA{*X^;~}Ix1PPDVv~|*FOFR` zTNj%UubGmNuy|3dPO~5;K4#f$UCcbq052TvbrLyZH zJ8J#p8D04BvgDHPK&=k@(5mtvX-b1Lz5l44cKO^#0=UBx6`1;0l3!FJkBS~f+Ag?P zJ>2L-UKDteLEHa9@5$Cg(_bc_ZS<|SsWA~c>t7``+@M51Y9vDvml=)S^875v1`(~U zp9JY4J|o{uCxZ)`)Ys1|{Jl46O~jSN95OE^O_}>H!hb{GFmhgh$TxXG4;4p=H6kK| zNy9dS(xZWs{0EOD=&-HI>zF9y#q|JY6ekd$T7wdmQz#HPFRlmho%J{c>Z(+}+fg}C zU`C2U->TWSCX$IuEJ$_#Bs%iPVBr)1Vitd`ba&UNai0bX1U@T#h5$a}(iF>_JUZ~F zt5WD)A95gNCY@lvTC!NxE>#@NWZ+vToCv`3R&V8Qw+=dGqKBgC`BbXgwVplRk|W_& zRrKF2Sx?Sl5PsWqxr4z>wsJzz;8)=^?3Wb&`9!_3a7b4==hbj(SK}tV-P47ZM0wL0 zgW8SP&Y838*|roQq#4-Iqp3XTcrdw{aKSjqcRkbEbxJ;6x2Ud$Os0u?BZ;f(wYE2V z_VgZI@i9fgM7@QXe@Rg;ZEKxIFb&YZAcNVLRMI&24J9mTPW|=4LYmcW8FB`Z8?swzCvB@*Ak@Hlu_^(Y#%z~g zP)BuKg-#%Fcj0;f#^l?wC*47h?OZ4jI4`CF!q=p5<5yn9XNxZjpJ78EpBt&VCFl9J zk29yUO8otowS=mLyPRp3#+=pL?luCL9VFai#53|Z+eO)%)~22etyaATpOHE{o~RbX zi|N4bP(fa;8Bo*J-|_!PgFaSiOdmbWN5$5p^{yWeN8#crUqaW(@ZM?vKxLf2i-h?@+hj>rB&N zd&>wi{hUE*cC4UnlYIzCVO8n~~1(YKtXx>KhG0!QI`0NS9Bv^r8p{fkn0W$%st-*ve_)8{)0a|zEYfKGi9(JWcU zBaZB6Ypr9Ycx?vzTai}9d9f-1j<^&s^F4vouQW-RgLw8em2-9K#?RDhGnnRJoYg0` zaNbs0`OPc^D+8+!&n|#@6T5H?*+v^S&kzZuV@v~Nj!)p@;jnC#(p|>Bi|<*y!Gwx5 zK0`Nv*X|2(@rT)Ojrpx3g_kVAg`_t2 z?YSmW+%H-noSMqie})p{(93UBOaoNpF5v|?on@_EnT%f+xF>LT0krH%<7-#+BQAZM zDJF1~s1mEj#r&{^vpl4=T&RIxHMkytLcZWDn**ihu<;6h6=5e5-N$RS!b=L*8grhy z2n1FirU6>}_u-AZ+{nM{CI|%1EB5)ZGZrk)E0xFQrO`?kp!yFP40Kt3STR`n00H~` z*sI7C?p&i42pokw4PfYfJ7w;JH*{mK2##kF_IBJi0Q#6n-ZW`GaocRe@jYWLi7xtb zU>vVMf1X|sx-9eu-Ur?vK+OgNzw}`%b?mv1Vt>U^;y&girg5ty@l=1OL&5}(5>;ZG zvz#9tw2wx03J@ca%7<;TN9ncy~2~EJr_RE3hQnZpO5GayXG8clSXxC z9lA+?xOsrdpB-4>O`Skszrr*?uA@D#ICeU%6r_4(Vhz=rd-=}dL zg;Em z0_VlFNr@f~+%mgX>e?k-R6F{0FP?6wU%70%{YRSCJ3-hvR*a|;zT%J^*m#}(erBma K;3#}<0Dl6yuOy`a literal 0 HcmV?d00001 diff --git a/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Hand.stl b/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Hand.stl new file mode 100644 index 0000000000000000000000000000000000000000..5252c2592574dbec7728ee5da0bac8ca83488009 GIT binary patch literal 4984 zcma)=d0dTK7spqZs7{ih%QcmR3b&hC=RD8O5M^k(y~z-gUPY8jN_9G!QsgAzqN_qE zp$wt(?7e9)e7fDZVxyhjM#J=ODqTAbD z1EmQ{^V6=$d?hyv%%9e zmposHSS_V$S)c6`1e`|n0tkY=NCo3PjI zr(I3-%nJw2_CGt)wd2mw_IdZz#;B~D*`=?ud5>EsWXoA9s&+X~8-B`CH^N6lr*Dlk zWO#-ep9ElksF4-vy}5fS^kkmVC20a+*p?O~1NwetD zA_`X$g$M!8{xd+XyuX5PEXk82J%>o8-7eF}x4~+BkE@4l zqI&9sUKEbHR_YGbs@0v{=;HiL!?T)$698@px$uGgw#dcSBLo6l9qo}!haNDeeS9+w z0L{0Lvg^S+q=RkI0)ZhvXKvu8bCqiqS3Wk8}N&YQMG4A%GCoBNbK?x5+<+})))W_ z-yZyatwer!RK_rY^#kh)KvKYV#+^e*a$2=O;BzqzpsBOtEen5>bG|tf>;qT3Si9}E z1x(rAncTVSB@oyOzXCwdFP7wH&2agohaazdFU534pMzZM5H?*(`2LtUzF^ zF=c7=-JvP8ox2;A`udscY=eHQoLC*q@hjrj#hMQ=E&njP(=tg8?YDyCUoe5A1z6P- z%EMWOTr_{XFbz(f-b~X?MpEZOa|KTZ03O_jce&V?yY}wL^>0=5*ux6C^W6@&o7J0W z!4Xg66?{-22_<8C(cV}gY4xsfPL4tOdzmTipO}VLqIY09=Y8}RO{>I z8y+^SHDRehV5 zXzTstW6QR%*yGUzM}n>JBm(H>6iV{_n^|M5H(RoBsFZ)NieAq1Gn~sED+T72({`&2 z1NH}CnPe~9mPPU&3(6U;C2WPG1qe0`<7Mo;eB%8k8Rr>K88PQxHgouz$<4BV&te&O zDz?HjKunJ&Ip=N>4e|*m_!aSF5S2PG@RR&w@oHK(Y>_}oLDqm5&P2w%n_d@Oec2pR%uM)sLnzO8g;oRiMK|)kG5|JqPn8MFj z*z?l(3lyJ=^$P14K-Oo%RdwIkQm2Q)_KK?y)5fof9bT1BuAT*sIOsL$~u z4ZHtMua#H}{ektWxye&I(#HSL~YNic!W#r+RZlW|Yp(`Obt>=8n+_ThVAtpr%m&5=}$ z+Q7y{j}eH3U)&_K!U~#IbIlFY#xIuNhRC^r^LUx=v!J3_6LJ0l3Wq(A?EmV{bFTVu zth?9>e*plreAkKO_!hBMcf5pe1Kc0@Bmk3`RlNRIBeiNMWLS4`g^N`(edr%-&Fc`Z zrMAN4#Py1+2f)kx3j2@Z%456q6{a)pC`<#GZVMyciScx4`Xg5Lha~wuJVu@BqAT$| zaQ*?}5A^5OX2ax6I}d_YAIFY&UjW^co_yO#m8|&9BDkut6{d~%@M@8B939!B?-p~c zGB_$RAA`0=${$zXr{SB|2n4pm+ZjM)=tTMHDMw{sNRmKcE4(uTH1wRrQ-7Z$zx}bZ{|uhnwb(i903c+0^5*8rHfVYKr8 jW-4FzxU(?T@ZN@LV_n4*XhyF~<(Wm%f)5-CrUCv7KNBwn literal 0 HcmV?d00001 diff --git a/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Hip.stl b/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Hip.stl new file mode 100644 index 0000000000000000000000000000000000000000..81e9f7b9802fa779d44cade3f42853902e3785ed GIT binary patch literal 4884 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 Ee^L5Hb^rhX literal 0 HcmV?d00001 diff --git a/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Shoulder.stl b/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/R_Shoulder.stl new file mode 100644 index 0000000000000000000000000000000000000000..282b29eaa3d8635ee6ff8c9b9174e39aac7f8c52 GIT binary patch literal 4884 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 X&xfA8Es|GHl8rrADg;(xj{*D-fIY+D literal 0 HcmV?d00001 diff --git a/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/Torso.stl b/phc/data/assets/mesh/smpl/1c00fde5-abea-4340-b528-921965f3a020/geom/Torso.stl new file mode 100644 index 0000000000000000000000000000000000000000..6c8d90d4f0a91591da107c67d7b5e11c7f424b19 GIT binary patch literal 4884 zcma)Doqjkg;o!HH~Gm-u`@!zwYnf-}5=obI$ob-{-u+QE>_3(NW3a@li30 zEvLrBL@$hrx16V2tcwkg*F{XWL`Cc1|NMou$Msm=hrPQsnQag7CBE5tg~Ii{B7M6QWW?X(K{88<<|E|><^vj*^+xjgnCAz%N>4D5K7=)jVf-R%MjMwdb%s zWG>7GeZwEl_YpIO=W91!7i(iCR7p{7J}b15#%5)EKAXd`bu8_vV}#0Z=n*N$lb zn}#ytv(SXziB4f9an)Kye+!bZ{T+E@e@KJuZzLKZciwP5d!q+U{Fo$KJWp3Wcld&4JV;aS2bL<=OTVNo-d}&Vk1a)$ zc!$-#G@vj+BJe)!o1d#ycTK40{@nJ{_4j7Ms%i@{-TQqo+NT$b>N|oT71t_pF5Hn*#*u;Om`myeOfL7+!g|66AP4K!n zAApPLms))fjrx=?VwjjyyI1?zz)ADZHzXRMXY6$Gcvxqq2ENe>Uyjx8)pnres|uA? zqbzOoSM|gwwOGM4K<~2`xQjA}E-{P{n80U+X@K4KnY>rWAex%BR3dQgmL+%WBDvrW5K#9(S z%^T;)>{4$in7~nTpZi=fV!q>o+11sZNa69FWbgzFnsK|v9ryfaL~38&wbGG3N!JTZ z;3#?Lddt7_Sy3H4k;3Wqi}8j$DoJWz`QoiZjnsjD7mVz zICpVooug>DzfS9I9Hp)4X~dJ?))DM>vcui>Zc}_VY^U~S@$6KCP@F8RY4ogvQs2oP zmCC$%k73JM;g#D8Ca_;&j{&e>5X48hC9}MfJqado6m|)Km$PEX+}oKn`Q6 zvAY61x~^k=Zr!AnR@su*;wVhF&%qi-ww9)|qoha~b~u2Dnby>@=&1+Ru6*Y?z0CM; zM$Yt>zg}Ph*N*A-K0j*8ZO)9KxlAp{HXuL zWcJ7^S9DPB;G)qQsO> zAlU8jZ31LaJv-OA2lcb?pqRk-A@9SrVVx6SG$0!PWy;QPu}lIR!BcPdE? zSA{FV(+*(R8_>2D>Hy3x@y|k~CaxHFuoz_8rN19Q1 zb^+XKd(X$mhl==sCI$b4CmH@`02m!ntnSr0(kr7<1a<&iJ9Z_2R~}oG@ola&x_-Gt zU?;*fz}-yBnqS+on>juT&Vkp(uQLG8o6A`7rf^D(_ec(h`vdn4K=ST%mS#IZTaneD z>`8T_^`mRmUrTgS4}M0BN@v})E#y?#9}4~l*N*oDVB(j|Uhg+hPkaidI0vTXu6;LB z&n5>qs9he+mk1ms>*{TAJTttQ!#6*^N}N_X(9Je8G`C#^1izMWZh-A$0@;pp=lL=3 zdWs3WF4i%CPo*<^LRblS?n2PP9i_}NZQ3S9P1dsslyWCJf(nV z4j;;~cCo_oTMJ%KHkSz8E0_kDvTq%+6cN1d+hq*r!2W^hc9jf%&o7jP zifx0RDIuY%>hb9B-2XR~;9imYBhn*=|LL$yly%!qFo8W0=L5*kS;jXWNfOP6H%J6t z7t;WfODSo|&fo(wlNio{*Twq-D2lLA0}KjzR%)C?;3&K&fQe?Q%rC)&zsn?Yf1p=5 zo>%Q%`+GdQJ7g-)S@5l-U92mtH-N1#!&vO4r##;9j-*|zC9GqB>P>T)bMJ>de}1Dx zV7+1*V4m%LTIKYJcZ~LCTT+h`eb?T+`Ncj-$GF1wuT&Vy*01ywp$Dr8Ryg)~yb{3B zOe-ez + + +