Calibration Files
insane_sensor_calib_preprocessed/ holds six YAMLs. All matrices are row-major; every T_* last row is [0,0,0,1] to 1e-9.
camera_calibration_{klu1,klu2,mars}.yaml.
- Duplicate-key trap:
rs_cam0andrs_cam1each appear twice at top level (intrinsic block then extrinsic block). A naiveyaml.safe_loadkeeps only the last and silently loses both intrinsic objects. Use a duplicate-key-aware parse to recover all seven logical objects:nav_cam_fov,nav_cam_radtan,nav_cam_extr,rs_cam0_intr,rs_cam1_intr,rs_cam0_extr,rs_cam1_extr. - Per-object field schema.
- Intrinsic objects (
nav_cam_fov,nav_cam_radtan,rs_cam0_intr,rs_cam1_intr) carrycamera_model(alwayspinhole),distortion_model(fovorradtan),rostopic,distortion_coeffs(length 1 forfov, 4 forradtan),intrinsics(length 4,[fx, fy, cx, cy]), andresolution(length 2);rs_cam1_intradditionally carriesT_cn_cnm1. - Extrinsic objects (
nav_cam_extr,rs_cam0_extr,rs_cam1_extr) carryT_cam_px4imu(a4×4homogeneous transform), andrs_cam1_extradditionallyT_cn_cnm1. - The
fov(atan) distortion model has a maximum valid distorted radius π/(2ω); on the stereo (ω≈0.92) ~11% of the 848×800 frame (edges/corners) maps to no real ray and must be masked when undistorting.
- Intrinsic objects (
- The nav camera ships two parallel distortion models, neither promoted:
nav_cam_fov(1 coeff) andnav_cam_radtan(4 coeffs).- Exact
nav_cam_fov[fx,fy,cx,cy]/omegavalues are klu1[1058.8189202778128, 1057.8027712855899, 1052.3878051009838, 732.3114468595618]/0.8959270682878476, klu2[1061.7370962608372, 1062.0650740210501, 1037.9068126383522, 758.5950126587837]/0.8938749765815662, mars[1060.7239461267836, 1062.573714542241, 1032.901264494562, 752.9529515861134]/0.8890719075150788. - Exact
nav_cam_radtan[fx,fy,cx,cy]values are klu1[1140.57, 1138.23, 1050.43, 731.67], klu2[1141.18, 1141.32, 1046.04, 758.63], mars[1134.20, 1135.51, 1034.93, 750.99]. - Resolutions
[2056,1542]nav,[848,800]stereo. rostopicfields map objects to streams (nav_cam→/mission_cam/image_raw;rs_cam0/rs_cam1→/realsense/fisheye{1,2}/image_raw).
- Exact
- Extrinsics:
nav_cam_extr/rs_cam0_extr/rs_cam1_extrcarryT_cam_px4imu;rs_cam1carries the stereo baselineT_cn_cnm1under both itsintrandextrobjects.- The two
T_cn_cnm1copies are equal on klu2/mars but differ on klu1 (0.30° rotation, 0.78 mm translation; baseline 63.96 vs 63.18 mm) — pick deliberately on klu1. - The Kalibr
timeshift_cam_imu = −0.0332 s(nav cam ↔︎ PX4 IMU) ships only in the rawinsane_nav_cam_mars_rawbundle, not the preprocessed YAML.
- The intrinsics hard-coded in the tooling’s
export_tag_data.pyequal the klu2nav_cam_radtanblock exactly (the klu2 calibration frozen in-script), differing from klu1 by ~27 px — they are not a separate calibration.
sensor_calibration.yaml (dataset-wide). Full top-level key inventory, in file order: norm_rtk1_rtk2 (= 1.16), p_vc_pximu ([0.06,0,0]), R_vc_pximu (identity), R_pximu_vgps (45° yaw, first column = unit rtk2−rtk1), p_vc_rtk2 ([-0.41,-0.41,0]), p_pximu_rtk2 ([-0.47,-0.41,0]), p_vc_rtk1 ([0.41,0.41,0]), p_pximu_rtk1 ([0.35,0.41,0]), T_pximu_lsimu, T_pximu_rsimu, T_pximu_pxbaro. The p_vc_* lever arms are in the vehicle-center frame, the p_pximu_* in the PX4-IMU frame (they differ by the p_vc_pximu 0.06 m x-offset); the rtk2−rtk1 baseline is 1.16 m in both frames.
- Parse trap:
T_pximu_rsimurows omit intra-row commas and tokenize on whitespace into four floats ([[-0.0122 0.5677 0.8231 0.0422], …]), unlike the comma-delimitedT_pximu_lsimu/T_pximu_pxbaro. A naive list parser yields one string per row. - Reduced precision:
T_pximu_lsimuandT_pximu_rsimurotation blocks fail tight orthogonality (max|RRᵀ−I|6.0e-5 / 1.1e-4) but pass the loose 2e-4 tolerance;T_pximu_pxbarois exact identity. Re-orthonormalize before use.
mag_calibration_{klu,mars}.yaml. Keys R_pxmag_pximu, px4_mag_intr, R_lsmmag_pximu, lsm_mag_cal_intr, mag_var. R_* are proper rotations (full precision). *_intr are ordered [transform, offset]; the correction is m_corr = transform·(m_raw − offset) with offset in the raw stream’s units (PX4 offsets O(1e-5..1e-7); LSM O(0.1)). mag_var = [inc, dec] radians, exact values in Platform. The two site YAMLs differ substantially.
- Defect (verified by the magnetometer-intrinsic reproduction): the LSM9DS1 intrinsic blocks (
lsm_mag_cal_intr) are SWAPPED between the two site YAMLs — and the swap is full-block: both the soft-irontransformand the hard-ironoffsetswap together, not just the matrix (the offset is the part that injects a real bias, O(0.1) in the raw stream, differing 0.0623 cross-site). - Re-fitting the ellipsoid from the raw continuous-rotation recordings, the Negev/Mars-analog LSM fit reproduces the
mag_calibration_klu.yamlLSM block (and the Klagenfurt fit reproduces themag_calibration_mars.yamlLSM block) — the soft-irontransformto ~1e-13 and the hard-ironoffsetto ~1e-14 (1.6e-14 / 6.4e-15) — while the PX4 blocks (px4_mag_intr) are correctly site-matched. - So for the LSM intrinsic the cross-site file is the correct one; for PX4, the site-matched file.
- The inter-site differences make each match a real test, not a trivial identity: the two shipped PX4 transform blocks differ between sites by max-abs 3.95e-2, so the same-site PX4 agreement to ~1e-14 is non-trivial; the two shipped LSM blocks differ by 2.37e-2 in the transform and 0.0623 in the offset, and that LSM inter-site difference is exactly the size by which a same-site LSM check fails — the quantitative signature of the full-block swap.
- Flight mag streams ship raw, so applying these is the user’s step — and note the maintainers’ own ground-truth generation never applied the
px4_magintrinsic (raw mag into the Wahba; Source of Truth).
Raw calibration bundles. Only insane_nav_cam_mars_raw ships precomputed Kalibr results (its fov/radtan outputs match camera_calibration_mars.yaml to full precision).
- The other five bundles ship only
intrinsic.bag/extrinsic.bag(~52 GB total) +kalibr.sh+target_a3.yaml(aprilgrid 7 rows × 5 cols, 35 mm tags, 0.5 spacing ratio) +imu_model_*.yamland must be re-run to reproduce the klu1/klu2/stereo intrinsics. imu_modelKalibr noise densities: PX4 acc_nd 1.714e-3 / gyr_nd 7.9e-5 (200 Hz); LSM 100× those at update_rate 900 Hz (but the actual LSM flight rate is ~830 Hz — a mismatch that mis-discretizes if used naively); RealSense acc_nd 6.70e-5 / gyr_nd 5.15e-6.insane_mag_calib_rawhas different folder/file naming per site (klagenfurt:*_datanames, six orientations, 9 streams; mars_analog: plain names, nine orientations, 5 streams).
Reproduction
The magnetometer intrinsics reproduce from the raw continuous-rotation recordings: re-fitting the ellipsoid (the maintainers’ mag_intrinsic_cal over ellipsoid_fit) against insane_mag_calib_raw/ and comparing to the shipped YAMLs reproduces the PX4 blocks site-matched and the LSM blocks cross-site — the evidence for the lsm_mag_cal_intr site-swap above. The reproduced blocks and comparison diffs persist as the retained run artifacts of the magnetometer-intrinsic reproduction. The klu1/klu2/stereo camera intrinsics are not shipped precomputed and must be re-run from the raw bundles with kalibr.sh.
The PX4 reproduction is tight enough to establish provenance: each shipped px4_mag_intr block re-fits from its own site’s raw recording to max|ΔT| ≈ 1e-14 (mars 8.77e-15, klu 4.33e-15), with the hard-iron offset agreeing to O(1e-19). The two shipped PX4 blocks differ between sites by max|ΔT| = 3.95e-2, so this same-site agreement is not an identity — it confirms the shipped PX4 intrinsics are genuine outputs of the maintainers’ ellipsoid fit, not hand-tuned. (The LSM blocks reproduce to ~1e-13 only cross-site, per the swap defect above.)