High-performance inverse kinematics solver optimized for cross-embodiment VLA/AI applications
Project description
EmbodiK
EmbodiK is a high-performance prioritized numerical inverse kinematics library for cross-embodiment robotics and VLA/AI applications. It pairs a C++ core with Python bindings, exposes robot-model utilities without requiring the Python pin package at runtime, and includes interactive examples for collision-aware IK, CoM constraints, teleop, whole-body robots, GPU batch solving, and dual-arm coordination.
✨ Overview
EmbodiK is designed for bringing up IK behavior across different robot bodies without rewriting the solver stack for each model. The public examples focus on a practical path:
- 🧭 start with the smallest fixed-base IK loop.
- 🛡️ add collision, joint-limit, and CoM constraints.
- 🎮 connect the same prioritized IK solver path to teleop input.
- 🤖 scale to bimanual, humanoid, and Spot whole-body examples.
- 🧪 use richer clone-only examples for development, stress testing, and policy rollout.
The intent is to keep Python examples lean: visualization and target plumbing stay in Python, while constraint handling and recovery policy stay in the C++ solver.
The detailed installation notes, API reference, and example walkthroughs live in the official documentation:
https://robodreamer.github.io/embodik/
🚀 Quick Start
Fastest path for most users is the wheel-only PyPI install inside a virtual environment:
python -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
python -m pip install --only-binary=:all: embodik
python -c "import embodik; print(embodik.__version__)"
If that import works, the core package is installed.
If pip cannot find a compatible wheel, use the one-shot source installer for your platform from the Installation Guide. It creates the venv, installs native dependencies, builds EmbodiK, and runs an import smoke test.
To run copied examples from the same venv:
python -m pip install "embodik[examples]"
embodik-examples --copy
cd embodik_examples
python 01_basic_ik_simple.py
Published repaired wheels do not require the Python pin package at runtime.
Source builds use pin or a system Pinocchio install as the native library
provider; keep that provider installed in the environment used to import
EmbodiK.
🎮 Examples
The pip-facing examples are intentionally split by purpose:
| Script | Purpose |
|---|---|
01_basic_ik_simple.py |
Minimal fixed-base IK bring-up for a robot preset or new URDF. |
02_collision_aware_IK.py |
Collision-aware IK behavior demo and advanced tuning surface. |
03_teleop_ik.py |
Small adapter showing how teleop input drives the same IK solver path. |
04_com_constraint_example.py |
CoM support-polygon constraint visualization. |
05_dual_arm_ects.py |
Dual-arm ECTS and orthogonal coordination modes. |
06_bimanual_whole_body_ik.py |
Bimanual whole-body teleop, defaulting to AI Worker and optionally supporting RB-Y1, with CoM and collision handling. |
07_unitree_g1_retargeting_ik.py |
Unitree G1 whole-body retargeting IK with CoM and optional collision handling. |
08_spot_full_body_ik_viser.py |
Spot full-body IK in regular Viser with arm+torso, torso-only, full-body, and two-stage modes. |
09_spot_locomanip_mjviser.py |
Spot locomanipulation ONNX policy rollout in MuJoCo through mjviser. |
Run them from a copied example directory:
python 02_collision_aware_IK.py
python 03_teleop_ik.py
python 06_bimanual_whole_body_ik.py
python 07_unitree_g1_retargeting_ik.py
python 08_spot_full_body_ik_viser.py
The regular Viser Spot full-body IK example uses the standard example
dependencies and includes a bundled Spot-with-arm URDF. The
MuJoCo/mjviser locomanipulation example needs the optional mjviser stack and
includes a bundled public MuJoCo Menagerie Spot-with-arm MJCF scene.
mjviser is the MuJoCo-backed web viewer environment for policy rollout and
interactive simulation. mjviser-teleop is the same viewer stack plus the
optional Seer/xvisio controller dependencies, so use it only when running
--enable-teleop:
python -m pip install "embodik[mjviser]"
embodik-examples --copy
cd embodik_examples
python 09_spot_locomanip_mjviser.py --policy locomanip
python 09_spot_locomanip_mjviser.py --policy locomanip-stationary
# add the optional Seer controller extra when needed:
python -m pip install "embodik[mjviser,teleop]"
python 09_spot_locomanip_mjviser.py --enable-teleop --policy locomanip
From a repository checkout, run the same example from the repository root with the matching Pixi environment:
pixi run -e mjviser spot-locomanip-mjviser --policy locomanip
pixi run -e mjviser-teleop spot-locomanip-mjviser --enable-teleop --policy locomanip
See the Spot locomanipulation guide for mjviser, Seer teleop, solver tuning, and headless validation details.
Most examples default to the Panda preset. Use --robot <key> when a script supports alternate robot presets. See the Examples Guide for the full catalog, helper conventions, and clone-only development examples.
🎬 Preview
Franka Panda collision-free IK
ROBOTIS AI Worker constraint teleop
RB-Y1 bimanual whole-body IK
Unitree G1 retargeting IK
Spot full-body IK
Spot locomanipulation mjviser
🧰 Core Capabilities
- ⚙️ C++ IK core with Nanobind Python bindings.
- 🎯 Hierarchical velocity IK tasks for frames, posture, CoM, and dual-arm coordination.
- 🛡️ Joint-limit, self-collision, and CoM support-polygon constraints.
- 📈 Solver diagnostics for timing, task scaling, and Jacobian condition-number logging.
- 🧭 Lie-group-aware configuration operations for floating-base, quaternion, and continuous joints.
- 🤖 Native Pinocchio-backed robot model utilities exposed through EmbodiK bindings.
- 👁️ Optional Viser visualization for interactive IK demos.
- ⚡ Experimental GPU batch IK and collision tooling for high-throughput research workflows.
📚 Documentation
- Installation - platform setup, source builds, and troubleshooting.
- Quickstart - first IK calls and solver concepts.
- Working with Transforms - transform helpers and SE(3) operations.
- Examples - public scripts and development-only demos.
- API Reference - Python API generated from docstrings.
- GPU Solvers - FI-PeSNS and PPH-SNS batch solver notes.
- Development - local build, tests, and contributor workflow.
🛠️ Development
Use Pixi from a repository clone:
pixi run build
pixi run test
pixi run docs-build
Run examples from the clone:
pixi run python examples/01_basic_ik_simple.py
pixi run python examples/02_collision_aware_IK.py
pixi run python examples/03_teleop_ik.py
Clone-only advanced surfaces live under dev_examples/ and are not copied by embodik-examples --copy.
🗂️ Repository Layout
embodik/
|-- README.md
|-- cpp_core/
| |-- include/embodik/
| `-- src/
|-- python_bindings/
| `-- src/
|-- python/embodik/
|-- examples/
|-- dev_examples/
|-- docs/
|-- scripts/
`-- test/
⭐ Star History
📄 License
EmbodiK is released under the Apache License 2.0. See LICENSE for details. Binary wheels may bundle permissively licensed native dependencies; see THIRD_PARTY_NOTICES.md.
Developer: Andy Park andypark.purdue@gmail.com
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 Distributions
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 embodik-0.20.12.tar.gz.
File metadata
- Download URL: embodik-0.20.12.tar.gz
- Upload date:
- Size: 17.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
602f539a5b7b11cfa97baa9250400473f34936c0ceb12d7d694fda55dc081365
|
|
| MD5 |
8cd31f9a4aa6d9fa2fc07a2b64f877e6
|
|
| BLAKE2b-256 |
1fa318c7084a9ca1fdc0bfbfdaa94c24fea66b5dc7b7f209532c4284c64eb1f3
|
File details
Details for the file embodik-0.20.12-cp312-cp312-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: embodik-0.20.12-cp312-cp312-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 28.1 MB
- Tags: CPython 3.12, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9379d8fb370e31899e38a5cc6d22e446738d7e918033d85622e5f2ca98c5d872
|
|
| MD5 |
8753823b470538cdbf80e785ede39dbe
|
|
| BLAKE2b-256 |
5040d7457862bf6fe73190dbc43a590ceacdc4951c5281b0184c4825b5dc183b
|
File details
Details for the file embodik-0.20.12-cp312-cp312-macosx_14_0_arm64.whl.
File metadata
- Download URL: embodik-0.20.12-cp312-cp312-macosx_14_0_arm64.whl
- Upload date:
- Size: 24.4 MB
- Tags: CPython 3.12, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
acec7ef0ab792b0b625040ec5e5d5ea8ac5ec19c6c59ec013d22fa2b5c428754
|
|
| MD5 |
d9db8cda4cae7bf99aca8cfa5ad5a99b
|
|
| BLAKE2b-256 |
ef1de0a20787edc1170f8b212a063f1b332dae01c9b142208037ea9b1b138a00
|
File details
Details for the file embodik-0.20.12-cp311-cp311-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: embodik-0.20.12-cp311-cp311-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 28.1 MB
- Tags: CPython 3.11, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b820c69abe34d737c54bdef79d0d29e8787a40ed6240564760eaf0a73778b05
|
|
| MD5 |
6286edaaa63b3c30e76b94a014bb0d60
|
|
| BLAKE2b-256 |
7f24610e2230f7cdea6f059043492fd7e7942b8b2aca5802a6717c5f981c6af2
|
File details
Details for the file embodik-0.20.12-cp311-cp311-macosx_14_0_arm64.whl.
File metadata
- Download URL: embodik-0.20.12-cp311-cp311-macosx_14_0_arm64.whl
- Upload date:
- Size: 24.4 MB
- Tags: CPython 3.11, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
da1b93f974d5e11c724dfdc55795fa575e3c83be5bcc9f3515a1bbf0921afd7c
|
|
| MD5 |
2301541755d73f09ff4c5cc1e64d902f
|
|
| BLAKE2b-256 |
1baa41beba1ea6f4aa271a46fa2ef81b2262c80e7aabdb3f5bfad8f4cbd11746
|
File details
Details for the file embodik-0.20.12-cp310-cp310-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: embodik-0.20.12-cp310-cp310-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 28.1 MB
- Tags: CPython 3.10, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e3c20d53182011021d2602a606eb61cba0172a6d818b47252c702872ada31bf4
|
|
| MD5 |
e5f262cc61f71c073d9eeefaa61eb3d9
|
|
| BLAKE2b-256 |
3eeb504527f7ea66ca60428c3263128ba0f859762950c24d0f5b8e33d51f7065
|
File details
Details for the file embodik-0.20.12-cp310-cp310-macosx_14_0_arm64.whl.
File metadata
- Download URL: embodik-0.20.12-cp310-cp310-macosx_14_0_arm64.whl
- Upload date:
- Size: 24.4 MB
- Tags: CPython 3.10, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
208fcadc1ce709b4b68c1c2fef82f5a621c170cf28a71d75b2b5ccdf4d44e156
|
|
| MD5 |
efc2f2f61f5332f39a9f8345d5c6c67d
|
|
| BLAKE2b-256 |
792b563b19e6bbc8fe885a8090c7d40650a820d0b187156751f7fcbdf56bd431
|