Магнитометры (Компас) — Абсолютный курс в магнитном поле Земли
Магнитометр — это цифровой компас. Он измеряет напряженность магнитного поля Земли по трем осям \((B_x, B_y, B_z)\). В робототехнике он используется для определения курса (Heading/Yaw) — угла поворота робота относительно магнитного севера. Это единственный доступный на борту сенсор, который дает абсолютную ориентацию по одной оси.
Почему магнитометр нельзя просто прочитать?
Показания сырого магнитометра — это вектор в системе координат датчика, на который влияют:
- Наклон робота (магнитное поле Земли имеет вертикальную составляющую).
- Постоянные помехи от магнитов и железа на самом роботе (Hard Iron).
- Деформации поля от проводящих материалов (Soft Iron).
- Магнитное склонение (разница между магнитным и истинным севером).
Физика и математика
Вектор магнитного поля Земли
Магнитное поле Земли можно представить как вектор, направленный вниз под углом к поверхности (в Северном полушарии). Его можно разложить: \[ \vec{B}_{earth} = \vec{B}_{horiz} + \vec{B}_{vert} \]
- Горизонтальная составляющая \(B_{horiz}\) указывает на магнитный север.
- Вертикальная составляющая \(B_{vert}\) зависит от широты.
Определение курса (Heading)
В идеальном случае, если датчик расположен идеально горизонтально, курс вычисляется через арктангенс: \[ \psi_{raw} = \arctan2(-B_y, B_x) \] где \(B_x\) и \(B_y\) — показания магнитометра в горизонтальной плоскости.
Проблема: Робот редко стоит идеально ровно. Наклон вносит ошибку.
Компенсация наклона (Tilt Compensation)
Если известны углы наклона \(\theta\) (pitch) и \(\phi\) (roll) из акселерометра или IMU, можно пересчитать магнитные показания в горизонтальную плоскость.
Пусть \(R_x(\phi)\) и \(R_y(\theta)\) — матрицы поворота для компенсации крена и тангажа. Тогда скорректированные горизонтальные компоненты: \[ \begin{bmatrix} B_{x,h} \\ B_{y,h} \\ B_{z,h} \end{bmatrix} = R_y(-\theta) \cdot R_x(-\phi) \cdot \begin{bmatrix} B_x \\ B_y \\ B_z \end{bmatrix} \]
После этого истинный курс вычисляется как: \[ \psi_{comp} = \arctan2(-B_{y,h}, B_{x,h}) \]
Магнитное склонение (Declination)
Магнитный север не совпадает с географическим (истинным) севером. Угол между ними называется магнитным склонением (δ). Оно зависит от местоположения и медленно меняется со временем.
Чтобы получить курс относительно истинного севера: \[ \psi_{true} = \psi_{magnetic} + \delta \]
Пример: Для Москвы склонение \( \delta \approx +12^\circ\). Это значит, что стрелка компаса показывает на \(12^\circ\) восточнее истинного севера. Значение нужно прибавить.
Калибровка: Без нее компас бесполезен
Калибровка магнитометра — самый важный этап. Она решает две основные проблемы:
1. Hard Iron Calibration (Смещение нуля)
Причина: Постоянные магниты (моторы, динамики) и намагниченные стальные детали создают постоянное смещающее поле \(\vec{O}\).
Эффект: Центр “магнитной сферы” сдвигается от начала координат \((0,0,0)\).
Математика: Каждое измерение искажено: \[ \vec{B}_{measured} = \vec{B}_{earth} + \vec{O} \]
Калибровка: Нужно повращать датчик во всех возможных ориентациях и найти минимальные и максимальные значения по каждой оси. Смещение вычисляется как: \[ O_x = \frac{\max(B_x) + \min(B_x)}{2}, \quad O_y = \frac{\max(B_y) + \min(B_y)}{2}, \quad O_z = \frac{\max(B_z) + \min(B_z)}{2} \]
2. Soft Iron Calibration (Деформация поля)
Причина: Металлические конструкции (алюминий, сталь) искажают форму магнитного поля. Идеальная сфера превращается в эллипсоид.
Эффект: Разная чувствительность по осям и перекрестные помехи.
Математика: Преобразование описывается матрицей 3x3: \[ \vec{B}_{corrected} = \mathbf{S} \cdot (\vec{B}_{measured} - \vec{O}) \] где \(\mathbf{S}\) — матрица масштабирования и перекрестной компенсации (Soft Iron Matrix).
Калибровка: Собирается большой набор данных при вращении датчика, затем решается задача нахождения наилучшего эллипсоида, аппроксимирующего эти точки. На практике для простых роботов часто достаточно Hard Iron калибровки.
Сравнительная таблица популярных магнитометров
| Модель | Интерфейс | Чувствительность | Особенности | Рекомендация |
|---|---|---|---|---|
| QMC5883L | I2C | 0.3 µT/LSB | Китайский клон HMC5883L. Крайне распространен, дешев. Адрес I2C: 0x0D. | Стартовый выбор для экспериментов. Требует внимательной калибровки. |
| HMC5883L | I2C | 0.73 mG/LSB | Легендарный датчик от Honeywell, снят с производства. | Качественный, но теперь чаще встречается в старых проектах или б/у. |
| AK8963 | I2C | 0.15 µT/LSB | Часто встроен в модули MPU-9250/ICM-20948. Хорошая стабильность. | Удобно, если уже используете 9-DOF IMU на этих чипах. |
| LIS3MDL (ST) | I2C / SPI | 0.58 µT/LSB | Современный датчик от STMicroelectronics. Низкий шум, низкое энергопотребление. | Лучший выбор для новых проектов. Стабильнее и точнее QMC. |
| MMC5983MA | I2C / SPI | 0.0625 mG/LSB | Очень высокая чувствительность и разрешение. Отличная стабильность. | Профессиональный выбор для задач, требующих максимальной точности. |
Практические схемы подключения и код
Схема подключения (QMC5883L к Arduino)
Arduino → QMC5883L
5V → VCC
GND → GND
A4 → SDA
A5 → SCL
Не забудьте подтягивающие резисторы ~4.7 кОм на SDA/SCL к 3.3V.
Пример кода: Базовое чтение и вычисление курса (без компенсации наклона)
#include <Wire.h>
#include <QMC5883LCompass.h> // Используйте библиотеку QMC5883L
QMC5883LCompass compass;
void setup() {
Serial.begin(115200);
Wire.begin();
compass.init();
// Здесь должен быть вызов процедуры калибровки!
}
void loop() {
// Прочитать значения
compass.read();
// Получить сырые значения
int x = compass.getX();
int y = compass.getY();
int z = compass.getZ();
// Вычислить азимут (курс) от 0 до 359 градусов
int azimuth = compass.getAzimuth();
// Вывести
Serial.print("X: "); Serial.print(x);
Serial.print(" Y: "); Serial.print(y);
Serial.print(" Z: "); Serial.print(z);
Serial.print(" Azimuth: "); Serial.println(azimuth);
delay(100);
}
Критически важные советы по применению
Размещение — это всё. Устанавливайте магнитометр:
- На мачте/стойке как можно дальше от источников помех.
- На расстоянии. Магнитное поле от провода с током убывает как \( \frac{1}{r} \), от постоянного магнита как \( \frac{1}{r^3} \). Каждые лишние 5 см — на вес золота.
- Вдали от силовых трасс и DC-DC преобразователей.
Калибруйте на месте. Калибровка, проведенная на столе, не будет работать, когда вы прикрутите датчик к роботу с моторами. Калибруйте готового собранного робота.
Используйте компенсацию наклона. Серьезный проект без акселерометра для компенсации наклона не имеет смысла. Используйте 9-DOF IMU (акселерометр+гироскоп+магнитометр).
Обновляйте магнитное склонение. Используйте актуальные данные для ваших координат (можно получить из онлайн-калькуляторов или библиотек).
Проверяйте “здоровье” поля. Перед началом движения робот может проверять, что величина полного вектора магнитного поля \( \sqrt{B_x^2 + B_y^2 + B_z^2} \) близка к ожидаемой для данной местности (~25-65 µT). Сильное отклонение говорит о близкой помехе.
Частые проблемы и решения
| Проблема | Симптом | Вероятная причина | Решение |
|---|---|---|---|
| Курс “залипает” | Показания почти не меняются при повороте. | 1. Датчик не инициализирован. 2. Ошибка в I2C (неправильный адрес). 3. Сильная Hard Iron помеха (сдвиг за пределы шкалы). | Проверить адрес, инициализацию. Провести калибровку. |
| Ошибка в 90/180° | Курс в целом правильный, но с постоянным смещением. | Неверная подстановка осей X/Y в atan2. Магнитное склонение не учтено. | Проверить формулу. Учесть склонение. |
| Показания “прыгают” | Курс хаотично меняется на ±10-30°. | 1. Soft Iron искажения (металл рядом). 2. Электромагнитные помехи (ШИМ моторов). 3. Вибрации. | Убрать металл, подавить помехи фильтром в ПО, закрепить датчик. |
| Не работает при наклоне | При наклоне робота курс искажается до полной бесполезности. | Отсутствует компенсация наклона. | Внедрить получение углов Pitch/Roll от IMU и использовать формулы компенсации. |
Лабораторный эксперимент: Наблюдаем Hard Iron смещение
Цель: Увидеть, как металл искажает показания.
Что нужно: Любой магнитометр (например, QMC5883L), Arduino, компьютер.
Шаги:
- Загрузите простой скетч, который выводит сырые \(B_x, B_y, B_z\).
- Откройте Serial Plotter. Медленно вращайте датчик в воздухе, описывая сферу. На графике вы увидите синусоиды.
- Фаза 1 (без помех): Оцените центры этих синусоид (приблизительно должны быть около 0).
- Фаза 2 (с помехой): Поднесите к датчику небольшой магнит или отвёртку. Снова повращайте. Вы увидите, как вся синусоида сместилась по вертикали. Это и есть Hard Iron смещение \(\vec{O}\).
Вывод: Без вычитания этого смещения вычисленный курс будет всегда сдвинут на фиксированный угол. Калибровка — это процесс измерения и последующего вычитания этого смещения.
Что дальше?
Магнитометр — ключ к абсолютной ориентации, но он хрупок и капризен. Освоив его, вы готовы к построению полной системы ориентации:
- Sensor Fusion (Фильтры) — как объединить данные магнитометра, гироскопа и акселерометра в стабильный и точный курс с помощью фильтра Маджвика или Калмана.
- Полная навигационная система — как интегрировать компас с GPS и одометрией для надежного позиционирования.
- Калибровка сложных систем — углубленные методы калибровки и анализ погрешностей.
Финальная рекомендация: Для первого серьезного проекта используйте готовый 9-DOF модуль (например, на базе BNO055 или ICM-20948), который берет на себя всю сложную математику слияния данных и компенсации. Это сэкономит массу времени. Создавайте же свой алгоритм fusion, только когда поймете его необходимость и будете готовы к глубокому погружению.
