Skip to the content
FixTheRobot Explore Robotics / UAV / Module 7 / M7-T14

UAV Systems Engineering · Module 7

M7-T14: Communication bandwidth

Capacity, not nominal speed, is what you can use. Budget every link with protocol overhead and headroom.

  • Lesson 14 of 19
  • Embedded Systems, Timing and System Integration
  • Established engineering
  • About 6 minutes to read

A link is as full as its busiest stream. Raw images, point clouds and logs can saturate an onboard network, and a telemetry radio carries only a trickle. A bandwidth budget prevents the usual surprises: dropped messages, growing latency and a ground station that goes silent when you enable one more stream.

Learning objectives

After this lesson, you should be able to:

  • Compute the data rate of image, point-cloud and message streams including overhead.
  • Estimate usable capacity of serial, Ethernet and radio links.
  • Allocate streams to links with priorities and headroom.
  • Reduce load by compression, decimation, regions of interest and QoS.

Conceptual explanation

Established Rate arithmetic is exact; usable capacity depends on hardware and protocol and must be measured. Example numbers are illustrative.

Data rate = message size × rate. For images: width × height × bytes per pixel × frames per second (uncompressed). For point clouds: points per scan × bytes per point × scan rate. For messages: (payload + protocol overhead) × rate. Usable capacity is lower than the nominal rate because of protocol overhead, retransmissions, contention and half-duplex turnaround.

undefined
LinkTypical useUsable-capacity notes
Serial UART (8N1)Flight controller ↔ companion (MAVLink)10 bits per byte on the wire, so 921 600 baud is about 92 kB/s at most before framing overhead
EthernetSensors, lidar, DDS between computersNominal rate shared; multicast discovery and DDS overhead add load; use switches, not hubs
USBCameras, storageShared bus bandwidth between devices on one controller; USB cameras can saturate a controller
Telemetry radioGround station linkOften tens to hundreds of kbit/s; shared by all MAVLink streams
Video downlinkFPV or inspection videoVariable; depends on the radio, range and codec

Reduction strategies: stream only what the consumer needs (regions of interest, decimated point clouds, compressed images), keep high-rate raw data onboard and send summaries, and use QoS (best effort, small depth) so overload sheds old data instead of building latency.

Bandwidth budget by linkEach link has a usable capacity far below its nominal rate. Streams are assigned to links with rates, protocol overhead and priorities; the sum, with headroom, must fit the capacity of every link.Sensor busUSB / CSI / SPIOnboard networkEthernet, DDSAutopilot linkUART, MAVLinkTelemetry radiolow rateVideo downlinkvariable rateThe tightest link sets what can be streamed. Plan it per link, not overall.
Plan bandwidth per link; the tightest link decides.
Animation of a message link modelled as a single-server queue with a service rate of one thousand messages per second. The offered load is raised from ten to ninety-seven per cent of capacity. The dots are the mean and 99th percentile of the delay measured in a simulation of the queue; the lines are the closed-form M/M/1 results. The delay stays near the service time until utilisation passes about eighty per cent and then grows without bound as it approaches one hundred per cent.
For a Poisson load on a single link the mean delay is 1/(μ−λ)1/(\mu -\lambda ) and the 99th percentile is ln⁡(100)/(μ−λ)\ln (100)/(\mu -\lambda ). Size a link for 50–70 % utilisation of its worst-case stream, and shape traffic so that bulk data never competes with control. Simulated with the Lindley recursion, 200 000 messages per load. (Looping, about 5 seconds; drawn and computed for this course with illustrative values.)

Engineering intuition

Compressing before sending is the biggest lever, but it costs CPU and latency; compressing a 1080p stream with a hardware encoder reduces it by one to two orders of magnitude, a software JPEG by perhaps 10×. Sending only a region or a lower frame rate is free. The consumer defines the requirement: a VIO front end needs the full-rate grayscale images onboard; the operator needs a modest video on the ground; the logger needs everything but can write to local storage at its own pace.

When a link is saturated you rarely see an error. You see rising latency, bursty arrivals and silently dropped samples: precisely the symptoms of a timing problem. Check link utilisation before chasing a software cause.

Mathematical formulation

Stream rates:

Raw data rates (bytes per second)
Rimage=W H b fR_{\text{image}} = W\,H\,b\,f
Rcloud=Npts bpt fscanR_{\text{cloud}} = N_{\text{pts}}\,b_{\text{pt}}\,f_{\text{scan}}
Rmsg=(npayload+noverhead) fR_{\text{msg}} = (n_{\text{payload}} + n_{\text{overhead}})\,f

Examples: a 1280×720 8-bit grayscale stream at 30 fps is 1280 × 720 × 1 × 30 = 27.6 MB/s = 221 Mbit/s; a 640×480 stream at 30 fps is 9.2 MB/s (74 Mbit/s). A 64-beam lidar producing 1.3 million points per second at 16 bytes per point is 20.8 MB/s. The usable Ethernet capacity at a nominal 1 Gbit/s is perhaps 940 Mbit/s of payload for large frames. The headroom check for a link of capacity CC and streams with rates RiR_{i}:

Link budget with headroom
∑iRi≤(1−h) C\sum_i R_i \le (1-h)\,C
Headroom h ≥ 0.3 is typical for links that carry real-time traffic.

Latency from serialisation: a message of nn bytes on a link of rate rr adds n/r seconds per hop (for example a 1 MB frame at 100 Mbit/s takes 80 ms to send), which is a lower bound on added latency before any queueing.

WW, HH, bb, ff
image width, height, bytes per pixel, frame rate.
NptsN_{\text{pts}}, bptb_{\text{pt}}
points per scan and bytes per point.
CC, hh
link capacity and headroom fraction.

Architecture and data flow

Sensors → onboard switch → companion (perception) and logger; companion → flight controller (UART, MAVLink/DDS at tens of Hz, small messages); flight controller → telemetry radio → ground station (few streams at low rates); companion → video encoder → downlink radio. Each hop has its own rate and its own queue; the budget lists them with source, destination, protocol, rate and priority (the interface control document carries the same table).

Real-world UAV applications

  • Deciding which topics to bridge to the ground.
  • Choosing between a camera on USB and on MIPI CSI.
  • Setting MAVLink stream rates for a serial telemetry link.
  • Sizing the onboard network for a lidar plus cameras plus logging.

Implementation example

This runs as shown. A link-budget checker: streams with sizes and rates, links with nominal capacity and an efficiency factor, and a headroom rule; it flags overloaded links and computes the MAVLink serial budget.

streams = [  # name, link, bytes per message, rate Hz, protocol overhead bytes per message
    ('cam0 gray 640x480', 'onboard-eth', 640 * 480, 30, 80), ('cam1 gray 640x480', 'onboard-eth', 640 * 480, 30, 80),
    ('lidar points', 'onboard-eth', 20_800_000 // 20, 20, 60), ('imu 400 Hz', 'onboard-eth', 60, 400, 80),
    ('mavlink attitude', 'uart', 28, 50, 12), ('mavlink local pos', 'uart', 28, 50, 12), ('mavlink odometry in', 'uart', 233, 30, 12), ('mavlink heartbeat', 'uart', 9, 1, 12),
    ('telemetry attitude', 'radio', 28, 4, 12), ('telemetry gps', 'radio', 30, 2, 12), ('telemetry status', 'radio', 31, 2, 12)]
links = {'onboard-eth': (1e9, 0.94, 8), 'uart': (921600, 0.80, 10), 'radio': (57600, 0.75, 10)}   # nominal bit/s, usable fraction, wire bits per byte
h = 0.3
def check(streams, verbose=True):
    failed = []
    for name, (bps, eff, bits_per_byte) in links.items():
        load = sum((b + o) * r * bits_per_byte for s, l, b, r, o in streams if l == name); cap = bps * eff
        if verbose: print(f"{name:>11}: load {load / 1e6:8.3f} Mbit/s of usable {cap / 1e6:8.3f} ({load / cap:5.1%}) -> {'OK' if load <= (1 - h) * cap else 'OVER BUDGET'}")
        if load > (1 - h) * cap: failed.append(name)
    return failed
print("baseline over budget:", check(streams))
more = streams + [('cam2 gray 1280x720', 'onboard-eth', 1280 * 720, 30, 80), ('cam3 gray 1280x720', 'onboard-eth', 1280 * 720, 30, 80)]
print("with two more 720p cameras over budget:", check(more))
assert check(streams, False) == [] and check(more, False) == ['onboard-eth']
assert abs(1280 * 720 * 30 * 8 / 1e6 - 221.184) < 1e-6 and abs(640 * 480 * 30 / 1e6 - 9.216) < 1e-9
A link-budget checker with protocol overhead, usable capacity and headroom. All numbers are illustrative.

Common engineering mistakes

Using nominal link rates

Usable capacity is lower; measure it.

Forgetting protocol and discovery overhead

DDS discovery and message headers add real load.

Sending raw images to the ground

Compress, crop or decimate; send what the operator needs.

No headroom on real-time links

Bursts push latency up when load is near capacity.

Sharing a USB controller between several cameras

They contend for the same bandwidth.

Failure modes

Failure modes, symptoms and causes
Failure modeHow it shows upLikely cause
Telemetry stalls when a stream is enabledGround station freezes or dropsRadio link saturated by added streams
Latency and drops on the onboard networkLate camera framesAggregate load near link capacity, multicast flooding
Frame drops on USB camerasMissing framesSeveral cameras on one USB controller
Rising delay over timeData age growsUnbounded queues on an overloaded link

Debugging approach

  1. Measure per-link utilisation (ifconfig/ip -s, iftop, ros2 topic bw).
  2. Check each topic’s rate and size with ros2 topic hz and bw.
  3. Temporarily disable streams one by one to find the offender.
  4. Check the MAVLink stream rates and the radio’s reported link quality.

Practical exercises

  1. Compute the data rate of four 1280×800 mono cameras at 20 fps and decide which link can carry them.
  2. Reduce the load of the lidar stream by decimation and by cropping and compare the savings.
  3. Compute the MAVLink budget of ten message types at their rates for a 57 600 baud radio.
  4. Draw the bandwidth map of your vehicle with streams, links and loads.

Interview questions

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

Question 1

How do you budget a communication link?

Model answer

Compute each stream’s rate including overhead, sum per link, compare with usable (not nominal) capacity and require headroom; reduce load by compression, decimation and region of interest where needed.

Question 2

Why do saturated links look like timing problems?

Model answer

Queues grow, delays vary and samples drop silently, producing jitter and stale data rather than errors.

Question 3

What data should stay onboard?

Model answer

High-rate raw sensor data needed only by onboard consumers; send summaries and operator-relevant data over the limited downlink.

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

M7-T15: Sensor calibration

Calibrate camera intrinsics and distortion, evaluate reprojection error, and decide when to recalibrate.