Sensor calibration refinement¶
Refining the calibration using the optimization¶
An accurate calibration is necessary to obtain high-quality odometry estimates and to successfully refine the maps during the subsequent batch optimization. In most cases, maplab uses an (initial) sensor calibration estimated using external calibration tools such as Kalibr.
Optionally, the visual-inertial batch optimization can jointly estimate the intrinsics and extrinsics of the camera(s) together with the trajectory and the structure.
When running optvi, you can unfix certain parts of the calibration using the following flags:
--ba_fix_ncamera_intrinsics=false
--ba_fix_ncamera_extrinsics_rotation=false
--ba_fix_ncamera_extrinsics_translation=false
These flags are all set to true
by default. When starting from an inaccurate initial guess you may want to to unfix only some of them (e.g. extrinsics first), perform the optimization, unfix some others, optimize, etc. Unfortunately, this process requires some experimentation.
Note: Usually, you will need a good initial estimate for the calibration refinement to work. Additionally, your map should be long enough, contain enough excitation and preferably loopclose (using the lc
command) to yield a good calibration.
Inspecting and saving the calibration¶
After the optimization, you can inspect the calibration using the command:
print_camera_calibrations
This will print an output similar to:
Camera(54812562fa109c40fe90b29a59dd7798): cam0
line delay: 0
image (cols,rows): 752, 480
focal length (cols,rows): 458.655, 457.297
optical center (cols,rows): 367.216, 248.375
distortion:
Distortion: (RadTanDistortion)
k1 (radial): -0.283408
k2 (radial): 0.0739591
p1 (tangential): 0.000193595
p2 (tangential): 1.76187e-05
T_C_B:
0.0148655 0.999557 -0.0257744 0.0652229
-0.999881 0.0149672 0.00375619 -0.0207064
0.0041403 0.0257155 0.999661 -0.0080546
0 0 0 1
While it’s impossible to tell if the calibration is accurate based on this output, you can easily detect that something went wrong as the calibration typically:
has similar x-y focal length values, e.g. 458.655 vs 457.297),
has the optical center located roughly in the middle of the image, e.g. (367.216, 248.375) for a (752, 480) image size,
has a reasonable translation between the camera and the base/IMU frame (last column of T_C_B), compare it with manually measured values.
If you’re happy with the results, you can export the calibration using the command:
export_ncamera_calibration --ncamera_calibration_export_folder your_folder
and use it in the future.