geodex
geodex plans robot motion on Riemannian manifolds, in Python and in C++. You give it a configuration space, a metric and a collision scene, and it returns a smooth, collision-free path that is short under that metric.
| A Franka FR3 moves a box between shelf compartments with the MoveIt 2 plugin under the kinetic-energy metric. | A Clearpath Jackal plans on SE(2) with the Nav2 plugin and drives through a narrow passage of an office. |
import numpy as np
import geodex
robot = geodex.robots.Panda() # seven joints, the kinetic-energy metric
scene = geodex.Scene()
scene.add_box(position=[0.4, 0.0, 0.3], size=[0.1, 0.1, 0.8])
start = np.array([-1.1, -0.785, 0.0, -2.356, 0.0, 1.571, 0.785])
goal = np.array([1.1, -0.785, 0.0, -2.356, 0.0, 1.571, 0.785])
result = geodex.plan(robot, start, goal, scene, settings=geodex.PlanSettings(iterations=1500, seed=1))
print(result.solved, result.cost, result.path.shape)
Features
- Plan in Python or C++.
geodex.planin Python andgeodex::planning::planin C++ run G-RRT* with informed sampling, then smooth the path under the same metric. - Built-in robots. geodex includes the Franka Panda and FR3, UR5, Baxter, PR2, Hello Robot Stretch 3 and Stretch 4, and a UR5e on a Clearpath Ridgeback or Husky, each with VAMP collision checking and its mass matrix.
- Whole-body planning. geodex plans the base and the arm together on SE(2) × ℝⁿ. A holonomic and a differential-drive base differ only in the base metric.
- Collision-free edges. Robot paths are checked along every edge, not only at waypoints.
- Manifolds and metrics. geodex has ℝⁿ, tori, spheres, SO(2), SO(3), SE(2), SE(3) and their products, with kinetic-energy, left-invariant, clearance and custom metrics.
- ROS 2. A Nav2 global planner (geodex_nav2_planner) and a MoveIt planner (geodex_moveit) run geodex in ROS 2 Jazzy and Lyrical.
- Reproducible. A seed and an iteration budget give the same path on every run on the same platform.
Installation
Python
pip install pygeodex
The package imports as geodex and needs Python 3.12 or newer. On Linux (x86-64 and aarch64,
glibc 2.28 or newer) and macOS (arm64 and x86-64), it includes planning, collision checking and the
built-in robots. On x86-64, collision checking of the built-in robots requires a CPU with AVX2 and
FMA, and planning with a Python validity function works on any CPU. On Windows and on Linux with
musl, it includes the geometry core only (manifolds, metrics, sampling, distances, interpolation
and the smoother).
Everything with pixi
git clone https://github.com/utiasSTARS/geodex.git && cd geodex
pixi run test # build the OMPL fork with G-RRT*, VAMP, geodex and its Python module, then run the tests
pixi run quickstart # plan the quickstart example, a Panda arm around a post
pixi run docs # build the documentation site into build/docs/sphinx
pixi run install installs geodex and the OMPL fork into .pixi/prefix ($GEODEX_PREFIX).
C++ package
Install Ninja, yaml-cpp and Boost 1.68 or newer with its serialization and program_options libraries first, for example with your system's package manager.
git clone --branch v1.0.0 https://github.com/utiasSTARS/geodex.git
cmake -S geodex -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=<prefix> \
-DGEODEX_OMPL=ON -DGEODEX_BUILD_OMPL=ON -DGEODEX_VAMP=ON
cmake --build build && cmake --install build
The build also compiles the OMPL fork that holds the G-RRT* planner and installs it next to geodex.
scripts/install_geodex.sh <prefix> runs the same steps. A C++ project then adds the prefix to
CMAKE_PREFIX_PATH and links the package.
find_package(geodex 1.0 CONFIG REQUIRED COMPONENTS ompl vamp)
target_link_libraries(my_planner PRIVATE geodex::geodex ompl::ompl)
Documentation
The geodex documentation has the tutorials, the robot guides
and the API reference for Python and C++. To build the site locally, run pixi run docs and open
build/docs/sphinx/index.html.
Citation
If you use geodex in your research, please cite the geodex paper.
@article{kyaw2026geodex,
title = {geodex: A Library for Motion Planning on {Riemannian} Manifolds},
author = {Kyaw, Phone Thiha and Wei, Ben and Samavi, Sepehr and
{Rogel Garcia}, Miguel Angel and Kelly, Jonathan},
journal = {arXiv preprint arXiv:26XX.XXXXX},
year = {2026},
url = {https://arxiv.org/abs/26XX.XXXXX}
}
geodex implements the methods of the papers below. Please also cite the ones your work uses.
Midpoint geodesic distance and interpolation under a Riemannian metric:
@inproceedings{kyaw2026geometry,
title = {Geometry-Aware Sampling-Based Motion Planning on {Riemannian} Manifolds},
author = {Kyaw, Phone Thiha and Kelly, Jonathan},
booktitle = {Proceedings of the 17th World Symposium on the Algorithmic Foundations
of Robotics (WAFR)},
address = {Oulu, Finland},
month = jun,
year = {2026},
url = {https://arxiv.org/abs/2602.00992}
}
The Loewner lower bounds behind the admissible heuristics and the informed sampling:
@article{kyaw2026loewner,
title = {Direct Informed Sampling on {Riemannian} Manifolds via {Loewner} Order
Lower Bounds},
author = {Kyaw, Phone Thiha and Kelly, Jonathan},
journal = {IEEE Robotics and Automation Letters},
year = {2026},
url = {https://arxiv.org/abs/2606.02879}
}
The G-RRT* planner:
@article{kyaw2026greedy,
title = {Greedy Heuristics for Sampling-Based Motion Planning in High-Dimensional
State Spaces},
author = {Kyaw, Phone Thiha and Le, Anh Vu and Mohan, Rajesh Elara and
Kelly, Jonathan},
journal = {Autonomous Robots},
year = {2026},
url = {https://arxiv.org/abs/2405.03411}
}
License
Copyright © 2026 Space and Terrestrial Autonomous Robotic Systems (STARS) Lab.
geodex is licensed under the Apache License 2.0.
Metadata
Release files for pygeodex 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pygeodex-1.0.0.tar.gz | 1.3 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| pygeodex-1.0.0-cp312-abi3-win_amd64.whl | CPython 3.12 | abi3 | Windows x86-64 | Details |
| pygeodex-1.0.0-cp312-abi3-win32.whl | CPython 3.12 | abi3 | Windows x86-32 | Details |
| pygeodex-1.0.0-cp312-abi3-musllinux_1_2_x86_64.whl | CPython 3.12 | abi3 | Linux musl 1.2+ x86-64 | Details |
| pygeodex-1.0.0-cp312-abi3-musllinux_1_2_aarch64.whl | CPython 3.12 | abi3 | Linux musl 1.2+ ARM64 | Details |
| pygeodex-1.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.12 | abi3 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| pygeodex-1.0.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl | CPython 3.12 | abi3 | Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 | Details |
| pygeodex-1.0.0-cp312-abi3-macosx_11_0_x86_64.whl | CPython 3.12 | abi3 | macOS 11.0+ x86-64 | Details |
| pygeodex-1.0.0-cp312-abi3-macosx_11_0_arm64.whl | CPython 3.12 | abi3 | macOS 11.0+ ARM64 | Details |
Total release size: 16.6 MB
Release files / pygeodex-1.0.0.tar.gz
| Download URL | pygeodex-1.0.0.tar.gz |
|---|---|
| Size | 1.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2751375c37dc0a479604dcb8a9c9d48d165caadce45bf0edccaf06ea1cb9e58e
|
|
BLAKE2b-256 checksum How to use checksums |
8aed004bb7cac953872dbfeaf319a07a10b6fd3a23dd1e2769b8704686ae1f5d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|
Release files / pygeodex-1.0.0-cp312-abi3-win_amd64.whl
| Download URL | pygeodex-1.0.0-cp312-abi3-win_amd64.whl |
|---|---|
| Size | 615.5 kB |
| Tags | CPython 3.12 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
66981d7f44fc72ca1c549b83b98f4406aaff06a4cdf6579e2e44055382160f2a
|
|
BLAKE2b-256 checksum How to use checksums |
174d493ab7b91527713a8ab082d9c8b482fe3d09dfa709857e3d877d807d9f83
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|
Release files / pygeodex-1.0.0-cp312-abi3-win32.whl
| Download URL | pygeodex-1.0.0-cp312-abi3-win32.whl |
|---|---|
| Size | 590.9 kB |
| Tags | CPython 3.12 Windows x86-32 abi3 |
|
SHA-256 checksum How to use checksums |
5413ebac1dd20e213e3ae13f30e53fa96251a80be88d0b8c55064cc93aae6ce7
|
|
BLAKE2b-256 checksum How to use checksums |
2db0326db9e130d249b3497723474fc033c3a17472efb11beaa5cae92a91a036
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|
Release files / pygeodex-1.0.0-cp312-abi3-musllinux_1_2_x86_64.whl
| Download URL | pygeodex-1.0.0-cp312-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 682.3 kB |
| Tags | CPython 3.12 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
197329c8d01f1612e3660025eed8a4b19738f6d967cf6608786dca3e3f147509
|
|
BLAKE2b-256 checksum How to use checksums |
9dbb10b51bf07709131bb05330717b63895c693c4cfad60797218476901f4970
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|
Release files / pygeodex-1.0.0-cp312-abi3-musllinux_1_2_aarch64.whl
| Download URL | pygeodex-1.0.0-cp312-abi3-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 661.1 kB |
| Tags | CPython 3.12 Linux musl 1.2+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
bc93146adbc6a26d35ee8ff17c32295fe009a53df642fe6e7afca353a1615025
|
|
BLAKE2b-256 checksum How to use checksums |
7fbcdd995aaa511ca41c7388f876fcf4d9a051e92a5f903c58ac4771074d037b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|
Release files / pygeodex-1.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pygeodex-1.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 4.5 MB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
3e87bc7b117460759392feec50954d23ef7617a0b0fe2d138ab0be3a05ac1a69
|
|
BLAKE2b-256 checksum How to use checksums |
2952ab56edfcb7381bb2eee0e930205a3949bb22ef86ffd82978b48cb1e9c4b6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|
Release files / pygeodex-1.0.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | pygeodex-1.0.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | CPython 3.12 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
aa023fe9044cf300f68d7c3f5769ac11b5c615ef54b4f5cefafd72c520f4ef07
|
|
BLAKE2b-256 checksum How to use checksums |
c0a3b2bf4ef75956e5a8575ff562426503d99934ca28cc4bf4ee042e40f39fd0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|
Release files / pygeodex-1.0.0-cp312-abi3-macosx_11_0_x86_64.whl
| Download URL | pygeodex-1.0.0-cp312-abi3-macosx_11_0_x86_64.whl |
|---|---|
| Size | 3.4 MB |
| Tags | CPython 3.12 abi3 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
b6d78aae4ff820703ddb798ebecc5488d7a054aac09c205bc3c456f4492add5c
|
|
BLAKE2b-256 checksum How to use checksums |
0ca985b6a826a676ff65c9ff78650b673b2ddba388705176cd64d48135548b4a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|
Release files / pygeodex-1.0.0-cp312-abi3-macosx_11_0_arm64.whl
| Download URL | pygeodex-1.0.0-cp312-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.12 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
5d940c40620d479dd1067428bdacea081ffc129c6eab5f2e2d357ff9d60f9107
|
|
BLAKE2b-256 checksum How to use checksums |
62be511b81ef6813977e9a5fb8051485c76cfe4221177187b2417bff4d09c212
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|