我有一个代码片段来检测加速度计的运动。有时它可以通过正确检测轻微的运动来工作,但有时当我保持设备空闲时它也会检测到运动。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;
        }

    }

}
有帮助吗?

解决方案

以下是一些代码差异...

  • 更新可能有问题 last_x, last_y, , 和 last_z. 。我相信他们应该被包括在内 里面if ((curTime - lastUpdate) > 100) { 陈述。换句话说,它们每次都会更新 onSensorChanged 被调用,不是每 100 毫秒调用一次。您可能应该将这三个变量的更新移到它们上方的大括号中。

  • 在您计算的行上 speed, ,公式结尾为 ... / diffTime * 10000; 你想乘以 diffTime 乘以 10000,还是整个结果?自从 /* 通常具有相同的 运算符优先级 在我所知道的大多数语言中(例如 爪哇),您的方程将从左到右计算,首先除以 diffTime 然后 将该结果乘以 10000。

    我猜你的意思是乘以 diffTime 10000,因此 划分 最终结果就是这个金额。这是除以 10000 或乘以 10000 之间的差异,这意味着您可能会得到以下值 speed 比您应有的值大 10^8,因此即使在设备空闲时也会触发您的阈值。您需要在乘法两边加上括号,例如 ... / (diffTime * 10000);, ,以确保其执行 分裂发生。

    此外,如果您打算扩展 diffTime 从毫秒到秒,比例因子应该是 1000。

其他提示

我个人,在我的增强现实库中,使用滚动平均值进行更新:

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

这样可以很好地平滑数据,您可以调整过滤因子以获得所需的响应能力。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top