Калибровка магнитометра

Магнитометры обнаруживают напряженность магнитного поля вдоль осей X, Y и Z датчика. Точные измерения магнитного поля необходимы для слияния датчика и определения курса и ориентации.

В порядок, чтобы быть полезным для расчета курса и ориентации, типичные недорогие магнитометры MEMS должны быть калиброваны, чтобы компенсировать шум окружающей среды и производственные дефекты.

Идеальные магнитометры

Идеальный трехосевой магнитометр измеряет напряженность магнитного поля вдоль ортогональных осей X, Y и Z. При отсутствии магнитных помех показания магнитометра измеряют магнитное поле Земли. Если измерения магнитометра сделаны, когда датчик вращается через все возможные ориентации, измерения должны лежать на сфере. Радиус сферы является напряжением магнитного поля.

Чтобы сгенерировать выборки магнитного поля, используйте imuSensor объект. Для этих целей безопасно предположить, что скорость вращения и ускорение равны нулю при каждой ориентации.

N = 500;
rng(1);
acc = zeros(N,3);
av = zeros(N,3);
q = randrot(N,1); % uniformly distributed random rotations
imu = imuSensor('accel-mag');
[~,x] = imu(acc,av,q);
scatter3(x(:,1),x(:,2),x(:,3));
axis equal
title('Ideal Magnetometer Data');

Эффекты жесткого железа

Источники шума и производственные дефекты ухудшают измерение магнитометра. Наиболее яркими из них являются тяжелые эффекты железа. Эффекты жесткого железа являются стационарными источниками интерферирующего магнитного шума. Часто они происходят от других металлических объектов на печатной плате с магнитометром. Эффекты жесткого железа смещают источник идеальной сферы.

imu.Magnetometer.ConstantBias = [2 10 40];
[~,x] = imu(acc,av,q);
figure;
scatter3(x(:,1),x(:,2),x(:,3));
axis equal
title('Magnetometer Data With a Hard Iron Offset');

Эффекты мягкого железа

Эффекты мягкого железа более тонкие. Они возникают из-за объектов около датчика, которые искажают окружающее магнитное поле. Они имеют эффект растяжения и наклона сферы идеальных измерений. Результаты измерений лежат на эллипсоиде.

Эффекты магнитного поля мягкого железа могут быть симулированы путем поворота вектора геомагнитного поля БИНС к кадру датчика, растягивания его и последующего поворота назад к глобальной системе координат.

nedmf = imu.MagneticField;
Rsoft = [2.5 0.3 0.5; 0.3 2 .2; 0.5 0.2 3];
soft = rotateframe(conj(q),rotateframe(q,nedmf)*Rsoft);

for ii=1:numel(q)
    imu.MagneticField = soft(ii,:);
    [~,x(ii,:)] = imu(acc(ii,:),av(ii,:),q(ii));
end
figure;
scatter3(x(:,1),x(:,2),x(:,3));
axis equal
title('Magnetometer Data With Hard and Soft Iron Effects');

Метод коррекции

The magcal функция может использоваться, чтобы определить параметры калибровки магнитометра, которые составляют как эффекты жесткого, так и мягкого железа. Данные о некалиброванном магнитометре могут быть смоделированы как лежащие на эллипсоиде с уравнением

$$(x - b)R(x-b)^{T} = \beta^2$$

В этом уравнении R является матрицей 3 на 3, b является вектором 1 на 3, определяющим эллипсоидный центр, x является вектором 1 на 3 некалиброванных измерений магнитометра и$\beta$ является скаляром, указывающим напряженность магнитного поля. Вышеприведенное уравнение является общей формой коника. Для эллипсоида R должен быть положительно определен. The magcal функция использует множество решателей, основанных на различных предположениях о R. В magcal функция, R может быть принята как тождества матрица, диагональ матрица или симметричная матрица.

The magcal функция создает корректирующие коэффициенты, которые берут измерения, которые лежат на смещение эллипсоиде и преобразуют их, чтобы лежать на идеальной сфере, центрированной на источник. The magcal функция возвращает 3 на 3 действительную матрицу А и вектор 1 на 3 b. Чтобы исправить вычисление некалиброванных данных

$$m = (x-b)A.$$

Здесь x - массив 1 на 3 измерений некалиброванного магнитометра, а m - массив 1 на 3 скорректированных измерений магнитометра, которые лежат на сфере. Матрица А имеет определяющего 1 и является матричным квадратным корнем R. Кроме того, A имеет ту же форму, что и R: тождества, диагональ или симметричная матрица. Поскольку эти виды матриц не могут передать вращение, матрица А не повернет данные магнитометра во время коррекции.

The magcal функция также возвращает третий выход, который является напряжением магнитного поля. $\beta$Можно использовать силу магнитного поля, чтобы задать ExpectedMagneticFieldStrength свойство ahrsfilter.

Использование magcal Функция

Используйте magcal функция для определения параметров калибровки, которые корректируют данные зашумленного магнитометра. Создайте данные зашумленного магнитометра путем установки NoiseDensity свойство Magnetometer свойство в imuSensor. Используйте повернутое и растянутое магнитное поле в переменной soft для симуляции эффектов мягкого железа.

imu.Magnetometer.NoiseDensity = 0.08;
for ii=1:numel(q)
    imu.MagneticField = soft(ii,:);
    [~,x(ii,:)] = imu(acc(ii,:),av(ii,:),q(ii));
end

Как найти A и b параметры, которые лучше всего корректируют данные некалиброванного магнитометра, просто вызывайте функцию как:

[A,b,expMFS]  = magcal(x);
xCorrected = (x-b)*A;

Постройте график исходных и исправленных данных. Показать эллипсоид, который лучше всего подходит для исходных данных. Показать сферу, на которой должны лежать исправленные данные.

de = HelperDrawEllipsoid;
de.plotCalibrated(A,b,expMFS,x,xCorrected,'Auto');

The magcal функция использует множество решателей, чтобы минимизировать остаточную ошибку. Остаточная ошибка - это сумма расстояний между калиброванными данными и сферой радиуса expMFS.

$$E = \frac{1}{2 \beta^2}\sqrt{ \frac{\sum ||(x-b)A||^2 - \beta^2}{N} }$$

r = sum(xCorrected.^2,2) - expMFS.^2;
E = sqrt(r.'*r./N)./(2*expMFS.^2);
fprintf('Residual error in corrected data : %.2f\n\n',E);
Residual error in corrected data : 0.01

Можно запустить отдельные решатели, если нужно исправить только некоторые дефекты или достичь более простых расчетов коррекции.

Расчет только смещения

Многие магнитометры MEMS имеют регистры в датчике, которые могут использоваться для компенсации смещения жесткого железа. В эффект (x-b) фрагмент уравнения выше происходит на борту датчика. Когда необходима только компенсация смещения жесткого железа, A матрица эффективно становится матрицей тождеств. Чтобы определить только твердую коррекцию железа, magcal функцию можно вызвать следующим образом:

[Aeye,beye,expMFSeye] = magcal(x,'eye');
xEyeCorrected = (x-beye)*Aeye;
[ax1,ax2] = de.plotCalibrated(Aeye,beye,expMFSeye,x,xEyeCorrected,'Eye');
view(ax1,[-1 0 0]);
view(ax2,[-1 0 0]);

Компенсация жесткого железа и расчет масштабирования оси

Для многих приложений обработки эллипсоидной матрицы как диагональной матрицы достаточно. Геометрически это означает, что эллипсоид данных о некалиброванном магнитометре аппроксимируется так, чтобы его полуоси совмещались с осями системы координат и смещением центра от источника. Хотя это вряд ли будет фактическими характеристиками эллипсоида, это сводит уравнение коррекции к одному умножению и одинарному вычитанию по оси.

[Adiag,bdiag,expMFSdiag] = magcal(x,'diag');
xDiagCorrected = (x-bdiag)*Adiag;
[ax1,ax2] = de.plotCalibrated(Adiag,bdiag,expMFSdiag,x,xDiagCorrected,...
    'Diag');

Полная жесткая и мягкая железная компенсация

Чтобы заставить magcal функция для решения произвольного эллипсоида и создания плотного, симметричного A матрица, вызовите функцию как:

[A,b] = magcal(x,'sym');

Автоматическая подгонка

The 'eye', 'diag', и 'sym' следует тщательно использовать флаги и проверять выходные значения. В некоторых случаях может быть недостаточно данных для высокого порядка ('diag' или 'sym') подгонка и лучший набор параметров коррекции можно найти с помощью более простой A матрица. The 'auto' опция fit, который является параметром по умолчанию, обрабатывает эту ситуацию.

Примите во внимание случай, когда недостаточно данных используется с фиттером высокого порядка.

xidx = x(:,3) > 100;
xpoor = x(xidx,:);
[Apoor,bpoor,mfspoor] = magcal(xpoor,'diag');

Недостаточно данных, распространенных по поверхности эллипсоида, чтобы достичь хорошей подгонки и правильных параметров калибровки с 'diag' опция. В результате этого Apoor матрица сложна.

disp(Apoor)
   0.0000 + 0.4722i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.0000 + 0.5981i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.0000 + 0.0000i   3.5407 + 0.0000i

Использование 'auto' опция подгонки избегает этой проблемы и находит более простой A матрица, которая является действительной, симметричной и положительно определенной. Вызывающие magcal с 'auto' строка опции аналогична вызову без какой-либо строки опции.

[Abest,bbest,mfsbest] = magcal(xpoor,'auto');
disp(Abest)
     1     0     0
     0     1     0
     0     0     1

Сравнение результатов использования 'auto' слесарь и неправильный слесарь высокого порядка показывают опасности непроверки возвращенного A матрица перед корректировкой данных.

de.compareBest(Abest,bbest,mfsbest,Apoor,bpoor,mfspoor,xpoor);

Вызов magcal функция со 'auto' флаг, который является значением по умолчанию, попробует все возможности 'eye', 'diag' и 'sym' поиск A и b который минимизирует остаточную ошибку, сохраняет A real, и гарантирует, что R положительно определено и симметрично.

Заключение

The magcal функция может задать параметры калибровки для коррекции смещений жесткого и мягкого железа в магнитометре. Вызов функции без строки опции или, эквивалентно, 'auto' option string, обеспечивает лучшую подгонку и охватывает большинство случаев.