Joint observability of attitude & sensor misalignment

A star tracker reports the direction of stars in its own frame. The vehicle needs attitude in the body frame. The two are related by a mounting alignment that is never perfectly known and does not stay constant — it shifts with launch loads, thermal gradients and ageing. So you would like to estimate it in flight. This page is about the geometric reason why that is impossible with a single sensor, and exactly what has to be added to make it possible.

Symbols used on this page are defined in the Nomenclature → attitude & rotations.

The result in one sentence. A single attitude sensor observes only the product of vehicle attitude and its own misalignment, so the two are algebraically indistinguishable — no amount of data, averaging or filtering separates them. Separation requires either a second sensor with a different mounting, or known relative motion between the two frames.

1 · Setup and the fundamental degeneracy

Let $C^b_i$ be the attitude of the body relative to inertial (what we want), and $C^s_b$ the fixed rotation from body to sensor frame (the mounting). A star tracker measures unit vectors to stars in its own frame:

$$ \hat{\mathbf u}^s = C^s_b\,C^b_i\,\mathbf u^i $$

where $\mathbf u^i$ is the catalogued inertial direction. Now perturb both unknowns with small angles — $\delta\boldsymbol\theta$ for vehicle attitude error and $\delta\boldsymbol\mu$ for misalignment error:

$$ C^s_b\to\big(I-[\delta\boldsymbol\mu\times]\big)C^s_b,\qquad C^b_i\to\big(I-[\delta\boldsymbol\theta\times]\big)C^b_i $$

Propagating to first order, the measurement residual is

$$ \delta\hat{\mathbf u}^s \;\approx\; -\Big[\big(\delta\boldsymbol\mu+C^s_b\,\delta\boldsymbol\theta\big)\times\Big]\,\hat{\mathbf u}^s $$

and there is the problem, stated as plainly as it can be: the measurement depends only on the sum

$$ \boxed{\;\delta\boldsymbol\psi=\delta\boldsymbol\mu+C^s_b\,\delta\boldsymbol\theta\;} \qquad\text{— a single 3-vector, from 6 unknowns} $$

Six unknowns enter through a three-dimensional combination. The measurement cannot distinguish "the vehicle rotated" from "the sensor is mounted rotated", because they produce literally identical photons. The unobservable subspace is

$$ \mathcal N=\Big\{(\delta\boldsymbol\theta,\delta\boldsymbol\mu)\;:\; \delta\boldsymbol\mu=-C^s_b\,\delta\boldsymbol\theta\Big\},\qquad \dim\mathcal N=3 $$
What happens if you ignore this and estimate both anyway. The filter is not "slow to converge" — it is fundamentally unable to converge. The information matrix is singular along $\mathcal N$, so the covariance in that direction never reduces (or, worse, reduces spuriously due to numerical noise or an over-tight prior, producing a confident and arbitrary split between the two). The estimated attitude may still be usable because the observable sum is correct, but the individual states are meaningless — and any downstream use of the misalignment estimate alone, such as calibrating a second sensor against it, will be wrong.

2 · Observability, stated properly

For the linear(ised) model $\mathbf y=H\mathbf x+\mathbf v$, the Fisher information is

$$ \mathcal I=H^\top R^{-1}H $$

and a direction $\mathbf d$ is unobservable iff $H\mathbf d=\mathbf 0$, i.e. $\mathcal I\mathbf d=\mathbf 0$. Stacking many star measurements from one tracker, each row has the structure

$$ H_k=\big[\underbrace{-[\hat{\mathbf u}_k\times]\,C^s_b}_{\partial/\partial\delta\boldsymbol\theta} \ \ \underbrace{-[\hat{\mathbf u}_k\times]}_{\partial/\partial\delta\boldsymbol\mu}\big] $$

Two structural facts follow, and they are worth separating because they are different limitations:

  • Per-measurement rank deficiency (the trivial one). $[\hat{\mathbf u}\times]$ annihilates $\hat{\mathbf u}$ itself, so a single star gives no information about rotation about its own line of sight. This is fixed easily: observe two or more non-parallel stars, which any real tracker does in a single frame. This is the classic requirement behind Wahba's problem.
  • Structural rank deficiency (the fundamental one). Even with infinitely many stars, the two column blocks are related by the constant matrix $C^s_b$ — every row satisfies $H_k\big(\delta\boldsymbol\theta,-C^s_b\delta\boldsymbol\theta\big)^\top=\mathbf 0$. No set of stars fixes this, because it does not depend on the stars at all.

3 · What actually breaks the degeneracy

There are exactly two structural ways out, plus one that only appears to work.

3.1 Two sensors with different mountings

Add a second tracker with mounting $C^{s_2}_b$. Each unit now sees its own sum:

$$ \delta\boldsymbol\psi_1=\delta\boldsymbol\mu_1+C^{s_1}_b\delta\boldsymbol\theta,\qquad \delta\boldsymbol\psi_2=\delta\boldsymbol\mu_2+C^{s_2}_b\delta\boldsymbol\theta $$

Now count: 9 unknowns ($\delta\boldsymbol\theta$, $\delta\boldsymbol\mu_1$, $\delta\boldsymbol\mu_2$), 6 observable quantities. Still short by 3 — adding a sensor alone does not fix it. But the difference is newly observable and independent of vehicle attitude:

$$ \delta\boldsymbol\psi_1-\delta\boldsymbol\psi_2 =\big(\delta\boldsymbol\mu_1-\delta\boldsymbol\mu_2\big)+\big(C^{s_1}_b-C^{s_2}_b\big)\delta\boldsymbol\theta $$

so the relative misalignment between the two units becomes observable, which is genuinely useful for monitoring drift and detecting a shifted mount. Absolute attitude still needs one of the mountings to be treated as the reference definition. This is the standard resolution:

The pragmatic resolution used in practice: define the frame. Because only the sum is observable, the split is a matter of convention, not measurement. So define the body frame by one sensor's mounting — declare $\delta\boldsymbol\mu_1\equiv\mathbf 0$ — and estimate everything else relative to it. The ambiguity does not disappear; it is removed from the estimation problem by definition, which is the honest way to handle an unobservable direction. Everything downstream (thrust axis, antenna boresight, IMU axes) is then calibrated against that declared frame.

3.2 Known relative motion between the frames

The degeneracy exists because $C^s_b$ is constant. If the sensor rotates relative to the body by a known amount — a gimbal, a scan mechanism, a rotating platform — then the coupling becomes time-varying:

$$ \delta\boldsymbol\psi(t)=\delta\boldsymbol\mu+C^s_b(t)\,\delta\boldsymbol\theta $$

Stacking two epochs with different $C^s_b$ gives

$$ \delta\boldsymbol\psi(t_1)-\delta\boldsymbol\psi(t_2)=\big(C^s_b(t_1)-C^s_b(t_2)\big)\delta\boldsymbol\theta $$

in which $\delta\boldsymbol\mu$ has cancelled — attitude error is now observable on its own, and hence so is the misalignment. The rank of $\big(C^s_b(t_1)-C^s_b(t_2)\big)$ determines how many axes you recover, which is why a single-axis gimbal helps only in the plane perpendicular to its axis. This is precisely the mechanism used in rotation-modulated IMUs: relative motion converts an unobservable constant into an observable modulated signal, and it is the same idea in both problems.

3.3 What does not work

Apparent fixWhy it fails
More stars per framefixes only the line-of-sight rank deficiency; the structural one is independent of the stars
Longer averagingreduces noise; the degeneracy is a bias/geometry property with zero information, so averaging cannot help
Vehicle manoeuvring (alone)rotates both frames together — $C^s_b$ is unchanged, so the coupling is unchanged
A tight prior on $\delta\boldsymbol\mu$makes the filter appear to converge, but the posterior in $\mathcal N$ is just the prior; the confidence is imported, not measured
Two co-aligned trackersif $C^{s_1}_b\approx C^{s_2}_b$ the difference equation is near-zero → ill-conditioned, not merely inelegant
The manoeuvring point is the most commonly misunderstood. Vehicle rotation helps observability of inertial-sensor errors (gyro bias, accel bias) because those errors are fixed in the body frame while the body moves relative to inertial. It does not help here, because the misalignment is fixed in the body frame and so is the sensor — they rotate together, leaving their relationship untouched. What matters is always relative motion between the frame the error lives in and the frame the measurement resolves in.

4 · Heterogeneous sensors and partial observability

Combining different sensor types changes the picture, because different sensors have different measurement null spaces:

SensorObservesBlind to
Star tracker2 axes precisely per star; full 3-axis with ≥2 starsits own boresight misalignment (vs attitude)
Sun sensor2 axes (direction of one bright vector)rotation about the sun line
Magnetometer2 axes, low accuracyrotation about $\mathbf B$; corrupted by vehicle fields
Gyrorate, not attitudeabsolute orientation entirely
Accelerometer (static)2 axes (local vertical)heading — see coarse alignment

Because the null spaces differ, a combination can be observable where each part is not — the general principle behind multi-sensor attitude determination, and the same logic that makes gravity-plus-Earth-rate a complete alignment reference while either alone is not. The condition to check is whether the intersection of the individual null spaces is trivial:

$$ \mathcal N_{total}=\bigcap_k \mathcal N_k=\{\mathbf 0\}\;\Longleftrightarrow\;\text{fully observable} $$

And observability is binary while conditioning is continuous — the practically important quantity is not whether $\mathcal I$ is singular but how badly scaled it is:

$$ \kappa(\mathcal I)=\frac{\lambda_{max}}{\lambda_{min}},\qquad \sigma_{\min\text{-observable direction}}\approx\frac{1}{\sqrt{\lambda_{min}}} $$

A system with $\lambda_{min}$ tiny but non-zero is "observable" and still useless in practice: convergence takes longer than the mission, and the estimate is dominated by whatever prior you supplied. Reporting eigenvalues of $\mathcal I$ — not just its rank — is the honest way to present an observability analysis, and it connects directly to the $P_{true}$ vs $P_{filt}$ gap.

5 · Practical consequences

  • Pick a reference frame explicitly and document it. Since the split is conventional, an ICD must state which sensor or datum defines the body frame. Two teams choosing differently produces a real, unresolvable disagreement in flight data.
  • Estimate relative alignments, not absolute ones. Relative quantities are the observable ones, and they are also what matters operationally (has the mount shifted since calibration?).
  • Use consider states for the unobservable part. Rather than estimating a direction with no information, carry it as an uncertain parameter so the covariance reflects the resulting error honestly — see LinCov.
  • Check the information matrix during design, not after. Eigen-decompose $\mathcal I$ for the planned sensor geometry; if $\lambda_{min}$ is near zero, the problem is the architecture (mounting geometry, sensor count, motion profile), and no filter tuning will rescue it.

6 · Further reading

  • Shuster & Oh, "Three-Axis Attitude Determination from Vector Observations" (JGCD, 1981) — the foundational treatment of attitude from vector measurements.
  • Wahba, "A Least Squares Estimate of Satellite Attitude" (SIAM Review, 1965) — the problem statement behind multi-vector attitude solutions.
  • Markley & Crassidis, Fundamentals of Spacecraft Attitude Determination and Control — MEKF, alignment estimation, and observability discussion.
  • Pittelkau, "Kalman Filtering for Spacecraft System Alignment Calibration" (JGCD, 2001) — in-flight alignment estimation and its observability conditions.
  • Farrell, Aided Navigation — observability analysis of aided systems, including the role of motion.

Related: Gyro bias cancellation by rotation · Linear covariance analysis · Attitude & rotations · Star trackers · Alignment in a launch navigator · back to Misc.