Android加速度计具有更高的准确性

时间:2017-03-27 12:56:46

标签: android

我正在使用POI构建增强现实应用。 大多数应用程序已完成,但现在我正在努力寻找更好的传感器稳定性,特别是加速度计。我使用过低通滤波器,但POI仍然很大。我试图做的是获得5个或更多的加速度计读数,然后除以n。这应该给我更好的读数,但我不知道如何做到这一点。我可以进行for循环,但我不能只生成for(int i=0; i<n; i++),因为只有当加速度计的值发生变化时才应该执行 i ++ 。如果我用一个简单的for循环来做,我会得到一个错误,因为循环完成得比传感器更快。我正在寻找的是一个只有在传感器也被改变时才会改变的计时器。

这是我到目前为止所做的:

static final float ALPHA = 0.15f; // if ALPHA = 1 OR 0, no filter applies.


// low level pass filter, so i can get steadier reading of mobile sensors
// using only accelerometer and compass
protected float[] lowPass(float[] input, float[] output) {
    if (output == null) return input;
    for (int i = 0; i < input.length; i++) {
       output[i] = output[i] + ALPHA * (input[i] - output[i]);
       // output[i] = input[i]*ALPHA + output[i]*(1.0f-ALPHA);
    }

    return output;
}



public void onSensorChanged(SensorEvent event) {


    StringBuilder msg = new StringBuilder(event.sensor.getName())
            .append(" ");
    for (float value : event.values) {
        msg.append("[").append(String.format("%.3f", value)).append("]");
    }

    switch (event.sensor.getType()) {
        case Sensor.TYPE_ACCELEROMETER:
            lastAccelerometer = lowPass(event.values.clone(), lastAccelerometer);
            accelData = msg.toString();
            break;
        case Sensor.TYPE_GYROSCOPE:
            gyroData = msg.toString();
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            lastCompass = lowPass(event.values.clone(), lastCompass);
            compassData = msg.toString();
            break;
    }

    this.invalidate();

}

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:

protected float[] getMovingAvg() {
    float [] output = new float [3];
    for( int i = 0; i< moveVector.size(); i++) {
        output[0] += moveVector.get(i)[0];
        output[1] += moveVector.get(i)[1];
        output[2] += moveVector.get(i)[2];

    }
    output[0] = output[0]/moveVector.size();
    output[1] = output[1]/moveVector.size();
    output[2] = output[2]/moveVector.size();

    if(moveVector.size() >= 70) {
       moveVector.remove(0);
    }

    return output;
}