Akcelerometr v mobilních zařízeních je MEMS senzor měřící lineární zrychlení ve třech osách pro určení orientace a pohybu zařízení. Podle Google Android Sensors Guide (2025) je akcelerometr nejpoužívanějším senzorem v mobilních aplikacích. Technologie MEMS umožňuje umístit senzor do čipu o velikosti 1 mm, který spotřebovává méně než 1 mW energie.
Hlavní body
Akcelerometr je mikroelektromechanický (MEMS) senzor měřící průmět zrychlení na tři vzájemně kolmé osy: X (horizontální, směřující doprava), Y (vertikální, směřující nahoru) a Z (kolmá k rovině obrazovky). V klidovém stavu akcelerometr ukazuje hodnotu 9.8 m/s² na ose Z — to je gravitační zrychlení směřující ke středu Země. Na základě této hodnoty systém určuje orientaci zařízení: pokud je hodnota na Z blízko 0 a na Y blízko -9.8 m/s², je zařízení otočeno horizontálně. Měřicí rozsah akcelerometru je obvykle ±2g, ±4g, ±8g nebo ±16g v závislosti na modelu čipu.
Moderní akcelerometry se vyznačují několika klíčovými parametry: citlivost (od 0.001 m/s²), vzorkovací frekvence (až 1000 Hz), měřicí rozsah a úroveň šumu. Do vlajkových zařízení se instalují senzory STMicroelectronics LSM6DSO nebo Bosch BMI270 s frekvencí až 1600 Hz a spotřebou nižší než 0.5 mW v aktivním režimu. Čím vyšší je vzorkovací frekvence, tím detailnější signál aplikace získává — pro hry je potřeba 200-400 Hz, pro počítání kroků stačí 10-50 Hz. Šum senzoru ovlivňuje přesnost měření a je obvykle kompenzován dolní propustí na úrovni operačního systému.
MEMS akcelerometr uvnitř představuje mikroskopickou strukturu z křemíku: pohyblivá hmota (proof mass) je zavěšena na pružných nosnících (cantilevers) mezi pevnými elektrodami. Při zrychlení se hmota posouvá a mění kapacitu mezi pohyblivými a pevnými prvky — tato změna je měřena a převáděna na elektrický signál. Obvod s uzavřenou zpětnou vazbou (closed-loop) udržuje hmotu ve středové poloze pomocí elektrostatické síly, což zajišťuje linearitu měření v celém rozsahu. V otevřených systémech (open-loop) se hmota pohybuje volně a výpočty jsou jednodušší, ale přesnost je nižší. Podle údajů STMicroelectronics (2025) poskytují closed-loop akcelerometry přesnost až 0.001g s teplotním driftem nižším než 0.1 mg/°C.
Tři osy akcelerometru odpovídají třem rozměrům prostoru: X (náklon vlevo-vpravo), Y (nahoru-dolů) a Z (dopředu-dozadu vzhledem k obrazovce). Když zařízení leží na stole obrazovkou nahoru, vektor gravitačního zrychlení směřuje podél osy Z dolů s hodnotou 9.8 m/s². Při náklonu zařízení se průměty gravitace přerozdělují mezi osy — na základě těchto průmětů lze vypočítat úhel náklonu s přesností až 0.1 stupně. Pro určení pohybu bez vlivu gravitace se používá horní propust (high-pass filter), která odděluje dynamickou složku zrychlení (vlastní pohyb zařízení) od statické (gravitační síla).
Na Androidu je přístup k akcelerometru realizován prostřednictvím třídy SensorManager a rozhraní SensorEventListener. Aplikace získá systémovou službu SENSOR_SERVICE, vyžádá senzor TYPE_ACCELEROMETER a zaregistruje posluchače s uvedením frekvence aktualizace. Systém volá onSensorChanged při každém novém měření s polem hodnot: values[0] = X, values[1] = Y, values[2] = Z. Níže je uveden úplný příklad čtení dat z akcelerometru v Kotlinu.
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]
// Výpočet úhlu náklonu
val pitch = Math.atan2(
x.toDouble(),
Math.sqrt(y.toDouble() * y + z.toDouble() * z)
)
// Aktualizace rozhraní s novým úhlem
textViewAngle.text = "Náklon: ${Math.toDegrees(pitch)}°"
}
override fun onAccuracyChanged(
sensor: Sensor, accuracy: Int
) { }
}
sensorManager.registerListener(
sensorEventListener,
accelerometer,
SensorManager.SENSOR_DELAY_GAME
)
V příkladu SensorManager.SENSOR_DELAY_GAME nastavuje frekvenci aktualizace ~50 Hz, optimální pro hry a interaktivní aplikace. Pro počítání kroků použijte SENSOR_DELAY_NORMAL (~5 Hz), pro přesná měření — SENSOR_DELAY_FASTEST (~200 Hz). V onSensorChanged obsahuje pole event.values aktuální údaje senzoru. Na základě hodnot X, Y, Z se vypočítá úhel náklonu (pitch) pomocí atan2 — to je základní vzorec pro určení orientace zařízení bez použití orientačního senzoru. Nezapomeňte zrušit registraci posluchače v onPause pro úsporu baterie.
private val alpha = 0.8f
private val gravity = FloatArray(3)
private val linearAcceleration = FloatArray(3)
override fun onSensorChanged(event: SensorEvent) {
// Dolní propust (LPF) pro oddělení gravitace
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]
// Odečtení gravitace — získáme lineární zrychlení
linearAcceleration[0] = event.values[0] - gravity[0]
linearAcceleration[1] = event.values[1] - gravity[1]
linearAcceleration[2] = event.values[2] - gravity[2]
}
Dolní propust s koeficientem alpha odděluje gravitační složku (statický vektor), jejímž odečtením získáme čisté zrychlení zařízení (lineární zrychlení). To je nezbytné pro určení pohybu bez ohledu na orientaci — například pro detekci kroku, zatřesení nebo nárazu. Hodnota alpha 0.8 znamená, že filtr propouští ~20 % nového signálu a zachovává 80 % předchozího — dostatečné pro vyhlazení šumu bez výrazného zpoždění.
Na iOS je přístup k akcelerometru poskytován frameworkem Core Motion prostřednictvím třídy CMMotionManager. Aplikace vytvoří instanci manažera a zavolá startAccelerometerUpdates s uvedením fronty a handleru. Data jsou vracena jako CMAccelerometerData obsahující strukturu CMAcceleration s poli x, y a z. Níže je uveden příklad získávání dat z akcelerometru ve Swiftu s filtrací šumu.
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 }
// Hodnoty v g (1 g = 9.8 m/s²)
let magnitude = sqrt(
acceleration.x * acceleration.x +
acceleration.y * acceleration.y +
acceleration.z * acceleration.z
)
// Pokud magnitude > 2.5 g — detekováno zatřesení
if magnitude > 2.5 {
DispatchQueue.main.async {
self.handleShake()
}
}
}
V příkladu je accelerometerUpdateInterval nastaven na 1/60 s (~60 Hz) — optimální pro plynulou animaci a hry. Metoda isAccelerometerAvailable kontroluje přítomnost senzoru v zařízení. Hodnoty zrychlení jsou vraceny v jednotkách g (kde 1 g = 9.8 m/s²). Vektor magnitude se vypočítá jako euklidovská norma tří složek — pokud hodnota přesáhne 2.5 g, je to interpretováno jako zatřesení zařízením (shake). Pro zastavení aktualizací zavolejte stopAccelerometerUpdates při opuštění obrazovky.
Akcelerometr se používá v širokém spektru mobilních aplikací. Nejzřejmějším scénářem je automatické otáčení obrazovky: systém přepíná mezi portrétní a krajinnou orientací na základě dat akcelerometru. Ve hrách slouží akcelerometr jako ovladač — náklon zařízení otáčí volantem nebo pohybuje postavou. Fitness aplikace počítají kroky na základě charakteristických špiček zrychlení při chůzi. Níže je uvedena tabulka s typickými scénáři a požadavky na senzor.
| Scénář | Frekvence (Hz) | Přesnost | Filtrace |
|---|---|---|---|
| Automatické otáčení obrazovky | 5-10 | Nízká | LPF |
| Počítání kroků | 20-50 | Střední | HPF + detektor špiček |
| Hry (závody) | 50-200 | Vysoká | Kalibrace + LPF |
| Stabilizace kamery | 200-1000 | Maximální | Komplementární filtr |
| Rozpoznávání gest | 50-100 | Střední | HPF + detektor prahu |
Při implementaci akcelerometru je třeba vzít v úvahu, že zahřívání zařízení a stárnutí senzoru může ovlivnit přesnost údajů. Pro kritická měření (stabilizace videa, kompas) se doporučuje dodatečné použití gyroskopu a magnetometru v rámci integrace senzorů (sensor fusion).
Akcelerometry podléhají několika typům chyb: posun nuly (bias) — když senzor v klidu ukazuje nenulovou hodnotu; chyba měřítka (scale factor error) — když se citlivost na různých osách liší; a měřicí šum (noise), snižující přesnost jednotlivého odečtu. Při výrobě jsou MEMS senzory kalibrovány, ale časem mohou parametry driftovat vlivem teploty a mechanického zatížení. Pro korekci v aplikaci lze implementovat jednoduchou kalibraci: v klidovém stavu zaznamenejte průměrnou hodnotu (posun) a odečítejte ji od všech následujících měření. Přesnější kalibrace vyžaduje rotaci zařízení kolem všech os — tato metoda se nazývá šestibodová kalibrace (six-point calibration) a dává chybu menší než 0.5%.
Často kladené otázky
Akcelerometr v chytrém telefonu je MEMS senzor o velikosti asi 1 mm, který měří zrychlení ve třech osách. Určuje orientaci zařízení (portrét nebo krajina), zatřesení, kroky a pohyb bez použití externích zdrojů.
Akcelerometr měří lineární zrychlení (včetně gravitace), zatímco gyroskop měří úhlovou rychlost (rotaci). Akcelerometr určuje orientaci, gyroskop rotaci. Dohromady poskytují přesné sledování pohybu v prostoru (sensor fusion).
Použijte SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) pro získání senzoru, poté registerListener s SensorEventListener. V onSensorChanged obsahuje pole event.values hodnoty X, Y, Z v m/s². Zrušte registraci v onPause.
Vypočtěte magnitude = sqrt(x² + y² + z²). Pokud magnitude přesahuje 2-3 g (po filtraci gravitace), zařízení bylo zatřeseno. Pro iOS použijte CMMotionManager s prahem 2.5 g, pro Android — Sensor.TYPE_LINEAR_ACCELERATION s prahem 15 m/s².
Ano, pro jednoduchou kalibraci umístěte zařízení na rovný povrch, zaznamenejte průměrné hodnoty pro každou osu po dobu 2-3 sekund a odečítejte tyto hodnoty od všech následujících měření. To kompenzuje posun nuly (bias), ale ne chybu měřítka.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také