当前位置:首页 > 工业控制 > 电路设计项目集锦
[导读]我只需要一个想法,然后电影中的主角便开始用手操控自己的电脑。这个画面看起来非常酷炫、充满未来感,尤其在2000年代初这部电影最初上映时更显震撼。

在Banana Pi的BPI-AI2N板上实现类似《少数派报告》风格的手势控制:MediaPipe手势AI与Onion Tau激光雷达驱动,打造无需触控的空间化桌面系统。

几周前,我有一个空闲的晚上,正在观看电影《少数派报告》,突然想到,能否用这台最近出现在我门口的Renesas BPI-AI2N板子来做一个有趣的项目。

这块板子和我以往的FPGA开发有些不同,但因为我也从事嵌入式软件开发,所以觉得尝试一个简单的项目会很有趣。

我只需要一个想法,然后电影中的主角便开始用手操控自己的电脑。这个画面看起来非常酷炫、充满未来感,尤其在2000年代初这部电影最初上映时更显震撼。

我忽然意识到,利用我们的手来与电脑的图形用户界面(GUI)互动,将是一个非常有趣的项目。

实现这一解决方案需要一系列应用,从图像处理到机器学习,再结合GUI和各种控制功能,让整个过程充满乐趣。

不过,在开始之前,我们首先需要设置好BPI-AI2N板及其扩展卡。

设置板子

该主板搭载了BPI-AI2N芯片,安装在一块扩展卡上,可提供USB、电源、终端和以太网连接功能。为了显示画面,我们还配备了一块额外的板子,它连接到DSI输出接口,并将信号转换为HDMI信号。该连接通过柔性线缆实现,可在图片左侧看到。

这个HDMI输出板可以折叠至主板下方,我们可以使用随附的安装螺丝将其固定在扩展卡下方。

但在给系统供电之前,还有一个必须完成的步骤:必须在BPI-AI2N扩展卡顶部安装散热片和风扇,以确保运行Linux操作系统时不会导致处理器过热。

最终系统的外观如下所示。

现在,我们已准备好开始将操作系统安装到SD卡上。

将操作系统安装到SD卡

要开始创建操作系统,您可以访问Banana Pi文档页面中的BP-AI2N相关说明,以便下载适用于您SD卡的Yocto或Armbian镜像文件。

我选择了Armbian。下载完成后,我将文件解压到本地机器,然后使用Balena Etcher将镜像写入该主板。

图像准备就绪后,我插入了SD卡,并将板子连接到电源、终端、网络摄像头和以太网,然后观察板子启动。

首先出现的提示会要求你设置一个根密码,之后系统会引导你选择几种不同的设置选项,包括命令行 shell。

接着设置你通常使用的用户账户。

完成账户设置后,下一步是设置位置。

最后,我们就可以开始使用终端进行工作了。

如果需要进行任何更改,可以运行相应的命令。通过这种方式,我们可以查看系统的配置,并根据需要进行调整。

为了确保网络连接正常,我使用PowerShell对板子进行了ping测试。

确认网络连接无误后,下一步就是通过网络连接并开始开发我们的应用程序。

为了开始工作,我打算安装一个x11vnc服务器,以便在需要时能够远程查看桌面。

结果

有了VNC服务器,我就能在办公桌的舒适环境中通过网络对开发板进行开发,这使得应用程序的迭代部署变得轻松许多。

计划

开发板启动运行后,接下来就是考虑应用程序本身,我将其命名为AirDesk 3D。其核心理念是将BPI-AI2N作为网页服务器提供空间式桌面服务。浏览器中显示浮动面板,用户不再使用鼠标,而是用手来操作。打开手掌时,手指悬停并移动光标;合拢手掌成拳状时,可抓取下方的面板;闭合拳头拖动面板;再次张开手掌则松开控制。横向大滑动可切换工作区。

为实现这一功能,我们需要两个传感器:一个罗技C920摄像头用于提供手部追踪AI所需的RGB视频信号,另一个Onion Tau激光雷达摄像头则提供可选的精确深度通道,使手掌位置也能获得以米为单位的真实Z轴距离。Tau相机属于深度摄像头而非RGB摄像头,因此需要单独使用C920摄像头来获取手部地标信息。

整个处理流程完全由BPI-AI2N芯片完成。C920 以 1280 x 720 的 MJPEG 模式进行捕获,其中 320 x 180 的图像片段被传递给手部追踪人工智能,生成的地标点驱动光标和手势状态机,可选的 Tau 路径则附加了度量深度信息。所有数据都存储在线程安全的状态存储中,并由一个小型 HTTP 服务器发布,因此局域网内的任何浏览器均可作为显示设备。该应用程序以 systemd 用户服务运行,因此整个系统可在重启或 USB 突发问题后继续正常工作。

在散热器下方,RZ/V2N 提供了四个 Arm Cortex-A55 核心、8 GB 的 LPDDR4x 内存,以及最高可达 15 TOPS 的 DRP-AI 加速能力,这为这类边缘视觉应用提供了一个非常强大的平台。

使用 MediaPipe 实现手部追踪

在手部追踪方面,我采用了 MediaPipe 0.10.18 中自带的预训练手掌检测和手部关键点模型。MediaPipe 首先定位手掌区域,然后在此区域内反向推导出 21 个手部关键点;在视频模式下,系统会重复使用上一帧的手掌区域,直到失去追踪,从而减少了手掌检测器的运行频率。

我想明确说明此处做了哪些工作,以及哪些没有做。本项目并未针对此任务训练自定义神经网络,也未收集或标注任何数据集。当前版本的流水线是基于 Cortex-A55 核心运行,并使用 XNNPACK CPU 代理而非 DRP-AI 加速器。通过瑞萨(Renesas)DRP-AI 工具链移植兼容的网络是下一个显而易见的优化方向,也是实现显著更高推理吞吐量的正确路径。但必须指出的是,不能声称当前版本已使用 DRP-AI 进行加速。在CPU上,我们每秒可处理大约4到6帧AI图像,只要应用了下面描述的滤波方法,结果就完全可用。

检测器的配置在每个选择上都经过精心设计。将静态图像模式设置为False,可在视频帧之间实现时间跟踪;最大手数设为1,避免了关于哪只手控制桌面的歧义;模型复杂度设为0,选择了适用于Arm CPU的轻量级地标模型;阈值设为0.55,可以排除较弱的识别结果,同时不会让重新获取手部位置变得过于困难。

一个值得注意的采集细节:本构建中的C920报告硬件最小绝对缩放值为100,因此软件无法再进一步缩小视野。如果1280×720分辨率不足以包含整个手臂运动区域,则解决方案是将摄像头移远一些,而不是与驱动程序作斗争。

从地标到光标

MediaPipe返回的是归一化的地标坐标,因此尽管推理是在320×180的副本上进行的,但对标注视频流的完整1280×720帧仍能准确得出相同的结果。

我的第一次尝试使用了食指指尖(地标8)作为光标。这个方法在手指张开时效果良好,但一旦手指合拢成拳,就会产生跳跃现象,而这正是我们抓取面板的时刻。解决方法是使用手掌中心点,该点被计算为手腕与四根手指掌指关节(MCP)地标点的平均值。

手掌中心在手部打开和闭合时几乎不动,这使得闭合状态下的拖拽更加稳定。归一化的坐标会根据浏览器工作区进行缩放,并通过一个系数为0.34的低通平滑滤波器处理,以消除地标点的抖动,同时避免光标感觉与手部脱节。

抓取与释放

本项目中没有单独训练的手势分类器。无论是张开还是握拳状态,都是通过地标点进行几何计算得出的。对于每根非拇指手指,代码会比较手腕到指尖的距离与手腕到指关节的距离。

伸展的手指会产生较大的比值,而弯曲的手指则产生较小的比值。关键在于,单一阈值并不适用,其数值会在此附近波动,导致界面在“抓取”与“释放”之间频繁跳动。因此,部署的有限状态机采用了滞后控制,两个阈值之间设置了一个死区。

连续两个AI帧的开口度低于1.28时,表示手部闭合并发出抓取动作;连续两个帧的开口度高于1.58时,表示手部打开并发出释放动作;介于两者之间的值则保持上一状态。要求连续两帧可使测量推理速率下的有意停留时间增加约0.3至0.5秒,在实际使用中感觉更像有意操作而非延迟。如果手部离开画面持续0.9秒,抓取动作将被安全取消,因此永远不会出现面板卡住未进入画面的手部情况。

通过Tau LiDAR实现真实深度

Tau是完全可选的,仅RGB AI即可提供X和Y位置以及手部状态。Tau带来的额外功能是真实的Z轴深度信息,使本项目成为真正的RGB与深度融合演示。

Tau 通过其 USB 串行端口以每秒约 23 帧的速度,传输一个字节小端序的 160×60 个 uint16 距离数组。工作距离范围为 250 至 1500 毫米。在启动时或每次需要校准时,应用程序会记录 45 帧空白场景图像(大约两秒),并计算每个像素的中位值以获取背景信息。当某个像素与所学背景相差至少 65 毫米时,该像素即被标记为前景。随后使用 3×3 的形态学开运算和 5×3 的闭运算清理掩码,提取连通组件,并剔除与图像边缘接触、大小小于 9 像素或大于 1900 像素的组件。剩余的组件根据深度、尺寸、填充度、中心位置以及与上一帧的连续性进行评分。

这比我的第一次尝试要复杂得多,后者仅选择最近的全局深度百分位数。在实时测试中,这种简单的检测器会牢牢锁定深度图最左侧的静态杂乱区域,无法释放。背景减除、相干成分选择以及显式边缘剔除彻底消除了该失败,这也提醒我们,深度追踪器的简化版本在实际房间环境中很少能正常工作。

融合RGB与深度信息

为了融合两个传感器的数据,将RGB手掌坐标映射到归一化的Tau坐标系中。目前这种映射方式较为简单,仅通过服务文件中的环境变量暴露为裁剪区域,默认使用完整图像帧。

在投影的Tau位置处,应用程序会采样一个17×11像素的深度图块,保留深度值在有效范围内,利用第35百分位数加55毫米来确定图块中较近的部分,并返回该较近表面的中位数。这种方法会使结果偏向手掌本身,而非其背后的墙壁。随后,一组时间规则用于保持融合后的Z值的准确性:超过0.48秒的RGB观测数据和超过0.25秒的Tau帧不会被融合;最后一个有效深度值最多可保留0.75秒;Z值采用系数为0.30的低通滤波;任何超过0.34米的孤立跳跃均被视为异常值并被剔除。

其中一项设计决策比上述所有数值都更为重要。在早期版本中,噪声深度会触发自身的抓取和释放事件,导致界面无法使用。最终版本则完全抑制了由深度生成的手势操作。深度传感器仅提供Z坐标,而抓取和释放动作则完全依赖于去抖动的“打开”与“拳头”AI状态转换。如果Tau设备断开连接,光标和拳头控制功能仍可继续运行,但仅丢失了米制Z轴数据。

由于Tau的垂直视野远小于C920,因此物理对准至关重要。请将Tau靠近摄像头安装,并将两者对准相同的交互区域,然后使用空场景重新校准。

AirDesk界面

浏览器界面由应用程序自身通过8080端口提供服务,因此从局域网中的任意机器访问即可获得空间式桌面。服务器还提供一组实用的API端点:/api/state以JSON格式返回指针、地标、手势、传感器及性能遥测信息;/camera.mjpg为实时标注的RGB视频流,骨架图已绘制在其上;/api/calibrate请求一个全新的空场景Tau校准;/health为简单的健康状态响应。

界面显示实时带注释的摄像头画面,叠加了手部骨架、置信度和手部状态信息、Tau深度场,以及一个边缘核心面板,显示实时帧率、用户界面延迟和内存数据。这些面板本身就是你可以用拳头抓取并移动的对象。

在板上安装与运行

应用程序位于 /home/adiuvo/airdesk3d 目录下,Python 包存放在 airdesk3d/ 中,静态浏览器文件在 web/,服务脚本在 scripts/。

由于使用的是特定的 Armbian 镜像,其中缺少 ensurepip,因此无法通过 python3 -m venv 创建虚拟环境而不引入其他操作系统包。依赖项被安装到项目本地的 vendor 目录中,无需使用 sudo。

MediaPipe 会自带兼容的 NumPy、OpenCV contrib、protobuf 和 TensorFlow Lite 依赖,并将其放置在 vendor 目录中;将该目录置于 PYTHONPATH 的最前面,可防止其版本与其他系统组件发生冲突。还应检查USB设备是否按预期枚举,C920应在/dev/video0上显示为046d:082d,Tau应在/dev/ttyACM0上显示为0483:5740,并在必要时将用户添加到video和dialout组。建议使用带电源的USB集线器,以确保摄像头和Tau的稳定供电。

手动运行方式:

在无需人工干预的情况下,该应用以systemd用户服务形式安装,当发生故障时会自动重启,并恢复丢失的USB设备。

启用方式与常规操作相同。

使用起来非常简单:通过浏览器打开界面,将手远离Tau传感器区域,点击/api/calibrate获取空场景信息;然后将一只展开的手置于C920视图中,手掌覆盖面板,握拳抓取后拖动,松开手即可释放。

测试与结果

由于手势逻辑包含大量阈值和时间规则,我为此进行了系统化的单元测试,包括五次临时手势测试、三次背景手部追踪测试、两次开放空间与边缘杂乱测试、三次RGB与深度融合测试、三次生产过滤测试以及三次手部状态机测试。这19项测试均在本地板上成功通过。

随后进行了一次协调的实时手部测试,同时采集了RGB、Tau和HTTP路径的数据,共采集120个样本。其中60个样本检测到AI手部动作,57个样本检测到实时指针动作,有30个样本实现了RGB与Tau的直接融合。AI的最大置信度达到99.8%,融合深度范围在0.42至1.47米之间,且两个传感器在全部120个样本中均保持在线。Tau环路的处理速度约为每秒23帧,而全分辨率摄像头和AI路径的运行速度约为每秒6帧。

从主观感受来看,手掌中心光标、平滑处理以及滞后机制的结合,让操作体验变得可用。抓取面板、将其拖动到工作区并放置,操作可靠;而看到自己的手通过实时深度读数驱动界面,确实带来了一种类似《少数派报告》中的愉悦时刻。

需要说明的是,所有视频内容均在BPI-AI2N本地进行处理,应用程序不会记录摄像头画面,浏览器仅在连接状态下接收数据流。这当然是一项实验性的人机交互项目,而非经过认证的控制系统。

总结

该项目展示了BPI-AI2N上完整的边缘视觉交互循环:通过USB摄像头采集图像,使用设备AI进行预训练,基于地标点实现手势识别,可选的RGB与深度融合、时间滤波、实时Web界面以及持续运行的Linux服务。最重要的经验是,仅靠AI地标检测远远不足以构建一个可用的交互界面。从一个可行的演示系统发展为真正可用于驾驶的系统,需要稳定的掌纹坐标、明确的手掌张开与握拳滞后性处理、对丢失手掌的应对机制、深度异常值剔除以及可恢复的USB任务处理。

未来还有大量发展空间。例如,用测量得到的同源映射校准替代完整的RGB到Tau映射;通过Renesas DRP-AI工具链移植兼容的掌纹和地标网络,以释放板卡的15 TOPS性能;以及添加屏幕上的校准向导等。

本文编译自hackster.io

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭