安卓:加速度计误检(Android: Accelerometer false detection)

2019-09-01 13:03发布

我有一段代码来检测加速度计的运动。 它通过正确检测略有升降工作有时,但有时它检测到动作的时候我一直在我的设备闲置过多。 是否有与Android内置的加速度检测什么问题?

我使用HTC G-1设备。 我的代码片段如下。 如何解决它,所以我可以检测小型设备的运动,但是当设备闲置检测不到什么了吗?

private static final int SHAKE_THRESHOLD = 50;

public void onSensorChanged(int sensor, float[] values) {

    if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
        long curTime = System.currentTimeMillis();
        // only allow one update every 100ms.
        if ((curTime - lastUpdate) > 100) {
            long diffTime = (curTime - lastUpdate);
            lastUpdate = curTime;

            x = values[SensorManager.DATA_X];
            y = values[SensorManager.DATA_Y];
            z = values[SensorManager.DATA_Z];

            float speed = Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000;

            if (speed > SHAKE_THRESHOLD) { 
                long curTime = System.currentTimeMillis();
                long diff = (curTime - shakeTime);              
                shakeTime = curTime;

                if (myFlagIgnoreShakeDetection==true)  //Caused unneccessary accelerometer   
                                                       //notification looping when device is idle
                   return;

                // Doing something...
            }
         last_x = x;
         last_y = y;
         last_z = z;
        }

    }

}

Answer 1:

这里有一些代码不符...

  • 有可能是有关的更新问题last_xlast_ylast_z 。 我相信他们应该被包含在里面 if ((curTime - lastUpdate) > 100) {声明。 换句话说,他们正在每次更新onSensorChanged被调用,而不是每100毫秒。 你或许应该搬完三个变量的更新成以上他们花括号。

  • 你在哪里计算的线speed ,公式结尾... / diffTime * 10000; 你想乘刚diffTime 10000,或整个结果? 既然/*通常具有相同的运算符优先级在大多数语言我知道的(如Java的 ),由左到右,先除以你的公式进行评估diffTime 然后通过10000这个结果相乘。

    我猜你的意思是刚才乘diffTime 10000,从而除以该金额的最终结果。 这是10000除以或乘以10000,这意味着你可能得到的值之间的差speed超过您应该大于10 ^ 8,从而触发你的门槛,即使设备处于空闲状态。 你需要把周围的乘法括号,如... / (diffTime * 10000); ,以确保它的分裂发生之前进行。

    此外,如果您正打算扩展diffTime从毫秒到秒,您的比例系数应该是1000。



Answer 2:

我个人,我的增强现实库,用于更新滚动平均值:

float kFilteringFactor = (float)0.05;    
rollingZ = (float) ((rawZValue * kFilteringFactor) + (rollingZ * (1.0 - kFilteringFactor)));

这往往会顺利进行,数据相当不错,并且你可以调整滤波系数得到你想要的响应。

rawZValue是从加速度计来的原始值。



文章来源: Android: Accelerometer false detection