Work in progress This site is under construction — content, figures and specifications are provisional.
3 — Engineering

The hard parts.

The trustworthy bits aren't the equations — they're what happens when the sensors lie: vibration, manoeuvre load, dropped links, stale data. This is the engineering that keeps the picture honest when the flying gets real.

Signal conditioning§1 — Kill the vibration.

Airframe and engine vibration ride on the raw accelerometer and gyro. Each axis is cleaned by its own 2-pole Butterworth low-pass — an IIR (infinite impulse response) filter in Direct Form II Transposed — before it reaches the filters and the slip ball — branch-free and allocation-free, safe to run at full sensor rate.

Fig.01 — Signal-conditioning chainper-axis IIR
RAW IMU accel, gyro VIBRATION FILTER 2-pole Butterworth, per axis FUSION CF, MG, ESKF DISPLAY
Transfer function (per axis)
H(z) = \dfrac{b_0 + b_1 z^{-1} + b_2 z^{-2}}{1 + a_1 z^{-1} + a_2 z^{-2}}
Adaptive fusion§2 — Trust gravity only when it's real.

The accelerometer only tells you "down" when it's measuring pure gravity. In a turn, under braking, in turbulence, it isn't — so its correction is gated. And the reference gravity magnitude is learned per device (a slow exponential moving average (EMA), τ≈16 s) rather than assumed to be 9.81 m/s² — MEMS (Micro-Electro-Mechanical Systems) units often read ~10.2 — so a scale bias can't quietly tilt the horizon.

Fig.02 — Accelerometer trust gatew ∈ [0,1]
ACCEL measured "down" TRUST GATES |a| ≈ learned g ? gyro rate low ? noise (σ) low ? any fails → w → 0 FUSION correction × w ATTITUDE true bank
The trust weight is the product of the gates — fail any one and the filter coasts on the gyro until gravity is trustworthy again. A latch with self-release rides out a sustained manoeuvre.
Gated correction
w = w_{|a|}\, w_{\omega}\, w_{\sigma} \in [0,1] \qquad \dot{q} = \tfrac{1}{2}\, q \otimes \bigl(\omega + w \cdot K\, e\bigr)

Gating the accelerometer would leave the filter blind through a long turn — so it is never the only correction. The ESKF (Error-State Kalman Filter) runs a set of independent measurement updates, each watching a different observable and weighted by its own σ. When gravity can't be trusted, these are what hold a true attitude.

Gravity directionaccelerometer, pitch & roll (gated in turns)
Coordinated-turn bankbank = atan(V·ω / g) (GPS)
Load-factor bankbank = acos(1 / N) (no GPS)
Flight-path pitchpitch = asin(VSI / V) + AoA (VSI = vertical speed, AoA = angle of attack; baro & GPS-alt)
Headingmagnetometer (GPS track as fallback)
Gyro biaslearned online, temperature-tracked b_eff(T)

The load-factor bank is the quiet workhorse: acos(1/N) reads the bank straight off the g-load with no GPS at all — so a coordinated turn stays true even with no satellites and the accelerometer gated off.

Display robustness§3 — Calm and honest.

Small touches that matter in the cockpit: the tape digits roll over with hysteresis so they never flicker on the boundary, and if the data goes quiet the display tells you — it doesn't pretend.

01

Rollover hysteresis

Tape digits only change past a small margin, so a value sitting on a boundary stays put instead of stuttering.

02

Stale-data caution

If samples stop arriving, an amber caution latches after a few seconds blind — the picture never silently freezes as if all were well.

Connectivity§4 — Survive the link.

Bluetooth in a metal cockpit drops. When it does, the reader reconnects on its own and re-seeds the attitude from the current orientation, so the horizon snaps back upright instead of tumbling. On the network path, the TCP gateway is found automatically by mDNS — no IP addresses to type.

BLE

Auto-reconnect & re-seed

A dropped Inertial Measurement Unit (IMU) link is re-established automatically; attitude is re-initialised from gravity so there's no long settle.

mDNS

Zero-config discovery

The FlySys TCP source is located on the network by name — plug in and it appears, no manual addressing.

Reference frames§5 — ENU in, NED out.

The IMU module fuses natively in ENU (East-North-Up); the PFD's attitude pipeline works in NED (North-East-Down). The app re-expresses the solution ENU→NED at ingestion, so every filter, the horizon and the slip ball share one consistent frame.

Fig.03 — Earth-frame conventionsNED & ENU
NED IMU x: North y: East z: Down ENU IMU y: North x: East z: Up
Two right-handed earth frames. NED orders the axes North-East-Down, ENU orders them East-North-Up — x and y swap and the vertical flips. The IMU delivers ENU; the app re-expresses it as NED for the filters.