Contributing to PhotonVision Projects Welcome! Getting Started Submitting A PR General Developer Interaction AI Usage Violations Yearly Development Cycle Project Governance Build Instructions Development Setup Prerequisites Compiling Instructions Getting the Source Code Install Necessary Node JS Dependencies Building the UI Using hot reload on the UI Build and Run PhotonVision Build and Run PhotonVision on a Raspberry Pi Coprocessor Using PhotonLib Builds Debugging PhotonVision Running on a CoProcessor Running Tests Running Default Tests Debugging PhotonVision Tests Locally Running Tests With UI VSCode Test Runner Extension Running examples Running C++/Java Running Python Downloading Pipeline Artifacts MacOS Builds Forcing Object Detection in the UI Building the PhotonVision Documentation Cloning the Documentation Repository Installing Python Dependencies Building the Documentation Opening the Documentation Docs Builds on Pull Requests Style Guide Linting the PhotonVision Codebase Versions Frontend Linting the frontend Backend wpiformat installation Linting the backend Documentation doc8 installation Linting the documentation Website Formatting the website Alias PhotonVision Developer Documentation Photonlib Developer Docs Backing up using Rsync Software Architecture Design Descriptions Calibration and Image Rotation Rotating Points Image Distortion Time Synchronization Protocol Specification, Version 1.0 Background Prior Art Roles Transport Message Format TSP Ping TSP Pong Optional Protocol Extensions Wireshark Dissector Camera Matching Initial Setup UI Workflow Activate New Camera Deactivate Camera Reactivate a CameraConfig Camera Matching Requirements Definitions Startup: Camera (re)enumeration: Creating from a new camera Deactivate Reactivate Latency Characterization A primer on time CSCore’s Frame Time Latency Testing Test Setup Test Results Future Work