2009-07-09 103 views
1

我正在使用来自设备的加速度值(x,y,z)进行手势操作。使用加速度计

如果我将手持设备置于静止位置(x,y,z)=((0,0,0))。但是,如果我改变设备的方向(仍处于静止位置),数值会变成类似((766,766,821))的值。由于所有x,y,z轴相对于其原始方向都发生了变化。

有没有什么办法(三角函数或其他)来解决这个问题?

+0

你需要说什么样的输出的你要求 – teabot 2009-07-09 07:21:42

+0

您的意思是:您改变设备的方向,即使它不移动,数字也变为非零,或者您的意思是您改变设备的方向,并且当您将该设备从新位置移开时数字已关闭? – colithium 2009-07-09 07:27:58

+0

谢谢,如果我改变设备的方向,即使设备没有移动,数值也会改变(非零)。 如果设备未移动,则输出I需要(x,y,z)为(0,0,0)。为了使其方向(定向)独立, – Madni 2009-07-09 07:36:28

回答

-1

如果设备不能自动补偿重力加速度,则需要从设备输出中减去(0,0,〜9.8m/s2)矢量。

但是,您还需要设备的方向(欧拉角或旋转矩阵)。如果您的设备没有提供,则基本上不可能确定信号加速是由实际移动设备(线性acc)还是仅通过旋转(重力改变方向)引起的。

你补偿的加速度将成为:

OutputAcc = InputAcc x RotMat - (0,0,9.8) 

这样你OutputAcc vecor总是会在本地坐标框架(即Z是始终)

1

我发现你的问题不清楚。你究竟测量了什么,你期望什么?

一般来说,如果加速度计保持在固定位置,它将测量地球的重力。这显示为向上加速,这可能起初听起来很奇怪,但是完全正确:当重力“加速下降”并且设备处于固定位置时,需要施加相反方向的力,即“向上”。将设备保持在固定位置所需的力是该力,其在“向上”方向上具有相应的加速度。

根据您的设备,在获取PC中的值之前,可能会减少重力加速度。但是,如果转动加速度计,重力加速度仍然在,并且仍指向相同的“向上”方向。如果在转动加速度计之前,“向上”将对应于x,如果转向90°,它将对应于不同的轴,比如。因此,测得的轴加速度将会改变。

所以要回答你的问题,有必要知道你的加速度计如何呈现值。我怀疑在静止的位置测量的加速度值是(0,0,0)。

1

你的评论让你的问题更清晰。你需要做的是每当方向改变时,校准你的加速度计。没有解决这个问题。您可以在应用程序中将其设置为UI元素,或者如果它适合您的使用,如果加速度在一段时间内相对恒定(如果测量长加速度时不起作用),则重新校准为0。

校准内置到设备的api(检查文档)或您必须手动执行的操作。要手动完成,您必须读取当前加速度并存储这3个值。然后,每当您从设备读取数据时,从每个读取的值中减去这3个值。

5

重力加速度始终存在。当设备处于特定方向时,看起来您正在从某个轴中减去该值。

检测手势需要做的是检测设备开始移动时由于重力引起的加速度暂时出现的微小差异。您将无法检测设备是否静止或以恒定速度移动,但是您将能够确定它是否正在转动或正在加速。 (x,y,z)值为您提供了一个向量,它给出了加速度的方向。你可以计算这个向量长度的(平方)为x^2 + y^2 + x^2。如果这与设备静止时相同,那么您知道设备未加速,但处于某个方向。 (静止或以恒定速度移动。)

要检测移动,您需要注意设备开始移动时该矢量长度的瞬时变化,以及当它停止时再次注意此矢量长度的瞬时变化。与重力相比,这种变化可能很小。

您需要比较运动过程中加速度矢量的方向,以确定运动的方向。请注意,您将无法区分每个手势。例如,向前移动设备(并在那里停止)与稍微倾斜设备,然后将其恢复到相同方向的效果相同。

更容易检测的手势是那些改变设备方向的手势。其他手势,例如打孔动作,将很难被发现。它们将显示为加速度矢量长度的变化,但变化量可能很小。

编辑:

上述讨论是关于x,y和z的归一化值。您将需要确定从读数中减去的值以获得矢量。从上面的评论看来,766是要减去的“零”值。但是它们可能会因设备上的不同轴而不同。使用面向所有六个方向的设备测量读数。这是得到x,y和z的最大值和最小值。中心值应该在极端之间(有希望的是766)。

某些手势将具有指示签名。

放下设备将暂时减少加速度矢量,然后在设备停止时立即增加它。

提升设备会暂时增加矢量,然后暂时降低矢量。

向前移动会暂时增加矢量,但稍微向前倾斜,然后再次增加它,但是会随着设备停止而向后倾斜。

大多数时候矢量的长度将等于重力引起的加速度。