如何使用加速度计进行手势识别
Posted
技术标签:
【中文标题】如何使用加速度计进行手势识别【英文标题】:How to do Gesture Recognition using Accelerometers 【发布时间】:2010-09-16 23:20:16 【问题描述】:我的目标是通过安装在太阳黑点上的加速度计识别简单的手势。一个手势可以像旋转设备或以几种不同的动作移动设备一样简单。该设备目前只有加速度计,但我们正在考虑添加陀螺仪,以使其更容易/更准确。
有没有人有关于如何做到这一点的建议? Java中有任何可用的库吗?您推荐我查看的示例项目?你推荐的论文?
太阳斑是一个 Java 平台,可帮助您快速制作系统原型。它使用 Java 进行编程,可以将命令转发回连接到计算机的基站。如果我需要进一步解释硬件的工作原理,请发表评论。
【问题讨论】:
【参考方案1】:由于似乎没有人按照 OP 的要求提及现有库,因此如下:http://www.wiigee.org/wiigee 旨在与 Wiimote 一起使用,是一个基于 Java 的开源实现,用于基于加速度计读数的模式匹配。它使用隐马尔可夫模型[1]来实现这一点。 它显然被一家公司 Thorn Technologies 使用,效果很好,他们在这里提到了他们的经验:http://www.thorntech.com/2013/07/mobile-device-3d-accelerometer-based-gesture-recognition/ 或者,您可以考虑 FastDTW (https://code.google.com/p/fastdtw/)。它不如常规 DTW[2] 准确,但计算成本也较低,这对于嵌入式系统或移动设备而言意义重大。
[1]https://en.wikipedia.org/wiki/Hidden_Markov_model [2]https://en.wikipedia.org/wiki/Dynamic_time_warping 编辑:OP 在其中一个 cmets 中提到他完成了他的项目,在现场具有 90% 的准确率和亚毫秒级的计算时间,使用 $1 Recognizer 的变体。他还提到轮换不是他项目的标准。
【讨论】:
【参考方案2】:尚未提及的是实际的手势识别。这是困难的部分。清理完数据(低通滤波、归一化等)后,您还有大部分工作要做。
看看隐马尔可夫模型。这似乎是最流行的方法,但使用它们并非易事。通常有一个预处理步骤。首先进行 STFT 并将结果向量聚类到字典中,然后将其输入 HMM。看看 java 库的谷歌代码中的 jahmm。
【讨论】:
感谢您的尝试。该项目是为学校设计的,并且进展顺利。对于实际的手势识别,我们最终使用了 1 美元识别器的变体,它不关心旋转并且有一个额外的维度。它是一种基于模板的方法,根本不对数据进行任何真正的训练。为了简化它,我们没有对手势进行任何分割,而是使用“开关”来指示手势何时开始/停止。我们的方法具有非常好的准确度/性能,每个手势大约 5 个模板在该领域具有超过 90% 的准确度,计算时间为亚毫秒。 @smaclell 听起来很有趣。你开源了代码吗?您知道有关如何将 1$ 识别器应用于 3 轴加速度计的任何资源吗? 因为是学校项目所以没有开源。当我们正在研究它时,没有好的资源可用。我在上面的评论中描述了我们的更改,但如果您遇到问题,我可以给您发送消息。 你说的$1识别器是什么? @S0lll0s 我所说的$1 recognizer 最初是华盛顿大学的一篇论文。这是一种非常简单的手势识别算法,只需少量样本即可有效。享受【参考方案3】:补充一下moonshadow关于必须重置重力和旋转基线的观点......
除非预计设备有稳定的静止时刻(作用在其上的唯一力是重力)来重置其测量基线,否则您的系统最终会产生相当于眩晕的情况。
【讨论】:
由于传感器漂移?还是只是拖延旧价值观? 基本上,您希望系统消除传感器随温度和时间的漂移。但是,如果您没有安静的时间,那么这种修剪就不会发生。【参考方案4】:加速度计将记录由于重力引起的恒定加速度,加上用户承受的任何加速度以及噪声。
您需要对样本进行低通滤波,以尽可能多地去除不相关的噪声。最糟糕的噪音通常是比任何可能的人为加速度更高的频率。
意识到当设备没有被用户加速时,唯一的力量是重力,因此你可以deduce its attitude在太空中。而且,当总加速度从1g变化很大时,一定是由于用户加速了设备;通过减去最后已知的重力估计,您可以粗略估计用户在哪个方向以及加速设备的速度,从而获得可以开始与已知手势列表进行匹配的数据。
使用单个三轴加速度计,您可以检测当前的俯仰和滚动,以及设备在直线上的加速度。将加速度减去重力积分将为您提供当前速度的估计值,但该估计值会因噪声而迅速偏离现实;您必须在手势之前/之间/期间对用户的行为做出假设,并通过您的 UI 引导他们,以提供设备未加速的点,您可以重置您的估计并可靠地估计重力方向。再次积分以找到位置根本不可能在任何有用的时间长度内提供可用的结果。
如果您有两个相距一定距离的三轴加速度计,或者一个和一些陀螺仪,您还可以检测设备的旋转(通过比较加速度矢量,或直接从陀螺仪);在几秒钟内积分角动量会给你一个相对于你开始积分时的当前偏航的估计,但这又会很快偏离真实。
【讨论】:
它们真的记录了由于重力而产生的恒定加速度吗?我的意思是他们应该在逻辑上,但这似乎违反直觉:-) 是的,他们有。把它们想象成弹簧上的质量,“加速度”实际上是拉伸/压缩的量;那么它就很直观了。 一个简单的校准程序是将它们放在桌子上,测量然后倒置它们;在 x,y,z 上也旋转 90 度,你就校准到一半了。 这是对加速度计的精彩介绍,但是手势识别呢?以上是关于如何使用加速度计进行手势识别的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI手势(Gesture)进阶 : 实现任意视图的长按惯性加速行为
SwiftUI手势(Gesture)进阶 : 实现任意视图的长按惯性加速行为
SwiftUI手势(Gesture)进阶 : 实现任意视图的长按惯性加速行为