Магнитометр — это датчик, измеряющий напряжённость магнитного поля Земли для определения сторон света. В мобильных устройствах он работает как цифровой компас, обеспечивая точность до 1–2 градусов при правильной калибровке. По данным Bosch Sensortec Application Note, 2024, современные MEMS-магнитометры потребляют всего 0.5–2 мА и умещаются в корпусе 1.5×1.5×0.7 мм.
Главное
Магнитометр в мобильном устройстве — это трёхосевой датчик магнитного поля, основанный на эффекте Холла. Он измеряет проекции вектора магнитной индукции на оси X, Y и Z. В сочетании с акселерометром магнитометр позволяет определить азимут — угол между направлением на север и осью телефона.
В современных смартфонах используются MEMS-магнитометры на основе анизотропного магниторезистивного эффекта (AMR) и эффекта Холла. AMR-сенсоры (AKM серия от Asahi Kasei Microdevices) обеспечивают чувствительность 0.15 мкТл/LSB и диапазон ±1200 мкТл — этого достаточно для измерения поля Земли (25–65 мкТл).
| Параметр | Значение |
|---|---|
| Технология | AMR / Эффект Холла |
| Диапазон | ±1200 — ±1300 мкТл |
| Потребление | 0.5–2 мА |
| Размер | 1.5×1.5×0.7 мм |
| Чувствительность | 0.15 мкТл/LSB |
Без цифрового компаса навигационные приложения не могут определить направление движения. Google Maps использует магнитометр для отображения ориентации карты относительно направления взгляда пользователя. При отказе сенсора приложение показывает только положение на карте без синей стрелки направления.
Эффект Холла — физическое явление возникновения разности потенциалов на краях проводящей пластины при воздействии магнитного поля. В MEMS-магнитометрах используются тонкоплёночные структуры из пермаллоя (NiFe), сопротивление которых меняется под действием внешнего магнитного поля (AMR-эффект).
Каждый из трёх каналов (X, Y, Z) состоит из четырёх магниторезисторов, включённых в мост Уитстона. Магнитное поле изменяет сопротивление резисторов на 2–3%, что преобразуется дифференциальным усилителем в напряжение. Встроенный 16-битный АЦП оцифровывает сигнал с частотой до 100 Гц.
Для измерения вертикальной составляющей поля используется интегрированный концентратор магнитного потока (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 используется дополнительный компенсационный контур, измеряющий ток в динамике в реальном времени для вычитания induced-поля. Чехлы с магнитными креплениями (например, в автомобильных держателях) создают сильные искажения — после использования магнитометр может показывать неправильное направление до повторной калибровки.
Android предоставляет два сенсора: TYPE_MAGNETIC_FIELD (калиброванные данные в мкТл) и TYPE_MAGNETIC_FIELD_UNCALIBRATED (сырые данные с оценкой искажения). Для навигационных приложений рекомендуется использовать калиброванный сенсор — система автоматически применяет встроенную калибровку на основе последнего движения по восьмёрке.
Задержка SENSOR_DELAY_NORMAL (200 мс) достаточна для компаса, SENSOR_DELAY_FASTEST (0 мс) — только для специальных исследовательских приложений. После получения значений можно преобразовать их в азимут через 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 мА и поддерживает частоту до 200 Гц. Развитие квантовых магнитометров и NV-центров в алмазе для мобильных устройств пока не вышло из стадии лабораторных экспериментов. Ожидается, что к 2028 году точность мобильных магнитометров достигнет 0.01 мкТл.
Часто задаваемые вопросы
Нарисуйте восьмёрку телефоном в воздухе — это стандартный жест для калибровки цифрового компаса. Если компас всё равно показывает неверно, проверьте чехол: магнитные крепления и металлические элементы создают сильные искажения Hard Iron.
Основные причины: магнитные помехи от динамиков и вибромотора телефона, отсутствие калибровки после смены чехла, влияние металлических предметов рядом. В помещении с железобетонными конструкциями магнитное поле искажается особенно сильно.
Да, приложения-металлоискатели используют встроенный магнитометр для обнаружения аномалий магнитного поля. Однако глубина обнаружения не превышает 10–20 см, и прибор не различает типы металлов — это скорее образовательный инструмент.
TYPE_MAGNETIC_FIELD возвращает данные после калибровки, применённой системой. TYPE_MAGNETIC_FIELD_UNCALIBRATED отдаёт сырые значения плюс оценку смещения (bias), позволяя разработчику применить собственную калибровку.
Используйте SensorManager.getRotationMatrix с данными акселерометра и магнитометра, затем getOrientation — первый элемент массива (азмут) будет в радианах. Для отображения компаса преобразуйте в градусы: Math.toDegrees(azimuth).
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также