Magnetometr je senzor, který měří intenzitu magnetického pole Země pro určení světových stran. V mobilních zařízeních funguje jako digitální kompas a při správné kalibraci poskytuje přesnost až 1–2 stupně. Podle Bosch Sensortec Application Note, 2024 spotřebovávají moderní MEMS-magnetometry pouze 0,5–2 mA a vejdou se do pouzdra o rozměrech 1,5×1,5×0,7 mm.
Hlavní body
Magnetometr v mobilním zařízení je tříosý senzor magnetického pole založený na Hallově jevu. Měří projekce vektoru magnetické indukce na osy X, Y a Z. V kombinaci s akcelerometrem umožňuje magnetometr určit azimut — úhel mezi směrem na sever a osou telefonu.
V moderních chytrých telefonech se používají MEMS-magnetometry založené na anizotropním magnetorezistivním jevu (AMR) a Hallově jevu. AMR senzory (řada AKM od Asahi Kasei Microdevices) poskytují citlivost 0,15 µT/LSB a rozsah ±1200 µT — to stačí pro měření zemského pole (25–65 µT).
| Parametr | Hodnota |
|---|---|
| Technologie | AMR / Hallův jev |
| Rozsah | ±1200 — ±1300 µT |
| Spotřeba | 0,5–2 mA |
| Velikost | 1,5×1,5×0,7 mm |
| Citlivost | 0,15 µT/LSB |
Bez digitálního kompasu nemohou navigační aplikace určit směr pohybu. Mapy Google používají magnetometr k zobrazení orientace mapy vzhledem ke směru pohledu uživatele. Při výpadku senzoru aplikace zobrazuje pouze polohu na mapě bez modré šipky směru.
Hallův jev je fyzikální jev vzniku rozdílu potenciálů na okrajích vodivé destičky působením magnetického pole. V MEMS-magnetometrech se používají tenkovrstvé struktury z permalloye (NiFe), jejichž odpor se mění působením vnějšího magnetického pole (AMR jev).
Každý ze tří kanálů (X, Y, Z) se skládá ze čtyř magnetorezistorů zapojených do Wheatstoneova můstku. Magnetické pole mění odpor rezistorů o 2–3%, což je diferenciálním zesilovačem převedeno na napětí. Vestavěný 16bitový ADC digitalizuje signál s frekvencí až 100 Hz.
Pro měření vertikální složky pole se používá integrovaný koncentrátor magnetického toku (IMC — Integrated Magnetic Concentrator). Jedná se o tenkovrstvou strukturu z NiFe, která odklání horizontální pole do vertikální roviny, což umožňuje jedinému AMR můstku měřit všechny tři osy.
Magnetometr určuje orientaci vzhledem k magnetickému poli Země (absolutní reference), zatímco gyroskop měří pouze změnu úhlu (relativní data). Gyroskop poskytuje přesná data v krátkých intervalech, ale akumuluje chybu driftu. Magnetometr nedriftuje, ale je náchylný k magnetickému rušení.
Android spojuje data tří senzorů prostřednictvím SensorManager.getRotationMatrix. Magnetometr se používá pro korekci driftu gyroskopu v dlouhých intervalech. Bez magnetometru gyroskop za 5 minut akumuluje chybu 10–20 stupňů. Podle Google ARCore (2024) dosahuje fusion algoritmus přesnosti 1–3 stupňů při přítomnosti magnetometru.
val accelerometerReading = FloatArray(3)
val magnetometerReading = FloatArray(3)
val rotationMatrix = FloatArray(9)
val orientationAngles = FloatArray(3)
SensorManager.getRotationMatrix(
rotationMatrix, null,
accelerometerReading,
magnetometerReading
)
SensorManager.getOrientation(
rotationMatrix, orientationAngles
)
// orientationAngles[0] — azimut v radiánech
Hard Iron — konstantní magnetické pole vytvářené feromagnetickými materiály uvnitř telefonu: magnety reproduktorů, vibračním motorkem, kovovým rámem pouzdra. Zkreslení Hard Iron se projevuje jako konstantní posun (bias) na každé ose. Soft Iron — změna směru pole způsobená magneticky vodivými materiály, které deformují tvar siločar.
Standardní postup kalibrace magnetometru spočívá v otáčení telefonu do osmičky (figure-8 pattern). Během procesu senzor zaznamenává body v trojrozměrném prostoru. Bez zkreslení leží body na kouli o poloměru 25–65 µT. Hard Iron posouvá střed koule, Soft Iron ji mění na elipsoid. Kalibrační algoritmus vypočítá parametry posunu a škálování.
data class CalibrationParams(
val biasX: Float,
val biasY: Float,
val biasZ: Float,
val scaleX: Float,
val scaleY: Float,
val scaleZ: Float
)
fun applySoftIronCorrection(
raw: FloatArray, p: CalibrationParams
): FloatArray {
return floatArrayOf(
(raw[0] - p.biasX) * p.scaleX,
(raw[1] - p.biasY) * p.scaleY,
(raw[2] - p.biasZ) * p.scaleZ
)
}
Vývojář může implementovat vlastní kalibraci magnetometru sběrem dat během pohybu zařízení. Algoritmus proložení elipsoidu (ellipsoid fitting) nachází parametry Hard Iron a Soft Iron minimalizací součtu čtverců odchylek od koule. Knihovna Apache Commons Math poskytuje implementaci nelineární metody nejmenších čtverců (Levenberg-Marquardt) pro tento úkol — přesnost po programové kalibraci dosahuje 0,5 stupně.
Pro minimalizaci Hard Iron umisťují výrobci magnetometr do horní části telefonu, daleko od reproduktoru a vibračního motorku. Inženýři Apple v iPhone 16 Pro Max (2024) použili stínění magnetometru permalloyovou fólií, což snížilo vliv reproduktoru 4krát. V Samsung Galaxy S24 Ultra se používá přídavný kompenzační obvod měřící proud v reproduktoru v reálném čase pro odečtení indukovaného pole. Pouzdra s magnetickými úchytkami (například v autodržácích) vytvářejí silná zkreslení — po použití může magnetometr ukazovat špatný směr až do opětovné kalibrace.
Android poskytuje dva senzory: TYPE_MAGNETIC_FIELD (kalibrovaná data v µT) a TYPE_MAGNETIC_FIELD_UNCALIBRATED (surová data s odhadem zkreslení). Pro navigační aplikace se doporučuje používat kalibrovaný senzor — systém automaticky aplikuje vestavěnou kalibraci na základě posledního pohybu osmičkou.
Zpoždění SENSOR_DELAY_NORMAL (200 ms) je pro kompas dostačující, SENSOR_DELAY_FASTEST (0 ms) — pouze pro speciální výzkumné aplikace. Po obdržení hodnot je lze převést na azimut pomocí getRotationMatrix + getOrientation. Je důležité kontrolovat přesnost senzoru pomocí event.accuracy — hodnota SENSOR_STATUS_UNRELIABLE znamená nutnost kalibrace.
override fun onSensorChanged(event: SensorEvent) {
if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) {
val accuracy = event.accuracy
if (accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) {
showCalibrationHint()
return
}
System.arraycopy(event.values, 0,
magnetometerReading, 0, 3)
}
}
Magnetometr se používá nejen pro kompas. AR aplikace, včetně Pokemon GO, používají magnetometr k určení orientace kamery vůči reálnému světu. Při absenci magnetometru přepíná ARCore do režimu Screen Axis — orientace je určována pouze gyroskopem, což snižuje přesnost.
V automobilových navigačních systémech založených na Android Auto se magnetometr používá k určení směru jízdy při ztrátě signálu GPS v tunelech a husté městské zástavbě. V kombinaci s daty z odometrie kol vozidla (získanými přes OBD-II) umožňuje magnetometr pokračovat v navigaci až 5 minut bez GPS s přesností určení polohy 10–20 metrů. Podle Google Maps Engineering Blog (2024) snižuje hybridní algoritmus procento ztráty trasy v městských kaňonech o 40%.
Navigační aplikace používají magnetometr k určení azimutu pohybu — úhlu mezi směrem na sever a aktuálním kursem uživatele. V Mapách Google jsou data magnetometru kombinována s GPS stopou a historií pohybů pro zobrazení modré šipky směru. Při ztrátě signálu GPS (v tunelech, podchodech) zůstává magnetometr jediným zdrojem informací o orientaci.
Nová generace 3osých magnetometrů s integrovaným ASIC (BMM350 od Bosch, 2024) spotřebovává pouze 0,35 mA a podporuje frekvenci až 200 Hz. Vývoj kvantových magnetometrů a NV center v diamantu pro mobilní zařízení zatím nevyšel z fáze laboratorních experimentů. Očekává se, že do roku 2028 dosáhne přesnost mobilních magnetometrů 0,01 µT.
Často kladené otázky
Nakreslete telefonem ve vzduchu osmičku — to je standardní pohyb pro kalibraci digitálního kompasu. Pokud kompas stále ukazuje nepřesně, zkontrolujte pouzdro: magnetické úchytky a kovové prvky vytvářejí silná zkreslení Hard Iron.
Hlavní příčiny: magnetické rušení od reproduktorů a vibračního motorku telefonu, chybějící kalibrace po výměně pouzdra, vliv blízkých kovových předmětů. V místnostech s železobetonovými konstrukcemi je magnetické pole zkresleno obzvláště silně.
Ano, aplikace detektoru kovů používají vestavěný magnetometr k detekci anomálií magnetického pole. Hloubka detekce však nepřesahuje 10–20 cm a zařízení nerozlišuje typy kovů — jedná se spíše o vzdělávací nástroj.
TYPE_MAGNETIC_FIELD vrací data po kalibraci provedené systémem. TYPE_MAGNETIC_FIELD_UNCALIBRATED poskytuje surové hodnoty plus odhad posunu (bias), což umožňuje vývojáři aplikovat vlastní kalibraci.
Použijte SensorManager.getRotationMatrix s daty akcelerometru a magnetometru, poté getOrientation — první prvek pole (azimut) bude v radiánech. Pro zobrazení kompasu převeďte na stupně: Math.toDegrees(azimuth).
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é