Guidance, Navigation and Control · Theory · M10
M10-T5 — Handling Qualities, Margins and Envelope Protection
A control system is judged by numbers that someone else wrote down: margins, mode boundaries and envelope limits. Knowing what each measures is what lets you design to it, and argue with it.
The previous lessons designed loops and landed an aircraft. Whether the result is acceptable is decided against requirements: margins for the loops, boundaries on the modes that a pilot feels, and limits on how far a command may take the aircraft. This lesson computes each for the small aircraft: the control anticipation parameter and damping of the short period against example level-1 boundaries, the loop-at-a-time and disk margins of the pitch loop with servo and delay (and how fast a delay of 80 ms erodes them), and an angle-of-attack protection that keeps a hard pull-up from stalling.
Learning objectives
After this lesson, you should be able to:
- Compute n/α, the control anticipation parameter and the short-period damping, and compare them with level-1 boundaries.
- Compute the gain, phase and disk margins of a loop with a servo and a delay, and the effect of dispersions.
- State the usual margin requirement and say why a disk margin is a better statement than two numbers.
- Add angle-of-attack protection and show its effect on a hard pull-up.
The intuition
UAV M6-T3: PX4 architecture and UAV M6-T6: Flight modes show how a flight stack exposes limits and modes to a user. Here the question is where the limits come from: the standards and criteria by which a flight control system is judged, applied to an aircraft whose numbers we have computed in the previous lessons. Hopper has the same need: its gimbal limit of 0.15 rad plays the part of an angle-of-attack limit, and the pitch command limit of the lateral loop keeps the commanded gimbal inside it.
What handling-quality criteria measure
A pilot controlling pitch with the stick wants the aircraft to respond predictably: neither sluggish nor twitchy. Criteria quantify this from the short-period model. The load factor per unit angle of attack, (10.2 per rad here), says how much the lift changes per degree. The control anticipation parameter relates the initial angular acceleration to the eventual load factor, which is what a pilot anticipates; its level-1 range in the example boundaries is 0.28 to 3.6, with short-period damping between 0.35 and 1.30 (these are the usual example boundaries for a certain class of aircraft; the governing specification must be consulted). For the example aircraft CAP = 2.40 and the damping is 0.71, inside. Making the aircraft more stable () raises CAP to 4.9 and the damping drops to 0.50: CAP is outside the boundary and the aircraft is too sharp. Making it much less stable () gives CAP 1.42 and damping 0.92: fine.
Margin requirements
The loops must have margins against the modelling errors of the previous modules. The commonly quoted requirement, written as 6 dB gain margin and 45° phase margin at the nominal condition and about 4.5 dB and 30° at dispersed conditions, is a pair of numbers; each loop-at-a-time margin leaves the combinations uncovered, as the disk margin of M5-T7: Robustness Beyond Gain and Phase Margin showed. For the pitch-attitude loop of the autopilot cut at the elevator, with a servo at 20 rad/s and a 40 ms delay, the phase margin is 56°, the gain margin 11.4 dB and the disk margin 0.80 (gain ×0.43 to ×2.35 and ±44° together). Dispersions: half the static stability (52° and 0.79), a servo at 12 rad/s (49° and 0.70), a delay of 80 ms (39°, 5.8 dB and 0.48), the two together (33°, 5.3 dB and 0.42). The last two fail the 6 dB nominal requirement; a delay of 80 ms is enough to violate the specification.
Envelope protection
An aircraft stalls at an angle of attack of 14.9° (CL_max/CL_α = 1.3/5 per rad). A pilot, or an outer loop, that holds a large nose-up command will drive the aircraft past it. A protection law watches the angle of attack and subtracts a nose-down term once it passes a threshold, here 75% of the stall angle (11.2°). With a held stick of 11.5°, 17.2° and 22.9° the peak angle of attack is 9.3°, 13.9° and 18.6° without protection (the last past the stall) and 9.3°, 11.6° and 12.1° with it. The peak load factor falls from 4.31 g to 3.15 g in the last case.
Requirements are numbers on the modes, the margins and the envelope. Compute them in the same models you design with, include the servo and the delay, and check them at the dispersed conditions, where they fail first.
Definitions
- Load factor per angle of attack
- : the change of load factor per radian of angle of attack.
- Control anticipation parameter (CAP)
- : the ratio of the initial pitch acceleration per unit load factor.
- Level 1
- The best handling-quality category: satisfactory without pilot compensation.
- Gain margin, phase margin
- The factor by which the loop gain can rise, and the phase that can be added, before instability, one at a time.
- Envelope protection
- A control law that modifies or limits a command so that a quantity (angle of attack, load factor, bank) stays inside a limit.
Derivation: CAP, and the effect of a delay on the margins
Why the combination ωsp² over n/α is the quantity the pilot feels.
At the instant of a stick input the pitch acceleration is the control effectiveness times the deflection; nothing else has had time to respond.
In the steady pull-up the elevator holds an angle of attack and a load factor proportional to it.
For the short-period approximation the steady angle of attack per unit elevator satisfies (the stiffness of the angle of attack in pitch), so the ratio is CAP.
A delay against the margins
A delay leaves the gain unchanged and subtracts radians of phase.
At the gain crossover 7.57 rad/s an extra 40 ms of delay subtracts about 17° of phase margin: from 56° to 39° in the example, as computed.
The delay margin of the loop with the 40 ms already in it: 130 ms beyond it before instability, which a requirement of 6 dB and 45° does not state directly.
CAP and short-period damping measure what the pilot feels in pitch; the loop margins measure robustness. A delay costs ωc times its length in radians of phase, so a faster loop is more sensitive to it. Protection laws leave full authority below the threshold and take it away above.
A worked example
The small aircraft of the earlier lessons: m/s, ; the pitch-attitude autopilot with .
- CAP. = 10.19 per rad. For = −0.1, −0.5, −1.5, −3.0: = 3.81, 4.95, 7.04, 9.33 rad/s; damping 0.92, 0.71, 0.50, 0.38; CAP 1.42, 2.40, 4.86, 8.53. The first two are inside the example boundaries (CAP 0.28 to 3.6, damping 0.35 to 1.30), the last two outside.
- Nominal margins. The pitch loop cut at the elevator with a 20 rad/s servo and a 40 ms delay: crossover 7.57 rad/s, phase margin 56°, gain margin 11.4 dB at 19.4 rad/s, disk margin 0.80 (gain ×0.43 to ×2.35, ±44° together).
- Dispersions. Half the static stability: PM 52°, disk 0.79. 1.5× the static stability: 60°, 0.82. 20% less lift slope: 55°, 0.80. Servo at 12 rad/s: 49°, 11.0 dB, 0.70. Delay of 80 ms: 39°, 5.8 dB, 0.48. Servo at 12 rad/s and 80 ms together: 33°, 5.3 dB, 0.42.
- Against the requirement. The nominal case passes 6 dB and 45°; the 80 ms delay cases fail the 6 dB nominal requirement (5.8 and 5.3 dB) but pass 4.5 dB and 30° at dispersed conditions.
- Protection. Stall angle 14.9°; threshold 11.2° (75%). A held stick of 11.5°, 17.2°, 22.9°: peak α 9.3°, 13.9°, 18.6° without protection (62%, 94%, 125% of stall; the last stalls, load factor 4.31 g) and 9.3°, 11.6°, 12.1° with it (62%, 78%, 81%; 3.15 g).
import math, cmath
import gnckit as g
U0, G = 25.0, 9.81
Xu, Zu, Zw, Mw, Mq = -0.06, -0.80, -4.0, -0.5, -3.0
Kq, Kth = 0.5, 2.0
print('Short-period handling qualities: n/alpha = -Zw U0 / g (load factor per radian of angle of attack), CAP = wsp^2 / (n/alpha)')
nalpha = -Zw * U0 / G
print(f' n/alpha = {nalpha:.2f} per rad')
for mw in (-0.1, -0.5, -1.5, -3.0):
w2 = Zw * Mq - U0 * mw
wsp = math.sqrt(w2); zsp = -(Zw + Mq) / (2 * wsp)
cap = w2 / nalpha
ok = (0.28 <= cap <= 3.6) and (0.35 <= zsp <= 1.30)
print(f' M_w = {mw:5.2f}: wsp = {wsp:5.2f} rad/s, zeta = {zsp:4.2f}, CAP = {cap:5.2f} ' + ('inside the example boundaries (CAP 0.28 to 3.6, zeta 0.35 to 1.30)' if ok else 'OUTSIDE the example boundaries'))
# margins of the pitch-attitude autopilot (rate and angle loops, as in the previous lesson), cut at the actuator, with a servo and a delay
A5 = [[Xu - 0.3, 0.0, 0.0, -G, 0.0], [Zu, Zw, U0, 0.0, 0.0], [0.0, Mw, Mq, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0, 0.0], [0.0, -1.0, 0.0, U0, 0.0]]
B5 = [0.0, 9.0, 14.0, 0.0, 0.0]
def loop(w, servo=20.0, delay=0.04, mw=Mw, zw=Zw):
A = [row[:] for row in A5]; A[2][1] = mw; A[1][1] = zw
gq = g.ss_freq(A, B5, [0, 0, 1, 0, 0], 0.0, w)
gt = g.ss_freq(A, B5, [0, 0, 0, 1, 0], 0.0, w)
s = 1j * w
return (Kq * gq + Kth * gt) * servo / (s + servo) * cmath.exp(-s * delay)
ws = g.logspace(-2, 2.3, 6000)
def margins(**kw):
prev = None; ph = None; last = None; unw = 0.0
pm = wc = None; gm = None; wpc = None
for w in ws:
v = loop(w, **kw); a = math.degrees(cmath.phase(v))
if last is None: unw = a
else:
d = a - last
while d > 180: d -= 360
while d < -180: d += 360
unw += d
last = a
if prev is not None:
if abs(prev[0]) > 1 >= abs(v): wc = w; pm = 180 + unw
if prev[1] > -180 >= unw and gm is None: wpc = w; gm = 1 / abs(v)
prev = (abs(v), unw)
peak = max(abs(1 - 2 / (1 + loop(w, **kw))) for w in ws)
alpha = 2 / peak
return wc, pm, gm, wpc, alpha
wc, pm, gm, wpc, alpha = margins()
print(f'pitch-attitude loop cut at the elevator, servo 20 rad/s and a 40 ms delay: gain crossover {wc:.2f} rad/s, phase margin {pm:.0f} deg, gain margin {20 * math.log10(gm):.1f} dB at {wpc:.1f} rad/s, disk margin alpha = {alpha:.2f}')
print(f' disk margin gives gain x{(2 - alpha) / (2 + alpha):.2f} to x{(2 + alpha) / (2 - alpha):.2f} and phase +-{math.degrees(2 * math.atan(alpha / 2)):.0f} deg together')
print(' requirement used in the example: 6 dB and 45 deg nominal; 4.5 dB and 30 deg at dispersed conditions (commonly quoted values; the governing specification must be consulted)')
print('dispersions (all with the same gains):')
for label, kw in (('nominal', {}), ('Mw = -0.25 (half the static stability)', {'mw': -0.25}), ('Mw = -0.75 (1.5x)', {'mw': -0.75}), ('Zw = -3.2 (20% less lift slope)', {'zw': -3.2}), ('servo 12 rad/s', {'servo': 12.0}), ('delay 80 ms', {'delay': 0.08}), ('servo 12 rad/s and delay 80 ms', {'servo': 12.0, 'delay': 0.08})):
wc_, pm_, gm_, wpc_, al_ = margins(**kw)
print(f' {label:40s}: phase margin {pm_:5.1f} deg, gain margin {20 * math.log10(gm_):5.1f} dB, disk margin {al_:.2f}')
# angle-of-attack protection in a hard pull-up
CLa, CLmax = 5.0, 1.3
a_stall = CLmax / CLa
a_prot = 0.75 * a_stall
print(f'envelope protection: stall angle of attack {math.degrees(a_stall):.1f} deg (CLmax {CLmax} / CL_alpha {CLa}); protection engages at {math.degrees(a_prot):.1f} deg (75%)')
def pull(protect, stick, T=6.0, dt=0.005, Kalpha=20.0):
"""The pilot holds a nose-up stick (elevator-equivalent, rad) with only the pitch damper in the loop; protection subtracts Kalpha (alpha - alpha_prot) above the threshold."""
x = [0.0] * 5; amax = 0.0; nmax = 0.0
for i in range(int(T / dt)):
alpha = x[1] / U0
u = stick - Kq * x[2]
if protect and alpha > a_prot:
u -= Kalpha * (alpha - a_prot)
d = g.mat_vec(A5, x)
x = [x[k] + dt * (d[k] + B5[k] * u) for k in range(5)]
amax = max(amax, x[1] / U0)
nmax = max(nmax, 1 + (-Zw * x[1]) / G)
return amax, nmax
for stick in (0.2, 0.3, 0.4):
for protect in (False, True):
am, nm = pull(protect, stick)
print(f' stick {math.degrees(stick):4.1f} deg nose-up, {"with protection" if protect else "no protection "}: peak angle of attack {math.degrees(am):5.1f} deg ({100 * am / a_stall:3.0f}% of stall), peak load factor {nm:.2f} g' + (' STALL' if am > a_stall else ''))Short-period handling qualities: n/alpha = -Zw U0 / g (load factor per radian of angle of attack), CAP = wsp^2 / (n/alpha) n/alpha = 10.19 per rad M_w = -0.10: wsp = 3.81 rad/s, zeta = 0.92, CAP = 1.42 inside the example boundaries (CAP 0.28 to 3.6, zeta 0.35 to 1.30) M_w = -0.50: wsp = 4.95 rad/s, zeta = 0.71, CAP = 2.40 inside the example boundaries (CAP 0.28 to 3.6, zeta 0.35 to 1.30) M_w = -1.50: wsp = 7.04 rad/s, zeta = 0.50, CAP = 4.86 OUTSIDE the example boundaries M_w = -3.00: wsp = 9.33 rad/s, zeta = 0.38, CAP = 8.53 OUTSIDE the example boundaries pitch-attitude loop cut at the elevator, servo 20 rad/s and a 40 ms delay: gain crossover 7.57 rad/s, phase margin 56 deg, gain margin 11.4 dB at 19.4 rad/s, disk margin alpha = 0.80 disk margin gives gain x0.43 to x2.35 and phase +-44 deg together requirement used in the example: 6 dB and 45 deg nominal; 4.5 dB and 30 deg at dispersed conditions (commonly quoted values; the governing specification must be consulted) dispersions (all with the same gains): nominal : phase margin 56.3 deg, gain margin 11.4 dB, disk margin 0.80 Mw = -0.25 (half the static stability) : phase margin 52.3 deg, gain margin 11.4 dB, disk margin 0.79 Mw = -0.75 (1.5x) : phase margin 60.1 deg, gain margin 11.5 dB, disk margin 0.82 Zw = -3.2 (20% less lift slope) : phase margin 55.4 deg, gain margin 11.4 dB, disk margin 0.80 servo 12 rad/s : phase margin 49.3 deg, gain margin 11.0 dB, disk margin 0.70 delay 80 ms : phase margin 38.9 deg, gain margin 5.8 dB, disk margin 0.48 servo 12 rad/s and delay 80 ms : phase margin 33.2 deg, gain margin 5.3 dB, disk margin 0.42 envelope protection: stall angle of attack 14.9 deg (CLmax 1.3 / CL_alpha 5.0); protection engages at 11.2 deg (75%) stick 11.5 deg nose-up, no protection : peak angle of attack 9.3 deg ( 62% of stall), peak load factor 2.65 g stick 11.5 deg nose-up, with protection: peak angle of attack 9.3 deg ( 62% of stall), peak load factor 2.65 g stick 17.2 deg nose-up, no protection : peak angle of attack 13.9 deg ( 94% of stall), peak load factor 3.48 g stick 17.2 deg nose-up, with protection: peak angle of attack 11.6 deg ( 78% of stall), peak load factor 3.06 g stick 22.9 deg nose-up, no protection : peak angle of attack 18.6 deg (125% of stall), peak load factor 4.31 g STALL stick 22.9 deg nose-up, with protection: peak angle of attack 12.1 deg ( 81% of stall), peak load factor 3.15 g
In robotics
These numbers are the interface between the designer and the certification authority.
- Requirements documents. Military and civil standards give boundaries for short-period frequency and damping, CAP, Dutch-roll damping, spiral time to double, and the minimum margins of the flight control system, by flight phase and aircraft class. The values in this lesson are examples to compute with; the governing specification supplies the real ones.
- Latency is margin. A common finding of reviews is that the delay of the digital system (sampling, computation, actuator) consumes the phase margin: 80 ms against 40 ms took the phase margin from 56° to 39° and the gain margin from 11.4 to 5.8 dB. Latency budgets (module 12) are part of the margin budget.
- Protection philosophies. Modern fly-by-wire aircraft protect angle of attack, load factor, bank and speed with laws like this one, with different rules about whether the pilot can override. Small unmanned aircraft use simpler rules (limit pitch and bank commands) for the same purpose.
- Dispersed conditions. Nominal margins are not enough: the requirement applies across the envelope (speed, mass, centre of gravity, altitude) and with uncertain derivatives. The Monte Carlo and stability-margin policy of module 12 organize this.
- Hopper. The analogue for the rocket is the gimbal and rate limit (0.15 rad, 3 rad/s): the lateral loop commands pitch within a limit so that the gimbal stays inside its own, and the margin requirements apply to the same loop with the servo and its delay.
The margin methods are those of M3-T4: The Nyquist Criterion and Stability Margins and M5-T7: Robustness Beyond Gain and Phase Margin; the autopilot is M10-T2: The Autopilot by Successive Loop Closure. The stability-margin policy that turns these numbers into a verification plan is M12-T2: Monte Carlo Dispersion Analysis.
Common misconceptions
“More static stability is always better handling.”
It raises CAP: at the CAP is 4.9, outside the example boundary and too sharp; damping drops to 0.50. Handling qualities have an upper bound as well as a lower one.
“Margins at the nominal condition are what is required.”
They are checked also at dispersed conditions, where they are lower: a servo of 12 rad/s and a delay of 80 ms took the phase margin to 33° and the disk margin to 0.42.
“A pair of margins (6 dB, 45°) guarantees robustness.”
Each is measured with the other quantity at its nominal value. The disk margin covers combined variations, and the example's disk margin of 0.80 corresponds to ±44° of phase together with a gain range of ×0.43 to ×2.35.
“Protection only limits the pilot.”
Below the threshold it has no effect; above, it trades some of the command for safety. In the example it cut the peak angle of attack of a held 22.9° stick from 125% of stall to 81%.
“A little extra delay is harmless in a fast loop.”
A delay costs ωc times its length in phase, so a loop crossing at 7.6 rad/s loses 17° for an extra 40 ms. The faster the loop, the less delay it can tolerate.
Key takeaways
- n/α = −Zw U₀/g = 10.2 per rad; CAP = ωsp²/(n/α) = 2.40 for the example, inside the example level-1 boundaries 0.28 to 3.6.
- More static stability raises CAP and lowers the damping: at Mw = −1.5, CAP 4.9 and ζ 0.50.
- The pitch loop with a 20 rad/s servo and 40 ms delay has PM 56°, GM 11.4 dB and disk margin 0.80.
- An 80 ms delay brings these to 39°, 5.8 dB and 0.48; with a slower servo 33°, 5.3 dB and 0.42.
- A delay costs ωc τ radians of phase: 17° for an extra 40 ms at 7.57 rad/s.
- Angle-of-attack protection (threshold 75% of 14.9° stall) held a 22.9° stick to 12.1° instead of 18.6°.
References and further reading
Each source is marked free or paid. Free to read does not mean free to reuse: the course resources page lists every source with its licence.
- MIL-STD-1797A, Flying Qualities of Piloted Aircraft, US Department of Defense, 1990, the source of the CAP and damping boundaries. Free to read from public document archives; US government work.
- R. P. Harper and G. E. Cooper, "Handling qualities and pilot evaluation", Journal of Guidance, Control, and Dynamics 9(5), 1986, the Wright Brothers lecture. Paid (AIAA).
- P. Seiler, A. Packard and P. Gahinet, "An introduction to disk margins", IEEE Control Systems Magazine 40(5), 2020. Paid (IEEE); the authors' pre-print is on arXiv.
- MIT 16.333 Aircraft Stability and Control (OpenCourseWare) , the lectures on handling qualities. Free; licence CC BY-NC-SA 4.0.
Knowledge check
Three questions. Write an answer, then reveal the explanation. Your answers stay in your browser.
Question 1
An aircraft has ωsp = 6 rad/s, Zw = −3 per second and U₀ = 30 m/s. Compute n/α and CAP, and say whether CAP is inside 0.28 to 3.6.
Explanation
n/α = −Zw U₀/g = 3 × 30/9.81 = 9.17 per rad. CAP = ωsp²/(n/α) = 36/9.17 = 3.93, which is above 3.6, so it is outside the example boundary: the aircraft would feel too sharp, with a large initial pitch acceleration for the load factor it ends up with. Reducing static stability (lowering ωsp to about 5.5 rad/s gives CAP 3.3) would bring it inside.
Question 2
A loop crosses over at 7.6 rad/s with a phase margin of 56°. What phase margin remains after an extra delay of 60 ms, and what is its delay margin?
Explanation
The extra delay costs ωc τ = 7.6 × 0.06 = 0.456 rad = 26°, so the phase margin falls to 30°. The delay margin of the loop before the extra delay is PM/ωc = (56° in radians = 0.977)/7.6 = 0.129 s, so 60 ms is about 47% of it. With 30° of phase margin the loop is below the 45° nominal requirement, though it still meets the 30° requirement for dispersed conditions, and only just.
Question 3
Why is the threshold of the angle-of-attack protection set below the stall angle, and what does the gain Kα control?
Explanation
The aircraft has a delay and a rate of rise: by the time the nose-down term acts, the angle of attack has continued to rise. Setting the threshold at 75% of the stall angle (11.2° for 14.9°) leaves room for that overshoot, which is why the peak was 12.1° and not at the threshold. Kα sets how strongly the angle of attack is pushed back above the threshold: a larger gain gives a lower peak and a stiffer limit, at the price of a harder transition and less pilot authority near the limit.
What’s next
Related content
Nothing below is required to finish this lesson.
- BeforeM10-T4: Approach and Automatic Landing
Track a localizer and a glide slope with range-dependent gains, and design a flare law that meets a touchdown sink-rate requirement.
Other courses on this site treat neighbouring topics from their own angle:
- UAV M1-T2: Multirotor, fixed-wing and VTOL architectures
- UAV M5-T1: UAV equations of motion (wind triangle)
- UAV M6-T6: Flight modes
- UAV M6-T3: PX4 architecture
- Navigation M9-T5: Other Platforms: Legged, Aerial, Marine and Off-Road
This course leaves the following to the pages that already teach them:
Get notified when the next lesson and new labs are released.
One email per new lesson or lab.