SNACK: Moving Thermal Images Over a 50-Byte Radio
Paper SSC26-P1-73, 40th Annual Small Satellite Conference. Written with Samantha Mallari, with Miguel Nunes as principal investigator, at the Hawaiʻi Space Flight Laboratory. This is a short pointer to the work — the paper has the full method and results.

The problem
Student CubeSat missions run on sub-$100 COTS radios. Ours is a HopeRF RFM23BP at 433 MHz, where the FIFO registers cap a message at 50 bytes and the radio is half-duplex — it transmits or receives, never both.
A FLIR Lepton 3.5 thermal frame is ~38.4 KB, or about 854 packets at 45 bytes of payload each. TCP and CFDP spend too much of a tiny link budget on overhead, and stop-and-wait ARQ is worse: every ACK consumes a full uplink slot competing with your own data. The practical result is that missions in this class get stuck with low-rate telemetry instead of science data.
The mechanism
SNACK is a selective negative acknowledgment. Rather than confirming what arrived, the ground reports only what is missing, and defers all of it until the burst finishes.
The ground encodes missing packet indices into a 45-byte bitmap — 360 packet statuses in a single 50-byte uplink window, up to 16.2 KB of missing data requested at once. A full image can be repaired in as few as three request packets. CRC-16 runs per packet and again over the reassembled image.
Results
Four progressive distances, five trials each, from a lab bench to a 1.6 km link between Tantalus Lookout and a rooftop ground station at UH Mānoa.
| Distance | Avg throughput | Avg goodput | Integrity (initial) | Integrity (final) | Recovery |
|---|---|---|---|---|---|
| 5 m | 64.7 kbps | 58.8 kbps | 98.9% | 99.2% | 100% |
| 30 m | 72.2 kbps | 66.3 kbps | 100% | 100% | — |
| 140 m | 72.2 kbps | 66.3 kbps | 100% | 100% | — |
| 1610 m | 52.6 kbps | 47.7 kbps | 97.6% | 98.7% | 48.9% |
Three things the paper unpacks that are easy to misread here: the 5 m numbers are receiver saturation, not poor link quality; 30 m and 140 m are identical because performance is bitrate-bound rather than path-loss-bound; and the 1.6 km average hides a bimodal split, where recovery tracked link stability during the repair window rather than during the initial burst.
Known limitations: an unstable Pi-to-Teensy UART corrupted data upstream of the radio entirely, and the retransmission parameters are fixed rather than adaptive.
The actual code
This is the question I get most often, so here are the real implementations. Two versions exist: the original bare-metal C3M code the paper’s results were measured on, and the current F´ adaptation.
Legacy C3M (bare-metal Teensy — what the paper measured)
- Ground station: builds and sends SNACK requests
- Satellite: parses the SNACK bitmap and retransmits selected packets
- Satellite: indexed packet resend implementation
Current F´ Artemis adaptation
- Integration branch:
epscorc3m-develop - SNACK/downlink protocol guide
- Ground receiver: detects missing packets and builds the retry bitmap
- Satellite Teensy: validates the bitmap and queues requested retransmits
- Satellite Teensy: emits repair packets and another END packet
The exchange, concretely. The satellite retains the captured image buffer, sends a header, then numbered data packets each with a per-packet CRC-16, then an END packet containing a full-image CRC-16. The ground tracks receipt in packetReceived[]; after END it computes the missing indices and sends a retry request (type = 0xBB) carrying a packet count, an offset, and a 45-byte bitmap. Each set bit requests that indexed packet.
One request covers 360 indices, and the ground can send up to three bitmap requests per retry round. The satellite scans the requested bits, rebuilds each packet from its retained buffer, retransmits, and sends another END packet. The ground merges duplicates safely, repeats for up to two retry rounds, and accepts the image only after full-image CRC-16 validation.
Before you reuse this, review three things: the retry timing, the “skip automatic SNACK when 10 or fewer packets are missing” policy, and the fact that SNACK control packets carry no application-layer CRC or authentication. That last one is fine for a terrestrial research link between two radios we control — it is not something to carry into a mission where an unauthenticated control packet matters.
A note on scope
These figures describe the bare-metal implementation measured in the paper. They are terrestrial field-test results, not orbital link performance, and not measurements of our F´ integration — that is related work, not a relabeling of these numbers.
Read the paper
- Paper landing page on USU DigitalCommons — SSC26-P1-73
- Paper PDF · Poster PDF
Supported by NASA EPSCoR grant 80NSSC24M0113, with facilities provided by HSFL.
