Skip to main content
Version: dev-latest

Supported Fiducials

Fiducials

Find examples for all of these fiducials in the MetriCal Sensor Calibration Utilities repository on GitLab.

A detector is a description of what feature(s) to identify in an observation to generate our object space.

Aprilgrid

Note

Aprilgrid is the preferred Detector type for camera data in MetriCal. We previously (pre-13.0) recommended Markerboard, but have since greatly improved the performance of our Aprilgrid detection code and feel that it is the better option in the majority of cases.

Target: Aprilgrid

Aprilgrids are patterned sets of Apriltags. They have contrasting squares in the corner of every tag; this provides feature detection algorithms more information to derive corner locations.

FieldTypeDescription
marker_dictionarystringThe marker dictionary used on this target. See Supported Marker Dictionaries
marker_grid_widthfloatNumber of AprilTags / markers horizontally on the board
marker_grid_heightfloatNumber of AprilTags / markers vertically on the board
marker_lengthfloatThe length of one edge of the AprilTags in the board, in meters
tag_spacingbooleanThe space between the tags in fraction of the edge size [0.0, 1.0]
marker_id_offsetinteger(Optional) Lowest marker ID present in the board. This will offset all expected marker values. Default is 0.

Markerboard

Markerboards are similar to checkerboards, but contain a series of coded markers in the empty spaces of the checkerboard. These codes are most often in the form of April or ArUco tags, which allow for better identification and isolation of features.

Target: Markerboard

FieldTypeDescription
checker_lengthfloatThe length of the side of a checker (a solid square), in meters
corner_heightfloatThe number of inner corners on the board, counted vertically. This is one less than the number of columns on the board
corner_widthfloatThe number of inner corners on the board, counted horizontally. This is one less than the number of rows on the board
marker_dictionarystringThe marker dictionary used on this target. See Supported Marker Dictionaries
marker_lengthfloatThe length of the side of a marker, in meters
marker_id_offsetinteger(Optional) Lowest marker ID present in the board. This will offset all expected marker values. Default is 0.
initial_cornerstring(Optional) Valid values are "square" and "marker". Default is "marker". Used to counteract a breaking change to markerboards generated by newer versions of OpenCV. This option specifies if the origin corner of your board is populated with a solid black square or a marker. In boards generated by OpenCV >=4.6.0, the origin will always be a black square. In older versions, the origin can sometimes be a marker.

Circular Markerboard

Target: Circular Markerboard

This circular markerboard is similar to a markerboard in almost every way, but with an embedded retroreflective circle. This target type is required to perform a Camera ↔ LiDAR or LiDAR ↔ LiDAR calibration.

This target is represented in object space as two separate object spaces: one for the markerboard and one for the circle. The description below is only for the circle. See the documentation on using mutual construction groups for more information.

Using Multiple Circular Markerboards

When using multiple circular markerboards, MetriCal requires that the radii of the circles be at least 10cm different from each other. If the radii are too similar, the calibration may fail or produce incorrect results.

FieldTypeDescription
radiusfloatThe radius of the circle, in meters. Measured to the circle's outer edge.
x_offsetfloatThe horizontal distance between the origin of the markerboard and the center of the circle, in meters
y_offsetfloatThe vertical distance between the origin of the markerboard and the center of the circle, in meters
z_offsetfloat(Optional) The depth between the [origin](#origin of the markerboard and the center of the circle, in meters. Typically this should not be explicitly set since the circle is in-plane with the rest of the target. However, there are some cases where the detected circle is consistently offset from the board and this can be used to model some of that error.
detect_interior_pointsbooleanWhether to use the LiDAR points detected within the circle bounds as part of the optimization. Doing so will produce Interior Points to Plane Metrics
reflective_tape_widthfloat(Optional) The width of the circular retroreflective tape, in meters. Used as a hint during circle detection. Defaults to 5cm

"Origin"?

Notice that x_offset and y_offset are relative to the "origin" of the markerboard pattern. The way that this is defined differs across board types, and can be a bit confusing. If you are following our target selection tutorial and are using a Tangram premade target, we have already calculated offsets from the proper origin. If you are constructing your own custom circle target, you will need to find the origin of your board in order to measure circle offsets yourself.

To find the origin of an Aprilgrid style target, first find the tag matching the marker_id_offset of the board. Orient this tag so that it's in the bottom-left corner of your frame of reference. The origin of the board is the top left corner of the top left marker of your board (see diagram).

Target: Circular Aprilgrid Description

To find the origin of a Markerboard style target, first find the tag matching the marker_id_offset of the board. Orient this tag so that it's in the top-left corner of your frame of reference. The origin of the board is the bottom right corner of the top left checker of your board (see diagram). Note that the top left checker of your board may be either a black square or a white checker with a tag inside of it. If it's the latter, the origin is the corner of the checker rather than the tag itself.

Target: Circular Markerboard Description

SquareMarkers

"SquareMarkers" is a general catch-all for a collection of signalized markers, e.g. a calibration space made up of many unconnected ArUco or April tags.

Target: Markers

FieldTypeDescription
marker_dictionarystringThe marker dictionary used on this target. See Supported Marker Dictionaries
marker_idslist of integersThe marker IDs present in this set of SquareMarkers.

Checkerboard

Anyone who has ever tried their hand at calibration is familiar with the checkerboard. This is a flat, contrasting pattern of squares with known dimensionality. It's known for its ease of creation and flexibility in use.

Target: Checkerboard

FieldTypeDescription
checker_lengthfloatThe length of the side of a checker (a solid square), in meters
corner_heightfloatThe number of inner corners on the board, counted vertically. This is one less than the number of columns on the board
corner_widthfloatThe number of inner corners on the board, counted horizontally. This is one less than the number of rows on the board
danger

While MetriCal supports checkerboards, it is important to note some limitations:

  • Points on the checkerboard are ambiguous. No calibration system can reliably tell the difference between a checkerboard rotated 180° and one that is not rotated at all. The same applies between rotations of 90° and 270°. This ambiguity means that MetriCal cannot reliably differentiate extrinsics, which causes projective compensations.
  • The entire checkerboard needs to be visible in the field-of-view of the camera. With coded targets or asymmetric patterns, MetriCal can still identify key features without the full target in view.

We recommend using coded detectors like the Markerboard whenever possible. This allows MetriCal to be more flexible to different data collection practices, and reduces the burden on you to keep the entire object space in frame at all times.

Supported Marker Dictionaries

ValueDescription
"Aruco4x4_50"4x4 bit Aruco containing 50 markers.
"Aruco4x4_100"4x4 bit Aruco containing 100 markers.
"Aruco4x4_250"4x4 bit Aruco containing 250 markers.
"Aruco4x4_1000"4x4 bit Aruco containing 1000 markers.
"Aruco5x5_50"5x5 bit Aruco containing 50 markers.
"Aruco5x5_100"5x5 bit Aruco containing 100 markers.
"Aruco5x5_250"5x5 bit Aruco containing 250 markers.
"Aruco5x5_1000"5x5 bit Aruco containing 1000 markers.
"Aruco6x6_50"6x6 bit Aruco containing 50 markers.
"Aruco6x6_100"6x6 bit Aruco containing 100 markers.
"Aruco6x6_250"6x6 bit Aruco containing 250 markers.
"Aruco6x6_1000"6x6 bit Aruco containing 1000 markers.
"Aruco7x7_50"7x7 bit Aruco containing 50 markers.
"Aruco7x7_100"7x7 bit Aruco containing 100 markers.
"Aruco7x7_250"7x7 bit Aruco containing 250 markers.
"Aruco7x7_1000"7x7 bit Aruco containing 1000 markers.
"ArucoOriginal"5x5 bit Aruco containing the original generated marker library.
"Apriltag16h5"4x4 bit Apriltag containing 20 markers. Minimum hamming distance between any two codes is 5.
"Apriltag25h9"5x5 bit Apriltag containing 35 markers. Minimum hamming distance between any two codes is 9.
"Apriltag36h10"6x6 bit Apriltag containing 2320 markers. Minimum hamming distance between any two codes is 10.
"Apriltag36h11"6x6 bit Apriltag containing 587 markers. Minimum hamming distance between any two codes is 11.
"ApriltagKalibr"6x6 bit Apriltag containing 587 markers. Minimum hamming distance between any two codes is 11. Every marker has a border width of 2; this is the only main differentiator between Kalibr and other Apriltag types.