使用加速度计进行运动跟踪的算法建议

时间:2013-08-26 00:04:43

标签: java android signal-processing sensor

我正在寻找使用实时加速度计数据(来自手机)检测一些基本的动作手势。我的问题是我需要一些通常“旋转不变”的东西。

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

但其他方向呢?例如。用户将手机颠倒过来(好吧,这很容易,因为我可以做同样的基本比较,将一个轴视为另一个轴)或更难,还是介于两者之间?

感谢您的帮助,我们很乐意提供更多详情。

2 个答案:

答案 0 :(得分: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 :(得分:1)

听起来你的问题是坐标的基本转换。我要做的第一件事是吹掉笛卡尔坐标,而不是spherical coordinates。这样做的最大优点是球面半径(或矢量幅度,笛卡尔语),无论轴的方向如何,都是相同的。计算半径

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

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

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