# Phase 1: 单摄像头人脸追踪

## 目标

将 ESP32-S3 上的 OV3660 摄像头用作人脸追踪数据源，替代 Grove Vision AI V2 模块，驱动 RP2040 控制的眼球（EYL/EYR）和身体（YAW）舵机追踪人脸移动。

## 硬件环境

- **ESP32 模组**: ESP32-S3-WROOM-1-N16R8（16MB 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 FPS（QVGA 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，追踪流畅度可能下降
