Flight Performance
Flight performance analysis derives the speed envelope, mission speeds, climb capability, range, and endurance from aerodynamic and propulsion outputs. The core objective is to compare, at each speed point, the thrust/power required for level flight against the thrust/power the system can actually provide, and to keep this comparison physically consistent.
Method
Setuav solves this as a coupled velocity sweep. The aerodynamic side first computes level-flight \(C_L\), \(C_D\), drag, and required power; then the propulsion side is evaluated with a single shared model. That shared model is PropulsionAnalyzer.solve_required_thrust_sweep(...), which uses the same motor-propeller-battery equilibrium solver used by propulsion analysis. As a result, range/endurance, cruise, and envelope metrics in flight performance remain consistent with the propulsion electrical model.
Preparation
Input Preparation
The analyzer uses the following inputs and maps them into solution variables:
| Input | Solution mapping |
|---|---|
aero.cl_max |
\(C_{L,\max}\) for stall-speed calculation |
aero.area |
Reference area \(S\) (mm^2 -> m^2) |
aero.polars.cl_values, aero.polars.cd_values |
\(C_D(C_L)\) interpolation |
aero.cd_min |
Constant-drag fallback when polar is missing |
aero.ld_max |
max_ld_ratio, glide_ratio outputs |
aero.operating_velocity |
best_ld speed output |
total_mass |
Weight \(W = mg\) |
air_density |
Density \(\rho\) |
battery_capacity |
Energy-based range/endurance (mAh -> Ah) |
design.propulsion |
Voltage-window validation and propulsion solver setup |
Configuration Inputs
The fields used directly by this class are:
| Config field | Solution mapping |
|---|---|
config.performance.velocity_min |
Lower bound of velocity sweep |
config.performance.velocity_max |
Upper bound of velocity sweep |
config.performance.velocity_steps |
Number of velocity points |
config.performance.stall_margin |
Minimum safe speed: \(V_{\min}=V_{\text{stall}}\cdot\text{stall\_margin}\) |
config.propulsion.usable_capacity_ratio |
Usable battery-energy scaling factor |
Solution
The solution runs the same sequence over one shared velocity array and produces all curves on that array.
Stall Speed and Velocity Bounds
Stall speed is computed from lift equilibrium:
Sweep start is not simply the configured minimum. It is clamped to the safe start speed: \(V_{\text{start}}=\max(V_{\text{stall}}\cdot\text{stall\_margin},\,V_{\min,config})\).
Level-Flight Power Required
At each speed point, required lift coefficient is:
Then \(C_D\) is obtained from polar interpolation \(C_D(C_L)\); outside the polar bounds, parabolic extrapolation is used:
Drag and required power:
Coupled Propulsion Solve (Single Model)
For the same velocity array, the required-thrust curve is passed to propulsion:
Here \(P_{\text{avail}}\) is available propulsive power, while \(P_{\text{batt,req}}\) is battery-side electrical power required to hold the level-flight point.
Endurance and Range Curves
Energy is computed from the same electrical model output \(P_{\text{batt,req}}\). Usable battery energy:
For only feasible points with positive required electrical power:
Optimal Speeds
On the feasible mission mask:
best_endurance: speed with minimum \(P_{\text{batt,req}}\)best_range: speed with maximumrange_curvebest_climb: speed with maximum \((P_{\text{avail}}-P_{\text{req}})\)best_ld: directlyaero.operating_velocity
In this analyzer, reported cruise_speed is assigned as best_range in the raw
calculation flow. In other words, cruise selection is driven by direct range
maximization, without an additional UI/operational rule at this step.
Raw-data alternatives for cruise definition:
best_endurance-based cruise:
choose speed minimizing \(P_{\text{batt,req}}(V)\); objective is maximum loiter time.best_climb-based cruise:
choose speed maximizing \((P_{\text{avail}}-P_{\text{req}})\); objective is climb-phase priority.best_ld-based cruise:
choose aerodynamic-efficiency reference speed (aero.operating_velocity).
Performance Metrics and Cruise Point
Maximum speed is taken as the last feasible velocity point. Climb rate is:
Best climb angle is computed at the maximum excess-power point using \(\sin\gamma=\text{RoC}/V\).
Cruise is not computed by a separate approximate model; it is solved with the same propulsion operating-point solver via solve_required_thrust_operating_point(...).
Invalidity and Fallback Behavior
If battery voltage is incompatible with motor/ESC voltage windows, analysis returns a zeroed result. If no propulsion solver is available, available-power/thrust curves remain zero and powered metrics are limited. If battery capacity is not available, range/endurance curves and related metrics remain zero.