Skip to main content

airo-drake

Python package to simplify working with Drake in combination with airo-mono.

Key motivation:

  • 🔋Batteries included: Drake is a powerful robotics toolbox, but it can have a steep learning curve. If you've worked with Drake, you likely ended up deep in the C++ documentation or in Russ Tedrake's manipulation repo looking for guidance. airo-drake aims to be a batteries included Python package to get you up and running quickly with your own robot scenes in Drake!

Overview 🧾

Use cases - we currently use Drake mainly for:

  • 🎨 Visualization
  • 💥 Collision checking
  • ⏱️ Time parameterization of paths
  • 🎯 Inverse kinematics (numerically, via Drake, from URDF)

Features:

  • 🏗️ Help building scenes
  • 📈 Visualization functions for TCP poses, IK solutions, robot arm trajectories
  • 🔄 Converting airo-mono types to Drake types

Design choices:

  • 🍃 Lightweight: We try to limit duplicating or wrapping Drake, and prefer adding examples over convenience functions.
  • 🔓 Opt-in: drake can function as full blown physics simulator, but for many use cases you dont need it, so we make sure this is opt-in.

Inverse Kinematics 🦾

airo_drake.Kinematics does forward and inverse kinematics with Drake from a single-arm URDF. Build one from a URDF file, then call FK/IK on it.

import airo_models
from airo_drake import Kinematics, X_URBASE_ROSBASE

kinematics = Kinematics.from_urdf_path(airo_models.get_urdf_path("ur5e"), base_transform=X_URBASE_ROSBASE)
result = kinematics.inverse_kinematics_closest(tcp_pose, q_seed)  # KinematicsResult | None

inverse_kinematics_closest is a local numerical solve (Drake's InverseKinematics), seeded at q_seed with a stay-near-seed cost, so pick a seed close to the expected solution (e.g. the arm's current configuration). Only single-arm URDFs are supported.

Pass gripper_transform to do FK/IK on a gripper's TCP instead of the arm's flange (tool0) -- e.g. X_URTOOL0_ROBOTIQ, the same transform add_manipulator uses to weld a Robotiq gripper on:

kinematics = Kinematics.from_urdf_path(
    airo_models.get_urdf_path("ur5e"), base_transform=X_URBASE_ROSBASE, gripper_transform=X_URTOOL0_ROBOTIQ
)
result = kinematics.inverse_kinematics_closest(tcp_pose, q_seed, tool_frame_name="gripper_tcp")

Calibration (UR only) 🎯

Every physical UR arm has its own calibrated DH parameters, which differ slightly from the nominal DH parameters baked into the airo_models URDFs and into ur-analytic-ik's closed-form solution; enough to cause ~1-2mm TCP error.

For some use cases, this error is not a problem. Yet, it inhibits precise motion. You can avoid it by using the calibrated DH parameters from the robot's control box.

airo_drake.CalibratedKinematics is a Kinematics subclass for exactly this: built from a calibrated DH dict instead of a URDF file (read_calibrated_dh/calibrated_dh_to_urdf build the URDF straight from a UR controller), with the same API. Analytic IK can't consume calibrated DH directly, but it's still the right tool for picking which joint-configuration branch to use. Pass analytic_ik_model (a ur-analytic-ik robot module, e.g. ur_analytic_ik.ur5e) and inverse_kinematics_closest transparently does the analytic branch-pick first, then the calibrated numerical refine, through the same call:

calibrated_kinematics = CalibratedKinematics(dh, "ur5e", analytic_ik_model=ur_analytic_ik.ur5e)
result = calibrated_kinematics.inverse_kinematics_closest(tcp_pose, q_seed)

gripper_transform also works here, as in Kinematics above.

See notebooks/06_calibrated_urdf.ipynb, and to try it on a real arm, run scripts/manual_calibrated_ik_hardware_test.py (make sure to pass the right model to --model, e.g., ur3e).

This calibrated model is for kinematics only. It has no visual or collision geometry, so it can't be mistaken for a collision or visualization model. Always use the regular airo_models mesh model (add_manipulator) for collision checking and visualization. As the ~1-2mm calibration delta is far below normal collision padding, it stays valid for the real robot.

Getting started 🚀

Complete the Installation 🔧 and then dive right into the notebooks 📔!

Installation 🔧

airo-drake is available on PyPi and installable with pip:

pip install airo-drake

However it depends on airo-typing from airo-mono which is not on PyPi, so you have to install that yourself.

Developer guide 🛠️

See the airo-mono developer guide. A very similar process and tools are used for this package.

Releasing 🏷️

See airo-models, releasing airo-drake works the same way.

Release files for airo-drake 0.0.9

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for airo-drake 0.0.9
File Size Uploaded
airo_drake-0.0.9.tar.gz 39.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for airo-drake 0.0.9
File Interpreter ABI Platform
airo_drake-0.0.9-py3-none-any.whl Python 3 none any Details

Total release size: 80.9 kB

Release files / airo_drake-0.0.9.tar.gz

Download URL airo_drake-0.0.9.tar.gz
Size 39.0 kB
Tags Source
SHA-256 checksum
How to use checksums
190e6ffb2e9715fd1db0b1cc5d49699b4cbf31ce723df08444839c2161e3ae1c
BLAKE2b-256 checksum
How to use checksums
d77ad2bc331e69502874a4c6d5a59ca92269f6617474c54e941a330f80fb5d7a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 17, 2026.

Transparency log

Release files / airo_drake-0.0.9-py3-none-any.whl

Download URL airo_drake-0.0.9-py3-none-any.whl
Size 41.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0c5d1344afe8c2272c592e5acd693bf06ff5d7e577f43e75e2fd3e62ee600842
BLAKE2b-256 checksum
How to use checksums
f109e2bc6da808718e3dc57daed757b70a2e37cb19316295addffeb0bb5beb0f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 17, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.0.9 This release

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page