Unit 10 · Lesson 9

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.x range
  • 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.
💡 One coprocessor can run multiple cameras

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.

FRC robot network — click any component click a component to inspect
← click any component above to see configuration details

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.

roboRIO 10.TE.AM.2

Fixed by FRC rules. The roboRIO always has this IP on the robot network. Driver Station connects to it at this address.

Radio (OpenMesh) 10.TE.AM.1

The robot radio acts as the DHCP server and gateway. Its address is always .1. Configured with FRC Radio Configuration Utility before each event.

Network switch No IP (Layer 2)

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.

Coprocessor 1 10.TE.AM.11

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.

Coprocessor 2 10.TE.AM.12

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.

Laptop (pit) 10.TE.AM.5 (typical)

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.

🔍 The DHCP trap at competition

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.
🔍 USB-C for power, Ethernet for data

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.

💡 Check for USB bandwidth pressure in PhotonVision

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

1
Flash the PhotonVision image to the SD card

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.

2
Connect to the dashboard and assign a static IP

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).

3
Create and configure the AprilTag pipeline

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.

4
Calibrate the camera at competition settings

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.

5
Power-cycle test: confirm everything persists

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.

6
Verify robot code connects at competition network conditions

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.

Pre-event coprocessor checklist
□  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.
🔍 The spare SD card has won matches

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

⚙️ Coprocessor Hardware Checklist

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?

  • A The PhotonVision firmware needs to be updated — older versions don't work at competition venues
  • B The coprocessor was configured with DHCP and got a different IP from the competition field's DHCP server — or the static IP assignment didn't survive a power cycle; check the coprocessor's actual IP using Angry IP Scanner, then set a proper static IP from the Settings tab and verify it persists after reboot
  • C The robot network switch is blocking the coprocessor's traffic
  • D The team number in the IP address is wrong — competition venues use a different IP range

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?

  • A The coprocessor's SD card is corrupted — reflash it
  • B The roboRIO's USB host port is current-limited to 500mA, which is far less than a Pi 4 needs during active image processing (~2–3A with cameras); the voltage sag causes the Pi's undervoltage protection to trigger a reboot; fix: power the coprocessor from a VRM 5V/2A port or PDH USB-C port with dedicated current capacity
  • C The USB-A port can't carry Ethernet data — use an Ethernet cable instead
  • D PhotonVision has a known memory leak that causes reboots after 45 seconds of operation

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?

  • A Fast robot motion causes vibration that physically disconnects the USB cable — use better strain relief
  • B The Pi 4's two USB 3.0 ports share one USB 3.0 controller — at peak load (both cameras processing simultaneously during fast motion), the shared controller is bandwidth-saturated; the best fixes are reducing the second camera's FPS to 30, reducing its resolution to 960×540, or moving one camera to a second coprocessor with its own USB controller
  • C 1280×720 resolution requires USB 3.1 — the Pi 4 doesn't have USB 3.1
  • D PhotonVision can only process one camera at a time — the second camera must run on a separate instance
💪 Practice Prompt

Build and Validate Your Competition-Ready Coprocessor Setup

  1. Flash PhotonVision onto your coprocessor using a quality A1-rated microSD card (SanDisk Endurance or equivalent). Assign a static IP of 10.TE.AM.11 from 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.