Визначення положення в просторі

Датчик орієнтації - це комбінація датчика магнітного поля, виконуваних роль електронного компаса, і акселерометра, який вимірює нахил і обертання.

Якщо ви знайомі з тригонометрією, значить є навички, необхідні для обчислення положення пристрою відносно всіх трьох осей, осно- виваясь на свідченнях акселерометра і датчика магнітного поля. Однак якщо ви маєте до тригонометрії ті ж почуття, що і я, то зрадієте, дізнавшись, що Android зробить все обчислення сам.

По суті, Android пропонує два способи визначення положення пристрою. Ви можете зробити запит безпосередньо до датчика орієнтації або отримати необхідні дані за допомогою акселерометра і датчика магнітного поля. Другий варіант більш повільний, але має преімуще- ства - підвищену точність і можливість змінювати систему відліку при визначенні положення в просторі. У наступних розділах опи- Сива обидва підходи.

При використанні стандартної системи відліку положення пристрою обчислюється в трьох вимірах, як показано на рис. 14.2. Як і у випадку з акселерометром, пристрій розглядається в стані спокою, лежачи екраном вгору на плоскій поверхні.

Визначення положення в просторі

• Ось X (напрямок). Напрямок пристрою при русі по-коло осі X; 0 ° / 360 ° - північ, 90 ° - схід, 180 ° - південь, 270 ° - захід.

• Ось Y (нахил). Кут нахилу пристрою при обертанні відносна але осі Y. Він дорівнює 0 °, якщо пристрій лежить на задній кришці,

-90 ° - якщо розташоване вертикально (верхня частина пристрою вказує вгору), 90 ° - якщо перевернуто, 180 ° / -180 ° - якщо екранування ном вниз.

• Вісь Z (поворот). Поворот виписує бічний нахил пристрої по осі

Z між -90 ° і 90 °. При 0 ° пристрій лежить на задній кришці, при

-90 ° екран повернений вліво, при 90 ° - вправо.

за допомогою датчика орієнтації

Найпростіший спосіб відслідковувати положення пристрою в просторових стве - застосування окремого датчика орієнтації. Створіть і зарегистри- руйте SensorEventListener за допомогою об'єкта SensorManager, використовуючи датчик орієнтації за замовчуванням, як показано в лістингу 14.3.

Лістинг 14.3. за допомогою датчика орієнтації

SensorManager sm = (SensorManager) getSystemService (Context.SENSOR_ SERVICE);

int sensorType = Sensor.TYPE_ORIENTATION;

sm.registerListener (myOrientationListener, sm.getDefaultSensor (sensorType), SensorManager.SENSOR_DELAY_NORMAL);

Коли положення пристрою змінюється, у вашій реалізації інтерфейсу SensorEventListener спрацьовує обробник onSensorChanged. Параметр SensorEvent включає в себе масив значень типу float, що описує стан пристрою по трьох осях. Перший елемент цього масиву - на- правління, другий - нахил, третій - поворот.

final SensorEventListener myOrientationListener = new

public void onSensorChanged (SensorEvent sensorEvent)

if (sensorEvent.sensor.getType () == Sensor.TYPE_ORIENTATION)

float headingAngle = sensorEvent.values ​​[0]; float pitchAngle = sensorEvent.values ​​[1]; float rollAngle = sensorEvent.values ​​[2];

// TODO Використовувати зміна положення в своїй програмі.

public void onAccuracyChanged (Sensor sensor, int accuracy) <>