Skip to content

Configuration

CamCalib is config-driven: one YAML describes the board, the inputs, and the solve. This page documents every key. For the commands that consume them see the CLI reference.

KeyTypeRequired forDescription
board_typeapriltag | chessboard | arucoallTarget family
rows, colsintallTag rows/cols; inner corners for chessboard
tag_sizefloat (m)apriltagTag edge length
tag_spacingfloatapriltagGap between tags as a fraction of tag_size
tag_familystringapriltage.g. t36h11
square_sizefloat (m)chessboardSquare edge length
marker_sizefloat (m)arucoMarker edge length
marker_separationfloat (m)arucoGap between markers
aruco_dictstringarucoOpenCV dictionary name
KeyTypeDefaultDescription
camera_idintIndex; reference_camera refers to it
namestringLabel used in reports
source_typeimages | rosbag_topic | ros2bag | euroc | timestamped_images | videoInput format
source_pathpathDirectory, bag, or EuRoC camera folder
topicstringImage topic — bag sources only
distortion_modelradtan | equidistant | double_sphere | eucm | fov | omni_radtanSee Camera model
shutter_typeglobal | rollingglobalrolling enables readout calibration
factor_hzfloat0Subsample to this frame rate; 0 uses every frame

Models may be mixed across cameras in one rig.

KeyTypeDefaultDescription
max_iterationsint15LM iterations for the joint solve
max_init_framesint100Cap on frames used for OpenCV init; 0 = no cap
pixel_sigmafloat1.0Observation noise, pixels
huber_thresholdfloat1.345Huber robust-loss threshold
KeyTypeDefaultDescription
corner_subsampletop_left | two_diag | alltop_leftCorners kept per AprilGrid tag. top_left gives 3–5× speedup for under 0.1% quality drift; auto-falls back to all on sparse data
rerun_outliersbooltrueOutlier-driven second pass, with a pathology guardrail
optimize_time_offsetboolfalseCamera–camera time offsets; multi-camera only
rerun_visualizationbooltrueLaunch the Rerun 3D viewer; suppressed in batch
reference_cameraint0Camera the extrinsics are expressed against
output_filepathResult path
output_formatyaml | jsonyamlResult format

A different shape: input / board / camera_input / solve / output.

KeyTypeDescription
formatros1 | ros2 | eurocInput format
pathpathBag file or EuRoC mav0 directory
bagslist of pathsBatch mode — calibrate many sequences from one config, each into bag<NN>/cam_imu.json
imu_topicslistIMU topics; the first is the base IMU
imuslist of objectsPer-IMU options, e.g. {gyro_only: true}
window_modemanual | …manual honours the explicit t0/window below
t0float (s)Window start
windowfloat (s)Window length
cache_dirpathDetection cache — reused across runs

Cam-IMU calibration is a two-step workflow: calibrate the cameras first, then feed that result in here.

KeyTypeDefaultDescription
pathpathCamera calibration produced by camcalib calibrate
free_intrinsicsboolfalseRe-estimate intrinsics rather than pinning them
estimate_readoutboolfalseEstimate rolling-shutter readout here
KeyTypeDefaultDescription
state_hzfloat30.0Rate of pose/velocity/bias state nodes. Matters on dynamic rigs — reproj, lever, and td alias at low rates and plateau near 30 Hz; flat on gentle sequences
max_iterationsintLM iterations
imu_intrinsicsdw_da | …Which IMU intrinsics to solve
imu_intrinsics_modelkalibr | rpng | calyxParameterisation. A convention, not a quality lever — all three recover identical extrinsics. See IMU model
estimate_t_gaboolfalseEstimate the base IMU’s internal gyro↔accel offset
sigma_t_gafloatStaged prior on t_ga
corner_subsampletop_left | two_diag | alltop_leftAs above
sigma_td_priorfloatPrior on the camera–IMU time offset; 0.0 disables
init_kwargsobjectInitialiser options, e.g. {keyframe_hz: 2.0, scale_rel_tol: 0.3}
KeyTypeDescription
pathpathResult JSON
cam_imu_ds.yaml
input:
format: ros1
path: /data/tum_vi/raw/dataset-calib-imu1.bag
imu_topics: ["/imu0"]
window_mode: manual
t0: 3.0
window: 45.0
cache_dir: /tmp/camcalib_tumvi_detcache
board: {board_type: apriltag, rows: 6, cols: 6, tag_size: 0.088, tag_spacing: 0.3, tag_family: t36h11}
camera_input:
path: /tmp/tumvi_calib_ds_cam0.yaml
free_intrinsics: false
estimate_readout: false
solve:
state_hz: 8.0
max_iterations: 40
imu_intrinsics: dw_da
corner_subsample: top_left
sigma_td_prior: 0.0
init_kwargs: {keyframe_hz: 2.0, scale_rel_tol: 0.3}
output:
path: /tmp/tumvi_imu1_ds.json

More under examples/configs/ in the repository — tumvi_cam_imu/, tga_t265*/, looperrobotics/, gilabs/.