Ориентация с Android Accelerometer

Я тестирую выход акселерометра на двух разных устройствах (планшет Elocity A7 и Archos 7 Home), но датчик, похоже, дает разные результаты. Я запрограммировал его на режим ландшафта, но оси x и y кажутся оппортунистами между двумя устройствами. Ось x возвращает 10, удерживая перпендикулярно земле, и ось Archos X возвращает 0. Планшет Elocity - это android 2.2, а Archos - 2.1. Может ли кто-нибудь указать мне в правильном направлении, как получить ориентацию от акселерометра в синхронизации между этими двумя устройствами?

Ответы

Ответ 1

Фактически акселерометрические оси относятся к ориентации устройства по умолчанию.

Вот как с этим справиться:

static void canonicalOrientationToScreenOrientation(
         int displayRotation, float[] canVec, float[] screenVec) 
{ 
    final int axisSwap[][] = { 
    {  1,  -1,  0,  1  },     // ROTATION_0 
    {-1,  -1,  1,  0  },     // ROTATION_90 
    {-1,    1,  0,  1  },     // ROTATION_180 
    {  1,    1,  1,  0  }  }; // ROTATION_270 

    final int[] as = axisSwap[displayRotation]; 
    screenVec[0]  =  (float)as[0] * canVec[ as[2] ]; 
    screenVec[1]  =  (float)as[1] * canVec[ as[3] ]; 
    screenVec[2]  =  canVec[2]; 
} 

Это решение было предоставлено NVidia. Проверьте их белую бумагу об Android Акселерометр для более подробной информации.

Ответ 2

просто хотел добавить что-то в ответ Хартка, поскольку я не мог понять его сначала...

Я переписал метод:

public static float[] adjustAccelOrientation(int displayRotation, float[] eventValues) 
{ 
    float[] adjustedValues = new float[3];

    final int axisSwap[][] = {
    {  1,  -1,  0,  1  },     // ROTATION_0 
    {-1,  -1,  1,  0  },     // ROTATION_90 
    {-1,    1,  0,  1  },     // ROTATION_180 
    {  1,    1,  1,  0  }  }; // ROTATION_270 

    final int[] as = axisSwap[displayRotation]; 
    adjustedValues[0]  =  (float)as[0] * eventValues[ as[2] ]; 
    adjustedValues[1]  =  (float)as[1] * eventValues[ as[3] ]; 
    adjustedValues[2]  =  eventValues[2];

    return adjustedValues;
}

Точно так же, просто с более удобными именами переменных, и я воссоздаю float внутри, потому что мне это нужно... Просто вызовите эту функцию, поместите в массив getRotation и event.values ​​float, проверьте значения возвращаемого массива float и выберите любой номер, который вы предпочитаете...

Надеюсь, это поможет кому-то!

Ответ 3

Насколько я знаю, это связано с ориентацией устройства по умолчанию. F.E. новые планшеты Android с Honeycomb имеют портретную ориентацию, когда они хранятся как в ландшафте на телефонах.

http://developer.android.com/reference/android/hardware/SensorEvent.html

В документации по Android есть информация, которая:

Координатная система определяется относительно экрана телефона в ориентации по умолчанию. Оси не меняются местами, когда изменения ориентации экрана.

Ось X горизонтальна и указывает вправо, ось Y вертикально и указывает вверх, а ось Z указывает на внешнюю сторону передняя поверхность экрана. В этой системе координаты за экран имеет отрицательные значения Z.

Возможно, одно из этих устройств также имеет пейзаж как ориентацию портрета (по умолчанию)?

Надеюсь, вам это поможет.

Ответ 4

Как указывалось ранее, ориентация экрана по умолчанию может варьироваться от устройства к устройству. Координаты акселерометра всегда будут соответствовать ориентации устройства по умолчанию. Такое поведение отличается от координат экрана. По мере поворота устройства экранные координаты также вращаются, так что (0, 0) всегда является текущим верхним левым углом экрана. На устройстве с ориентацией по портрету по умолчанию блокировка ориентации на портрет гарантирует, что координаты датчика будут проходить вдоль той же оси, что и координаты экрана независимо от поворота. С другой стороны, блокировка ориентации экрана на портрет на устройстве с альбомной ориентацией по умолчанию приведет к тому, что ось датчика будет работать в другом направлении, чем ось экрана.

Эта статья: http://android-developers.blogspot.com/2010/09/one-screen-turn-deserves-another.html объясняет это более подробно, а также дает решение для решения проблемы.