Fine Alignment — estimating attitude while bolted to the ground

A launch vehicle on the pad has to determine its own attitude from nothing but its own sensors. Position is surveyed and velocity is known to be zero, so the entire job is attitude — and the only two references available are the gravity vector and the Earth's rotation vector. This page works the problem properly: what the filter states actually are, which of them are observable while stationary and which are not, why consider states exist, and how scale factor and misalignment differ from bias in a way that matters on a static test.

Symbols used on this page are defined in the Nomenclature → inertial navigation.

Companion pages: Ground alignment & the free-inertial drift test covers the pass/fail side — how you decide the alignment and the IMU were good enough. Schuler oscillation derives the error loop this page's error budget depends on. The system-level context is in Rocket navigation §5.

The whole problem in one paragraph. Two stationary references are available. Gravity gives you a vector that fixes two attitude degrees of freedom (roll, pitch) and is blind to the third, because rotating about gravity does not change what the accelerometers read. The Earth's spin axis supplies the missing direction, but its horizontal component is only $\Omega\cos L \approx 10.6^\circ/\mathrm{h}$ at mid-latitudes — a signal small enough that a gyro bias of the same order destroys it. So heading accuracy is set by gyro bias, levelling accuracy by accelerometer bias, and both must therefore be estimated rather than assumed. That single sentence dictates the state vector.

1 · Two references, three degrees of freedom

A stationary IMU at latitude $L$ measures two vectors. The accelerometer triad senses specific force — which, at rest, is the reaction to gravity — and the gyro triad senses the Earth's inertial rotation:

$$ \mathbf f^b = -\,C^b_n\,\mathbf g^n, \qquad \boldsymbol\omega^b_{ib} = C^b_n\,\boldsymbol\omega^n_{ie}, \qquad \boldsymbol\omega^n_{ie} = \Omega\begin{bmatrix}\cos L\\ 0\\ -\sin L\end{bmatrix} $$

with $\Omega = 7.292115\times10^{-5}\,\mathrm{rad/s} = 15.041^\circ/\mathrm{h}$ and NED axes. In principle two non-parallel measured vectors with two known references is exactly Wahba's problem and has a closed-form solution (TRIAD, QUEST, or the SVD method — see Attitude & rotations). In practice you do not solve it in closed form, and the reason is entirely about noise:

Gravity — a strong signal

$|\mathbf g| \approx 9.81\ \mathrm{m/s^2}$ against accelerometer noise of tens of µg. The direction of the vertical is available to microradians within seconds of averaging. This is why levelling is coarse alignment: a formula and a short average suffice.

Earth rate — a very weak signal

The horizontal component is $\Omega\cos L$, about $5.1\times10^{-5}\,\mathrm{rad/s}$ at $L=45^\circ$. A navigation-grade gyro bias of $0.01^\circ/\mathrm{h}$ is $4.8\times10^{-8}\,\mathrm{rad/s}$ — a thousandth of the signal, and that ratio is your heading error. A tactical-grade gyro at $1^\circ/\mathrm{h}$ cannot find north at all.

So heading is estimated, slowly, by a filter — and because the sensor bias sits directly on top of the signal, the bias has to be estimated at the same time. The filter is not a luxury over the closed-form solution; it is the only way to separate a small signal from a comparable bias using time as leverage.

1.1 The two accuracy floors

Both limits follow from the same reasoning: a bias that sits on a reference vector tips the estimate of that vector's direction by the ratio of bias to signal. For the accelerometers against gravity, and the gyros against the horizontal Earth rate:

$$ \delta\theta_{\text{tilt}} \;\approx\; \frac{b_a}{g}, \qquad\qquad \delta\psi_{\text{heading}} \;\approx\; \frac{b_g}{\Omega\cos L} $$

These are floors, not transients. Averaging reduces noise as $1/\sqrt{T}$ but does nothing to a bias, so the covariance flattens onto these values and stops. Three consequences drive real design decisions:

  • Self-alignment capability defines "navigation grade." For 1 mrad of heading at $L=45^\circ$ you need $b_g \lesssim 0.01^\circ/\mathrm{h}$. This requirement, more than any single drift number, is what separates navigation-grade from tactical-grade inertial sensors.
  • It degrades as $1/\cos L$ and fails at the poles. At $L=80^\circ$ the horizontal Earth rate has fallen by a factor of 5.8, so the same gyro yields 5.8× the heading error. At the pole, north is simply not observable from gyros.
  • The floor is what sets the dwell time. You align until the covariance stops improving; aligning beyond that point buys nothing but schedule risk.

2 · The filter: error-state, not total-state

Alignment is run as an error-state (indirect) Kalman filter, the same architectural choice as the in-flight GNSS-INS filter (EKF, and Rocket navigation §6.1). The strapdown mechanization integrates the full nonlinear state at high rate; the filter estimates only the small error in that state at low rate and periodically corrects it. Two reasons this matters here specifically:

  • The errors really are small, so linearization is honest. Coarse alignment has already levelled the platform to arcminutes. A small-angle error-state model is not an approximation being stretched.
  • The dynamics of the error are slow and smooth even though attitude itself is being integrated at hundreds of hertz. That rate separation is what lets the filter run at ~1 Hz while the mechanization runs at 100 Hz or more.

2.1 The state vector, term by term

A representative static-alignment error state carries position, velocity, attitude and the inertial sensor error parameters. Written as a 21-state vector:

$$ \mathbf x = \begin{bmatrix} \delta\mathbf r\;(3) \\ \delta\mathbf v\;(3) \\ \delta\boldsymbol\psi\;(3) \\ \mathbf b_g\;(3) \\ \mathbf b_a\;(3) \\ \mathbf s_g\;(3) \\ \mathbf s_a\;(3) \end{bmatrix} $$

where $\delta\boldsymbol\psi$ is the small-angle attitude error (two tilt components plus heading), $\mathbf b$ are biases and $\mathbf s$ are scale-factor errors. The table below is the part worth internalising — every state is there for a reason, and not every state is observable:

StateWhy it is in the filterObservable on a static pad?
$\delta\mathbf r$ (3) Position error. The pad is surveyed, so this is directly measured. Strong — position update
$\delta\mathbf v$ (3) Velocity error. Truth is zero, so whatever the mechanization accumulates is the error. This is the channel through which everything else becomes visible. Strong — zero-velocity update
$\delta\psi_N,\delta\psi_E$ (2)
tilt
Mis-resolved gravity drives $\delta\dot{\mathbf v} = -\mathbf g\times\delta\boldsymbol\psi$, so tilt shows up quickly as growing horizontal velocity error. Strong — amplified by $g$
$\delta\psi_D$ (1)
heading
Heading. Observable only through the Earth-rate coupling, which is four orders of magnitude weaker than gravity. Weak — needs minutes
$\mathbf b_g$ horizontal (2) Horizontal gyro bias. Integrates into tilt, which gravity then amplifies into velocity error. Good — correlated with tilt
$b_{g,D}$ vertical (1) Vertical gyro bias. Its effect is an azimuth drift, which leaks Earth rate into a horizontal axis. Weak — aliases with heading
$\mathbf b_a$ horizontal (2) Horizontal accelerometer bias. Indistinguishable from tilt on a static test — see §3. Not separable from tilt
$b_{a,D}$ vertical (1) Vertical accelerometer bias. Observable only because the vertical axis is the one that sees the full $1g$; a gravity-model error enters the same channel. Partly — versus gravity model
$\mathbf s_g$ (3) Gyro scale factor. Multiplies the applied rate. On the pad the applied rate is $\Omega$, so the observable product is $s_g\Omega$ — utterly negligible. No — no rate to scale
$\mathbf s_a$ (3) Accelerometer scale factor. Multiplies the applied acceleration. Only the vertical axis sees a significant one ($1g$), so only $s_{a,D}$ has any leverage, and it aliases with $b_{a,D}$. Effectively no
Why carry a state you cannot observe? Three reasons, and they are different from each other. (1) Bookkeeping of uncertainty: an unobservable-but-real error still corrupts the flight solution, and the filter's covariance must reflect that or the downstream consumer is being lied to. (2) It becomes observable later: gyro scale factor is invisible on the pad but strongly excited during ascent, so the state exists to be estimated then, initialised from its a priori value now. (3) Correlations matter: even when a state is not individually observable, keeping it in the filter lets the estimator represent the fact that the observable combination is a mixture — which prevents the observable part from being over-trusted.

2.2 The measurements — all three are constraints, not sensors

Nothing external is available. Every measurement is a statement about what the truth must be because the vehicle is bolted down:

Zero velocity

$\mathbf z = \hat{\mathbf v} - \mathbf 0 = \delta\mathbf v$. The strongest constraint on the pad. Truth has no uncertainty, so $R$ reflects only mechanization noise and any real pad motion.

Fixed position

$\mathbf z = \hat{\mathbf r} - \mathbf r_{\text{survey}}$. Keeps position from wandering and stops the vertical channel from diverging (see §4).

Static azimuth

A pseudo-measurement of heading built from the accumulated Earth-rate observation. Because successive samples are strongly correlated, it must be throttled — applied on a long period rather than every cycle — or the filter over-trusts it and the covariance becomes optimistic.

That last point generalises: a pseudo-measurement derived from the same data the filter has already consumed is not independent information. Applying it at full rate is a classic way to produce a filter that reports a small covariance and is wrong — the failure mode that measurement underweighting exists to guard against.

3 · The aliasing problem: tilt versus accelerometer bias

This is the single most important structural fact about static alignment, and it is worth being precise about. A horizontal accelerometer bias $b_a$ and a tilt error $\delta\theta$ enter the measured horizontal specific force in exactly the same way:

$$ f_{\text{horizontal}} \;=\; \underbrace{g\,\delta\theta}_{\text{tilt}} \;+\; \underbrace{b_a}_{\text{bias}} \;+\; \text{noise} $$

One measurement, two unknowns, identical coefficients up to the constant $g$. No amount of averaging separates them: the observable quantity is the combination $g\,\delta\theta + b_a$, and its null space — the direction $(\delta\theta, b_a) \propto (1, -g)$ — is invisible. This is the same rank-deficiency argument as joint observability of attitude and sensor misalignment.

The consequence is usually stated as "fine alignment absorbs the accelerometer bias into the tilt estimate," and it is worth seeing why that is the right thing to do rather than a defect:

The alignment converges on the combination that makes the static solution correct. Whatever mixture of tilt and accelerometer bias the filter settles on, it is the mixture that produces zero net horizontal acceleration on the pad — because that is what the zero-velocity measurement demands. So for any test that keeps the vehicle static, the deterministic accelerometer contribution is cancelled by construction: it has been folded into an equal and opposite tilt. This is why a static drift test is dominated by gyro errors, and why a rotational test threshold applied to a static test is measuring something different from what it was derived for.

The separation is only recovered by changing the geometry — which is exactly what rotation-based schemes (carouselling, indexing, multi-position tumble tests) do, and what flight itself does. Two things break the degeneracy:

  • Rotate the IMU. Tilt is a property of the navigation frame estimate; bias is a property of the sensor. Rotating the sensor relative to the nav frame modulates the bias while the tilt stays put, and the two separate. This is the principle behind multi-position acceptance testing.
  • Accelerate. Scale factor and misalignment need a large applied input to be visible at all. On the pad the only inputs are $1g$ on one axis and $\Omega$ about one axis, which is why §2.1 marks the scale factors unobservable and why those states wait for ascent.

3.1 Which axes see gravity — a practical gate

Only an accelerometer axis that actually senses a significant component of gravity has any hope of having its bias or scale factor observed. For a vehicle vertical on the pad, that is essentially one axis; the two horizontal axes see nothing but their own bias. A practical implementation therefore determines, during coarse alignment, which axes are gravity-exposed and uses that as a gate: bias estimation is enabled only where there is a signal to estimate it from. Attempting to estimate a parameter with no excitation does not merely fail — it injects a random walk into the state through the process noise, which then leaks into the states that are observable through their correlations.

4 · Consider states — accounting for what you refuse to estimate

Some error sources should not be estimated even though they affect the solution. Gravity-model error, lever-arm (IMU-to-reference-point offset) error, survey error in the pad coordinates, and sensor parameters with no excitation all share a property: estimating them would corrupt the solution more than ignoring them, because the filter would fit them to noise. But ignoring them entirely produces an optimistic covariance.

The consider filter (also Schmidt consider analysis; see NASA nav-filter best practices and linear covariance analysis) is the standard resolution. Partition the errors into estimated states $\mathbf x$ and consider parameters $\mathbf c$:

$$ \begin{bmatrix}\delta\dot{\mathbf x}\\ \dot{\mathbf c}\end{bmatrix} = \begin{bmatrix}F & F_c\\ 0 & 0\end{bmatrix} \begin{bmatrix}\delta\mathbf x\\ \mathbf c\end{bmatrix} + \begin{bmatrix}\mathbf w\\ \mathbf 0\end{bmatrix}, \qquad \mathbf z = H\,\delta\mathbf x + H_c\,\mathbf c + \boldsymbol\nu $$

The gain is computed as if $\mathbf c$ did not exist, so no estimate of $\mathbf c$ is ever formed and the filter cannot chase it. But the covariance propagation carries the extra terms, so the reported uncertainty includes the contribution of $\mathbf c$:

$$ P^{\text{true}} \;=\; P^{\text{filter}} \;+\; S\,P_{cc}\,S^{\mathsf T}, \qquad S \;=\; \frac{\partial\,\delta\hat{\mathbf x}}{\partial\,\mathbf c} $$

The sensitivity matrix $S$ is propagated alongside $P$. The result is the honest answer to the question that matters operationally: how wrong could I be, including the things I chose not to estimate? A filter without consider states reports $P^{\text{filter}}$ and calls it the answer.

Estimate, consider, or ignore — a decision, not a default. Estimate a parameter when it is observable and its variation between runs is large enough to matter. Consider it when it matters but is not observable in this phase (gravity model, lever arm, unexcited scale factors). Ignore it only when its contribution is genuinely negligible against everything else in the budget — and write down the number that justifies "negligible."

5 · The vertical channel is a different animal

Horizontal errors oscillate at the Schuler frequency because the transport-rate feedback closes a stable loop (derivation). The vertical channel has the opposite sign: an altitude error makes the gravity model return a weaker gravity, which the mechanization reads as upward acceleration, which increases the altitude error. The loop is unstable with a time constant of about 9.5 minutes, and divergence is exponential rather than oscillatory:

$$ \delta\ddot h \;=\; \frac{2g}{R}\,\delta h \quad\Longrightarrow\quad \delta h(t) \sim e^{t/\tau}, \qquad \tau = \sqrt{\frac{R}{2g}} \approx 570\ \mathrm{s} $$

Every terrestrial INS therefore constrains the vertical channel externally — a baro-altimeter in flight, a known pad altitude during alignment, or a periodic reset. The practical consequence for a drift test is specific and easy to get wrong: if the vertical channel is being reset on a short period, the vertical error never accumulates the Schuler-scale response at all. It only integrates vertical accelerometer bias over one reset interval, which makes the vertical metric a far tighter check on accelerometer bias than the horizontal metrics are on anything — and makes a vertical threshold copied from a horizontal one meaningless. That point is worked through in Ground alignment §5.

6 · Numerical form, and when it matters

An alignment filter runs for minutes with strongly correlated states and a measurement (zero velocity) whose noise is small. That is precisely the regime in which a naive covariance update loses symmetry and positive definiteness. The standard mitigations all apply, and are covered in depth elsewhere on this site:

Joseph form

$P^+ = (I-KH)P^-(I-KH)^{\mathsf T} + KRK^{\mathsf T}$ is symmetric by construction and stays positive definite where the short form does not.

Derivation and sim →

UDU / square-root

Factorising $P = UDU^{\mathsf T}$ and updating the factors doubles the effective precision and cannot produce a negative variance.

Why flight code does this →

Underweighting

Deliberately inflating $R$ on a strong measurement guards against the linearization error that a near-perfect measurement would otherwise expose.

The flight rationale →

One more implementation point that is specific to alignment: the mechanization runs fast and the filter runs slow, so a correction computed by the filter is already stale by the time it is applied. It must be propagated forward to the current time before being applied, and the linearized dynamics it was computed against must reflect the whole interval at full rate rather than a single coarse linearization. Getting this wrong produces a filter that appears to work in a static test and misbehaves under dynamics.

7 · When is alignment done?

The exit criterion is a statement about covariance, not about elapsed time:

  • Heading uncertainty below requirement. $\sigma_\psi$ has reached the value the ascent error budget was written against.
  • And flattening. $\sigma_\psi$ has stopped improving meaningfully — it has reached the bias-driven floor of §1.1, so further dwell buys nothing.
  • And consistent. The measurement residuals are statistically consistent with their predicted covariance. A filter whose normalised innovations are too small is as suspect as one whose are too large; see FDI decision functions.

A time-based criterion alone cannot distinguish "converged" from "converged onto the wrong answer," which is why the independent drift check described on the ground alignment page exists: it takes the aligned state, propagates it without aid, and measures the error growth directly.

8 · Further reading

All open literature; nothing on this page derives from any organisation's internal documentation.

  • P. D. Groves, Principles of GNSS, Inertial, and Multisensor Integrated Navigation Systems, 2nd ed., Artech House, 2013 — Ch. 5 (inertial navigation error dynamics), Ch. 15 (alignment and zero-velocity updates). The standard reference for everything on this page.
  • D. H. Titterton and J. L. Weston, Strapdown Inertial Navigation Technology, 2nd ed., IET, 2004 — Ch. 10 on alignment, including the gyrocompassing accuracy floor and multi-position calibration.
  • P. G. Savage, Strapdown Analytics, 2nd ed., Strapdown Associates, 2007 — the definitive treatment of mechanization and error propagation.
  • J. A. Farrell, Aided Navigation: GPS with High Rate Sensors, McGraw-Hill, 2008 — error-state filter formulation and observability analysis.
  • NASA/TP-2018-219822, Navigation Filter Best Practices — Joseph form, consider filters, underweighting, and covariance consistency, from flight experience. Summarised on this site.
  • S. F. Schmidt, "Application of State-Space Methods to Navigation Problems," Advances in Control Systems, vol. 3, 1966 — the original consider-state analysis.
  • IEEE Std 952-2020 — inertial sensor error model terminology (bias, scale factor, misalignment, random walk) used consistently throughout.