systems.builtin.deterministic.continuous.PVTOL

systems.builtin.deterministic.continuous.PVTOL(*args, **kwargs)

Planar Vertical Take-Off and Landing (PVTOL) aircraft - second-order formulation.

Physical System:

A simplified model of a VTOL aircraft (helicopter, drone) constrained to move in a vertical plane.

The aircraft has: - Two thrust actuators (left and right, or front and back) - Ability to rotate (pitch) and translate (x, y) - Gravity acting downward - Thrust-vectoring through body rotation

Key feature: Underactuated with 2 inputs controlling 3 degrees of freedom. Must use rotation (θ) to control horizontal motion (x).

Coordinate Frame:

This implementation uses body-fixed velocity coordinates, which is common in aircraft dynamics: - Position (x, y): In inertial (world) frame - Velocities (ẋ, ẏ): In body frame (rotates with aircraft) - Angle θ: Pitch angle in inertial frame

State Space:

State: x = [x, y, θ, ẋ, ẏ, θ̇] Position coordinates (inertial frame): - x: Horizontal position [m] (positive right) - y: Vertical position [m] (positive up) - θ (theta): Pitch angle [rad] * θ = 0: level (horizontal orientation) * θ > 0: nose up (pitched back) * θ < 0: nose down (pitched forward)

Velocity coordinates (body frame):
- ẋ (x_dot): Velocity in body x-direction [m/s]
- ẏ (y_dot): Velocity in body y-direction [m/s]
- θ̇ (theta_dot): Angular velocity [rad/s]

Control: u = [u₁, u₂] - u₁: Left/front thrust [N] - u₂: Right/back thrust [N] Both must be non-negative in physical systems (thrust-only)

Output: y = [x, y, θ] - Measures position and orientation

Dynamics:

The PVTOL dynamics in body frame are:

ẍ_body = ẏ·θ̇ - g·sin(θ)
ÿ_body = -ẋ·θ̇ - g·cos(θ) + (u₁ + u₂)/m
θ̈ = d/I · (u₁ - u₂)

Horizontal acceleration (ẍ_body): - ẏ·θ̇: Centrifugal effect from rotation - -g·sin(θ): Gravity component in body x-direction - Controlled indirectly through angle θ

Vertical acceleration (ÿ_body): - -ẋ·θ̇: Coriolis effect from rotation - -g·cos(θ): Gravity component in body y-direction - (u₁ + u₂)/m: Total thrust divided by mass

Angular acceleration (θ̈): - d/I · (u₁ - u₂): Torque from differential thrust - d: Distance from center of mass to thrusters - I: Moment of inertia

Parameters:

length : float, default=0.25 Half-distance between thrusters [m]. Also interpreted as distance from center of mass to each thruster. Larger L → more control authority for rotation (more torque per thrust difference). mass : float, default=4.0 Total mass of aircraft [kg]. Larger mass → slower acceleration response, more thrust needed to hover. inertia : float, default=0.0475 Moment of inertia about center of mass [kg·m²]. Larger I → slower rotational response. gravity : float, default=9.8 Gravitational acceleration [m/s²]. dist : float, default=0.25 Lever arm for torque generation [m]. Often equals length. Determines θ̈ = (dist/inertia)·(u₁ - u₂).

Equilibria:

Hovering (level flight): x_eq = [x, y, 0, 0, 0, 0] (any position, level, stationary) u_eq = [mg/2, mg/2] (equal thrust, each supporting half weight)

At hover: - Total thrust balances gravity: u₁ + u₂ = mg - Differential thrust is zero: u₁ - u₂ = 0 - No rotation: θ = 0

Tilted hover (advanced): For x_eq = [x, y, θ*, 0, 0, 0] with θ* ≠ 0: Requires different thrust distribution to maintain position

See Also:

SymbolicQuadrotor2D : Similar flying vehicle, different parameterization CartPole : Another underactuated system Manipulator2Link : Multi-body system with coupling