A Python MuJoCo-based models and controllers for quadcopter cable-suspended payload systems.
Developed as part of the thesis: Dynamics and Control for Collaborative Aerial Manipulation (Kotaru, 2022). Original research code: vkotaru/floating_models. This package is the cleaned-up public release, refactored with Claude.
🚁 Quadrotor dynamics • 🎛 Geometric control on SE(3)/SO(3) • ⛓ Cable-suspended payloads • 🤝 Multi-quad cooperative transport • 🕹 MuJoCo simulation • 🖥 CLI interface
Installation
pip install udaan
MuJoCo is included as a core dependency. Install all extras (dev, docs, RL):
pip install udaan[all]
For development:
git clone https://github.com/vkotaru/udaan.git
cd udaan
pip install -e ".[all]"
Quick Start
CLI
# Quadrotor with geometric SE(3) control
udaan run quadrotor # MuJoCo (default)
udaan run quadrotor -m base # pure dynamics (no viz)
udaan run quadrotor -m vfx # VPython visualization
# Trajectory tracking
udaan run quadrotor --traj hover -p 1,1,0 # hover (default)
udaan run quadrotor --traj spiral -p 0,0,2 # helical spiral
udaan run quadrotor --traj lissajous -p 0,0,2 # 3D Lissajous
udaan run quadrotor --traj circle -p 0,0,1 # circular
# Cable-suspended payload
udaan run quad-payload -t 10 -c tendon # spatial tendon cable
udaan run quad-payload -t 10 -c links # rigid link chain
udaan run quad-payload -t 10 -c cable # composite cable (experimental)
udaan run quad-payload -t 10 -m vfx # vpython backend
# Multi-quadrotor cooperative transport
udaan run multi-quad -n 3 -t 10 # N-quad pointmass payload
udaan run multi-quad-rigid -t 10 # rigid-body payload
# Fleet: compare controllers side-by-side
udaan run fleet --demo l1-comparison # L1 adaptive vs PD
udaan run fleet --demo gain-sweep # PD gain comparison
udaan run fleet -n 4 --trail # 4 quads with trails
# Cable-payload fleet: compare payload controllers / gains side-by-side
udaan run cspayload-fleet --demo same-gains # 2 agents, default gains
udaan run cspayload-fleet --demo gain-sweep # cable kp/kd × [0.5, 1, 1.5, 2]
udaan run cspayload-fleet --demo gain-sweep --same-start # overlap start, gain-driven divergence
udaan run cspayload-fleet -n 4 # 4 agents, default gains
# Recording
udaan run quadrotor -t 5 -r out.gif # save to GIF
udaan run quadrotor --traj spiral -r spiral.mp4 # save to MP4
Python
from udaan.models.quadrotor import QuadrotorBase, QuadrotorMujoco
# Pure dynamics (no rendering)
mdl = QuadrotorBase()
mdl.simulate(tf=10, position=[1., 1., 0.])
# MuJoCo with visualization
mdl = QuadrotorMujoco(render=True)
mdl.simulate(tf=10, position=[1., 1., 0.])
Documentation
Full API reference, controller roadmap, and tutorials coming soon at udaan.readthedocs.io.
License
BSD 3-Clause License. See LICENSE for details.
Release files for udaan 1.3.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 | |
|---|---|---|---|
| udaan-1.3.0.tar.gz | 77.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| udaan-1.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 184.9 kB
Release files / udaan-1.3.0.tar.gz
| Download URL | udaan-1.3.0.tar.gz |
|---|---|
| Size | 77.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b44eb822021a7b8c457ab9099da19e601d6d2b7d7d2815a528ccf888e3479cfa
|
|
BLAKE2b-256 checksum How to use checksums |
826af238c9e59d1003988c7a1d174c2580f7e8af6d85bade2f81369acd4be909
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Apr 23, 2026.
Transparency logRelease files / udaan-1.3.0-py3-none-any.whl
| Download URL | udaan-1.3.0-py3-none-any.whl |
|---|---|
| Size | 107.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2014ee5830ca4cca91c91d7ac293ed6c4bb0261d09d65408c65b8d82ef628a69
|
|
BLAKE2b-256 checksum How to use checksums |
7cc469aa468f6bcdcd01190b27e92714a8063ff94c6c8fe30d92d76033f286d0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Apr 23, 2026.
Transparency log