Rdzleo e95d0c414e Phase 01 批次 1-3: 单摄像头人脸追踪基础设施
实现 ESP32-S3 上单摄像头人脸追踪的核心代码骨架,替代 Grove Vision AI V2
模块,通过 UART 发送人脸坐标驱动 RP2040 控制的眼球/YAW 舵机。

## 规划文档(docs/phase-01-face-tracking/)

- GOAL.md       Phase 目标与 5 大成功标准
- RESEARCH.md   esp-dl v3.2/3.3 + human_face_detect 0.4.1 技术调研
- PLAN.md       15 个原子任务的执行计划(T01-T15)
- PLAN_CHECK.md 计划审查报告(PASS_WITH_NOTES)
- PROGRESS.md   执行进度追踪(批次 1-3 已完成)

## 批次 1:依赖与开关(T01-T03)

- main/idf_component.yml
  新增 esp-dl ~3.3.0 + human_face_detect 0.4.1(仅 S3/P4)
  esp-sr 从 ~2.2.0 升级到 ~2.3.1,解决 esp-dsp 1.6/1.7 版本冲突
- main/Kconfig.projbuild
  新增 CONFIG_XIAOZHI_ENABLE_FACE_TRACKING 开关(默认 y,depends on S3)
  新增 CONFIG_XIAOZHI_FACE_TRACKING_FPS_CHOICE(5/10/15)
- main/boards/common/esp32_camera.{h,cc}
  新增 ProbeFrameCapture() 最小 V4L2 DQBUF/QBUF 探针(T01)
- main/application.cc
  Start() 末尾调用 probe 验证摄像头硬件链路

## 批次 2:人脸检测核心(T04-T06)

- main/boards/common/esp32_camera.{h,cc}
  新增 FrameRef 结构体 + CaptureForDetection/ReleaseDetectionFrame
  双超时 mutex 策略:face_tracker 10ms timeout 跳帧,Capture() RAII guard
- main/face_tracker.{h,cc}(新建)
  Core 0 / 优先级 2 / 栈 8KB 独立任务
  集成 esp-dl HumanFaceDetect 推理
  坐标归一化 cx*224/W-112,匹配 RP2040 pixel_centre=112
  多人脸遍历挑 score 最高,避免多脸时眼球摇摆
  三重保护:Kconfig depends on S3 + 源文件 #if 守卫 + CMake 条件排除
- main/CMakeLists.txt
  非 S3 目标从 SOURCES 移除 face_tracker.cc

## 批次 3:UART 协议扩展(T07)

- main/uart_component.{h,cc}
  新增 uart_send_face(x,y) 发送 face:x,y\r\n 协议
  extern "C" 链接名配合 face_tracker 的弱符号声明
  全局 TX mutex 保护所有 UART 写入,防并发帧交织
  uart_send_string 同步加锁保持一致性

## 编译验证

idf.py build 通过,固件 2.51MB / 剩余 1.46MB (36% free)
当前 face_tracker 未被 application 激活(留到 T11),
UART/摄像头现有功能零影响。

## 未完成(下次继续)

- T01 硬件 probe 实机验证
- T08-T10 RP2040 端 parse_face + facetrack 双数据源改造
- T11-T15 application 接入 + 端到端联调 + 性能调优 + 最终验收

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 18:24:27 +08:00

93 lines
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Phase 1: 单摄像头人脸追踪
## 目标
将 ESP32-S3 上的 OV3660 摄像头用作人脸追踪数据源,替代 Grove Vision AI V2 模块,驱动 RP2040 控制的眼球EYL/EYR和身体YAW舵机追踪人脸移动。
## 硬件环境
- **ESP32 模组**: ESP32-S3-WROOM-1-N16R816MB Flash + 8MB PSRAM
- **摄像头**: OV3660 DVP 接口(已完成 3 根飞线GPIO 35→14, 36→41, 37→42
- **RP2040**: Raspberry Pi Pico直接焊在 CogNog V1.0 PCB 上)
- **舵机**: 9 个 180° 标准舵机KPower M0090 / MG90S 180°
- **无 Grove Vision AI V2**: 本 Phase 的核心目的是省去此模块
## 当前架构(改造前)
```
OV3660 → ESP32-S3仅显示/视觉辅助功能)
Grove Vision AI V2 → UART 921600 → RP2040 的 GP0/GP1
facetrack() 解析 boxes
驱动 EYL/EYR/PIT/YAW
```
## 目标架构(改造后)
```
OV3660 → ESP32-S3
├── 视觉辅助功能(保留)
└── 人脸检测推理(新增)
提取人脸中心 (x, y) 偏移
UART 115200 → RP2040 的 GP4/GP5
coms.py 识别 face: 协议,注入 facetrack()
驱动 EYL/EYR/PIT/YAW复用现有逻辑
```
## 成功标准Success Criteria
必须同时满足:
1. **性能指标**
- ESP32 摄像头帧率 ≥ 5 FPSQVGA 320×240 或更低分辨率)
- 人脸检测延迟 ≤ 200ms
- 坐标传输延迟 ≤ 50ms
2. **功能正确性**
- 检测到人脸时ESP32 通过 UART 发送格式化坐标到 RP2040
- RP2040 接收坐标后眼球和身体正确追踪人脸方向
- 人脸偏离摄像头中心时眼球先转动YAW 延迟跟随(保留现有逻辑)
- 无人脸时3 秒后 `grove_active` 标志自动置为 False回退到随机动画
3. **不破坏现有功能**
- 语音对话WebSocket + Opus 音频编解码)无卡顿、无断连
- 唤醒词检测正常工作
- LCD 显示(如有)正常刷新
- 现有 UART 状态指令(`"idle"`, `"listening"`, `"speaking"` 等)继续工作
4. **代码质量**
- ESP32 端人脸检测任务运行在 Core 0与音频/WiFi 隔离
- PSRAM 合理使用,不出现 OOM
- UART 协议向后兼容(不影响 RP2040 现有状态指令解析)
- 所有新增代码有清晰的中文注释
5. **可维护性**
- 支持无 Grove 和有 Grove 两种模式自动切换(复用已有的 `grove_active` 机制)
- ESP32 侧面能通过 menuconfig 或宏定义开关人脸检测功能
## 涉及的代码库
- **ESP32 端**: `/Users/rdzleo/Desktop/CogletESP-camera-version`(当前目录)
- **RP2040 端**: `/Users/rdzleo/Desktop/CogletESP-CogletESP/RP2040`(另一个本地目录)
> 注意RP2040 侧的 `coms.py` 和 `main.py` 已经做过一次增强动画改造2026-04-17。本 Phase 需要在此基础上继续增加 ESP32 人脸坐标协议支持。
## 非目标Out of Scope
- 不做人脸识别(谁的脸),只做人脸检测(有没有脸 + 在哪里)
- 不做多人追踪(只追踪第一张检测到的脸)
- 不实现 180° 全景追踪(保持原 Grove 方案的追踪范围)
- 不改变眼球/YAW 的追踪算法(复用 `main.py facetrack()` 中的现有逻辑)
## 风险与限制
- **性能风险**: ESP32-S3 同时运行 WiFi + WebSocket + Opus + AI 对话 + LVGL + 摄像头 + 人脸检测CPU 和内存压力大
- **音频干扰风险**: 人脸检测占用的 Core 0 可能与音频共享,导致对话卡顿
- **跨项目协调**: ESP32 和 RP2040 属于不同代码库,需协调 UART 协议
- **模型精度**: esp-dl 的人脸检测模型精度低于 Grove Vision AI V2追踪流畅度可能下降