Главная » Разработка для Android » Знакомство с акселерометром

0

Акселерометр используется для измерения ускорения.  Его иногда на- зывают датчиком силы притяжения.

ПРИМЕЧАНИЕ

Акселерометры часто выступают в качестве датчиков силы притяжения, так как они не могут определить, чем вызвано ускорение — движением или гравитацией. В результате этого в состоянии покоя акселерометр будет указывать на ускорение по оси Z (вверх/вниз), равное 9,8м/с2 (это значение доступно в виде константы SensorManager.STANDARD_ GRAVITY).

Ускорение  — это производная скорости по времени, поэтому акселеро- метр определяет,  насколько  быстро изменяется скорость устройства  в за- данном направлении. Используя этот датчик, вы можете обнаруживать движение и, что более полезно, изменение  его скорости.

ВНИМАНИЕ

Акселерометр не измеряет скорость как таковую, поэтому вы не можете получить скорость движения, основываясь на единичном замере. Вме- сто этого необходимо учитывать изменения ускорения на протяжении какого-то отрезка времени.

На практике,  скорее всего, вас будет интересовать  ускорение  относи- тельно состояния покоя или быстрого движения  (сопровождаемого рез-

кими изменениями в ускорении); такое ускорение  может возникать  при использовании жестов для ввода данных. В первом случае вам потребуется откалибровать устройство,  вычислив  начальные  показатели ориентации и ускорения,  чтобы учитывать  их влияние  при вычислении будущих ре- зультатов.

Обнаружение изменений ускорения

Ускорение  может быть измерено  в трех направлениях: по оси ординат, по оси абсцисс, а также по вертикальной оси. SensorManager сообщает об изменениях в показаниях акселерометра по всем трем направлениям.

Значения, переданные  через свойство  values объекта SensorEvent, от- ражают боковое, продольное  и вертикальное ускорение  (именно  в таком порядке).

Рисунок 14.1 иллюстрирует нанесение трех направляющих осей на устройство,  находящееся в состоянии покоя,  которое  в интерпретации SensorManager наступает тогда, когда устройство лежит на плоской поверх- ности экраном вверх и находится при этом в портретном режиме.

Z

Y

X

Рис. 14.1

• Ось X (ординаты). Боковое  (влево  или вправо)  ускорение,  положи- тельные  значения  которого  свидетельствуют о движении  в направ- лении правой части устройства,  а отрицательные — в направлении левой его части. Например, положительное ускорение по оси X будет, если устройство, лежа экраном вверх, повернется вправо (не отрывая крышку от поверхности).

• Ось Y (абсциссы). Ускорение  вперед или назад. В первом случае по- казатели  будут больше нуля. Разместив устройство  таким образом, как в предыдущем пункте, и подвинув  в сторону его верхнюю часть, вы создадите положительное продольное ускорение.

• Ось Z (аппликаты). Ускорение  вверх или вниз. В первом случае при подъеме устройства  значения  будут положительными. В состоянии покоя вертикальное ускорение  равно 9,8 м/с2  (вследствие силы тя- жести).

Как уже говорилось ранее, изменения ускорения отслеживаются посред- ством SensorEventListener. Зарегистрируйте реализацию этого интерфейса с помощью SensorManager, используя объект Sensor с типом Sensor.TYPE_ ACCELEROMETER, чтобы запрашивать обновления для акселерометра. В листинге  14.2 регистрируется акселерометр  по умолчанию,  используя стандартную  частоту обновлений.

Листинг 14.2. Отслеживание изменений в показаниях акселерометра по умолчанию

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

int sensorType = Sensor.TYPE_ACCELEROMETER;

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

Интерфейс SensorEventListener должен содержать реализацию обработ- чика onSensorChanged, который будет срабатывать при измерении ускоре- ния в произвольном направлении.

Метод onSensorChanged получает объект SensorEvent, содержащий мас- сив значений  типа float, представляющий собой показатели ускорения по всем трем осям. Основываясь на состоянии покоя, когда устройство лежит на задней крышке в портретном режиме, первый элемент означает боковое ускорение,  второй — продольное, третий — вертикальное. Процесс извле- чения этих показателей показан в расширении к листингу 14.2:

final SensorEventListener mySensorEventListener = new

SensorEventListener() {

public void onSensorChanged(SensorEvent sensorEvent) {

if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

float xAxis_lateralA = sensorEvent.values[0];

float yAxis_longitudinalA = sensorEvent.values[1];

float zAxis_verticalA = sensorEvent.values[2];

// TODO Использовать полученное ускорение в своей программе.

}

}

};

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

По теме:

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