Skip to main content

Module blueraven

Module blueraven 

Source
Expand description

The Featherweight Blue Raven’s flight logs, as its phone app exports them to comma-separated files.

The Blue Raven records three sets of data for each flight: a summary, a low-rate set “recorded at 50 Hz” and a high-rate set “recorded at 500 Hz” (Featherweight, Blue Raven User’s Guide, updated May 12 2026, p18); the Featherweight UI app downloads them over Bluetooth and exports each as a file (p19). This reader reads the two data files, each on its own: a header line naming the columns, then one row per sample, every column on the row’s time:

Year,Month,Day,Time,Flight_Time_(s),Sync,Gyro_X,Gyro_Y,Gyro_Z,Accel_X,Accel_Y,Accel_Z,Quat_1,…
2026,5,23,10:15:00.120,-2.000,0,0.10,-0.20,0.05,0.01,-0.02,1.00,0.7071,…

A file is the app’s when its first line that isn’t blank opens with the six columns Year,Month,Day,Time,Flight_Time_(s),Sync, as both files do. The high-rate file has 18 columns, the low-rate file 101; columns are mapped by name, not by place, so the low-rate file’s variants read alike (in some, Axial Accel (Gs),Lateral Accel (Gs) stand where others have 3rd_Volts,4th_Volts, and one names the fifth FER column Apo_FER_H ex, with two spaces). A name is matched with its spaces taken out and without regard to case, and kept as written. The low-rate file repeats some names (Reserved, and the four output channels’ condition flags such as LT_AGL1): each is its own channel, in the file’s order.

Channels. Every column but the clock is a channel, read into the record’s SI unit (Quantity::unit):

ColumnQuantityFrom
Flight_Time_(s)the clock, s, zero at liftoffthe header
TimeQuantity::TimeOfDay, s after the logger’s midnightwritten HH:MM:SS.fff; no zone is stated
Year, Month, Day, SyncQuantity::Numberthe date the logger’s clock gives; Sync is “a millisecond counter … recorded in both the low-rate and high-rate data so that the two data sets can be aligned”, which “rolls over every 250 msec” (p23)
Temperature_(F)Quantity::Temperaturethe header’s °F
Baro_Press_(atm)Quantity::Pressurethe header’s atm, × 101,325 Pa
Baro_Altitude_AGL_(feet), Baro_Altitude_ASL_(feet)Quantity::AltitudeAboveGround, Quantity::AltitudeMslthe header’s feet
Batt_Volts, Apo_Volts, Main_Volts, 3rd_Volts, 4th_Volts, Aux_VoltsQuantity::Voltagethe header’s volts
Axial Accel (Gs), Lateral Accel (Gs)Quantity::Accelerationthe header’s g, × 9.806 65 m/s² (standard gravity)
Velocity_Up, Velocity_DR, Velocity_CRQuantity::Speedft/s: the manual and the summary (below)
Inertial_AltitudeQuantity::InertialAltitudeft: the manual and the summary (below)
Inertial_DR_Position, Inertial_CR_positionQuantity::Distanceft: the manual (below)
Tilt_Angle_(deg), Future_Angle_(deg), Roll_Angle_(deg)Quantity::Anglethe header’s degrees
Gyro_X, Gyro_Y, Gyro_ZQuantity::AngularRate°/s: the manual and the summary (below)
Accel_X, Accel_Y, Accel_ZQuantity::Accelerationg, × 9.806 65 m/s²: the manual and the pad (below)
Quat_1 … Quat_4Quantity::Numberthe attitude quaternion, “the rotation axis first and the magnitude term fourth” (p24), of unit norm
CurrentQuantity::Unrecognized, as writtenno source states its unit (below)
Rocket_FER_Hex, Apo_FER_Hex and the other …_FER_HexQuantity::Number: the register’s bitshexadecimal in the file (below)
Liftoff, Apogee and the other flagsQuantity::Number, 0 or 1below
Reserved, Reserved_1 …Quantity::Unrecognized, as writtenthe manual describes no reserved column

A column the reader doesn’t know is kept as written, Quantity::Unrecognized, with a note.

Units no header states. Thirteen columns carry no unit in their names. The manual states each one’s unit for the logger’s USB download, which carries the same figures (p23–24): velocities in ft/sec, the inertial altitude and the down-range and cross-range positions in feet, gyro rates in deg/s × 100, accelerations in G × 100, current in mA. The app writes the gyro rates and accelerations unscaled by the hundred, so its file’s units are decided from what the app’s own files show. The counts below are, as of 2026-10-12, over the 80 Blue Raven files among the project’s sample logs (45 low-rate, 35 high-rate), most of them in the private collection of flights this project checks against:

  • Velocities and the inertial altitude, in feet. Beside a flight, the app’s summary file states “Max velocity” in “feet/sec” and “Inertial navigation max alt” in “feet”. Of the 32 summaries that sit beside a low-rate file, 25 state an inertial maximum within 0.5 % of a low-rate file’s highest Inertial_Altitude, and in those the highest Velocity_Up is 0.69 to 1.0 times the summary’s maximum velocity, which counts every direction; in meters per second it would be 0.3 times. Debrief’s public pair agrees: its file’s highest speed and inertial altitude are within 0.5 % of its summary’s, in feet. The barometer agrees too: integrated over the climb to the barometer’s highest sample, Velocity_Up gives 0.90 to 1.20 times the rise of Baro_Altitude_AGL_(feet) in 43 of the 45 low-rate files. The down-range and cross-range positions take the altitude’s unit, as the manual gives them.
  • Gyro rates in degrees per second. The summary states “Pad gyro rates (deg/sec)”, and the manual gives the gyros’ range as ±2000 deg/sec (p23): in 21 of the 35 high-rate files the largest rate sits at a common ceiling of 2,292 to 2,294, just past that range, as a saturated gyro reads.
  • Accelerations in g. On the pad, the median magnitude of the three axes is 0.990 to 1.014 in 34 of the 35 high-rate files, as a logger at rest reads 1 g.
  • Current, kept as written. No document states the app’s unit. The column reads 0 in every row of 6 high-rate files, and in the other 29 but for brief runs, peaking at 0.05 to 13, 13 of them between 2 and 3.5. Amperes would fit the manual’s word that the Blue Raven “internally limits the current to around 4 Amps” (p5), and the USB download’s milliamperes would put a firing output’s current at a few thousandths of an ampere; but the files show a size, not a unit, so the column stays Quantity::Unrecognized until a source states it, with a note giving this file’s figures.

Each file’s record carries one note per kind decided this way, the decision and this file’s own evidence, such as `Gyro_X`, `Gyro_Y` and `Gyro_Z` read in degrees per second, from the manual and the summary: ….

Flags, event registers and events. The manual’s five flight event registers hold “one bit for each event”, written in hexadecimal (p24): the rocket’s (Rocket_FER_Hex) and each output channel’s (Apo_FER_Hex, Main_FER_Hex, 3rd_FER_Hex, 4th_FER_Hex). The cells are lowercase hexadecimal digits without 0x, read as the number they write, 1a5 as 421. The files name the bits: the 0/1 columns after the registers spell them out, and in every row of the 45 low-rate files read, Rocket_FER_Hex equals the 13 flags Liftoff … Reserved read with Liftoff as bit 0, and each channel’s register equals its 14 condition flags LT_AGL1 … Reserved, LT_AGL1 as bit 0. Each flag is kept as a channel, 0 or 1. The manual’s tables of deployment settings list the rocket’s events as liftoff, apogee, pressure increasing, burnout coast and each output fired (p26–28); the channel flags are the conditions an output’s logic checks, such as LT_AGL1, “AGL < AGL1” (p25).

Seven flags mark a moment and become an Event, named as the column, at each row where the flag goes from 0 to 1: Liftoff, Apogee, Burnout_Coast, Apo_fired, Main_fired, 3rd_fired and 4th_fired. As of 2026-10-12, in the 45 low-rate files among the project’s sample logs, each rises at most 15 times in a file, and in most once or twice (twice in a file holding two flights, or a stage’s second burn). The others stay channels only: Press_Increasing, Normal_Ascent, Accel_Vel_LE_0, ECI_Vvel_le_0 and Tilt Exceeded 90deg state a condition that comes and goes (ECI_Vvel_le_0 rises up to 34 times in a file), and the channel flags are a deployment logic’s conditions, not what happened. A flag already 1 on the first row rose before the file began, so it gives no event, with a note; past MAX_EVENTS_PER_FLAG rises in one column, the rest are counted in a note instead.

Clocks. Flight_Time_(s) is the clock: strictly increasing in every file read, from a negative time on the pad in all but one. A time that doesn’t increase is refused, naming its line. The wall clock Time is a channel only: as of 2026-10-12, among the sample logs, it holds one value for several rows at a time in 5 of the high-rate files, and steps back in 4 of the low-rate files, from once to hundreds of times, by up to about 14.5 hours. It is kept as written, and a note says when it goes back. Sync steps by 2 a row in the high-rate files and by 20 in the low-rate ones (40 where the file is logged every 0.04 s), in milliseconds, wrapping at 250.

The primary track. For a low-rate file, FlightLog::time_s is Flight_Time_(s) and FlightLog::altitude_m is Baro_Altitude_AGL_(feet), the barometer’s altitude above the pad; the temperature and battery are Temperature_(F) and Batt_Volts. The vertical speed is None: Velocity_Up is the inertial solution’s, which “lose[s] track of which way is up” when the rocket turns faster than the gyros measure (p23), not the barometer’s, so it is a channel only. As of 2026-10-12, in 10 of the 45 low-rate files Inertial_Altitude steps by more than 32,768 ft between two rows, as a 16-bit count of feet does when it wraps; it is kept as written, with a note. A high-rate file holds no altitude: it is read with an empty primary track and every column as a channel, with a note that the low-rate file of the same flight holds the altitude.

Cells and rows. A cell that is empty, or isn’t a number (or a time of day, or hexadecimal digits, as its column needs) is a gap, NaN, counted per column in a note; none of the files read has one. A row with fewer cells than the header has the rest as gaps, counted in a note; a row with more is refused, as is a row whose clock cell isn’t a number. A file whose rows, down to any row, hold under a quarter of the cells its header names (past the first 65,536) is refused at that row, so a wide header over short rows can’t make the reader allocate far more than the file holds. Blank lines are skipped; lines may end in CR, LF or both; a byte-order mark is dropped; cells may be padded with spaces.

What the file says about itself. The logger is a Featherweight Blue Raven; the data files state no serial number, firmware, flight number or apogee (the summary file does).

Where this comes from. The layout, from the files themselves and Featherweight’s manual as cited; the column names and the gyro and acceleration units agree with Debrief’s reader (lib/parsers/blueraven.ts, MIT, the project owner’s own; see THIRD-PARTY-NOTICES.md). Where this reader departs from Debrief’s: it keeps every column, where Debrief keeps a chosen few; it reads a high-rate file on its own, where Debrief refuses it and points to the low-rate file; it keeps Inertial_Altitude whole, with a note, where Debrief cuts it off where it wraps or leaves the barometer’s altitude by more than the flight’s height.

Constants§

MAX_EVENTS_PER_FLAG
The most events one flag column gives; past it, its rises are counted in a note. The files read rise at most 15 times in a column.

Functions§

read
Reads a Featherweight Blue Raven’s low-rate or high-rate CSV, as its phone app exports it.