2013-08-26 24 views
0

我正在使用实时加速计数据(来自手机)来检测一些基本的移动手势。我的问题是我需要一些“旋转不变”的东西。使用加速计进行运动跟踪的算法建议

我的意思是,如果用户把手机颠倒过来,然后做一个手势,它不会是相同的信号。鉴于特定的方向,我知道如何将实时acc数据与手势的给定“模板”进行比较。

但是对于其他方向呢?例如。用户拿着手机倒过来(好吧,这很容易,因为我可以做同样的基本比较治疗一个轴另一个)或更难,但在中间的某个地方?

感谢您的任何帮助,将很乐意提供更多的细节。

回答

1

只要加速度值在一段时间内(例如1秒)没有改变(或保持在定义的范围内),您就可以假定用户处于稳定位置并存储这些值。如果值超出该范围,则可以从新值中减去以前存储的值。这是假设你的问题是重力,而你的意思是“定向不变”......对吧?

对于一个非常简单的例子,在这里你只需要z轴的加速度有一个高峰:

x_wanted = 0 
y_wanted = 0 
z_wanted = 10 

你在一个稳定的位置的用户,在45度的倾斜装置:

x_rest = 0 
y_rest = sin(45) g 
z_rest = -cos(45) g 

并随后使该电话向他的,即z轴(电话参考)为10:

x_phone = x_measured - x_rest = (0) - 0     = 0 
y_phone = y_measured - y_rest = (sin(45)*g) - sin(45)*g = 0 
x_phone = z_measured - x_rest = (-cos(45)*g + 10) - (-cos(45)*g) = 10 
1

它如此喜欢你的问题是坐标的基本变换。我要做的第一件事就是吹掉笛卡尔坐标而转向spherical coordinates。这样做的最大优点是球面半径(或矢量幅度,以笛卡尔的形式表示),无论轴的方向如何,它都是相同的。计算半径

r = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)) 

标准化两个坐标系的一种非常简单的方法是将每个半径作为两个时间序列进行比较。这应该至少可以消除很多问题,并且在运动识别方面可能表现得很好。

现在,如果您真的想比较各个方向的动作,也许在您已经找到基于半径时间序列的候选人后,请查看​​。您必须做一些多元回归,但是有三个数据通道,三个控制方程,三个未知数(alpha,beta和gamma)以及线性代数,您可以将未知方向的所有三个通道标准化回模板方向,并分别比较每个通道。