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
pip install udaanMuJoCo 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]"# 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 MP4from 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.])Full API reference, controller roadmap, and tutorials coming soon at udaan.readthedocs.io.
BSD 3-Clause License. See LICENSE for details.






