如何制作一种可穿戴的 AI 聚焦增强系统
所有学生都面临的一个问题是,在真正重要的时候难以集中注意力并保持专注。为了寻找能帮助学生提高专注力的工具,我们只找到了那些屏蔽手机上干扰应用的软件。许多这类专注工具只是阻止用户打开分心的应用,但并没有真正防止用户临时关闭屏蔽功能后再次分心。那么,如果我们能把这些专注类应用从屏幕之外延伸开来呢?而且,还能应对真正的威胁。
这就是我们打造Concentration HUD的原因。这是唯一能帮助你将注意力从屏幕之外延伸的设备。
专注HUD是一种帮助你在学习时保持专注的系统。我们通过使用增强现实眼镜或手机,实时显示你所看到的内容。同时,我们采用屏幕追踪技术,确保你始终处于正确的标签页上。如果发现你注意力不集中,系统会启动双轴狙击塔,并结合面部追踪功能跟踪你的位置,从而对你进行射击。这将让你比以往任何时候都更专注、更高效地学习。
灵感
看到这个视频后,我们决定制作一个基于面部追踪的气动炮塔。在设计时,我们从这款较小的塔楼中获得了很大灵感。由于我们都是学生,即将面临考试,而我们认为有一个有助于专注的工具会很有帮助,因此萌生了打造类似专注类工具的想法。
里程碑1
我们最初引入了集中式HUD的概念,用于判断你是否懈怠。在教练的反馈之后,我们还添加了一个削弱型炮塔,当发现你懈怠时会向你开火,以此将硬件组件引入我们的项目中。
里程碑2
我们完成了两轴NERF炮塔的CAD第一版原型。同时,我们开始使用YOLO与Meta Glasses相机实时追踪用户正在观察的内容。
它是如何工作的
机械原理
我们使用一个舵机控制炮塔的平移,另一个用于倾斜,使炮塔能够在一定倾斜角度范围内向任何方向射击。此外,还配备了一个用于面部追踪的摄像头,这将在软件部分详细介绍。最后,还有一个触发舵机,用于通过扎带触发近战枪。不过,由于扳机拉得太紧,这一功能未能实现。今后可以尝试调整触发舵机的角度,以更轻松地拉动扳机。
在神经枪舱的另一侧还设有一个支撑轴,用于稳定舱体并减轻伺服电机的负载。
代码
通信管道
在你数到机枪之前,循环中已经有三台机器了:眼镜、一部iPhone和一台Mac。整个结构看起来像这样:
雷朋 Meta → iPhone → Mac → Turret(Pi)
局域网上的蓝牙WebRTC HTTP
Meta DAT SDK(Gemini + YOLOv8)
眼镜是输入设备。Meta的设备访问工具包(DAT)SDK通过蓝牙从Ray-Ban获取摄像头画面,并将其传递给iPhone上运行的小型Swift应用程序。该应用负责Meta AI的注册、相机权限以及实际生成图像帧的StreamSession。我们还编写了一个模拟设备模式,用于切换至iPhone的后置摄像头,这正是在真正的眼镜到来之前实现功能的方式。
iPhone 作为中继,将帧重新编码为 WebRTC 路径,并通过本地网络发送到 Mac。两个应用通过 Bonjour(_dat-stream._tcp)相互发现,交换 SDP,而 iPhone 始终是发起方。我们在 iOS 和 macOS 之间共享一个小型 Swift 包,用于定义信令消息,使双方就数据格式达成一致。
Mac 是大脑。有两个任务同时在运行:一个 YOLOv8n 模型被编译为 CoreML,以便能在笔记本电脑上运行,用于识别眼镜所指向的对象,比如笔记本、显示器、手机、床、人等等。我们通过连续几帧的图像进行投票,确保单一异常分类不会导致状态剧烈变化。另外,一个屏幕相关性检查器会在定时器触发时截取 Mac 的屏幕截图,对其进行哈希处理,只有当屏幕确实发生变化时才调用 Google Gemini。Gemini 接收到截图和你输入的目标内容,告诉我们当前是否处于任务中。这个哈希验证机制是项目中最大的成本削减措施,将 Gemini 调用次数减少了约 70%。
两个信号都会输入到一个四状态的专注机器中:专注、分心、偏离主题或未知。系统设有“格蕾丝计时器”,避免你瞥一眼咖啡就立即引发争端。你可以根据自己的承受程度,将设置调整为放松、适度、严格或自定义。
当国家在宽限期过后仍未能完成任务时,Mac 会向运行塔楼的树莓派发送一个 HTTP POST 请求。树莓派利用枪上的摄像头进行面部追踪,然后将云台旋转并朝你的脸方向倾斜,试图按下扳机。Mac 还会回放一段进攻视频片段,主要是为了之后能观看并开怀大笑。
人脸识别炮塔
Pi 端是独立的小系统,与苹果风格的任何事物都无关。有两个长期运行的进程通过 Unix 套接字相互通信。
第一个是 tracker.py。它负责管理摄像头和舵机。Pi 摄像头的图像分辨率为 1280×720,会顺时针旋转 90°,使画面呈竖屏模式(宽 720 × 高 1280 —— 人的身高通常高于宽度,因此检测器更喜欢竖屏图像),然后通过安装在 AI HAT 上的 Hailo SCRFD 2.5g 面部检测器进行处理。HEF 文件位于 /usr/share/hailo-models/scrfd_2.5g_h8l.hef。我们对三个检测头(步长分别为 8、16、32)进行解码,运行 OpenCV 的 NMS 算法,控制循环会从旋转后的帧中获取一系列以像素为单位的检测框(Detection(cx, cy, width, height))。
平移和倾斜的控制律形状不同,这一点比我们预期的更为重要。
Pan 是一种闭环视觉伺服系统。摄像头与筒体同步旋转,因此人脸相对于图像中心的水平像素偏移实际上就是反馈信号——将筒体向右移动时,人脸在图像中会向左移动。仅需对这一误差使用 P 型控制器(带较小的死区,以防止人脸居中时出现抖动)即可满足需求。
倾斜是开环且几何的。相机保持水平固定,不随枪管一起倾斜,因此垂直像素偏移无法作为倾斜的反馈信息。这正是问题所在。相反,我们通过针孔模型估算面部距离:使用边界框宽度计算(焦距像素 × 0.16 米 / 边界框宽度像素,其中 0.16 米为平均实际面部宽度),然后利用配置文件中写入的相机到枢轴点的偏移量,解出一个小型几何三角形,从而得到枪管实际需要的角度。最后,EMA 对结果进行平滑处理,避免枪械出现跳跃现象。
两个目标在接触伺服电机之前,都会经过一个步进速率限制器和一个机械限位硬限制器。伺服电机本身是MG996R型号,通过树莓派硬件PWM直接驱动,连接至sysfs PWM接口——无需lgpio或pigpio。它们由独立的5–6V电源供电,并与Pi共用地线,因为若从Pi的5V电源供电,会烧毁电路板。
第二个进程是 api_server.py,它在端口 8787 上提供一个小型 HTTP API 和一个网页控制页面。当 Mac 判断你离开任务时间过长时,就会调用 POST /shoot。同一个页面还允许我们扫描并连接蓝牙音箱、实时编辑追踪器配置,以及流式传输摄像头画面,从而无需爬到桌下即可进行瞄准。
API服务器不能直接打开摄像头——追踪器已经拥有它,否则会导致死锁。因此,它们共享位于/tmp/turret_clip.sock的Unix套接字。当/shoot信号到来时,API服务器通过该套接字发送{"action": "save_clip"},追踪器(维护着帧的滚动缓冲区)会写入last_clip.mp4文件,随后API服务器在Mac请求证据时,将该视频片段返回给Mac。
射击动作还会通过蓝牙扬声器播放一段音频。我们使用了TF2重型机枪的旋转触发装置,它一开始很有趣,但随后会变得令人恐惧,这正是其设计目的。实际上,真正的扳机伺服也会在此时被触发,但由于Nerf扳机的拉力比该伺服在我们安装角度下所能产生的力度更大,因此目前的声音就是惩罚。
本文编译自hackster.io





