diff --git a/docs/source/docs/apriltag-pipelines/2D-tracking-tuning.md b/docs/source/docs/apriltag-pipelines/2D-tracking-tuning.md index eb3672acd..dd3ec93c8 100644 --- a/docs/source/docs/apriltag-pipelines/2D-tracking-tuning.md +++ b/docs/source/docs/apriltag-pipelines/2D-tracking-tuning.md @@ -2,7 +2,7 @@ ## Tracking AprilTags -Before you get started tracking AprilTags, ensure that you have followed the previous sections on installation, wiring and networking. Next, open the Web UI, go to the top right card, and switch to the "AprilTag" or "Aruco" type. You should see a screen similar to the one below. +Before you get started tracking AprilTags, ensure that you have followed the previous sections on installation, wiring and networking. Next, open the Web UI, go to the top right card, and switch to the "AprilTag" or "ArUco" type. You should see a screen similar to the one below. ```{image} images/apriltag.png :align: center @@ -12,7 +12,7 @@ You are now able to detect and track AprilTags in 2D (yaw, pitch, roll, etc.). I ## Tuning AprilTags -AprilTag pipelines come with reasonable defaults to get you up and running with tracking. However, in order to optimize your performance and accuracy, you must tune your AprilTag pipeline using the settings below. Note that the settings below are different between the AprilTag and Aruco detectors but the concepts are the same. +AprilTag pipelines come with reasonable defaults to get you up and running with tracking. However, in order to optimize your performance and accuracy, you must tune your AprilTag pipeline using the settings below. Note that the settings below are different between the AprilTag and ArUco detectors but the concepts are the same. ```{image} images/apriltag-tune.png :align: center diff --git a/docs/source/docs/apriltag-pipelines/detector-types.md b/docs/source/docs/apriltag-pipelines/detector-types.md index 0bd43f2ad..1e62a1394 100644 --- a/docs/source/docs/apriltag-pipelines/detector-types.md +++ b/docs/source/docs/apriltag-pipelines/detector-types.md @@ -8,8 +8,8 @@ Note that both of these pipeline types detect AprilTag markers and are just two ## AprilTag -The AprilTag pipeline type is based on the [AprilTag](https://april.eecs.umich.edu/software/apriltag.html) library from the University of Michigan and we recommend it for most use cases. It is (to our understanding) most accurate pipeline type, but is also ~2x slower than AruCo. This was the pipeline type used by teams in the 2023 season and is well tested. +The AprilTag pipeline type is based on the [AprilTag](https://april.eecs.umich.edu/software/apriltag.html) library from the University of Michigan and we recommend it for most use cases. It is (to our understanding) most accurate pipeline type, but is also ~2x slower than ArUco. This was the pipeline type used by teams in the 2023 season and is well tested. -## AruCo +## ArUco -The AruCo pipeline is based on the [AruCo](https://docs.opencv.org/4.8.0/d9/d6a/group__aruco.html) library implementation from OpenCV. It is ~2x higher fps and ~2x lower latency than the AprilTag pipeline type, but is less accurate. We recommend this pipeline type for teams that need to run at a higher framerate or have a lower powered device. This pipeline type was new for the 2024 season. +The ArUco pipeline is based on the [ArUco](https://docs.opencv.org/4.8.0/d9/d6a/group__aruco.html) library implementation from OpenCV. It is ~2x higher fps and ~2x lower latency than the AprilTag pipeline type, but is less accurate. We recommend this pipeline type for teams that need to run at a higher framerate or have a lower powered device. This pipeline type was new for the 2024 season. diff --git a/docs/source/docs/calibration/calibration.md b/docs/source/docs/calibration/calibration.md index 86fca266d..64b5181e8 100644 --- a/docs/source/docs/calibration/calibration.md +++ b/docs/source/docs/calibration/calibration.md @@ -4,7 +4,7 @@ In order to detect AprilTags and use 3D mode, your camera must be calibrated at the desired resolution! Inaccurate calibration will lead to poor performance. ::: -To calibrate a camera, images of a Charuco board (or chessboard) are taken. By comparing where the grid corners should be in object space (for example, a corner once every inch in an 8x6 grid) with where they appear in the camera image, we can find a least-squares estimate for intrinsic camera properties like focal lengths, center point, and distortion coefficients. For more on camera calibration, please review the [OpenCV documentation](https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.html). +To calibrate a camera, images of a ChArUco board (or chessboard) are taken. By comparing where the grid corners should be in object space (for example, a corner once every inch in an 8x6 grid) with where they appear in the camera image, we can find a least-squares estimate for intrinsic camera properties like focal lengths, center point, and distortion coefficients. For more on camera calibration, please review the [OpenCV documentation](https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.html). :::{warning} While any resolution can be calibrated, higher resolutions may be too performance-intensive for some coprocessors to handle. Therefore, we recommend experimenting to see what works best for your coprocessor. @@ -17,7 +17,7 @@ The calibration data collected during calibration is specific to each physical c ## Calibration Tips :::{warning} -The usage of chessboards can result in bad calibration results if multiple similar images are taken. We strongly recommend that teams use Charuco boards instead! +The usage of chessboards can result in bad calibration results if multiple similar images are taken. We strongly recommend that teams use ChArUco boards instead! ::: Accurate camera calibration is required in order to get accurate pose measurements when using AprilTags and 3D mode. The tips below should help ensure success: @@ -38,11 +38,11 @@ Following the ideas above should help in getting an accurate calibration. ### 1. Navigate to the calibration section in the UI. -The Cameras tab of the UI houses PhotonVision's camera calibration tooling. It assists users with calibrating their cameras, as well as allows them to view previously calibrated resolutions. We support both charuco and chessboard calibrations. +The Cameras tab of the UI houses PhotonVision's camera calibration tooling. It assists users with calibrating their cameras, as well as allows them to view previously calibrated resolutions. We support both ChArUco and chessboard calibrations. ### 2. Print out the calibration target. -In the Camera Calibration tab, we'll print out the calibration target using the "Download" button. This should be printed on 8.5x11 printer paper. This page shows using an 8x8 charuco board (or chessboard depending on the selected calibration type). +In the Camera Calibration tab, we'll print out the calibration target using the "Download" button. This should be printed on 8.5x11 printer paper. This page shows using an 8x8 ChArUco board (or chessboard depending on the selected calibration type). :::{warning} Ensure that there is no scaling applied during printing (it should be at 100%) and that the PDF is printed as is on regular printer paper. Check the square size with calipers or an accurate measuring device after printing to ensure squares are sized properly, and enter the true size of the square in the UI text box. For optimal results, various resources are available online to calibrate your specific printer if needed. @@ -50,13 +50,13 @@ Ensure that there is no scaling applied during printing (it should be at 100%) a ### 3. Select calibration resolution and fill in appropriate target data. -We'll next select a resolution to calibrate and populate our pattern spacing, marker size, and board size. The provided chessboard and charuco board are an 8x8 grid of 1 inch square. The provided charuco board uses the 4x4 dictionary with a marker size of 0.75 inches (this board does not need the old OpenCV pattern selector selected). Printers are not perfect, and you need to measure your calibration target and enter the correct marker size (size of the aruco marker) and pattern spacing (aka size of the black square) using calipers or similar. Finally, once our entered data is correct, we'll click "start calibration." +We'll next select a resolution to calibrate and populate our pattern spacing, marker size, and board size. The provided chessboard and ChArUco board are an 8x8 grid of 1 inch square. The provided ChArUco board uses the 4x4 dictionary with a marker size of 0.75 inches (this board does not need the old OpenCV pattern selector selected). Printers are not perfect, and you need to measure your calibration target and enter the correct marker size (size of the ArUco marker) and pattern spacing (aka size of the black square) using calipers or similar. Finally, once our entered data is correct, we'll click "start calibration." :::{warning} Old OpenCV Pattern selector. This should be used in the case that the calibration image is generated from a version of OpenCV before version 4.6.0. This would include targets created by calib.io. If this selector is not set correctly the calibration will be completely invalid. For more info view [this GitHub issue](https://github.com/opencv/opencv_contrib/issues/3291). ::: :::{note} -If you have a [calib.io](https://calib.io/) CharuCo Target you will have to enter the paramaters of your target. For example if your target says "9x12 | Checker Size: 30 mm | Marker Size: 22 mm | Dictionary: AruCo DICT 5x5", you would have to set the board type to Dict_5x5_1000, the pattern spacing to 1.1811 in (30 mm converted to inches), the marker size 0.866142 in (22 mm converted to inches), the board width to 12 and the board height to 9. If you chose the wrong tag family the board wont be detected during calibration. If you swap the width and height your calibration will have a very high error. +If you have a [calib.io](https://calib.io/) ChArUco Target you will have to enter the paramaters of your target. For example if your target says "9x12 | Checker Size: 30 mm | Marker Size: 22 mm | Dictionary: ArUco DICT 5x5", you would have to set the board type to Dict_5x5_1000, the pattern spacing to 1.1811 in (30 mm converted to inches), the marker size 0.866142 in (22 mm converted to inches), the board width to 12 and the board height to 9. If you chose the wrong tag family the board wont be detected during calibration. If you swap the width and height your calibration will have a very high error. ::: ### 4. Take at calibration images from various angles. diff --git a/docs/source/docs/examples/aimingatatarget.md b/docs/source/docs/examples/aimingatatarget.md index d00719bda..a4482e4af 100644 --- a/docs/source/docs/examples/aimingatatarget.md +++ b/docs/source/docs/examples/aimingatatarget.md @@ -6,7 +6,7 @@ The following example is from the PhotonLib example repository ([Java](https://g - A Robot - A camera mounted rigidly to the robot's frame, centered and pointed forward. -- A coprocessor running PhotonVision with an AprilTag or Aruco 2D Pipeline. +- A coprocessor running PhotonVision with an AprilTag or ArUco 2D Pipeline. - [A printout of AprilTag 7](https://firstfrc.blob.core.windows.net/frc2025/FieldAssets/Apriltag_Images_and_User_Guide.pdf), mounted on a rigid and flat surface. ## Code diff --git a/docs/source/docs/pipelines/about-pipelines.md b/docs/source/docs/pipelines/about-pipelines.md index fbb4d3ca1..f269bb393 100644 --- a/docs/source/docs/pipelines/about-pipelines.md +++ b/docs/source/docs/pipelines/about-pipelines.md @@ -10,7 +10,7 @@ A vision pipeline represents a series of steps that are used to acquire an image ## Types of Pipelines -### AprilTag / AruCo +### AprilTag / ArUco This pipeline type is based on detecting AprilTag fiducial markers. More information about AprilTags can be found in the [WPILib documentation](https://docs.wpilib.org/en/stable/docs/software/vision-processing/apriltag/apriltag-intro.html). This pipeline provides easy to use 3D pose information which allows localization. @@ -56,7 +56,7 @@ Each pipeline has a set of tabs that are used to configure the pipeline. All pip Pipielines also have additional tabs that are specific to the pipeline type. Listed below are the tabs for each pipeline type. -### AprilTag / AruCo Pipelines +### AprilTag / ArUco Pipelines - AprilTag: This tab includes AprilTag specific tuning parameters, such as decimate, blur, threads, pose iterations, and more. diff --git a/docs/source/docs/quick-start/camera-calibration.md b/docs/source/docs/quick-start/camera-calibration.md index 8d902b9a9..c23089d1f 100644 --- a/docs/source/docs/quick-start/camera-calibration.md +++ b/docs/source/docs/quick-start/camera-calibration.md @@ -9,8 +9,8 @@ If you’re not using cameras in 3D mode, calibration is optional, but it can st ## Print the Calibration Target - Downloaded from our [demo site](http://photonvision.global/#/cameras), or directly from your coprocessors cameras tab. -- Use the Charuco calibration board: - - Board Type: Charuco +- Use the ChArUco calibration board: + - Board Type: ChAruCo - Tag Family: 4x4 - Pattern Spacing: 1.00in - Marker Size: 0.75in diff --git a/photon-client/src/components/cameras/CameraCalibrationCard.vue b/photon-client/src/components/cameras/CameraCalibrationCard.vue index 94b78fc96..c0ca6f8fb 100644 --- a/photon-client/src/components/cameras/CameraCalibrationCard.vue +++ b/photon-client/src/components/cameras/CameraCalibrationCard.vue @@ -141,7 +141,7 @@ const downloadCalibBoard = async () => { break; case CalibrationBoardTypes.Charuco: - // Add pregenerated charuco + // Add pregenerated ChArUco const charucoImage = new Image(); charucoImage.src = CharucoImage; doc.addImage(charucoImage, "PNG", 0.25, 1.5, 8, 8); @@ -308,7 +308,7 @@ const setSelectedVideoFormat = (format: VideoFormat) => { label="Board Type" tooltip="Calibration board pattern to use" :select-cols="8" - :items="['Chessboard', 'Charuco']" + :items="['Chessboard', 'ChArUco']" :disabled="isCalibrating" /> { color="warning" icon="mdi-alert-box" text="The usage of chessboards can result in bad calibration results if multiple - similar images are taken. We strongly recommend that teams use Charuco boards instead!" + similar images are taken. We strongly recommend that teams use ChArUco boards instead!" /> { v-if="boardType === CalibrationBoardTypes.Charuco" v-model="tagFamily" label="Tag Family" - tooltip="Dictionary of aruco markers on the charuco board" + tooltip="Dictionary of ArUco markers on the ChArUco board" :select-cols="8" :items="['Dict_4X4_1000', 'Dict_5X5_1000', 'Dict_6X6_1000', 'Dict_7X7_1000']" :disabled="isCalibrating" diff --git a/photon-client/src/components/dashboard/CameraAndPipelineSelectCard.vue b/photon-client/src/components/dashboard/CameraAndPipelineSelectCard.vue index d88293060..225535c42 100644 --- a/photon-client/src/components/dashboard/CameraAndPipelineSelectCard.vue +++ b/photon-client/src/components/dashboard/CameraAndPipelineSelectCard.vue @@ -130,7 +130,7 @@ const validNewPipelineTypes = computed(() => { { name: "Reflective", value: WebsocketPipelineType.Reflective }, { name: "Colored Shape", value: WebsocketPipelineType.ColoredShape }, { name: "AprilTag", value: WebsocketPipelineType.AprilTag }, - { name: "Aruco", value: WebsocketPipelineType.Aruco } + { name: "ArUco", value: WebsocketPipelineType.Aruco } ]; if (useSettingsStore().general.supportedBackends.length > 0) { pipelineTypes.push({ name: "Object Detection", value: WebsocketPipelineType.ObjectDetection }); @@ -168,7 +168,7 @@ const pipelineTypesWrapper = computed<{ name: string; value: number }[]>(() => { { name: "Reflective", value: WebsocketPipelineType.Reflective }, { name: "Colored Shape", value: WebsocketPipelineType.ColoredShape }, { name: "AprilTag", value: WebsocketPipelineType.AprilTag }, - { name: "Aruco", value: WebsocketPipelineType.Aruco } + { name: "ArUco", value: WebsocketPipelineType.Aruco } ]; if (useSettingsStore().general.supportedBackends.length > 0) { pipelineTypes.push({ name: "Object Detection", value: WebsocketPipelineType.ObjectDetection }); diff --git a/photon-client/src/components/dashboard/ConfigOptions.vue b/photon-client/src/components/dashboard/ConfigOptions.vue index e995b293d..be8e01723 100644 --- a/photon-client/src/components/dashboard/ConfigOptions.vue +++ b/photon-client/src/components/dashboard/ConfigOptions.vue @@ -29,7 +29,7 @@ const allTabs = Object.freeze({ thresholdTab: { tabName: "Threshold", component: ThresholdTab }, contoursTab: { tabName: "Contours", component: ContoursTab }, apriltagTab: { tabName: "AprilTag", component: AprilTagTab }, - arucoTab: { tabName: "Aruco", component: ArucoTab }, + arucoTab: { tabName: "ArUco", component: ArucoTab }, objectDetectionTab: { tabName: "Object Detection", component: ObjectDetectionTab }, outputTab: { tabName: "Output", component: OutputTab }, targetsTab: { tabName: "Targets", component: TargetsTab }, @@ -99,8 +99,8 @@ const tabGroups = computed(() => { !((isAprilTag || isAruco || isObjectDetection) && tabConfig.tabName === "Threshold") && //Filter out threshold tab if we're doing AprilTags !((isAprilTag || isAruco || isObjectDetection) && tabConfig.tabName === "Contours") && //Filter out contours if we're doing AprilTags !(!isAprilTag && tabConfig.tabName === "AprilTag") && //Filter out apriltag unless we actually are doing AprilTags - !(!isAruco && tabConfig.tabName === "Aruco") && - !(!isObjectDetection && tabConfig.tabName === "Object Detection") //Filter out aruco unless we actually are doing Aruco + !(!isAruco && tabConfig.tabName === "ArUco") && + !(!isObjectDetection && tabConfig.tabName === "Object Detection") //Filter out ArUco unless we actually are doing ArUco ) ) .filter((it) => it.length); // Remove empty tab groups diff --git a/photon-core/src/main/java/org/photonvision/vision/aruco/PhotonArucoDetector.java b/photon-core/src/main/java/org/photonvision/vision/aruco/PhotonArucoDetector.java index e467f2158..c9d82f122 100644 --- a/photon-core/src/main/java/org/photonvision/vision/aruco/PhotonArucoDetector.java +++ b/photon-core/src/main/java/org/photonvision/vision/aruco/PhotonArucoDetector.java @@ -90,7 +90,7 @@ public class PhotonArucoDetector implements Releasable { // each detection has a Mat of corners Mat cornerMat = cornerMats.get(i); - // Aruco detection returns corners (BR, BL, TL, TR). + // ArUco detection returns corners (BR, BL, TL, TR). // For parity with AprilTags and photonlib, we want (BL, BR, TR, TL). double[] xCorners = { cornerMat.get(0, 1)[0], diff --git a/photon-core/src/main/java/org/photonvision/vision/pipe/impl/FindBoardCornersPipe.java b/photon-core/src/main/java/org/photonvision/vision/pipe/impl/FindBoardCornersPipe.java index 1d670cb78..3909fc804 100644 --- a/photon-core/src/main/java/org/photonvision/vision/pipe/impl/FindBoardCornersPipe.java +++ b/photon-core/src/main/java/org/photonvision/vision/pipe/impl/FindBoardCornersPipe.java @@ -280,14 +280,14 @@ public class FindBoardCornersPipe } board.matchImagePoints(detectedCornersList, detectedIds, objPoints, imgPoints); - // draw the charuco board + // Draw the ChArUco board Objdetect.drawDetectedCornersCharuco( outFrame, detectedCorners, detectedIds, new Scalar(0, 0, 255)); // Red Text imgPoints.copyTo(outBoardCorners); objPoints.copyTo(objPts); - // Since charuco can still detect without the whole board we need to send "fake" (all + // Since ChaArUco can still detect without the whole board we need to send "fake" (all // values less than zero) points and then tell it to ignore that corner by setting the // corresponding level to -1. Calibrate3dPipe deals with piping this into the correct format // for each backend @@ -321,7 +321,7 @@ public class FindBoardCornersPipe detectedCorners.release(); detectedIds.release(); - } else { // If not Charuco then do chessboard + } else { // If not ChArUco then do chessboard // Reduce the image size to be much more manageable // Note that opencv will copy the frame if no resize is requested; we can skip // this since we diff --git a/photon-core/src/main/java/org/photonvision/vision/processes/PipelineManager.java b/photon-core/src/main/java/org/photonvision/vision/processes/PipelineManager.java index e97824a82..47316df6f 100644 --- a/photon-core/src/main/java/org/photonvision/vision/processes/PipelineManager.java +++ b/photon-core/src/main/java/org/photonvision/vision/processes/PipelineManager.java @@ -253,7 +253,7 @@ public class PipelineManager { new AprilTagPipeline((AprilTagPipelineSettings) desiredPipelineSettings); } case Aruco -> { - logger.debug("Creating Aruco Pipeline"); + logger.debug("Creating ArUco Pipeline"); currentUserPipeline = new ArucoPipeline((ArucoPipelineSettings) desiredPipelineSettings); } case ObjectDetection -> {