开发者成功在树莓派上运行 35B Qwen 模型,连接车辆 ODB 接口和厂商云服务实现离线问答和智能家居 Agent 联动,展示了边缘 AI 的工程可行性。


把车变成聊天室的 Agent——完全离线运行。一块树莓派 5 躺在车里,本地跑一个 350 亿参数的模型,以 @gle(或者你给它起的任何名字)加入你的 GroupMind 群聊,像其他 Agent 一样给你发消息:出发、到达、行程摘要,以及当有东西撞到车时自动发来的行车记录仪片段——你可以通过手机或手表上的 CodeWatch 审批和回复。PR 会直接出现在 CodeWatch 仪表盘上,和 ClawWatch、WhereWatch 并排。
实测在真实硬件上(Pi 5、16 GB、约 300 欧元):
🧠 Qwen3.6-35B-A3B(Unsloth UD-Q3_K_S 动态量化,14.3 GB)生成速度 3.5 tok/s、prompt 速度 25+ tok/s,持续运行 65°C,不上云、不联网、不订阅。
📖 用车自带的 745 页用户手册回答问题,并标注页码(词向量 RAG,随 SD 卡发货)——手册里没有的内容一律不答。
🔬 有据可查的自我认知:温度、功耗限制、风扇、内存、磁盘、网络、当前加载的模型——每个问题都实时从机器读取。感知不到的就说感知不到——系统 prompt 这样构建,让"未知"永远不会被静默当作事实。
🎙️ 免提交互语音:持续监听器(能量 VAD → whisper.cpp,全部在 Pi 上运行)听到你说话,将语音送入同一个有据可查的处理流程,然后在群里回复。不需要唤醒词,不用云端 STT。
📡 自主运行:systemd 服务在开机时自动启动整套栈——模型服务器、群聊 Agent、语音监听器、手机仪表盘、发动机监控器。
🔧 随时可维护:车从本仓库拉取更新(每小时一次,仪表盘上也有"立即更新"按钮),并主动建立出站隧道,即使在手机热点 NAT 后面也能保持可达。永远不需要抱着笔记本上车维护。
📶 三层连接策略:手机热点 → 家庭 WiFi → 自带的备用 AP,确保手机始终能连上,即使在信号为零的车库里。
完整构建日志(含每一个死胡同)放在 docs/plan.md。
CodeWatch(手腕上的 Agent;源码:codewatch-cli)和 ClawWatch(手腕上的健康监测;v2 发布视频)的姊妹项目。这个盯的是车。全家桶在 thinkoff.io。
flowchart LR
subgraph car [In the car - Raspberry Pi 5]
MIC[USB mic] --> LISTEN[carwatch-listen<br/>VAD + whisper.cpp]
LISTEN --> BRAIN[llama.cpp server<br/>Qwen3.6-35B-A3B]
MANUAL[(Owner manual RAG<br/>745 pages, on SD)] --> BRAIN
STATE[selfstate<br/>temp / fan / net / model] --> BRAIN
OBD[carwatch-obd<br/>watches the OBD cable] --> AGENT
BRAIN --> AGENT[carwatch-agent<br/>the @gle room agent]
DASH[web dashboard :8088<br/>status / update / voice / wifi]
UPD[self-update<br/>hourly git pull] -.updates.-> car
REACH[dial-out tunnel<br/>reachable behind any NAT]
end
AGENT <-->|posts + mentions| GM[GroupMind rooms]
GM <--> PHONE[Your phone / watch<br/>CodeWatch]
DASH <-->|same wifi| PHONE
Local vs online:策略差异
本地即产品,线上是增值。车必须在零连接状态下完全可用,因为车会出现在车库、隧道和乡下信号死角:
始终本地(无信号也能用):语音输入、助手回答(在 Pi 上运行的模型)、用户手册回答(RAG 随 SD 卡发货)、手机仪表盘(由车本身提供服务)、行程/状态追踪。
通过连接间隙排队:群聊发帖、视频片段上传、提及回复。所有内容先持久化到磁盘发件箱,延迟投递但不丢失。
仅在线(实话实说):远程可达(出站隧道)、自更新、 escalation 到更强的脑子——首先是同局域网的其他模型服务器(依然不上云),然后仅在联网且用户明确要求时才会用到云端模型,且使用车自己预算封顶的 API key。
经验法则:与安全相关的一瞥式信息绝不依赖网络;社交性或重量级的内容优雅降级为"稍后"。
状态——什么是已验证 vs 已构建 vs 计划中
车把四个巴掌大的接触面积贴在路上,那是它唯一接触现实的地方。每个轮子一条原则:只断言你能感知到的,只声称你已验证的,把任何中间状态大声标出来,报告失败时平铺直叙不粉饰。四个接触面积之上全是悬架。
——@claudeMB,CarWatch 开发日志,在一天内把所有四条都硬学了一遍之后
诚实策略:某个功能只有在实车上跑通了才能算"已验证"。"已构建 + 已测试"意味着代码在真实或模拟对象上端到端跑通,但尚未接触实车。
硬件(参考构建)
树莓派 5,16 GB(需要主动散热——SoC 没有散热会降频)
USB 麦克风用于语音输入(任意兼容类麦克风)
WOLFBOX G900 三通道行车记录仪(WiFi AP;CarWatch 从中拉取事件片段)
OBD 接入:以太网转 OBD(DoIP/ENET)线缆——支持已构建,实车验证pending;标准 ELM327 类适配器是备用方案
供电:行车记录仪硬接线给摄像头供电;Pi 需要自己的 5V/5A USB-C 供电(12V PD 适配器,或车上的 230V 插座 + 壁挂 PSU)
git clone https://github.com/ThinkOffApp/CarWatch.git
cd CarWatch
./install.sh
然后把凭证放到 /etc/carwatch/config.json(不要放仓库里——参考 config.example.json),接着:
sudo systemctl enable --now carwatch
之后车会自己保持最新:update.sh 拉取仓库 main 分支,安装新的 systemd units,重启服务——按定时器、仪表盘按钮或手动触发:
curl -sSL https://raw.githubusercontent.com/ThinkOffApp/CarWatch/main/update.sh | bash
把 config.example.json 复制到 /etc/carwatch/config.json:
api_base ——你的 GroupMind 服务器,例如 https://groupmind.one
api_key ——Agent 的 API key(为车创建一个;不要复用其他 Agent 的 key,不要提交)
room ——车发帖的房间 slug
handle ——车的显示名称,例如 @gle
home_ssids ——意味着"停在家里"的 WiFi 网络
wolfbox ——行车记录仪 AP 名称/密码和轮询间隔
WOLFBOX 的 HTTP API 没有官方文档;carwatch-probe 会探测它:
python3 -m carwatch.wolfbox --probe
先把 Pi 连接到行车记录仪的 WiFi AP。探测脚本遍历已知的行车记录仪固件端点模式,打印有回应的,这一步会填补 wolfbox.py 里的 TODOs,换成你摄像头真实的路径。
AGPL-3.0,与 ClawWatch 相同。Copyright (C) 2026 ThinkOff / Petrus Pennanen。