udaan.models.mujoco package

Submodules

Module contents

MuJoCo physics backend for Udaan.

Requires mujoco package. Install with: pip install udaan

class udaan.models.mujoco.MujocoModel[source]

Bases: object

__init__(model_path, render=False, record=None)[source]
add_arrow_at(p, R, s, label='', color=None)[source]

Visual markers not yet supported with built-in viewer.

add_marker_at(p, size=None, rgba=None, label='')[source]

Visual markers not yet supported with built-in viewer.

reset()[source]
set_overlay(text)[source]

Set overlay text displayed in the top-left corner.

wait_for_close()[source]

Keep the viewer open until the user closes the window. If recording, save and close immediately instead of holding.

class udaan.models.mujoco.MultiQuadRigidbody[source]

Bases: BaseModel

Multi-quadrotor rigid-body payload MuJoCo model.

4 quadrotors carrying a rigid-body payload connected via cables. Outer loop: position-level thrust vectors (3 per quad). Inner loop: geometric attitude controller converts to wrench.

class State[source]

Bases: object

class CableState[source]

Bases: object

__init__(**kwargs)[source]
reset()[source]
class Odometry[source]

Bases: object

__init__(**kwargs)[source]
reset()[source]
__init__(nQ, **kwargs)[source]
reset()[source]
__init__(**kwargs)[source]
compute_attitude_control(i, thrust_force)[source]

Geometric attitude controller for quadrotor i.

Parameters:
  • i – quadrotor index

  • thrust_force – (3,) desired thrust vector in world frame

Returns:

(4,) [thrust_scalar, Mx, My, Mz] wrench

quad_position_control()[source]

Basic PD hover controller for each quadrotor.

reset(**kwargs)[source]
simulate(tf, **kwargs)[source]
step(action)[source]

Step with position-level thrust vectors (3*nQ).

Parameters:

action – (3*nQ,) thrust force vector per quadrotor.

class udaan.models.mujoco.MultiQuadrotorCSPointmass[source]

Bases: BaseModel

Multi-quadrotor with cable-suspended pointmass payload (MuJoCo).

class State[source]

Bases: object

class Cable[source]

Bases: object

__init__(**kwargs)[source]
reset()[source]
class Quadrotor[source]

Bases: object

__init__(**kwargs)[source]
reset()[source]
__init__(nQ, **kwargs)[source]
reset()[source]
__init__(**kwargs)[source]
compute_attitude_control(i, thrust_force)[source]
quad_position_control()[source]

quadrotor position control

reset(**kwargs)[source]

reset state and time

simulate(tf, **kwargs)[source]
step(u)[source]
udaan.models.mujoco.Quadrotor

alias of QuadrotorMujoco

class udaan.models.mujoco.QuadrotorComparison[source]

Bases: BaseModel

__init__(**kwargs)[source]
add_reference_marker(x, label='xQd')[source]
reset(**kwargs)[source]
set_inertia(I, plant=True)[source]
set_mass(m, plant=True)[source]
step(u)[source]
class udaan.models.mujoco.QuadrotorCsPayloadFleet[source]

Bases: BaseModel

Multiple independent quadrotor-cable-payload agents in one MuJoCo scene.

Each agent keeps its own QuadrotorCsPayloadBase for controller/state bookkeeping; the fleet owns a single MuJoCo model containing N quads + N cables + N payloads.

Usage:

fleet = QuadrotorCsPayloadFleet(num_agents=2, render=True)
fleet[0]._payload_controller.setpoint = lambda t: (target, 0, 0)
fleet[1]._payload_controller.setpoint = lambda t: (target, 0, 0)
fleet.simulate(tf=8.0, payload_positions=[[1,1,0.5], [-1,-1,0.5]])
__init__(**kwargs)[source]
reset(**kwargs)[source]
simulate(tf, **kwargs)[source]

Run closed-loop sim. Each agent uses its own _payload_controller.

step(u)[source]

u is (4 * nQ,): stacked [thrust, Mx, My, Mz] per agent.

class udaan.models.mujoco.QuadrotorFleet[source]

Bases: BaseModel

Multiple independent quadrotors in a single MuJoCo scene.

Each quadrotor has its own controllers and can optionally carry an added mass at an offset (for robustness testing).

Usage:

fleet = QuadrotorFleet(num_quadrotors=3, render=True)
fleet[0].position_controller = MyController(...)

# Add disturbance to quad 1: 0.25kg at [0.2, 0.2, -0.05]
fleet = QuadrotorFleet(
    num_quadrotors=3,
    render=True,
    disturbances={
        1: {"mass": 0.25, "offset": [0.2, 0.2, -0.05]},
    },
)
fleet.simulate(tf=10, position=np.array([0, 0, 1]))
__init__(**kwargs)[source]
reset(**kwargs)[source]
simulate(tf, **kwargs)[source]

Run simulation with each quadrotor using its own controllers.

step(u)[source]

Step all quadrotors. u is (4*nQ,) wrench vector.