Акселерометр в мобильных устройствах — это MEMS-датчик, измеряющий линейное ускорение по трём осям для определения ориентации и движения устройства. По данным Google Android Sensors Guide (2025), акселерометр является самым используемым датчиком в мобильных приложениях. MEMS-технология позволяет разместить датчик в чипе размером 1 мм, потребляющем менее 1 мВт энергии.
Главное
Акселерометр — это микроэлектромеханический (MEMS) датчик, измеряющий проекцию ускорения на три взаимно перпендикулярные оси: X (горизонтальная, направленная вправо), Y (вертикальная, направленная вверх) и Z (перпендикулярная плоскости экрана). В состоянии покоя акселерометр показывает значение 9.8 м/с² по оси Z — это ускорение свободного падения, направленное к центру Земли. По этому значению система определяет ориентацию устройства: если значение по Z близко к 0, а по Y к -9.8 м/с², устройство повёрнуто горизонтально. Диапазон измерений акселерометра обычно составляет ±2g, ±4g, ±8g или ±16g в зависимости от модели чипа.
Современные акселерометры характеризуются несколькими ключевыми параметрами: чувствительность (от 0.001 м/с²), частота дискретизации (до 1000 Гц), диапазон измерений и уровень шума. На флагманских устройствах устанавливаются датчики STMicroelectronics LSM6DSO или Bosch BMI270 с частотой до 1600 Гц и потреблением менее 0.5 мВт в активном режиме. Чем выше частота дискретизации, тем более детальный сигнал получает приложение — для игр требуется 200-400 Гц, для подсчёта шагов достаточно 10-50 Гц. Шум датчика влияет на точность измерений и обычно компенсируется фильтром низких частот на уровне ОС.
MEMS-акселерометр внутри представляет собой микроскопическую структуру из кремния: подвижная масса (proof mass) подвешена на упругих балках (cantilevers) между неподвижными электродами. При ускорении масса смещается, изменяя ёмкость между подвижными и неподвижными элементами — это изменение измеряется и преобразуется в электрический сигнал. Схема с замкнутым контуром обратной связи (closed-loop) удерживает массу в центральном положении с помощью электростатической силы, что обеспечивает линейность измерения во всём диапазоне. В открытых системах (open-loop) масса свободно смещается, и вычисления проще, но точность ниже. По данным STMicroelectronics (2025), closed-loop акселерометры обеспечивают точность до 0.001g при температурном дрейфе менее 0.1 мг/°C.
Три оси акселерометра соответствуют трём измерениям пространства: X (левый-правый наклон), Y (вверх-вниз) и Z (вперёд-назад относительно экрана). Когда устройство лежит на столе экраном вверх, вектор ускорения свободного падения направлен по оси Z вниз со значением 9.8 м/с². При наклоне устройства проекции гравитации перераспределяются между осями — по этим проекциям можно вычислить угол наклона с точностью до 0.1 градуса. Для определения движения без влияния гравитации используется гравитационный фильтр (high-pass filter), который выделяет динамическую составляющую ускорения (собственное движение устройства) из статической (сила тяжести).
На Android доступ к акселерометру осуществляется через класс SensorManager и интерфейс SensorEventListener. Приложение получает системный сервис SENSOR_SERVICE, запрашивает датчик TYPE_ACCELEROMETER и регистрирует слушатель с указанием частоты обновлений. Система вызывает onSensorChanged при каждом новом измерении с массивом значений: values[0] = X, values[1] = Y, values[2] = Z. Ниже приведён полный пример чтения данных с акселерометра на Kotlin.
val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
val accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
val sensorEventListener = object : SensorEventListener {
override fun onSensorChanged(event: SensorEvent) {
val x = event.values[0]
val y = event.values[1]
val z = event.values[2]
// Вычисление угла наклона
val pitch = Math.atan2(
x.toDouble(),
Math.sqrt(y.toDouble() * y + z.toDouble() * z)
)
// Обновление UI с новым углом
textViewAngle.text = "Наклон: ${Math.toDegrees(pitch)}°"
}
override fun onAccuracyChanged(
sensor: Sensor, accuracy: Int
) { }
}
sensorManager.registerListener(
sensorEventListener,
accelerometer,
SensorManager.SENSOR_DELAY_GAME
)
В примере SensorManager.SENSOR_DELAY_GAME задаёт частоту обновлений ~50 Гц, оптимальную для игр и интерактивных приложений. Для подсчёта шагов используйте SENSOR_DELAY_NORMAL (~5 Гц), для точных измерений — SENSOR_DELAY_FASTEST (~200 Гц). В onSensorChanged массив event.values содержит текущие показания датчика. На основе значений X, Y, Z вычисляется угол наклона (pitch) с помощью atan2 — это базовая формула для определения ориентации устройства без использования ориентационного датчика. Не забудьте отменить регистрацию слушателя в onPause для экономии заряда батареи.
private val alpha = 0.8f
private val gravity = FloatArray(3)
private val linearAcceleration = FloatArray(3)
override fun onSensorChanged(event: SensorEvent) {
// Фильтр низких частот (LPF) для выделения гравитации
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]
// Вычитание гравитации — получаем линейное ускорение
linearAcceleration[0] = event.values[0] - gravity[0]
linearAcceleration[1] = event.values[1] - gravity[1]
linearAcceleration[2] = event.values[2] - gravity[2]
}
Фильтр низких частот с коэффициентом alpha выделяет гравитационную составляющую (статический вектор), вычитание которой даёт чистое ускорение устройства (линейное ускорение). Это необходимо для определения движения без учёта ориентации — например, для обнаружения шага, встряхивания или удара. Значение alpha 0.8 означает, что фильтр пропускает ~20% нового сигнала и сохраняет 80% предыдущего — этого достаточно для сглаживания шума без существенной задержки.
На iOS доступ к акселерометру предоставляет фреймворк Core Motion через класс CMMotionManager. Приложение создаёт экземпляр менеджера и вызывает startAccelerometerUpdates с указанием очереди и обработчика. Данные возвращаются в виде CMAccelerometerData, содержащего структуру CMAcceleration с полями x, y и z. Ниже приведён пример получения данных с акселерометра на Swift с фильтрацией шумов.
import CoreMotion
let motionManager = CMMotionManager()
motionManager.accelerometerUpdateInterval = 1.0 / 60.0
guard motionManager.isAccelerometerAvailable else { return }
motionManager.startAccelerometerUpdates(to: OperationQueue.current!) {
data, error in
guard let acceleration = data?.acceleration,
error == nil else { return }
// Значения в g (1 g = 9.8 м/с²)
let magnitude = sqrt(
acceleration.x * acceleration.x +
acceleration.y * acceleration.y +
acceleration.z * acceleration.z
)
// Если magnitude > 2.5 g — обнаружено встряхивание
if magnitude > 2.5 {
DispatchQueue.main.async {
self.handleShake()
}
}
}
В примере accelerometerUpdateInterval устанавливается 1/60 сек (~60 Гц) — оптимально для плавной анимации и игр. Метод isAccelerometerAvailable проверяет наличие датчика на устройстве. Значения ускорения возвращаются в единицах g (где 1 g = 9.8 м/с²). Вектор magnitude вычисляется как евклидова норма трёх компонент — если значение превышает 2.5 g, это интерпретируется как встряхивание устройства (shake). Для остановки обновлений обязательно вызывается stopAccelerometerUpdates при уходе с экрана.
Акселерометр используется в широком спектре мобильных приложений. Самый очевидный сценарий — автоматический поворот экрана: система переключает портретную и альбомную ориентацию на основе данных акселерометра. В играх акселерометр служит контроллером управления — наклон устройства поворачивает руль или перемещает персонажа. Фитнес-приложения подсчитывают шаги на основе характерных пиков ускорения при ходьбе. Ниже приведена таблица с типовыми сценариями и требованиями к датчику.
| Сценарий | Частота (Гц) | Точность | Фильтрация |
|---|---|---|---|
| Автоповорот экрана | 5-10 | Низкая | LPF |
| Подсчёт шагов | 20-50 | Средняя | HPF + пиковый детектор |
| Игры (гонки) | 50-200 | Высокая | Калибровка + LPF |
| Стабилизация камеры | 200-1000 | Максимальная | Комплементарный фильтр |
| Распознавание жестов | 50-100 | Средняя | HPF + пороговый детектор |
При реализации акселерометра важно учитывать, что нагрев устройства и старение датчика могут влиять на точность показаний. Для критичных измерений (стабилизация видео, компас) рекомендуется дополнительно использовать гироскоп и магнитометр в рамках сенсорной интеграции (sensor fusion).
Акселерометры подвержены нескольким типам погрешностей: смещение нуля (bias) — когда датчик показывает ненулевое значение в покое; масштабный коэффициент (scale factor error) — когда чувствительность по разным осям отличается; и шум измерений (noise), снижающий точность единичного отсчёта. На производстве MEMS-датчики калибруются, но с течением времени параметры могут дрейфовать из-за температуры и механических нагрузок. Для коррекции в приложении можно реализовать простую калибровку: в состоянии покоя записать среднее значение (смещение) и вычитать его из всех последующих измерений. Более точная калибровка требует вращения устройства по всем осям — этот метод называется six-point calibration и даёт погрешность менее 0.5%.
Часто задаваемые вопросы
Акселерометр в смартфоне — это MEMS-датчик размером около 1 мм, измеряющий ускорение по трём осям. Он определяет ориентацию устройства (книжная или альбомная), встряхивание, шаги и движение без использования внешних источников.
Акселерометр измеряет линейное ускорение (включая гравитацию), а гироскоп — угловую скорость (вращение). Акселерометр определяет ориентацию, гироскоп — поворот. Вместе они обеспечивают точное отслеживание движения в пространстве (sensor fusion).
Используйте SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) для получения датчика, затем registerListener с SensorEventListener. В onSensorChanged массив event.values содержит значения X, Y, Z в м/с². Обязательно отменяйте регистрацию в onPause.
Вычислите magnitude = sqrt(x² + y² + z²). Если magnitude превышает 2-3 g (после фильтрации гравитации), устройство встряхнули. Для iOS используйте CMMotionManager с порогом 2.5 g, для Android — Sensor.TYPE_LINEAR_ACCELERATION с порогом 15 м/с².
Да, для простой калибровки поместите устройство на ровную поверхность, запишите средние показания по каждой оси в течение 2-3 секунд и вычитайте эти значения из всех последующих измерений. Это компенсирует смещение нуля (bias), но не масштабную ошибку.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также