UAV Systems Engineering · Module 8
M8-T5: Flight-test planning
A flight test is an experiment with a hypothesis, a safe envelope and a way to stop. Plan it that way.
The cheapest crash is the one prevented by a test card. Staged flight testing keeps risk bounded: each flight extends the envelope by a small, reviewed step, with explicit abort criteria and a safety pilot in the loop. This lesson turns that into a checklist and a script that checks a test card for completeness.
Learning objectives
After this lesson, you should be able to:
- Write a test card with objective, configuration, entry criteria, steps, abort criteria and data to record.
- Plan a staged build-up of test points for a navigation capability.
- Define safety measures: pilot, observer, geofence, kill switch, site risk assessment.
- Handle data and debriefs so that every flight produces usable, versioned evidence.
Conceptual explanation
Established The staged build-up with test cards, abort criteria and a safety pilot is standard in flight-test practice and uncrewed-aircraft testing. Regulatory requirements for operating a UAV (permissions, airspace, insurance, operator qualifications) depend on the jurisdiction and are outside this lesson: comply with the rules that apply where you fly.
Elements of a test plan:
- Test points: the specific conditions to be flown (a hover, a 10 m translation, a 30 m route in the lit corridor, GNSS disabled for 60 s, a deliberate VO dropout), ordered from low to high risk.
- Test card per flight: objective, hypothesis, configuration (baseline ID), entry criteria, step list, abort criteria, expected result, data to record and who is responsible for each action.
- Safety measures: a safety pilot able to take manual control at any time, a flight termination or kill switch tested on the ground, a geofence and return-to-launch configuration, a clear area, an observer, weather limits, a site risk assessment, an emergency plan.
- Build-up: change one thing per step (environment, speed, duration, autonomy level), and proceed only after reviewing the log of the previous step.
- Debrief and data: logs, video and notes archived with the baseline; surprises become defects or new test points.

Engineering intuition
The pilot’s authority is the key safety element. Autonomy testing without a safety pilot who knows the abort criteria and has practised the takeover is just hoping. The abort criteria must be written before the flight, in measurable terms (“abort if horizontal position innovation test ratio exceeds 1.0 for more than 1 s”, “if position error from the reference exceeds 1.5 m”, “if battery below 30 %”), so that no decision has to be made under stress.
Build-up rules: each flight changes one variable; if it passes, the next step extends one variable. When something unexpected happens, step back to the last known good condition and understand it before going forward. Schedule pressure is the usual reason this discipline is dropped; the test plan is where you resist it.
Mathematical formulation
Risk of a test point can be reasoned about as likelihood × severity, with the severity bounded by the safety measures. For a planned excursion, the maximum position excursion from a failure that is detected after and acted on after at speed is
For example at 3 m/s with a detection time of 0.5 s, pilot reaction of 1.0 s and braking at , the excursion is 3 × 1.5 + 9/6 = 6 m, so a safety distance of at least 6 m plus margin must exist in every direction of travel; at 6 m/s it becomes 6 × 1.5 + 36/6 = 15 m. This is why speed is the variable to build up slowly. The number of flights needed for a statistical claim follows the requirement’s statistic (see the requirements lesson): the test plan must contain enough repetitions at the condition that the requirement’s claim is made.
- vehicle speed (m/s).
- ,
- detection time and action (pilot reaction) time (s).
- braking deceleration .
- available clear distance.
Architecture and data flow
Test plan (test points, mapping to requirements) → per-flight test card (baseline ID, configuration manifest) → pre-flight checklist and go/no-go → flight with live monitoring (ground station, safety pilot, observer calling aborts) → logs, video, notes → debrief within a day → analysis scripts produce metrics and pass/fail → results attached to the traceability matrix → decision on the next test card. Anomalies go to the defect tracker with the log excerpts.
Real-world UAV applications
- Staged testing of a new VIO configuration outdoors.
- First flights of GNSS-denied navigation with a safety pilot.
- Fault-injection flights with bounded consequences.
- Preparing acceptance flights against measurable criteria.
Implementation example
This runs as shown. A test-card checker: it verifies that every card has the required fields, measurable abort criteria, a safety pilot, an excursion distance that fits the available clear distance, and an entry criterion that refers to the previous card’s result. The cards are illustrative.
import re
REQUIRED = ['id', 'objective', 'baseline', 'entry', 'steps', 'abort', 'record', 'pilot', 'speed_mps', 'clear_m']
cards = [
dict(id='FT-01', objective='hover 60 s in the lit corridor with VIO fused; confirm estimator health', baseline='v1.4', entry=['ground checks passed', 'HIL pass'],
steps=['arm', 'take off to 2 m', 'hover 60 s', 'land'], abort=['pilot takeover if position error > 0.5 m', 'abort if EKF test ratio > 1.0 for 1 s', 'battery < 30 %'],
record=['ulog', 'video', 'motion capture'], pilot='A. Pilot', speed_mps=0.0, clear_m=6.0),
dict(id='FT-02', objective='translate 10 m at 1 m/s with VIO; compare with motion capture', baseline='v1.4', entry=['FT-01 pass'],
steps=['take off', 'fly 10 m', 'hold', 'return', 'land'], abort=['pilot takeover if position error > 1.0 m', 'abort if EKF test ratio > 1.0 for 1 s'],
record=['ulog', 'video', 'motion capture'], pilot='A. Pilot', speed_mps=1.0, clear_m=6.0),
dict(id='FT-03', objective='GNSS-denied 5-minute route at 4 m/s', baseline='v1.4', entry=['all good'],
steps=['take off', 'fly route'], abort=['abort if it looks bad'], record=['ulog'], pilot='', speed_mps=4.0, clear_m=6.0)]
def excursion(v, Td=0.5, Ta=1.0, ab=3.0): return v * (Td + Ta) + v * v / (2 * ab)
def check(cards):
problems = []; prev = None
for c in cards:
for k in REQUIRED:
if not c.get(k) and not (k == 'speed_mps'): problems.append(f"{c['id']}: missing {k}")
for a in c.get('abort', []):
if not re.search(r'\d', a): problems.append(f"{c['id']}: abort criterion not measurable: '{a}'")
if excursion(c['speed_mps']) + 1.0 > c['clear_m']: problems.append(f"{c['id']}: excursion {excursion(c['speed_mps']):.1f} m + 1 m margin exceeds clear distance {c['clear_m']} m")
if prev and not any(prev['id'] in e for e in c['entry']): problems.append(f"{c['id']}: entry criteria do not require {prev['id']}")
prev = c
return problems
for p in check(cards): print("PROBLEM:", p)
assert abs(excursion(3.0) - 6.0) < 1e-9 and abs(excursion(6.0) - 15.0) < 1e-9
assert not any(p.startswith('FT-01') or p.startswith('FT-02') for p in check(cards)) and sum(p.startswith('FT-03') for p in check(cards)) >= 4Common engineering mistakes
No written abort criteria
Decisions under stress are slow and inconsistent; write measurable criteria.
Changing several things per flight
A failure cannot be attributed; change one variable.
Flying without a tested kill switch or takeover
Test the safety systems on the ground first.
Skipping the log review between flights
Warning signs in the data of flight predict the failure of flight n+1.
Ignoring the legal and site requirements
Follow the applicable regulations and get permissions before flying.
Failure modes
| Failure mode | How it shows up | Likely cause |
|---|---|---|
| Crash during the first autonomous flight | Loss of the vehicle | No staged build-up; no abort criteria |
| Abort too late | Excursion exceeds the clear space | Detection and reaction times underestimated; speed too high |
| Test results not usable | No baseline or reference data | Data not planned or archived |
| Repeat of an earlier failure | Same defect reappears | Debrief findings not captured as defects or test points |
Debugging approach
- Review the abort thresholds against logged margins from earlier flights.
- Measure pilot reaction times and the vehicle’s braking distance in a safe test.
- Check that the baseline ID and manifest are on every card.
- Review the data returned against the planned recordings.
Practical exercises
- Write the build-up of test points for a 5-minute GNSS-denied inspection route (at least six steps).
- Compute the excursion distance for 5 m/s with , and .
- Write measurable abort criteria for a VIO dropout test.
- Design the debrief checklist for one flight.
Interview questions
Write an answer in your own words, then reveal the model answer. Nothing is sent anywhere.
Question 1
What goes on a flight test card?
Model answer
Objective and hypothesis, baseline and configuration, entry criteria, step list, measurable abort criteria, data to record, roles (pilot, observer), and the expected result.
Question 2
Why build up in small steps?
Model answer
To bound the consequence of an unexpected outcome and to keep failures attributable to the single change made; each step is reviewed before the next.
Question 3
How do you set the safety distance for a test point?
Model answer
From the excursion: speed times detection and reaction time plus braking distance, plus margin, which must fit within the clear area in every direction of travel.
References and further reading
Primary papers, official documentation and standards. Each claim above that is specific to a tool or version points here.