Магнетометърът е сензор, който измерва интензитета на магнитното поле на Земята за определяне на посоките на света. В мобилните устройства той работи като цифров компас, осигурявайки точност до 1–2 градуса при правилно калибриране. Според Bosch Sensortec Application Note, 2024, съвременните MEMS-магнетометри консумират само 0,5–2 mA и се побират в корпус с размери 1.5×1.5×0.7 mm.
Основни точки
Магнетометърът в мобилното устройство е триосев сензор за магнитно поле, основан на ефекта на Хол. Той измерва проекциите на вектора на магнитната индукция по осите X, Y и Z. В комбинация с акселерометър, магнетометърът позволява определяне на азимута — ъгъла между посоката на север и оста на телефона.
В съвременните смартфони се използват MEMS-магнетометри на базата на анизотропния магниторезистивен ефект (AMR) и ефекта на Хол. AMR-сензорите (серия AKM на Asahi Kasei Microdevices) осигуряват чувствителност от 0,15 μТ/LSB и обхват ±1200 μТ — достатъчно за измерване на земното поле (25–65 μТ).
| Параметър | Стойност |
|---|---|
| Технология | AMR / Ефект на Хол |
| Обхват | ±1200 — ±1300 μТ |
| Консумация | 0,5–2 mA |
| Размер | 1.5×1.5×0.7 mm |
| Чувствителност | 0,15 μТ/LSB |
Без цифров компас навигационните приложения не могат да определят посоката на движение. Google Maps използва магнетометъра за показване на ориентацията на картата спрямо посоката на погледа на потребителя. При отказ на сензора, приложението показва само позицията на картата без синя стрелка за посока.
Ефектът на Хол е физическо явление на възникване на потенциална разлика по краищата на проводяща пластина под въздействието на магнитно поле. В MEMS-магнетометрите се използват тънкослойни структури от пермалой (NiFe), чието съпротивление се променя под въздействието на външно магнитно поле (AMR-ефект).
Всеки от трите канала (X, Y, Z) се състои от четири магниторезистора, свързани в мост на Уитстън. Магнитното поле променя съпротивлението на резисторите с 2–3%, което се преобразува от диференциален усилвател в напрежение. Вграден 16-битов ADC дигитализира сигнала с честота до 100 Hz.
За измерване на вертикалния компонент на полето се използва интегриран концентратор на магнитен поток (IMC — Integrated Magnetic Concentrator). Това е тънкослойна структура от NiFe, която отклонява хоризонталното поле във вертикалната равнина, позволявайки на единичен AMR-мост да измерва и трите оси.
Магнетометърът определя ориентацията спрямо магнитното поле на Земята (абсолютна референция), докато жироскопът измерва само промяната на ъгъла (относителни данни). Жироскопът дава точни данни в кратки интервали, но натрупва грешка от дрейф. Магнетометърът не дрейфва, но е податлив на магнитни смущения.
Android обединява данни от три сензора чрез SensorManager.getRotationMatrix. Магнетометърът се използва за корекция на дрейфа на жироскопа в дълги интервали. Без магнетометър жироскопът за 5 минути натрупва грешка от 10–20 градуса. Според Google ARCore (2024), fusion алгоритъмът постига точност от 1–3 градуса при наличие на магнетометър.
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] — азимут в радиани
Hard Iron — постоянно магнитно поле, създадено от феромагнитни материали вътре в телефона: магнити на говорителите, вибрационен мотор, метална рамка на корпуса. Смущението Hard Iron се проявява като постоянно отместване (bias) по всяка ос. Soft Iron — промяна на посоката на полето поради магнитопроводими материали, които изкривяват формата на силовите линии.
Стандартната процедура за калибриране на магнетометър е завъртане на телефона във формата на осмица (figure-8 pattern). По време на процеса сензорът записва точки в триизмерното пространство. Без смущения точките лежат на сфера с радиус 25–65 μТ. Hard Iron измества центъра на сферата, Soft Iron я превръща в елипсоид. Алгоритъмът за калибриране изчислява параметрите на отместване и мащабиране.
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
)
}
Разработчикът може да реализира собствено калибриране на магнетометъра, като събира данни по време на движение на устройството. Алгоритъмът за елипсоидно прилягане (ellipsoid fitting) намира параметрите на Hard Iron и Soft Iron, като минимизира сумата на квадратите на отклоненията от сферата. Библиотеката Apache Commons Math предоставя реализация на нелинейния метод на най-малките квадрати (Levenberg-Marquardt) за тази задача — точността след програмно калибриране достига 0,5 градуса.
За минимизиране на Hard Iron производителите поставят магнетометъра в горната част на телефона, далеч от говорителя и вибрационния мотор. Инженерите на Apple в iPhone 16 Pro Max (2024) приложиха екраниране на магнетометъра с пермалоево фолио, намалявайки влиянието на говорителя 4 пъти. В Samsung Galaxy S24 Ultra се използва допълнителна компенсационна верига, която измерва тока в говорителя в реално време за изваждане на индуцираното поле. Калъфи с магнитни закрепвания (например в автомобилни държачи) създават силни смущения — след употреба магнетометърът може да показва грешна посока до повторно калибриране.
Android предоставя два сензора: TYPE_MAGNETIC_FIELD (калибрирани данни в μТ) и TYPE_MAGNETIC_FIELD_UNCALIBRATED (сурови данни с оценка на смущението). За навигационни приложения се препоръчва използването на калибриран сензор — системата автоматично прилага вграденото калибриране въз основа на последното движение във формата на осмица.
Закъснението SENSOR_DELAY_NORMAL (200 ms) е достатъчно за компас, SENSOR_DELAY_FASTEST (0 ms) — само за специални изследователски приложения. След получаване на стойностите, те могат да бъдат преобразувани в азимут чрез getRotationMatrix + getOrientation. Важно е да проверявате точността на сензора чрез event.accuracy — стойността SENSOR_STATUS_UNRELIABLE означава необходимост от калибриране.
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)
}
}
Магнетометърът се използва не само за компас. AR приложенията, включително Pokemon GO, използват магнетометъра за определяне на ориентацията на камерата спрямо реалния свят. При липса на магнетометър ARCore превключва в режим Screen Axis — ориентацията се определя само от жироскопа, което намалява точността.
В автомобилните навигационни системи на базата на Android Auto магнетометърът се използва за определяне на посоката на движение при загуба на GPS сигнал в тунели и гъста градска среда. В комбинация с данни от одометрията на колелата на превозното средство (получени чрез OBD-II), магнетометърът позволява продължаване на навигацията до 5 минути без GPS с точност на позициониране от 10–20 метра. Според Google Maps Engineering Blog (2024), хибридният алгоритъм намалява процента на загуба на маршрут в градски каньони с 40%.
Навигационните приложения използват магнетометъра за определяне на азимута на движение — ъгъла между посоката на север и текущия курс на потребителя. В Google Maps данните от магнетометъра се комбинират с GPS следа и история на движение за показване на синя стрелка за посока. При загуба на GPS сигнал (в тунели, подлези) магнетометърът остава единственият източник на информация за ориентация.
Новото поколение 3-осеви магнетометри с интегриран ASIC (BMM350 на Bosch, 2024) консумира само 0,35 mA и поддържа честота до 200 Hz. Развитието на квантови магнетометри и NV центрове в диамант за мобилни устройства все още не е излязло от фазата на лабораторни експерименти. Очаква се до 2028 г. точността на мобилните магнетометри да достигне 0,01 μТ.
Често задавани въпроси
Нарисувайте осмица с телефона във въздуха — това е стандартното движение за калибриране на цифровия компас. Ако компасът все още показва неточно, проверете калъфа: магнитните закрепвания и металните елементи създават силни смущения Hard Iron.
Основни причини: магнитни смущения от говорителите и вибрационния мотор на телефона, липса на калибриране след смяна на калъф, влияние на близки метални предмети. В помещения със стоманобетонни конструкции магнитното поле се изкривява особено силно.
Да, приложенията за металотърсачи използват вградения магнетометър за откриване на аномалии в магнитното поле. Дълбочината на откриване обаче не надвишава 10–20 cm и устройството не различава видовете метал — това е по-скоро образователен инструмент.
TYPE_MAGNETIC_FIELD връща данни след калибриране, приложено от системата. TYPE_MAGNETIC_FIELD_UNCALIBRATED дава сурови стойности плюс оценка на отместването (bias), позволявайки на разработчика да приложи собствено калибриране.
Използвайте SensorManager.getRotationMatrix с данни от акселерометър и магнетометър, след това getOrientation — първият елемент на масива (азимут) ще бъде в радиани. За показване на компаса преобразувайте в градуси: Math.toDegrees(azimuth).
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също