--- type: guidelines --- # Vision guidelines ## 1. Camera-agnostic - Any V4L2 capture device works. Never hard-code a node such as `/dev/video0`: numbering follows enumeration order. Take a `/dev/v4l/by-id/` path, or find the camera at runtime (`--camera auto`). - Use what the camera offers. MJPEG passes through untouched; anything else is encoded here. A requested size or rate the camera lacks falls back to its own default rather than failing. - UVC control names differ between cameras and kernels. Look them up on the device; reply that a control is missing rather than guessing. ## 2. One process owns the camera - V4L2 capture is single-reader. This service opens the device; recording and inference take frames from it, never from the device. - UVC controls reset when the camera re-enumerates. Set them on open, not once. ## 3. The tablet link is the constraint - Every socket to a display is paced (`SO_MAX_PACING_RATE`, project-yukart decision 28). Unpaced bursts stall the USB link for seconds. - Latest frame wins. A slow client skips frames; it never gets a queue of old ones. - Say when there is no camera. A client must be able to tell "unavailable" from "slow". ## 4. Python, on purpose - Python 3.10 (the Orin's), standard library only; GStreamer and v4l-utils come from the host. The exception to Rust for Orin services is decision 29: camera pipelines and inference live in the Python ecosystem. - No pip installs on the car Orin until there is a reason; then a venv under `~/infra/svc-vision/`, never the system Python. ## 5. To be added