用 reCamera 打造一个会提醒你的「坐姿矫正器」 - reCamera Gimbal 2002w 8GB - dongxiang0607 - CodeCraft Hub
Scene: Maker. Edge AI application on CodeCraft Hub for Maker use cases.
Devices / BOM: reCamera Gimbal 2002w 8GB
Maker application on CodeCraft Hub. 一个无代码 + 一个 Function 节点,把 reCamera、一个自训练 AI 模型和飞书机器人串起来,让 AI 替你盯着自己的坐姿与久坐时间。
Documentation
一、为什么要做这个
久坐、低头看手机、前倾趴桌已经成了大多数程序员、设计师、学生的「默认状态」。颈椎、腰椎和视力都在替我们慢慢买单。
市面上有很多软件型的坐姿提醒,但它们要么基于固定时间间隔粗暴打扰,要么需要你戴一个额外的传感器。
借助 Seeed Studio reCamera 自带的本地 AI 推理能力 + 内置 Node-RED,我们完全可以做一个:
完全离线、不上传画面 ,隐私安全
真正基于姿态识别 ,而不是傻瓜定时器
不打扰 ,会防抖、会限流、会区分「真的离开」和「短暂走开」
能联动飞书 / 钉钉 / 企微/邮件等通知通道
下面是它最终长这样。
二、它能做什么
整套系统会持续监控你的坐姿状态并把结果写到 Node-RED 节点的状态栏上。当满足条件时,会通过飞书机器人主动提醒。
具体规则:
坐姿提醒 :检测到低头或前倾 累计 ≥ 5 秒 (允许中间夹杂少量正常帧,不会立即打断计时),就推送一次提醒。
限流 :坐姿提醒最多 1 分钟一次 ,不会刷屏。
久坐提醒 :连续在位坐满 45 分钟 首次提醒,之后每 5 分钟 再提醒一次,文案会自动把分钟数显示成「X 小时 Y 分钟」。
离座清零 :必须连续 15 秒 都判定为无人,才会把久坐计时清零;短暂转身、起来拿杯水不会让你之前的 30 分钟白白被重置。
多帧投票 :用最近 10 帧的多数票判定「是否有人」,模型偶尔抖动一帧不会让状态翻转。
刚入座缓冲期 :刚坐下的前 10 秒不报坐姿,避免人还没坐稳就误报。
三、整体架构
Code snippet included — open the application page to copy it.
四、你需要准备什么
硬件
reCamera 一台 (任意支持 SenseCraft AI 训练 + Node-RED 的版本均可)
网线(type-c数据线)或 WiFi 网络
一台能打开浏览器登录 reCamera Web 界面的电脑
账号 / 服务
SenseCraft AI 账号 (用于训练模型)
飞书账号 (用于创建一个「自定义机器人」webhook)
Deploy steps
- 步骤 1:训练你自己的坐姿模型
5.1 采集图片
在 reCamera 自带的 SenseCraft AI 训练界面里直接用摄像头拍即可。建议:
每类至少 200 张
同一个工位拍 不同时间、不同光照、不同穿着
noperson 要拍出 多种空场情况 :椅子拉出 / 推入 / 桌上有杂物 / 没杂物 / 不同时段的光线
低头/前倾要拍 不同程度 :轻微弯腰、明显趴桌、低头看手机、低头写字……
5.2 训练 & 部署
在 SenseCraft AI 里点击「Train」,等几分钟训练完成后,直接「Deploy」到 reCamera。
部署完成后,可以在 reCamera 自带的预览页打开「Confidence」滑块查看每帧 4 类的置信度。这一步是验证模型是否学得对的最直接方式。
- 步骤 2:理解 model 节点输出的数据结构
打开 Node-RED,把 model 节点连一个 debug 节点,先看清模型输出到底是什么样。
实际样本:
Code snippet included — open the application page to copy it.
关键字段含义:
classes[i] = [score, classIndex] :第 i 条检测的得分(INT8 量化后的 logit,注意 可以是负数 )和它在模型类别字典里的索引。
labels[i] :第 i 条检测对应的人类可读标签,与 classes[i] 一一对应。
类别字典固定为: 0=forward, 1=headdown, 2=noperson, 3=normal
- 步骤 3:写 Node-RED 的判断逻辑(核心 Function 节点)
新建一个 Function 节点 ,命名为 posture 检测和通知 ,连接顺序:
Code snippet included — open the application page to copy it.
Posture 检测和通知 这个节点会做以下几件事:
从每帧 msg.payload.data.classes/labels 里挑出 最高分 的那一类作为当帧姿态;
把当帧姿态喂进一个 多帧投票队列 (最近 10 帧),稳定地决定「有人 / 无人」;
用两套状态机分别管理「坐姿不良会话」和「久坐会话」;
满足提醒条件时,组装出包含 msg.url 、 msg.method 、 msg.headers 、 msg.payload 的对象,交给下游 http request 节点发飞书。
节点底部状态栏会实时显示当前状态,例如:
🟢 normal sit=12m:在位正常坐姿,已坐 12 分钟
🟡 forward 3s sit=23m:在位前倾,已持续 3 秒,已坐 23 分钟
⚪ no person (8s):判定无人 8 秒中(还没到 15s 不会清零)
🔵 settling 7s sit=0m:刚坐下,前 10s 内不报坐姿
🔴 FIRED ×1 @19:23:41:刚触发了一次飞书提醒
- 步骤 4:连飞书机器人
在飞书群里创建机器人
任意一个飞书群里,「设置」→「群机器人」→「添加机器人」→「自定义机器人」。 设置一个名字(例如「坐姿守护」),然后会得到一个 Webhook URL。
把 URL 填进 send-msg.js
Code snippet included — open the application page to copy it.
配置 http request 节点
http request 节点保持以下默认即可(URL 由 Function 节点动态写入 msg.url ):
Method : set by msg.method
URL : 留空
Return : a UTF-8 string
部署整套 flow,正常情况下,3~5 秒内就能在飞书群看到第一条来自机器人的「在线」式提醒(你可以临时把 sustainMs 改成 2s 来快速验证)。