A robotics benchmark for physical reasoning.
Project description
KinDER
KinDER: A physical reasoning benchmark for robot learning and planning.
Robotics: Science and Systems (RSS), 2026
Website
See https://prpl-group.com/kinder-site/ for documentation and tutorials.
Requirements
- Python >=3.10, <3.13
- Tested on MacOS 13-15, Ubuntu 20.04, Ubuntu 22.04, Ubuntu 24.04, and Windows 10 (but we aim to support most platforms)
Installation
From PyPI
pip install kindergarden # all environment dependencies
pip install kindergarden[dynamic2d] # only dynamic2d environments
pip install kindergarden[kinematic2d] # only kinematic2d environments
pip install kindergarden[kinematic3d] # only kinematic3d environments
pip install kindergarden[dynamic3d] # only dynamic3d environments
You can also combine extras: pip install kindergarden[kinematic2d,kinematic3d]
From Source
We strongly recommend uv, but other standard setups work too.
git clone https://github.com/Princeton-Robot-Planning-and-Learning/kindergarden.git
cd kindergarden
uv pip install -e ".[develop]" # all dependencies + dev tools
Or install only what you need:
uv pip install -e ".[dynamic2d]" # only dynamic2d environments
To check the installation, run ./run_ci_checks.sh. It should complete with all green successes.
Usage Example
Basic Usage (Gym API)
import kinder
kinder.register_all_environments()
env = kinder.make("kinder/Obstruction2D-o3-v0") # 3 obstructions
obs, info = env.reset() # procedural generation
action = env.action_space.sample()
next_obs, reward, terminated, truncated, info = env.step(action)
img = env.render()
Object-Centric States
All environments in KinDER use object-centric states. For example:
from kinder.envs.kinematic2d.obstruction2d import ObjectCentricObstruction2DEnv
env = ObjectCentricObstruction2DEnv(num_obstructions=3)
obs, _ = env.reset(seed=123)
print(obs.pretty_str())
Here, obs is an ObjectCentricState, and the printout is:
############################################################### STATE ###############################################################
type: crv_robot x y theta base_radius arm_joint arm_length vacuum gripper_height gripper_width
----------------- -------- -------- ------- ------------- ----------- ------------ -------- ---------------- ---------------
robot 0.885039 0.803795 -1.5708 0.1 0.1 0.2 0 0.07 0.01
type: rectangle x y theta static color_r color_g color_b z_order width height
----------------- -------- -------- ------- -------- --------- --------- --------- --------- --------- ---------
obstruction0 0.422462 0.100001 0 0 0.75 0.1 0.1 100 0.132224 0.0766399
obstruction1 0.804663 0.100001 0 0 0.75 0.1 0.1 100 0.0805652 0.0955062
obstruction2 0.559246 0.100001 0 0 0.75 0.1 0.1 100 0.12608 0.180172
type: target_block x y theta static color_r color_g color_b z_order width height
-------------------- ------- -------- ------- -------- --------- --------- --------- --------- -------- --------
target_block 1.20082 0.100001 0 0 0.501961 0 0.501961 100 0.138302 0.155183
type: target_surface x y theta static color_r color_g color_b z_order width height
---------------------- -------- --- ------- -------- --------- --------- --------- --------- -------- --------
target_surface 0.499675 0 0 1 0.501961 0 0.501961 101 0.180286 0.1
#####################################################################################################################################
For compatibility with baselines, the observations provided by the main environments are vectors. It is easy to convert between vectors and object-centric states. For example:
import kinder
kinder.register_all_environments()
env = kinder.make("kinder/Obstruction2D-o3-v0")
vec_obs, _ = env.reset(seed=123)
object_centric_obs = env.observation_space.devectorize(vec_obs)
recovered_vec_obs = env.observation_space.vectorize(object_centric_obs)
Noisy Observation and Action Wrappers
KinDER provides Gymnasium-compatible wrappers for adding stochasticity to observations and actions:
import kinder
kinder.register_all_environments()
env = kinder.make("kinder/Obstruction2D-o3-v0")
env = kinder.NoisyObservation(env, noise_std=0.05) # Gaussian noise on observations
env = kinder.NoisyAction(env, noise_std=0.01) # Gaussian noise on actions (clipped to bounds)
obs, info = env.reset(seed=42)
noise_std can be a scalar (uniform across dimensions) or a per-dimension array. NoisyAction automatically clips noisy actions to the action space bounds.
Quick Environment Reference
| Environment | Category | Example Environment ID |
|---|---|---|
| ClutteredRetrieval2D | Kinematic2D | kinder/ClutteredRetrieval2D-o10-v0 |
| ClutteredStorage2D | Kinematic2D | kinder/ClutteredStorage2D-b7-v0 |
| Motion2D | Kinematic2D | kinder/Motion2D-p3-v0 |
| Obstruction2D | Kinematic2D | kinder/Obstruction2D-o2-v0 |
| PushPullHook2D | Kinematic2D | kinder/PushPullHook2D-v0 |
| StickButton2D | Kinematic2D | kinder/StickButton2D-b3-v0 |
| BaseMotion3D | Kinematic3D | kinder/BaseMotion3D-v0 |
| Ground3D | Kinematic3D | kinder/Ground3D-o2-v0 |
| KinematicShelf3D | Kinematic3D | kinder/KinematicShelf3D-o3-v0 |
| Motion3D | Kinematic3D | kinder/Motion3D-v0 |
| Obstruction3D | Kinematic3D | kinder/Obstruction3D-o2-v0 |
| Packing3D | Kinematic3D | kinder/Packing3D-p2-v0 |
| PrplLab3D | Kinematic3D | kinder/PrplLab3D-o2-v0 |
| Table3D | Kinematic3D | kinder/Table3D-o2-v0 |
| Transport3D | Kinematic3D | kinder/Transport3D-o2-v0 |
| DynObstruction2D | Dynamic2D | kinder/DynObstruction2D-o2-v0 |
| DynPushPullHook2D | Dynamic2D | kinder/DynPushPullHook2D-o1-v0 |
| DynPushT2D | Dynamic2D | kinder/DynPushT2D-t1-v0 |
| DynScoopPour2D | Dynamic2D | kinder/DynScoopPour2D-o30-v0 |
| BalanceBeam3D | Dynamic3D | kinder/BalanceBeam3D-o3-v0 |
| ConstrainedCupboard3D | Dynamic3D | kinder/ConstrainedCupboard3D-o1-v0 |
| Dynamo3D | Dynamic3D | kinder/Dynamo3D-o3-v0 |
| Rearrange3D | Dynamic3D | kinder/Rearrange3D-o2-put_the_boxed_drink_on_the_left_and_the_can_on_the_right_side_of_the_bowl-v0 |
| ScoopPour3D | Dynamic3D | kinder/ScoopPour3D-o100-v0 |
| Shelf3D | Dynamic3D | kinder/Shelf3D-o2-v0 |
| SortClutteredBlocks3D | Dynamic3D | kinder/SortClutteredBlocks3D-o4-sort_the_cluttered_blocks_into_bins-v0 |
| SweepIntoDrawer3D | Dynamic3D | kinder/SweepIntoDrawer3D-o5-v0 |
| SweepSimple3D | Dynamic3D | kinder/SweepSimple3D-o50-sweep_the_blocks_to_the_right_side_of_the_kitchen_island-v0 |
| Tossing3D | Dynamic3D | kinder/Tossing3D-o1-v0 |
Acknowledgements
We thank the authors of following projects for open-sourcing their code, whose assets we utilized in KinDER:
Contributing
General Guidelines
- All checks must pass before code is merged (see
./run_ci_checks.sh) - All code goes through the pull request review process
Adding New Environments
Some new environment requests are in Issues. To add a new environment, please see the examples in src/kinder/env. Also consider:
- Environments are registered in
src/kinder/__init__.py - Each environment should have at least one demonstration (see
scripts/collect_demos.py) - After collecting a demonstration, create a video with
scripts/generate_demo_video.py, which will be used in the autogenerated documentation
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kindergarden-0.1.3.tar.gz.
File metadata
- Download URL: kindergarden-0.1.3.tar.gz
- Upload date:
- Size: 73.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73c608cd02281cda0a0e2fdbc324cf49ac5592720578ae5135afe1ffd7d15043
|
|
| MD5 |
e82aac96a818d757d458099ce946f0db
|
|
| BLAKE2b-256 |
61f3cf1b90c748305dc47b9b57fdf38752e49350a6ad39a04b872109afebdf2a
|
File details
Details for the file kindergarden-0.1.3-py3-none-any.whl.
File metadata
- Download URL: kindergarden-0.1.3-py3-none-any.whl
- Upload date:
- Size: 73.1 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3bf3d72fadc1930c7038e2a3c3345be369ac3823a15588b95e7a772a2f1b35ef
|
|
| MD5 |
03347b06c0c985f2931664eb6c104dda
|
|
| BLAKE2b-256 |
95c14d327d367e29fcd1049e3fc4d7314dedaedb274984b0228dbd3d8d6705e1
|