AprilTags are the fiducial markers placed around the FRC field. By detecting them with a camera, your robot can compute its own position on the field — enabling automated alignment, reliable autos, and shot-aiming. The 2026 REBUILT field uses the 36h11 tag family (IDs 1-32), with 8.125-inch tags on the Hub, Tower Wall, Outpost, and Trenches.
The architecture. Image processing is too heavy for the roboRIO, so it runs on a coprocessor — commonly an Orange Pi or Raspberry Pi running PhotonVision — connected by Ethernet to the radio. The camera (e.g. an Arducam OV9281 global-shutter or a Limelight) feeds PhotonVision, which detects tags and publishes results over NetworkTables. Your robot code reads them with the PhotonLib vendor library.
Calibrate first — this is non-negotiable for 3D. To get a tag's 3D pose you must calibrate the camera at the resolution you will run. In PhotonVision you photograph a ChArUco/chessboard board from many angles and distances. Calibration solves for focal length, optical center, and distortion. Skipping or rushing this is a top cause of garbage pose data.
Use the right field layout. For 2026 there are two official field layouts — the welded layout (which PhotonVision ships with) and the AndyMark layout. Select the one matching the event field, both on the coprocessor and in your pose-estimation setup, or every pose will be subtly wrong (the AndyMark vs welded difference can be ~0.5 inch).
MultiTag and pose estimation. Enabling MultiTag estimation lets PhotonVision combine all visible tags using the field-layout JSON to produce one robust camera-to-field pose. In code, PhotonPoseEstimator turns pipeline results into a robot pose. The professional move is to fuse vision into a SwerveDrivePoseEstimator (or DifferentialDrivePoseEstimator) with addVisionMeasurement(). Conceptually:
// Pull unread results, run the estimator, push valid poses in.
for (var result : camera.getAllUnreadResults()) {
Optional<EstimatedRobotPose> est = photonEstimator.update(result);
est.ifPresent(e ->
poseEstimator.addVisionMeasurement(
e.estimatedPose.toPose2d(), e.timestampSeconds));
}
The exact PhotonLib API moves between seasons — recent versions deprecated getLatestResult() in favor of getAllUnreadResults() and added strategy-specific estimate methods — so check the current PhotonVision docs for your installed version. The fusion idea is stable: blend fast wheel/gyro odometry with absolute vision corrections, so odometry gives smooth high-rate position while vision periodically snaps out accumulated drift. Tune the trust (standard deviations) so noisy single-tag readings don't yank the pose around.
The REBUILT payoff: a robot that knows its field pose can auto-align to the Hub for consistent Fuel shots and run repeatable autos that don't drift over the 20-second period. Create one PhotonPoseEstimator per camera; multiple cameras give more frequent corrections and fewer blind spots.
the part worth keeping
Key takeaways
- Run PhotonVision on a coprocessor (Pi/Orange Pi) reading 36h11 AprilTags; the roboRIO consumes results via PhotonLib over NetworkTables
- Calibrate the camera at your run resolution and select the correct 2026 field layout (welded vs AndyMark) on both coprocessor and pose estimator
- Fuse vision into a WPILib pose estimator with addVisionMeasurement(); the PhotonLib result API shifts by season (getAllUnreadResults replaced getLatestResult), so verify against your version's docs
Getting Started with FRCAdvanced Techniques & Case Studieslesson 3 of 5
Keep going
Take the quiz+10 XP with an accountMore in Advanced Techniques & Case Studies
where this came from
Sources and corrections
This lesson is AI-assisted: drafted from primary sources, then reviewed and edited by hand. Errors still get through. When one is reported we fix it and write down what changed, in public, in the corrections log.
sources and further reading
- docs.photonvision.orgAprilTags and PhotonPoseEstimator (PhotonVision)
- docs.photonvision.orgCalibrating Your Camera (PhotonVision)
- docs.photonvision.orgMultiTag Localization (PhotonVision)
clipped to this lesson
Articles that go further on this
The lesson gets you through the topic. These go wider on it, and they read in one sitting.
- 20 min readPhotonVision Setup for FRC: Install, Pipelines & AprilTag PosePhotonVision setup for FRC: install it on a Raspberry Pi or Orange Pi coprocessor, build an AprilTag pipeline, run multi-tag pose, and feed swerve odometry./blogread it
- 8 min readFRC Vision: Limelight vs PhotonVision and AprilTag TrackingCompare Limelight and PhotonVision for FRC vision: AprilTag tracking, pose estimation with addVisionMeasurement, MegaTag2, latency, calibration, and cost./blogread it
- 15 min readFRC Odometry and Pose Estimation: Field-Centric Control with WPILibHow an FRC robot tracks its field position with WPILib: wheel odometry vs pose estimation, gyro heading, fusing AprilTag vision, and field-centric driving./blogread it
answer sheet
Lesson quiz
All 3 right completes the lesson. Miss one and only that question comes back, anything you already answered correctly stays banked.
0 of 3 answered
01What is the main advantage of PhotonVision's MultiTag localization?
02What must be done before using 3D AprilTag tracking in PhotonVision?
03What does PhotonPoseEstimator provide to the robot's pose estimation?
Answer every question to submit.
All 28 lessons in Getting Started with FRCopenclose
01 / what-first-and-frc-are
02 / the-season-and-the-game
03 / culture-teams-and-roles
04 / getting-started-your-first-steps
05 / worked-examples-mini-projects
- Not read yet:Project 1 — Make a NEO Spin with the REV Hardware Client
- Not read yet:Project 2 — Deploy a Real Arcade-Drive Program
- Not read yet:Project 3 — Refactor into a Command-Based Drive Subsystem
- Not read yet:Project 4 — Build a Fuel Launcher for REBUILT
- Not read yet:Project 5 — A One-Button Autonomous Routine
06 / common-mistakes-troubleshooting
- Not read yet:The Connection Chain: When the Driver Station Won't Connect
- Not read yet:Brownouts: Why the Robot Goes Limp Mid-Match
- Not read yet:CAN Bus Gremlins: Missing and Conflicting Devices
- Not read yet:Software Gotchas: Inverted Drives, Scheduler Stalls, and Reading the RioLog
- Not read yet:Inspection-Day Failures: Bumpers, Size, and Weight
07 / advanced-techniques-case-studies
- Not read yet:Closed-Loop Control: PID + Feedforward for a Consistent Shot
- Not read yet:Swerve Drive: Omnidirectional Movement with YAGSL
- Not read yet:AprilTag Vision: Knowing Where You Are with PhotonVision
- Not read yet:Data-Driven Strategy: Scouting, EPA/OPR, and Alliance Selection
- Not read yet:Choosing Your Hardware Ecosystem: REV vs CTRE