Control Saturation Under Disturbance

A controller may calculate the correct response to a wind gust, but the real aircraft can only apply a limited elevator or thrust command. This problem shows how physical actuator limits can turn a theoretically stable controller into a fragile real-world system.

Problem Setup

The Aircraft Is Flying Under Wind Disturbance

This problem builds directly on the wind-disturbance controller problem. The aircraft is exposed to atmospheric disturbance, and the controller tries to reject altitude and pitch error.

But now an additional reality is included: the actuator has physical limits. The controller may calculate a large elevator or thrust correction, but the real aircraft cannot always apply the command.

Main idea: the controller can demand more authority than the aircraft can physically deliver.

This creates a mismatch between what the control law wants and what the aircraft actually receives.

From Ideal Control to Physical Control

Commanded Control Is Not Always Applied Control

In an ideal simulation, the controller output is applied directly to the aircraft:

$$ u_{commanded} = \text{controller output} $$

In a physical system, the actuator can only apply a command within its maximum authority:

$$ u_{applied} = \text{clip}(u_{cmd}, -u_{max}, u_{max}) $$

The controller thinks it is applying the full correction, but the aircraft only receives the saturated command.

Ideal Simulation Physical Aircraft
Controller demand is applied directly Controller demand is limited by actuator authority
No elevator/thrust limit Elevator/thrust command is clipped
Stability may look clean Performance may collapse under disturbance
Longitudinal Aircraft Model with Disturbance

Velocity, Altitude, Pitch, and Limited Control

The simplified aircraft model uses the same basic states from the previous wind-disturbance problem:

The applied input is not always equal to the commanded input:

$$ \dot{V} = -D(V) + a_u u_{applied} + w_V(t) $$ $$ \dot{h} = V\sin(\theta) + w_h(t) $$ $$ \dot{\theta} = b_u u_{applied} - c\theta $$

The terms \(w_V(t)\) and \(w_h(t)\) represent wind disturbance effects. The control input \(u_{applied}\) represents the actual correction delivered by the actuator after saturation.

Controller Demand vs Actuator Capacity

The Controller May Ask for More Than the Aircraft Can Give

During a wind gust, altitude and pitch error increase. The controller reacts by demanding a larger correction.

$$ u_{cmd} = K(h_{target} - h) - K_{\theta}\theta $$

But if \(u_{cmd}\) goes outside the physical actuator limit, the command is clipped:

$$ |u_{cmd}| > u_{max} \Rightarrow \text{actuator saturation} $$
Core visual: plot \(u_{cmd}\), \(u_{applied}\), \(+u_{max}\), and \(-u_{max}\). When the demanded command crosses the limit, the aircraft no longer receives the full correction.
Control Clipping

What Saturation Means Physically

Suppose the controller asks for \(+20^\circ\) elevator, but the actuator limit is \(+8^\circ\). The aircraft only receives \(+8^\circ\).

$$ u_{applied} = \begin{cases} u_{max}, & u_{cmd} > u_{max} \\ u_{cmd}, & -u_{max} \leq u_{cmd} \leq u_{max} \\ -u_{max}, & u_{cmd} < -u_{max} \end{cases} $$

Saturation does not only reduce control authority. It also changes the closed-loop behaviour of the system, because the feedback law is no longer being applied as designed.

Interactive Simulator

Run the Controller With and Without Saturation

Adjust the controller gain, wind strength, gust frequency, damping, actuator limit, and simulation time. Then compare ideal control against physically limited control.

Choose saturation mode:











Performance Collapse

Why Saturation Can Break a Stable Controller

The controller assumes that control authority is available. But when the actuator cannot deliver the command, the correction becomes insufficient.

Under strong wind disturbance, this creates a dangerous feedback loop:

disturbance → error grows → controller demand grows → actuator saturates → correction is insufficient → error grows further

This is why a controller can appear stable in theory but fail in a physical system. The equations may be stable, but the actuator cannot supply the required control.

Performance collapse condition: if the controller spends too much time in saturation, the system no longer behaves like the intended closed-loop design.
Connection to Existing Control Limits Page

How This Connects to Actuator Saturation & Anti-Windup

This aircraft disturbance problem is the physical-flight version of the same control-limit issue shown in the spacecraft anti-windup page.

In both cases, the controller computes a command that the real actuator cannot fully apply.

spacecraft torque saturation ↔ aircraft elevator/thrust saturation

The spacecraft page focuses on torque saturation and integral windup. This page focuses on wind disturbance and limited flight-control authority. Together, they show the same engineering truth from two different systems.

Open Anti-Windup Page →

Engineering Interpretation

Stability Must Be Tested Against Actuator Authority

A controller should not only be tested for mathematical stability. It must also be tested against physical authority limits.

Why This Matters for HAPS

High-altitude aircraft have limited control authority, limited thrust margin, slow response, and long exposure to atmospheric disturbance. A gust may require more correction than the aircraft can provide at that altitude and flight condition.

What the Engineer Should Check

A controller is not complete until the actuator model is included.
Python Implementation

Reproducing the Saturation Effect in Python

The key implementation step is clipping the controller output before applying it to the aircraft model.

import numpy as np

dt = 0.05
t_final = 100
t = np.arange(0, t_final, dt)

h_target = 1000
V = np.zeros_like(t)
h = np.zeros_like(t)
theta = np.zeros_like(t)

u_cmd = np.zeros_like(t)
u_applied = np.zeros_like(t)

V[0] = 25
h[0] = 950
theta[0] = 0

K = 0.04
K_theta = 0.8
damping = 0.25
u_max = 0.16

wind_strength = 7
gust_frequency = 0.10

def wind_gust(time):
    return wind_strength * np.sin(2*np.pi*gust_frequency*time)

for k in range(len(t)-1):
    error = h_target - h[k]
    wind = wind_gust(t[k])

    u_cmd[k] = K*error - K_theta*theta[k]
    u_applied[k] = np.clip(u_cmd[k], -u_max, u_max)

    V_dot = -0.015*(V[k] - 25) + 0.03*u_applied[k] + 0.03*wind
    h_dot = V[k]*np.sin(theta[k]) + 0.7*wind
    theta_dot = 1.2*u_applied[k] - damping*theta[k]

    V[k+1] = V[k] + V_dot*dt
    h[k+1] = h[k] + h_dot*dt
    theta[k+1] = theta[k] + theta_dot*dt
Takeaway

Stable in Theory Does Not Mean Stable Under Physical Limits

A controller can be stable in the equation but fail on the aircraft because the actuator cannot deliver the requested command.

Ideal control

The full controller output is applied directly.

Physical control

The command is clipped by elevator or thrust authority.

Engineering lesson

Always test control laws against actuator limits.

Stability in theory ≠ stability under physical limits.