如何在android中获得平滑的方向数据

Nei*_*end 9 android lowpass-filter android-sensors

我有一个应用程序使用方向数据,使用pre API-8方法使用a Sensor.TYPE_ORIENTAITON.平滑该数据相对容易.

我正在尝试更新代码以避免使用这种已弃用的方法.新的标准方法是Sensor.TYPE_ORIENTATION用a Sensor.TYPE_ACCELEROMETERSensor.TYPE_MAGENTIC_FIELD组合替换单个.收到该数据后,将其发送(通过SensorManager.getRotationMatrix())到SensorManager.getOrientation().这(理论上)返回与之相同的信息Sensor.TYPE_ORIENTATION(除了不同的单位和轴方向).

然而,这种方法似乎产生的数据比不推荐的方法(仍然有效)更加紧张(即噪声).因此,如果您在同一设备上比较相同的信息,则不推荐使用的方法提供的噪声数据比当前方法少得多.

如何获得已弃用的方法提供的实际相同(噪声较小)的数据?

让我的问题更清楚一点:我已经阅读了关于这个主题的各种答案,我尝试了各种过滤器:简单的KF/IIR低通,如你所说; 中值滤波器在5到19点之间,但到目前为止,我还没有达到接近手机通过TYPE_ORIENTATION提供的数据平滑度的任何地方.

Mee*_*tan 7

对传感器输出应用低通滤波器.

这是我的低通滤波器方法:

private static final float ALPHA = 0.5f;
//lower alpha should equal smoother movement
...
private float[] applyLowPassFilter(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]);
    }
    return output;
}
Run Code Online (Sandbox Code Playgroud)

像这样应用:

float[] mGravity;
float[] mGeomagnetic;
@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
        mGravity = applyLowPassFilter(event.values.clone(), mGravity);
    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
        mGeomagnetic = applyLowPassFilter(event.values.clone(), mGeomagnetic);
    if (mGravity != null && mGeomagnetic != null) {
        float R[] = new float[9];
        float I[] = new float[9];

        boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
        if (success) {
            float orientation[] = new float[3];
            SensorManager.getOrientation(R, orientation);
            azimuth = -orientation[0];
            invalidate();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这显然是指南针的代码,删除你不需要的东西.

另外,看看这个SE问题如何使用java实现低通滤波器