Magnetometr to czujnik mierzący natężenie pola magnetycznego Ziemi w celu określania kierunków świata. W urządzeniach mobilnych działa jak cyfrowy kompas, zapewniając dokładność do 1–2 stopni przy prawidłowej kalibracji. Według danych Bosch Sensortec Application Note, 2024, nowoczesne MEMS-magnetometry pobierają zaledwie 0.5–2 mA i mieszczą się w obudowie 1.5×1.5×0.7 mm.
Najważniejsze
Magnetometr w urządzeniu mobilnym to trójosiowy czujnik pola magnetycznego oparty na efekcie Halla. Mierzy rzuty wektora indukcji magnetycznej na osie X, Y i Z. W połączeniu z akcelerometrem magnetometr pozwala określić azymut — kąt między kierunkiem na północ a osią telefonu.
W nowoczesnych smartfonach stosuje się MEMS-magnetometry oparte na anizotropowym efekcie magnetorezystancyjnym (AMR) i efekcie Halla. Czujniki AMR (seria AKM firmy Asahi Kasei Microdevices) zapewniają czułość 0.15 µT/LSB i zakres ±1200 µT — to wystarcza do pomiaru pola Ziemi (25–65 µT).
| Parametr | Wartość |
|---|---|
| Technologia | AMR / Efekt Halla |
| Zakres | ±1200 — ±1300 µT |
| Pobór mocy | 0.5–2 mA |
| Rozmiar | 1.5×1.5×0.7 mm |
| Czułość | 0.15 µT/LSB |
Bez cyfrowego kompasu aplikacje nawigacyjne nie mogą określić kierunku ruchu. Google Maps używa magnetometru do wyświetlania orientacji mapy względem kierunku spojrzenia użytkownika. W przypadku awarii czujnika aplikacja pokazuje tylko położenie na mapie bez niebieskiej strzałki kierunku.
Efekt Halla to zjawisko fizyczne polegające na powstaniu różnicy potencjałów na krawędziach płytki przewodzącej pod wpływem pola magnetycznego. W MEMS-magnetometrach stosuje się cienkowarstwowe struktury z permalloju (NiFe), których rezystancja zmienia się pod wpływem zewnętrznego pola magnetycznego (efekt AMR).
Każdy z trzech kanałów (X, Y, Z) składa się z czterech magnetorezystorów włączonych w mostek Wheatstone'a. Pole magnetyczne zmienia rezystancję rezystorów o 2–3%, co jest przekształcane przez wzmacniacz różnicowy na napięcie. Wbudowany 16-bitowy przetwornik ADC digitalizuje sygnał z częstotliwością do 100 Hz.
Do pomiaru składowej pionowej pola stosuje się zintegrowany koncentrator strumienia magnetycznego (IMC — Integrated Magnetic Concentrator). Jest to cienkowarstwowa struktura z NiFe, która odchyla pole poziome do płaszczyzny pionowej, umożliwiając pojedynczemu mostkowi AMR pomiar wszystkich trzech osi.
Magnetometr określa orientację względem pola magnetycznego Ziemi (bezwzględne odniesienie), a żyroskop mierzy tylko zmianę kąta (dane względne). Żyroskop dostarcza dokładne dane w krótkich przedziałach czasu, ale kumuluje błąd dryfu. Magnetometr nie dryfuje, lecz jest podatny na zakłócenia magnetyczne.
Android łączy dane z trzech czujników poprzez SensorManager.getRotationMatrix. Magnetometr służy do korekcji dryfu żyroskopu w długich przedziałach czasu. Bez magnetometru żyroskop w ciągu 5 minut kumuluje błąd do 10–20 stopni. Według danych Google ARCore (2024), algorytm fusion osiąga dokładność 1–3 stopni przy obecności 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] — azymut w radianach
Hard Iron — stałe pole magnetyczne wytwarzane przez materiały ferromagnetyczne wewnątrz telefonu: magnesy głośników, silnik wibracyjny, metalową ramkę obudowy. Zniekształcenie Hard Iron objawia się jako stałe przesunięcie (bias) w każdej osi. Soft Iron — zmiana kierunku pola spowodowana materiałami magnetoprzewodzącymi, które zniekształcają kształt linii pola.
Standardowa procedura kalibracji magnetometru polega na obracaniu telefonu ósemką (figure-8 pattern). Podczas tego procesu czujnik rejestruje punkty w przestrzeni trójwymiarowej. Bez zniekształceń punkty leżą na sferze o promieniu 25–65 µT. Hard Iron przesuwa środek sfery, Soft Iron zamienia ją w elipsoidę. Algorytm kalibracji oblicza parametry przesunięcia i skalowania.
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
)
}
Deweloper może zaimplementować własną kalibrację magnetometru, zbierając dane podczas ruchu urządzenia. Algorytm dopasowania elipsoidy (ellipsoid fitting) znajduje parametry Hard Iron i Soft Iron, minimalizując sumę kwadratów odchyleń od sfery. Biblioteka Apache Commons Math udostępnia implementację nieliniowej metody najmniejszych kwadratów (Levenberg-Marquardt) dla tego zadania — dokładność po programowej kalibracji sięga 0.5 stopnia.
Aby zminimalizować Hard Iron, producenci umieszczają magnetometr w górnej części telefonu, z dala od głośnika i silnika wibracyjnego. Inżynierowie Apple w iPhone 16 Pro Max (2024) zastosowali ekranowanie magnetometru folią permallojową, która zmniejszyła wpływ głośnika 4-krotnie. W Samsung Galaxy S24 Ultra zastosowano dodatkowy obwód kompensacyjny mierzący prąd w głośniku w czasie rzeczywistym w celu odejmowania indukowanego pola. Etui z magnetycznymi mocowaniami (np. w uchwytach samochodowych) powodują silne zniekształcenia — po ich użyciu magnetometr może wskazywać nieprawidłowy kierunek aż do ponownej kalibracji.
Android udostępnia dwa czujniki: TYPE_MAGNETIC_FIELD (dane skalibrowane w µT) i TYPE_MAGNETIC_FIELD_UNCALIBRATED (surowe dane z oceną zniekształcenia). Do aplikacji nawigacyjnych zaleca się używanie skalibrowanego czujnika — system automatycznie stosuje wbudowaną kalibrację na podstawie ostatniego ruchu ósemką.
Opóźnienie SENSOR_DELAY_NORMAL (200 ms) jest wystarczające dla kompasu, SENSOR_DELAY_FASTEST (0 ms) — tylko do specjalnych aplikacji badawczych. Po otrzymaniu wartości można przekształcić je na azymut przez getRotationMatrix + getOrientation. Ważne jest sprawdzanie dokładności czujnika przez event.accuracy — wartość SENSOR_STATUS_UNRELIABLE oznacza konieczność kalibracji.
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 jest używany nie tylko do kompasu. Aplikacje AR, w tym Pokemon GO, wykorzystują magnetometr do określania orientacji kamery względem rzeczywistego świata. W przypadku braku magnetometru ARCore przełącza się w tryb Screen Axis — orientacja jest określana tylko przez żyroskop, co obniża dokładność.
W samochodowych systemach nawigacyjnych opartych na Android Auto magnetometr służy do określania kierunku jazdy przy utracie sygnału GPS w tunelach i gęstej zabudowie miejskiej. W połączeniu z danymi z odometrii kół pojazdu (odczytywanymi przez OBD-II) magnetometr pozwala kontynuować nawigację do 5 minut bez GPS z dokładnością pozycjonowania 10–20 metrów. Według danych Google Maps Engineering Blog (2024), algorytm hybrydowy zmniejsza odsetek utraty trasy w kanionach miejskich o 40%.
Aplikacje nawigacyjne używają magnetometru do określania azymutu ruchu — kąta między kierunkiem na północ a bieżącym kursem użytkownika. W Google Maps dane magnetometru są łączone z śladem GPS i historią przemieszczeń w celu wyświetlenia niebieskiej strzałki kierunku. W przypadku utraty sygnału GPS (w tunelach, przejściach podziemnych) magnetometr pozostaje jedynym źródłem informacji o orientacji.
Nowa generacja 3-osiowych magnetometrów ze zintegrowanym ASIC (BMM350 od Bosch, 2024) pobiera zaledwie 0.35 mA i obsługuje częstotliwość do 200 Hz. Rozwój kwantowych magnetometrów i centrów NV w diamencie dla urządzeń mobilnych nie wyszedł jeszcze z fazy eksperymentów laboratoryjnych. Oczekuje się, że do 2028 roku dokładność mobilnych magnetometrów osiągnie 0.01 µT.
Często zadawane pytania
Narysuj ósemkę telefonem w powietrzu — to standardowy gest kalibracji cyfrowego kompasu. Jeśli kompas nadal pokazuje nieprawidłowo, sprawdź etui: magnetyczne mocowania i metalowe elementy powodują silne zniekształcenia Hard Iron.
Główne przyczyny: zakłócenia magnetyczne od głośników i silnika wibracyjnego telefonu, brak kalibracji po zmianie etui, wpływ pobliskich metalowych przedmiotów. W pomieszczeniach z konstrukcjami żelbetowymi pole magnetyczne jest zniekształcane szczególnie silnie.
Tak, aplikacje wykrywaczy metali wykorzystują wbudowany magnetometr do wykrywania anomalii pola magnetycznego. Jednak głębokość wykrywania nie przekracza 10–20 cm, a urządzenie nie rozróżnia rodzajów metali — jest to raczej narzędzie edukacyjne.
TYPE_MAGNETIC_FIELD zwraca dane po kalibracji zastosowanej przez system. TYPE_MAGNETIC_FIELD_UNCALIBRATED podaje surowe wartości plus oszacowanie przesunięcia (bias), umożliwiając deweloperowi zastosowanie własnej kalibracji.
Użyj SensorManager.getRotationMatrix z danymi akcelerometru i magnetometru, następnie getOrientation — pierwszy element tablicy (azymut) będzie w radianach. Do wyświetlenia kompasu przekształć na stopnie: Math.toDegrees(azimuth).
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również