Files
ESP32S3_vt/LATENCY.md
T
sloray cc6b82d7ec
构建客户端 / 检查(类型 + 单元测试) (push) Canceled after 0s
构建客户端 / Linux x64(deb + AppImage) (push) Canceled after 0s
构建客户端 / Windows x64(NSIS 安装包) (push) Canceled after 0s
构建客户端 / macOS 通用(.app + .dmg) (push) Canceled after 0s
feat: 链路控制、延迟校准与长测工具,补全文档
- 固件:新增 link_control / stream_control,覆盖运行中 Wi-Fi 断线恢复、取帧节拍、
  温控与质量/帧率减载;UDP 发送增加有界重试预算与帧期限,PSRAM JPEG 直发减少拷贝。
- 协议:重组器严格校验分片布局,统计未收齐、超时与完全缺失的帧,处理帧号回绕与设备重启。
- 桌面端:视频改 latest-value 通道并前置帧时间标记,拒绝积压和慢解码的过期画面;新增
  延迟标记页与 --latency-report 校准,完善录制、服务端与退出流程。
- 文档与脚本:新增硬件、开发、延迟、功耗、实时性、稳定性文档和改动记录,重写根 README;
  新增构建、性能、延迟与串口长测脚本,以及长测客户端脚本。
- 构建:固定 esp-1.97.0.0 工具链,分区表随构建复制,更新 sdkconfig 与忽略规则。
2026-10-19 00:19:07 +08:00

8.6 KiB
Raw Permalink Blame History

约 30 fps、Wi-Fi 重连与画面链路延迟验证(2026-10-18)

当前交付已增加阻塞恢复与新鲜度处理,见 REALTIME.md。本页保留此前减光确认和画面延迟对照;本页 SHA 与测量结果均属于当时构建,不是当前固件的重测结果。

先前三缓冲与小幅减光记录

根据用户长程运行反馈,双缓冲在峰值负载下丢帧明显,当前交付恢复 CAM_FB_COUNT=3,保留突发发送期间的采集余量。约 30 fps 完整 PLL 配置、VGA 彩色、正常白平衡、Wi-Fi 自动重连和自适应 JPEG 均保留。双缓冲保留为试验选项,下面的短时延迟对照属于历史记录,不能证明长程峰值稳定性。

针对现场轻微过亮,增加 CAM_AE_LEVEL=-1,将 OV5640 AE 目标从 55 微调到 45,目标比值约 −0.29 EV;CAM_EXPOSURE_EV=0,自动曝光和增益仍联动,曝光上限保持 592 行(约 20 ms)。这会小幅降低亮度目标,不保证实际快门必然缩短。当前 50 Hz 抗频闪步长约 10 ms,直接小减曝光上限可能跨越一整档,因此使用 AE 目标细调。该目标比值不等于经过照度标定的实际 EV。

本次已通过 COM8 烧录与 Bootloader、分区表、App 的独立校验。重新启动后串口观察 45.15 秒,复位和采集错误均为 0,订阅已恢复;末个窗口提交 29.7 fps。观察中仍有 UDP 发送回压,三缓冲不代表完全消除路由器拥塞。本次未重新测量原生完整接收损失率或画布延迟,也未重新进行长程峰值测试。

用户已确认当前三缓冲、小幅减光版本亮度合适、颜色稳定。

该阶段 App SHA-256:05aff1f53519fbb52b89ca526c3be11cc78f37a3356f588986336cf7870924eb。完整选择理由、当前参数与短测记录见制品 BUFFER-DECISION.json;下面的 90 秒/五分钟对照、CDF 和旧接收曲线保留为历史数据,不能套用到本次亮度微调后的镜像。

此前短时对照(历史)

此前试验使用 VGA 彩色、完整 PLL 配置和双缓冲。保留 Mihomo TUN,只有一个 UDP 订阅者,使用 Windows 生产客户端的真实视频绘制路径,非演示模式。用户已确认新时钟配置亮度够用、颜色正常,未再出现短 HTS 方案的绿紫闪烁。

指标 三缓冲基线 双缓冲试验配置
原生接收窗口 90.008 s 300.003 s
完整接收帧 2659 8909
帧损失 32 / 1.189% 61 / 0.680%
完整接收帧率 29.54 fps 29.70 fps
本地 JPEG 通道 27.23 fps 27.90 fps
标记回显有效样本 767 2641
标记回显采样跨度 109.68 s 295.08 s
标记 → 首次可解码画布回显 P50 128.4 ms 121.5 ms
标记 → 首次可解码画布回显 P95 230.7 ms 193.4 ms
回显估计 P99 / 最大值 285.3 / 443.2 ms 248.9 / 461.5 ms

这次窗口的 P50 降低 6.8 ms、P95 降低 37.3 ms。双缓冲减少潜在采集排队,同时保住接近 30 fps 的实际交付。两个窗口的网络回压、JPEG 自适应档位和时长不同,属于连续实机对照,不能把全部改善归因于缓冲数,也不是所有路由器或场景的保证。此前约 22 fps 的测试保留在 STABILITY.md。

双缓冲试验五分钟全程在线,复位 0 次、采集错误 0 次,通道断开 0 次、计数重置 0 次。抽取 61 张 JPEG 均完整解码为 640×480 RGB;没有用灰度或降低色深换帧率。最小内部空闲堆 118771 B;实际 JPEG 档位 18–28,温度 58–60°C,未触发减载。

该测试阶段的配置与时钟

CAM_RES=vga
CAM_CLOCK_PROFILE=vga30
CAM_FB_COUNT=3
CAM_QUALITY=18
CAM_QUALITY_MAX=30
CAM_MAX_FPS=0
CAM_GRAYSCALE=0
CAM_EXPOSURE_EV=0
CAM_AE_LEVEL=-1
CAM_SHUTTER_LINES=0
CAM_EXPOSURE_MAX_LINES=592
CAM_GAIN_CEILING=32
CAM_HTS=0
CAM_THERMAL_LIMIT_C=75
WIFI_TX_POWER_DBM=14
UDP_PACKET_GAP_US=0
WIFI_TEST_DROP_AFTER_S=0

XCLK 保持 20 MHz,使用完整 PLL 分频组合:VCO 610 MHz、SYSCLK 61 MHz、DVP PCLK 15.25 MHz;保持默认 HTS 2060 / VTS 984 和读出窗口,名义节拍约 30.09 fps。此前缩短 HTS 至 1500 / 1800 的方案会闪色,未采用。驱动回调的参数顺序与私有 PLL 辅助函数不同,必须按 sensor_t.set_pll 的签名调用。

下列实际曝光、增益范围属于此前双缓冲试验。当前 AE 目标改为 45/55,自动增益保留,曝光上限 592 行约 19.99 ms;实际曝光 590–590 行,估算 19.92–19.92 ms,增益 8.00–13.50×。最大 50 Hz band 数保留为 2,避免提升 SYSCLK 后向下取整只剩一个 band 导致画面过暗。未强制负 EV 或固定低快门。行数与毫秒换算依赖当前时钟,不能直接套用其他配置。

参考:OV5640 数据手册、Espressif OV5640 驱动。新组合的 VCO 和 PCLK 在该手册列出的范围内;这不代替板上信号完整性和画面验证。

Wi-Fi 运行时恢复

断开、失去有效 IP 或地址变化后停止 UDP 发送并清理订阅目标。关联和 DHCP 分别使用 15 秒期限;首次立即尝试,失败按 1、2、4、8、16、30 秒退避。事件回调只更新状态,主循环负责调用驱动;认证进行中不会反复 connect。取址后重建 socket、恢复无线参数、丢弃旧采集帧并重新广播,保留摄像头、曝光、增益、设备 ID 和帧序号。

实机诊断构建主动断开并保持 5 秒:检测断线后 9021 ms 恢复网络,其中重试发起到恢复日志为 4029 ms(含取址和恢复处理);无需重启,客户端随后自动续订恢复视频。该测试使用同一恢复逻辑、60 MHz SYSCLK 的预检构建;最终交付为 61 MHz,故障注入参数为 0。恢复到同一个 IP 已验证,路由器长时间关机、密码改变和 DHCP 换址尚未分别做硬件测试。启动阶段第一次联网仍使用原有扫描和认证模式探测逻辑。

处理方式遵循 ESP-IDF 断线事件说明:有效 IP 恢复后再重建上层 socket。4 项恢复策略测试覆盖认证不被重启、关联/DHCP 超时、指数退避和新断线重置状态。

延迟测量方法与边界

Windows 客户端使用裁判配置和 --latency-report <新的NDJSON路径> 启动。相机固定对准左侧四角标记,右侧沿正常 VideoSurface 路径绘制真实回显。源标记每 50 ms 更新,记录每个编号首次可解码的画布回显;四角透视校正、Gray 码和互补行拒绝无法可靠识别的曝光混合帧。最初逐刷新更新在 180 Hz 屏幕上会让一次曝光跨越多个编号,已在正式对照前修正。

源标记和回显均使用同一客户端 performance.now(),无需 ESP 时钟同步。绘制时刻以相邻 rAF 夹定,表中为上下界中点;此前双缓冲样本的区间宽度中位数为 11.4 ms。该范围包括相机取样等待、曝光、采集、无线传输、重组、本地 WebSocket、解码和画布绘制。它是屏幕标记事件到首次可解码画布回显的估计,没有测量源/输出面板扫描或像素响应;严格的物理光学端到端延迟需用高速相机复核。未识别帧不成为样本,首次可解码回显可能晚于较早的模糊回显,不能把有效样本分布当作每一帧的延迟。

此前双缓冲试验中,解码完成到画布绘制平均 2.72 ms;标记分析平均 2.02 ms。该分析只在校准模式运行,正常客户端不做画布回读。字段 decodeToDrawMs 从解码完成开始,不代表 JPEG 解码耗时。接收间隔、分片组装耗时及发送函数耗时各有独立口径,不能替代本测量。

scripts/analyze_latency.py 可按半开区间行号复算 NDJSON。完整结果、参数、行号范围和边界见制品 LATENCY-RESULT.json,分布图见 LATENCY.png。原始校准记录保存在本机 target/latency/,不把画面、私有配置或令牌日志打进制品。

交付与硬件限制

该阶段 App SHA-256:05aff1f53519fbb52b89ca526c3be11cc78f37a3356f588986336cf7870924eb。Bootloader、分区表和 App 已经 COM8 烧录并独立校验,ZIP 内含校验清单。

本模组除原有 0xFADE7 坏点,还发现 0x10863 的 bit 6 异常读回为 1,整段回读只差这一字节,是否永久故障尚未单独擦写复核;已把应用分区移至 0x50000 并验证 0xFADE7 对应字节可写。该兼容布局针对故障模组,每次重编仍需重新核对,详见 HARDWARE.md。