Build an AprilTag pipeline
EagleEye includes two localization templates:
| Template | Use it when |
|---|---|
| Basic localization | You want the shortest working camera-to-robot pipeline |
| AprilTag localization | You want temporal acceleration and its camera-pose feedback loop |
Both publish the robot-library contract at EagleEye/localization/front/pose and EagleEye/localization/front/meta.
If you used the first-time wizard
The camera setup wizard already generates
one pipeline per configured camera. With Localize or Both, it publishes the robot
pose under EagleEye/localization/<source>/pose and quality metadata under the matching
/meta key. Use that pipeline rather than creating a duplicate from a template.
The wizard derives <source> from the hardware camera name and adds suffixes when needed.
Your placement description is a UI label, not the source ID. Inspect the generated
Publish To NetworkTables nodes and copy their target_key values into
robot code.
The generated pipeline currently uses the bundled 2026 REBUILT AprilTag map. Follow step 3 to select the correct map for another field, then restart and verify its pose. The steps below describe manual template setup.
Before you start
- The camera appears in Views.
- The camera has intrinsics.
- Extrinsics are saved for that camera.
- NetworkTables points at the roboRIO.
- The field's AprilTag map is available in EagleEye.
1. Create the pipeline
- Open the Pipeline tab.
- Click New Pipeline.
- Enter a name.
- Select Basic localization or AprilTag localization.
- Create the pipeline.
EagleEye copies the template with fresh node IDs, so creating it more than once does not cross-connect pipelines.
2. Select the camera
Open these nodes and select the same camera in each:
- Device Input
- PnP Camera Localization
- Camera To Robot Pose
The selectors show saved placement descriptions, but store the camera's bus ID. To rename a label, use Settings → Camera Names. Renaming does not change the selected device, calibration, or publisher keys and does not require a restart.
Set frame_rotation on Device Input if the camera is mounted sideways or upside down. Camera selection changes require a backend restart. Use the restart banner above the canvas after saving.
3. Select or upload the field map
Open PnP Camera Localization, then use the AprilTag map dropdown.
If the map is missing:
- Click Manage beside the map field.
- Choose Upload File.
- Select the
.fmapor supported map file. - Close the file manager and select the uploaded file from the refreshed dropdown.
- Restart the backend when prompted.
Do not type a raw {project_root} path unless you are developing EagleEye itself. The dropdown stores the managed file path for you. A map from the wrong season can produce a stable-looking but incorrect field pose.
4. Check the graph
The Basic localization template follows this path:
Device Input -> Detect AprilTags -> Minimum AprilTag Count -> PnP Camera Localization
| camera_pose
v
Camera To Robot Pose
| |
v v
Robot Pose Output pose publisher
PnP Camera Localization.pose_meta -----------------------> metadata publisher
The publishers must use:
| Data | target_key | schema |
|---|---|---|
| Robot pose | localization/front/pose | pose3d |
| PnP quality metadata | localization/front/meta | auto |
Robot Pose Output only updates the WebUI 3D view. The pose publisher connects directly to Camera To Robot Pose so a stationary robot continues publishing fresh measurements.
The AprilTag localization template adds Temporal Acceleration Preprocessor Rust before detection and a dashed default feedback connection from PnP camera pose. It keeps the same robot-pose and metadata publishers.
5. Start and verify
- Restart the backend if the banner requests it.
- Open System and confirm the pipeline is active.
- Point the camera at at least two mapped tags.
- Open 3D View and confirm the robot pose moves correctly.
- Check the
EagleEyetable in AdvantageScope or OutlineViewer.
You should see:
EagleEye/localization/front/pose
EagleEye/localization/front/meta
Continue with Add EagleEye to robot code.
Multiple cameras
Create one pipeline per camera. The wizard assigns distinct source prefixes automatically; keep those generated keys unless you intend to update the corresponding robot-code subscriptions. For manually created pipelines, give each pair of publishers its own source:
localization/front/pose
localization/front/meta
localization/back/pose
localization/back/meta
Let the robot pose estimator consume each camera at its own capture timestamp. Do not fuse camera poses in EagleEye before publishing them; fusion averages measurements taken at different times.
Optional nodes
| Node | Purpose |
|---|---|
| Pose Outlier Filter Rust | Reject estimates that disagree with recent motion |
| Tag Filter | Ignore selected tag IDs |
| Camera Pose Output | Show camera pose in the 3D view |
| Flatten Pose | Convert a 3D pose to x, y, and heading for a custom consumer |
Next: Add Temporal Acceleration or Add EagleEye to robot code.