Неверное значение x для датчиков при использовании для дополненной реальности

Я использую следующий код (предположим, что он довольно стандартный) для получения ориентации планшетного устройства для целей дополненной реальности (поэтому задняя камера должна указывать правильное направление).

private Sensor mAccelerometer;
private Sensor mMagnetometer;
private float[] mLastAccelerometer = new float[3];
private boolean mLastAccelerometerSet = false;
private float[] mLastMagnetometer = new float[3];
private boolean mLastMagnetometerSet = false;

private Sensor mAccelerometer;
private Sensor mMagnetometer;
private float[] mLastAccelerometer = new float[3];
private boolean mLastAccelerometerSet = false;
private float[] mLastMagnetometer = new float[3];
private boolean mLastMagnetometerSet = false;
private float[] inR = new float[9]; 
private float[] mR = new float[9];
private float[] mOrientation = new float[3];
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
...     
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
...
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_FASTEST);
mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_FASTEST);
...
public void onSensorChanged(SensorEvent event) {
    synchronized (this) {
       if (event.sensor == mAccelerometer) {
            System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length);

            mLastAccelerometerSet = true;

        } else if (event.sensor == mMagnetometer) {
            System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length);

            mLastMagnetometerSet = true;
        }

        if (mLastAccelerometerSet && mLastMagnetometerSet && scene.camera() != null && mPlane1 != null) {
            SensorManager.getRotationMatrix(inR, null, mLastAccelerometer, mLastMagnetometer);
            SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X, SensorManager.AXIS_Z, mR);
            SensorManager.getOrientation(mR, mOrientation);

            /* my code that handles mOrientation */
        }
    }
}

Проблема в том, что этот код безупречно работает на Samsung Galaxy Tab 10.1 (P7500, первая версия). При выполнении того же кода на Asus Transformer Pad Infinity (TF700) первое значение mOrientation[0] изменяется только между +2,0 и +3,0 при вращении планшета вокруг себя (я ожидаю, что оно будет от 0 до 3,14).

Что-то не так с устройством или есть другие переменные, которые я упустил?


person Roalt    schedule 08.08.2013    source источник


Ответы (1)


Должно быть, произошла какая-то аппаратная ошибка Asus TF700. Это либо в этой конкретной версии, которая у нас была, либо в конструкции устройства. С другими устройствами Android приложение работало должным образом.

person Roalt    schedule 26.09.2013