logo
0
0
WeChat Login
Zcc<zcxywy@126.com>
feat: Initial Eye-Claw project with mobile app, firmware and OpenClaw plugin

👁️ Eye-Claw:OpenClaw 的“眼睛”

“我想了解一切的一切。”——萨曼莎,《她》(2013)

Eye-Claw 是一款售价 20 美元的 DIY 硬件扩展,适用于 OpenClaw 智能体。它能将你的 AI 从基于文本的观察者升级为主动式多模态智能体,实时感知、记忆并理解你的物理世界。

🌟 为什么要有 Eye-Claw 这个项目?

传统的 AI 智能体存在于聊天框中。而 Eye-Claw 则存在于你的生活中。它通过将低功耗的“心跳”机制与基于边缘的视觉感知相结合,构建了你生活的数字孪生体。 只需一份披萨的价格(20 美元),即可打造你自己的 AI 眼镜。 它不会等待你的提问。它会识别你的习惯、辨认你的物品,并在你意识到需要之前,悄悄地提供有用的信息。

Eye-Claw

核心功能

眼镜端 (Firmware)

  • 定时抓拍: 8-60 秒可调的自动抓拍间隔 (默认 8 秒,可配置)
  • 按键触发: 短按 BOOT 键拍照,长按 3 秒进入深度睡眠
  • 智能查重: dHash 感知哈希算法,自动跳过相似场景
  • 低功耗设计: Deep Sleep ~1mAh/h,Light Sleep ~4.3mAh/h
  • 3D 打印外壳: 可穿戴设计,下载模型

手机端 (Mobile App)

  • 蓝牙连接中心: 自动扫描、连接、MTU 协商
  • 实时图像接收: 分片重组、自动保存本地相册
  • 云端上传: 图像上传到 OpenClaw 进行分析
  • 自动优化: 图像质量分析、相机参数自动调整
  • 相册管理: 本地存储、缩略图预览、详情查看
  • 调试控制台: 实时查看固件串口日志

OpenClaw 插件 (云端大脑)

  • VLM 视觉理解: 使用视觉语言模型分析图像内容
  • 对象识别: 识别图像中的物体、场景、文字
  • 视觉记忆归档: 按时间归档视觉日志,支持时间轴检索
  • 智能描述生成: 自动生成图像的自然语言描述

技术架构

┌─────────────────────────────────────────────────────────┐ │ 眼镜端 (感知层) │ │ 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 # 本文档

快速开始

环境要求

  • 固件开发: PlatformIO (推荐) 或 Arduino IDE + ESP32-S3 支持
  • 手机开发: Flutter 3.0+ SDK (>=3.0.0 <4.0.0)
  • 硬件: Seeed XIAO ESP32-S3 Sense 开发板

App 界面

  • 依赖库:
    • NimBLE-Arduino@^1.4.1
    • esp32-camera@^2.0.0

固件烧录步骤 (Arduino IDE)

1. 安装 Arduino IDE

下载并安装 Arduino IDE (推荐 2.x 版本)

2. 添加 ESP32 开发板支持

文件 -> 首选项 -> 附加开发板管理器网址 添加: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json 工具 -> 开发板 -> 开发板管理器 搜索 "ESP32" 并安装 "ESP32"

3. 安装依赖库

项目 -> 加载库 -> 管理库 搜索并安装以下库: - NimBLE-Arduino by h2zero (版本 ^1.4.1) - esp32-camera by espressif (版本 ^2.0.0)

4. 配置开发板

工具 -> 开发板 -> 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

5. 打开项目并烧录

文件 -> 打开 -> 选择 firmware/firmware.ino # 使用 USB 数据线连接 XIAO ESP32-S3 Sense # 确保端口正确 (工具 -> 端口 -> 选择对应的 COM 端口或 /dev/ttyACM*) # 点击上传按钮 (→) 或使用快捷键 Ctrl+U

注意: 如果上传失败,尝试按住 BOOT 键再插入 USB,然后点击上传

6. 查看串口日志

工具 -> 串口监视器 (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 状态指示

  • 慢闪 (每 500ms): 等待蓝牙连接
  • 常亮: 蓝牙已连接,正常工作
  • 快闪: 正在拍照传输
  • 急促闪烁 5 次后熄灭: 进入深度睡眠(长按按键 3 秒触发)

OpenClaw 插件部署

环境要求

  • OpenClaw: >= 2026.1.26
  • Python: 3.8+
  • 依赖库: requests, Pillow
  • VLM 服务: Ollama, LocalAI 或兼容 OpenAI API VLM的服务

1. 安装插件

# 将插件复制到 OpenClaw 插件目录 cp -r openclaw /path/to/openclaw/plugins/ # 或使用符号链接(开发推荐) ln -s $(pwd)/openclaw /path/to/openclaw/plugins/eye-claw

2. 配置环境变量

# 必需:VLM 服务端点 export EYE_CLAW_VLM_URL=http://localhost:11434/v1/chat/completions # 可选:存储路径 export EYE_CLAW_STORAGE_PATH=./uploads export EYE_CLAW_MEMORY_PATH=./memory

3. 安装 Python 依赖

cd openclaw # 创建虚拟环境(推荐) python3 -m venv venv source venv/bin/activate # Linux/Mac # 或 venv\Scripts\activate # Windows # 安装依赖 pip install requests Pillow

4. 配置 VLM 服务

支持任何兼容 OpenAI API 的视觉语言模型服务:

Ollama 示例:

# 安装 llava 模型 ollama pull llava # 启动服务 ollama serve

配置验证:

# 测试图像分析 cd openclaw python services/analyze_image.py /path/to/test/image.jpg

5. 启动 OpenClaw

# 启动 OpenClaw(插件会自动加载) openclaw # 验证插件加载成功 # 控制台应显示: [eye-claw] Plugin loaded

记录服务端点:启动后会显示服务地址(如 http://localhost:18888),这个地址需要在手机 App 的 .env 文件中配置。

6. 配置 Soul(定义 AI 如何使用视觉记忆)

现在你的 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,例如:

  • 添加特定的使用场景(工作记录、旅行日志、学习辅助)
  • 定义记忆的保留策略(自动删除旧数据)
  • 设置隐私规则(哪些场景不记录)

7. (可选) 创建 Web 画廊查看器

如果你想在浏览器中查看上传的图片和 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

功能特点

  • 📸 缩略图网格展示所有上传的图片
  • 📝 显示 AI 解析的类别、物体列表和描述
  • 🔍 支持按日期、关键词搜索记忆
  • 🔄 实时刷新(可选 WebSocket 或定时轮询)
  • 📱 响应式设计,支持手机访问

自定义建议: 你可以让 OpenClaw 根据需求扩展功能:

  • 添加图片删除/归档功能

  • 导出记忆为 PDF/JSON

  • 添加标签和分类

  • 集成地图显示 GPS 位置(如果照片包含位置信息)

    Web 界面


手机应用启动测试步骤

1. 环境配置

# 确保已安装 Flutter flutter --version # 检查 Flutter 环境 flutter doctor

2. 配置 API 连接 (重要)

前提:确保已完成上面的 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

3. 安装依赖

# 安装 Flutter 依赖 cd mobile flutter pub get # iOS 特有 (仅限 macOS) cd ios pod install cd ..

4. 运行应用

# 连接手机或启动模拟器 # 查看可用设备 flutter devices # 运行应用 flutter run # 或指定设备运行 flutter run -d <device-id>

5. 运行测试

# 运行所有测试 flutter test # 运行单个测试文件 flutter test test/widget_test.dart # 运行特定测试 flutter test --name="Counter increments smoke test"

6. 代码检查与格式化

# 静态代码分析 flutter analyze # 格式化代码 flutter format lib/ test/

7. 构建发布版本

# Android APK flutter build apk # Android App Bundle flutter build appbundle # iOS (仅限 macOS + Xcode) flutter build ios

端到端测试流程

完整验证步骤

  1. 固件端:

    cd firmware pio run -t upload pio device monitor

    确认输出: [Eye-Claw] BLE ready 且 LED 慢闪

  2. 手机端:

    cd mobile flutter pub get flutter run
  3. 连接测试:

    • 打开手机 App
    • 点击"扫描设备"
    • 找到 Eye-Claw 设备并连接
    • 观察固件 LED 变为常亮
    • App 显示"已连接"状态
  4. 拍照测试:

    • 短按固件 BOOT 按键 (GPIO 0)
    • 观察 LED 快闪
    • App 应收到照片并显示缩略图
    • 串口日志显示传输进度

    App 界面

  5. 自动抓拍测试:

    • 在 App 中设置抓拍间隔 (8-60 秒)
    • 观察固件按设定间隔自动拍照
    • App 实时显示新照片
  6. 关机/唤醒测试:

    • 长按 BOOT 键 3 秒
    • LED 急促闪烁 5 次后熄灭
    • 固件进入深度睡眠
    • 再次短按 BOOT 键唤醒设备

    App 界面

  7. OpenClaw 云端测试:

    • 确保 OpenClaw 插件已部署并运行
    • 检查 VLM 服务状态:curl $EYE_CLAW_VLM_URL
    • 触发拍照后,查看 OpenClaw 日志确认图像分析
    • 验证视觉记忆文件生成:memory/YYYY-MM-DD.md

ClawLink-Lite 协议

自定义 BLE GATT 传输协议:

服务与特征

UUID类型说明
4fafc201-1fb5-459e-8fcc-c5c9c331914bServiceEye-Claw 主服务
beb5483e-36e1-4688-b7f5-ea07361b26a8Notify图像数据接收
beb5483e-36e1-4688-b7f5-ea07361b26a9Write指令发送
beb5483e-36e1-4688-b7f5-ea07361b26abNotify调试日志

图像数据包格式

数据通过 Notify 特征分片传输:

[Seq High (1B)][Seq Low (1B)][Payload (N Bytes)]
  • Seq: 16-bit 包序号,从 0 开始递增
  • Payload: 最大 512 字节 (MTU 协商后)
  • 结束标记: [0xFF, 0xFF] 表示传输完成

传输性能

  • 分辨率: VGA 640x480 JPEG
  • 典型大小: 15-30KB
  • 传输时间: 2-5 秒 (取决于图像大小和信号质量)
  • MTU: 协商至 512 字节

路线图

阶段目标状态
Phase 1骨干链路打通 (E2E 闭环)✅ 已完成
Phase 2传输与可靠性优化 (分片重组 + dHash 查重)✅ 已完成
Phase 3多模态交互增强 (语音唤醒 + RAG 归档)🔄 部分完成
Phase 4功耗与自动化策略 (Deep Sleep + GPS 策略)🔄 部分完成
Phase 5硬件产品化 (3D 打印外壳 + 续航优化)📋 待开始

已完成功能

  • ✅ 按键触发拍照
  • ✅ VGA JPEG 图像捕获
  • ✅ BLE 分片传输
  • ✅ dHash 智能查重
  • ✅ 手机端图像接收与重组
  • ✅ 本地相册存储 (SQLite)
  • ✅ OpenClaw 云端 VLM 分析
  • ✅ Deep Sleep 低功耗模式
  • ✅ 自动相机参数调整
  • ✅ 调试日志实时查看
  • ✅ 3D 打印可穿戴外壳 — 下载模型

待开发功能

  • 📋 语音唤醒词检测 (ESP-SR)
  • 📋 手机端 ASR 语音转文字
  • 📋 视觉 RAG 归档 (ChromaDB)
  • 📋 GPS 隐私模式自动禁拍
  • 📋 IMU 运动状态检测

依赖版本

手机端 (pubspec.yaml)

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 # 代码规范

硬件端 (platformio.ini)

lib_deps: h2zero/NimBLE-Arduino@^1.4.1 # BLE 协议栈 espressif/esp32-camera@^2.0.0 # 摄像头驱动

续航估算 (300mAh 电池)

模式功耗续航
Deep Sleep (极致省电)~1.0 mAh/h10-11 天
Light Sleep (实时响应)~4.3 mAh/h~2.5 天

许可证

本项目遵循 MIT 许可证。

故障排除

固件问题

问题: Arduino IDE 上传失败,提示找不到设备

  • 解决:
    • 检查 USB 数据线是否支持数据传输(有些线只支持充电)
    • 安装 CH340/CP210x 驱动(Windows)
    • 尝试进入烧录模式:按住 BOOT 键,插入 USB,松开 BOOT 键,再点击上传
    • 检查端口选择是否正确(工具 -> 端口)
    • Linux 用户可能需要添加 udev 规则

问题: 摄像头初始化失败

  • 解决:
    • 检查 PSRAM 是否启用(platformio.iniBOARD_HAS_PSRAM
    • 确认使用正确的 board 定义 seeed_xiao_esp32s3_sense
    • 检查摄像头排线是否插紧

问题: BLE 无法连接

  • 解决:
    • 确认手机蓝牙已开启
    • 检查 App 是否有蓝牙权限(Android 需要位置权限)
    • 重启固件和手机蓝牙

App 问题

问题: flutter run 失败,找不到设备

  • 解决:
    • 确保手机已开启开发者模式和 USB 调试
    • 重新插拔 USB 线
    • 运行 flutter devices 查看设备是否被识别

问题: API 连接失败

  • 解决:
    • 检查 .env 文件是否正确配置
    • 确认手机和服务器在同一网络(或服务器可公网访问)
    • 检查防火墙设置

问题: 蓝牙扫描不到设备

  • 解决:
    • Android: 确保已授予位置和蓝牙权限
    • iOS: 在 Info.plist 中添加了蓝牙描述
    • 确保固件已上电并处于慢闪状态

常见问题速查

现象可能原因解决方法
LED 不亮未上电或程序错误检查 USB 连接,重新烧录
LED 快闪后常亮拍照传输中正常现象,等待传输完成
LED 完全熄灭深度睡眠或程序崩溃短按 BOOT 键唤醒或重启
App 闪退权限未授予检查蓝牙/位置/存储权限
照片接收失败BLE MTU 不匹配等待自动协商或手动重连

致谢

感谢以下开源项目: OpenGlass, OpenClaw