Expand description
Missile Works’ RRC3 flight logs, as its mDACS software exports a flight to a CSV file.
The RRC3 is a barometric dual-deploy altimeter (RRC3+ / RRC3 User Manual v1.71, p. 2): it records its pressure at 20 Hz, and its temperature and battery voltage at 1 Hz (p. 23). mDACS works the altitude and the “displacement velocity” out of the pressure (mDACS User Manual Rev 1.71, May 2024, p. 2) and exports “a standard Excel .CSV format”, the columns shown on its chart; “Time, Altitude and Pressure are always exported” (p. 10). One header line names the columns; each row below is one sample:
Time,Altitude,Pressure,Velocity,Temperature,Events,Voltages
0.00,0,1013.20,0,71.60, -,9.20
0.05,2.71,1013.10,1.30,71.60, -,9.20
…
52.30,0,1013.20,0, -Recognition. A header whose names, compared without regard to case and with any bracketed
unit taken off, start Time, Altitude, Pressure, Velocity, and go on with any of
Temperature, Events and Voltages, each at most once. A PerfectFlite export, Time, Altitude, Velocity, …, has no pressure and isn’t one. The cells are separated by commas, or by
semicolons or tabs, in which case a number may be written with a decimal comma: Debrief’s notes
describe a European-locale export, semicolon-separated with decimal commas
(lib/parsers/missileworksRrc3.ts, MIT, the project owner’s own; see
THIRD-PARTY-NOTICES.md). As of 2026-10-12, every one of the 50 RRC3 files among the
project’s sample logs is comma-separated.
Units. Most exports name none; some name each in brackets, as Time [s],Altitude [ft],Pressure [mbar],Velocity [ft/s],Temperature [F],Events,Voltages [V]. A bracketed unit is
taken as written, and one the reader doesn’t know is refused (LogError::Unit). A unit the
header doesn’t name is decided as the table says, and a note on the record states how and on
what evidence:
| Column | Quantity | Read from | When the header names no unit |
|---|---|---|---|
Time | the clock, s | [s] | seconds, from the step: the median step between rows within 5% of 0.05 s, the RRC3’s 20 Hz pressure rate (RRC3 manual p. 23); otherwise assumed, as mDACS’s chart is timed in seconds (mDACS manual p. 8) |
Altitude | Quantity::AltitudeAboveGround | [ft], [m] | feet or meters, from the pressure (below); feet assumed if the pressure can’t tell |
Pressure | Quantity::Pressure | [mbar], [hPa], × 100 Pa | hectopascals if the first row’s value, on the pad, lies within 500 to 1,100 hPa (below) and the highest within the 10 to 1,200 mbar the RRC3 measures (RRC3 manual p. 9); otherwise kept as written |
Velocity | Quantity::Speed, up positive | [ft/s], [mph], [m/s], [km/h] (or the RRC3’s fps, mps, kph) | measured against the altitude (below); otherwise kept as written |
Temperature | Quantity::Temperature | [F], [C] | assumed: °F if the altitude is in feet, °C if in meters, as the RRC3’s unit settings pair them (RRC3 manual p. 12) |
Voltages | Quantity::Voltage | [V] | assumed volts: the RRC3’s battery voltage (mDACS manual p. 2), from a battery of at most 10 V (RRC3 manual p. 6) |
Events | FlightLog::events |
mDACS sets the altitude’s, the velocity’s and the temperature’s units by preference (mDACS manual p. 5), and the velocity’s apart from the altitude’s: as of 2026-10-12, 8 of the 50 RRC3 files among the project’s sample logs write their velocity in miles per hour beside an altitude in feet. The RRC3’s own settings name four sets: feet, °F and ft/s; meters, °C and km/h; feet, °F and mph; meters, °C and m/s, the first the default (RRC3 manual p. 12).
The pressure on the pad. The RRC3 measures 10 to 1,200 mbar, but kilopascals (about 100 at sea level) and inches of mercury (about 30) lie within that too, so the first row’s pressure, taken on the pad, must also be a launch site’s: at least 500 hPa, the U.S. Standard Atmosphere’s pressure about 5,570 m up, above any launch site, and at most 1,100 hPa, above both the highest sea-level pressure on record below 750 m of elevation, 1,083.8 hPa (WMO, Records of Weather and Climate Extremes, as of 31 July 2025), and the standard atmosphere’s 1,066 hPa at the lowest dry land, the Dead Sea’s shore about 430 m below sea level. A pressure outside either range is kept as written, with a note, and the altitude’s unit is then assumed.
The altitude from the pressure. mDACS converts pressure to altitude by NOAA’s pressure
altitude, the standard atmosphere’s (RRC3 manual p. 23), or by a geopotential method that
brings in the day’s temperature and humidity (mDACS manual p. 5). Between the first row, on
the pad (the RRC3 keeps a second of samples from before launch, p. 23), and the row of lowest
pressure, the reader works out the climb the pressure implies in the U.S. Standard Atmosphere,
1976 (hpr_atmos::ussa76) and compares the altitude column’s climb between the same rows,
read in feet and in meters. The unit within 25% of the pressure’s climb is taken: a day’s air
from −40 °C to +50 °C is within about 20% of the standard’s temperature, which is how far the
geopotential method can move the altitude, and feet and meters are 3.28 times apart, so at
most one unit can be within 25%. As of 2026-10-12, over the 50 RRC3 files among the project’s
sample logs, feet came within 0.05% every time and meters at least 227% off. Neither within 25%
is refused (LogError::Unit), as is a stated unit the
pressure contradicts by more. Below a climb of 10 m the pressure can’t settle it: a step of the
pressure, 0.1 hPa in every sample log, is 0.83 m of altitude at sea level, more than 8% of
such a climb. Then, or with a pressure of unknown unit, feet are assumed, the RRC3’s default.
The velocity against the altitude. The velocity is mDACS’s rate of the altitude, in its own unit: ft/s, mph, m/s and km/h are 3.2808, 2.2369, 1 and 3.6 times a speed in m/s. The RRC3 works it out through a 21-element filter at 20 Hz (RRC3 manual p. 23), so it runs behind the altitude, and mDACS may smooth both for its viewer (mDACS manual p. 5). The reader integrates the velocity by trapezoids from zero at the first row, on the pad, and measures the running integral against the altitude above the first row, in meters, two ways:
- By the fit: the least-squares slope, through zero, of the integral against the altitude as it was a delay earlier, the delay from −2 to 4 s, in steps of 0.05 s, that fits best. A velocity that is the altitude’s rate a delay late integrates to the altitude that delay late, times the unit, so the delay is fitted out rather than read as a smaller slope. Smoothing still rounds off the integral’s apogee, which moves the slope.
- By the areas: the area under the integral over the area under the delayed altitude, both
over the record. A filter that passes a steady speed unchanged (one of unit gain) keeps the
area of what it filters, however it delays or spreads it, so this measure holds exactly when
the record runs from rest on the pad to rest on the ground, as the RRC3’s does: it stops
after the velocity has stayed above −3 ft/s for 2 s (RRC3 manual p. 10). A record that ends
with the altitude still moving at a rate
vleaves out aboutσ²·v / 2of the area,σ²the filter’s variance. The reader takesσas the delay (a first-order filter’s spread equals its delay, a moving average’s is 0.58 times it, a pure delay’s is zero),vas the faster of the altitude’s rates over the last second and over the second a delay earlier, and requires the share left out to be at most 0.1%; and the record must end at most halfway up the climb, as near apogee this estimate fails.
The unit is taken only when both measures land within 3% of the same one. ft/s and km/h, the
nearest two, are 9.7% apart, so the runner-up is then at least 6.4% off. As of 2026-10-12, over
the 50 RRC3 files among the project’s sample logs, 48 records end low and still enough, and on
each both measures came within 0.26% of the unit the file is in (ft/s or mph; 4 of them state
it in brackets) and put the runner-up at least 8.8% off; the other 2 records stop before
coming halfway down, so their velocity is kept as written. The 0.1% allowed is more than ten
times the largest share any of those records’ ends could leave out. On invented flights 20 m
to 1 km up, coming down at 10 to 40 m/s, their velocity late by up to 3 s or smoothed by a
first-order filter or a trailing moving average over up to 3 s, in each unit, and cut off at
each tenth of the way through from 30%, none is decided in the wrong unit, and a whole record
up to 1 s late is decided from 50 m up (the module’s tests; tests/rrc3_csv.rs adds km/h and
ft/s flights 1 and 2 s late, 100 to 300 m up). These filters only look back. A smoothing that
also looks ahead, centered on each sample, starts the velocity above rest at the record’s
first row, so the integral misses the start of the climb: over a window of 3 to 5 s, a few in
a thousand such invented flights read about 8% low, enough to take km/h for ft/s. None of the
sample files starts that way. Otherwise the column is kept as written,
Quantity::Unrecognized, with a note: also
when the altitude climbs under 50 m, where half a step of the pressure, 0.42 m at sea level,
is 0.8% of the climb and a larger share of the area of a flight that spends its time low; and
when the altitude’s own unit was only assumed. A stated velocity unit that both measures
place within 3% of another unit is refused.
Events. The Events column marks a deployment: - for none, Drogue, Main or Aux
at the sample it fired, the three events mDACS charts (mDACS manual p. 8). It holds words, not
numbers, so it isn’t a channel: each word is an Event at its row’s time, and with the
events the record keeps every column. A word other than those three is kept too, with a note;
a cell that isn’t a word is refused.
Short rows. The temperature and battery voltage are written on every row (their 1 Hz
snapshot repeated), but as of 2026-10-12, in 45 of the 50 RRC3 files among the project’s sample
logs, the last 11 to 30 rows leave those cells out and close up the rest: a 7-column file’s
tail rows hold 5 cells, Time, Altitude, Pressure, Velocity, Events, and a file with
one of the two columns, one cell fewer than its header. Two more pad those rows back to the
header’s width with empty cells after Events instead; the 3 files with neither column have
no short rows. The reader takes a row as wide as the header, cell for cell; a row as wide as
the header without Temperature and Voltages, or as wide as the header but empty from that
width on, as the other columns in order, its temperature and voltage gaps (NaN), counted in
a note. So -, an event cell, can’t land in the temperature. Some exports end with rows that
have no time and only an altitude cell; such rows are skipped, counted in a note. Any other
row of another width, a cell that isn’t a number, or a time that doesn’t increase, is refused,
naming its line. Lines may end in CR, LF or both, and a byte-order mark is dropped.
The primary track. The time, the altitude, which is above the pad (the RRC3 tracks its “floor” altitude on the pad, RRC3 manual p. 23), and the velocity as the vertical speed when its unit was decided: it is the barometer’s, as the RRC3 has no other sensor of motion. The temperature and battery voltage share the clock, with gaps where a row leaves them out.
Where this comes from. The columns, the units and the rules above are the manuals’ and the files’. Debrief’s reader decides feet or meters from the pressure too, and is followed in that; where this reader departs from it: it reads the velocity’s unit from the data where Debrief ties it to the altitude’s (which reads a file in mph 32% low), it reads the short rows by the rule above, and it refuses what Debrief passes over.
Functions§
- read
- Reads an RRC3’s mDACS CSV export from its text.