Copy disabled (too large)
Download .txt
Showing preview only (22,102K chars total). Download the full file to get everything.
Repository: Genesis-Embodied-AI/Genesis
Branch: main
Commit: 1f3674fdc611
Files: 854
Total size: 158.9 MB
Directory structure:
gitextract_ag6vedhl/
├── .gitattributes
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── 1-bug-report.yml
│ │ ├── 2-feature-request.yml
│ │ └── config.yml
│ ├── contributing/
│ │ ├── ARCHITECTURE.md
│ │ ├── CODING_CONVENTIONS.md
│ │ ├── EXAMPLES.md
│ │ ├── PULL_REQUESTS.md
│ │ ├── TESTING.md
│ │ └── USD_PARSER.md
│ ├── pull_request_template.md
│ └── workflows/
│ ├── alarm.yml
│ ├── examples.yml
│ ├── format.yml
│ ├── generic.yml
│ ├── production.yml
│ └── scripts/
│ ├── alarm.py
│ └── production_build.sh
├── .gitignore
├── .gitmodules
├── .pre-commit-config.yaml
├── .readthedocs.yaml
├── AGENTS.md
├── LICENSE
├── MANIFEST.in
├── README.md
├── README_CN.md
├── README_FR.md
├── README_JA.md
├── README_KR.md
├── RELEASE.md
├── docker/
│ ├── 10_nvidia.json
│ ├── Dockerfile
│ ├── Dockerfile.amdgpu
│ ├── build_luisa.sh
│ ├── nvidia_icd.json
│ └── nvidia_layers.json
├── examples/
│ ├── IPC_Solver/
│ │ ├── README.md
│ │ ├── ipc_momentum.py
│ │ ├── ipc_objects_falling.py
│ │ ├── ipc_robot_cloth_teleop.py
│ │ └── ipc_robot_grasp_cube.py
│ ├── collision/
│ │ ├── contype.py
│ │ ├── pyramid.py
│ │ └── tower.py
│ ├── coupling/
│ │ ├── cloth_attached_to_rigid.py
│ │ ├── cloth_on_rigid.py
│ │ ├── cut_dragon.py
│ │ ├── fem_cube_linked_with_arm.py
│ │ ├── flush_cubes.py
│ │ ├── grasp_soft_cube.py
│ │ ├── rigid_mpm_attachment.py
│ │ ├── sand_wheel.py
│ │ ├── sph_mpm.py
│ │ ├── sph_rigid.py
│ │ └── water_wheel.py
│ ├── ddp_multi_gpu.py
│ ├── differentiable_push.py
│ ├── drone/
│ │ ├── README.md
│ │ ├── fly.py
│ │ ├── fly_route.py
│ │ ├── hover_env.py
│ │ ├── hover_eval.py
│ │ ├── hover_train.py
│ │ ├── interactive_drone.py
│ │ └── quadcopter_controller.py
│ ├── elastic_dragon.py
│ ├── fem_hard_and_soft_constraint.py
│ ├── hibernation.py
│ ├── keyboard_teleop.py
│ ├── kinematic/
│ │ └── go2_kinematic.py
│ ├── locomotion/
│ │ ├── backflip/
│ │ │ └── readme.md
│ │ ├── go2_backflip.py
│ │ ├── go2_env.py
│ │ ├── go2_eval.py
│ │ └── go2_train.py
│ ├── manipulation/
│ │ ├── behavior_cloning.py
│ │ ├── grasp_env.py
│ │ ├── grasp_eval.py
│ │ └── grasp_train.py
│ ├── pbd_liquid.py
│ ├── render_async.py
│ ├── rendering/
│ │ ├── demo.py
│ │ ├── follow_entity.py
│ │ ├── moving_camera.py
│ │ └── speed_test.py
│ ├── rigid/
│ │ ├── accelerometer_duck.py
│ │ ├── accelerometer_franka.py
│ │ ├── apply_external_force_torque.py
│ │ ├── closed_loop.py
│ │ ├── control_franka.py
│ │ ├── control_mesh.py
│ │ ├── convex_decomposition.py
│ │ ├── diffik_controller.py
│ │ ├── domain_randomization.py
│ │ ├── franka_cube.py
│ │ ├── grasp_bottle.py
│ │ ├── gravity_compensation.py
│ │ ├── heterogeneous_simulation.py
│ │ ├── ik_custom_chain.py
│ │ ├── ik_duck.py
│ │ ├── ik_franka.py
│ │ ├── ik_franka_batched.py
│ │ ├── ik_shadow_hand.py
│ │ ├── merge_entities.py
│ │ ├── multi_gpu.py
│ │ ├── nonconvex_mesh.py
│ │ ├── set_phys_attr.py
│ │ ├── single_franka.py
│ │ ├── single_franka_batch_render.py
│ │ ├── single_franka_envs.py
│ │ ├── suction_cup.py
│ │ ├── terrain_from_mesh.py
│ │ ├── terrain_height_field.py
│ │ └── terrain_subterrain.py
│ ├── sap_coupling/
│ │ ├── fem_fixed_constraint.py
│ │ ├── fem_sphere_and_cube.py
│ │ ├── franka_grasp_fem_sphere.py
│ │ └── franka_grasp_rigid_cube.py
│ ├── sensors/
│ │ ├── camera_as_sensor.py
│ │ ├── contact_force_go2.py
│ │ ├── imu_franka.py
│ │ ├── kinematic_contact_sandbox.py
│ │ ├── lidar_teleop.py
│ │ ├── proximity_shadowhand.py
│ │ ├── tactile_elastomer_franka.py
│ │ ├── tactile_elastomer_sandbox.py
│ │ └── temperature_grid.py
│ ├── smoke.py
│ ├── speed_benchmark/
│ │ ├── anymal_c.py
│ │ ├── franka.py
│ │ └── timers.py
│ ├── tutorials/
│ │ ├── IK_motion_planning_grasp.py
│ │ ├── advanced_IK_multilink.py
│ │ ├── advanced_hybrid_robot.py
│ │ ├── advanced_muscle.py
│ │ ├── advanced_worm.py
│ │ ├── batched_IK.py
│ │ ├── control_your_robot.py
│ │ ├── draw_debug.py
│ │ ├── entity_name.py
│ │ ├── hello_genesis.py
│ │ ├── interactive_debugging.py
│ │ ├── mpm.py
│ │ ├── parallel_simulation.py
│ │ ├── pbd_cloth.py
│ │ ├── position_control_comparison.py
│ │ ├── selecting_rendered_envs.py
│ │ ├── sph_liquid.py
│ │ └── visualization.py
│ ├── usd/
│ │ └── import_stage.py
│ └── viewer_plugin/
│ ├── mesh_point_selector.py
│ └── mouse_interaction.py
├── genesis/
│ ├── __init__.py
│ ├── _main.py
│ ├── assets/
│ │ ├── meshes/
│ │ │ ├── Airplane/
│ │ │ │ ├── airplane.mtl
│ │ │ │ ├── airplane.obj
│ │ │ │ └── textures/
│ │ │ │ └── diffuse.dds
│ │ │ ├── axis.obj
│ │ │ ├── bathtub/
│ │ │ │ ├── bathtub.obj
│ │ │ │ └── material.mtl
│ │ │ ├── boat/
│ │ │ │ ├── boat.obj
│ │ │ │ └── material.mtl
│ │ │ ├── bunny.obj
│ │ │ ├── camera/
│ │ │ │ └── camera.glb
│ │ │ ├── chopping-board/
│ │ │ │ └── source/
│ │ │ │ └── chopping_board.glb
│ │ │ ├── cloth.obj
│ │ │ ├── cross_cutter.obj
│ │ │ ├── dragon/
│ │ │ │ ├── dragon.obj
│ │ │ │ └── material.mtl
│ │ │ ├── dragon.obj
│ │ │ ├── duck/
│ │ │ │ ├── duck.obj
│ │ │ │ └── material.mtl
│ │ │ ├── duck.obj
│ │ │ ├── env_sphere/
│ │ │ │ ├── env_sphere.obj
│ │ │ │ └── material.mtl
│ │ │ ├── icecream_dispenser.obj
│ │ │ ├── sphere.obj
│ │ │ ├── stirrer.obj
│ │ │ ├── tank.obj
│ │ │ ├── terrain_45.obj
│ │ │ ├── wooden_sphere_OBJ/
│ │ │ │ ├── wooden_sphere.mtl
│ │ │ │ └── wooden_sphere.obj
│ │ │ └── worm/
│ │ │ ├── worm.mtl
│ │ │ └── worm.obj
│ │ ├── urdf/
│ │ │ ├── 3763/
│ │ │ │ ├── bounding_box.json
│ │ │ │ ├── link_and_joint.txt
│ │ │ │ ├── meta.json
│ │ │ │ ├── mobility.urdf
│ │ │ │ ├── mobility_v2.json
│ │ │ │ ├── mobility_vhacd.urdf
│ │ │ │ ├── parts_render/
│ │ │ │ │ ├── 0.txt
│ │ │ │ │ ├── 1.txt
│ │ │ │ │ ├── 5.txt
│ │ │ │ │ ├── 6.txt
│ │ │ │ │ └── 7.txt
│ │ │ │ ├── parts_render_after_merging/
│ │ │ │ │ ├── 0.txt
│ │ │ │ │ ├── 1.txt
│ │ │ │ │ ├── 2.txt
│ │ │ │ │ ├── 3.txt
│ │ │ │ │ └── 4.txt
│ │ │ │ ├── point_sample/
│ │ │ │ │ ├── label-10000.txt
│ │ │ │ │ ├── ply-10000.ply
│ │ │ │ │ ├── pts-10000.pts
│ │ │ │ │ ├── pts-10000.txt
│ │ │ │ │ ├── sample-points-all-label-10000.txt
│ │ │ │ │ ├── sample-points-all-pts-label-10000.ply
│ │ │ │ │ ├── sample-points-all-pts-nor-rgba-10000.ply
│ │ │ │ │ └── sample-points-all-pts-nor-rgba-10000.txt
│ │ │ │ ├── result.json
│ │ │ │ ├── result_after_merging.json
│ │ │ │ ├── semantics.txt
│ │ │ │ ├── textured_objs/
│ │ │ │ │ ├── original-1.mtl
│ │ │ │ │ ├── original-1.obj
│ │ │ │ │ ├── original-1_log.txt
│ │ │ │ │ ├── original-1_vhacd.obj
│ │ │ │ │ ├── original-2.mtl
│ │ │ │ │ ├── original-2.obj
│ │ │ │ │ ├── original-2_log.txt
│ │ │ │ │ ├── original-2_vhacd.obj
│ │ │ │ │ ├── original-3.mtl
│ │ │ │ │ ├── original-3.obj
│ │ │ │ │ ├── original-3_log.txt
│ │ │ │ │ └── original-3_vhacd.obj
│ │ │ │ ├── tree_hier.html
│ │ │ │ └── tree_hier_after_merging.html
│ │ │ ├── anymal_c/
│ │ │ │ ├── ANYmal_c_license.txt
│ │ │ │ ├── meshes/
│ │ │ │ │ ├── base.dae
│ │ │ │ │ ├── battery.dae
│ │ │ │ │ ├── bottom_shell.dae
│ │ │ │ │ ├── depth_camera.dae
│ │ │ │ │ ├── drive.dae
│ │ │ │ │ ├── face.dae
│ │ │ │ │ ├── foot.dae
│ │ │ │ │ ├── handle.dae
│ │ │ │ │ ├── hatch.dae
│ │ │ │ │ ├── hip_l.dae
│ │ │ │ │ ├── hip_r.dae
│ │ │ │ │ ├── lidar.dae
│ │ │ │ │ ├── lidar_cage.dae
│ │ │ │ │ ├── remote.dae
│ │ │ │ │ ├── shank_l.dae
│ │ │ │ │ ├── shank_r.dae
│ │ │ │ │ ├── thigh.dae
│ │ │ │ │ ├── top_shell.dae
│ │ │ │ │ └── wide_angle_camera.dae
│ │ │ │ └── urdf/
│ │ │ │ └── anymal_c.urdf
│ │ │ ├── blue_box/
│ │ │ │ ├── assets/
│ │ │ │ │ ├── part_1.part
│ │ │ │ │ └── part_1.stl
│ │ │ │ └── model.urdf
│ │ │ ├── drones/
│ │ │ │ ├── body.mtl
│ │ │ │ ├── body.obj
│ │ │ │ ├── cf2.dae
│ │ │ │ ├── cf2p.urdf
│ │ │ │ ├── cf2x.urdf
│ │ │ │ ├── propeller0.mtl
│ │ │ │ ├── propeller0.obj
│ │ │ │ ├── propeller1.mtl
│ │ │ │ ├── propeller1.obj
│ │ │ │ ├── propeller2.mtl
│ │ │ │ ├── propeller2.obj
│ │ │ │ ├── propeller3.mtl
│ │ │ │ ├── propeller3.obj
│ │ │ │ └── racer.urdf
│ │ │ ├── go2/
│ │ │ │ ├── dae/
│ │ │ │ │ ├── base.dae
│ │ │ │ │ ├── calf.dae
│ │ │ │ │ ├── calf_mirror.dae
│ │ │ │ │ ├── foot.dae
│ │ │ │ │ ├── hip.dae
│ │ │ │ │ ├── thigh.dae
│ │ │ │ │ └── thigh_mirror.dae
│ │ │ │ └── urdf/
│ │ │ │ └── go2.urdf
│ │ │ ├── kuka_iiwa/
│ │ │ │ ├── kuka_with_gripper.sdf
│ │ │ │ ├── kuka_with_gripper2.sdf
│ │ │ │ ├── kuka_world.sdf
│ │ │ │ ├── meshes/
│ │ │ │ │ ├── base_link.dae
│ │ │ │ │ ├── finger_base_left.stl
│ │ │ │ │ ├── finger_base_right.stl
│ │ │ │ │ ├── finger_tip_left.stl
│ │ │ │ │ ├── finger_tip_right.stl
│ │ │ │ │ ├── link_0.mtl
│ │ │ │ │ ├── link_0.obj
│ │ │ │ │ ├── link_0.stl
│ │ │ │ │ ├── link_1.mtl
│ │ │ │ │ ├── link_1.obj
│ │ │ │ │ ├── link_1.stl
│ │ │ │ │ ├── link_2.mtl
│ │ │ │ │ ├── link_2.obj
│ │ │ │ │ ├── link_2.stl
│ │ │ │ │ ├── link_3.mtl
│ │ │ │ │ ├── link_3.obj
│ │ │ │ │ ├── link_3.stl
│ │ │ │ │ ├── link_4.mtl
│ │ │ │ │ ├── link_4.obj
│ │ │ │ │ ├── link_4.stl
│ │ │ │ │ ├── link_5.mtl
│ │ │ │ │ ├── link_5.obj
│ │ │ │ │ ├── link_5.stl
│ │ │ │ │ ├── link_6.mtl
│ │ │ │ │ ├── link_6.obj
│ │ │ │ │ ├── link_6.stl
│ │ │ │ │ ├── link_7.mtl
│ │ │ │ │ ├── link_7.obj
│ │ │ │ │ └── link_7.stl
│ │ │ │ ├── model.sdf
│ │ │ │ ├── model.urdf
│ │ │ │ ├── model2.sdf
│ │ │ │ ├── model_for_sdf.urdf
│ │ │ │ ├── model_free_base.urdf
│ │ │ │ ├── model_mobile.urdf
│ │ │ │ └── model_vr_limits.urdf
│ │ │ ├── panda_bullet/
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── hand.urdf
│ │ │ │ ├── meshes/
│ │ │ │ │ ├── collision/
│ │ │ │ │ │ ├── finger.obj
│ │ │ │ │ │ ├── hand.obj
│ │ │ │ │ │ ├── link0.obj
│ │ │ │ │ │ ├── link1.obj
│ │ │ │ │ │ ├── link2.obj
│ │ │ │ │ │ ├── link3.obj
│ │ │ │ │ │ ├── link4.obj
│ │ │ │ │ │ ├── link5.obj
│ │ │ │ │ │ ├── link6.mtl
│ │ │ │ │ │ ├── link6.obj
│ │ │ │ │ │ └── link7.obj
│ │ │ │ │ └── visual/
│ │ │ │ │ ├── base_link.dae
│ │ │ │ │ ├── finger.mtl
│ │ │ │ │ ├── finger.obj
│ │ │ │ │ ├── hand.mtl
│ │ │ │ │ ├── hand.obj
│ │ │ │ │ ├── link1.mtl
│ │ │ │ │ ├── link1.obj
│ │ │ │ │ ├── link2.mtl
│ │ │ │ │ ├── link2.obj
│ │ │ │ │ ├── link3.mtl
│ │ │ │ │ ├── link3.obj
│ │ │ │ │ ├── link4.mtl
│ │ │ │ │ ├── link4.obj
│ │ │ │ │ ├── link5.mtl
│ │ │ │ │ ├── link5.obj
│ │ │ │ │ ├── link6.mtl
│ │ │ │ │ ├── link6.obj
│ │ │ │ │ └── visualShapeBench.json_0.json
│ │ │ │ ├── panda.urdf
│ │ │ │ ├── panda_nohand.urdf
│ │ │ │ ├── panda_slider_mobile.urdf
│ │ │ │ └── panda_suction.urdf
│ │ │ ├── plane/
│ │ │ │ ├── generate_checker.py
│ │ │ │ ├── plane.mtl
│ │ │ │ ├── plane.urdf
│ │ │ │ ├── plane100.obj
│ │ │ │ ├── plane100_light.obj
│ │ │ │ ├── plane_light.mtl
│ │ │ │ └── plane_light.urdf
│ │ │ ├── shadow_hand/
│ │ │ │ ├── meshes/
│ │ │ │ │ ├── collision/
│ │ │ │ │ │ ├── finger_distal.stl
│ │ │ │ │ │ ├── finger_middle.stl
│ │ │ │ │ │ ├── finger_proximal.stl
│ │ │ │ │ │ ├── forearm.stl
│ │ │ │ │ │ ├── knuckle.stl
│ │ │ │ │ │ ├── metacarpal.stl
│ │ │ │ │ │ ├── palm.stl
│ │ │ │ │ │ ├── thumb_distal.stl
│ │ │ │ │ │ ├── thumb_middle.stl
│ │ │ │ │ │ ├── thumb_proximal.stl
│ │ │ │ │ │ └── wrist.stl
│ │ │ │ │ └── visual/
│ │ │ │ │ ├── finger_distal.dae
│ │ │ │ │ ├── finger_middle.dae
│ │ │ │ │ ├── finger_proximal.dae
│ │ │ │ │ ├── forearm.dae
│ │ │ │ │ ├── knuckle.dae
│ │ │ │ │ ├── metacarpal.dae
│ │ │ │ │ ├── palm.dae
│ │ │ │ │ ├── thumb_distal.dae
│ │ │ │ │ ├── thumb_middle.dae
│ │ │ │ │ ├── thumb_proximal.dae
│ │ │ │ │ └── wrist.dae
│ │ │ │ └── shadow_hand.urdf
│ │ │ ├── simple/
│ │ │ │ ├── two_cube_prismatic.urdf
│ │ │ │ ├── two_cube_revolute.urdf
│ │ │ │ └── two_link_arm.urdf
│ │ │ └── wheel/
│ │ │ ├── fancy_wheel.obj
│ │ │ ├── fancy_wheel.urdf
│ │ │ ├── material.mtl
│ │ │ ├── wheel.obj
│ │ │ └── wheel.urdf
│ │ └── xml/
│ │ ├── ant.xml
│ │ ├── ant_grasp_ball.xml
│ │ ├── ant_grasp_body.xml
│ │ ├── ant_grasp_ground.xml
│ │ ├── cable.xml
│ │ ├── four_bar_linkage.xml
│ │ ├── four_bar_linkage_weld.xml
│ │ ├── franka_emika_panda/
│ │ │ ├── README.md
│ │ │ ├── assets/
│ │ │ │ ├── finger_0.obj
│ │ │ │ ├── finger_1.obj
│ │ │ │ ├── hand.stl
│ │ │ │ ├── hand_0.obj
│ │ │ │ ├── hand_1.obj
│ │ │ │ ├── hand_2.obj
│ │ │ │ ├── hand_3.obj
│ │ │ │ ├── hand_4.obj
│ │ │ │ ├── link0.stl
│ │ │ │ ├── link0_0.obj
│ │ │ │ ├── link0_1.obj
│ │ │ │ ├── link0_10.obj
│ │ │ │ ├── link0_11.obj
│ │ │ │ ├── link0_2.obj
│ │ │ │ ├── link0_3.obj
│ │ │ │ ├── link0_4.obj
│ │ │ │ ├── link0_5.obj
│ │ │ │ ├── link0_7.obj
│ │ │ │ ├── link0_8.obj
│ │ │ │ ├── link0_9.obj
│ │ │ │ ├── link1.obj
│ │ │ │ ├── link1.stl
│ │ │ │ ├── link2.obj
│ │ │ │ ├── link2.stl
│ │ │ │ ├── link3.stl
│ │ │ │ ├── link3_0.obj
│ │ │ │ ├── link3_1.obj
│ │ │ │ ├── link3_2.obj
│ │ │ │ ├── link3_3.obj
│ │ │ │ ├── link4.stl
│ │ │ │ ├── link4_0.obj
│ │ │ │ ├── link4_1.obj
│ │ │ │ ├── link4_2.obj
│ │ │ │ ├── link4_3.obj
│ │ │ │ ├── link5_0.obj
│ │ │ │ ├── link5_1.obj
│ │ │ │ ├── link5_2.obj
│ │ │ │ ├── link5_collision_0.obj
│ │ │ │ ├── link5_collision_1.obj
│ │ │ │ ├── link5_collision_2.obj
│ │ │ │ ├── link6.stl
│ │ │ │ ├── link6_0.obj
│ │ │ │ ├── link6_1.obj
│ │ │ │ ├── link6_10.obj
│ │ │ │ ├── link6_11.obj
│ │ │ │ ├── link6_12.obj
│ │ │ │ ├── link6_13.obj
│ │ │ │ ├── link6_14.obj
│ │ │ │ ├── link6_15.obj
│ │ │ │ ├── link6_16.obj
│ │ │ │ ├── link6_2.obj
│ │ │ │ ├── link6_3.obj
│ │ │ │ ├── link6_4.obj
│ │ │ │ ├── link6_5.obj
│ │ │ │ ├── link6_6.obj
│ │ │ │ ├── link6_7.obj
│ │ │ │ ├── link6_8.obj
│ │ │ │ ├── link6_9.obj
│ │ │ │ ├── link7.stl
│ │ │ │ ├── link7_0.obj
│ │ │ │ ├── link7_1.obj
│ │ │ │ ├── link7_2.obj
│ │ │ │ ├── link7_3.obj
│ │ │ │ ├── link7_4.obj
│ │ │ │ ├── link7_5.obj
│ │ │ │ ├── link7_6.obj
│ │ │ │ └── link7_7.obj
│ │ │ ├── hand.xml
│ │ │ ├── panda.xml
│ │ │ ├── panda_free_base.xml
│ │ │ ├── panda_no_tendon.xml
│ │ │ ├── panda_nohand.xml
│ │ │ ├── panda_non_overlap.xml
│ │ │ ├── scene.xml
│ │ │ └── scene_no_tendon.xml
│ │ ├── franka_sim/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── assets/
│ │ │ │ ├── actuator0.xml
│ │ │ │ ├── actuator0_0.xml
│ │ │ │ ├── actuator0_2.xml
│ │ │ │ ├── actuator1.xml
│ │ │ │ ├── assets.xml
│ │ │ │ ├── assets_0.xml
│ │ │ │ ├── assets_2.xml
│ │ │ │ ├── basic_scene.xml
│ │ │ │ ├── chain0.xml
│ │ │ │ ├── chain0_nogripper.xml
│ │ │ │ ├── chain0_overlay.xml
│ │ │ │ ├── chain1.xml
│ │ │ │ ├── gripper_actuator0.xml
│ │ │ │ ├── gripper_assets.xml
│ │ │ │ └── teleop_actuator.xml
│ │ │ ├── ball.xml
│ │ │ ├── bi-franka_panda.xml
│ │ │ ├── franka_panda.xml
│ │ │ ├── franka_panda_0.xml
│ │ │ ├── franka_panda_1.xml
│ │ │ ├── franka_panda_2.xml
│ │ │ ├── franka_panda_3.xml
│ │ │ ├── franka_panda_ball.xml
│ │ │ ├── franka_panda_ball_.xml
│ │ │ ├── franka_panda_no_finger.xml
│ │ │ ├── franka_panda_teleop.xml
│ │ │ ├── franka_panda_test_convex.xml
│ │ │ └── meshes/
│ │ │ ├── collision/
│ │ │ │ ├── finger.stl
│ │ │ │ ├── hand.stl
│ │ │ │ ├── link0.stl
│ │ │ │ ├── link1.stl
│ │ │ │ ├── link2.stl
│ │ │ │ ├── link3.stl
│ │ │ │ ├── link4.stl
│ │ │ │ ├── link5.stl
│ │ │ │ ├── link6.stl
│ │ │ │ └── link7.stl
│ │ │ └── visual/
│ │ │ ├── finger.stl
│ │ │ ├── hand.stl
│ │ │ ├── link0.stl
│ │ │ ├── link1.stl
│ │ │ ├── link2.stl
│ │ │ ├── link3.stl
│ │ │ ├── link3_dark.stl
│ │ │ ├── link4.stl
│ │ │ ├── link4_dark.stl
│ │ │ ├── link5.stl
│ │ │ ├── link5_dark.stl
│ │ │ ├── link6.stl
│ │ │ ├── link6_dark.stl
│ │ │ ├── link7.stl
│ │ │ └── link7_dark.stl
│ │ ├── humanoid.xml
│ │ ├── one_ball_joint.xml
│ │ ├── one_tet.xml
│ │ ├── rope_ball.xml
│ │ ├── rope_hinge.xml
│ │ ├── tet.obj
│ │ ├── tet_ball.xml
│ │ ├── tet_capsule.xml
│ │ ├── tet_tet.xml
│ │ ├── thin_box.xml
│ │ ├── thin_box_mesh.xml
│ │ ├── thin_cube.obj
│ │ ├── three_joint_link.xml
│ │ ├── two_box.xml
│ │ ├── two_skeleton.xml
│ │ ├── universal_robots_ur5e/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── assets/
│ │ │ │ ├── base_0.obj
│ │ │ │ ├── base_1.obj
│ │ │ │ ├── forearm_0.obj
│ │ │ │ ├── forearm_1.obj
│ │ │ │ ├── forearm_2.obj
│ │ │ │ ├── forearm_3.obj
│ │ │ │ ├── shoulder_0.obj
│ │ │ │ ├── shoulder_1.obj
│ │ │ │ ├── shoulder_2.obj
│ │ │ │ ├── upperarm_0.obj
│ │ │ │ ├── upperarm_1.obj
│ │ │ │ ├── upperarm_2.obj
│ │ │ │ ├── upperarm_3.obj
│ │ │ │ ├── wrist1_0.obj
│ │ │ │ ├── wrist1_1.obj
│ │ │ │ ├── wrist1_2.obj
│ │ │ │ ├── wrist2_0.obj
│ │ │ │ ├── wrist2_1.obj
│ │ │ │ ├── wrist2_2.obj
│ │ │ │ └── wrist3.obj
│ │ │ ├── scene.xml
│ │ │ └── ur5e.xml
│ │ └── walker.xml
│ ├── constants.py
│ ├── datatypes.py
│ ├── engine/
│ │ ├── __init__.py
│ │ ├── boundaries/
│ │ │ ├── __init__.py
│ │ │ └── boundaries.py
│ │ ├── bvh.py
│ │ ├── couplers/
│ │ │ ├── __init__.py
│ │ │ ├── ipc_coupler/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── coupler.py
│ │ │ │ ├── data.py
│ │ │ │ └── utils.py
│ │ │ ├── legacy_coupler.py
│ │ │ └── sap_coupler.py
│ │ ├── entities/
│ │ │ ├── __init__.py
│ │ │ ├── base_entity.py
│ │ │ ├── drone_entity.py
│ │ │ ├── emitter.py
│ │ │ ├── fem_entity.py
│ │ │ ├── hybrid_entity.py
│ │ │ ├── mpm_entity.py
│ │ │ ├── particle_entity.py
│ │ │ ├── pbd_entity.py
│ │ │ ├── rigid_entity/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── rigid_entity.py
│ │ │ │ ├── rigid_equality.py
│ │ │ │ ├── rigid_geom.py
│ │ │ │ ├── rigid_joint.py
│ │ │ │ └── rigid_link.py
│ │ │ ├── sf_entity.py
│ │ │ ├── sph_entity.py
│ │ │ └── tool_entity/
│ │ │ ├── __init__.py
│ │ │ ├── mesh.py
│ │ │ └── tool_entity.py
│ │ ├── force_fields.py
│ │ ├── materials/
│ │ │ ├── FEM/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── cloth.py
│ │ │ │ ├── elastic.py
│ │ │ │ └── muscle.py
│ │ │ ├── MPM/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── elastic.py
│ │ │ │ ├── elasto_plastic.py
│ │ │ │ ├── liquid.py
│ │ │ │ ├── muscle.py
│ │ │ │ ├── sand.py
│ │ │ │ └── snow.py
│ │ │ ├── PBD/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── cloth.py
│ │ │ │ ├── elastic.py
│ │ │ │ ├── liquid.py
│ │ │ │ └── particle.py
│ │ │ ├── SF/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ └── smoke.py
│ │ │ ├── SPH/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ └── liquid.py
│ │ │ ├── __init__.py
│ │ │ ├── base.py
│ │ │ ├── hybrid.py
│ │ │ ├── kinematic.py
│ │ │ ├── rigid.py
│ │ │ └── tool.py
│ │ ├── mesh.py
│ │ ├── scene.py
│ │ ├── sensors/
│ │ │ ├── __init__.py
│ │ │ ├── base_sensor.py
│ │ │ ├── camera.py
│ │ │ ├── contact_force.py
│ │ │ ├── depth_camera.py
│ │ │ ├── imu.py
│ │ │ ├── kinematic_tactile.py
│ │ │ ├── proximity.py
│ │ │ ├── raycaster.py
│ │ │ ├── sensor_manager.py
│ │ │ └── temperature.py
│ │ ├── simulator.py
│ │ ├── solvers/
│ │ │ ├── __init__.py
│ │ │ ├── base_solver.py
│ │ │ ├── fem_solver.py
│ │ │ ├── kinematic_solver.py
│ │ │ ├── mpm_solver.py
│ │ │ ├── pbd_solver.py
│ │ │ ├── rigid/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── abd/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── accessor.py
│ │ │ │ │ ├── diff.py
│ │ │ │ │ ├── forward_dynamics.py
│ │ │ │ │ ├── forward_kinematics.py
│ │ │ │ │ ├── inverse_kinematics.py
│ │ │ │ │ └── misc.py
│ │ │ │ ├── collider/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── box_contact.py
│ │ │ │ │ ├── broadphase.py
│ │ │ │ │ ├── capsule_contact.py
│ │ │ │ │ ├── collider.py
│ │ │ │ │ ├── constants.py
│ │ │ │ │ ├── contact.py
│ │ │ │ │ ├── contact_island.py
│ │ │ │ │ ├── diff_gjk.py
│ │ │ │ │ ├── epa.py
│ │ │ │ │ ├── gjk.py
│ │ │ │ │ ├── gjk_support.py
│ │ │ │ │ ├── gjk_utils.py
│ │ │ │ │ ├── mpr.py
│ │ │ │ │ ├── multi_contact.py
│ │ │ │ │ ├── narrowphase.py
│ │ │ │ │ ├── support_field.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── constraint/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── backward.py
│ │ │ │ │ ├── noslip.py
│ │ │ │ │ ├── solver.py
│ │ │ │ │ ├── solver_breakdown.py
│ │ │ │ │ └── solver_island.py
│ │ │ │ └── rigid_solver.py
│ │ │ ├── sf_solver.py
│ │ │ ├── sph_solver.py
│ │ │ └── tool_solver.py
│ │ └── states/
│ │ ├── __init__.py
│ │ ├── cache.py
│ │ ├── entities.py
│ │ └── solvers.py
│ ├── ext/
│ │ ├── VolumeSampling
│ │ ├── _trimesh_patch.py
│ │ ├── isaacgym/
│ │ │ └── terrain_utils.py
│ │ ├── pyrender/
│ │ │ ├── __init__.py
│ │ │ ├── camera.py
│ │ │ ├── constants.py
│ │ │ ├── font.py
│ │ │ ├── jit_render.py
│ │ │ ├── light.py
│ │ │ ├── material.py
│ │ │ ├── mesh.py
│ │ │ ├── node.py
│ │ │ ├── numba_gl_wrapper.py
│ │ │ ├── offscreen.py
│ │ │ ├── platforms/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── egl.py
│ │ │ │ ├── osmesa.py
│ │ │ │ └── pyglet_platform.py
│ │ │ ├── primitive.py
│ │ │ ├── renderer.py
│ │ │ ├── sampler.py
│ │ │ ├── scene.py
│ │ │ ├── shader_program.py
│ │ │ ├── shaders/
│ │ │ │ ├── debug_quad.frag
│ │ │ │ ├── debug_quad.vert
│ │ │ │ ├── flat.frag
│ │ │ │ ├── flat.vert
│ │ │ │ ├── mesh.frag
│ │ │ │ ├── mesh.vert
│ │ │ │ ├── mesh_depth.frag
│ │ │ │ ├── mesh_depth.vert
│ │ │ │ ├── mesh_double_sided.geom
│ │ │ │ ├── mesh_normal.frag
│ │ │ │ ├── mesh_normal.vert
│ │ │ │ ├── point_shadow.frag
│ │ │ │ ├── point_shadow.geom
│ │ │ │ ├── point_shadow.vert
│ │ │ │ ├── segmentation.frag
│ │ │ │ ├── segmentation.vert
│ │ │ │ ├── segmentation_double_sided.geom
│ │ │ │ ├── text.frag
│ │ │ │ ├── text.vert
│ │ │ │ ├── vertex_normals.frag
│ │ │ │ ├── vertex_normals.geom
│ │ │ │ ├── vertex_normals.vert
│ │ │ │ └── vertex_normals_pc.geom
│ │ │ ├── texture.py
│ │ │ ├── trackball.py
│ │ │ ├── utils.py
│ │ │ ├── version.py
│ │ │ └── viewer.py
│ │ └── urdfpy/
│ │ ├── __init__.py
│ │ ├── urdf.py
│ │ ├── utils.py
│ │ └── version.py
│ ├── grad/
│ │ ├── __init__.py
│ │ ├── creation_ops.py
│ │ └── tensor.py
│ ├── logging/
│ │ ├── __init__.py
│ │ ├── logger.py
│ │ └── time_elapser.py
│ ├── options/
│ │ ├── __init__.py
│ │ ├── misc.py
│ │ ├── morphs.py
│ │ ├── options.py
│ │ ├── profiling.py
│ │ ├── recorders.py
│ │ ├── renderers.py
│ │ ├── sensors/
│ │ │ ├── __init__.py
│ │ │ ├── camera.py
│ │ │ ├── options.py
│ │ │ ├── raycaster.py
│ │ │ └── tactile.py
│ │ ├── solvers.py
│ │ ├── surfaces.py
│ │ ├── textures.py
│ │ └── vis.py
│ ├── recorders/
│ │ ├── __init__.py
│ │ ├── base_recorder.py
│ │ ├── file_writers.py
│ │ ├── plotters.py
│ │ └── recorder_manager.py
│ ├── repr_base.py
│ ├── styles.py
│ ├── typing.py
│ ├── utils/
│ │ ├── __init__.py
│ │ ├── array_class.py
│ │ ├── deprecated_module_wrapper.py
│ │ ├── element.py
│ │ ├── emoji.py
│ │ ├── generate_env_sphere.py
│ │ ├── geom.py
│ │ ├── gltf.py
│ │ ├── hybrid.py
│ │ ├── image_exporter.py
│ │ ├── linalg.py
│ │ ├── mesh.py
│ │ ├── misc.py
│ │ ├── mjcf.py
│ │ ├── particle.py
│ │ ├── path_planning.py
│ │ ├── raycast.py
│ │ ├── raycast_qd.py
│ │ ├── repr.py
│ │ ├── ring_buffer.py
│ │ ├── sdf.py
│ │ ├── terrain.py
│ │ ├── tools.py
│ │ ├── uid.py
│ │ ├── urdf.py
│ │ ├── usd/
│ │ │ ├── UsdParserSpec.md
│ │ │ ├── __init__.py
│ │ │ ├── usd_bake.py
│ │ │ ├── usd_context.py
│ │ │ ├── usd_geometry.py
│ │ │ ├── usd_material.py
│ │ │ ├── usd_rigid_entity.py
│ │ │ ├── usd_stage.py
│ │ │ └── usd_utils.py
│ │ └── warnings.py
│ ├── version.py
│ └── vis/
│ ├── __init__.py
│ ├── batch_renderer.py
│ ├── camera.py
│ ├── keybindings.py
│ ├── rasterizer.py
│ ├── rasterizer_context.py
│ ├── raytracer.py
│ ├── viewer.py
│ ├── viewer_plugins/
│ │ ├── __init__.py
│ │ ├── plugins/
│ │ │ ├── __init__.py
│ │ │ ├── default_controls.py
│ │ │ └── mouse_interaction.py
│ │ └── viewer_plugin.py
│ └── visualizer.py
├── pyproject.toml
└── tests/
├── __init__.py
├── conftest.py
├── monitor_test_mem.py
├── run_benchmarks.py
├── test_bvh.py
├── test_deformable_physics.py
├── test_examples.py
├── test_fem.py
├── test_grad.py
├── test_hybrid.py
├── test_integration.py
├── test_ipc.py
├── test_kinematic.py
├── test_mesh.py
├── test_misc.py
├── test_pbd.py
├── test_quadrants.py
├── test_recorders.py
├── test_render.py
├── test_rigid_benchmarks.py
├── test_rigid_physics.py
├── test_rigid_physics_analytical_vs_gjk.py
├── test_sensor_camera.py
├── test_sensors.py
├── test_sph.py
├── test_usd.py
├── test_utils.py
├── test_viewer.py
├── upload_benchmarks_table_to_wandb.py
└── utils.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
# Force LF line endings for shell scripts
*.sh text eol=lf
# Force LF line endings for configuration files
*.yml text eol=lf
*.yaml text eol=lf
*.json text eol=lf
*.conf text eol=lf
# Force LF for Docker-related files
Dockerfile text eol=lf
*.dockerignore text eol=lf
================================================
FILE: .github/CODEOWNERS
================================================
* @Genesis-Embodied-AI @YilingQiao @duburcqa
================================================
FILE: .github/ISSUE_TEMPLATE/1-bug-report.yml
================================================
name: "🐛 Bug report"
description: Report errors or unexpected behavior
title: "[Bug]: "
labels: ["bug", "triage-needed"]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report, please make sure to [search for existing issues](https://github.com/Genesis-Embodied-AI/Genesis/issues) before filing a new one!
- type: textarea
id: bug-description
attributes:
label: Bug Description
placeholder: |
A clear and concise description of what the bug is.
Try to isolate the issue to help the community to reproduce it easily and increase chances for a fast fix.
validations:
required: true
- type: textarea
id: steps-to-reproduce
attributes:
label: Steps to Reproduce
placeholder: |
If possible, provide a script triggering the bug, e.g.
```python
# code snippet triggering the bug
import genesis as gs
gs.init()
scene = gs.Scene(show_viewer=False)
broken = scene.add_entity(
gs.morphs.MJCF(file='attachement.xml'),
)
scene.build()
```
Make sure to attached any needed assets (here `attachement.xml`)!
value: |
If possible, provide a script triggering the bug, e.g.
```python
# code snippet triggering the bug
import genesis as gs
gs.init()
scene = gs.Scene(show_viewer=False)
broken = scene.add_entity(
gs.morphs.MJCF(file='attachement.xml'),
)
scene.build()
```
Make sure to attached any needed assets (here `attachement.xml`)!
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: Expected Behavior
placeholder: "A clear and concise description of what you expected to happen."
validations:
required: true
- type: textarea
id: screenshots-videos
attributes:
label: Screenshots/Videos
placeholder: "If applicable, add screenshots and/or a video to help explain your problem."
- type: textarea
id: logs
attributes:
label: Relevant log output
placeholder: |
Please copy and paste any relevant console output.
This will be automatically formatted into code, so no need for backticks.
render: shell
- type: textarea
id: desktop-device
attributes:
label: Environment
placeholder: |
- OS: [e.g. Ubuntu 24.04, Windows 11 24H2]
- GPU/CPU [e.g. A100, RTX 4090, M3pr, Intel I9-9900k, Ryzen 5900x] (N/A if no GPU/CPU)
- GPU-driver version (N/A if no GPU)
- CUDA / CUDA-toolkit version (N/A if non-Nvidia)
value: |
- OS: [e.g. Ubuntu 24.04, Windows 11 24H2]
- GPU/CPU [e.g. A100, RTX 4090, M3pr, Intel I9-9900k, Ryzen 5900x] (N/A if no GPU/CPU)
- GPU-driver version (N/A if no GPU)
- CUDA / CUDA-toolkit version (N/A if non-Nvidia)
validations:
required: true
- type: textarea
id: version
attributes:
label: Release version or Commit ID
placeholder: |
Please provide:
- a) **version numer** of the release causing the issue, OR
- b) **SHA/hash** of the latest commit if working from git. You can get this by running the `git rev-parse HEAD` command on your current branch.
validations:
required: true
- type: textarea
id: additional-context
attributes:
label: Additional Context
placeholder: "Add any other context about the problem here."
================================================
FILE: .github/ISSUE_TEMPLATE/2-feature-request.yml
================================================
name: "🚀 Feature Request"
description: Sugest a new feature request or improvement on the project
title: '[Feature]: '
labels:
- feature
- enhancement
- triage-needed
body:
- type: markdown
attributes:
value: |
Please providee a well-structured and concise breakdown of context, expected outcomes, and potential of the feature you are proposing.
- type: textarea
id: suggestion
attributes:
label: What feature or enhancement are you proposing?
validations:
required: true
- type: textarea
id: motivation
attributes:
label: Motivation
description: What is your motivation for adding / enhancing this feature, optimally described in the form of a concrete user story or use case.
value: |
<!-- Motivation for adding / enhancing this feature, optimally describing a concrete use case in the form of a user story -->
As a [e.g. civil engineering researcher working on flood simulation]
I want to [e.g. be able to simulate city-scale fluid / terrain simulations]
Because [e.g. this enables the efficient design and validation of flood protection structures].
validations:
required: true
- type: textarea
id: benefits
attributes:
label: Potential Benefit
placeholder: Describe the potential benefit of implementing this feature / enhancement
validations:
required: true
- type: textarea
id: acceptcriterea
attributes:
label: What is the expected outcome of the implementation work?
description: List the acceptance criteria for this task in a form of a list.
value: '- [ ]'
validations:
required: true
- type: textarea
id: additionalinfo
attributes:
label: Additional information
description: If you think that any additional information would be useful please provide them here.
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: "💬 Support & Questions - Github Community Support"
url: https://github.com/Genesis-Embodied-AI/Genesis/discussions
about: Please ask and answer questions here.
- name: "⚠️ Documentation Issues"
url: https://github.com/Genesis-Embodied-AI/genesis-doc/issues
about: Please report issues in our documentation here.
================================================
FILE: .github/contributing/ARCHITECTURE.md
================================================
# Genesis Architecture
## Project Structure
```
Genesis/
├── genesis/ # Main source code
│ ├── __init__.py # Entry point, gs.init(), global state
│ ├── engine/ # Core simulation engine
│ │ ├── scene.py # Scene class - main API entry point
│ │ ├── simulator.py # Manages all solvers
│ │ ├── entities/ # Entity types (RigidEntity, MPMEntity, etc.)
│ │ ├── solvers/ # Physics solvers
│ │ │ ├── rigid/ # Rigid body solver
│ │ │ ├── mpm_solver.py # Material Point Method
│ │ │ ├── sph_solver.py # Smoothed Particle Hydrodynamics
│ │ │ ├── fem_solver.py # Finite Element Method
│ │ │ ├── pbd_solver.py # Position Based Dynamics
│ │ │ └── sf_solver.py # Stable Fluid
│ │ ├── materials/ # Material definitions per solver
│ │ └── couplers/ # Inter-solver coupling
│ ├── options/ # Configuration classes (Pydantic models)
│ │ ├── morphs.py # Shape definitions (Box, Mesh, URDF, MJCF)
│ │ ├── solvers.py # Solver configuration options
│ │ └── surfaces.py # Surface properties
│ ├── vis/ # Visualization (Visualizer, Camera, Viewer)
│ ├── sensors/ # Sensor systems (camera, IMU, etc.)
│ └── utils/ # Utilities (mesh, geometry, etc.)
├── tests/ # Test files
├── examples/ # Example scripts
└── genesis/assets/ # Built-in meshes, URDFs, textures
```
## Core Components Flow
```
gs.init() → Scene → Simulator → Solvers → Entities
↓
Visualizer → Viewer / Cameras
```
## Entities
Entities are physical objects in the simulation:
| Entity Type | Solver | Use Case |
|-------------|--------|----------|
| `RigidEntity` | Rigid | Robots, rigid objects |
| `MPMEntity` | MPM | Deformable solids, granular materials |
| `SPHEntity` | SPH | Liquids, fluids |
| `FEMEntity` | FEM | Finite element deformable bodies |
| `PBD2DEntity`, `PBD3DEntity` | PBD | Cloth, soft bodies |
| `DroneEntity` | Rigid | Quadcopters with aerodynamics |
| `ToolEntity` | Tool | Cutting/interaction tools |
Location: `genesis/engine/entities/`
## Morphs
Morphs define geometry and initial pose (solver-agnostic):
```python
# Primitives
gs.morphs.Box(size=(1, 1, 1), pos=(0, 0, 0.5))
gs.morphs.Sphere(radius=0.5, pos=(0, 0, 1))
gs.morphs.Plane()
# Robot descriptions
gs.morphs.URDF(file="path/to/robot.urdf", fixed=True)
gs.morphs.MJCF(file="path/to/robot.xml")
```
Location: `genesis/options/morphs.py`
## Materials
Materials define physical properties and determine which solver handles the entity:
```python
gs.materials.Rigid(rho=1000)
gs.materials.MPM.Elastic(E=1e5, nu=0.3)
gs.materials.SPH.Liquid(sampler="pbs")
gs.materials.PBD.Cloth(stretch_compliance=0.0)
```
Location: `genesis/engine/materials/`
## Solvers
| Solver | Options Class | Purpose |
|--------|--------------|---------|
| Rigid | `gs.options.RigidOptions` | Articulated rigid body dynamics |
| MPM | `gs.options.MPMOptions` | Continuum mechanics |
| SPH | `gs.options.SPHOptions` | Fluid simulation |
| FEM | `gs.options.FEMOptions` | Finite element deformation |
| PBD | `gs.options.PBDOptions` | Fast soft body simulation |
| SF | `gs.options.SFOptions` | Eulerian fluid/smoke |
Location: `genesis/engine/solvers/`
## Key Files Reference
| File | Purpose |
|------|---------|
| `genesis/__init__.py` | Package entry, `gs.init()`, global state |
| `genesis/engine/scene.py` | `Scene` class - main user interface |
| `genesis/engine/simulator.py` | `Simulator` - manages all solvers |
| `genesis/options/morphs.py` | Shape/geometry definitions |
| `genesis/options/solvers.py` | Solver option classes |
================================================
FILE: .github/contributing/CODING_CONVENTIONS.md
================================================
# Coding Conventions
## Import Pattern
```python
import genesis as gs
import genesis.utils.geom as gu
import numpy as np
import torch
```
## Naming Conventions
- Classes: `PascalCase` (e.g., `RigidEntity`, `SimOptions`)
- Functions/methods: `snake_case` (e.g., `add_entity`, `get_dofs_position`)
- Constants: `UPPER_CASE` (e.g., `EPS`)
- Private: `_leading_underscore` (e.g., `_initialized`)
## Configuration via Pydantic Options
All configuration uses Pydantic models in `genesis/options/`:
```python
scene = gs.Scene(
sim_options=gs.options.SimOptions(dt=0.01, substeps=2),
rigid_options=gs.options.RigidOptions(enable_collision=True),
vis_options=gs.options.VisOptions(show_world_frame=True),
)
```
## Tensor Operations
Genesis uses PyTorch tensors on `gs.device`:
```python
# Always specify device
positions = torch.zeros(n_envs, n_dofs, device=gs.device)
# Convert numpy to torch
torch_tensor = torch.from_numpy(numpy_array).to(gs.device)
```
## Error Handling
```python
# Use Genesis exception for domain errors
gs.raise_exception("Invalid parameter value")
# Use warnings for non-critical issues
gs.logger.warning("Deprecated feature used")
```
## Build Pattern
Always call `scene.build()` before simulation:
```python
scene = gs.Scene()
scene.add_entity(...) # Add all entities first
scene.build(n_envs=1) # Compile kernels
scene.step() # Now safe to step
```
## Backend Selection
```python
import genesis as gs
# CPU backend (default for debug mode)
gs.init(backend=gs.cpu)
# GPU backend (auto-selects CUDA/ROCm/Metal)
gs.init(backend=gs.gpu)
# Explicit precision
gs.init(backend=gs.gpu, precision="32") # or "64"
```
## Common API Patterns
### Basic Simulation Loop
```python
import genesis as gs
gs.init(backend=gs.gpu)
scene = gs.Scene(show_viewer=True)
plane = scene.add_entity(gs.morphs.Plane())
robot = scene.add_entity(
gs.morphs.MJCF(file="xml/franka_emika_panda/panda.xml"),
material=gs.materials.Rigid(),
)
scene.build()
for _ in range(1000):
scene.step()
```
### Parallel Environments
```python
import genesis as gs
import torch
gs.init(backend=gs.gpu)
scene = gs.Scene(show_viewer=False)
robot = scene.add_entity(gs.morphs.MJCF(file="xml/franka_emika_panda/panda.xml"))
# Build with multiple environments
n_envs = 100
scene.build(n_envs=n_envs, env_spacing=(1.0, 1.0))
# Control all environments at once
target = torch.zeros(n_envs, robot.n_dofs, device=gs.device)
robot.control_dofs_position(target)
```
================================================
FILE: .github/contributing/EXAMPLES.md
================================================
# Examples Reference
Location: `examples/` (105 files total)
## Running Examples
```bash
uv run examples/tutorials/hello_genesis.py
uv run examples/rigid/single_franka.py
```
## Categories
| Directory | Files | Description |
|-----------|-------|-------------|
| `tutorials/` | 18 | Getting started guides |
| `rigid/` | 29 | Rigid body and robot examples |
| `coupling/` | 11 | Multi-physics coupling |
| `drone/` | 7 | Quadcopter simulations |
| `IPC_Solver/` | 5 | IPC contact examples |
| `locomotion/` | 4 | Quadruped training |
| `manipulation/` | 4 | Grasping and manipulation |
| `rendering/` | 4 | Rendering demos |
| `sensors/` | 4 | Sensor examples |
| `sap_coupling/` | 4 | SAP coupling examples |
| `collision/` | 3 | Collision demos |
| `speed_benchmark/` | 3 | Performance benchmarks |
## Key Examples
### Getting Started
- `tutorials/hello_genesis.py` - Basic introduction
- `tutorials/control_your_robot.py` - Robot control basics
- `tutorials/parallel_simulation.py` - Batched environments
### Robotics
- `rigid/single_franka.py` - Single Franka arm
- `rigid/ik_franka.py` - Inverse kinematics
- `rigid/domain_randomization.py` - Domain randomization
### Multi-Physics
- `coupling/cloth_on_rigid.py` - Cloth-rigid coupling
- `coupling/sph_rigid.py` - Fluid-rigid coupling
- `coupling/sand_wheel.py` - Granular-rigid coupling
### Training
- `locomotion/go2_env.py` - Quadruped RL environment
- `manipulation/grasp_env.py` - Grasping RL environment
================================================
FILE: .github/contributing/PULL_REQUESTS.md
================================================
# Contributing to Genesis
Thank you for your interest in contributing to Genesis! We welcome contributions from everyone. Please take a moment to review this guide to ensure a smooth collaboration.
- [Reporting Bugs](#reporting-bugs)
- [Suggesting Features](#suggesting-features)
- [Submitting Code Changes](#submitting-code-changes)
- [Reviewing and Merging](#reviewing-and-merging)
- [Questions and Discussions](#questions-and-discussions)
---
## Reporting Bugs
- Before reporting a bug, please search through existing issues to check if it has already been reported.
- If the issue hasn't been reported yet, please use our issue templates to provide as much detail as possible in your report.
```markdown
**Description**
A clear and concise description of what the bug is.
**To Reproduce**
Example code or commands to reproduce the bug.
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Environment:**
- OS: [e.g., Linux, macOS]
- GPU/CPU: [e.g., A100, RTX 4090, M3pro]
**Additional context**
Add any other context about the problem here.
```
## Suggesting Features
- If you have a feature idea, please create an issue labeled `enhancement`.
- In the created issue, please provide context, expected outcomes, and potential.
## Submitting Code Changes
- We use the `pre-commit` configuration to automatically clean up code before committing. Install and run `pre-commit` as follows:
1. Install `pre-commit`:
```bash
pip install pre-commit
```
2. Install hooks from the configuration file:
```bash
pre-commit install
```
After this, `pre-commit` will automatically check and clean up code whenever you make a commit.
- (Optional) You can run CI tests locally to ensure you pass the online CI checks.
```python
pytest -v --forked -m required ./tests
```
- In the title of your Pull Request, please include [BUG FIX], [FEATURE] or [MISC] to indicate the purpose.
- In the description, please provide example code or commands for testing.
## Reviewing and Merging
- PRs require at least one approval before merging.
- Automated checks (e.g., CI tests) must pass.
- Use `Squash and Merge` for a clean commit history.
## Questions and Discussions
- Use [Discussions](https://github.com/Genesis-Embodied-AI/Genesis/discussions) for open-ended topics.
<!--
### Join Us
- Follow the project’s progress and updates on [channel/community link]. -->
---
We appreciate your contributions and look forward to collaborating with you!
Thank you,
Genesis Maintainers
================================================
FILE: .github/contributing/TESTING.md
================================================
# Testing Guide
## Environment Setup
Use `uv` for running tests:
```bash
# Setup environment (if not already done)
uv sync
# Install PyTorch for your platform (see README.md)
uv pip install torch --index-url https://download.pytorch.org/whl/cu126 # NVIDIA
```
## Running Tests
```bash
# Run all tests (parallel, excludes benchmarks and examples)
uv run pytest tests/
# Run specific test file
uv run pytest tests/test_rigid_physics.py
# Run with GPU backend
uv run pytest tests/ --backend=gpu
# Run with visualization (disables parallelism)
uv run pytest tests/ --vis
# Run in debug mode
uv run pytest tests/ --dev
# Run specific markers
uv run pytest tests/ -m required
uv run pytest tests/ -m "not slow"
# In restricted environments (sandboxes, containers), disable retry plugins:
uv run pytest tests/ -p no:pytest-retry -p no:rerunfailures
```
## Test Markers
| Marker | Description |
|--------|-------------|
| `required` | Minimal test set that must pass before merging |
| `slow` | Tests taking >100s |
| `examples` | Example scripts |
| `benchmarks` | Performance benchmarks |
## Key Fixtures
From `tests/conftest.py`:
| Fixture | Scope | Description |
|---------|-------|-------------|
| `initialize_genesis` | function | Auto-initializes and destroys Genesis per test |
| `backend` | session | Returns configured backend (gs.cpu/gs.gpu) |
| `precision` | function | Returns precision ("32" or "64") |
| `show_viewer` | session | Whether viewer is enabled |
| `tol` | function | Tolerance based on precision |
## Writing Tests
```python
import pytest
import genesis as gs
def test_example(initialize_genesis, backend):
"""Test runs with auto-initialized Genesis."""
scene = gs.Scene()
entity = scene.add_entity(gs.morphs.Box(size=(1, 1, 1)))
scene.build()
scene.step()
assert entity.get_pos()[2] > 0
@pytest.mark.slow
def test_long_simulation(initialize_genesis):
"""Mark slow tests explicitly."""
pass
@pytest.mark.required
def test_critical_feature(initialize_genesis):
"""Mark tests that must always pass."""
pass
```
## CI Requirements
Before submitting a PR, ensure tests pass locally:
```bash
uv run pytest -v -m required tests/
```
================================================
FILE: .github/contributing/USD_PARSER.md
================================================
---
description: Rules and guidelines for developing and fixing the USD parser in Genesis
---
# USD Parser Rules
## Overview
This document describes the rules and guidelines for developing and fixing the USD parser in Genesis.
**Before starting:** Read the [USD Parser Specification](../../genesis/utils/usd/UsdParserSpec.md) to understand the mathematical foundations, transform handling, and architectural constraints.
## Core Rules
### 1. Scope Restriction: No Simulator-Side Modifications
**CRITICAL:** You MUST NOT modify any code outside the `genesis/utils/usd` directory.
- **Allowed:** Changes to files in `genesis/utils/usd/` (e.g., `usd_rigid_entity.py`, `usd_utils.py`, `usd_geometry.py`)
- **Forbidden:** Changes to simulator code, entity definitions, or any code outside the USD parser directory
- **Rationale:** The USD parser is an isolated utility that converts USD files to Genesis format without affecting core simulator functionality
### 2. USD Schema Research: Always Check pxr-stubs First
**Before implementing parsing logic for any USD attribute:**
1. **Locate pxr-stubs:** Search in the `pxr-stubs` package for the relevant schema definition
- Example: `UsdPhysics` attributes are in the `UsdPhysics` module of `pxr-stubs`
2. **Verify attribute properties:**
- Default values (if any)
- Whether the attribute is optional or required
- Valid value ranges or types
- Whether `HasValue()` or `IsValid()` checks are needed
3. **Example pattern:** See how existing code handles attributes:
```python
# Check if attribute exists and has a value
attr = prim.GetAttribute("someAttr")
value = attr.Get() if attr.HasValue() else default_value
```
### 3. External Research: Search When pxr-stubs Are Insufficient
**If information is missing from pxr-stubs:**
1. Search the internet for USD schema documentation
2. Check official USD documentation: https://openusd.org/
3. Look for USD Physics schema references: https://openusd.org/release/api/usd_physics_page_front.html
4. Review existing parser code for similar patterns
### 4. Code Organization: Use Helper Functions for Complex Logic
**When parsing logic becomes complex:**
- **Extract helper functions** to `usd_utils.py` or create module-specific helpers
- **Keep main parsing functions** (e.g., in `usd_rigid_entity.py`) clean and readable
- **Follow existing patterns:** See `usd_utils.py` for examples like `usd_pos_to_numpy()`, `usd_quat_to_numpy()`, etc.
**Example structure:**
```python
# In usd_rigid_entity.py (main parsing logic)
def parse_entity(...):
# High-level flow
transform = _get_rigid_transform(prim)
geometry = parse_prim_geoms(context, prim)
# ...
# In usd_utils.py (helper functions)
def _get_rigid_transform(prim: Usd.Prim) -> np.ndarray:
# Complex transform decomposition logic
# ...
```
## Key Files Reference
- **Specification:** [UsdParserSpec.md](../../genesis/utils/usd/UsdParserSpec.md)
- **Main parser:** [usd_rigid_entity.py](../../genesis/utils/usd/usd_rigid_entity.py)
- **Utilities:** [usd_utils.py](../../genesis/utils/usd/usd_utils.py)
- **Geometry parsing:** [usd_geometry.py](../../genesis/utils/usd/usd_geometry.py)
- **Context management:** [usd_context.py](../../genesis/utils/usd/usd_context.py)
================================================
FILE: .github/pull_request_template.md
================================================
<!-- Thanks for sending a pull request! Please:
1. Follow our contributor guidelines:
https://github.com/Genesis-Embodied-AI/Genesis/blob/main/.github/contributing/PULL_REQUESTS.md
2. Prepare your PR according to the "Submitting Code Changes"
section of https://github.com/Genesis-Embodied-AI/Genesis/blob/main/.github/contributing/PULL_REQUESTS.md
3. Provide a concise summary of your changes in the Title above
4. Prefix the title according to the type of issue you are addressing. Use:
- [BUG FIX] for non-breaking changes which fix an issue
- [FEATURE] for non-breaking changes which add functionality
- [MISC] for minor changes such as improved inline documentation or fixing typos
- [CHANGING] for changes that will change simulation's behaviour
- [BREAKING] **in addition to the above** for breaking changes, i.e., a fix or feature that would cause existing APIs or functionality to change
-->
## Description
<!--- Describe your changes in detail -->
## Related Issue
<!--- This project only accepts pull requests related to open issues.
If suggesting a new feature or change, please discuss it in an issue first.
If fixing a bug, there should be an issue describing it with steps to reproduce.
Please link to the relevant issue here, e.g. via `Resolves <issue-url>`.
Cf. https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue -->
Resolves Genesis-Embodied-AI/Genesis#<your-issue-number>
## Motivation and Context
<!--- Why is this change required? What problem does it solve? -->
## How Has This Been / Can This Be Tested?
<!--- Please describe in detail how you tested your changes.
Include details of your testing environment, and the tests you ran to
see how your change affects other areas of the code, etc. -->
## Screenshots (if appropriate):
## Checklist:
<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
- [ ] I read the **CONTRIBUTING** document.
- [ ] I followed the `Submitting Code Changes` section of **CONTRIBUTING** document.
- [ ] I tagged the title correctly (including BUG FIX/FEATURE/MISC/BREAKING)
- [ ] I updated the [documentation](https://github.com/Genesis-Embodied-AI/genesis-doc) accordingly or no change is needed.
- [ ] I tested my changes and added instructions on how to test it for reviewers.
<!--- Optionally -->
- [ ] I have added tests to cover my changes.
- [ ] All new and existing tests passed.
================================================
FILE: .github/workflows/alarm.yml
================================================
name: Benchmark Comparison & Alarm Regression
on:
workflow_run:
workflows: ["Production"]
types: [completed]
permissions:
contents: read
actions: read
pull-requests: write
checks: write
jobs:
comment-if-regressed:
runs-on: ubuntu-latest
if: >
github.event.workflow_run.event == 'pull_request' &&
contains(fromJson('["success","neutral"]'), github.event.workflow_run.conclusion)
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install deps
run: |
# Pin wandb<0.25: 0.25.x changed api.runs() to no longer populate
# run.config in batch queries, breaking alarm.py's config["revision"] lookup.
python -m pip install --quiet --upgrade 'wandb<0.25' frozendict
- name: Download speed artifacts from triggering run
id: dl_speed
uses: actions/download-artifact@v4
with:
pattern: speed-test-*
run-id: ${{ github.event.workflow_run.id }}
github-token: ${{ secrets.GITHUB_TOKEN }}
path: ./artifacts
- name: Download mem artifacts from triggering run
id: dl_mem
uses: actions/download-artifact@v4
with:
pattern: mem-test-*
run-id: ${{ github.event.workflow_run.id }}
github-token: ${{ secrets.GITHUB_TOKEN }}
path: ./artifacts
- name: Show downloaded speed files
run: |
echo "Downloaded into ${{ steps.dl_speed.outputs.download-path }}"
ls -la ${{ steps.dl_speed.outputs.download-path }} || true
(command -v tree >/dev/null && tree -a ${{ steps.dl_speed.outputs.download-path }}) || true
- name: Show downloaded mem files
run: |
echo "Downloaded into ${{ steps.dl_mem.outputs.download-path }}"
ls -la ${{ steps.dl_mem.outputs.download-path }} || true
(command -v tree >/dev/null && tree -a ${{ steps.dl_mem.outputs.download-path }}) || true
- name: Check regressions + build outputs
id: analyze
env:
# Note that secrets are not passed to workflows that are triggered by a pull request from a fork
# --- W&B ---
WANDB_API_KEY: ${{ secrets.WANDB_API_KEY }}
WANDB_ENTITY: genesis-ai-company
WANDB_SILENT: "true"
run: |
mkdir -p /tmp
set +e
python .github/workflows/scripts/alarm.py \
--speed-artifacts-dir ${{ steps.dl_speed.outputs.download-path }} \
--mem-artifacts-dir ${{ steps.dl_mem.outputs.download-path }} \
--max-valid-revisions 5 \
--max-fetch-revisions 40 \
--runtime-fps-regression-tolerance-pct 8 \
--compile-time-regression-tolerance-pct 30 \
--mem-regression-tolerance-pct 4 \
--csv-runtime-fps-path /tmp/runtime_fps.csv \
--csv-compile-time-path /tmp/compile_time.csv \
--csv-mem-path /tmp/mem.csv \
--check-body-path /tmp/check_output.md \
--exit-code-regression 42 \
--exit-code-alert 43
EXIT_CODE=$?
set -e
# Expose outputs to later steps
if [ -f /tmp/check_output.md ]; then
{
echo 'CHECK_OUTPUT<<__EOF__'
cat /tmp/check_output.md
echo '__EOF__'
} >> "$GITHUB_ENV"
else
echo "CHECK_OUTPUT=" >> "$GITHUB_ENV"
fi
# Export status
echo "HAS_REGRESSIONS=$([ "$EXIT_CODE" = 42 ] && echo 1 || echo 0)" >> "$GITHUB_ENV"
echo "HAS_ALERTS=$([ "$EXIT_CODE" = 43 ] && echo 1 || echo 0)" >> "$GITHUB_ENV"
- name: Upload benchmark comparisons in CSV
id: upload
uses: actions/upload-artifact@v4
with:
name: benchmark-comparison-tables
path: |
/tmp/runtime_fps.csv
/tmp/compile_time.csv
/tmp/mem.csv
if-no-files-found: warn
- name: Publish PR check
id: publish_check
uses: actions/github-script@v8
env:
CHECK_NAME: Benchmark Comparison
CHECK_OUTPUT: ${{ env.CHECK_OUTPUT }}
HAS_REGRESSIONS: ${{ env.HAS_REGRESSIONS }}
HAS_ALERTS: ${{ env.HAS_ALERTS }}
ARTIFACT_URL: ${{ steps.upload.outputs.artifact-url }}
with:
script: |
const artifactUrl = process.env.ARTIFACT_URL || '';
let body = process.env.CHECK_OUTPUT || '';
if (body && artifactUrl) {
body += `\n\n**Artifact:** [Download raw data](${artifactUrl})`;
}
let summary;
let conclusion = 'success';
if ((process.env.HAS_REGRESSIONS || '0') === '1') {
summary = '🔴 Regressions detected. See tables below.';
conclusion = 'failure';
} else if ((process.env.HAS_ALERTS || '0') === '1') {
summary = '⚠️ Large deviation detected. See tables below.';
} else {
summary = '✅ No regressions detected. See tables below.';
}
const check = await github.rest.checks.create({
owner: context.repo.owner,
repo: context.repo.repo,
head_sha: context.payload.workflow_run.head_sha,
name: process.env.CHECK_NAME,
status: 'completed',
conclusion: conclusion,
output: {
title: process.env.CHECK_NAME,
summary,
text: body || undefined
}
});
core.setOutput("check-url", check.data.html_url);
- name: Add PR comment
if: ${{ env.HAS_REGRESSIONS == '1' || env.HAS_ALERTS == '1' }}
uses: actions/github-script@v8
env:
HAS_REGRESSIONS: ${{ env.HAS_REGRESSIONS }}
REPORT_URL: ${{ steps.publish_check.outputs.check-url }}
with:
script: |
// Getting PR number when using 'workflow_run' is tricky. For reference, see:
// * https://docs.github.com/en/webhooks/webhook-events-and-payloads#workflow_run
// * https://stackoverflow.com/a/75420270/4820605
const { data } = await github.rest.repos.listPullRequestsAssociatedWithCommit({
owner: context.payload.workflow_run.head_repository.owner.login,
repo: context.payload.workflow_run.head_repository.name,
commit_sha: context.payload.workflow_run.head_sha,
});
if (!data || !data.length) {
core.info('No associated PR; skipping comment.');
return;
}
const title = (process.env.HAS_REGRESSIONS || '0') === '1'
? '🔴 Benchmark Regression Detected' : '⚠️ Abnormal Benchmark Result Detected';
const comment = `**${title} ➡️ [Report](${process.env.REPORT_URL})**`;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: data[0].number,
body: comment
});
================================================
FILE: .github/workflows/examples.yml
================================================
name: Examples (CPU)
on:
pull_request:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
jobs:
run-examples:
runs-on: ubuntu-24.04
name: ubuntu-24.04-3.12-examples
env:
HF_HUB_DOWNLOAD_TIMEOUT: 60
FORCE_COLOR: 1
PY_COLORS: 1
GS_CACHE_FILE_PATH: ".cache/genesis"
QD_OFFLINE_CACHE: "1"
QD_OFFLINE_CACHE_CLEANING_POLICY: "never"
QD_OFFLINE_CACHE_FILE_PATH: ".cache/quadrants"
QD_DEBUG: "0"
OMNI_KIT_ACCEPT_EULA: "yes"
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install Mesa OpenGL driver for headless rendering
run: |
# fix broken microsoft package source on ubuntu-24.04
sudo rm -f /etc/apt/sources.list.d/microsoft*.list
sudo apt-get update
sudo apt install -y \
libglu1-mesa \
libegl-mesa0 \
libgl1-mesa-dev
- name: Install Python deps
run: |
python -m pip install --upgrade pip setuptools wheel
pip install torch --index-url https://download.pytorch.org/whl/cpu
pip install '.[dev,usd]'
- name: Get Quadrants version
id: quadrants_version
shell: bash
run: |
QUADRANTS_VERSION=$(python -c "import importlib.metadata ; print(importlib.metadata.version('quadrants'))")
echo "QUADRANTS_VERSION=${QUADRANTS_VERSION}" >> $GITHUB_OUTPUT
- name: Restore cache
uses: actions/cache/restore@v4
with:
path: .cache
key: ubuntu-24.04-3.12-examples-${{ steps.quadrants_version.outputs.QUADRANTS_VERSION }}
restore-keys: |
ubuntu-24.04-3.12-examples-${{ steps.quadrants_version.outputs.QUADRANTS_VERSION }}-
- name: Run examples suite
run: |
pytest -v -m examples tests/test_examples.py
- name: Save cache
if: always()
uses: actions/cache/save@v4
with:
path: .cache
key: ubuntu-24.04-3.12-examples-${{ steps.quadrants_version.outputs.QUADRANTS_VERSION }}-${{ github.run_id }}-${{ github.run_attempt }}
================================================
FILE: .github/workflows/format.yml
================================================
name: Precommit Checks (Lint and Format)
on:
pull_request:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
jobs:
pre-commit:
runs-on: ubuntu-24.04
name: precommit-checks
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Run pre-commit hooks
uses: pre-commit/action@v3.0.1
================================================
FILE: .github/workflows/generic.yml
================================================
name: Generic
on:
pull_request:
branches:
- main
release:
branches:
- main
types: [published]
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
generic-cpu:
name: ${{ matrix.OS }}-${{ matrix.PYTHON_VERSION }}-${{ matrix.GS_BACKEND }}-${{ matrix.GS_ENABLE_NDARRAY == '0' && 'field' || 'ndarray' }}
strategy:
fail-fast: false
matrix:
# See official Github documentation for details: https://shorturl.at/NJgsj
OS: ["ubuntu-24.04", "macos-15"]
PYTHON_VERSION: ["3.10", "3.11", "3.12", "3.13"]
GS_BACKEND: ["cpu"]
GS_ENABLE_NDARRAY: ["1"]
include:
# CPU backend - dynamic array (other OSes)
- OS: "ubuntu-22.04"
PYTHON_VERSION: "3.12"
GS_BACKEND: "cpu"
GS_ENABLE_NDARRAY: "1"
- OS: "ubuntu-24.04-arm"
PYTHON_VERSION: "3.12"
GS_BACKEND: "cpu"
GS_ENABLE_NDARRAY: "1"
- OS: "windows-2025"
PYTHON_VERSION: "3.12"
GS_BACKEND: "cpu"
GS_ENABLE_NDARRAY: "1"
# CPU backend - field array
- OS: "ubuntu-24.04"
PYTHON_VERSION: "3.12"
GS_BACKEND: "cpu"
GS_ENABLE_NDARRAY: "0"
- OS: "ubuntu-24.04-arm"
PYTHON_VERSION: "3.12"
GS_BACKEND: "cpu"
GS_ENABLE_NDARRAY: "0"
# FIXME: Quadrants compilation is taking so slow on Windows that running the unit tests
# for static arrays takes about 400min, which is not acceptable. Disabling for now.
# - OS: "windows-2025"
# PYTHON_VERSION: "3.12"
# GS_BACKEND: "cpu"
# GS_ENABLE_NDARRAY: "0"
- OS: "macos-15"
PYTHON_VERSION: "3.12"
GS_BACKEND: "cpu"
GS_ENABLE_NDARRAY: "0"
# GPU backend - field array
- OS: "macos-15"
PYTHON_VERSION: "3.12"
GS_BACKEND: "gpu"
GS_ENABLE_NDARRAY: "1"
env:
HF_HUB_DOWNLOAD_TIMEOUT: "60"
FORCE_COLOR: "1"
PY_COLORS: "1"
GS_CACHE_FILE_PATH: ".cache/genesis"
GS_ENABLE_NDARRAY: ${{ matrix.GS_ENABLE_NDARRAY }}
GS_TORCH_FORCE_CPU_DEVICE: ${{ startsWith(matrix.OS, 'macos-') && '1' || '0' }}
QD_OFFLINE_CACHE: "1"
QD_OFFLINE_CACHE_CLEANING_POLICY: "never"
QD_OFFLINE_CACHE_FILE_PATH: ".cache/quadrants"
QD_ENABLE_CUDA: ${{ matrix.GS_BACKEND == 'gpu' && '1' || '0' }}
QD_ENABLE_AMDGPU: ${{ matrix.GS_BACKEND == 'gpu' && '1' || '0' }}
QD_ENABLE_METAL: ${{ matrix.GS_BACKEND == 'gpu' && '1' || '0' }}
QD_DEBUG: "0"
OMNI_KIT_ACCEPT_EULA: "yes"
runs-on: ${{ matrix.OS }}
if: github.event_name != 'release'
steps:
- name: Print system information (Windows)
if: startsWith(matrix.OS, 'windows-')
shell: pwsh
run: |
$cpu = Get-CimInstance -ClassName Win32_Processor
$ram = Get-CimInstance -ClassName Win32_ComputerSystem
[PSCustomObject]@{
CPU_Name = $cpu.Name
Physical_Cores = ($cpu | Measure-Object -Property NumberOfCores -Sum).Sum
Logical_Processors = ($cpu | Measure-Object -Property NumberOfLogicalProcessors -Sum).Sum
Total_RAM_GB = [math]::Round($ram.TotalPhysicalMemory / 1GB, 2)
}
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.PYTHON_VERSION }}
- name: Install system dependencies (Windows)
if: startsWith(matrix.OS, 'windows-')
shell: bash
run: |
curl -L -o mesa.7z https://github.com/pal1000/mesa-dist-win/releases/download/25.1.5/mesa3d-25.1.5-release-msvc.7z
7z x mesa.7z -omesa
mv -v mesa/x64/* /C/Windows/System32/
- name: Install Mesa OpenGL driver (Linux)
if: startsWith(matrix.OS, 'ubuntu-')
run: |
for retry in {1..10}; do
sudo add-apt-repository -y ppa:kisak/kisak-mesa && break || sleep 5;
done
sudo apt install -y \
libglu1-mesa \
libegl-mesa0 \
libgl1-mesa-dev
- name: Install python dependencies
shell: bash
run: |
python -m pip install --upgrade pip setuptools pkg-info wheel
# FIXME: Must install torch>2.9.1 to support zerocopy on Apple Metal
pip3 install torch --upgrade --index-url https://download.pytorch.org/whl/cpu
- name: Install Genesis
shell: bash
run: |
PYTHON_DEPS="dev"
# Install USD for all platforms except ARM (usd-core doesn't support ARM)
# This is required for test_mesh.py which tests USD parsing functionality
if [[ "${{ matrix.OS }}" != 'ubuntu-24.04-arm' ]] ; then
PYTHON_DEPS="${PYTHON_DEPS},usd"
fi
pip install ".[${PYTHON_DEPS}]"
- name: Get artifact prefix name
id: artifact_prefix
shell: bash
run: |
OS_FAMILY=$(python -c "import platform; print(platform.system())")
MACHINE_ARCH=$(python -c "import platform; print(platform.machine())")
QUADRANTS_VERSION=$(python -c "import importlib.metadata ; print(importlib.metadata.version('quadrants'))")
echo "ARTIFACT_PREFIX=${OS_FAMILY}-${MACHINE_ARCH}-${QUADRANTS_VERSION}" >> $GITHUB_OUTPUT
- name: Restore Quadrants Kernel Cache
if: ${{ always() && steps.artifact_prefix.outputs.ARTIFACT_PREFIX != '' }}
uses: actions/cache/restore@v4
with:
path: .cache
key: ${{ steps.artifact_prefix.outputs.ARTIFACT_PREFIX }}
restore-keys: |
${{ steps.artifact_prefix.outputs.ARTIFACT_PREFIX }}-
- name: Run unit tests
run: |
pytest -v -ra --logical --dev --backend ${{ matrix.GS_BACKEND }} -m 'required and not slow' --forked ./tests
- name: Save Updated Quadrants Kernel Cache
if: >-
${{ always() &&
(matrix.OS == 'ubuntu-24.04' || matrix.OS == 'ubuntu-24.04-arm' || matrix.OS == 'macos-15' || matrix.OS == 'windows-2025') &&
matrix.PYTHON_VERSION == '3.12' &&
matrix.GS_BACKEND == 'cpu' &&
matrix.GS_ENABLE_NDARRAY == '1' &&
steps.artifact_prefix.outputs.ARTIFACT_PREFIX != '' }}
uses: actions/cache/save@v4
with:
path: .cache
# Note that it is necessary to create a new archive systematically for now:
# See: https://github.com/actions/cache/issues/1594
key: ${{ steps.artifact_prefix.outputs.ARTIFACT_PREFIX }}-${{ github.run_id }}-${{ github.run_attempt }}
publish-pypi:
name: Publish on PyPI
runs-on: ubuntu-24.04
permissions:
id-token: write
environment:
name: advance
if: github.event_name == 'release'
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Build wheels
run: |
pip wheel --no-deps . -w wheelhouse
- name: Publish the wheels on PyPI
uses: pypa/gh-action-pypi-publish@v1.12.4
with:
packages-dir: wheelhouse
verify-metadata: true
attestations: true
print-hash: true
skip-existing: true
================================================
FILE: .github/workflows/production.yml
================================================
name: Production
on:
# Trigger the workflow on push on the master branch, or for any pull request
push:
branches:
- main
pull_request:
branches:
- main
concurrency:
# Cancel all workflows that are still running if any when updating branches associated with PRs,
# BUT don't do anything for workflows that are not triggered by PRs.
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
env:
# Note that secrets are not passed to workflows that are triggered by a pull request from a fork
HF_TOKEN: ${{ secrets.HF_TOKEN }}
HF_HUB_DOWNLOAD_TIMEOUT: 60
GENESIS_IMAGE_VER: "1_22"
TIMEOUT_MINUTES: 60
FORCE_COLOR: 1
PY_COLORS: 1
MADRONA_DISABLE_CUDA_HEAP_SIZE: "1"
jobs:
unit-tests:
name: production-unit_tests-${{ matrix.GS_ENABLE_NDARRAY == '0' && 'field' || 'ndarray' }}
runs-on: [self-hosted, coreweave, genesis-world]
strategy:
fail-fast: true
max-parallel: 1
matrix:
GS_ENABLE_NDARRAY: ["0", "1"]
env:
GS_ENABLE_NDARRAY: ${{ matrix.GS_ENABLE_NDARRAY }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Spawn Slurm job
if: github.event_name == 'pull_request'
run: |
set -e
SLURM_JOB_NAME="$(uuidgen)_$(date +%Y%m%d_%H%M%S)"
CONTAINER_NAME="${SLURM_JOB_NAME}"
SRUN_CONTAINER_OPTS="\
--container-name=${CONTAINER_NAME} \
--container-mounts=\
${{ github.workspace }}:/root/workspace,\
${HOME}/.cache/uv:/root/.cache/uv,\
${HOME}/.cache/genesis:/root/.cache/genesis,\
${HOME}/.cache/huggingface:/root/.cache/huggingface \
--no-container-mount-home \
--container-workdir=/root/workspace"
SLURM_ENV_VARS="NVIDIA_DRIVER_CAPABILITIES=all,BASH_ENV=/root/.bashrc,HF_TOKEN,GS_ENABLE_NDARRAY=${GS_ENABLE_NDARRAY}"
mkdir -p ${HOME}/.cache/uv ${HOME}/.cache/genesis ${HOME}/.cache/huggingface
JOBID_FIFO="${{ github.workspace }}/.slurm_job_id_fifo"
[[ -e "$JOBID_FIFO" ]] && rm -f "$JOBID_FIFO"
mkfifo "$JOBID_FIFO"
salloc --job-name="${SLURM_JOB_NAME}" \
--partition=rtx-high --nodes=1 --mem=768G --gpus=8 --exclusive \
--time="${TIMEOUT_MINUTES}" \
bash -c "echo \$SLURM_JOB_ID > $JOBID_FIFO; sleep ${TIMEOUT_MINUTES}m" &
SLURM_JOB_ID=$(cat "$JOBID_FIFO")
rm -f "$JOBID_FIFO"
SRUN_COMMON="--overlap --jobid=${SLURM_JOB_ID} ${SRUN_CONTAINER_OPTS} --export=${SLURM_ENV_VARS}"
srun --jobid=${SLURM_JOB_ID} \
--container-image=/mnt/data/images/genesis-v${GENESIS_IMAGE_VER}.sqsh \
${SRUN_CONTAINER_OPTS} \
--export=${SLURM_ENV_VARS} \
echo "Container ready"
echo "SLURM_JOB_NAME=${SLURM_JOB_NAME}" >> $GITHUB_ENV
echo "SRUN_COMMON=${SRUN_COMMON}" >> "$GITHUB_ENV"
- name: Initialize Python virtual env
if: github.event_name == 'pull_request'
run: srun ${SRUN_COMMON} bash .github/workflows/scripts/production_build.sh
- name: Run unit tests
if: github.event_name == 'pull_request'
run: |
srun ${SRUN_COMMON} bash -s <<'EOF'
set -e
source /venv/bin/activate
# sudo apt update
# sudo apt install -y tmate
# tmate -S /tmp/tmate.sock new-session -d
# tmate -S /tmp/tmate.sock wait tmate-ready
# tmate -S /tmp/tmate.sock display -p '#{tmate_ssh}'
pytest -v -ra --backend gpu --dev --forked ./tests
# tmate -S /tmp/tmate.sock wait tmate-exit
EOF
- name: Kill Slurm job
if: always()
run: |
if [ -n "${SLURM_JOB_NAME}" ] ; then
scancel --user=${USER} --name="${SLURM_JOB_NAME}"
fi
benchmarks:
name: production-benchmarks-${{ matrix.GS_ENABLE_NDARRAY == '0' && 'field' || 'ndarray' }}
needs: unit-tests
runs-on: [self-hosted, coreweave, genesis-world]
strategy:
matrix:
GS_ENABLE_NDARRAY: ["0", "1"]
env:
# Note that secrets are not passed to workflows that are triggered by a pull request from a fork
WANDB_API_KEY: ${{ secrets.WANDB_API_KEY }}
GS_ENABLE_NDARRAY: ${{ matrix.GS_ENABLE_NDARRAY }}
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
# Checkout full history is required to shallow cloning while mark HEAD as "grafted". This breaks remote
# tracking thereby making it impossible to detect whether a commit is contained in upstream main.
fetch-depth: 0
- name: Spawn Slurm job
run: |
SLURM_JOB_NAME="$(uuidgen)_$(date +%Y%m%d_%H%M%S)"
CONTAINER_NAME="${SLURM_JOB_NAME}"
SRUN_CONTAINER_OPTS="\
--container-name=${CONTAINER_NAME} \
--container-mounts=\
/mnt/data/artifacts:/mnt/data/artifacts,\
${{ github.workspace }}:/root/workspace,\
${HOME}/.cache/uv:/root/.cache/uv,\
${HOME}/.cache/genesis:/root/.cache/genesis,\
${HOME}/.cache/huggingface:/root/.cache/huggingface \
--no-container-mount-home \
--container-workdir=/root/workspace"
SLURM_ENV_VARS="NVIDIA_DRIVER_CAPABILITIES=all,BASH_ENV=/root/.bashrc,HF_TOKEN,GS_ENABLE_NDARRAY=${GS_ENABLE_NDARRAY}"
if [[ "${{ github.repository }}" == 'Genesis-Embodied-AI/Genesis' && "${{ github.ref }}" == 'refs/heads/main' ]] ; then
SLURM_ENV_VARS="${SLURM_ENV_VARS},WANDB_API_KEY"
fi
JOBID_FIFO="${{ github.workspace }}/.slurm_job_id_fifo"
[[ -e "$JOBID_FIFO" ]] && rm -f "$JOBID_FIFO"
mkfifo "$JOBID_FIFO"
salloc --job-name="${SLURM_JOB_NAME}" \
--partition=rtx-high --nodes=1 --mem=768G --gpus=8 --exclusive \
--time="${TIMEOUT_MINUTES}" \
bash -c "echo \$SLURM_JOB_ID > $JOBID_FIFO; sleep ${TIMEOUT_MINUTES}m" &
SLURM_JOB_ID=$(cat "$JOBID_FIFO")
rm -f "$JOBID_FIFO"
SRUN_COMMON="--overlap --jobid=${SLURM_JOB_ID} ${SRUN_CONTAINER_OPTS} --export=${SLURM_ENV_VARS}"
srun --jobid=${SLURM_JOB_ID} \
--container-image=/mnt/data/images/genesis-v${GENESIS_IMAGE_VER}.sqsh \
${SRUN_CONTAINER_OPTS} \
--export=${SLURM_ENV_VARS} \
echo "Container ready"
echo "SLURM_JOB_NAME=${SLURM_JOB_NAME}" >> $GITHUB_ENV
echo "SRUN_COMMON=${SRUN_COMMON}" >> "$GITHUB_ENV"
- name: Initialize Python virtual env
run: srun ${SRUN_COMMON} bash .github/workflows/scripts/production_build.sh
- name: Run benchmarks
run: |
srun ${SRUN_COMMON} bash -s <<'EOF'
set -e
source /venv/bin/activate
pytest --mem-monitoring-filepath "/mnt/data/artifacts/mem_test_${SLURM_JOB_NAME}.txt" \
--print -m "benchmarks" ./tests
cat speed_test*.txt > "/mnt/data/artifacts/speed_test_${SLURM_JOB_NAME}.txt"
if [ -n "${WANDB_API_KEY}" ] ; then {
python tests/upload_benchmarks_table_to_wandb.py \
--in-file "/mnt/data/artifacts/mem_test_${SLURM_JOB_NAME}.txt" \
--project genesis-benchmarks-2 \
--metrics max_mem_mb \
--run-prefix mem
python tests/upload_benchmarks_table_to_wandb.py \
--in-file "/mnt/data/artifacts/speed_test_${SLURM_JOB_NAME}.txt" \
--project genesis-benchmarks-2 \
--metrics compile_time runtime_fps realtime_factor \
--run-prefix speed
} fi
EOF
- name: Kill Slurm job
if: always()
run: |
if [ -n "${SLURM_JOB_NAME}" ] ; then
scancel --user=${USER} --name="${SLURM_JOB_NAME}"
fi
- name: Display benchmark stats
run: |
cat "/mnt/data/artifacts/speed_test_${SLURM_JOB_NAME}.txt"
- name: Upload benchmark stats as artifact
uses: actions/upload-artifact@v4
with:
name: speed-test-${{ matrix.GS_ENABLE_NDARRAY }}
path: "/mnt/data/artifacts/speed_test_${{ env.SLURM_JOB_NAME }}.txt"
- name: Upload benchmark mem stats as artifact
uses: actions/upload-artifact@v4
with:
name: mem-test-${{ matrix.GS_ENABLE_NDARRAY }}
path: "/mnt/data/artifacts/mem_test_${{ env.SLURM_JOB_NAME }}.txt"
================================================
FILE: .github/workflows/scripts/alarm.py
================================================
"""
This script runs from alarm.yml
Terminology/variable names:
- benchmark suite results: the results of running all benchmark tests once, for a specific code base
- the code base could be conceptually:
- the current code under test
- some past revision of the code, described by a git commit hash
- there are actually multiple benchmark test suites, identified by a suite_id
- in this script, we are only interested in the rigid benchmark suite
- metric: the string name of something we are measuring, such as 'runtime_fps'
- configuration parameter: something we vary/control, such as batch_size, or env
- config_params_str: a string like "backend=cpu-n_envs=64", which specifies specific configuration
parameters, in string format
- note that, two config_params_str might represent the same configuration, but be different strings,
because ordering of configuration parameters might be differnet
- config_params_fdict: a frozen dict that represents a specific set of configuration parameters
- by comparison with config_str, two identical config_params_fdict's always represent the same configuration
- note that config_params_fdict's are hashable
- (fdict is an abbreviation for 'frozendict')
- config_param_names: ordered list of the config parameter names, that we have almost certainly derived
from a config_params_fdict, by simply returning the ordered list of keys (though we may have merged
such a list over multiple config_params_fdict's)
- we are prefixing with 'config' to make explicit that this does not include the names of metrics
- 'pipeline format':
a string having format like:
"solver=PBD | backend=cpu | n_envs=128 | compile_time=2.52 | runtime_fps=990.0 | realtime_factor=49.5"
"""
import argparse
import csv
import dataclasses
import json
import math
import os
import statistics
import sys
from collections import defaultdict
from pathlib import Path
from typing import Any, Callable, Iterable
from frozendict import frozendict
from wandb.apis.public import Run
import wandb
def config_params_str_to_fdict(config_params_str: str) -> frozendict[str, str]:
"""
Expects a config_params_str in the string format like:
solver=PBD-backend=cpu-n_envs=128
Returns this as a frozen dict of key value pairs.
Note that the values are strings, not converted into numbers.
"""
kv = {}
if config_params_str:
for token in config_params_str.split("-"):
token = token.strip()
if token and "=" in token:
k, v = token.split("=", 1)
kv[k.strip()] = v.strip()
return frozendict(kv)
def merge_string_tuples(tuples: tuple[tuple[str, ...], ...]) -> tuple[str, ...]:
"""
Merge tuples of strings into a single tuple of strings which:
- preserves the relative order of keys within each tuple
- gives precedence to later tuples when conflicts arise
"""
merged_keys = list(tuples[-1])
merged_keys_set = set(merged_keys)
for tuple_ in tuples[:-1]:
for key in tuple_:
if key not in merged_keys_set:
merged_keys.append(key)
merged_keys_set.add(key)
return tuple(merged_keys)
class SortKey:
def __init__(self, config_param_names: Iterable[str]) -> None:
self.config_param_names = config_param_names
def __call__(self, d: frozendict[str, Any]) -> list[tuple[int, int | float | None]]:
"""
returns list of tuples that can be used to order
dictionaries of values. The sort key function returns
a list of tuples of (True|False, value | None), where the sequence of
(True|False, value) matches that of config_param_names and:
- only keys in config_param_names are considered in the sorting
(in the context of this script, this lets us ignore the values of
metrics during sorting)
- when a param_name is present in the dictionary, the tuple
contains (False, value), otherwise (True, None)
Since the resulting tuples will be used for sorting, the result
is that we will first sort the incoming dictionaries by the first param_name,
then the second, etc
- for a particular param_name, the dicts without that param_name will
be placed after the dicts with that param name, since True is after False.
"""
key_list = []
for col in self.config_param_names:
val = d.get(col)
key_list.append((val is None, val))
return key_list
def parse_results_file(
results_file_path: Path, metric_keys: Iterable[str]
) -> dict[frozendict[str, str], dict[str, float]]:
"""
results file path should have lines in pipeline format, like:
solver=PBD | backend=cpu | n_envs=128 | compile_time=2.52 | runtime_fps=990.0 | realtime_factor=49.5
solver=PBD | backend=gpu | n_envs=1024 | compile_time=2.54 | runtime_fps=985.0 | realtime_factor=49.3
solver=MPM | backend=cpu | n_envs=64 | compile_time=2.53 | runtime_fps=988.0 | realtime_factor=49.4
This function returns a dict of dicts, something like:
{
FrozenDict({"solver": "PBD", "backend": "cpu"}): {
"compile_time": 2.52,
"runtime_fps": 990.0,
}
}
So:
- the keys of the top level dict are frozendict's representing all the key value pairs in a results row
EXCEPT the metric key value pairs
- the values are dicts where the keys are names of the metrics in metric_keys, and the values are
the measured value of that metric
Conceptually the keys are config_param_fdict's, and the values are a dictionary of metric names and
values.
"""
# easy to accidentally send a string instead of a tuple
assert isinstance(metric_keys, tuple)
results: dict[frozendict[str, str], dict[str, int | float]] = {}
for line in results_file_path.read_text().splitlines():
config_param_dict: dict[str, str] = dict( # type: ignore
map(str.strip, p.split("=", 1))
for p in line.split("|")
if "=" in p # type: ignore
)
metrics: dict[str, float | int] = {}
for k in metric_keys:
try:
# removes metric keys from the config param dict, and adds to the metric kv dict
metrics[k] = float(config_param_dict.pop(k))
except (ValueError, TypeError, KeyError):
pass
config_param_fdict: frozendict[str, str] = frozendict(config_param_dict)
results[config_param_fdict] = metrics
return results
def fmt_num(v, is_int: bool):
"""
converts number to string where:
- ints => displays as int
- floats => displays to 2 decimal places
"""
if v != v:
return "NaN"
return f"{int(v):,}" if is_int else f"{v:.2f}"
class WandbParser:
@property
def project(self):
raise NotImplementedError()
def __call__(
self,
benchmark_under_test: "BenchmarkRunUnderTest",
records_by_commit_hash: dict[str, dict[frozendict[str, str], dict[str, int | float]]],
config,
summary,
commit_hash: str,
) -> None:
raise NotImplementedError()
class WandbParserNewFormat(WandbParser):
@property
def project(self):
return "genesis-benchmarks-2"
def __call__(
self,
benchmark_under_test: "BenchmarkRunUnderTest",
records_by_commit_hash: dict[str, dict[frozendict[str, str], dict[str, int | float]]],
config,
summary,
commit_hash: str,
) -> None:
for k, v in summary.items():
if k.startswith("_"):
continue
metric_name, _, kv_pairs_str = k.partition("-")
kv_pairs_fdict = config_params_str_to_fdict(kv_pairs_str)
records_by_commit_hash[commit_hash][kv_pairs_fdict][metric_name] = v
class BenchmarkRunUnderTest:
"""
This class contains the data about the benchmark run under test, which we will then
compare with historical data. This data is loaded from text files in pipe format.
| foo=123 | bar=456 | ...
"""
def __init__(self, artifacts_dir: Path, metric_keys: Iterable[str], filename_glob: str) -> None:
"""
metric_keys: the keys corresponding to values being measured, such as runtime_fps
filename_glob: how to locate the data files with the data for the benchmark run
under test.
"""
self.result_file_paths = list(artifacts_dir.rglob(filename_glob))
# make sure we do actually have some current benchmark data to read
assert self.result_file_paths
self.metric_keys = metric_keys
# self.results is a dictionary where the keys are config_param_fdict's, and the values
# are dicts of metric names and values
self.results: dict[frozendict[str, str], dict[str, float]] = {}
for self.result_file_path in self.result_file_paths:
self.results |= parse_results_file(self.result_file_path, self.metric_keys)
# all the config_param_fdicts that we need to check for a 'complete set', when looking
# at historical data (some earlier runs might be missing some of the newer benchmark
# runs)
self.all_config_param_fdicts = frozenset(self.results.keys())
assert self.all_config_param_fdicts
# ordered list of the config parameter names
self.config_param_names = merge_string_tuples(tuple((tuple(kv.keys())) for kv in self.results.keys()))
class Alarm:
def __init__(self, args: argparse.Namespace) -> None:
self.max_valid_revisions = args.max_valid_revisions
self.max_fetch_revisions = args.max_fetch_revisions
# let's just define these in one place
self.metric_compile_time = "compile_time"
self.metric_runtime_fps = "runtime_fps"
self.metric_realtime_factor = "realtime_factor"
self.metric_max_mem_mb = "max_mem_mb"
self.metrics_tol = {
self.metric_runtime_fps: args.runtime_fps_regression_tolerance_pct,
self.metric_compile_time: args.compile_time_regression_tolerance_pct,
self.metric_max_mem_mb: args.mem_regression_tolerance_pct,
}
self.speed_artifacts_dir = Path(args.speed_artifacts_dir).expanduser().resolve()
self.mem_artifacts_dir = Path(args.mem_artifacts_dir).expanduser().resolve()
self.check_body_path = Path(args.check_body_path).expanduser()
self.csv_out_file_by_metric_name = {
self.metric_runtime_fps: Path(args.csv_runtime_fps_path).expanduser().resolve(),
self.metric_compile_time: Path(args.csv_compile_time_path).expanduser().resolve(),
self.metric_max_mem_mb: Path(args.csv_mem_path).expanduser().resolve(),
}
self.speed_metric_keys = (
self.metric_compile_time,
self.metric_runtime_fps,
self.metric_realtime_factor,
)
self.mem_metric_keys = (self.metric_max_mem_mb,) # note: make sure is a tuple
self.dev_skip_speed = args.dev_skip_speed
self.dev_allow_all_branches = args.dev_allow_all_branches
assert "WANDB_API_KEY" in os.environ
self.wandb_entity = os.environ["WANDB_ENTITY"]
def fetch_wandb_data(
self,
benchmark_under_test: BenchmarkRunUnderTest,
run_name_prefix: str | None,
wandb_parser: WandbParser,
) -> dict[str, dict[frozendict[str, str], dict[str, float | int]]]:
api = wandb.Api()
runs_iter: Iterable[Run] = api.runs(f"{self.wandb_entity}/{wandb_parser.project}", order="-created_at")
commit_hashes = set()
records_by_commit_hash: dict[str, dict[frozendict[str, str], dict[str, float | int]]] = defaultdict(
lambda: defaultdict(dict)
)
for i, run in enumerate(runs_iter):
if run_name_prefix and not run.name.startswith(run_name_prefix):
continue
# Abort if still not complete after checking enough runs.
# This would happen if a new benchmark has been added, and not enough past data is available yet.
if len(commit_hashes) == self.max_fetch_revisions:
break
# Early return if enough complete records have been collected
complete_records = [
benchmark_under_test.all_config_param_fdicts.issubset(record.keys())
for record in records_by_commit_hash.values()
]
if sum(complete_records) == self.max_valid_revisions:
break
# Load config and summary, with support of legacy runs
summary: dict[str, Any]
try:
config, summary = run.config, run.summary # type: ignore
except Exception as e:
print(e)
continue
if isinstance(config, str):
config = {k: v["value"] for k, v in json.loads(config).items() if not k.startswith("_")}
if isinstance(summary._json_dict, str): # type: ignore
summary = json.loads(summary._json_dict) # type: ignore
# Extract revision commit and branch
try:
commit_hash, branch = config["revision"].split("@", 1)
commit_hashes.add(commit_hash)
except ValueError:
# Ignore this run if the revision has been corrupted for some unknown reason
continue
# Ignore runs associated with a commit that is not part of the official repository
if not branch.startswith("Genesis-Embodied-AI/") and not self.dev_allow_all_branches:
continue
# Skip runs did not finish for some reason
if run.state != "finished":
continue
# Do not store new records if the desired number of revision is already reached
if len(records_by_commit_hash) == self.max_valid_revisions and commit_hash not in records_by_commit_hash:
continue
wandb_parser(
benchmark_under_test=benchmark_under_test,
records_by_commit_hash=records_by_commit_hash,
config=config,
summary=summary,
commit_hash=commit_hash,
)
return records_by_commit_hash
def build_table(
self,
config_param_names: tuple[str, ...],
alias: str,
metric: str,
benchmark_run_under_test: BenchmarkRunUnderTest,
records_by_commit_hash: dict[str, Any],
sign: int,
) -> tuple[list[str], bool, bool]:
# together these rows contain the text of the markdwon
markdown_rows = []
rows = []
alert_found, reg_found = False, False
# the labels in the header row of the table
header_cells = (
"status",
*config_param_names,
f"current {alias}",
f"baseline {alias} [last (mean ± std)] (*1)",
f"Δ {alias} (*2)",
)
header = "| " + " | ".join(header_cells) + " |"
align = "|:------:|" + "|".join([":---" for _ in config_param_names]) + "|---:|---:|---:|"
row_data = {}
for config_params_fdict in sorted(
benchmark_run_under_test.results.keys(), key=SortKey(config_param_names=config_param_names)
):
value_cur = benchmark_run_under_test.results[config_params_fdict][metric]
is_int = isinstance(value_cur, int) or value_cur.is_integer()
value_repr = fmt_num(value_cur, is_int)
params_repr = [config_params_fdict.get(k, "-") for k in config_param_names]
row_data = {
**dict(zip(config_param_names, params_repr)),
"current": value_cur,
"baseline_last": None,
"baseline_mean": None,
"baseline_min": None,
"baseline_max": None,
"status": None,
}
values_prev = [
record[config_params_fdict][metric]
for record in records_by_commit_hash.values()
if config_params_fdict in record
]
if values_prev:
value_last = values_prev[0]
value_ref = statistics.fmean(values_prev)
delta = (value_cur - value_last) / value_last * 100.0
row_data["baseline_last"] = int(value_last) if is_int else float(value_last)
stats_repr = f"{fmt_num(value_last, is_int)}"
delta_repr = f"{delta:+.1f}%"
if len(values_prev) >= self.max_valid_revisions:
row_data["baseline_mean"] = int(value_ref) if is_int else float(value_ref)
row_data["baseline_min"] = int(min(values_prev)) if is_int else float(min(values_prev))
row_data["baseline_max"] = int(max(values_prev)) if is_int else float(max(values_prev))
value_ci95 = (
statistics.stdev(values_prev) / math.sqrt(len(values_prev)) * 1.96
if len(values_prev) > 1
else math.nan
)
stats_repr += f" ({fmt_num(value_ref, is_int)} ± {fmt_num(value_ci95, is_int)})"
if sign * delta < -self.metrics_tol[metric]:
row_data["status"] = "regression"
delta_repr = f"**{delta_repr}**"
picto = "🔴"
reg_found = True
elif sign * delta > self.metrics_tol[metric]:
row_data["status"] = "alert"
delta_repr = f"**{delta_repr}**"
picto = "⚠️"
alert_found = True
else:
row_data["status"] = "ok"
picto = "✅"
else:
row_data["status"] = "n/a"
picto = "ℹ️"
else:
picto, stats_repr, delta_repr = "ℹ️", "---", "---"
markdown_rows.append("| " + " | ".join((picto, *params_repr, value_repr, stats_repr, delta_repr)) + " |")
rows.append(row_data)
blist = [f"- Commit {i}: {sha}" for i, sha in enumerate(records_by_commit_hash.keys(), 1)]
baseline_block = ["**Baselines considered:** " + f"**{len(records_by_commit_hash)}** commits"] + blist
with self.csv_out_file_by_metric_name[metric].open("w", newline="", encoding="utf-8") as f:
w = csv.DictWriter(f, fieldnames=row_data.keys())
w.writeheader()
for rec in rows:
w.writerow(rec)
return [header, align] + markdown_rows + [""] + baseline_block, reg_found, alert_found
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--speed-artifacts-dir", type=str, required=True)
parser.add_argument("--mem-artifacts-dir", type=str, required=True)
parser.add_argument(
"--max-valid-revisions",
type=int,
default=10,
help="limits how many git commits are used to build the baseline statistics",
)
parser.add_argument("--max-fetch-revisions", type=int, default=10)
parser.add_argument("--runtime-fps-regression-tolerance-pct", type=float, default=10)
parser.add_argument("--compile-time-regression-tolerance-pct", type=float, default=10)
parser.add_argument("--mem-regression-tolerance-pct", type=float, default=10)
parser.add_argument("--check-body-path", type=str, required=True)
parser.add_argument("--csv-runtime-fps-path", type=str, required=True)
parser.add_argument("--csv-compile-time-path", type=str, required=True)
parser.add_argument("--csv-mem-path", type=str, required=True)
parser.add_argument("--exit-code-regression", type=int, default=42)
parser.add_argument("--exit-code-alert", type=int, default=43)
parser.add_argument("--dev-skip-speed", action="store_true")
parser.add_argument("--dev-allow-all-branches", action="store_true")
args = parser.parse_args()
alarm = Alarm(args=args)
results_under_test_speed = BenchmarkRunUnderTest(
artifacts_dir=alarm.speed_artifacts_dir, metric_keys=alarm.speed_metric_keys, filename_glob="speed_test*.txt"
)
results_under_test_mem = BenchmarkRunUnderTest(
artifacts_dir=alarm.mem_artifacts_dir, metric_keys=alarm.mem_metric_keys, filename_glob="mem_test*.txt"
)
speed_records_by_commit_hash = {}
if not alarm.dev_skip_speed:
speed_records_by_commit_hash = alarm.fetch_wandb_data(
benchmark_under_test=results_under_test_speed,
run_name_prefix="speed-",
wandb_parser=WandbParserNewFormat(),
)
mem_records_by_commit_hash = alarm.fetch_wandb_data(
benchmark_under_test=results_under_test_mem, run_name_prefix="mem-", wandb_parser=WandbParserNewFormat()
)
reg_found, alert_found = False, False
table_by_metric_name: dict[str, list[str]] = {}
reg_found, alert_found = False, False
for metric, alias, sign, results_under_test_, records_by_commit_hash_ in (
(alarm.metric_runtime_fps, "FPS", 1, results_under_test_speed, speed_records_by_commit_hash),
(alarm.metric_compile_time, "compile", -1, results_under_test_speed, speed_records_by_commit_hash),
(alarm.metric_max_mem_mb, "memory", -1, results_under_test_mem, mem_records_by_commit_hash),
):
(table_by_metric_name[metric], reg_found_, alert_found_) = alarm.build_table(
config_param_names=results_under_test_.config_param_names,
alias=alias,
metric=metric,
sign=sign,
benchmark_run_under_test=results_under_test_,
records_by_commit_hash=records_by_commit_hash_,
)
reg_found |= reg_found_
alert_found |= alert_found_
thr_repr = ", ".join(
f"{alias} ± {alarm.metrics_tol[metric]:.0f}%"
for metric, alias in (
(alarm.metric_runtime_fps, "runtime"),
(alarm.metric_compile_time, "compile"),
(alarm.metric_max_mem_mb, "mem"),
)
)
check_body = "\n".join(
[
f"Thresholds: {thr_repr}",
"",
"### Runtime FPS",
*table_by_metric_name[alarm.metric_runtime_fps],
"",
"### Compile Time",
*table_by_metric_name[alarm.metric_compile_time],
"",
"### Memory usage",
*table_by_metric_name[alarm.metric_max_mem_mb],
"",
f"- (*1) last: last commit on main, mean/std: stats over commit hashes {alarm.max_valid_revisions} commits if available.",
"- (*2) Δ: relative difference between PR and last commit on main, i.e. (PR - main) / main * 100%.",
]
)
alarm.check_body_path.write_text(check_body + "\n", encoding="utf-8")
if reg_found:
sys.exit(int(args.exit_code_regression))
if alert_found:
sys.exit(int(args.exit_code_alert))
sys.exit(0)
================================================
FILE: .github/workflows/scripts/production_build.sh
================================================
#!/bin/bash
set -ex
curl -LsSf https://astral.sh/uv/install.sh | sh
uv --version
uv venv --python '3.10' /venv
source /venv/bin/activate
# Note: the version of cuda must tightly align with what is being installed
# in the Slurm container image, otherwise poorly packaged libraries, such as
# libuipc, may fail to import.
uv pip install torch --index-url https://download.pytorch.org/whl/cu129
uv pip install --upgrade pip setuptools wheel
uv pip install omniverse-kit --index-url https://pypi.nvidia.com/
uv pip install ".[dev,render,usd]" "pyuipc==0.0.7"
================================================
FILE: .gitignore
================================================
logs/
tmp/
MUJOCO_LOG.TXT
imgui.ini
.polyscope.ini
.DS_Store
sftp-config.json
*.mp4
genesis/assets/terrain/
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.pyc
*.pyd
*.so
*.o
simplify.c
_simplify.cpp
_replay.cpp
# Distribution / packaging
.Python
build/
data/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
# lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# debug
examples/debug/*
# 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/
__snapshots__
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
doc/_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/
.idea/
.vscode/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
uv.lock
# alarm.yml outputs
outputs/
================================================
FILE: .gitmodules
================================================
[submodule "doc"]
path = doc
url = https://github.com/Genesis-Embodied-AI/genesis-doc
[submodule "genesis/ext/LuisaRender"]
path = genesis/ext/LuisaRender
url = https://github.com/Alif-01/LuisaRender
[submodule "genesis/ext/ParticleMesher"]
path = genesis/ext/ParticleMesher
url = https://github.com/ACMLCZH/ParticleMesher
================================================
FILE: .pre-commit-config.yaml
================================================
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
# Ruff version.
rev: v0.14.11
hooks:
# Run the formatter.
- id: ruff-check
# Run the formatter.
- id: ruff-format
================================================
FILE: .readthedocs.yaml
================================================
version: 2
build:
os: ubuntu-22.04
tools:
python: "3.12"
submodules:
include:
- doc
recursive: true
sphinx:
configuration: doc/source/conf.py
python:
install:
- requirements: doc/requirements.txt
================================================
FILE: AGENTS.md
================================================
# AGENTS.md - Genesis AI Agent Guide
Guide for AI coding assistants working with the Genesis physics simulation codebase.
## Quick Start
```bash
# Setup
uv sync
uv pip install torch --index-url https://download.pytorch.org/whl/cu126 # or cpu/metal
# Run tests
uv run pytest tests/
uv run pytest tests/ -m required # minimal set
# Run examples
uv run examples/tutorials/hello_genesis.py
```
## How to Run Tests
```bash
uv run pytest tests/ # All tests
uv run pytest tests/test_file.py # Specific file
uv run pytest tests/ --backend=gpu # GPU backend
uv run pytest tests/ -m required # Required tests only
uv run pytest tests/ -m "not slow" # Skip slow tests
```
See [TESTING.md](.github/contributing/TESTING.md) for details.
## How to Contribute
### PR Title Prefixes
- `[BUG FIX]` - Non-breaking bug fixes
- `[FEATURE]` - New functionality
- `[MISC]` - Minor changes (docs, typos)
- `[CHANGING]` - Behavior changes
- `[BREAKING]` - Breaking API changes
### Before Submitting
1. Install pre-commit hooks: `pre-commit install`
2. Run required tests: `uv run pytest -m required tests/`
3. Link to related issue in PR description
See [PULL_REQUESTS.md](.github/contributing/PULL_REQUESTS.md) for details.
## Formatting & Lint
Genesis uses **ruff** for linting and formatting (via pre-commit):
```bash
# Install hooks (auto-runs on commit)
pre-commit install
# Manual run
pre-commit run --all-files
```
**Rules:**
- Line length: 120 characters
- Format: ruff-format (black-compatible)
- Lint: ruff-check
See [CODING_CONVENTIONS.md](.github/contributing/CODING_CONVENTIONS.md) for code style.
## When to Ask a Human
Ask for clarification when:
- **Ambiguous requirements** - Multiple valid interpretations exist
- **Breaking changes** - Changes that affect public APIs or behavior
- **Architecture decisions** - New solvers, major refactors, new entity types
- **Performance trade-offs** - When optimization conflicts with readability
- **Test failures** - Unclear why tests fail or how to fix them
- **Cross-solver coupling** - Changes affecting multiple physics solvers
Do NOT ask when:
- Standard bug fixes with clear reproduction steps
- Documentation updates
- Adding tests for existing functionality
- Code style fixes flagged by linters
## Reference Documentation
| Document | Description |
|----------|-------------|
| [ARCHITECTURE.md](.github/contributing/ARCHITECTURE.md) | Project structure, solvers, entities |
| [TESTING.md](.github/contributing/TESTING.md) | Testing guide and fixtures |
| [CODING_CONVENTIONS.md](.github/contributing/CODING_CONVENTIONS.md) | Code style and patterns |
| [EXAMPLES.md](.github/contributing/EXAMPLES.md) | Examples reference |
| [PULL_REQUESTS.md](.github/contributing/PULL_REQUESTS.md) | PR guidelines |
================================================
FILE: 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: MANIFEST.in
================================================
include README.md
include LICENSE
recursive-include genesis/assets *
recursive-include genesis/ext/pyrender/fonts *
recursive-include genesis/ext/pyrender/shaders *
include genesis/ext/VolumeSampling
================================================
FILE: README.md
================================================


[](https://pypi.org/project/genesis-world/)
[](https://pepy.tech/projects/genesis-world)
[](https://github.com/Genesis-Embodied-AI/Genesis/issues)
[](https://github.com/Genesis-Embodied-AI/Genesis/discussions)
[](https://discord.gg/nukCuhB47p)
<a href="https://drive.google.com/uc?export=view&id=1ZS9nnbQ-t1IwkzJlENBYqYIIOOZhXuBZ"><img src="https://img.shields.io/badge/WeChat-07C160?style=for-the-badge&logo=wechat&logoColor=white" height="20" style="display:inline"></a>
[](./README.md)
[](./README_FR.md)
[](./README_KR.md)
[](./README_CN.md)
[](./README_JA.md)
# Genesis
## 🔥 News
- [2025-08-05] Released v0.3.0 🎊 🎉
- [2025-07-02] The development of Genesis is now officially supported by [Genesis AI](https://genesis-ai.company/).
- [2025-01-09] We released a [detailed performance benchmarking and comparison report](https://github.com/zhouxian/genesis-speed-benchmark) on Genesis, together with all the test scripts.
- [2025-01-08] Released v0.2.1 🎊 🎉
- [2025-01-08] Created [Discord](https://discord.gg/nukCuhB47p) and [Wechat](https://drive.google.com/uc?export=view&id=1ZS9nnbQ-t1IwkzJlENBYqYIIOOZhXuBZ) group.
- [2024-12-25] Added a [docker](#docker) including support for the ray-tracing renderer
- [2024-12-24] Added guidelines for [contributing to Genesis](https://github.com/Genesis-Embodied-AI/Genesis/blob/main/.github/contributing/PULL_REQUESTS.md)
## Table of Contents
1. [What is Genesis?](#what-is-genesis)
2. [Key Features](#key-features)
3. [Quick Installation](#quick-installation)
4. [Docker](#docker)
5. [Documentation](#documentation)
6. [Contributing to Genesis](#contributing-to-genesis)
7. [Support](#support)
8. [License and Acknowledgments](#license-and-acknowledgments)
9. [Associated Papers](#associated-papers)
10. [Citation](#citation)
## What is Genesis?
Genesis is a physics platform designed for general-purpose *Robotics/Embodied AI/Physical AI* applications. It is simultaneously multiple things:
1. A **universal physics engine** re-built from the ground up, capable of simulating a wide range of materials and physical phenomena.
2. A **lightweight**, **ultra-fast**, **pythonic**, and **user-friendly** robotics simulation platform.
3. A powerful and fast **photo-realistic rendering system**.
4. A **generative data engine** that transforms user-prompted natural language description into various modalities of data.
Powered by a universal physics engine re-designed and re-built from the ground up, Genesis integrates various physics solvers and their coupling into a unified framework. This core physics engine is further enhanced by a generative agent framework that operates at an upper level, aiming towards fully automated data generation for robotics and beyond.
**Note**: Currently, we are open-sourcing the _underlying physics engine_ and the _simulation platform_. Our _generative framework_ is a modular system that incorporates many different generative modules, each handling a certain range of data modalities, routed by a high level agent. Some of the modules integrated existing papers and some are still under submission. Access to our generative feature will be gradually rolled out in the near future. If you are interested, feel free to explore more in the [paper list](#associated-papers) below.
Genesis aims to:
- **Lower the barrier** to using physics simulations, making robotics research accessible to everyone. See our [mission statement](https://genesis-world.readthedocs.io/en/latest/user_guide/overview/mission.html).
- **Unify diverse physics solvers** into a single framework to recreate the physical world with the highest fidelity.
- **Automate data generation**, reducing human effort and letting the data flywheel spin on its own.
Project Page: <https://genesis-embodied-ai.github.io/>
## Key Features
- **Speed**: Over 43 million FPS when simulating a Franka robotic arm with a single RTX 4090 (430,000 times faster than real-time).
- **Cross-platform**: Runs on Linux, macOS, Windows, and supports multiple compute backends (CPU, Nvidia/AMD GPUs, Apple Metal).
- **Integration of diverse physics solvers**: Rigid body, MPM, SPH, FEM, PBD, Stable Fluid.
- **Wide range of material models**: Simulation and coupling of rigid bodies, liquids, gases, deformable objects, thin-shell objects, and granular materials.
- **Compatibility with various robots**: Robotic arms, legged robots, drones, *soft robots*, and support for loading `MJCF (.xml)`, `URDF`, `.obj`, `.glb`, `.ply`, `.stl`, and more.
- **Photo-realistic rendering**: Native ray-tracing-based rendering.
- **Differentiability**: Genesis is designed to be fully differentiable. Currently, our MPM solver and Tool Solver support differentiability, with other solvers planned for future versions (starting with rigid & articulated body solver).
- **User-friendliness**: Designed for simplicity, with intuitive installation and APIs.
## Quick Installation
### Using pip
Install **PyTorch** first following the [official instructions](https://pytorch.org/get-started/locally/).
Then, install Genesis via PyPI:
```bash
pip install genesis-world # Requires Python>=3.10,<3.14;
```
For the latest version to date, make sure that `pip` is up-to-date via `pip install --upgrade pip`, then run command:
```bash
pip install git+https://github.com/Genesis-Embodied-AI/Genesis.git
```
Note that the package must still be updated manually to sync with main branch.
Users seeking to contribute are encouraged to install Genesis in editable mode. First, make sure that `genesis-world` has been uninstalled, then clone the repository and install locally:
```bash
git clone https://github.com/Genesis-Embodied-AI/Genesis.git
cd Genesis
pip install -e ".[dev]"
```
It is recommended to systematically execute `pip install -e ".[dev]"` after moving HEAD to make sure that all dependencies and entrypoints are up-to-date.
### Using uv
[uv](https://docs.astral.sh/uv/) is a fast Python package and project manager.
**Install uv:**
```bash
# On macOS and Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# On Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
```
**Quick start with uv:**
```bash
git clone https://github.com/Genesis-Embodied-AI/Genesis.git
cd Genesis
uv sync
```
Then install PyTorch for your platform:
```bash
# NVIDIA GPU (CUDA 12.6 as an example)
uv pip install torch --index-url https://download.pytorch.org/whl/cu126
# CPU only (Linux/Windows)
uv pip install torch --index-url https://download.pytorch.org/whl/cpu
# Apple Silicon (Metal/MPS)
uv pip install torch
```
Run an example:
```bash
uv run examples/rigid/single_franka.py
```
## Docker
If you want to use Genesis from Docker, you can first build the Docker image as:
```bash
docker build -t genesis -f docker/Dockerfile docker
```
Then you can run the examples inside the docker image (mounted to `/workspace/examples`):
```bash
xhost +local:root # Allow the container to access the display
docker run --gpus all --rm -it \
-e DISPLAY=$DISPLAY \
-e LOCAL_USER_ID="$(id -u)" \
-v /dev/dri:/dev/dri \
-v /tmp/.X11-unix/:/tmp/.X11-unix \
-v $(pwd):/workspace \
--name genesis genesis:latest
```
### AMD users
AMD users can use Genesis using the `docker/Dockerfile.amdgpu` file, which is built by running:
```
docker build -t genesis-amd -f docker/Dockerfile.amdgpu docker
```
and can then be used by running:
```xhost +local:docker \
docker run -it --network=host \
--device=/dev/kfd \
--device=/dev/dri \
--group-add=video \
--ipc=host \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
--shm-size 8G \
-v $PWD:/workspace \
-e DISPLAY=$DISPLAY \
genesis-amd
```
The examples will be accessible from `/workspace/examples`. Note: AMD users should use the ROCm (HIP) backend. This means you will need to call `gs.init(backend=gs.amdgpu)` to initialise Genesis.
## Documentation
Comprehensive documentation is available in [English](https://genesis-world.readthedocs.io/en/latest/user_guide/index.html), [Chinese](https://genesis-world.readthedocs.io/zh-cn/latest/user_guide/index.html), and [Japanese](https://genesis-world.readthedocs.io/ja/latest/user_guide/index.html). This includes detailed installation steps, tutorials, and API references.
## Contributing to Genesis
The Genesis project is an open and collaborative effort. We welcome all forms of contributions from the community, including:
- **Pull requests** for new features or bug fixes.
- **Bug reports** through GitHub Issues.
- **Suggestions** to improve Genesis's usability.
Refer to our [contribution guide](https://github.com/Genesis-Embodied-AI/Genesis/blob/main/.github/contributing/PULL_REQUESTS.md) for more details.
## Support
- Report bugs or request features via GitHub [Issues](https://github.com/Genesis-Embodied-AI/Genesis/issues).
- Join discussions or ask questions on GitHub [Discussions](https://github.com/Genesis-Embodied-AI/Genesis/discussions).
## License and Acknowledgments
The Genesis source code is licensed under Apache 2.0.
Genesis's development has been made possible thanks to these open-source projects:
- [Taichi](https://github.com/taichi-dev/taichi): High-performance cross-platform compute backend. Kudos to the Taichi team for their technical support!
- [FluidLab](https://github.com/zhouxian/FluidLab): Reference MPM solver implementation.
- [SPH_Taichi](https://github.com/erizmr/SPH_Taichi): Reference SPH solver implementation.
- [Ten Minute Physics](https://matthias-research.github.io/pages/tenMinutePhysics/index.html) and [PBF3D](https://github.com/WASD4959/PBF3D): Reference PBD solver implementations.
- [MuJoCo](https://github.com/google-deepmind/mujoco): Reference for rigid body dynamics.
- [libccd](https://github.com/danfis/libccd): Reference for collision detection.
- [PyRender](https://github.com/mmatl/pyrender): Rasterization-based renderer.
- [LuisaCompute](https://github.com/LuisaGroup/LuisaCompute) and [LuisaRender](https://github.com/LuisaGroup/LuisaRender): Ray-tracing DSL.
- [Madrona](https://github.com/shacklettbp/madrona) and [Madrona-mjx](https://github.com/shacklettbp/madrona_mjx): Batch renderer backend
## Associated Papers
Genesis is a large scale effort that integrates state-of-the-art technologies of various existing and on-going research work into a single system. Here we include a non-exhaustive list of all the papers that contributed to the Genesis project in one way or another:
- Xian, Zhou, et al. "Fluidlab: A differentiable environment for benchmarking complex fluid manipulation." arXiv preprint arXiv:2303.02346 (2023).
- Xu, Zhenjia, et al. "Roboninja: Learning an adaptive cutting policy for multi-material objects." arXiv preprint arXiv:2302.11553 (2023).
- Wang, Yufei, et al. "Robogen: Towards unleashing infinite data for automated robot learning via generative simulation." arXiv preprint arXiv:2311.01455 (2023).
- Wang, Tsun-Hsuan, et al. "Softzoo: A soft robot co-design benchmark for locomotion in diverse environments." arXiv preprint arXiv:2303.09555 (2023).
- Wang, Tsun-Hsuan Johnson, et al. "Diffusebot: Breeding soft robots with physics-augmented generative diffusion models." Advances in Neural Information Processing Systems 36 (2023): 44398-44423.
- Katara, Pushkal, Zhou Xian, and Katerina Fragkiadaki. "Gen2sim: Scaling up robot learning in simulation with generative models." 2024 IEEE International Conference on Robotics and Automation (ICRA). IEEE, 2024.
- Si, Zilin, et al. "DiffTactile: A Physics-based Differentiable Tactile Simulator for Contact-rich Robotic Manipulation." arXiv preprint arXiv:2403.08716 (2024).
- Wang, Yian, et al. "Thin-Shell Object Manipulations With Differentiable Physics Simulations." arXiv preprint arXiv:2404.00451 (2024).
- Lin, Chunru, et al. "UBSoft: A Simulation Platform for Robotic Skill Learning in Unbounded Soft Environments." arXiv preprint arXiv:2411.12711 (2024).
- Zhou, Wenyang, et al. "EMDM: Efficient motion diffusion model for fast and high-quality motion generation." European Conference on Computer Vision. Springer, Cham, 2025.
- Qiao, Yi-Ling, Junbang Liang, Vladlen Koltun, and Ming C. Lin. "Scalable differentiable physics for learning and control." International Conference on Machine Learning. PMLR, 2020.
- Qiao, Yi-Ling, Junbang Liang, Vladlen Koltun, and Ming C. Lin. "Efficient differentiable simulation of articulated bodies." In International Conference on Machine Learning, PMLR, 2021.
- Qiao, Yi-Ling, Junbang Liang, Vladlen Koltun, and Ming Lin. "Differentiable simulation of soft multi-body systems." Advances in Neural Information Processing Systems 34 (2021).
- Wan, Weilin, et al. "Tlcontrol: Trajectory and language control for human motion synthesis." arXiv preprint arXiv:2311.17135 (2023).
- Wang, Yian, et al. "Architect: Generating Vivid and Interactive 3D Scenes with Hierarchical 2D Inpainting." arXiv preprint arXiv:2411.09823 (2024).
- Zheng, Shaokun, et al. "LuisaRender: A high-performance rendering framework with layered and unified interfaces on stream architectures." ACM Transactions on Graphics (TOG) 41.6 (2022): 1-19.
- Fan, Yingruo, et al. "Faceformer: Speech-driven 3d facial animation with transformers." Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2022.
- Wu, Sichun, Kazi Injamamul Haque, and Zerrin Yumak. "ProbTalk3D: Non-Deterministic Emotion Controllable Speech-Driven 3D Facial Animation Synthesis Using VQ-VAE." Proceedings of the 17th ACM SIGGRAPH Conference on Motion, Interaction, and Games. 2024.
- Dou, Zhiyang, et al. "C· ase: Learning conditional adversarial skill embeddings for physics-based characters." SIGGRAPH Asia 2023 Conference Papers. 2023.
... and many more on-going work.
## Citation
If you use Genesis in your research, please consider citing:
```bibtex
@misc{Genesis,
author = {Genesis Authors},
title = {Genesis: A Generative and Universal Physics Engine for Robotics and Beyond},
month = {December},
year = {2024},
url = {https://github.com/Genesis-Embodied-AI/Genesis}
}
================================================
FILE: README_CN.md
================================================


[](https://pypi.org/project/genesis-world/)
[](https://pypi.org/project/genesis-world/)
[](https://github.com/Genesis-Embodied-AI/Genesis/issues)
[](https://github.com/Genesis-Embodied-AI/Genesis/discussions)
[](https://discord.gg/nukCuhB47p)
<a href="https://drive.google.com/uc?export=view&id=1ZS9nnbQ-t1IwkzJlENBYqYIIOOZhXuBZ"><img src="https://img.shields.io/badge/WeChat-07C160?style=for-the-badge&logo=wechat&logoColor=white" height="20" style="display:inline"></a>
[](./README.md)
[](./README_FR.md)
[](./README_KR.md)
[](./README_CN.md)
[](./README_JA.md)
# Genesis 通用物理引擎
## 🔥 最新消息
- [2025-08-05] 发布 v0.3.0 🎊 🎉
- [2025-07-02] Genesis 的开发工作现已获得 [Genesis AI](https://genesis-ai.company/) 的官方支持。
- [2025-01-09] 我们发布了一份关于 Genesis 的[详细性能基准测试和比较报告](https://github.com/zhouxian/genesis-speed-benchmark),并附上所有测试脚本。
- [2025-01-08] 发布 v0.2.1 🎊 🎉
- [2025-01-08] 创建了 [Discord](https://discord.gg/nukCuhB47p) 和 [微信](https://drive.google.com/uc?export=view&id=1ZS9nnbQ-t1IwkzJlENBYqYIIOOZhXuBZ) 社区群。
- [2024-12-25] 添加了支持光线追踪渲染器的 [docker](https://www.google.com/search?q=%23docker)。
- [2024-12-24] 添加了[为 Genesis 做贡献](https://github.com/Genesis-Embodied-AI/Genesis/blob/main/.github/contributing/PULL_REQUESTS.md)的指南。
## 目录
1. [概述](#概述)
2. [主要特点](#主要特点)
3. [快速入门](#快速入门)
4. [参与贡献](#参与贡献)
5. [帮助支持](#帮助支持)
6. [许可证与致谢](#许可证和致谢)
7. [相关论文](#genesis-背后的论文)
8. [引用](#引用)
## 概述
Genesis 是专为 *机器人/嵌入式 AI/物理 AI* 应用设计的通用物理平台,集成了以下核心功能:
- **通用物理引擎**: 从底层重建,支持多种材料和物理现象模拟
- **机器人模拟平台**: 轻量、高速、Python友好的开发环境
- **真实感渲染**: 内置光线追踪渲染系统
- **生成数据引擎**: 自然语言驱动的多模态数据生成
我们的长期使命:
- 降低物理模拟使用门槛
- 统一各类物理求解器
- 实现数据生成自动化
项目主页: <https://genesis-embodied-ai.github.io/>
## 主要特点
- **速度**:Genesis 提供了前所未有的模拟速度——在单个 RTX 4090 上模拟 Franka 机器人手臂时超过 4300 万 FPS(比实时快 430,000 倍)。
- **跨平台**:Genesis 原生运行在不同系统(Linux、MacOS、Windows)和不同计算后端(CPU、Nvidia GPU、AMD GPU、Apple Metal)上。
- **各种物理求解器的统一**:Genesis 开发了一个统一的模拟框架,集成了各种物理求解器:刚体、MPM、SPH、FEM、PBD、稳定流体。
- **支持广泛的材料模型**:Genesis 支持刚体和关节体、各种液体、气体现象、可变形物体、薄壳物体和颗粒材料的模拟(及其耦合)。
- **支持广泛的机器人**:机器人手臂、腿式机器人、无人机、*软体机器人*等,并广泛支持加载不同文件类型:`MJCF (.xml)`、`URDF`、`.obj`、`.glb`、`.ply`、`.stl` 等。
- **照片级真实感和高性能光线追踪器**:Genesis 支持基于光线追踪的原生渲染。
- **可微分性**:Genesis 设计为完全兼容可微分模拟。目前,我们的 MPM 求解器和工具求解器是可微分的,其他求解器的可微分性将很快添加(从刚体模拟开始)。
- **用户友好性**:Genesis 设计为尽可能简化模拟的使用。从安装到 API 设计,如果有任何您觉得不直观或难以使用的地方,请 [告诉我们](https://github.com/Genesis-Embodied-AI/Genesis/issues)。
## 快速安装
首先,请根据[官方指南](https://pytorch.org/get-started/locally/)安装 **PyTorch**。
然后,通过 PyPI 安装 Genesis:
```bash
pip install genesis-world # 要求 Python>=3.10,<3.14;
```
要安装最新的版本,请先通过 `pip install --upgrade pip` 命令确保 `pip` 是最新版本,然后运行以下命令:
```bash
pip install git+https://github.com/Genesis-Embodied-AI/Genesis.git
```
请注意,您仍需手动更新此软件包以与主分支保持同步。
如果用户希望编辑 Genesis 的源代码,我们鼓励以可编辑模式安装。首先,请确保已卸载 `genesis-world`,然后克隆代码仓库并在本地安装:
```bash
git clone https://github.com/Genesis-Embodied-AI/Genesis.git
cd Genesis
pip install -e ".[dev]"
```
建议在移动 HEAD 后系统地执行 `pip install -e ".[dev]"`,以确保所有依赖项和入口点都是最新的。
### 使用 uv
[uv](https://docs.astral.sh/uv/) 是一个快速的 Python 包和项目管理器。
**安装 uv:**
```bash
# macOS 和 Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
```
**使用 uv 快速开始:**
```bash
git clone https://github.com/Genesis-Embodied-AI/Genesis.git
cd Genesis
uv sync
```
然后为您的平台安装 PyTorch:
```bash
# NVIDIA GPU(以 CUDA 12.6 为例)
uv pip install torch --index-url https://download.pytorch.org/whl/cu126
# 仅 CPU(Linux/Windows)
uv pip install torch --index-url https://download.pytorch.org/whl/cpu
# Apple Silicon(Metal/MPS)
uv pip install torch
```
运行示例:
```bash
uv run examples/rigid/single_franka.py
```
## Docker
如果您希望通过 Docker 使用 Genesis,可以先像这样构建 Docker 镜像:
```bash
docker build -t genesis -f docker/Dockerfile docker
```
然后您可以在 Docker 镜像中运行示例(示例文件挂载于 `/workspace/examples`):
```bash
xhost +local:root # 允许容器访问显示设备
docker run --gpus all --rm -it \
-e DISPLAY=$DISPLAY \
-e LOCAL_USER_ID="$(id -u)" \
-v /dev/dri:/dev/dri \
-v /tmp/.X11-unix/:/tmp/.X11-unix \
-v $(pwd):/workspace \
--name genesis genesis:latest
```
### AMD 用户
AMD 用户可以使用 `docker/Dockerfile.amdgpu` 文件来使用 Genesis,该文件可通过运行以下命令构建:
```
docker build -t genesis-amd -f docker/Dockerfile.amdgpu docker
```
然后通过运行以下命令来使用:
```xhost +local:docker \
docker run -it --network=host \
--device=/dev/kfd \
--device=/dev/dri \
--group-add=video \
--ipc=host \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
--shm-size 8G \
-v $PWD:/workspace \
-e DISPLAY=$DISPLAY \
genesis-amd
```
示例文件将可以在 `/workspace/examples` 目录下找到。注意:AMD 用户应使用 ROCm (HIP) 后端。这意味着您需要调用 `gs.init(backend=gs.amdgpu)` 来初始化 Genesis。
### 文档
- [英文文档](https://genesis-world.readthedocs.io/en/latest/user_guide/index.html)
- [中文文档](https://genesis-world.readthedocs.io/zh-cn/latest/user_guide/index.html)
- [日文文档](https://genesis-world.readthedocs.io/ja/latest/user_guide/index.html)
## 参与贡献
Genesis 项目的目标是构建一个完全透明、用户友好的生态系统,让来自机器人和计算机图形学的贡献者 **共同创建一个高效、真实(物理和视觉上)的虚拟世界,用于机器人研究及其他领域**。
我们真诚地欢迎来自社区的 *任何形式的贡献*,以使世界对机器人更友好。从 **新功能的拉取请求**、**错误报告**,到甚至是使 Genesis API 更直观的微小 **建议**,我们都全心全意地感谢!
## 帮助支持
- 请使用 Github [Issues](https://github.com/Genesis-Embodied-AI/Genesis/issues) 报告错误和提出功能请求。
- 请使用 GitHub [Discussions](https://github.com/Genesis-Embodied-AI/Genesis/discussions) 讨论想法和提问。
## 许可证和致谢
Genesis 源代码根据 Apache 2.0 许可证授权。
没有这些令人惊叹的开源项目,Genesis 的开发是不可能的:
- [Taichi](https://github.com/taichi-dev/taichi):提供高性能跨平台计算后端。感谢 taichi 的所有成员提供的技术支持!
- [FluidLab](https://github.com/zhouxian/FluidLab) 提供参考 MPM 求解器实现
- [SPH_Taichi](https://github.com/erizmr/SPH_Taichi) 提供参考 SPH 求解器实现
- [Ten Minute Physics](https://matthias-research.github.io/pages/tenMinutePhysics/index.html) 和 [PBF3D](https://github.com/WASD4959/PBF3D) 提供参考 PBD 求解器实现
- [MuJoCo](https://github.com/google-deepmind/mujoco) 和 [Brax](https://github.com/google/brax) 提供刚体动力学参考
- [libccd](https://github.com/danfis/libccd) 提供碰撞检测参考
- [PyRender](https://github.com/mmatl/pyrender) 提供基于光栅化的渲染器
- [LuisaCompute](https://github.com/LuisaGroup/LuisaCompute) 和 [LuisaRender](https://github.com/LuisaGroup/LuisaRender) 提供其光线追踪 DSL
- [trimesh](https://github.com/mikedh/trimesh)、[PyMeshLab](https://github.com/cnr-isti-vclab/PyMeshLab) 和 [CoACD](https://github.com/SarahWeiii/CoACD) 提供几何处理
## Genesis 背后的论文
Genesis 是一个大规模的努力,将各种现有和正在进行的研究工作的最先进技术集成到一个系统中。这里我们列出了一些对 Genesis 项目有贡献的论文(非详尽列表):
- Xian, Zhou, et al. "Fluidlab: A differentiable environment for benchmarking complex fluid manipulation." arXiv preprint arXiv:2303.02346 (2023).
- Xu, Zhenjia, et al. "Roboninja: Learning an adaptive cutting policy for multi-material objects." arXiv preprint arXiv:2302.11553 (2023).
- Wang, Yufei, et al. "Robogen: Towards unleashing infinite data for automated robot learning via generative simulation." arXiv preprint arXiv:2311.01455 (2023).
- Wang, Tsun-Hsuan, et al. "Softzoo: A soft robot co-design benchmark for locomotion in diverse environments." arXiv preprint arXiv:2303.09555 (2023).
- Wang, Tsun-Hsuan Johnson, et al. "Diffusebot: Breeding soft robots with physics-augmented generative diffusion models." Advances in Neural Information Processing Systems 36 (2023): 44398-44423.
- Katara, Pushkal, Zhou Xian, and Katerina Fragkiadaki. "Gen2sim: Scaling up robot learning in simulation with generative models." 2024 IEEE International Conference on Robotics and Automation (ICRA). IEEE, 2024.
- Si, Zilin, et al. "DiffTactile: A Physics-based Differentiable Tactile Simulator for Contact-rich Robotic Manipulation." arXiv preprint arXiv:2403.08716 (2024).
- Wang, Yian, et al. "Thin-Shell Object Manipulations With Differentiable Physics Simulations." arXiv preprint arXiv:2404.00451 (2024).
- Lin, Chunru, et al. "UBSoft: A Simulation Platform for Robotic Skill Learning in Unbounded Soft Environments." arXiv preprint arXiv:2411.12711 (2024).
- Zhou, Wenyang, et al. "EMDM: Efficient motion diffusion model for fast and high-quality motion generation." European Conference on Computer Vision. Springer, Cham, 2025.
- Qiao, Yi-Ling, Junbang Liang, Vladlen Koltun, and Ming C. Lin. "Scalable differentiable physics for learning and control." International Conference on Machine Learning. PMLR, 2020.
- Qiao, Yi-Ling, Junbang Liang, Vladlen Koltun, and Ming C. Lin. "Efficient differentiable simulation of articulated bodies." In International Conference on Machine Learning, PMLR, 2021.
- Qiao, Yi-Ling, Junbang Liang, Vladlen Koltun, and Ming Lin. "Differentiable simulation of soft multi-body systems." Advances in Neural Information Processing Systems 34 (2021).
- Wan, Weilin, et al. "Tlcontrol: Trajectory and language control for human motion synthesis." arXiv preprint arXiv:2311.17135 (2023).
- Wang, Yian, et al. "Architect: Generating Vivid and Interactive 3D Scenes with Hierarchical 2D Inpainting." arXiv preprint arXiv:2411.09823 (2024).
- Zheng, Shaokun, et al. "LuisaRender: A high-performance rendering framework with layered and unified interfaces on stream architectures." ACM Transactions on Graphics (TOG) 41.6 (2022): 1-19.
- Fan, Yingruo, et al. "Faceformer: Speech-driven 3d facial animation with transformers." Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2022.
- Wu, Sichun, Kazi Injamamul Haque, and Zerrin Yumak. "ProbTalk3D: Non-Deterministic Emotion Controllable Speech-Driven 3D Facial Animation Synthesis Using VQ-VAE." Proceedings of the 17th ACM SIGGRAPH Conference on Motion, Interaction, and Games. 2024.
- Dou, Zhiyang, et al. "C· ase: Learning conditional adversarial skill embeddings for physics-based characters." SIGGRAPH Asia 2023 Conference Papers. 2023.
... 以及许多正在进行的工作。
## 引用
如果您在研究中使用了 Genesis,我们将非常感谢您引用它。我们仍在撰写技术报告,在其公开之前,您可以考虑引用:
```bibtex
@misc{Genesis,
author = {Genesis Authors},
title = {Genesis: A Generative and Universal Physics Engine for Robotics and Beyond},
month = {December},
year = {2024},
url = {https://github.com/Genesis-Embodied-AI/Genesis}
}
```
================================================
FILE: README_FR.md
================================================


[](https://pypi.org/project/genesis-world/)
[](https://pypi.org/project/genesis-world/)
[](https://github.com/Genesis-Embodied-AI/Genesis/issues)
[](https://github.com/Genesis-Embodied-AI/Genesis/discussions)
[](https://discord.gg/nukCuhB47p)
<a href="https://drive.google.com/uc?export=view&id=1ZS9nnbQ-t1IwkzJlENBYqYIIOOZhXuBZ"><img src="https://img.shields.io/badge/WeChat-07C160?style=for-the-badge&logo=wechat&logoColor=white" height="20" style="display:inline"></a>
[](./README.md)
[](./README_FR.md)
[](./README_KR.md)
[](./README_CN.md)
[](./README_JA.md)
# Genesis
## 🔥 Nouveautés
- [2025-08-05] Sortie de la v0.3.0 🎊 🎉
- [2025-07-02] Le développement de Genesis est désormais officiellement soutenu par [Genesis AI](https://genesis-ai.company/).
- [2025-01-09] Nous avons publié un [rapport détaillé d'analyse comparative des performances](https://github.com/zhouxian/genesis-speed-benchmark) de Genesis, accompagné de tous les scripts de test.
- [2025-01-08] Sortie de la v0.2.1 🎊 🎉
- [2025-01-08] Création des groupes [Discord](https://discord.gg/nukCuhB47p) et [Wechat](https://drive.google.com/uc?export=view&id=1ZS9nnbQ-t1IwkzJlENBYqYIIOOZhXuBZ).
- [2024-12-25] Ajout d’un [docker](https://www.google.com/search?q=%23docker) incluant la prise en charge du moteur de rendu par lancer de rayon (ray-tracing).
- [2024-12-24] Ajout de directives pour [contribuer à Genesis](https://github.com/Genesis-Embodied-AI/Genesis/blob/main/.github/contributing/PULL_REQUESTS.md).
## Table des Matières
1. [Qu'est-ce que Genesis ?](#quest-ce-que-genesis-)
2. [Caractéristiques clés](#principales-caract%C3%A9ristiques)
3. [Installation Rapide](#installation-rapide)
4. [Docker](#docker)
5. [Documentation](#documentation)
6. [Contribuer à Genesis](#contribution-%C3%A0-genesis)
7. [Support](#support)
8. [License et Remerciements](#licence-et-remerciements)
9. [Articles Associés](#publications-associ%C3%A9es)
10. [Citation](#citation)
## Qu'est-ce que Genesis ?
Genesis est une plateforme physique conçue pour des applications générales en *Robotique/ IA embarquée/IA physique*. Elle combine plusieurs fonctionnalités :
1. Un **moteur physique universel**, reconstruit depuis zéro, capable de simuler une large gamme de matériaux et de phénomènes physiques.
2. Une plateforme de simulation robotique **légère**, **ultra-rapide**,**pythonic**, et **conviviale**.
3. Un puissant et rapide **système de rendu photo-réaliste**.
4. Un **moteur de génération de données** qui transforme des descriptions en langage naturel en divers types de données.
Genesis vise à :
- **Réduire les barrières** à l'utilisation des simulations physiques, rendant la recherche en robotique accessible à tous. Voir notre [déclaration de mission](https://genesis-world.readthedocs.io/en/latest/user_guide/overview/mission.html).
- **Unifier divers solveurs physiques** dans un cadre unique pour recréer le monde physique avec la plus haute fidélité.
- **Automatiser la génération de données**, réduisant l'effort humain et permettant à l'écosystème de données de fonctionner de manière autonome.
Page du projet : <https://genesis-embodied-ai.github.io/>
## Principales Caractéristiques
- **Vitesse** : Plus de 43 millions d'IPS lors de la simulation d'un bras robotique Franka avec une seule RTX 4090 (430 000 fois plus rapide que le temps réel).
- **Multi-plateforme** : Fonctionne sur Linux, macOS, Windows, et prend en charge plusieurs backends de calcul (CPU, GPU Nvidia/AMD, Apple Metal).
- **Intégration de divers solveurs physiques** : Corps rigides, MPM, SPH, FEM, PBD, Fluides stables.
- **Large éventail de modèles de matériaux** : Simulation et couplage de corps rigides, liquides, gaz, objets déformables, objets à coque mince et matériaux granulaires.
- **Compatibilité avec divers robots** : Bras robotiques, robots à pattes, drones, *robots mous*, et support pour charger `MJCF (.xml)`, `URDF`, `.obj`, `.glb`, `.ply`, `.stl`, et plus encore.
- **Rendu photo-réaliste** : Rendu natif basé sur le lancer de rayons.
- **Différentiabilité** : Genesis est conçu pour être entièrement différentiable. Actuellement, notre solveur MPM et Tool Solver prennent en charge la différentiabilité, avec d'autres solveurs prévus dans les prochaines versions (à commencer par le solveur de corps rigides et articulés).
- **Facilité d'utilisation** : Conçu pour être simple, avec une installation intuitive et des API conviviales.
## Installation Rapide
Installez d'abord **PyTorch** en suivant les [instructions officielles](https://pytorch.org/get-started/locally/).
Ensuite, installez Genesis via PyPI :
```bash
pip install genesis-world # Nécessite Python>=3.10,<3.14;
```
Pour obtenir la version la plus récente, assurez-vous que `pip` est à jour via `pip install --upgrade pip`, puis exécutez la commande :
```bash
pip install git+https://github.com/Genesis-Embodied-AI/Genesis.git
```
Notez que le paquet doit toujours être mis à jour manuellement pour se synchroniser avec la branche principale (main).
Les utilisateurs souhaitant modifier le code source de Genesis sont encouragés à l'installer en mode éditable. D'abord, assurez-vous que `genesis-world` a été désinstallé, puis clonez le dépôt et installez-le localement :
```bash
git clone https://github.com/Genesis-Embodied-AI/Genesis.git
cd Genesis
pip install -e ".[dev]"
```
Il est recommandé d'exécuter systématiquement `pip install -e ".[dev]"` après avoir déplacé le HEAD pour s'assurer que toutes les dépendances et points d'entrée sont à jour.
### Utiliser uv
[uv](https://docs.astral.sh/uv/) est un gestionnaire de paquets et de projets Python rapide.
**Installer uv :**
```bash
# Sur macOS et Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Sur Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
```
**Démarrage rapide avec uv :**
```bash
git clone https://github.com/Genesis-Embodied-AI/Genesis.git
cd Genesis
uv sync
```
Ensuite, installez PyTorch pour votre plateforme :
```bash
# GPU NVIDIA (CUDA 12.6 par exemple)
uv pip install torch --index-url https://download.pytorch.org/whl/cu126
# CPU uniquement (Linux/Windows)
uv pip install torch --index-url https://download.pytorch.org/whl/cpu
# Apple Silicon (Metal/MPS)
uv pip install torch
```
Exécutez un exemple :
```bash
uv run examples/rigid/single_franka.py
```
## Docker
Si vous souhaitez utiliser Genesis depuis Docker, vous pouvez d'abord construire l'image Docker comme suit :
```bash
docker build -t genesis -f docker/Dockerfile docker
```
Vous pouvez ensuite exécuter les exemples à l'intérieur de l'image Docker (montés dans `/workspace/examples`) :
```bash
xhost +local:root # Autoriser le conteneur à accéder à l'affichage
docker run --gpus all --rm -it \
-e DISPLAY=$DISPLAY \
-e LOCAL_USER_ID="$(id -u)" \
-v /dev/dri:/dev/dri \
-v /tmp/.X11-unix/:/tmp/.X11-unix \
-v $(pwd):/workspace \
--name genesis genesis:latest
```
### Utilisateurs AMD
Les utilisateurs AMD peuvent utiliser Genesis avec le fichier `docker/Dockerfile.amdgpu`, qui se construit en exécutant :
```
docker build -t genesis-amd -f docker/Dockerfile.amdgpu docker
```
et peut ensuite être utilisé en exécutant :
```xhost +local:docker \
docker run -it --network=host \
--device=/dev/kfd \
--device=/dev/dri \
--group-add=video \
--ipc=host \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
--shm-size 8G \
-v $PWD:/workspace \
-e DISPLAY=$DISPLAY \
genesis-amd
```
Les exemples seront accessibles depuis `/workspace/examples`. Note : Les utilisateurs AMD doivent utiliser le backend ROCm (HIP). Cela signifie que vous devrez appeler `gs.init(backend=gs.amdgpu)` pour initialiser Genesis.
## Documentation
Une documentation complète est disponible en [Anglais](https://genesis-world.readthedocs.io/en/latest/user_guide/index.html) et en [Chinois](https://genesis-world.readthedocs.io/zh-cn/latest/user_guide/index.html). Cela inclut des étapes d'installation détaillées, des tutoriels et des références API.
## Contribution à Genesis
Le projet Genesis est un effort ouvert et collaboratif. Nous accueillons toutes les formes de contributions de la communauté, notamment :
- **Pull requests** pour de nouvelles fonctionnalités ou des corrections de bugs.
- **Rapports de bugs** via GitHub Issues.
- **Suggestions** pour améliorer la convivialité de Genesis.
Consultez notre [guide de contribution](https://github.com/Genesis-Embodied-AI/Genesis/blob/main/.github/contributing/PULL_REQUESTS.md) pour plus de détails.
## Support
- Signalez des bugs ou demandez des fonctionnalités via GitHub [Issues](https://github.com/Genesis-Embodied-AI/Genesis/issues).
- Participez aux discussions ou posez des questions sur GitHub [Discussions](https://github.com/Genesis-Embodied-AI/Genesis/discussions).
## Licence et Remerciements
Le code source de Genesis est sous licence Apache 2.0.
Le développement de Genesis a été rendu possible grâce à ces projets open-source :
- [Taichi](https://github.com/taichi-dev/taichi) : Backend de calcul multiplateforme haute performance. Merci à l'équipe de Taichi pour leur support technique !
- [FluidLab](https://github.com/zhouxian/FluidLab) : Implémentation de référence du solveur MPM.
- [SPH_Taichi](https://github.com/erizmr/SPH_Taichi) : Implémentation de référence du solveur SPH.
- [Ten Minute Physics](https://matthias-research.github.io/pages/tenMinutePhysics/index.html) et [PBF3D](https://github.com/WASD4959/PBF3D) : Implémentations de référence des solveurs PBD.
- [MuJoCo](https://github.com/google-deepmind/mujoco) : Référence pour la dynamique des corps rigides.
- [libccd](https://github.com/danfis/libccd) : Référence pour la détection des collisions.
- [PyRender](https://github.com/mmatl/pyrender) : Rendu basé sur la rasterisation.
- [LuisaCompute](https://github.com/LuisaGroup/LuisaCompute) et [LuisaRender](https://github.com/LuisaGroup/LuisaRender) : DSL de ray-tracing.
## Publications Associées
Genesis est un projet à grande échelle qui intègre des technologies de pointe issues de divers travaux de recherche existants et en cours dans un seul système. Voici une liste non exhaustive de toutes les publications qui ont contribué au projet Genesis d'une manière ou d'une autre :
- Xian, Zhou, et al. "Fluidlab: A differentiable environment for benchmarking complex fluid manipulation." arXiv preprint arXiv:2303.02346 (2023).
- Xu, Zhenjia, et al. "Roboninja: Learning an adaptive cutting policy for multi-material objects." arXiv preprint arXiv:2302.11553 (2023).
- Wang, Yufei, et al. "Robogen: Towards unleashing infinite data for automated robot learning via generative simulation." arXiv preprint arXiv:2311.01455 (2023).
- Wang, Tsun-Hsuan, et al. "Softzoo: A soft robot co-design benchmark for locomotion in diverse environments." arXiv preprint arXiv:2303.09555 (2023).
- Wang, Tsun-Hsuan Johnson, et al. "Diffusebot: Breeding soft robots with physics-augmented generative diffusion models." Advances in Neural Information Processing Systems 36 (2023): 44398-44423.
- Katara, Pushkal, Zhou Xian, and Katerina Fragkiadaki. "Gen2sim: Scaling up robot learning in simulation with generative models." 2024 IEEE International Conference on Robotics and Automation (ICRA). IEEE, 2024.
- Si, Zilin, et al. "DiffTactile: A Physics-based Differentiable Tactile Simulator for Contact-rich Robotic Manipulation." arXiv preprint arXiv:2403.08716 (2024).
- Wang, Yian, et al. "Thin-Shell Object Manipulations With Differentiable Physics Simulations." arXiv preprint arXiv:2404.00451 (2024).
- Lin, Chunru, et al. "UBSoft: A Simulation Platform for Robotic Skill Learning in Unbounded Soft Environments." arXiv preprint arXiv:2411.12711 (2024).
- Zhou, Wenyang, et al. "EMDM: Efficient motion diffusion model for fast and high-quality motion generation." European Conference on Computer Vision. Springer, Cham, 2025.
- Qiao, Yi-Ling, Junbang Liang, Vladlen Koltun, and Ming C. Lin. "Scalable differentiable physics for learning and control." International Conference on Machine Learning. PMLR, 2020.
- Qiao, Yi-Ling, Junbang Liang, Vladlen Koltun, and Ming C. Lin. "Efficient differentiable simulation of articulated bodies." In International Conference on Machine Learning, PMLR, 2021.
- Qiao, Yi-Ling, Junbang Liang, Vladlen Koltun, and Ming Lin. "Differentiable simulation of soft multi-body systems." Advances in Neural Information Processing Systems 34 (2021).
- Wan, Weilin, et al. "Tlcontrol: Trajectory and language control for human motion synthesis." arXiv preprint arXiv:2311.17135 (2023).
- Wang, Yian, et al. "Architect: Generating Vivid and Interactive 3D Scenes with Hierarchical 2D Inpainting." arXiv preprint arXiv:2411.09823 (2024).
- Zheng, Shaokun, et al. "LuisaRender: A high-performance rendering framework with layered and unified interfaces on stream architectures." ACM Transactions on Graphics (TOG) 41.6 (2022): 1-19.
- Fan, Yingruo, et al. "Faceformer: Speech-driven 3d facial animation with transformers." Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2022.
- Wu, Sichun, Kazi Injamamul Haque, and Zerrin Yumak. "ProbTalk3D: Non-Deterministic Emotion Controllable Speech-Driven 3D Facial Animation Synthesis Using VQ-VAE." Proceedings of the 17th ACM SIGGRAPH Conference on Motion, Interaction, and Games. 2024.
- Dou, Zhiyang, et al. "C· ase: Learning conditional adversarial skill embeddings for physics-based characters." SIGGRAPH Asia 2023 Conference Papers. 2023.
... et bien d'autres travaux en cours.
## Citation
Si vous utilisez Genesis dans vos recherches, veuillez envisager de citer :
```bibtex
@misc{Genesis,
author = {Genesis Authors},
title = {Genesis: A Generative and Universal Physics Engine for Robotics and Beyond},
month = {December},
year = {2024},
url = {https://github.com/Genesis-Embodied-AI/Genesis}
}
```
================================================
FILE: README_JA.md
================================================


[](https://pypi.org/project/genesis-world/)
[](https://pypi.org/project/genesis-world/)
[](https://github.com/Genesis-Embodied-AI/Genesis/issues)
[](https://github.com/Genesis-Embodied-AI/Genesis/discussions)
[](https://discord.gg/nukCuhB47p)
<a href="https://drive.google.com/uc?export=view&id=1ZS9nnbQ-t1IwkzJlENBYqYIIOOZhXuBZ"><img src="https://img.shields.io/badge/WeChat-07C160?style=for-the-badge&logo=wechat&logoColor=white" height="20" style="display:inline"></a>
[](./README.md)
[](./README_FR.md)
[](./README_KR.md)
[](./README_CN.md)
[](./README_JA.md)
# Genesis
## 🔥 最新情報
- [2025-08-05] v0.3.0をリリースしました 🎊 🎉
- [2025-07-02] Genesisの開発が、[Genesis AI](https://genesis-ai.company/)によって公式にサポートされることになりました。
- [2025-01-09] Genesisに関する[詳細なパフォーマンスベンチマークと比較レポート](https://github.com/zhouxian/genesis-speed-benchmark)を、すべてのテストスクリプトと共に公開しました。
- [2025-01-08] v0.2.1をリリースしました 🎊 🎉
- [2025-01-08] [Discord](https://discord.gg/nukCuhB47p)と[Wechat](https://drive.google.com/uc?export=view&id=1ZS9nnbQ-t1IwkzJlENBYqYIIOOZhXuBZ)のグループを作成しました。
- [2024-12-25] レイトレーシングレンダラーをサポートする[docker](https://www.google.com/search?q=%23docker)を追加しました。
- [2024-12-24] [Genesisへの貢献](https://github.com/Genesis-Embodied-AI/Genesis/blob/main/.github/contributing/PULL_REQUESTS.md)に関するガイドラインを追加しました。
## 目次
1. [Genesisとは?](#genesisとは)
2. [主な機能](#主な機能)
3. [インストール](#インストール)
4. [Docker](#docker)
5. [ドキュメント](#ドキュメント)
6. [Genesisへの貢献](#genesisへの貢献)
7. [サポート](#サポート)
8. [ライセンスと謝辞](#ライセンスと謝辞)
9. [関連論文](#関連論文)
10. [引用](#引用)
## Genesisとは?
Genesisは、汎用的な*ロボティクス/身体性を持ったAI*アプリケーション向けに設計された物理シミュレーションプラットフォームです。このプラットフォームは以下のような特徴があります:
1. あらゆる種類の材料や物理現象をシミュレート可能な**汎用物理エンジン**。
2. **軽量**、**超高速**、**Python的**、そして**ユーザーフレンドリー**なロボティクスシミュレーションプラットフォーム。
3. 高速で強力な**フォトリアリスティックなレンダリングシステム**。
4. ユーザーの自然言語による指示をもとに様々なデータモダリティを生成する**生成型データエンジン**。
Genesisの目指すところ:
- **物理シミュレーションのハードルを下げ**、ロボティクス研究を誰でもアクセス可能にすること。詳細は[ミッションステートメント](https://genesis-world.readthedocs.io/en/latest/user_guide/overview/mission.html)をご覧ください。
- **多様な物理ソルバーを統合**し、最高の忠実度で物理世界を再現すること。
- **データ生成を自動化**し、人間の労力を削減し、データ生成の効率を最大化すること。
プロジェクトページ: <https://genesis-embodied-ai.github.io/>
## 主な機能
- **速度**: RTX 4090単体でフランカロボットアームを4300万FPS(リアルタイムの43万倍速)でシミュレーション可能。
- **クロスプラットフォーム**: Linux、macOS、Windowsで動作し、CPU、Nvidia/AMD GPU、Apple Metalをサポート。
- **多様な物理ソルバーの統合**: 剛体、MPM、SPH、FEM、PBD、安定流体シミュレーション。
- **幅広い材料モデル**: 剛体、液体、気体、変形体、薄膜オブジェクト、粒状材料などをシミュレーション可能。
- **様々なロボットへの対応**: ロボットアーム、脚付きロボット、ドローン、*ソフトロボット*など。また、`MJCF (.xml)`、`URDF`、`.obj`、`.glb`、`.ply`、`.stl`などの形式をサポート。
- **フォトリアルなレンダリング**: レイトレーシングベースのレンダリングをネイティブでサポート。
- **微分可能性**: 完全な微分可能性を備えた設計。現時点では、MPMソルバーとツールソルバーが対応しており、将来的には他のソルバーも対応予定(まず剛体および連結体ソルバーから開始)。
- **ユーザーフレンドリー**: シンプルで直感的なインストールとAPI設計。
## インストール
まず[公式の手順](https://pytorch.org/get-started/locally/)に従って**PyTorch**をインストールしてください。
次に、PyPI経由でGenesisをインストールします:
```bash
pip install genesis-world # Python>=3.10,<3.14が必要です;
```
最新バージョンを利用するには、`pip install --upgrade pip`で`pip`を更新してから、次のコマンドを実行してください:
```bash
pip install git+https://github.com/Genesis-Embodied-AI/Genesis.git
```
注意:mainブランチと同期するには、パッケージを手動で更新する必要があります。
Genesisのソースコードを編集したいユーザーは、編集可能モードでGenesisをインストールすることを推奨します。まず、`genesis-world`がアンインストールされていることを確認し、リポジトリをクローンしてローカルにインストールします:
```bash
git clone https://github.com/Genesis-Embodied-AI/Genesis.git
cd Genesis
pip install -e ".[dev]"
```
HEADを移動した後は、すべての依存関係とエントリーポイントが最新であることを確認するために、`pip install -e ".[dev]"` を体系的に実行することを推奨します。
### uvを使用する場合
[uv](https://docs.astral.sh/uv/) は高速なPythonパッケージ・プロジェクトマネージャーです。
**uvのインストール:**
```bash
# macOSおよびLinux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
```
**uvでクイックスタート:**
```bash
git clone https://github.com/Genesis-Embodied-AI/Genesis.git
cd Genesis
uv sync
```
次に、お使いのプラットフォーム向けにPyTorchをインストールします:
```bash
# NVIDIA GPU(例:CUDA 12.6)
uv pip install torch --index-url https://download.pytorch.org/whl/cu126
# CPUのみ(Linux/Windows)
uv pip install torch --index-url https://download.pytorch.org/whl/cpu
# Apple Silicon(Metal/MPS)
uv pip install torch
```
サンプルを実行:
```bash
uv run examples/rigid/single_franka.py
```
## Docker
DockerからGenesisを使用したい場合は、まず次のようにしてDockerイメージをビルドできます:
```bash
docker build -t genesis -f docker/Dockerfile docker
```
その後、Dockerイメージ内でサンプルを実行できます(`/workspace/examples`にマウントされます):
```bash
xhost +local:root # コンテナがディスプレイにアクセスすることを許可
docker run --gpus all --rm -it \
-e DISPLAY=$DISPLAY \
-e LOCAL_USER_ID="$(id -u)" \
-v /dev/dri:/dev/dri \
-v /tmp/.X11-unix/:/tmp/.X11-unix \
-v $(pwd):/workspace \
--name genesis genesis:latest
```
### AMDユーザー
AMDユーザーは、`docker/Dockerfile.amdgpu`ファイルを使ってGenesisを利用できます。これは次のコマンドを実行してビルドします:
```
docker build -t genesis-amd -f docker/Dockerfile.amdgpu docker
```
ビルド後、次のコマンドを実行して使用できます:
```
xhost +local:docker \
docker run -it --network=host \
--device=/dev/kfd \
--device=/dev/dri \
--group-add=video \
--ipc=host \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
--shm-size 8G \
-v $PWD:/workspace \
-e DISPLAY=$DISPLAY \
genesis-amd
```
サンプルは`/workspace/examples`からアクセス可能です。注意:AMDユーザーはROCm (HIP)バックエンドを使用してください。これは、Genesisを初期化するために`gs.init(backend=gs.amdgpu)`を呼び出す必要があることを意味します。
## ドキュメント
包括的なドキュメントは現時点では[英語](https://genesis-world.readthedocs.io/en/latest/user_guide/index.html)、[中国語](https://genesis-world.readthedocs.io/zh-cn/latest/user_guide/index.html)、および[日本語](https://genesis-world.readthedocs.io/ja/latest/user_guide/index.html)で提供されています。詳細なインストール手順、チュートリアル、APIリファレンスが含まれています。
## Genesisへの貢献
Genesisプロジェクトはオープンで協力的な取り組みです。以下を含む、コミュニティからのあらゆる貢献を歓迎します:
- 新機能やバグ修正のための**プルリクエスト**。
- GitHub Issuesを通じた**バグ報告**。
- Genesisの使いやすさを向上させるための**提案**。
詳細は[貢献ガイド](https://github.com/Genesis-Embodied-AI/Genesis/blob/main/.github/contributing/PULL_REQUESTS.md)をご参照ください。
## サポート
- バグ報告や機能リクエストはGitHubの[Issues](https://github.com/Genesis-Embodied-AI/Genesis/issues)をご利用ください。
- 議論や質問はGitHubの[Discussions](https://github.com/Genesis-Embodied-AI/Genesis/discussions)で行えます。
## ライセンスと謝辞
GenesisのソースコードはApache 2.0ライセンスで提供されています。
Genesisの開発は以下のオープンソースプロジェクトのおかげで可能になりました:
- [Taichi](https://github.com/taichi-dev/taichi): 高性能でクロスプラットフォーム対応の計算バックエンド。Taichiチームの技術サポートに感謝します!
- [FluidLab](https://github.com/zhouxian/FluidLab): 参照用のMPMソルバー実装。
- [SPH_Taichi](https://github.com/erizmr/SPH_Taichi): 参照用のSPHソルバー実装。
- [Ten Minute Physics](https://matthias-research.github.io/pages/tenMinutePhysics/index.html) と [PBF3D](https://github.com/WASD4959/PBF3D): 参照用のPBD(粒子ベースの物理)ソルバー実装。
- [MuJoCo](https://github.com/google-deepmind/mujoco): 剛体ダイナミクスの参照用実装。
- [libccd](https://github.com/danfis/libccd): 衝突検出の参照用実装。
- [PyRender](https://github.com/mmatl/pyrender): ラスタライズベースのレンダラー。
- [LuisaCompute](https://github.com/LuisaGroup/LuisaCompute) と [LuisaRender](https://github.com/LuisaGroup/LuisaRender): レイトレーシングDSL。
## 関連論文
Genesisプロジェクトに関与した主要な研究論文の一覧:
- Xian, Zhou, et al. "Fluidlab: A differentiable environment for benchmarking complex fluid manipulation." arXiv preprint arXiv:2303.02346 (2023).
- Xu, Zhenjia, et al. "Roboninja: Learning an adaptive cutting policy for multi-material objects." arXiv preprint arXiv:2302.11553 (2023).
- Wang, Yufei, et al. "Robogen: Towards unleashing infinite data for automated robot learning via generative simulation." arXiv preprint arXiv:2311.01455 (2023).
- Wang, Tsun-Hsuan, et al. "Softzoo: A soft robot co-design benchmark for locomotion in diverse environments." arXiv preprint arXiv:2303.09555 (2023).
- Wang, Tsun-Hsuan Johnson, et al. "Diffusebot: Breeding soft robots with physics-augmented generative diffusion models." Advances in Neural Information Processing Systems 36 (2023): 44398-44423.
- Katara, Pushkal, Zhou Xian, and Katerina Fragkiadaki. "Gen2sim: Scaling up robot learning in simulation with generative models." 2024 IEEE International Conference on Robotics and Automation (ICRA). IEEE, 2024.
- Si, Zilin, et al. "DiffTactile: A Physics-based Differentiable Tactile Simulator for Contact-rich Robotic Manipulation." arXiv preprint arXiv:2403.08716 (2024).
- Wang, Yian, et al. "Thin-Shell Object Manipulations With Differentiable Physics Simulations." arXiv preprint arXiv:2404.00451 (2024).
- Lin, Chunru, et al. "UBSoft: A Simulation Platform for Robotic Skill Learning in Unbounded Soft Environments." arXiv preprint arXiv:2411.12711 (2024).
- Zhou, Wenyang, et al. "EMDM: Efficient motion diffusion model for fast and high-quality motion generation." European Conference on Computer Vision. Springer, Cham, 2025.
- Qiao, Yi-Ling, Junbang Liang, Vladlen Koltun, and Ming C. Lin. "Scalable differentiable physics for learning and control." International Conference on Machine Learning. PMLR, 2020.
- Qiao, Yi-Ling, Junbang Liang, Vladlen Koltun, and Ming C. Lin. "Efficient differentiable simulation of articulated bodies." In International Conference on Machine Learning, PMLR, 2021.
- Qiao, Yi-Ling, Junbang Liang, Vladlen Koltun, and Ming Lin. "Differentiable simulation of soft multi-body systems." Advances in Neural Information Processing Systems 34 (2021).
- Wan, Weilin, et al. "Tlcontrol: Trajectory and language control for human motion synthesis." arXiv preprint arXiv:2311.17135 (2023).
- Wang, Yian, et al. "Architect: Generating Vivid and Interactive 3D Scenes with Hierarchical 2D Inpainting." arXiv preprint arXiv:2411.09823 (2024).
- Zheng, Shaokun, et al. "LuisaRender: A high-performance rendering framework with layered and unified interfaces on stream architectures." ACM Transactions on Graphics (TOG) 41.6 (2022): 1-19.
- Fan, Yingruo, et al. "Faceformer: Speech-driven 3d facial animation with transformers." Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2022.
- Wu, Sichun, Kazi Injamamul Haque, and Zerrin Yumak. "ProbTalk3D: Non-Deterministic Emotion Controllable Speech-Driven 3D Facial Animation Synthesis Using VQ-VAE." Proceedings of the 17th ACM SIGGRAPH Conference on Motion, Interaction, and Games. 2024.
- Dou, Zhiyang, et al. "C· ase: Learning conditional adversarial skill embeddings for physics-based characters." SIGGRAPH Asia 2023 Conference Papers. 2023.
さらに多数の現在進行形のプロジェクトがあります。
## 引用
研究でGenesisを使用する場合、以下を引用してください:
```bibtex
@misc{Genesis,
author = {Genesis Authors},
title = {Genesis: A Generative and Universal Physics Engine for Robotics and Beyond},
month = {December},
year = {2024},
url = {https://github.com/Genesis-Embodied-AI/Genesis}
}
```
================================================
FILE: README_KR.md
================================================


[](https://pypi.org/project/genesis-world/)
[](https://pypi.org/project/genesis-world/)
[](https://github.com/Genesis-Embodied-AI/Genesis/issues)
[](https://github.com/Genesis-Embodied-AI/Genesis/discussions)
[](https://discord.gg/nukCuhB47p)
<a href="https://drive.google.com/uc?export=view&id=1ZS9nnbQ-t1IwkzJlENBYqYIIOOZhXuBZ"><img src="https://img.shields.io/badge/WeChat-07C160?style=for-the-badge&logo=wechat&logoColor=white" height="20" style="display:inline"></a>
[](./README.md)
[](./README_FR.md)
[](./README_KR.md)
[](./README_CN.md)
[](./README_JA.md)
# Genesis
## 🔥 새 소식
- [2025-08-05] v0.3.0 릴리스 🎊 🎉
- [2025-07-02] 이제 [Genesis AI](https://genesis-ai.company/)가 Genesis의 개발을 공식적으로 지원합니다.
- [2025-01-09] Genesis의 성능에 대한 자세한 [벤치마킹 및 비교 보고서](https://github.com/zhouxian/genesis-speed-benchmark)를 모든 테스트 스크립트와 함께 공개했습니다.
- [2025-01-08] v0.2.1 릴리스 🎊 🎉
- [2025-01-08] [Discord](https://discord.gg/nukCuhB47p) 및 [Wechat](https://drive.google.com/uc?export=view&id=1ZS9nnbQ-t1IwkzJlENBYqYIIOOZhXuBZ) 그룹을 생성했습니다.
- [2024-12-25] 레이 트레이싱 렌더러를 지원하는 [docker](https://www.google.com/search?q=%23docker) 추가
- [2024-12-24] [제네시스 기여](https://github.com/Genesis-Embodied-AI/Genesis/blob/main/.github/contributing/PULL_REQUESTS.md) 가이드라인 추가
## Table of Contents
1. [Genesis란?](#genesis란)
2. [주요 특징](#주요-특징)
3. [빠른 설치](#빠른-설치)
4. [Docker](#docker)
5. [문서](#문서)
6. [Genesis에 기여하기](#genesis에-기여하기)
7. [지원](#지원)
8. [라이선스 및 감사의 글](#라이선스-및-감사의-글)
9. [관련 논문](#관련-논문)
10. [인용](#인용)
## Genesis란?
Genesis는 *로보틱스/임베디드 AI/물리 AI* 애플리케이션을 위해 설계된 범용 물리 플랫폼입니다. 그리고 다음과 같은 기능을 제공합니다:
1. 다양한 물성 (Material) 과 물리 현상을 시뮬레이션할 수 있도록 처음부터 다시 구축된 **범용 물리 엔진**.
2. **가볍고**, **매우 빠르며**, **파이썬 친화적이고**, **사용자 친화적인** 로보틱스 시뮬레이션 플랫폼.
3. 강력하고 빠른 **실사 렌더링 시스템**.
4. 사용자의 자연어 설명을 다양한 형태의 데이터로 변환하는 **생성형 데이터 엔진**.
Genesis의 목표:
- **물리 시뮬레이션의 진입 장벽을 낮춰** 누구나 로보틱스 연구에 접근할 수 있도록 합니다. [사명 선언문](https://genesis-world.readthedocs.io/en/latest/user_guide/overview/mission.html)을 확인하세요.
- 단일 프레임워크로 **통합된 다양한 물리 솔버 (Physics Solver)**를 통해 최상의 정확도로 물리적 세계를 재현합니다.
- **데이터 생성을 자동화**하여 사람의 수고를 줄이고 데이터 플라이휠이 스스로 순환하도록 합니다.
프로젝트 페이지: <https://genesis-embodied-ai.github.io/>
## 주요 특징
- **속도**: 단일 RTX 4090에서 Franka 로봇 팔을 시뮬레이션하는 경우, 4300만 FPS 이상(실시간보다 430,000 배 빠름).
- **크로스 플랫폼**: Linux, macOS, Windows에서 실행 가능 및 다양한 연산 백엔드(CPU, Nvidia/AMD GPU, Apple Metal) 지원.
- **다양한 물리 솔버 (Physics Solver) 통합**: Rigid body, MPM, SPH, FEM, PBD, Stable Fluid.
- **다양한 물성 (Material) 모델**: 강체, 액체, 기체, 변형 가능한 오브젝트, 얇은 쉘 오브젝트 및 입상 재료의 시뮬레이션 및 결합.
- **다양한 로봇 호환성**: 로봇 팔, 보행 로봇, 드론, *소프트 로봇* 및 다양한 파일 형식(`MJCF (.xml)`, `URDF`, `.obj`, `.glb`, `.ply`, `.stl` 등) 로드 지원.
- **실사 렌더링**: 네이티브 레이 트레이싱 기반 렌더링.
- **미분 가능성 (Differentiability)**: Genesis는 완전히 미분 가능하도록 설계되었습니다. 현재 MPM 솔버와 Tool 솔버가 미분 가능하며, 다른 솔버는 향후 버전에서는 강체 (Rigid body) 및 관절체 (Articulated body) 솔버를 시작으로 다른 솔버들도 지원할 예정입니다.
- **사용자 친화성**: 직관적인 설치 및 API로 간편하게 사용 가능.
## 빠른 설치
먼저 [공식 안내](https://pytorch.org/get-started/locally/)에 따라 **PyTorch**를 설치하세요.
그 다음, PyPI를 통해 Genesis를 설치합니다:
```bash
pip install genesis-world # Python>=3.10,<3.14 버전 필요;
```
최신 버전을 설치하려면, `pip install --upgrade pip`를 통해 `pip`를 최신 상태로 업데이트한 후 다음 명령어를 실행하세요:
```bash
pip install git+https://github.com/Genesis-Embodied-AI/Genesis.git
```
참고로, main 브랜치와 동기화하려면 패키지를 계속 수동으로 업데이트해야 합니다.
Genesis 소스 코드를 직접 수정하고 싶은 사용자는 편집 가능 모드(editable mode)로 설치하는 것을 권장합니다. 먼저 `genesis-world`가 제거되었는지 확인한 후, 저장소를 복제(clone)하고 로컬에 설치하세요:
```bash
git clone https://github.com/Genesis-Embodied-AI/Genesis.git
cd Genesis
pip install -e ".[dev]"
```
HEAD를 이동한 후에는 모든 의존성과 엔트리포인트가 최신 상태인지 확인하기 위해 `pip install -e ".[dev]"`를 체계적으로 실행하는 것을 권장합니다.
### uv 사용
[uv](https://docs.astral.sh/uv/)는 빠른 Python 패키지 및 프로젝트 관리자입니다.
**uv 설치:**
```bash
# macOS 및 Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
```
**uv로 빠르게 시작:**
```bash
git clone https://github.com/Genesis-Embodied-AI/Genesis.git
cd Genesis
uv sync
```
그 다음, 플랫폼에 맞는 PyTorch를 설치합니다:
```bash
# NVIDIA GPU (예: CUDA 12.6)
uv pip install torch --index-url https://download.pytorch.org/whl/cu126
# CPU 전용 (Linux/Windows)
uv pip install torch --index-url https://download.pytorch.org/whl/cpu
# Apple Silicon (Metal/MPS)
uv pip install torch
```
예제 실행:
```bash
uv run examples/rigid/single_franka.py
```
## Docker
Docker에서 Genesis를 사용하려면, 먼저 다음과 같이 Docker 이미지를 빌드할 수 있습니다:
```bash
docker build -t genesis -f docker/Dockerfile docker
```
그 다음, Docker 이미지 내에서 예제를 실행할 수 있습니다 (예제는 `/workspace/examples`에 마운트됩니다):
```bash
xhost +local:root # 컨테이너가 디스플레이에 접근하도록 허용
docker run --gpus all --rm -it \
-e DISPLAY=$DISPLAY \
-e LOCAL_USER_ID="$(id -u)" \
-v /dev/dri:/dev/dri \
-v /tmp/.X11-unix/:/tmp/.X11-unix \
-v $(pwd):/workspace \
--name genesis genesis:latest
```
### AMD 사용자
AMD 사용자는 `docker/Dockerfile.amdgpu` 파일을 사용하여 Genesis를 이용할 수 있으며, 다음 명령어를 실행하여 빌드합니다:
```
docker build -t genesis-amd -f docker/Dockerfile.amdgpu docker
```
그리고 다음 명령어를 실행하여 사용할 수 있습니다:
```xhost +local:docker \
docker run -it --network=host \
--device=/dev/kfd \
--device=/dev/dri \
--group-add=video \
--ipc=host \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
--shm-size 8G \
-v $PWD:/workspace \
-e DISPLAY=$DISPLAY \
genesis-amd
```
예제는 `/workspace/examples` 경로에서 접근할 수 있습니다. 참고: AMD 사용자는 ROCm (HIP) 백엔드를 사용해야 합니다. 즉, Genesis를 초기화하려면 `gs.init(backend=gs.amdgpu)`을 호출해야 합니다.
## 문서
전체 문서는 [영어](https://genesis-world.readthedocs.io/en/latest/user_guide/index.html)와 [중국어](https://genesis-world.readthedocs.io/zh-cn/latest/user_guide/index.html)로 제공됩니다. 이 문서에는 자세한 설치 단계, 튜토리얼 및 API 참조가 포함되어 있습니다.
## Genesis에 기여하기
Genesis 프로젝트는 오픈 소스 및 협력 프로젝트입니다. 다음을 포함하여 커뮤니티의 모든 형태의 기여를 환영합니다:
- 새로운 기능이나 버그 수정을 위한 **풀 리퀘스트 (Pull Requests)**.
- GitHub Issues를 통한 **버그 리포트 (Bug Reports)**.
- Genesis의 사용성을 향상시키기 위한 **제안 (Suggestions)**.
자세한 내용은 [기여 가이드](https://github.com/Genesis-Embodied-AI/Genesis/blob/main/.github/contributing/PULL_REQUESTS.md)를 참조하세요.
## 지원
- GitHub [Issues](https://github.com/Genesis-Embodied-AI/Genesis/issues)를 통해 버그를 보고하고 기능을 요청하세요.
- GitHub [Discussions](https://github.com/Genesis-Embodied-AI/Genesis/discussions)에서 토론에 참여하거나 질문해 보세요.
## 라이선스 및 감사의 글
Genesis 소스 코드는 Apache 2.0 라이선스를 따릅니다.
Genesis 개발은 다음 오픈 소스 프로젝트 덕분에 가능했습니다:
- [Taichi](https://github.com/taichi-dev/taichi): 고성능 크로스 플랫폼 연산 백엔드. Taichi 팀의 기술 지원에 감사드립니다!
- [FluidLab](https://github.com/zhouxian/FluidLab): MPM 솔버 구현 참고.
- [SPH_Taichi](https://github.com/erizmr/SPH_Taichi): SPH 솔버 구현 참고.
- [Ten Minute Physics](https://matthias-research.github.io/pages/tenMinutePhysics/index.html) 및 [PBF3D](https://github.com/WASD4959/PBF3D): PBD 솔버 구현 참고.
- [MuJoCo](https://github.com/google-deepmind/mujoco): 강체 역학 참고.
- [libccd](https://github.com/danfis/libccd): 충돌 감지 참고.
- [PyRender](https://github.com/mmatl/pyrender): 래스터화 기반 렌더러.
- [LuisaCompute](https://github.com/LuisaGroup/LuisaCompute) 및 [LuisaRender](https://github.com/LuisaGroup/LuisaRender): 레이 트레이싱 DSL.
## 관련 논문
Genesis는 다양한 기존 및 진행 중인 연구의 최첨단 기술을 하나의 시스템으로 통합하는 대규모 프로젝트입니다. 다음은 Genesis 프로젝트에 어떤 방식으로든 기여한 논문들의 대략적인 목록입니다:
- Xian, Zhou, et al. "Fluidlab: A differentiable environment for benchmarking complex fluid manipulation." arXiv preprint arXiv:2303.02346 (2023).
- Xu, Zhenjia, et al. "Roboninja: Learning an adaptive cutting policy for multi-material objects." arXiv preprint arXiv:2302.11553 (2023).
- Wang, Yufei, et al. "Robogen: Towards unleashing infinite data for automated robot learning via generative simulation." arXiv preprint arXiv:2311.01455 (2023).
- Wang, Tsun-Hsuan, et al. "Softzoo: A soft robot co-design benchmark for locomotion in diverse environments." arXiv preprint arXiv:2303.09555 (2023).
- Wang, Tsun-Hsuan Johnson, et al. "Diffusebot: Breeding soft robots with physics-augmented generative diffusion models." Advances in Neural Information Processing Systems 36 (2023): 44398-44423.
- Katara, Pushkal, Zhou Xian, and Katerina Fragkiadaki. "Gen2sim: Scaling up robot learning in simulation with generative models." 2024 IEEE International Conference on Robotics and Automation (ICRA). IEEE, 2024.
- Si, Zilin, et al. "DiffTactile: A Physics-based Differentiable Tactile Simulator for Contact-rich Robotic Manipulation." arXiv preprint arXiv:2403.08716 (2024).
- Wang, Yian, et al. "Thin-Shell Object Manipulations With Differentiable Physics Simulations." arXiv preprint arXiv:2404.00451 (2024).
- Lin, Chunru, et al. "UBSoft: A Simulation Platform for Robotic Skill Learning in Unbounded Soft Environments." arXiv preprint arXiv:2411.12711 (2024).
- Zhou, Wenyang, et al. "EMDM: Efficient motion diffusion model for fast and high-quality motion generation." European Conference on Computer Vision. Springer, Cham, 2025.
- Qiao, Yi-Ling, Junbang Liang, Vladlen Koltun, and Ming C. Lin. "Scalable differentiable physics for learning and control." International Conference on Machine Learning. PMLR, 2020.
- Qiao, Yi-Ling, Junbang Liang, Vladlen Koltun, and Ming C. Lin. "Efficient differentiable simulation of articulated bodies." In International Conference on Machine Learning, PMLR, 2021.
- Qiao, Yi-Ling, Junbang Liang, Vladlen Koltun, and Ming Lin. "Differentiable simulation of soft multi-body systems." Advances in Neural Information Processing Systems 34 (2021).
- Wan, Weilin, et al. "Tlcontrol: Trajectory and language control for human motion synthesis." arXiv preprint arXiv:2311.17135 (2023).
- Wang, Yian, et al. "Architect: Generating Vivid and Interactive 3D Scenes with Hierarchical 2D Inpainting." arXiv preprint arXiv:2411.09823 (2024).
- Zheng, Shaokun, et al. "LuisaRender: A high-performance rendering framework with layered and unified interfaces on stream architectures." ACM Transactions on Graphics (TOG) 41.6 (2022): 1-19.
- Fan, Yingruo, et al. "Faceformer: Speech-driven 3d facial animation with transformers." Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2022.
- Wu, Sichun, Kazi Injamamul Haque, and Zerrin Yumak. "ProbTalk3D: Non-Deterministic Emotion Controllable Speech-Driven 3D Facial Animation Synthesis Using VQ-VAE." Proceedings of the 17th ACM SIGGRAPH Conference on Motion, Interaction, and Games. 2024.
- Dou, Zhiyang, et al. "C· ase: Learning conditional adversarial skill embeddings for physics-based characters." SIGGRAPH Asia 2023 Conference Papers. 2023.
- ...
이 외에도 다양한 연구가 진행 중입니다.
## 인용
연구에서 Genesis를 사용하는 경우, 다음을 인용해 주세요:
```bibtex
@misc{Genesis,
author = {Genesis Authors},
title = {Genesis: A Generative and Universal Physics Engine for Robotics and Beyond},
month = {December},
year = {2024},
url = {https://github.com/Genesis-Embodied-AI/Genesis}
}
```
================================================
FILE: RELEASE.md
================================================
# Genesis Release Note
## 0.4.3
This release introduces more sensors while significantly speeding up collision detection on GPU (up to 30%). As usual, a few bugs have been fixed.
### New Features
* Add ProximitySensor. (@Milotrince) (#2550)
* Add TemperatureGridSensor. (@Milotrince) (#2457)
### Bug Fixes
* Fix rendering FEM vertex normals in interactive viewer. (@duburcqa) (#2555)
* Fix support of ellipsoid geometry. (@duburcqa) (#2554)
* Fix mujoco compatible URDF parsing. (@duburcqa) (#2547)
* Fix typing, validation, and compatibility issues with structured options. (@duburcqa) (#2548)
### Miscellaneous
* Speed up rigid collision detection on GPU for generic convex meshes. (@hughperkins) (#2527)
* Fix spurious Quadrants compilation warnings. (@duburcqa) (#2546)
* Improve typing of 'add_entity', 'add_sensor'. (@duburcqa) (#2552)
* Add init/destroy registration mechanism for external modules. (@duburcqa) (#2551)
* More flexible and reliable sensor plugin registration mechanism. (@duburcqa) (#2553)
## 0.4.2
This release introduces a new type of tactile sensors based on [FOTS](https://arxiv.org/pdf/2404.19217), and add support of parallel simulation of heterogeneous articulated robots. Beyond that, the performance of the simulation has been significantly improved, especially when rigid option 'noslip' is enabled.
### New Features
* Add ElastomerDisplacementSensor. (@Milotrince) (#2447)
* Support articulated assets in heterogeneous parallel simulation. (@Kashu7100, @ACMLCZH) (#2472, #2535)
### Bug Fixes
* Fix GJK multi-contact in mujoco-compatibility mode. (@SonSang, @duburcqa) (#2514, #2516)
* Add support of morph option "fixed" for USD without explicit root and filter out invisible geometries from collision. (@ACMLCZH) (#2528)
* More robust collision detection on 32bits precision. (@SonSang) (#2525)
* Fix parsing of URDF with undefined inertial properties. (@duburcqa) (#2544)
### Miscellaneous
* Propagate interactive viewer exceptions when running in thread. (@duburcqa) (#2510)
* More robust and versatile interactive viewer keybinding. (@duburcqa) (#2512)
* Migrate 'gs view' to kinematic entity to reduce compile time. (@duburcqa) (#2522)
* Fix Python-scope field read to avoid GPU-CPU sync. (@erizmr) (#2518)
* Faster initialisation of collision pairs validity mask. (@ACMLCZH) (#2534)
* Introduce structured options with validation. (@duburcqa) (#2536)
* Accelerate noslip simulation on GPU backend. (@erizmr) (#2532)
* Speedup rigid constraint solver. (@erizmr) (#2524)
* Add dexterous hand benchmark. (@hughperkins) (#2500)
## 0.4.1
This release mainly improves experimental IPC coupler integration. Avatar entity has been re-introduced after being broken for months. Finally, Quadrants' dynamic arrays are now support on Apple Metal to avoid systematic scene compilation.
### Breaking changes
* More consistent IPC coupler API. (@duburcqa) (#2446)
### New Features
* Implement Local Offset in Inverse Kinematics (@alexis779) (#2333)
* Add support of batching to IPC articulated bodies. (@Roushelfy, @duburcqa) (#2448, #2454)
* Add support per-entity contact friction and resistance to IPC coupler. (@Roushelfy, @duburcqa) (#2473, #2479)
* Enable Quadrants dynamic array on Apple Metal. (@hughperkins) (#2498)
* Add avatar (kinematic) entity and refactor rigid entity. (@duburcqa) (#2504, #2508)
### Bug Fixes
* Fix support of Numpy 2.4. (@duburcqa) (#2432, #2433)
* Fix geometries misclassified as non-convex. (@duburcqa) (#2442)
* Fix merge fixed links. (@duburcqa, @YilingQiao) (#2441, #2475)
* Fix wrong type for gs.materials.Rigid.gravity_compensation. (@nimrod-gileadi) (#2469)
* Fix UV size mismatch causing USD parsing hard failure. (@alanray-tech) (#2480)
* Fix support of convex decomposition baked in glTF. (@duburcqa) (#2493)
* Fix mass getter for PBD entities. (@YilingQiao) (#2503)
* Fix Apple Metal bug causing nan. (@hughperkins) (#2481)
* Raise exception in case of invalid IPC coupler options. (@duburcqa) (#2450, #2451, #2486, #2492)
### Miscellaneous
* Refactor internal implementation of IPC coupler. (@duburcqa, @ACMLCZH, @Roushelfy) (#2453, #2455, #2462, #2463, #2465, #2478, #2484, #2485, #2495, #2496)
* More comprehensive IPC coupler unit tests and tune examples. (@duburcqa) (#2444, #2458, #2474, #2488)
* Add support of unspecified inertia origin in URDF. (@duburcqa) (#2499)
* Add torch profile integration to performance benchmarks. (@hughperkins) (#2421, #2466)
* Significantly speedup contact-rich and dynamic simulations. (@hughperkins) (#2406, #2467)
* More comprehensive performance benchmarks. (@hughperkins) (#2470)
* Aggregate speed benchmark wandb uploads into a single run. (@hughperkins) (#2482)
## 0.4.0
This release polishes our newly introduced USD parser and external interactive viewer plugin mechanism. Beyond that, the performance of the simulation has been significantly improved for collision-heavy scenes (up to 30%) and robots using capsule/sphere collision geometries (up to 20%).
### Breaking changes
* Migrate from GsTaichi to Quadrants. (@hughperkins, @duburcqa) (#2399, #2409)
### New Features
* Replace partial broken Vulkan backend by (experimental) AMD ROCm backend. (@duburcqa) (#2393, #2402)
* Support ArticulationRoot-free robots and instanced prims in USD. (@alanray-tech) (#2411)
* Add KinematicContactProbe sensor. (@Milotrince) (#2389)
* Add support of USD in 'gs view'. (@duburcqa) (#2423)
* Add IPC Robot-Cloth Coupling. (@Roushelfy, @alanray-tech) (#2427, #2352)
### Bug Fixes
* Fix weld and connect equality constraints. (@duburcqa) (#2390)
* Fix color overwrite for primitive geometries in URDF. (@duburcqa) (#2403)
* Fix merging chained fixed links. (@duburcqa) (#2404, #2429)
* Fix handling of unspecified spatial inertia properties in USD. (@alanray-tech) (#2401)
* Tune GJK to avoid false negative collision detection. (@SonSang) (#2419)
* Fix object slowly falling when holding object using mouse interaction plugin. (@Milotrince) (#2418)
* Fix interactive viewer deadlock on Wayland. (@alexis779) (#2422)
* Fix default file extension for interactive viewer save. (@duburcqa) (#2424)
* Fix viewer raycast kernel compilation race condition. (@duburcqa) (#2430)
### Miscellaneous
* Speed up linesearch via reducing global reads by recomputing quad. (@erizmr) (#2384)
* Speed up capsule-capsule and capsule-sphere collision detection. (@hughperkins) (#2363, #2413, #2414)
* Lazy-initialize SDF pre-processing in RigidGeom. (@duburcqa) (#2392)
* Add uv installation instructions to translated READMEs. (@antoinedandi) (#2416)
* Fix support of fastcache for raycast kernels. (@duburcqa) (#2417)
## 0.3.14
This release mainly focuses on usability, by extending support of USD and introducing a new external plugin mechanism for the interactive viewer. Besides, the performance of the simulation has been significantly improved for collision-heavy scenes (up to 30%).
### New Features
* Introduce interactive viewer plugins. (@Milotrince) (#2004, #2357)
* Add naming logics to entities. (@YilingQiao) (#2303)
* Support rendering textures for USD scenes. (@ACMLCZH) (#2286)
* Add invalid spatial inertia diagnosis. (@duburcqa) (#2297, #2321, #2367)
### Bug Fixes
* Fix wrong default sampler for SPH solver causing numerical stability issues. (@erizmr) (#2280)
* Fix render destroy. (@nimrod-gileadi, @duburcqa) (#2282, #2358)
* Fix IPC Coupler. (@duburcqa) (#2299)
* Fix batched numpy 'euler_to_R' geom util. (@Kashu7100) (#2306)
* Fix glTF mesh loading. (@duburcqa) (#2296, #2311, #2316, #2329)
* Fix 'Mesh.convert_to_zup' by applying scaling out-of-place. (@duburcqa)
* Fix rigid body entity hibernation mechanism. (@YilingQiao) (#2294)
* Fix DFSPH solver. (@erizmr) (#2302)
* Fix parsing material of primitive geometries in MJCF files. (@ACMLCZH) (#2328)
* Fix 'draw_debug_frames' after PR#1869. (@duburcqa) (#2330)
* Fix compatibility with 'trimesh<4.6.0'. (@duburcqa) (#2334)
* Fix linesearch edge-case fallback. (@erizmr) (#2339)
* Fix mujoco-compatible GJK multi-contact for box primitive. (@hughperkins) (#2341)
* FIX FEM entity rendering with Raytracer backend. (@duburcqa) (#2356)
* Fix combining Rasterizer-based camera sensors and interactive viewer. (@YilingQiao) (#2351)
### Miscellaneous
* Track mesh UVs in FEM/PBD solvers for rendering of deformable entities. (@alelievr) (#2323)
* Support scrolling menu in 'gs view'. (@Kashu7100) (#2335)
* Add memory to CI performance monitoring report. (@hughperkins) (#2281, #2291, #2293, #2295, #2298, #2300, #2312, #2315, #2320)
* Improve support of Linux ARM. (@duburcqa) (#2317)
* Clearer error message of 'RigidEntity.(get_joint|get_link)'. (@Kashu7100) (#2313)
* Add Markdown Files to Facilitate AI Tools. (@YilingQiao) (#2305)
* Support --record in the RL stage in Manipulation example (@SnakeOnex) (#2344)
* More robust OpenGL context initialisation for Rasterizer. (@duburcqa) (#2354)
* Add benchmark for Unitree G1. (@hughperkins) (#2310)
* Recomputing inertia for primitive geometries using analytical formula. (@duburcqa) (#2337)
* Speed up linesearch via batched alpha evals and reduced global memory access. (@erizmr) (#2350)
* Disable shadow and plane reflection when using software rendering. (@duburcqa) (#2365)
* Workaround for 'pyglet' bug. (@duburcqa) (#2385)
## 0.3.13
This small release adds user-friendly diagnosis of invalid Rigid physics properties and improves support of GLTF meshes.
### Breaking changes
* Apply 'FileMorph.file_meshes_are_zup' to all meshes including GLTF. (@duburcqa) (#2275)
* Do not officially support importing GLTF morph Mesh as Z-UP. (@duburcqa) (#2279)
### New Features
* Add Magnetometer measurement to IMU Sensor. (@sunkmechie) (#2265)
* Check validity of links spatial inertia and support forcing computation from geoms. (@duburcqa) (#2273, #2276)
### Bug Fixes
* Improve support of attached RigidEntity. (@duburcqa) (#2256, #2259)
* Fix attaching RayTracer camera sensor. (@duburcqa) (#2266)
* Fix empty data when adding more than 3 Raycast Sensors. (@JackLowry) (#2268)
* Fix Raycast Sensor for batched environments. (@d-corsi) (#2269)
* More robust filtering of self-collision in neutral configuration. (@duburcqa) (#2278)
### Miscellaneous
* Improve performance and add torch support to 'utils.geom.slerp'. (@Kashu7100) (#2260)
## 0.3.12
This PR focuses on performance improvements (x4 faster for complex scenes with 64 < n_dofs < 96 and n_envs=4096 compared to 0.3.10). Besides, initial support of heterogenous object and USD stage import for rigid body simulation has been introduced.
### New Features
* Add method to compute axis-aligned bounding boxes of visual geometries. (@duburcqa) (#2185)
* Add partial support of batched camera sensor with Rasterizer. (@Narsil) (#2207, #2212)
* Add support for attaching MPM particles to rigid links. (@YilingQiao) (#2205)
* Add support of USD import for Rigid Body. (@alanray-tech) (#2067)
* Add support of batched textures to BatchRenderer. (@ACMLCZH) (#2077)
* Add support of fisheye camera mode to BatchRenderer. (@ACMLCZH) (#2138)
* Add batched simulation of heterogeneous objects. (@YilingQiao) (#2202)
* Filter out self-collision pairs active in neutral configuration. (@duburcqa) (#2251)
### Bug Fixes
* Fix zero-copy for fields on Apple Metal. (@duburcqa) (#2188, #2223)
* Fix compatibility with 'numpy<2.0'. (@duburcqa) (#2197)
* Fix invalid default particle sampler on Linux ARM. (@duburcqa) (#2211)
* Fix 'RigidGeom.get_(pos|quat)' invalid shape. (@duburcqa) (#2218)
* Fix various sensor bugs and add zero-copy to contact force sensors. (@duburcqa) (#2232, #2235)
* Clear dynamic weld at scene reset. (@YilingQiao) (#2233)
* Fix viewer not closed at scene destroy if running in background thread. (@duburcqa) (#2236)
* More robust handling of corrupted cache. (@duburcqa) (#2241)
### Miscellaneous
* More intuitive visualisation of camera frustum in interactive viewer. (@duburcqa) (#2180)
* Remove broken and unmaintained Avatar Solver. (@duburcqa) (#2181)
* Speedup non-tiled hessian cholesky factor and solve. (@duburcqa) (#2182, #2183)
* Force public getters to return by-value to avoid mistake. (@duburcqa) (#2184)
* Improve CI infrastructure. (@hughperkins, @duburcqa) (#1981, #2166, #2190, #2194, #2195, #2242, #2245, #2250)
* Add Ruff format. (@Narsil) (#2213, #2214, #2215)
* Store texture path for primitive morphs as metadata. (@Rush2k) (#2227)
* Improve import logics of y-up vs z-up file meshes. (@AnisB) (#2237)
* Simplify boolean contact sensors update logics. (@duburcqa) (#2238)
* Rigid methods set_qpos,set_dofs_position now clear error code. (@duburcqa) (#2253)
## 0.3.11
The main focus of this release is to improve scaling of the simulation wrt the complexity of the scene, and better leverage GPUn compute for small to moderate batch sizes (0<=n_envs<=8192). As usual, a bunch of minor bugs have been fixed.
### New Features
* Support specifying offset transform for camera sensor. (@YilingQiao) (#2126)
* Enable zero-copy for fields on Metal if supported. (@duburcqa) (#2174)
### Bug Fixes
* Avoid discontinuities in smooth animations caused by singularities. (@Rush2k) (#2116)
* Fix forward update logics. (@duburcqa) (#2122)
* Fix kernel caching mechanism hindering performance. (@duburcqa) (#2123)
* Fix support of old torch for 'set_dofs_velocity' when velocity=None. (@YilingQiao) (#2160)
* Force rendering systematically when updating camera sensor. (@YilingQiao) (#2162)
* Fix incorrect lighting when offscreen cameras based on rasterizer. (@duburcqa) (#2163)
* Fix rasterizer race conditions when running in background thread. (@duburcqa) (#2169)
* Fix broken exception handling when loading obj files with unsupported face type. (@Kashu7100) (#2170)
* Fix 'pysplashsurf' memory leak causing OOM error. (@duburcqa) (#2173, #2176)
* Diagnose out-of-bound SDF gradient index. (@duburcqa) (#2177)
### Miscellaneous
* Stop assessing warmstart vs smooth acc at constraint solver init. (@duburcqa) (#2117)
* Speedup collision detection broad phase on GPU. (@duburcqa) (#2128)
* More comprehensive benchmarks. (@duburcqa) (#2137)
* Accelerate constraint solver first pass using shared memory. (@duburcqa) (#2136, #2140)
* Further optimize cholesky solve using warp reduction and memory padding. (@duburcqa) (#2145, #2146)
* Improve runtime speed by optimize memory layout of constraint solver. (@duburcqa) (#2147)
* Fast mass matrix factorisation on GPU using shared memory. (@duburcqa) (#2154)
* Optimize rigid body dynamics to scale better wrt dofs and entities. (@duburcqa) (#2161)
* Fix spurious deprecated property warnings during introspection. (@duburcqa) (#2168)
* Various solver refactoring to support GsTaichi Main. (@hughperkins, @duburcqa) (#2131, #2135, #2143, #2151)
* Improve single-threaded cpu-based simulation runtime speed by upgrading gstaichi. (@hughperkins) (#2129, #2153)
## 0.3.10
Small release mainly fixing bugs.
### Bug Fixes
* Fix parsing for special material properties in glTF meshes (@duburcqa) (#2110)
### Miscellaneous
* More robust detection of invalid simulation state. (@duburcqa) (#2112)
## 0.3.9
Small release mainly polishing features that were introduced in previous release.
### Breaking changes
* Replace SDF fallback by GJK. (@duburcqa) (#2081)
* Improve inertial estimation if undefined. (@YilingQiao) (#2100)
### New Features
* Add support of boolean masking as index. (@duburcqa) (#2087)
* Fix and improve merging of rigid entities. (@duburcqa) (#2098)
### Bug Fixes
* Fix increased memory usage due to differentiable simulation. (@duburcqa) (#2074)
* Fix 'envs_idx' in motion planning. (@duburcqa) (#2093)
* Fix 'DroneEntity.set_propellels_rpm'. (@duburcqa) (#2095)
* Fix extended broadcasting. (@duburcqa) (#2096)
* Fix 'RigidEntity.set_dofs_velocity'. (@robin271828) (#2102)
* Fix joint stiffness not taking into account neutral position. (@YilingQiao) (#2105)
* Fix explicit URDF material color being ignored. (@duburcqa) (#2107)
### Miscellaneous
* Speed up torch-based geom utils via 'torch.jit.script'. (@duburcqa) (#2075)
* Improve scalability wrt number of contacts. (@duburcqa) (#2085, #2103)
* Make Go2 RL env GPU-sync free. (@duburcqa) (#2092)
## 0.3.8
The performance of data accessors have been dramatically improved by leveraging zero-copy memory sharing between GsTaichi and Torch. Beyond that, the robustness of the default contact algorithm has been improved, and differentiable forward dynamics for Rigid Body simulation is not partially available. Last, but not least, GsTaichi dynamic array mode is finally enabled back by default!
### Breaking changes
* More robust MPR+SDF collision detection algorithm. (@duburcqa) (#1983, #1985)
* Disable box-box by default. (@duburcqa) (#1982)
### New Features
* Enable back GsTaichi dynamic array mode by default except for MacOS. (@duburcqa) (#1977)
* Add error code to rigid solver. (@duburcqa) (#1979)
* Add option to force batching of fixed vertices. (@duburcqa) (#1998)
* Leverage GsTaichi zero-copy in data accessors. (@duburcqa) (#2011, #2019, #2021, #2023, #2025, #2030, #2037, #2048, #2054)
* Add an option to disable keyboard shortcuts (@YilingQiao) (#2026)
* Add support of 'capsule' primitive in URDF file. (@duburcqa) (#2045)
* Add full support of tensor broadcasting in getters. (@duburcqa) (#2051)
* Add rasterizer, batch renderer, and raytracer as sensor (@YilingQiao) (#2010)
* Differentiable forward dynamics for rigid body sim. (@SonSang) (#1808, #2063, #2068)
### Bug Fixes
* Fix sensor IMU accelerometer signal. (@Milotrince) (#1962)
* Fix 'RigidJoint.(get_anchor_pos | get_anchor_axis)' getters. (@alexis779) (#2012)
* Prevent nan to propagate in position and raise exception. (@duburcqa) (#2033)
* Fix camera following entity for 'fix_orientation=True'. (@duburcqa) (#2038)
* Fix support of Hybrid entity with non-fixed base link. (@duburcqa) (#2040)
* Raise exception if trying to load PointCloud as Mesh. (@duburcqa) (#2042)
* Fix boolean mask inversion for PyTorch 2.x (@yoneken) (#2056)
* Fix URDF color overwrite. (@duburcqa) (#2065)
### Miscellaneous
* Reduce memory footprint. (@duburcqa) (#2000, #2031)
* Only enable GJK by default if gradient computation is required. (@duburcqa) (#1984)
* Bump GsTaichi Support Nvidia GPU Blackwell. (@johnnynunez) (#2002)
* Add dependency version upper-bound 'tetgen< 0.7.0'. (@YilingQiao) (#2029)
* Bump up min version requirement for Torch after introducing zero-copy. (@duburcqa) (#2034)
* Add 'parse_glb_with_zup' option to all file-based Morph. (@ACMLCZH) (#1938)
* Enable more example scripts in CI. (@duburcqa) (#2057)
* Fix fast cache and zero-copy bugs. (@hughperkins) (#2050)
## 0.3.7
The performance of GsTaichi dynamic array mode has been greatly improved. Now it should be on par with fixed-size array mode (aka performance mode) for very large batch sizes, and up to 30% slower for non-batched simulations. This mode is still considered experimental and must be enabled manually by setting the env var 'GS_ENABLE_NDARRAY=1'. Just try it if you are tired of endlessly waiting for the simulation to compile!
### New Features
* Implement position-velocity controller. (@matthieuvigne) (#1948)
### Bug Fixes
* Fix missing option `diffuse_texture` to `Glass` surface. (@Kashu7100) (#1934)
* Fix interactive viewer. (@YilingQiao) (#1931)
* Fix external coupling forces from other solvers not affecting rigid bodies. (@SonSang) (#1941)
* Fix silent process killing issue in MPM simulation by raising an exception. (@SonSang) (#1949)
* Fix 'discrete_obstacles_terrain' being completely flat. (@jgillick) (#1972)
### Miscellaneous
* Added warning message about stable timestep for SPH solver. (@SonSang) (#1925)
* Reduce memory usage due to diff constraint solver. (@YilingQiao) (#1930)
* Faster non-batched simulation. (@duburcqa) (#1935)
* Fix or silent dev warnings. (@duburcqa) (#1944)
* Add caching to Rigid Link state getters to improve performance. (@duburcqa) (#1940, #1955)
* Add support of Linux ARM. (@duburcqa) (#1961)
* Add 'GS_PARA_LEVEL' env var to force kernel parallelization level. (@duburcqa) (#1968)
## 0.3.6
A new experimental interface with the Incremental Potential Contact coupling solver [libuipc](https://github.com/spiriMirror/libuipc) has been introduced, mainly targeting cloth simulation.
### New Features
* Add Rigid ‘get_dofs_frictionloss’ public API method. (@ax-anoop) (#1904)
* Add IPC (Incremental Potential Contact) coupling system. (@Roushelfy) (#1859)
### Bug Fixes
* Fix missing dependencies in Docker (@schlagercollin) (#1896)
* Fix sensor recorder Matplotlib plotter on Linux and Windows. (@duburcqa) (#1894)
* Fix particle emitter failure if batch size = num emit particles. (@duburcqa) (#1901)
* Fix MJCF handling of visual groups. (@duburcqa) (#1902)
### Miscellaneous
* Disable GsTaichi dynamic arrays by default (again!) (@duburcqa) (#1915)
* Reset control during reset. (@YilingQiao) (#1920)
## 0.3.5
Minor release mainly aiming at polishing existing features and addressing some major performance regression that was introduced end of august. GsTaichi dynamic array type and fast cache are now enabled by default on Linux and Windows (opt-in on MacOS via env variable 'GS_ENABLE_NDARRAY'), which should help avoiding recompilation in most cases.
### New Features
* Make convex decomposition cache scale-invariant. (@SonSang) (#1810)
* Add parsing of joint friction and damping for URDF files. (@duburcqa) (#1833)
* Differentiable constraint solver (@SonSang) (#1733)
* Add support of GsTaichi dynamic array type and fast cache mode. (@YilingQiao, @duburcqa) (#1868, #1873, #1875, #1880)
### Bug Fixes
* Fix hybrid entity with rigid. (@duburcqa) (#1819)
* Reduce general memory usage. (@hughperkins) (#1828)
* Improve reliability and performance of plotters. (@duburcqa) (#1836)
* Fix loading MJCF file with includes. (@YilingQiao, @duburcqa) (#1838, #1840)
* Fix DepthCamera sensor. (@Milotrince) (#1842)
* Fix and refactor named terrain. (@duburcqa) (#1845)
* Raise exception in case of invalid set entity pos/quat. (@duburcqa) (#1847, #1869)
* Fix gltf Loading for URDF. (@ACMLCZH) (#1857)
* Fix friction loss causing nan on Apple GPU. (@duburcqa) (#1860)
* Fixed minor bug in differentiable contact detection. (@SonSang) (#1864)
* Fix race condition during concurrent viewer refresh and draw_debug_*. (@duburcqa) (#1883, #1884)
* Enable GPU and fix dt in some example scripts. (@schlagercollin) (#1890)
### Miscellaneous
* Reduce memory usage of Raycaster sensor. (@Milotrince) (#1850)
* Add 'get_particles_pos' helper method to SPHEntity. (@YilingQiao) (#1871)
* Enabling gstaichi fast cache by default. (@hughperkins) (#1885)
* Refactor Rigid simulation data management. (@duburcqa) (#1888)
* Do not silent errors during build. (@duburcqa) (#1889)
## 0.3.4
This minor release mainly introduces first-class sensor support (IMU, Contact Sensor, LiDAR, Depth camera and more), incl. recording and plotting facilities. The rigid-rigid hydroelastic contact model has also been added. As usual, a fair share of bugs have been fixed, with unit test coverage gradually improving.
### Behavior Changing
* Support rendering deformable body for batched env. (@YilingQiao) (#1697)
* More sensible defaults for camera far, near. (@duburcqa) (#1678)
* Fix invweight and meaninertia not always considering scale and dofs armature. (@duburcqa) (#1696)
### New Features
* Refactor 'FrameImageExporter' to improve performance and support normal & segmentation. (@duburcqa) (#1671)
* Add support of normal & segmentation for Madrona Batch Rendering. (@ACMLCZH) (#1563)
* Add 'noslip' optional post-processing step to suppress slip/drift. (@YilingQiao) (#1669)
* Add first-class data recorders and plotters. (@Milotrince) (#1646, #1718)
* Add rigid-rigid hydroelastic contact model. (@Libero0809) (#1572)
* Add option to display sensor information in the interactive viewer. (@Milotrince) (#1770)
* Add support of differentiable contact detection (Work In Progress). (@SonSang) (#1701)
* Add Raycaster sensor (Lidar and DepthCamera). (@Milotrince, @duburcqa, @jgillick) (#1726, #1772, #1809, #1815)
* Add full support gstaichi ndarray to Rigid Body solver. (@YilingQiao, @SonSang, @duburcqa) (#1674, #1682, #1683, #1690, #1693, #1695)
* Add full support gstaichi fast caching mechanism. (@hughperkins, @YilingQiao) (#1709, #1720, #1730, #1812)
### Bug Fixes
* Fix data races in getting contact and equality constraints. (@YilingQiao) (#1676)
* Fix MPM muscle activation. (@YilingQiao) (#1692)
* Fix non-flat terrain support. (@Kashu7100, @YilingQiao, @duburcqa) (#1691, #1777, #1779)
* Disable mesh processing when loading URDF for consistency. (@duburcqa) (#1708)
* Fix segfault at exit when running viewer in background thread with offscreen cameras. (@duburcqa) (#1703)
* Fix all the example scripts. (@YilingQiao, @duburcqa) (#1743, #1773, #1724, #1785, #1787, #1801, #1804)
* Fix logics for duplicating collision geometries as visual in MJCF. (@hokindeng, @duburcqa) (#1732, #1750)
* Randomize uniform terrain along both axes. (@jgillick) (#1747)
* Fix contact sensors always returning zeros. (@Milotrince) (#1761)
* Fix LBVH stuck in infinite loop for small number of AABBs. (@duburcqa) (#1766)
* Fix broken interactive viewer backend fallback mechanism. (@duburcqa) (#1797)
* Fix camera follow entity. (@duburcqa) (#1805)
* Fix compound joints for 'set_dofs_position'. (@duburcqa) (#1678)
* Fix some mesh-related issues (@ACMLCZH) (#1800)
### Miscellaneous
* Fix support of 'pyglet<2.0'. (@Kashu7100) (#1670)
* Add vision-based manipulation example (@yun-long) (#1493)
* Reduce max_collision_pairs to save memory (@YilingQiao) (#1672)
* Remove 'gs clean' utility. (@duburcqa) (#1723)
* Rename 'get_aabb' in 'get_AABB' and add deprecation warning. (@duburcqa) (#1778)
* Improve interactive viewer performance. (@duburcqa) (#1784)
* Raise exception in cause of particle sampling failure. (@duburcqa) (#1792)
* Remove 'is_free' that was confusing and partially redundant with 'is_fixed'. (@duburcqa) (#1795)
## 0.3.3
This minor release fixes a few non-blocking rendering issues for the Rasterizer backend.
### Bug Fixes
* Fix shadow map not properly rendered for objects far away from floor plane. (@duburcqa) (#1664)
* Fix genesis import failure if tkinter is failing at init on MacOS. (@duburcqa) (#1666)
* Fix default visualization mode for emitter surface. (@duburcqa) (#1665)
### Miscellaneous
* Expose parameters for ground plane tiling. (@yuhongyi) (#1657)
* Add support of 'ti.ndarray' to 'ti_field_to_torch' and rename in 'ti_to_torch'. (@duburcqa) (#1661)
## 0.3.2
This minor release fixes a few additional regressions and initiates migration to our own open-source fork of Taichi, [GsTaichi](https://github.com/Genesis-Embodied-AI/gstaichi) (contributions are welcome!).
### Behavior Changing
* Disable decimation if deemed unnecessary and unreliable. Reduce default aggressiveness. (@duburcqa) (#1644)
* Fix primitive and mesh's COM. (@YilingQiao) (#1638)
### New Features
* Add 'set_dofs_frictionloss' method for dynamic joint friction control. (@LeonLiu4) (#1614)
* Add initial experimental support of gstaichi fast cache feature. (@hughperkins) (#1631)
* Add 'ref' optional argument to 'get_links_pos'. (@YilingQiao) (#1638)
### Bug Fixes
* Fix Inverse Kinematics algorithm. (@Kashu7100, @duburcqa) (#1582, #1586)
* Fix save frame as png image in interactive viewer. (@Kashu7100) (#1606)
* Filter out collision pairs involved in weld equality constraints. (@duburcqa) (#1621)
* Fix viewer backend fallback when running in main thread. (@duburcqa) (#1630)
* Fix 'quat_to_xyz' singularity edge-case. (@duburcqa) (#1628)
* Fix CUDA runtime being initialized by 'get_device'. (@duburcqa) (#1634)
### Miscellaneous
* Re-enable world-frame in the 'gs view' standalone viewer. (@Kashu7100) (#1584)
* Migrate from 'taichi' to 'gstaichi'. (@duburcqa, @hughperkins) (#1550, #1618, #1645)
* Update documentation so the doc will be compiled based on the latest main. (@YilingQiao) (#1616)
## 0.3.1
This small release addresses the most pressing regressions that has been pointed out by the community since 0.3.0. Support of coupling between Rigid Body and FEM has been improved and should be more reliable, though it is still considered experimental for now. Apart from that, no behavior changes are to be expected.
### New Features
* Support 2-channel (LA) textures in Rasterizer. (@LeonLiu4) (#1519)
* Add 'get_weld_constraints' API. (@LeonLiu4) (#1370)
* Add USD Materials Baking. (@ACMLCZH) (#1300)
* Add dedicated sensor manager. (@Milotrince) (#1518)
* Enhance SAP coupler for coupling between Rigid body and Fem object. (@Libero0809) (#1458)
* Add IMU sensor. (@Milotrince) (#1551)
* Add Fem fixed constraint for implicit solver. (@Libero0809) (#1562)
* Add Joint Equality Constraints for the SAP Coupler. (@Libero0809) (#1565)
### Bug Fixes
* Fix point-cloud rendering from Camera depth map. (@@ceasor-mao, @duburcqa) (#1512, #1515)
* Fix various rendering bugs. (@duburcqa) (#1537)
* Fix Z-up orientation and vertex color. (@ceasor-mao) (#1540)
* Fix hibernation. (@gasnica) (#1542)
* Fix backend fallback mechanism causing deadlock in Rasterizer. (@duburcqa) (#1546)
* Fix video recording dialog when running viewer in thread. (@duburcqa) (#1547)
* Fix joint friction loss. (@duburcqa) (#1555)
* Fix taichi debug mode errors and warnings. (@Libero0809) (#1560)
### Miscellaneous
* Migrate to native Python API for 'splashsurf'. (@duburcqa) (#1531)
* Refactor weld constraint API. (@duburcqa) (#1536)
* Allow following entity or mounting camera building scene. (@duburcqa) (#1548)
* Faster Genesis import. (@duburcqa) (#1549)
* Avoid rendering cameras at reset. (@Kashu7100) (#1552)
* Enable taichi debug mode in tests if possible. (@duburcqa) (#1541)
* Re-enable markers by default on RGB offscreen cameras. (@duburcqa) (#1570)
## 0.3.0
This release focuses primarily on stability, covering everything from MJCF/URDF parsing to rendering and physics, backend by a new CI infrastructure running more than 200 unit tests on all supported platforms. The most requested Mujoco features that were previously missing have been implemented. Native support of batching has been extended to all solvers except Stable Fluid, motion planning, and rendering via [gs-madrona](https://github.com/Genesis-Embodied-AI/gs-madrona). Finally, support of soft body dynamics has been enhanced, with the introduction of constraints and coupling between soft and rigid body dynamics.
### New Features
* Add link-wise mask for poss and quats in multilink Inverse Kinematics. (@ziyanx02) (#499)
* Update HoverEnv, update hyperparams, and visualization while training. (@KafuuChikai) (#533)
* Add Mac OS and Windows OS support to the viewer. (@kohya-ss, @duburcqa) (#610, #782)
* Add method to compute classical links acceleration. (@zswang666, @duburcqa) (#451, #1228)
* Support mounted cameras on rigid links. (@wangyian-me, @abhijitmajumdar) (#618, #1323)
* Cameras and main viewer can now track an entity. (@jgleyze) (#611)
* Support fixed entity. (@ziyanx02, @duburcqa) (#673, #1187)
* Support separated rendering for each environment. (@ACMLCZH) (#545, #723)
* Support environment masking to Inverse Kinematics. (@Kashu7100) (#732)
* Support equality constraint and closed-loop robots. (@YilingQiao) (#636)
* Add support on headless rendering on Windows OS. (@duburcqa) (#798)
* Expose public API for Forward Kinematics. (@Kashu7100) (#802)
* Add setter for robot mass. (@Kashu7100, @YilingQiao) (#828, #605)
* Support advanced collision pair filtering. (@duburcqa, @Kashu7100) (#816, #1438, #1499)
* Enable visualizing path. (@bxtbold) (#815)
* Add environment masking to more rigid body methods. (@Kashu7100) (#832)
* Add support of Ellipsoid geometry. (@duburcqa) (#864)
* Add 'show_link_frame' option to the viewer for better debugging. (@Kashu7100) (#871)
* Add environment masking to 'get_links_net_contact_force'. (@Kashu7100) (#880)
* Add support of ball joint type and compound joints. (@YilingQiao, @duburcqa) (#853, #1078, #1080)
* Luisa Render upgrade to support Apple Silicon. (@ACMLCZH) (#886)
* Support equality joint constraint. (@YilingQiao) (#919)
* Support mimic joint in URDF. (@YilingQiao) (#928)
* Support weld constraint. (@YilingQiao) (#948)
* Add method to render pointcloud on cameras. (@wangyian-me) (#897)
* Expose different convex decomposition error thresholds for robots and objects. (@duburcqa) (#1058)
* Force interactive viewer camera Z-axis up. (@duburcqa) (#1060)
* Add helper to convert terrain mesh to height field. (@YilingQiao) (#1033)
* Add maxvolume support for TetGen-based tetrahedralization. (@kosuke1701) (#1088)
* Support parallel simulation for deformable materials. (@wangyian-me) (#1005)
* Add public API to access rigid body mass matrix. (@Kashu7100) (#1132)
* Add public API getter/setter for constraint solver parameters. (@duburcqa) (#1173)
* Add option to exclude self-collision. (@Kashu7100) (#1229)
* Add profiling options. (@hughperkins) (#1247)
* Add implicit FEM with newton and conjugate gradient methods. (@Libero0809) (#1215)
* Implement BVH using Linear BVH. (@Libero0809) (#1241)
* Add USD parsing. (@ACMLCZH) (#1051)
* Expose optional subterrain parameters. (@LeonLiu4) (#1289)
* Add GJK-EPA algorithm for rigid body collision detection. (@SonSang) (#1213, #1357)
* Add linear_corotated elastic material for FEM. (@Libero0809) (#1304)
* Add fast vs high-performance taichi compilation mode. (@hughperkins) (#1330)
* Support environment-wise gravity. (@LeonLiu4, @Milotrince) (#1324, #1498)
* Expose method to compute Jacobian at a specific point. (@LeonLiu4) (#1353)
* Support segmentation map for deformable materials. (@ACMLCZH) (#1363)
* Support parallel path planning. (@Kashu7100) (#1316)
* Support dragging to physical object interactively in viewer. (@gasnica) (#1346, #1378, #1411, #1443)
* Enhance SAP Coupler to support self collision between FEM objects. (@Libero0809) (#1375)
* Support vertex constraints for FEM objects. (@Milotrince) (#1310)
* Add sensor abstraction. (@Milotrince) (#1381)
* Integrate Madrona batch renderer. (@yuhongyi) (#1416)
* Support joint friction. (@YilingQiao) (#1479)
### Bug Fixes
* Improve URDF and MJCF loading. (@zhenjia-xu, @bxtbold, @YilingQiao, @zswang666, @duburcqa) (#517, #675, #735, #744, #765, #777, #792, #872, #913, #936, #940, #988, #1147, #1154, #1159, #1169, #1218, #1235, #1262, #1287, #1501)
* Rework backend & device selection logic. (@lgleim) (#568)
* More robust cross-platform rendering support (viewer and cameras). (@alesof, @eratc, @duburcqa, @YilingQiao, @Kashu7100) (#404, #644, #774, #779, #783, #784, #787, #796, #799, #800, #807, #809, #810, #813, #814, #915, #983, #1069, #1070, #1071, #1073, #1074, #1420, #1421, #1426)
* More robust cachie mechanism for simulation pre-processing. (@duburcqa) (#801)
* Improve debug and high-precision mode. (@duburcqa) (#863)
* Fix constraint solver termination condition. (@duburcqa) (#867)
* Reset collision detection state when setting qpos. (@duburcqa) (#868)
* Use collision geometry as visual for bodies not having any. (@duburcqa) (#870)
* Only add world link/joint if it has at least one geom. (@duburcqa) (#884)
* Avoid segfault because of exceeding number of collisions. (@duburcqa) (#898)
* Fix box-box collision detection. (@duburcqa) (#910)
* Fix fixed joint and body handling. (@duburcqa) (#916, #952)
* Fix link velocity computation. (@duburcqa) (#941)
* Avoid useless convex decomposition. (@duburcqa) (#957)
* Improve numerical stability of MPR collision detection algorithm. (@duburcqa) (#966, #977, #1336)
* Improve multi-point contact stability. (@duburcqa) (#967, #1012, #1117, #1297)
* Fix genesis destroy. (@duburcqa) (#1007)
* Fix issue when adding multiple FEM entities. (@kosuke1701) (#1014)
* Using Vulkan backend for taichi even if no Intel XPU device is available. (@duburcqa) (#1025)
* Try to repair partially "broken" meshes if possible. (@duburcqa) (#1023, #1075, #1077)
* Fix scaling of poly-articulated robots. (@duburcqa) (#1039, #1108)
* Fix mujoco vs genesis discrepancies. (@duburcqa) (#1097)
* More robust robot loading and default options. (@duburcqa) (#1098)
* Improve external force handling. (@duburcqa) (#1292)
* Fix terrain collision detection. (@duburcqa) (#1338)
* Prevent unrealistic angular velocity of Drone entities causing numerical instability. (@duburcqa) (#1405)
* Do not consider markers as physical objects for rendering. (@duburcqa) (#14948)
### Miscellaneous
* Update Drone Entity and Training Performance Enhancements. (@KafuuChikai) (#598)
* Added PID controller util, quadcopter PID controller, flight examples. (@jebbrysacz) (#501)
* Add support of Numpy 2.0. (@johnnynunez, @duburcqa) (#711, #791)
* Setup unit test infrastructure. (@duburcqa) (#876)
* Various minor improvements. (@duburcqa) (#889)
* Get rid of internally maintained trimesh dependency. (@duburcqa) (#918)
* Refactor rigid body data accessors. (@duburcqa) (#924)
* Speed-up convert taichi field to torch. (@duburcqa) (#935)
* Cleanup Genesis init / exit. (@duburcqa) (#989)
* Use torch cuda with vulkan taichi backend if available. (@duburcqa) (#1043)
* Fix naming convention inconsistencies. (@duburcqa) (#1053)
* Add API documentation. (@zswang666) (#1105)
* Use 2*dt as default timeconst for urdf and mesh. (@YilingQiao) (#1115)
* Improve runtime and compile time performance. (@YilingQiao, @duburcqa) (#1164, #1268, #1277)
* More robust decimation processing. Enable decimation by default. (@duburcqa) (#1186)
* Add compile- and run-time performance monitoring. (@duburcqa) (#1209)
* More efficient unit test distribution across workers. (@duburcqa) (#1275)
* Enable GJK collision detection algorithm by default. (@duburcqa) (#1439)
* Enable box-box collision detection by default. (@duburcqa) (#1442)
## 0.2.1
### Bug Fixes
* Fix various visualization and rendering bugs. (@RobRoyce, @VincentCCandela, @Likhithsai2580)
* Resolve some platform-dependent issues. (@abhaybd, @NekoAsakura)
* Fix the issue with loading box textures when parsing MJCF files.
* Correct asset path handling.
* Fix repr output in IPython. (@JohnnyDing)
* Resolve bugs in locomotion examples. (@yang-zj1026)
* Fix several issues with MPR and contact islands during collision detection.
### New Features
* Add a smoke simulator driven by Stable Fluid, along with a demo. (@PingchuanMa)
* Introduce APIs for applying external forces and torques.
* Introduce APIs for setting friction ratios.
* Add a domain randomization example.
* Improve kernel cache loading speed by 20~30%. (@erizmr)
* Provide an interactive drone control and visualization script. (@PieterBecking)
* Introduce an RL environment and examples for the drone environment. (@KafuuChikai)
* Add an option to enable or disable the batch dimension for (links/DOFs) information. Users can choose the trade-off between performance and flexibility.
* Add Docker files. (@Kashu7100)
* Implement the MuJoCo box-box collision detection algorithm for more stable grasping.
* Include the backflip training script and checkpoints. (@ziyanx02)
* Enable support for entity merging.
* Add support for custom inverse kinematics (IK) chains.
### Miscellaneous
* Improve documentation and fix typos. (@sangminkim-99, @sjtuyinjie, @CharlesCNorton, @eltociear, @00make, @marcbone, @00make, @pierridotite, @takeshi8989, @NicholasZiglio, @AmbarishGK)
* Add CONTRIBUTING.md and update CI configurations.
* Introduce multi-language support. (@TitanSage02, @GengYiran, @DocyNoah)
We would also like to acknowledge the ongoing PRs. Some of them have not yet been merged because we have not had enough time to fully test them:
* Unitree G1 walking. (@0nhc)
* Blood, vessels, and heart simulation. (@lhemerly)
* Cross-platform and rendering compatibility. (@VioletBenin, @DearVa, @JonnyDing)
* Docker support. (@skurtyyskirts, @yuxiang-gao, @serg-yalosovetsky)
================================================
FILE: docker/10_nvidia.json
================================================
{
"file_format_version" : "1.0.0",
"ICD" : {
"library_pa
gitextract_ag6vedhl/
├── .gitattributes
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── 1-bug-report.yml
│ │ ├── 2-feature-request.yml
│ │ └── config.yml
│ ├── contributing/
│ │ ├── ARCHITECTURE.md
│ │ ├── CODING_CONVENTIONS.md
│ │ ├── EXAMPLES.md
│ │ ├── PULL_REQUESTS.md
│ │ ├── TESTING.md
│ │ └── USD_PARSER.md
│ ├── pull_request_template.md
│ └── workflows/
│ ├── alarm.yml
│ ├── examples.yml
│ ├── format.yml
│ ├── generic.yml
│ ├── production.yml
│ └── scripts/
│ ├── alarm.py
│ └── production_build.sh
├── .gitignore
├── .gitmodules
├── .pre-commit-config.yaml
├── .readthedocs.yaml
├── AGENTS.md
├── LICENSE
├── MANIFEST.in
├── README.md
├── README_CN.md
├── README_FR.md
├── README_JA.md
├── README_KR.md
├── RELEASE.md
├── docker/
│ ├── 10_nvidia.json
│ ├── Dockerfile
│ ├── Dockerfile.amdgpu
│ ├── build_luisa.sh
│ ├── nvidia_icd.json
│ └── nvidia_layers.json
├── examples/
│ ├── IPC_Solver/
│ │ ├── README.md
│ │ ├── ipc_momentum.py
│ │ ├── ipc_objects_falling.py
│ │ ├── ipc_robot_cloth_teleop.py
│ │ └── ipc_robot_grasp_cube.py
│ ├── collision/
│ │ ├── contype.py
│ │ ├── pyramid.py
│ │ └── tower.py
│ ├── coupling/
│ │ ├── cloth_attached_to_rigid.py
│ │ ├── cloth_on_rigid.py
│ │ ├── cut_dragon.py
│ │ ├── fem_cube_linked_with_arm.py
│ │ ├── flush_cubes.py
│ │ ├── grasp_soft_cube.py
│ │ ├── rigid_mpm_attachment.py
│ │ ├── sand_wheel.py
│ │ ├── sph_mpm.py
│ │ ├── sph_rigid.py
│ │ └── water_wheel.py
│ ├── ddp_multi_gpu.py
│ ├── differentiable_push.py
│ ├── drone/
│ │ ├── README.md
│ │ ├── fly.py
│ │ ├── fly_route.py
│ │ ├── hover_env.py
│ │ ├── hover_eval.py
│ │ ├── hover_train.py
│ │ ├── interactive_drone.py
│ │ └── quadcopter_controller.py
│ ├── elastic_dragon.py
│ ├── fem_hard_and_soft_constraint.py
│ ├── hibernation.py
│ ├── keyboard_teleop.py
│ ├── kinematic/
│ │ └── go2_kinematic.py
│ ├── locomotion/
│ │ ├── backflip/
│ │ │ └── readme.md
│ │ ├── go2_backflip.py
│ │ ├── go2_env.py
│ │ ├── go2_eval.py
│ │ └── go2_train.py
│ ├── manipulation/
│ │ ├── behavior_cloning.py
│ │ ├── grasp_env.py
│ │ ├── grasp_eval.py
│ │ └── grasp_train.py
│ ├── pbd_liquid.py
│ ├── render_async.py
│ ├── rendering/
│ │ ├── demo.py
│ │ ├── follow_entity.py
│ │ ├── moving_camera.py
│ │ └── speed_test.py
│ ├── rigid/
│ │ ├── accelerometer_duck.py
│ │ ├── accelerometer_franka.py
│ │ ├── apply_external_force_torque.py
│ │ ├── closed_loop.py
│ │ ├── control_franka.py
│ │ ├── control_mesh.py
│ │ ├── convex_decomposition.py
│ │ ├── diffik_controller.py
│ │ ├── domain_randomization.py
│ │ ├── franka_cube.py
│ │ ├── grasp_bottle.py
│ │ ├── gravity_compensation.py
│ │ ├── heterogeneous_simulation.py
│ │ ├── ik_custom_chain.py
│ │ ├── ik_duck.py
│ │ ├── ik_franka.py
│ │ ├── ik_franka_batched.py
│ │ ├── ik_shadow_hand.py
│ │ ├── merge_entities.py
│ │ ├── multi_gpu.py
│ │ ├── nonconvex_mesh.py
│ │ ├── set_phys_attr.py
│ │ ├── single_franka.py
│ │ ├── single_franka_batch_render.py
│ │ ├── single_franka_envs.py
│ │ ├── suction_cup.py
│ │ ├── terrain_from_mesh.py
│ │ ├── terrain_height_field.py
│ │ └── terrain_subterrain.py
│ ├── sap_coupling/
│ │ ├── fem_fixed_constraint.py
│ │ ├── fem_sphere_and_cube.py
│ │ ├── franka_grasp_fem_sphere.py
│ │ └── franka_grasp_rigid_cube.py
│ ├── sensors/
│ │ ├── camera_as_sensor.py
│ │ ├── contact_force_go2.py
│ │ ├── imu_franka.py
│ │ ├── kinematic_contact_sandbox.py
│ │ ├── lidar_teleop.py
│ │ ├── proximity_shadowhand.py
│ │ ├── tactile_elastomer_franka.py
│ │ ├── tactile_elastomer_sandbox.py
│ │ └── temperature_grid.py
│ ├── smoke.py
│ ├── speed_benchmark/
│ │ ├── anymal_c.py
│ │ ├── franka.py
│ │ └── timers.py
│ ├── tutorials/
│ │ ├── IK_motion_planning_grasp.py
│ │ ├── advanced_IK_multilink.py
│ │ ├── advanced_hybrid_robot.py
│ │ ├── advanced_muscle.py
│ │ ├── advanced_worm.py
│ │ ├── batched_IK.py
│ │ ├── control_your_robot.py
│ │ ├── draw_debug.py
│ │ ├── entity_name.py
│ │ ├── hello_genesis.py
│ │ ├── interactive_debugging.py
│ │ ├── mpm.py
│ │ ├── parallel_simulation.py
│ │ ├── pbd_cloth.py
│ │ ├── position_control_comparison.py
│ │ ├── selecting_rendered_envs.py
│ │ ├── sph_liquid.py
│ │ └── visualization.py
│ ├── usd/
│ │ └── import_stage.py
│ └── viewer_plugin/
│ ├── mesh_point_selector.py
│ └── mouse_interaction.py
├── genesis/
│ ├── __init__.py
│ ├── _main.py
│ ├── assets/
│ │ ├── meshes/
│ │ │ ├── Airplane/
│ │ │ │ ├── airplane.mtl
│ │ │ │ ├── airplane.obj
│ │ │ │ └── textures/
│ │ │ │ └── diffuse.dds
│ │ │ ├── axis.obj
│ │ │ ├── bathtub/
│ │ │ │ ├── bathtub.obj
│ │ │ │ └── material.mtl
│ │ │ ├── boat/
│ │ │ │ ├── boat.obj
│ │ │ │ └── material.mtl
│ │ │ ├── bunny.obj
│ │ │ ├── camera/
│ │ │ │ └── camera.glb
│ │ │ ├── chopping-board/
│ │ │ │ └── source/
│ │ │ │ └── chopping_board.glb
│ │ │ ├── cloth.obj
│ │ │ ├── cross_cutter.obj
│ │ │ ├── dragon/
│ │ │ │ ├── dragon.obj
│ │ │ │ └── material.mtl
│ │ │ ├── dragon.obj
│ │ │ ├── duck/
│ │ │ │ ├── duck.obj
│ │ │ │ └── material.mtl
│ │ │ ├── duck.obj
│ │ │ ├── env_sphere/
│ │ │ │ ├── env_sphere.obj
│ │ │ │ └── material.mtl
│ │ │ ├── icecream_dispenser.obj
│ │ │ ├── sphere.obj
│ │ │ ├── stirrer.obj
│ │ │ ├── tank.obj
│ │ │ ├── terrain_45.obj
│ │ │ ├── wooden_sphere_OBJ/
│ │ │ │ ├── wooden_sphere.mtl
│ │ │ │ └── wooden_sphere.obj
│ │ │ └── worm/
│ │ │ ├── worm.mtl
│ │ │ └── worm.obj
│ │ ├── urdf/
│ │ │ ├── 3763/
│ │ │ │ ├── bounding_box.json
│ │ │ │ ├── link_and_joint.txt
│ │ │ │ ├── meta.json
│ │ │ │ ├── mobility.urdf
│ │ │ │ ├── mobility_v2.json
│ │ │ │ ├── mobility_vhacd.urdf
│ │ │ │ ├── parts_render/
│ │ │ │ │ ├── 0.txt
│ │ │ │ │ ├── 1.txt
│ │ │ │ │ ├── 5.txt
│ │ │ │ │ ├── 6.txt
│ │ │ │ │ └── 7.txt
│ │ │ │ ├── parts_render_after_merging/
│ │ │ │ │ ├── 0.txt
│ │ │ │ │ ├── 1.txt
│ │ │ │ │ ├── 2.txt
│ │ │ │ │ ├── 3.txt
│ │ │ │ │ └── 4.txt
│ │ │ │ ├── point_sample/
│ │ │ │ │ ├── label-10000.txt
│ │ │ │ │ ├── ply-10000.ply
│ │ │ │ │ ├── pts-10000.pts
│ │ │ │ │ ├── pts-10000.txt
│ │ │ │ │ ├── sample-points-all-label-10000.txt
│ │ │ │ │ ├── sample-points-all-pts-label-10000.ply
│ │ │ │ │ ├── sample-points-all-pts-nor-rgba-10000.ply
│ │ │ │ │ └── sample-points-all-pts-nor-rgba-10000.txt
│ │ │ │ ├── result.json
│ │ │ │ ├── result_after_merging.json
│ │ │ │ ├── semantics.txt
│ │ │ │ ├── textured_objs/
│ │ │ │ │ ├── original-1.mtl
│ │ │ │ │ ├── original-1.obj
│ │ │ │ │ ├── original-1_log.txt
│ │ │ │ │ ├── original-1_vhacd.obj
│ │ │ │ │ ├── original-2.mtl
│ │ │ │ │ ├── original-2.obj
│ │ │ │ │ ├── original-2_log.txt
│ │ │ │ │ ├── original-2_vhacd.obj
│ │ │ │ │ ├── original-3.mtl
│ │ │ │ │ ├── original-3.obj
│ │ │ │ │ ├── original-3_log.txt
│ │ │ │ │ └── original-3_vhacd.obj
│ │ │ │ ├── tree_hier.html
│ │ │ │ └── tree_hier_after_merging.html
│ │ │ ├── anymal_c/
│ │ │ │ ├── ANYmal_c_license.txt
│ │ │ │ ├── meshes/
│ │ │ │ │ ├── base.dae
│ │ │ │ │ ├── battery.dae
│ │ │ │ │ ├── bottom_shell.dae
│ │ │ │ │ ├── depth_camera.dae
│ │ │ │ │ ├── drive.dae
│ │ │ │ │ ├── face.dae
│ │ │ │ │ ├── foot.dae
│ │ │ │ │ ├── handle.dae
│ │ │ │ │ ├── hatch.dae
│ │ │ │ │ ├── hip_l.dae
│ │ │ │ │ ├── hip_r.dae
│ │ │ │ │ ├── lidar.dae
│ │ │ │ │ ├── lidar_cage.dae
│ │ │ │ │ ├── remote.dae
│ │ │ │ │ ├── shank_l.dae
│ │ │ │ │ ├── shank_r.dae
│ │ │ │ │ ├── thigh.dae
│ │ │ │ │ ├── top_shell.dae
│ │ │ │ │ └── wide_angle_camera.dae
│ │ │ │ └── urdf/
│ │ │ │ └── anymal_c.urdf
│ │ │ ├── blue_box/
│ │ │ │ ├── assets/
│ │ │ │ │ ├── part_1.part
│ │ │ │ │ └── part_1.stl
│ │ │ │ └── model.urdf
│ │ │ ├── drones/
│ │ │ │ ├── body.mtl
│ │ │ │ ├── body.obj
│ │ │ │ ├── cf2.dae
│ │ │ │ ├── cf2p.urdf
│ │ │ │ ├── cf2x.urdf
│ │ │ │ ├── propeller0.mtl
│ │ │ │ ├── propeller0.obj
│ │ │ │ ├── propeller1.mtl
│ │ │ │ ├── propeller1.obj
│ │ │ │ ├── propeller2.mtl
│ │ │ │ ├── propeller2.obj
│ │ │ │ ├── propeller3.mtl
│ │ │ │ ├── propeller3.obj
│ │ │ │ └── racer.urdf
│ │ │ ├── go2/
│ │ │ │ ├── dae/
│ │ │ │ │ ├── base.dae
│ │ │ │ │ ├── calf.dae
│ │ │ │ │ ├── calf_mirror.dae
│ │ │ │ │ ├── foot.dae
│ │ │ │ │ ├── hip.dae
│ │ │ │ │ ├── thigh.dae
│ │ │ │ │ └── thigh_mirror.dae
│ │ │ │ └── urdf/
│ │ │ │ └── go2.urdf
│ │ │ ├── kuka_iiwa/
│ │ │ │ ├── kuka_with_gripper.sdf
│ │ │ │ ├── kuka_with_gripper2.sdf
│ │ │ │ ├── kuka_world.sdf
│ │ │ │ ├── meshes/
│ │ │ │ │ ├── base_link.dae
│ │ │ │ │ ├── finger_base_left.stl
│ │ │ │ │ ├── finger_base_right.stl
│ │ │ │ │ ├── finger_tip_left.stl
│ │ │ │ │ ├── finger_tip_right.stl
│ │ │ │ │ ├── link_0.mtl
│ │ │ │ │ ├── link_0.obj
│ │ │ │ │ ├── link_0.stl
│ │ │ │ │ ├── link_1.mtl
│ │ │ │ │ ├── link_1.obj
│ │ │ │ │ ├── link_1.stl
│ │ │ │ │ ├── link_2.mtl
│ │ │ │ │ ├── link_2.obj
│ │ │ │ │ ├── link_2.stl
│ │ │ │ │ ├── link_3.mtl
│ │ │ │ │ ├── link_3.obj
│ │ │ │ │ ├── link_3.stl
│ │ │ │ │ ├── link_4.mtl
│ │ │ │ │ ├── link_4.obj
│ │ │ │ │ ├── link_4.stl
│ │ │ │ │ ├── link_5.mtl
│ │ │ │ │ ├── link_5.obj
│ │ │ │ │ ├── link_5.stl
│ │ │ │ │ ├── link_6.mtl
│ │ │ │ │ ├── link_6.obj
│ │ │ │ │ ├── link_6.stl
│ │ │ │ │ ├── link_7.mtl
│ │ │ │ │ ├── link_7.obj
│ │ │ │ │ └── link_7.stl
│ │ │ │ ├── model.sdf
│ │ │ │ ├── model.urdf
│ │ │ │ ├── model2.sdf
│ │ │ │ ├── model_for_sdf.urdf
│ │ │ │ ├── model_free_base.urdf
│ │ │ │ ├── model_mobile.urdf
│ │ │ │ └── model_vr_limits.urdf
│ │ │ ├── panda_bullet/
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── hand.urdf
│ │ │ │ ├── meshes/
│ │ │ │ │ ├── collision/
│ │ │ │ │ │ ├── finger.obj
│ │ │ │ │ │ ├── hand.obj
│ │ │ │ │ │ ├── link0.obj
│ │ │ │ │ │ ├── link1.obj
│ │ │ │ │ │ ├── link2.obj
│ │ │ │ │ │ ├── link3.obj
│ │ │ │ │ │ ├── link4.obj
│ │ │ │ │ │ ├── link5.obj
│ │ │ │ │ │ ├── link6.mtl
│ │ │ │ │ │ ├── link6.obj
│ │ │ │ │ │ └── link7.obj
│ │ │ │ │ └── visual/
│ │ │ │ │ ├── base_link.dae
│ │ │ │ │ ├── finger.mtl
│ │ │ │ │ ├── finger.obj
│ │ │ │ │ ├── hand.mtl
│ │ │ │ │ ├── hand.obj
│ │ │ │ │ ├── link1.mtl
│ │ │ │ │ ├── link1.obj
│ │ │ │ │ ├── link2.mtl
│ │ │ │ │ ├── link2.obj
│ │ │ │ │ ├── link3.mtl
│ │ │ │ │ ├── link3.obj
│ │ │ │ │ ├── link4.mtl
│ │ │ │ │ ├── link4.obj
│ │ │ │ │ ├── link5.mtl
│ │ │ │ │ ├── link5.obj
│ │ │ │ │ ├── link6.mtl
│ │ │ │ │ ├── link6.obj
│ │ │ │ │ └── visualShapeBench.json_0.json
│ │ │ │ ├── panda.urdf
│ │ │ │ ├── panda_nohand.urdf
│ │ │ │ ├── panda_slider_mobile.urdf
│ │ │ │ └── panda_suction.urdf
│ │ │ ├── plane/
│ │ │ │ ├── generate_checker.py
│ │ │ │ ├── plane.mtl
│ │ │ │ ├── plane.urdf
│ │ │ │ ├── plane100.obj
│ │ │ │ ├── plane100_light.obj
│ │ │ │ ├── plane_light.mtl
│ │ │ │ └── plane_light.urdf
│ │ │ ├── shadow_hand/
│ │ │ │ ├── meshes/
│ │ │ │ │ ├── collision/
│ │ │ │ │ │ ├── finger_distal.stl
│ │ │ │ │ │ ├── finger_middle.stl
│ │ │ │ │ │ ├── finger_proximal.stl
│ │ │ │ │ │ ├── forearm.stl
│ │ │ │ │ │ ├── knuckle.stl
│ │ │ │ │ │ ├── metacarpal.stl
│ │ │ │ │ │ ├── palm.stl
│ │ │ │ │ │ ├── thumb_distal.stl
│ │ │ │ │ │ ├── thumb_middle.stl
│ │ │ │ │ │ ├── thumb_proximal.stl
│ │ │ │ │ │ └── wrist.stl
│ │ │ │ │ └── visual/
│ │ │ │ │ ├── finger_distal.dae
│ │ │ │ │ ├── finger_middle.dae
│ │ │ │ │ ├── finger_proximal.dae
│ │ │ │ │ ├── forearm.dae
│ │ │ │ │ ├── knuckle.dae
│ │ │ │ │ ├── metacarpal.dae
│ │ │ │ │ ├── palm.dae
│ │ │ │ │ ├── thumb_distal.dae
│ │ │ │ │ ├── thumb_middle.dae
│ │ │ │ │ ├── thumb_proximal.dae
│ │ │ │ │ └── wrist.dae
│ │ │ │ └── shadow_hand.urdf
│ │ │ ├── simple/
│ │ │ │ ├── two_cube_prismatic.urdf
│ │ │ │ ├── two_cube_revolute.urdf
│ │ │ │ └── two_link_arm.urdf
│ │ │ └── wheel/
│ │ │ ├── fancy_wheel.obj
│ │ │ ├── fancy_wheel.urdf
│ │ │ ├── material.mtl
│ │ │ ├── wheel.obj
│ │ │ └── wheel.urdf
│ │ └── xml/
│ │ ├── ant.xml
│ │ ├── ant_grasp_ball.xml
│ │ ├── ant_grasp_body.xml
│ │ ├── ant_grasp_ground.xml
│ │ ├── cable.xml
│ │ ├── four_bar_linkage.xml
│ │ ├── four_bar_linkage_weld.xml
│ │ ├── franka_emika_panda/
│ │ │ ├── README.md
│ │ │ ├── assets/
│ │ │ │ ├── finger_0.obj
│ │ │ │ ├── finger_1.obj
│ │ │ │ ├── hand.stl
│ │ │ │ ├── hand_0.obj
│ │ │ │ ├── hand_1.obj
│ │ │ │ ├── hand_2.obj
│ │ │ │ ├── hand_3.obj
│ │ │ │ ├── hand_4.obj
│ │ │ │ ├── link0.stl
│ │ │ │ ├── link0_0.obj
│ │ │ │ ├── link0_1.obj
│ │ │ │ ├── link0_10.obj
│ │ │ │ ├── link0_11.obj
│ │ │ │ ├── link0_2.obj
│ │ │ │ ├── link0_3.obj
│ │ │ │ ├── link0_4.obj
│ │ │ │ ├── link0_5.obj
│ │ │ │ ├── link0_7.obj
│ │ │ │ ├── link0_8.obj
│ │ │ │ ├── link0_9.obj
│ │ │ │ ├── link1.obj
│ │ │ │ ├── link1.stl
│ │ │ │ ├── link2.obj
│ │ │ │ ├── link2.stl
│ │ │ │ ├── link3.stl
│ │ │ │ ├── link3_0.obj
│ │ │ │ ├── link3_1.obj
│ │ │ │ ├── link3_2.obj
│ │ │ │ ├── link3_3.obj
│ │ │ │ ├── link4.stl
│ │ │ │ ├── link4_0.obj
│ │ │ │ ├── link4_1.obj
│ │ │ │ ├── link4_2.obj
│ │ │ │ ├── link4_3.obj
│ │ │ │ ├── link5_0.obj
│ │ │ │ ├── link5_1.obj
│ │ │ │ ├── link5_2.obj
│ │ │ │ ├── link5_collision_0.obj
│ │ │ │ ├── link5_collision_1.obj
│ │ │ │ ├── link5_collision_2.obj
│ │ │ │ ├── link6.stl
│ │ │ │ ├── link6_0.obj
│ │ │ │ ├── link6_1.obj
│ │ │ │ ├── link6_10.obj
│ │ │ │ ├── link6_11.obj
│ │ │ │ ├── link6_12.obj
│ │ │ │ ├── link6_13.obj
│ │ │ │ ├── link6_14.obj
│ │ │ │ ├── link6_15.obj
│ │ │ │ ├── link6_16.obj
│ │ │ │ ├── link6_2.obj
│ │ │ │ ├── link6_3.obj
│ │ │ │ ├── link6_4.obj
│ │ │ │ ├── link6_5.obj
│ │ │ │ ├── link6_6.obj
│ │ │ │ ├── link6_7.obj
│ │ │ │ ├── link6_8.obj
│ │ │ │ ├── link6_9.obj
│ │ │ │ ├── link7.stl
│ │ │ │ ├── link7_0.obj
│ │ │ │ ├── link7_1.obj
│ │ │ │ ├── link7_2.obj
│ │ │ │ ├── link7_3.obj
│ │ │ │ ├── link7_4.obj
│ │ │ │ ├── link7_5.obj
│ │ │ │ ├── link7_6.obj
│ │ │ │ └── link7_7.obj
│ │ │ ├── hand.xml
│ │ │ ├── panda.xml
│ │ │ ├── panda_free_base.xml
│ │ │ ├── panda_no_tendon.xml
│ │ │ ├── panda_nohand.xml
│ │ │ ├── panda_non_overlap.xml
│ │ │ ├── scene.xml
│ │ │ └── scene_no_tendon.xml
│ │ ├── franka_sim/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── assets/
│ │ │ │ ├── actuator0.xml
│ │ │ │ ├── actuator0_0.xml
│ │ │ │ ├── actuator0_2.xml
│ │ │ │ ├── actuator1.xml
│ │ │ │ ├── assets.xml
│ │ │ │ ├── assets_0.xml
│ │ │ │ ├── assets_2.xml
│ │ │ │ ├── basic_scene.xml
│ │ │ │ ├── chain0.xml
│ │ │ │ ├── chain0_nogripper.xml
│ │ │ │ ├── chain0_overlay.xml
│ │ │ │ ├── chain1.xml
│ │ │ │ ├── gripper_actuator0.xml
│ │ │ │ ├── gripper_assets.xml
│ │ │ │ └── teleop_actuator.xml
│ │ │ ├── ball.xml
│ │ │ ├── bi-franka_panda.xml
│ │ │ ├── franka_panda.xml
│ │ │ ├── franka_panda_0.xml
│ │ │ ├── franka_panda_1.xml
│ │ │ ├── franka_panda_2.xml
│ │ │ ├── franka_panda_3.xml
│ │ │ ├── franka_panda_ball.xml
│ │ │ ├── franka_panda_ball_.xml
│ │ │ ├── franka_panda_no_finger.xml
│ │ │ ├── franka_panda_teleop.xml
│ │ │ ├── franka_panda_test_convex.xml
│ │ │ └── meshes/
│ │ │ ├── collision/
│ │ │ │ ├── finger.stl
│ │ │ │ ├── hand.stl
│ │ │ │ ├── link0.stl
│ │ │ │ ├── link1.stl
│ │ │ │ ├── link2.stl
│ │ │ │ ├── link3.stl
│ │ │ │ ├── link4.stl
│ │ │ │ ├── link5.stl
│ │ │ │ ├── link6.stl
│ │ │ │ └── link7.stl
│ │ │ └── visual/
│ │ │ ├── finger.stl
│ │ │ ├── hand.stl
│ │ │ ├── link0.stl
│ │ │ ├── link1.stl
│ │ │ ├── link2.stl
│ │ │ ├── link3.stl
│ │ │ ├── link3_dark.stl
│ │ │ ├── link4.stl
│ │ │ ├── link4_dark.stl
│ │ │ ├── link5.stl
│ │ │ ├── link5_dark.stl
│ │ │ ├── link6.stl
│ │ │ ├── link6_dark.stl
│ │ │ ├── link7.stl
│ │ │ └── link7_dark.stl
│ │ ├── humanoid.xml
│ │ ├── one_ball_joint.xml
│ │ ├── one_tet.xml
│ │ ├── rope_ball.xml
│ │ ├── rope_hinge.xml
│ │ ├── tet.obj
│ │ ├── tet_ball.xml
│ │ ├── tet_capsule.xml
│ │ ├── tet_tet.xml
│ │ ├── thin_box.xml
│ │ ├── thin_box_mesh.xml
│ │ ├── thin_cube.obj
│ │ ├── three_joint_link.xml
│ │ ├── two_box.xml
│ │ ├── two_skeleton.xml
│ │ ├── universal_robots_ur5e/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── assets/
│ │ │ │ ├── base_0.obj
│ │ │ │ ├── base_1.obj
│ │ │ │ ├── forearm_0.obj
│ │ │ │ ├── forearm_1.obj
│ │ │ │ ├── forearm_2.obj
│ │ │ │ ├── forearm_3.obj
│ │ │ │ ├── shoulder_0.obj
│ │ │ │ ├── shoulder_1.obj
│ │ │ │ ├── shoulder_2.obj
│ │ │ │ ├── upperarm_0.obj
│ │ │ │ ├── upperarm_1.obj
│ │ │ │ ├── upperarm_2.obj
│ │ │ │ ├── upperarm_3.obj
│ │ │ │ ├── wrist1_0.obj
│ │ │ │ ├── wrist1_1.obj
│ │ │ │ ├── wrist1_2.obj
│ │ │ │ ├── wrist2_0.obj
│ │ │ │ ├── wrist2_1.obj
│ │ │ │ ├── wrist2_2.obj
│ │ │ │ └── wrist3.obj
│ │ │ ├── scene.xml
│ │ │ └── ur5e.xml
│ │ └── walker.xml
│ ├── constants.py
│ ├── datatypes.py
│ ├── engine/
│ │ ├── __init__.py
│ │ ├── boundaries/
│ │ │ ├── __init__.py
│ │ │ └── boundaries.py
│ │ ├── bvh.py
│ │ ├── couplers/
│ │ │ ├── __init__.py
│ │ │ ├── ipc_coupler/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── coupler.py
│ │ │ │ ├── data.py
│ │ │ │ └── utils.py
│ │ │ ├── legacy_coupler.py
│ │ │ └── sap_coupler.py
│ │ ├── entities/
│ │ │ ├── __init__.py
│ │ │ ├── base_entity.py
│ │ │ ├── drone_entity.py
│ │ │ ├── emitter.py
│ │ │ ├── fem_entity.py
│ │ │ ├── hybrid_entity.py
│ │ │ ├── mpm_entity.py
│ │ │ ├── particle_entity.py
│ │ │ ├── pbd_entity.py
│ │ │ ├── rigid_entity/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── rigid_entity.py
│ │ │ │ ├── rigid_equality.py
│ │ │ │ ├── rigid_geom.py
│ │ │ │ ├── rigid_joint.py
│ │ │ │ └── rigid_link.py
│ │ │ ├── sf_entity.py
│ │ │ ├── sph_entity.py
│ │ │ └── tool_entity/
│ │ │ ├── __init__.py
│ │ │ ├── mesh.py
│ │ │ └── tool_entity.py
│ │ ├── force_fields.py
│ │ ├── materials/
│ │ │ ├── FEM/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── cloth.py
│ │ │ │ ├── elastic.py
│ │ │ │ └── muscle.py
│ │ │ ├── MPM/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── elastic.py
│ │ │ │ ├── elasto_plastic.py
│ │ │ │ ├── liquid.py
│ │ │ │ ├── muscle.py
│ │ │ │ ├── sand.py
│ │ │ │ └── snow.py
│ │ │ ├── PBD/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── cloth.py
│ │ │ │ ├── elastic.py
│ │ │ │ ├── liquid.py
│ │ │ │ └── particle.py
│ │ │ ├── SF/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ └── smoke.py
│ │ │ ├── SPH/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ └── liquid.py
│ │ │ ├── __init__.py
│ │ │ ├── base.py
│ │ │ ├── hybrid.py
│ │ │ ├── kinematic.py
│ │ │ ├── rigid.py
│ │ │ └── tool.py
│ │ ├── mesh.py
│ │ ├── scene.py
│ │ ├── sensors/
│ │ │ ├── __init__.py
│ │ │ ├── base_sensor.py
│ │ │ ├── camera.py
│ │ │ ├── contact_force.py
│ │ │ ├── depth_camera.py
│ │ │ ├── imu.py
│ │ │ ├── kinematic_tactile.py
│ │ │ ├── proximity.py
│ │ │ ├── raycaster.py
│ │ │ ├── sensor_manager.py
│ │ │ └── temperature.py
│ │ ├── simulator.py
│ │ ├── solvers/
│ │ │ ├── __init__.py
│ │ │ ├── base_solver.py
│ │ │ ├── fem_solver.py
│ │ │ ├── kinematic_solver.py
│ │ │ ├── mpm_solver.py
│ │ │ ├── pbd_solver.py
│ │ │ ├── rigid/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── abd/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── accessor.py
│ │ │ │ │ ├── diff.py
│ │ │ │ │ ├── forward_dynamics.py
│ │ │ │ │ ├── forward_kinematics.py
│ │ │ │ │ ├── inverse_kinematics.py
│ │ │ │ │ └── misc.py
│ │ │ │ ├── collider/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── box_contact.py
│ │ │ │ │ ├── broadphase.py
│ │ │ │ │ ├── capsule_contact.py
│ │ │ │ │ ├── collider.py
│ │ │ │ │ ├── constants.py
│ │ │ │ │ ├── contact.py
│ │ │ │ │ ├── contact_island.py
│ │ │ │ │ ├── diff_gjk.py
│ │ │ │ │ ├── epa.py
│ │ │ │ │ ├── gjk.py
│ │ │ │ │ ├── gjk_support.py
│ │ │ │ │ ├── gjk_utils.py
│ │ │ │ │ ├── mpr.py
│ │ │ │ │ ├── multi_contact.py
│ │ │ │ │ ├── narrowphase.py
│ │ │ │ │ ├── support_field.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── constraint/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── backward.py
│ │ │ │ │ ├── noslip.py
│ │ │ │ │ ├── solver.py
│ │ │ │ │ ├── solver_breakdown.py
│ │ │ │ │ └── solver_island.py
│ │ │ │ └── rigid_solver.py
│ │ │ ├── sf_solver.py
│ │ │ ├── sph_solver.py
│ │ │ └── tool_solver.py
│ │ └── states/
│ │ ├── __init__.py
│ │ ├── cache.py
│ │ ├── entities.py
│ │ └── solvers.py
│ ├── ext/
│ │ ├── VolumeSampling
│ │ ├── _trimesh_patch.py
│ │ ├── isaacgym/
│ │ │ └── terrain_utils.py
│ │ ├── pyrender/
│ │ │ ├── __init__.py
│ │ │ ├── camera.py
│ │ │ ├── constants.py
│ │ │ ├── font.py
│ │ │ ├── jit_render.py
│ │ │ ├── light.py
│ │ │ ├── material.py
│ │ │ ├── mesh.py
│ │ │ ├── node.py
│ │ │ ├── numba_gl_wrapper.py
│ │ │ ├── offscreen.py
│ │ │ ├── platforms/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── egl.py
│ │ │ │ ├── osmesa.py
│ │ │ │ └── pyglet_platform.py
│ │ │ ├── primitive.py
│ │ │ ├── renderer.py
│ │ │ ├── sampler.py
│ │ │ ├── scene.py
│ │ │ ├── shader_program.py
│ │ │ ├── shaders/
│ │ │ │ ├── debug_quad.frag
│ │ │ │ ├── debug_quad.vert
│ │ │ │ ├── flat.frag
│ │ │ │ ├── flat.vert
│ │ │ │ ├── mesh.frag
│ │ │ │ ├── mesh.vert
│ │ │ │ ├── mesh_depth.frag
│ │ │ │ ├── mesh_depth.vert
│ │ │ │ ├── mesh_double_sided.geom
│ │ │ │ ├── mesh_normal.frag
│ │ │ │ ├── mesh_normal.vert
│ │ │ │ ├── point_shadow.frag
│ │ │ │ ├── point_shadow.geom
│ │ │ │ ├── point_shadow.vert
│ │ │ │ ├── segmentation.frag
│ │ │ │ ├── segmentation.vert
│ │ │ │ ├── segmentation_double_sided.geom
│ │ │ │ ├── text.frag
│ │ │ │ ├── text.vert
│ │ │ │ ├── vertex_normals.frag
│ │ │ │ ├── vertex_normals.geom
│ │ │ │ ├── vertex_normals.vert
│ │ │ │ └── vertex_normals_pc.geom
│ │ │ ├── texture.py
│ │ │ ├── trackball.py
│ │ │ ├── utils.py
│ │ │ ├── version.py
│ │ │ └── viewer.py
│ │ └── urdfpy/
│ │ ├── __init__.py
│ │ ├── urdf.py
│ │ ├── utils.py
│ │ └── version.py
│ ├── grad/
│ │ ├── __init__.py
│ │ ├── creation_ops.py
│ │ └── tensor.py
│ ├── logging/
│ │ ├── __init__.py
│ │ ├── logger.py
│ │ └── time_elapser.py
│ ├── options/
│ │ ├── __init__.py
│ │ ├── misc.py
│ │ ├── morphs.py
│ │ ├── options.py
│ │ ├── profiling.py
│ │ ├── recorders.py
│ │ ├── renderers.py
│ │ ├── sensors/
│ │ │ ├── __init__.py
│ │ │ ├── camera.py
│ │ │ ├── options.py
│ │ │ ├── raycaster.py
│ │ │ └── tactile.py
│ │ ├── solvers.py
│ │ ├── surfaces.py
│ │ ├── textures.py
│ │ └── vis.py
│ ├── recorders/
│ │ ├── __init__.py
│ │ ├── base_recorder.py
│ │ ├── file_writers.py
│ │ ├── plotters.py
│ │ └── recorder_manager.py
│ ├── repr_base.py
│ ├── styles.py
│ ├── typing.py
│ ├── utils/
│ │ ├── __init__.py
│ │ ├── array_class.py
│ │ ├── deprecated_module_wrapper.py
│ │ ├── element.py
│ │ ├── emoji.py
│ │ ├── generate_env_sphere.py
│ │ ├── geom.py
│ │ ├── gltf.py
│ │ ├── hybrid.py
│ │ ├── image_exporter.py
│ │ ├── linalg.py
│ │ ├── mesh.py
│ │ ├── misc.py
│ │ ├── mjcf.py
│ │ ├── particle.py
│ │ ├── path_planning.py
│ │ ├── raycast.py
│ │ ├── raycast_qd.py
│ │ ├── repr.py
│ │ ├── ring_buffer.py
│ │ ├── sdf.py
│ │ ├── terrain.py
│ │ ├── tools.py
│ │ ├── uid.py
│ │ ├── urdf.py
│ │ ├── usd/
│ │ │ ├── UsdParserSpec.md
│ │ │ ├── __init__.py
│ │ │ ├── usd_bake.py
│ │ │ ├── usd_context.py
│ │ │ ├── usd_geometry.py
│ │ │ ├── usd_material.py
│ │ │ ├── usd_rigid_entity.py
│ │ │ ├── usd_stage.py
│ │ │ └── usd_utils.py
│ │ └── warnings.py
│ ├── version.py
│ └── vis/
│ ├── __init__.py
│ ├── batch_renderer.py
│ ├── camera.py
│ ├── keybindings.py
│ ├── rasterizer.py
│ ├── rasterizer_context.py
│ ├── raytracer.py
│ ├── viewer.py
│ ├── viewer_plugins/
│ │ ├── __init__.py
│ │ ├── plugins/
│ │ │ ├── __init__.py
│ │ │ ├── default_controls.py
│ │ │ └── mouse_interaction.py
│ │ └── viewer_plugin.py
│ └── visualizer.py
├── pyproject.toml
└── tests/
├── __init__.py
├── conftest.py
├── monitor_test_mem.py
├── run_benchmarks.py
├── test_bvh.py
├── test_deformable_physics.py
├── test_examples.py
├── test_fem.py
├── test_grad.py
├── test_hybrid.py
├── test_integration.py
├── test_ipc.py
├── test_kinematic.py
├── test_mesh.py
├── test_misc.py
├── test_pbd.py
├── test_quadrants.py
├── test_recorders.py
├── test_render.py
├── test_rigid_benchmarks.py
├── test_rigid_physics.py
├── test_rigid_physics_analytical_vs_gjk.py
├── test_sensor_camera.py
├── test_sensors.py
├── test_sph.py
├── test_usd.py
├── test_utils.py
├── test_viewer.py
├── upload_benchmarks_table_to_wandb.py
└── utils.py
SYMBOL INDEX (277 symbols across 97 files)
FILE: .github/workflows/scripts/alarm.py
function config_params_str_to_fdict (line 48) | def config_params_str_to_fdict(config_params_str: str) -> frozendict[str...
function merge_string_tuples (line 67) | def merge_string_tuples(tuples: tuple[tuple[str, ...], ...]) -> tuple[st...
class SortKey (line 83) | class SortKey:
method __init__ (line 84) | def __init__(self, config_param_names: Iterable[str]) -> None:
method __call__ (line 87) | def __call__(self, d: frozendict[str, Any]) -> list[tuple[int, int | f...
function parse_results_file (line 112) | def parse_results_file(
function fmt_num (line 158) | def fmt_num(v, is_int: bool):
class WandbParser (line 169) | class WandbParser:
method project (line 171) | def project(self):
method __call__ (line 174) | def __call__(
class WandbParserNewFormat (line 185) | class WandbParserNewFormat(WandbParser):
method project (line 187) | def project(self):
method __call__ (line 190) | def __call__(
class BenchmarkRunUnderTest (line 206) | class BenchmarkRunUnderTest:
method __init__ (line 213) | def __init__(self, artifacts_dir: Path, metric_keys: Iterable[str], fi...
class Alarm (line 240) | class Alarm:
method __init__ (line 241) | def __init__(self, args: argparse.Namespace) -> None:
method fetch_wandb_data (line 281) | def fetch_wandb_data(
method build_table (line 353) | def build_table(
FILE: examples/IPC_Solver/ipc_momentum.py
function main (line 11) | def main():
FILE: examples/IPC_Solver/ipc_objects_falling.py
function main (line 16) | def main():
FILE: examples/IPC_Solver/ipc_robot_cloth_teleop.py
function main (line 31) | def main():
FILE: examples/IPC_Solver/ipc_robot_grasp_cube.py
function main (line 7) | def main():
FILE: examples/collision/contype.py
function main (line 16) | def main():
FILE: examples/collision/pyramid.py
function main (line 6) | def main():
FILE: examples/collision/tower.py
function main (line 7) | def main():
FILE: examples/coupling/cloth_attached_to_rigid.py
function main (line 10) | def main():
FILE: examples/coupling/cloth_on_rigid.py
function main (line 7) | def main():
FILE: examples/coupling/cut_dragon.py
function main (line 6) | def main():
FILE: examples/coupling/fem_cube_linked_with_arm.py
function main (line 10) | def main():
FILE: examples/coupling/flush_cubes.py
function main (line 7) | def main():
FILE: examples/coupling/grasp_soft_cube.py
function main (line 8) | def main():
FILE: examples/coupling/rigid_mpm_attachment.py
function main (line 15) | def main():
FILE: examples/coupling/sand_wheel.py
function main (line 9) | def main():
FILE: examples/coupling/sph_mpm.py
function main (line 7) | def main():
FILE: examples/coupling/sph_rigid.py
function main (line 7) | def main():
FILE: examples/coupling/water_wheel.py
function main (line 9) | def main():
FILE: examples/ddp_multi_gpu.py
class TinyMLP (line 23) | class TinyMLP(nn.Module):
method __init__ (line 24) | def __init__(self, obs_dim: int, act_dim: int) -> None:
method forward (line 32) | def forward(self, x):
function run_worker (line 36) | def run_worker(args: argparse.Namespace) -> None:
function parse_args (line 101) | def parse_args():
FILE: examples/differentiable_push.py
function main (line 9) | def main():
FILE: examples/drone/fly.py
function main (line 8) | def main():
FILE: examples/drone/fly_route.py
function hover (line 18) | def hover(drone: "DroneEntity"):
function clamp (line 22) | def clamp(rpm):
function fly_to_point (line 26) | def fly_to_point(target, controller: "DronePIDController", scene: gs.Sce...
function main (line 58) | def main():
FILE: examples/drone/hover_env.py
function gs_rand_float (line 13) | def gs_rand_float(lower, upper, shape, device):
class HoverEnv (line 17) | class HoverEnv:
method __init__ (line 18) | def __init__(self, num_envs, env_cfg, obs_cfg, reward_cfg, command_cfg...
method _resample_commands (line 124) | def _resample_commands(self, envs_idx):
method _at_target (line 129) | def _at_target(self):
method step (line 136) | def step(self, actions):
method get_observations (line 206) | def get_observations(self):
method get_privileged_observations (line 210) | def get_privileged_observations(self):
method reset_idx (line 213) | def reset_idx(self, envs_idx):
method reset (line 244) | def reset(self):
method _reward_target (line 250) | def _reward_target(self):
method _reward_smooth (line 254) | def _reward_smooth(self):
method _reward_yaw (line 258) | def _reward_yaw(self):
method _reward_angular (line 264) | def _reward_angular(self):
method _reward_crash (line 268) | def _reward_crash(self):
FILE: examples/drone/hover_eval.py
function main (line 24) | def main():
FILE: examples/drone/hover_train.py
function get_train_cfg (line 23) | def get_train_cfg(exp_name, max_iterations):
function get_cfgs (line 69) | def get_cfgs():
function main (line 120) | def main():
FILE: examples/drone/interactive_drone.py
class DroneController (line 9) | class DroneController:
method __init__ (line 10) | def __init__(self):
method update_rpms (line 16) | def update_rpms(self):
method add_direction (line 22) | def add_direction(self, direction: np.ndarray):
method accelerate (line 26) | def accelerate(self):
method decelerate (line 30) | def decelerate(self):
function main (line 35) | def main():
FILE: examples/drone/quadcopter_controller.py
class PIDController (line 12) | class PIDController:
method __init__ (line 13) | def __init__(self, kp, ki, kd):
method update (line 20) | def update(self, error, dt):
class DronePIDController (line 28) | class DronePIDController:
method __init__ (line 29) | def __init__(self, drone: "DroneEntity", dt, base_rpm, pid_params):
method __get_drone_pos (line 46) | def __get_drone_pos(self) -> torch.Tensor:
method __get_drone_vel (line 49) | def __get_drone_vel(self) -> torch.Tensor:
method __get_drone_att (line 52) | def __get_drone_att(self) -> torch.Tensor:
method __mixer (line 56) | def __mixer(self, thrust, roll, pitch, yaw, x_vel, y_vel) -> torch.Ten...
method update (line 63) | def update(self, target) -> np.ndarray:
FILE: examples/elastic_dragon.py
function main (line 8) | def main():
FILE: examples/fem_hard_and_soft_constraint.py
function main (line 13) | def main():
FILE: examples/hibernation.py
function run_simulation (line 24) | def run_simulation(use_hibernation: bool, n_boxes: int, n_steps: int, sh...
function main (line 73) | def main():
FILE: examples/keyboard_teleop.py
function reset_robot (line 109) | def reset_robot():
function move (line 126) | def move(dpos: tuple[float, float, float]):
function rotate (line 129) | def rotate(drot: float):
function toggle_gripper (line 133) | def toggle_gripper(close: bool = True):
function stop (line 139) | def stop():
FILE: examples/kinematic/go2_kinematic.py
function main (line 21) | def main():
FILE: examples/locomotion/go2_backflip.py
function get_cfgs (line 9) | def get_cfgs():
class BackflipEnv (line 78) | class BackflipEnv(Go2Env):
method get_observations (line 79) | def get_observations(self):
method step (line 101) | def step(self, actions):
function main (line 107) | def main():
FILE: examples/locomotion/go2_env.py
function gs_rand (line 9) | def gs_rand(lower, upper, batch_shape):
class Go2Env (line 14) | class Go2Env:
method __init__ (line 15) | def __init__(self, num_envs, env_cfg, obs_cfg, reward_cfg, command_cfg...
method _resample_commands (line 149) | def _resample_commands(self, envs_idx):
method step (line 156) | def step(self, actions):
method get_observations (line 208) | def get_observations(self):
method get_privileged_observations (line 212) | def get_privileged_observations(self):
method _reset_idx (line 215) | def _reset_idx(self, envs_idx=None):
method _update_observation (line 265) | def _update_observation(self):
method reset (line 278) | def reset(self):
method _reward_tracking_lin_vel (line 284) | def _reward_tracking_lin_vel(self):
method _reward_tracking_ang_vel (line 289) | def _reward_tracking_ang_vel(self):
method _reward_lin_vel_z (line 294) | def _reward_lin_vel_z(self):
method _reward_action_rate (line 298) | def _reward_action_rate(self):
method _reward_similar_to_default (line 302) | def _reward_similar_to_default(self):
method _reward_base_height (line 306) | def _reward_base_height(self):
FILE: examples/locomotion/go2_eval.py
function main (line 24) | def main():
FILE: examples/locomotion/go2_train.py
function get_train_cfg (line 23) | def get_train_cfg(exp_name, max_iterations):
function get_cfgs (line 69) | def get_cfgs():
function main (line 148) | def main():
FILE: examples/manipulation/behavior_cloning.py
class BehaviorCloning (line 13) | class BehaviorCloning:
method __init__ (line 16) | def __init__(self, env, cfg: dict, teacher: nn.Module, device: str = "...
method learn (line 47) | def learn(self, num_learning_iterations: int, log_dir: str) -> None:
method _compute_pose_loss (line 139) | def _compute_pose_loss(self, pred_poses: torch.Tensor, target_poses: t...
method _collect_with_rl_teacher (line 164) | def _collect_with_rl_teacher(self) -> None:
method save (line 208) | def save(self, path: str) -> None:
method load (line 219) | def load(self, path: str) -> None:
method load_finetuned_model (line 227) | def load_finetuned_model(self, path: str) -> None:
class ExperienceBuffer (line 236) | class ExperienceBuffer:
method __init__ (line 239) | def __init__(
method add (line 264) | def add(
method get_batches (line 279) | def get_batches(self, num_mini_batches: int, num_epochs: int) -> Itera...
method clear (line 296) | def clear(self) -> None:
method is_full (line 305) | def is_full(self) -> bool:
method size (line 310) | def size(self) -> int:
class Policy (line 315) | class Policy(nn.Module):
method __init__ (line 318) | def __init__(self, config: dict, action_dim: int):
method dtype (line 351) | def dtype(self):
method _build_cnn (line 356) | def _build_cnn(config: dict) -> nn.Sequential:
method _build_mlp (line 383) | def _build_mlp(config: dict) -> nn.Sequential:
method get_features (line 392) | def get_features(self, rgb_obs: torch.Tensor) -> tuple[torch.Tensor, t...
method forward (line 402) | def forward(self, rgb_obs: torch.Tensor, state_obs: torch.Tensor | Non...
method predict_pose (line 421) | def predict_pose(self, rgb_obs: torch.Tensor) -> torch.Tensor:
FILE: examples/manipulation/grasp_env.py
class GraspEnv (line 13) | class GraspEnv:
method __init__ (line 14) | def __init__(
method _init_buffers (line 130) | def _init_buffers(self) -> None:
method reset_idx (line 137) | def reset_idx(self, envs_idx: torch.Tensor) -> None:
method reset (line 179) | def reset(self) -> tuple[torch.Tensor, dict]:
method step (line 186) | def step(self, actions: torch.Tensor) -> tuple[torch.Tensor, torch.Ten...
method get_privileged_observations (line 213) | def get_privileged_observations(self) -> None:
method is_episode_complete (line 216) | def is_episode_complete(self) -> torch.Tensor:
method get_observations (line 228) | def get_observations(self) -> tuple[torch.Tensor, dict]:
method rescale_action (line 246) | def rescale_action(self, action: torch.Tensor) -> torch.Tensor:
method get_stereo_rgb_images (line 250) | def get_stereo_rgb_images(self, normalize: bool = True) -> torch.Tensor:
method _reward_keypoints (line 269) | def _reward_keypoints(self) -> torch.Tensor:
method _to_world_frame (line 288) | def _to_world_frame(
method get_keypoint_offsets (line 300) | def get_keypoint_offsets(batch_size: int, device: str, unit_length: fl...
method grasp_and_lift_demo (line 322) | def grasp_and_lift_demo(self) -> None:
class Manipulator (line 349) | class Manipulator:
method __init__ (line 350) | def __init__(self, num_envs: int, scene: gs.Scene, args: dict, device:...
method set_pd_gains (line 374) | def set_pd_gains(self):
method _init (line 390) | def _init(self):
method reset (line 409) | def reset(self, envs_idx: torch.IntTensor):
method reset_home (line 414) | def reset_home(self, envs_idx: torch.IntTensor | None = None):
method apply_action (line 422) | def apply_action(self, action: torch.Tensor, open_gripper: bool) -> None:
method _gs_ik (line 440) | def _gs_ik(self, action: torch.Tensor) -> torch.Tensor:
method _dls_ik (line 459) | def _dls_ik(self, action: torch.Tensor) -> torch.Tensor:
method go_to_goal (line 473) | def go_to_goal(self, goal_pose: torch.Tensor, open_gripper: bool = True):
method base_pos (line 487) | def base_pos(self):
method ee_pose (line 491) | def ee_pose(self) -> torch.Tensor:
method left_finger_pose (line 499) | def left_finger_pose(self) -> torch.Tensor:
method right_finger_pose (line 504) | def right_finger_pose(self) -> torch.Tensor:
method center_finger_pose (line 512) | def center_finger_pose(self) -> torch.Tensor:
FILE: examples/manipulation/grasp_eval.py
function load_rl_policy (line 26) | def load_rl_policy(env, train_cfg, log_dir):
function load_bc_policy (line 45) | def load_bc_policy(env, bc_cfg, log_dir):
function main (line 65) | def main():
FILE: examples/manipulation/grasp_train.py
function get_train_cfg (line 25) | def get_train_cfg(exp_name, max_iterations):
function get_task_cfgs (line 123) | def get_task_cfgs():
function load_teacher_policy (line 152) | def load_teacher_policy(env, rl_train_cfg, exp_name):
function main (line 169) | def main():
FILE: examples/pbd_liquid.py
function main (line 8) | def main():
FILE: examples/render_async.py
function run_sim (line 7) | def run_sim(scene):
function main (line 14) | def main():
FILE: examples/rendering/demo.py
function main (line 4) | def main():
FILE: examples/rendering/follow_entity.py
function main (line 6) | def main():
FILE: examples/rendering/moving_camera.py
function main (line 6) | def main():
FILE: examples/rendering/speed_test.py
function main (line 6) | def main():
FILE: examples/rigid/accelerometer_duck.py
function main (line 6) | def main():
FILE: examples/rigid/accelerometer_franka.py
function main (line 5) | def main():
FILE: examples/rigid/apply_external_force_torque.py
function main (line 5) | def main():
FILE: examples/rigid/closed_loop.py
function main_equality_connect (line 6) | def main_equality_connect(args):
function main_equality_weld (line 27) | def main_equality_weld(args):
FILE: examples/rigid/control_franka.py
function main (line 8) | def main():
FILE: examples/rigid/control_mesh.py
function main (line 6) | def main():
FILE: examples/rigid/convex_decomposition.py
function main (line 9) | def main():
FILE: examples/rigid/diffik_controller.py
function main (line 13) | def main():
FILE: examples/rigid/domain_randomization.py
function main (line 9) | def main():
FILE: examples/rigid/franka_cube.py
function main (line 7) | def main():
FILE: examples/rigid/grasp_bottle.py
function main (line 8) | def main():
FILE: examples/rigid/gravity_compensation.py
function main (line 6) | def main():
FILE: examples/rigid/heterogeneous_simulation.py
function main (line 39) | def main():
FILE: examples/rigid/ik_custom_chain.py
function main (line 8) | def main():
FILE: examples/rigid/ik_duck.py
function main (line 8) | def main():
FILE: examples/rigid/ik_franka.py
function main (line 8) | def main():
FILE: examples/rigid/ik_franka_batched.py
function main (line 8) | def main():
FILE: examples/rigid/ik_shadow_hand.py
function main (line 8) | def main():
FILE: examples/rigid/merge_entities.py
function main (line 14) | def main():
FILE: examples/rigid/multi_gpu.py
function main (line 10) | def main():
function run (line 47) | def run(gpu_id, func):
FILE: examples/rigid/nonconvex_mesh.py
function main (line 6) | def main():
FILE: examples/rigid/set_phys_attr.py
function main (line 8) | def main():
FILE: examples/rigid/single_franka.py
function main (line 6) | def main():
FILE: examples/rigid/single_franka_batch_render.py
function main (line 9) | def main():
FILE: examples/rigid/single_franka_envs.py
function main (line 6) | def main():
FILE: examples/rigid/suction_cup.py
function main (line 6) | def main():
FILE: examples/rigid/terrain_from_mesh.py
function main (line 9) | def main():
FILE: examples/rigid/terrain_height_field.py
function main (line 9) | def main():
FILE: examples/rigid/terrain_subterrain.py
function main (line 8) | def main():
FILE: examples/sap_coupling/fem_fixed_constraint.py
function main (line 11) | def main():
FILE: examples/sap_coupling/fem_sphere_and_cube.py
function main (line 8) | def main():
FILE: examples/sap_coupling/franka_grasp_fem_sphere.py
function main (line 8) | def main():
FILE: examples/sap_coupling/franka_grasp_rigid_cube.py
function main (line 7) | def main():
FILE: examples/sensors/contact_force_go2.py
function main (line 10) | def main():
FILE: examples/sensors/imu_franka.py
function main (line 11) | def main():
FILE: examples/sensors/kinematic_contact_sandbox.py
function _build_probe_grid (line 33) | def _build_probe_grid(grid_n: int, platform_size: float, platform_height...
function main (line 49) | def main():
FILE: examples/sensors/lidar_teleop.py
function main (line 21) | def main():
FILE: examples/sensors/proximity_shadowhand.py
function main (line 32) | def main():
FILE: examples/sensors/tactile_elastomer_franka.py
function move (line 147) | def move(dpos_xyz: tuple[float, float, float]):
function rotate (line 150) | def rotate(drot: float):
function toggle_gripper (line 154) | def toggle_gripper(close: bool):
function reset_robot (line 158) | def reset_robot():
function stop (line 174) | def stop():
FILE: examples/sensors/tactile_elastomer_sandbox.py
function main (line 39) | def main():
FILE: examples/sensors/temperature_grid.py
function main (line 36) | def main():
FILE: examples/smoke.py
class Jet (line 14) | class Jet(object):
method __init__ (line 15) | def __init__(
method get_pos (line 40) | def get_pos(self, t: float):
method get_factor (line 47) | def get_factor(self, i: int, j: int, k: int, dx: float, t: float):
method get_inward_dir (line 65) | def get_inward_dir(self, t: float):
method get_tan_dir (line 70) | def get_tan_dir(self, t: float):
function main (line 76) | def main():
FILE: examples/tutorials/draw_debug.py
function main (line 7) | def main():
FILE: examples/tutorials/entity_name.py
function main (line 16) | def main():
FILE: examples/tutorials/position_control_comparison.py
function main (line 13) | def main():
FILE: examples/usd/import_stage.py
class JointAnimator (line 12) | class JointAnimator:
method __init__ (line 19) | def __init__(self, scene: gs.Scene):
method animate (line 33) | def animate(self, scene: gs.Scene):
function main (line 40) | def main():
FILE: examples/viewer_plugin/mesh_point_selector.py
class SelectedPoint (line 20) | class SelectedPoint(NamedTuple):
class MeshPointSelectorPlugin (line 39) | class MeshPointSelectorPlugin(RaycasterViewerPlugin):
method __init__ (line 45) | def __init__(
method build (line 63) | def build(self, viewer, camera: "Node", scene: "Scene"):
method _get_pos_hash (line 67) | def _get_pos_hash(self, pos: np.ndarray) -> int:
method _snap_to_grid (line 83) | def _snap_to_grid(self, point: np.ndarray) -> np.ndarray:
method on_mouse_motion (line 102) | def on_mouse_motion(self, x: int, y: int, dx: int, dy: int) -> EVENT_H...
method on_mouse_press (line 106) | def on_mouse_press(self, x: int, y: int, button: int, modifiers: int) ...
method on_draw (line 138) | def on_draw(self) -> None:
method on_close (line 181) | def on_close(self) -> None:
function stop (line 272) | def stop():
FILE: examples/viewer_plugin/mouse_interaction.py
function stop (line 58) | def stop():
FILE: genesis/__init__.py
function init (line 57) | def init(
function destroy (line 368) | def destroy():
function register_external_module (line 432) | def register_external_module(init_fun: Callable[[], None], destroy_fun: ...
function unregister_external_module (line 441) | def unregister_external_module(init_fun: Callable[[], None], destroy_fun...
class GenesisException (line 449) | class GenesisException(Exception):
function _custom_excepthook (line 453) | def _custom_excepthook(exctype, value, tb):
FILE: genesis/_main.py
class JointControlGUI (line 17) | class JointControlGUI:
method __init__ (line 18) | def __init__(self, master, display_items, motors_position_limit, motor...
method create_widgets (line 33) | def create_widgets(self):
method update_joint_position (line 145) | def update_joint_position(self, idx, val):
method reset_motors_position (line 148) | def reset_motors_position(self):
function get_motors_info (line 155) | def get_motors_info(robot):
function get_motors_info_for_view (line 174) | def get_motors_info_for_view(entities):
function _start_gui (line 203) | def _start_gui(display_items, motors_position_limit, motors_position, st...
function view (line 239) | def view(filename, collision, rotate, scale=1.0, show_link_frame=False):
function animate (line 341) | def animate(filename_pattern, fps):
function main (line 355) | def main():
Copy disabled (too large)
Download .json
Condensed preview — 854 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (22,642K chars).
[
{
"path": ".gitattributes",
"chars": 270,
"preview": "# Force LF line endings for shell scripts\n*.sh text eol=lf\n\n# Force LF line endings for configuration files\n*.yml text e"
},
{
"path": ".github/CODEOWNERS",
"chars": 45,
"preview": "* @Genesis-Embodied-AI @YilingQiao @duburcqa\n"
},
{
"path": ".github/ISSUE_TEMPLATE/1-bug-report.yml",
"chars": 3584,
"preview": "name: \"🐛 Bug report\"\ndescription: Report errors or unexpected behavior\ntitle: \"[Bug]: \"\nlabels: [\"bug\", \"triage-needed\"]"
},
{
"path": ".github/ISSUE_TEMPLATE/2-feature-request.yml",
"chars": 1899,
"preview": "name: \"🚀 Feature Request\"\ndescription: Sugest a new feature request or improvement on the project\ntitle: '[Feature]: '\nl"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 371,
"preview": "blank_issues_enabled: false\ncontact_links:\n- name: \"💬 Support & Questions - Github Community Support\"\n url: https://git"
},
{
"path": ".github/contributing/ARCHITECTURE.md",
"chars": 3810,
"preview": "# Genesis Architecture\n\n## Project Structure\n\n```\nGenesis/\n├── genesis/ # Main source code\n│ ├── __"
},
{
"path": ".github/contributing/CODING_CONVENTIONS.md",
"chars": 2497,
"preview": "# Coding Conventions\n\n## Import Pattern\n\n```python\nimport genesis as gs\nimport genesis.utils.geom as gu\nimport numpy as "
},
{
"path": ".github/contributing/EXAMPLES.md",
"chars": 1475,
"preview": "# Examples Reference\n\nLocation: `examples/` (105 files total)\n\n## Running Examples\n\n```bash\nuv run examples/tutorials/he"
},
{
"path": ".github/contributing/PULL_REQUESTS.md",
"chars": 2676,
"preview": "# Contributing to Genesis\n\nThank you for your interest in contributing to Genesis! We welcome contributions from everyon"
},
{
"path": ".github/contributing/TESTING.md",
"chars": 2212,
"preview": "# Testing Guide\n\n## Environment Setup\n\nUse `uv` for running tests:\n\n```bash\n# Setup environment (if not already done)\nuv"
},
{
"path": ".github/contributing/USD_PARSER.md",
"chars": 3287,
"preview": "---\ndescription: Rules and guidelines for developing and fixing the USD parser in Genesis\n---\n\n# USD Parser Rules\n\n## Ov"
},
{
"path": ".github/pull_request_template.md",
"chars": 2475,
"preview": "<!-- Thanks for sending a pull request! Please:\n\n1. Follow our contributor guidelines:\n https://github.com/Genesis-E"
},
{
"path": ".github/workflows/alarm.yml",
"chars": 7321,
"preview": "name: Benchmark Comparison & Alarm Regression\n\non:\n workflow_run:\n workflows: [\"Production\"]\n types: [completed]\n"
},
{
"path": ".github/workflows/examples.yml",
"chars": 2373,
"preview": "name: Examples (CPU)\n\non:\n pull_request:\n branches:\n - main\n\nconcurrency:\n group: ${{ github.workflow }}-${{ g"
},
{
"path": ".github/workflows/format.yml",
"chars": 535,
"preview": "name: Precommit Checks (Lint and Format)\n\non:\n pull_request:\n branches:\n - main\n\nconcurrency:\n group: ${{ gith"
},
{
"path": ".github/workflows/generic.yml",
"chars": 7639,
"preview": "name: Generic\n\non:\n pull_request:\n branches:\n - main\n release:\n branches:\n - main\n types: [publishe"
},
{
"path": ".github/workflows/production.yml",
"chars": 8735,
"preview": "name: Production\n\non:\n # Trigger the workflow on push on the master branch, or for any pull request\n push:\n branche"
},
{
"path": ".github/workflows/scripts/alarm.py",
"chars": 23290,
"preview": "\"\"\"\nThis script runs from alarm.yml\n\nTerminology/variable names:\n- benchmark suite results: the results of running all b"
},
{
"path": ".github/workflows/scripts/production_build.sh",
"chars": 559,
"preview": "#!/bin/bash\n\nset -ex\n\ncurl -LsSf https://astral.sh/uv/install.sh | sh\nuv --version\n\nuv venv --python '3.10' /venv\nsource"
},
{
"path": ".gitignore",
"chars": 2062,
"preview": "logs/\ntmp/\nMUJOCO_LOG.TXT\nimgui.ini\n.polyscope.ini\n.DS_Store\nsftp-config.json\n*.mp4\ngenesis/assets/terrain/\n\n# Byte-comp"
},
{
"path": ".gitmodules",
"chars": 329,
"preview": "[submodule \"doc\"]\n\tpath = doc\n\turl = https://github.com/Genesis-Embodied-AI/genesis-doc\n[submodule \"genesis/ext/LuisaRen"
},
{
"path": ".pre-commit-config.yaml",
"chars": 196,
"preview": "repos:\n- repo: https://github.com/astral-sh/ruff-pre-commit\n # Ruff version.\n rev: v0.14.11\n hooks:\n # Run the for"
},
{
"path": ".readthedocs.yaml",
"chars": 224,
"preview": "version: 2\n\nbuild:\n os: ubuntu-22.04\n tools:\n python: \"3.12\"\n\nsubmodules:\n include:\n - doc\n recursive: true\n\ns"
},
{
"path": "AGENTS.md",
"chars": 2827,
"preview": "# AGENTS.md - Genesis AI Agent Guide\n\nGuide for AI coding assistants working with the Genesis physics simulation codebas"
},
{
"path": "LICENSE",
"chars": 11356,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "MANIFEST.in",
"chars": 199,
"preview": "include README.md\ninclude LICENSE\nrecursive-include genesis/assets *\nrecursive-include genesis/ext/pyrender/fonts *\nrecu"
},
{
"path": "README.md",
"chars": 15027,
"preview": "\r\n\r\n\r\n\r\n[\n\n\n\n[\r\n\r\n\r\n\r\n[\r\n\r\n\r\n\r\n[\n\n\n\n[ algorithm provides a unified fr"
},
{
"path": "examples/IPC_Solver/ipc_momentum.py",
"chars": 10606,
"preview": "import argparse\nimport os\n\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nimport genesis as gs\nfrom genesis.utils.m"
},
{
"path": "examples/IPC_Solver/ipc_objects_falling.py",
"chars": 3242,
"preview": "\"\"\"\nIPC Cloth Simulation Example\n\nThis example demonstrates cloth simulation using IPC (Incremental Potential Contact)\nw"
},
{
"path": "examples/IPC_Solver/ipc_robot_cloth_teleop.py",
"chars": 9426,
"preview": "\"\"\"\nKeyboard Controls:\n↑\t- Move Forward (North)\n↓\t- Move Backward (South)\n←\t- Move Left (West)\n→\t- Move Right (East)\nn\t-"
},
{
"path": "examples/IPC_Solver/ipc_robot_grasp_cube.py",
"chars": 4180,
"preview": "import argparse\nimport os\n\nimport genesis as gs\n\n\ndef main():\n gs.init(backend=gs.cpu, logging_level=\"info\")\n\n par"
},
{
"path": "examples/collision/contype.py",
"chars": 2415,
"preview": "\"\"\"\nNOTE: contype and conaffinity are 32-bit integer bitmasks used for contact filtering of contact pairs.\nWhen the cont"
},
{
"path": "examples/collision/pyramid.py",
"chars": 1745,
"preview": "import numpy as np\r\nimport genesis as gs\r\nimport argparse\r\n\r\n\r\ndef main():\r\n parser = argparse.ArgumentParser()\r\n "
},
{
"path": "examples/collision/tower.py",
"chars": 2921,
"preview": "import argparse\r\nimport os\r\n\r\nimport genesis as gs\r\n\r\n\r\ndef main():\r\n parser = argparse.ArgumentParser()\r\n parser."
},
{
"path": "examples/coupling/cloth_attached_to_rigid.py",
"chars": 2803,
"preview": "import argparse\nimport math\nimport os\n\n\nimport genesis as gs\nimport genesis.utils.geom as gu\n\n\ndef main():\n parser = "
},
{
"path": "examples/coupling/cloth_on_rigid.py",
"chars": 1999,
"preview": "import argparse\nimport os\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_argu"
},
{
"path": "examples/coupling/cut_dragon.py",
"chars": 2096,
"preview": "import os\nimport argparse\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_argum"
},
{
"path": "examples/coupling/fem_cube_linked_with_arm.py",
"chars": 5365,
"preview": "import os\nimport argparse\n\nimport numpy as np\nfrom tqdm import tqdm\n\nimport genesis as gs\n\n\ndef main():\n parser = arg"
},
{
"path": "examples/coupling/flush_cubes.py",
"chars": 3143,
"preview": "import os\nimport argparse\nimport numpy as np\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n "
},
{
"path": "examples/coupling/grasp_soft_cube.py",
"chars": 3165,
"preview": "import argparse\n\nimport numpy as np\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parse"
},
{
"path": "examples/coupling/rigid_mpm_attachment.py",
"chars": 1874,
"preview": "\"\"\"\nMPM to Rigid Link Attachment\n\nDemonstrates attaching MPM particles to rigid links using soft constraints.\n\"\"\"\n\nimpor"
},
{
"path": "examples/coupling/sand_wheel.py",
"chars": 3175,
"preview": "import argparse\nimport os\n\nimport numpy as np\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()"
},
{
"path": "examples/coupling/sph_mpm.py",
"chars": 2204,
"preview": "import argparse\nimport os\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_argu"
},
{
"path": "examples/coupling/sph_rigid.py",
"chars": 2009,
"preview": "import argparse\nimport os\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_argu"
},
{
"path": "examples/coupling/water_wheel.py",
"chars": 2332,
"preview": "import argparse\nimport os\n\nimport numpy as np\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()"
},
{
"path": "examples/ddp_multi_gpu.py",
"chars": 3279,
"preview": "#!/usr/bin/env python3\n\"\"\"\nMulti-node / multi-GPU Genesis ✕ PyTorch DDP demo\n==========================================="
},
{
"path": "examples/differentiable_push.py",
"chars": 4651,
"preview": "import argparse\nimport os\n\nimport torch\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n p"
},
{
"path": "examples/drone/README.md",
"chars": 3546,
"preview": "# Drone Examples\n\nThis directory contains examples of drone simulations using the Genesis framework.\n\n## Available Examp"
},
{
"path": "examples/drone/fly.py",
"chars": 8277,
"preview": "import argparse\n\nimport numpy as np\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parse"
},
{
"path": "examples/drone/fly_route.py",
"chars": 2634,
"preview": "import math\nfrom typing import TYPE_CHECKING\n\nimport genesis as gs\nfrom genesis.vis.camera import Camera\n\nfrom quadcopte"
},
{
"path": "examples/drone/hover_env.py",
"chars": 11281,
"preview": "import torch\nimport math\nimport copy\nimport genesis as gs\nfrom genesis.utils.geom import (\n quat_to_xyz,\n transfor"
},
{
"path": "examples/drone/hover_eval.py",
"chars": 2514,
"preview": "import argparse\nimport os\nimport pickle\nfrom importlib import metadata\n\nimport torch\n\ntry:\n try:\n if metadata."
},
{
"path": "examples/drone/hover_train.py",
"chars": 4699,
"preview": "import argparse\nimport os\nimport pickle\nimport shutil\nfrom importlib import metadata\n\ntry:\n try:\n if metadata."
},
{
"path": "examples/drone/interactive_drone.py",
"chars": 4248,
"preview": "import os\n\nimport numpy as np\n\nimport genesis as gs\nfrom genesis.vis.keybindings import Key, KeyAction, Keybind\n\n\nclass "
},
{
"path": "examples/drone/quadcopter_controller.py",
"chars": 3792,
"preview": "from typing import TYPE_CHECKING\n\nimport torch\nimport numpy as np\n\nfrom genesis.utils.geom import quat_to_xyz\n\nif TYPE_C"
},
{
"path": "examples/elastic_dragon.py",
"chars": 1560,
"preview": "import argparse\nimport os\n\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_arg"
},
{
"path": "examples/fem_hard_and_soft_constraint.py",
"chars": 4728,
"preview": "import os\nimport argparse\n\nimport numpy as np\nimport torch\nfrom tqdm import tqdm\n\nimport genesis as gs\n\nSCENE_POS = np.a"
},
{
"path": "examples/hibernation.py",
"chars": 4378,
"preview": "\"\"\"\nHibernation Performance Example\n\nThis example demonstrates the performance benefit of hibernation in Genesis rigid b"
},
{
"path": "examples/keyboard_teleop.py",
"chars": 5991,
"preview": "\"\"\"\nKeyboard Controls:\n↑\t- Move Forward (North)\n↓\t- Move Backward (South)\n←\t- Move Left (West)\n→\t- Move Right (East)\nn\t-"
},
{
"path": "examples/kinematic/go2_kinematic.py",
"chars": 2904,
"preview": "\"\"\"\nExample: KinematicEntity as a ghost reference motion.\n\nCreates a Go2 quadruped as a physics-simulated entity alongsi"
},
{
"path": "examples/locomotion/backflip/readme.md",
"chars": 470,
"preview": "# Go2 Backflips\n\nTo try Go2 backflips, follow these steps:\n\n1. Download the checkpoints from the link below:\n ```\n "
},
{
"path": "examples/locomotion/go2_backflip.py",
"chars": 3979,
"preview": "import argparse\n\nimport torch\nfrom go2_env import Go2Env\n\nimport genesis as gs\n\n\ndef get_cfgs():\n env_cfg = {\n "
},
{
"path": "examples/locomotion/go2_env.py",
"chars": 13805,
"preview": "import math\n\nimport torch\n\nimport genesis as gs\nfrom genesis.utils.geom import quat_to_xyz, transform_by_quat, inv_quat,"
},
{
"path": "examples/locomotion/go2_eval.py",
"chars": 1678,
"preview": "import argparse\nimport os\nimport pickle\nfrom importlib import metadata\n\nimport torch\n\ntry:\n try:\n if metadata."
},
{
"path": "examples/locomotion/go2_train.py",
"chars": 5300,
"preview": "import argparse\nimport os\nimport pickle\nimport shutil\nfrom importlib import metadata\n\ntry:\n try:\n if metadata."
},
{
"path": "examples/manipulation/behavior_cloning.py",
"chars": 17431,
"preview": "import os\nimport time\nfrom collections import deque\nfrom collections.abc import Iterator\n\nimport numpy as np\nimport torc"
},
{
"path": "examples/manipulation/grasp_env.py",
"chars": 20560,
"preview": "import torch\nimport math\nfrom typing import Literal\n\nimport genesis as gs\nfrom genesis.utils.geom import (\n xyz_to_qu"
},
{
"path": "examples/manipulation/grasp_eval.py",
"chars": 5668,
"preview": "import argparse\nimport re\nimport pickle\nfrom importlib import metadata\nfrom pathlib import Path\n\nimport torch\n\ntry:\n "
},
{
"path": "examples/manipulation/grasp_train.py",
"chars": 7372,
"preview": "import argparse\nimport re\nimport pickle\nfrom importlib import metadata\nfrom pathlib import Path\n\ntry:\n try:\n i"
},
{
"path": "examples/pbd_liquid.py",
"chars": 1396,
"preview": "import argparse\nimport os\n\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_arg"
},
{
"path": "examples/render_async.py",
"chars": 1234,
"preview": "import os\nimport threading\n\nimport genesis as gs\n\n\ndef run_sim(scene):\n for _ in range(200):\n scene.step(refre"
},
{
"path": "examples/rendering/demo.py",
"chars": 4270,
"preview": "import genesis as gs\n\n\ndef main():\n ########################## init ##########################\n gs.init(precision="
},
{
"path": "examples/rendering/follow_entity.py",
"chars": 1062,
"preview": "import argparse\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_argument(\"-f\","
},
{
"path": "examples/rendering/moving_camera.py",
"chars": 1369,
"preview": "import argparse\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_argument(\"-v\","
},
{
"path": "examples/rendering/speed_test.py",
"chars": 1333,
"preview": "import argparse\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_argument(\"-v\","
},
{
"path": "examples/rigid/accelerometer_duck.py",
"chars": 2070,
"preview": "import argparse\nimport numpy as np\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser."
},
{
"path": "examples/rigid/accelerometer_franka.py",
"chars": 2391,
"preview": "import argparse\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_argument(\"-v\", "
},
{
"path": "examples/rigid/apply_external_force_torque.py",
"chars": 1637,
"preview": "import argparse\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_argument(\"-v\", "
},
{
"path": "examples/rigid/closed_loop.py",
"chars": 1416,
"preview": "import genesis as gs\nimport argparse\nimport time\n\n\ndef main_equality_connect(args):\n gs.init(backend=gs.cpu)\n\n sce"
},
{
"path": "examples/rigid/control_franka.py",
"chars": 3645,
"preview": "import argparse\n\nimport numpy as np\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parse"
},
{
"path": "examples/rigid/control_mesh.py",
"chars": 1493,
"preview": "import argparse\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_argument(\"-v\","
},
{
"path": "examples/rigid/convex_decomposition.py",
"chars": 1899,
"preview": "import argparse\nimport os\n\nfrom huggingface_hub import snapshot_download\n\nimport genesis as gs\n\n\ndef main():\n parser "
},
{
"path": "examples/rigid/diffik_controller.py",
"chars": 3040,
"preview": "import argparse\n\nimport numpy as np\n\nimport genesis as gs\n\nconfig = {\n \"ur5e\": {\"mjcf_file\": \"xml/universal_robots_ur"
},
{
"path": "examples/rigid/domain_randomization.py",
"chars": 2939,
"preview": "import argparse\n\nimport numpy as np\nimport torch\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParse"
},
{
"path": "examples/rigid/franka_cube.py",
"chars": 2504,
"preview": "import argparse\n\nimport numpy as np\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser"
},
{
"path": "examples/rigid/grasp_bottle.py",
"chars": 4036,
"preview": "import argparse\n\nimport numpy as np\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parse"
},
{
"path": "examples/rigid/gravity_compensation.py",
"chars": 1430,
"preview": "import argparse\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_argument(\"-v\","
},
{
"path": "examples/rigid/heterogeneous_simulation.py",
"chars": 4448,
"preview": "\"\"\"\nHeterogeneous Simulation Example\n================================\n\nThis example demonstrates heterogeneous simulatio"
},
{
"path": "examples/rigid/ik_custom_chain.py",
"chars": 2348,
"preview": "import argparse\n\nimport numpy as np\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parse"
},
{
"path": "examples/rigid/ik_duck.py",
"chars": 2448,
"preview": "import argparse\n\nimport numpy as np\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parse"
},
{
"path": "examples/rigid/ik_franka.py",
"chars": 2351,
"preview": "import argparse\n\nimport numpy as np\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parse"
},
{
"path": "examples/rigid/ik_franka_batched.py",
"chars": 2393,
"preview": "import argparse\n\nimport numpy as np\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parse"
},
{
"path": "examples/rigid/ik_shadow_hand.py",
"chars": 2852,
"preview": "import argparse\n\nimport numpy as np\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parse"
},
{
"path": "examples/rigid/merge_entities.py",
"chars": 4442,
"preview": "import argparse\nimport numpy as np\nimport genesis as gs\n\n\nCOMB = {\n \"urdf2urdf\",\n \"urdf2mjcf\",\n \"mjcf2urdf\",\n "
},
{
"path": "examples/rigid/multi_gpu.py",
"chars": 1653,
"preview": "import multiprocessing\nimport os\nimport argparse\n\nimport torch\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse"
},
{
"path": "examples/rigid/nonconvex_mesh.py",
"chars": 1304,
"preview": "import argparse\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_argument(\"-v\","
},
{
"path": "examples/rigid/set_phys_attr.py",
"chars": 6946,
"preview": "import argparse\n\nimport numpy as np\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parse"
},
{
"path": "examples/rigid/single_franka.py",
"chars": 1487,
"preview": "import argparse\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_argument(\"-v\","
},
{
"path": "examples/rigid/single_franka_batch_render.py",
"chars": 4227,
"preview": "import argparse\nimport numpy as np\n\nimport genesis as gs\nfrom genesis.utils.geom import trans_to_T\nfrom genesis.utils.im"
},
{
"path": "examples/rigid/single_franka_envs.py",
"chars": 2422,
"preview": "import argparse\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_argument(\"-v\","
},
{
"path": "examples/rigid/suction_cup.py",
"chars": 3582,
"preview": "import genesis as gs\nimport numpy as np\nimport argparse\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser."
},
{
"path": "examples/rigid/terrain_from_mesh.py",
"chars": 1759,
"preview": "import argparse\nimport os\n\nimport genesis as gs\nimport numpy as np\nfrom genesis.utils.terrain import mesh_to_heightfield"
},
{
"path": "examples/rigid/terrain_height_field.py",
"chars": 2246,
"preview": "import argparse\n\nimport numpy as np\nimport torch\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParse"
},
{
"path": "examples/rigid/terrain_subterrain.py",
"chars": 2330,
"preview": "import argparse\n\nimport torch\n\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n parser.add_"
},
{
"path": "examples/sap_coupling/fem_fixed_constraint.py",
"chars": 2241,
"preview": "import argparse\nimport math\nimport os\nimport sys\n\nimport torch\nimport genesis as gs\nfrom huggingface_hub import snapshot"
},
{
"path": "examples/sap_coupling/fem_sphere_and_cube.py",
"chars": 1845,
"preview": "import argparse\nimport sys\nimport genesis as gs\nimport os\nfrom huggingface_hub import snapshot_download\n\n\ndef main():\n "
},
{
"path": "examples/sap_coupling/franka_grasp_fem_sphere.py",
"chars": 2985,
"preview": "import argparse\nimport os\nimport sys\nimport numpy as np\nimport genesis as gs\n\n\ndef main():\n parser = argparse.Argumen"
},
{
"path": "examples/sap_coupling/franka_grasp_rigid_cube.py",
"chars": 2665,
"preview": "import argparse\nimport sys\nimport numpy as np\nimport genesis as gs\n\n\ndef main():\n parser = argparse.ArgumentParser()\n"
},
{
"path": "examples/sensors/camera_as_sensor.py",
"chars": 8702,
"preview": "\"\"\"\nExample demonstrating camera sensors with different rendering backends.\n\nCreating cameras as sensors using add_senso"
},
{
"path": "examples/sensors/contact_force_go2.py",
"chars": 3611,
"preview": "import argparse\nimport os\n\nfrom tqdm import tqdm\n\nimport genesis as gs\nfrom genesis.recorders.plotters import IS_MATPLOT"
},
{
"path": "examples/sensors/imu_franka.py",
"chars": 5313,
"preview": "import argparse\nimport os\n\nimport numpy as np\nfrom tqdm import tqdm\n\nimport genesis as gs\nfrom genesis.recorders.plotter"
},
{
"path": "examples/sensors/kinematic_contact_sandbox.py",
"chars": 8264,
"preview": "\"\"\"\nInteractive KinematicContactProbe visualization with keyboard teleop.\n\nA platform with a grid of contact probes sits"
},
{
"path": "examples/sensors/lidar_teleop.py",
"chars": 6749,
"preview": "import argparse\nimport os\n\nimport numpy as np\n\nimport genesis as gs\nfrom genesis.utils.geom import euler_to_quat\nfrom ge"
},
{
"path": "examples/sensors/proximity_shadowhand.py",
"chars": 5815,
"preview": "\"\"\"\nInteractive Proximity sensor with Shadow Hand and keyboard teleop.\n\nProximity sensors on the hand measure distance t"
},
{
"path": "examples/sensors/tactile_elastomer_franka.py",
"chars": 7096,
"preview": "import os\n\nimport numpy as np\n\nimport genesis as gs\nimport genesis.utils.geom as gu\nfrom genesis.recorders.plotters impo"
},
{
"path": "examples/sensors/tactile_elastomer_sandbox.py",
"chars": 10193,
"preview": "\"\"\"\nInteractive ElastomerDisplacementSensor visualization with keyboard teleop.\n\"\"\"\n\nimport argparse\nimport os\n\nimport n"
},
{
"path": "examples/sensors/temperature_grid.py",
"chars": 8642,
"preview": "\"\"\"\nInteractive TemperatureGrid sensor visualization with keyboard teleop.\n\nA platform has a temperature grid sensor on "
},
{
"path": "examples/smoke.py",
"chars": 4491,
"preview": "import argparse\nimport math\nimport os\nfrom pathlib import Path\n\nimport numpy as np\nimport quadrants as qd\nimport cv2\n\nim"
},
{
"path": "examples/speed_benchmark/anymal_c.py",
"chars": 1173,
"preview": "import numpy as np\n\nimport genesis as gs\n\n########################## init ##########################\ngs.init(backend=gs."
},
{
"path": "examples/speed_benchmark/franka.py",
"chars": 1164,
"preview": "import torch\n\nimport genesis as gs\n\n########################## init ##########################\ngs.init(backend=gs.gpu, p"
},
{
"path": "examples/speed_benchmark/timers.py",
"chars": 3285,
"preview": "import argparse\nimport os\nfrom contextlib import nullcontext\n\nos.environ[\"CUBLAS_WORKSPACE_CONFIG\"] = \":4096:8\"\n\nimport "
},
{
"path": "examples/tutorials/IK_motion_planning_grasp.py",
"chars": 2779,
"preview": "import os\nimport numpy as np\nimport genesis as gs\n\n\n########################## init ##########################\ngs.init(b"
},
{
"path": "examples/tutorials/advanced_IK_multilink.py",
"chars": 2305,
"preview": "import os\nimport numpy as np\nimport genesis as gs\n\n########################## init ##########################\ngs.init(pr"
},
{
"path": "examples/tutorials/advanced_hybrid_robot.py",
"chars": 2501,
"preview": "import os\n\nimport numpy as np\nimport genesis as gs\n\n\n########################## init ##########################\ngs.init("
},
{
"path": "examples/tutorials/advanced_muscle.py",
"chars": 1815,
"preview": "import os\nimport numpy as np\nimport genesis as gs\n\n\n########################## init ##########################\ngs.init(p"
},
{
"path": "examples/tutorials/advanced_worm.py",
"chars": 2831,
"preview": "import math\nimport os\nimport torch\nimport genesis as gs\n\n\n########################## init ##########################\ngs."
},
{
"path": "examples/tutorials/batched_IK.py",
"chars": 1649,
"preview": "import os\nimport numpy as np\nimport genesis as gs\n\n########################## init ##########################\ngs.init()\n"
},
{
"path": "examples/tutorials/control_your_robot.py",
"chars": 3391,
"preview": "import os\n\nimport numpy as np\n\nimport genesis as gs\n\n########################## init ##########################\ngs.init("
},
{
"path": "examples/tutorials/draw_debug.py",
"chars": 2177,
"preview": "import time\nimport os\nimport numpy as np\nimport genesis as gs\n\n\ndef main():\n gs.init(backend=gs.cpu)\n\n # Scene set"
},
{
"path": "examples/tutorials/entity_name.py",
"chars": 1571,
"preview": "\"\"\"\nEntity Naming Tutorial\n======================\n\nDemonstrates the Genesis entity naming system:\n- Auto-generated names"
},
{
"path": "examples/tutorials/hello_genesis.py",
"chars": 362,
"preview": "import genesis as gs\n\ngs.init(backend=gs.cpu)\n\nscene = gs.Scene()\n\nplane = scene.add_entity(\n gs.morphs.Plane(),\n)\nfr"
},
{
"path": "examples/tutorials/interactive_debugging.py",
"chars": 314,
"preview": "import genesis as gs\n\ngs.init()\n\nscene = gs.Scene(show_viewer=False)\n\nplane = scene.add_entity(gs.morphs.Plane())\nfranka"
},
{
"path": "examples/tutorials/mpm.py",
"chars": 1698,
"preview": "import os\nimport genesis as gs\n\n########################## init ##########################\ngs.init()\n\n##################"
},
{
"path": "examples/tutorials/parallel_simulation.py",
"chars": 1248,
"preview": "import torch\n\nimport genesis as gs\n\n########################## init ##########################\ngs.init(backend=gs.gpu)\n\n"
},
{
"path": "examples/tutorials/pbd_cloth.py",
"chars": 1681,
"preview": "import os\n\nimport genesis as gs\n\n########################## init ##########################\ngs.init()\n\n#################"
},
{
"path": "examples/tutorials/position_control_comparison.py",
"chars": 4509,
"preview": "# This example compares the position control accuracy between 'control_dofs_position' and\n# 'control_dofs_position_veloc"
},
{
"path": "examples/tutorials/selecting_rendered_envs.py",
"chars": 765,
"preview": "import os\nimport genesis as gs\n\ngs.init()\n\nscene = gs.Scene(\n show_viewer=True,\n viewer_options=gs.options.ViewerO"
},
{
"path": "examples/tutorials/sph_liquid.py",
"chars": 1239,
"preview": "import os\n\nimport genesis as gs\n\n\n########################## init ##########################\ngs.init()\n\n################"
},
{
"path": "examples/tutorials/visualization.py",
"chars": 1431,
"preview": "import os\nimport math\nimport genesis as gs\n\ngs.init()\n\nscene = gs.Scene(\n viewer_options=gs.options.ViewerOptions(\n "
},
{
"path": "examples/usd/import_stage.py",
"chars": 2680,
"preview": "import argparse\nimport os\n\nimport numpy as np\nfrom huggingface_hub import snapshot_download\n\nimport genesis as gs\nfrom g"
},
{
"path": "examples/viewer_plugin/mesh_point_selector.py",
"chars": 9723,
"preview": "import csv\nimport os\nfrom typing import TYPE_CHECKING, NamedTuple\n\nimport numpy as np\nfrom typing_extensions import over"
},
{
"path": "examples/viewer_plugin/mouse_interaction.py",
"chars": 1915,
"preview": "import argparse\nimport math\nimport os\n\nimport genesis as gs\nimport genesis.vis.keybindings as kb\n\nif __name__ == \"__main"
},
{
"path": "genesis/__init__.py",
"chars": 18580,
"preview": "import io\nimport os\nimport sys\nimport atexit\nimport logging as _logging\nimport traceback\nimport weakref\nfrom typing impo"
},
{
"path": "genesis/_main.py",
"chars": 14075,
"preview": "import argparse\nimport multiprocessing\nfrom functools import partial\n\nimport tkinter as tk\nfrom tkinter import ttk\n\nimpo"
},
{
"path": "genesis/assets/meshes/Airplane/airplane.mtl",
"chars": 423,
"preview": "# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware\r\n# File Created: 06.08.2020 19:57:01\r\n\r\nnewmtl airplane\r\n\tNs "
},
{
"path": "genesis/assets/meshes/Airplane/airplane.obj",
"chars": 101728,
"preview": "# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware\r\n# File Created: 06.08.2020 19:57:01\r\n\r\nmtllib airplane.mtl\r\n"
},
{
"path": "genesis/assets/meshes/axis.obj",
"chars": 22928,
"preview": "# https://github.com/mikedh/trimesh\nv -0.02628656 0.04253254 0.00000000 1.00000000 1.00000000 1.00000000\nv 0.02628656 0."
},
{
"path": "genesis/assets/meshes/bathtub/bathtub.obj",
"chars": 701463,
"preview": "# https://github.com/mikedh/trimesh\nmtllib material.mtl\n\no Bathtub_lambert1_0\nusemtl material_0\nv -2.93855846 0.00213146"
},
{
"path": "genesis/assets/meshes/bathtub/material.mtl",
"chars": 176,
"preview": "# https://github.com/mikedh/trimesh\n\nnewmtl material_0\nKa 0.40000000 0.40000000 0.40000000\nKd 0.50196078 0.50196078 0.50"
},
{
"path": "genesis/assets/meshes/boat/boat.obj",
"chars": 48287,
"preview": "# https://github.com/mikedh/trimesh\nmtllib material.mtl\n\no Object_2\nusemtl material_0\nv 1.68297005 0.40529901 0.44725299"
},
{
"path": "genesis/assets/meshes/boat/material.mtl",
"chars": 524,
"preview": "# https://github.com/mikedh/trimesh\n\nnewmtl material_0\nKa 0.40000000 0.40000000 0.40000000\nKd 0.40000000 0.40000000 0.40"
},
{
"path": "genesis/assets/meshes/bunny.obj",
"chars": 6224056,
"preview": "####\n#\n# OBJ File Generated by Meshlab\n#\n####\n# Object bunny.obj\n#\n# Vertices: 42411\n# Faces: 84818\n#\n####\nvn -0.0251411"
},
{
"path": "genesis/assets/meshes/dragon/dragon.obj",
"chars": 1317854,
"preview": "# https://github.com/mikedh/trimesh\nmtllib material.mtl\n\no defaultMaterial\nusemtl material_0\nv -55.00720215 74.12330630 "
},
{
"path": "genesis/assets/meshes/dragon/material.mtl",
"chars": 198,
"preview": "# https://github.com/mikedh/trimesh\n\nnewmtl material_0\nKa 0.40000000 0.40000000 0.40000000\nKd 0.40000000 0.40000000 0.40"
},
{
"path": "genesis/assets/meshes/dragon.obj",
"chars": 6616786,
"preview": "####\n#\n# OBJ File Generated by Meshlab\n#\n####\n# Object dragon.obj\n#\n# Vertices: 46798\n# Faces: 93600\n#\n####\nvn 0.570095 "
},
{
"path": "genesis/assets/meshes/duck/duck.obj",
"chars": 227694,
"preview": "# https://github.com/mikedh/trimesh\nmtllib material.mtl\nusemtl material_0\nv 0.00000000 218.62777826 46.57624985\nv 0.0000"
},
{
"path": "genesis/assets/meshes/duck/material.mtl",
"chars": 198,
"preview": "# https://github.com/mikedh/trimesh\n\nnewmtl material_0\nKa 0.40000000 0.40000000 0.40000000\nKd 0.40000000 0.40000000 0.40"
},
{
"path": "genesis/assets/meshes/duck.obj",
"chars": 2312910,
"preview": "# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware\r\n# File Created: 30.09.2013 19:32:39\r\n\r\nmtllib duck.mtl\r\n\r\n#\r"
},
{
"path": "genesis/assets/meshes/env_sphere/env_sphere.obj",
"chars": 241837,
"preview": "# https://github.com/mikedh/trimesh\nmtllib material.mtl\nusemtl material_0\nv 0.00000000 0.00000000 1.00000000\nv 0.1011683"
},
{
"path": "genesis/assets/meshes/env_sphere/material.mtl",
"chars": 198,
"preview": "# https://github.com/mikedh/trimesh\n\nnewmtl material_0\nKa 0.40000000 0.40000000 0.40000000\nKd 0.40000000 0.40000000 0.40"
},
{
"path": "genesis/assets/meshes/sphere.obj",
"chars": 83350,
"preview": "# https://github.com/mikedh/trimesh\nv -0.52573111 0.85065081 0.00000000\nv 0.52573111 0.85065081 0.00000000\nv -0.52573111"
},
{
"path": "genesis/assets/meshes/tank.obj",
"chars": 3364920,
"preview": "# File units = meters\nmtllib tank.mtl\ng Part 1\nusemtl 0.615686_0.811765_0.929412_0.000000_0.000000\no mesh0\nv 0.05842 0.0"
},
{
"path": "genesis/engine/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "genesis/engine/solvers/rigid/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "genesis/grad/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "tests/__init__.py",
"chars": 0,
"preview": ""
}
]
// ... and 676 more files (download for full content)
About this extraction
This page contains the full source code of the Genesis-Embodied-AI/Genesis GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 854 files (158.9 MB), approximately 5.5M tokens, and a symbol index with 277 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.