SRMP is a motion planning library for robotic manipulation built on state-of-the-art search-based algorithms. It produces consistent, predictable motions backed by rigorous theoretical guarantees, and plans for up to dozens of manipulators at once while guaranteeing collision-free execution — between robots and with the environment.
Why SRMP?
Existing motion planning frameworks often struggle with the demands of high-stakes applications, where predictability and repeatability are critical. SRMP addresses these challenges with search-based planning, giving motions that are both efficient and reliable — for single-arm manipulation, industrial automation, mobile manipulators and large-scale multi-robot coordination.
Key features
- Multi-robot motion planning — first-of-its-kind support for coordinated motions in multi-manipulator systems.
- Reliable, consistent trajectories — predictable and repeatable, for high-precision and safety-critical use.
- Two collision-checking backends — coal mesh collision checking, and the VAMP SIMD backend for supported robots (sub-millisecond planning on uncluttered scenes).
- Mobile manipulators — whole-body planning for arm-on-base systems with base-aware heuristics.
- Seamless integration — works with MuJoCo, Sapien, Genesis, PyBullet and Isaac; MoveIt! plugin for deployment on real systems.
- Python and C++ — one library for research and industrial workflows.
Installation
pip install srmp
Prebuilt wheels for Python 3.9–3.14:
| Platform | Requirement |
|---|---|
| Linux x86-64 (manylinux) | CPU with AVX2 (Intel Haswell 2013+ / AMD Zen+) — the VAMP backend is compiled for x86-64-v3. import srmp checks for it and raises a clear ImportError otherwise. |
| macOS Apple Silicon | macOS 11+ |
Other platforms, older CPUs, or building from source: see instructions.md.
Quick start
import numpy as np
import srmp
planner = srmp.PlannerInterface()
planner.add_robot("panda") # downloaded from the robot registry on first use
# An obstacle in the scene.
box = srmp.Pose()
box.p = np.array([0.5, 0.2, 0.4])
planner.add_box("box", np.array([0.1, 0.1, 0.4]), box)
# Weighted A* with a BFS workspace heuristic; the collision backend picks
# VAMP when the robot supports it, coal otherwise.
planner.make_planner(["panda"], {
"planner_id": "wAstar", "heuristic": "bfs", "weight": "10",
"validity_backend": "auto",
})
start = np.radians([50, 47, -10, -35, -22, 93, 39])
goal_pose = srmp.Pose()
goal_pose.p = np.array([0.642, -0.068, 0.505])
goal_pose.q = np.array([0.0, 0.0, 0.0, 1.0])
goal = srmp.GoalConstraint(srmp.GoalType.POSE, [goal_pose])
traj = planner.plan(start, goal)
print(len(traj.positions), "waypoints, backend:", planner.get_active_validity_backend())
Joint-space goals use srmp.GoalConstraint(srmp.GoalType.JOINTS, q_goal). For several robots, make_planner([...], ctx) with more than one articulation and plan_multi(...).
Robots
Robot descriptions are downloaded on demand from the SRMP registry — panda, ur5, ur10e, fetch, kinova_gen3, xarm6, ridgeback_ur10e and others (srmp.robots.list_available()). Your own robot: srmp.robots.register("name", urdf_path=..., srdf_path=..., end_effector=...), or pass a URDF path to add_robot.
The VAMP backend ships with modules matching the registry's panda and ridgeback_ur10e (its built-in ur5 and fetch modules describe other robot models than the registry's, so those plan on coal); other robots plan on coal unless a VAMP plugin is installed for them (below). validity_backend: "auto" selects per robot, "vamp" insists and raises if unavailable.
VAMP robot plugins (srmp vamp)
A plugin adds a robot to the VAMP backend without rebuilding srmp (Linux x86-64). By default every plugin is agreement-tested against coal before it is installed; that test checks the plugin's integrity, not that its spheres cover the robot.
- Registry robots with a published plugin (
kinova_gen3_robotiq_2f85is the first):add_robot("kinova_gen3_robotiq_2f85")fetches it, checks it against the registry robot and agreement-tests it before first use (one line on stderr; up to a few minutes, once). Nothing published, or offline: coal, silently; adding a robot never starts a build. Overriding the SRDF, end effector, joint or link names skips the lookup. srmp vamp fetch <robot>does the same on request;--no-verifyinstalls without the checks (recorded, andlistsays so).srmp vamp add-robot --name <robot> --urdf <spherized.urdf> --end-effector <link> [--srdf <file>] [--mesh-robot <registry name or mesh URDF>]builds your own: cricket and the compiler run in Docker images pulled from Docker Hub (asked first;--build-imagesbuilds them locally instead), else on a native toolchain.--from-module <robot.hh> --spherized-urdf ... --spherized-srdf ... --end-effector ...starts from an existing cricket module.srmp vamp list [--json]shows each plugin, whether it loads and what was checked;srmp vamp remove <robot>deletes one.- After an srmp upgrade that changes the plugin ABI tag,
import srmpwarns and skips the affected plugins;srmp vamp rebuild-allrebuilds them from their cached modules (--allrebuilds every plugin), andSRMP_VAMP_AUTO_REBUILD=1does it at import. Registry prebuilts are fetched again for the new tag instead.
Plugins live in ~/.cache/srmp/vamp_plugins/ ($SRMP_VAMP_PLUGIN_PATH adds directories; its first entry becomes the install directory). Details: instructions.md.
Planners
Single robot: Astar, wAstar, ARAstar, MHAstar, wPASE (parallel), MGS (multi-graph search), vamp_rrtc. Multi-robot: ECBS, xECBS. Parameters, mobile-manipulator setup and motion-primitive files are covered in instructions.md.
Visualization and agent
- Viser and MeshCat visualizers:
srmp.ViserPlannerInterface,srmp.VisualPlannerInterface— drop-in replacements forPlannerInterfacewith an interactive goal gizmo and plan panel. - Agentic mode:
pip install "srmp[agent]", thenpython -m srmp.agent.cliorpython -m srmp.agent.guito drive the planner in natural language (Gemini by default). - Scenes and plans round-trip through
save_scene/load_scene/save_plan/load_plan— see Saving and Loading.
Links
- Documentation: https://srmp.readthedocs.io
- Source and issues: https://gitlab.com/robot_planning/open/ims_manip
- Developer guide (building, backends, planner reference): instructions.md
License
AGPL-3.0-or-later. See LICENSE.
Metadata
Release files for srmp 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| srmp-0.2.0-cp314-cp314-manylinux_2_35_x86_64.whl | CPython 3.14 | CPython 3.14 | Linux glibc 2.35+ x86-64 | Details |
| srmp-0.2.0-cp313-cp313-manylinux_2_35_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.35+ x86-64 | Details |
| srmp-0.2.0-cp312-cp312-manylinux_2_35_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.35+ x86-64 | Details |
| srmp-0.2.0-cp311-cp311-manylinux_2_35_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.35+ x86-64 | Details |
| srmp-0.2.0-cp310-cp310-manylinux_2_35_x86_64.whl | CPython 3.10 | CPython 3.10 | Linux glibc 2.35+ x86-64 | Details |
| srmp-0.2.0-cp39-cp39-manylinux_2_35_x86_64.whl | CPython 3.9 | CPython 3.9 | Linux glibc 2.35+ x86-64 | Details |
Total release size: 79.3 MB
Release files / srmp-0.2.0-cp314-cp314-manylinux_2_35_x86_64.whl
| Download URL | srmp-0.2.0-cp314-cp314-manylinux_2_35_x86_64.whl |
|---|---|
| Size | 13.2 MB |
| Tags | CPython 3.14 Linux glibc 2.35+ x86-64 |
|
SHA-256 checksum How to use checksums |
6de2dab0c3f141b5098d719cab6b23f5bfb921212359f00e1a0c34fca112f909
|
|
BLAKE2b-256 checksum How to use checksums |
da632e5137a2abe2ed78c86666f8338784afce93ba9d66c9f4d46c808083be73
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|
Release files / srmp-0.2.0-cp313-cp313-manylinux_2_35_x86_64.whl
| Download URL | srmp-0.2.0-cp313-cp313-manylinux_2_35_x86_64.whl |
|---|---|
| Size | 13.2 MB |
| Tags | CPython 3.13 Linux glibc 2.35+ x86-64 |
|
SHA-256 checksum How to use checksums |
fbefb87d9b2fd766b0d308526e5273e9adcf96120f03a86d6e62b8153de0fe9e
|
|
BLAKE2b-256 checksum How to use checksums |
f71d35ab2d2fc57ab37a40f937926f3a68307d7843681ce06edd86ac472d6fde
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|
Release files / srmp-0.2.0-cp312-cp312-manylinux_2_35_x86_64.whl
| Download URL | srmp-0.2.0-cp312-cp312-manylinux_2_35_x86_64.whl |
|---|---|
| Size | 13.2 MB |
| Tags | CPython 3.12 Linux glibc 2.35+ x86-64 |
|
SHA-256 checksum How to use checksums |
4537bd5e61f84d17a52ea070e2be4ca275ca7c66d2f5ea4ba28a5fe80707d109
|
|
BLAKE2b-256 checksum How to use checksums |
9fb7a146cbd7eee4f46fe0d62f61af1aadafa3835752765db708f54a172a7e19
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|
Release files / srmp-0.2.0-cp311-cp311-manylinux_2_35_x86_64.whl
| Download URL | srmp-0.2.0-cp311-cp311-manylinux_2_35_x86_64.whl |
|---|---|
| Size | 13.2 MB |
| Tags | CPython 3.11 Linux glibc 2.35+ x86-64 |
|
SHA-256 checksum How to use checksums |
a913f41874bfab899a7c4ef27fce8786ecd9d7f78ce2208e78a4d3d051648033
|
|
BLAKE2b-256 checksum How to use checksums |
eaf61b850c767f20ee234dc89225ff1025bf610a7b1462b80cfafb49c929ba92
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|
Release files / srmp-0.2.0-cp310-cp310-manylinux_2_35_x86_64.whl
| Download URL | srmp-0.2.0-cp310-cp310-manylinux_2_35_x86_64.whl |
|---|---|
| Size | 13.2 MB |
| Tags | CPython 3.10 Linux glibc 2.35+ x86-64 |
|
SHA-256 checksum How to use checksums |
8ea7d8c2d4cdae02112500718a71546d8a1b36b1cb5f1567ad486966f03aa064
|
|
BLAKE2b-256 checksum How to use checksums |
24f5f882d46c8e56b2d82c7bacd7ecb80cd5418e7450c3407b5f4f31b081b39e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|
Release files / srmp-0.2.0-cp39-cp39-manylinux_2_35_x86_64.whl
| Download URL | srmp-0.2.0-cp39-cp39-manylinux_2_35_x86_64.whl |
|---|---|
| Size | 13.2 MB |
| Tags | CPython 3.9 Linux glibc 2.35+ x86-64 |
|
SHA-256 checksum How to use checksums |
ed995d47f754e655c0e6d01ae84395aa6f624b900b964e9c889141f4da2a30a4
|
|
BLAKE2b-256 checksum How to use checksums |
489fe464a47ecfc93a052f8176d17b1d1d4aee3bb11eb8a76a7df6ae243ab851
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|