Акцелерометар у мобилним апликацијама: шта је то, како ради и где се примењује

Аутор: IT Sectr Објављено: 2026-03-22 Време читања: 9 мин

Акцелерометар у мобилним уређајима је MEMS сензор који мери линеарно убрзање по три осе за одређивање оријентације и кретања уређаја. Према Google Android Sensors Guide (2025), акцелерометар је најчешће коришћени сензор у мобилним апликацијама. MEMS технологија омогућава постављање сензора у чип величине 1 мм, који троши мање од 1 мW енергије.

Главне тачке

  • Акцелерометар — MEMS сензор који мери убрзање по осама X, Y и Z у m/s² или g.
  • Принцип рада заснива се на померању микроскопске масе под утицајем убрзања, које бележе капацитивни сензори.
  • Android пружа приступ кроз SensorManager и SensorEventListener.
  • iOS користи CoreMotion са CMMotionManager за добијање података са акцелерометра.
  • Примена — одређивање оријентације екрана, бројање корака, игре, стабилизација слике.

Шта је акцелерометар

Акцелерометар је микроелектромеханички (MEMS) сензор који мери пројекцију убрзања на три међусобно управне осе: X (хоризонтална, усмерена удесно), Y (вертикална, усмерена нагоре) и Z (управна на раван екрана). У стању мировања, акцелерометар показује вредност 9.8 m/s² на оси Z — ово је убрзање гравитације усмерено ка центру Земље. На основу ове вредности систем одређује оријентацију уређаја: ако је вредност на Z близу 0, а на Y близу -9.8 m/s², уређај је ротиран хоризонтално. Опсег мерења акцелерометра обично износи ±2g, ±4g, ±8g или ±16g у зависности од модела чипа.

Физички параметри акцелерометра

Савремени акцелерометри се карактеришу неколико кључних параметара: осетљивост (од 0.001 m/s²), фреквенца очитавања (до 1000 Hz), опсег мерења и ниво шума. На водећим уређајима уграђују се сензори STMicroelectronics LSM6DSO или Bosch BMI270 са фреквенцом до 1600 Hz и потрошњом мањом од 0.5 mW у активном режиму. Што је већа фреквенца очитавања, детаљнији сигнал добија апликација — за игре је потребно 200-400 Hz, за бројање корака довољно је 10-50 Hz. Шум сензора утиче на тачност мерења и обично се компензује нископропусним филтером на нивоу оперативног система.

Принцип рада акцелерометра

MEMS акцелерометар унутра представља микроскопску структуру од силицијума: покретна маса (proof mass) окачена је на еластичним гредама (cantilevers) између непокретних електрода. При убрзању, маса се помера, мењајући капацитивност између покретних и непокретних елемената — ова промена се мери и претвара у електрични сигнал. Коло са затвореном повратном спрегом (closed-loop) држи масу у централном положају електростатичком силом, што обезбеђује линеарност мерења у целом опсегу. У отвореним системима (open-loop) маса се слободно креће и прорачуни су једноставнији, али је тачност мања. Према подацима STMicroelectronics (2025), closed-loop акцелерометри обезбеђују тачност до 0.001g при температурном дрифту мањем од 0.1 mg/°C.

Осе мерења

Три осе акцелерометра одговарају трима димензијама простора: X (нагиб лево-десно), Y (горе-доле) и Z (напред-назад у односу на екран). Када уређај лежи на столу екраном окренутим нагоре, вектор гравитационог убрзања усмерен је дуж осе Z надоле са вредношћу 9.8 m/s². При нагињању уређаја, пројекције гравитације се прерасподељују између оса — на основу ових пројекција може се израчунати угао нагиба са тачношћу до 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)
        )
        // Ажурирање интерфејса са новим углом
        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 Hz, оптималну за игре и интерактивне апликације. За бројање корака користите SENSOR_DELAY_NORMAL (~5 Hz), за прецизна мерења — SENSOR_DELAY_FASTEST (~200 Hz). У 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 m/s²)
    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 s (~60 Hz) — оптимално за глатку анимацију и игре. Метод isAccelerometerAvailable проверава присуство сензора на уређају. Вредности убрзања се враћају у јединицама g (где је 1 g = 9.8 m/s²). Вектор magnitude се израчунава као Еуклидова норма три компоненте — ако вредност прелази 2.5 g, то се интерпретира као протресање уређаја (shake). За заустављање ажурирања обавезно позовите stopAccelerometerUpdates при напуштању екрана.

Сценарији употребе

Акцелерометар се користи у широком спектру мобилних апликација. Најочигледнији сценариј је аутоматска ротација екрана: систем пребацује између портретне и пејзажне оријентације на основу података акцелерометра. У играма, акцелерометар служи као контролер управљања — нагињање уређаја окреће волан или помера лик. Фитнес апликације броје кораке на основу карактеристичних врхова убрзања при ходању. Испод је табела са типичним сценаријима и захтевима према сензору.

СценаријФреквенца (Hz)ТачностФилтрација
Аутоматска ротација екрана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 у m/s². Обавезно откажите регистрацију у onPause.

Како детектовати протресање уређаја?

Израчунајте magnitude = sqrt(x² + y² + z²). Ако magnitude прелази 2-3 g (након филтрације гравитације), уређај је протресен. За iOS користите CMMotionManager са прагом 2.5 g, за Android — Sensor.TYPE_LINEAR_ACCELERATION са прагом 15 m/s².

Може ли се акцелерометар калибрисати програмски?

Да, за једноставну калибрацију поставите уређај на равну површину, забележите средња очитавања за сваку осу током 2-3 секунде и одузимајте ове вредности од свих каснијих мерења. Ово компензује померај нуле (bias), али не и грешку размере.

Резиме

  • Акцелерометар — MEMS сензор мерења убрзања по осама X, Y, Z, заснован на померању микроскопске масе.
  • Принцип рада — капацитивни MEMS са closed-loop повратном спрегом, тачност до 0.001g.
  • Android пружа SensorManager са TYPE_ACCELEROMETER и SensorEventListener за приступ подацима.
  • iOS користи Core Motion са CMMotionManager и startAccelerometerUpdates за добијање података.
  • Филтрација — нископропусни филтер за гравитацију и високопропусни за линеарно убрзање.
  • Примена — аутоматска ротација екрана, бројање корака, игре, стабилизација и препознавање гестова.
  • Препорука — бирајте фреквенцу ажурирања према сценарију: за кораке 20-50 Hz, за игре 50-200 Hz, за стабилизацију 200-1000 Hz.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође