安卓如何检测正确的手机晃动

3
我试图通过以下代码检测手机正确的摇晃,但它不能正确工作,例如经常当我向左摇晃手机时,我会得到"RIGHT"或同时得到"RIGHT"和"LEFT":
@Override
    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) > 200) {
                long diffTime = (curTime - lastUpdate);
                lastUpdate = curTime;

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

                if (Round(x, 4) > 10.0000) {
                    Toast.makeText(this, "Right shake detected", Toast.LENGTH_SHORT).show();
                } else if (Round(x, 4) < -10.0000) {
                    Toast.makeText(this, "Left shake detected", Toast.LENGTH_SHORT).show();
                }

                last_x = x;
                last_y = y;
                last_z = z;
            }
        }
    }

更新POST:

if (Utils.Round(x, 4) > 8.0000) {
    //left
} else if (Utils.Round(x, 4) < -8.0000) {
    //right
} else if (z > 9 && z < 10)
    //down
else if (z > -10 && z < -9)
    //up
1个回答

2
想想加速度计是如何工作的。它检测加速度。当您将手机向右移动时,您会得到向右的加速度,然后当您以恒定速度移动时,加速度为0。然后当您的手停止时,您会看到负加速度(向左的加速度),因为您减速了,当您停下来时,加速度再次达到0。
换句话说,每个运动都会出现正/负对。当您同时看到两者时,那是因为它们中的每一个都足够强大,可以触发过滤器。当您看到错误的结果时,这意味着加速度太慢无法触发它,但减速度足够快。您没有进行足够长时间的去抖动- 为了使晃动不检测到减速度,必须是从右侧开始并在200ms内结束的移动。时间不够长。如果您想要真正好的结果,应该研究DSP算法,但是所有这些概念都需要详细讲解。
还要记住,加速度会产生回响。加速度计物理上的工作方式- 想象一下由重量拉伸的弹簧。它会超过中位数,然后反弹回来,并重复这样做。该波与后来的数据的干扰会带来奇怪的结果。甚至可能出现强烈的回响多次触发您的过滤器。
哦,还有这里不应该使用currentTimeMillis。传感器事件有一个时间字段。那就是事件实际发生的时间。如果系统繁忙,可能会在处理事件之前几百毫秒。使用事件字段中的时间,而不是您正在处理它的时间。修复这个问题可能会有所帮助,尽管还有其他问题。

非常抱歉,先生。在我不断修改代码后,出现了错误,您能帮我修复一下吗?我已经更新了帖子,谢谢。 - DolDurma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接