Skip to the content
FixTheRobot Explore Robotics / UAV / Module 8 / M8-T2

UAV Systems Engineering · Module 8

M8-T2: Requirements decomposition

A system requirement is met by subsystems that each own a slice. The slices must add up the right way, with margin.

  • Lesson 2 of 18
  • Safety, Verification and Flight Testing
  • Established engineering
  • About 5 minutes to read

Position error at the system level is made of IMU bias, camera calibration, timing, scale, drift of the odometry and the controller’s tracking. Each has an owner. Decomposition assigns each owner a budget so that the sum, computed correctly, meets the system requirement. Add the wrong way (linearly for independent errors, or by rss for correlated ones) and the budget lies.

Learning objectives

After this lesson, you should be able to:

  • Allocate a system requirement to subsystems as derived requirements with owners.
  • Combine independent and correlated error contributions correctly.
  • Set and track margins through design, with a budget at every level.
  • Identify when a budget cannot be met and the available responses.

Conceptual explanation

Established Budget allocation with root-sum-square for independent contributions and linear sum for worst-case or correlated ones is standard systems and error-budget practice. The numbers in the example are illustrative.

Decomposition breaks a system requirement into derived requirements on subsystems, with a clear owner, a threshold and a verification method for each. Three rules:

  • Completeness: the derived requirements together must be sufficient to meet the parent (which is shown by the budget, not asserted).
  • Allocation with budgets: for additive quantities (error, latency, mass, power) assign each subsystem a share, with explicit margin held at the system level.
  • Traceability: each derived requirement points to its parent; each parent lists its children; changing one triggers review of the other (see the traceability lesson).

For example the horizontal position error over a GNSS-denied segment might be decomposed into: odometry drift per distance (perception team), time-offset-induced error (integration team), calibration-induced error (calibration owner), and controller tracking error (control team), each with a number and a verification.

Allocation and error budgetA system requirement is allocated to subsystems as derived requirements whose combined effect meets the parent, using a budget (error, latency, power, mass). The budget is checked by summing in the right way and verified at each level.System requirement2 m drift (p95)Allocationto subsystemsBudgetrss, sum, marginDerived requirementsper subsystemRoll-upcheck, iterateAllocate, add up correctly, keep margin, and verify at every level.
Allocate, budget, derive, roll up.
Animation of an error budget. A one-metre position requirement is divided between four independent error sources, each allocated a 95 per cent bound of 0.5, 0.4, 0.3 and 0.2 metres. Samples of the combined error accumulate in a histogram. The 95th percentile of the combined error converges to the root-sum-square of the allocations, 0.71 metres, not to their linear sum of 1.4 metres, so the linear budget wastes margin when the errors are independent.
If allocated bounds are 95 % bounds of independent zero-mean errors, the combined 95 % bound is the root-sum-square, not the sum. Use the linear sum for errors that are fully correlated or unbounded in distribution, and state which assumption each allocation relies on. Monte Carlo with Gaussian errors, σ\sigma ᵢ = bound/1.96. (Looping, about 5 seconds; drawn and computed for this course with illustrative values.)

Engineering intuition

Independent random errors add in quadrature: two independent 1 m errors give 2≈1.41 m\sqrt{2}\approx 1.41\,\mathrm{m}, not 2 m. Worst-case (systematic or fully correlated) errors add linearly. Most real budgets are mixed: some terms are random (noise), some are biases (calibration), and some are correlated (the same time offset affects everything). Treating everything as independent understates the total; treating everything as worst case over-constrains the design and costs money and weight.

Margin is not slack to be spent by the first team that finds it. Hold margin at the system level, allocate it back only on a reviewed decision, and track it as the design matures: early in design 30–50 % margin is common; at flight readiness it should have shrunk to a small number backed by measurements.

Mathematical formulation

For independent contributions with standard deviations σi\sigma _{i} the combined standard deviation is the root-sum-square (RSS); for contributions that are worst-case bounded (biases) with bounds bjb_{j} the combined bound is the linear sum. A mixed budget:

Independent random terms
σtotal=∑iσi2\sigma_{\text{total}} = \sqrt{\sum_i \sigma_i^{2}}
Biases (worst case)
btotal=∑jbjb_{\text{total}} = \sum_j b_j
Budget
k σtotal+btotal≤Reqk\,\sigma_{\text{total}} + b_{\text{total}} \le \text{Req}
k = 1.96 for 95 % of a Gaussian; for 2-D horizontal error use the 2-D percentile.

For a horizontal (2D) error with independent north and east components of equal standard deviation σ\sigma the radial error follows a Rayleigh distribution, whose 95th percentile is σ−2ln⁡0.05=2.448 σ\sigma \sqrt{-2 \ln 0.05}=2.448\,\sigma (not 1.96 σ1.96\,\sigma ), and whose 50th percentile is 1.177 σ1.177\,\sigma . Margin MM = (Req − predicted)/Req. Correlation ρ\rho between two terms changes the combination to σ12+σ22+2ρσ1σ2\sqrt{\sigma _{1}^{2} + \sigma _{2}^{2} + 2\rho \sigma _{1}\sigma _{2}}; for ρ=1\rho =1 it equals σ1+σ2\sigma _{1}+\sigma _{2}. When a budget cannot be met the responses, in order of preference, are: reduce the largest contributor, change the design (add a sensor), relax the requirement with the stakeholder, or reduce the operating condition (shorter segments).

σi\sigma _{i}
standard deviation of random contribution ii.
bjb_{j}
bound of bias contribution jj.
ρ\rho
correlation coefficient between two contributions.
MM
margin as a fraction of the requirement.

Architecture and data flow

System requirement (with ID) → error-budget table (contributors, type, value, source of the value: analysis, simulation or measurement, owner) → derived requirements per subsystem → verification at the subsystem level (bench, SIL) → roll-up recalculated from measured values → margin report at each design review. The budget file lives in the repository next to the requirements and is recomputed by a script whenever a measured value changes.

Real-world UAV applications

  • Budgeting drift for a visual-inertial system over a stated segment length.
  • Allocating latency across perception, planning and control.
  • Power and mass budgets per mode.
  • Deciding which subsystem to improve when the roll-up fails.

Implementation example

This runs as shown. An error budget for a 2D position error: random terms by RSS, bias terms by linear sum, 2D Rayleigh percentile, and a Monte Carlo check of the analytic roll-up. Values are illustrative placeholders; replace them with measured ones.

import numpy as np
rng = np.random.default_rng(31)
# ILLUSTRATIVE budget for horizontal position error over a 5-minute GNSS-denied segment (metres, per axis)
random_terms = {'odometry noise growth': 0.60, 'time-offset induced': 0.25, 'tracking jitter': 0.20}          # standard deviations per axis
bias_terms = {'scale error x distance': 0.35, 'extrinsic rotation error': 0.20}                                  # worst-case bounds (m)
Req = 2.0                                                                                                      # 95th percentile horizontal error (m)
k95 = np.sqrt(-2 * np.log(0.05))                                                                               # Rayleigh p95 factor for 2D
def rollup(random_terms, bias_terms):
    sigma = np.sqrt(sum(v * v for v in random_terms.values())); bias = sum(bias_terms.values()); pred = k95 * sigma + bias
    return sigma, bias, pred, (Req - pred) / Req
sigma, bias, pred, margin = rollup(random_terms, bias_terms)
print(f"v1: sigma per axis {sigma:.3f} m (RSS), bias {bias:.2f} m (sum), predicted p95 horizontal error {pred:.2f} m, margin {margin:.0%} -> {'PASS' if margin >= 0.1 else 'FAIL (margin below 10 %)'}")
better = dict(random_terms, **{'odometry noise growth': 0.35})                                                 # response: reduce the largest contributor (better odometry front end)
sigma2, bias2, pred2, margin2 = rollup(better, bias_terms)
print(f"v2: odometry noise reduced to 0.35 m: predicted p95 {pred2:.2f} m, margin {margin2:.0%} -> {'PASS' if margin2 >= 0.1 else 'FAIL'}")
# Monte Carlo check of v2: random terms Gaussian per axis, biases at their worst-case direction (aligned with one axis)
n = 400000; e = rng.normal(0, sigma2, (n, 2)); r = np.hypot(e[:, 0] + bias2, e[:, 1])
print(f"Monte Carlo p95 with the bias aligned to one axis: {np.percentile(r, 95):.2f} m (analytic bound {pred2:.2f})")
assert abs(k95 - 2.4477) < 1e-3 and np.percentile(r, 95) <= pred2 + 1e-6 and margin < 0.1 <= margin2
indep = np.sqrt(0.6 ** 2 + 0.25 ** 2 + 0.2 ** 2); lin = 0.6 + 0.25 + 0.2
print(f"RSS {indep:.2f} m versus linear sum {lin:.2f} m for the random terms: choosing the wrong rule changes the answer by {lin / indep - 1:.0%}")
assert lin > indep
An error budget with RSS for random terms, linear sum for biases and a 2D Rayleigh percentile, checked by Monte Carlo.

Common engineering mistakes

Adding independent errors linearly

Over-constrains and wastes margin.

Adding biases in quadrature

Understates the worst case.

Using 1.96σ for a 2D error

The 2D radial error has a higher percentile factor (2.45σ at 95 %).

Spending margin early

Hold system-level margin; release it by decision.

Budget values with no source

Each value needs a measurement, an analysis or a reference.

Failure modes

Failure modes, symptoms and causes
Failure modeHow it shows upLikely cause
Roll-up fails at integrationSum exceeds the requirementEarly budget used optimistic values
One team blamed for the totalDispute about ownershipNo allocation or owners
Margin gone before testNo room for surprisesMargin spent without tracking
Correlated errors under-countedReal error larger than predictedIndependence assumed where a common cause exists

Debugging approach

  1. Recompute the roll-up from measured values and compare with the allocation.
  2. Rank contributors by their contribution to the variance.
  3. Look for common causes (shared clock, shared calibration) that correlate terms.
  4. Check the budget with a simulation using the real error models.

Practical exercises

  1. Add a time-offset-induced term for 3 ms offset at 5 m/s (velocity × offset) and update the budget.
  2. Compute the 95th percentile of a 2D error with σ=0.8 m\sigma =0.8\,\mathrm{m} per axis.
  3. Find which single contributor must be halved to give 30 % margin.
  4. Write three derived requirements with owners for the budget above.

Interview questions

Write an answer in your own words, then reveal the model answer. Nothing is sent anywhere.

Question 1

How do you combine independent and biased errors in a budget?

Model answer

Independent random terms add in quadrature (RSS); biases or fully correlated terms add linearly; then apply the appropriate percentile factor and compare with the requirement, keeping margin.

Question 2

Why is the 2D 95th percentile not 1.96σ1.96\sigma ?

Model answer

The radial error of two independent Gaussian components is Rayleigh distributed, whose 95th percentile is about 2.45σ2.45\sigma .

Question 3

What do you do when a budget cannot be met?

Model answer

Reduce the largest contributor, change the design, negotiate the requirement or limit the operating condition, in a reviewed decision with the traceability updated.

References and further reading

Primary papers, official documentation and standards. Each claim above that is specific to a tool or version points here.

What’s next

Mark this lesson

Saved in this browser and synced to your account when you are signed in.

Next lesson

M8-T3: Verification and validation

Distinguish verification from validation, and choose test, analysis, inspection or demonstration for each requirement.