
В настоящее время широко доступны датчики на основе магнитометров. Они позволяют легко получить направление на магнитный север (или истинный, если, конечно, вы учтёте магнитное склонение в вашей местности). Это может быть полезно для определения ориентации оси рысканья/курса беспилотных аппаратов. Одна из проблем магнитометров связана с их калибровкой, поскольку на магнитометр влияют находящиеся рядом с ним магнитотвёрдые (имеют собственное магнитное поле) и магнитомягкие (легко намагничиваются от внешнего магнитного поля, в том числе от поля Земли) материалы. Ниже я расскажу, как избавиться от влияния этих материалов и откалибровать магнитометр.
Про калибровку магнитометров писали уже неоднократно. Однако, калибровка обобщённым фильтром Калмана учёта магнитомягких материалов обнаружилась лишь в статьях Extended Kalman Filter Based Gyroscope (авторы Ke Han, He Han, Zhifeng Wang, Feng Xu) и Real-Time Magnetic Field Calibration Method Based on Extended Kalman Filter (авторы LI Wenkuan, CAI Haoyuan, ZHAO Shenglin, LIU Chunxiu). Возможно, есть и другие статьи, но я ориентировался на вот эти. Так как сходу разобраться в этих статьях не так-то просто (я разбирался две недели с коллегой-математиком, ибо в статьях есть и ошибки и нет акцента на важных моментах из-за чего легко ошибиться при построении собственного фильтра), то ниже я дам пошаговый алгоритм калибровки магнитометра по методике из этих статей.
Итак, поехали!
1 Основные положения
Пусть имеется внешнее магнитное поле
, где
Для определения матрицы
Пусть вектор состояния
содержит предсказанные фильтром истинные значения магнитного поля
На каждой итерации работы фильтра должны быть известны показания измерений магнитометра
где
Сами абсолютные значения углов вращения как таковые значения не имеют, но вот их изменения от итерации к итерации должны соответствовать действительному изменению углов. То есть, если был поворот на 10 градусов между итерациями, то переданный на следующую итерацию угол должен быть изменён на эти же 10 градусов. Так-то эта матрица вовсе не нужна, если вы можете построить матрицу вращения за итерацию непосредственно по гироскопам.
2 Инициализация фильтра Калмана
1. Инициализируем вектор состояний шага
2. Инициализируем ковариационную матрицу состояний
3. Инициализируем матрицу вращения предыдущего шага
3 Предсказание
1. Вычисляем изменение матрицы поворота
2. Задаём матрицу динамики (прогнозирования)
Таким образом, матрица частных производных функции динамики (якобиан) определяется как
3. Вычисляем прогноз вектора состояний
4. Вычисляем прогноз ковариационной матрицы состояний
, где
4 Корректировка
1. Из полученного прогнозного вектора состояний
Таким образом, с учётом симметричности матрицы
Элементы этой матрицы нужно взять из прогнозного вектора состояний
2. Применим функцию измерений к предсказанному вектору состояний:
Матрицу магнитной анизотропии, вектор смещений и вектор истинного магнитного поля нужно взять так же из того же прогнозного вектора состояний. Обратите внимание, что в обобщённом фильтре Калмана предсказанные истинные значения не вычисляются умножением вектора состояний на
3. Вычисляем ошибку
Здесь вектор измеренного значения магнитного поля соответствует не прогнозу, а реальным измерениям. То есть, на этом шаге мы просто вычисляем ошибку фильтра по предсказанию. Фильтр Калмана работает в обратном направлении — он пытается построить измерение по идеальным (по его мнению) данным и некоторому преобразованию этих идеальных данных. А потом мы просто сравниваем степень несоответствия предсказания с реальностью.
4. Зададим матрицу ковариации шума измерений
5. Считаем усиление фильтра:
6. Обновляем вектор состояния:
На этом шаге мы учитываем ошибку предсказания и просто корректируем наши предсказанные значения.
7. Обновляем ковариационную матрицу состояний:
8. Обновляем старые переменные в новое состояние:
9. Переходим к первому пункту этапа Предсказание.
Через некоторое время в компонентах вектора
Успешных калибровок! :)
Экспериментальная программа. Буквально на попробовать. Я такое даже на свой гитхаб класть не хочу. Но все операции с матрицами там есть.