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.
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 $$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:
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 fix | Why it fails |
|---|---|
| More stars per frame | fixes only the line-of-sight rank deficiency; the structural one is independent of the stars |
| Longer averaging | reduces 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 trackers | if $C^{s_1}_b\approx C^{s_2}_b$ the difference equation is near-zero → ill-conditioned, not merely inelegant |
4 · Heterogeneous sensors and partial observability
Combining different sensor types changes the picture, because different sensors have different measurement null spaces:
| Sensor | Observes | Blind to |
|---|---|---|
| Star tracker | 2 axes precisely per star; full 3-axis with ≥2 stars | its own boresight misalignment (vs attitude) |
| Sun sensor | 2 axes (direction of one bright vector) | rotation about the sun line |
| Magnetometer | 2 axes, low accuracy | rotation about $\mathbf B$; corrupted by vehicle fields |
| Gyro | rate, not attitude | absolute 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.