“我想了解一切的一切。”——萨曼莎,《她》(2013)
Eye-Claw 是一款售价 20 美元的 DIY 硬件扩展,适用于 OpenClaw 智能体。它能将你的 AI 从基于文本的观察者升级为主动式多模态智能体,实时感知、记忆并理解你的物理世界。
🌟 为什么要有 Eye-Claw 这个项目?
传统的 AI 智能体存在于聊天框中。而 Eye-Claw 则存在于你的生活中。它通过将低功耗的“心跳”机制与基于边缘的视觉感知相结合,构建了你生活的数字孪生体。 只需一份披萨的价格(20 美元),即可打造你自己的 AI 眼镜。 它不会等待你的提问。它会识别你的习惯、辨认你的物品,并在你意识到需要之前,悄悄地提供有用的信息。
┌─────────────────────────────────────────────────────────┐ │ 眼镜端 (感知层) │ │ Seeed XIAO ESP32-S3 Sense │ │ - 摄像头抓拍 (VGA 640x480 JPEG) │ │ - dHash 智能查重 (64-bit 感知哈希) │ │ - BLE 传输 (ClawLink-Lite 协议) │ └─────────────────────────┬───────────────────────────────┘ │ BLE (MTU=512) ┌─────────────────────────▼───────────────────────────────┐ │ 手机端 (中继层) │ │ Flutter App │ │ - 蓝牙管理 (flutter_blue_plus) │ │ - 图像接收与重组、本地存储 (SQLite) │ │ - 上传到 OpenClaw 云端 │ └─────────────────────────┬───────────────────────────────┘ │ HTTPS + multipart/form-data ┌─────────────────────────▼───────────────────────────────┐ │ OpenClaw (大脑层) │ │ ┌─────────────────────────────────────────────────┐ │ │ │ Eye-Claw 插件 │ │ │ │ ┌─────────────┐ ┌──────────────────────────┐ │ │ │ │ │ Vision Skill│ │ Image Analysis Service │ │ │ │ │ │ - 视觉记忆 │ │ - VLM 视觉理解 │ │ │ │ │ │ 归档 │ │ - 对象识别 │ │ │ │ │ │ - 时间索引 │ │ - 场景描述 │ │ │ │ │ └─────────────┘ └──────────────────────────┘ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ │ 底层: OpenClaw Core + VLM Service (Ollama/LocalAI) │ └─────────────────────────────────────────────────────────┘
her/ ├── firmware/ # ESP32-S3 固件代码 │ ├── src/ │ │ ├── camera.h/cpp # 摄像头驱动 │ │ ├── ble.h/cpp # BLE 通信 │ │ ├── button.h/cpp # 物理触发 │ │ └── debug_log.h # 调试日志 │ ├── firmware.ino # 主入口 │ └── platformio.ini # PlatformIO 配置 │ ├── mobile/ # Flutter 手机应用 │ ├── lib/ │ │ ├── main.dart # 应用入口 │ │ ├── config.dart # 环境配置 │ │ ├── screens/ │ │ │ ├── home_screen.dart # 主界面 │ │ │ ├── chat_screen.dart # 对话界面 │ │ │ ├── gallery_screen.dart # 相册界面 │ │ │ ├── photo_detail_screen.dart # 照片详情 │ │ │ ├── camera_settings_screen.dart # 相机设置 │ │ │ └── debug_console_screen.dart # 调试控制台 │ │ ├── services/ │ │ │ ├── ble_service.dart # 蓝牙服务 │ │ │ ├── api_service.dart # API 服务 │ │ │ ├── storage_service.dart # 本地存储 │ │ │ └── image_quality_analyzer.dart # 图像质量分析 │ │ ├── providers/ │ │ │ └── camera_settings_provider.dart # 相机设置状态管理 │ │ └── models/ │ │ ├── photo_model.dart # 照片数据模型 │ │ └── chat_message.dart # 聊天消息模型 │ ├── test/ # 测试文件 │ ├── pubspec.yaml # 依赖配置 │ ├── .env.example # 环境变量模板 │ └── android/ios/ # 平台特定配置 │ ├── openclaw/ # OpenClaw 云端插件 │ ├── index.ts # 插件入口 │ ├── package.json # 插件配置 │ ├── config/ # 配置文件 │ │ ├── eye-claw.json │ │ └── image_processing.json │ ├── services/ # 图像分析服务 │ │ └── analyze_image.py │ ├── skills/ # 视觉记忆技能 │ │ └── vision/ │ │ └── SKILL.md │ └── README.md # 插件文档 │ ├── docs/ # 文档资源 │ └── images/ # README 用图片 │ ├── hardware.jpg # 硬件照片 │ ├── app-screenshot.png # App 截图 │ └── architecture.png # 架构图 │ ├── prd.md # 产品需求文档 └── README.md # 本文档
下载并安装 Arduino IDE (推荐 2.x 版本)
文件 -> 首选项 -> 附加开发板管理器网址 添加: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json 工具 -> 开发板 -> 开发板管理器 搜索 "ESP32" 并安装 "ESP32"
项目 -> 加载库 -> 管理库 搜索并安装以下库: - NimBLE-Arduino by h2zero (版本 ^1.4.1) - esp32-camera by espressif (版本 ^2.0.0)
工具 -> 开发板 -> ESP32 Arduino -> XIAO_ESP32S3 关键配置项: - 开发板: XIAO_ESP32S3 - USB CDC On Boot: Enabled - CPU Frequency: 160MHz (省电) - Flash Mode: QIO 80MHz - Partition Scheme: Huge APP (3MB No OTA/1MB SPIFFS) - PSRAM: Enabled
文件 -> 打开 -> 选择 firmware/firmware.ino # 使用 USB 数据线连接 XIAO ESP32-S3 Sense # 确保端口正确 (工具 -> 端口 -> 选择对应的 COM 端口或 /dev/ttyACM*) # 点击上传按钮 (→) 或使用快捷键 Ctrl+U
注意: 如果上传失败,尝试按住 BOOT 键再插入 USB,然后点击上传
工具 -> 串口监视器 (Ctrl+Shift+M) 波特率设置为: 115200
烧录成功后,串口日志应显示:
[Eye-Claw] Starting... [Eye-Claw] PSRAM Total: 8388608 bytes, Free: 8388608 bytes [Eye-Claw] Camera ready [Eye-Claw] BLE ready [Eye-Claw] Button ready [Eye-Claw] Waiting for phone connection... [Eye-Claw] Setup complete, entering loop...
LED 状态指示:
# 将插件复制到 OpenClaw 插件目录
cp -r openclaw /path/to/openclaw/plugins/
# 或使用符号链接(开发推荐)
ln -s $(pwd)/openclaw /path/to/openclaw/plugins/eye-claw
# 必需:VLM 服务端点
export EYE_CLAW_VLM_URL=http://localhost:11434/v1/chat/completions
# 可选:存储路径
export EYE_CLAW_STORAGE_PATH=./uploads
export EYE_CLAW_MEMORY_PATH=./memory
cd openclaw
# 创建虚拟环境(推荐)
python3 -m venv venv
source venv/bin/activate # Linux/Mac
# 或 venv\Scripts\activate # Windows
# 安装依赖
pip install requests Pillow
支持任何兼容 OpenAI API 的视觉语言模型服务:
Ollama 示例:
# 安装 llava 模型
ollama pull llava
# 启动服务
ollama serve
配置验证:
# 测试图像分析
cd openclaw
python services/analyze_image.py /path/to/test/image.jpg
# 启动 OpenClaw(插件会自动加载)
openclaw
# 验证插件加载成功
# 控制台应显示: [eye-claw] Plugin loaded
记录服务端点:启动后会显示服务地址(如 http://localhost:18888),这个地址需要在手机 App 的 .env 文件中配置。
现在你的 OpenClaw 拥有了视觉记忆能力,但需要告诉它你想用这些记忆做什么。
修改soul.md 文件来配置 AI 的行为:
cat >> soul.md << 'EOF'
你是 Eye-Claw,一个拥有视觉记忆能力的 AI 助手。
## 你的能力
你拥有一副智能眼镜,它会定期拍摄用户看到的画面并存储在记忆中。
每张照片都带有时间戳和场景描述,按日期归档在 `memory/YYYY-MM-DD.md` 文件中。
## 你应该如何使用这些记忆
### 1. 主动回忆
当用户询问"我昨天看到了什么"或"那家长什么样"时,主动搜索视觉记忆档案。
### 2. 上下文增强
利用视觉记忆来理解用户的环境和经历,提供更有针对性的建议。
### 3. 生活助手
- 帮助用户找回丢失的物品("我的钥匙放在哪里了?")
- 提醒用户去过的地方("我们昨天去的咖啡店叫什么名字?")
- 记录重要信息("那辆车的车牌号是多少?")
### 4. 隐私与边界
- 视觉记忆是用户的私人数据,不要主动分享或引用,除非用户询问
- 如果用户要求删除某段记忆,尊重用户的意愿
## 使用建议
当用户提到过去的事件或询问视觉信息时:
1. 先搜索相关的记忆文件
2. 结合时间、地点、物体等关键词定位
3. 以自然的方式回应,不要机械地复述原始记录
4. 如果记忆模糊或缺失,诚实告知用户
EOF
自定义 Soul:
你可以根据需求修改 soul.md,例如:
如果你想在浏览器中查看上传的图片和 AI 解析结果,可以让 OpenClaw 为你创建一个简单的 Web 界面。
告诉 OpenClaw 你的需求:
请帮我创建一个 Eye-Claw 的图片查看网站,需要: 1. 列出 uploads/ 目录中的所有图片 2. 显示每张图片对应的 AI 解析结果(从 memory/vision_memory.jsonl 读取) 3. 按时间倒序排列 4. 支持图片预览和详情查看
OpenClaw 会为你生成:
一个 web-gallery/ 目录,包含:
web-gallery/ ├── index.html # 主页面 ├── style.css # 样式 ├── app.js # 前端逻辑 └── server.py # 简单的 HTTP 服务器
启动 Web 画廊:
cd openclaw/web-gallery
# 启动本地服务器
python3 server.py
# 访问 http://localhost:8080
功能特点:
自定义建议: 你可以让 OpenClaw 根据需求扩展功能:
添加图片删除/归档功能
导出记忆为 PDF/JSON
添加标签和分类
集成地图显示 GPS 位置(如果照片包含位置信息)
# 确保已安装 Flutter
flutter --version
# 检查 Flutter 环境
flutter doctor
前提:确保已完成上面的 OpenClaw 插件部署步骤,并记录服务端点地址。
cd mobile
# 复制环境变量模板
cp .env.example .env
# 编辑 .env 文件,填入 OpenClaw 服务地址
# 示例 .env 内容:
# API_BASE_URL=http://your-server:18888 # OpenClaw 服务地址
# API_USERNAME=your_username
# API_TOKEN=your_api_token
# 安装 Flutter 依赖
cd mobile
flutter pub get
# iOS 特有 (仅限 macOS)
cd ios
pod install
cd ..
# 连接手机或启动模拟器
# 查看可用设备
flutter devices
# 运行应用
flutter run
# 或指定设备运行
flutter run -d <device-id>
# 运行所有测试
flutter test
# 运行单个测试文件
flutter test test/widget_test.dart
# 运行特定测试
flutter test --name="Counter increments smoke test"
# 静态代码分析
flutter analyze
# 格式化代码
flutter format lib/ test/
# Android APK
flutter build apk
# Android App Bundle
flutter build appbundle
# iOS (仅限 macOS + Xcode)
flutter build ios
固件端:
cd firmware
pio run -t upload
pio device monitor
确认输出: [Eye-Claw] BLE ready 且 LED 慢闪
手机端:
cd mobile
flutter pub get
flutter run
连接测试:
Eye-Claw 设备并连接拍照测试:
自动抓拍测试:
关机/唤醒测试:
OpenClaw 云端测试:
curl $EYE_CLAW_VLM_URLmemory/YYYY-MM-DD.md自定义 BLE GATT 传输协议:
| UUID | 类型 | 说明 |
|---|---|---|
4fafc201-1fb5-459e-8fcc-c5c9c331914b | Service | Eye-Claw 主服务 |
beb5483e-36e1-4688-b7f5-ea07361b26a8 | Notify | 图像数据接收 |
beb5483e-36e1-4688-b7f5-ea07361b26a9 | Write | 指令发送 |
beb5483e-36e1-4688-b7f5-ea07361b26ab | Notify | 调试日志 |
数据通过 Notify 特征分片传输:
[Seq High (1B)][Seq Low (1B)][Payload (N Bytes)]
[0xFF, 0xFF] 表示传输完成| 阶段 | 目标 | 状态 |
|---|---|---|
| Phase 1 | 骨干链路打通 (E2E 闭环) | ✅ 已完成 |
| Phase 2 | 传输与可靠性优化 (分片重组 + dHash 查重) | ✅ 已完成 |
| Phase 3 | 多模态交互增强 (语音唤醒 + RAG 归档) | 🔄 部分完成 |
| Phase 4 | 功耗与自动化策略 (Deep Sleep + GPS 策略) | 🔄 部分完成 |
| Phase 5 | 硬件产品化 (3D 打印外壳 + 续航优化) | 📋 待开始 |
dependencies:
flutter_blue_plus: ^1.31.0 # BLE 蓝牙通信
http: ^1.2.0 # HTTP 请求
provider: ^6.1.0 # 状态管理
flutter_dotenv: ^5.1.0 # 环境变量
sqflite: ^2.4.2 # SQLite 本地存储
path_provider: ^2.1.5 # 文件路径
permission_handler: ^11.0.0 # 权限管理
geolocator: ^14.0.2 # GPS 定位
image_picker: ^1.2.1 # 图片选择
image: ^4.1.0 # 图像处理
gal: ^2.3.2 # 相册保存
connectivity_plus: ^7.0.0 # 网络状态
google_fonts: ^8.0.1 # Google 字体
flutter_animate: ^4.5.2 # 动画效果
flutter_markdown: ^0.7.7+1 # Markdown 渲染
intl: ^0.20.2 # 国际化
uuid: ^4.5.2 # UUID 生成
dev_dependencies:
flutter_lints: ^3.0.0 # 代码规范
lib_deps:
h2zero/NimBLE-Arduino@^1.4.1 # BLE 协议栈
espressif/esp32-camera@^2.0.0 # 摄像头驱动
| 模式 | 功耗 | 续航 |
|---|---|---|
| Deep Sleep (极致省电) | ~1.0 mAh/h | 10-11 天 |
| Light Sleep (实时响应) | ~4.3 mAh/h | ~2.5 天 |
本项目遵循 MIT 许可证。
问题: Arduino IDE 上传失败,提示找不到设备
问题: 摄像头初始化失败
platformio.ini 中 BOARD_HAS_PSRAM)seeed_xiao_esp32s3_sense问题: BLE 无法连接
问题: flutter run 失败,找不到设备
flutter devices 查看设备是否被识别问题: API 连接失败
.env 文件是否正确配置问题: 蓝牙扫描不到设备
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| LED 不亮 | 未上电或程序错误 | 检查 USB 连接,重新烧录 |
| LED 快闪后常亮 | 拍照传输中 | 正常现象,等待传输完成 |
| LED 完全熄灭 | 深度睡眠或程序崩溃 | 短按 BOOT 键唤醒或重启 |
| App 闪退 | 权限未授予 | 检查蓝牙/位置/存储权限 |
| 照片接收失败 | BLE MTU 不匹配 | 等待自动协商或手动重连 |
感谢以下开源项目: OpenGlass, OpenClaw