[帧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!