Акселерометр в мобильных приложениях: что это, как работает и где применяется

Автор: IT Sectr Опубликовано: 2026-03-22 Время чтения: 9 мин

Акселерометр в мобильных устройствах — это MEMS-датчик, измеряющий линейное ускорение по трём осям для определения ориентации и движения устройства. По данным Google Android Sensors Guide (2025), акселерометр является самым используемым датчиком в мобильных приложениях. MEMS-технология позволяет разместить датчик в чипе размером 1 мм, потребляющем менее 1 мВт энергии.

Главное

  • Акселерометр — MEMS-датчик, измеряющий ускорение по осям X, Y и Z в м/с² или g.
  • Принцип работы основан на смещении микроскопической массы под воздействием ускорения, фиксируемом ёмкостными датчиками.
  • Android предоставляет доступ через SensorManager и SensorEventListener.
  • iOS использует CoreMotion с CMMotionManager для получения данных с акселерометра.
  • Применение — определение ориентации экрана, подсчёт шагов, игры, стабилизация изображения.

Что такое акселерометр

Акселерометр — это микроэлектромеханический (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

На Android доступ к акселерометру осуществляется через класс SensorManager и интерфейс SensorEventListener. Приложение получает системный сервис SENSOR_SERVICE, запрашивает датчик TYPE_ACCELEROMETER и регистрирует слушатель с указанием частоты обновлений. Система вызывает onSensorChanged при каждом новом измерении с массивом значений: values[0] = X, values[1] = Y, values[2] = Z. Ниже приведён полный пример чтения данных с акселерометра на Kotlin.

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 для экономии заряда батареи.

Фильтрация шумов

kotlin
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

На iOS доступ к акселерометру предоставляет фреймворк Core Motion через класс CMMotionManager. Приложение создаёт экземпляр менеджера и вызывает startAccelerometerUpdates с указанием очереди и обработчика. Данные возвращаются в виде CMAccelerometerData, содержащего структуру CMAcceleration с полями x, y и z. Ниже приведён пример получения данных с акселерометра на Swift с фильтрацией шумов.

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).

Как получить данные с акселерометра на Android?

Используйте 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), но не масштабную ошибку.

Итоги

  • Акселерометр — MEMS-датчик измерения ускорения по осям X, Y, Z, основанный на смещении микроскопической массы.
  • Принцип работы — ёмкостной MEMS с closed-loop обратной связью, точность до 0.001g.
  • Android предоставляет SensorManager с TYPE_ACCELEROMETER и SensorEventListener для доступа к данным.
  • iOS использует Core Motion с CMMotionManager и startAccelerometerUpdates для получения данных.
  • Фильтрация — фильтр низких частот для гравитации и high-pass для линейного ускорения.
  • Применение — автоповорот экрана, подсчёт шагов, игры, стабилизация и распознавание жестов.
  • Рекомендация — выбирайте частоту обновлений под сценарий: для шагов 20-50 Гц, для игр 50-200 Гц, для стедикама 200-1000 Гц.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также