Reading — Fusion Under Threat#
By the end of this lesson you should be able to:
Extend L14’s batch least squares to a recursive estimator that folds in one measurement at a time.
Run one EKF predict/update for a bearing, by hand and in MATLAB.
State the bearings-only observability conditions — when a single moving receiver can and cannot find range.
Weigh maneuvering to observe against the exposure the maneuver costs.
A pop-up, one receiver, and no range#
L34 planned a route around every threat on the laydown. L33 put a number on how well a network of bearing sensors can fix a point: stack each sensor’s Jacobian row and the information adds up, \(J = \sum_k \mathbf n_k \mathbf n_k^{\top}/(R_k^2\sigma_\theta^2)\). Both lessons assumed you knew where the threats were, or had several receivers looking at once.
Now a surface-to-air site that was not on the laydown turns its radar on. The B-21’s radar-warning receiver (RWR) hears it and reports a bearing. That is all it reports. There is no second receiver a few kilometers away to cross the bearing with, and the aircraft is not going to turn on a radar of its own to measure range. What the crew has is one receiver, bolted to one aircraft, producing one bearing every few seconds.
This lesson is about what that stream of bearings can and cannot tell you. The short version is the lesson’s thesis: bearings alone can’t tell you range — you have to move to see. The longer version needs two new tools, a filter that fuses measurements as they arrive and a way to decide whether the geometry lets that filter find range at all.
Fusion across time instead of across receivers#
L14 fused bearings across receivers at one instant. Several receivers each measured a bearing to the same emitter at the same time, and least squares found the one point that fit them all best. The baseline — the separation that makes the bearings cross at a useful angle — was the distance between the receivers.
With one receiver the picture turns on its side. The bearings arrive across time, one after another, and each is taken from wherever the aircraft happens to be when it arrives. The baseline is now the distance the own-ship has flown between bearings. In principle this is the same triangulation: a bearing from here, another from a few kilometers further along the leg, and the lines cross. In practice two things change.
The measurements arrive one at a time. A tracker cannot wait for the last bearing and then solve a batch problem; it needs its best estimate now, and it needs to improve that estimate every time a bearing lands without re-solving everything from scratch. That is what a recursive estimator does.
The emitter might move between bearings. Across receivers at one instant, the emitter is wherever it is. Across time, a ship-borne or road-mobile radar can change position between the first bearing and the last, and the estimator has to carry a model of that motion.
The recursive estimator for this job is the Kalman filter, and since you have not met it before, we will build it from the smallest possible case.
Key Concept
L14 fused many receivers at one instant; the baseline was the distance between them. A single aircraft fuses its own bearings over time; the baseline is the distance it flies. A wingman’s simultaneous bearing, when one is available, is L14 again — an instant baseline.
The recursive idea: fusing one number at a time#
Forget position for a moment and think about one number — say the range to an emitter. You hold a prior estimate \(x_1\) with standard deviation \(\sigma_1\). A new, independent measurement of the same quantity arrives: \(x_2\) with standard deviation \(\sigma_2\). What is the best combined estimate, and how good is it?
L14’s answer was least squares, and it still is. Choose \(\hat x\) to minimize the two misfits, each weighted by how much you trust it:
Setting the derivative to zero gives an inverse-variance-weighted average, and the uncertainty of that average follows from the same weights:
Inverse variance is information, and the rule says information adds. The fused \(\sigma\) is therefore smaller than either \(\sigma_1\) or \(\sigma_2\), always — combining two independent sources never makes you less certain.
Rearrange the weighted average and it takes a form that will carry the whole lesson:
Read it as a correction. Start from the prior \(x_1\); look at how far the measurement disagrees with it, \((x_2 - x_1)\) — the innovation; move a fraction \(K\) of the way toward the measurement. \(K\) is the gain. When the prior is poor and the measurement is good (\(\sigma_1 \gg \sigma_2\)), \(K \to 1\) and you nearly adopt the measurement. When the measurement is poor (\(\sigma_2 \gg \sigma_1\)), \(K \to 0\) and you barely move. Equal uncertainties give \(K = 0.5\): split the difference, and the fused \(\sigma\) is \(\sigma_1/\sqrt 2\).
Now the recursive step. The fused pair \((\hat x, \sigma)\) is simply a better prior. When the next measurement arrives, use it as \(x_1, \sigma_1\) and do the same thing again. You never go back to the old measurements — everything they said is already folded into the current estimate and its variance. For a linear problem this gives exactly the batch least-squares answer, one measurement at a time. That loop is the Kalman filter.
Key Concept
Fuse two independent estimates by adding their information, \(1/\sigma^2 = 1/\sigma_1^2 + 1/\sigma_2^2\), and move the prior toward the measurement by the gain \(K = \sigma_1^2/(\sigma_1^2 + \sigma_2^2)\). Keep the result as the next prior and repeat: that recursion is the Kalman filter.
From one number to a state: the Kalman filter#
Real targets have more than one number. Collect them in a state vector \(\mathbf x\) and replace the variance \(\sigma^2\) with a covariance matrix \(P\), whose diagonal holds each state’s variance and whose off-diagonal terms say how the errors are correlated. The filter runs two steps every time a bearing lands.
Predict — carry the estimate forward to the time of the new measurement with a motion model \(F\):
\(Q\) is process noise: uncertainty the motion model adds on its own, for targets that maneuver in ways \(F\) does not describe. This lesson uses \(Q = 0\) because its emitters really do sit still or move at constant velocity; a fielded tracker would add \(Q\).
Update — fold in the measurement \(z\) with the measurement model’s Jacobian \(H\) and noise variance \(\sigma_\theta^2\):
Every line is the scalar case in matrix clothes. \(H P^- H^{\top}\) is the prior’s variance as seen through the measurement — the \(\sigma_1^2\) of the scalar case — and \(\sigma_\theta^2\) is the measurement’s own variance, \(\sigma_2^2\). So \(S\) is \(\sigma_1^2 + \sigma_2^2\), the variance of the innovation; \(K\) is the ratio; \(\nu\) is the innovation; and \((I - KH)P^-\) is \((1 - K)\sigma_1^2\).
Two motion models cover this lesson:
A stationary emitter. The state is its position, \(\mathbf x = [N\;\,E]^{\top}\) in km. It does not move, so \(F = I\), \(Q = 0\), and the predict step changes nothing: the filter is simply a recursive nonlinear least-squares fix.
A constant-velocity emitter. The state adds velocity, \(\mathbf x = [N\;\,E\;\,v_N\;\,v_E]^{\top}\), and over a time step \(\Delta t\) the position moves by the velocity:
Here the predict step matters: between bearings, uncertainty in velocity smears into uncertainty in position, so \(P^-\) is larger than the \(P\) the last update left.
The “extended” part: linearizing a bearing#
The update above assumes the measurement is a linear function of the state, \(z = H\mathbf x + v\). A bearing is not. With the own-ship at \((N_o, E_o)\), the RWR measures
clockwise from North — the same convention as Project 2, L14 and L33. The extended Kalman filter (EKF) handles the nonlinearity the obvious way: it uses the bearing’s slope at the current estimate. With \(\Delta N, \Delta E\) running from the own-ship to the predicted emitter position \(\hat{\mathbf x}^-\) and \(R^2 = \Delta N^2 + \Delta E^2\),
This is L33’s Jacobian row, unchanged; for the constant-velocity state it is padded with two zeros, because a bearing says nothing directly about velocity. Three details matter:
The slope is taken at the estimate, not the truth. The filter never sees the truth. When the estimate is badly wrong, so is \(H\) — the source of every EKF failure you will meet in the demo.
The innovation must be wrapped into \([-180^\circ, 180^\circ)\). A predicted bearing of \(-179^\circ\) and a measured one of \(179^\circ\) disagree by \(2^\circ\), not \(358^\circ\).
Units. \(H\) is in rad/km, so \(K\) comes out in km/rad and \(K\nu\) is a correction in km.
Now put numbers through it.
Type-along
A pop-up emitter about 50 km out. Your prior puts it at 30 km North, 40 km East, give or take 4 km in each direction, and one RWR bearing, good to \(1^\circ\), has just arrived. Type this and run it — one full EKF update by hand.
% L35 -- one EKF bearing update, stationary emitter
sig = deg2rad(1); % RWR bearing noise, 1 sigma
x = [30; 40]; % prior estimate [N; E], km
P = 16*eye(2); % prior covariance: 4 km per axis
own = [0; 0]; % own-ship [N; E], km
z = deg2rad(52); % the bearing just measured
d = x - own; R2 = d'*d; % [dN; dE] and range squared
H = [-d(2) d(1)]/R2; % bearing Jacobian row, rad/km
S = H*P*H' + sig^2; % innovation variance, rad^2
K = P*H'/S; % Kalman gain, km/rad
nu = mod(z - atan2(d(2), d(1)) + pi, 2*pi) - pi; % innovation
xn = x + K*nu; Pn = (eye(2) - K*H)*P;
fprintf('x = [%.2f %.2f] km K = [%.1f %.1f] km/rad\n', xn, K);
fprintf('sqrt(tr P): %.2f -> %.2f km\n', sqrt([trace(P) trace(Pn)]));
Then answer these two:
\(\sqrt{\operatorname{tr} P}\) fell only from 5.66 to 4.09 km. Which way did the ellipse shrink, and which way did it not?
A second bearing from this same spot — what does it buy?
Solution
x = [30.75 39.44] km K = [-38.2 28.6] km/rad
sqrt(tr P): 5.66 -> 4.09 km
The prior bearing is \(\text{atan2}(40, 30) = 53.13^\circ\) and the RWR said \(52^\circ\), so the innovation is \(-1.13^\circ\). The estimate moved \(0.94\) km — sideways.
Across the line of sight only. Take
sqrt(eig(Pn))and the two 1σ axes are 0.85 km and 4.00 km: the axis across the line of sight fell from 4 km to 0.85 km, and the axis along it did not move at all. \(H = [-\Delta E\;\,\Delta N]/R^2\) is perpendicular to the line of sight, so \(K\) is too, and the update has no way to touch the along-LOS direction. The 0.85 km is the scalar rule from above, applied across the LOS: the bearing’s cross-range error is \(R\sigma_\theta = 50 \times 0.01745 = 0.873\) km, and \(1/\sigma^2 = 1/4^2 + 1/0.873^2\) gives \(\sigma = 0.85\) km.Almost nothing, and nothing at all in range. From the same spot the geometry, and so \(H\), is the same: the thin axis tightens again (0.85 → 0.61 km by the same rule) and the long axis barely moves (4.00 → 3.99 km), so \(\sqrt{\operatorname{tr} P}\) only goes 4.09 → 4.04 km. More bearings from one place never buy range. To shrink the long axis, the next bearing has to come from somewhere else.
Quick problem — Fuse Two Ranges
Your RWR has a pop-up emitter’s bearing. Along that line of sight, two independent sources give its range.
Intel prior: 52 km, \(\sigma_1 = 6\) km
Wingman’s cross-fix: 46 km, \(\sigma_2 = 3\) km
Independent, Gaussian errors
(a) The Kalman gain \(K\) on the wingman’s fix.
(b) The fused range and its \(1\sigma\).
(c) The \(\sigma_2\) needed for a fused \(1\sigma\) of 2 km.
Solution
(a) \(K = \dfrac{\sigma_1^2}{\sigma_1^2 + \sigma_2^2} = \dfrac{36}{36 + 9} =\) 0.80.
(b) \(\hat x = 52 + 0.80\,(46 - 52) = 52 - 4.8 =\) 47.2 km, and \(1/\sigma^2 = 1/36 + 1/9 = 5/36\), so \(\sigma^2 = 7.2\) and \(\sigma =\) 2.7 km (2.68). Check: \((1 - K)\,\sigma_1^2 = 0.2 \times 36 = 7.2\).
(c) \(1/\sigma_2^2 = 1/2^2 - 1/6^2 = 0.2500 - 0.0278 = 0.2222\), so \(\sigma_2^2 = 4.5\) and \(\sigma_2 =\) 2.1 km (2.12).
So what: the wingman’s fix carries 80% of the weight because it holds four times the information (\(36/9\)); once a good second source arrives, the prior hardly matters. And notice where the second source came from — a different platform, looking from a different place. Along your own line of sight, your own bearings contribute nothing to range.
What one bearing buys#
The type-along is worth pausing on, because its answer is the whole second half of the lesson. A bearing measures direction. Its Jacobian row \(H = \mathbf n^{\top}/R\) points across the line of sight (\(\mathbf n\) is L33’s cross-range unit vector), so each update can only move the estimate sideways and can only shrink the covariance in the cross-range direction. After one bearing, a round prior becomes a thin sliver lying along the line of sight: 0.85 km wide, still 4 km long. A second bearing from the same place makes the sliver thinner and no shorter.
So a single receiver that stays put, or that keeps looking from the same direction, cannot learn range. It learns range only when later bearings arrive from different directions — when the own-ship’s motion has swung the line of sight. Whether that happens is a question of geometry, and it has a name.
Observability: when can bearings find range?#
A quantity is observable if the measurements, noise-free and given enough time, pin it down uniquely. If two different truths would produce exactly the same measurements, no filter — however good its sensor, however fast its updates — can tell them apart. For bearings-only tracking the answer depends on what the emitter is doing and on how the own-ship flies.
A stationary emitter: the leg is the baseline#
Fly a straight leg past a stationary emitter off to one side. Each bearing is a line of position from a new point on the leg, and because the emitter is off the track, the lines swing as you pass: they cross, and the crossings converge on the emitter. This is L14’s triangulation with the receivers spread along your flight path instead of across a network. A stationary emitter is observable from any own-ship leg that is not along the line of sight, and the fix improves as the bearing swings — faster when the emitter is closer and the leg carries you across it.
The exception is the leg that points straight at the emitter. Fly directly down the line of sight and every bearing is the same line: the crossings are the seam from L14, now in time instead of space, and range is unobservable. Uncomfortably, the leg that tells you least is also the one that closes on the threat fastest.
A moving emitter: a whole family of ghosts#
Now let the emitter move at constant velocity — a ship-borne radar, say — while the own-ship flies a straight, steady leg. Write the own-ship’s track \(\mathbf p_o(t)\) and the emitter’s \(\mathbf p_e(t)\); both are straight lines at constant speed. For any number \(\alpha > 0\), build a ghost track
Two things are true of every ghost. The direction from the own-ship to the ghost is the direction from the own-ship to the emitter — every bearing is identical — because the ghost sits on the same line of sight, just \(\alpha\) times as far out. And because \(\mathbf p_o\) and \(\mathbf p_e\) are both linear in time, so is \(\mathbf p_g\): the ghost also moves in a straight line at constant speed. A ghost at twice the range moving at a scaled velocity, or at half the range, is a perfectly good constant-velocity target that the RWR cannot tell from the real one.
That is the classic result of bearings-only target motion analysis: a constant-velocity target seen from a constant-velocity own-ship has unobservable range. The bearings fix the shape of the relative track and its direction, but not its scale. No smaller \(\sigma_\theta\) and no faster update rate helps — every ghost fits every bearing exactly — and no filter can pick \(\alpha\). An EKF run on this geometry sharpens its estimate across the line of sight and hands back, along it, essentially the prior it started with.
One subtlety follows directly. A stationary emitter is a constant-velocity target with zero velocity — but a filter that assumes a constant-velocity model does not know that, so from a straight leg it cannot find range either. Observability is a property of the model you choose as well as of the truth; assume less about the target and you need more from the geometry.
The dogleg breaks the family#
The ghost argument needed one thing from the own-ship: that \(\mathbf p_o(t)\) be a straight line at constant speed. Take that away. Turn — a dogleg — and after the turn the ghost \(\mathbf p_o + \alpha(\mathbf p_e - \mathbf p_o)\) is no longer a straight, steady track for any \(\alpha\) other than 1. Equivalently, the constant-velocity ghosts that fit every bearing before the turn now predict different bearings from the ones the RWR is reporting. Only the true range fits them all, and range becomes observable. In the language of the literature, the own-ship must accelerate — change heading or speed — for a constant-velocity target’s range to be observable.
How fast the ellipse collapses after the turn depends on how much the turn changes the bearing rate. A turn that sends the own-ship across the line of sight or toward the emitter changes it a great deal, and it also closes the range, which makes every later bearing worth more (a bearing’s cross-range error is \(R\sigma_\theta\)). A turn away changes the bearing rate little and opens the range; it restores observability in principle and buys little in practice.
Key Concept
Bearings-only observability: a stationary emitter is observable from any own-ship leg not flown straight down the line of sight. A constant-velocity emitter seen from a constant-velocity own-ship is not — a scaled “ghost” track produces identical bearings, so range is unobservable no matter how accurate or frequent the bearings are — until the own-ship maneuvers. The turns that collapse the ellipse fastest are the ones that swing the line of sight and close the range.
The trade: seeing costs exposure#
Here is the catch the lesson has been building toward. The maneuver that buys range is usually the one that turns toward the threat. The companion script, L35_BearingsOnlyEKF.m, runs one notional scenario three ways: an own-ship flying East at 250 m/s, an RWR bearing every 5 s good to \(1^\circ\), an intel prior 8 km short of the emitter and 4 km to the side with \(\sigma = 8\) km on each axis, and a notional 40 km threat ring around the emitter. After 300 s:
Case |
\(\sqrt{\operatorname{tr} P}\) at 300 s |
Time inside the 40 km ring |
|---|---|---|
A — stationary emitter, straight leg |
0.28 km |
0 s |
B — moving emitter (15 m/s), straight leg |
4.26 km, long along the line of sight |
0 s |
C — moving emitter, dogleg 90° left at 90 s |
0.62 km |
143 s |
Case A needed no maneuver at all: the emitter was stationary and off the route, so the straight leg was enough. Case B is the ghost family in numbers — the ellipse stays long along the line of sight for the whole run. Case C buys a seven-fold improvement in the position estimate, and pays for it with nearly two and a half minutes inside the threat’s ring.
Whether that is a good trade depends on what the fix is for. If the crew needs a precise position to hand to a strike or suppression package, the fix may be worth the exposure. If the goal is just to avoid the site, a long ellipse is not a failure: route around its whole length instead of its center, which is L34’s planner with a bigger keep-out. And there are other ways to buy range without the turn — a wingman’s simultaneous bearing (an instant baseline, L14, and the Quick Problem above), or a range measurement from an active sensor (L33’s radar row), at the price of radiating. Every second inside the ring is paid for in the survival probability of L31, \(P_S = e^{-\lambda \ell}\), so the maneuver has to earn it.
The same question — would a dogleg sharpen the picture of a pop-up threat, and at what exposure? — reappears in the Final Project for the pop-up on your own route, with your own numbers.
Key Concept
Maneuvering to observe costs time and exposure: the turns that make range observable fastest are the ones that turn toward the threat. Weigh the fix against the survival probability it spends, and remember the alternatives — a second platform’s bearing, an active range measurement, or routing around the whole uncertainty ellipse.
A caution: when the EKF fools itself#
An EKF linearizes the bearing at its own estimate, and \(P\) is only as honest as that linearization. When the estimate is wrong by a lot — early in a run, or along an unobservable direction — the filter can compute a small \(P\) that the truth does not support. The demo shows both failure modes. On a straight leg against a moving emitter with very accurate, very frequent bearings, the filter’s \(\sqrt{\operatorname{tr} P}\) drops well below its actual error: it has talked itself into range information the geometry never provided. And a leg that flies straight down the line of sight passes so close to the emitter that the linearization breaks outright. The practical rule is the one the demo’s chart is built on: compare the filter’s claimed uncertainty with how wrong it actually is, and do not trust a small ellipse on a geometry that should not have produced one.
Wrap-Up#
One aircraft with one RWR fuses its own bearings over time, and the tool for that is the Kalman filter: predict the state forward, then fold in each measurement weighted by its uncertainty — the scalar rule \(1/\sigma^2 = 1/\sigma_1^2 + 1/\sigma_2^2\) in matrix form. The extended filter linearizes the bearing at its current estimate with L33’s row, \(H = [-\Delta E\;\,\Delta N]/R^2\), and because that row points across the line of sight, each bearing shrinks the error ellipse only across it. Range therefore comes from geometry: a stationary emitter is observable from any leg not flown straight at it, but a constant-velocity emitter seen from a constant-velocity own-ship is not — a whole family of scaled ghost tracks fits every bearing — until the own-ship turns. The turn that collapses the ellipse is usually the turn toward the threat, so seeing costs exposure, and the fix has to be worth the survivability it spends. Next, L36 — SEAD and Standoff Jamming takes up the other answer to a threat you cannot avoid: suppress it, or blind it from a distance.