Магнитометры определяют напряженность магнитного поля вдоль осей X, Y и Z. Точные измерения магнитного поля необходимы для слияния датчиков и определения курса и ориентации.
Чтобы быть полезным для вычисления курса и ориентации, типичные недорогие МЭМС-магнитометры должны быть откалиброваны для компенсации шума окружающей среды и производственных дефектов.
Идеальный трехосный магнитометр измеряет напряженность магнитного поля вдоль ортогональных осей 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');

Мягкие железные эффекты более тонкие. Они возникают из объектов вблизи датчика, которые искажают окружающее магнитное поле. Они имеют эффект растяжения и наклона сферы идеальных измерений. Полученные измерения лежат на эллипсоиде.
Магнитное поле мягкого железа может быть смоделировано вращением вектора геомагнитного поля IMU к раме датчика, его растяжением и последующим вращением обратно к глобальной раме.
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');

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

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

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

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

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
Можно запустить отдельные решатели, если необходимо исправить только некоторые дефекты или добиться более простого вычисления коррекции.
Многие МЭМС-магнитометры имеют регистры внутри датчика, которые можно использовать для компенсации смещения твердого железа. Фактически, часть (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');
'eye', 'diag', и 'sym' следует осторожно использовать флаги и проверять выходные значения. В некоторых случаях может быть недостаточно данных для высокого порядка ('diag' или 'sym') подгонку и лучший набор параметров коррекции можно найти с помощью более простого A матрица. 'auto' Эта ситуация решается опцией вписывания, которая является опцией по умолчанию.
Рассмотрим случай, когда недостаточно данных используется для слесаря высокого порядка.
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 реал, и гарантирует, что R является положительным определенным и симметричным.
magcal функция может давать калибровочные параметры для коррекции твердых и мягких смещений железа в магнитометре. Вызов функции без строки опции или эквивалентно 'auto' строка опции, обеспечивает наилучшее соответствие и охватывает большинство вариантов.