Result formats
What a run writes, and which file to use for what.
Dual YAML — camera calibration
Section titled “Dual YAML — camera calibration”Camera calibration writes two files on purpose:
| File | Contains | Use for |
|---|---|---|
*_calib.yaml | Intrinsics, distortion, extrinsics, time offsets, readout | Deploy. The calibration itself |
*_full.yaml | The above plus per-frame board poses | Replay. Re-run analysis without redetecting |
Deploy the small one; keep the full one to reproduce the run.
Both carry a timings: block — hierarchical per-stage timings with metadata, so
you can ask whether a change was faster overall or only in one stage.
output_format: json writes JSON instead.
Cam-IMU JSON
Section titled “Cam-IMU JSON”camcalib cam-imu writes a JSON result containing, per sensor:
| Field | Meaning |
|---|---|
T_CtoI | Camera → IMU transform |
td | Camera–IMU time offset |
| readout | Rolling-shutter readout, when estimated |
Dw, Da, Tg | IMU intrinsics, in the configured convention |
b_g, b_a | Biases |
t_ga | Gyro↔accel offset, when estimated |
gyro_only | Per-IMU flag — the result self-documents which IMUs skipped the accel |
| source topic | Per sensor; this is what lets apply-calib derive the topic→sensor map without a hand-written file |
Batch layout
Section titled “Batch layout”With input.bags, each sequence gets its own discoverable result:
<output_dir>/ bag00/cam_imu.json bag01/cam_imu.json bag02/cam_imu.jsonThat layout is what the repeatability study reads.
HTML report
Section titled “HTML report”One self-contained file per run — no external assets, so it can be emailed. Contents: navigable TOC, summary stat cards, intrinsics and distortion tables, extrinsics with an inline 3D plot, temporal calibration (time offset and readout together), reprojection analysis (per-frame robust median and P95, per-tag, error-vector histograms, dual-panel scatter, corner heatmaps), calibration-data quality (motion-excitation metrics with grades, rotation-axis spread, angular-velocity timeline, feature-coverage heatmap), detection statistics, pipeline timing, and collapsible appendices. Print-friendly CSS.
Rebuild reports from saved YAML plus the detection cache, without recalibrating:
python -m camcalib.analysis.regenerate_htmlKalibr interop
Section titled “Kalibr interop”camcalib.io.kalibr is the one surface for Kalibr files:
| Function | Direction | Handles |
|---|---|---|
read_camchain | in | Intrinsics + distortion across pinhole / ds / eucm / fov |
read_camchain_imucam | in | Also each camera’s T_cam_imu and stereo T_cn_cnm1 |
write_camchain_imucam | out | Exports a cam-IMU result as a round-trippable camchain-imucam |
This is how a Kalibr calibration becomes a CamCalib starting point, and how a CamCalib result goes back into a Kalibr-expecting pipeline.
Ground-truth comparison
Section titled “Ground-truth comparison”Per-dataset ground-truth YAMLs live under examples/regression/gt/. Where one
exists, the dashboard annotates each parameter with its deviation — for example
Δ +0.27% GT=190.97 — colour-coded by accuracy band.
Corrected bags
Section titled “Corrected bags”camcalib apply-calib writes a corrected ROS1
bag plus a provenance sidecar recording which calibration was applied and
what it changed. The bag is ordinary — anything that read the original reads
the corrected one.