Азимут обнаружен с помощью Sensor.TYPE_MAGNETIC_FIELD гораздо более нестабильным, чем Sensor.TYPE_ORIENTATION - PullRequest
4 голосов
/ 13 июля 2011

Я делаю какое-то приложение с дополненной реальностью, и мне нужен азимут для вычисления положения объекта на экране. Я попытался получить данные об ориентации, используя Sensor.TYPE_ORIENTATION, и поскольку он устарел, я попытался Sensor.TYPE_MAGNETIC_FIELD. Моя проблема в том, что значение, полученное с помощью Sensor.TYPE_MAGNETIC_FIELD и SensorManager.getOrientation, довольно нестабильно по сравнению с Sensor.TYPE_ORIENTATION, из-за чего мой объект немного прыгает по экрану (если не перемещать значение, попадающее в диапазон, скажем, [azimuth -5 азимут + 5] , в то время как он едва двигается с Sensor.TYPE_ORIENTATION).

Sensor.TYPE_ORIENTATION

public void onSensorChanged(SensorEvent event)
{
    if(event.sensor.getType() == Sensor.TYPE_ORIENTATION)
    {
        newAzimuth = (event.values[0] + 360)%360;            
        azimuth = (float) ((newAzimuth * kFilteringFactor) + (azimuth * (1.0 - kFilteringFactor)));       
    }
}

Sensor.TYPE_MAGNETIC_FIELD

public void onSensorChanged(SensorEvent event) {
    switch (event.sensor.getType()) {
        case Sensor.TYPE_MAGNETIC_FIELD:
            mags = event.values.clone();
            break;
        case Sensor.TYPE_ACCELEROMETER:
            accels = event.values.clone();
            break;
    }
    if (mags != null && accels != null) {
        SensorManager.getRotationMatrix(R, I, accels, mags);
        SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X,
                SensorManager.AXIS_Z, remappedR);
        SensorManager.getOrientation(remappedR, orientation);
        newAzimuth = (float) Math.round(Math.toDegrees(orientation[0]));
        newAzimuth = (newAzimuth + 360)%360;
        azimuth = (float) (newAzimuth * kFilteringFactor) + (azimuth * (1.0f - kFilteringFactor));
    }
}

1 Ответ

2 голосов
/ 15 июля 2011

Это происходит только при использовании SensorManager.DELAY_FASTER. С SensorManager.SENSOR_DELAY_GAME значения более стабильны ...

...