Supported Targets
MetriCal supports a large variety of traditional calibration targets, as well as a few of our own design. You can even use multiple targets at once, without having to do much of anything! Learn how to use multiple targets at once here: Using Multiple Targets.
Find examples for AprilGrid, Markerboard, and Lidar targets in the MetriCal Premade Targets repository on GitLab.
- AprilGrid
- Markerboard
- Circle Target
- SquareMarkers
- DotMarkers
- Checkerboard
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.
Field | Type | Description |
---|---|---|
marker_dictionary | string | The marker dictionary used on this target. See Supported Marker Dictionaries below. |
marker_grid_width | float | Number of AprilTags / markers horizontally on the board |
marker_grid_height | float | Number of AprilTags / markers vertically on the board |
marker_length | float | The length of one edge of the AprilTags in the board, in meters |
tag_spacing | boolean | The space between the tags in fraction of the edge size [0.0, 1.0] |
marker_id_offset | integer | (Optional) Lowest marker ID present in the board. This will offset all expected marker values. Default is 0 . |
Supported Marker Dictionaries
Value | Description |
---|---|
"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. |
"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. |
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.
Field | Type | Description |
---|---|---|
checker_length | float | The length of the side of a checker (a solid square), in meters |
corner_height | float | The number of inner corners on the board, counted vertically. This is one less than the number of columns on the board |
corner_width | float | The number of inner corners on the board, counted horizontally. This is one less than the number of rows on the board |
marker_dictionary | string | The marker dictionary used on this target. See Supported Marker Dictionaries below. |
marker_length | float | The length of the side of a marker, in meters |
marker_id_offset | integer | (Optional) Lowest marker ID present in the board. This will offset all expected marker values. Default is 0 . |
initial_corner | string | (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. |
Supported Marker Dictionaries
Value | Description |
---|---|
"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. |
Lidar Circle Target
This target is just a markerboard with a retroreflective ring on its surface. This target type is required to perform a Camera ↔ LiDAR or LiDAR ↔ LiDAR calibration with MetriCal.
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.
When using multiple circle targets, 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.
Field | Type | Description |
---|---|---|
radius | float | The radius of the circle, in meters. Measured to the circle's outer edge. |
x_offset | float | The horizontal distance between the origin of the markerboard and the center of the circle, in meters |
y_offset | float | The vertical distance between the origin of the markerboard and the center of the circle, in meters |
z_offset | float | (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_points | boolean | Whether 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_width | float | (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).
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.
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.
Field | Type | Description |
---|---|---|
marker_dictionary | string | The marker dictionary used on this target. See Supported Marker Dictionaries below. |
marker_ids | list of integers | The marker IDs present in this set of SquareMarkers. |
Supported Marker Dictionaries
Value | Description |
---|---|
"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. |
DotMarkers
This target type is still under development. Please check back later for more information.
DotMarkers are the same as SquareMarkers, but all of the black and white squares within the tags are replaced with circles! In addition to being a fun name, DotMarkers allow MetriCal to use circles while also preserving the code information of Aruco or April tags.
Field | Type | Description |
---|---|---|
marker_dictionary | string | The marker dictionary used on this target. See Supported Marker Dictionaries below. |
marker_ids | list of integers | The marker IDs present in this set of SquareMarkers. |
Supported Marker Dictionaries
Value | Description |
---|---|
"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. |
Checkerboard
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.
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.
Field | Type | Description |
---|---|---|
checker_length | float | The length of the side of a checker (a solid square), in meters |
corner_height | float | The number of inner corners on the board, counted vertically. This is one less than the number of columns on the board |
corner_width | float | The number of inner corners on the board, counted horizontally. This is one less than the number of rows on the board |