Co-Processor Setup Overview
The best vision pipeline in the world doesn't help if the coprocessor isn't reachable, loses its IP address between matches, or falls off the robot during a collision. This lesson covers the hardware, networking, power, and configuration decisions that determine whether your vision system is reliable — not just capable.
By the end of this lesson, you will:
- Select appropriate coprocessor hardware for your team's budget and performance needs
- Connect a coprocessor to the robot network correctly and assign a static IP in the
10.TE.AM.xrange - Power the coprocessor safely from the robot's electrical system without risking brownout
- Configure a coprocessor to survive power cycles and competition environments without manual intervention
- Wire multiple cameras to a single coprocessor and understand the USB bandwidth constraints
- Run through the pre-event coprocessor verification checklist from the perspective of someone with no internet access and no way to reflash at the venue
The Hardware Reality of Vision Systems
Lessons 3–8 treated the coprocessor as an already-working black box: PhotonVision is running, the camera is connected, the dashboard is accessible. This lesson is about building and maintaining that black box so it actually works at competition, not just in your shop.
Software configuration problems are usually fixable at the venue — you can redeploy code in the pit, update pipeline settings from a laptop, adjust standard deviations between matches. Hardware configuration problems are often not fixable without tools, spare parts, or internet access you won't have at a competition. The decisions in this lesson — which coprocessor to use, how to power it, how to mount cameras, which IP addresses to assign — need to be made and validated long before competition day.
Hardware Selection
| Hardware | CPU / Processing | USB ports | Cost | Notes |
|---|---|---|---|---|
| Raspberry Pi 4 (4GB) good choice | Quad-core Cortex-A72 @ 1.8 GHz | 2× USB 3.0, 2× USB 2.0 | ~$55 | Most widely used in FRC. Excellent PhotonVision support. Mature image files. Handles 2 cameras at 1280×720/60fps comfortably. |
| Orange Pi 5 strong choice | Octa-core RK3588S @ 2.4 GHz | 2× USB 3.0, 1× USB 2.0 | ~$60 | Faster than Pi 4 — handles higher resolution or more cameras. PhotonVision 2024+ supports it. Slightly less mature than Pi 4 ecosystem. |
| Raspberry Pi 5 (4GB) | Quad-core Cortex-A76 @ 2.4 GHz | 2× USB 3.0, 2× USB 2.0 | ~$60 | Fastest Pi. Higher power consumption (~5W active). Needs active cooling for sustained high-FPS processing. Newer — verify PhotonVision image availability for your season. |
| Limelight 3/3G | Proprietary (integrated) | 1 camera (integrated) | $200–$400 | All-in-one. Covered in Lesson 5. Not a coprocessor you configure — it's a complete vision system. Listed here for comparison only. |
| roboRIO (on-board detection) | Dual-core ARM @ 667 MHz | N/A (onboard USB) | $0 additional | Using WPILib's AprilTagDetector directly on the roboRIO. Limited to ~15fps at 640×480. Only viable for testing — not competition detection at range. |
A Raspberry Pi 4 can comfortably handle two cameras at 1280×720/60fps — each over a separate USB 3.0 port. If you're running three or more cameras, the CPU and USB bandwidth become constraints. Monitor PhotonVision's CPU meter during full-load operation: if it's consistently above 80%, either reduce camera resolution/fps or add a second coprocessor. Assign each coprocessor a different static IP and register each as a separate PhotonCamera in your robot code. The VisionSubsystem and PhotonPoseEstimator setup from Lessons 3–4 applies identically regardless of whether cameras are on the same or different coprocessors.
Robot Network Architecture
Every device on the robot — roboRIO, radio, network switch, coprocessor(s) — must be connected correctly to work together. Click any component in the diagram below to understand its role, its IP address, and what happens if it's misconfigured.
Static IP Address Assignment
Every device that communicates on the robot network must have a fixed IP address. DHCP (automatic IP assignment) works in your shop but is unreliable at competition venues — the order in which devices connect to the network can cause them to receive different IPs, breaking all communication. Assign static IPs to every device before your first competition and document them.
All robot network IPs use the 10.TE.AM.x pattern, where TE.AM is your four-digit team number split across two octets. For team 2910: 10.29.10.x.
Fixed by FRC rules. The roboRIO always has this IP on the robot network. Driver Station connects to it at this address.
The robot radio acts as the DHCP server and gateway. Its address is always .1. Configured with FRC Radio Configuration Utility before each event.
The network switch is a Layer 2 device — it forwards Ethernet frames but has no IP address itself. It's transparent to the network. Any port can connect to any device.
Primary vision coprocessor. Set in PhotonVision's Settings tab. Document this address in your pit guide — you'll need it to access the dashboard from a laptop in the queue.
Secondary coprocessor (if used). Assign .12 to avoid conflict with .11. Each coprocessor appears as a separate NetworkTables host — each PhotonCamera object must match the name configured on its specific coprocessor.
Laptops get an IP from the radio's DHCP in most configurations. For pit access to the coprocessor dashboard, any IP in the same subnet works — you just need to navigate to the coprocessor's static IP.
At competition, the match is loaded, the robot is placed on the field, and the field network connects. The radio's DHCP server assigns addresses. A coprocessor that was configured with DHCP (no static IP) may get .5 instead of .11 — and your robot code tries to connect to a PhotonCamera whose host is no longer at that address. NetworkTables can't find the camera. getLatestResult() returns empty forever. The auto runs odometry-only. All of this is discovered at the field, not in the pit. The fix — setting a static IP — takes 30 seconds in the PhotonVision Settings tab and must be done before your first competition, not during it.
Powering the Coprocessor Safely
Coprocessors require stable 5V power at 2–4A depending on the board and USB load. There are three common approaches, each with different tradeoffs:
- VRM (Voltage Regulator Module) 5V/2A port: The simplest approach. The VRM is designed for exactly this use case — providing stable regulated 5V for coprocessors and other electronics. Maximum 2A — sufficient for a Pi 4 with two cameras, but watch the total current draw. Do not power coprocessors from VRM ports that are also powering other loads (radio, sensors).
- PDH (Power Distribution Hub) USB-C port: The REV PDH includes dedicated USB-C power ports (5V/3A). This is the cleanest solution for newer robots — no adapter needed, current-limited per port, and the PDH monitors current through its fault-detection system.
- Dedicated 5V regulator (e.g., CTRE HERO, REV MPM, or buck converter): For teams running Pi 5 or Orange Pi 5 at high load, a dedicated switching regulator can provide 5V/5A reliably. Requires more wiring but provides the most headroom.
The most common coprocessor power mistake is powering the coprocessor through the same USB-C port used for a camera or tethering the coprocessor to the roboRIO's USB port. The roboRIO's USB host ports are current-limited to 500mA — far less than a Raspberry Pi 4 needs at load (~3A including two cameras). A coprocessor on roboRIO USB power will brown out during image processing and reboot mid-match. Always power the coprocessor from a proper 5V source (VRM or PDH) and connect it to the robot's Ethernet network switch for data. These are two separate cables for two separate purposes.
Camera Mounting and USB Wiring
Camera mounting principles
The robot-to-camera transform (Lesson 2) is only valid as long as the camera is in the position you measured. Three mounting requirements that prevent invalidating your calibration between matches:
- Rigid mounting: The camera must not flex, vibrate, or shift when the robot collides with field elements or other robots. Bolt the camera mount through a rigid frame member or bumper bracket with locking hardware. Zip ties on flexible plastic are not acceptable for competition.
- No post-event adjustments: Once the camera is calibrated and the transform is measured, don't move it. If you need to adjust the camera angle to improve detection, do so in the shop, then recalibrate and remeasure the transform before the next competition.
- Cable strain relief: The USB cable to the camera must have strain relief at both ends. A cable that pulls on the camera connector during robot motion will eventually break the connection mid-match. Secure the cable with zip ties within 5 cm of the camera connector and at every frame crossing.
USB bandwidth constraints for multiple cameras
USB 3.0 has approximately 5 Gbps of bandwidth. A single 1280×720 camera at 60fps (MJPEG compressed) uses roughly 20–40 Mbps — well within limits. However, USB bandwidth is shared per controller: a Raspberry Pi 4 has one USB 3.0 controller shared between its two USB 3.0 ports. Two cameras at 1280×720/60fps both on USB 3.0 use about 80 Mbps total, which is comfortable. Adding a third camera on USB 3.0 may cause intermittent drops. If you need three cameras, either drop resolution/fps, or use a USB 3.0 hub with a dedicated controller, or add a second coprocessor.
PhotonVision's dashboard shows a CPU meter but not a USB bandwidth meter directly. The symptom of USB bandwidth saturation is intermittent camera drops — the camera feed briefly disappears in the stream view, then reappears. If you see this with multiple cameras, reduce camera FPS or resolution on the lower-priority camera first. The camera on the USB 2.0 port is most constrained — run your lowest-resolution camera there or disable it during processing-heavy phases using PhotonVision's pipeline switching.
First-Time Coprocessor Setup Walkthrough
Download the correct image for your board from github.com/PhotonVision/photonvision/releases. Use Balena Etcher or Raspberry Pi Imager to write the image to a high-quality microSD card (32GB+ Class 10 / A1 rating). Cheap or slow cards cause intermittent filesystem corruption under the write load of vision processing. After flashing, insert the card into the coprocessor and boot — LED activity confirms boot progress.
On first boot, PhotonVision broadcasts at photonvision.local:5800 using mDNS. Connect your laptop to the same network as the coprocessor and navigate to this address. Go to Settings → Networking → Set Static IP. Enter 10.TE.AM.11 (your team number). Save and reboot. After reboot, confirm the dashboard is accessible at the static IP. If mDNS fails, find the coprocessor's IP using a network scanner (e.g., Angry IP Scanner or nmap -sn 10.29.10.0/24).
In the dashboard, create an AprilTag pipeline. Set tag family to TAG_36H11. Disable auto-exposure. Set resolution to 1280×720 and FPS to 60 (or the maximum your hardware supports at that resolution). Set a fixed exposure of 2–5 ms. Name the camera clearly — this name is what your PhotonCamera constructor references. Verify detections appear in the stream by holding a tag in front of the camera.
Calibrate at the exact resolution and exposure settings you'll use in competition (Lesson 3 calibration workflow). Print the calibration board at 100% scale. Capture 30+ images. Confirm RMS below 0.5 pixels. Save the calibration — it persists through power cycles stored in PhotonVision's filesystem on the SD card.
Remove power from the coprocessor, wait 10 seconds, restore power, and wait for the full boot (30–60 seconds). Navigate to the static IP. Confirm: (1) the IP is the same, (2) the camera appears with the correct name, (3) the pipeline settings and calibration are intact, (4) the camera feed shows detections on a tag. If any of these fail after a power cycle, the SD card has a write issue or the settings didn't save — address before competition.
Configure the robot's radio with your team number. Connect the coprocessor to the robot's network switch. Connect the Driver Station. Confirm m_camera.isConnected() returns true in your robot code (log it to SmartDashboard). Simulate a match queue environment: power cycle the entire robot, wait for full boot, enable, confirm vision data appears in SmartDashboard. This test reveals any timing issues where the coprocessor boots after the robot code starts and the camera reconnection isn't handled.
Pre-Event Verification Checklist
Run this checklist at the start of every competition event — before the robot leaves the pit for its first match. Assume you cannot access the internet or reflash the SD card. Everything must be verifiable on-site in under 5 minutes.
□ Dashboard accessible at static IP (10.TE.AM.11:5800)?
→ Navigate from pit laptop. If not: check Ethernet cable, switch power,
and verify coprocessor has booted (LED activity).
□ Live camera stream visible and updated?
→ Open dashboard. Should see camera feed updating (not frozen).
If frozen: re-seat USB cable. If no feed: wrong camera name or driver issue.
□ Tag detections appear (green outlines) when facing a tag?
→ Hold an AprilTag from the current season at 1–2 m.
No green outlines = wrong tag family, bad calibration, or exposure too high.
□ Calibration is loaded (RMS shown in Calibration tab)?
→ Open Calibration tab. Confirm "Calibration loaded" and RMS value.
No calibration = all distance estimates will be wrong.
□ Pipeline set to correct tag family (TAG_36H11)?
→ Check Tag Family dropdown in pipeline settings.
Wrong family = no detections or false positives on the competition field.
□ Robot code shows camera connected (Vision/CameraConnected = true)?
→ Enable robot in test mode. Check SmartDashboard.
false = camera name mismatch or coprocessor not yet on network.
□ Vision/HasTargets goes true when facing a tag at 2–4 m?
→ Point robot at a field tag from typical autonomous starting range.
false despite dashboard showing detection = camera name mismatch.
□ Field2d shows reasonable vision pose estimates?
→ Open Field widget. Navigate robot to a known position.
Verify vision estimate is within ~20 cm of expected position.
Large systematic offset = robot-to-camera transform or field layout issue.
□ Vision fusion counter increments during auto?
→ Run 5 seconds of autonomous facing tags.
Check Vision/FusionCallCount (from Lesson 6). Should increment 30–60x.
Zero = data flow between VisionSubsystem and DriveSubsystem is broken.Making the Setup Competition-Resilient
Competition introduces failure modes that don't exist in the shop: full-field bumps from other robots, rapid temperature changes between matches, field electrical transients affecting power quality, and the tight timeline of a match queue that prevents rebooting and waiting. These practices address those specifically.
- Use a quality MicroSD card. SanDisk Endurance or similar rated cards handle the continuous write load of vision processing better than generic cards. A card that corrupts under write load loses your calibration and pipeline settings mid-event.
- Secure the coprocessor with standoffs and screws, not Velcro. Velcro fails after repeated collisions. The coprocessor should be mounted with M2.5 or M3 standoffs to a rigid panel — typically the electronics board. It must not move when the robot is bumped hard.
- Label every cable. At least two labels per cable (both ends) with the device name and purpose. In the pit queue with 8 minutes before a match, you cannot afford to trace an unmarked cable to figure out what it does.
- Bring a spare SD card with a known-good image. If the coprocessor's SD card fails during the event, having a pre-flashed spare with the current season's PhotonVision image, your static IP, pipeline configuration, and calibration means recovery is minutes, not the entire event.
- Document your coprocessor configuration in your team's pit guide. Static IP, camera names, pipeline names, calibration RMS, PhotonVision firmware version. Anyone on your pit crew should be able to verify the setup without asking the programmer who configured it.
At more than one event, a team's SD card failed between matches — corrupt filesystem, usually from a vibration-induced write error on a cheap card. Teams that had a pre-flashed spare with their calibration backed up were back on the field in 15 minutes. Teams that didn't spent the rest of the day without vision or trying to recalibrate under pressure in the pit. The spare card costs $10 and 20 minutes to prepare. Prepare it before your first event.
🔌 System Check
These are the physical and configuration items to verify before any competition event:
- Coprocessor is mechanically secured with fasteners, not adhesive. Push the coprocessor firmly. It should not flex, shift, or creak. Any movement means the camera transform measured with that mounting is no longer valid.
- Coprocessor is powered from a source capable of ≥ 2A at 5V. Confirm the power source: VRM 5V/2A port, PDH USB-C port, or dedicated buck converter. Verify the power cable is strain-relieved and the connector is fully seated. Loose power connectors cause intermittent reboots that appear as random vision outages.
- Coprocessor connects to the network switch, not directly to the radio. The radio has limited Ethernet ports. The network switch provides multiple ports. Every non-radio network device (roboRIO, coprocessor, laptop tether) should connect to the switch.
- Static IP is assigned and survives a power cycle. Power off, wait 15 seconds, power on, wait 60 seconds, navigate to the static IP. If the IP changed, the static assignment didn't persist — redo the assignment in PhotonVision Settings.
- A spare SD card is prepared and stored with the robot kit. The card should have: current season's PhotonVision image flashed, static IP configured, pipeline settings exported (via PhotonVision Settings → Export), and calibration data saved. Label the card and its case with the date prepared and the PhotonVision firmware version.
Knowledge Check
1. A team arrives at a competition and finds that their coprocessor, which worked perfectly in the shop, is no longer reachable at 10.29.10.11. Their robot code logs show Vision/CameraConnected = false. The coprocessor is powered and the status LED is on. What should they check first, and what is the most likely explanation?
2. A team powers their Raspberry Pi 4 coprocessor from the roboRIO's USB-A host port. During autonomous, the coprocessor reboots unexpectedly, losing the NetworkTables connection and dropping vision data for 45 seconds. What is the cause and fix?
3. A team is running two cameras on a Raspberry Pi 4: one at 1280×720/60fps on a USB 3.0 port and one at 1280×720/60fps on the second USB 3.0 port. They notice intermittent frame drops on the second camera during fast robot motion. Switching the second camera to a USB 2.0 port makes it worse. What is the most likely cause and the best architectural fix?
Build and Validate Your Competition-Ready Coprocessor Setup
- Flash PhotonVision onto your coprocessor using a quality A1-rated microSD card (SanDisk Endurance or equivalent). Assign a static IP of
10.TE.AM.11from the Settings tab. Power cycle three times and confirm the IP is the same each time before proceeding. If the IP changes on any reboot, diagnose the issue before continuing. - Complete the first-time setup walkthrough from this lesson: configure the AprilTag pipeline, calibrate the camera at competition settings, verify RMS below 0.5 px, and run the power-cycle persistence test (Section 5 of the walkthrough). Document the firmware version, pipeline name, and calibration RMS in a comment in
VisionConstants.java. - Simulate the "pre-event checklist" from this lesson on your physical setup. Work through each of the nine checklist items with your robot powered. Fix any items that fail. Record which items required fixes — these are your most fragile setup points and should be checked first at every future event.
- Prepare a spare SD card: flash the same PhotonVision version, configure the static IP, export your pipeline settings (PhotonVision Settings → Export Settings), and save the calibration data. Label the card with the date, firmware version, and your team number. Store it with the robot kit in a labeled case.
- Bonus: Write a one-page "Coprocessor Pit Guide" document that a non-programmer pit crew member could use to verify and basic-troubleshoot the vision system before a match. Include: the coprocessor's static IP, the URL to access the dashboard, how to verify the camera is working, three common symptoms and their quick fixes (e.g., "no feed in dashboard → re-seat USB cable"), and the location of the spare SD card. Keep it under 400 words and post it inside the robot's electronics panel door.