0

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

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

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

感谢您的帮助,很乐意提供更多详细信息。

4

2 回答 2

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
于 2013-08-26T00:20:14.350 回答
1

听起来您的问题是坐标的基本变换。我要做的第一件事是放弃笛卡尔坐标,转而使用球坐标。这样做的最大优势是球面半径(或矢量幅度,用笛卡尔的说法),无论轴的方向如何,它都是相同的。计算半径

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

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

现在,如果您真的想比较各个方向的运动,也许在您已经根据半径时间序列找到候选者之后,请查看欧拉角。您必须进行一些多元回归,但是使用三个数据通道、三个控制方程、三个未知数(alpha、beta 和 gamma)和线性代数,您可以将所有三个通道以未知方向归一化回您的模板方向,并分别比较每个通道。

于 2013-08-28T04:12:06.487 回答