-
Notifications
You must be signed in to change notification settings - Fork 9.8k
RFC feat(firmware): XIAO ESP32S3 Sense camera node — CSI + OV3660 /snap + /stream on :8081 (compile-time optional)#1013
Open
stuinfla wants to merge 1 commit into
Open
Conversation
... /stream on :8081 (compile-time optional) Adds an optional onboard-camera module to the esp32-csi-node firmware for the Seeed XIAO ESP32S3 Sense: same CSI node, plus GET /snap (single JPEG) and GET /stream (~5 fps MJPEG) served on CONFIG_CAMERA_HTTP_PORT (default 8081; OTA owns 8032). Off by default (CONFIG_CAMERA_ENABLE=n), S3-only Kconfig, esp32-camera managed component gated to target==esp32s3, graceful degradation: camera init failure leaves CSI streaming untouched. Includes sdkconfig.defaults.s3cam build overlay (octal PSRAM for framebuffers, display/WASM trimmed — pins collide with the camera). Build verified on IDF v5.5.2 (esp32s3) and exercised on hardware. Co-Authored-By: claude-flow <ruv@ruv.net>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
RFC: optional onboard camera for the S3 CSI node (XIAO ESP32S3 Sense)
Feature proposal — marked RFC because it adds a new hardware capability rather than fixing a defect. Happy to adjust scope/naming to taste.
Motivation
The Seeed XIAO ESP32S3 Sense is an S3 CSI node with a free OV3660 camera on board. Having the same node serve ground-truth snapshots/video alongside its CSI stream is directly useful for labeling and sanity-checking pose/presence work (e.g. ADR-150-style training captures) without adding a second device to the rig.
What this adds
main/camera_node.c/camera_node.h(~190 lines): OV3660 init with the hardware-verified XIAO ESP32S3 Sense pin map (sensor PID 0x3660), plus an HTTP server withGET /snap— single fresh JPEG (one stale framebuffer discarded first)GET /stream— multipart MJPEG at ~5 fpsCONFIG_CAMERA_ENABLE(default n,depends on IDF_TARGET_ESP32S3) andCONFIG_CAMERA_HTTP_PORT(default 8081 — the OTA/WASM server owns 8032; httpdctrl_portoffset to 32769 since the OTA instance owns 32768)idf_component.yml:espressif/esp32-camera ^2.0.0withrules: if target == esp32s3, so non-S3 builds never fetch itsdkconfig.defaults.s3cambuild overlay: octal PSRAM (required for framebuffers), display/WASM trimmed (those pins collide with the camera on the XIAO)main.c: starts the camera after WiFi is up; init failure is non-fatal by design — logs a warning and CSI streaming continues unaffectedCSI-coexistence design notes
fb_count=2,CAMERA_GRAB_LATEST, quality 12 in PSRAM is the proven-reliable config from a probe firmware (SVGA withfb_count=1overflowed: FB-OVF); bounded per-frame airtime keeps the CSI promiscuous callback from being starvedcamera_node.cis only compiled underCONFIG_CAMERA_ENABLE, and the default for every existing target/overlay is off — the C6 and stock S3 builds are byte-identical to mainHardware/test evidence
idf.py -B build-s3camoverlay invocation (no host-side Rust changes in this PR)/snapreturns fresh JPEGs and/streamsustains ~5 fps while the node keeps streaming CSI🤖 Generated with claude-flow