Copy disabled (too large)
Download .txt
Showing preview only (91,860K chars total). Download the full file to get everything.
Repository: xlang-ai/text2reward
Branch: main
Commit: e7f57efcf76b
Files: 1448
Total size: 108.1 MB
Directory structure:
gitextract_y55nmmey/
├── .gitignore
├── ManiSkill2/
│ ├── CITATION.cff
│ ├── LICENSE
│ ├── README.md
│ ├── docker/
│ │ ├── 10_nvidia.json
│ │ ├── Dockerfile
│ │ ├── nvidia_icd.json
│ │ └── nvidia_layers.json
│ ├── docs/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── make.bat
│ │ └── source/
│ │ ├── benchmark/
│ │ │ └── submission.md
│ │ ├── concepts/
│ │ │ ├── controllers.md
│ │ │ ├── demonstrations.md
│ │ │ ├── environments.md
│ │ │ └── observation.md
│ │ ├── conf.py
│ │ ├── getting_started/
│ │ │ ├── docker.md
│ │ │ ├── installation.md
│ │ │ └── quickstart.md
│ │ └── index.rst
│ ├── examples/
│ │ ├── profile_speed/
│ │ │ ├── README.md
│ │ │ ├── profile_dmcontrol.py
│ │ │ └── profile_sapien.py
│ │ ├── submission/
│ │ │ ├── Dockerfile
│ │ │ └── user_solution.py
│ │ └── tutorials/
│ │ ├── .gitignore
│ │ ├── 1_quickstart.ipynb
│ │ ├── 2_reinforcement_learning.ipynb
│ │ ├── 3_imitation_learning.ipynb
│ │ ├── README.md
│ │ ├── advanced_rendering.ipynb
│ │ ├── customize_environments.ipynb
│ │ ├── imitation-learning/
│ │ │ ├── README.md
│ │ │ ├── bc_liftcube_rgbd.py
│ │ │ └── bc_liftcube_state.py
│ │ └── reinforcement-learning/
│ │ ├── README.md
│ │ ├── sb3_ppo_liftcube_rgbd.py
│ │ └── sb3_ppo_liftcube_state.py
│ ├── mani_skill2/
│ │ ├── __init__.py
│ │ ├── agents/
│ │ │ ├── __init__.py
│ │ │ ├── base_agent.py
│ │ │ ├── base_controller.py
│ │ │ ├── configs/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── mobile_panda/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── defaults.py
│ │ │ │ ├── panda/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── defaults.py
│ │ │ │ │ └── variants.py
│ │ │ │ └── xmate3/
│ │ │ │ ├── __init__.py
│ │ │ │ └── defaults.py
│ │ │ ├── controllers/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── passive_controller.py
│ │ │ │ ├── pd_base_vel.py
│ │ │ │ ├── pd_ee_pose.py
│ │ │ │ ├── pd_joint_pos.py
│ │ │ │ ├── pd_joint_pos_vel.py
│ │ │ │ └── pd_joint_vel.py
│ │ │ ├── robots/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── mobile_panda.py
│ │ │ │ ├── panda.py
│ │ │ │ └── xmate3.py
│ │ │ └── utils.py
│ │ ├── assets/
│ │ │ ├── .gitignore
│ │ │ ├── deformable_manipulation/
│ │ │ │ ├── beaker.glb
│ │ │ │ └── bottle.glb
│ │ │ ├── descriptions/
│ │ │ │ ├── bucket/
│ │ │ │ │ ├── bucket.stl
│ │ │ │ │ └── bucket_45.stl
│ │ │ │ ├── franka_description/
│ │ │ │ │ └── meshes/
│ │ │ │ │ ├── collision/
│ │ │ │ │ │ ├── finger.stl
│ │ │ │ │ │ ├── hand.stl
│ │ │ │ │ │ ├── link0.stl
│ │ │ │ │ │ ├── link1.stl
│ │ │ │ │ │ ├── link2.stl
│ │ │ │ │ │ ├── link3.stl
│ │ │ │ │ │ ├── link4.stl
│ │ │ │ │ │ ├── link5.stl
│ │ │ │ │ │ ├── link6.stl
│ │ │ │ │ │ └── link7.stl
│ │ │ │ │ └── visual/
│ │ │ │ │ ├── finger.dae
│ │ │ │ │ ├── hand.dae
│ │ │ │ │ ├── link0.dae
│ │ │ │ │ ├── link1.dae
│ │ │ │ │ ├── link2.dae
│ │ │ │ │ ├── link3.dae
│ │ │ │ │ ├── link4.dae
│ │ │ │ │ ├── link5.dae
│ │ │ │ │ ├── link6.dae
│ │ │ │ │ └── link7.dae
│ │ │ │ ├── mobile_panda_dual_arm.urdf
│ │ │ │ ├── mobile_panda_single_arm.urdf
│ │ │ │ ├── panda_bucket.srdf
│ │ │ │ ├── panda_bucket.urdf
│ │ │ │ ├── panda_pinch.srdf
│ │ │ │ ├── panda_pinch.urdf
│ │ │ │ ├── panda_stick.srdf
│ │ │ │ ├── panda_stick.urdf
│ │ │ │ ├── panda_v2.srdf
│ │ │ │ ├── panda_v2.urdf
│ │ │ │ ├── panda_v2_gripper.urdf
│ │ │ │ ├── panda_v3.srdf
│ │ │ │ ├── panda_v3.urdf
│ │ │ │ └── sciurus17_description/
│ │ │ │ └── meshes/
│ │ │ │ ├── collision/
│ │ │ │ │ ├── Base.stl
│ │ │ │ │ └── Body.stl
│ │ │ │ └── visual/
│ │ │ │ ├── Base.stl
│ │ │ │ └── Body.stl
│ │ │ ├── maniskill2-scene-2.glb
│ │ │ └── partnet_mobility/
│ │ │ ├── .gitignore
│ │ │ └── meta/
│ │ │ ├── info_bucket_train.json
│ │ │ ├── info_cabinet_door_train.json
│ │ │ ├── info_cabinet_drawer_train.json
│ │ │ ├── info_chair_train.json
│ │ │ └── info_faucet_train.json
│ │ ├── envs/
│ │ │ ├── __init__.py
│ │ │ ├── assembly/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── assembling_kits.py
│ │ │ │ ├── base_env.py
│ │ │ │ ├── peg_insertion_side.py
│ │ │ │ └── plug_charger.py
│ │ │ ├── misc/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── avoid_obstacles.py
│ │ │ │ └── turn_faucet.py
│ │ │ ├── mpm/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── RopeInit.pkl
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base_env.py
│ │ │ │ ├── excavate_env.py
│ │ │ │ ├── fill_env.py
│ │ │ │ ├── hang_env.py
│ │ │ │ ├── perlin.py
│ │ │ │ ├── pinch_env.py
│ │ │ │ ├── pour_env.py
│ │ │ │ ├── shader/
│ │ │ │ │ ├── common/
│ │ │ │ │ │ ├── lights.glsl
│ │ │ │ │ │ ├── shadow.glsl
│ │ │ │ │ │ └── view.glsl
│ │ │ │ │ └── point/
│ │ │ │ │ ├── composite.vert
│ │ │ │ │ ├── composite0.frag
│ │ │ │ │ ├── composite1.frag
│ │ │ │ │ ├── composite2.frag
│ │ │ │ │ ├── deferred.frag
│ │ │ │ │ ├── deferred.vert
│ │ │ │ │ ├── gbuffer.frag
│ │ │ │ │ ├── gbuffer.vert
│ │ │ │ │ ├── gbuffer1.frag
│ │ │ │ │ ├── gbuffer1.vert
│ │ │ │ │ ├── gbuffer2.frag
│ │ │ │ │ ├── gbuffer2.vert
│ │ │ │ │ ├── line.frag
│ │ │ │ │ ├── line.vert
│ │ │ │ │ ├── point.frag
│ │ │ │ │ ├── point.vert
│ │ │ │ │ ├── shadow.vert
│ │ │ │ │ ├── shadow_point.frag
│ │ │ │ │ └── shadow_point.vert
│ │ │ │ ├── utils.py
│ │ │ │ └── write_env.py
│ │ │ ├── ms1/
│ │ │ │ ├── README.md
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base_env.py
│ │ │ │ ├── move_bucket.py
│ │ │ │ ├── open_cabinet_door_drawer.py
│ │ │ │ └── push_chair.py
│ │ │ ├── pick_and_place/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base_env.py
│ │ │ │ ├── pick_clutter.py
│ │ │ │ ├── pick_cube.py
│ │ │ │ ├── pick_single.py
│ │ │ │ └── stack_cube.py
│ │ │ └── sapien_env.py
│ │ ├── evaluation/
│ │ │ ├── __init__.py
│ │ │ ├── evaluator.py
│ │ │ ├── run_evaluation.py
│ │ │ └── solution.py
│ │ ├── examples/
│ │ │ ├── __init__.py
│ │ │ ├── demo_manual_control.py
│ │ │ ├── demo_random_action.py
│ │ │ └── demo_vec_env.py
│ │ ├── sensors/
│ │ │ ├── __init__.py
│ │ │ ├── camera.py
│ │ │ └── depth_camera.py
│ │ ├── trajectory/
│ │ │ ├── __init__.py
│ │ │ ├── merge_trajectory.py
│ │ │ └── replay_trajectory.py
│ │ ├── utils/
│ │ │ ├── __init__.py
│ │ │ ├── bounding_cylinder.py
│ │ │ ├── common.py
│ │ │ ├── download_asset.py
│ │ │ ├── download_demo.py
│ │ │ ├── geometry.py
│ │ │ ├── io_utils.py
│ │ │ ├── logging_utils.py
│ │ │ ├── precompile_mpm.py
│ │ │ ├── registration.py
│ │ │ ├── sapien_utils.py
│ │ │ ├── trimesh_utils.py
│ │ │ ├── visualization/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── cv2_utils.py
│ │ │ │ ├── jupyter_utils.py
│ │ │ │ └── misc.py
│ │ │ └── wrappers/
│ │ │ ├── __init__.py
│ │ │ ├── common.py
│ │ │ ├── observation.py
│ │ │ ├── record.py
│ │ │ └── sb3.py
│ │ └── vector/
│ │ ├── __init__.py
│ │ ├── registration.py
│ │ ├── vec_env.py
│ │ └── wrappers/
│ │ ├── __init__.py
│ │ ├── observation.py
│ │ └── sb3.py
│ ├── pyproject.toml
│ ├── pyrightconfig.json
│ ├── requirements.txt
│ ├── setup.py
│ ├── tests/
│ │ ├── manual_test_venv.py
│ │ └── test_envs.py
│ └── warp_maniskill/
│ ├── .gitattributes
│ ├── .gitignore
│ ├── CHANGELOG.md
│ ├── LICENSE.md
│ ├── README.md
│ ├── VERSION.md
│ ├── __init__.py
│ ├── build_docs.py
│ ├── build_exports.py
│ ├── build_lib.py
│ ├── licenses/
│ │ ├── appdirs-LICENSE.txt
│ │ ├── assets/
│ │ │ ├── ant-LICENSE.txt
│ │ │ └── humanoid-LICENSE.txt
│ │ ├── cuda-LICENSE.txt
│ │ ├── fp16-LICENSE.txt
│ │ ├── moller-LICENSE.txt
│ │ ├── nanovdb-LICENSE.txt
│ │ ├── nvrtc-LICENSE.txt
│ │ ├── python37-LICENSE.txt
│ │ ├── python38-LICENSE.txt
│ │ ├── python39-LICENSE.txt
│ │ ├── svd-LICENSE.txt
│ │ └── usd-LICENSE.txt
│ ├── mpm/
│ │ ├── __init__.py
│ │ ├── height_rasterizer.py
│ │ ├── mpm_integrator.py
│ │ ├── mpm_model.py
│ │ └── mpm_simulator.py
│ ├── pyproject.toml
│ ├── setup.py
│ └── warp/
│ ├── __init__.py
│ ├── __init__.pyi
│ ├── bin/
│ │ └── .gitignore
│ ├── build.py
│ ├── builtins.py
│ ├── codegen.py
│ ├── config.py
│ ├── context.py
│ ├── distance.py
│ ├── native/
│ │ ├── array.h
│ │ ├── builtin.h
│ │ ├── bvh.cpp
│ │ ├── bvh.cu
│ │ ├── bvh.h
│ │ ├── crt.h
│ │ ├── dense_volume.cpp
│ │ ├── dense_volume.cu
│ │ ├── dense_volume.h
│ │ ├── exports.h
│ │ ├── hashgrid.cpp
│ │ ├── hashgrid.cu
│ │ ├── hashgrid.h
│ │ ├── intersect.h
│ │ ├── intersect_adj.h
│ │ ├── intersect_tri.h
│ │ ├── marching.cpp
│ │ ├── marching.cu
│ │ ├── marching.h
│ │ ├── mat22.h
│ │ ├── mat33.h
│ │ ├── mat44.h
│ │ ├── matnn.h
│ │ ├── mesh.cpp
│ │ ├── mesh.cu
│ │ ├── mesh.h
│ │ ├── nanovdb/
│ │ │ └── PNanoVDB.h
│ │ ├── noise.h
│ │ ├── quat.h
│ │ ├── rand.h
│ │ ├── range.h
│ │ ├── sort.cpp
│ │ ├── sort.cu
│ │ ├── sort.h
│ │ ├── spatial.h
│ │ ├── svd.h
│ │ ├── vec2.h
│ │ ├── vec3.h
│ │ ├── vec4.h
│ │ ├── volume.cpp
│ │ ├── volume.h
│ │ ├── warp.cpp
│ │ ├── warp.cu
│ │ └── warp.h
│ ├── render.py
│ ├── sim/
│ │ ├── __init__.py
│ │ ├── articulation.py
│ │ ├── collide.py
│ │ ├── import_mjcf.py
│ │ ├── import_snu.py
│ │ ├── import_urdf.py
│ │ ├── integrator_euler.py
│ │ ├── integrator_xpbd.py
│ │ ├── model.py
│ │ ├── optimizer.py
│ │ ├── particles.py
│ │ └── render.py
│ ├── stubs.py
│ ├── tape.py
│ ├── tests/
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ ├── assets/
│ │ │ ├── curlnoise_golden.npy
│ │ │ ├── mlp_golden.npy
│ │ │ └── pnoise_golden.npy
│ │ ├── test_all.py
│ │ ├── test_array.py
│ │ ├── test_base.py
│ │ ├── test_closest_point_edge_edge.py
│ │ ├── test_codegen.py
│ │ ├── test_compile_consts.py
│ │ ├── test_compile_consts_dummy.py
│ │ ├── test_conditional.py
│ │ ├── test_ctypes.py
│ │ ├── test_dense.py
│ │ ├── test_fp16.py
│ │ ├── test_func.py
│ │ ├── test_grad.py
│ │ ├── test_hash_grid.py
│ │ ├── test_import.py
│ │ ├── test_intersect.py
│ │ ├── test_launch.py
│ │ ├── test_marching_cubes.py
│ │ ├── test_mesh_query_aabb.py
│ │ ├── test_mesh_query_point.py
│ │ ├── test_mesh_query_ray.py
│ │ ├── test_misc.py
│ │ ├── test_mlp.py
│ │ ├── test_noise.py
│ │ ├── test_operators.py
│ │ ├── test_print.py
│ │ ├── test_rand.py
│ │ ├── test_reload.py
│ │ ├── test_rounding.py
│ │ ├── test_struct.py
│ │ ├── test_svd.py
│ │ ├── test_tape.py
│ │ ├── test_torch.py
│ │ └── test_volume.py
│ ├── thirdparty/
│ │ ├── __init__.py
│ │ └── appdirs.py
│ ├── torch.py
│ ├── types.py
│ └── utils.py
├── Metaworld/
│ ├── CONTRIBUTING.md
│ ├── LICENSE
│ ├── MANIFEST.in
│ ├── Makefile
│ ├── README.md
│ ├── docker/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ └── entrypoint-headless.sh
│ ├── metaworld/
│ │ ├── __init__.py
│ │ ├── envs/
│ │ │ ├── __init__.py
│ │ │ ├── asset_path_utils.py
│ │ │ ├── assets_updated/
│ │ │ │ └── sawyer_xyz/
│ │ │ │ └── dm_control_pick_place.ipynb
│ │ │ ├── assets_v1/
│ │ │ │ ├── classic_mujoco/
│ │ │ │ │ └── half_cheetah.xml
│ │ │ │ ├── meshes/
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ └── mug.stl
│ │ │ │ │ └── sawyer/
│ │ │ │ │ ├── GUIDE_WSG50_110.stl
│ │ │ │ │ ├── WSG-FMF.stl
│ │ │ │ │ ├── WSG50_110.stl
│ │ │ │ │ ├── base.stl
│ │ │ │ │ ├── eGripperBase.stl
│ │ │ │ │ ├── head.stl
│ │ │ │ │ ├── l0.stl
│ │ │ │ │ ├── l1.stl
│ │ │ │ │ ├── l2.stl
│ │ │ │ │ ├── l3.stl
│ │ │ │ │ ├── l4.stl
│ │ │ │ │ ├── l5.stl
│ │ │ │ │ ├── l6.stl
│ │ │ │ │ ├── pedestal.stl
│ │ │ │ │ ├── sawyer_ft/
│ │ │ │ │ │ ├── PEDESTAL.DAE
│ │ │ │ │ │ ├── PEDESTAL.stl
│ │ │ │ │ │ ├── base.DAE
│ │ │ │ │ │ ├── base.stl
│ │ │ │ │ │ ├── head.DAE
│ │ │ │ │ │ ├── head.stl
│ │ │ │ │ │ ├── l0.DAE
│ │ │ │ │ │ ├── l0.stl
│ │ │ │ │ │ ├── l1.DAE
│ │ │ │ │ │ ├── l1.stl
│ │ │ │ │ │ ├── l2.DAE
│ │ │ │ │ │ ├── l2.stl
│ │ │ │ │ │ ├── l3.DAE
│ │ │ │ │ │ ├── l3.stl
│ │ │ │ │ │ ├── l4.DAE
│ │ │ │ │ │ ├── l4.stl
│ │ │ │ │ │ ├── l5.DAE
│ │ │ │ │ │ ├── l5.stl
│ │ │ │ │ │ ├── l6.DAE
│ │ │ │ │ │ └── l6.stl
│ │ │ │ │ ├── sawyer_mp1/
│ │ │ │ │ │ ├── l6.DAE
│ │ │ │ │ │ └── l6.stl
│ │ │ │ │ ├── sawyer_mp3/
│ │ │ │ │ │ ├── l0.DAE
│ │ │ │ │ │ ├── l0.stl
│ │ │ │ │ │ ├── l1.DAE
│ │ │ │ │ │ └── l1.stl
│ │ │ │ │ └── sawyer_pv/
│ │ │ │ │ ├── base.DAE
│ │ │ │ │ ├── base.stl
│ │ │ │ │ ├── head.DAE
│ │ │ │ │ ├── head.stl
│ │ │ │ │ ├── l0.DAE
│ │ │ │ │ ├── l0.stl
│ │ │ │ │ ├── l1.DAE
│ │ │ │ │ ├── l1.stl
│ │ │ │ │ ├── l2.DAE
│ │ │ │ │ ├── l2.stl
│ │ │ │ │ ├── l3.DAE
│ │ │ │ │ ├── l3.stl
│ │ │ │ │ ├── l4.DAE
│ │ │ │ │ ├── l4.stl
│ │ │ │ │ ├── l5.DAE
│ │ │ │ │ ├── l5.stl
│ │ │ │ │ ├── l6.DAE
│ │ │ │ │ ├── l6.stl
│ │ │ │ │ ├── pedestal.DAE
│ │ │ │ │ └── pedestal.stl
│ │ │ │ ├── multi_object_sawyer_xyz/
│ │ │ │ │ ├── door_config.xml
│ │ │ │ │ ├── door_hook_config.xml
│ │ │ │ │ ├── sawyer_2_push_puck.xml
│ │ │ │ │ ├── sawyer_door.xml
│ │ │ │ │ ├── sawyer_door_pull.xml
│ │ │ │ │ ├── sawyer_door_pull_30.xml
│ │ │ │ │ ├── sawyer_door_pull_60.xml
│ │ │ │ │ ├── sawyer_door_pull_hook.xml
│ │ │ │ │ ├── sawyer_door_pull_hook_30.xml
│ │ │ │ │ ├── sawyer_door_pull_hook_45.xml
│ │ │ │ │ ├── sawyer_grasp.xml
│ │ │ │ │ ├── sawyer_multiobj.xml
│ │ │ │ │ ├── sawyer_pick_and_place.xml
│ │ │ │ │ ├── sawyer_pick_and_place_hidden_arm.xml
│ │ │ │ │ ├── sawyer_push_puck.xml
│ │ │ │ │ ├── sawyer_push_two_puck.xml
│ │ │ │ │ ├── sawyer_reach.xml
│ │ │ │ │ ├── sawyer_reach_torque.xml
│ │ │ │ │ ├── sawyer_wsg_base.xml
│ │ │ │ │ ├── sawyer_xyz_base.xml
│ │ │ │ │ ├── sawyer_xyz_base_door_hook.xml
│ │ │ │ │ ├── sawyer_xyz_base_hidden_arm.xml
│ │ │ │ │ ├── sawyer_xyz_base_small_table.xml
│ │ │ │ │ ├── sawyer_xyz_bin_base.xml
│ │ │ │ │ ├── sawyer_xyz_bin_base_gripper.xml
│ │ │ │ │ └── shared_config.xml
│ │ │ │ ├── multiobject_models/
│ │ │ │ │ ├── Bowl/
│ │ │ │ │ │ ├── Bowl.off
│ │ │ │ │ │ ├── Bowl.stl
│ │ │ │ │ │ ├── Bowl.wrl
│ │ │ │ │ │ ├── Bowl_GM.stl
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_005.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_006.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_007.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_008.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_009.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_010.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_011.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_012.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_013.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_014.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_015.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_016.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_017.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_018.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_019.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_020.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_021.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_022.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_023.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_024.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_025.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_026.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_027.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_028.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_029.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_030.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_031.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_032.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_033.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_034.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet_035.stl
│ │ │ │ │ ├── ElephantBowl/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── ElephantBowl.off
│ │ │ │ │ │ ├── ElephantBowl.stl
│ │ │ │ │ │ ├── ElephantBowl.wrl
│ │ │ │ │ │ ├── ElephantBowl_GM.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ ├── Fork/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── Fork.off
│ │ │ │ │ │ ├── Fork.stl
│ │ │ │ │ │ ├── Fork.wrl
│ │ │ │ │ │ ├── Fork_GM.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_005.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_006.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet_007.stl
│ │ │ │ │ ├── GlassBowl/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── GlassBowl.off
│ │ │ │ │ │ ├── GlassBowl.stl
│ │ │ │ │ │ ├── GlassBowl.wrl
│ │ │ │ │ │ ├── GlassBowl_GM.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_005.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_006.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_007.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_008.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_009.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_010.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_011.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_012.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_013.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_014.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_015.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_016.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_017.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_018.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_019.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_020.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_021.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_022.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_023.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_024.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_025.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_026.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_027.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_028.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_029.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_030.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_031.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_032.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_033.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet_034.stl
│ │ │ │ │ ├── Knife/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── Knife.off
│ │ │ │ │ │ ├── Knife.stl
│ │ │ │ │ │ ├── Knife.wrl
│ │ │ │ │ │ ├── Knife_GM.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet.stl
│ │ │ │ │ ├── LotusBowl01/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── LotusBowl01.off
│ │ │ │ │ │ ├── LotusBowl01.stl
│ │ │ │ │ │ ├── LotusBowl01.wrl
│ │ │ │ │ │ ├── LotusBowl01_GM.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_005.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_006.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_007.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_008.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_009.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_010.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_011.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_012.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_013.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_014.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_015.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_016.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_017.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_018.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_019.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_020.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_021.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_022.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_023.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_024.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_025.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_026.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_027.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_028.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_029.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_030.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_031.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_032.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_033.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet_034.stl
│ │ │ │ │ ├── RuggedBowl/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── RuggedBowl.off
│ │ │ │ │ │ ├── RuggedBowl.stl
│ │ │ │ │ │ ├── RuggedBowl.wrl
│ │ │ │ │ │ ├── RuggedBowl_GM.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_005.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_006.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_007.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_008.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_009.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_010.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_011.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_012.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet_013.stl
│ │ │ │ │ ├── ServingBowl/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── ServingBowl.off
│ │ │ │ │ │ ├── ServingBowl.stl
│ │ │ │ │ │ ├── ServingBowl.wrl
│ │ │ │ │ │ ├── ServingBowl_GM.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_005.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_006.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_007.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_008.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_009.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_010.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_011.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_012.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_013.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_014.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_015.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_016.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_017.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_018.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_019.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_020.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_021.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_022.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_023.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_024.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_025.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_026.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_027.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_028.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_029.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_030.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_031.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_032.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_033.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_034.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_035.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_036.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_037.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_038.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_039.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_040.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_041.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_042.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_043.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_044.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_045.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_046.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_047.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_048.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet_049.stl
│ │ │ │ │ ├── Spoon/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_005.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_006.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_007.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_008.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_009.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_010.stl
│ │ │ │ │ │ ├── Spoon.off
│ │ │ │ │ │ ├── Spoon.stl
│ │ │ │ │ │ ├── Spoon.wrl
│ │ │ │ │ │ └── Spoon_GM.stl
│ │ │ │ │ ├── cartgripper.xml
│ │ │ │ │ ├── cartgripper_getflows.xml
│ │ │ │ │ ├── cartgripper_grasp.xml
│ │ │ │ │ ├── cartgripper_noautogen.xml
│ │ │ │ │ ├── cartgripper_updown.xml
│ │ │ │ │ ├── cartgripper_updown_2cam.xml
│ │ │ │ │ ├── cartgripper_updown_2cam_noautogen.xml
│ │ │ │ │ ├── cartgripper_updown_rot.xml
│ │ │ │ │ ├── cartgripper_updown_whitefingers.xml
│ │ │ │ │ ├── generate_touch_sensors.py
│ │ │ │ │ ├── pushing2d.xml
│ │ │ │ │ ├── pushing2d_controller.xml
│ │ │ │ │ ├── pushing2d_controller_nomarkers.xml
│ │ │ │ │ ├── pushing2d_controller_touchsensor.xml
│ │ │ │ │ ├── pushing2d_controller_touchsensor_nomarkers.xml
│ │ │ │ │ ├── pushing2d_touch.xml
│ │ │ │ │ ├── sawyer_assets/
│ │ │ │ │ │ ├── meshes/
│ │ │ │ │ │ │ └── sawyer/
│ │ │ │ │ │ │ ├── GUIDE_WSG50_110.stl
│ │ │ │ │ │ │ ├── WSG-FMF.stl
│ │ │ │ │ │ │ ├── WSG50_110.stl
│ │ │ │ │ │ │ ├── base.stl
│ │ │ │ │ │ │ ├── head.stl
│ │ │ │ │ │ │ ├── l0.stl
│ │ │ │ │ │ │ ├── l1.stl
│ │ │ │ │ │ │ ├── l2.stl
│ │ │ │ │ │ │ ├── l3.stl
│ │ │ │ │ │ │ ├── l4.stl
│ │ │ │ │ │ │ ├── l5.stl
│ │ │ │ │ │ │ ├── l6.stl
│ │ │ │ │ │ │ ├── pedestal.stl
│ │ │ │ │ │ │ ├── sawyer_ft/
│ │ │ │ │ │ │ │ ├── PEDESTAL.DAE
│ │ │ │ │ │ │ │ ├── PEDESTAL.stl
│ │ │ │ │ │ │ │ ├── base.DAE
│ │ │ │ │ │ │ │ ├── base.stl
│ │ │ │ │ │ │ │ ├── head.DAE
│ │ │ │ │ │ │ │ ├── head.stl
│ │ │ │ │ │ │ │ ├── l0.DAE
│ │ │ │ │ │ │ │ ├── l0.stl
│ │ │ │ │ │ │ │ ├── l1.DAE
│ │ │ │ │ │ │ │ ├── l1.stl
│ │ │ │ │ │ │ │ ├── l2.DAE
│ │ │ │ │ │ │ │ ├── l2.stl
│ │ │ │ │ │ │ │ ├── l3.DAE
│ │ │ │ │ │ │ │ ├── l3.stl
│ │ │ │ │ │ │ │ ├── l4.DAE
│ │ │ │ │ │ │ │ ├── l4.stl
│ │ │ │ │ │ │ │ ├── l5.DAE
│ │ │ │ │ │ │ │ ├── l5.stl
│ │ │ │ │ │ │ │ ├── l6.DAE
│ │ │ │ │ │ │ │ └── l6.stl
│ │ │ │ │ │ │ ├── sawyer_mp1/
│ │ │ │ │ │ │ │ ├── l6.DAE
│ │ │ │ │ │ │ │ └── l6.stl
│ │ │ │ │ │ │ ├── sawyer_mp3/
│ │ │ │ │ │ │ │ ├── l0.DAE
│ │ │ │ │ │ │ │ ├── l0.stl
│ │ │ │ │ │ │ │ ├── l1.DAE
│ │ │ │ │ │ │ │ └── l1.stl
│ │ │ │ │ │ │ └── sawyer_pv/
│ │ │ │ │ │ │ ├── base.DAE
│ │ │ │ │ │ │ ├── base.stl
│ │ │ │ │ │ │ ├── head.DAE
│ │ │ │ │ │ │ ├── head.stl
│ │ │ │ │ │ │ ├── l0.DAE
│ │ │ │ │ │ │ ├── l0.stl
│ │ │ │ │ │ │ ├── l1.DAE
│ │ │ │ │ │ │ ├── l1.stl
│ │ │ │ │ │ │ ├── l2.DAE
│ │ │ │ │ │ │ ├── l2.stl
│ │ │ │ │ │ │ ├── l3.DAE
│ │ │ │ │ │ │ ├── l3.stl
│ │ │ │ │ │ │ ├── l4.DAE
│ │ │ │ │ │ │ ├── l4.stl
│ │ │ │ │ │ │ ├── l5.DAE
│ │ │ │ │ │ │ ├── l5.stl
│ │ │ │ │ │ │ ├── l6.DAE
│ │ │ │ │ │ │ ├── l6.stl
│ │ │ │ │ │ │ ├── pedestal.DAE
│ │ │ │ │ │ │ └── pedestal.stl
│ │ │ │ │ │ └── sawyer_xyz/
│ │ │ │ │ │ ├── sawyer_grasp.xml
│ │ │ │ │ │ ├── sawyer_wsg_base.xml
│ │ │ │ │ │ └── shared_config.xml
│ │ │ │ │ └── touchsensor.xml
│ │ │ │ └── sawyer_xyz/
│ │ │ │ ├── door_config.xml
│ │ │ │ ├── sawyer_assembly_peg.xml
│ │ │ │ ├── sawyer_assembly_peg_horizontal.xml
│ │ │ │ ├── sawyer_basketball.xml
│ │ │ │ ├── sawyer_bin_picking.xml
│ │ │ │ ├── sawyer_box.xml
│ │ │ │ ├── sawyer_button_press.xml
│ │ │ │ ├── sawyer_button_press_topdown.xml
│ │ │ │ ├── sawyer_button_press_topdown_wall.xml
│ │ │ │ ├── sawyer_button_press_wall.xml
│ │ │ │ ├── sawyer_coffee.xml
│ │ │ │ ├── sawyer_dial.xml
│ │ │ │ ├── sawyer_door_lock.xml
│ │ │ │ ├── sawyer_door_pull.xml
│ │ │ │ ├── sawyer_drawer.xml
│ │ │ │ ├── sawyer_faucet.xml
│ │ │ │ ├── sawyer_hammer.xml
│ │ │ │ ├── sawyer_handle_press.xml
│ │ │ │ ├── sawyer_handle_press_sideway.xml
│ │ │ │ ├── sawyer_handle_press_sideway_v2.xml
│ │ │ │ ├── sawyer_laptop.xml
│ │ │ │ ├── sawyer_lever_pull.xml
│ │ │ │ ├── sawyer_peg_insertion_side.xml
│ │ │ │ ├── sawyer_peg_unplug_side.xml
│ │ │ │ ├── sawyer_pick_and_place.xml
│ │ │ │ ├── sawyer_pick_out_of_hole.xml
│ │ │ │ ├── sawyer_pick_place_v2.xml
│ │ │ │ ├── sawyer_pick_place_wall_v2.xml
│ │ │ │ ├── sawyer_plate_slide.xml
│ │ │ │ ├── sawyer_plate_slide_sideway.xml
│ │ │ │ ├── sawyer_push_and_reach_mocap_goal_hidden.xml
│ │ │ │ ├── sawyer_push_back.xml
│ │ │ │ ├── sawyer_push_v2.xml
│ │ │ │ ├── sawyer_push_wall_v2.xml
│ │ │ │ ├── sawyer_pusher_no_table.xml
│ │ │ │ ├── sawyer_pusher_small_table.xml
│ │ │ │ ├── sawyer_reach_push_pick_and_place.xml
│ │ │ │ ├── sawyer_reach_push_pick_and_place_wall.xml
│ │ │ │ ├── sawyer_reach_v2.xml
│ │ │ │ ├── sawyer_reach_wall_v2.xml
│ │ │ │ ├── sawyer_shelf_placing.xml
│ │ │ │ ├── sawyer_shelf_removing.xml
│ │ │ │ ├── sawyer_soccer.xml
│ │ │ │ ├── sawyer_stick_obj.xml
│ │ │ │ ├── sawyer_sweep.xml
│ │ │ │ ├── sawyer_sweep_tool.xml
│ │ │ │ ├── sawyer_table_with_hole.xml
│ │ │ │ ├── sawyer_table_with_hole_no_puck.xml
│ │ │ │ ├── sawyer_window.xml
│ │ │ │ ├── sawyer_window_horizontal.xml
│ │ │ │ ├── sawyer_xyz_base.xml
│ │ │ │ ├── sawyer_xyz_base_no_table.xml
│ │ │ │ ├── shared_config.xml
│ │ │ │ └── visual_config.xml
│ │ │ ├── assets_v2/
│ │ │ │ ├── objects/
│ │ │ │ │ ├── assembly_peg.xml
│ │ │ │ │ ├── assets/
│ │ │ │ │ │ ├── assembly_peg.xml
│ │ │ │ │ │ ├── assembly_peg_dependencies.xml
│ │ │ │ │ │ ├── basketball.xml
│ │ │ │ │ │ ├── basketball_dependencies.xml
│ │ │ │ │ │ ├── basketballhoop.xml
│ │ │ │ │ │ ├── binA.xml
│ │ │ │ │ │ ├── binB.xml
│ │ │ │ │ │ ├── bin_dependencies.xml
│ │ │ │ │ │ ├── block.xml
│ │ │ │ │ │ ├── block_cyl.xml
│ │ │ │ │ │ ├── block_dependencies.xml
│ │ │ │ │ │ ├── box.xml
│ │ │ │ │ │ ├── box_dependencies.xml
│ │ │ │ │ │ ├── boxtop.xml
│ │ │ │ │ │ ├── buttonbox.xml
│ │ │ │ │ │ ├── buttonbox_dependencies.xml
│ │ │ │ │ │ ├── club.xml
│ │ │ │ │ │ ├── club_dependencies.xml
│ │ │ │ │ │ ├── coffeemachine.xml
│ │ │ │ │ │ ├── coffeemachine_dependencies.xml
│ │ │ │ │ │ ├── dial.xml
│ │ │ │ │ │ ├── dial_dependencies.xml
│ │ │ │ │ │ ├── doorlockA.xml
│ │ │ │ │ │ ├── doorlockB.xml
│ │ │ │ │ │ ├── doorlock_dependencies.xml
│ │ │ │ │ │ ├── drawer.xml
│ │ │ │ │ │ ├── drawer_dependencies.xml
│ │ │ │ │ │ ├── faucet.xml
│ │ │ │ │ │ ├── faucet_dependencies.xml
│ │ │ │ │ │ ├── hammer.xml
│ │ │ │ │ │ ├── hammer_dependencies.xml
│ │ │ │ │ │ ├── hammerblock.xml
│ │ │ │ │ │ ├── handle_press.xml
│ │ │ │ │ │ ├── handle_press_dependencies.xml
│ │ │ │ │ │ ├── laptop.xml
│ │ │ │ │ │ ├── laptop_dependencies.xml
│ │ │ │ │ │ ├── lever.xml
│ │ │ │ │ │ ├── lever_dependencies.xml
│ │ │ │ │ │ ├── mug.xml
│ │ │ │ │ │ ├── objA.xml
│ │ │ │ │ │ ├── peg_block.xml
│ │ │ │ │ │ ├── peg_block_dependencies.xml
│ │ │ │ │ │ ├── peg_insert.xml
│ │ │ │ │ │ ├── peg_insert_dependencies.xml
│ │ │ │ │ │ ├── plug.xml
│ │ │ │ │ │ ├── plug_dependencies.xml
│ │ │ │ │ │ ├── plug_wall.xml
│ │ │ │ │ │ ├── plug_wall_dependencies.xml
│ │ │ │ │ │ ├── puck.xml
│ │ │ │ │ │ ├── puck_goal.xml
│ │ │ │ │ │ ├── puck_goal_dependencies.xml
│ │ │ │ │ │ ├── shelf.xml
│ │ │ │ │ │ ├── shelf_dependencies.xml
│ │ │ │ │ │ ├── shelfb.xml
│ │ │ │ │ │ ├── shelfb_dependencies.xml
│ │ │ │ │ │ ├── soccer_ball.xml
│ │ │ │ │ │ ├── soccer_dependencies.xml
│ │ │ │ │ │ ├── soccer_goal.xml
│ │ │ │ │ │ ├── stick.xml
│ │ │ │ │ │ ├── stick_dependencies.xml
│ │ │ │ │ │ ├── table.xml
│ │ │ │ │ │ ├── table_dependencies.xml
│ │ │ │ │ │ ├── table_hole.xml
│ │ │ │ │ │ ├── thermos.xml
│ │ │ │ │ │ ├── thermos_dependencies.xml
│ │ │ │ │ │ ├── wall.xml
│ │ │ │ │ │ ├── wall_dependencies.xml
│ │ │ │ │ │ ├── window.xml
│ │ │ │ │ │ ├── window_dependencies.xml
│ │ │ │ │ │ ├── window_horiz.xml
│ │ │ │ │ │ ├── xyz_base.xml
│ │ │ │ │ │ └── xyz_base_dependencies.xml
│ │ │ │ │ ├── basketball.xml
│ │ │ │ │ ├── basketballhoop.xml
│ │ │ │ │ ├── binA.xml
│ │ │ │ │ ├── binB.xml
│ │ │ │ │ ├── block.xml
│ │ │ │ │ ├── block_cyl.xml
│ │ │ │ │ ├── box.xml
│ │ │ │ │ ├── buttonbox.xml
│ │ │ │ │ ├── club.xml
│ │ │ │ │ ├── coffeemachine.xml
│ │ │ │ │ ├── dial.xml
│ │ │ │ │ ├── doorlockA.xml
│ │ │ │ │ ├── doorlockB.xml
│ │ │ │ │ ├── drawer.xml
│ │ │ │ │ ├── faucet.xml
│ │ │ │ │ ├── hammer.xml
│ │ │ │ │ ├── hammerblock.xml
│ │ │ │ │ ├── handle_press.xml
│ │ │ │ │ ├── laptop.xml
│ │ │ │ │ ├── lever.xml
│ │ │ │ │ ├── meshes/
│ │ │ │ │ │ ├── assembly_peg/
│ │ │ │ │ │ │ ├── assembly_peg_handle.stl
│ │ │ │ │ │ │ ├── assembly_peg_ring.stl
│ │ │ │ │ │ │ └── assembly_peg_rod.stl
│ │ │ │ │ │ ├── basketball/
│ │ │ │ │ │ │ ├── backboard.stl
│ │ │ │ │ │ │ ├── backboardsquareinner.stl
│ │ │ │ │ │ │ ├── backboardsquareouter.stl
│ │ │ │ │ │ │ ├── basketballinner.stl
│ │ │ │ │ │ │ ├── basketballouter.stl
│ │ │ │ │ │ │ ├── hoop.stl
│ │ │ │ │ │ │ └── pole.stl
│ │ │ │ │ │ ├── bin/
│ │ │ │ │ │ │ └── bin.stl
│ │ │ │ │ │ ├── block/
│ │ │ │ │ │ │ └── block.stl
│ │ │ │ │ │ ├── box/
│ │ │ │ │ │ │ ├── boxhandle.stl
│ │ │ │ │ │ │ └── boxtop.stl
│ │ │ │ │ │ ├── buttonbox/
│ │ │ │ │ │ │ ├── button.stl
│ │ │ │ │ │ │ ├── buttonring.stl
│ │ │ │ │ │ │ ├── stopbot.stl
│ │ │ │ │ │ │ ├── stopbutton.stl
│ │ │ │ │ │ │ ├── stopbuttonrim.stl
│ │ │ │ │ │ │ ├── stopbuttonrod.stl
│ │ │ │ │ │ │ └── stoptop.stl
│ │ │ │ │ │ ├── coffeemachine/
│ │ │ │ │ │ │ ├── body1.stl
│ │ │ │ │ │ │ ├── body2.stl
│ │ │ │ │ │ │ ├── bodypiece1.stl
│ │ │ │ │ │ │ ├── bodypiece2.stl
│ │ │ │ │ │ │ ├── bodypiece3.stl
│ │ │ │ │ │ │ ├── button.stl
│ │ │ │ │ │ │ ├── buttonring.stl
│ │ │ │ │ │ │ ├── cup.stl
│ │ │ │ │ │ │ ├── handle.stl
│ │ │ │ │ │ │ ├── mug.stl
│ │ │ │ │ │ │ ├── spout.stl
│ │ │ │ │ │ │ └── spoutconnect.stl
│ │ │ │ │ │ ├── dial/
│ │ │ │ │ │ │ ├── dial.stl
│ │ │ │ │ │ │ └── dialhead.stl
│ │ │ │ │ │ ├── doorlock/
│ │ │ │ │ │ │ ├── door.stl
│ │ │ │ │ │ │ ├── door_handle.stl
│ │ │ │ │ │ │ ├── handle.stl
│ │ │ │ │ │ │ ├── handle_base.stl
│ │ │ │ │ │ │ ├── lock.stl
│ │ │ │ │ │ │ ├── lock_base.stl
│ │ │ │ │ │ │ └── safe.stl
│ │ │ │ │ │ ├── drawer/
│ │ │ │ │ │ │ ├── drawer.stl
│ │ │ │ │ │ │ ├── drawercase.stl
│ │ │ │ │ │ │ └── drawerhandle.stl
│ │ │ │ │ │ ├── faucet/
│ │ │ │ │ │ │ ├── faucetbase.stl
│ │ │ │ │ │ │ ├── faucethandle1.stl
│ │ │ │ │ │ │ └── faucethead.stl
│ │ │ │ │ │ ├── golf_club/
│ │ │ │ │ │ │ ├── club_handle.stl
│ │ │ │ │ │ │ ├── club_head.stl
│ │ │ │ │ │ │ └── club_tape.stl
│ │ │ │ │ │ ├── hammer/
│ │ │ │ │ │ │ ├── hammerblock.stl
│ │ │ │ │ │ │ ├── hammerhandle.stl
│ │ │ │ │ │ │ ├── hammerhead.stl
│ │ │ │ │ │ │ └── nail.stl
│ │ │ │ │ │ ├── handle_press/
│ │ │ │ │ │ │ ├── handle_press_base.stl
│ │ │ │ │ │ │ ├── handle_press_col1.stl
│ │ │ │ │ │ │ ├── handle_press_col2.stl
│ │ │ │ │ │ │ ├── handle_press_col3.stl
│ │ │ │ │ │ │ ├── handle_press_grip.stl
│ │ │ │ │ │ │ ├── handle_press_lever.stl
│ │ │ │ │ │ │ └── handle_press_trim.stl
│ │ │ │ │ │ ├── laptop/
│ │ │ │ │ │ │ ├── laptop_base.stl
│ │ │ │ │ │ │ ├── laptop_hinge.stl
│ │ │ │ │ │ │ ├── laptop_keys.stl
│ │ │ │ │ │ │ ├── laptop_screen.stl
│ │ │ │ │ │ │ └── laptop_top.stl
│ │ │ │ │ │ ├── lever/
│ │ │ │ │ │ │ ├── lever_axis.stl
│ │ │ │ │ │ │ ├── lever_base.stl
│ │ │ │ │ │ │ ├── lever_handle.stl
│ │ │ │ │ │ │ ├── lever_rod.stl
│ │ │ │ │ │ │ └── lever_rodbase.stl
│ │ │ │ │ │ ├── peg_block/
│ │ │ │ │ │ │ ├── block_inner.stl
│ │ │ │ │ │ │ └── block_outer.stl
│ │ │ │ │ │ ├── plug/
│ │ │ │ │ │ │ ├── plug.stl
│ │ │ │ │ │ │ ├── plug_head.stl
│ │ │ │ │ │ │ ├── plug_plastic.stl
│ │ │ │ │ │ │ └── plug_wall.stl
│ │ │ │ │ │ ├── puck/
│ │ │ │ │ │ │ ├── goal_net.stl
│ │ │ │ │ │ │ ├── goal_rim.stl
│ │ │ │ │ │ │ ├── net1_col.stl
│ │ │ │ │ │ │ ├── net2_col.stl
│ │ │ │ │ │ │ ├── net3_col.stl
│ │ │ │ │ │ │ ├── net4_col.stl
│ │ │ │ │ │ │ └── puck.stl
│ │ │ │ │ │ ├── shelf/
│ │ │ │ │ │ │ ├── shelf.stl
│ │ │ │ │ │ │ └── shelf_supports.stl
│ │ │ │ │ │ ├── shelfb/
│ │ │ │ │ │ │ ├── shelf_0.stl
│ │ │ │ │ │ │ ├── shelf_1.stl
│ │ │ │ │ │ │ └── shelf_frame.stl
│ │ │ │ │ │ ├── soccer/
│ │ │ │ │ │ │ ├── goal_col1.stl
│ │ │ │ │ │ │ ├── goal_col2.stl
│ │ │ │ │ │ │ ├── goal_col3.stl
│ │ │ │ │ │ │ ├── goal_col4.stl
│ │ │ │ │ │ │ ├── soccer_black.stl
│ │ │ │ │ │ │ ├── soccer_frame.stl
│ │ │ │ │ │ │ ├── soccer_net.stl
│ │ │ │ │ │ │ └── soccer_white.stl
│ │ │ │ │ │ ├── stick/
│ │ │ │ │ │ │ └── stick.stl
│ │ │ │ │ │ ├── table/
│ │ │ │ │ │ │ ├── table_hole.stl
│ │ │ │ │ │ │ ├── table_hole2.stl
│ │ │ │ │ │ │ ├── tablebody.stl
│ │ │ │ │ │ │ └── tabletop.stl
│ │ │ │ │ │ ├── thermos/
│ │ │ │ │ │ │ ├── therm_base.stl
│ │ │ │ │ │ │ ├── therm_body.stl
│ │ │ │ │ │ │ ├── therm_cap.stl
│ │ │ │ │ │ │ ├── therm_handle.stl
│ │ │ │ │ │ │ └── therm_trim.stl
│ │ │ │ │ │ ├── window/
│ │ │ │ │ │ │ ├── window_base.stl
│ │ │ │ │ │ │ ├── window_frame.stl
│ │ │ │ │ │ │ ├── window_h_base.stl
│ │ │ │ │ │ │ ├── window_h_frame.stl
│ │ │ │ │ │ │ ├── windowa_frame.stl
│ │ │ │ │ │ │ ├── windowa_glass.stl
│ │ │ │ │ │ │ ├── windowa_h_frame.stl
│ │ │ │ │ │ │ ├── windowa_h_glass.stl
│ │ │ │ │ │ │ ├── windowb_frame.stl
│ │ │ │ │ │ │ ├── windowb_glass.stl
│ │ │ │ │ │ │ ├── windowb_h_frame.stl
│ │ │ │ │ │ │ └── windowb_h_glass.stl
│ │ │ │ │ │ └── xyz_base/
│ │ │ │ │ │ ├── base.stl
│ │ │ │ │ │ ├── eGripperBase.stl
│ │ │ │ │ │ ├── head.stl
│ │ │ │ │ │ ├── l0.stl
│ │ │ │ │ │ ├── l1.stl
│ │ │ │ │ │ ├── l2.stl
│ │ │ │ │ │ ├── l3.stl
│ │ │ │ │ │ ├── l4.stl
│ │ │ │ │ │ ├── l5.stl
│ │ │ │ │ │ ├── l6.stl
│ │ │ │ │ │ └── pedestal.stl
│ │ │ │ │ ├── mug.xml
│ │ │ │ │ ├── objA.xml
│ │ │ │ │ ├── peg_block.xml
│ │ │ │ │ ├── peg_insert.xml
│ │ │ │ │ ├── plug.xml
│ │ │ │ │ ├── plug_wall.xml
│ │ │ │ │ ├── puck.xml
│ │ │ │ │ ├── puck_goal.xml
│ │ │ │ │ ├── shelf.xml
│ │ │ │ │ ├── shelfb.xml
│ │ │ │ │ ├── soccer_ball.xml
│ │ │ │ │ ├── soccer_goal.xml
│ │ │ │ │ ├── sphere.xml
│ │ │ │ │ ├── stick.xml
│ │ │ │ │ ├── table.xml
│ │ │ │ │ ├── table_hole.xml
│ │ │ │ │ ├── thermos.xml
│ │ │ │ │ ├── wall.xml
│ │ │ │ │ ├── window.xml
│ │ │ │ │ ├── window_horiz.xml
│ │ │ │ │ └── xyz_base.xml
│ │ │ │ ├── sawyer_xyz/
│ │ │ │ │ ├── sawyer_assembly_peg.xml
│ │ │ │ │ ├── sawyer_basketball.xml
│ │ │ │ │ ├── sawyer_bin_picking.xml
│ │ │ │ │ ├── sawyer_box.xml
│ │ │ │ │ ├── sawyer_button_press.xml
│ │ │ │ │ ├── sawyer_button_press_topdown.xml
│ │ │ │ │ ├── sawyer_button_press_topdown_wall.xml
│ │ │ │ │ ├── sawyer_button_press_wall.xml
│ │ │ │ │ ├── sawyer_coffee.xml
│ │ │ │ │ ├── sawyer_dial.xml
│ │ │ │ │ ├── sawyer_door_lock.xml
│ │ │ │ │ ├── sawyer_door_pull.xml
│ │ │ │ │ ├── sawyer_drawer.xml
│ │ │ │ │ ├── sawyer_faucet.xml
│ │ │ │ │ ├── sawyer_hammer.xml
│ │ │ │ │ ├── sawyer_handle_press.xml
│ │ │ │ │ ├── sawyer_handle_press_sideways.xml
│ │ │ │ │ ├── sawyer_laptop.xml
│ │ │ │ │ ├── sawyer_lever_pull.xml
│ │ │ │ │ ├── sawyer_peg_insertion_side.xml
│ │ │ │ │ ├── sawyer_peg_unplug_side.xml
│ │ │ │ │ ├── sawyer_pick_and_place.xml
│ │ │ │ │ ├── sawyer_pick_out_of_hole.xml
│ │ │ │ │ ├── sawyer_pick_place_v2.xml
│ │ │ │ │ ├── sawyer_pick_place_wall_v2.xml
│ │ │ │ │ ├── sawyer_plate_slide.xml
│ │ │ │ │ ├── sawyer_plate_slide_sideway.xml
│ │ │ │ │ ├── sawyer_push_back_v2.xml
│ │ │ │ │ ├── sawyer_push_v2.xml
│ │ │ │ │ ├── sawyer_push_wall_v2.xml
│ │ │ │ │ ├── sawyer_reach_push_pick_and_place.xml
│ │ │ │ │ ├── sawyer_reach_push_pick_and_place_wall.xml
│ │ │ │ │ ├── sawyer_reach_v2.xml
│ │ │ │ │ ├── sawyer_reach_wall_v2.xml
│ │ │ │ │ ├── sawyer_shelf_placing.xml
│ │ │ │ │ ├── sawyer_shelf_removing.xml
│ │ │ │ │ ├── sawyer_soccer.xml
│ │ │ │ │ ├── sawyer_stick_obj.xml
│ │ │ │ │ ├── sawyer_sweep_tool.xml
│ │ │ │ │ ├── sawyer_sweep_v2.xml
│ │ │ │ │ ├── sawyer_table_with_hole.xml
│ │ │ │ │ ├── sawyer_table_with_hole_no_puck.xml
│ │ │ │ │ ├── sawyer_window.xml
│ │ │ │ │ └── sawyer_window_horizontal.xml
│ │ │ │ └── scene/
│ │ │ │ ├── basic_scene.xml
│ │ │ │ ├── basic_scene_b.xml
│ │ │ │ └── basic_scene_c.xml
│ │ │ ├── mujoco/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── env_dict.py
│ │ │ │ ├── mujoco_env.py
│ │ │ │ ├── sawyer_xyz/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── sawyer_xyz_env.py
│ │ │ │ │ ├── v1/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── sawyer_assembly_peg.py
│ │ │ │ │ │ ├── sawyer_basketball.py
│ │ │ │ │ │ ├── sawyer_bin_picking.py
│ │ │ │ │ │ ├── sawyer_box_close.py
│ │ │ │ │ │ ├── sawyer_button_press.py
│ │ │ │ │ │ ├── sawyer_button_press_topdown.py
│ │ │ │ │ │ ├── sawyer_button_press_topdown_wall.py
│ │ │ │ │ │ ├── sawyer_button_press_wall.py
│ │ │ │ │ │ ├── sawyer_coffee_button.py
│ │ │ │ │ │ ├── sawyer_coffee_pull.py
│ │ │ │ │ │ ├── sawyer_coffee_push.py
│ │ │ │ │ │ ├── sawyer_dial_turn.py
│ │ │ │ │ │ ├── sawyer_disassemble_peg.py
│ │ │ │ │ │ ├── sawyer_door.py
│ │ │ │ │ │ ├── sawyer_door_close.py
│ │ │ │ │ │ ├── sawyer_door_lock.py
│ │ │ │ │ │ ├── sawyer_door_unlock.py
│ │ │ │ │ │ ├── sawyer_drawer_close.py
│ │ │ │ │ │ ├── sawyer_drawer_open.py
│ │ │ │ │ │ ├── sawyer_faucet_close.py
│ │ │ │ │ │ ├── sawyer_faucet_open.py
│ │ │ │ │ │ ├── sawyer_hammer.py
│ │ │ │ │ │ ├── sawyer_hand_insert.py
│ │ │ │ │ │ ├── sawyer_handle_press.py
│ │ │ │ │ │ ├── sawyer_handle_press_side.py
│ │ │ │ │ │ ├── sawyer_handle_pull.py
│ │ │ │ │ │ ├── sawyer_handle_pull_side.py
│ │ │ │ │ │ ├── sawyer_lever_pull.py
│ │ │ │ │ │ ├── sawyer_peg_insertion_side.py
│ │ │ │ │ │ ├── sawyer_peg_unplug_side.py
│ │ │ │ │ │ ├── sawyer_pick_out_of_hole.py
│ │ │ │ │ │ ├── sawyer_plate_slide.py
│ │ │ │ │ │ ├── sawyer_plate_slide_back.py
│ │ │ │ │ │ ├── sawyer_plate_slide_back_side.py
│ │ │ │ │ │ ├── sawyer_plate_slide_side.py
│ │ │ │ │ │ ├── sawyer_push_back.py
│ │ │ │ │ │ ├── sawyer_reach_push_pick_place.py
│ │ │ │ │ │ ├── sawyer_reach_push_pick_place_wall.py
│ │ │ │ │ │ ├── sawyer_shelf_place.py
│ │ │ │ │ │ ├── sawyer_soccer.py
│ │ │ │ │ │ ├── sawyer_stick_pull.py
│ │ │ │ │ │ ├── sawyer_stick_push.py
│ │ │ │ │ │ ├── sawyer_sweep.py
│ │ │ │ │ │ ├── sawyer_sweep_into_goal.py
│ │ │ │ │ │ ├── sawyer_window_close.py
│ │ │ │ │ │ └── sawyer_window_open.py
│ │ │ │ │ ├── v2/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── sawyer_assembly_peg_v2.py
│ │ │ │ │ │ ├── sawyer_basketball_v2.py
│ │ │ │ │ │ ├── sawyer_bin_picking_v2.py
│ │ │ │ │ │ ├── sawyer_box_close_v2.py
│ │ │ │ │ │ ├── sawyer_button_press_topdown_v2.py
│ │ │ │ │ │ ├── sawyer_button_press_topdown_wall_v2.py
│ │ │ │ │ │ ├── sawyer_button_press_v2.py
│ │ │ │ │ │ ├── sawyer_button_press_wall_v2.py
│ │ │ │ │ │ ├── sawyer_coffee_button_v2.py
│ │ │ │ │ │ ├── sawyer_coffee_pull_v2.py
│ │ │ │ │ │ ├── sawyer_coffee_push_v2.py
│ │ │ │ │ │ ├── sawyer_dial_turn_v2.py
│ │ │ │ │ │ ├── sawyer_disassemble_peg_v2.py
│ │ │ │ │ │ ├── sawyer_door_close_v2.py
│ │ │ │ │ │ ├── sawyer_door_lock_v2.py
│ │ │ │ │ │ ├── sawyer_door_unlock_v2.py
│ │ │ │ │ │ ├── sawyer_door_v2.py
│ │ │ │ │ │ ├── sawyer_drawer_close_v2.py
│ │ │ │ │ │ ├── sawyer_drawer_open_v2.py
│ │ │ │ │ │ ├── sawyer_faucet_close_v2.py
│ │ │ │ │ │ ├── sawyer_faucet_open_v2.py
│ │ │ │ │ │ ├── sawyer_hammer_v2.py
│ │ │ │ │ │ ├── sawyer_hand_insert_v2.py
│ │ │ │ │ │ ├── sawyer_handle_press_side_v2.py
│ │ │ │ │ │ ├── sawyer_handle_press_v2.py
│ │ │ │ │ │ ├── sawyer_handle_pull_side_v2.py
│ │ │ │ │ │ ├── sawyer_handle_pull_v2.py
│ │ │ │ │ │ ├── sawyer_lever_pull_v2.py
│ │ │ │ │ │ ├── sawyer_peg_insertion_side_v2.py
│ │ │ │ │ │ ├── sawyer_peg_unplug_side_v2.py
│ │ │ │ │ │ ├── sawyer_pick_out_of_hole_v2.py
│ │ │ │ │ │ ├── sawyer_pick_place_v2.py
│ │ │ │ │ │ ├── sawyer_pick_place_wall_v2.py
│ │ │ │ │ │ ├── sawyer_plate_slide_back_side_v2.py
│ │ │ │ │ │ ├── sawyer_plate_slide_back_v2.py
│ │ │ │ │ │ ├── sawyer_plate_slide_side_v2.py
│ │ │ │ │ │ ├── sawyer_plate_slide_v2.py
│ │ │ │ │ │ ├── sawyer_push_back_v2.py
│ │ │ │ │ │ ├── sawyer_push_v2.py
│ │ │ │ │ │ ├── sawyer_push_wall_v2.py
│ │ │ │ │ │ ├── sawyer_reach_v2.py
│ │ │ │ │ │ ├── sawyer_reach_wall_v2.py
│ │ │ │ │ │ ├── sawyer_shelf_place_v2.py
│ │ │ │ │ │ ├── sawyer_soccer_v2.py
│ │ │ │ │ │ ├── sawyer_stick_pull_v2.py
│ │ │ │ │ │ ├── sawyer_stick_push_v2.py
│ │ │ │ │ │ ├── sawyer_sweep_into_goal_v2.py
│ │ │ │ │ │ ├── sawyer_sweep_v2.py
│ │ │ │ │ │ ├── sawyer_window_close_v2.py
│ │ │ │ │ │ └── sawyer_window_open_v2.py
│ │ │ │ │ └── visual/
│ │ │ │ │ └── __init__.py
│ │ │ │ └── utils/
│ │ │ │ └── rotation.py
│ │ │ └── reward_utils.py
│ │ └── policies/
│ │ ├── __init__.py
│ │ ├── action.py
│ │ ├── policy.py
│ │ ├── sawyer_assembly_v1_policy.py
│ │ ├── sawyer_assembly_v2_policy.py
│ │ ├── sawyer_basketball_v1_policy.py
│ │ ├── sawyer_basketball_v2_policy.py
│ │ ├── sawyer_bin_picking_v2_policy.py
│ │ ├── sawyer_box_close_v1_policy.py
│ │ ├── sawyer_box_close_v2_policy.py
│ │ ├── sawyer_button_press_topdown_v1_policy.py
│ │ ├── sawyer_button_press_topdown_v2_policy.py
│ │ ├── sawyer_button_press_topdown_wall_v1_policy.py
│ │ ├── sawyer_button_press_topdown_wall_v2_policy.py
│ │ ├── sawyer_button_press_v1_policy.py
│ │ ├── sawyer_button_press_v2_policy.py
│ │ ├── sawyer_button_press_wall_v1_policy.py
│ │ ├── sawyer_button_press_wall_v2_policy.py
│ │ ├── sawyer_coffee_button_v1_policy.py
│ │ ├── sawyer_coffee_button_v2_policy.py
│ │ ├── sawyer_coffee_pull_v1_policy.py
│ │ ├── sawyer_coffee_pull_v2_policy.py
│ │ ├── sawyer_coffee_push_v1_policy.py
│ │ ├── sawyer_coffee_push_v2_policy.py
│ │ ├── sawyer_dial_turn_v1_policy.py
│ │ ├── sawyer_dial_turn_v2_policy.py
│ │ ├── sawyer_disassemble_v1_policy.py
│ │ ├── sawyer_disassemble_v2_policy.py
│ │ ├── sawyer_door_close_v1_policy.py
│ │ ├── sawyer_door_close_v2_policy.py
│ │ ├── sawyer_door_lock_v1_policy.py
│ │ ├── sawyer_door_lock_v2_policy.py
│ │ ├── sawyer_door_open_v1_policy.py
│ │ ├── sawyer_door_open_v2_policy.py
│ │ ├── sawyer_door_unlock_v1_policy.py
│ │ ├── sawyer_door_unlock_v2_policy.py
│ │ ├── sawyer_drawer_close_v1_policy.py
│ │ ├── sawyer_drawer_close_v2_policy.py
│ │ ├── sawyer_drawer_open_v1_policy.py
│ │ ├── sawyer_drawer_open_v2_policy.py
│ │ ├── sawyer_faucet_close_v1_policy.py
│ │ ├── sawyer_faucet_close_v2_policy.py
│ │ ├── sawyer_faucet_open_v1_policy.py
│ │ ├── sawyer_faucet_open_v2_policy.py
│ │ ├── sawyer_hammer_v1_policy.py
│ │ ├── sawyer_hammer_v2_policy.py
│ │ ├── sawyer_hand_insert_v1_policy.py
│ │ ├── sawyer_hand_insert_v2_policy.py
│ │ ├── sawyer_handle_press_side_v2_policy.py
│ │ ├── sawyer_handle_press_v1_policy.py
│ │ ├── sawyer_handle_press_v2_policy.py
│ │ ├── sawyer_handle_pull_side_v1_policy.py
│ │ ├── sawyer_handle_pull_side_v2_policy.py
│ │ ├── sawyer_handle_pull_v1_policy.py
│ │ ├── sawyer_handle_pull_v2_policy.py
│ │ ├── sawyer_lever_pull_v2_policy.py
│ │ ├── sawyer_peg_insertion_side_v2_policy.py
│ │ ├── sawyer_peg_unplug_side_v1_policy.py
│ │ ├── sawyer_peg_unplug_side_v2_policy.py
│ │ ├── sawyer_pick_out_of_hole_v1_policy.py
│ │ ├── sawyer_pick_out_of_hole_v2_policy.py
│ │ ├── sawyer_pick_place_v2_policy.py
│ │ ├── sawyer_pick_place_wall_v2_policy.py
│ │ ├── sawyer_plate_slide_back_side_v2_policy.py
│ │ ├── sawyer_plate_slide_back_v1_policy.py
│ │ ├── sawyer_plate_slide_back_v2_policy.py
│ │ ├── sawyer_plate_slide_side_v1_policy.py
│ │ ├── sawyer_plate_slide_side_v2_policy.py
│ │ ├── sawyer_plate_slide_v1_policy.py
│ │ ├── sawyer_plate_slide_v2_policy.py
│ │ ├── sawyer_push_back_v1_policy.py
│ │ ├── sawyer_push_back_v2_policy.py
│ │ ├── sawyer_push_v2_policy.py
│ │ ├── sawyer_push_wall_v2_policy.py
│ │ ├── sawyer_reach_v2_policy.py
│ │ ├── sawyer_reach_wall_v2_policy.py
│ │ ├── sawyer_shelf_place_v1_policy.py
│ │ ├── sawyer_shelf_place_v2_policy.py
│ │ ├── sawyer_soccer_v1_policy.py
│ │ ├── sawyer_soccer_v2_policy.py
│ │ ├── sawyer_stick_pull_v1_policy.py
│ │ ├── sawyer_stick_pull_v2_policy.py
│ │ ├── sawyer_stick_push_v1_policy.py
│ │ ├── sawyer_stick_push_v2_policy.py
│ │ ├── sawyer_sweep_into_v1_policy.py
│ │ ├── sawyer_sweep_into_v2_policy.py
│ │ ├── sawyer_sweep_v1_policy.py
│ │ ├── sawyer_sweep_v2_policy.py
│ │ ├── sawyer_window_close_v2_policy.py
│ │ └── sawyer_window_open_v2_policy.py
│ ├── scripts/
│ │ ├── demo_sawyer.py
│ │ ├── grasp.py
│ │ ├── keyboard_control.py
│ │ ├── mouse_control.py
│ │ ├── plot_rewards_returns.ipynb
│ │ ├── plot_rewards_returns_noise_3D.ipynb
│ │ ├── profile_memory_usage.py
│ │ └── scripted_policy_movies.ipynb
│ ├── setup.cfg
│ ├── setup.py
│ └── tests/
│ ├── __init__.py
│ ├── helpers.py
│ ├── integration/
│ │ ├── __init__.py
│ │ ├── test_memory_usage.py
│ │ ├── test_new_api.py
│ │ └── test_single_goal_envs.py
│ └── metaworld/
│ ├── __init__.py
│ └── envs/
│ ├── __init__.py
│ └── mujoco/
│ ├── __init__.py
│ └── sawyer_xyz/
│ ├── __init__.py
│ ├── test_obs_space_hand.py
│ ├── test_sawyer_xyz_env.py
│ ├── test_scripted_policies.py
│ └── utils.py
├── README.md
├── code_generation/
│ ├── __init__.py
│ ├── gold_reward_rewrite/
│ │ ├── lift_cube.py
│ │ ├── move_bucket.py
│ │ ├── open_cabinet_door.py
│ │ ├── open_cabinet_drawer.py
│ │ ├── panda_avoid_obstacles.py
│ │ ├── peg_insertion.py
│ │ ├── pick_cube.py
│ │ ├── plug_charger.py
│ │ ├── push_chair.py
│ │ ├── stack_cube.py
│ │ └── turn_faucet.py
│ ├── interactive/
│ │ ├── __init__.py
│ │ ├── basic/
│ │ │ ├── __init__.py
│ │ │ └── generation.py
│ │ ├── classlike_prompt/
│ │ │ ├── __init__.py
│ │ │ └── feedback_prompt.py
│ │ └── human_feedback_exp.py
│ ├── post_process/
│ │ ├── __init__.py
│ │ └── post_process.py
│ └── single_flow/
│ ├── __init__.py
│ ├── classlike_prompt/
│ │ ├── AntPrompt.py
│ │ ├── HopperPrompt.py
│ │ ├── MetaworldPrompt.py
│ │ ├── MobileDualArmPrompt.py
│ │ ├── MobilePandaPrompt.py
│ │ ├── PandaPrompt.py
│ │ ├── __init__.py
│ │ └── few_shot_prompt.py
│ ├── few_shot/
│ │ ├── __init__.py
│ │ └── generation.py
│ ├── few_shot_exp.py
│ ├── metaworld_exp.py
│ ├── run_maniskill_fewshot.sh
│ ├── run_maniskill_zeroshot.sh
│ ├── run_metaworld_zeroshot.sh
│ ├── zero_shot/
│ │ ├── __init__.py
│ │ └── generation.py
│ └── zero_shot_exp.py
├── rlkit/
│ └── envs/
│ ├── proxy_env.py
│ └── wrappers/
│ ├── __init__.py
│ └── normalized_box_env.py
├── run_maniskill/
│ ├── download_data.sh
│ ├── ppo.py
│ ├── reward_code/
│ │ ├── few-shot/
│ │ │ ├── LiftCube-v0/
│ │ │ │ ├── general.py
│ │ │ │ └── specific.py
│ │ │ ├── OpenCabinetDoor-v1/
│ │ │ │ ├── general.py
│ │ │ │ └── specific.py
│ │ │ ├── OpenCabinetDrawer-v1/
│ │ │ │ ├── general.py
│ │ │ │ └── specific.py
│ │ │ ├── PickCube-v0/
│ │ │ │ ├── general.py
│ │ │ │ └── specific.py
│ │ │ ├── PushChair-v1/
│ │ │ │ ├── general.py
│ │ │ │ └── specific.py
│ │ │ └── TurnFaucet-v0/
│ │ │ ├── general.py
│ │ │ └── specific.py
│ │ └── zero-shot/
│ │ ├── LiftCube-v0/
│ │ │ ├── general.py
│ │ │ └── specific.py
│ │ ├── OpenCabinetDoor-v1/
│ │ │ ├── general.py
│ │ │ └── specific.py
│ │ ├── OpenCabinetDrawer-v1/
│ │ │ ├── general.py
│ │ │ └── specific.py
│ │ ├── PickCube-v0/
│ │ │ ├── general.py
│ │ │ └── specific.py
│ │ ├── PushChair-v1/
│ │ │ ├── general.py
│ │ │ └── specific.py
│ │ └── TurnFaucet-v0/
│ │ ├── general.py
│ │ └── specific.py
│ ├── run_few_shot.sh
│ ├── run_oracle.sh
│ ├── run_zero_shot.sh
│ └── sac.py
└── run_metaworld/
├── reward_code/
│ ├── button-press-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── door-close-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── door-unlock-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── drawer-close-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── drawer-open-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── handle-press-side-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── handle-press-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── sweep-into-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── window-close-v2/
│ │ ├── general.py
│ │ └── specific.py
│ └── window-open-v2/
│ ├── general.py
│ └── specific.py
├── run_oracle.sh
├── run_zero_shot.sh
└── sac.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# 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
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# PyCharm
**/.idea/**/*
# Mac OS
.DS_Store
# data
**/data/**/*
# tmp files
**/tmp/**/*
api_key.py
tmp.*
## Server logging
**/.logging/**/*
# DB cache
**/.db_cache/**/*
# Debug
**/.debug/**/*
================================================
FILE: ManiSkill2/CITATION.cff
================================================
cff-version: 1.2.0
message: "Thanks for using ManiSkill2. If you use this software, please cite it as below."
authors:
- family-names: "Gu"
given-names: "Jiayuan"
orcid: "https://orcid.org/0000-0002-3207-7921"
- family-names: "Xiang"
given-names: "Fanbo"
- family-names: "Li"
given-names: "Xuanlin"
- family-names: "Ling"
given-names: "Zhan"
- family-names: "Liu"
given-names: "Xiqiang"
- family-names: "Mu"
given-names: "Tongzhou"
- family-names: "Tang"
given-names: "Yihe"
- family-names: "Tao"
given-names: "Stone"
- family-names: "Wei"
given-names: "Xinyue"
- family-names: "Yao"
given-names: "Yunchao"
- family-names: "Yuan"
given-names: "Xiaodi"
- family-names: "Xie"
given-names: "Pengwei"
- family-names: "Huang"
given-names: "Zhiao"
- family-names: "Chen"
given-names: "Rui"
- family-names: "Su"
given-names: "Hao"
title: "ManiSkill2"
version: 0.3.0
date-released: 2022-08-15
url: "https://github.com/haosulab/ManiSkill2"
preferred-citation:
type: conference-paper
title: "ManiSkill2: A Unified Benchmark for Generalizable Manipulation Skills"
authors:
- family-names: "Gu"
given-names: "Jiayuan"
orcid: "https://orcid.org/0000-0002-3207-7921"
- family-names: "Xiang"
given-names: "Fanbo"
- family-names: "Li"
given-names: "Xuanlin"
- family-names: "Ling"
given-names: "Zhan"
- family-names: "Liu"
given-names: "Xiqiang"
- family-names: "Mu"
given-names: "Tongzhou"
- family-names: "Tang"
given-names: "Yihe"
- family-names: "Tao"
given-names: "Stone"
- family-names: "Wei"
given-names: "Xinyue"
- family-names: "Yao"
given-names: "Yunchao"
- family-names: "Yuan"
given-names: "Xiaodi"
- family-names: "Xie"
given-names: "Pengwei"
- family-names: "Huang"
given-names: "Zhiao"
- family-names: "Chen"
given-names: "Rui"
- family-names: "Su"
given-names: "Hao"
booktitle: "International Conference on Learning Representations"
year: 2023
================================================
FILE: ManiSkill2/LICENSE
================================================
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
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
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.
================================================
FILE: ManiSkill2/README.md
================================================
# ManiSkill2

[](https://badge.fury.io/py/mani-skill2)
[](https://colab.research.google.com/github/haosulab/ManiSkill2/blob/main/examples/tutorials/1_quickstart.ipynb)
[](https://haosulab.github.io/ManiSkill2)
[](https://discord.gg/x8yUZe5AdN)
<!-- [](https://haosulab.github.io/ManiSkill2) -->
ManiSkill2 is a unified benchmark for learning generalizable robotic manipulation skills powered by [SAPIEN](https://sapien.ucsd.edu/). **It features 20 out-of-box task families with 2000+ diverse object models and 4M+ demonstration frames**. Moreover, it empowers fast visual input learning algorithms so that **a CNN-based policy can collect samples at about 2000 FPS with 1 GPU and 16 processes on a workstation**. The benchmark can be used to study a wide range of algorithms: 2D & 3D vision-based reinforcement learning, imitation learning, sense-plan-act, etc.
Please refer to our [documentation](https://haosulab.github.io/ManiSkill2) to learn more information. There are also hands-on [tutorials](examples/tutorials) (e.g, [quickstart colab tutorial](https://colab.research.google.com/github/haosulab/ManiSkill2/blob/main/examples/tutorials/1_quickstart.ipynb)).
We invite you to participate in the associated [ManiSkill2 challenge](https://sapien.ucsd.edu/challenges/maniskill/) where the top teams will be awarded prizes.
**Table of Contents**
- [Installation](#installation)
- [Getting Started](#getting-started)
- [Reinforcement Learning Example with ManiSkill2-Learn](#reinforcement-learning-example-with-maniskill2-learn)
- [Demonstrations](#demonstrations)
- [ManiSkill2 Challenge](#maniskill2-challenge)
- [Leaderboard](#leaderboard)
- [License](#license)
- [Citation](#citation)
## Installation
From pip:
```bash
pip install mani-skill2
```
From github:
```bash
pip install --upgrade git+https://github.com/haosulab/ManiSkill2.git
```
From source:
```bash
git clone https://github.com/haosulab/ManiSkill2.git
cd ManiSkill2 && pip install -e .
```
---
A GPU with the Vulkan driver installed is required to enable rendering in ManiSkill2. The rigid-body environments, powered by SAPIEN, are ready to use after installation. Test your installation:
```bash
# Run an episode (at most 200 steps) of "PickCube-v0" (a rigid-body environment) with random actions
# Or specify an environment by "-e ${ENV_ID}"
python -m mani_skill2.examples.demo_random_action
```
Some environments require **downloading assets**. You can download all the assets by `python -m mani_skill2.utils.download_asset all` or download task-specific assets by `python -m mani_skill2.utils.download_asset ${ENV_ID}`. The assets will be downloaded to `./data/` by default, and you can also use the environment variable `MS2_ASSET_DIR` to specify this destination.
Please refer to our [documentation](https://haosulab.github.io/ManiSkill2/concepts/environments.html) for details on all supported environments. The documentation also indicates which environments require downloading assets.
---
The soft-body environments are based on SAPIEN and customized [NVIDIA Warp](https://github.com/NVIDIA/warp), which requires **CUDA toolkit >= 11.3 and gcc** to compile. Please refer to the [documentation](https://haosulab.github.io/ManiSkill2/getting_started/installation.html#warp-maniskill2-version) for more details about installing ManiSkill2 Warp.
---
We further provide a docker image (`haosulab/mani-skill2`) on [Docker Hub](https://hub.docker.com/repository/docker/haosulab/mani-skill2/general) and its corresponding [Dockerfile](./docker/Dockerfile).
If you encounter any issues with installation, please see the [troubleshooting](https://haosulab.github.io/ManiSkill2/getting_started/installation.html#troubleshooting) section for common fixes or submit an [issue](https://github.com/haosulab/ManiSkill2/issues).
## Getting Started
Here is a basic example of how to make an [OpenAI Gym](https://github.com/openai/gym) environment and run a random policy.
```python
import gym
import mani_skill2.envs
env = gym.make("PickCube-v0", obs_mode="rgbd", control_mode="pd_joint_delta_pos")
print("Observation space", env.observation_space)
print("Action space", env.action_space)
env.seed(0) # specify a seed for randomness
obs = env.reset()
done = False
while not done:
action = env.action_space.sample()
obs, reward, done, info = env.step(action)
env.render() # a display is required to render
env.close()
```
Each `mani_skill2` environment supports different **observation modes** and **control modes**, which determine the **observation space** and **action space**. They can be specified by `gym.make(env_id, obs_mode=..., control_mode=...)`.
The basic observation modes supported are `pointcloud`, `rgbd`, `state_dict` and `state`.
Please refer to our documentation for information on the [observation](https://haosulab.github.io/ManiSkill2/concepts/observation.html) and [control](https://haosulab.github.io/ManiSkill2/concepts/controllers.html) modes available and their details.
Moreover, you can follow the [example](https://haosulab.github.io/ManiSkill2/getting_started/quickstart.html#interactive-play) to interactively play with our environments.
---
We provide hands-on tutorials about ManiSkill2. All the tutorials can be found [here](https://github.com/haosulab/ManiSkill2/blob/main/examples/tutorials).
- Getting Started: [Jupyter Notebook](./examples/tutorials/1_quickstart.ipynb), [Colab](https://colab.research.google.com/github/haosulab/ManiSkill2/blob/main/examples/tutorials/1_quickstart.ipynb)
- Reinforcement Learning: [Jupyter Notebook](./examples/tutorials/2_reinforcement_learning.ipynb), [Colab](https://colab.research.google.com/github/haosulab/ManiSkill2/blob/main/examples/tutorials/2_reinforcement_learning.ipynb)
- Imitation Learning: [Jupyter Notebook](./examples/tutorials/3_imitation_learning.ipynb), [Colab](https://colab.research.google.com/github/haosulab/ManiSkill2/blob/main/examples/tutorials/3_imitation_learning.ipynb)
- Environment Customization: [Jupyter Notebook](./examples/tutorials/customize_environments.ipynb), [Colab](https://colab.research.google.com/github/haosulab/ManiSkill2/blob/main/examples/tutorials/customize_environments.ipynb)
- Advanced Rendering (ray tracing, stereo depth sensor): [Jupyter Notebook](./examples/tutorials/advanced_rendering.ipynb)
See <https://sapien.ucsd.edu/docs/latest/> for the tutorials of SAPIEN (the backend of ManiSkill2).
## Reinforcement Learning Example with ManiSkill2-Learn
We provide [ManiSkill2-Learn](https://github.com/haosulab/ManiSkill2-Learn), an improved framework based on [ManiSkill-Learn](https://github.com/haosulab/ManiSkill-Learn) for training RL agents with demonstrations to solve manipulation tasks. The framework conveniently supports both point cloud-based and RGB-D-based policy learning, and the custom processing of these visual observations. It also supports many common algorithms (BC, PPO, DAPG, SAC, GAIL). Moreover, this framework is optimized for point cloud-based policy learning, and includes some helpful and empirical advice to get you started.
## Demonstrations
Please see our [documentation](https://haosulab.github.io/ManiSkill2/concepts/demonstrations.html) for more details.
## ManiSkill2 Challenge
The ManiSkill2 challenge is an ongoing competition using the ManiSkill2 benchmark. See our [website](https://sapien.ucsd.edu/challenges/maniskill/) for additional competition details and follow the [getting started](https://sapien.ucsd.edu/challenges/maniskill#getting-started) section to learn how to compete.
To create a submission for the competition, follow [the instructions on our wiki](https://github.com/haosulab/ManiSkill2/wiki/Participation-Guidelines) on how to create a submission and submit it to the leaderboard.
Previous results of the ManiSkill 2021 challenge can be found [here](https://sapien.ucsd.edu/challenges/maniskill#maniskill2021). Winning solutions and their codes can be found in the previous challenge.
## Leaderboard
You can find the leaderboard on the challenge website: <https://sapien.ucsd.edu/challenges/maniskill/challenges/ms2>.
## License
All rigid body environments in ManiSkill are licensed under fully permissive licenses (e.g., Apache-2.0).
However, the soft body environments will follow Warp's license. Currently, they are licensed under
[NVIDIA Source Code License for Warp](https://github.com/NVIDIA/warp/blob/main/LICENSE.md).
The assets are licensed under [CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/legalcode).
## Citation
If you use ManiSkill2 or its assets and models, consider citing the following publication:
```
@inproceedings{gu2023maniskill2,
title={ManiSkill2: A Unified Benchmark for Generalizable Manipulation Skills},
author={Gu, Jiayuan and Xiang, Fanbo and Li, Xuanlin and Ling, Zhan and Liu, Xiqiaing and Mu, Tongzhou and Tang, Yihe and Tao, Stone and Wei, Xinyue and Yao, Yunchao and Yuan, Xiaodi and Xie, Pengwei and Huang, Zhiao and Chen, Rui and Su, Hao},
booktitle={International Conference on Learning Representations},
year={2023}
}
```
================================================
FILE: ManiSkill2/docker/10_nvidia.json
================================================
{
"file_format_version" : "1.0.0",
"ICD" : {
"library_path" : "libEGL_nvidia.so.0"
}
}
================================================
FILE: ManiSkill2/docker/Dockerfile
================================================
FROM nvidia/cudagl:11.3.1-devel-ubuntu20.04
ENV NVIDIA_DRIVER_CAPABILITIES all
# Install os-level packages
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
bash-completion \
build-essential \
ca-certificates \
cmake \
curl \
git \
htop \
libegl1 \
libxext6 \
libjpeg-dev \
libpng-dev \
libvulkan1 \
rsync \
tmux \
unzip \
vim \
vulkan-utils \
wget \
xvfb \
&& rm -rf /var/lib/apt/lists/*
# Install (mini) conda
RUN curl -o ~/miniconda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \
chmod +x ~/miniconda.sh && \
~/miniconda.sh -b -p /opt/conda && \
rm ~/miniconda.sh && \
/opt/conda/bin/conda init && \
/opt/conda/bin/conda install -y python=3.8 && \
/opt/conda/bin/conda clean -ya
ENV PATH /opt/conda/bin:$PATH
SHELL ["/bin/bash", "-c"]
# https://github.com/haosulab/ManiSkill/issues/9
COPY nvidia_icd.json /usr/share/vulkan/icd.d/nvidia_icd.json
COPY nvidia_layers.json /etc/vulkan/implicit_layer.d/nvidia_layers.json
RUN pip install mani-skill2==0.4.2 && pip cache purge
================================================
FILE: ManiSkill2/docker/nvidia_icd.json
================================================
{
"file_format_version" : "1.0.0",
"ICD": {
"library_path": "libGLX_nvidia.so.0",
"api_version" : "1.2.155"
}
}
================================================
FILE: ManiSkill2/docker/nvidia_layers.json
================================================
{
"file_format_version" : "1.0.0",
"layer": {
"name": "VK_LAYER_NV_optimus",
"type": "INSTANCE",
"library_path": "libGLX_nvidia.so.0",
"api_version" : "1.2.155",
"implementation_version" : "1",
"description" : "NVIDIA Optimus layer",
"functions": {
"vkGetInstanceProcAddr": "vk_optimusGetInstanceProcAddr",
"vkGetDeviceProcAddr": "vk_optimusGetDeviceProcAddr"
},
"enable_environment": {
"__NV_PRIME_RENDER_OFFLOAD": "1"
},
"disable_environment": {
"DISABLE_LAYER_NV_OPTIMUS_1": ""
}
}
}
================================================
FILE: ManiSkill2/docs/.gitignore
================================================
build
================================================
FILE: ManiSkill2/docs/Makefile
================================================
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = source
BUILDDIR = build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
================================================
FILE: ManiSkill2/docs/README.md
================================================
# ManiSkill2 Documentation
Install Sphinx and Theme
```bash
# In the project root
pip install -e .[docs]
```
Build the documentation
```bash
# In docs/
make html
```
Start a server to watch changes
```bash
# In docs/
sphinx-autobuild ./source ./build/html
```
================================================
FILE: ManiSkill2/docs/make.bat
================================================
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=source
set BUILDDIR=build
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.https://www.sphinx-doc.org/
exit /b 1
)
if "%1" == "" goto help
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
:end
popd
================================================
FILE: ManiSkill2/docs/source/benchmark/submission.md
================================================
# Submission
To participate in the ManiSkill2 challenge, please register on the [challenge website](https://sapien.ucsd.edu/challenges/maniskill/). After registering an account, [create/join a team](https://sapien.ucsd.edu/challenges/maniskill/challenges/ms2/team). After creating/joining a team, you will be allowed to create submissions.
To submit to the challenge, you need to submit a URL to your docker image which contains your codes and dependencies (e.g., model weights). Before submitting, you should test the submission docker locally. Instructions for local evaluation and online submission are provided below.
In brief, you need to:
- Create a file named "user_solution.py", and implement a `UserPolicy` in it. An example is provided [here](https://github.com/haosulab/ManiSkill2/tree/main/examples/submission).
- Build a docker image that includes "user_solution.py" and other codes and dependencies (e.g., model weights).
- Test the docker image locally, give it a unique tag, and push it to a public docker registry.
Please see the [evaluation script](https://github.com/haosulab/ManiSkill2/tree/main/mani_skill2/evaluation/run_evaluation.py) for how your submission will be evaluated. You can locally test your submission by `python -m mani_skill2.evaluation.run_evaluation ...`. We will use the same script (with a different subclass of `BaseEvaluator` and held-out configuration files) to evaluate your online submission.
## Create and locally verify a solution
First, you need to create a file named `user_solution.py`, where a `UserPolicy` is implemented. The evaluation script attempts to load the solution through `from user_solution import UserPolicy`. Therefore, you need to ensure `user_solution.py` can be imported. The following commands show how to evaluate your solution locally.
```bash
# Add your submission to PYTHONPATH. Ensure that "user_solution.py" can be found to import.
# Assume that "user_solution.py" is under ${PATH_TO_YOUR_CODES_IN_HOST}
export PYTHONPATH=${PATH_TO_YOUR_CODES_IN_HOST}:$PYTHONPATH
# Test whether the user solution can be imported
# python -c "from user_solution import UserPolicy"
# Run evaluation. The result will be saved to ${OUTPUT_DIR}.
ENV_ID="PickCube-v0" OUTPUT_DIR="tmp" NUM_EPISODES=1
python -m mani_skill2.evaluation.run_evaluation -e ${ENV_ID} -o ${OUTPUT_DIR} -n ${NUM_EPISODES}
```
## Build a docker image
Install [nvidia-docker v2](https://github.com/NVIDIA/nvidia-docker) following instructions here: <https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker>. Note: only supports Linux; no Windows or MacOS.
We provide a base image at Dockerhub: `haosulab/mani-skill2:latest`. It is based on `nvidia/cudagl:11.3.1-devel-ubuntu20.04`. The corresponding Dockerfile is [here](https://github.com/haosulab/ManiSkill2/blob/main/docker/Dockerfile).
Here is an example of how to customize the base docker image.
```Dockerfile
FROM haosulab/mani-skill2:latest
# Install additional python packages you need
RUN pip install torch==1.12.1
# Copy your codes (including user_solution.py) and model weights
COPY ${YOUR_CODES_AND_WEIGHTS_IN_HOST} ${YOUR_CODES_AND_WEIGHTS_IN_CONTAINER}
ENV PYTHONPATH ${YOUR_CODES_AND_WEIGHTS_IN_CONTAINER}:$PYTHONPATH
```
Given a Dockerfile, you can build your submission docker image.
```bash
# It is suggested to run this command under the directory containing Dockerfile
# See https://docs.docker.com/engine/reference/commandline/build/ for more details
# Here PATH_TO_BUILD_CONTEXT is the local path context under which the docker building instructions like COPY should reference the files.
docker build -f ${PATH_TO_YOUR_DOCKERFILE} ${PATH_TO_BUILD_CONTEXT} -t mani-skill2-submission
```
Finally, you can tag your image and push it to a public docker registry (e.g., [Dockerhub](https://hub.docker.com/)).
```bash
# Tag your local image before uploading it to Dockerhub
docker tag mani-skill2-submission ${DOCKERHUB_USER_NAME}/mani-skill2-submission:${UNIQUE_TAG}
docker push ${DOCKERHUB_USER_NAME}/mani-skill2-submission:${UNIQUE_TAG}
```
As Dockerhub's registry is public, we recommend you create a new anonymous docker account to prevent people from finding it.
:::{warning}
We only accept the docker image the size of which is smaller than 24GB. Please refer to <https://docs.docker.com/develop/develop-images/dockerfile_best-practices/> to reduce size.
:::
## Test the docker image locally
Run the following script to test your docker image locally. If this works, it is ready for submission to the challenge.
```bash
export DOCKER_IMAGE=mani-skill2-submission:${UNIQUE_TAG}
export CONTAINER_NAME=mani-skill2-evaluation
# Initialize a detached container. If you are evaluating tasks with extra assets, you need to mount the directory containing downloaded assets to the container.
docker run -d --rm --gpus all --name ${CONTAINER_NAME} \
-v ${PATH_TO_MS2_ASSET_DIR}:/data \
${DOCKER_IMAGE}
# Interactive debug
docker exec -it ${CONTAINER_NAME} /bin/bash
# Or run evaluation
docker exec -it ${CONTAINER_NAME} /bin/bash -c "export MS2_ASSET_DIR=/data; python -m mani_skill2.evaluation.run_evaluation -e PickCube-v0 -o /eval_results/PickCube-v0 -n 1"
# Finally, you can delete the container
docker kill ${CONTAINER_NAME}
```
## Online Submission
Once you have built and pushed a docker image, you are ready to submit to the competition. Go to the competition [submissions page](https://sapien.ucsd.edu/challenges/maniskill/challenges/ms2/submit) and give your submission a name and enter the docker image name+tag (format: `registry.hub.docker.com/USERNAME/IMG_NAME:TAG`; Do not use the `latest` tag). Then select which track you are submitting to. Lastly, tick/untick which tasks you would like to evaluate your submission on.
To ensure reproducibility, we do not allow you to submit the same docker image and tag twice, we require you to give a new tag to your image before submitting. You can create a new tag as so `docker tag <image_name> <image_name>:<tag_name>`
We **strongly recommend** you only tick the tasks you want to evaluate as we rate limit team submissions by the number of tasks evaluated each day. Each team is given a budget of 50 task evaluations each day. Once the number of task evaluations in a day has gone over 50, we disable submissions for your team. This budget resets every day at 8:00 AM UTC.
================================================
FILE: ManiSkill2/docs/source/concepts/controllers.md
================================================
# Controllers
Controllers are interfaces between policies and robots. The policy outputs actions to the controller, and the controller converts actions to control signals to the robot. For example, the `arm_pd_ee_delta_pose` controller takes the relative movement of the end-effector as input, and uses [inverse kinematics](https://en.wikipedia.org/wiki/Inverse_kinematics) to convert input actions to target positions of robot joints. The robot uses a [PD controller](https://en.wikipedia.org/wiki/PID_controller) to drive motors to achieve target joint positions.
**The controller defines the action space of an environment.** The robot can have separate controllers for its arm, gripper, and other components. The action space is a concatenation of the action spaces of all controllers.
## Terminology
- fixed joint: a joint that can not be controlled. The degree of freedom (DoF) is 0.
- `qpos` ( $q$ ): controllable joint positions
- `qvel` ( $\dot{q}$ ): controllable joint velocities
- target joint position ( $\bar{q}$ ): target position of the motor which drives the joint
- target joint velocity ( $\bar{\dot{q}}$ ): target velocity of the motor which drives the joint
- PD controller: control loop based on $F(t) = K_p (\bar{q}(t) - q(t)) + K_d (\bar{\dot{q}}(t) - \dot{q}(t))$. $K_p$ (stiffness) and $K_d$ (damping) are hyperparameters. $F(t)$ is the force of the motor.
- Augmented PD controller: Passive forces (like gravity) are compensated for the PD controller.
- action ( $a$ ): the input of the controller, also the output of the policy
## Supported Controllers (Franka Emika)
The robot is [Franka Emika](https://github.com/frankaemika/franka_ros), a.k.a Panda. The DoF of the arm is 7. **We use the tool center point (TCP), which is the center between two fingers, as the end-effector.**
All "pd" controllers translate input actions to target joint positions $\bar{q}$ (and velocities) for the internal built-in PD controller. **All the controllers have a normalized action space ([-1, 1]), except `arm_pd_joint_pos` and `arm_pd_joint_pos_vel`.**
For simplicity, we use the name of the arm controller to represent each combination of the arm and gripper controllers, since there is only one gripper controller currently. For example, `pd_joint_delta_pos` is short for `arm_pd_joint_delta_pos` + `gripper_pd_joint_pos`.
### Arm controllers
- arm_pd_joint_pos (7-dim): The input is $\bar{q}$. It can be used for motion planning, but note that the target velocity is always 0.
- arm_pd_joint_delta_pos (7-dim): $\bar{q}(t)=q(t) + a$
- arm_pd_joint_target_delta_pos (7-dim): $\bar{q}(t)=\bar{q}(t-1) + a$
- arm_pd_ee_delta_pos (3-dim): only control position ( $p$ ) without rotation ( $R$ ).
$\bar{p}(t)=p(t)+a$, $\bar{R}(t)=R(t)$, $\bar{q}(t)=IK(\bar{p}(t), \bar{R}(t))$
- arm_pd_ee_delta_pose (6-dim): both position ( $p$ ) and rotation ( $R$ ) are controlled. Rotation is represented as axis-angle in the end-effector frame.
$\bar{p}(t)=p(t)+a_{p}$, $\bar{R}(t)=R(t) \cdot e^{[a_{R}]_{\times}}$, $\bar{q}(t)=IK(\bar{p}(t), \bar{R}(t))$
- arm_pd_ee_target_delta_pos (3-dim): $\bar{p}(t)=\bar{p}(t-1)+a$, $\bar{R}(t)=R(t)$
- arm_pd_ee_target_delta_pose (6-dim): $\bar{T}(t)= T_{a} \cdot \bar{T}(t-1)$. $T$ is the transformation of the end-effector. $T_a$ is the delta pose induced by the action.
- arm_pd_joint_vel (7-dim): only control target joint velocities. Note that the stiffness $K_p$ is set to 0.
- arm_pd_joint_pos_vel (14-dim): the extension of `arm_pd_joint_pos` to support target velocities
- arm_pd_joint_delta_pos_vel (14-dim): the extension of `arm_pd_joint_delta_pos` to support target velocities
### Gripper controllers (optional)
- gripper_pd_joint_pos (1-dim): Note that we force two gripper fingers to have the same target position. Thus, it is like a "mimic" joint.
## Mobile Manipulator
The mobile manipulator is a combination of sciurus17 connector and one or two Panda arms. The controller is named `base_{}_arm_{}`. Except for the base controller, the arm and gripper controllers are the same as in the stationary manipulator.
### Base controllers
- base_pd_joint_vel (4-dim): only control target velocities. The first 2 dimensions stand for egocentric xy-plane linear velocity and the 3rd dimension stands for egocentric z-axis angular velocity. The 4th dimension stands for velocity to adjust torso.
================================================
FILE: ManiSkill2/docs/source/concepts/demonstrations.md
================================================
# Demonstrations
High-quality demonstration datasets are one of the features of ManiSkill2. Demonstrations can be used to facilitate learning-from-demonstrations approaches, e.g., [Shen et al](https://arxiv.org/pdf/2203.02107.pdf).
Most demonstrations are generated by motion planning with privileged information. Some demonstrations are generated by [model predictive control](https://en.wikipedia.org/wiki/Model_predictive_control) (MPC) or state-based Reinforcement Learning (RL) given our dense rewards.
## Download
We provide a command line tool (`mani_skill2.utils.download_demo`) to download demonstrations from Google Drive. The full datasets are available on [Google Drive](https://drive.google.com/drive/folders/1hVdUNPGCHh0OULPCowBClPYIXSwsx-J9). Please refer to [Environments](../concepts/environments.md) for all supported environments. Please see our [notes](https://docs.google.com/document/d/1bBKmsR-R_7tR9LwaT1c3J26SjIWw27tWSLdHnfBR01c/edit?usp=sharing) about the details of the demonstrations.
```bash
# Download the full datasets
python -m mani_skill2.utils.download_demo all
# Download the demonstration dataset for certain task
python -m mani_skill2.utils.download_demo ${ENV_ID}
# Download the demonstration datasets for all rigid-body tasks to "./demos"
python -m mani_skill2.utils.download_demo rigid_body -o ./demos
# Download the demonstration datasets for all soft-body tasks
python -m mani_skill2.utils.download_demo soft_body
```
For those who cannot access Google Drive, the datasets can be downloaded from [ScienceDB.cn](http://doi.org/10.57760/sciencedb.02239).
## Format
All demonstrations for an environment are saved in HDF5 format. Each HDF5 dataset is named `trajectory.{obs_mode}.{control_mode}.h5`, and is associated with a JSON file with the same base name. The JSON file stores meta information. Unless otherwise specified, `trajectory.h5` is short for `trajectory.none.pd_joint_pos.h5`, which contains the original demonstrations generated by the `pd_joint_pos` controller with the `none` observation mode (empty observations). However, there may exist demonstrations generated by other controllers. **Thus, please check the associated JSON to ensure which controller is used.**
:::{note}
For `PickSingleYCB-v0`, `TurnFaucet-v0`, the dataset is named `{model_id}.h5` for each asset. It is due to some legacy issues, and might be changed in the future.
For `OpenCabinetDoor-v1`, `OpenCabinetDrawer-v1`, `PushChair-v1`, `MoveBucket-v1`, which are migrated from [ManiSkill1](https://github.com/haosulab/ManiSkill), trajectories are generated by the RL and `base_pd_joint_vel_arm_pd_joint_vel` controller.
:::
### Meta Information (JSON)
Each JSON file contains:
- env_info (`Dict`): environment information, which can be used to initialize the environment
- env_id: environment id
- max_episode_steps
- env_kwargs: keyword arguments to initialize the environment. **Essential to reproduce the trajectory.**
- episodes (`List[Dict]`): episode information
The episode information (the element of `episodes`) includes:
- episode_id: a unique id to index the episode
- reset_kwargs: keyword arguments to reset the environment. **Essential to reproduce the trajectory.**
- control_mode: control mode used for the episode.
- elapsed_steps: trajectory length
- info: information at the end of the episode.
To reproduce the environment for the trajectory:
```python
env = gym.make(env_info["env_id"], **env_info["env_kwargs"])
episode = env_info["episodes"][0]
env.reset(**episode["reset_kwargs"])
```
### Trajectory Data (HDF5)
Each HDF5 demonstration dataset consists of multiple trajectories. The key of each trajectory is `traj_{episode_id}`, e.g., `traj_0`.
Each trajectory is an `h5py.Group`, which contains:
- actions: [T, A], `np.float32`. `T` is the number of transitions.
- success: [T], `np.bool_`. It indicates whether the task is successful at each time step.
- env_states: [T+1, D], `np.float32`. Environment states. It can be used to set the environment to a certain state, e.g., `env.set_state(env_states[i])`. However, it may not be enough to reproduce the trajectory.
- env_init_state: [D], `np.float32`. The initial environment state. It is used for soft-body environments, since their states (particle positions) can use too much space.
- obs (optional): observations. If the observation is a `dict`, the value will be stored in `obs/{key}`. The convention is applied recursively for nested dict.
## Usage
To replay the demonstrations (without changing the observation mode and control mode):
```bash
# Replay and view trajectories through sapien viewer
python -m mani_skill2.trajectory.replay_trajectory --traj-path demos/rigid_body/PickCube-v0/trajectory.h5 --vis
# Save videos of trajectories (to the same directory of trajectory)
python -m mani_skill2.trajectory.replay_trajectory --traj-path demos/rigid_body/PickCube-v0/trajectory.h5 --save-video
```
:::{note}
The script requires `trajectory.h5` and `trajectory.json` to be both under the same directory.
:::
The raw demonstration files contain all the necessary information (e.g. initial states, actions, seeds) to reproduce a trajectory. Observations are not included since they can lead to large file sizes without postprocessing. In addition, actions in these files do not cover all control modes. Therefore, you need to convert our raw files into your desired observation and control modes. We provide a utility script that works as follows:
```bash
# Replay demonstrations with control_mode=pd_joint_delta_pos
python -m mani_skill2.trajectory.replay_trajectory \
--traj-path demos/rigid_body/PickCube-v0/trajectory.h5 \
--save-traj --target-control-mode pd_joint_delta_pos --obs-mode none --num-procs 10
```
<details>
<summary><b>Click here</b> for important notes about the script arguments.</summary>
- `--save-traj`: save the replayed trajectory to the same folder as the original trajectory file.
- `--num-procs=10`: split trajectories to multiple processes (e.g., 10 processes) for acceleration.
- `--obs-mode=none`: specify the observation mode as `none`, i.e. not saving any observations.
- `--obs-mode=rgbd`: (not included in the script above) specify the observation mode as `rgbd` to replay the trajectory. If `--save-traj`, the saved trajectory will contain the RGBD observations. RGB images are saved as uint8 and depth images (multiplied by 1024) are saved as uint16.
- `--obs-mode=pointcloud`: (not included in the script above) specify the observation mode as `pointcloud`. We encourage you to further process the point cloud instead of using this point cloud directly.
- `--obs-mode=state`: (not included in the script above) specify the observation mode as `state`. Note that the `state` observation mode is not allowed for challenge submission.
- `--use-env-states`: For each time step $t$, after replaying the action at this time step and obtaining a new observation at $t+1$, set the environment state at time $t+1$ as the recorded environment state at time $t+1$. This is necessary for successfully replaying trajectories for the tasks migrated from ManiSkill1.
</details>
<br>
:::{note}
For soft-body environments, please compile and generate caches (`python -m mani_skill2.utils.precompile_mpm`) before running the script with multiple processes (with `--num-procs`).
:::
:::{caution}
The conversion between controllers (or action spaces) is not yet supported for mobile manipulators (e.g., used in tasks migrated from ManiSkill1).
:::
:::{caution}
Since some demonstrations are collected in a non-quasi-static way (objects are not fixed relative to the manipulator during manipulation) for some challenging tasks (e.g., `TurnFaucet` and tasks migrated from ManiSkill1), replaying actions can fail due to non-determinism in simulation. Thus, replaying trajectories by environment states is required (passing `--use-env-states`).
:::
---
We recommend using our script only for converting actions into different control modes without recording any observation information (i.e. passing `--obs-mode=none`). The reason is that (1) some observation modes, e.g. point cloud, can take much space without any post-processing, e.g., point cloud downsampling; in addition, the `state` mode for soft-body environments also has a similar issue, since the states of those environments are particles. (2) Some algorithms (e.g. GAIL) require custom keys stored in the demonstration files, e.g. next-observation.
Thus we recommend that, after you convert actions into different control modes, implement your custom environment wrappers for observation processing. After this, use another script to render and save the corresponding post-processed visual demonstrations. [ManiSkill2-Learn](https://github.com/haosulab/ManiSkill2-Learn) has included such observation processing wrappers and demonstration conversion script (with multi-processing), so we recommend referring to the repo for more details.
================================================
FILE: ManiSkill2/docs/source/concepts/environments.md
================================================
# Environments
[asset-badge]: https://img.shields.io/badge/download%20asset-yes-blue.svg
## Rigid-body
### Pick-and-Place
#### PickCube-v0
(pickcube-v0)=
- Objective: Pick up a cube and move it to a goal position.
- Success metric: The cube is within 2.5 cm of the goal position, and the robot is static.
- Goal specification: 3D goal position.
- Demonstration: 1000 successful trajectories.
- Evaluaion protocol: 100 episodes with different initial joint positions of the robot and initial cube pose.
```{image} thumbnails/PickCube-v0.gif
---
width: 256px
alt: PickCube-v0
---
```
#### StackCube-v0
- Objective: Pick up a red cube and place it onto a green one.
- Success metric: The red cube is placed on top of the green one stably and it is not grasped.
- Demonstration: 1000 successful trajectories.
- Evaluaion protocol: 100 episodes with different initial joint positions of the robot and initial poses of both cubes.
```{image} thumbnails/StackCube-v0.gif
---
width: 256px
alt: StackCube-v0
---
```
#### PickSingleYCB-v0
(picksingleycb-v0)=
![download-asset][asset-badge]
- Objective: Pick up a YCB object and move it to a goal position.
- Success metric: The object is within 2.5 cm of the goal position, and the robot is static.
- Goal specification: 3D goal position.
- Demonstration: 100 successful trajectories for each of the 74 YCB objects.
- Evaluation protocol:
- 5 episodes per object in the training set (74 YCB objects).
- 10 episodes per object in the held-out evaluation set (40 objects from other sources).
```{image} thumbnails/PickSingleYCB-v0.gif
---
width: 256px
alt: PickSingleYCB-v0
---
```
Use all models:
```python
env = gym.make("PickSingleYCB-v0")
```
Use a single model:
```python
env = gym.make("PickSingleYCB-v0", model_ids="002_master_chef_can")
```
Use multiple models:
```python
env = gym.make("PickSingleYCB-v0", model_ids=["002_master_chef_can", "003_cracker_box"])
```
Model ids can be found in `mani_skill2/assets/mani_skill2_ycb/info_pick_v0.json`.
#### PickSingleEGAD-v0
![download-asset][asset-badge]
- Objective: Pick up an EGAD object and move it to a goal position.
- Note: The color for the EGAD object is randomized.
- Success metric: The object is within 2.5 cm of the goal position, and the robot is static.
- Goal specification: 3D goal position.
- Demonstration: a total of 7785 trajectories for the 1600 EGAD objects (at most 5 trajectories per object).
- Evaluation protocol:
- 1 episode per object in the training set (a subset of 150 EGAD objects).
- 2 episodes per object in the evaluation set (150 held-out EGAD objects).
```{image} thumbnails/PickSingleEGAD-v0.gif
---
width: 256px
alt: PickSingleEGAD-v0
---
```
You can use a similar way as `PickSingleYCB` to select models. Model ids can be found in `mani_skill2/assets/mani_skill2_egad/info_pick_train_v0.json`.
#### PickClutterYCB-v0
![download-asset][asset-badge]
- Objective: Pick up an object from a clutter of 4-8 YCB objects
- Success metric: The object is within 2.5 cm of the goal position, and the robot is static.
- Goal specification: 3D goal position and 3D initial position of the object to pick up (a visible point on the surface).
- Demonstration: a total of 4986 trajectories (5000 training layouts of objects).
- Evaluation protocol:
- 100 episodes for the training set of YCB objects.
- 100 episodes for the evaluation set of held-out objects.
```{image} thumbnails/PickClutterYCB-v0.gif
---
width: 256px
alt: PickClutterYCB-v0
---
```
### Assembly
#### PegInsertionSide-v0
- Objective: Insert a peg into the horizontal hole in a box.
- Success metric: Half of the peg is inserted into the hole.
- Demonstration: 1000 successful trajectories.
- Evaluation protocol: 100 episodes with different initial joint positions of the robot, initial poses of the peg and box, the position and size of the hole.
```{image} thumbnails/PegInsertionSide-v0.gif
---
width: 256px
alt: PegInsertionSide-v0
---
```
#### PlugCharger-v0
- Objective: Plug a charger into a wall receptacle.
- Success metric: The charger is fully inserted into the receptacle.
- Demonstration: 1000 successful trajectories.
- Evaluation protocol: 100 episodes with different initial joint positions of the robot, initial poses of the charger and wall.
```{image} thumbnails/PlugCharger-v0.gif
---
width: 256px
alt: PlugCharger-v0
---
```
#### AssemblingKits
![download-asset][asset-badge]
- Objective: Insert an object into the corresponding slot on a board.
- Success metric: An object must fully fit into its slot, which must simultaneously satisfy 3 criteria: (1) height of the object center is within 3mm of the height of the board; (2) rotation error is within 4 degrees; (3) position error is within 2cm.
- Demonstration: a total of 1720 trajectories for 337 kit configurations and 20 objects.
- Evaluation protocol:
- 100 episodes for 20 training objects.
- 100 episodes for 20 held-out evaluation objects.
```{image} thumbnails/AssemblingKits-v0.gif
---
width: 256px
alt: AssemblingKits-v0
---
```
### Miscellaneous
#### PandaAvoidObstacles-v0
![download-asset][asset-badge]
- Objective: Navigate the (Panda) robot arm through a region of dense obstacles and move the end-effector to a goal pose.
- Note: The shape and color of dense obstacles are randomized.
- Success metric: The end-effector pose is within 2.5 cm and 15 degrees of the goal pose.
- Goal specification: The goal pose of the end-effector.
- Demonstration: 1976 successful trajectories.
- Evaluation protocol: 100 episodes with different layouts of obstacles.
```{image} thumbnails/PandaAvoidObstacles-v0.gif
---
width: 256px
alt: PandaAvoidObstacles-v0
---
```
#### TurnFaucet-v0
![download-asset][asset-badge]
- Objective: Turn on a faucet by rotating its handle.
- Success metric: The faucet handle has been turned past a target angular distance.
- Goal specification: The remaining angular distance to rotate the handle, the initial center of mass of the target handle (since there can be multiple handles in a single faucet), and the direction to rotate the handle specified as 3D joint axis.
- Demonstration: a total of 5510 trajectories (100 trajectories per faucet for most of 60 models from PartNet-Mobility).
- Evaluation protocol:
- 5 episodes per model in the training set (60)
- 17 episodes per model in the test set (18)
```{image} thumbnails/TurnFaucet-v0.gif
---
width: 256px
alt: TurnFaucet-v0
---
```
Use all models:
```python
env = gym.make("TurnFaucet-v0")
```
Use a single model:
```python
env = gym.make("TurnFaucet-v0", model_ids="5000")
```
Use multiple models:
```python
env = gym.make("TurnFaucet-v0", model_ids=["5001", "5002"])
```
Model ids can be found in `mani_skill2/assets/partnet_mobility/meta/info_faucet_train.json`.
### Mobile Manipulation from ManiSkill1
#### OpenCabinetDoor-v1
(opencabinetdoor-v1)=
![download-asset][asset-badge]
- Objective: A single-arm mobile robot needs to open a designated target door on a cabinet.
- Note: The friction and damping parameters for the door joints are randomized.
- Success metric: The target door has been opened to at least 90\% of the maximum range, and the target door is static.
- Goal specification: The target angular distance to rotate the door, the initial center of mass of the target link (since there can be multiple doors in a single cabinet), and the direction to rotate the door specified as 3D joint axis.
- Demonstration: 300 trajectories for each target door in the training object set. The training object set consists of 42 cabinets. Each cabinet could contain multiple doors.
- Evaluation protocol:
- 125 episodes for models in the training set (42)
- 25 episodes per model in the test set (10)
```{image} thumbnails/OpenCabinetDoor-v1.gif
---
width: 256px
alt: OpenCabinetDoor-v1
---
```
#### OpenCabinetDrawer-v1
![download-asset][asset-badge]
- Objective: A single-arm mobile robot needs to open a designated target drawer on a cabinet.
- Note: The friction and damping parameters for the drawer joints are randomized.
- Success metric: The target drawer has been opened to at least 90\% of the maximum range, and the target drawer is static.
- Goal specification: The target linear distance to pull the drawer, the initial center of mass of the target link (since there can be multiple drawers in a single cabinet), and the direction to pull the drawer specified as 3D joint axis.
- Demonstration: 300 trajectories for each target drawer in the training object set. The training object set consists of 25 cabinets. Each cabinet could contain multiple drawers.
- Evaluation protocol:
- 5 episodes per model in the training set (25)
- 25 episodes per model in the test set (10)
```{image} thumbnails/OpenCabinetDrawer-v1.gif
---
width: 256px
alt: OpenCabinetDrawer-v1
---
```
#### PushChair-v1
(pushchair-v1)=
![download-asset][asset-badge]
- Objective: A dual-arm mobile robot needs to push a swivel chair to a target location on the ground (indicated by a red hemisphere) and prevent it from falling over.
- Note: The friction and damping parameters for the chair joints are randomized.
- Success metric: The chair is close enough (within 15 cm) to the target location, is static, and does not fall over.
- Demonstration: 300 trajectories for each chair in the training object set. The training object set consists of 26 chairs.
- Evaluation protocol:
- 5 episodes per model in the training set (26)
- 25 episodes per model in the test set (10)
```{image} thumbnails/PushChair-v1.gif
---
width: 256px
alt: PushChair-v1
---
```
#### MoveBucket-v1
![download-asset][asset-badge]
- Objective: A dual-arm mobile robot needs to move a bucket with a ball inside and lift it onto a platform.
- Success metric: The bucket is placed on or above the platform at the upright position, and the bucket is static, and the ball remains in the bucket.
- Demonstration: 300 trajectories for each bucket in the training object set. The training object set consists of 29 buckets.
- Evaluation protocol:
- 5 episodes per model in the training set (29)
- 25 episodes per model in the test set (10)
```{image} thumbnails/MoveBucket-v1.gif
---
width: 256px
alt: MoveBucket-v1
---
```
## Soft-body
### Excavate-v0
- Objective: Lift a specific amount of clay to a target height.
- Success metric: The amount of lifted clay must be within a given range; the lifted clay is higher than a specific height; fewer than 20 clay particles are spilled on the ground; soft body velocity <0.05.
- Goal specification: Target clay amount.
- Demonstration: 200 successful trajectories.
- Evaluation protocol: 100 episodes with different bucket poses and initial heightmaps of clay.
```{image} thumbnails/Excavate-v0.gif
---
width: 256px
alt: Excavate-v0
---
```
### Fill-v0
- Objective: Fill clay from a bucket into the target beaker.
- Success metric: The amount of clay inside the target beaker >90\%; soft body velocity <0.05.
- Goal specification: Beaker position.
- Demonstration: 200 successful trajectories.
- Evaluation protocol: 100 episodes with different initial rotations of the bucket and initial positions of the beaker.
```{image} thumbnails/Fill-v0.gif
---
width: 256px
alt: Fill-v0
---
```
### Pour-v0
- Objective: Pour liquid from a bottle into a beaker.
- Success metric: The liquid level in the beaker is within 4mm of the red line; the spilled water is fewer than 100 particles; the bottle returns to the upright position in the end; robot arm velocity <0.05.
- Goal specification: Red line height.
- Demonstration: 200 successful trajectories.
- Evaluation protocol: 100 episodes with different bottle positions, the level of water in the bottle, and beaker positions.
```{image} thumbnails/Pour-v0.gif
---
width: 256px
alt: Pour-v0
---
```
### Hang-v0
- Objective: Hang a noodle on a target rod.
- Success metric: Part of the noodle is higher than the rod; two ends of the noodle are on different sides of the rod; the noodle is not touching the ground; the gripper is open; soft body velocity <0.05.
- Goal specification: Rod position.
- Demonstration: 200 successful trajectories.
- Evaluation protocol: 100 episodes with different initial positions of the gripper and rod poses.
```{image} thumbnails/Hang-v0.gif
---
width: 256px
alt: Hang-v0
---
```
### Pinch-v0
![download-asset][asset-badge]
- Objective: Deform plasticine into a target shape.
- Success metric: The Chamfer distance between the current plasticine and the target shape is less than $0.3t$, where $t$ is the Chamfer distance between the initial shape and target shape.
- Goal specification: RGBD / point cloud observations of the target plasticine from 4 different views.
- Demonstration: 1556 successful trajectories. Different trajectories correspond to different target shapes.
- Evaluation protocol: 50 episodes with different target shapes.
```{image} thumbnails/Pinch-v0.gif
---
width: 256px
alt: Pinch-v0
---
```
### Write-v0
![download-asset][asset-badge]
- Objective: Write a given character on clay. The target character is randomly sampled from an alphabet of over 50 characters.
- Success metric: The IoU (Intersection over Union) between the current pattern and the target character is larger than 0.8.
- Goal specification: The depth map of the target character.
- Demonstration: 200 successful trajectories.
- Evaluation protocol: 50 episodes with different target characters.
```{image} thumbnails/Write-v0.gif
---
width: 256px
alt: Write-v0
---
```
================================================
FILE: ManiSkill2/docs/source/concepts/observation.md
================================================
# Observation
See our [colab tutorial](https://colab.research.google.com/github/haosulab/ManiSkill2/blob/main/examples/tutorials/customize_environments.ipynb#scrollTo=NaSQ7CD2sswC) for how to customize cameras.
## Observation mode
**The observation mode defines the observation space.**
All ManiSkill2 environments take the observation mode (`obs_mode`) as one of the input arguments of `__init__`.
In general, the observation is organized as a dictionary (with an observation space of `gym.spaces.Dict`).
There are two raw observations modes: `state_dict` (privileged states) and `image` (raw visual observations without postprocessing). `state` is a flat version of `state_dict`. `rgbd` and `pointcloud` apply post-processing on `image`.
### state_dict
The observation is a dictionary of states. It usually contains privileged information such as object poses. It is not supported for soft-body environments.
- `agent`: robot proprioception
- `qpos`: [nq], current joint positions. *nq* is the degree of freedom.
- `qvel`: [nq], current joint velocities
- `base_pose`: [7], robot position (xyz) and quaternion (wxyz) in the world frame
- `controller`: controller states depending on the used controller. Usually an empty dict.
- `extra`: a dictionary of task-specific information, e.g., goal position, end-effector position.
### state
It is a flat version of *state_dict*. The observation space is `gym.spaces.Box`.
### image
In addition to `agent` and `extra`, `image` and `camera_param` are introduced.
- image: RGB, depth, and other images taken by cameras
- `{camera_uid}`:
- `Color`: [H, W, 4], `np.float32`. RGBA.
- `Position`: [H, W, 4], `np.float32`. The first 3 dimensions stand for (x, y, z) coordinates in the OpenGL/Blender convension. The unit is meter.
- `camera_param`: camera parameters
- `cam2world_gl`: [4, 4], transformation from the camera frame to the world frame (OpenGL/Blender convention)
- `extrinsic_cv`: [4, 4], camera extrinsic (OpenCV convention)
- `intrinsic_cv`: [3, 3], camera intrinsic (OpenCV convention)
Unless specified otherwise, there are two cameras: *base_camera* (fixed relative to the robot base) and *hand_camera* (mounted on the robot hand). Environments migrated from ManiSkill1 use 3 cameras mounted above the robot: *overhead_camera_{i}*.
### rgbd
We postprocess the raw image observation to obtain RGB-D images.
- `image`: RGB, depth, and other images taken by cameras
- `{camera_uid}`:
- `rgb`: [H, W, 3], `np.uint8`. RGB.
- `depth`: [H, W, 1], `np.float32`. 0 stands for an invalid pixel (beyond the camera far).
### pointcloud
We postprocess the raw image observation to obtain a point cloud in the world frame. `image` is replaced by `pointcloud`.
- `pointcloud`:
- `xyzw`: [N, 4], point cloud fused from all cameras in the world frame. "xyzw" is a homogeneous representation. `w=0` for infinite points (beyond the camera far), and `w=1` for the rest.
- `rgb`: [N, 3], corresponding colors of the fused point cloud
Note that the point cloud does not contain more information than RGB-D images unless specified otherwise.
### +robot_seg
`rgbd+robot_seg` or `pointcloud+robot_seg` can be used to acquire the segmentation mask of robot links. `robot_seg` is appended.
- `pointcloud+robot_seg`:
- `robot_seg`: [N, 1], a binary mask where 1 for robot and 0 for others.
- `rgbd+robot_seg`:
- {camera_uid}
- `robot_seg`: [N, 1], a binary mask where 1 for robot and 0 for others.
## Ground-truth Segmentation
Ground-truth segmentation can be used to generate training data for computer vision, reinforcement learning, and many other applications.
```python
env = gym.make(env_id, camera_cfgs={"add_segmentation": True})
```
There will be an additional key: *Segmentation*.
For `obs_mode="rgbd"`:
- `image`:
- `{camera_uid}`
- `Segmentation`: [H, W, 4], `np.uint32`. The 1st dimension is mesh-level (part) segmentation. The 2nd dimension is actor-level (object/link) segmentation.
For `obs_mode="pointcloud"`:
- `pointcloud`:
- `Segmentation`: [N, 4], `np.uint32`
### More Details on Mesh and Actor-Level segmentations
An "actor" is a fundamental object that represents a physical entity (rigid body) that can be simulated in SAPIEN (the backend of ManiSkill2). An articulated object is a collection of links interconnected by joints, and each link is also an actor. In SAPIEN, `scene.get_all_actors()` will return all the actors that are not links of articulated objects. The examples are the ground, the cube in [PickCube](./environments.md#pickcube-v0), and the YCB objects in [PickSingleYCB](./environments.md#picksingleycb-v0). `scene.get_all_articulations()` will return all the articulations. The examples are the robots, the cabinets in [OpenCabinetDoor](./environments.md#opencabinetdoor-v1), and the chairs in [PushChair](./environments.md#pushchair-v1). Below is an example of how to get actors and articulations in SAPIEN.
```python
import sapien.core as sapien
scene: sapien.Scene = ...
actors = scene.get_all_actors() # actors excluding links
articulations = scene.get_all_articulations() # articulations
for articulation in articulations:
links = articulation.get_links() # links of an articulation
```
In ManiSkill2, our environments provide interfaces to wrap the above SAPIEN functions:
- `env.get_actors()`: return all task-relevant actors excluding links. Note that some actors might be excluded from `env._scene.get_all_actors()`.
- `env.get_articulations()`: return all task-relevant articulations. Note that some articulations might be excluded from `env._scene.get_all_articulations()`.
```{eval-rst}
.. subfigure:: AB
:subcaptions: below
:class-grid: outline
:align: center
.. image:: https://sapien.ucsd.edu/docs/latest/_images/label1.png
:alt: Actor-level segmentation
:width: 256px
.. image:: https://sapien.ucsd.edu/docs/latest/_images/label0.png
:alt: Mesh-level segmentation
:width: 256px
```
The segmentation image is a `[H, W, 4]` array. The second channel corresponds to the ids of actors. The first channel corresponds to the ids of visual meshes (each actor can consist of multiple visual meshes).
Thus, given the actors, you can use the ids of these actors (`actor.id`) to query the actor segmentation to segment out a particular object. For example,
```python
import mani_skill2.envs, gym
import numpy as np
env = gym.make('PickSingleYCB-v0', obs_mode='rgbd', camera_cfgs={'add_segmentation': True})
obs = env.reset()
print(env.get_actors()) # e.g., [Actor(name="ground", id="14"), Actor(name="008_pudding_box", id="15"), Actor(name="goal_site", id="16")]
print([x.name for x in env.get_articulations()]) # ['panda_v2']
# get the actor ids of objects to manipulate; note that objects here are not articulated
target_object_actor_ids = [x.id for x in env.get_actors() if x.name not in ['ground', 'goal_site']]
# get the robot link ids (links are subclass of actors)
robot_links = env.agent.robot.get_links() # e.g., [Actor(name="root", id="1"), Actor(name="root_arm_1_link_1", id="2"), Actor(name="root_arm_1_link_2", id="3"), ...]
robot_link_ids = np.array([x.id for x in robot_links], dtype=np.int32)
# obtain segmentations of the target object(s) and the robot
for camera_name in obs['image'].keys():
seg = obs['image'][camera_name]['Segmentation'] # (H, W, 4); [..., 0] is mesh-level; [..., 1] is actor-level; [..., 2:] is zero (unused)
actor_seg = seg[..., 1]
new_seg = np.zeros_like(actor_seg)
new_seg[np.isin(actor_seg, robot_link_ids)] = 1
for i, target_object_actor_id in enumerate(target_object_actor_ids):
new_seg[np.isin(actor_seg, target_object_actor_id)] = 2 + i
obs['image'][camera_name]['new_seg'] = new_seg
# print(np.unique(new_seg))
```
However, the actor segmentations do not contain finegrained information on object parts, such as handles and door surfaces of cabinets. In this case, you need to leverage the mesh-level segmentations and the fine-grained visual bodies of actors to obtain the segmentations to e.g., handles and door surfaces. For example,
```python
import mani_skill2.envs, gym
import numpy as np
env = gym.make('OpenCabinetDoor-v1', obs_mode='rgbd', camera_cfgs={'add_segmentation': True})
obs = env.reset()
print(env.get_actors()) # e.g., [Actor(name="ground", id="20"), Actor(name="visual_ground", id="21")], which are not very helpful
print([x.name for x in env.get_articulations()]) # e.g., ['mobile_panda_single_arm', '1017']
# We'd like to obtain fine-grained part segmentations such as handles, so we need to obtain the finegrained visual bodies that correspond to each cabinet link
# get the names and ids of cabinet visual bodies and manually group them based on semantics
cabinet_links = env.cabinet.get_links() # e.g., [Actor(name="base", id="22"), Actor(name="link_1", id="23"), Actor(name="link_0", id="24")]
cabinet_visual_bodies = [x.get_visual_bodies() for x in cabinet_links]
cabinet_visual_body_names = np.concatenate([[b.name for b in cvbs] for cvbs in cabinet_visual_bodies]) # e.g., array(['shelf-10', 'shelf-11', 'frame_horizontal_bar-26', ...])
cabinet_visual_body_ids = np.concatenate([[b.get_visual_id() for b in cvbs] for cvbs in cabinet_visual_bodies]).astype(np.int32) # e.g., array([15, 16, 17, 18, 19, ...])
all_handle_ids = []
all_door_ids = []
all_drawer_ids = []
all_cabinet_rest_ids = []
for i in range(len(cabinet_visual_body_names)):
# print(cabinet_visual_body_names[i], cabinet_visual_body_ids[i])
if 'handle' in cabinet_visual_body_names[i]:
all_handle_ids.append(cabinet_visual_body_ids[i])
elif 'door_surface' in cabinet_visual_body_names[i]:
all_door_ids.append(cabinet_visual_body_ids[i])
elif 'drawer_front' in cabinet_visual_body_names[i]:
all_drawer_ids.append(cabinet_visual_body_ids[i])
else:
all_cabinet_rest_ids.append(cabinet_visual_body_ids[i])
all_handle_ids = np.array(all_handle_ids)
all_door_ids = np.array(all_door_ids)
all_drawer_ids = np.array(all_drawer_ids)
all_cabinet_rest_ids = np.array(all_cabinet_rest_ids)
# get the robot link ids
robot_links = env.agent.robot.get_links() # e.g., [Actor(name="root", id="1"), Actor(name="root_arm_1_link_1", id="2"), Actor(name="root_arm_1_link_2", id="3"), ...]
robot_link_ids = np.array([x.id for x in robot_links], dtype=np.int32)
# get the segmentations of different cabinet parts and the robots
for camera_name in obs['image'].keys():
seg = obs['image'][camera_name]['Segmentation'] # (H, W, 4); [..., 0] is mesh-level; [..., 1] is actor-level; [..., 2:] is zero (unused)
mesh_seg = seg[..., 0]
actor_seg = seg[..., 1]
# visual body ids correspond to mesh-level segmentations
semantic_grouped_seg = np.zeros_like(mesh_seg)
semantic_grouped_seg[np.isin(mesh_seg, all_handle_ids)] = 1
semantic_grouped_seg[np.isin(mesh_seg, all_door_ids)] = 2
semantic_grouped_seg[np.isin(mesh_seg, all_drawer_ids)] = 3
semantic_grouped_seg[np.isin(mesh_seg, all_cabinet_rest_ids)] = 4
# link ids correspond to actor-level segmentations, since a link is a subclass of an actor
semantic_grouped_seg[np.isin(actor_seg, robot_link_ids)] = 5
obs['image'][camera_name]['semantic_grouped_seg'] = semantic_grouped_seg
print(f"Summary of # points in the processed segmentaion map for camera {camera_name}:", [(semantic_grouped_seg == x).sum() for x in range(6)])
```
================================================
FILE: ManiSkill2/docs/source/conf.py
================================================
# Configuration file for the Sphinx documentation builder.
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
project = "ManiSkill2"
copyright = "2023, ManiSkill2 Contributors"
author = "ManiSkill2 Contributors"
release = "0.4.0"
# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
extensions = [
"sphinx_rtd_theme",
"sphinx.ext.autodoc",
"sphinx.ext.mathjax",
"sphinx_copybutton",
"myst_parser",
"sphinx_subfigure",
]
# https://myst-parser.readthedocs.io/en/latest/syntax/optional.html
myst_enable_extensions = ["colon_fence", "dollarmath"]
# https://github.com/executablebooks/MyST-Parser/issues/519#issuecomment-1037239655
myst_heading_anchors = 4
templates_path = ["_templates"]
exclude_patterns = []
# -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
html_theme = "sphinx_rtd_theme"
# html_static_path = ["_static"]
# replace "view page source" with "edit on github" in Read The Docs theme
# * https://github.com/readthedocs/sphinx_rtd_theme/issues/529
html_context = {
"display_github": True,
"github_user": "haosulab",
"github_repo": "ManiSkill2",
"github_version": "main/docs/source/",
}
================================================
FILE: ManiSkill2/docs/source/getting_started/docker.md
================================================
# Docker
Docker provides a convenient way to package software into standardized units for development, shipment and deployment. See the [official website](https://www.docker.com/resources/what-container/) for more details about Docker. [NVIDIA Container Tookit](https://github.com/NVIDIA/nvidia-docker) enables users to build and run GPU accelerated Docker containers.
First, install [nvidia-docker v2](https://github.com/NVIDIA/nvidia-docker) following the [official instructions](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker). It is recommended to complete post-install steps for Linux.
To verify the installation:
```bash
# You should be able to run this without sudo.
docker run hello-world
```
## Run ManiSkill2 in Docker
We provide a docker image (`haosulab/mani-skill2`) and its corresponding [Dockerfile](https://github.com/haosulab/ManiSkill2/blob/main/docker/Dockerfile).
```bash
docker pull haosulab/mani-skill2
docker run --rm -it --gpus all haosulab/mani-skill2 python -m mani_skill2.examples.demo_random_action
```
## Run GUI Applications
To run GUI applications from the docker container (the host is attached with a display), you need to add extra options to the `docker run` command:
```bash
# Allow local X11 connections
xhost +local:root
# Run ManiSkill2 docker image with the NVIDIA GPU
docker run --rm -it --gpus all \
-v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY \
haosulab/mani-skill2 \
python -m mani_skill2.examples.demo_manual_control -e PickCube-v0 --enable-sapien-viewer
```
To run GUI applications on a headless server, we present a solution based on `x11vnc` and `fluxbox`.
```bash
# https://www.richud.com/wiki/Ubuntu_Fluxbox_GUI_with_x11vnc_and_Xvfb
docker run --rm --gpus all -p 5900:5900 \
haosulab/mani-skill2 \
apt update && bash -c "apt install -yqq x11vnc fluxbox && x11vnc -create -env FD_PROG=/usr/bin/fluxbox -env X11VNC_FINDDISPLAY_ALWAYS_FAILS=1 -env X11VNC_CREATE_GEOM=${1:-1920x1080x16} -gone 'pkill Xvfb' -nopw"
```
Then, forward the port of VNC (5900 by default) to the local host. On your local machine, install a [VNC viewer](https://www.realvnc.com/en/connect/download/viewer/) and connect to the localhost port(e.g. localhost:5900).
---
**References**:
- <https://medium.com/@benjamin.botto/opengl-and-cuda-applications-in-docker-af0eece000f1>
- <http://wiki.ros.org/docker/Tutorials/GUI>
- <https://github.com/haosulab/ManiSkill2/issues/62>
================================================
FILE: ManiSkill2/docs/source/getting_started/installation.md
================================================
# Installation
From pip (stable version):
```bash
# `mani-skill2` or `mani_skill2` is equivalent for pip
pip install mani-skill2
```
From github (latest commit):
```bash
pip install --upgrade git+https://github.com/haosulab/ManiSkill2.git
```
From source:
```bash
git clone https://github.com/haosulab/ManiSkill2.git
cd ManiSkill2 && pip install -e .
```
:::{note}
A GPU with the Vulkan driver installed is required to enable rendering in ManiSkill2. See [here](vulkan) for how to install and configure Vulkan on Ubuntu.
:::
The rigid-body environments, powered by SAPIEN, are ready to use after installation. Test your installation:
```bash
# Run an episode (at most 200 steps) of "PickCube-v0" (a rigid-body environment) with random actions
# Or specify an environment by "-e ${ENV_ID}"
python -m mani_skill2.examples.demo_random_action
```
Besides, we provide a docker image (`haosulab/mani-skill2`) on [Docker Hub](https://hub.docker.com/repository/docker/haosulab/mani-skill2/general), and its corresponding [Dockerfile](https://github.com/haosulab/ManiSkill2/blob/main/docker/Dockerfile).
## Warp (ManiSkill2-version)
:::{note}
The following section is to install [NVIDIA Warp](https://github.com/NVIDIA/warp) for soft-body environments. You can skip it if you do not need soft-body environments yet.
:::
The soft-body environments in ManiSkill2 are supported by SAPIEN and customized NVIDIA Warp. **CUDA toolkit >= 11.3 and gcc** are required. You can download and install the CUDA toolkit from the [offical website](https://developer.nvidia.com/cuda-downloads?target_os=Linux).
Assuming the CUDA toolkit is installed at `/usr/local/cuda`, you need to ensure `CUDA_PATH` or `CUDA_HOME` is set properly:
```bash
export CUDA_PATH=/usr/local/cuda
# The following command should print a CUDA compiler version >= 11.3
${CUDA_PATH}/bin/nvcc --version
# The following command should output a valid gcc version
gcc --version
```
:::{note}
If `nvcc` is included in `$PATH`, we will try to figure out the variable `CUDA_PATH` automatically.
:::
After CUDA is properly set up, compile Warp customized for ManiSkill2:
``` bash
# If you encounter "ModuleNotFoundError: No module named 'warp'", please add warp_maniskill to the python path.
export PYTHONPATH=/path/to/ManiSkill2/warp_maniskill:$PYTHONPATH
# warp.so is generated under warp_maniskill/warp/bin
python -m warp_maniskill.build_lib
```
For soft-body environments, you need to make sure only 1 CUDA device is visible:
``` bash
# Select the first CUDA device. Change 0 to other integer for other device.
export CUDA_VISIBLE_DEVICES=0
```
If multiple CUDA devices are visible, the environment will give an error. If you
want to interactively visualize the environment, you need to assign the id of
the GPU connected to your display (e.g., monitor screen).
:::{warning}
All soft-body environments require runtime compilation and cache generation. The cache is generated in parallel. Thus, to avoid race conditions, before you create soft-body environments in parallel, please make sure the cache is already generated. You can generate cache in advance by `python -m mani_skill2.utils.precompile_mpm -e {ENV_ID}` (or without an option for all soft-body environments).
:::
## Troubleshooting
(vulkan)=
### Vulkan
To install Vulkan on Ubuntu:
```bash
sudo apt-get install libvulkan1
```
To test your installation of Vulkan:
```bash
sudo apt-get install vulkan-utils
vulkaninfo
```
If `vulkaninfo` fails to show the information about Vulkan, please check whether the following files exist:
- `/usr/share/vulkan/icd.d/nvidia_icd.json`
- `/usr/share/glvnd/egl_vendor.d/10_nvidia.json`
- `/etc/vulkan/implicit_layer.d/nvidia_layers.json` (optional, but necessary for some GPUs like A100)
If `/usr/share/vulkan/icd.d/nvidia_icd.json` does not exist, try to create the file with the following content:
```json
{
"file_format_version" : "1.0.0",
"ICD": {
"library_path": "libGLX_nvidia.so.0",
"api_version" : "1.2.155"
}
}
```
If `/usr/share/glvnd/egl_vendor.d/10_nvidia.json` does not exist, you can try `sudo apt-get install libglvnd-dev`. `10_nvidia.json` contains the following content:
```json
{
"file_format_version" : "1.0.0",
"ICD" : {
"library_path" : "libEGL_nvidia.so.0"
}
}
```
If `/etc/vulkan/implicit_layer.d/nvidia_layers.json` does not exist, try to create the file with the following content:
```json
{
"file_format_version" : "1.0.0",
"layer": {
"name": "VK_LAYER_NV_optimus",
"type": "INSTANCE",
"library_path": "libGLX_nvidia.so.0",
"api_version" : "1.2.155",
"implementation_version" : "1",
"description" : "NVIDIA Optimus layer",
"functions": {
"vkGetInstanceProcAddr": "vk_optimusGetInstanceProcAddr",
"vkGetDeviceProcAddr": "vk_optimusGetDeviceProcAddr"
},
"enable_environment": {
"__NV_PRIME_RENDER_OFFLOAD": "1"
},
"disable_environment": {
"DISABLE_LAYER_NV_OPTIMUS_1": ""
}
}
}
```
More discussions can be found [here](https://github.com/haosulab/SAPIEN/issues/115).
---
The following errors can happen if the Vulkan driver is broken. Try to reinstall it following the above instructions.
- `RuntimeError: vk::Instance::enumeratePhysicalDevices: ErrorInitializationFailed`
- `Some required Vulkan extension is not present. You may not use the renderer to render, however, CPU resources will be still available.`
- `Segmentation fault (core dumped)`
### Warp
If the soft-body environment throws a **memory error**, you can try compiling Warp in the debug mode.
```bash
PYTHONPATH="$PWD"/warp_maniskill:$PYTHONPATH python -m warp_maniskill.build_lib --mode debug
```
Remember to compile again in the release mode after you finish debugging. In the debug mode, if the error becomes `unsupported toolchain`, it means you have a conflicting CUDA version.
### Uninstallation
If `mani_skill2` is installed through pip, run `pip uninstall mani-skill2`.
:::{note}
There might exist some cache files (e.g., compiled shared library files, convex meshes generated by SAPIEN) generated in the package directory. To fully uninstall `mani_skill2`, please remove those files manually.
:::
================================================
FILE: ManiSkill2/docs/source/getting_started/quickstart.md
================================================
# Quickstart
## Gym Interface
Here is a basic example of how to make a ManiSkill2 environment following the interface of [OpenAI Gym](https://github.com/openai/gym) and run a random policy.
```python
import gym
import mani_skill2.envs # import to register all environments in gym
env = gym.make("PickCube-v0", obs_mode="rgbd", control_mode="pd_ee_delta_pose")
print("Observation space", env.observation_space)
print("Action space", env.action_space)
env.seed(0) # specify a seed for randomness
obs = env.reset()
done = False
while not done:
action = env.action_space.sample()
obs, reward, done, info = env.step(action)
env.render() # a display is required to render
env.close()
```
Each ManiSkill2 environment supports different **observation modes** and **control modes**, which determine its **observation space** and **action space**. They can be specified by `gym.make(env_id, obs_mode=..., control_mode=...)`.
The common observation modes are `state`, `rgbd`, `pointcloud`. We also support `state_dict` (states organized as a hierarchical dictionary) and `image` (raw visual observations without postprocessing). Please refer to [Observation](../concepts/observation.md) for more details.
We support a wide range of controllers. Different controllers can have different effects on your algorithms. Thus, it is recommended to understand the action space you are going to use. Please refer to [Controllers](../concepts/controllers.md) for more details.
Some environments require **downloading assets**. You can download all the assets by `python -m mani_skill2.utils.download_asset all` or download task-specific assets by `python -m mani_skill2.utils.download_asset ${ENV_ID}`. The assets will be downloaded to `./data/` by default, and you can also use the environment variable `MS2_ASSET_DIR` to specify this destination. Please refer to [Environments](../concepts/environments.md) for all supported environments, and which environments require downloading assets.
## Interactive Play
We provide an example script to interactively play with our environments. A display is required.
```bash
# PickCube-v0 can be replaced with other environment id.
python -m mani_skill2.examples.demo_manual_control -e PickCube-v0
```
Keyboard controls:
- Press `i` (or `j`, `k`, `l`, `u`, `o`) to move the end-effector.
- Press any key between `1` to `6` to rotate the end-effector.
- Press `f` or `g` to open or close the gripper.
- Press `w` (or `a`, `s`, `d`) to translate the base if the robot is mobile. Press `q` or `e` to rotate the base. Press `z` or `x` to lift the torso.
- Press `esc` to close the viewer and exit the program.
To enable an interactive viewer supported by SAPIEN, you can add `--enable-sapien-viewer`. The interactive SAPIEN viewer is more powerful for debugging (e.g., checking collision shapes, getting current poses). There will be two windows: an OpenCV window and a SAPIEN (GL) window. Pressing `0` on the focused window can switch the control to the other one.
```{image} images/OpenCV-viewer.png
---
height: 256px
alt: OpenCV viewer
---
```
```{image} images/SAPIEN-viewer.png
---
height: 256px
alt: SAPIEN viewer
---
```
## Vectorized Environment
We provide an implementation of vectorized environments (for rigid-body environments) optimized for visual observations, powered by the SAPIEN RPC-based render server-client system. Importantly, our vectorized environment parallelizes rendering (visual observations) and computing non-visual observations as well as rewards, in a communication-efficient way (visual observation tensors are kept on the GPU to avoid unnecessary data transfer).
It is easy to create a vectorized environment:
```python
from mani_skill2.vector import VecEnv, make
env: VecEnv = make("PickCube-v0", num_envs=4)
```
Please see `mani_skill2/examples/demo_vec_env.py` for a complete example:
```bash
python -m mani_skill2.examples.demo_vec_env -e PickCube-v0 -n 4
```
We provide examples to use our `VecEnv` with [Stable-baselines3](https://stable-baselines3.readthedocs.io/en/master/). Please refer to our [notebook](https://github.com/haosulab/ManiSkill2/blob/main/examples/tutorials/2_reinforcement_learning.ipynb) or [example scripts](https://github.com/haosulab/ManiSkill2/tree/main/examples/tutorials/reinforcement-learning).
---
**Implementation details**: The vectorized environment is optimized for visual observations. In short, the vectorized environment creates multiple python processes (workers) to run the physical simulation for each environment. For each timestep, each worker will compute non-visual observations and rewards in parallel with rendering visual observations. Specifically, the worker (client) sends information needed for rendering to the main process (server), and the actual work of rendering is done by the server. Thus, non-visual and visual observations are obtained in parallel, and the amount of information to communicate between processes is minimized.
:::{note}
- The vectorized environment only supports observation modes including visual observations (`rgbd`, `pointcloud`, `image`). If only state observations are needed, most RL libraries (like Stable-baselines3) provide their implementations of multi-process vectorized environments.
- The visual observations (rendered from cameras) are `torch.Tensor` while non-visual observations are `numpy.ndarray`. It is critical to keep tensors on the GPU for overall efficiency.
- `env.render()` is not supported in the vectorized environment. We suggest that you only use our implementation of vectorized environments for training.
:::
## Tutorials
We provide hands-on tutorials about ManiSkill2. All the tutorials can be found [here](https://github.com/haosulab/ManiSkill2/blob/main/examples/tutorials).
- Getting Started: [Jupyter Notebook](https://github.com/haosulab/ManiSkill2/blob/main/examples/tutorials/1_quickstart.ipynb), [Colab](https://colab.research.google.com/github/haosulab/ManiSkill2/blob/main/examples/tutorials/1_quickstart.ipynb)
- Reinforcement Learning: [Jupyter Notebook](https://github.com/haosulab/ManiSkill2/blob/main/examples/tutorials/2_reinforcement_learning.ipynb), [Colab](https://colab.research.google.com/github/haosulab/ManiSkill2/blob/main/examples/tutorials/2_reinforcement_learning.ipynb)
- Imitation Learning: [Jupyter Notebook](https://github.com/haosulab/ManiSkill2/blob/main/examples/tutorials/3_imitation_learning.ipynb), [Colab](https://colab.research.google.com/github/haosulab/ManiSkill2/blob/main/examples/tutorials/3_imitation_learning.ipynb)
- Environment Customization: [Jupyter Notebook](https://github.com/haosulab/ManiSkill2/blob/main/examples/tutorials/customize_environments.ipynb), [Colab](https://colab.research.google.com/github/haosulab/ManiSkill2/blob/main/examples/tutorials/customize_environments.ipynb)
- Advanced Rendering (ray tracing, stereo depth sensor): [Jupyter Notebook](https://github.com/haosulab/ManiSkill2/blob/main/examples/tutorials/advanced_rendering.ipynb)
ManiSkill2 is based on SAPIEN. SAPIEN tutorials are [here](https://sapien.ucsd.edu/docs/latest/).
================================================
FILE: ManiSkill2/docs/source/index.rst
================================================
.. ManiSkill2 documentation master file, created by
sphinx-quickstart on Fri Jan 6 18:07:26 2023.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to ManiSkill2's documentation!
=======================================
.. toctree::
:maxdepth: 1
:caption: Getting Started
getting_started/installation
getting_started/quickstart
getting_started/docker
.. toctree::
:maxdepth: 1
:caption: Concepts
concepts/environments
concepts/observation
concepts/controllers
concepts/demonstrations
.. toctree::
:maxdepth: 1
:caption: Benchmark
benchmark/submission
.. Indices and tables
.. ==================
.. * :ref:`genindex`
.. * :ref:`modindex`
.. * :ref:`search`
================================================
FILE: ManiSkill2/examples/profile_speed/README.md
================================================
```
CPU: Intel(R) Core(TM) i9-7960X CPU @ 2.80GHz
GPU: NVIDIA GeForce GTX 1080 Ti
```
```
python profile_sapien.py
Num steps: 10000
Simulation time: 0.8207485675811768 FPS: 12183.999333036842
Render time: 4.390702962875366 FPS: 2277.53962965676
```
To install DMControl, run `pip install dm-control==1.0.4`
```
python profile_dmcontrol.py
Num steps: 10000
Simulation time: 1.160520315170288 FPS: 8616.82459951824
Render time: 19.261722803115845 FPS: 519.1643604372899
```
================================================
FILE: ManiSkill2/examples/profile_speed/profile_dmcontrol.py
================================================
from dm_control import suite
import matplotlib.pyplot as plt
import numpy as np
import time
import PIL.Image as Image
import tqdm
num_steps = 10000
width = 84
height = 84
images = []
env = suite.load(domain_name="cartpole", task_name="swingup_sparse")
action_spec = env.action_spec()
time_step = env.reset()
sim_time, render_time = 0, 0
for i in range(num_steps):
start = time.time()
action = np.random.uniform(
action_spec.minimum, action_spec.maximum, size=action_spec.shape
)
sim_time += time.time() - start
start = time.time()
images.append(env.physics.render(height, width, camera_id=0))
render_time += time.time() - start
print("Num steps:", num_steps)
print("Simulation time:", sim_time, "FPS:", num_steps / sim_time)
print("Render time:", render_time, "FPS:", num_steps / render_time)
================================================
FILE: ManiSkill2/examples/profile_speed/profile_sapien.py
================================================
"""CartPole-Swingup."""
import numpy as np
from transforms3d.quaternions import axangle2quat
import gym
from gym.utils import seeding
from gym import spaces
import sapien.core as sapien
from sapien.core import Pose
from sapien.utils.viewer import Viewer
import PIL.Image as Image
from transforms3d.euler import euler2quat
import cv2
class TestSapienEnv(gym.Env):
"""Superclass for Sapien environments."""
def __init__(self, control_freq, timestep):
self.control_freq = control_freq # alias: frame_skip in mujoco_py
self.timestep = timestep
self._engine = sapien.Engine()
self._renderer = sapien.VulkanRenderer(offscreen_only=False)
self._engine.set_renderer(self._renderer)
self._scene = self._engine.create_scene()
self._scene.set_timestep(timestep)
self._scene.add_ground(-1.0)
self._build_world()
self.viewer = None
self.seed()
def _build_world(self):
raise NotImplementedError()
def _setup_viewer(self):
raise NotImplementedError()
# ---------------------------------------------------------------------------- #
# Override gym functions
# ---------------------------------------------------------------------------- #
def seed(self, seed=None):
self.np_random, seed = seeding.np_random(seed)
return [seed]
def close(self):
if self.viewer is not None:
self.viewer.close() # release viewer
def render(self, mode="human"):
if self.viewer is None:
self._setup_viewer()
if mode == "human":
self._scene.update_render()
self.viewer.render()
else:
raise NotImplementedError("Unsupported render mode {}.".format(mode))
# ---------------------------------------------------------------------------- #
# Utilities
# ---------------------------------------------------------------------------- #
def get_actor(self, name) -> sapien.ArticulationBase:
all_actors = self._scene.get_all_actors()
print(all_actors)
actor = [x for x in all_actors if x.name == name]
if len(actor) > 1:
raise RuntimeError(f"Not a unique name for actor: {name}")
elif len(actor) == 0:
raise RuntimeError(f"Actor not found: {name}")
return actor[0]
def get_articulation(self, name) -> sapien.ArticulationBase:
all_articulations = self._scene.get_all_articulations()
articulation = [x for x in all_articulations if x.name == name]
if len(articulation) > 1:
raise RuntimeError(f"Not a unique name for articulation: {name}")
elif len(articulation) == 0:
raise RuntimeError(f"Articulation not found: {name}")
return articulation[0]
@property
def dt(self):
return self.timestep * self.control_freq
def create_cartpole(scene: sapien.Scene) -> sapien.Articulation:
builder = scene.create_articulation_builder()
base = builder.create_link_builder()
base.set_name("base")
cart = builder.create_link_builder(base)
cart.set_name("cart")
cart.set_joint_name("cart_joint")
cart_half_size = np.array([0.04, 0.25, 0.125])
cart.add_box_collision(half_size=cart_half_size, density=100)
cart.add_box_visual(half_size=cart_half_size, color=[0.8, 0.6, 0.4])
cart.set_joint_properties(
"prismatic",
limits=[[-5, 5]],
pose_in_parent=sapien.Pose(
p=[0, 0, 0], q=axangle2quat([0, 0, 1], np.deg2rad(90))
),
pose_in_child=sapien.Pose(
p=[0, 0, 0], q=axangle2quat([0, 0, 1], np.deg2rad(90))
),
)
rod = builder.create_link_builder(cart)
rod.set_name("rod")
rod.set_joint_name("rod_joint")
rod_half_size = np.array([0.016, 0.016, 0.5])
rod.add_box_collision(half_size=rod_half_size, density=100)
rod.add_box_visual(half_size=rod_half_size, color=[0.8, 0.6, 0.4])
# The x-axis of the joint frame is the rotation axis of a revolute joint.
rod.set_joint_properties(
"revolute",
limits=[[-np.inf, np.inf]],
pose_in_parent=sapien.Pose(
p=[-(cart_half_size[0] + 1e-3), 0, (cart_half_size[2])],
q=[1, 0, 0, 0],
),
pose_in_child=sapien.Pose(
p=[rod_half_size[0] + 1e-3, 0.0, -rod_half_size[2]],
q=[1, 0, 0, 0],
),
)
cartpole = builder.build(fix_root_link=True)
cartpole.set_name("cartpole")
return cartpole
class CartPoleSwingUpEnv(TestSapienEnv):
def __init__(self):
super().__init__(control_freq=1, timestep=0.01)
self.cartpole = self.get_articulation("cartpole")
self.cart = self.cartpole.get_links()[1]
self.pole = self.cartpole.get_links()[2]
self.observation_space = spaces.Box(
low=-np.inf, high=np.inf, shape=[4], dtype=np.float32
)
self.action_space = spaces.Box(
low=-10.0, high=10.0, shape=[1], dtype=np.float32
)
self.theta_threshold = np.deg2rad(12)
self._setup_camera()
# ---------------------------------------------------------------------------- #
# Simulation world
# ---------------------------------------------------------------------------- #
def _build_world(self):
# frictionless
phy_mtl = self._scene.create_physical_material(0.0, 0.0, 0.0)
self._scene.default_physical_material = phy_mtl
create_cartpole(self._scene)
self._setup_lighting()
# ---------------------------------------------------------------------------- #
# RL
# ---------------------------------------------------------------------------- #
def step(self, action):
for _ in range(self.control_freq):
self.cartpole.set_qf([action[0], 0])
self._scene.step()
obs = self._get_obs()
x, theta = obs[0], obs[1]
reward = "__TODO17__"
if theta < -np.pi:
theta += np.pi * 2
if theta > np.pi:
theta -= np.pi * 2
success = -self.theta_threshold <= theta <= self.theta_threshold
done = False
return obs, reward, done, {"success": success}
def reset(self):
self.cartpole.set_qpos([0, np.pi])
self.cartpole.set_qvel([0, 0])
self._scene.step()
return self._get_obs()
def _get_obs(self):
qpos = self.cartpole.get_qpos()
qvel = self.cartpole.get_qvel()
return np.hstack([qpos, qvel])
# ---------------------------------------------------------------------------- #
# Visualization
# ---------------------------------------------------------------------------- #
def _setup_lighting(self):
self._scene.set_ambient_light([0.4, 0.4, 0.4])
self._scene.add_directional_light([0, 1, -1], [0.5, 0.5, 0.5], shadow=True)
self._scene.add_point_light([2, 2, 2], [1, 1, 1])
self._scene.add_point_light([2, -2, 2], [1, 1, 1])
self._scene.add_point_light([-2, 0, 2], [1, 1, 1])
def _setup_viewer(self):
self.viewer = Viewer(self._renderer)
self.viewer.set_scene(self._scene)
self.viewer.set_camera_xyz(-4, 0, 4)
self.viewer.set_camera_rpy(0, -0.7, 0)
self.viewer.window.set_camera_parameters(near=0.01, far=100, fovy=1)
self.viewer.focus_entity(self.cart)
def _setup_camera(self):
self.camera = self._scene.add_mounted_camera(
name="main_camera",
actor=self.cart,
pose=sapien.Pose([-3, 0, 0]),
width=84,
height=84,
fovy=1,
near=0.01,
far=100,
)
def render(self, mode="human"):
if mode == "human":
super().render()
self.camera.take_picture()
rgba = self.camera.get_float_texture("Color")
else:
self._scene.update_render()
self.camera.take_picture()
rgba = self.camera.get_float_texture("Color")
def main():
import time
env = CartPoleSwingUpEnv()
env.reset()
sim_time = 0.0
render_time = 0.0
num_steps = 10000
for step in range(num_steps):
# env.render(mode="human")
action = env.action_space.sample()
t = time.time()
obs, reward, done, info = env.step(action)
sim_time += time.time() - t
t = time.time()
env.render("rgbd")
render_time += time.time() - t
if done:
obs = env.reset()
print("Num steps:", num_steps)
print("Simulation time:", sim_time, "FPS:", num_steps / sim_time)
print("Render time:", render_time, "FPS:", num_steps / render_time)
env.close()
if __name__ == "__main__":
main()
================================================
FILE: ManiSkill2/examples/submission/Dockerfile
================================================
FROM haosulab/mani-skill2:latest
# Install additional python packages you need
RUN pip install torch==1.12.1
# Copy your codes (including user_solution.py) and model weights
COPY ${YOUR_CODES_AND_WEIGHTS} /root/
ENV PYTHONPATH ${YOUR_CODES_AND_WEIGHTS}:$PYTHONPATH
================================================
FILE: ManiSkill2/examples/submission/user_solution.py
================================================
from mani_skill2.evaluation.solution import BasePolicy
class UserPolicy(BasePolicy):
def act(self, observations):
return self.action_space.sample()
@classmethod
def get_obs_mode(cls, env_id: str) -> str:
return "rgbd"
@classmethod
def get_control_mode(cls, env_id: str) -> str:
return "pd_joint_delta_pos"
================================================
FILE: ManiSkill2/examples/tutorials/.gitignore
================================================
demos/
logs/
*.pt
================================================
FILE: ManiSkill2/examples/tutorials/1_quickstart.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "view-in-github"
},
"source": [
"<a href=\"https://colab.research.google.com/github/haosulab/ManiSkill2/blob/main/examples/tutorials/1_quickstart.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1T7S6wmryEub"
},
"source": [
"# Setup Code\n",
"\n",
"To begin, prepare the colab environment by clicking the play button below and make sure you are using a GPU runtime. This will install all dependencies for the future code. ManiSkill2 is as simple as `pip install mani_skill2` and is lightweight and fast to get started with."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "kYugcL-gfwfz"
},
"outputs": [],
"source": [
"# below fixes some bugs introduced by some recent Colab changes\n",
"!mkdir -p /usr/share/vulkan/icd.d\n",
"!wget -q https://raw.githubusercontent.com/haosulab/ManiSkill2/main/docker/nvidia_icd.json\n",
"!wget -q https://raw.githubusercontent.com/haosulab/ManiSkill2/main/docker/10_nvidia.json\n",
"!mv nvidia_icd.json /usr/share/vulkan/icd.d\n",
"!mv 10_nvidia.json /usr/share/glvnd/egl_vendor.d/10_nvidia.json\n",
"# dependencies\n",
"!pip install setuptools==65.5.0\n",
"!apt-get install -y --no-install-recommends libvulkan-dev\n",
"!git clone --depth 1 --branch v0.21.0 https://github.com/openai/gym.git\n",
"!pip install -e gym\n",
"!pip install mani_skill2\n",
"!pip install --upgrade --no-cache-dir gdown"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "nWP-k5bbvC5C"
},
"outputs": [],
"source": [
"try:\n",
" import google.colab\n",
" IN_COLAB = True\n",
"except:\n",
" IN_COLAB = False\n",
"\n",
"if IN_COLAB:\n",
" import site\n",
" site.main() # run this so local pip installs are recognized"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6ynzxqKAz5Y1"
},
"source": [
"# Tutorial on Maniskill2 Environments and Working with Demonstrations\n",
"\n",
"\n",
"[ManiSkill2](https://github.com/haosulab/ManiSkill2) is an open-source, large-scale robotics benchmark that seeks to benchmark generalizable manipulation skills and robot learning.\n",
"\n",
"The key features of ManiSkill2 are:\n",
"- Fast visual rendering (10x FPS compared to existing benchmarks, 1000FPS on a single GPU) with photorealistic capabilities\n",
"- 2000+ Objects and Expert Demonstrations Solving Every Environment\n",
"- 20+ Rigid and Soft-Body Tasks\n",
"\n",
"\n",
"This notebook goes over how to create and configure environments as well as work with our demonstration dataset. Our [ManiSkill2](https://github.com/haosulab/ManiSkill2) environments follow the `gym` api with various robotics related customizations and demonstration dataset that enable research into different areas such as robotics, computer vision, and reinforcement learning. The environments are built on top of the [Sapien](sapien.ucsd.edu/) simulation environment. \n",
"\n",
"For those interested in visual Reinforcement Learning and Imitation Learning workflows that leverage the fast visual simulation, we have provided a tutorial for each of those [here](https://github.com/haosulab/ManiSkill2/tree/main/examples/tutorials)\n",
"\n",
"This tutorial will work with the PickCube environment, a simple but also commonplace robotics task."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "ZEg8lojFuASm"
},
"outputs": [],
"source": [
"# Import required packages\n",
"import gym\n",
"from tqdm.notebook import tqdm\n",
"import numpy as np\n",
"import mani_skill2.envs\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mltLTy6X0MU6"
},
"source": [
"## 1 Create and configure environments\n",
"\n",
"We can create ManiSkill environments by specifying a environment id. Further, observations, actions, and rewards are configurable with just a few lines of code"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"cellView": "form",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 407
},
"id": "Dnjx2Csg0M6x",
"outputId": "8fcb6568-e047-4114-aa92-c7fef318f07b"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Action Space: Box([-1. -1. -1. -1. -1. -1. -1. -1.], [1. 1. 1. 1. 1. 1. 1. 1.], (8,), float32)\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#@title 1.1 Choose an environment, observation mode, control mode, and reward\n",
"#@markdown Run this cell to display the action space of the chosen controller as well as the current view of the environment. The main part of the view is our view of the environment. The two views on the right are the RGB and Depth images from a third-person camera and a hand-mounted camera\n",
"\n",
"# Can be any env_id from the list of Rigid-Body envs: https://haosulab.github.io/ManiSkill2/concepts/environments.html#rigid-body\n",
"# and Soft-Body envs: https://haosulab.github.io/ManiSkill2/concepts/environments.html#soft-body\n",
"\n",
"# This tutorial allows you to play with 4 environments out of a total of 20 environments that ManiSkill provides\n",
"env_id = \"PickCube-v0\" #@param ['PickCube-v0', 'PegInsertionSide-v0', 'StackCube-v0', 'PlugCharger-v0']\n",
"\n",
"# choose an observation type and space, see https://haosulab.github.io/ManiSkill2/concepts/observation.html for details\n",
"obs_mode = \"rgbd\" #@param can be one of ['pointcloud', 'rgbd', 'state_dict', 'state']\n",
"\n",
"# choose a controller type / action space, see https://haosulab.github.io/ManiSkill2/concepts/controllers.html for a full list\n",
"control_mode = \"pd_joint_delta_pos\" #@param can be one of ['pd_ee_delta_pose', 'pd_ee_delta_pos', 'pd_joint_delta_pos', 'arm_pd_joint_pos_vel']\n",
"\n",
"reward_mode = \"dense\" #@param can be one of ['sparse', 'dense']\n",
"\n",
"# create an environment with our configs and then reset to a clean state\n",
"env = gym.make(env_id, obs_mode=obs_mode, reward_mode=reward_mode, control_mode=control_mode)\n",
"obs = env.reset()\n",
"print(\"Action Space:\", env.action_space)\n",
"# take a look at the current state\n",
"img = env.render(mode=\"cameras\")\n",
"plt.figure(figsize=(10,6))\n",
"plt.title(\"Current State\")\n",
"plt.imshow(img)\n",
"env.close()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "E8kOD4uzBGRF"
},
"source": [
"Run below to further visualize RGBD and Pointcloud observations"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "EI34cmD3BCnp"
},
"outputs": [],
"source": [
"# some visualization functions for different observation modes\n",
"def show_camera_view(obs_camera, title):\n",
" plt.figure()\n",
" rgb, depth = obs_camera['rgb'], obs_camera['depth']\n",
" plt.subplot(1,2,1)\n",
" plt.title(f\"{title} - RGB\")\n",
" plt.imshow(rgb)\n",
" plt.subplot(1,2,2)\n",
" plt.title(f\"{title} - Depth\")\n",
" plt.imshow(depth[:,:, 0], cmap=\"gray\")\n",
" \n",
"def show_pointcloud(obs):\n",
" import trimesh\n",
" v = obs['pointcloud']['xyzw'][::,:3]\n",
" s= trimesh.Scene([trimesh.points.PointCloud(v, obs['pointcloud']['rgb'])])\n",
" return s.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 415
},
"id": "2yLNJzNOBikG",
"outputId": "65108a68-3b3c-46e4-e6f6-39ef0507c8e3"
},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
gitextract_y55nmmey/
├── .gitignore
├── ManiSkill2/
│ ├── CITATION.cff
│ ├── LICENSE
│ ├── README.md
│ ├── docker/
│ │ ├── 10_nvidia.json
│ │ ├── Dockerfile
│ │ ├── nvidia_icd.json
│ │ └── nvidia_layers.json
│ ├── docs/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── make.bat
│ │ └── source/
│ │ ├── benchmark/
│ │ │ └── submission.md
│ │ ├── concepts/
│ │ │ ├── controllers.md
│ │ │ ├── demonstrations.md
│ │ │ ├── environments.md
│ │ │ └── observation.md
│ │ ├── conf.py
│ │ ├── getting_started/
│ │ │ ├── docker.md
│ │ │ ├── installation.md
│ │ │ └── quickstart.md
│ │ └── index.rst
│ ├── examples/
│ │ ├── profile_speed/
│ │ │ ├── README.md
│ │ │ ├── profile_dmcontrol.py
│ │ │ └── profile_sapien.py
│ │ ├── submission/
│ │ │ ├── Dockerfile
│ │ │ └── user_solution.py
│ │ └── tutorials/
│ │ ├── .gitignore
│ │ ├── 1_quickstart.ipynb
│ │ ├── 2_reinforcement_learning.ipynb
│ │ ├── 3_imitation_learning.ipynb
│ │ ├── README.md
│ │ ├── advanced_rendering.ipynb
│ │ ├── customize_environments.ipynb
│ │ ├── imitation-learning/
│ │ │ ├── README.md
│ │ │ ├── bc_liftcube_rgbd.py
│ │ │ └── bc_liftcube_state.py
│ │ └── reinforcement-learning/
│ │ ├── README.md
│ │ ├── sb3_ppo_liftcube_rgbd.py
│ │ └── sb3_ppo_liftcube_state.py
│ ├── mani_skill2/
│ │ ├── __init__.py
│ │ ├── agents/
│ │ │ ├── __init__.py
│ │ │ ├── base_agent.py
│ │ │ ├── base_controller.py
│ │ │ ├── configs/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── mobile_panda/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── defaults.py
│ │ │ │ ├── panda/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── defaults.py
│ │ │ │ │ └── variants.py
│ │ │ │ └── xmate3/
│ │ │ │ ├── __init__.py
│ │ │ │ └── defaults.py
│ │ │ ├── controllers/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── passive_controller.py
│ │ │ │ ├── pd_base_vel.py
│ │ │ │ ├── pd_ee_pose.py
│ │ │ │ ├── pd_joint_pos.py
│ │ │ │ ├── pd_joint_pos_vel.py
│ │ │ │ └── pd_joint_vel.py
│ │ │ ├── robots/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── mobile_panda.py
│ │ │ │ ├── panda.py
│ │ │ │ └── xmate3.py
│ │ │ └── utils.py
│ │ ├── assets/
│ │ │ ├── .gitignore
│ │ │ ├── deformable_manipulation/
│ │ │ │ ├── beaker.glb
│ │ │ │ └── bottle.glb
│ │ │ ├── descriptions/
│ │ │ │ ├── bucket/
│ │ │ │ │ ├── bucket.stl
│ │ │ │ │ └── bucket_45.stl
│ │ │ │ ├── franka_description/
│ │ │ │ │ └── meshes/
│ │ │ │ │ ├── collision/
│ │ │ │ │ │ ├── finger.stl
│ │ │ │ │ │ ├── hand.stl
│ │ │ │ │ │ ├── link0.stl
│ │ │ │ │ │ ├── link1.stl
│ │ │ │ │ │ ├── link2.stl
│ │ │ │ │ │ ├── link3.stl
│ │ │ │ │ │ ├── link4.stl
│ │ │ │ │ │ ├── link5.stl
│ │ │ │ │ │ ├── link6.stl
│ │ │ │ │ │ └── link7.stl
│ │ │ │ │ └── visual/
│ │ │ │ │ ├── finger.dae
│ │ │ │ │ ├── hand.dae
│ │ │ │ │ ├── link0.dae
│ │ │ │ │ ├── link1.dae
│ │ │ │ │ ├── link2.dae
│ │ │ │ │ ├── link3.dae
│ │ │ │ │ ├── link4.dae
│ │ │ │ │ ├── link5.dae
│ │ │ │ │ ├── link6.dae
│ │ │ │ │ └── link7.dae
│ │ │ │ ├── mobile_panda_dual_arm.urdf
│ │ │ │ ├── mobile_panda_single_arm.urdf
│ │ │ │ ├── panda_bucket.srdf
│ │ │ │ ├── panda_bucket.urdf
│ │ │ │ ├── panda_pinch.srdf
│ │ │ │ ├── panda_pinch.urdf
│ │ │ │ ├── panda_stick.srdf
│ │ │ │ ├── panda_stick.urdf
│ │ │ │ ├── panda_v2.srdf
│ │ │ │ ├── panda_v2.urdf
│ │ │ │ ├── panda_v2_gripper.urdf
│ │ │ │ ├── panda_v3.srdf
│ │ │ │ ├── panda_v3.urdf
│ │ │ │ └── sciurus17_description/
│ │ │ │ └── meshes/
│ │ │ │ ├── collision/
│ │ │ │ │ ├── Base.stl
│ │ │ │ │ └── Body.stl
│ │ │ │ └── visual/
│ │ │ │ ├── Base.stl
│ │ │ │ └── Body.stl
│ │ │ ├── maniskill2-scene-2.glb
│ │ │ └── partnet_mobility/
│ │ │ ├── .gitignore
│ │ │ └── meta/
│ │ │ ├── info_bucket_train.json
│ │ │ ├── info_cabinet_door_train.json
│ │ │ ├── info_cabinet_drawer_train.json
│ │ │ ├── info_chair_train.json
│ │ │ └── info_faucet_train.json
│ │ ├── envs/
│ │ │ ├── __init__.py
│ │ │ ├── assembly/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── assembling_kits.py
│ │ │ │ ├── base_env.py
│ │ │ │ ├── peg_insertion_side.py
│ │ │ │ └── plug_charger.py
│ │ │ ├── misc/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── avoid_obstacles.py
│ │ │ │ └── turn_faucet.py
│ │ │ ├── mpm/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── RopeInit.pkl
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base_env.py
│ │ │ │ ├── excavate_env.py
│ │ │ │ ├── fill_env.py
│ │ │ │ ├── hang_env.py
│ │ │ │ ├── perlin.py
│ │ │ │ ├── pinch_env.py
│ │ │ │ ├── pour_env.py
│ │ │ │ ├── shader/
│ │ │ │ │ ├── common/
│ │ │ │ │ │ ├── lights.glsl
│ │ │ │ │ │ ├── shadow.glsl
│ │ │ │ │ │ └── view.glsl
│ │ │ │ │ └── point/
│ │ │ │ │ ├── composite.vert
│ │ │ │ │ ├── composite0.frag
│ │ │ │ │ ├── composite1.frag
│ │ │ │ │ ├── composite2.frag
│ │ │ │ │ ├── deferred.frag
│ │ │ │ │ ├── deferred.vert
│ │ │ │ │ ├── gbuffer.frag
│ │ │ │ │ ├── gbuffer.vert
│ │ │ │ │ ├── gbuffer1.frag
│ │ │ │ │ ├── gbuffer1.vert
│ │ │ │ │ ├── gbuffer2.frag
│ │ │ │ │ ├── gbuffer2.vert
│ │ │ │ │ ├── line.frag
│ │ │ │ │ ├── line.vert
│ │ │ │ │ ├── point.frag
│ │ │ │ │ ├── point.vert
│ │ │ │ │ ├── shadow.vert
│ │ │ │ │ ├── shadow_point.frag
│ │ │ │ │ └── shadow_point.vert
│ │ │ │ ├── utils.py
│ │ │ │ └── write_env.py
│ │ │ ├── ms1/
│ │ │ │ ├── README.md
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base_env.py
│ │ │ │ ├── move_bucket.py
│ │ │ │ ├── open_cabinet_door_drawer.py
│ │ │ │ └── push_chair.py
│ │ │ ├── pick_and_place/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base_env.py
│ │ │ │ ├── pick_clutter.py
│ │ │ │ ├── pick_cube.py
│ │ │ │ ├── pick_single.py
│ │ │ │ └── stack_cube.py
│ │ │ └── sapien_env.py
│ │ ├── evaluation/
│ │ │ ├── __init__.py
│ │ │ ├── evaluator.py
│ │ │ ├── run_evaluation.py
│ │ │ └── solution.py
│ │ ├── examples/
│ │ │ ├── __init__.py
│ │ │ ├── demo_manual_control.py
│ │ │ ├── demo_random_action.py
│ │ │ └── demo_vec_env.py
│ │ ├── sensors/
│ │ │ ├── __init__.py
│ │ │ ├── camera.py
│ │ │ └── depth_camera.py
│ │ ├── trajectory/
│ │ │ ├── __init__.py
│ │ │ ├── merge_trajectory.py
│ │ │ └── replay_trajectory.py
│ │ ├── utils/
│ │ │ ├── __init__.py
│ │ │ ├── bounding_cylinder.py
│ │ │ ├── common.py
│ │ │ ├── download_asset.py
│ │ │ ├── download_demo.py
│ │ │ ├── geometry.py
│ │ │ ├── io_utils.py
│ │ │ ├── logging_utils.py
│ │ │ ├── precompile_mpm.py
│ │ │ ├── registration.py
│ │ │ ├── sapien_utils.py
│ │ │ ├── trimesh_utils.py
│ │ │ ├── visualization/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── cv2_utils.py
│ │ │ │ ├── jupyter_utils.py
│ │ │ │ └── misc.py
│ │ │ └── wrappers/
│ │ │ ├── __init__.py
│ │ │ ├── common.py
│ │ │ ├── observation.py
│ │ │ ├── record.py
│ │ │ └── sb3.py
│ │ └── vector/
│ │ ├── __init__.py
│ │ ├── registration.py
│ │ ├── vec_env.py
│ │ └── wrappers/
│ │ ├── __init__.py
│ │ ├── observation.py
│ │ └── sb3.py
│ ├── pyproject.toml
│ ├── pyrightconfig.json
│ ├── requirements.txt
│ ├── setup.py
│ ├── tests/
│ │ ├── manual_test_venv.py
│ │ └── test_envs.py
│ └── warp_maniskill/
│ ├── .gitattributes
│ ├── .gitignore
│ ├── CHANGELOG.md
│ ├── LICENSE.md
│ ├── README.md
│ ├── VERSION.md
│ ├── __init__.py
│ ├── build_docs.py
│ ├── build_exports.py
│ ├── build_lib.py
│ ├── licenses/
│ │ ├── appdirs-LICENSE.txt
│ │ ├── assets/
│ │ │ ├── ant-LICENSE.txt
│ │ │ └── humanoid-LICENSE.txt
│ │ ├── cuda-LICENSE.txt
│ │ ├── fp16-LICENSE.txt
│ │ ├── moller-LICENSE.txt
│ │ ├── nanovdb-LICENSE.txt
│ │ ├── nvrtc-LICENSE.txt
│ │ ├── python37-LICENSE.txt
│ │ ├── python38-LICENSE.txt
│ │ ├── python39-LICENSE.txt
│ │ ├── svd-LICENSE.txt
│ │ └── usd-LICENSE.txt
│ ├── mpm/
│ │ ├── __init__.py
│ │ ├── height_rasterizer.py
│ │ ├── mpm_integrator.py
│ │ ├── mpm_model.py
│ │ └── mpm_simulator.py
│ ├── pyproject.toml
│ ├── setup.py
│ └── warp/
│ ├── __init__.py
│ ├── __init__.pyi
│ ├── bin/
│ │ └── .gitignore
│ ├── build.py
│ ├── builtins.py
│ ├── codegen.py
│ ├── config.py
│ ├── context.py
│ ├── distance.py
│ ├── native/
│ │ ├── array.h
│ │ ├── builtin.h
│ │ ├── bvh.cpp
│ │ ├── bvh.cu
│ │ ├── bvh.h
│ │ ├── crt.h
│ │ ├── dense_volume.cpp
│ │ ├── dense_volume.cu
│ │ ├── dense_volume.h
│ │ ├── exports.h
│ │ ├── hashgrid.cpp
│ │ ├── hashgrid.cu
│ │ ├── hashgrid.h
│ │ ├── intersect.h
│ │ ├── intersect_adj.h
│ │ ├── intersect_tri.h
│ │ ├── marching.cpp
│ │ ├── marching.cu
│ │ ├── marching.h
│ │ ├── mat22.h
│ │ ├── mat33.h
│ │ ├── mat44.h
│ │ ├── matnn.h
│ │ ├── mesh.cpp
│ │ ├── mesh.cu
│ │ ├── mesh.h
│ │ ├── nanovdb/
│ │ │ └── PNanoVDB.h
│ │ ├── noise.h
│ │ ├── quat.h
│ │ ├── rand.h
│ │ ├── range.h
│ │ ├── sort.cpp
│ │ ├── sort.cu
│ │ ├── sort.h
│ │ ├── spatial.h
│ │ ├── svd.h
│ │ ├── vec2.h
│ │ ├── vec3.h
│ │ ├── vec4.h
│ │ ├── volume.cpp
│ │ ├── volume.h
│ │ ├── warp.cpp
│ │ ├── warp.cu
│ │ └── warp.h
│ ├── render.py
│ ├── sim/
│ │ ├── __init__.py
│ │ ├── articulation.py
│ │ ├── collide.py
│ │ ├── import_mjcf.py
│ │ ├── import_snu.py
│ │ ├── import_urdf.py
│ │ ├── integrator_euler.py
│ │ ├── integrator_xpbd.py
│ │ ├── model.py
│ │ ├── optimizer.py
│ │ ├── particles.py
│ │ └── render.py
│ ├── stubs.py
│ ├── tape.py
│ ├── tests/
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ ├── assets/
│ │ │ ├── curlnoise_golden.npy
│ │ │ ├── mlp_golden.npy
│ │ │ └── pnoise_golden.npy
│ │ ├── test_all.py
│ │ ├── test_array.py
│ │ ├── test_base.py
│ │ ├── test_closest_point_edge_edge.py
│ │ ├── test_codegen.py
│ │ ├── test_compile_consts.py
│ │ ├── test_compile_consts_dummy.py
│ │ ├── test_conditional.py
│ │ ├── test_ctypes.py
│ │ ├── test_dense.py
│ │ ├── test_fp16.py
│ │ ├── test_func.py
│ │ ├── test_grad.py
│ │ ├── test_hash_grid.py
│ │ ├── test_import.py
│ │ ├── test_intersect.py
│ │ ├── test_launch.py
│ │ ├── test_marching_cubes.py
│ │ ├── test_mesh_query_aabb.py
│ │ ├── test_mesh_query_point.py
│ │ ├── test_mesh_query_ray.py
│ │ ├── test_misc.py
│ │ ├── test_mlp.py
│ │ ├── test_noise.py
│ │ ├── test_operators.py
│ │ ├── test_print.py
│ │ ├── test_rand.py
│ │ ├── test_reload.py
│ │ ├── test_rounding.py
│ │ ├── test_struct.py
│ │ ├── test_svd.py
│ │ ├── test_tape.py
│ │ ├── test_torch.py
│ │ └── test_volume.py
│ ├── thirdparty/
│ │ ├── __init__.py
│ │ └── appdirs.py
│ ├── torch.py
│ ├── types.py
│ └── utils.py
├── Metaworld/
│ ├── CONTRIBUTING.md
│ ├── LICENSE
│ ├── MANIFEST.in
│ ├── Makefile
│ ├── README.md
│ ├── docker/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ └── entrypoint-headless.sh
│ ├── metaworld/
│ │ ├── __init__.py
│ │ ├── envs/
│ │ │ ├── __init__.py
│ │ │ ├── asset_path_utils.py
│ │ │ ├── assets_updated/
│ │ │ │ └── sawyer_xyz/
│ │ │ │ └── dm_control_pick_place.ipynb
│ │ │ ├── assets_v1/
│ │ │ │ ├── classic_mujoco/
│ │ │ │ │ └── half_cheetah.xml
│ │ │ │ ├── meshes/
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ └── mug.stl
│ │ │ │ │ └── sawyer/
│ │ │ │ │ ├── GUIDE_WSG50_110.stl
│ │ │ │ │ ├── WSG-FMF.stl
│ │ │ │ │ ├── WSG50_110.stl
│ │ │ │ │ ├── base.stl
│ │ │ │ │ ├── eGripperBase.stl
│ │ │ │ │ ├── head.stl
│ │ │ │ │ ├── l0.stl
│ │ │ │ │ ├── l1.stl
│ │ │ │ │ ├── l2.stl
│ │ │ │ │ ├── l3.stl
│ │ │ │ │ ├── l4.stl
│ │ │ │ │ ├── l5.stl
│ │ │ │ │ ├── l6.stl
│ │ │ │ │ ├── pedestal.stl
│ │ │ │ │ ├── sawyer_ft/
│ │ │ │ │ │ ├── PEDESTAL.DAE
│ │ │ │ │ │ ├── PEDESTAL.stl
│ │ │ │ │ │ ├── base.DAE
│ │ │ │ │ │ ├── base.stl
│ │ │ │ │ │ ├── head.DAE
│ │ │ │ │ │ ├── head.stl
│ │ │ │ │ │ ├── l0.DAE
│ │ │ │ │ │ ├── l0.stl
│ │ │ │ │ │ ├── l1.DAE
│ │ │ │ │ │ ├── l1.stl
│ │ │ │ │ │ ├── l2.DAE
│ │ │ │ │ │ ├── l2.stl
│ │ │ │ │ │ ├── l3.DAE
│ │ │ │ │ │ ├── l3.stl
│ │ │ │ │ │ ├── l4.DAE
│ │ │ │ │ │ ├── l4.stl
│ │ │ │ │ │ ├── l5.DAE
│ │ │ │ │ │ ├── l5.stl
│ │ │ │ │ │ ├── l6.DAE
│ │ │ │ │ │ └── l6.stl
│ │ │ │ │ ├── sawyer_mp1/
│ │ │ │ │ │ ├── l6.DAE
│ │ │ │ │ │ └── l6.stl
│ │ │ │ │ ├── sawyer_mp3/
│ │ │ │ │ │ ├── l0.DAE
│ │ │ │ │ │ ├── l0.stl
│ │ │ │ │ │ ├── l1.DAE
│ │ │ │ │ │ └── l1.stl
│ │ │ │ │ └── sawyer_pv/
│ │ │ │ │ ├── base.DAE
│ │ │ │ │ ├── base.stl
│ │ │ │ │ ├── head.DAE
│ │ │ │ │ ├── head.stl
│ │ │ │ │ ├── l0.DAE
│ │ │ │ │ ├── l0.stl
│ │ │ │ │ ├── l1.DAE
│ │ │ │ │ ├── l1.stl
│ │ │ │ │ ├── l2.DAE
│ │ │ │ │ ├── l2.stl
│ │ │ │ │ ├── l3.DAE
│ │ │ │ │ ├── l3.stl
│ │ │ │ │ ├── l4.DAE
│ │ │ │ │ ├── l4.stl
│ │ │ │ │ ├── l5.DAE
│ │ │ │ │ ├── l5.stl
│ │ │ │ │ ├── l6.DAE
│ │ │ │ │ ├── l6.stl
│ │ │ │ │ ├── pedestal.DAE
│ │ │ │ │ └── pedestal.stl
│ │ │ │ ├── multi_object_sawyer_xyz/
│ │ │ │ │ ├── door_config.xml
│ │ │ │ │ ├── door_hook_config.xml
│ │ │ │ │ ├── sawyer_2_push_puck.xml
│ │ │ │ │ ├── sawyer_door.xml
│ │ │ │ │ ├── sawyer_door_pull.xml
│ │ │ │ │ ├── sawyer_door_pull_30.xml
│ │ │ │ │ ├── sawyer_door_pull_60.xml
│ │ │ │ │ ├── sawyer_door_pull_hook.xml
│ │ │ │ │ ├── sawyer_door_pull_hook_30.xml
│ │ │ │ │ ├── sawyer_door_pull_hook_45.xml
│ │ │ │ │ ├── sawyer_grasp.xml
│ │ │ │ │ ├── sawyer_multiobj.xml
│ │ │ │ │ ├── sawyer_pick_and_place.xml
│ │ │ │ │ ├── sawyer_pick_and_place_hidden_arm.xml
│ │ │ │ │ ├── sawyer_push_puck.xml
│ │ │ │ │ ├── sawyer_push_two_puck.xml
│ │ │ │ │ ├── sawyer_reach.xml
│ │ │ │ │ ├── sawyer_reach_torque.xml
│ │ │ │ │ ├── sawyer_wsg_base.xml
│ │ │ │ │ ├── sawyer_xyz_base.xml
│ │ │ │ │ ├── sawyer_xyz_base_door_hook.xml
│ │ │ │ │ ├── sawyer_xyz_base_hidden_arm.xml
│ │ │ │ │ ├── sawyer_xyz_base_small_table.xml
│ │ │ │ │ ├── sawyer_xyz_bin_base.xml
│ │ │ │ │ ├── sawyer_xyz_bin_base_gripper.xml
│ │ │ │ │ └── shared_config.xml
│ │ │ │ ├── multiobject_models/
│ │ │ │ │ ├── Bowl/
│ │ │ │ │ │ ├── Bowl.off
│ │ │ │ │ │ ├── Bowl.stl
│ │ │ │ │ │ ├── Bowl.wrl
│ │ │ │ │ │ ├── Bowl_GM.stl
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_005.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_006.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_007.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_008.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_009.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_010.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_011.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_012.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_013.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_014.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_015.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_016.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_017.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_018.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_019.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_020.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_021.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_022.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_023.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_024.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_025.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_026.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_027.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_028.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_029.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_030.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_031.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_032.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_033.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_034.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet_035.stl
│ │ │ │ │ ├── ElephantBowl/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── ElephantBowl.off
│ │ │ │ │ │ ├── ElephantBowl.stl
│ │ │ │ │ │ ├── ElephantBowl.wrl
│ │ │ │ │ │ ├── ElephantBowl_GM.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ ├── Fork/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── Fork.off
│ │ │ │ │ │ ├── Fork.stl
│ │ │ │ │ │ ├── Fork.wrl
│ │ │ │ │ │ ├── Fork_GM.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_005.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_006.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet_007.stl
│ │ │ │ │ ├── GlassBowl/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── GlassBowl.off
│ │ │ │ │ │ ├── GlassBowl.stl
│ │ │ │ │ │ ├── GlassBowl.wrl
│ │ │ │ │ │ ├── GlassBowl_GM.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_005.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_006.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_007.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_008.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_009.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_010.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_011.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_012.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_013.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_014.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_015.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_016.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_017.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_018.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_019.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_020.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_021.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_022.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_023.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_024.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_025.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_026.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_027.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_028.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_029.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_030.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_031.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_032.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_033.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet_034.stl
│ │ │ │ │ ├── Knife/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── Knife.off
│ │ │ │ │ │ ├── Knife.stl
│ │ │ │ │ │ ├── Knife.wrl
│ │ │ │ │ │ ├── Knife_GM.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet.stl
│ │ │ │ │ ├── LotusBowl01/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── LotusBowl01.off
│ │ │ │ │ │ ├── LotusBowl01.stl
│ │ │ │ │ │ ├── LotusBowl01.wrl
│ │ │ │ │ │ ├── LotusBowl01_GM.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_005.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_006.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_007.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_008.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_009.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_010.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_011.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_012.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_013.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_014.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_015.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_016.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_017.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_018.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_019.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_020.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_021.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_022.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_023.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_024.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_025.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_026.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_027.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_028.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_029.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_030.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_031.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_032.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_033.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet_034.stl
│ │ │ │ │ ├── RuggedBowl/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── RuggedBowl.off
│ │ │ │ │ │ ├── RuggedBowl.stl
│ │ │ │ │ │ ├── RuggedBowl.wrl
│ │ │ │ │ │ ├── RuggedBowl_GM.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_005.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_006.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_007.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_008.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_009.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_010.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_011.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_012.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet_013.stl
│ │ │ │ │ ├── ServingBowl/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── ServingBowl.off
│ │ │ │ │ │ ├── ServingBowl.stl
│ │ │ │ │ │ ├── ServingBowl.wrl
│ │ │ │ │ │ ├── ServingBowl_GM.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_005.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_006.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_007.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_008.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_009.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_010.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_011.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_012.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_013.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_014.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_015.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_016.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_017.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_018.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_019.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_020.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_021.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_022.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_023.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_024.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_025.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_026.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_027.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_028.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_029.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_030.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_031.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_032.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_033.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_034.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_035.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_036.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_037.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_038.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_039.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_040.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_041.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_042.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_043.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_044.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_045.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_046.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_047.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_048.stl
│ │ │ │ │ │ └── Shape_IndexedFaceSet_049.stl
│ │ │ │ │ ├── Spoon/
│ │ │ │ │ │ ├── Camera.stl
│ │ │ │ │ │ ├── Lamp.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_001.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_002.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_003.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_004.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_005.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_006.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_007.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_008.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_009.stl
│ │ │ │ │ │ ├── Shape_IndexedFaceSet_010.stl
│ │ │ │ │ │ ├── Spoon.off
│ │ │ │ │ │ ├── Spoon.stl
│ │ │ │ │ │ ├── Spoon.wrl
│ │ │ │ │ │ └── Spoon_GM.stl
│ │ │ │ │ ├── cartgripper.xml
│ │ │ │ │ ├── cartgripper_getflows.xml
│ │ │ │ │ ├── cartgripper_grasp.xml
│ │ │ │ │ ├── cartgripper_noautogen.xml
│ │ │ │ │ ├── cartgripper_updown.xml
│ │ │ │ │ ├── cartgripper_updown_2cam.xml
│ │ │ │ │ ├── cartgripper_updown_2cam_noautogen.xml
│ │ │ │ │ ├── cartgripper_updown_rot.xml
│ │ │ │ │ ├── cartgripper_updown_whitefingers.xml
│ │ │ │ │ ├── generate_touch_sensors.py
│ │ │ │ │ ├── pushing2d.xml
│ │ │ │ │ ├── pushing2d_controller.xml
│ │ │ │ │ ├── pushing2d_controller_nomarkers.xml
│ │ │ │ │ ├── pushing2d_controller_touchsensor.xml
│ │ │ │ │ ├── pushing2d_controller_touchsensor_nomarkers.xml
│ │ │ │ │ ├── pushing2d_touch.xml
│ │ │ │ │ ├── sawyer_assets/
│ │ │ │ │ │ ├── meshes/
│ │ │ │ │ │ │ └── sawyer/
│ │ │ │ │ │ │ ├── GUIDE_WSG50_110.stl
│ │ │ │ │ │ │ ├── WSG-FMF.stl
│ │ │ │ │ │ │ ├── WSG50_110.stl
│ │ │ │ │ │ │ ├── base.stl
│ │ │ │ │ │ │ ├── head.stl
│ │ │ │ │ │ │ ├── l0.stl
│ │ │ │ │ │ │ ├── l1.stl
│ │ │ │ │ │ │ ├── l2.stl
│ │ │ │ │ │ │ ├── l3.stl
│ │ │ │ │ │ │ ├── l4.stl
│ │ │ │ │ │ │ ├── l5.stl
│ │ │ │ │ │ │ ├── l6.stl
│ │ │ │ │ │ │ ├── pedestal.stl
│ │ │ │ │ │ │ ├── sawyer_ft/
│ │ │ │ │ │ │ │ ├── PEDESTAL.DAE
│ │ │ │ │ │ │ │ ├── PEDESTAL.stl
│ │ │ │ │ │ │ │ ├── base.DAE
│ │ │ │ │ │ │ │ ├── base.stl
│ │ │ │ │ │ │ │ ├── head.DAE
│ │ │ │ │ │ │ │ ├── head.stl
│ │ │ │ │ │ │ │ ├── l0.DAE
│ │ │ │ │ │ │ │ ├── l0.stl
│ │ │ │ │ │ │ │ ├── l1.DAE
│ │ │ │ │ │ │ │ ├── l1.stl
│ │ │ │ │ │ │ │ ├── l2.DAE
│ │ │ │ │ │ │ │ ├── l2.stl
│ │ │ │ │ │ │ │ ├── l3.DAE
│ │ │ │ │ │ │ │ ├── l3.stl
│ │ │ │ │ │ │ │ ├── l4.DAE
│ │ │ │ │ │ │ │ ├── l4.stl
│ │ │ │ │ │ │ │ ├── l5.DAE
│ │ │ │ │ │ │ │ ├── l5.stl
│ │ │ │ │ │ │ │ ├── l6.DAE
│ │ │ │ │ │ │ │ └── l6.stl
│ │ │ │ │ │ │ ├── sawyer_mp1/
│ │ │ │ │ │ │ │ ├── l6.DAE
│ │ │ │ │ │ │ │ └── l6.stl
│ │ │ │ │ │ │ ├── sawyer_mp3/
│ │ │ │ │ │ │ │ ├── l0.DAE
│ │ │ │ │ │ │ │ ├── l0.stl
│ │ │ │ │ │ │ │ ├── l1.DAE
│ │ │ │ │ │ │ │ └── l1.stl
│ │ │ │ │ │ │ └── sawyer_pv/
│ │ │ │ │ │ │ ├── base.DAE
│ │ │ │ │ │ │ ├── base.stl
│ │ │ │ │ │ │ ├── head.DAE
│ │ │ │ │ │ │ ├── head.stl
│ │ │ │ │ │ │ ├── l0.DAE
│ │ │ │ │ │ │ ├── l0.stl
│ │ │ │ │ │ │ ├── l1.DAE
│ │ │ │ │ │ │ ├── l1.stl
│ │ │ │ │ │ │ ├── l2.DAE
│ │ │ │ │ │ │ ├── l2.stl
│ │ │ │ │ │ │ ├── l3.DAE
│ │ │ │ │ │ │ ├── l3.stl
│ │ │ │ │ │ │ ├── l4.DAE
│ │ │ │ │ │ │ ├── l4.stl
│ │ │ │ │ │ │ ├── l5.DAE
│ │ │ │ │ │ │ ├── l5.stl
│ │ │ │ │ │ │ ├── l6.DAE
│ │ │ │ │ │ │ ├── l6.stl
│ │ │ │ │ │ │ ├── pedestal.DAE
│ │ │ │ │ │ │ └── pedestal.stl
│ │ │ │ │ │ └── sawyer_xyz/
│ │ │ │ │ │ ├── sawyer_grasp.xml
│ │ │ │ │ │ ├── sawyer_wsg_base.xml
│ │ │ │ │ │ └── shared_config.xml
│ │ │ │ │ └── touchsensor.xml
│ │ │ │ └── sawyer_xyz/
│ │ │ │ ├── door_config.xml
│ │ │ │ ├── sawyer_assembly_peg.xml
│ │ │ │ ├── sawyer_assembly_peg_horizontal.xml
│ │ │ │ ├── sawyer_basketball.xml
│ │ │ │ ├── sawyer_bin_picking.xml
│ │ │ │ ├── sawyer_box.xml
│ │ │ │ ├── sawyer_button_press.xml
│ │ │ │ ├── sawyer_button_press_topdown.xml
│ │ │ │ ├── sawyer_button_press_topdown_wall.xml
│ │ │ │ ├── sawyer_button_press_wall.xml
│ │ │ │ ├── sawyer_coffee.xml
│ │ │ │ ├── sawyer_dial.xml
│ │ │ │ ├── sawyer_door_lock.xml
│ │ │ │ ├── sawyer_door_pull.xml
│ │ │ │ ├── sawyer_drawer.xml
│ │ │ │ ├── sawyer_faucet.xml
│ │ │ │ ├── sawyer_hammer.xml
│ │ │ │ ├── sawyer_handle_press.xml
│ │ │ │ ├── sawyer_handle_press_sideway.xml
│ │ │ │ ├── sawyer_handle_press_sideway_v2.xml
│ │ │ │ ├── sawyer_laptop.xml
│ │ │ │ ├── sawyer_lever_pull.xml
│ │ │ │ ├── sawyer_peg_insertion_side.xml
│ │ │ │ ├── sawyer_peg_unplug_side.xml
│ │ │ │ ├── sawyer_pick_and_place.xml
│ │ │ │ ├── sawyer_pick_out_of_hole.xml
│ │ │ │ ├── sawyer_pick_place_v2.xml
│ │ │ │ ├── sawyer_pick_place_wall_v2.xml
│ │ │ │ ├── sawyer_plate_slide.xml
│ │ │ │ ├── sawyer_plate_slide_sideway.xml
│ │ │ │ ├── sawyer_push_and_reach_mocap_goal_hidden.xml
│ │ │ │ ├── sawyer_push_back.xml
│ │ │ │ ├── sawyer_push_v2.xml
│ │ │ │ ├── sawyer_push_wall_v2.xml
│ │ │ │ ├── sawyer_pusher_no_table.xml
│ │ │ │ ├── sawyer_pusher_small_table.xml
│ │ │ │ ├── sawyer_reach_push_pick_and_place.xml
│ │ │ │ ├── sawyer_reach_push_pick_and_place_wall.xml
│ │ │ │ ├── sawyer_reach_v2.xml
│ │ │ │ ├── sawyer_reach_wall_v2.xml
│ │ │ │ ├── sawyer_shelf_placing.xml
│ │ │ │ ├── sawyer_shelf_removing.xml
│ │ │ │ ├── sawyer_soccer.xml
│ │ │ │ ├── sawyer_stick_obj.xml
│ │ │ │ ├── sawyer_sweep.xml
│ │ │ │ ├── sawyer_sweep_tool.xml
│ │ │ │ ├── sawyer_table_with_hole.xml
│ │ │ │ ├── sawyer_table_with_hole_no_puck.xml
│ │ │ │ ├── sawyer_window.xml
│ │ │ │ ├── sawyer_window_horizontal.xml
│ │ │ │ ├── sawyer_xyz_base.xml
│ │ │ │ ├── sawyer_xyz_base_no_table.xml
│ │ │ │ ├── shared_config.xml
│ │ │ │ └── visual_config.xml
│ │ │ ├── assets_v2/
│ │ │ │ ├── objects/
│ │ │ │ │ ├── assembly_peg.xml
│ │ │ │ │ ├── assets/
│ │ │ │ │ │ ├── assembly_peg.xml
│ │ │ │ │ │ ├── assembly_peg_dependencies.xml
│ │ │ │ │ │ ├── basketball.xml
│ │ │ │ │ │ ├── basketball_dependencies.xml
│ │ │ │ │ │ ├── basketballhoop.xml
│ │ │ │ │ │ ├── binA.xml
│ │ │ │ │ │ ├── binB.xml
│ │ │ │ │ │ ├── bin_dependencies.xml
│ │ │ │ │ │ ├── block.xml
│ │ │ │ │ │ ├── block_cyl.xml
│ │ │ │ │ │ ├── block_dependencies.xml
│ │ │ │ │ │ ├── box.xml
│ │ │ │ │ │ ├── box_dependencies.xml
│ │ │ │ │ │ ├── boxtop.xml
│ │ │ │ │ │ ├── buttonbox.xml
│ │ │ │ │ │ ├── buttonbox_dependencies.xml
│ │ │ │ │ │ ├── club.xml
│ │ │ │ │ │ ├── club_dependencies.xml
│ │ │ │ │ │ ├── coffeemachine.xml
│ │ │ │ │ │ ├── coffeemachine_dependencies.xml
│ │ │ │ │ │ ├── dial.xml
│ │ │ │ │ │ ├── dial_dependencies.xml
│ │ │ │ │ │ ├── doorlockA.xml
│ │ │ │ │ │ ├── doorlockB.xml
│ │ │ │ │ │ ├── doorlock_dependencies.xml
│ │ │ │ │ │ ├── drawer.xml
│ │ │ │ │ │ ├── drawer_dependencies.xml
│ │ │ │ │ │ ├── faucet.xml
│ │ │ │ │ │ ├── faucet_dependencies.xml
│ │ │ │ │ │ ├── hammer.xml
│ │ │ │ │ │ ├── hammer_dependencies.xml
│ │ │ │ │ │ ├── hammerblock.xml
│ │ │ │ │ │ ├── handle_press.xml
│ │ │ │ │ │ ├── handle_press_dependencies.xml
│ │ │ │ │ │ ├── laptop.xml
│ │ │ │ │ │ ├── laptop_dependencies.xml
│ │ │ │ │ │ ├── lever.xml
│ │ │ │ │ │ ├── lever_dependencies.xml
│ │ │ │ │ │ ├── mug.xml
│ │ │ │ │ │ ├── objA.xml
│ │ │ │ │ │ ├── peg_block.xml
│ │ │ │ │ │ ├── peg_block_dependencies.xml
│ │ │ │ │ │ ├── peg_insert.xml
│ │ │ │ │ │ ├── peg_insert_dependencies.xml
│ │ │ │ │ │ ├── plug.xml
│ │ │ │ │ │ ├── plug_dependencies.xml
│ │ │ │ │ │ ├── plug_wall.xml
│ │ │ │ │ │ ├── plug_wall_dependencies.xml
│ │ │ │ │ │ ├── puck.xml
│ │ │ │ │ │ ├── puck_goal.xml
│ │ │ │ │ │ ├── puck_goal_dependencies.xml
│ │ │ │ │ │ ├── shelf.xml
│ │ │ │ │ │ ├── shelf_dependencies.xml
│ │ │ │ │ │ ├── shelfb.xml
│ │ │ │ │ │ ├── shelfb_dependencies.xml
│ │ │ │ │ │ ├── soccer_ball.xml
│ │ │ │ │ │ ├── soccer_dependencies.xml
│ │ │ │ │ │ ├── soccer_goal.xml
│ │ │ │ │ │ ├── stick.xml
│ │ │ │ │ │ ├── stick_dependencies.xml
│ │ │ │ │ │ ├── table.xml
│ │ │ │ │ │ ├── table_dependencies.xml
│ │ │ │ │ │ ├── table_hole.xml
│ │ │ │ │ │ ├── thermos.xml
│ │ │ │ │ │ ├── thermos_dependencies.xml
│ │ │ │ │ │ ├── wall.xml
│ │ │ │ │ │ ├── wall_dependencies.xml
│ │ │ │ │ │ ├── window.xml
│ │ │ │ │ │ ├── window_dependencies.xml
│ │ │ │ │ │ ├── window_horiz.xml
│ │ │ │ │ │ ├── xyz_base.xml
│ │ │ │ │ │ └── xyz_base_dependencies.xml
│ │ │ │ │ ├── basketball.xml
│ │ │ │ │ ├── basketballhoop.xml
│ │ │ │ │ ├── binA.xml
│ │ │ │ │ ├── binB.xml
│ │ │ │ │ ├── block.xml
│ │ │ │ │ ├── block_cyl.xml
│ │ │ │ │ ├── box.xml
│ │ │ │ │ ├── buttonbox.xml
│ │ │ │ │ ├── club.xml
│ │ │ │ │ ├── coffeemachine.xml
│ │ │ │ │ ├── dial.xml
│ │ │ │ │ ├── doorlockA.xml
│ │ │ │ │ ├── doorlockB.xml
│ │ │ │ │ ├── drawer.xml
│ │ │ │ │ ├── faucet.xml
│ │ │ │ │ ├── hammer.xml
│ │ │ │ │ ├── hammerblock.xml
│ │ │ │ │ ├── handle_press.xml
│ │ │ │ │ ├── laptop.xml
│ │ │ │ │ ├── lever.xml
│ │ │ │ │ ├── meshes/
│ │ │ │ │ │ ├── assembly_peg/
│ │ │ │ │ │ │ ├── assembly_peg_handle.stl
│ │ │ │ │ │ │ ├── assembly_peg_ring.stl
│ │ │ │ │ │ │ └── assembly_peg_rod.stl
│ │ │ │ │ │ ├── basketball/
│ │ │ │ │ │ │ ├── backboard.stl
│ │ │ │ │ │ │ ├── backboardsquareinner.stl
│ │ │ │ │ │ │ ├── backboardsquareouter.stl
│ │ │ │ │ │ │ ├── basketballinner.stl
│ │ │ │ │ │ │ ├── basketballouter.stl
│ │ │ │ │ │ │ ├── hoop.stl
│ │ │ │ │ │ │ └── pole.stl
│ │ │ │ │ │ ├── bin/
│ │ │ │ │ │ │ └── bin.stl
│ │ │ │ │ │ ├── block/
│ │ │ │ │ │ │ └── block.stl
│ │ │ │ │ │ ├── box/
│ │ │ │ │ │ │ ├── boxhandle.stl
│ │ │ │ │ │ │ └── boxtop.stl
│ │ │ │ │ │ ├── buttonbox/
│ │ │ │ │ │ │ ├── button.stl
│ │ │ │ │ │ │ ├── buttonring.stl
│ │ │ │ │ │ │ ├── stopbot.stl
│ │ │ │ │ │ │ ├── stopbutton.stl
│ │ │ │ │ │ │ ├── stopbuttonrim.stl
│ │ │ │ │ │ │ ├── stopbuttonrod.stl
│ │ │ │ │ │ │ └── stoptop.stl
│ │ │ │ │ │ ├── coffeemachine/
│ │ │ │ │ │ │ ├── body1.stl
│ │ │ │ │ │ │ ├── body2.stl
│ │ │ │ │ │ │ ├── bodypiece1.stl
│ │ │ │ │ │ │ ├── bodypiece2.stl
│ │ │ │ │ │ │ ├── bodypiece3.stl
│ │ │ │ │ │ │ ├── button.stl
│ │ │ │ │ │ │ ├── buttonring.stl
│ │ │ │ │ │ │ ├── cup.stl
│ │ │ │ │ │ │ ├── handle.stl
│ │ │ │ │ │ │ ├── mug.stl
│ │ │ │ │ │ │ ├── spout.stl
│ │ │ │ │ │ │ └── spoutconnect.stl
│ │ │ │ │ │ ├── dial/
│ │ │ │ │ │ │ ├── dial.stl
│ │ │ │ │ │ │ └── dialhead.stl
│ │ │ │ │ │ ├── doorlock/
│ │ │ │ │ │ │ ├── door.stl
│ │ │ │ │ │ │ ├── door_handle.stl
│ │ │ │ │ │ │ ├── handle.stl
│ │ │ │ │ │ │ ├── handle_base.stl
│ │ │ │ │ │ │ ├── lock.stl
│ │ │ │ │ │ │ ├── lock_base.stl
│ │ │ │ │ │ │ └── safe.stl
│ │ │ │ │ │ ├── drawer/
│ │ │ │ │ │ │ ├── drawer.stl
│ │ │ │ │ │ │ ├── drawercase.stl
│ │ │ │ │ │ │ └── drawerhandle.stl
│ │ │ │ │ │ ├── faucet/
│ │ │ │ │ │ │ ├── faucetbase.stl
│ │ │ │ │ │ │ ├── faucethandle1.stl
│ │ │ │ │ │ │ └── faucethead.stl
│ │ │ │ │ │ ├── golf_club/
│ │ │ │ │ │ │ ├── club_handle.stl
│ │ │ │ │ │ │ ├── club_head.stl
│ │ │ │ │ │ │ └── club_tape.stl
│ │ │ │ │ │ ├── hammer/
│ │ │ │ │ │ │ ├── hammerblock.stl
│ │ │ │ │ │ │ ├── hammerhandle.stl
│ │ │ │ │ │ │ ├── hammerhead.stl
│ │ │ │ │ │ │ └── nail.stl
│ │ │ │ │ │ ├── handle_press/
│ │ │ │ │ │ │ ├── handle_press_base.stl
│ │ │ │ │ │ │ ├── handle_press_col1.stl
│ │ │ │ │ │ │ ├── handle_press_col2.stl
│ │ │ │ │ │ │ ├── handle_press_col3.stl
│ │ │ │ │ │ │ ├── handle_press_grip.stl
│ │ │ │ │ │ │ ├── handle_press_lever.stl
│ │ │ │ │ │ │ └── handle_press_trim.stl
│ │ │ │ │ │ ├── laptop/
│ │ │ │ │ │ │ ├── laptop_base.stl
│ │ │ │ │ │ │ ├── laptop_hinge.stl
│ │ │ │ │ │ │ ├── laptop_keys.stl
│ │ │ │ │ │ │ ├── laptop_screen.stl
│ │ │ │ │ │ │ └── laptop_top.stl
│ │ │ │ │ │ ├── lever/
│ │ │ │ │ │ │ ├── lever_axis.stl
│ │ │ │ │ │ │ ├── lever_base.stl
│ │ │ │ │ │ │ ├── lever_handle.stl
│ │ │ │ │ │ │ ├── lever_rod.stl
│ │ │ │ │ │ │ └── lever_rodbase.stl
│ │ │ │ │ │ ├── peg_block/
│ │ │ │ │ │ │ ├── block_inner.stl
│ │ │ │ │ │ │ └── block_outer.stl
│ │ │ │ │ │ ├── plug/
│ │ │ │ │ │ │ ├── plug.stl
│ │ │ │ │ │ │ ├── plug_head.stl
│ │ │ │ │ │ │ ├── plug_plastic.stl
│ │ │ │ │ │ │ └── plug_wall.stl
│ │ │ │ │ │ ├── puck/
│ │ │ │ │ │ │ ├── goal_net.stl
│ │ │ │ │ │ │ ├── goal_rim.stl
│ │ │ │ │ │ │ ├── net1_col.stl
│ │ │ │ │ │ │ ├── net2_col.stl
│ │ │ │ │ │ │ ├── net3_col.stl
│ │ │ │ │ │ │ ├── net4_col.stl
│ │ │ │ │ │ │ └── puck.stl
│ │ │ │ │ │ ├── shelf/
│ │ │ │ │ │ │ ├── shelf.stl
│ │ │ │ │ │ │ └── shelf_supports.stl
│ │ │ │ │ │ ├── shelfb/
│ │ │ │ │ │ │ ├── shelf_0.stl
│ │ │ │ │ │ │ ├── shelf_1.stl
│ │ │ │ │ │ │ └── shelf_frame.stl
│ │ │ │ │ │ ├── soccer/
│ │ │ │ │ │ │ ├── goal_col1.stl
│ │ │ │ │ │ │ ├── goal_col2.stl
│ │ │ │ │ │ │ ├── goal_col3.stl
│ │ │ │ │ │ │ ├── goal_col4.stl
│ │ │ │ │ │ │ ├── soccer_black.stl
│ │ │ │ │ │ │ ├── soccer_frame.stl
│ │ │ │ │ │ │ ├── soccer_net.stl
│ │ │ │ │ │ │ └── soccer_white.stl
│ │ │ │ │ │ ├── stick/
│ │ │ │ │ │ │ └── stick.stl
│ │ │ │ │ │ ├── table/
│ │ │ │ │ │ │ ├── table_hole.stl
│ │ │ │ │ │ │ ├── table_hole2.stl
│ │ │ │ │ │ │ ├── tablebody.stl
│ │ │ │ │ │ │ └── tabletop.stl
│ │ │ │ │ │ ├── thermos/
│ │ │ │ │ │ │ ├── therm_base.stl
│ │ │ │ │ │ │ ├── therm_body.stl
│ │ │ │ │ │ │ ├── therm_cap.stl
│ │ │ │ │ │ │ ├── therm_handle.stl
│ │ │ │ │ │ │ └── therm_trim.stl
│ │ │ │ │ │ ├── window/
│ │ │ │ │ │ │ ├── window_base.stl
│ │ │ │ │ │ │ ├── window_frame.stl
│ │ │ │ │ │ │ ├── window_h_base.stl
│ │ │ │ │ │ │ ├── window_h_frame.stl
│ │ │ │ │ │ │ ├── windowa_frame.stl
│ │ │ │ │ │ │ ├── windowa_glass.stl
│ │ │ │ │ │ │ ├── windowa_h_frame.stl
│ │ │ │ │ │ │ ├── windowa_h_glass.stl
│ │ │ │ │ │ │ ├── windowb_frame.stl
│ │ │ │ │ │ │ ├── windowb_glass.stl
│ │ │ │ │ │ │ ├── windowb_h_frame.stl
│ │ │ │ │ │ │ └── windowb_h_glass.stl
│ │ │ │ │ │ └── xyz_base/
│ │ │ │ │ │ ├── base.stl
│ │ │ │ │ │ ├── eGripperBase.stl
│ │ │ │ │ │ ├── head.stl
│ │ │ │ │ │ ├── l0.stl
│ │ │ │ │ │ ├── l1.stl
│ │ │ │ │ │ ├── l2.stl
│ │ │ │ │ │ ├── l3.stl
│ │ │ │ │ │ ├── l4.stl
│ │ │ │ │ │ ├── l5.stl
│ │ │ │ │ │ ├── l6.stl
│ │ │ │ │ │ └── pedestal.stl
│ │ │ │ │ ├── mug.xml
│ │ │ │ │ ├── objA.xml
│ │ │ │ │ ├── peg_block.xml
│ │ │ │ │ ├── peg_insert.xml
│ │ │ │ │ ├── plug.xml
│ │ │ │ │ ├── plug_wall.xml
│ │ │ │ │ ├── puck.xml
│ │ │ │ │ ├── puck_goal.xml
│ │ │ │ │ ├── shelf.xml
│ │ │ │ │ ├── shelfb.xml
│ │ │ │ │ ├── soccer_ball.xml
│ │ │ │ │ ├── soccer_goal.xml
│ │ │ │ │ ├── sphere.xml
│ │ │ │ │ ├── stick.xml
│ │ │ │ │ ├── table.xml
│ │ │ │ │ ├── table_hole.xml
│ │ │ │ │ ├── thermos.xml
│ │ │ │ │ ├── wall.xml
│ │ │ │ │ ├── window.xml
│ │ │ │ │ ├── window_horiz.xml
│ │ │ │ │ └── xyz_base.xml
│ │ │ │ ├── sawyer_xyz/
│ │ │ │ │ ├── sawyer_assembly_peg.xml
│ │ │ │ │ ├── sawyer_basketball.xml
│ │ │ │ │ ├── sawyer_bin_picking.xml
│ │ │ │ │ ├── sawyer_box.xml
│ │ │ │ │ ├── sawyer_button_press.xml
│ │ │ │ │ ├── sawyer_button_press_topdown.xml
│ │ │ │ │ ├── sawyer_button_press_topdown_wall.xml
│ │ │ │ │ ├── sawyer_button_press_wall.xml
│ │ │ │ │ ├── sawyer_coffee.xml
│ │ │ │ │ ├── sawyer_dial.xml
│ │ │ │ │ ├── sawyer_door_lock.xml
│ │ │ │ │ ├── sawyer_door_pull.xml
│ │ │ │ │ ├── sawyer_drawer.xml
│ │ │ │ │ ├── sawyer_faucet.xml
│ │ │ │ │ ├── sawyer_hammer.xml
│ │ │ │ │ ├── sawyer_handle_press.xml
│ │ │ │ │ ├── sawyer_handle_press_sideways.xml
│ │ │ │ │ ├── sawyer_laptop.xml
│ │ │ │ │ ├── sawyer_lever_pull.xml
│ │ │ │ │ ├── sawyer_peg_insertion_side.xml
│ │ │ │ │ ├── sawyer_peg_unplug_side.xml
│ │ │ │ │ ├── sawyer_pick_and_place.xml
│ │ │ │ │ ├── sawyer_pick_out_of_hole.xml
│ │ │ │ │ ├── sawyer_pick_place_v2.xml
│ │ │ │ │ ├── sawyer_pick_place_wall_v2.xml
│ │ │ │ │ ├── sawyer_plate_slide.xml
│ │ │ │ │ ├── sawyer_plate_slide_sideway.xml
│ │ │ │ │ ├── sawyer_push_back_v2.xml
│ │ │ │ │ ├── sawyer_push_v2.xml
│ │ │ │ │ ├── sawyer_push_wall_v2.xml
│ │ │ │ │ ├── sawyer_reach_push_pick_and_place.xml
│ │ │ │ │ ├── sawyer_reach_push_pick_and_place_wall.xml
│ │ │ │ │ ├── sawyer_reach_v2.xml
│ │ │ │ │ ├── sawyer_reach_wall_v2.xml
│ │ │ │ │ ├── sawyer_shelf_placing.xml
│ │ │ │ │ ├── sawyer_shelf_removing.xml
│ │ │ │ │ ├── sawyer_soccer.xml
│ │ │ │ │ ├── sawyer_stick_obj.xml
│ │ │ │ │ ├── sawyer_sweep_tool.xml
│ │ │ │ │ ├── sawyer_sweep_v2.xml
│ │ │ │ │ ├── sawyer_table_with_hole.xml
│ │ │ │ │ ├── sawyer_table_with_hole_no_puck.xml
│ │ │ │ │ ├── sawyer_window.xml
│ │ │ │ │ └── sawyer_window_horizontal.xml
│ │ │ │ └── scene/
│ │ │ │ ├── basic_scene.xml
│ │ │ │ ├── basic_scene_b.xml
│ │ │ │ └── basic_scene_c.xml
│ │ │ ├── mujoco/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── env_dict.py
│ │ │ │ ├── mujoco_env.py
│ │ │ │ ├── sawyer_xyz/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── sawyer_xyz_env.py
│ │ │ │ │ ├── v1/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── sawyer_assembly_peg.py
│ │ │ │ │ │ ├── sawyer_basketball.py
│ │ │ │ │ │ ├── sawyer_bin_picking.py
│ │ │ │ │ │ ├── sawyer_box_close.py
│ │ │ │ │ │ ├── sawyer_button_press.py
│ │ │ │ │ │ ├── sawyer_button_press_topdown.py
│ │ │ │ │ │ ├── sawyer_button_press_topdown_wall.py
│ │ │ │ │ │ ├── sawyer_button_press_wall.py
│ │ │ │ │ │ ├── sawyer_coffee_button.py
│ │ │ │ │ │ ├── sawyer_coffee_pull.py
│ │ │ │ │ │ ├── sawyer_coffee_push.py
│ │ │ │ │ │ ├── sawyer_dial_turn.py
│ │ │ │ │ │ ├── sawyer_disassemble_peg.py
│ │ │ │ │ │ ├── sawyer_door.py
│ │ │ │ │ │ ├── sawyer_door_close.py
│ │ │ │ │ │ ├── sawyer_door_lock.py
│ │ │ │ │ │ ├── sawyer_door_unlock.py
│ │ │ │ │ │ ├── sawyer_drawer_close.py
│ │ │ │ │ │ ├── sawyer_drawer_open.py
│ │ │ │ │ │ ├── sawyer_faucet_close.py
│ │ │ │ │ │ ├── sawyer_faucet_open.py
│ │ │ │ │ │ ├── sawyer_hammer.py
│ │ │ │ │ │ ├── sawyer_hand_insert.py
│ │ │ │ │ │ ├── sawyer_handle_press.py
│ │ │ │ │ │ ├── sawyer_handle_press_side.py
│ │ │ │ │ │ ├── sawyer_handle_pull.py
│ │ │ │ │ │ ├── sawyer_handle_pull_side.py
│ │ │ │ │ │ ├── sawyer_lever_pull.py
│ │ │ │ │ │ ├── sawyer_peg_insertion_side.py
│ │ │ │ │ │ ├── sawyer_peg_unplug_side.py
│ │ │ │ │ │ ├── sawyer_pick_out_of_hole.py
│ │ │ │ │ │ ├── sawyer_plate_slide.py
│ │ │ │ │ │ ├── sawyer_plate_slide_back.py
│ │ │ │ │ │ ├── sawyer_plate_slide_back_side.py
│ │ │ │ │ │ ├── sawyer_plate_slide_side.py
│ │ │ │ │ │ ├── sawyer_push_back.py
│ │ │ │ │ │ ├── sawyer_reach_push_pick_place.py
│ │ │ │ │ │ ├── sawyer_reach_push_pick_place_wall.py
│ │ │ │ │ │ ├── sawyer_shelf_place.py
│ │ │ │ │ │ ├── sawyer_soccer.py
│ │ │ │ │ │ ├── sawyer_stick_pull.py
│ │ │ │ │ │ ├── sawyer_stick_push.py
│ │ │ │ │ │ ├── sawyer_sweep.py
│ │ │ │ │ │ ├── sawyer_sweep_into_goal.py
│ │ │ │ │ │ ├── sawyer_window_close.py
│ │ │ │ │ │ └── sawyer_window_open.py
│ │ │ │ │ ├── v2/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── sawyer_assembly_peg_v2.py
│ │ │ │ │ │ ├── sawyer_basketball_v2.py
│ │ │ │ │ │ ├── sawyer_bin_picking_v2.py
│ │ │ │ │ │ ├── sawyer_box_close_v2.py
│ │ │ │ │ │ ├── sawyer_button_press_topdown_v2.py
│ │ │ │ │ │ ├── sawyer_button_press_topdown_wall_v2.py
│ │ │ │ │ │ ├── sawyer_button_press_v2.py
│ │ │ │ │ │ ├── sawyer_button_press_wall_v2.py
│ │ │ │ │ │ ├── sawyer_coffee_button_v2.py
│ │ │ │ │ │ ├── sawyer_coffee_pull_v2.py
│ │ │ │ │ │ ├── sawyer_coffee_push_v2.py
│ │ │ │ │ │ ├── sawyer_dial_turn_v2.py
│ │ │ │ │ │ ├── sawyer_disassemble_peg_v2.py
│ │ │ │ │ │ ├── sawyer_door_close_v2.py
│ │ │ │ │ │ ├── sawyer_door_lock_v2.py
│ │ │ │ │ │ ├── sawyer_door_unlock_v2.py
│ │ │ │ │ │ ├── sawyer_door_v2.py
│ │ │ │ │ │ ├── sawyer_drawer_close_v2.py
│ │ │ │ │ │ ├── sawyer_drawer_open_v2.py
│ │ │ │ │ │ ├── sawyer_faucet_close_v2.py
│ │ │ │ │ │ ├── sawyer_faucet_open_v2.py
│ │ │ │ │ │ ├── sawyer_hammer_v2.py
│ │ │ │ │ │ ├── sawyer_hand_insert_v2.py
│ │ │ │ │ │ ├── sawyer_handle_press_side_v2.py
│ │ │ │ │ │ ├── sawyer_handle_press_v2.py
│ │ │ │ │ │ ├── sawyer_handle_pull_side_v2.py
│ │ │ │ │ │ ├── sawyer_handle_pull_v2.py
│ │ │ │ │ │ ├── sawyer_lever_pull_v2.py
│ │ │ │ │ │ ├── sawyer_peg_insertion_side_v2.py
│ │ │ │ │ │ ├── sawyer_peg_unplug_side_v2.py
│ │ │ │ │ │ ├── sawyer_pick_out_of_hole_v2.py
│ │ │ │ │ │ ├── sawyer_pick_place_v2.py
│ │ │ │ │ │ ├── sawyer_pick_place_wall_v2.py
│ │ │ │ │ │ ├── sawyer_plate_slide_back_side_v2.py
│ │ │ │ │ │ ├── sawyer_plate_slide_back_v2.py
│ │ │ │ │ │ ├── sawyer_plate_slide_side_v2.py
│ │ │ │ │ │ ├── sawyer_plate_slide_v2.py
│ │ │ │ │ │ ├── sawyer_push_back_v2.py
│ │ │ │ │ │ ├── sawyer_push_v2.py
│ │ │ │ │ │ ├── sawyer_push_wall_v2.py
│ │ │ │ │ │ ├── sawyer_reach_v2.py
│ │ │ │ │ │ ├── sawyer_reach_wall_v2.py
│ │ │ │ │ │ ├── sawyer_shelf_place_v2.py
│ │ │ │ │ │ ├── sawyer_soccer_v2.py
│ │ │ │ │ │ ├── sawyer_stick_pull_v2.py
│ │ │ │ │ │ ├── sawyer_stick_push_v2.py
│ │ │ │ │ │ ├── sawyer_sweep_into_goal_v2.py
│ │ │ │ │ │ ├── sawyer_sweep_v2.py
│ │ │ │ │ │ ├── sawyer_window_close_v2.py
│ │ │ │ │ │ └── sawyer_window_open_v2.py
│ │ │ │ │ └── visual/
│ │ │ │ │ └── __init__.py
│ │ │ │ └── utils/
│ │ │ │ └── rotation.py
│ │ │ └── reward_utils.py
│ │ └── policies/
│ │ ├── __init__.py
│ │ ├── action.py
│ │ ├── policy.py
│ │ ├── sawyer_assembly_v1_policy.py
│ │ ├── sawyer_assembly_v2_policy.py
│ │ ├── sawyer_basketball_v1_policy.py
│ │ ├── sawyer_basketball_v2_policy.py
│ │ ├── sawyer_bin_picking_v2_policy.py
│ │ ├── sawyer_box_close_v1_policy.py
│ │ ├── sawyer_box_close_v2_policy.py
│ │ ├── sawyer_button_press_topdown_v1_policy.py
│ │ ├── sawyer_button_press_topdown_v2_policy.py
│ │ ├── sawyer_button_press_topdown_wall_v1_policy.py
│ │ ├── sawyer_button_press_topdown_wall_v2_policy.py
│ │ ├── sawyer_button_press_v1_policy.py
│ │ ├── sawyer_button_press_v2_policy.py
│ │ ├── sawyer_button_press_wall_v1_policy.py
│ │ ├── sawyer_button_press_wall_v2_policy.py
│ │ ├── sawyer_coffee_button_v1_policy.py
│ │ ├── sawyer_coffee_button_v2_policy.py
│ │ ├── sawyer_coffee_pull_v1_policy.py
│ │ ├── sawyer_coffee_pull_v2_policy.py
│ │ ├── sawyer_coffee_push_v1_policy.py
│ │ ├── sawyer_coffee_push_v2_policy.py
│ │ ├── sawyer_dial_turn_v1_policy.py
│ │ ├── sawyer_dial_turn_v2_policy.py
│ │ ├── sawyer_disassemble_v1_policy.py
│ │ ├── sawyer_disassemble_v2_policy.py
│ │ ├── sawyer_door_close_v1_policy.py
│ │ ├── sawyer_door_close_v2_policy.py
│ │ ├── sawyer_door_lock_v1_policy.py
│ │ ├── sawyer_door_lock_v2_policy.py
│ │ ├── sawyer_door_open_v1_policy.py
│ │ ├── sawyer_door_open_v2_policy.py
│ │ ├── sawyer_door_unlock_v1_policy.py
│ │ ├── sawyer_door_unlock_v2_policy.py
│ │ ├── sawyer_drawer_close_v1_policy.py
│ │ ├── sawyer_drawer_close_v2_policy.py
│ │ ├── sawyer_drawer_open_v1_policy.py
│ │ ├── sawyer_drawer_open_v2_policy.py
│ │ ├── sawyer_faucet_close_v1_policy.py
│ │ ├── sawyer_faucet_close_v2_policy.py
│ │ ├── sawyer_faucet_open_v1_policy.py
│ │ ├── sawyer_faucet_open_v2_policy.py
│ │ ├── sawyer_hammer_v1_policy.py
│ │ ├── sawyer_hammer_v2_policy.py
│ │ ├── sawyer_hand_insert_v1_policy.py
│ │ ├── sawyer_hand_insert_v2_policy.py
│ │ ├── sawyer_handle_press_side_v2_policy.py
│ │ ├── sawyer_handle_press_v1_policy.py
│ │ ├── sawyer_handle_press_v2_policy.py
│ │ ├── sawyer_handle_pull_side_v1_policy.py
│ │ ├── sawyer_handle_pull_side_v2_policy.py
│ │ ├── sawyer_handle_pull_v1_policy.py
│ │ ├── sawyer_handle_pull_v2_policy.py
│ │ ├── sawyer_lever_pull_v2_policy.py
│ │ ├── sawyer_peg_insertion_side_v2_policy.py
│ │ ├── sawyer_peg_unplug_side_v1_policy.py
│ │ ├── sawyer_peg_unplug_side_v2_policy.py
│ │ ├── sawyer_pick_out_of_hole_v1_policy.py
│ │ ├── sawyer_pick_out_of_hole_v2_policy.py
│ │ ├── sawyer_pick_place_v2_policy.py
│ │ ├── sawyer_pick_place_wall_v2_policy.py
│ │ ├── sawyer_plate_slide_back_side_v2_policy.py
│ │ ├── sawyer_plate_slide_back_v1_policy.py
│ │ ├── sawyer_plate_slide_back_v2_policy.py
│ │ ├── sawyer_plate_slide_side_v1_policy.py
│ │ ├── sawyer_plate_slide_side_v2_policy.py
│ │ ├── sawyer_plate_slide_v1_policy.py
│ │ ├── sawyer_plate_slide_v2_policy.py
│ │ ├── sawyer_push_back_v1_policy.py
│ │ ├── sawyer_push_back_v2_policy.py
│ │ ├── sawyer_push_v2_policy.py
│ │ ├── sawyer_push_wall_v2_policy.py
│ │ ├── sawyer_reach_v2_policy.py
│ │ ├── sawyer_reach_wall_v2_policy.py
│ │ ├── sawyer_shelf_place_v1_policy.py
│ │ ├── sawyer_shelf_place_v2_policy.py
│ │ ├── sawyer_soccer_v1_policy.py
│ │ ├── sawyer_soccer_v2_policy.py
│ │ ├── sawyer_stick_pull_v1_policy.py
│ │ ├── sawyer_stick_pull_v2_policy.py
│ │ ├── sawyer_stick_push_v1_policy.py
│ │ ├── sawyer_stick_push_v2_policy.py
│ │ ├── sawyer_sweep_into_v1_policy.py
│ │ ├── sawyer_sweep_into_v2_policy.py
│ │ ├── sawyer_sweep_v1_policy.py
│ │ ├── sawyer_sweep_v2_policy.py
│ │ ├── sawyer_window_close_v2_policy.py
│ │ └── sawyer_window_open_v2_policy.py
│ ├── scripts/
│ │ ├── demo_sawyer.py
│ │ ├── grasp.py
│ │ ├── keyboard_control.py
│ │ ├── mouse_control.py
│ │ ├── plot_rewards_returns.ipynb
│ │ ├── plot_rewards_returns_noise_3D.ipynb
│ │ ├── profile_memory_usage.py
│ │ └── scripted_policy_movies.ipynb
│ ├── setup.cfg
│ ├── setup.py
│ └── tests/
│ ├── __init__.py
│ ├── helpers.py
│ ├── integration/
│ │ ├── __init__.py
│ │ ├── test_memory_usage.py
│ │ ├── test_new_api.py
│ │ └── test_single_goal_envs.py
│ └── metaworld/
│ ├── __init__.py
│ └── envs/
│ ├── __init__.py
│ └── mujoco/
│ ├── __init__.py
│ └── sawyer_xyz/
│ ├── __init__.py
│ ├── test_obs_space_hand.py
│ ├── test_sawyer_xyz_env.py
│ ├── test_scripted_policies.py
│ └── utils.py
├── README.md
├── code_generation/
│ ├── __init__.py
│ ├── gold_reward_rewrite/
│ │ ├── lift_cube.py
│ │ ├── move_bucket.py
│ │ ├── open_cabinet_door.py
│ │ ├── open_cabinet_drawer.py
│ │ ├── panda_avoid_obstacles.py
│ │ ├── peg_insertion.py
│ │ ├── pick_cube.py
│ │ ├── plug_charger.py
│ │ ├── push_chair.py
│ │ ├── stack_cube.py
│ │ └── turn_faucet.py
│ ├── interactive/
│ │ ├── __init__.py
│ │ ├── basic/
│ │ │ ├── __init__.py
│ │ │ └── generation.py
│ │ ├── classlike_prompt/
│ │ │ ├── __init__.py
│ │ │ └── feedback_prompt.py
│ │ └── human_feedback_exp.py
│ ├── post_process/
│ │ ├── __init__.py
│ │ └── post_process.py
│ └── single_flow/
│ ├── __init__.py
│ ├── classlike_prompt/
│ │ ├── AntPrompt.py
│ │ ├── HopperPrompt.py
│ │ ├── MetaworldPrompt.py
│ │ ├── MobileDualArmPrompt.py
│ │ ├── MobilePandaPrompt.py
│ │ ├── PandaPrompt.py
│ │ ├── __init__.py
│ │ └── few_shot_prompt.py
│ ├── few_shot/
│ │ ├── __init__.py
│ │ └── generation.py
│ ├── few_shot_exp.py
│ ├── metaworld_exp.py
│ ├── run_maniskill_fewshot.sh
│ ├── run_maniskill_zeroshot.sh
│ ├── run_metaworld_zeroshot.sh
│ ├── zero_shot/
│ │ ├── __init__.py
│ │ └── generation.py
│ └── zero_shot_exp.py
├── rlkit/
│ └── envs/
│ ├── proxy_env.py
│ └── wrappers/
│ ├── __init__.py
│ └── normalized_box_env.py
├── run_maniskill/
│ ├── download_data.sh
│ ├── ppo.py
│ ├── reward_code/
│ │ ├── few-shot/
│ │ │ ├── LiftCube-v0/
│ │ │ │ ├── general.py
│ │ │ │ └── specific.py
│ │ │ ├── OpenCabinetDoor-v1/
│ │ │ │ ├── general.py
│ │ │ │ └── specific.py
│ │ │ ├── OpenCabinetDrawer-v1/
│ │ │ │ ├── general.py
│ │ │ │ └── specific.py
│ │ │ ├── PickCube-v0/
│ │ │ │ ├── general.py
│ │ │ │ └── specific.py
│ │ │ ├── PushChair-v1/
│ │ │ │ ├── general.py
│ │ │ │ └── specific.py
│ │ │ └── TurnFaucet-v0/
│ │ │ ├── general.py
│ │ │ └── specific.py
│ │ └── zero-shot/
│ │ ├── LiftCube-v0/
│ │ │ ├── general.py
│ │ │ └── specific.py
│ │ ├── OpenCabinetDoor-v1/
│ │ │ ├── general.py
│ │ │ └── specific.py
│ │ ├── OpenCabinetDrawer-v1/
│ │ │ ├── general.py
│ │ │ └── specific.py
│ │ ├── PickCube-v0/
│ │ │ ├── general.py
│ │ │ └── specific.py
│ │ ├── PushChair-v1/
│ │ │ ├── general.py
│ │ │ └── specific.py
│ │ └── TurnFaucet-v0/
│ │ ├── general.py
│ │ └── specific.py
│ ├── run_few_shot.sh
│ ├── run_oracle.sh
│ ├── run_zero_shot.sh
│ └── sac.py
└── run_metaworld/
├── reward_code/
│ ├── button-press-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── door-close-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── door-unlock-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── drawer-close-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── drawer-open-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── handle-press-side-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── handle-press-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── sweep-into-v2/
│ │ ├── general.py
│ │ └── specific.py
│ ├── window-close-v2/
│ │ ├── general.py
│ │ └── specific.py
│ └── window-open-v2/
│ ├── general.py
│ └── specific.py
├── run_oracle.sh
├── run_zero_shot.sh
└── sac.py
Showing preview only (416K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4904 symbols across 445 files)
FILE: ManiSkill2/examples/profile_speed/profile_sapien.py
class TestSapienEnv (line 17) | class TestSapienEnv(gym.Env):
method __init__ (line 20) | def __init__(self, control_freq, timestep):
method _build_world (line 34) | def _build_world(self):
method _setup_viewer (line 37) | def _setup_viewer(self):
method seed (line 43) | def seed(self, seed=None):
method close (line 47) | def close(self):
method render (line 51) | def render(self, mode="human"):
method get_actor (line 63) | def get_actor(self, name) -> sapien.ArticulationBase:
method get_articulation (line 73) | def get_articulation(self, name) -> sapien.ArticulationBase:
method dt (line 83) | def dt(self):
function create_cartpole (line 87) | def create_cartpole(scene: sapien.Scene) -> sapien.Articulation:
class CartPoleSwingUpEnv (line 138) | class CartPoleSwingUpEnv(TestSapienEnv):
method __init__ (line 139) | def __init__(self):
method _build_world (line 159) | def _build_world(self):
method step (line 169) | def step(self, action):
method reset (line 190) | def reset(self):
method _get_obs (line 196) | def _get_obs(self):
method _setup_lighting (line 205) | def _setup_lighting(self):
method _setup_viewer (line 212) | def _setup_viewer(self):
method _setup_camera (line 220) | def _setup_camera(self):
method render (line 232) | def render(self, mode="human"):
function main (line 243) | def main():
FILE: ManiSkill2/examples/submission/user_solution.py
class UserPolicy (line 4) | class UserPolicy(BasePolicy):
method act (line 5) | def act(self, observations):
method get_obs_mode (line 9) | def get_obs_mode(cls, env_id: str) -> str:
method get_control_mode (line 13) | def get_control_mode(cls, env_id: str) -> str:
FILE: ManiSkill2/examples/tutorials/imitation-learning/bc_liftcube_rgbd.py
function tensor_to_numpy (line 19) | def tensor_to_numpy(x):
function convert_observation (line 26) | def convert_observation(observation):
function rescale_rgbd (line 53) | def rescale_rgbd(rgbd):
function load_h5_data (line 63) | def load_h5_data(data):
class ManiSkill2Dataset (line 73) | class ManiSkill2Dataset(Dataset):
method __init__ (line 74) | def __init__(self, dataset_file: str, load_count=-1) -> None:
method __len__ (line 112) | def __len__(self):
method __getitem__ (line 115) | def __getitem__(self, idx):
class NatureCNN (line 127) | class NatureCNN(nn.Module):
method __init__ (line 128) | def __init__(self, image_size=(128, 128), in_channels=8, state_size=42):
method forward (line 171) | def forward(self, observations) -> th.Tensor:
class Policy (line 179) | class Policy(nn.Module):
method __init__ (line 180) | def __init__(
method forward (line 199) | def forward(self, observations) -> th.Tensor:
function parse_args (line 204) | def parse_args():
function main (line 230) | def main():
FILE: ManiSkill2/examples/tutorials/imitation-learning/bc_liftcube_state.py
function load_h5_data (line 20) | def load_h5_data(data):
class ManiSkill2Dataset (line 30) | class ManiSkill2Dataset(Dataset):
method __init__ (line 31) | def __init__(self, dataset_file: str, load_count=-1) -> None:
method __len__ (line 63) | def __len__(self):
method __getitem__ (line 66) | def __getitem__(self, idx):
class Policy (line 72) | class Policy(nn.Module):
method __init__ (line 73) | def __init__(
method forward (line 90) | def forward(self, observations) -> th.Tensor:
function parse_args (line 94) | def parse_args():
function main (line 126) | def main():
FILE: ManiSkill2/examples/tutorials/reinforcement-learning/sb3_ppo_liftcube_rgbd.py
class ContinuousTaskWrapper (line 29) | class ContinuousTaskWrapper(gym.Wrapper):
method __init__ (line 30) | def __init__(self, env, max_episode_steps: int) -> None:
method reset (line 35) | def reset(self):
method step (line 39) | def step(self, action):
class SuccessInfoWrapper (line 52) | class SuccessInfoWrapper(gym.Wrapper):
method step (line 53) | def step(self, action):
class ManiSkillRGBDWrapper (line 59) | class ManiSkillRGBDWrapper(gym.ObservationWrapper):
method __init__ (line 60) | def __init__(self, env):
method init_observation_space (line 66) | def init_observation_space(obs_space: spaces.Dict):
method convert_observation (line 92) | def convert_observation(observation):
method observation (line 122) | def observation(self, observation):
class ManiSkillRGBDVecEnvWrapper (line 128) | class ManiSkillRGBDVecEnvWrapper(VecEnvObservationWrapper):
method __init__ (line 129) | def __init__(self, env):
method observation (line 136) | def observation(self, observation):
class CustomExtractor (line 140) | class CustomExtractor(BaseFeaturesExtractor):
method __init__ (line 141) | def __init__(self, observation_space: gym.spaces.Dict):
method forward (line 201) | def forward(self, observations) -> th.Tensor:
function parse_args (line 212) | def parse_args():
function main (line 257) | def main():
FILE: ManiSkill2/examples/tutorials/reinforcement-learning/sb3_ppo_liftcube_state.py
class ContinuousTaskWrapper (line 19) | class ContinuousTaskWrapper(gym.Wrapper):
method __init__ (line 20) | def __init__(self, env, max_episode_steps: int) -> None:
method reset (line 25) | def reset(self):
method step (line 29) | def step(self, action):
class SuccessInfoWrapper (line 42) | class SuccessInfoWrapper(gym.Wrapper):
method step (line 43) | def step(self, action):
function parse_args (line 49) | def parse_args():
function main (line 94) | def main():
FILE: ManiSkill2/mani_skill2/__init__.py
function format_path (line 15) | def format_path(p: str):
function get_commit_info (line 26) | def get_commit_info(show_modified_files=False, show_untracked_files=False):
function make_box_space_readable (line 57) | def make_box_space_readable():
FILE: ManiSkill2/mani_skill2/agents/base_agent.py
class AgentConfig (line 18) | class AgentConfig:
class BaseAgent (line 34) | class BaseAgent:
method __init__ (line 50) | def __init__(
method get_default_config (line 82) | def get_default_config(cls) -> AgentConfig:
method _load_articulation (line 85) | def _load_articulation(self):
method _setup_controllers (line 102) | def _setup_controllers(self):
method _after_init (line 114) | def _after_init(self):
method control_mode (line 119) | def control_mode(self):
method set_control_mode (line 123) | def set_control_mode(self, control_mode):
method controller (line 134) | def controller(self):
method action_space (line 142) | def action_space(self):
method reset (line 153) | def reset(self, init_qpos=None):
method set_action (line 161) | def set_action(self, action):
method before_simulation_step (line 164) | def before_simulation_step(self):
method get_proprioception (line 170) | def get_proprioception(self):
method get_state (line 177) | def get_state(self) -> Dict:
method set_state (line 195) | def set_state(self, state: Dict, ignore_controller=False):
FILE: ManiSkill2/mani_skill2/agents/base_controller.py
class BaseController (line 14) | class BaseController:
method __init__ (line 23) | def __init__(
method _initialize_joints (line 50) | def _initialize_joints(self):
method _initialize_action_space (line 64) | def _initialize_action_space(self):
method control_freq (line 69) | def control_freq(self):
method qpos (line 73) | def qpos(self):
method qvel (line 78) | def qvel(self):
method set_drive_property (line 85) | def set_drive_property(self):
method reset (line 89) | def reset(self):
method _preprocess_action (line 93) | def _preprocess_action(self, action: np.ndarray):
method set_action (line 101) | def set_action(self, action: np.ndarray):
method before_simulation_step (line 107) | def before_simulation_step(self):
method get_state (line 111) | def get_state(self) -> dict:
method set_state (line 115) | def set_state(self, state: dict):
method _clip_and_scale_action_space (line 121) | def _clip_and_scale_action_space(self):
method _clip_and_scale_action (line 125) | def _clip_and_scale_action(self, action):
class ControllerConfig (line 132) | class ControllerConfig:
class DictController (line 142) | class DictController(BaseController):
method __init__ (line 143) | def __init__(
method _initialize_action_space (line 166) | def _initialize_action_space(self):
method _initialize_joints (line 175) | def _initialize_joints(self):
method _assert_fully_actuated (line 182) | def _assert_fully_actuated(self):
method set_drive_property (line 191) | def set_drive_property(self):
method reset (line 196) | def reset(self):
method set_action (line 200) | def set_action(self, action: Dict[str, np.ndarray]):
method before_simulation_step (line 204) | def before_simulation_step(self):
method get_state (line 215) | def get_state(self) -> dict:
method set_state (line 223) | def set_state(self, state: dict):
class CombinedController (line 228) | class CombinedController(DictController):
method _initialize_action_space (line 231) | def _initialize_action_space(self):
method set_action (line 237) | def set_action(self, action: np.ndarray):
method to_action_dict (line 246) | def to_action_dict(self, action: np.ndarray):
method from_action_dict (line 258) | def from_action_dict(self, action_dict: dict):
FILE: ManiSkill2/mani_skill2/agents/configs/mobile_panda/defaults.py
class MobilePandaDualArmDefaultConfig (line 9) | class MobilePandaDualArmDefaultConfig:
method __init__ (line 10) | def __init__(self) -> None:
method controllers (line 78) | def controllers(self):
method cameras (line 224) | def cameras(self):
class MobilePandaSingleArmDefaultConfig (line 249) | class MobilePandaSingleArmDefaultConfig(MobilePandaDualArmDefaultConfig):
method __init__ (line 250) | def __init__(self) -> None:
function test (line 278) | def test():
FILE: ManiSkill2/mani_skill2/agents/configs/panda/defaults.py
class PandaDefaultConfig (line 7) | class PandaDefaultConfig:
method __init__ (line 8) | def __init__(self) -> None:
method controllers (line 48) | def controllers(self):
method cameras (line 182) | def cameras(self):
class PandaRealSensed435Config (line 196) | class PandaRealSensed435Config(PandaDefaultConfig):
method __init__ (line 197) | def __init__(self) -> None:
method cameras (line 202) | def cameras(self):
FILE: ManiSkill2/mani_skill2/agents/configs/panda/variants.py
class PandaPourConfig (line 9) | class PandaPourConfig(PandaDefaultConfig):
method controllers (line 11) | def controllers(self):
class PandaBucketConfig (line 44) | class PandaBucketConfig(PandaDefaultConfig):
method __init__ (line 45) | def __init__(self) -> None:
method controllers (line 52) | def controllers(self):
method cameras (line 60) | def cameras(self):
class PandaStickConfig (line 74) | class PandaStickConfig(PandaDefaultConfig):
method __init__ (line 75) | def __init__(self) -> None:
method controllers (line 82) | def controllers(self):
class PandaPinchConfig (line 106) | class PandaPinchConfig(PandaDefaultConfig):
method __init__ (line 107) | def __init__(self) -> None:
method controllers (line 112) | def controllers(self):
FILE: ManiSkill2/mani_skill2/agents/configs/xmate3/defaults.py
class Xmate3RobotiqDefaultConfig (line 5) | class Xmate3RobotiqDefaultConfig:
method __init__ (line 6) | def __init__(self) -> None:
method controllers (line 46) | def controllers(self):
method cameras (line 119) | def cameras(self):
FILE: ManiSkill2/mani_skill2/agents/controllers/__init__.py
function deepcopy_dict (line 20) | def deepcopy_dict(configs: dict):
FILE: ManiSkill2/mani_skill2/agents/controllers/passive_controller.py
class PassiveController (line 10) | class PassiveController(BaseController):
method set_drive_property (line 13) | def set_drive_property(self):
method _initialize_action_space (line 23) | def _initialize_action_space(self):
method set_action (line 27) | def set_action(self, action: np.ndarray):
method before_simulation_step (line 30) | def before_simulation_step(self):
class PassiveControllerConfig (line 35) | class PassiveControllerConfig(ControllerConfig):
FILE: ManiSkill2/mani_skill2/agents/controllers/pd_base_vel.py
class PDBaseVelController (line 8) | class PDBaseVelController(PDJointVelController):
method _initialize_action_space (line 11) | def _initialize_action_space(self):
method set_action (line 16) | def set_action(self, action: np.ndarray):
class PDBaseVelControllerConfig (line 29) | class PDBaseVelControllerConfig(PDJointVelControllerConfig):
FILE: ManiSkill2/mani_skill2/agents/controllers/pd_ee_pose.py
class PDEEPosController (line 17) | class PDEEPosController(PDJointPosController):
method _initialize_joints (line 20) | def _initialize_joints(self):
method _initialize_action_space (line 37) | def _initialize_action_space(self):
method ee_pos (line 43) | def ee_pos(self):
method ee_pose (line 47) | def ee_pose(self):
method ee_pose_at_base (line 51) | def ee_pose_at_base(self):
method reset (line 55) | def reset(self):
method compute_ik (line 59) | def compute_ik(self, target_pose, max_iterations=100):
method compute_target_pose (line 73) | def compute_target_pose(self, prev_ee_pose_at_base, action):
method set_action (line 90) | def set_action(self, action: np.ndarray):
method get_state (line 111) | def get_state(self) -> dict:
method set_state (line 116) | def set_state(self, state: dict):
class PDEEPosControllerConfig (line 123) | class PDEEPosControllerConfig(ControllerConfig):
class PDEEPoseController (line 139) | class PDEEPoseController(PDEEPosController):
method _initialize_action_space (line 142) | def _initialize_action_space(self):
method _clip_and_scale_action (line 161) | def _clip_and_scale_action(self, action):
method compute_target_pose (line 173) | def compute_target_pose(self, prev_ee_pose_at_base, action):
class PDEEPoseControllerConfig (line 199) | class PDEEPoseControllerConfig(ControllerConfig):
FILE: ManiSkill2/mani_skill2/agents/controllers/pd_joint_pos.py
class PDJointPosController (line 10) | class PDJointPosController(BaseController):
method _get_joint_limits (line 13) | def _get_joint_limits(self):
method _initialize_action_space (line 22) | def _initialize_action_space(self):
method set_drive_property (line 27) | def set_drive_property(self):
method reset (line 40) | def reset(self):
method set_drive_targets (line 46) | def set_drive_targets(self, targets):
method set_action (line 50) | def set_action(self, action: np.ndarray):
method before_simulation_step (line 70) | def before_simulation_step(self):
method get_state (line 78) | def get_state(self) -> dict:
method set_state (line 83) | def set_state(self, state: dict):
class PDJointPosControllerConfig (line 89) | class PDJointPosControllerConfig(ControllerConfig):
class PDJointPosMimicController (line 103) | class PDJointPosMimicController(PDJointPosController):
method _get_joint_limits (line 104) | def _get_joint_limits(self):
class PDJointPosMimicControllerConfig (line 111) | class PDJointPosMimicControllerConfig(PDJointPosControllerConfig):
FILE: ManiSkill2/mani_skill2/agents/controllers/pd_joint_pos_vel.py
class PDJointPosVelController (line 11) | class PDJointPosVelController(PDJointPosController):
method _initialize_action_space (line 14) | def _initialize_action_space(self):
method reset (line 23) | def reset(self):
method set_drive_velocity_targets (line 27) | def set_drive_velocity_targets(self, targets):
method set_action (line 31) | def set_action(self, action: np.ndarray):
class PDJointPosVelControllerConfig (line 57) | class PDJointPosVelControllerConfig(PDJointPosControllerConfig):
FILE: ManiSkill2/mani_skill2/agents/controllers/pd_joint_vel.py
class PDJointVelController (line 10) | class PDJointVelController(BaseController):
method _initialize_action_space (line 13) | def _initialize_action_space(self):
method set_drive_property (line 19) | def set_drive_property(self):
method set_action (line 29) | def set_action(self, action: np.ndarray):
class PDJointVelControllerConfig (line 36) | class PDJointVelControllerConfig(ControllerConfig):
FILE: ManiSkill2/mani_skill2/agents/robots/mobile_panda.py
function get_entities_by_names (line 12) | def get_entities_by_names(
class DummyMobileAgent (line 30) | class DummyMobileAgent(BaseAgent):
method __init__ (line 31) | def __init__(
method _after_init (line 44) | def _after_init(self):
method get_proprioception (line 63) | def get_proprioception(self):
method base_pose (line 78) | def base_pose(self):
method set_base_pose (line 83) | def set_base_pose(self, xy, ori):
class MobilePandaDualArm (line 90) | class MobilePandaDualArm(DummyMobileAgent):
method get_default_config (line 94) | def get_default_config(cls):
method _after_init (line 97) | def _after_init(self):
method get_fingers_info (line 133) | def get_fingers_info(self):
method get_ee_coords (line 141) | def get_ee_coords(self):
method get_ee_vels (line 150) | def get_ee_vels(self):
class MobilePandaSingleArm (line 160) | class MobilePandaSingleArm(DummyMobileAgent):
method get_default_config (line 164) | def get_default_config(cls):
method _after_init (line 167) | def _after_init(self):
method get_fingers_info (line 182) | def get_fingers_info(self):
method get_ee_coords (line 190) | def get_ee_coords(self):
method get_ee_vels (line 197) | def get_ee_vels(self):
method get_ee_coords_sample (line 204) | def get_ee_coords_sample(self):
method build_grasp_pose (line 218) | def build_grasp_pose(approaching, closing, center):
FILE: ManiSkill2/mani_skill2/agents/robots/panda.py
class Panda (line 13) | class Panda(BaseAgent):
method get_default_config (line 17) | def get_default_config(cls):
method _after_init (line 20) | def _after_init(self):
method check_grasp (line 28) | def check_grasp(self, actor: sapien.ActorBase, min_impulse=1e-6, max_a...
method check_contact_fingers (line 52) | def check_contact_fingers(self, actor: sapien.ActorBase, min_impulse=1...
method build_grasp_pose (line 65) | def build_grasp_pose(approaching, closing, center):
FILE: ManiSkill2/mani_skill2/agents/robots/xmate3.py
class Xmate3Robotiq (line 13) | class Xmate3Robotiq(BaseAgent):
method get_default_config (line 17) | def get_default_config(cls):
method _after_init (line 20) | def _after_init(self):
method check_grasp (line 28) | def check_grasp(self, actor: sapien.ActorBase, min_impulse=1e-6, max_a...
method build_grasp_pose (line 53) | def build_grasp_pose(approaching, closing, center):
FILE: ManiSkill2/mani_skill2/agents/utils.py
function get_joint_indices (line 10) | def get_joint_indices(articulation: sapien.Articulation, joint_names: Se...
function get_active_joint_indices (line 16) | def get_active_joint_indices(
function get_joints (line 24) | def get_joints(articulation: sapien.Articulation, joint_names: Sequence[...
function get_active_joints (line 30) | def get_active_joints(articulation: sapien.Articulation, joint_names: Se...
function flatten_action_spaces (line 36) | def flatten_action_spaces(action_spaces: Dict[str, spaces.Space]):
FILE: ManiSkill2/mani_skill2/envs/assembly/assembling_kits.py
class AssemblingKitsEnv (line 17) | class AssemblingKitsEnv(StationaryManipulationEnv):
method __init__ (line 18) | def __init__(self, asset_root="{ASSET_DIR}/assembling_kits", **kwargs):
method reset (line 40) | def reset(self, seed=None, episode_idx=None, reconfigure=False, **kwar...
method _parse_json (line 57) | def _parse_json(self, path):
method _load_kit (line 68) | def _load_kit(self):
method _load_object (line 84) | def _load_object(self, object_id):
method _load_actors (line 104) | def _load_actors(self):
method _initialize_actors (line 111) | def _initialize_actors(self):
method _initialize_task (line 129) | def _initialize_task(self):
method _get_obs_extra (line 133) | def _get_obs_extra(self):
method _check_pos_diff (line 147) | def _check_pos_diff(self, pos_eps=2e-2):
method _check_rot_diff (line 152) | def _check_rot_diff(self, rot_eps=np.deg2rad(4)):
method _check_in_slot (line 164) | def _check_in_slot(self, obj: sapien.Actor, height_eps=3e-3):
method evaluate (line 167) | def evaluate(self, **kwargs) -> dict:
method compute_dense_reward (line 181) | def compute_dense_reward(self, info, **kwargs):
method _register_cameras (line 225) | def _register_cameras(self):
method _register_render_cameras (line 230) | def _register_render_cameras(self):
FILE: ManiSkill2/mani_skill2/envs/assembly/base_env.py
class StationaryManipulationEnv (line 21) | class StationaryManipulationEnv(BaseEnv):
method __init__ (line 25) | def __init__(self, *args, robot="panda", robot_init_qpos_noise=0.02, *...
method _get_default_scene_config (line 30) | def _get_default_scene_config(self):
method _configure_agent (line 35) | def _configure_agent(self):
method _load_agent (line 42) | def _load_agent(self):
method _initialize_agent (line 52) | def _initialize_agent(self):
method _register_cameras (line 77) | def _register_cameras(self):
method _register_render_cameras (line 83) | def _register_render_cameras(self):
method _setup_viewer (line 87) | def _setup_viewer(self):
method _get_obs_agent (line 92) | def _get_obs_agent(self):
FILE: ManiSkill2/mani_skill2/envs/assembly/peg_insertion_side.py
class PegInsertionSideEnv (line 15) | class PegInsertionSideEnv(StationaryManipulationEnv):
method reset (line 18) | def reset(self, reconfigure=True, **kwargs):
method _build_box_with_hole (line 21) | def _build_box_with_hole(
method _load_actors (line 53) | def _load_actors(self):
method _initialize_actors (line 100) | def _initialize_actors(self):
method _initialize_agent (line 113) | def _initialize_agent(self):
method peg_head_pos (line 129) | def peg_head_pos(self):
method peg_head_pose (line 133) | def peg_head_pose(self):
method box_hole_pose (line 137) | def box_hole_pose(self):
method _initialize_task (line 140) | def _initialize_task(self):
method _get_obs_extra (line 149) | def _get_obs_extra(self) -> OrderedDict:
method has_peg_inserted (line 160) | def has_peg_inserted(self):
method evaluate (line 175) | def evaluate(self, **kwargs) -> dict:
method compute_dense_reward (line 179) | def compute_dense_reward(self, info, **kwargs):
method _register_cameras (line 262) | def _register_cameras(self):
method _register_render_cameras (line 267) | def _register_render_cameras(self):
method set_state (line 272) | def set_state(self, state):
FILE: ManiSkill2/mani_skill2/envs/assembly/plug_charger.py
class PlugChargerEnv (line 16) | class PlugChargerEnv(StationaryManipulationEnv):
method _build_charger (line 23) | def _build_charger(self, peg_size, base_size, gap):
method _build_receptacle (line 47) | def _build_receptacle(self, peg_size, receptacle_size, gap):
method _load_actors (line 97) | def _load_actors(self):
method _initialize_actors (line 114) | def _initialize_actors(self):
method _initialize_task (line 141) | def _initialize_task(self):
method charger_base_pose (line 147) | def charger_base_pose(self):
method _get_obs_extra (line 150) | def _get_obs_extra(self) -> OrderedDict:
method evaluate (line 160) | def evaluate(self, **kwargs):
method _compute_distance (line 169) | def _compute_distance(self):
method compute_dense_reward (line 181) | def compute_dense_reward(self, info, **kwargs):
method _register_cameras (line 286) | def _register_cameras(self):
method _register_render_cameras (line 291) | def _register_render_cameras(self):
method _setup_lighting (line 296) | def _setup_lighting(self):
method set_state (line 303) | def set_state(self, state):
FILE: ManiSkill2/mani_skill2/envs/misc/avoid_obstacles.py
class AvoidObstaclesBaseEnv (line 24) | class AvoidObstaclesBaseEnv(BaseEnv):
method __init__ (line 30) | def __init__(self, episode_json=None, **kwargs):
method _get_default_scene_config (line 46) | def _get_default_scene_config(self):
method reset (line 51) | def reset(self, *args, seed=None, episode_idx=None, reconfigure=False,...
method _build_cube (line 63) | def _build_cube(
method _build_coord_frame_site (line 83) | def _build_coord_frame_site(self, scale=0.1, name="coord_frame"):
method _load_actors (line 113) | def _load_actors(self):
method _initialize_agent (line 132) | def _initialize_agent(self):
method _update_goal_to_obstacle_dist (line 138) | def _update_goal_to_obstacle_dist(self):
method _initialize_task (line 144) | def _initialize_task(self):
method _get_obs_agent (line 150) | def _get_obs_agent(self):
method _get_obs_extra (line 155) | def _get_obs_extra(self) -> OrderedDict:
method evaluate (line 163) | def evaluate(self, **kwargs) -> dict:
method compute_dense_reward (line 174) | def compute_dense_reward(self, info, **kwargs):
method _register_cameras (line 208) | def _register_cameras(self):
method _register_render_cameras (line 214) | def _register_render_cameras(self):
method _setup_viewer (line 218) | def _setup_viewer(self):
method render (line 223) | def render(self, mode="human"):
class PandaAvoidObstaclesEnv (line 234) | class PandaAvoidObstaclesEnv(AvoidObstaclesBaseEnv):
method _configure_agent (line 238) | def _configure_agent(self):
method _load_agent (line 241) | def _load_agent(self):
FILE: ManiSkill2/mani_skill2/envs/misc/turn_faucet.py
class TurnFaucetBaseEnv (line 30) | class TurnFaucetBaseEnv(BaseEnv):
method __init__ (line 34) | def __init__(
method _load_actors (line 45) | def _load_actors(self):
method _configure_agent (line 48) | def _configure_agent(self):
method _load_agent (line 52) | def _load_agent(self):
method _initialize_agent (line 62) | def _initialize_agent(self):
method _get_obs_agent (line 75) | def _get_obs_agent(self):
method _register_cameras (line 80) | def _register_cameras(self):
method _register_render_cameras (line 86) | def _register_render_cameras(self):
method _setup_viewer (line 90) | def _setup_viewer(self):
class TurnFaucetEnv (line 97) | class TurnFaucetEnv(TurnFaucetBaseEnv):
method __init__ (line 101) | def __init__(
method find_urdf_path (line 131) | def find_urdf_path(self, model_id):
method reset (line 146) | def reset(self, seed=None, reconfigure=False, model_id=None, model_sca...
method _set_model (line 153) | def _set_model(self, model_id, model_scale):
method _load_articulations (line 185) | def _load_articulations(self):
method _load_faucet (line 197) | def _load_faucet(self):
method _set_switch_links (line 216) | def _set_switch_links(self):
method _load_agent (line 244) | def _load_agent(self):
method _initialize_articulations (line 253) | def _initialize_articulations(self):
method _initialize_task (line 261) | def _initialize_task(self):
method _set_target_link (line 281) | def _set_target_link(self):
method _set_init_and_target_angle (line 305) | def _set_init_and_target_angle(self):
method _get_obs_extra (line 320) | def _get_obs_extra(self) -> OrderedDict:
method current_angle (line 333) | def current_angle(self):
method evaluate (line 336) | def evaluate(self, **kwargs):
method _compute_distance (line 340) | def _compute_distance(self):
method compute_dense_reward (line 354) | def compute_dense_reward(self, info, **kwargs):
method get_state (line 382) | def get_state(self) -> np.ndarray:
method set_state (line 386) | def set_state(self, state):
FILE: ManiSkill2/mani_skill2/envs/mpm/base_env.py
function task (line 43) | def task(meshes):
class MPMBaseEnv (line 55) | class MPMBaseEnv(BaseEnv):
method __init__ (line 60) | def __init__(
method reconfigure (line 102) | def reconfigure(self):
method _load_actors (line 124) | def _load_actors(self):
method _get_coupling_actors (line 131) | def _get_coupling_actors(
method _setup_mpm (line 136) | def _setup_mpm(self):
method _setup_mpm_bodies (line 154) | def _setup_mpm_bodies(self):
method _setup_render_particles (line 265) | def _setup_render_particles(self):
method _setup_viewer (line 282) | def _setup_viewer(self):
method _clear (line 287) | def _clear(self):
method reset (line 300) | def reset(self, *args, **kwargs):
method initialize_episode (line 304) | def initialize_episode(self):
method _initialize_mpm (line 309) | def _initialize_mpm(self):
method _initialize_render_particles (line 368) | def _initialize_render_particles(self):
method get_obs (line 395) | def get_obs(self):
method _get_obs_agent (line 410) | def _get_obs_agent(self):
method copy_array_to_numpy (line 415) | def copy_array_to_numpy(self, array, length):
method get_mpm_state (line 433) | def get_mpm_state(self):
method set_mpm_state (line 446) | def set_mpm_state(self, state):
method get_sim_state (line 453) | def get_sim_state(self):
method set_sim_state (line 458) | def set_sim_state(self, state):
method get_state (line 462) | def get_state(self):
method n_particles (line 478) | def n_particles(self):
method set_state (line 481) | def set_state(self, state: np.ndarray):
method update_render (line 500) | def update_render(self):
method _setup_lighting (line 515) | def _setup_lighting(self):
method sync_actors (line 526) | def sync_actors(self):
method sync_actors_prepare (line 548) | def sync_actors_prepare(self):
method sync_actors_state (line 566) | def sync_actors_state(self, state):
method step (line 570) | def step(self, action: Union[None, np.ndarray, Dict]):
method step_action (line 581) | def step_action(self, action: np.ndarray):
method _get_bbox (line 629) | def _get_bbox(self, percentile=None):
method _add_draw_box (line 638) | def _add_draw_box(self, bbox):
method _remove_draw_box (line 669) | def _remove_draw_box(self, lineset):
method render (line 672) | def render(self, mode="human", draw_box=False):
FILE: ManiSkill2/mani_skill2/envs/mpm/excavate_env.py
class ExcavateEnv (line 26) | class ExcavateEnv(MPMBaseEnv):
method __init__ (line 27) | def __init__(
method _initialize_mpm (line 41) | def _initialize_mpm(self):
method _configure_agent (line 100) | def _configure_agent(self):
method _load_agent (line 103) | def _load_agent(self):
method _initialize_agent (line 115) | def _initialize_agent(self):
method _initialize_actors (line 123) | def _initialize_actors(self):
method _load_actors (line 134) | def _load_actors(self):
method _get_coupling_actors (line 150) | def _get_coupling_actors(
method _register_cameras (line 157) | def _register_cameras(self):
method _register_render_cameras (line 161) | def _register_render_cameras(self):
method _get_obs_extra (line 165) | def _get_obs_extra(self) -> OrderedDict:
method reset (line 171) | def reset(self, seed=None, reconfigure=False, target_num=None):
method evaluate (line 177) | def evaluate(self, **kwargs):
method _in_bbox_ids (line 200) | def _in_bbox_ids(self, particles_x, bbox):
method _in_bucket_ids (line 210) | def _in_bucket_ids(self, particles_x, bbox, top_signs, bot_signs):
method _bucket_keypoints (line 222) | def _bucket_keypoints(self):
method _get_bbox (line 263) | def _get_bbox(self, points):
method bucket_top_normal (line 271) | def bucket_top_normal(self):
method particles_inside_bucket (line 286) | def particles_inside_bucket(self):
method compute_dense_reward (line 324) | def compute_dense_reward(self, reward_info=False, **kwargs):
method render (line 426) | def render(self, mode="human", draw_box=False, draw_target=False):
method get_state (line 436) | def get_state(self) -> np.ndarray:
method set_state (line 440) | def set_state(self, state):
FILE: ManiSkill2/mani_skill2/envs/mpm/fill_env.py
function success_kernel (line 24) | def success_kernel(
class FillEnv (line 50) | class FillEnv(MPMBaseEnv):
method _setup_mpm (line 51) | def _setup_mpm(self):
method _initialize_mpm (line 55) | def _initialize_mpm(self):
method _configure_agent (line 115) | def _configure_agent(self):
method _load_agent (line 118) | def _load_agent(self):
method _initialize_agent (line 130) | def _initialize_agent(self):
method _register_cameras (line 136) | def _register_cameras(self):
method _register_render_cameras (line 140) | def _register_render_cameras(self):
method _load_actors (line 144) | def _load_actors(self):
method _initialize_actors (line 153) | def _initialize_actors(self):
method _get_coupling_actors (line 168) | def _get_coupling_actors(
method _get_obs_extra (line 175) | def _get_obs_extra(self) -> OrderedDict:
method evaluate (line 181) | def evaluate(self, **kwargs):
method _bucket_keypoints (line 209) | def _bucket_keypoints(self):
method compute_dense_reward (line 250) | def compute_dense_reward(self, reward_info=False, **kwargs):
method render (line 309) | def render(self, mode="human", draw_box=False, draw_target=False):
method get_state (line 318) | def get_state(self) -> np.ndarray:
method set_state (line 322) | def set_state(self, state):
FILE: ManiSkill2/mani_skill2/envs/mpm/hang_env.py
class HangEnv (line 32) | class HangEnv(MPMBaseEnv):
method __init__ (line 33) | def __init__(
method _setup_mpm (line 42) | def _setup_mpm(self):
method _initialize_mpm (line 60) | def _initialize_mpm(self):
method _configure_agent (line 157) | def _configure_agent(self):
method _load_agent (line 160) | def _load_agent(self):
method _load_actors (line 178) | def _load_actors(self):
method _register_cameras (line 185) | def _register_cameras(self):
method _register_render_cameras (line 189) | def _register_render_cameras(self):
method initialize_episode (line 193) | def initialize_episode(self):
method _initialize_actors (line 201) | def _initialize_actors(self):
method _get_coupling_actors (line 214) | def _get_coupling_actors(self):
method _initialize_agent (line 217) | def _initialize_agent(self):
method _get_obs_extra (line 224) | def _get_obs_extra(self) -> OrderedDict:
method evaluate (line 230) | def evaluate(self, **kwargs):
method compute_dense_reward (line 270) | def compute_dense_reward(self, reward_info=False, **kwargs):
method get_state (line 367) | def get_state(self) -> np.ndarray:
method set_state (line 371) | def set_state(self, state):
FILE: ManiSkill2/mani_skill2/envs/mpm/perlin.py
function smoothstep (line 10) | def smoothstep(t):
function lerp (line 17) | def lerp(t, a, b):
class PerlinNoiseFactory (line 22) | class PerlinNoiseFactory(object):
method __init__ (line 30) | def __init__(
method _generate_gradient (line 63) | def _generate_gradient(self):
method get_plain_noise (line 84) | def get_plain_noise(self, *point):
method __call__ (line 135) | def __call__(self, *point):
function perlin (line 172) | def perlin(
function added_perlin (line 192) | def added_perlin(
FILE: ManiSkill2/mani_skill2/envs/mpm/pinch_env.py
class PinchEnv (line 21) | class PinchEnv(MPMBaseEnv):
method __init__ (line 22) | def __init__(
method reset (line 38) | def reset(
method _setup_mpm (line 48) | def _setup_mpm(self):
method _initialize_mpm (line 64) | def _initialize_mpm(self):
method _get_coupling_actors (line 120) | def _get_coupling_actors(self):
method _configure_agent (line 127) | def _configure_agent(self):
method _load_agent (line 130) | def _load_agent(self):
method _initialize_agent (line 141) | def _initialize_agent(self):
method step (line 148) | def step(self, *args, **kwargs):
method _register_cameras (line 152) | def _register_cameras(self):
method _register_render_cameras (line 156) | def _register_render_cameras(self):
method compute_dense_reward (line 160) | def compute_dense_reward(self, **kwargs):
method check_success (line 204) | def check_success(self, **kwargs):
method _get_obs_extra (line 208) | def _get_obs_extra(self):
method evaluate (line 219) | def evaluate(self, **kwargs):
method get_goal_points (line 225) | def get_goal_points(self):
FILE: ManiSkill2/mani_skill2/envs/mpm/pour_env.py
function success_kernel (line 28) | def success_kernel(
function create_ring (line 54) | def create_ring():
class PourEnv (line 91) | class PourEnv(MPMBaseEnv):
method __init__ (line 92) | def __init__(
method _load_actors (line 101) | def _load_actors(self):
method _get_coupling_actors (line 120) | def _get_coupling_actors(
method _configure_agent (line 128) | def _configure_agent(self):
method _load_agent (line 131) | def _load_agent(self):
method _setup_mpm (line 148) | def _setup_mpm(self):
method _initialize_mpm (line 167) | def _initialize_mpm(self):
method _initialize_actors (line 216) | def _initialize_actors(self):
method _initialize_agent (line 234) | def _initialize_agent(self):
method _register_cameras (line 238) | def _register_cameras(self):
method _register_render_cameras (line 242) | def _register_render_cameras(self):
method initialize_episode (line 246) | def initialize_episode(self):
method _clear (line 275) | def _clear(self):
method _setup_viewer (line 281) | def _setup_viewer(self):
method _determine_target_pos (line 286) | def _determine_target_pos(self):
method _get_obs_extra (line 329) | def _get_obs_extra(self) -> OrderedDict:
method in_beaker_num (line 335) | def in_beaker_num(self):
method evaluate (line 354) | def evaluate(self, **kwargs):
method compute_dense_reward (line 389) | def compute_dense_reward(self, reward_info=False, **kwargs):
method get_mpm_state (line 538) | def get_mpm_state(self):
method set_mpm_state (line 549) | def set_mpm_state(self, state):
method get_state (line 556) | def get_state(self) -> np.ndarray:
method set_state (line 569) | def set_state(self, state):
FILE: ManiSkill2/mani_skill2/envs/mpm/utils.py
function actor2meshes (line 10) | def actor2meshes(actor: sapien.Actor, visual=False, return_primitives=Fa...
function trimesh2sdf (line 78) | def trimesh2sdf(meshes, margin, dx, bbox=None):
function load_h5_as_dict (line 139) | def load_h5_as_dict(h5file: Union[h5py.File, h5py.Group]):
FILE: ManiSkill2/mani_skill2/envs/mpm/write_env.py
function success_iou_kernel (line 23) | def success_iou_kernel(
class WriteEnv (line 44) | class WriteEnv(MPMBaseEnv):
method __init__ (line 45) | def __init__(
method reset (line 60) | def reset(self, *args, seed=None, level_file=None, **kwargs):
method _get_obs_extra (line 64) | def _get_obs_extra(self):
method _initialize_mpm (line 70) | def _initialize_mpm(self):
method _setup_mpm (line 164) | def _setup_mpm(self):
method _register_cameras (line 178) | def _register_cameras(self):
method _register_render_cameras (line 182) | def _register_render_cameras(self):
method _configure_agent (line 186) | def _configure_agent(self):
method _load_agent (line 189) | def _load_agent(self):
method _initialize_agent (line 198) | def _initialize_agent(self):
method _load_actors (line 207) | def _load_actors(self):
method _get_coupling_actors (line 223) | def _get_coupling_actors(self):
method step (line 228) | def step(self, *args, **kwargs):
method _compute_iou (line 232) | def _compute_iou(self):
method evaluate (line 274) | def evaluate(self, **kwargs):
method compute_dense_reward (line 277) | def compute_dense_reward(self, reward_info=False, **kwargs):
FILE: ManiSkill2/mani_skill2/envs/ms1/base_env.py
class MS1BaseEnv (line 23) | class MS1BaseEnv(BaseEnv):
method __init__ (line 28) | def __init__(
method find_urdf_path (line 58) | def find_urdf_path(self, model_id):
method _get_default_scene_config (line 76) | def _get_default_scene_config(self):
method reset (line 83) | def reset(self, seed=None, reconfigure=False, model_id=None):
method _set_model (line 91) | def _set_model(self, model_id):
method _load_actors (line 105) | def _load_actors(self):
method _load_partnet_mobility (line 127) | def _load_partnet_mobility(
method _register_render_cameras (line 141) | def _register_render_cameras(self):
method _setup_viewer (line 146) | def _setup_viewer(self):
method check_actor_static (line 154) | def check_actor_static(self, actor: sapien.Actor, max_v=None, max_ang_...
method _get_obs_agent (line 183) | def _get_obs_agent(self):
method _get_obs_extra (line 189) | def _get_obs_extra(self) -> OrderedDict:
method _get_obs_priviledged (line 195) | def _get_obs_priviledged(self):
method _get_task_actors (line 214) | def _get_task_actors(self) -> List[sapien.Actor]:
method _get_task_articulations (line 218) | def _get_task_articulations(self) -> List[Tuple[sapien.Articulation, i...
FILE: ManiSkill2/mani_skill2/envs/ms1/move_bucket.py
class MoveBucketEnv (line 25) | class MoveBucketEnv(MS1BaseEnv):
method _register_render_cameras (line 31) | def _register_render_cameras(self):
method _load_articulations (line 40) | def _load_articulations(self):
method _set_bucket_links_mesh (line 62) | def _set_bucket_links_mesh(self):
method _load_actors (line 70) | def _load_actors(self):
method _configure_agent (line 102) | def _configure_agent(self):
method _load_agent (line 105) | def _load_agent(self):
method _initialize_task (line 117) | def _initialize_task(self):
method _set_target (line 130) | def _set_target(self):
method _initialize_bucket (line 138) | def _initialize_bucket(self):
method _initialize_robot (line 180) | def _initialize_robot(self):
method _initialize_balls (line 204) | def _initialize_balls(self):
method _set_bucket_links_pcd (line 223) | def _set_bucket_links_pcd(self):
method evaluate (line 233) | def evaluate(self, **kwargs):
method _get_bucket_pcd (line 275) | def _get_bucket_pcd(self):
method compute_dense_reward (line 287) | def compute_dense_reward(self, action, info: dict, **kwargs):
method _get_task_actors (line 406) | def _get_task_actors(self):
method _get_task_articulations (line 409) | def _get_task_articulations(self):
method set_state (line 413) | def set_state(self, state: np.ndarray):
method _get_obs_extra (line 417) | def _get_obs_extra(self):
FILE: ManiSkill2/mani_skill2/envs/ms1/open_cabinet_door_drawer.py
function clip_and_normalize (line 23) | def clip_and_normalize(x, a_min, a_max=None):
class OpenCabinetEnv (line 30) | class OpenCabinetEnv(MS1BaseEnv):
method __init__ (line 35) | def __init__(self, *args, fixed_target_link_idx: int = None, **kwargs):
method _register_render_cameras (line 41) | def _register_render_cameras(self):
method _load_articulations (line 50) | def _load_articulations(self):
method _set_cabinet_handles (line 70) | def _set_cabinet_handles(self, joint_type: str):
method _set_cabinet_handles_mesh (line 89) | def _set_cabinet_handles_mesh(self):
method _compute_grasp_poses (line 101) | def _compute_grasp_poses(self, mesh: trimesh.Trimesh, pose: sapien.Pose):
method _compute_handles_grasp_poses (line 132) | def _compute_handles_grasp_poses(self):
method _ignore_collision (line 140) | def _ignore_collision(self):
method _configure_agent (line 148) | def _configure_agent(self):
method _load_agent (line 151) | def _load_agent(self):
method reset (line 162) | def reset(self, seed=None, reconfigure=False, model_id=None):
method _initialize_task (line 165) | def _initialize_task(self):
method _compute_cabinet_bbox (line 171) | def _compute_cabinet_bbox(self):
method _initialize_cabinet (line 175) | def _initialize_cabinet(self):
method _initialize_robot (line 193) | def _initialize_robot(self):
method _set_joint_physical_parameters (line 212) | def _set_joint_physical_parameters(self):
method _set_target_link (line 219) | def _set_target_link(self):
method _set_target_handle_info (line 253) | def _set_target_handle_info(self):
method link_qpos (line 265) | def link_qpos(self):
method link_qvel (line 269) | def link_qvel(self):
method evaluate (line 272) | def evaluate(self, **kwargs) -> dict:
method compute_dense_reward (line 293) | def compute_dense_reward(self, *args, info: dict, **kwargs):
method _get_obs_extra (line 391) | def _get_obs_extra(self) -> OrderedDict:
method _get_obs_priviledged (line 402) | def _get_obs_priviledged(self):
method _get_task_articulations (line 407) | def _get_task_articulations(self):
method set_state (line 411) | def set_state(self, state: np.ndarray):
class OpenCabinetDoorEnv (line 417) | class OpenCabinetDoorEnv(OpenCabinetEnv):
method _set_cabinet_handles (line 422) | def _set_cabinet_handles(self):
class OpenCabinetDrawerEnv (line 427) | class OpenCabinetDrawerEnv(OpenCabinetEnv):
method _set_cabinet_handles (line 432) | def _set_cabinet_handles(self):
FILE: ManiSkill2/mani_skill2/envs/ms1/push_chair.py
class PushChairEnv (line 19) | class PushChairEnv(MS1BaseEnv):
method _get_default_scene_config (line 25) | def _get_default_scene_config(self):
method _register_render_cameras (line 30) | def _register_render_cameras(self):
method _load_articulations (line 39) | def _load_articulations(self):
method _check_link_types (line 56) | def _check_link_types(link: sapien.LinkBase):
method _set_chair_links (line 68) | def _set_chair_links(self):
method _ignore_collision (line 95) | def _ignore_collision(self):
method _load_actors (line 106) | def _load_actors(self):
method _configure_agent (line 114) | def _configure_agent(self):
method _load_agent (line 118) | def _load_agent(self):
method _set_chair_links_mesh (line 127) | def _set_chair_links_mesh(self):
method _initialize_task (line 138) | def _initialize_task(self):
method _set_target (line 148) | def _set_target(self):
method _initialize_chair (line 154) | def _initialize_chair(self):
method _initialize_robot (line 195) | def _initialize_robot(self):
method _set_joint_physical_parameters (line 217) | def _set_joint_physical_parameters(self):
method _set_chair_links_pcd (line 234) | def _set_chair_links_pcd(self):
method evaluate (line 244) | def evaluate(self, **kwargs):
method _get_chair_pcd (line 268) | def _get_chair_pcd(self):
method compute_dense_reward (line 280) | def compute_dense_reward(self, action: np.ndarray, info: dict, **kwargs):
method _get_task_articulations (line 353) | def _get_task_articulations(self):
method set_state (line 357) | def set_state(self, state: np.ndarray):
method _get_obs_extra (line 361) | def _get_obs_extra(self):
FILE: ManiSkill2/mani_skill2/envs/pick_and_place/base_env.py
class StationaryManipulationEnv (line 20) | class StationaryManipulationEnv(BaseEnv):
method __init__ (line 24) | def __init__(self, *args, robot="panda", robot_init_qpos_noise=0.02, *...
method _build_cube (line 29) | def _build_cube(
method _build_sphere_site (line 49) | def _build_sphere_site(self, radius, color=(0, 1, 0), name="goal_site"):
method _configure_agent (line 58) | def _configure_agent(self):
method _load_agent (line 62) | def _load_agent(self):
method _initialize_agent (line 72) | def _initialize_agent(self):
method _initialize_agent_v1 (line 97) | def _initialize_agent_v1(self):
method _register_cameras (line 120) | def _register_cameras(self):
method _register_render_cameras (line 126) | def _register_render_cameras(self):
method _setup_viewer (line 133) | def _setup_viewer(self):
method _get_obs_agent (line 138) | def _get_obs_agent(self):
FILE: ManiSkill2/mani_skill2/envs/pick_and_place/pick_clutter.py
class PickClutterEnv (line 19) | class PickClutterEnv(StationaryManipulationEnv):
method __init__ (line 26) | def __init__(
method _load_actors (line 62) | def _load_actors(self):
method _load_model (line 84) | def _load_model(self, model_id, model_scale=1.0) -> sapien.Actor:
method reset (line 87) | def reset(self, seed=None, reconfigure=False, episode_idx=None):
method _set_episode (line 93) | def _set_episode(self, episode_idx=None):
method _initialize_actors (line 109) | def _initialize_actors(self):
method _initialize_agent (line 120) | def _initialize_agent(self):
method obj_pose (line 136) | def obj_pose(self):
method _initialize_task (line 140) | def _initialize_task(self):
method _set_target (line 144) | def _set_target(self):
method _set_goal (line 159) | def _set_goal(self):
method _get_obs_extra (line 164) | def _get_obs_extra(self) -> OrderedDict:
method check_robot_static (line 179) | def check_robot_static(self, thresh=0.2):
method evaluate (line 184) | def evaluate(self, **kwargs):
method compute_dense_reward (line 195) | def compute_dense_reward(self, info, **kwargs):
method _register_render_cameras (line 224) | def _register_render_cameras(self):
method render (line 229) | def render(self, mode="human"):
method get_state (line 240) | def get_state(self) -> np.ndarray:
method set_state (line 245) | def set_state(self, state):
class PickClutterYCBEnv (line 251) | class PickClutterYCBEnv(PickClutterEnv):
method _load_model (line 256) | def _load_model(self, model_id, model_scale=1.0):
FILE: ManiSkill2/mani_skill2/envs/pick_and_place/pick_cube.py
class PickCubeEnv (line 15) | class PickCubeEnv(StationaryManipulationEnv):
method __init__ (line 19) | def __init__(self, *args, obj_init_rot_z=True, **kwargs):
method _load_actors (line 24) | def _load_actors(self):
method _initialize_actors (line 29) | def _initialize_actors(self):
method _initialize_task (line 38) | def _initialize_task(self, max_trials=100, verbose=False):
method _get_obs_extra (line 54) | def _get_obs_extra(self) -> OrderedDict:
method check_obj_placed (line 68) | def check_obj_placed(self):
method check_robot_static (line 71) | def check_robot_static(self, thresh=0.2):
method evaluate (line 76) | def evaluate(self, **kwargs):
method compute_dense_reward (line 85) | def compute_dense_reward(self, info, **kwargs):
method render (line 107) | def render(self, mode="human"):
method get_state (line 116) | def get_state(self) -> np.ndarray:
method set_state (line 120) | def set_state(self, state):
class LiftCubeEnv (line 126) | class LiftCubeEnv(PickCubeEnv):
method _initialize_task (line 131) | def _initialize_task(self):
method _get_obs_extra (line 135) | def _get_obs_extra(self) -> OrderedDict:
method check_obj_placed (line 146) | def check_obj_placed(self):
method compute_dense_reward (line 149) | def compute_dense_reward(self, info, **kwargs):
FILE: ManiSkill2/mani_skill2/envs/pick_and_place/pick_single.py
class PickSingleEnv (line 20) | class PickSingleEnv(StationaryManipulationEnv):
method __init__ (line 26) | def __init__(
method _check_assets (line 71) | def _check_assets(self):
method _load_actors (line 75) | def _load_actors(self):
method _load_model (line 81) | def _load_model(self):
method reset (line 85) | def reset(self, seed=None, reconfigure=False, model_id=None, model_sca...
method _set_model (line 91) | def _set_model(self, model_id, model_scale):
method _get_init_z (line 121) | def _get_init_z(self):
method _settle (line 124) | def _settle(self, t):
method _initialize_actors (line 129) | def _initialize_actors(self):
method obj_pose (line 172) | def obj_pose(self):
method _initialize_task (line 176) | def _initialize_task(self, max_trials=100):
method _get_obs_extra (line 196) | def _get_obs_extra(self) -> OrderedDict:
method check_robot_static (line 210) | def check_robot_static(self, thresh=0.2):
method evaluate (line 215) | def evaluate(self, **kwargs):
method compute_dense_reward (line 226) | def compute_dense_reward(self, info, **kwargs):
method compute_dense_reward_legacy (line 264) | def compute_dense_reward_legacy(self, info, **kwargs):
method render (line 377) | def render(self, mode="human"):
method get_state (line 386) | def get_state(self) -> np.ndarray:
method set_state (line 390) | def set_state(self, state):
function build_actor_ycb (line 398) | def build_actor_ycb(
class PickSingleYCBEnv (line 425) | class PickSingleYCBEnv(PickSingleEnv):
method _check_assets (line 429) | def _check_assets(self):
method _load_model (line 447) | def _load_model(self):
method _get_init_z (line 458) | def _get_init_z(self):
method _initialize_agent (line 462) | def _initialize_agent(self):
function build_actor_egad (line 472) | def build_actor_egad(
class PickSingleEGADEnv (line 503) | class PickSingleEGADEnv(PickSingleEnv):
method _check_assets (line 507) | def _check_assets(self):
method _load_model (line 523) | def _load_model(self):
method _get_init_z (line 541) | def _get_init_z(self):
method _initialize_actors (line 545) | def _initialize_actors(self):
FILE: ManiSkill2/mani_skill2/envs/pick_and_place/stack_cube.py
class UniformSampler (line 14) | class UniformSampler:
method __init__ (line 22) | def __init__(
method sample (line 30) | def sample(self, radius, max_trials, append=True, verbose=False):
class StackCubeEnv (line 63) | class StackCubeEnv(StationaryManipulationEnv):
method _get_default_scene_config (line 64) | def _get_default_scene_config(self):
method _load_actors (line 69) | def _load_actors(self):
method _initialize_actors (line 78) | def _initialize_actors(self):
method _get_obs_extra (line 95) | def _get_obs_extra(self):
method _check_cubeA_on_cubeB (line 109) | def _check_cubeA_on_cubeB(self):
method evaluate (line 119) | def evaluate(self, **kwargs):
method compute_dense_reward (line 134) | def compute_dense_reward(self, info, **kwargs):
FILE: ManiSkill2/mani_skill2/envs/sapien_env.py
class BaseEnv (line 34) | class BaseEnv(gym.Env):
method __init__ (line 76) | def __init__(
method seed (line 186) | def seed(self, seed=None):
method _configure_agent (line 196) | def _configure_agent(self):
method _configure_cameras (line 200) | def _configure_cameras(self):
method _register_cameras (line 209) | def _register_cameras(
method _configure_render_cameras (line 215) | def _configure_render_cameras(self):
method _register_render_cameras (line 218) | def _register_render_cameras(
method sim_freq (line 225) | def sim_freq(self):
method control_freq (line 229) | def control_freq(self):
method sim_timestep (line 233) | def sim_timestep(self):
method control_timestep (line 237) | def control_timestep(self):
method control_mode (line 241) | def control_mode(self):
method elapsed_steps (line 245) | def elapsed_steps(self):
method obs_mode (line 252) | def obs_mode(self):
method get_obs (line 255) | def get_obs(self):
method _get_obs_state_dict (line 269) | def _get_obs_state_dict(self):
method _get_obs_agent (line 276) | def _get_obs_agent(self):
method _get_obs_extra (line 280) | def _get_obs_extra(self):
method update_render (line 284) | def update_render(self):
method take_picture (line 289) | def take_picture(self):
method get_images (line 294) | def get_images(self) -> Dict[str, Dict[str, np.ndarray]]:
method get_camera_params (line 301) | def get_camera_params(self) -> Dict[str, Dict[str, np.ndarray]]:
method _get_obs_images (line 308) | def _get_obs_images(self) -> OrderedDict:
method robot_link_ids (line 324) | def robot_link_ids(self):
method reward_mode (line 332) | def reward_mode(self):
method get_reward (line 335) | def get_reward(self, **kwargs):
method compute_dense_reward (line 344) | def compute_dense_reward(self, **kwargs):
method reconfigure (line 350) | def reconfigure(self):
method _add_ground (line 372) | def _add_ground(self, altitude=0.0, render=True):
method _load_actors (line 387) | def _load_actors(self):
method _load_articulations (line 390) | def _load_articulations(self):
method _load_agent (line 393) | def _load_agent(self):
method _setup_cameras (line 396) | def _setup_cameras(self):
method _setup_lighting (line 422) | def _setup_lighting(self):
method _load_background (line 434) | def _load_background(self):
method reset (line 467) | def reset(self, seed=None, reconfigure=False):
method set_episode_rng (line 483) | def set_episode_rng(self, seed):
method initialize_episode (line 491) | def initialize_episode(self):
method _initialize_actors (line 500) | def _initialize_actors(self):
method _initialize_articulations (line 504) | def _initialize_articulations(self):
method _initialize_agent (line 508) | def _initialize_agent(self):
method _initialize_task (line 512) | def _initialize_task(self):
method _clear_sim_state (line 516) | def _clear_sim_state(self):
method step (line 531) | def step(self, action: Union[None, np.ndarray, Dict]):
method step_action (line 542) | def step_action(self, action):
method evaluate (line 560) | def evaluate(self, **kwargs) -> dict:
method get_done (line 564) | def get_done(self, info: dict, **kwargs):
method get_info (line 568) | def get_info(self, **kwargs):
method _before_control_step (line 573) | def _before_control_step(self):
method _after_simulation_step (line 576) | def _after_simulation_step(self):
method _get_default_scene_config (line 582) | def _get_default_scene_config(self):
method _setup_scene (line 596) | def _setup_scene(self, scene_config: Optional[sapien.SceneConfig] = No...
method _clear (line 605) | def _clear(self):
method close (line 615) | def close(self):
method _close_viewer (line 618) | def _close_viewer(self):
method get_actors (line 627) | def get_actors(self):
method get_articulations (line 630) | def get_articulations(self):
method get_sim_state (line 636) | def get_sim_state(self) -> np.ndarray:
method set_sim_state (line 645) | def set_sim_state(self, state: np.ndarray):
method get_state (line 657) | def get_state(self):
method set_state (line 661) | def set_state(self, state: np.ndarray):
method _setup_viewer (line 670) | def _setup_viewer(self):
method render (line 680) | def render(self, mode="human", **kwargs):
method gen_scene_pcd (line 718) | def gen_scene_pcd(self, num_points: int = int(1e5)) -> np.ndarray:
FILE: ManiSkill2/mani_skill2/evaluation/evaluator.py
class BaseEvaluator (line 13) | class BaseEvaluator:
method setup (line 19) | def setup(self, env_id: str, policy_cls: Type[BasePolicy], env_kwargs=...
method evaluate_episode (line 35) | def evaluate_episode(self, reset_kwargs, render_mode=None):
method evaluate_episodes (line 58) | def evaluate_episodes(self, episode_cfgs: List[dict], callback: Callab...
method close (line 84) | def close(self):
method generate_dummy_config (line 87) | def generate_dummy_config(self, env_id, num_episodes: int):
method merge_result (line 93) | def merge_result(self):
method export_to_csv (line 98) | def export_to_csv(self, path):
method submit (line 115) | def submit(self):
method error (line 118) | def error(self, *args, **kwargs):
FILE: ManiSkill2/mani_skill2/evaluation/run_evaluation.py
class Evaluator (line 11) | class Evaluator(BaseEvaluator):
method __init__ (line 14) | def __init__(self, output_dir: str, record_dir=None):
method setup (line 22) | def setup(self, *args, **kwargs):
method submit (line 27) | def submit(self):
method error (line 40) | def error(self, *args):
class TqdmCallback (line 44) | class TqdmCallback:
method __init__ (line 45) | def __init__(self, n: int):
method __call__ (line 49) | def __call__(self, i, metrics):
function parse_args (line 53) | def parse_args():
function main (line 89) | def main():
FILE: ManiSkill2/mani_skill2/evaluation/solution.py
class BasePolicy (line 5) | class BasePolicy:
method __init__ (line 6) | def __init__(
method reset (line 14) | def reset(self, observations):
method act (line 18) | def act(self, observations) -> np.ndarray:
method get_obs_mode (line 23) | def get_obs_mode(cls, env_id: str) -> str:
method get_control_mode (line 28) | def get_control_mode(cls, env_id) -> str:
class RandomPolicy (line 33) | class RandomPolicy(BasePolicy):
method act (line 34) | def act(self, observations):
method get_obs_mode (line 38) | def get_obs_mode(cls, env_id: str) -> str:
method get_control_mode (line 42) | def get_control_mode(cls, env_id: str) -> str:
FILE: ManiSkill2/mani_skill2/examples/demo_manual_control.py
function parse_args (line 20) | def parse_args():
function main (line 41) | def main():
FILE: ManiSkill2/mani_skill2/examples/demo_random_action.py
function parse_args (line 10) | def parse_args():
function main (line 30) | def main():
FILE: ManiSkill2/mani_skill2/examples/demo_vec_env.py
function parse_args (line 12) | def parse_args():
function main (line 34) | def main():
FILE: ManiSkill2/mani_skill2/sensors/camera.py
class CameraConfig (line 11) | class CameraConfig:
method __init__ (line 12) | def __init__(
method __repr__ (line 54) | def __repr__(self) -> str:
method pose (line 58) | def pose(self):
method pose (line 62) | def pose(self, pose: sapien.Pose):
function update_camera_cfgs_from_dict (line 67) | def update_camera_cfgs_from_dict(
function parse_camera_cfgs (line 104) | def parse_camera_cfgs(camera_cfgs):
class Camera (line 115) | class Camera:
method __init__ (line 120) | def __init__(
method uid (line 171) | def uid(self):
method take_picture (line 174) | def take_picture(self):
method get_images (line 177) | def get_images(self, take_picture=False):
method get_params (line 197) | def get_params(self):
method observation_space (line 206) | def observation_space(self) -> spaces.Dict:
FILE: ManiSkill2/mani_skill2/sensors/depth_camera.py
class StereoDepthCameraConfig (line 14) | class StereoDepthCameraConfig(CameraConfig):
method __init__ (line 15) | def __init__(self, *args, min_depth: float = 0.05, **kwargs):
method rgb_resolution (line 20) | def rgb_resolution(self):
method rgb_intrinsic (line 24) | def rgb_intrinsic(self):
method fromCameraConfig (line 29) | def fromCameraConfig(cls, cfg: CameraConfig):
class StereoDepthCamera (line 33) | class StereoDepthCamera(Camera):
method __init__ (line 34) | def __init__(
method get_images (line 81) | def get_images(self, take_picture=False):
method get_params (line 109) | def get_params(self):
method observation_space (line 118) | def observation_space(self) -> spaces.Dict:
FILE: ManiSkill2/mani_skill2/trajectory/merge_trajectory.py
function merge_h5 (line 9) | def merge_h5(output_path: str, traj_paths, recompute_id=True):
function main (line 62) | def main():
FILE: ManiSkill2/mani_skill2/trajectory/replay_trajectory.py
function qpos_to_pd_joint_delta_pos (line 31) | def qpos_to_pd_joint_delta_pos(controller: PDJointPosController, qpos):
function qpos_to_pd_joint_target_delta_pos (line 40) | def qpos_to_pd_joint_target_delta_pos(controller: PDJointPosController, ...
function qpos_to_pd_joint_vel (line 50) | def qpos_to_pd_joint_vel(controller: PDJointVelController, qpos):
function compact_axis_angle_from_quaternion (line 59) | def compact_axis_angle_from_quaternion(quat: np.ndarray) -> np.ndarray:
function delta_pose_to_pd_ee_delta (line 67) | def delta_pose_to_pd_ee_delta(
function from_pd_joint_pos_to_ee (line 85) | def from_pd_joint_pos_to_ee(
function from_pd_joint_pos (line 172) | def from_pd_joint_pos(
function from_pd_joint_delta_pos (line 241) | def from_pd_joint_delta_pos(
function parse_args (line 288) | def parse_args():
function _main (line 327) | def _main(args, proc_id: int = 0, num_procs=1, pbar=None):
function main (line 497) | def main():
FILE: ManiSkill2/mani_skill2/utils/bounding_cylinder.py
function make_circle (line 34) | def make_circle(points):
function _make_circle_one_point (line 48) | def _make_circle_one_point(points, p):
function _make_circle_two_points (line 60) | def _make_circle_two_points(points, p, q):
function make_diameter (line 93) | def make_diameter(a, b):
function make_circumcircle (line 101) | def make_circumcircle(a, b, c):
function is_in_circle (line 121) | def is_in_circle(c, p):
function _cross_product (line 126) | def _cross_product(x0, y0, x1, y1, x2, y2):
function aabc (line 130) | def aabc(points):
FILE: ManiSkill2/mani_skill2/utils/common.py
function merge_dicts (line 14) | def merge_dicts(ds: Sequence[Dict], asarray=False):
function normalize_vector (line 32) | def normalize_vector(x, eps=1e-6):
function compute_angle_between (line 39) | def compute_angle_between(x1, x2):
class np_random (line 46) | class np_random:
method __init__ (line 49) | def __init__(self, seed):
method __enter__ (line 53) | def __enter__(self):
method __exit__ (line 58) | def __exit__(self, exc_type, exc_val, exc_tb):
function random_choice (line 62) | def random_choice(x: Sequence, rng: np.random.RandomState = np.random):
function get_dtype_bounds (line 70) | def get_dtype_bounds(dtype: np.dtype):
function convert_observation_to_space (line 86) | def convert_observation_to_space(observation, prefix=""):
function normalize_action_space (line 121) | def normalize_action_space(action_space: spaces.Box):
function clip_and_scale_action (line 126) | def clip_and_scale_action(action, low, high):
function inv_clip_and_scale_action (line 133) | def inv_clip_and_scale_action(action, low, high):
function inv_scale_action (line 140) | def inv_scale_action(action, low, high):
function flatten_state_dict (line 146) | def flatten_state_dict(state_dict: dict) -> np.ndarray:
function flatten_dict_keys (line 191) | def flatten_dict_keys(d: dict, prefix=""):
function extract_scalars_from_info (line 202) | def extract_scalars_from_info(info: dict, blacklist=()) -> Dict[str, flo...
function flatten_dict_space_keys (line 234) | def flatten_dict_space_keys(space: spaces.Dict, prefix="") -> spaces.Dict:
FILE: ManiSkill2/mani_skill2/utils/download_asset.py
function initialize_sources (line 25) | def initialize_sources():
function initialize_extra_sources (line 107) | def initialize_extra_sources():
function prompt_yes_no (line 129) | def prompt_yes_no(message):
function sha256sum (line 144) | def sha256sum(filename, chunk_size=4096):
function download (line 157) | def download(
function parse_args (line 231) | def parse_args():
function main (line 248) | def main():
FILE: ManiSkill2/mani_skill2/utils/download_demo.py
function parse_args (line 98) | def parse_args():
function main (line 115) | def main():
FILE: ManiSkill2/mani_skill2/utils/geometry.py
function sample_on_unit_sphere (line 10) | def sample_on_unit_sphere(rng):
function sample_on_unit_circle (line 24) | def sample_on_unit_circle(rng):
function rotation_between_vec (line 34) | def rotation_between_vec(a, b): # from a to b
function angle_between_vec (line 44) | def angle_between_vec(a, b): # from a to b
function wxyz_to_xyzw (line 51) | def wxyz_to_xyzw(q):
function xyzw_to_wxyz (line 55) | def xyzw_to_wxyz(q):
function rotate_2d_vec_by_angle (line 59) | def rotate_2d_vec_by_angle(vec, theta):
function angle_distance (line 66) | def angle_distance(q0: sapien.Pose, q1: sapien.Pose):
function get_axis_aligned_bbox_for_articulation (line 71) | def get_axis_aligned_bbox_for_articulation(art: Articulation):
function get_axis_aligned_bbox_for_actor (line 86) | def get_axis_aligned_bbox_for_actor(actor: Actor):
function get_local_axis_aligned_bbox_for_link (line 101) | def get_local_axis_aligned_bbox_for_link(link: Link):
function get_local_aabc_for_actor (line 114) | def get_local_aabc_for_actor(actor):
function transform_points (line 126) | def transform_points(H: np.ndarray, pts: np.ndarray) -> np.ndarray:
function invert_transform (line 132) | def invert_transform(H: np.ndarray):
function get_oriented_bounding_box_for_2d_points (line 141) | def get_oriented_bounding_box_for_2d_points(
FILE: ManiSkill2/mani_skill2/utils/io_utils.py
class CustomJsonEncoder (line 9) | class CustomJsonEncoder(json.JSONEncoder):
method default (line 12) | def default(self, obj):
function load_json (line 26) | def load_json(filename: Union[str, Path]):
function dump_json (line 39) | def dump_json(filename: Union[str, Path], obj, **kwargs):
function write_txt (line 51) | def write_txt(filename: Union[str, Path], content: Union[str, Sequence[s...
FILE: ManiSkill2/mani_skill2/utils/logging_utils.py
function colorize (line 18) | def colorize(
class CustomFormatter (line 41) | class CustomFormatter(logging.Formatter):
method format (line 44) | def format(self, record):
FILE: ManiSkill2/mani_skill2/utils/registration.py
class EnvSpec (line 17) | class EnvSpec:
method __init__ (line 18) | def __init__(
method make (line 31) | def make(self, **kwargs):
method gym_spec (line 37) | def gym_spec(self):
function register (line 51) | def register(
function make (line 64) | def make(env_id, as_gym=True, enable_segmentation=False, **kwargs):
function register_env (line 119) | def register_env(uid: str, max_episode_steps=None, override=False, **kwa...
FILE: ManiSkill2/mani_skill2/utils/sapien_utils.py
function normalize_vector (line 11) | def normalize_vector(x, eps=1e-6):
function vectorize_pose (line 21) | def vectorize_pose(pose: sapien.Pose):
function set_actor_visibility (line 25) | def set_actor_visibility(actor: sapien.Actor, visibility):
function set_default_physical_material (line 31) | def set_default_physical_material(
function get_entity_by_name (line 55) | def get_entity_by_name(entities, name: str, is_unique=True):
function check_urdf_config (line 83) | def check_urdf_config(urdf_config: dict):
function parse_urdf_config (line 106) | def parse_urdf_config(config_dict: dict, scene: sapien.Scene) -> Dict:
function get_actor_state (line 139) | def get_actor_state(actor: sapien.Actor):
function set_actor_state (line 150) | def set_actor_state(actor: sapien.Actor, state: np.ndarray):
function get_articulation_state (line 158) | def get_articulation_state(articulation: sapien.Articulation):
function set_articulation_state (line 168) | def set_articulation_state(articulation: sapien.Articulation, state: np....
function get_articulation_padded_state (line 177) | def get_articulation_padded_state(articulation: sapien.Articulation, max...
function get_pairwise_contacts (line 192) | def get_pairwise_contacts(
function compute_total_impulse (line 204) | def compute_total_impulse(contact_infos: List[Tuple[sapien.Contact, bool...
function get_pairwise_contact_impulse (line 213) | def get_pairwise_contact_impulse(
function get_actor_contacts (line 221) | def get_actor_contacts(
function get_articulation_contacts (line 233) | def get_articulation_contacts(
function compute_max_impulse_norm (line 263) | def compute_max_impulse_norm(contact_infos: List[Tuple[sapien.Contact, b...
function get_articulation_max_impulse_norm (line 273) | def get_articulation_max_impulse_norm(
function sapien_pose_to_opencv_extrinsic (line 288) | def sapien_pose_to_opencv_extrinsic(sapien_pose_matrix: np.ndarray) -> n...
function look_at (line 303) | def look_at(eye, target, up=(0, 0, 1)) -> sapien.Pose:
function hex2rgba (line 328) | def hex2rgba(h, correction=True):
function set_render_material (line 338) | def set_render_material(material: sapien.RenderMaterial, **kwargs):
function set_articulation_render_material (line 347) | def set_articulation_render_material(articulation: sapien.Articulation, ...
function check_joint_stuck (line 359) | def check_joint_stuck(
function check_actor_static (line 375) | def check_actor_static(actor: sapien.Actor, lin_thresh=1e-3, ang_thresh=...
FILE: ManiSkill2/mani_skill2/utils/trimesh_utils.py
function get_actor_meshes (line 8) | def get_actor_meshes(actor: sapien.ActorBase):
function get_visual_body_meshes (line 37) | def get_visual_body_meshes(visual_body: sapien.RenderBody):
function get_actor_visual_meshes (line 48) | def get_actor_visual_meshes(actor: sapien.ActorBase):
function merge_meshes (line 56) | def merge_meshes(meshes: List[trimesh.Trimesh]):
function get_actor_mesh (line 69) | def get_actor_mesh(actor: sapien.ActorBase, to_world_frame=True):
function get_actor_visual_mesh (line 79) | def get_actor_visual_mesh(actor: sapien.ActorBase):
function get_articulation_meshes (line 86) | def get_articulation_meshes(
FILE: ManiSkill2/mani_skill2/utils/visualization/cv2_utils.py
function images_to_video (line 9) | def images_to_video(
class OpenCVViewer (line 38) | class OpenCVViewer:
method __init__ (line 39) | def __init__(self, name="OpenCVViewer", is_rgb=True, exit_on_esc=True):
method imshow (line 45) | def imshow(self, image: np.ndarray, is_rgb=None, non_blocking=False, d...
method close (line 70) | def close(self):
method __del__ (line 73) | def __del__(self):
FILE: ManiSkill2/mani_skill2/utils/visualization/jupyter_utils.py
function display_images (line 9) | def display_images(images: List[np.ndarray], dpi=100.0, format="html5_vi...
FILE: ManiSkill2/mani_skill2/utils/visualization/misc.py
function images_to_video (line 10) | def images_to_video(
function normalize_depth (line 51) | def normalize_depth(depth, min_depth=0, max_depth=None):
function observations_to_images (line 61) | def observations_to_images(observations, max_depth=None) -> List[np.ndar...
function tile_images (line 96) | def tile_images(images: List[np.ndarray]) -> np.ndarray:
function put_text_on_image (line 132) | def put_text_on_image(image: np.ndarray, lines: List[str]):
function append_text_to_image (line 158) | def append_text_to_image(image: np.ndarray, lines: List[str]):
function put_info_on_image (line 196) | def put_info_on_image(image, info: Dict[str, float], extras=None, overla...
FILE: ManiSkill2/mani_skill2/utils/wrappers/common.py
class NormalizeBoxActionWrapper (line 11) | class NormalizeBoxActionWrapper(gym.ActionWrapper):
method __init__ (line 14) | def __init__(self, env):
method action (line 19) | def action(self, action):
method reverse_action (line 24) | def reverse_action(self, action):
class ResetSeedWrapper (line 30) | class ResetSeedWrapper(gym.Wrapper):
method __init__ (line 35) | def __init__(self, env, reset_seed: int) -> None:
method reset (line 39) | def reset(self, **kwargs):
FILE: ManiSkill2/mani_skill2/utils/wrappers/observation.py
class RGBDObservationWrapper (line 16) | class RGBDObservationWrapper(gym.ObservationWrapper):
method __init__ (line 19) | def __init__(self, env):
method update_observation_space (line 25) | def update_observation_space(space: spaces.Dict):
method observation (line 46) | def observation(self, observation: dict):
function merge_dict_spaces (line 64) | def merge_dict_spaces(dict_spaces: Sequence[spaces.Dict]):
class PointCloudObservationWrapper (line 79) | class PointCloudObservationWrapper(gym.ObservationWrapper):
method __init__ (line 82) | def __init__(self, env):
method update_observation_space (line 89) | def update_observation_space(space: spaces.Dict):
method observation (line 119) | def observation(self, observation: dict):
class RobotSegmentationObservationWrapper (line 157) | class RobotSegmentationObservationWrapper(gym.ObservationWrapper):
method __init__ (line 160) | def __init__(self, env, replace=True):
method init_observation_space (line 169) | def init_observation_space(space: spaces.Dict, replace: bool):
method reset (line 195) | def reset(self, **kwargs):
method observation_image (line 200) | def observation_image(self, observation: dict):
method observation_pointcloud (line 212) | def observation_pointcloud(self, observation: dict):
method observation (line 223) | def observation(self, observation: dict):
class FlattenObservationWrapper (line 231) | class FlattenObservationWrapper(gym.ObservationWrapper):
method __init__ (line 232) | def __init__(self, env) -> None:
method observation (line 236) | def observation(self, observation):
FILE: ManiSkill2/mani_skill2/utils/wrappers/record.py
function parse_env_info (line 17) | def parse_env_info(env: gym.Env):
function clean_trajectories (line 35) | def clean_trajectories(h5_file: h5py.File, json_dict: dict, prune_empty_...
class RecordEpisode (line 77) | class RecordEpisode(gym.Wrapper):
method __init__ (line 94) | def __init__(
method reset (line 148) | def reset(self, **kwargs):
method step (line 182) | def step(self, action):
method flush_trajectory (line 208) | def flush_trajectory(self, verbose=False, ignore_empty_transition=False):
method flush_video (line 300) | def flush_video(self, suffix="", verbose=False, ignore_empty_transitio...
method close (line 317) | def close(self) -> None:
FILE: ManiSkill2/mani_skill2/utils/wrappers/sb3.py
class ContinuousTaskWrapper (line 3) | class ContinuousTaskWrapper(gym.Wrapper):
method __init__ (line 4) | def __init__(self, env, max_episode_steps: int) -> None:
method reset (line 9) | def reset(self):
method step (line 13) | def step(self, action):
class SuccessInfoWrapper (line 26) | class SuccessInfoWrapper(gym.Wrapper):
method step (line 27) | def step(self, action):
FILE: ManiSkill2/mani_skill2/vector/registration.py
function _make_env (line 10) | def _make_env(env_spec, wrappers: Sequence[gym.Wrapper] = None, **kwargs):
function make (line 26) | def make(
FILE: ManiSkill2/mani_skill2/vector/vec_env.py
function find_available_port (line 30) | def find_available_port():
function _worker (line 41) | def _worker(
class VecEnv (line 89) | class VecEnv:
method __init__ (line 124) | def __init__(
method _update_np_buffer (line 222) | def _update_np_buffer(self, obs_list, indices=None):
method _get_torch_observations (line 231) | def _get_torch_observations(self):
method seed (line 255) | def seed(self, seed: Optional[int] = None) -> List[Union[None, int]]:
method reset_async (line 262) | def reset_async(self, indices=None):
method reset_wait (line 268) | def reset_wait(self, indices=None):
method reset (line 277) | def reset(self, indices=None):
method step_async (line 281) | def step_async(self, actions: np.ndarray) -> None:
method step_wait (line 286) | def step_wait(self):
method step (line 295) | def step(self, actions):
method close (line 299) | def close(self) -> None:
method render (line 311) | def render(self, mode=""):
method get_attr (line 314) | def get_attr(self, attr_name: str, indices=None) -> List:
method set_attr (line 321) | def set_attr(self, attr_name: str, value, indices=None) -> None:
method env_method (line 329) | def env_method(
method env_is_wrapped (line 342) | def env_is_wrapped(
method unwrapped (line 352) | def unwrapped(self) -> "VecEnv":
method _get_indices (line 358) | def _get_indices(self, indices) -> List[int]:
method _get_target_remotes (line 371) | def _get_target_remotes(self, indices) -> List[Connection]:
method __repr__ (line 382) | def __repr__(self):
function stack_observation_space (line 388) | def stack_observation_space(space: spaces.Space, n: int):
function create_np_buffer (line 406) | def create_np_buffer(space: spaces.Space, n: int):
function stack_obs (line 419) | def stack_obs(obs: Sequence, space: spaces.Space, buffer: Optional[np.nd...
class RGBDVecEnv (line 433) | class RGBDVecEnv(VecEnv):
method __init__ (line 434) | def __init__(self, *args, **kwargs):
method _get_torch_observations (line 441) | def _get_torch_observations(self):
class PointCloudVecEnv (line 461) | class PointCloudVecEnv(VecEnv):
method __init__ (line 462) | def __init__(self, *args, **kwargs):
method _get_torch_observations (line 470) | def _get_torch_observations(self):
method observation (line 502) | def observation(self, observation: dict):
method reset_wait (line 531) | def reset_wait(self, *args, **kargs):
method step_wait (line 535) | def step_wait(self):
class VecEnvWrapper (line 540) | class VecEnvWrapper(VecEnv):
method __init__ (line 541) | def __init__(self, venv: VecEnv):
method seed (line 547) | def seed(self, seed: Optional[int] = None):
method reset_async (line 550) | def reset_async(self, *args, **kwargs):
method reset_wait (line 553) | def reset_wait(self, *args, **kwargs):
method step_async (line 556) | def step_async(self, actions: np.ndarray):
method step_wait (line 559) | def step_wait(self):
method close (line 562) | def close(self):
method render (line 565) | def render(self, mode=""):
method get_attr (line 568) | def get_attr(self, attr_name: str, indices=None) -> List:
method set_attr (line 571) | def set_attr(self, attr_name: str, value, indices=None) -> None:
method env_method (line 574) | def env_method(
method env_is_wrapped (line 585) | def env_is_wrapped(
method __getattr__ (line 590) | def __getattr__(self, name):
class VecEnvObservationWrapper (line 597) | class VecEnvObservationWrapper(VecEnvWrapper):
method reset_wait (line 598) | def reset_wait(self, **kwargs):
method step_wait (line 602) | def step_wait(self):
method observation (line 606) | def observation(self, observation):
FILE: ManiSkill2/mani_skill2/vector/wrappers/observation.py
function batch_isin (line 8) | def batch_isin(x: torch.Tensor, inds: torch.Tensor):
class VecRobotSegmentationObservationWrapper (line 38) | class VecRobotSegmentationObservationWrapper(VecEnvObservationWrapper):
method __init__ (line 41) | def __init__(self, venv: VecEnv, replace=True):
method update_robot_link_ids (line 62) | def update_robot_link_ids(self, indices=None):
method observation_image (line 69) | def observation_image(self, observation: dict):
method observation_pointcloud (line 82) | def observation_pointcloud(self, observation: dict):
method observation (line 94) | def observation(self, observation: dict):
method reset_wait (line 101) | def reset_wait(self, indices=None, **kwargs):
FILE: ManiSkill2/mani_skill2/vector/wrappers/sb3.py
function select_index_from_dict (line 15) | def select_index_from_dict(data: dict, i: int):
class SB3VecEnvWrapper (line 25) | class SB3VecEnvWrapper(SB3VecEnv):
method __init__ (line 28) | def __init__(self, venv: VecEnv):
method seed (line 32) | def seed(self, seed: Optional[int] = None) -> List[Union[None, int]]:
method reset (line 35) | def reset(self) -> VecEnvObs:
method step_async (line 38) | def step_async(self, actions: np.ndarray) -> None:
method step_wait (line 41) | def step_wait(self) -> VecEnvStepReturn:
method close (line 56) | def close(self) -> None:
method get_attr (line 59) | def get_attr(self, attr_name: str, indices: VecEnvIndices = None) -> L...
method set_attr (line 62) | def set_attr(
method env_method (line 67) | def env_method(
method env_is_wrapped (line 78) | def env_is_wrapped(
FILE: ManiSkill2/setup.py
function read_requirements (line 8) | def read_requirements():
FILE: ManiSkill2/tests/manual_test_venv.py
function make_env (line 12) | def make_env(env_id, obs_mode):
function test_obs_mode (line 21) | def test_obs_mode(obs_mode="image"):
FILE: ManiSkill2/tests/test_envs.py
function test_envs (line 26) | def test_envs(env_id):
FILE: ManiSkill2/warp_maniskill/build_lib.py
function build (line 23) | def build(args):
FILE: ManiSkill2/warp_maniskill/mpm/height_rasterizer.py
function rasterize_clear_kernel (line 6) | def rasterize_clear_kernel(output: wp.array(dtype=int, ndim=2), value: i...
function rasterize_kernel (line 12) | def rasterize_kernel(
FILE: ManiSkill2/warp_maniskill/mpm/mpm_integrator.py
function PK1_to_cauchy (line 15) | def PK1_to_cauchy(P: wp.mat33, F: wp.mat33, J: float):
function compute_von_mises (line 20) | def compute_von_mises(
function compute_drucker_prager (line 48) | def compute_drucker_prager(
function zero_everything (line 99) | def zero_everything(
function compute_grid_bound (line 142) | def compute_grid_bound(model: MPMModelStruct, state: MPMStateStruct):
function set_grid_bound (line 167) | def set_grid_bound(model: MPMModelStruct, state: MPMStateStruct):
function p2g (line 179) | def p2g(
function g2p (line 288) | def g2p(
function rigid_contact (line 365) | def rigid_contact(
function grid_op (line 449) | def grid_op(model: MPMModelStruct, state: MPMStateStruct, dt: float):
function grid_op_with_contact (line 501) | def grid_op_with_contact(
function create_soft_contacts (line 621) | def create_soft_contacts(
function eval_soft_contacts (line 742) | def eval_soft_contacts(
FILE: ManiSkill2/warp_maniskill/mpm/mpm_model.py
class MPMModelStruct (line 9) | class MPMModelStruct:
class MPMStateStruct (line 40) | class MPMStateStruct:
class MPMState (line 59) | class MPMState:
method __init__ (line 60) | def __init__(self, model):
method clear_forces (line 64) | def clear_forces(self):
class MPMModel (line 70) | class MPMModel(Model):
method __init__ (line 71) | def __init__(self, device):
method state (line 94) | def state(self, requires_grad=False) -> MPMState:
class MPMModelBuilder (line 217) | class MPMModelBuilder(ModelBuilder):
method __init__ (line 218) | def __init__(self):
method set_mpm_domain (line 232) | def set_mpm_domain(self, domain_size, grid_length=0.01):
method add_mpm_cylinder (line 237) | def add_mpm_cylinder(
method add_mpm_from_height_map (line 284) | def add_mpm_from_height_map(
method add_mpm_grid (line 333) | def add_mpm_grid(
method add_mpm_particle (line 408) | def add_mpm_particle(
method clear_particles (line 431) | def clear_particles(self):
method reserve_mpm_particles (line 441) | def reserve_mpm_particles(self, count):
method finalize (line 453) | def finalize(self, device: str) -> MPMModel:
method init_model_state (line 512) | def init_model_state(self, model: MPMModel, states):
function mpm_collide (line 555) | def mpm_collide(model: MPMModel, state: MPMState):
FILE: ManiSkill2/warp_maniskill/mpm/mpm_simulator.py
class Simulator (line 20) | class Simulator:
method __init__ (line 21) | def __init__(self, device="cuda"):
method simulate (line 24) | def simulate(
class App (line 174) | class App:
method __init__ (line 175) | def __init__(self, stage=None):
method update (line 336) | def update(self):
method render (line 352) | def render(self):
FILE: ManiSkill2/warp_maniskill/warp/build.py
function run_cmd (line 22) | def run_cmd(cmd, capture=False):
function set_msvc_compiler (line 35) | def set_msvc_compiler(msvc_path, sdk_path):
function find_host_compiler (line 57) | def find_host_compiler():
function find_cuda (line 113) | def find_cuda():
function build_cuda (line 130) | def build_cuda(cu_path, arch, ptx_path, config="release", force=False, v...
function load_cuda (line 144) | def load_cuda(ptx_path):
function quote (line 150) | def quote(path):
function build_dll (line 153) | def build_dll(cpp_path, cu_path, dll_path, config="release", verify_fp=F...
function load_dll (line 311) | def load_dll(dll_path):
function unload_dll (line 319) | def unload_dll(dll):
function force_unload_dll (line 341) | def force_unload_dll(dll_path):
function init_kernel_cache (line 356) | def init_kernel_cache(path=None):
function clear_kernel_cache (line 395) | def clear_kernel_cache():
FILE: ManiSkill2/warp_maniskill/warp/builtins.py
function load_value_func (line 581) | def load_value_func(args):
function view_value_func (line 603) | def view_value_func(args):
function store_value_func (line 627) | def store_value_func(args):
function atomic_op_value_type (line 658) | def atomic_op_value_type(args):
FILE: ManiSkill2/warp_maniskill/warp/codegen.py
class StructInstance (line 57) | class StructInstance:
method __init__ (line 58) | def __init__(self, struct: Struct):
method __setattr__ (line 62) | def __setattr__(self, name, value):
method __repr__ (line 78) | def __repr__(self):
class Struct (line 86) | class Struct:
method __init__ (line 87) | def __init__(self, cls, key, module):
method __call__ (line 117) | def __call__(self):
class Var (line 138) | class Var:
method __init__ (line 139) | def __init__(self, label, type, requires_grad=False, constant=None):
method __str__ (line 152) | def __str__(self):
method ctype (line 155) | def ctype(self):
class Block (line 170) | class Block:
method __init__ (line 172) | def __init__(self):
class Adjoint (line 184) | class Adjoint:
method __init__ (line 187) | def __init__(adj, func):
method build (line 225) | def build(adj, builder):
method format_template (line 257) | def format_template(adj, template, input_vars, output_var):
method format_args (line 266) | def format_args(adj, prefix, args):
method indent (line 286) | def indent(adj):
method dedent (line 289) | def dedent(adj):
method begin_block (line 293) | def begin_block(adj):
method end_block (line 303) | def end_block(adj):
method add_var (line 306) | def add_var(adj, type=None, constant=None):
method add_forward (line 319) | def add_forward(adj, statement, replay=None, skip_replay=False):
method add_reverse (line 333) | def add_reverse(adj, statement):
method add_constant (line 338) | def add_constant(adj, n):
method add_load (line 343) | def add_load(adj, input):
method add_comp (line 352) | def add_comp(adj, op_strings, left, comps):
method add_bool_op (line 365) | def add_bool_op(adj, op_string, exprs):
method add_call (line 372) | def add_call(adj, func, inputs, min_outputs=None):
method add_return (line 502) | def add_return(adj, var):
method begin_if (line 521) | def begin_if(adj, cond):
method end_if (line 528) | def end_if(adj, cond):
method begin_else (line 535) | def begin_else(adj, cond):
method end_else (line 542) | def end_else(adj, cond):
method begin_for (line 551) | def begin_for(adj, iter):
method end_for (line 568) | def end_for(adj, iter):
method begin_while (line 616) | def begin_while(adj, cond):
method end_while (line 632) | def end_while(adj):
method eval (line 678) | def eval(adj, node):
method resolve_path (line 1275) | def resolve_path(adj, node):
method set_lineno (line 1290) | def set_lineno(adj, lineno):
function constant_str (line 1487) | def constant_str(value):
function indent (line 1506) | def indent(args, stops=1):
function make_func_name (line 1515) | def make_func_name(func):
function codegen_struct (line 1518) | def codegen_struct(struct, indent=4):
function codegen_func_forward_body (line 1532) | def codegen_func_forward_body(adj, device='cpu', indent=4):
function codegen_func_forward (line 1542) | def codegen_func_forward(adj, func_type='kernel', device='cpu'):
function codegen_func_reverse_body (line 1572) | def codegen_func_reverse_body(adj, device='cpu', indent=4):
function codegen_func_reverse (line 1595) | def codegen_func_reverse(adj, func_type='kernel', device='cpu'):
function codegen_func (line 1628) | def codegen_func(adj, device='cpu'):
function codegen_kernel (line 1684) | def codegen_kernel(kernel, device='cpu'):
function codegen_module (line 1721) | def codegen_module(kernel, device='cpu'):
FILE: ManiSkill2/warp_maniskill/warp/context.py
class Function (line 30) | class Function:
method __init__ (line 32) | def __init__(self,
method __call__ (line 95) | def __call__(self, *args, **kwargs):
method is_builtin (line 195) | def is_builtin(self):
method is_simple (line 198) | def is_simple(self):
method mangle (line 222) | def mangle(self):
method add_overload (line 234) | def add_overload(self, f):
class Kernel (line 238) | class Kernel:
method __init__ (line 240) | def __init__(self, func, key, module, cls=None):
method input_types (line 260) | def input_types(self):
method hook (line 267) | def hook(self):
function func (line 292) | def func(f):
function kernel (line 309) | def kernel(f):
function struct (line 317) | def struct(c):
function add_builtin (line 328) | def add_builtin(key, input_types={}, value_type=None, value_func=None, d...
function get_module (line 367) | def get_module(m):
class ModuleBuilder (line 375) | class ModuleBuilder:
method __init__ (line 377) | def __init__(self, module, options):
method build_struct (line 392) | def build_struct(self, struct):
method build_kernel (line 395) | def build_kernel(self, kernel):
method build_function (line 399) | def build_function(self, func):
method codegen_cpu (line 426) | def codegen_cpu(self):
method codegen_cuda (line 453) | def codegen_cuda(self):
class Module (line 483) | class Module:
method __init__ (line 485) | def __init__(self, name):
method register_struct (line 502) | def register_struct(self, struct):
method register_kernel (line 505) | def register_kernel(self, kernel):
method register_function (line 522) | def register_function(self, func):
method hash_module (line 526) | def hash_module(self):
method load (line 566) | def load(self, device):
class Allocator (line 712) | class Allocator:
method __init__ (line 714) | def __init__(self, alloc_func, free_func):
method __del__ (line 723) | def __del__(self):
method alloc (line 726) | def alloc(self, size_in_bytes):
method free (line 736) | def free(self, addr, size_in_bytes):
method print (line 747) | def print(self):
method clear (line 758) | def clear(self):
class Runtime (line 765) | class Runtime:
method __init__ (line 767) | def __init__(self):
method verify_device (line 912) | def verify_device(self):
function is_cpu_available (line 927) | def is_cpu_available():
function is_cuda_available (line 936) | def is_cuda_available():
function is_device_available (line 939) | def is_device_available(device):
function get_devices (line 942) | def get_devices():
function get_preferred_device (line 953) | def get_preferred_device():
function zeros (line 964) | def zeros(shape: Tuple=None, dtype=float, device: str="cpu", requires_gr...
function zeros_like (line 1014) | def zeros_like(src: warp.array) -> warp.array:
function clone (line 1027) | def clone(src: warp.array) -> warp.array:
function empty (line 1042) | def empty(shape: Tuple=None, dtype=float, device:str="cpu", requires_gra...
function empty_like (line 1058) | def empty_like(src: warp.array, requires_grad:bool=False) -> warp.array:
function from_numpy (line 1072) | def from_numpy(arr, dtype, device="cpu", requires_grad=False):
function launch (line 1077) | def launch(kernel, dim: Tuple[int], inputs:List, outputs:List=[], adj_in...
function synchronize (line 1232) | def synchronize():
function force_load (line 1244) | def force_load():
function set_module_options (line 1254) | def set_module_options(options: Dict[str, Any]):
function get_module_options (line 1273) | def get_module_options() -> Dict[str, Any]:
function capture_begin (line 1282) | def capture_begin():
function capture_end (line 1299) | def capture_end()->int:
function capture_launch (line 1313) | def capture_launch(graph: int):
function copy (line 1323) | def copy(dest: warp.array, src: warp.array, dest_offset: int = 0, src_of...
function type_str (line 1378) | def type_str(t):
function print_function (line 1392) | def print_function(f, file):
function print_builtins (line 1419) | def print_builtins(file):
function export_stubs (line 1468) | def export_stubs(file):
function export_builtins (line 1520) | def export_builtins(file):
function init (line 1568) | def init():
FILE: ManiSkill2/warp_maniskill/warp/distance.py
class chamfer_distance (line 4) | class chamfer_distance:
function compute_chamfer_distance (line 145) | def compute_chamfer_distance(xyz1, n1, xyz2, n2, dist1, dist2, index1, i...
FILE: ManiSkill2/warp_maniskill/warp/native/array.h
function namespace (line 5) | namespace wp
FILE: ManiSkill2/warp_maniskill/warp/native/builtin.h
function namespace (line 42) | namespace wp
type half (line 100) | typedef half float16;
function CUDA_CALLABLE (line 104) | CUDA_CALLABLE inline half float_to_half(float x)
function CUDA_CALLABLE (line 116) | CUDA_CALLABLE inline float half_to_float(half x)
function half (line 131) | inline half float_to_half(float x)
function half_to_float (line 180) | inline float half_to_float(half h)
function CUDA_CALLABLE (line 219) | inline CUDA_CALLABLE bool isnan(float x) { return ::isnan(x); }
function CUDA_CALLABLE (line 269) | inline CUDA_CALLABLE int max(int a, int b) { return a>b?a:b; }
function CUDA_CALLABLE (line 270) | inline CUDA_CALLABLE int abs(int x) { return ::abs(x); }
function CUDA_CALLABLE (line 271) | inline CUDA_CALLABLE int sign(int x) { return x < 0 ? -1 : 1; }
function CUDA_CALLABLE (line 272) | inline CUDA_CALLABLE int clamp(int x, int a, int b) { return min(max(a, ...
function CUDA_CALLABLE (line 273) | inline CUDA_CALLABLE int floordiv(int a, int b) { return a/b; }
function CUDA_CALLABLE (line 276) | inline CUDA_CALLABLE void adj_mul(int a, int b, int& adj_a, int& adj_b, ...
function CUDA_CALLABLE (line 277) | inline CUDA_CALLABLE void adj_div(int a, int b, int& adj_a, int& adj_b, ...
function CUDA_CALLABLE (line 278) | inline CUDA_CALLABLE void adj_add(int a, int b, int& adj_a, int& adj_b, ...
function CUDA_CALLABLE (line 279) | inline CUDA_CALLABLE void adj_sub(int a, int b, int& adj_a, int& adj_b, ...
function CUDA_CALLABLE (line 280) | inline CUDA_CALLABLE void adj_mod(int a, int b, int& adj_a, int& adj_b, ...
function CUDA_CALLABLE (line 281) | inline CUDA_CALLABLE void adj_min(int a, int b, int& adj_a, int& adj_b, ...
function CUDA_CALLABLE (line 282) | inline CUDA_CALLABLE void adj_max(int a, int b, int& adj_a, int& adj_b, ...
function CUDA_CALLABLE (line 283) | inline CUDA_CALLABLE void adj_abs(int x, int adj_x, int& adj_ret) { }
function CUDA_CALLABLE (line 284) | inline CUDA_CALLABLE void adj_sign(int x, int adj_x, int& adj_ret) { }
function CUDA_CALLABLE (line 285) | inline CUDA_CALLABLE void adj_clamp(int x, int a, int b, int& adj_x, int...
function CUDA_CALLABLE (line 286) | inline CUDA_CALLABLE void adj_floordiv(int a, int b, int& adj_a, int& ad...
function CUDA_CALLABLE (line 289) | inline CUDA_CALLABLE float mul(float a, float b) { return a*b; }
function CUDA_CALLABLE (line 290) | inline CUDA_CALLABLE float div(float a, float b)
function CUDA_CALLABLE (line 301) | inline CUDA_CALLABLE float add(float a, float b) { return a+b; }
function CUDA_CALLABLE (line 302) | inline CUDA_CALLABLE float sub(float a, float b) { return a-b; }
function CUDA_CALLABLE (line 303) | inline CUDA_CALLABLE float min(float a, float b) { return a<b?a:b; }
function CUDA_CALLABLE (line 304) | inline CUDA_CALLABLE float max(float a, float b) { return a>b?a:b; }
function CUDA_CALLABLE (line 305) | inline CUDA_CALLABLE float mod(float a, float b)
function CUDA_CALLABLE (line 316) | inline CUDA_CALLABLE float log(float a)
function CUDA_CALLABLE (line 328) | inline CUDA_CALLABLE float log2(float a)
function CUDA_CALLABLE (line 340) | inline CUDA_CALLABLE float log10(float a)
function CUDA_CALLABLE (line 354) | inline CUDA_CALLABLE float exp(float a)
function CUDA_CALLABLE (line 366) | inline CUDA_CALLABLE float pow(float a, float b)
function CUDA_CALLABLE (line 378) | inline CUDA_CALLABLE float floordiv(float a, float b)
function CUDA_CALLABLE (line 390) | inline CUDA_CALLABLE float leaky_min(float a, float b, float r) { return...
function CUDA_CALLABLE (line 391) | inline CUDA_CALLABLE float leaky_max(float a, float b, float r) { return...
function CUDA_CALLABLE (line 392) | inline CUDA_CALLABLE float clamp(float x, float a, float b) { return min...
function CUDA_CALLABLE (line 393) | inline CUDA_CALLABLE float step(float x) { return x < 0.0f ? 1.0f : 0.0f; }
function CUDA_CALLABLE (line 394) | inline CUDA_CALLABLE float sign(float x) { return x < 0.0f ? -1.0f : 1.0...
function CUDA_CALLABLE (line 395) | inline CUDA_CALLABLE float abs(float x) { return ::fabs(x); }
function CUDA_CALLABLE (line 396) | inline CUDA_CALLABLE float nonzero(float x) { return x == 0.0f ? 0.0f : ...
function CUDA_CALLABLE (line 398) | inline CUDA_CALLABLE float acos(float x)
function CUDA_CALLABLE (line 402) | inline CUDA_CALLABLE float asin(float x)
function CUDA_CALLABLE (line 406) | inline CUDA_CALLABLE float atan(float x) { return ::atan(x); }
function CUDA_CALLABLE (line 407) | inline CUDA_CALLABLE float atan2(float y, float x) { return ::atan2(y, x...
function CUDA_CALLABLE (line 408) | inline CUDA_CALLABLE float sin(float x) { return ::sin(x); }
function CUDA_CALLABLE (line 409) | inline CUDA_CALLABLE float cos(float x) { return ::cos(x); }
function CUDA_CALLABLE (line 410) | inline CUDA_CALLABLE float sqrt(float x)
function CUDA_CALLABLE (line 421) | inline CUDA_CALLABLE float tan(float x) { return ::tan(x); }
function CUDA_CALLABLE (line 422) | inline CUDA_CALLABLE float sinh(float x) { return ::sinhf(x);}
function CUDA_CALLABLE (line 423) | inline CUDA_CALLABLE float cosh(float x) { return ::coshf(x);}
function CUDA_CALLABLE (line 424) | inline CUDA_CALLABLE float tanh(float x) { return ::tanhf(x);}
function CUDA_CALLABLE (line 426) | inline CUDA_CALLABLE float round(float x) { return ::roundf(x); }
function CUDA_CALLABLE (line 427) | inline CUDA_CALLABLE float rint(float x) { return ::rintf(x); }
function CUDA_CALLABLE (line 428) | inline CUDA_CALLABLE float trunc(float x) { return ::truncf(x); }
function CUDA_CALLABLE (line 429) | inline CUDA_CALLABLE float floor(float x) { return ::floorf(x); }
function CUDA_CALLABLE (line 430) | inline CUDA_CALLABLE float ceil(float x) { return ::ceilf(x); }
function CUDA_CALLABLE (line 432) | inline CUDA_CALLABLE void adj_mul(float a, float b, float& adj_a, float&...
function CUDA_CALLABLE (line 433) | inline CUDA_CALLABLE void adj_div(float a, float b, float& adj_a, float&...
function CUDA_CALLABLE (line 445) | inline CUDA_CALLABLE void adj_add(float a, float b, float& adj_a, float&...
function CUDA_CALLABLE (line 446) | inline CUDA_CALLABLE void adj_sub(float a, float b, float& adj_a, float&...
function CUDA_CALLABLE (line 447) | inline CUDA_CALLABLE void adj_mod(float a, float b, float& adj_a, float&...
function CUDA_CALLABLE (line 451) | inline CUDA_CALLABLE void adj_log(float a, float& adj_a, float adj_ret)
function CUDA_CALLABLE (line 463) | inline CUDA_CALLABLE void adj_log2(float a, float& adj_a, float adj_ret)
function CUDA_CALLABLE (line 476) | inline CUDA_CALLABLE void adj_log10(float a, float& adj_a, float adj_ret)
function CUDA_CALLABLE (line 489) | inline CUDA_CALLABLE void adj_exp(float a, float& adj_a, float adj_ret) ...
function CUDA_CALLABLE (line 490) | inline CUDA_CALLABLE void adj_pow(float a, float b, float& adj_a, float&...
function CUDA_CALLABLE (line 502) | inline CUDA_CALLABLE void adj_floordiv(float a, float b, float& adj_a, f...
function CUDA_CALLABLE (line 504) | inline CUDA_CALLABLE void adj_min(float a, float b, float& adj_a, float&...
function CUDA_CALLABLE (line 512) | inline CUDA_CALLABLE void adj_max(float a, float b, float& adj_a, float&...
function CUDA_CALLABLE (line 520) | inline CUDA_CALLABLE void adj_leaky_min(float a, float b, float r, float...
function CUDA_CALLABLE (line 531) | inline CUDA_CALLABLE void adj_leaky_max(float a, float b, float r, float...
function CUDA_CALLABLE (line 542) | inline CUDA_CALLABLE void adj_clamp(float x, float a, float b, float& ad...
function CUDA_CALLABLE (line 552) | inline CUDA_CALLABLE void adj_step(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 557) | inline CUDA_CALLABLE void adj_nonzero(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 562) | inline CUDA_CALLABLE void adj_sign(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 567) | inline CUDA_CALLABLE void adj_abs(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 575) | inline CUDA_CALLABLE void adj_acos(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 591) | inline CUDA_CALLABLE void adj_asin(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 607) | inline CUDA_CALLABLE void adj_tan(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 623) | inline CUDA_CALLABLE void adj_atan(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 628) | inline CUDA_CALLABLE void adj_atan2(float y, float x, float& adj_y, floa...
function CUDA_CALLABLE (line 648) | inline CUDA_CALLABLE void adj_sin(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 653) | inline CUDA_CALLABLE void adj_cos(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 658) | inline CUDA_CALLABLE void adj_sinh(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 663) | inline CUDA_CALLABLE void adj_cosh(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 668) | inline CUDA_CALLABLE void adj_tanh(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 674) | inline CUDA_CALLABLE void adj_sqrt(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 686) | inline CUDA_CALLABLE void adj_round(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 691) | inline CUDA_CALLABLE void adj_rint(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 696) | inline CUDA_CALLABLE void adj_trunc(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 701) | inline CUDA_CALLABLE void adj_floor(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 706) | inline CUDA_CALLABLE void adj_ceil(float x, float& adj_x, float adj_ret)
function CUDA_CALLABLE (line 712) | inline CUDA_CALLABLE half add(half a, half b) { return half(float(a)+flo...
function adj_select (line 719) | void adj_select(bool cond, const T& a, const T& b, bool& adj_cond, T& ad...
function adj_neg (line 770) | void adj_neg(const T& x, T& adj_x, const T& adj_ret) { adj_x += T(-adj_r...
function CUDA_CALLABLE (line 773) | CUDA_CALLABLE inline bool unot(const bool& b) { return !b; }
function CUDA_CALLABLE (line 774) | CUDA_CALLABLE inline void adj_unot(const bool& b, bool& adj_b, const boo...
type launch_bounds_t (line 778) | struct launch_bounds_t
function __device__ (line 794) | __device__ inline void set_launch_bounds(const launch_bounds_t& b)
function set_launch_bounds (line 809) | void set_launch_bounds(const launch_bounds_t& b)
function CUDA_CALLABLE (line 817) | inline CUDA_CALLABLE int tid()
function CUDA_CALLABLE (line 902) | inline CUDA_CALLABLE float16 atomic_add(float16* buf, float16 value)
function isfinite (line 938) | inline bool CUDA_CALLABLE isfinite(float x)
function namespace (line 965) | namespace wp
function CUDA_CALLABLE (line 978) | inline CUDA_CALLABLE float dot(float a, float b) { return mul(a, b); }
function CUDA_CALLABLE (line 979) | inline CUDA_CALLABLE void dot(float a, float b, float& adj_a, float& adj...
function adj_lerp (line 996) | void adj_lerp(const T& a, const T& b, float t, T& adj_a, T& adj_b, float...
function CUDA_CALLABLE (line 1003) | inline CUDA_CALLABLE void print(const str s)
function CUDA_CALLABLE (line 1008) | inline CUDA_CALLABLE void print(int i)
function CUDA_CALLABLE (line 1013) | inline CUDA_CALLABLE void print(short i)
function CUDA_CALLABLE (line 1018) | inline CUDA_CALLABLE void print(long i)
function CUDA_CALLABLE (line 1023) | inline CUDA_CALLABLE void print(long long i)
function CUDA_CALLABLE (line 1028) | inline CUDA_CALLABLE void print(unsigned i)
function CUDA_CALLABLE (line 1033) | inline CUDA_CALLABLE void print(unsigned short i)
function CUDA_CALLABLE (line 1038) | inline CUDA_CALLABLE void print(unsigned long i)
function CUDA_CALLABLE (line 1043) | inline CUDA_CALLABLE void print(unsigned long long i)
function CUDA_CALLABLE (line 1048) | inline CUDA_CALLABLE void print(float16 f)
function CUDA_CALLABLE (line 1053) | inline CUDA_CALLABLE void print(float f)
function CUDA_CALLABLE (line 1058) | inline CUDA_CALLABLE void print(double f)
function CUDA_CALLABLE (line 1063) | inline CUDA_CALLABLE void print(vec2 v)
function CUDA_CALLABLE (line 1068) | inline CUDA_CALLABLE void print(vec3 v)
function CUDA_CALLABLE (line 1073) | inline CUDA_CALLABLE void print(vec4 v)
function CUDA_CALLABLE (line 1078) | inline CUDA_CALLABLE void print(quat i)
function CUDA_CALLABLE (line 1083) | inline CUDA_CALLABLE void print(mat22 m)
function CUDA_CALLABLE (line 1089) | inline CUDA_CALLABLE void print(mat33 m)
function CUDA_CALLABLE (line 1096) | inline CUDA_CALLABLE void print(mat44 m)
function CUDA_CALLABLE (line 1104) | inline CUDA_CALLABLE void print(transform t)
function CUDA_CALLABLE (line 1109) | inline CUDA_CALLABLE void print(spatial_vector v)
function CUDA_CALLABLE (line 1114) | inline CUDA_CALLABLE void print(spatial_matrix m)
function CUDA_CALLABLE (line 1131) | inline CUDA_CALLABLE void adj_print(int i, int& adj_i) { printf("%d adj:...
function CUDA_CALLABLE (line 1132) | inline CUDA_CALLABLE void adj_print(float f, float& adj_f) { printf("%g ...
function CUDA_CALLABLE (line 1133) | inline CUDA_CALLABLE void adj_print(half h, half& adj_h) { printf("%g ad...
function CUDA_CALLABLE (line 1134) | inline CUDA_CALLABLE void adj_print(vec2 v, vec2& adj_v) { printf("%g %g...
function CUDA_CALLABLE (line 1135) | inline CUDA_CALLABLE void adj_print(vec3 v, vec3& adj_v) { printf("%g %g...
function CUDA_CALLABLE (line 1136) | inline CUDA_CALLABLE void adj_print(vec4 v, vec4& adj_v) { printf("%g %g...
function CUDA_CALLABLE (line 1137) | inline CUDA_CALLABLE void adj_print(quat q, quat& adj_q) { printf("%g %g...
function CUDA_CALLABLE (line 1138) | inline CUDA_CALLABLE void adj_print(mat22 m, mat22& adj_m) { }
function CUDA_CALLABLE (line 1139) | inline CUDA_CALLABLE void adj_print(mat33 m, mat33& adj_m) { }
function CUDA_CALLABLE (line 1140) | inline CUDA_CALLABLE void adj_print(mat44 m, mat44& adj_m) { }
function CUDA_CALLABLE (line 1141) | inline CUDA_CALLABLE void adj_print(transform t, transform& adj_t) {}
function CUDA_CALLABLE (line 1142) | inline CUDA_CALLABLE void adj_print(spatial_vector t, spatial_vector& ad...
function CUDA_CALLABLE (line 1143) | inline CUDA_CALLABLE void adj_print(spatial_matrix t, spatial_matrix& ad...
function CUDA_CALLABLE (line 1144) | inline CUDA_CALLABLE void adj_print(str t, str& adj_t) {}
function CUDA_CALLABLE (line 1147) | inline CUDA_CALLABLE void adj_printf(const char* fmt, ...) {}
function expect_eq (line 1151) | void expect_eq(const T& actual, const T& expected)
function adj_expect_eq (line 1162) | void adj_expect_eq(const T& a, const T& b, T& adj_a, T& adj_b)
function expect_near (line 1169) | void expect_near(const T& actual, const T& expected, const float& tolera...
function adj_expect_near (line 1192) | void adj_expect_near(const T& actual, const T& expected, const float& to...
FILE: ManiSkill2/warp_maniskill/warp/native/bvh.cpp
type wp (line 15) | namespace wp
class MedianBVHBuilder (line 21) | class MedianBVHBuilder
function bounds3 (line 66) | bounds3 MedianBVHBuilder::calc_bounds(const bounds3* bounds, const int...
type PartitionPredicateMedian (line 76) | struct PartitionPredicateMedian
method PartitionPredicateMedian (line 78) | PartitionPredicateMedian(const bounds3* bounds, int a) : bounds(boun...
type PartitionPredictateMidPoint (line 105) | struct PartitionPredictateMidPoint
method PartitionPredictateMidPoint (line 107) | PartitionPredictateMidPoint(const bounds3* bounds, int a, float m) :...
class LinearBVHBuilderCPU (line 243) | class LinearBVHBuilderCPU
type KeyIndexPair (line 252) | struct KeyIndexPair
function bounds3 (line 316) | inline bounds3 LinearBVHBuilderCPU::calc_bounds(const bounds3* bounds,...
function BVH (line 394) | BVH bvh_create(const bounds3* bounds, int num_bounds)
function bvh_destroy_host (line 406) | void bvh_destroy_host(BVH& bvh)
function bvh_destroy_device (line 418) | void bvh_destroy_device(BVH& bvh)
function BVH (line 427) | BVH bvh_clone(const BVH& bvh_host)
function bvh_refit_recursive (line 444) | void bvh_refit_recursive(BVH& bvh, int index, const bounds3* bounds)
function bvh_refit_host (line 481) | void bvh_refit_host(BVH& bvh, const bounds3* b)
FILE: ManiSkill2/warp_maniskill/warp/native/bvh.h
function namespace (line 13) | namespace wp
FILE: ManiSkill2/warp_maniskill/warp/native/crt.h
type int_fast8_t (line 97) | typedef signed char int_fast8_t;
type int_fast16_t (line 98) | typedef signed short int_fast16_t;
type int_fast32_t (line 99) | typedef signed int int_fast32_t;
type int_fast64_t (line 100) | typedef signed long long int_fast64_t;
type int_least8_t (line 101) | typedef signed char int_least8_t;
type int_least16_t (line 102) | typedef signed short int_least16_t;
type int_least32_t (line 103) | typedef signed int int_least32_t;
type int_least64_t (line 104) | typedef signed long long int_least64_t;
type intmax_t (line 105) | typedef signed long long intmax_t;
type uint_fast8_t (line 111) | typedef unsigned char uint_fast8_t;
type uint_fast16_t (line 112) | typedef unsigned short uint_fast16_t;
type uint_fast32_t (line 113) | typedef unsigned int uint_fast32_t;
type uint_fast64_t (line 114) | typedef unsigned long long uint_fast64_t;
type uint_least8_t (line 115) | typedef unsigned char uint_least8_t;
type uint_least16_t (line 116) | typedef unsigned short uint_least16_t;
type uint_least32_t (line 117) | typedef unsigned int uint_least32_t;
type uint_least64_t (line 118) | typedef unsigned long long uint_least64_t;
type uintmax_t (line 119) | typedef unsigned long long uintmax_t;
FILE: ManiSkill2/warp_maniskill/warp/native/dense_volume.cpp
function dense_volume_create_host (line 4) | uint64_t dense_volume_create_host(float *buf, uint64_t x, uint64_t y,
function dense_volume_destroy_host (line 25) | void dense_volume_destroy_host(uint64_t id) {
FILE: ManiSkill2/warp_maniskill/warp/native/dense_volume.h
type cudaArray (line 14) | struct cudaArray
type cudaArray (line 15) | struct cudaArray
type cudaTextureObject_t (line 16) | typedef unsigned long long cudaTextureObject_t;
function namespace (line 19) | namespace volume {
function CUDA_CALLABLE (line 39) | CUDA_CALLABLE inline vec3 dense_volume_index_to_world(uint64_t id, vec3 ...
function CUDA_CALLABLE (line 49) | CUDA_CALLABLE inline vec3 dense_volume_world_to_index(uint64_t id, vec3 ...
function convert_float4 (line 62) | inline float convert_float4<float>(float4 data) {
function vec2 (line 65) | inline vec2 convert_float4<vec2>(float4 data) {
function vec3 (line 68) | inline vec3 convert_float4<vec3>(float4 data) {
function vec4 (line 71) | inline vec4 convert_float4<vec4>(float4 data) {
function get_index (line 77) | inline int get_index(int u, int v, int w, int dim2, int dim1) {
function T (line 82) | T bilinear(float tx, float ty, T c00, T c10, T c01, T c11) {
function CUDA_CALLABLE (line 139) | CUDA_CALLABLE inline float dense_volume_sample_f(uint64_t id, vec3 xyz) {
function CUDA_CALLABLE (line 142) | CUDA_CALLABLE inline void adj_dense_volume_sample_f(uint64_t id, vec3 xyz,
function CUDA_CALLABLE (line 147) | CUDA_CALLABLE inline vec4 dense_volume_sample_vec4(uint64_t id, vec3 xyz) {
function CUDA_CALLABLE (line 150) | CUDA_CALLABLE inline void adj_dense_volume_sample_vec4(uint64_t id, vec3...
FILE: ManiSkill2/warp_maniskill/warp/native/exports.h
function WP_API (line 1) | WP_API void builtin_min_int32_int32(int32 x, int32 y, int* ret) { *ret =...
function WP_API (line 2) | WP_API void builtin_min_float32_float32(float32 x, float32 y, float* ret...
function WP_API (line 3) | WP_API void builtin_max_int32_int32(int32 x, int32 y, int* ret) { *ret =...
function WP_API (line 4) | WP_API void builtin_max_float32_float32(float32 x, float32 y, float* ret...
function WP_API (line 5) | WP_API void builtin_clamp_int32_int32_int32(int32 x, int32 a, int32 b, i...
function WP_API (line 6) | WP_API void builtin_clamp_float32_float32_float32(float32 x, float32 a, ...
function WP_API (line 7) | WP_API void builtin_abs_int32(int32 x, int* ret) { *ret = wp::abs(x); }
function WP_API (line 8) | WP_API void builtin_abs_float32(float32 x, float* ret) { *ret = wp::abs(...
function WP_API (line 9) | WP_API void builtin_sign_int32(int32 x, int* ret) { *ret = wp::sign(x); }
function WP_API (line 10) | WP_API void builtin_sign_float32(float32 x, float* ret) { *ret = wp::sig...
function WP_API (line 11) | WP_API void builtin_step_float32(float32 x, float* ret) { *ret = wp::ste...
function WP_API (line 12) | WP_API void builtin_nonzero_float32(float32 x, float* ret) { *ret = wp::...
function WP_API (line 13) | WP_API void builtin_sin_float32(float32 x, float* ret) { *ret = wp::sin(...
function WP_API (line 14) | WP_API void builtin_cos_float32(float32 x, float* ret) { *ret = wp::cos(...
function WP_API (line 15) | WP_API void builtin_acos_float32(float32 x, float* ret) { *ret = wp::aco...
function WP_API (line 16) | WP_API void builtin_asin_float32(float32 x, float* ret) { *ret = wp::asi...
function WP_API (line 17) | WP_API void builtin_sqrt_float32(float32 x, float* ret) { *ret = wp::sqr...
function WP_API (line 18) | WP_API void builtin_tan_float32(float32 x, float* ret) { *ret = wp::tan(...
function WP_API (line 19) | WP_API void builtin_atan_float32(float32 x, float* ret) { *ret = wp::ata...
function WP_API (line 20) | WP_API void builtin_atan2_float32_float32(float32 y, float32 x, float* r...
function WP_API (line 21) | WP_API void builtin_sinh_float32(float32 x, float* ret) { *ret = wp::sin...
function WP_API (line 22) | WP_API void builtin_cosh_float32(float32 x, float* ret) { *ret = wp::cos...
function WP_API (line 23) | WP_API void builtin_tanh_float32(float32 x, float* ret) { *ret = wp::tan...
function WP_API (line 24) | WP_API void builtin_log_float32(float32 x, float* ret) { *ret = wp::log(...
function WP_API (line 25) | WP_API void builtin_log2_float32(float32 x, float* ret) { *ret = wp::log...
function WP_API (line 26) | WP_API void builtin_log10_float32(float32 x, float* ret) { *ret = wp::lo...
function WP_API (line 27) | WP_API void builtin_exp_float32(float32 x, float* ret) { *ret = wp::exp(...
function WP_API (line 28) | WP_API void builtin_pow_float32_float32(float32 x, float32 y, float* ret...
function WP_API (line 29) | WP_API void builtin_round_float32(float32 x, float* ret) { *ret = wp::ro...
function WP_API (line 30) | WP_API void builtin_rint_float32(float32 x, float* ret) { *ret = wp::rin...
function WP_API (line 31) | WP_API void builtin_trunc_float32(float32 x, float* ret) { *ret = wp::tr...
function WP_API (line 32) | WP_API void builtin_floor_float32(float32 x, float* ret) { *ret = wp::fl...
function WP_API (line 33) | WP_API void builtin_ceil_float32(float32 x, float* ret) { *ret = wp::cei...
function WP_API (line 34) | WP_API void builtin_dot_vec2_vec2(vec2 x, vec2 y, float* ret) { *ret = w...
function WP_API (line 35) | WP_API void builtin_dot_vec3_vec3(vec3 x, vec3 y, float* ret) { *ret = w...
function WP_API (line 36) | WP_API void builtin_dot_vec4_vec4(vec4 x, vec4 y, float* ret) { *ret = w...
function WP_API (line 37) | WP_API void builtin_dot_quat_quat(quat x, quat y, float* ret) { *ret = w...
function WP_API (line 38) | WP_API void builtin_outer_vec2_vec2(vec2 x, vec2 y, mat22* ret) { *ret =...
function WP_API (line 39) | WP_API void builtin_outer_vec3_vec3(vec3 x, vec3 y, mat33* ret) { *ret =...
function WP_API (line 40) | WP_API void builtin_cross_vec3_vec3(vec3 x, vec3 y, vec3* ret) { *ret = ...
function WP_API (line 41) | WP_API void builtin_skew_vec3(vec3 x, mat33* ret) { *ret = wp::skew(x); }
function WP_API (line 42) | WP_API void builtin_length_vec2(vec2 x, float* ret) { *ret = wp::length(...
function WP_API (line 43) | WP_API void builtin_length_vec3(vec3 x, float* ret) { *ret = wp::length(...
function WP_API (line 44) | WP_API void builtin_length_vec4(vec4 x, float* ret) { *ret = wp::length(...
function WP_API (line 45) | WP_API void builtin_normalize_vec2(vec2 x, vec2* ret) { *ret = wp::norma...
function WP_API (line 46) | WP_API void builtin_normalize_vec3(vec3 x, vec3* ret) { *ret = wp::norma...
function WP_API (line 47) | WP_API void builtin_normalize_vec4(vec4 x, vec4* ret) { *ret = wp::norma...
function WP_API (line 48) | WP_API void builtin_normalize_quat(quat x, quat* ret) { *ret = wp::norma...
function WP_API (line 49) | WP_API void builtin_transpose_mat22(mat22 m, mat22* ret) { *ret = wp::tr...
function WP_API (line 50) | WP_API void builtin_transpose_mat33(mat33 m, mat33* ret) { *ret = wp::tr...
function WP_API (line 51) | WP_API void builtin_transpose_mat44(mat44 m, mat44* ret) { *ret = wp::tr...
function WP_API (line 52) | WP_API void builtin_transpose_spatial_matrix(spatial_matrix m, spatial_m...
function WP_API (line 53) | WP_API void builtin_inverse_mat22(mat22 m, mat22* ret) { *ret = wp::inve...
function WP_API (line 54) | WP_API void builtin_inverse_mat33(mat33 m, mat33* ret) { *ret = wp::inve...
function WP_API (line 55) | WP_API void builtin_inverse_mat44(mat44 m, mat44* ret) { *ret = wp::inve...
function WP_API (line 56) | WP_API void builtin_determinant_mat22(mat22 m, float* ret) { *ret = wp::...
function WP_API (line 57) | WP_API void builtin_determinant_mat33(mat33 m, float* ret) { *ret = wp::...
function WP_API (line 58) | WP_API void builtin_determinant_mat44(mat44 m, float* ret) { *ret = wp::...
function WP_API (line 59) | WP_API void builtin_diag_vec2(vec2 d, mat22* ret) { *ret = wp::diag(d); }
function WP_API (line 60) | WP_API void builtin_diag_vec3(vec3 d, mat33* ret) { *ret = wp::diag(d); }
function WP_API (line 61) | WP_API void builtin_diag_vec4(vec4 d, mat44* ret) { *ret = wp::diag(d); }
function WP_API (line 62) | WP_API void builtin_cw_mul_vec2_vec2(vec2 x, vec2 y, vec2* ret) { *ret =...
function WP_API (line 63) | WP_API void builtin_cw_mul_vec3_vec3(vec3 x, vec3 y, vec3* ret) { *ret =...
function WP_API (line 64) | WP_API void builtin_cw_mul_vec4_vec4(vec4 x, vec4 y, vec4* ret) { *ret =...
function WP_API (line 65) | WP_API void builtin_cw_div_vec2_vec2(vec2 x, vec2 y, vec2* ret) { *ret =...
function WP_API (line 66) | WP_API void builtin_cw_div_vec3_vec3(vec3 x, vec3 y, vec3* ret) { *ret =...
function WP_API (line 67) | WP_API void builtin_cw_div_vec4_vec4(vec4 x, vec4 y, vec4* ret) { *ret =...
function WP_API (line 68) | WP_API void builtin_svd3_mat33_mat33_vec3_mat33(mat33 A, mat33 U, vec3 s...
function WP_API (line 69) | WP_API void builtin_quat_identity(quat* ret) { *ret = wp::quat_identity(...
function WP_API (line 70) | WP_API void builtin_quat_from_axis_angle_vec3_float32(vec3 axis, float32...
function WP_API (line 71) | WP_API void builtin_quat_from_matrix_mat33(mat33 m, quat* ret) { *ret = ...
function WP_API (line 72) | WP_API void builtin_quat_rpy_float32_float32_float32(float32 roll, float...
function WP_API (line 73) | WP_API void builtin_quat_inverse_quat(quat q, quat* ret) { *ret = wp::qu...
function WP_API (line 74) | WP_API void builtin_quat_rotate_quat_vec3(quat q, vec3 p, vec3* ret) { *...
function WP_API (line 75) | WP_API void builtin_quat_rotate_inv_quat_vec3(quat q, vec3 p, vec3* ret)...
function WP_API (line 76) | WP_API void builtin_quat_to_matrix_quat(quat q, mat33* ret) { *ret = wp:...
function WP_API (line 77) | WP_API void builtin_transform_identity(transform* ret) { *ret = wp::tran...
function WP_API (line 78) | WP_API void builtin_transform_get_translation_transform(transform t, vec...
function WP_API (line 79) | WP_API void builtin_transform_get_rotation_transform(transform t, quat* ...
function WP_API (line 80) | WP_API void builtin_transform_multiply_transform_transform(transform a, ...
function WP_API (line 81) | WP_API void builtin_transform_point_transform_vec3(transform t, vec3 p, ...
function WP_API (line 82) | WP_API void builtin_transform_point_mat44_vec3(mat44 m, vec3 p, vec3* re...
function WP_API (line 83) | WP_API void builtin_transform_vector_transform_vec3(transform t, vec3 v,...
function WP_API (line 84) | WP_API void builtin_transform_vector_mat44_vec3(mat44 m, vec3 v, vec3* r...
function WP_API (line 85) | WP_API void builtin_transform_inverse_transform(transform t, transform* ...
function WP_API (line 86) | WP_API void builtin_spatial_dot_spatial_vector_spatial_vector(spatial_ve...
function WP_API (line 87) | WP_API void builtin_spatial_cross_spatial_vector_spatial_vector(spatial_...
function WP_API (line 88) | WP_API void builtin_spatial_cross_dual_spatial_vector_spatial_vector(spa...
function WP_API (line 89) | WP_API void builtin_spatial_top_spatial_vector(spatial_vector a, vec3* r...
function WP_API (line 90) | WP_API void builtin_spatial_bottom_spatial_vector(spatial_vector a, vec3...
function WP_API (line 91) | WP_API void builtin_mesh_query_point_uint64_vec3_float32_float32_int32_f...
function WP_API (line 92) | WP_API void builtin_mesh_query_ray_uint64_vec3_vec3_float32_float32_floa...
function WP_API (line 93) | WP_API void builtin_mesh_query_aabb_uint64_vec3_vec3(uint64 id, vec3 low...
function WP_API (line 94) | WP_API void builtin_mesh_query_aabb_next_mesh_query_aabb_t_int32(mesh_qu...
function WP_API (line 95) | WP_API void builtin_mesh_eval_position_uint64_int32_float32_float32(uint...
function WP_API (line 96) | WP_API void builtin_mesh_eval_velocity_uint64_int32_float32_float32(uint...
function WP_API (line 97) | WP_API void builtin_hash_grid_query_uint64_vec3_float32(uint64 id, vec3 ...
function WP_API (line 98) | WP_API void builtin_hash_grid_query_next_hash_grid_query_t_int32(hash_gr...
function WP_API (line 99) | WP_API void builtin_hash_grid_point_id_uint64_int32(uint64 id, int32 ind...
function WP_API (line 100) | WP_API void builtin_intersect_tri_tri_vec3_vec3_vec3_vec3_vec3_vec3(vec3...
function WP_API (line 101) | WP_API void builtin_mesh_eval_face_normal_uint64_int32(uint64 id, int32 ...
function WP_API (line 102) | WP_API void builtin_mesh_get_point_uint64_int32(uint64 id, int32 index, ...
function WP_API (line 103) | WP_API void builtin_mesh_get_velocity_uint64_int32(uint64 id, int32 inde...
function WP_API (line 104) | WP_API void builtin_mesh_get_index_uint64_int32(uint64 id, int32 index, ...
function WP_API (line 105) | WP_API void builtin_iter_next_range_t(range_t range, int* ret) { *ret = ...
function WP_API (line 106) | WP_API void builtin_iter_next_hash_grid_query_t(hash_grid_query_t query,...
function WP_API (line 107) | WP_API void builtin_iter_next_mesh_query_aabb_t(mesh_query_aabb_t query,...
function WP_API (line 108) | WP_API void builtin_volume_sample_f_uint64_vec3_int32(uint64 id, vec3 uv...
function WP_API (line 109) | WP_API void builtin_volume_lookup_f_uint64_int32_int32_int32(uint64 id, ...
function WP_API (line 110) | WP_API void builtin_volume_sample_v_uint64_vec3_int32(uint64 id, vec3 uv...
function WP_API (line 111) | WP_API void builtin_volume_lookup_v_uint64_int32_int32_int32(uint64 id, ...
function WP_API (line 112) | WP_API void builtin_volume_sample_i_uint64_vec3(uint64 id, vec3 uvw, int...
function WP_API (line 113) | WP_API void builtin_volume_lookup_i_uint64_int32_int32_int32(uint64 id, ...
function WP_API (line 114) | WP_API void builtin_volume_index_to_world_uint64_vec3(uint64 id, vec3 uv...
function WP_API (line 115) | WP_API void builtin_volume_world_to_index_uint64_vec3(uint64 id, vec3 xy...
function WP_API (line 116) | WP_API void builtin_volume_index_to_world_dir_uint64_vec3(uint64 id, vec...
function WP_API (line 117) | WP_API void builtin_volume_world_to_index_dir_uint64_vec3(uint64 id, vec...
function WP_API (line 118) | WP_API void builtin_rand_init_int32(int32 seed, uint32* ret) { *ret = wp...
function WP_API (line 119) | WP_API void builtin_rand_init_int32_int32(int32 seed, int32 offset, uint...
function WP_API (line 120) | WP_API void builtin_randi_uint32(uint32 state, int* ret) { *ret = wp::ra...
function WP_API (line 121) | WP_API void builtin_randi_uint32_int32_int32(uint32 state, int32 min, in...
function WP_API (line 122) | WP_API void builtin_randf_uint32(uint32 state, float* ret) { *ret = wp::...
function WP_API (line 123) | WP_API void builtin_randf_uint32_float32_float32(uint32 state, float32 m...
function WP_API (line 124) | WP_API void builtin_randn_uint32(uint32 state, float* ret) { *ret = wp::...
function WP_API (line 125) | WP_API void builtin_noise_uint32_float32(uint32 state, float32 x, float*...
function WP_API (line 126) | WP_API void builtin_noise_uint32_vec2(uint32 state, vec2 xy, float* ret)...
function WP_API (line 127) | WP_API void builtin_noise_uint32_vec3(uint32 state, vec3 xyz, float* ret...
function WP_API (line 128) | WP_API void builtin_noise_uint32_vec4(uint32 state, vec4 xyzt, float* re...
function WP_API (line 129) | WP_API void builtin_pnoise_uint32_float32_int32(uint32 state, float32 x,...
function WP_API (line 130) | WP_API void builtin_pnoise_uint32_vec2_int32_int32(uint32 state, vec2 xy...
function WP_API (line 131) | WP_API void builtin_pnoise_uint32_vec3_int32_int32_int32(uint32 state, v...
function WP_API (line 132) | WP_API void builtin_pnoise_uint32_vec4_int32_int32_int32_int32(uint32 st...
function WP_API (line 133) | WP_API void builtin_curlnoise_uint32_vec2(uint32 state, vec2 xy, vec2* r...
function WP_API (line 134) | WP_API void builtin_curlnoise_uint32_vec3(uint32 state, vec3 xyz, vec3* ...
function WP_API (line 135) | WP_API void builtin_curlnoise_uint32_vec4(uint32 state, vec4 xyzt, vec3*...
function WP_API (line 136) | WP_API void builtin_tid(int* ret) { *ret = wp::tid(); }
function WP_API (line 137) | WP_API void builtin_index_vec2_int32(vec2 a, int32 i, float* ret) { *ret...
function WP_API (line 138) | WP_API void builtin_index_vec3_int32(vec3 a, int32 i, float* ret) { *ret...
function WP_API (line 139) | WP_API void builtin_index_vec4_int32(vec4 a, int32 i, float* ret) { *ret...
function WP_API (line 140) | WP_API void builtin_index_mat22_int32(mat22 a, int32 i, vec2* ret) { *re...
function WP_API (line 141) | WP_API void builtin_index_mat22_int32_int32(mat22 a, int32 i, int32 j, f...
function WP_API (line 142) | WP_API void builtin_index_mat33_int32(mat33 a, int32 i, vec3* ret) { *re...
function WP_API (line 143) | WP_API void builtin_index_mat33_int32_int32(mat33 a, int32 i, int32 j, f...
function WP_API (line 144) | WP_API void builtin_index_mat44_int32(mat44 a, int32 i, vec4* ret) { *re...
function WP_API (line 145) | WP_API void builtin_index_mat44_int32_int32(mat44 a, int32 i, int32 j, f...
function WP_API (line 146) | WP_API void builtin_expect_eq_int8_int8(int8 arg1, int8 arg2) { wp::expe...
function WP_API (line 147) | WP_API void builtin_expect_eq_uint8_uint8(uint8 arg1, uint8 arg2) { wp::...
function WP_API (line 148) | WP_API void builtin_expect_eq_int16_int16(int16 arg1, int16 arg2) { wp::...
function WP_API (line 149) | WP_API void builtin_expect_eq_uint16_uint16(uint16 arg1, uint16 arg2) { ...
function WP_API (line 150) | WP_API void builtin_expect_eq_int32_int32(int32 arg1, int32 arg2) { wp::...
function WP_API (line 151) | WP_API void builtin_expect_eq_uint32_uint32(uint32 arg1, uint32 arg2) { ...
function WP_API (line 152) | WP_API void builtin_expect_eq_int64_int64(int64 arg1, int64 arg2) { wp::...
function WP_API (line 153) | WP_API void builtin_expect_eq_uint64_uint64(uint64 arg1, uint64 arg2) { ...
function WP_API (line 154) | WP_API void builtin_expect_eq_float16_float16(float16 arg1, float16 arg2...
function WP_API (line 155) | WP_API void builtin_expect_eq_float32_float32(float32 arg1, float32 arg2...
function WP_API (line 156) | WP_API void builtin_expect_eq_float64_float64(float64 arg1, float64 arg2...
function WP_API (line 157) | WP_API void builtin_expect_eq_vec2_vec2(vec2 arg1, vec2 arg2) { wp::expe...
function WP_API (line 158) | WP_API void builtin_expect_eq_vec3_vec3(vec3 arg1, vec3 arg2) { wp::expe...
function WP_API (line 159) | WP_API void builtin_expect_eq_vec4_vec4(vec4 arg1, vec4 arg2) { wp::expe...
function WP_API (line 160) | WP_API void builtin_expect_eq_mat22_mat22(mat22 arg1, mat22 arg2) { wp::...
function WP_API (line 161) | WP_API void builtin_expect_eq_mat33_mat33(mat33 arg1, mat33 arg2) { wp::...
function WP_API (line 162) | WP_API void builtin_expect_eq_mat44_mat44(mat44 arg1, mat44 arg2) { wp::...
function WP_API (line 163) | WP_API void builtin_expect_eq_quat_quat(quat arg1, quat arg2) { wp::expe...
function WP_API (line 164) | WP_API void builtin_expect_eq_transform_transform(transform arg1, transf...
function WP_API (line 165) | WP_API void builtin_expect_eq_spatial_vector_spatial_vector(spatial_vect...
function WP_API (line 166) | WP_API void builtin_expect_eq_spatial_matrix_spatial_matrix(spatial_matr...
function WP_API (line 167) | WP_API void builtin_lerp_float16_float16_float32(float16 a, float16 b, f...
function WP_API (line 168) | WP_API void builtin_lerp_float32_float32_float32(float32 a, float32 b, f...
function WP_API (line 169) | WP_API void builtin_lerp_float64_float64_float32(float64 a, float64 b, f...
function WP_API (line 170) | WP_API void builtin_lerp_vec2_vec2_float32(vec2 a, vec2 b, float32 t, ve...
function WP_API (line 171) | WP_API void builtin_lerp_vec3_vec3_float32(vec3 a, vec3 b, float32 t, ve...
function WP_API (line 172) | WP_API void builtin_lerp_vec4_vec4_float32(vec4 a, vec4 b, float32 t, ve...
function WP_API (line 173) | WP_API void builtin_lerp_mat22_mat22_float32(mat22 a, mat22 b, float32 t...
function WP_API (line 174) | WP_API void builtin_lerp_mat33_mat33_float32(mat33 a, mat33 b, float32 t...
function WP_API (line 175) | WP_API void builtin_lerp_mat44_mat44_float32(mat44 a, mat44 b, float32 t...
function WP_API (line 176) | WP_API void builtin_lerp_quat_quat_float32(quat a, quat b, float32 t, qu...
function WP_API (line 177) | WP_API void builtin_lerp_transform_transform_float32(transform a, transf...
function WP_API (line 178) | WP_API void builtin_lerp_spatial_vector_spatial_vector_float32(spatial_v...
function WP_API (line 179) | WP_API void builtin_lerp_spatial_matrix_spatial_matrix_float32(spatial_m...
function WP_API (line 180) | WP_API void builtin_expect_near_float32_float32_float32(float32 arg1, fl...
function WP_API (line 181) | WP_API void builtin_expect_near_vec3_vec3_float32(vec3 arg1, vec3 arg2, ...
function WP_API (line 182) | WP_API void builtin_add_int32_int32(int32 x, int32 y, int* ret) { *ret =...
function WP_API (line 183) | WP_API void builtin_add_float32_float32(float32 x, float32 y, float* ret...
function WP_API (line 184) | WP_API void builtin_add_vec2_vec2(vec2 x, vec2 y, vec2* ret) { *ret = wp...
function WP_API (line 185) | WP_API void builtin_add_vec3_vec3(vec3 x, vec3 y, vec3* ret) { *ret = wp...
function WP_API (line 186) | WP_API void builtin_add_vec4_vec4(vec4 x, vec4 y, vec4* ret) { *ret = wp...
function WP_API (line 187) | WP_API void builtin_add_quat_quat(quat x, quat y, quat* ret) { *ret = wp...
function WP_API (line 188) | WP_API void builtin_add_mat22_mat22(mat22 x, mat22 y, mat22* ret) { *ret...
function WP_API (line 189) | WP_API void builtin_add_mat33_mat33(mat33 x, mat33 y, mat33* ret) { *ret...
function WP_API (line 190) | WP_API void builtin_add_mat44_mat44(mat44 x, mat44 y, mat44* ret) { *ret...
function WP_API (line 191) | WP_API void builtin_add_spatial_vector_spatial_vector(spatial_vector x, ...
function WP_API (line 192) | WP_API void builtin_add_spatial_matrix_spatial_matrix(spatial_matrix x, ...
function WP_API (line 193) | WP_API void builtin_sub_int32_int32(int32 x, int32 y, int* ret) { *ret =...
function WP_API (line 194) | WP_API void builtin_sub_float32_float32(float32 x, float32 y, float* ret...
function WP_API (line 195) | WP_API void builtin_sub_vec2_vec2(vec2 x, vec2 y, vec2* ret) { *ret = wp...
function WP_API (line 196) | WP_API void builtin_sub_vec3_vec3(vec3 x, vec3 y, vec3* ret) { *ret = wp...
function WP_API (line 197) | WP_API void builtin_sub_vec4_vec4(vec4 x, vec4 y, vec4* ret) { *ret = wp...
function WP_API (line 198) | WP_API void builtin_sub_mat22_mat22(mat22 x, mat22 y, mat22* ret) { *ret...
function WP_API (line 199) | WP_API void builtin_sub_mat33_mat33(mat33 x, mat33 y, mat33* ret) { *ret...
function WP_API (line 200) | WP_API void builtin_sub_mat44_mat44(mat44 x, mat44 y, mat44* ret) { *ret...
function WP_API (line 201) | WP_API void builtin_sub_spatial_vector_spatial_vector(spatial_vector x, ...
function WP_API (line 202) | WP_API void builtin_sub_spatial_matrix_spatial_matrix(spatial_matrix x, ...
function WP_API (line 203) | WP_API void builtin_mul_int32_int32(int32 x, int32 y, int* ret) { *ret =...
function WP_API (line 204) | WP_API void builtin_mul_float32_float32(float32 x, float32 y, float* ret...
function WP_API (line 205) | WP_API void builtin_mul_float32_vec2(float32 x, vec2 y, vec2* ret) { *re...
function WP_API (line 206) | WP_API void builtin_mul_float32_vec3(float32 x, vec3 y, vec3* ret) { *re...
function WP_API (line 207) | WP_API void builtin_mul_float32_vec4(float32 x, vec4 y, vec4* ret) { *re...
function WP_API (line 208) | WP_API void builtin_mul_float32_quat(float32 x, quat y, quat* ret) { *re...
function WP_API (line 209) | WP_API void builtin_mul_float32_mat22(float32 x, mat22 y, mat22* ret) { ...
function WP_API (line 210) | WP_API void builtin_mul_float32_mat33(float32 x, mat33 y, mat33* ret) { ...
function WP_API (line 211) | WP_API void builtin_mul_float32_mat44(float32 x, mat44 y, mat44* ret) { ...
function WP_API (line 212) | WP_API void builtin_mul_vec2_float32(vec2 x, float32 y, vec2* ret) { *re...
function WP_API (line 213) | WP_API void builtin_mul_vec3_float32(vec3 x, float32 y, vec3* ret) { *re...
function WP_API (line 214) | WP_API void builtin_mul_vec4_float32(vec4 x, float32 y, vec4* ret) { *re...
function WP_API (line 215) | WP_API void builtin_mul_quat_float32(quat x, float32 y, quat* ret) { *re...
function WP_API (line 216) | WP_API void builtin_mul_quat_quat(quat x, quat y, quat* ret) { *ret = wp...
function WP_API (line 217) | WP_API void builtin_mul_mat22_float32(mat22 x, float32 y, mat22* ret) { ...
function WP_API (line 218) | WP_API void builtin_mul_mat22_vec2(mat22 x, vec2 y, vec2* ret) { *ret = ...
function WP_API (line 219) | WP_API void builtin_mul_mat22_mat22(mat22 x, mat22 y, mat22* ret) { *ret...
function WP_API (line 220) | WP_API void builtin_mul_mat33_float32(mat33 x, float32 y, mat33* ret) { ...
function WP_API (line 221) | WP_API void builtin_mul_mat33_vec3(mat33 x, vec3 y, vec3* ret) { *ret = ...
function WP_API (line 222) | WP_API void builtin_mul_mat33_mat33(mat33 x, mat33 y, mat33* ret) { *ret...
function WP_API (line 223) | WP_API void builtin_mul_mat44_float32(mat44 x, float32 y, mat44* ret) { ...
function WP_API (line 224) | WP_API void builtin_mul_mat44_vec4(mat44 x, vec4 y, vec4* ret) { *ret = ...
function WP_API (line 225) | WP_API void builtin_mul_mat44_mat44(mat44 x, mat44 y, mat44* ret) { *ret...
function WP_API (line 226) | WP_API void builtin_mul_spatial_vector_float32(spatial_vector x, float32...
function WP_API (line 227) | WP_API void builtin_mul_spatial_matrix_spatial_matrix(spatial_matrix x, ...
function WP_API (line 228) | WP_API void builtin_mul_spatial_matrix_spatial_vector(spatial_matrix x, ...
function WP_API (line 229) | WP_API void builtin_mul_transform_transform(transform x, transform y, tr...
function WP_API (line 230) | WP_API void builtin_mod_int32_int32(int32 x, int32 y, int* ret) { *ret =...
function WP_API (line 231) | WP_API void builtin_mod_float32_float32(float32 x, float32 y, float* ret...
function WP_API (line 232) | WP_API void builtin_div_int32_int32(int32 x, int32 y, int* ret) { *ret =...
function WP_API (line 233) | WP_API void builtin_div_float32_float32(float32 x, float32 y, float* ret...
function WP_API (line 234) | WP_API void builtin_div_vec2_float32(vec2 x, float32 y, vec2* ret) { *re...
function WP_API (line 235) | WP_API void builtin_div_vec3_float32(vec3 x, float32 y, vec3* ret) { *re...
function WP_API (line 236) | WP_API void builtin_div_vec4_float32(vec4 x, float32 y, vec4* ret) { *re...
function WP_API (line 237) | WP_API void builtin_floordiv_int32_int32(int32 x, int32 y, int* ret) { *...
function WP_API (line 238) | WP_API void builtin_floordiv_float32_float32(float32 x, float32 y, float...
function WP_API (line 239) | WP_API void builtin_neg_int32(int32 x, int* ret) { *ret = wp::neg(x); }
function WP_API (line 240) | WP_API void builtin_neg_float32(float32 x, float* ret) { *ret = wp::neg(...
function WP_API (line 241) | WP_API void builtin_neg_vec2(vec2 x, vec2* ret) { *ret = wp::neg(x); }
function WP_API (line 242) | WP_API void builtin_neg_vec3(vec3 x, vec3* ret) { *ret = wp::neg(x); }
function WP_API (line 243) | WP_API void builtin_neg_vec4(vec4 x, vec4* ret) { *ret = wp::neg(x); }
function WP_API (line 244) | WP_API void builtin_neg_quat(quat x, quat* ret) { *ret = wp::neg(x); }
function WP_API (line 245) | WP_API void builtin_neg_mat33(mat33 x, mat33* ret) { *ret = wp::neg(x); }
function WP_API (line 246) | WP_API void builtin_neg_mat44(mat44 x, mat44* ret) { *ret = wp::neg(x); }
function WP_API (line 247) | WP_API void builtin_unot_bool(bool b, bool* ret) { *ret = wp::unot(b); }
FILE: ManiSkill2/warp_maniskill/warp/native/hashgrid.cpp
type wp (line 26) | namespace wp
function hash_grid_get_descriptor (line 29) | bool hash_grid_get_descriptor(uint64_t id, HashGrid& grid)
function hash_grid_add_descriptor (line 39) | void hash_grid_add_descriptor(uint64_t id, const HashGrid& grid)
function hash_grid_rem_descriptor (line 44) | void hash_grid_rem_descriptor(uint64_t id)
function hash_grid_rebuild_device (line 259) | void hash_grid_rebuild_device(const HashGrid& grid, const wp::vec3* po...
function hash_grid_create_host (line 57) | uint64_t hash_grid_create_host(int dim_x, int dim_y, int dim_z)
function hash_grid_destroy_host (line 73) | void hash_grid_destroy_host(uint64_t id)
function hash_grid_reserve_host (line 84) | void hash_grid_reserve_host(uint64_t id, int num_points)
function hash_grid_update_host (line 103) | void hash_grid_update_host(uint64_t id, float cell_width, const wp::vec3...
function hash_grid_create_device (line 153) | uint64_t hash_grid_create_device(int dim_x, int dim_y, int dim_z)
function hash_grid_destroy_device (line 176) | void hash_grid_destroy_device(uint64_t id)
function hash_grid_reserve_device (line 192) | void hash_grid_reserve_device(uint64_t id, int num_points)
function hash_grid_update_device (line 225) | void hash_grid_update_device(uint64_t id, float cell_width, const wp::ve...
type wp (line 256) | namespace wp
function hash_grid_get_descriptor (line 29) | bool hash_grid_get_descriptor(uint64_t id, HashGrid& grid)
function hash_grid_add_descriptor (line 39) | void hash_grid_add_descriptor(uint64_t id, const HashGrid& grid)
function hash_grid_rem_descriptor (line 44) | void hash_grid_rem_descriptor(uint64_t id)
function hash_grid_rebuild_device (line 259) | void hash_grid_rebuild_device(const HashGrid& grid, const wp::vec3* po...
FILE: ManiSkill2/warp_maniskill/warp/native/hashgrid.h
function namespace (line 11) | namespace wp
FILE: ManiSkill2/warp_maniskill/warp/native/intersect.h
function namespace (line 13) | namespace wp
FILE: ManiSkill2/warp_maniskill/warp/native/intersect_adj.h
function namespace (line 13) | namespace wp
FILE: ManiSkill2/warp_maniskill/warp/native/intersect_tri.h
function CUDA_CALLABLE (line 131) | CUDA_CALLABLE inline int coplanar_tri_tri(float N[3],float V0[3],float V...
function CUDA_CALLABLE (line 217) | CUDA_CALLABLE inline int NoDivTriTriIsect(float V0[3],float V1[3],float ...
FILE: ManiSkill2/warp_maniskill/warp/native/mat22.h
function namespace (line 11) | namespace wp
function CUDA_CALLABLE (line 36) | CUDA_CALLABLE vec2 get_row(int index) const
function CUDA_CALLABLE (line 41) | CUDA_CALLABLE void set_row(int index, const vec2& v)
function CUDA_CALLABLE (line 46) | CUDA_CALLABLE vec2 get_col(int index) const
function CUDA_CALLABLE (line 51) | CUDA_CALLABLE void set_col(int index, const vec2& v)
function CUDA_CALLABLE (line 73) | inline CUDA_CALLABLE mat22 atomic_add(mat22 * addr, mat22 value) {
function CUDA_CALLABLE (line 84) | inline CUDA_CALLABLE void adj_mat22(float m00, float m01, float m10, flo...
function CUDA_CALLABLE (line 92) | inline CUDA_CALLABLE vec2 index(const mat22& m, int row)
function CUDA_CALLABLE (line 97) | inline CUDA_CALLABLE void adj_index(const mat22& m, int row, mat22& adj_...
function CUDA_CALLABLE (line 114) | inline CUDA_CALLABLE float index(const mat22& m, int row, int col)
function CUDA_CALLABLE (line 131) | inline CUDA_CALLABLE mat22 add(const mat22& a, const mat22& b)
function CUDA_CALLABLE (line 145) | inline CUDA_CALLABLE mat22 sub(const mat22& a, const mat22& b)
function CUDA_CALLABLE (line 160) | inline CUDA_CALLABLE mat22 mul(const mat22& a, float b)
function CUDA_CALLABLE (line 173) | inline CUDA_CALLABLE vec2 mul(const mat22& a, const vec2& b)
function CUDA_CALLABLE (line 182) | inline CUDA_CALLABLE mat22 mul(const mat22& a, const mat22& b)
function CUDA_CALLABLE (line 199) | inline CUDA_CALLABLE mat22 transpose(const mat22& a)
function CUDA_CALLABLE (line 214) | inline CUDA_CALLABLE float determinant(const mat22& m)
function CUDA_CALLABLE (line 219) | inline CUDA_CALLABLE mat22 inverse(const mat22& m)
function CUDA_CALLABLE (line 233) | inline CUDA_CALLABLE void adj_inverse(const mat22& m, mat22& adj_m, cons...
function CUDA_CALLABLE (line 242) | inline CUDA_CALLABLE mat22 diag(const vec2& d)
function CUDA_CALLABLE (line 248) | inline CUDA_CALLABLE mat22 outer(const vec2& a, const vec2& b)
function CUDA_CALLABLE (line 253) | inline CUDA_CALLABLE void adj_outer(const vec2& a, const vec2& b, vec2& ...
function adj_ret (line 260) | float adj_ret)
function CUDA_CALLABLE (line 277) | inline CUDA_CALLABLE void adj_add(const mat22& a, const mat22& b, mat22&...
function CUDA_CALLABLE (line 289) | inline CUDA_CALLABLE void adj_sub(const mat22& a, const mat22& b, mat22&...
function CUDA_CALLABLE (line 301) | inline CUDA_CALLABLE void adj_mul(const mat22& a, float b, mat22& adj_a,...
function CUDA_CALLABLE (line 313) | inline CUDA_CALLABLE void adj_mul(const mat22& a, const vec2& b, mat22& ...
function CUDA_CALLABLE (line 319) | inline CUDA_CALLABLE void adj_mul(const mat22& a, const mat22& b, mat22&...
function CUDA_CALLABLE (line 325) | inline CUDA_CALLABLE void adj_transpose(const mat22& a, mat22& adj_a, co...
function CUDA_CALLABLE (line 330) | inline CUDA_CALLABLE void adj_determinant(const mat22& m, mat22& adj_m, ...
function CUDA_CALLABLE (line 339) | inline CUDA_CALLABLE void adj_diag(const vec2& d, vec2& adj_d, const mat...
FILE: ManiSkill2/warp_maniskill/warp/native/mat33.h
function namespace (line 11) | namespace wp
function CUDA_CALLABLE (line 52) | CUDA_CALLABLE vec3 get_row(int index) const
function CUDA_CALLABLE (line 57) | CUDA_CALLABLE void set_row(int index, const vec3& v)
function CUDA_CALLABLE (line 62) | CUDA_CALLABLE vec3 get_col(int index) const
function CUDA_CALLABLE (line 67) | CUDA_CALLABLE void set_col(int index, const vec3& v)
function CUDA_CALLABLE (line 88) | inline CUDA_CALLABLE mat33 diag(const vec3& d) {
function CUDA_CALLABLE (line 92) | inline CUDA_CALLABLE void adj_diag(const vec3& d, vec3& adj_d, const mat...
function CUDA_CALLABLE (line 96) | inline CUDA_CALLABLE mat33 atomic_add(mat33 * addr, mat33 value)
function CUDA_CALLABLE (line 113) | inline CUDA_CALLABLE void adj_mat33(vec3 c0, vec3 c1, vec3 c2,
function CUDA_CALLABLE (line 124) | inline CUDA_CALLABLE void adj_mat33(float m00, float m01, float m02,
function CUDA_CALLABLE (line 144) | inline CUDA_CALLABLE float index(const mat33& m, int row, int col)
function CUDA_CALLABLE (line 162) | inline CUDA_CALLABLE vec3 index(const mat33& m, int row)
function CUDA_CALLABLE (line 167) | inline CUDA_CALLABLE void adj_index(const mat33& m, int row, mat33& adj_...
function CUDA_CALLABLE (line 175) | inline CUDA_CALLABLE mat33 add(const mat33& a, const mat33& b)
function CUDA_CALLABLE (line 189) | inline CUDA_CALLABLE mat33 sub(const mat33& a, const mat33& b)
function CUDA_CALLABLE (line 203) | inline CUDA_CALLABLE mat33 mul(const mat33& a, float b)
function CUDA_CALLABLE (line 218) | inline CUDA_CALLABLE vec3 mul(const mat33& a, const vec3& b)
function CUDA_CALLABLE (line 227) | inline CUDA_CALLABLE mat33 mul(const mat33& a, const mat33& b)
function CUDA_CALLABLE (line 244) | inline CUDA_CALLABLE mat33 element_mul(const mat33& a, const mat33& b)
function CUDA_CALLABLE (line 258) | inline CUDA_CALLABLE mat33 transpose(const mat33& a)
function CUDA_CALLABLE (line 273) | inline CUDA_CALLABLE float determinant(const mat33& m)
function CUDA_CALLABLE (line 278) | inline CUDA_CALLABLE mat33 inverse(const mat33& m)
function CUDA_CALLABLE (line 306) | inline CUDA_CALLABLE void adj_inverse(const mat33& m, mat33& adj_m, cons...
function CUDA_CALLABLE (line 315) | inline CUDA_CALLABLE mat33 outer(const vec3& a, const vec3& b)
function CUDA_CALLABLE (line 320) | inline CUDA_CALLABLE mat33 skew(const vec3& a)
function adj_ret (line 329) | float adj_ret)
function CUDA_CALLABLE (line 346) | inline CUDA_CALLABLE void adj_add(const mat33& a, const mat33& b, mat33&...
function CUDA_CALLABLE (line 358) | inline CUDA_CALLABLE void adj_sub(const mat33& a, const mat33& b, mat33&...
function CUDA_CALLABLE (line 370) | inline CUDA_CALLABLE void adj_mul(const mat33& a, float b, mat33& adj_a,...
function CUDA_CALLABLE (line 382) | inline CUDA_CALLABLE void adj_mul(const mat33& a, const vec3& b, mat33& ...
function CUDA_CALLABLE (line 388) | inline CUDA_CALLABLE void adj_mul(const mat33& a, const mat33& b, mat33&...
function CUDA_CALLABLE (line 394) | inline CUDA_CALLABLE void adj_transpose(const mat33& a, mat33& adj_a, co...
function CUDA_CALLABLE (line 399) | inline CUDA_CALLABLE void adj_determinant(const mat33& m, mat33& adj_m, ...
FILE: ManiSkill2/warp_maniskill/warp/native/mat44.h
function namespace (line 11) | namespace wp
function CUDA_CALLABLE (line 69) | inline CUDA_CALLABLE mat44(const vec3& pos, const quat& rot, const vec3&...
function CUDA_CALLABLE (line 94) | CUDA_CALLABLE vec4 get_row(int index) const
function CUDA_CALLABLE (line 99) | CUDA_CALLABLE void set_row(int index, const vec4& v)
function CUDA_CALLABLE (line 104) | CUDA_CALLABLE vec4 get_col(int index) const
function CUDA_CALLABLE (line 109) | CUDA_CALLABLE void set_col(int index, const vec4& v)
function CUDA_CALLABLE (line 132) | inline CUDA_CALLABLE mat44 diag(const vec4& d) {
function CUDA_CALLABLE (line 139) | inline CUDA_CALLABLE void adj_diag(const vec4& d, vec4& adj_d, const mat...
function CUDA_CALLABLE (line 143) | inline CUDA_CALLABLE mat44 atomic_add(mat44 * addr, mat44 value)
function CUDA_CALLABLE (line 155) | inline CUDA_CALLABLE void adj_mat44(
function CUDA_CALLABLE (line 176) | inline CUDA_CALLABLE void adj_mat44(const vec3& pos, const quat& rot, co...
function CUDA_CALLABLE (line 202) | inline CUDA_CALLABLE void adj_mat44(float m00, float m01, float m02, flo...
function CUDA_CALLABLE (line 215) | inline CUDA_CALLABLE float index(const mat44& m, int row, int col)
function CUDA_CALLABLE (line 232) | inline CUDA_CALLABLE vec4 index(const mat44& m, int row)
function CUDA_CALLABLE (line 237) | inline CUDA_CALLABLE void adj_index(const mat44& m, int row, mat44& adj_...
function CUDA_CALLABLE (line 246) | inline CUDA_CALLABLE mat44 add(const mat44& a, const mat44& b)
function CUDA_CALLABLE (line 260) | inline CUDA_CALLABLE mat44 sub(const mat44& a, const mat44& b)
function CUDA_CALLABLE (line 275) | inline CUDA_CALLABLE mat44 mul(const mat44& a, float b)
function CUDA_CALLABLE (line 290) | inline CUDA_CALLABLE vec4 mul(const mat44& a, const vec4& b)
function CUDA_CALLABLE (line 300) | inline CUDA_CALLABLE mat44 mul(const mat44& a, const mat44& b)
function CUDA_CALLABLE (line 317) | inline CUDA_CALLABLE mat44 transpose(const mat44& a)
function CUDA_CALLABLE (line 331) | inline CUDA_CALLABLE float determinant(const mat44& m)
function CUDA_CALLABLE (line 388) | inline CUDA_CALLABLE void adj_determinant(const mat44& m, mat44& adj_m, ...
function CUDA_CALLABLE (line 476) | inline CUDA_CALLABLE mat44 inverse(const mat44& m)
function CUDA_CALLABLE (line 580) | inline CUDA_CALLABLE void adj_inverse(const mat44& m, mat44& adj_m, cons...
function CUDA_CALLABLE (line 589) | inline CUDA_CALLABLE vec3 transform_point(const mat44& m, const vec3& v)
function CUDA_CALLABLE (line 595) | inline CUDA_CALLABLE vec3 transform_vector(const mat44& m, const vec3& v)
function CUDA_CALLABLE (line 601) | inline CUDA_CALLABLE mat44 outer(const vec4& a, const vec4& b)
function CUDA_CALLABLE (line 607) | inline CUDA_CALLABLE void adj_transform_point(const mat44& m, const vec3...
function CUDA_CALLABLE (line 611) | inline CUDA_CALLABLE void adj_transform_vector(const mat44& m, const vec...
function adj_ret (line 617) | float adj_ret)
function CUDA_CALLABLE (line 634) | inline CUDA_CALLABLE void adj_add(const mat44& a, const mat44& b, mat44&...
function CUDA_CALLABLE (line 646) | inline CUDA_CALLABLE void adj_sub(const mat44& a, const mat44& b, mat44&...
function CUDA_CALLABLE (line 659) | inline CUDA_CALLABLE void adj_mul(const mat44& a, float b, mat44& adj_a,...
function CUDA_CALLABLE (line 671) | inline CUDA_CALLABLE void adj_mul(const mat44& a, const vec4& b, mat44& ...
function CUDA_CALLABLE (line 677) | inline CUDA_CALLABLE void adj_mul(const mat44& a, const mat44& b, mat44&...
function CUDA_CALLABLE (line 683) | inline CUDA_CALLABLE void adj_transpose(const mat44& a, mat44& adj_a, co...
FILE: ManiSkill2/warp_maniskill/warp/native/matnn.h
function namespace (line 11) | namespace wp
FILE: ManiSkill2/warp_maniskill/warp/native/mesh.cpp
type wp (line 24) | namespace wp
function mesh_get_descriptor (line 27) | bool mesh_get_descriptor(uint64_t id, Mesh& mesh)
function mesh_add_descriptor (line 37) | void mesh_add_descriptor(uint64_t id, const Mesh& mesh)
function mesh_rem_descriptor (line 42) | void mesh_rem_descriptor(uint64_t id)
function mesh_create_host (line 50) | uint64_t mesh_create_host(vec3* points, vec3* velocities, int* indices, ...
function mesh_create_device (line 75) | uint64_t mesh_create_device(vec3* points, vec3* velocities, int* indices...
function mesh_destroy_host (line 130) | void mesh_destroy_host(uint64_t id)
function mesh_destroy_device (line 140) | void mesh_destroy_device(uint64_t id)
function mesh_refit_host (line 153) | void mesh_refit_host(uint64_t id)
function mesh_refit_device (line 172) | void mesh_refit_device(uint64_t id)
FILE: ManiSkill2/warp_maniskill/warp/native/mesh.h
function namespace (line 17) | namespace wp
function CUDA_CALLABLE (line 529) | CUDA_CALLABLE inline mesh_query_aabb_t mesh_query_aabb(
function CUDA_CALLABLE (line 597) | CUDA_CALLABLE inline void adj_mesh_query_aabb(uint64_t id, const vec3& l...
function CUDA_CALLABLE (line 713) | CUDA_CALLABLE inline vec3 mesh_eval_velocity(uint64_t id, int tri, float...
function CUDA_CALLABLE (line 734) | CUDA_CALLABLE inline void adj_mesh_eval_position(uint64_t id, int tri, f...
function CUDA_CALLABLE (line 756) | CUDA_CALLABLE inline void adj_mesh_eval_velocity(uint64_t id, int tri, f...
function CUDA_CALLABLE (line 778) | CUDA_CALLABLE inline vec3 mesh_eval_face_normal(uint64_t id, int tri)
function CUDA_CALLABLE (line 798) | CUDA_CALLABLE inline void adj_mesh_eval_face_normal(uint64_t id, int tri,
function CUDA_CALLABLE (line 804) | CUDA_CALLABLE inline vec3 mesh_get_point(uint64_t id, int index)
function CUDA_CALLABLE (line 818) | CUDA_CALLABLE inline void adj_mesh_get_point(uint64_t id, int index,
function CUDA_CALLABLE (line 824) | CUDA_CALLABLE inline vec3 mesh_get_velocity(uint64_t id, int index)
function CUDA_CALLABLE (line 838) | CUDA_CALLABLE inline void adj_mesh_get_velocity(uint64_t id, int index,
function CUDA_CALLABLE (line 844) | CUDA_CALLABLE inline int mesh_get_index(uint64_t id, int face_vertex_index)
function CUDA_CALLABLE (line 856) | CUDA_CALLABLE inline void adj_mesh_get_index(uint64_t id, int index,
FILE: ManiSkill2/warp_maniskill/warp/native/nanovdb/PNanoVDB.h
type int_fast8_t (line 81) | typedef signed char int_fast8_t;
type int_fast16_t (line 82) | typedef signed short int_fast16_t;
type int_fast32_t (line 83) | typedef signed int int_fast32_t;
type int_fast64_t (line 84) | typedef signed long long int_fast64_t;
type int_least8_t (line 85) | typedef signed char int_least8_t;
type int_least16_t (line 86) | typedef signed short int_least16_t;
type int_least32_t (line 87) | typedef signed int int_least32_t;
type int_least64_t (line 88) | typedef signed long long int_least64_t;
type uint_fast8_t (line 95) | typedef unsigned char uint_fast8_t;
type uint_fast16_t (line 96) | typedef unsigned short uint_fast16_t;
type uint_fast32_t (line 97) | typedef unsigned int uint_fast32_t;
type uint_fast64_t (line 98) | typedef unsigned long long uint_fast64_t;
type uint_least8_t (line 99) | typedef unsigned char uint_least8_t;
type uint_least16_t (line 100) | typedef unsigned short uint_least16_t;
type uint_least32_t (line 101) | typedef unsigned int uint_least32_t;
type uint_least64_t (line 102) | typedef unsigned long long uint_least64_t;
type pnanovdb_buf_t (line 112) | typedef struct pnanovdb_buf_t
function PNANOVDB_BUF_FORCE_INLINE (line 119) | PNANOVDB_BUF_FORCE_INLINE pnanovdb_buf_t pnanovdb_make_buf(uint32_t* dat...
function PNANOVDB_BUF_FORCE_INLINE (line 129) | PNANOVDB_BUF_FORCE_INLINE uint32_t pnanovdb_buf_read_uint32(pnanovdb_buf...
function PNANOVDB_BUF_FORCE_INLINE (line 138) | PNANOVDB_BUF_FORCE_INLINE uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf...
function PNANOVDB_BUF_FORCE_INLINE (line 150) | PNANOVDB_BUF_FORCE_INLINE uint32_t pnanovdb_buf_read_uint32(pnanovdb_buf...
function PNANOVDB_BUF_FORCE_INLINE (line 159) | PNANOVDB_BUF_FORCE_INLINE uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf...
type pnanovdb_grid_type_t (line 171) | typedef uint32_t pnanovdb_grid_type_t;
function uint (line 176) | uint pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint byte_offset)
function uint2 (line 180) | uint2 pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint byte_offset)
function uint (line 189) | uint pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint64_t byte_offset)
function pnanovdb_buf_read_uint64 (line 193) | uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint64_t byte_offset)
type pnanovdb_buf_t (line 204) | struct pnanovdb_buf_t
function uint (line 208) | uint pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint byte_offset)
function uvec2 (line 212) | uvec2 pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint byte_offset)
type pnanovdb_uint32_t (line 272) | typedef uint32_t pnanovdb_uint32_t;
type pnanovdb_int32_t (line 273) | typedef int32_t pnanovdb_int32_t;
type pnanovdb_bool_t (line 274) | typedef int32_t pnanovdb_bool_t;
type pnanovdb_uint64_t (line 277) | typedef uint64_t pnanovdb_uint64_t;
type pnanovdb_int64_t (line 278) | typedef int64_t pnanovdb_int64_t;
type pnanovdb_coord_t (line 279) | typedef struct pnanovdb_coord_t
type pnanovdb_vec3_t (line 283) | typedef struct pnanovdb_vec3_t
function PNANOVDB_FORCE_INLINE (line 287) | PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb...
function PNANOVDB_FORCE_INLINE (line 288) | PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb...
function PNANOVDB_FORCE_INLINE (line 289) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovd...
function PNANOVDB_FORCE_INLINE (line 290) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovd...
function PNANOVDB_FORCE_INLINE (line 293) | PNANOVDB_FORCE_INLINE float pnanovdb_uint32_as_float(pnanovdb_uint32_t v...
function PNANOVDB_FORCE_INLINE (line 294) | PNANOVDB_FORCE_INLINE double pnanovdb_uint64_as_double(pnanovdb_uint64_t...
function PNANOVDB_FORCE_INLINE (line 295) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uin...
function PNANOVDB_FORCE_INLINE (line 296) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_ui...
function PNANOVDB_FORCE_INLINE (line 297) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanov...
function PNANOVDB_FORCE_INLINE (line 298) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pn...
function PNANOVDB_FORCE_INLINE (line 299) | PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_uint64_is_equal(pnanovdb...
function PNANOVDB_FORCE_INLINE (line 300) | PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_int64_is_zero(pnanovdb_i...
function PNANOVDB_FORCE_INLINE (line 302) | PNANOVDB_FORCE_INLINE float pnanovdb_floor(float v) { return floorf(v); }
function PNANOVDB_FORCE_INLINE (line 304) | PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_float_to_int32(float v) ...
function PNANOVDB_FORCE_INLINE (line 305) | PNANOVDB_FORCE_INLINE float pnanovdb_int32_to_float(pnanovdb_int32_t v) ...
function PNANOVDB_FORCE_INLINE (line 306) | PNANOVDB_FORCE_INLINE float pnanovdb_uint32_to_float(pnanovdb_uint32_t v...
function PNANOVDB_FORCE_INLINE (line 307) | PNANOVDB_FORCE_INLINE float pnanovdb_min(float a, float b) { return a < ...
function PNANOVDB_FORCE_INLINE (line 308) | PNANOVDB_FORCE_INLINE float pnanovdb_max(float a, float b) { return a > ...
type uint (line 310) | typedef uint pnanovdb_uint32_t;
type pnanovdb_int32_t (line 311) | typedef int pnanovdb_int32_t;
type pnanovdb_bool_t (line 312) | typedef bool pnanovdb_bool_t;
type int3 (line 315) | typedef int3 pnanovdb_coord_t;
type float3 (line 316) | typedef float3 pnanovdb_vec3_t;
function pnanovdb_int32_t (line 317) | pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_t v) { return ...
function pnanovdb_uint32_t (line 318) | pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovdb_int32_t v) { return ...
function pnanovdb_uint32_as_float (line 319) | float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { return asfloat(v); }
function pnanovdb_floor (line 320) | float pnanovdb_floor(float v) { return floor(v); }
function pnanovdb_int32_t (line 321) | pnanovdb_int32_t pnanovdb_float_to_int32(float v) { return int(v); }
function pnanovdb_int32_to_float (line 322) | float pnanovdb_int32_to_float(pnanovdb_int32_t v) { return float(v); }
function pnanovdb_uint32_to_float (line 323) | float pnanovdb_uint32_to_float(pnanovdb_uint32_t v) { return float(v); }
function pnanovdb_min (line 324) | float pnanovdb_min(float a, float b) { return min(a, b); }
function pnanovdb_max (line 325) | float pnanovdb_max(float a, float b) { return max(a, b); }
type uint2 (line 327) | typedef uint2 pnanovdb_uint64_t;
type int2 (line 328) | typedef int2 pnanovdb_int64_t;
function pnanovdb_int64_t (line 329) | pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return ...
function pnanovdb_uint64_t (line 330) | pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return ...
function pnanovdb_uint64_as_double (line 331) | double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return asdouble(...
function pnanovdb_uint32_t (line 332) | pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return v.x; }
function pnanovdb_uint32_t (line 333) | pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return v.y; }
function pnanovdb_uint64_t (line 334) | pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovd...
function pnanovdb_uint64_t (line 335) | pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pnanovdb_uint32_t x) { r...
function pnanovdb_uint64_is_equal (line 336) | bool pnanovdb_uint64_is_equal(pnanovdb_uint64_t a, pnanovdb_uint64_t b) ...
function pnanovdb_int64_is_zero (line 337) | bool pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a.x == 0 && a.y...
type pnanovdb_uint64_t (line 339) | typedef uint64_t pnanovdb_uint64_t;
type pnanovdb_int64_t (line 340) | typedef int64_t pnanovdb_int64_t;
function pnanovdb_int64_t (line 341) | pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return ...
function pnanovdb_uint64_t (line 342) | pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return ...
function pnanovdb_uint64_as_double (line 343) | double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return asdouble(...
function pnanovdb_uint32_t (line 344) | pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return uint...
function pnanovdb_uint32_t (line 345) | pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return uin...
function pnanovdb_uint64_t (line 346) | pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovd...
function pnanovdb_uint64_t (line 347) | pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pnanovdb_uint32_t x) { r...
function pnanovdb_uint64_is_equal (line 348) | bool pnanovdb_uint64_is_equal(pnanovdb_uint64_t a, pnanovdb_uint64_t b) ...
function pnanovdb_int64_is_zero (line 349) | bool pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a == 0; }
function pnanovdb_int32_t (line 361) | pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_t v) { return ...
function pnanovdb_int64_t (line 362) | pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return ...
function pnanovdb_uint64_t (line 363) | pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return ...
function pnanovdb_uint32_t (line 364) | pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovdb_int32_t v) { return ...
function pnanovdb_uint32_as_float (line 365) | float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { return uintBitsToF...
function pnanovdb_uint64_as_double (line 366) | double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return packDoubl...
function pnanovdb_uint32_t (line 367) | pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return v.x; }
function pnanovdb_uint32_t (line 368) | pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return v.y; }
function pnanovdb_uint64_t (line 369) | pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovd...
function pnanovdb_uint64_t (line 370) | pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pnanovdb_uint32_t x) { r...
function pnanovdb_uint64_is_equal (line 371) | bool pnanovdb_uint64_is_equal(pnanovdb_uint64_t a, pnanovdb_uint64_t b) ...
function pnanovdb_int64_is_zero (line 372) | bool pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a.x == 0 && a.y...
function pnanovdb_floor (line 373) | float pnanovdb_floor(float v) { return floor(v); }
function pnanovdb_int32_t (line 374) | pnanovdb_int32_t pnanovdb_float_to_int32(float v) { return int(v); }
function pnanovdb_int32_to_float (line 375) | float pnanovdb_int32_to_float(pnanovdb_int32_t v) { return float(v); }
function pnanovdb_uint32_to_float (line 376) | float pnanovdb_uint32_to_float(pnanovdb_uint32_t v) { return float(v); }
function pnanovdb_min (line 377) | float pnanovdb_min(float a, float b) { return min(a, b); }
function pnanovdb_max (line 378) | float pnanovdb_max(float a, float b) { return max(a, b); }
function PNANOVDB_FORCE_INLINE (line 384) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_uniform(float a)
function PNANOVDB_FORCE_INLINE (line 392) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_add(const pnanovdb_v...
function PNANOVDB_FORCE_INLINE (line 400) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_sub(const pnanovdb_v...
function PNANOVDB_FORCE_INLINE (line 408) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_mul(const pnanovdb_v...
function PNANOVDB_FORCE_INLINE (line 416) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_div(const pnanovdb_v...
function PNANOVDB_FORCE_INLINE (line 424) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_min(const pnanovdb_v...
function PNANOVDB_FORCE_INLINE (line 432) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_max(const pnanovdb_v...
function PNANOVDB_FORCE_INLINE (line 440) | PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_vec3_round_to_coord(cons...
function PNANOVDB_FORCE_INLINE (line 448) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_coord_to_vec3(const pnano...
function PNANOVDB_FORCE_INLINE (line 456) | PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_coord_uniform(const pnan...
function PNANOVDB_FORCE_INLINE (line 464) | PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord...
function pnanovdb_vec3_t (line 473) | pnanovdb_vec3_t pnanovdb_vec3_uniform(float a) { return float3(a, a, a); }
function pnanovdb_vec3_t (line 474) | pnanovdb_vec3_t pnanovdb_vec3_add(pnanovdb_vec3_t a, pnanovdb_vec3_t b) ...
function pnanovdb_vec3_t (line 475) | pnanovdb_vec3_t pnanovdb_vec3_sub(pnanovdb_vec3_t a, pnanovdb_vec3_t b) ...
function pnanovdb_vec3_t (line 476) | pnanovdb_vec3_t pnanovdb_vec3_mul(pnanovdb_vec3_t a, pnanovdb_vec3_t b) ...
function pnanovdb_vec3_t (line 477) | pnanovdb_vec3_t pnanovdb_vec3_div(pnanovdb_vec3_t a, pnanovdb_vec3_t b) ...
function pnanovdb_vec3_t (line 478) | pnanovdb_vec3_t pnanovdb_vec3_min(pnanovdb_vec3_t a, pnanovdb_vec3_t b) ...
function pnanovdb_vec3_t (line 479) | pnanovdb_vec3_t pnanovdb_vec3_max(pnanovdb_vec3_t a, pnanovdb_vec3_t b) ...
function pnanovdb_vec3_t (line 480) | pnanovdb_vec3_t pnanovdb_coord_to_vec3(pnanovdb_coord_t coord) { return ...
function pnanovdb_coord_t (line 481) | pnanovdb_coord_t pnanovdb_coord_uniform(pnanovdb_int32_t a) { return int...
function pnanovdb_coord_t (line 482) | pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord_t a, pnanovdb_coord_t...
function pnanovdb_vec3_t (line 484) | pnanovdb_vec3_t pnanovdb_vec3_uniform(float a) { return vec3(a, a, a); }
function pnanovdb_vec3_t (line 485) | pnanovdb_vec3_t pnanovdb_vec3_add(pnanovdb_vec3_t a, pnanovdb_vec3_t b) ...
function pnanovdb_vec3_t (line 486) | pnanovdb_vec3_t pnanovdb_vec3_sub(pnanovdb_vec3_t a, pnanovdb_vec3_t b) ...
function pnanovdb_vec3_t (line 487) | pnanovdb_vec3_t pnanovdb_vec3_mul(pnanovdb_vec3_t a, pnanovdb_vec3_t b) ...
function pnanovdb_vec3_t (line 488) | pnanovdb_vec3_t pnanovdb_vec3_div(pnanovdb_vec3_t a, pnanovdb_vec3_t b) ...
function pnanovdb_vec3_t (line 489) | pnanovdb_vec3_t pnanovdb_vec3_min(pnanovdb_vec3_t a, pnanovdb_vec3_t b) ...
function pnanovdb_vec3_t (line 490) | pnanovdb_vec3_t pnanovdb_vec3_max(pnanovdb_vec3_t a, pnanovdb_vec3_t b) ...
function pnanovdb_vec3_t (line 491) | pnanovdb_vec3_t pnanovdb_coord_to_vec3(const pnanovdb_coord_t coord) { r...
function pnanovdb_coord_t (line 492) | pnanovdb_coord_t pnanovdb_coord_uniform(pnanovdb_int32_t a) { return ive...
function pnanovdb_coord_t (line 493) | pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord_t a, pnanovdb_coord_t...
type pnanovdb_address_t (line 499) | struct pnanovdb_address_t
function pnanovdb_address_t (line 505) | pnanovdb_address_t pnanovdb_address_offset(pnanovdb_address_t address, p...
function PNANOVDB_FORCE_INLINE (line 511) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_neg(pna...
function PNANOVDB_FORCE_INLINE (line 517) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_product...
function PNANOVDB_FORCE_INLINE (line 523) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64(pnano...
function PNANOVDB_FORCE_INLINE (line 530) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_address_mask(pnanovdb_a...
function PNANOVDB_FORCE_INLINE (line 534) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_mask_inv(pnano...
function PNANOVDB_FORCE_INLINE (line 540) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_null()
function PNANOVDB_FORCE_INLINE (line 545) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_is_null(pnanovdb_...
function PNANOVDB_FORCE_INLINE (line 549) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_in_interval(pnano...
type pnanovdb_address_t (line 554) | struct pnanovdb_address_t
function pnanovdb_address_t (line 560) | pnanovdb_address_t pnanovdb_address_offset(pnanovdb_address_t address, p...
function PNANOVDB_FORCE_INLINE (line 566) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_neg(pna...
function PNANOVDB_FORCE_INLINE (line 572) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_product...
function PNANOVDB_FORCE_INLINE (line 578) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64(pnano...
function PNANOVDB_FORCE_INLINE (line 584) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_address_mask(pnanovdb_a...
function PNANOVDB_FORCE_INLINE (line 588) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_mask_inv(pnano...
function PNANOVDB_FORCE_INLINE (line 594) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_null()
function PNANOVDB_FORCE_INLINE (line 599) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_is_null(pnanovdb_...
function PNANOVDB_FORCE_INLINE (line 603) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_in_interval(pnano...
function PNANOVDB_FORCE_INLINE (line 611) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_read_uint32(pnanovdb_bu...
function PNANOVDB_FORCE_INLINE (line 615) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_read_uint64(pnanovdb_bu...
function PNANOVDB_FORCE_INLINE (line 619) | PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_read_int32(pnanovdb_buf_...
function PNANOVDB_FORCE_INLINE (line 623) | PNANOVDB_FORCE_INLINE float pnanovdb_read_float(pnanovdb_buf_t buf, pnan...
function PNANOVDB_FORCE_INLINE (line 627) | PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_read_int64(pnanovdb_buf_...
function PNANOVDB_FORCE_INLINE (line 631) | PNANOVDB_FORCE_INLINE double pnanovdb_read_double(pnanovdb_buf_t buf, pn...
function PNANOVDB_FORCE_INLINE (line 635) | PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_read_coord(pnanovdb_buf_...
function PNANOVDB_FORCE_INLINE (line 643) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_read_vec3f(pnanovdb_buf_t...
function PNANOVDB_FORCE_INLINE (line 652) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_read_bit(pnanovdb_buf_t b...
function pnanovdb_read_half (line 661) | PNANOVDB_FORCE_INLINE short pnanovdb_read_half(pnanovdb_buf_t buf, pnano...
function PNANOVDB_FORCE_INLINE (line 667) | PNANOVDB_FORCE_INLINE float pnanovdb_read_half(pnanovdb_buf_t buf, pnano...
function PNANOVDB_FORCE_INLINE (line 673) | PNANOVDB_FORCE_INLINE float pnanovdb_read_half(pnanovdb_buf_t buf, pnano...
type pnanovdb_map_t (line 738) | struct pnanovdb_map_t
function pnanovdb_map_handle_t (line 749) | PNANOVDB_STRUCT_TYPEDEF(pnanovdb_map_t)
function PNANOVDB_FORCE_INLINE (line 764) | PNANOVDB_FORCE_INLINE float pnanovdb_map_get_matf(pnanovdb_buf_t buf, pn...
function PNANOVDB_FORCE_INLINE (line 767) | PNANOVDB_FORCE_INLINE float pnanovdb_map_get_invmatf(pnanovdb_buf_t buf,...
function PNANOVDB_FORCE_INLINE (line 770) | PNANOVDB_FORCE_INLINE float pnanovdb_map_get_vecf(pnanovdb_buf_t buf, pn...
function PNANOVDB_FORCE_INLINE (line 773) | PNANOVDB_FORCE_INLINE float pnanovdb_map_get_taperf(pnanovdb_buf_t buf, ...
function PNANOVDB_FORCE_INLINE (line 776) | PNANOVDB_FORCE_INLINE double pnanovdb_map_get_matd(pnanovdb_buf_t buf, p...
function PNANOVDB_FORCE_INLINE (line 779) | PNANOVDB_FORCE_INLINE double pnanovdb_map_get_invmatd(pnanovdb_buf_t buf...
function PNANOVDB_FORCE_INLINE (line 782) | PNANOVDB_FORCE_INLINE double pnanovdb_map_get_vecd(pnanovdb_buf_t buf, p...
function PNANOVDB_FORCE_INLINE (line 785) | PNANOVDB_FORCE_INLINE double pnanovdb_map_get_taperd(pnanovdb_buf_t buf,...
type pnanovdb_grid_t (line 789) | struct pnanovdb_grid_t
function pnanovdb_grid_handle_t (line 808) | PNANOVDB_STRUCT_TYPEDEF(pnanovdb_grid_t)
function PNANOVDB_FORCE_INLINE (line 830) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_magic(pnanovdb...
function PNANOVDB_FORCE_INLINE (line 833) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_checksum(pnano...
function PNANOVDB_FORCE_INLINE (line 836) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_version(pnanov...
function PNANOVDB_FORCE_INLINE (line 839) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_flags(pnanovdb...
function PNANOVDB_FORCE_INLINE (line 842) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_index(pna...
function PNANOVDB_FORCE_INLINE (line 845) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_count(pna...
function PNANOVDB_FORCE_INLINE (line 848) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_grid_size(pnan...
function PNANOVDB_FORCE_INLINE (line 851) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_name(pnan...
function PNANOVDB_FORCE_INLINE (line 854) | PNANOVDB_FORCE_INLINE pnanovdb_map_handle_t pnanovdb_grid_get_map(pnanov...
function PNANOVDB_FORCE_INLINE (line 859) | PNANOVDB_FORCE_INLINE double pnanovdb_grid_get_world_bbox(pnanovdb_buf_t...
function PNANOVDB_FORCE_INLINE (line 862) | PNANOVDB_FORCE_INLINE double pnanovdb_grid_get_voxel_size(pnanovdb_buf_t...
function PNANOVDB_FORCE_INLINE (line 865) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_class(pna...
function PNANOVDB_FORCE_INLINE (line 868) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_type(pnan...
function PNANOVDB_FORCE_INLINE (line 871) | PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_grid_get_blind_metadata_...
function PNANOVDB_FORCE_INLINE (line 874) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_blind_metadata...
function PNANOVDB_FORCE_INLINE (line 878) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_major(pnano...
function PNANOVDB_FORCE_INLINE (line 882) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_minor(pnano...
function PNANOVDB_FORCE_INLINE (line 886) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_patch(pnano...
type pnanovdb_gridblindmetadata_t (line 891) | struct pnanovdb_gridblindmetadata_t
function pnanovdb_gridblindmetadata_handle_t (line 901) | PNANOVDB_STRUCT_TYPEDEF(pnanovdb_gridblindmetadata_t)
function PNANOVDB_FORCE_INLINE (line 915) | PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_gridblindmetadata_get_by...
function PNANOVDB_FORCE_INLINE (line 918) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_gridblindmetadata_get_e...
function PNANOVDB_FORCE_INLINE (line 921) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_f...
function PNANOVDB_FORCE_INLINE (line 924) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_s...
function PNANOVDB_FORCE_INLINE (line 927) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_d...
function PNANOVDB_FORCE_INLINE (line 930) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_d...
function PNANOVDB_FORCE_INLINE (line 933) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_n...
type pnanovdb_tree_t (line 937) | struct pnanovdb_tree_t
function pnanovdb_tree_handle_t (line 951) | PNANOVDB_STRUCT_TYPEDEF(pnanovdb_tree_t)
function PNANOVDB_FORCE_INLINE (line 969) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_le...
function PNANOVDB_FORCE_INLINE (line 972) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_lo...
function PNANOVDB_FORCE_INLINE (line 975) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_up...
function PNANOVDB_FORCE_INLINE (line 978) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_ro...
function PNANOVDB_FORCE_INLINE (line 981) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_lea...
function PNANOVDB_FORCE_INLINE (line 984) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_low...
function PNANOVDB_FORCE_INLINE (line 987) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_upp...
function PNANOVDB_FORCE_INLINE (line 990) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_lea...
function PNANOVDB_FORCE_INLINE (line 993) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_low...
function PNANOVDB_FORCE_INLINE (line 996) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_upp...
function PNANOVDB_FORCE_INLINE (line 999) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_voxel_count(pn...
type pnanovdb_root_t (line 1003) | struct pnanovdb_root_t
function pnanovdb_root_handle_t (line 1011) | PNANOVDB_STRUCT_TYPEDEF(pnanovdb_root_t)
function PNANOVDB_FORCE_INLINE (line 1021) | PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_root_get_bbox_min(pnanov...
function PNANOVDB_FORCE_INLINE (line 1024) | PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_root_get_bbox_max(pnanov...
function PNANOVDB_FORCE_INLINE (line 1027) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_get_tile_count(pna...
type pnanovdb_root_tile_t (line 1031) | struct pnanovdb_root_tile_t
function pnanovdb_root_tile_handle_t (line 1039) | PNANOVDB_STRUCT_TYPEDEF(pnanovdb_root_tile_t)
function PNANOVDB_FORCE_INLINE (line 1049) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_root_tile_get_key(pnano...
function PNANOVDB_FORCE_INLINE (line 1052) | PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_root_tile_get_child(pnan...
function PNANOVDB_FORCE_INLINE (line 1055) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_tile_get_state(pna...
type pnanovdb_upper_t (line 1059) | struct pnanovdb_upper_t
function pnanovdb_upper_handle_t (line 1069) | PNANOVDB_STRUCT_TYPEDEF(pnanovdb_upper_t)
function PNANOVDB_FORCE_INLINE (line 1082) | PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_upper_get_bbox_min(pnano...
function PNANOVDB_FORCE_INLINE (line 1085) | PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_upper_get_bbox_max(pnano...
function PNANOVDB_FORCE_INLINE (line 1088) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_upper_get_flags(pnanovd...
function PNANOVDB_FORCE_INLINE (line 1091) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_get_value_mask(pnan...
function PNANOVDB_FORCE_INLINE (line 1095) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_get_child_mask(pnan...
type pnanovdb_lower_t (line 1100) | struct pnanovdb_lower_t
function pnanovdb_lower_handle_t (line 1110) | PNANOVDB_STRUCT_TYPEDEF(pnanovdb_lower_t)
function PNANOVDB_FORCE_INLINE (line 1123) | PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_lower_get_bbox_min(pnano...
function PNANOVDB_FORCE_INLINE (line 1126) | PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_lower_get_bbox_max(pnano...
function PNANOVDB_FORCE_INLINE (line 1129) | PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_lower_get_flags(pnanovd...
function PNANOVDB_FORCE_INLINE (line 1132) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_get_value_mask(pnan...
function PNANOVDB_FORCE_INLINE (line 1136) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_get_child_mask(pnan...
type pnanovdb_leaf_t (line 1141) | struct pnanovdb_leaf_t
function pnanovdb_leaf_handle_t (line 1149) | PNANOVDB_STRUCT_TYPEDEF(pnanovdb_leaf_t)
function PNANOVDB_FORCE_INLINE (line 1164) | PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_leaf_get_bbox_min(pnanov...
function PNANOVDB_FORCE_INLINE (line 1167) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_get_bbox_dif_and_f...
function PNANOVDB_FORCE_INLINE (line 1170) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_get_value_mask(pnano...
type pnanovdb_grid_type_constants_t (line 1175) | struct pnanovdb_grid_type_constants_t
function PNANOVDB_FORCE_INLINE (line 1233) | PNANOVDB_FORCE_INLINE pnanovdb_gridblindmetadata_handle_t pnanovdb_grid_...
function PNANOVDB_FORCE_INLINE (line 1242) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanodvb_grid_get_gridblindmeta...
function PNANOVDB_FORCE_INLINE (line 1251) | PNANOVDB_FORCE_INLINE pnanovdb_tree_handle_t pnanovdb_grid_get_tree(pnan...
function PNANOVDB_FORCE_INLINE (line 1258) | PNANOVDB_FORCE_INLINE pnanovdb_root_handle_t pnanovdb_tree_get_root(pnan...
function PNANOVDB_FORCE_INLINE (line 1266) | PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_get_tile...
function PNANOVDB_FORCE_INLINE (line 1274) | PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_get_tile...
function PNANOVDB_FORCE_INLINE (line 1281) | PNANOVDB_FORCE_INLINE pnanovdb_upper_handle_t pnanovdb_root_get_child(pn...
function pnanovdb_coord_to_key (line 1288) | pnanovdb_coord_to_key(PNANOVDB_IN(pnanovdb_coord_t) ijk)
function PNANOVDB_FORCE_INLINE (line 1305) | PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_find_til...
function pnanovdb_leaf_coord_to_offset (line 1322) | pnanovdb_leaf_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
function PNANOVDB_FORCE_INLINE (line 1329) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_min_address(p...
function PNANOVDB_FORCE_INLINE (line 1335) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_max_address(p...
function PNANOVDB_FORCE_INLINE (line 1341) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_ave_address(p...
function PNANOVDB_FORCE_INLINE (line 1347) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_stddev_addres...
function PNANOVDB_FORCE_INLINE (line 1353) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_table_address...
function PNANOVDB_FORCE_INLINE (line 1359) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_value_address...
function PNANOVDB_FORCE_INLINE (line 1365) | PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp_read_float(pnanovdb_buf_t b...
function PNANOVDB_FORCE_INLINE (line 1381) | PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp4_read_float(pnanovdb_buf_t ...
function PNANOVDB_FORCE_INLINE (line 1386) | PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp8_read_float(pnanovdb_buf_t ...
function PNANOVDB_FORCE_INLINE (line 1391) | PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp16_read_float(pnanovdb_buf_t...
function PNANOVDB_FORCE_INLINE (line 1396) | PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fpn_read_float(pnanovdb_buf_t ...
function pnanovdb_lower_coord_to_offset (line 1404) | pnanovdb_lower_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
function PNANOVDB_FORCE_INLINE (line 1411) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_min_address(...
function PNANOVDB_FORCE_INLINE (line 1417) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_max_address(...
function PNANOVDB_FORCE_INLINE (line 1423) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_ave_address(...
function PNANOVDB_FORCE_INLINE (line 1429) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_stddev_addre...
function PNANOVDB_FORCE_INLINE (line 1435) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_table_addres...
function PNANOVDB_FORCE_INLINE (line 1441) | PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_lower_get_table_child(pn...
function PNANOVDB_FORCE_INLINE (line 1447) | PNANOVDB_FORCE_INLINE pnanovdb_leaf_handle_t pnanovdb_lower_get_child(pn...
function PNANOVDB_FORCE_INLINE (line 1454) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_addres...
function PNANOVDB_FORCE_INLINE (line 1472) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_addres...
function pnanovdb_upper_coord_to_offset (line 1478) | pnanovdb_upper_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
function PNANOVDB_FORCE_INLINE (line 1485) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_min_address(...
function PNANOVDB_FORCE_INLINE (line 1491) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_max_address(...
function PNANOVDB_FORCE_INLINE (line 1497) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_ave_address(...
function PNANOVDB_FORCE_INLINE (line 1503) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_stddev_addre...
function PNANOVDB_FORCE_INLINE (line 1509) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_table_addres...
function PNANOVDB_FORCE_INLINE (line 1515) | PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_upper_get_table_child(pn...
function PNANOVDB_FORCE_INLINE (line 1521) | PNANOVDB_FORCE_INLINE pnanovdb_lower_handle_t pnanovdb_upper_get_child(p...
function PNANOVDB_FORCE_INLINE (line 1528) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_addres...
function PNANOVDB_FORCE_INLINE (line 1545) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_addres...
function PNANOVDB_FORCE_INLINE (line 1551) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_min_address(p...
function PNANOVDB_FORCE_INLINE (line 1557) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_max_address(p...
function PNANOVDB_FORCE_INLINE (line 1563) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_ave_address(p...
function PNANOVDB_FORCE_INLINE (line 1569) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_stddev_addres...
function PNANOVDB_FORCE_INLINE (line 1575) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_tile_get_value_ad...
function PNANOVDB_FORCE_INLINE (line 1581) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address...
function PNANOVDB_FORCE_INLINE (line 1603) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address...
function PNANOVDB_FORCE_INLINE (line 1609) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address...
function PNANOVDB_FORCE_INLINE (line 1617) | PNANOVDB_FORCE_INLINE float pnanovdb_root_fp4_read_float(pnanovdb_buf_t ...
function PNANOVDB_FORCE_INLINE (line 1631) | PNANOVDB_FORCE_INLINE float pnanovdb_root_fp8_read_float(pnanovdb_buf_t ...
function PNANOVDB_FORCE_INLINE (line 1645) | PNANOVDB_FORCE_INLINE float pnanovdb_root_fp16_read_float(pnanovdb_buf_t...
function PNANOVDB_FORCE_INLINE (line 1659) | PNANOVDB_FORCE_INLINE float pnanovdb_root_fpn_read_float(pnanovdb_buf_t ...
type pnanovdb_readaccessor_t (line 1675) | struct pnanovdb_readaccessor_t
function pnanovdb_readaccessor_init (line 1685) | void pnanovdb_readaccessor_init(PNANOVDB_INOUT(pnanovdb_readaccessor_t) ...
function PNANOVDB_FORCE_INLINE (line 1696) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_iscached0(PN...
function PNANOVDB_FORCE_INLINE (line 1706) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_iscached1(PN...
function PNANOVDB_FORCE_INLINE (line 1716) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_iscached2(PN...
function PNANOVDB_FORCE_INLINE (line 1726) | PNANOVDB_FORCE_INLINE int pnanovdb_readaccessor_computedirty(PNANOVDB_IN...
function PNANOVDB_FORCE_INLINE (line 1731) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_value_address...
function PNANOVDB_FORCE_INLINE (line 1737) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_addres...
function PNANOVDB_FORCE_INLINE (line 1757) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_addres...
function PNANOVDB_FORCE_INLINE (line 1763) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_addres...
function PNANOVDB_FORCE_INLINE (line 1782) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_addres...
function PNANOVDB_FORCE_INLINE (line 1788) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address...
function PNANOVDB_FORCE_INLINE (line 1812) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address...
function PNANOVDB_FORCE_INLINE (line 1818) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_readaccessor_get_value...
function PNANOVDB_FORCE_INLINE (line 1843) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_readaccessor_get_value...
function PNANOVDB_FORCE_INLINE (line 1849) | PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_readaccessor_get_value...
function PNANOVDB_FORCE_INLINE (line 1859) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_get_dim_and_cache(...
function PNANOVDB_FORCE_INLINE (line 1864) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_lower_get_dim_and_cache...
function PNANOVDB_FORCE_INLINE (line 1882) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_upper_get_dim_and_cache...
function PNANOVDB_FORCE_INLINE (line 1900) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_get_dim_and_cache(...
function PNANOVDB_FORCE_INLINE (line 1922) | PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_readaccessor_get_dim(pn...
function PNANOVDB_FORCE_INLINE (line 1948) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_is_active_and_cache(...
function PNANOVDB_FORCE_INLINE (line 1954) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_is_active_and_cache...
function PNANOVDB_FORCE_INLINE (line 1972) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_is_active_and_cache...
function PNANOVDB_FORCE_INLINE (line 1990) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_root_is_active_and_cache(...
function PNANOVDB_FORCE_INLINE (line 2013) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_is_active(pn...
function PNANOVDB_FORCE_INLINE (line 2039) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply(pnanovdb_buf_t ...
function PNANOVDB_FORCE_INLINE (line 2051) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply_inverse(pnanovd...
function PNANOVDB_FORCE_INLINE (line 2063) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply_jacobi(pnanovdb...
function PNANOVDB_FORCE_INLINE (line 2075) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply_inverse_jacobi(...
function PNANOVDB_FORCE_INLINE (line 2087) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_world_to_indexf(pnan...
function PNANOVDB_FORCE_INLINE (line 2093) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_index_to_worldf(pnan...
function PNANOVDB_FORCE_INLINE (line 2099) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_world_to_index_dirf(...
function PNANOVDB_FORCE_INLINE (line 2105) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_index_to_world_dirf(...
function PNANOVDB_FORCE_INLINE (line 2262) | PNANOVDB_FORCE_INLINE float pnanovdb_dither_lookup(pnanovdb_bool_t enabl...
type pnanovdb_hdda_t (line 2276) | struct pnanovdb_hdda_t
function pnanovdb_coord_t (line 2288) | pnanovdb_coord_t pnanovdb_hdda_pos_to_ijk(PNANOVDB_IN(pnanovdb_vec3_t) pos)
function PNANOVDB_FORCE_INLINE (line 2297) | PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_hdda_pos_to_voxel(PNANOV...
function PNANOVDB_FORCE_INLINE (line 2306) | PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_hdda_ray_start(PNANOVDB_I...
function PNANOVDB_FORCE_INLINE (line 2315) | PNANOVDB_FORCE_INLINE void pnanovdb_hdda_init(PNANOVDB_INOUT(pnanovdb_hd...
function PNANOVDB_FORCE_INLINE (line 2387) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_update(PNANOVDB_INOU...
function pnanovdb_hdda_step (line 2431) | pnanovdb_hdda_step(PNANOVDB_INOUT(pnanovdb_hdda_t) hdda)
function PNANOVDB_FORCE_INLINE (line 2476) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_ray_clip(
function PNANOVDB_FORCE_INLINE (line 2496) | PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_zero_crossing(
FILE: ManiSkill2/warp_maniskill/warp/native/noise.h
function namespace (line 15) | namespace wp
FILE: ManiSkill2/warp_maniskill/warp/native/quat.h
function namespace (line 13) | namespace wp
FILE: ManiSkill2/warp_maniskill/warp/native/rand.h
function namespace (line 15) | namespace wp
FILE: ManiSkill2/warp_maniskill/warp/native/range.h
function namespace (line 3) | namespace wp
function CUDA_CALLABLE (line 28) | CUDA_CALLABLE inline range_t range(int end)
function CUDA_CALLABLE (line 40) | CUDA_CALLABLE inline range_t range(int start, int end)
function CUDA_CALLABLE (line 52) | CUDA_CALLABLE inline range_t range(int start, int end, int step)
function CUDA_CALLABLE (line 65) | CUDA_CALLABLE inline void adj_range(int end, int adj_end, range_t& adj_r...
function CUDA_CALLABLE (line 66) | CUDA_CALLABLE inline void adj_range(int start, int end, int adj_start, i...
function CUDA_CALLABLE (line 67) | CUDA_CALLABLE inline void adj_range(int start, int end, int step, int ad...
function CUDA_CALLABLE (line 78) | CUDA_CALLABLE inline bool iter_cmp(const range_t& r)
function CUDA_CALLABLE (line 92) | CUDA_CALLABLE inline range_t iter_reverse(const range_t& r)
FILE: ManiSkill2/warp_maniskill/warp/native/sort.cpp
function radix_sort_pairs_host (line 12) | void radix_sort_pairs_host(int* keys, int* values, int n)
function radix_sort_reserve (line 79) | void radix_sort_reserve(int n) {}
FILE: ManiSkill2/warp_maniskill/warp/native/spatial.h
function namespace (line 11) | namespace wp
function spatial_vector (line 56) | inline spatial_vector add(const spatial_ve
Copy disabled (too large)
Download .json
Condensed preview — 1448 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (92,668K chars).
[
{
"path": ".gitignore",
"chars": 1997,
"preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packagi"
},
{
"path": "ManiSkill2/CITATION.cff",
"chars": 1979,
"preview": "cff-version: 1.2.0\nmessage: \"Thanks for using ManiSkill2. If you use this software, please cite it as below.\"\nauthors:\n-"
},
{
"path": "ManiSkill2/LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "ManiSkill2/README.md",
"chars": 9500,
"preview": "# ManiSkill2\n\n\n\n[](https://badg"
},
{
"path": "ManiSkill2/docker/10_nvidia.json",
"chars": 106,
"preview": "{\n \"file_format_version\" : \"1.0.0\",\n \"ICD\" : {\n \"library_path\" : \"libEGL_nvidia.so.0\"\n }\n}"
},
{
"path": "ManiSkill2/docker/Dockerfile",
"chars": 1163,
"preview": "FROM nvidia/cudagl:11.3.1-devel-ubuntu20.04\nENV NVIDIA_DRIVER_CAPABILITIES all\n\n# Install os-level packages\nRUN apt-get "
},
{
"path": "ManiSkill2/docker/nvidia_icd.json",
"chars": 139,
"preview": "{\n \"file_format_version\" : \"1.0.0\",\n \"ICD\": {\n \"library_path\": \"libGLX_nvidia.so.0\",\n \"api_version\" "
},
{
"path": "ManiSkill2/docker/nvidia_layers.json",
"chars": 642,
"preview": "{\n \"file_format_version\" : \"1.0.0\",\n \"layer\": {\n \"name\": \"VK_LAYER_NV_optimus\",\n \"type\": \"INSTANCE\","
},
{
"path": "ManiSkill2/docs/.gitignore",
"chars": 5,
"preview": "build"
},
{
"path": "ManiSkill2/docs/Makefile",
"chars": 638,
"preview": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line, and also\n# from the "
},
{
"path": "ManiSkill2/docs/README.md",
"chars": 266,
"preview": "# ManiSkill2 Documentation\n\nInstall Sphinx and Theme\n\n```bash\n# In the project root\npip install -e .[docs]\n```\n\nBuild th"
},
{
"path": "ManiSkill2/docs/make.bat",
"chars": 804,
"preview": "@ECHO OFF\r\n\r\npushd %~dp0\r\n\r\nREM Command file for Sphinx documentation\r\n\r\nif \"%SPHINXBUILD%\" == \"\" (\r\n\tset SPHINXBUILD=sp"
},
{
"path": "ManiSkill2/docs/source/benchmark/submission.md",
"chars": 6399,
"preview": "# Submission\n\nTo participate in the ManiSkill2 challenge, please register on the [challenge website](https://sapien.ucsd"
},
{
"path": "ManiSkill2/docs/source/concepts/controllers.md",
"chars": 4371,
"preview": "# Controllers\n\nControllers are interfaces between policies and robots. The policy outputs actions to the controller, and"
},
{
"path": "ManiSkill2/docs/source/concepts/demonstrations.md",
"chars": 8972,
"preview": "# Demonstrations\n\nHigh-quality demonstration datasets are one of the features of ManiSkill2. Demonstrations can be used "
},
{
"path": "ManiSkill2/docs/source/concepts/environments.md",
"chars": 13529,
"preview": "# Environments\n\n[asset-badge]: https://img.shields.io/badge/download%20asset-yes-blue.svg\n\n## Rigid-body\n\n### Pick-and-P"
},
{
"path": "ManiSkill2/docs/source/concepts/observation.md",
"chars": 11488,
"preview": "# Observation\n\nSee our [colab tutorial](https://colab.research.google.com/github/haosulab/ManiSkill2/blob/main/examples/"
},
{
"path": "ManiSkill2/docs/source/conf.py",
"chars": 1631,
"preview": "# Configuration file for the Sphinx documentation builder.\n#\n# For the full list of built-in configuration values, see t"
},
{
"path": "ManiSkill2/docs/source/getting_started/docker.md",
"chars": 2476,
"preview": "# Docker\n\nDocker provides a convenient way to package software into standardized units for development, shipment and dep"
},
{
"path": "ManiSkill2/docs/source/getting_started/installation.md",
"chars": 6296,
"preview": "# Installation\n\nFrom pip (stable version):\n\n```bash\n# `mani-skill2` or `mani_skill2` is equivalent for pip\npip install m"
},
{
"path": "ManiSkill2/docs/source/getting_started/quickstart.md",
"chars": 7116,
"preview": "# Quickstart\n\n## Gym Interface\n\nHere is a basic example of how to make a ManiSkill2 environment following the interface "
},
{
"path": "ManiSkill2/docs/source/index.rst",
"chars": 786,
"preview": ".. ManiSkill2 documentation master file, created by\n sphinx-quickstart on Fri Jan 6 18:07:26 2023.\n You can adapt t"
},
{
"path": "ManiSkill2/examples/profile_speed/README.md",
"chars": 476,
"preview": "```\nCPU: Intel(R) Core(TM) i9-7960X CPU @ 2.80GHz\nGPU: NVIDIA GeForce GTX 1080 Ti\n```\n\n```\npython profile_sapien.py\n\nNum"
},
{
"path": "ManiSkill2/examples/profile_speed/profile_dmcontrol.py",
"chars": 836,
"preview": "from dm_control import suite\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport time\nimport PIL.Image as Image\nim"
},
{
"path": "ManiSkill2/examples/profile_speed/profile_sapien.py",
"chars": 8829,
"preview": "\"\"\"CartPole-Swingup.\"\"\"\n\nimport numpy as np\nfrom transforms3d.quaternions import axangle2quat\nimport gym\nfrom gym.utils "
},
{
"path": "ManiSkill2/examples/submission/Dockerfile",
"chars": 267,
"preview": "FROM haosulab/mani-skill2:latest\n\n# Install additional python packages you need\nRUN pip install torch==1.12.1\n\n# Copy yo"
},
{
"path": "ManiSkill2/examples/submission/user_solution.py",
"chars": 354,
"preview": "from mani_skill2.evaluation.solution import BasePolicy\n\n\nclass UserPolicy(BasePolicy):\n def act(self, observations):\n"
},
{
"path": "ManiSkill2/examples/tutorials/.gitignore",
"chars": 17,
"preview": "demos/\nlogs/\n*.pt"
},
{
"path": "ManiSkill2/examples/tutorials/1_quickstart.ipynb",
"chars": 9320458,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"colab_type\": \"text\",\n \"id\": \"vie"
},
{
"path": "ManiSkill2/examples/tutorials/2_reinforcement_learning.ipynb",
"chars": 427009,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"colab_type\": \"text\",\n \"id\": \"vie"
},
{
"path": "ManiSkill2/examples/tutorials/README.md",
"chars": 1718,
"preview": "# ManiSkill2 Tutorials\n\nThis folder contains some simple tutorials (notebooks and single-file implementations) for how t"
},
{
"path": "ManiSkill2/examples/tutorials/advanced_rendering.ipynb",
"chars": 3834631,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"colab_type\": \"text\",\n \"id\": \"vie"
},
{
"path": "ManiSkill2/examples/tutorials/customize_environments.ipynb",
"chars": 1254859,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"colab_type\": \"text\",\n \"id\": \"vie"
},
{
"path": "ManiSkill2/examples/tutorials/imitation-learning/README.md",
"chars": 458,
"preview": "# Imitation Learning with ManiSkill2\n\nThis contains single-file implementations that solve with LiftCube environment wit"
},
{
"path": "ManiSkill2/examples/tutorials/imitation-learning/bc_liftcube_rgbd.py",
"chars": 13419,
"preview": "# Import required packages\nimport argparse\nimport os.path as osp\nfrom pathlib import Path\n\nimport gym\nimport h5py\nimport"
},
{
"path": "ManiSkill2/examples/tutorials/imitation-learning/bc_liftcube_state.py",
"chars": 8780,
"preview": "# Import required packages\nimport argparse\nimport os.path as osp\nfrom pathlib import Path\n\nimport gym\nimport h5py\nimport"
},
{
"path": "ManiSkill2/examples/tutorials/reinforcement-learning/README.md",
"chars": 493,
"preview": "# Reinforcement Learning with ManiSkill2\n\nThis contains single-file implementations that solve with LiftCube environment"
},
{
"path": "ManiSkill2/examples/tutorials/reinforcement-learning/sb3_ppo_liftcube_rgbd.py",
"chars": 14384,
"preview": "# Import required packages\nimport argparse\nimport os.path as osp\nfrom functools import partial\n\nimport gym\nimport gym.sp"
},
{
"path": "ManiSkill2/examples/tutorials/reinforcement-learning/sb3_ppo_liftcube_state.py",
"chars": 6949,
"preview": "# Import required packages\nimport argparse\nimport os.path as osp\n\nimport gym\nimport numpy as np\nfrom stable_baselines3 i"
},
{
"path": "ManiSkill2/mani_skill2/__init__.py",
"chars": 2258,
"preview": "import os\nfrom pathlib import Path\n\nfrom .utils.logging_utils import logger\n\n# -----------------------------------------"
},
{
"path": "ManiSkill2/mani_skill2/agents/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ManiSkill2/mani_skill2/agents/base_agent.py",
"chars": 7052,
"preview": "from collections import OrderedDict\nfrom dataclasses import dataclass\nfrom pathlib import Path\nfrom typing import Dict, "
},
{
"path": "ManiSkill2/mani_skill2/agents/base_controller.py",
"chars": 9390,
"preview": "from collections import OrderedDict\nfrom dataclasses import dataclass\nfrom typing import Dict, List\n\nimport numpy as np\n"
},
{
"path": "ManiSkill2/mani_skill2/agents/configs/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ManiSkill2/mani_skill2/agents/configs/mobile_panda/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ManiSkill2/mani_skill2/agents/configs/mobile_panda/defaults.py",
"chars": 10449,
"preview": "from copy import deepcopy\n\nimport numpy as np\n\nfrom mani_skill2.agents.controllers import *\nfrom mani_skill2.sensors.cam"
},
{
"path": "ManiSkill2/mani_skill2/agents/configs/panda/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ManiSkill2/mani_skill2/agents/configs/panda/defaults.py",
"chars": 7194,
"preview": "from copy import deepcopy\n\nfrom mani_skill2.agents.controllers import *\nfrom mani_skill2.sensors.camera import CameraCon"
},
{
"path": "ManiSkill2/mani_skill2/agents/configs/panda/variants.py",
"chars": 3177,
"preview": "import numpy as np\n\nfrom mani_skill2.agents.controllers import *\nfrom mani_skill2.sensors.camera import CameraConfig\n\nfr"
},
{
"path": "ManiSkill2/mani_skill2/agents/configs/xmate3/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ManiSkill2/mani_skill2/agents/configs/xmate3/defaults.py",
"chars": 4646,
"preview": "from mani_skill2.agents.controllers import *\nfrom mani_skill2.sensors.camera import CameraConfig\n\n\nclass Xmate3RobotiqDe"
},
{
"path": "ManiSkill2/mani_skill2/agents/controllers/__init__.py",
"chars": 1017,
"preview": "# isort: off\nfrom .pd_joint_pos import (\n PDJointPosController,\n PDJointPosControllerConfig,\n PDJointPosMimicCo"
},
{
"path": "ManiSkill2/mani_skill2/agents/controllers/passive_controller.py",
"chars": 1191,
"preview": "from dataclasses import dataclass\nfrom typing import Sequence, Union\n\nfrom gym import spaces\nimport numpy as np\n\nfrom .."
},
{
"path": "ManiSkill2/mani_skill2/agents/controllers/pd_base_vel.py",
"chars": 1010,
"preview": "import numpy as np\n\nfrom mani_skill2.utils.geometry import rotate_2d_vec_by_angle\n\nfrom .pd_joint_vel import PDJointVelC"
},
{
"path": "ManiSkill2/mani_skill2/agents/controllers/pd_ee_pose.py",
"chars": 7590,
"preview": "from dataclasses import dataclass\nfrom typing import Sequence, Union\n\nimport numpy as np\nimport sapien.core as sapien\nfr"
},
{
"path": "ManiSkill2/mani_skill2/agents/controllers/pd_joint_pos.py",
"chars": 3819,
"preview": "from dataclasses import dataclass\nfrom typing import Sequence, Union\n\nimport numpy as np\nfrom gym import spaces\n\nfrom .."
},
{
"path": "ManiSkill2/mani_skill2/agents/controllers/pd_joint_pos_vel.py",
"chars": 2165,
"preview": "from dataclasses import dataclass\nfrom typing import Sequence, Union\n\nimport numpy as np\nfrom gym import spaces\n\nfrom .."
},
{
"path": "ManiSkill2/mani_skill2/agents/controllers/pd_joint_vel.py",
"chars": 1520,
"preview": "from dataclasses import dataclass\nfrom typing import Sequence, Union\n\nimport numpy as np\nfrom gym import spaces\n\nfrom .."
},
{
"path": "ManiSkill2/mani_skill2/agents/robots/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ManiSkill2/mani_skill2/agents/robots/mobile_panda.py",
"chars": 7487,
"preview": "from typing import Union, Sequence\n\nimport numpy as np\nimport sapien.core as sapien\nfrom sapien.core import Pose\nfrom tr"
},
{
"path": "ManiSkill2/mani_skill2/agents/robots/panda.py",
"chars": 2787,
"preview": "import numpy as np\nimport sapien.core as sapien\n\nfrom mani_skill2.agents.base_agent import BaseAgent\nfrom mani_skill2.ag"
},
{
"path": "ManiSkill2/mani_skill2/agents/robots/xmate3.py",
"chars": 2277,
"preview": "import numpy as np\nimport sapien.core as sapien\n\nfrom mani_skill2.agents.base_agent import BaseAgent\nfrom mani_skill2.ag"
},
{
"path": "ManiSkill2/mani_skill2/agents/utils.py",
"chars": 2125,
"preview": "# TODO(jigu): Move to sapien_utils.py\nfrom collections import OrderedDict\nfrom typing import Dict, Sequence\n\nimport nump"
},
{
"path": "ManiSkill2/mani_skill2/assets/.gitignore",
"chars": 35,
"preview": "*.zip\n*.convex.stl\n*.nonconvex.stl\n"
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/franka_description/meshes/visual/finger.dae",
"chars": 51239,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<COLLADA xmlns=\"http://www.collada.org/2005/11/COLLADASchema\" version=\"1.4.1\">\n "
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/franka_description/meshes/visual/hand.dae",
"chars": 549239,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<COLLADA xmlns=\"http://www.collada.org/2005/11/COLLADASchema\" version=\"1.4.1\">\n "
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/franka_description/meshes/visual/link0.dae",
"chars": 1591592,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<COLLADA xmlns=\"http://www.collada.org/2005/11/COLLADASchema\" version=\"1.4.1\">\n "
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/franka_description/meshes/visual/link1.dae",
"chars": 978473,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<COLLADA xmlns=\"http://www.collada.org/2005/11/COLLADASchema\" version=\"1.4.1\">\n "
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/franka_description/meshes/visual/link2.dae",
"chars": 998544,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<COLLADA xmlns=\"http://www.collada.org/2005/11/COLLADASchema\" version=\"1.4.1\">\n "
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/franka_description/meshes/visual/link3.dae",
"chars": 1099883,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<COLLADA xmlns=\"http://www.collada.org/2005/11/COLLADASchema\" version=\"1.4.1\">\n "
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/franka_description/meshes/visual/link4.dae",
"chars": 1145723,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<COLLADA xmlns=\"http://www.collada.org/2005/11/COLLADASchema\" version=\"1.4.1\">\n "
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/franka_description/meshes/visual/link5.dae",
"chars": 1438343,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<COLLADA xmlns=\"http://www.collada.org/2005/11/COLLADASchema\" version=\"1.4.1\">\n "
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/franka_description/meshes/visual/link6.dae",
"chars": 1728753,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<COLLADA xmlns=\"http://www.collada.org/2005/11/COLLADASchema\" version=\"1.4.1\">\n "
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/franka_description/meshes/visual/link7.dae",
"chars": 936416,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<COLLADA xmlns=\"http://www.collada.org/2005/11/COLLADASchema\" version=\"1.4.1\">\n "
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/mobile_panda_dual_arm.urdf",
"chars": 28443,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<robot name=\"merged\">\n\n <material name=\"white\">\n <color rgba=\"0.9 0.9 0.9 1.0"
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/mobile_panda_single_arm.urdf",
"chars": 16761,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<robot name=\"merged\">\n\n <material name=\"white\">\n <color rgba=\"0.9 0.9 0.9 1.0"
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/panda_bucket.srdf",
"chars": 52,
"preview": "<?xml version=\"1.0\" ?>\n<robot name=\"panda_bucket\"/>\n"
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/panda_bucket.urdf",
"chars": 8885,
"preview": "<?xml version=\"1.0\" ?>\n<!-- =================================================================================== -->\n<!--"
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/panda_pinch.srdf",
"chars": 5549,
"preview": "<?xml version=\"1.0\" ?>\n<robot name=\"panda\">\n <!--GROUPS: Representation of a set of joints and links. This can be use"
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/panda_pinch.urdf",
"chars": 11065,
"preview": "<?xml version=\"1.0\" ?>\n<!-- =================================================================================== -->\n<!--"
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/panda_stick.srdf",
"chars": 4857,
"preview": "<?xml version=\"1.0\" ?>\n<robot name=\"panda\">\n <!--GROUPS: Representation of a set of joints and links. This can be use"
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/panda_stick.urdf",
"chars": 9384,
"preview": "<?xml version=\"1.0\" ?>\n<!-- =================================================================================== -->\n<!--"
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/panda_v2.srdf",
"chars": 5643,
"preview": "<?xml version=\"1.0\" ?>\n<robot name=\"panda\">\n <!--GROUPS: Representation of a set of joints and links. This can be use"
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/panda_v2.urdf",
"chars": 12361,
"preview": "<?xml version=\"1.0\" ?>\n<!-- =================================================================================== -->\n<!--"
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/panda_v2_gripper.urdf",
"chars": 4221,
"preview": "<?xml version=\"1.0\" ?>\n<!-- =================================================================================== -->\n<!--"
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/panda_v3.srdf",
"chars": 5643,
"preview": "<?xml version=\"1.0\" ?>\n<robot name=\"panda\">\n <!--GROUPS: Representation of a set of joints and links. This can be use"
},
{
"path": "ManiSkill2/mani_skill2/assets/descriptions/panda_v3.urdf",
"chars": 13523,
"preview": "<?xml version=\"1.0\" ?>\n<!-- =================================================================================== -->\n<!--"
},
{
"path": "ManiSkill2/mani_skill2/assets/partnet_mobility/.gitignore",
"chars": 8,
"preview": "/dataset"
},
{
"path": "ManiSkill2/mani_skill2/assets/partnet_mobility/meta/info_bucket_train.json",
"chars": 2294,
"preview": "{\n \"4000\": {\n \"partnet_mobility_id\": 4000,\n \"scale\": 0.3\n },\n \"4001\": {\n \"partnet_mobility"
},
{
"path": "ManiSkill2/mani_skill2/assets/partnet_mobility/meta/info_cabinet_door_train.json",
"chars": 5261,
"preview": "{\n \"1000\": {\n \"num_target_links\": 2,\n \"partnet_mobility_id\": 1000,\n \"scale\": 0.6129399556808358\n"
},
{
"path": "ManiSkill2/mani_skill2/assets/partnet_mobility/meta/info_cabinet_drawer_train.json",
"chars": 3132,
"preview": "{\n \"1000\": {\n \"num_target_links\": 2,\n \"partnet_mobility_id\": 1000,\n \"scale\": 0.6129399556808358\n"
},
{
"path": "ManiSkill2/mani_skill2/assets/partnet_mobility/meta/info_chair_train.json",
"chars": 23046,
"preview": "{\n \"3001\": {\n \"initial_qpos\": [\n 1.537327766418457,\n 0.9842619299888611,\n 3.6"
},
{
"path": "ManiSkill2/mani_skill2/assets/partnet_mobility/meta/info_faucet_train.json",
"chars": 32349,
"preview": "{\n \"5000\": {\n \"bbox\": {\n \"max\": [\n 0.3984,\n 0.6822,\n 0.5873\n ],\n \"min\": [\n "
},
{
"path": "ManiSkill2/mani_skill2/envs/__init__.py",
"chars": 112,
"preview": "from .assembly import *\nfrom .pick_and_place import *\nfrom .misc import *\nfrom .mpm import *\nfrom .ms1 import *\n"
},
{
"path": "ManiSkill2/mani_skill2/envs/assembly/__init__.py",
"chars": 103,
"preview": "# isort: off\nfrom . import assembling_kits\nfrom . import peg_insertion_side\nfrom . import plug_charger\n"
},
{
"path": "ManiSkill2/mani_skill2/envs/assembly/assembling_kits.py",
"chars": 8940,
"preview": "from pathlib import Path\nfrom typing import List\n\nimport numpy as np\nimport sapien.core as sapien\nfrom transforms3d.eule"
},
{
"path": "ManiSkill2/mani_skill2/envs/assembly/base_env.py",
"chars": 3538,
"preview": "from typing import Type, Union\n\nimport numpy as np\nimport sapien.core as sapien\nfrom sapien.core import Pose\n\nfrom mani_"
},
{
"path": "ManiSkill2/mani_skill2/envs/assembly/peg_insertion_side.py",
"chars": 10744,
"preview": "from collections import OrderedDict\n\nimport numpy as np\nimport sapien.core as sapien\nfrom sapien.core import Pose\nfrom t"
},
{
"path": "ManiSkill2/mani_skill2/envs/assembly/plug_charger.py",
"chars": 12014,
"preview": "from collections import OrderedDict\n\nimport numpy as np\nimport sapien.core as sapien\nfrom sapien.core import Pose\nfrom t"
},
{
"path": "ManiSkill2/mani_skill2/envs/misc/__init__.py",
"chars": 56,
"preview": "from . import turn_faucet\nfrom . import avoid_obstacles\n"
},
{
"path": "ManiSkill2/mani_skill2/envs/misc/avoid_obstacles.py",
"chars": 9094,
"preview": "from collections import OrderedDict\nfrom pathlib import Path\n\nimport numpy as np\nimport sapien.core as sapien\nfrom sapie"
},
{
"path": "ManiSkill2/mani_skill2/envs/misc/turn_faucet.py",
"chars": 14060,
"preview": "from collections import OrderedDict\nfrom pathlib import Path\nfrom typing import Dict, List, Union\n\nimport numpy as np\nim"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/.gitignore",
"chars": 5,
"preview": "*.sdf"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/__init__.py",
"chars": 157,
"preview": "# isort: off\nfrom . import excavate_env\nfrom . import fill_env\nfrom . import pour_env\nfrom . import hang_env\nfrom . impo"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/base_env.py",
"chars": 23304,
"preview": "from typing import Dict, List, Optional, Tuple, Union\nimport os\nimport sys\nimport mani_skill2\nimport copy\nimport typing\n"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/excavate_env.py",
"chars": 15279,
"preview": "import numpy as np\nimport sapien.core as sapien\nfrom mani_skill2.agents.configs.panda.variants import PandaBucketConfig\n"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/fill_env.py",
"chars": 11141,
"preview": "import os\nimport numpy as np\nimport sapien.core as sapien\nfrom mani_skill2.envs.mpm.base_env import MPMBaseEnv\nfrom mani"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/hang_env.py",
"chars": 13548,
"preview": "import os\nimport sys\nimport pickle\nimport numpy as np\nimport sapien.core as sapien\nfrom transforms3d.quaternions import "
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/perlin.py",
"chars": 7609,
"preview": "\"\"\"Perlin noise implementation.\"\"\"\n# Licensed under ISC\n# adapted from https://gist.github.com/eevee/26f547457522755cb1f"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/pinch_env.py",
"chars": 9709,
"preview": "from collections import OrderedDict\n\nimport h5py\nimport numpy as np\nimport sapien.core as sapien\nimport warp as wp\nfrom "
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/pour_env.py",
"chars": 20538,
"preview": "import os\nimport numpy as np\nfrom mani_skill2.agents.robots.panda import Panda\nfrom mani_skill2 import PACKAGE_ASSET_DIR"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/common/lights.glsl",
"chars": 3832,
"preview": "struct PointLight {\n vec4 position;\n vec4 emission;\n};\n\nstruct DirectionalLight {\n vec4 direction;\n vec4 emission;\n}"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/common/shadow.glsl",
"chars": 1043,
"preview": "vec3 project(mat4 proj, vec3 point) {\n vec4 v = proj * vec4(point, 1);\n return v.xyz / v.w;\n}\n\nconst int PCF_SampleCou"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/common/view.glsl",
"chars": 189,
"preview": "float ndc_depth_to_z(float z, float proj22, float proj32) {\n return -proj32 / (z + proj22);\n}\n\nfloat z_to_ndc_depth(flo"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/composite.vert",
"chars": 190,
"preview": "#version 450 \n\nlayout (location = 0) out vec2 outUV;\n\nvoid main() \n{\n outUV = vec2((gl_VertexIndex << 1) & 2, gl_Vertex"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/composite0.frag",
"chars": 1916,
"preview": "#version 450\n\nlayout(set = 0, binding = 0) uniform sampler2D samplerPointDepthLinear;\n\nlayout(location = 0) in vec2 inUV"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/composite1.frag",
"chars": 10143,
"preview": "#version 450\n\nlayout(location = 0) in vec2 inUV;\nlayout(location = 0) out vec4 outPoint;\n\nlayout(set = 0, binding = 0) u"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/composite2.frag",
"chars": 6040,
"preview": "#version 450\n\nlayout(set = 0, binding = 0) uniform sampler2D samplerLighting;\nlayout(set = 0, binding = 1) uniform sampl"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/deferred.frag",
"chars": 9678,
"preview": "#version 450\n\nlayout (constant_id = 0) const int NUM_DIRECTIONAL_LIGHTS = 3;\nlayout (constant_id = 1) const int NUM_POIN"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/deferred.vert",
"chars": 190,
"preview": "#version 450 \n\nlayout (location = 0) out vec2 outUV;\n\nvoid main() \n{\n outUV = vec2((gl_VertexIndex << 1) & 2, gl_Vertex"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/gbuffer.frag",
"chars": 3152,
"preview": "#version 450\n\nlayout(set = 0, binding = 0) uniform CameraBuffer {\n mat4 viewMatrix;\n mat4 projectionMatrix;\n mat4 vie"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/gbuffer.vert",
"chars": 1658,
"preview": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\n\nlay"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/gbuffer1.frag",
"chars": 8055,
"preview": "#version 450\n\nlayout (constant_id = 0) const int NUM_DIRECTIONAL_LIGHTS = 3;\nlayout (constant_id = 1) const int NUM_POIN"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/gbuffer1.vert",
"chars": 1511,
"preview": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\n\nlay"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/gbuffer2.frag",
"chars": 1020,
"preview": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\n\nlay"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/gbuffer2.vert",
"chars": 1024,
"preview": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\n\nlay"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/line.frag",
"chars": 319,
"preview": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\n\nlay"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/line.vert",
"chars": 1105,
"preview": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\n\nlay"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/point.frag",
"chars": 1546,
"preview": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\n\nlay"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/point.vert",
"chars": 2591,
"preview": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\n\nlay"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/shadow.vert",
"chars": 811,
"preview": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\n\nlay"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/shadow_point.frag",
"chars": 1176,
"preview": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\n\nlay"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/shader/point/shadow_point.vert",
"chars": 1059,
"preview": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\n\nlay"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/utils.py",
"chars": 5083,
"preview": "from collections import OrderedDict\nfrom typing import Union\n\nimport h5py\nimport numpy as np\nimport sapien.core as sapie"
},
{
"path": "ManiSkill2/mani_skill2/envs/mpm/write_env.py",
"chars": 10356,
"preview": "from collections import OrderedDict\n\nimport h5py\nimport numpy as np\nimport sapien.core as sapien\nfrom transforms3d.euler"
},
{
"path": "ManiSkill2/mani_skill2/envs/ms1/README.md",
"chars": 600,
"preview": "# ManiSkill1 Environments\n\nWe migrate 4 [ManiSkill1](https://github.com/haosulab/ManiSkill) environments to ManiSkill2.\n"
},
{
"path": "ManiSkill2/mani_skill2/envs/ms1/__init__.py",
"chars": 64,
"preview": "from . import move_bucket, push_chair, open_cabinet_door_drawer\n"
},
{
"path": "ManiSkill2/mani_skill2/envs/ms1/base_env.py",
"chars": 7995,
"preview": "from collections import OrderedDict\nfrom typing import Dict, List, Tuple\nfrom pathlib import Path\n\nimport numpy as np\nim"
},
{
"path": "ManiSkill2/mani_skill2/envs/ms1/move_bucket.py",
"chars": 15761,
"preview": "import numpy as np\nimport sapien.core as sapien\nimport trimesh\nfrom sapien.core import Pose\nfrom scipy.spatial import di"
},
{
"path": "ManiSkill2/mani_skill2/envs/ms1/open_cabinet_door_drawer.py",
"chars": 17279,
"preview": "from collections import OrderedDict\n\nimport numpy as np\nimport sapien.core as sapien\nimport trimesh\nfrom sapien.core imp"
},
{
"path": "ManiSkill2/mani_skill2/envs/ms1/push_chair.py",
"chars": 14445,
"preview": "import numpy as np\nimport sapien.core as sapien\nimport trimesh\nfrom sapien.core import Pose\nfrom scipy.spatial import di"
},
{
"path": "ManiSkill2/mani_skill2/envs/pick_and_place/__init__.py",
"chars": 115,
"preview": "# isort: off\nfrom . import pick_cube\nfrom . import stack_cube\nfrom . import pick_single\nfrom . import pick_clutter\n"
},
{
"path": "ManiSkill2/mani_skill2/envs/pick_and_place/base_env.py",
"chars": 5301,
"preview": "from typing import Type, Union\n\nimport numpy as np\nimport sapien.core as sapien\nfrom sapien.core import Pose\n\nfrom mani_"
},
{
"path": "ManiSkill2/mani_skill2/envs/pick_and_place/pick_clutter.py",
"chars": 9505,
"preview": "from collections import OrderedDict\nfrom pathlib import Path\nfrom typing import Dict, List\n\nimport numpy as np\nimport sa"
},
{
"path": "ManiSkill2/mani_skill2/envs/pick_and_place/pick_cube.py",
"chars": 5807,
"preview": "from collections import OrderedDict\n\nimport numpy as np\nimport sapien.core as sapien\nfrom sapien.core import Pose\nfrom t"
},
{
"path": "ManiSkill2/mani_skill2/envs/pick_and_place/pick_single.py",
"chars": 20137,
"preview": "from collections import OrderedDict\nfrom pathlib import Path\nfrom typing import Dict, List\n\nimport numpy as np\nimport sa"
},
{
"path": "ManiSkill2/mani_skill2/envs/pick_and_place/stack_cube.py",
"chars": 8907,
"preview": "from collections import OrderedDict\nfrom typing import List, Tuple\n\nimport numpy as np\nimport sapien.core as sapien\nfrom"
},
{
"path": "ManiSkill2/mani_skill2/envs/sapien_env.py",
"chars": 27791,
"preview": "import os\nfrom collections import OrderedDict\nfrom typing import Dict, Optional, Sequence, Union\n\nimport gym\nimport nump"
},
{
"path": "ManiSkill2/mani_skill2/evaluation/__init__.py",
"chars": 33,
"preview": "from .solution import BasePolicy\n"
},
{
"path": "ManiSkill2/mani_skill2/evaluation/evaluator.py",
"chars": 4391,
"preview": "from collections import OrderedDict\nfrom typing import Callable, List, Type\n\nimport gym\nimport numpy as np\n\nfrom mani_sk"
},
{
"path": "ManiSkill2/mani_skill2/evaluation/run_evaluation.py",
"chars": 4952,
"preview": "import os\nimport sys\n\nfrom tqdm import tqdm\n\nfrom mani_skill2.evaluation.evaluator import BaseEvaluator\nfrom mani_skill2"
},
{
"path": "ManiSkill2/mani_skill2/evaluation/solution.py",
"chars": 1276,
"preview": "import numpy as np\nfrom gym import spaces\n\n\nclass BasePolicy:\n def __init__(\n self, env_id: str, observation_s"
},
{
"path": "ManiSkill2/mani_skill2/examples/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ManiSkill2/mani_skill2/examples/demo_manual_control.py",
"chars": 8407,
"preview": "import argparse\n\nimport gym\nimport numpy as np\n\nfrom mani_skill2 import make_box_space_readable\nfrom mani_skill2.envs.sa"
},
{
"path": "ManiSkill2/mani_skill2/examples/demo_random_action.py",
"chars": 1997,
"preview": "import argparse\n\nimport gym\nimport numpy as np\n\nfrom mani_skill2.envs.sapien_env import BaseEnv\nfrom mani_skill2.utils.w"
},
{
"path": "ManiSkill2/mani_skill2/examples/demo_vec_env.py",
"chars": 3840,
"preview": "import argparse\nimport time\n\nimport gym\nimport numpy as np\n\nfrom mani_skill2 import make_box_space_readable\nfrom mani_sk"
},
{
"path": "ManiSkill2/mani_skill2/sensors/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ManiSkill2/mani_skill2/sensors/camera.py",
"chars": 7616,
"preview": "from collections import OrderedDict\nfrom typing import Dict, List, Sequence\n\nimport numpy as np\nimport sapien.core as sa"
},
{
"path": "ManiSkill2/mani_skill2/sensors/depth_camera.py",
"chars": 4997,
"preview": "from collections import OrderedDict\nfrom typing import Dict, List, Sequence\n\nimport numpy as np\nimport sapien.core as sa"
},
{
"path": "ManiSkill2/mani_skill2/trajectory/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ManiSkill2/mani_skill2/trajectory/merge_trajectory.py",
"chars": 2275,
"preview": "import argparse\nfrom pathlib import Path\n\nimport h5py\n\nfrom mani_skill2.utils.io_utils import dump_json, load_json\n\n\ndef"
},
{
"path": "ManiSkill2/mani_skill2/trajectory/replay_trajectory.py",
"chars": 17212,
"preview": "\"\"\"Replay the trajectory stored in HDF5.\nThe replayed trajectory can use different observation modes and control modes.\n"
},
{
"path": "ManiSkill2/mani_skill2/utils/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ManiSkill2/mani_skill2/utils/bounding_cylinder.py",
"chars": 4731,
"preview": "#\n# Smallest enclosing circle - Library (Python)\n#\n# Copyright (c) 2020 Project Nayuki\n# https://www.nayuki.io/page/smal"
},
{
"path": "ManiSkill2/mani_skill2/utils/common.py",
"chars": 8285,
"preview": "from collections import defaultdict, OrderedDict\nfrom typing import Dict, Sequence\n\nimport gym\nimport numpy as np\nfrom g"
},
{
"path": "ManiSkill2/mani_skill2/utils/download_asset.py",
"chars": 10282,
"preview": "\"\"\"Utilities to download assets.\n\nSee also:\n https://github.com/facebookresearch/habitat-sim/blob/main/src_python/hab"
},
{
"path": "ManiSkill2/mani_skill2/utils/download_demo.py",
"chars": 6018,
"preview": "import argparse\nimport os\nimport os.path as osp\nimport zipfile\n\nimport gdown\n\nDATASET_SOURCES = {}\n\n# Rigid body envs\nDA"
},
{
"path": "ManiSkill2/mani_skill2/utils/geometry.py",
"chars": 5549,
"preview": "from typing import Dict\n\nimport numpy as np\nimport sapien.core as sapien\nfrom sapien.core import Articulation, Actor, Li"
},
{
"path": "ManiSkill2/mani_skill2/utils/io_utils.py",
"chars": 1590,
"preview": "import gzip\nimport json\nfrom pathlib import Path\nfrom typing import Sequence, Union\n\nimport numpy as np\n\n\nclass CustomJs"
},
{
"path": "ManiSkill2/mani_skill2/utils/logging_utils.py",
"chars": 1766,
"preview": "import logging\n\n\n# https://github.com/openai/gym/blob/master/gym/utils/colorize.py\ncolor2num = dict(\n gray=30,\n re"
},
{
"path": "ManiSkill2/mani_skill2/utils/precompile_mpm.py",
"chars": 279,
"preview": "import gym\n\nfrom mani_skill2.envs import mpm\n\nENV_IDS = [\"Excavate-v0\", \"Fill-v0\", \"Pour-v0\", \"Hang-v0\", \"Write-v0\", \"Pi"
},
{
"path": "ManiSkill2/mani_skill2/utils/registration.py",
"chars": 5115,
"preview": "from copy import deepcopy\nfrom functools import partial\nfrom typing import Dict, Type\n\nimport gym\nfrom gym.envs.registra"
},
{
"path": "ManiSkill2/mani_skill2/utils/sapien_utils.py",
"chars": 12880,
"preview": "from contextlib import contextmanager\nfrom copy import deepcopy\nfrom typing import Dict, List, Optional, Tuple, Union\n\ni"
},
{
"path": "ManiSkill2/mani_skill2/utils/trimesh_utils.py",
"chars": 3178,
"preview": "from typing import Dict, List\n\nimport numpy as np\nimport sapien.core as sapien\nimport trimesh\n\n\ndef get_actor_meshes(act"
},
{
"path": "ManiSkill2/mani_skill2/utils/visualization/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ManiSkill2/mani_skill2/utils/visualization/cv2_utils.py",
"chars": 2071,
"preview": "import os\nfrom typing import List\n\nimport cv2\nimport numpy as np\nimport tqdm\n\n\ndef images_to_video(\n images: List[np."
},
{
"path": "ManiSkill2/mani_skill2/utils/visualization/jupyter_utils.py",
"chars": 1322,
"preview": "from typing import List\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom IPython.display import HTML, display\nfr"
},
{
"path": "ManiSkill2/mani_skill2/utils/visualization/misc.py",
"chars": 6818,
"preview": "import os\nfrom typing import Dict, List, Optional\n\nimport cv2\nimport imageio\nimport numpy as np\nimport tqdm\n\n\ndef images"
},
{
"path": "ManiSkill2/mani_skill2/utils/wrappers/__init__.py",
"chars": 34,
"preview": "from .record import RecordEpisode\n"
},
{
"path": "ManiSkill2/mani_skill2/utils/wrappers/common.py",
"chars": 1185,
"preview": "import gym\nfrom gym import spaces\n\nfrom ..common import (\n clip_and_scale_action,\n inv_clip_and_scale_action,\n "
},
{
"path": "ManiSkill2/mani_skill2/utils/wrappers/observation.py",
"chars": 9175,
"preview": "from collections import OrderedDict\nfrom copy import deepcopy\nfrom typing import Sequence\n\nimport gym\nimport numpy as np"
},
{
"path": "ManiSkill2/mani_skill2/utils/wrappers/record.py",
"chars": 12197,
"preview": "import copy\nimport time\nfrom pathlib import Path\n\nimport gym\nimport h5py\nimport numpy as np\nfrom gym import spaces\n\nfrom"
},
{
"path": "ManiSkill2/mani_skill2/utils/wrappers/sb3.py",
"chars": 942,
"preview": "import gym\n\nclass ContinuousTaskWrapper(gym.Wrapper):\n def __init__(self, env, max_episode_steps: int) -> None:\n "
},
{
"path": "ManiSkill2/mani_skill2/vector/__init__.py",
"chars": 74,
"preview": "from .vec_env import VecEnv, VecEnvWrapper\nfrom .registration import make\n"
},
{
"path": "ManiSkill2/mani_skill2/vector/registration.py",
"chars": 2878,
"preview": "from functools import partial\nfrom typing import Sequence\n\nimport gym\n\nfrom .vec_env import PointCloudVecEnv, RGBDVecEnv"
},
{
"path": "ManiSkill2/mani_skill2/vector/vec_env.py",
"chars": 22328,
"preview": "\"\"\"ManiSkill2 vectorized environment.\n\nSee also:\n https://github.com/DLR-RM/stable-baselines3/blob/master/stable_base"
},
{
"path": "ManiSkill2/mani_skill2/vector/wrappers/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ManiSkill2/mani_skill2/vector/wrappers/observation.py",
"chars": 3722,
"preview": "from copy import deepcopy\n\nimport torch\n\nfrom ..vec_env import VecEnv, VecEnvObservationWrapper\n\n\ndef batch_isin(x: torc"
},
{
"path": "ManiSkill2/mani_skill2/vector/wrappers/sb3.py",
"chars": 2493,
"preview": "from typing import Any, List, Optional, Sequence, Tuple, Type, Union\n\nimport gym\nimport numpy as np\nfrom stable_baseline"
},
{
"path": "ManiSkill2/pyproject.toml",
"chars": 273,
"preview": "[build-system]\nrequires = [\"setuptools>=62.3.0\"]\nbuild-backend = \"setuptools.build_meta\"\n\n[tool.black]\nline_length = 88 "
},
{
"path": "ManiSkill2/pyrightconfig.json",
"chars": 83,
"preview": "{\n \"exclude\": [\n \"**/__pycache__\",\n \"mani_skill2/assets\",\n ],\n}"
},
{
"path": "ManiSkill2/requirements.txt",
"chars": 246,
"preview": "# core\nnumpy<1.24\nscipy\ngym>=0.18.3,<=0.21.0\nsapien==2.2.1\nimportlib_metadata<5; python_version < '3.8'\n# basic\nh5py\npyy"
},
{
"path": "ManiSkill2/setup.py",
"chars": 2331,
"preview": "from setuptools import find_packages, setup\n\nlong_description = \"\"\"ManiSkill2 is a unified benchmark for learning genera"
},
{
"path": "ManiSkill2/tests/manual_test_venv.py",
"chars": 2334,
"preview": "from functools import partial\n\nimport gym\nimport numpy as np\nimport torch\nfrom stable_baselines3.common.vec_env import S"
},
{
"path": "ManiSkill2/tests/test_envs.py",
"chars": 829,
"preview": "import gym\nimport pytest\n\nfrom mani_skill2.envs.sapien_env import BaseEnv\n\nENV_IDS = [\n \"LiftCube-v0\",\n \"PickCube-"
},
{
"path": "ManiSkill2/warp_maniskill/.gitattributes",
"chars": 882,
"preview": "# Normalize text files on commit to LF endings by default\n* text=auto\n# Make sure Windows batch files preserve CR/LF lin"
},
{
"path": "ManiSkill2/warp_maniskill/.gitignore",
"chars": 248,
"preview": "__pycache__\n.idea\n.history\n*.net\n*.prof\nwarp/kernels\nwarp.egg-info\n.vscode\narchive\n*.o\n*.exp\n*.dll\n*.lib\n*.cpp.obj\n*.pdb"
},
{
"path": "ManiSkill2/warp_maniskill/CHANGELOG.md",
"chars": 13624,
"preview": "# CHANGELOG\n\n\n## [0.3.1] - 2022-07-12\n\n- Fix for marching cubes reallocation after initialization\n- Add support for clos"
},
{
"path": "ManiSkill2/warp_maniskill/LICENSE.md",
"chars": 4026,
"preview": "# NVIDIA Source Code License for Warp\n\n## 1. Definitions\n\n“Licensor” means any person or entity that distributes its Wor"
},
{
"path": "ManiSkill2/warp_maniskill/README.md",
"chars": 6132,
"preview": "# Warp Maniskill\nEverything under this directory is modified from NVIDIA Warp framework.\n\nPlease refer to [https://githu"
}
]
// ... and 1248 more files (download for full content)
About this extraction
This page contains the full source code of the xlang-ai/text2reward GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1448 files (108.1 MB), approximately 23.0M tokens, and a symbol index with 4904 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.