Акцелерометар у мобилним уређајима је MEMS сензор који мери линеарно убрзање по три осе за одређивање оријентације и кретања уређаја. Према Google Android Sensors Guide (2025), акцелерометар је најчешће коришћени сензор у мобилним апликацијама. MEMS технологија омогућава постављање сензора у чип величине 1 мм, који троши мање од 1 мW енергије.
Главне тачке
Акцелерометар је микроелектромеханички (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-у приступ акцелерометру се остварује кроз класу 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)
)
// Ажурирање интерфејса са новим углом
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 ради уштеде батерије.
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 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).
Користите 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), али не и грешку размере.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође