Главная » Разработка для Android » Определение положения в пространстве

0

Датчик  ориентации  — это комбинация датчика  магнитного  поля, вы- полняющего  роль электронного компаса, и акселерометра, измеряющего наклон и вращение.

Если вы знакомы с тригонометрией, значит есть навыки, необходимые для вычисления положения устройства относительно всех трех осей, осно- вываясь на показаниях акселерометра и датчика магнитного поля. Однако если вы питаете к тригонометрии те же чувства, что и я, то обрадуетесь, узнав, что 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

SensorEventListener() {

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) {}

};

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии