Какой датчик для поворота телефона Android?

Представьте, что вы указываете на телевизор. Вы держите телефон в руке. Теперь вращайте запястье.

Каким датчиком мне нужно управлять, чтобы обнаруживать такое движение?

Гироскоп? Ориентация? Акселерометр?


person richard    schedule 27.07.2011    source источник


Ответы (3)


Датчики TYPE_MAGNETIC_FIELD и TYPE_ACCELEROMETER прекрасно это обнаруживают (поскольку датчик TYPE_ORIENTATION устарел).

Тебе понадобится:

несколько матриц:

private float[] mValuesMagnet      = new float[3];
private float[] mValuesAccel       = new float[3];
private float[] mValuesOrientation = new float[3];

private float[] mRotationMatrix    = new float[9];

прослушиватель для перехвата значений, которые отправляют датчики (это будет аргумент SensorManager.registerListener(), который вам нужно будет вызвать для настройки ваших датчиков):

private final SensorEventListener mEventListener = new SensorEventListener() {
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

    public void onSensorChanged(SensorEvent event) {
        // Handle the events for which we registered
        switch (event.sensor.getType()) {           
            case Sensor.TYPE_ACCELEROMETER: 
                System.arraycopy(event.values, 0, mValuesAccel, 0, 3); 
                break; 

            case Sensor.TYPE_MAGNETIC_FIELD: 
                System.arraycopy(event.values, 0, mValuesMagnet, 0, 3); 
                break; 
    }
};

И вам нужно будет вычислить азимут, тангаж и крен:

    SensorManager.getRotationMatrix(mRotationMatrix, null, mValuesAccel, mValuesMagnet);
    SensorManager.getOrientation(mRotationMatrix, mValuesOrientation);  

mValuesOrientation затем заполняется:

  • mValuesOrientation[0]: азимут, вращение вокруг оси Z.
  • mValuesOrientation[1]: шаг, вращение вокруг оси X.
  • mValuesOrientation[2]: крен, вращение вокруг оси Y.

Проверьте документацию getOrientation(), чтобы узнать, как определяются оси. Возможно, вам придется использовать SensorManager.remapCoordinateSystem() для переопределения этих осей.

person Shlublu    schedule 27.07.2011
comment
Когда я это делаю, высота тона никогда не достигает 180°. Он начинается с 0° (плоско, лицом к небу), затем доходит до 90°, когда телефон обращен ко мне, а затем возвращается к 90°, когда телефон обращен к полу. Это ожидаемое поведение? Как я узнаю, смотрит ли устройство в небо или в пол? - person Joan; 10.11.2014

Это зависит от того, что вы хотите обнаружить, если вы хотите обнаружить, что телефон был перемещен во вращении, тогда акселерометр, вероятно, будет вашим лучшим выбором. Если вы хотите определить, что телефон теперь повернут, выберите Ориентация.

person Jim    schedule 27.07.2011

гироскоп предназначен для обнаружения поворотов, если вы не Меня не волнует ваше положение относительно Земли.

person David Leppik    schedule 29.11.2018