Skip to main content

Module raven

Module raven 

Source
Expand description

The Featherweight Raven’s flight logs, as the Featherweight Interface Program (FIP) exports them to a comma-separated file.

The Raven samples its sensors at different rates, so the export gives each channel its own clock: a Time@ column, then the channel’s values, then, in most exports, a status column named bILBA. One header line names the columns; each row below holds the next sample of every channel, so a row’s cells for different channels were taken at different times:

Time@Axial Accel (Gs),Axial Accel (Gs),bILBA,Time@Baro (Atm),Baro (Atm),bILBA,…
0,1.02,b0000,0.04375,0.97,b0000,…
0.0025,1.01,b0000,0.09375,0.97,b0000,…

Channels. The names the reader knows, each read into the record’s SI unit (Quantity::unit); the column keeps the file’s name, brackets and all:

ColumnQuantityFrom
Axial Accel (Gs), Lateral Accel (Gs)accelerationg, × 9.80665 m/s² (standard gravity)
Baro (Atm)pressureatm, × 101,325 Pa
Current Draw (A)currentA
Temperature (F)temperature°F
Volts Battery (V), Volts Pyro Apogee (V) and the other Volts … (V)voltageV
Velocity (Accel-Ft/Sec), [Velocity (Accel-Ft/Sec)]speedft/s
[Velocity (Accel-MPH)]speedmph, × 0.44704 m/s
[Altitude (Accel-Ft)]inertial altitudeft
[Altitude (Baro-Ft-AGL)], Altitude (Ft-AGL)altitude above the padft
[Altitude (Baro-Ft-ASL)]altitude above sea levelft
LiftOffa number, as written
bILBAa number: the status bits

A column the reader doesn’t know is kept as written, as Quantity::Unrecognized, with a note. The bracketed names are figures the FIP works out from what the Raven recorded rather than recordings: their names say so (Accel, Baro), and each sits on the clock of the sensor it comes from.

The status column. Each bILBA cell is b and four binary digits, such as b1100, and is kept as a Quantity::Number channel, beside the channel it follows, holding the digits’ value read with the leftmost digit the most significant: b0101 is 5, b1100 is 12. No published source says what the digits mean. Featherweight’s Raven manual (Raven User’s Manual, updated for the Raven4, 2020-08-15) says the Raven records “all flight events used for deployment logic” at 20 Hz and that the FIP can plot them, but it describes neither the export nor this column; Debrief uses the column only to recognize the format. The letters I, L, B and A may name flight events (L liftoff, B burnout and A apogee would fit the manual’s words), but that is a guess, so the reader states no events from them.

Rows of different lengths. The channels run for different spans, and a channel with no sample in a row is written as two empty cells, its time’s and its value’s, without its status cell. In an export with status columns, a row is therefore one cell shorter for each channel that has stopped, and every channel after it is shifted one cell to the left of its header; an export without them keeps every row as wide as its header. The reader walks each row channel by channel: two empty cells are a channel with no sample in that row, anything else a sample with its status, and the row must end where the last channel does. This rule is the files’, not a document’s: Debrief’s reader assumes every row as wide as the header, which in an export with status columns reads every channel after the first one to stop from the wrong cells. Debrief’s public sample of a Raven flight bears the rule out row for row, as do the 79 Raven exports in the private collection of flights this project checks against.

Layouts. Four were seen: each channel’s clock and status (16 channels); each channel’s clock without status columns (13, 16 or 18 channels); a two-channel export headed Time-Axial Accel (Gs), Axial Accel (Gs), bILBA, Time (s), Altitude (Ft-AGL), bILBA, with a space after each comma; and an export with one Time column for every channel, which in the one such file read repeats whole rows. A column whose name starts with Time starts a clock; the columns up to the next clock are its channels, each followed by its status column if it has one.

The primary track. The record’s time and altitude are [Altitude (Baro-Ft-AGL)]’s, on its own clock: the Raven’s barometric altitude above the pad. The two-channel layout has no such column; its Altitude (Ft-AGL) names no sensor, and is taken instead, with a note: it is the only altitude above the pad the file holds, and in the one such file read it runs at 20 Hz, the rate the manual gives for the barometer (the accelerometer’s is 400 Hz). A file with neither is refused: working an altitude out of Baro (Atm) is a reading, not this reader’s to make. No column is a vertical speed from the barometer, so FlightLog::vertical_speed_m_s is None; the velocities are the accelerometer’s, kept as channels. The temperature and battery voltage fill FlightLog::temperature_k and FlightLog::battery_v only when they share the altitude’s clock, as they do in the one-clock layout; otherwise they are channels only.

Cells. -1.#QNAN and the other ways Windows writes a value that isn’t a number, as some exports write the accelerometer’s derived channels before or after their data, are gaps, NaN, counted in a note; so is an empty value in a sample that has a time. Within a channel, a time that repeats the one before is dropped with a note saying how many of the repeats differed from the sample they repeat (the one-clock layout’s repeated rows are identical copies); a time that goes back is refused, naming the line. A byte-order mark is dropped, lines may end in CR, LF or both, and the cells may be padded with spaces.

Where this comes from. The layout, the Time@/bILBA header and the units follow the reader in Debrief (lib/parsers/featherweightFip.ts and lib/parsers/multiTimebase.ts, MIT, the project owner’s own; see THIRD-PARTY-NOTICES.md), which was written from exported files and cites no document; the clocks’ rates are Featherweight’s manual’s. Where this reader departs from Debrief’s: it keeps every channel on its own clock where Debrief resamples them onto the densest; it walks the rows as above; it reads the layouts without status columns or with one clock, which Debrief doesn’t recognize; it takes the altitude above the pad from the export’s own column where Debrief works one out from the pressure; and it refuses a time that goes back where Debrief sorts the samples.

Functions§

read
Reads a Featherweight Raven’s FIP CSV export from its text.