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