我的目标是识别安装在太阳点上的加速度计的简单手势。一个手势可以像旋转设备或以几种不同的动作移动设备一样简单。该设备目前只有加速度计,但我们正在考虑添加陀螺仪,以使其更容易/更准确。
有没有人有关于如何做到这一点的建议?Java中有任何可用的库吗?您推荐我查看的示例项目?你推荐的论文?
Sun Spot 是一个 Java 平台,可帮助您快速制作系统原型。它使用 Java 进行编程,可以将命令转发回连接到计算机的基站。如果我需要解释硬件的工作原理,请发表评论。
我的目标是识别安装在太阳点上的加速度计的简单手势。一个手势可以像旋转设备或以几种不同的动作移动设备一样简单。该设备目前只有加速度计,但我们正在考虑添加陀螺仪,以使其更容易/更准确。
有没有人有关于如何做到这一点的建议?Java中有任何可用的库吗?您推荐我查看的示例项目?你推荐的论文?
Sun Spot 是一个 Java 平台,可帮助您快速制作系统原型。它使用 Java 进行编程,可以将命令转发回连接到计算机的基站。如果我需要解释硬件的工作原理,请发表评论。
加速度计将记录由于重力引起的恒定加速度,加上用户承受的任何加速度,再加上噪音。
您将需要对样本进行低通滤波,以尽可能多地去除不相关的噪声。最糟糕的噪音通常是比任何可能的人为加速度更高的频率。
意识到当设备没有被用户加速时,唯一的力是由于重力,因此你可以推断出它在空间中的姿态。而且,当总加速度从1g变化很大时,一定是由于用户加速了设备;通过减去最后已知的重力估计,您可以粗略估计用户在哪个方向以及加速设备的速度,从而获得可以开始与已知手势列表进行匹配的数据。
使用单个三轴加速度计,您可以检测当前的俯仰和滚动,以及设备在直线上的加速度。将加速度减去重力积分将为您提供当前速度的估计值,但由于噪声,估计值会迅速偏离现实;您必须在手势之前/之间/期间对用户的行为做出假设,并通过您的 UI 引导他们,以提供设备未加速的点,您可以重置您的估计并可靠地估计重力方向。再次积分以找到位置不太可能在任何有用的时间长度内提供可用的结果。
如果您有两个相距一定距离的三轴加速度计,或者一个和一些陀螺仪,您还可以检测设备的旋转(通过比较加速度矢量,或直接从陀螺仪);在几秒钟内积分角动量会给你一个相对于你开始积分时的当前偏航的估计,但这又会迅速偏离真实。
由于似乎没有人按照 OP 的要求提到现有库,因此这里是:http:
//www.wiigee.org/
用于 Wiimote,wiigee是一种基于 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 在他完成项目的评论之一中提到, 90% 的现场准确率和亚毫秒级的计算时间,使用$1 Recognizer的变体。他还提到轮换不是他项目的标准。
尚未提及的是实际的手势识别。这是困难的部分。清理完数据(低通滤波、归一化等)后,您还有大部分工作要做。
看看隐马尔可夫模型。这似乎是最流行的方法,但使用它们并非易事。通常有一个预处理步骤。首先进行 STFT 并将结果向量聚类到字典中,然后将其输入 HMM。看看 java lib 的谷歌代码中的 jahmm。
添加到月影关于必须重置重力和旋转基线的观点......
除非期望设备具有稳定的静止时刻(作用在其上的唯一力是重力)来重置其测量基线,否则您的系统最终会产生相当于眩晕的现象。