使用Accelerometer

时间:2009-07-09 07:20:23

标签: acceleration

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

如果我把手中的设备放在静止位置(x,y,z)=((0,0,0))。但是,如果我改变设备的方向(仍处于静止位置),则值将更改为((766,766,821))。因为所有的x,y,z轴都与其原始方向相比发生了变化。

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

4 个答案:

答案 0 :(得分:5)

由于重力引起的加速度始终存在。当设备处于特定方向时,您似乎从其中一个轴中减去该值。

检测手势需要做的是检测设备开始移动时由于重力引起的加速度瞬间出现的微小差异。您将无法检测设备是静止不动还是以恒定速度移动,但您将能够确定它是在转动还是在加速。

(x,y,z)值给出一个向量,它给出了加速度的方向。您可以将此向量的(平方)长度计算为x ^ 2 + y ^ 2 + x ^ 2。如果这与设备静止时相同,那么您知道设备未加速,但处于某个方向。 (静止时,或以恒定速度移动。)

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

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

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

编辑:

以上讨论是针对x,y和z的归一化值。您需要确定要从读数中减去的值以获得向量。从上面的评论看,766似乎是要减去的“零”值。但是对于设备上的不同轴,它们可能会有所不同。使用面向所有六个方向的设备测量读数。即获取x,y和z的最大值和最小值。中心值应介于两个极端之间(希望是766)。

某些手势会有明显的签名。

丢弃设备会暂时减少加速度矢量,然后在设备停止时暂时增加它。

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

向前运动会瞬间增加矢量,但会略微向前倾斜,然后暂时再次向上倾斜,但向后倾斜,因为设备会停止。

大多数情况下,矢量的长度等于重力引起的加速度。

答案 1 :(得分:1)

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

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

根据您的设备,在获取PC中的值之前,可能会减去此重力加速度。但是,如果你转动加速度计,重力加速度仍然存在,仍然指向相同的“向上”方向。如果在转动加速度计之前,“向上”将对应于 x ,如果转动90°,它将对应于不同的轴,例如 y 。因此, x y 轴上的测量加速度都会发生变化。

因此,要回答您的问题,有必要了解您的加速度计如何显示值。我怀疑在静止位置测得的加速度值是(0,0,0)。

答案 2 :(得分:1)

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

校准要么内置在设备的api中(请查看文档),要么手动完成。要手动执行此操作,您必须读取当前加速度并存储这3个值。然后,无论何时从设备读取数据,都会从每个读取值中减去这3个值。

答案 3 :(得分:-1)

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

但是,您还需要具有设备的方向(欧拉角或旋转矩阵)。如果您的设备没有提供基本上不可能判断信号加速是否是由实际移动设备(线性acc)或简单地旋转它(重力改变方向)引起的。

您的补偿加速度将变为:

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

这样您的OutputAcc vecor将始终位于本地坐标框架中(即Z始终处于启动状态)