Skip to main content

calibrated_information

Function calibrated_information 

Source
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 spread

A 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.