pub fn calibrated_information(
conditioning: &Conditioning,
noise_sigma: f64,
) -> Matrix6<f64>Expand description
JᵀWJ in calibrated units, with the directions the geometry cannot see
at all left out.
Λ = Σ vᵢ vᵢᵀ / spreadᵢ² over the directions with a finite spreadA direction the geometry does not constrain has σ' = 0, an infinite
spread, and is absent from the sum rather than given a small weight. An
arbitrary number with a small weight still pulls a survey towards
itself; absent, it is what it is, which is no information. The rest of
the spectrum is carried in full.
§What this is, stated plainly, because it used to claim more
Everywhere except an exactly blind direction this equals JᵀWJ/σ².
It is that matrix rebuilt from its own spectrum in calibrated units, not
a different matrix. Nothing here is cleverer than what a pose-graph
package is already handed; what it adds is the calibration in σ and a
null direction that stays null instead of being damped into a number.
The name says so: through 0.1.1 this was weighted_information, which
promised a weighting by conditioning that has since been measured and
withdrawn. Same function, honest name.
Until S6 this function dropped every direction whose predicted spread
exceeded the survey’s required accuracy — a threshold, and the crate’s
claim to exist. That was measured and did not survive. On the ETH ASL
surveys, across two scenes, five fields of view and six tolerances, the
thresholded version never once beat JᵀWJ and lost by up to 3.4×; and
the reason is that on real scans the six spreads of an edge lie within
one order of magnitude of each other — σ_min/σ_max measured between
0.46 and 0.039 over everything tried — so a threshold either keeps them
all or drops them all. The gap the synthetic gates relied on, four
orders wide, is a property of geometry that has been given exactly, not
of geometry that has been scanned.
Five attempts have since been measured against theodolite truth — this
threshold, an additive floor, a probabilistic attenuation from a noise
model, a floor tied to the measured bias, and discarding the spectrum
altogether — and all five lose. The reason is that an edge’s error is a
bias rather than scatter, fourteen to thirty times larger than the
scatter the closed form correctly predicts, and that the bias lies away
from the best-determined direction on every scene tried. JᵀWJ says
exactly that: most uncertainty where the geometry is weakest. Its shape
is right and only its scale is wrong, and a scale common to every edge
does not move a survey. Each of the five changed the shape.
What survived that measurement is the diagnosis: which directions are
weak is worth reporting, and
Conditioning::classify
still reports it. Turning that report into a binary weight is the part
that did not.
The calibration is the caller’s business, and it belongs in
noise_sigma. On real data the predicted spread is optimistic — the
project measured about seventeenfold — and passing an uncorrected sigma
gives a survey that states an accuracy seventeen times better than it
has.