Limits and Unavailable Results
A covariance is an honest statement about noise, not about everything that can be wrong with a calibration. This chapter lists the cases where none can be given, and where one is given but answers a narrower question than it seems to.
When It Is Unavailable
reason | Meaning | What to do |
|---|---|---|
not_converged | The solve stopped on its iteration budget | Raise solver.max_iters |
rank_deficient | The data does not determine the parameters listed in unobservable (alone or in combination) | Add views that differ in the way the listed parameters need, e.g. tilted boards for fx, cx; or fix one of them |
at_bound | A parameter ended on a bound (labels) | Widen or remove the bound, or fix the parameter |
no_redundancy | No more observations than parameters | Add views |
not_computed | The result was produced or stored without uncertainty | — |
rank_deficient is a statement about the data, not a failure of the
calibration: the solve still returns its best parameters. A Scheimpflug
camera whose views do not separate the sensor tilt from a principal-point
shift, for example, reports tilt_y, cx and the board translations as
unobservable together.
Scope
Every workflow reports the uncertainty of its final solve. When a hand-eye
solve refines the robot poses (the default), it also estimates the robot's
orientation and position error from the corrections, weighed against the
corner noise the residuals show (robot_poses.estimate_sigma). The
estimate is then the maximum-likelihood one and its covariance holds: on
synthetic eye-in-hand scenes the normalized errors had an RMS of 1.02–1.13,
from priors that matched the robot's error and from priors ten times too
tight or too loose. With the estimate off, the configured
robot_poses.rot_sigma and trans_sigma are taken as the robot's true
accuracy: too loose, and the hand-eye and target standard deviations are
pessimistic; too tight, and they are too small, with nothing in the
residuals to say so.
Without refinement the robot poses are taken as exact. Their errors then show up in the corner residuals, but as an error shared by every corner of a view rather than independent noise, and the covariance treats it as independent: with 476 corners a view, it was 16–17 times too small on the same scenes. Refine the robot poses whenever their error is not well below the corner noise.
What a Covariance Does Not Cover
- Systematic error. The covariance measures the scatter caused by noise. An error that differs from view to view (a lens model or target that does not fit exactly) is in it, through the view scatter that scales the covariance (Parameter Uncertainty). An error common to every view, such as a wrong board cell size, leaves it small and the estimate biased; watch the per-feature residuals for structure. Calibrating
kuka_1, the threeds8cameras and the twostereocameras from two disjoint halves of their views, the two projections differ by 0.8 to 1.2 times their predicted σ, and by 1.0 on average (2.2 to 5 times without the view scatter). One camera is a noisy check: with an exactly known σ, a camera's ratio still spans about 0.7 to 1.2. - Second-order error. The covariance is first order. Weak views (a rig whose boards stay centred and barely tilted) can leave each parameter's σ right while a combination of them errs several times its σ;
second_orderpredicts it and the quality report'scovariance_linearitycheck warns (Reading the Covariance, Capturing Calibration Images). The covariance itself is not corrected for it. - Fixed parameters. It is conditional on the parameters the final solve held fixed (
fixedin the result). Fixing a parameter the data cannot pin down makes the others look better determined than they are: a rig withrig.refine_intrinsics: falseholds each camera's intrinsics, and its extrinsics' σ leaves their uncertainty out. - Robot poses. They are taken as exact unless the hand-eye solve refines them, as described in the Scope section above.
- The shape of stated point covariances. Per-point covariances are trusted up to one common factor, which
σ̂₀estimates. Covariances that are right for some points and wrong for others (one image overstated, say) are not detected byσ̂₀and weigh the points wrongly. - The camera's own pose. The projection map varies only the camera's parameters (Projection Uncertainty).