For the complete documentation index, see llms.txt. This page is also available as Markdown.

Camera calibration

This camera calibration procedure is only for RGB cameras.

Cyclops' VIO requires precise calibration of the camera intrinsics to offer optimal positioning performance. For this procedure, you will need:

  • A monitor screen

  • Camera to calibrate

  • Python3 with opencv/numpy

Run this script on your computer. This will detect your screen and display ChArUco markers:

Collect 40 images capturing the markers from varying angles (far, close, oblique, etc). You should see green annotations on the camera stream when the markers get detected by the calibration stream.

Run the calibration script:

python camera_calibrate.py --screen <select screen> --device <video device>

# for example:
# python camera_calibrate.py --screen 0 --device /dev/video0

Trace:

using screen 1:HDMI-0 2560x1440 @ +3840 (697 mm wide)
board: 10x7 squares, 188px = 51.19mm per square

camera: /dev/video2 1280x800 fourcc=MJPG fps=100

collect 30+ samples (tilt the camera, cover all FOV regions), then press 'c'

sample   1: corners=25 sharp=63 coverage=14/24
sample   2: corners=43 sharp=181 coverage=19/24
sample   3: corners=52 sharp=204 coverage=21/24
sample   4: corners=54 sharp=264 coverage=22/24
sample   5: corners=54 sharp=128 coverage=22/24
sample   6: corners=54 sharp=96 coverage=22/24
sample   7: corners=54 sharp=74 coverage=23/24
sample   8: corners=41 sharp=102 coverage=24/24
sample   9: corners=34 sharp=61 coverage=24/24
sample  10: corners=38 sharp=81 coverage=24/24
sample  11: corners=44 sharp=114 coverage=24/24
sample  12: corners=46 sharp=104 coverage=24/24
sample  13: corners=45 sharp=75 coverage=24/24
sample  14: corners=52 sharp=95 coverage=24/24
sample  15: corners=52 sharp=76 coverage=24/2
sample  16: corners=43 sharp=118 coverage=24/24
sample  17: corners=45 sharp=113 coverage=24/24
sample  18: corners=54 sharp=167 coverage=24/24
sample  19: corners=45 sharp=111 coverage=24/24
sample  20: corners=52 sharp=194 coverage=24/24
sample  21: corners=54 sharp=138 coverage=24/24
sample  22: corners=54 sharp=159 coverage=24/24
sample  23: corners=53 sharp=118 coverage=24/24
sample  24: corners=54 sharp=75 coverage=24/24
sample  25: corners=50 sharp=61 coverage=24/24
sample  26: corners=39 sharp=66 coverage=24/24
sample  27: corners=44 sharp=105 coverage=24/24
sample  28: corners=44 sharp=60 coverage=24/24
sample  29: corners=54 sharp=136 coverage=24/24
sample  30: corners=43 sharp=85 coverage=24/24
sample  31: corners=51 sharp=87 coverage=24/24
sample  32: corners=40 sharp=84 coverage=24/24
sample  33: corners=37 sharp=94 coverage=24/24
sample  34: corners=36 sharp=110 coverage=24/24
sample  35: corners=54 sharp=141 coverage=24/24
sample  36: corners=54 sharp=139 coverage=24/24
sample  37: corners=54 sharp=166 coverage=24/24
sample  38: corners=33 sharp=114 coverage=24/24

calibrating with 38 samples...

================================================================
views: 38  image: 1280x800
pinhole+radtan: rms=0.149px  fx=904.01 fy=903.98 cx=655.5 cy=406.1
kb4:   rms=0.148px  fx=904.23 fy=904.20 cx=655.6 cy=406.0
                k1=0.371170 k2=0.258915 k3=-0.656974 k4=0.819399
HFOV ~= 70.6 deg
================================================================

If you are using a wide angle or fisheye camera, pick the kb4 model. If you are using a low distortion pinhole camera (e.g., Raspberry Pi Camera module), select the pinhole model.

Expect low RMS (sub 1 px) from a successful calibration.

Once calibrated, input values (fx, fy, cx, cy, k1, k2, k3, k4) into Vozilla's camera calibration parameters.

Last updated