[帧0001] IDLE (ー_ー) 视觉:[██░░░░]静 音频:🔇[░░░░]-- [帧0002] CURIOUS (・o・) 视觉:[████░░]动 音频:🔊[██░░]人 [帧0003] HAPPY (◕‿◕) 视觉:[██████]大 音频:🗣[████]人
┌─────────────────────────────────────────────────────────┐ │ 物理世界 │ │ 摄像头 / 麦克风 / 触摸传感器 │ └─────────────────────────┬───────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────┐ │ 感知降级层 (Perception) │ │ 视觉: 160×120 灰度 @ 5 FPS │ │ 音频: 16kHz 单声道 @ 100ms 分块 │ └─────────────────────────┬───────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────┐ │ 推理层 (Inference) │ │ ┌────────────────┐ ┌────────────────┐ │ │ │ 帧差法运动检测 │ │ RMS + 频段分析 │ ← 规则 │ │ └───────┬────────┘ └───────┬────────┘ │ │ │ │ │ │ ┌───────▼────────┐ ┌───────▼────────┐ │ │ │ MotionNet CNN │ │ AudioNet CNN │ ← 神经网络│ │ │ 32×24 → 3类 │ │ 16×10 → 4类 │ │ │ └───────┬────────┘ └───────┬────────┘ │ └────────────┼─────────────────────┼──────────────────────┘ │ │ ↓ ↓ ┌─────────────────────────────────────────────────────────┐ │ 事件生成层 (Events) │ │ MOTION_STARTED / SOUND_DETECTED / VOICE_DETECTED │ │ + 防抖处理 │ └─────────────────────────┬───────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────┐ │ 状态机层 (FSM) │ │ IDLE → CURIOUS → LISTENING → ALERT → HAPPY │ │ └──────────────→ SLEEPY (10秒无事件) │ └─────────────────────────┬───────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────┐ │ 输出层 (Output) │ │ 表情代码 / LED 颜色 / 声音播放 │ └─────────────────────────────────────────────────────────┘
| 约束项 | ESP32-S3 限制 | 原型实现 | 状态 |
|---|---|---|---|
| 视觉分辨率 | 160×120 灰度 | 强制降级 | ✅ |
| 视觉帧率 | ≤5 FPS | 200ms 间隔 | ✅ |
| 音频采样率 | 16kHz 单声道 | 模拟/真实 | ✅ |
| 单块时长 | 100ms | 1600 样本 | ✅ |
| 模型大小 | ≤60KB | ~8KB | ✅ |
| 推理延迟 | ≥20ms | sleep 模拟 | ✅ |
| SRAM 使用 | 512KB | ~50KB (10%) | ✅ |
| 模型 | 输入 | 输出 | 参数量 | float32 | int8 |
|---|---|---|---|---|---|
| MotionNet | 32×24 灰度 | 3 类 | 1,107 | 4.3KB | 1.1KB |
| AudioNet | 16×10 mel | 4 类 | 996 | 3.9KB | 1.0KB |
| 合计 | 2,103 | 8.2KB | 2.1KB |
# 克隆仓库
git clone https://github.com/quyangminddock/esp32_simulate_platform.git
cd seedling
# 安装依赖
pip install -r requirements.txt
# 运行(终端模式)
python main.py
# 运行(GUI监控界面)⭐ 新功能
python main.py --gui
# 可选参数
python main.py --gui --no-cnn # GUI + 禁用 CNN(最低延迟)
python main.py --gui --no-audio # GUI + 禁用音频
python main.py --no-audio # 终端 + 禁用音频
# 退出
# 按 Ctrl+C 或关闭 GUI 窗口
GUI 功能预览:
# 前置条件:安装 ESP-IDF v5.1+
cd esp32_template
idf.py set-target esp32s3
idf.py build
idf.py flash monitor
# 完整测试
python -m tests.benchmark
# 指定测试类型
python -m tests.benchmark --test model
python -m tests.benchmark --test inference
python -m tests.benchmark --test memory
# 压力测试(30秒)
python -m tests.benchmark --stress --duration 30
seedling/ ├── main.py # 主入口 ├── requirements.txt # Python 依赖 ├── GUI_QUICKSTART.md # GUI 快速启动指南 ⭐ │ ├── perception/ # 感知降级层 │ ├── vision.py # 视觉(160×120 灰度) │ └── audio.py # 音频(16kHz 单声道) │ ├── inference/ # 推理层 │ ├── motion_detector.py # 帧差法运动检测 │ ├── audio_analyzer.py # 音频能量分析 │ ├── motion_classifier.py # CNN 运动分类 │ └── audio_classifier.py # CNN 音频分类 │ ├── models/ # 模型定义 │ └── tiny_cnn.py # Tiny CNN 框架 │ ├── events/ # 事件系统 │ └── event_bus.py # 事件生成 + 防抖 │ ├── fsm/ # 状态机 │ └── state_machine.py # 情绪状态管理 │ ├── gui/ # GUI 监控界面 ⭐ │ ├── __init__.py # 模块导出 │ └── monitor.py # 实时可视化界面 │ ├── simulator/ # 硬件约束模拟器 │ └── constraints.py # ESP32-S3 限制模拟 │ ├── tests/ # 测试套件 │ └── benchmark.py # 极限性能测试 │ ├── esp32_template/ # ESP32-S3 C 代码模板 │ ├── CMakeLists.txt # 项目配置 │ ├── sdkconfig.defaults # SDK 默认配置 │ ├── partitions.csv # 分区表 │ ├── main/ # 主代码 │ └── models/ # 模型头文件 │ └── docs/ # 文档 ├── architecture.md # 系统架构 ├── modules.md # 模块说明 ├── state-machine.md # 状态机设计 ├── tiny-cnn.md # CNN 设计 ├── deployment.md # 部署指南 ├── gui-usage.md # GUI 使用文档 ⭐ ├── esp32-peripherals.md # 外设驱动详解 └── freertos-tasks.md # FreeRTOS 任务设计
| 文档 | 说明 |
|---|---|
| GUI快速启动 | ⭐ GUI监控界面快速上手 |
| GUI使用文档 | ⭐ GUI完整功能和调试技巧 |
| 系统架构 | 整体设计和数据流 |
| 模块说明 | 各模块详细说明 |
| 状态机设计 | 情绪状态转换规则 |
| Tiny CNN | 轻量级神经网络设计 |
| 部署指南 | ESP32-S3 硬件部署概览 |
| 外设驱动 | GPIO/I2C/I2S/SPI 详解 |
| FreeRTOS 任务 | 双核任务设计 |
ESP32-S3 SRAM 使用(~50KB / 512KB = 10%) 视觉帧缓冲 ×2 38,400 B 当前帧 + 上一帧 运动检测工作区 1,024 B 临时变量 音频块缓冲 3,200 B 100ms @ 16kHz FFT 工作区 1,536 B complex + 频谱 mel 滤波器组 8,256 B 预计算 mel 帧缓冲 640 B 10 帧特征 CNN 工作区 3,840 B 视觉 + 音频 事件+状态机 768 B 防抖器 + 状态 ──────────────────────────────── 总计 ~58 KB
| 组件 | 推荐型号 | 价格参考 |
|---|---|---|
| 主控 | ESP32-S3-WROOM-1 | ¥25 |
| 摄像头 | OV2640 (QCIF 模式) | ¥15 |
| 麦克风 | INMP441 I2S | ¥8 |
| 显示屏 | 0.96" OLED SSD1306 | ¥10 |
| 喇叭 | MAX98357 I2S 功放 | ¥5 |
| 总计 | ~¥63 |
欢迎提交 Issue 和 Pull Request!
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)本项目基于 MIT 许可证开源 - 查看 LICENSE 文件了解详情。
Made with ❤️ for Makers
如果这个项目对你有帮助,请给一个 ⭐ Star!