exponenta event banner

ahrsfilter

Ориентация от показаний акселерометра, гироскопа и магнитометра

Описание

ahrsfilter Система object™ плавит акселерометр, магнитометр и данные датчика гироскопа для оценки ориентации устройства.

Для оценки ориентации устройства:

  1. Создать ahrsfilter и задайте его свойства.

  2. Вызовите объект с аргументами, как если бы это была функция.

Дополнительные сведения о работе системных объектов см. в разделе Что такое системные объекты?.

Создание

Описание

пример

FUSE = ahrsfilter возвращает косвенный объект System фильтра Калмана, FUSEдля сенсорного слияния данных акселерометра, гироскопа и магнитометра для оценки ориентации устройства и угловой скорости. Фильтр использует 12-элементный вектор состояния для отслеживания ошибки оценки для ориентации, смещения гироскопа, линейного ускорения и магнитного возмущения.

FUSE = ahrsfilter('ReferenceFrame',RF) возвращает объект ahrsfilter System, который сплавляет данные акселерометра, гироскопа и магнитометра для оценки ориентации устройства относительно опорного кадра RF. Определить RF как 'NED' (Север-Восток-вниз) или 'ENU' (Восток-Север-Вверх). Значением по умолчанию является NED.

пример

FUSE = ahrsfilter(___,Name,Value) задает каждое свойство Name к указанному Value. Неопределенные свойства имеют значения по умолчанию.

Свойства

развернуть все

Если не указано иное, свойства не настраиваются, что означает невозможность изменения их значений после вызова объекта. Объекты блокируются при их вызове, и release функция разблокирует их.

Если свойство настраивается, его значение можно изменить в любое время.

Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.

Частота входных выборок данных датчика в Гц, заданная как положительный скаляр.

Настраиваемый: Нет

Типы данных: single | double

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

Количество строк входных данных - accelReadings, gyroReadings, и magReadings - должно быть кратно коэффициенту прореживания.

Типы данных: single | double

Дисперсия шума сигнала акселерометра в (m/s2) 2, заданная как положительный действительный скаляр.

Настраиваемый: Да

Типы данных: single | double

Дисперсия шума сигнала магнитометра в μT2, заданная как положительный действительный скаляр.

Настраиваемый: Да

Типы данных: single | double

Дисперсия шума сигнала гироскопа в (рад/с) 2, заданная как положительный действительный скаляр.

Настраиваемый: Да

Типы данных: single | double

Дисперсия смещения гироскопа в (рад/с) 2, заданная как положительный действительный скаляр.

Настраиваемый: Да

Типы данных: single | double

Дисперсия шума линейного ускорения в (m/s2) 2, заданная как положительный действительный скаляр. Линейное ускорение моделируется как процесс белого шума с фильтрацией нижних частот.

Настраиваемый: Да

Типы данных: single | double

Коэффициент затухания для дрейфа линейного ускорения, заданный как скаляр в диапазоне [0,1). Если линейное ускорение изменяется быстро, установите LinearAcclerationDecayFactor до меньшего значения. Если линейное ускорение изменяется медленно, установите LinearAcclerationDecayFactor к более высокому значению. Дрейф линейного ускорения моделируется как процесс белого шума с фильтрацией нижних частот.

Настраиваемый: Да

Типы данных: single | double

Дисперсия шума магнитного возмущения в μT2, заданная как действительный конечный положительный скаляр.

Настраиваемый: Да

Типы данных: single | double

Коэффициент затухания для магнитного возмущения, определяемый как положительный скаляр в диапазоне [0,1]. Магнитное возмущение моделируется как марковский процесс первого порядка.

Настраиваемый: Да

Типы данных: single | double

Ковариационная матрица для технологического шума, заданная как матрица 12 на 12. Значение по умолчанию:

  Columns 1 through 6

   0.000006092348396                   0                   0                   0                   0                   0
                   0   0.000006092348396                   0                   0                   0                   0
                   0                   0   0.000006092348396                   0                   0                   0
                   0                   0                   0   0.000076154354947                   0                   0
                   0                   0                   0                   0   0.000076154354947                   0
                   0                   0                   0                   0                   0   0.000076154354947
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0

  Columns 7 through 12

                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
   0.009623610000000                   0                   0                   0                   0                   0
                   0   0.009623610000000                   0                   0                   0                   0
                   0                   0   0.009623610000000                   0                   0                   0
                   0                   0                   0   0.600000000000000                   0                   0
                   0                   0                   0                   0   0.600000000000000                   0
                   0                   0                   0                   0                   0   0.600000000000000

Исходная ковариационная матрица процесса учитывает ошибку в модели процесса.

Типы данных: single | double

Ожидаемая оценка напряженности магнитного поля в мкТ, заданная как реальный положительный скаляр. Ожидаемая напряженность магнитного поля - оценка напряженности магнитного поля Земли в текущем местоположении.

Настраиваемый: Да

Типы данных: single | double

Формат ориентации вывода, указанный как 'quaternion' или 'Rotation matrix'. Размер выходных данных зависит от размера входных данных, N и формата ориентации выходных данных:

  • 'quaternion' - Вывод является N-by-1 quaternion.

  • 'Rotation matrix' - Вывод является матрицей ротации 3-by-3-by-N.

Типы данных: char | string

Использование

Описание

пример

[orientation,angularVelocity] = FUSE(accelReadings,gyroReadings,magReadings) плавит акселерометр, гироскоп и данные магнитометра для вычисления измерений ориентации и угловой скорости. Алгоритм предполагает, что устройство неподвижно перед первым вызовом.

Входные аргументы

развернуть все

Показания акселерометра в системе координат корпуса датчика в м/с2, указанные в виде матрицы N-by-3. N - количество выборок и три столбца accelReadings представляют измерения [x y z ]. Предполагается, что показания акселерометра соответствуют частоте выборки, указанной свойством SampleRate.

Типы данных: single | double

Показания гироскопа в системе координат корпуса датчика в рад/с, заданные в виде матрицы N-by-3. N - количество выборок и три столбца gyroReadings представляют измерения [x y z ]. Предполагается, что показания гироскопа соответствуют частоте выборки, заданной свойством SampleRate.

Типы данных: single | double

Показания магнитометра в системе координат корпуса датчика в мкТ, указанные в виде матрицы N-by-3. N - количество выборок и три столбца magReadings представляют измерения [x y z ]. Предполагается, что показания магнитометра соответствуют частоте дискретизации, заданной свойством SampleRate.

Типы данных: single | double

Выходные аргументы

развернуть все

Ориентация, которая может поворачивать величины из локальной навигационной системы координат в систему координат тела, возвращаемую в виде кватернионов или массива. Размер и тип orientation зависит от того, имеет ли свойство OrientationFormat значение 'quaternion' или 'Rotation matrix':

  • 'quaternion' - выходной сигнал представляет собой M-by-1 вектор кватернионов с тем же базовым типом данных, что и входные данные.

  • 'Rotation matrix' - выходной сигнал представляет собой 3-by-3-by-M массив матриц вращения того же типа данных, что и входные данные.

Число входных выборок, N и свойство DecimationFactor определяют М.

Вы можете использовать orientation в rotateframe функция для поворота величин из локальной навигационной системы в систему координат тела датчика.

Типы данных: quaternion | single | double

Угловая скорость с смещением гироскопа, удаленным в системе координат корпуса датчика в рад/с, возвращается в виде матрицы M-by-3. Количество входных выборок, N и DecimationFactor свойство определяет М.

Типы данных: single | double

Функции объекта

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

release(obj)

развернуть все

tuneМелодия ahrsfilter параметры для уменьшения ошибки оценки
stepЗапустить алгоритм объекта System
releaseДеблокирование ресурсов и разрешение изменений значений свойств объекта системы и входных признаков
resetСброс внутренних состояний объекта System

Примеры

свернуть все

Загрузить rpy_9axis файл, содержащий записанные данные датчика акселерометра, гироскопа и магнитометра от устройства, колеблющегося по тангажу (вокруг оси y), затем по рысканию (вокруг оси z), а затем по крену (вокруг оси x). Файл также содержит частоту дискретизации записи.

load 'rpy_9axis' sensorData Fs
accelerometerReadings = sensorData.Acceleration;
gyroscopeReadings = sensorData.AngularVelocity;
magnetometerReadings = sensorData.MagneticField;

Создание ahrsfilter object™ системы с SampleRate установите на частоту дискретизации данных датчика. Укажите коэффициент прореживания, равный двум, чтобы снизить вычислительную стоимость алгоритма.

decim = 2;
fuse = ahrsfilter('SampleRate',Fs,'DecimationFactor',decim);

Передайте показания акселерометра, гироскопа и магнитометра в ahrsfilter объект, fuseдля вывода оценки ориентации корпуса датчика во времени. По умолчанию ориентация выводится как вектор кватернионов.

q = fuse(accelerometerReadings,gyroscopeReadings,magnetometerReadings);

Ориентация определяется угловым смещением, необходимым для поворота родительской системы координат на дочернюю систему координат. Постройте график ориентации в углах Эйлера в градусах по времени.

ahrsfilter правильно оценивает изменение ориентации с течением времени, включая первоначальную ориентацию на юг.

time = (0:decim:size(accelerometerReadings,1)-1)/Fs;

plot(time,eulerd(q,'ZYX','frame'))
title('Orientation Estimate')
legend('z-axis', 'y-axis', 'x-axis')
ylabel('Rotation (degrees)')

Figure contains an axes. The axes with title Orientation Estimate contains 3 objects of type line. These objects represent z-axis, y-axis, x-axis.

В этом примере показана производительность ahrsfilterНа object™ системы воздействуют магнитными помехами.

Груз StationaryIMUReadings, который содержит показания акселерометра, магнитометра и гироскопа от стационарного IMU.

load 'StationaryIMUReadings.mat' accelReadings magReadings gyroReadings SampleRate

numSamples = size(accelReadings,1);

ahrsfilter использует напряженность магнитного поля для стабилизации его ориентации против предполагаемого постоянного магнитного поля Земли. Однако существует много естественных и искусственных объектов, которые выводят магнитные поля и могут запутать алгоритм. Для учета наличия переходных магнитных полей можно установить MagneticDisturbanceNoise свойство на ahrsfilter объект.

Создание ahrsfilter объект с коэффициентом прореживания, равным 2, и запишите ожидаемую по умолчанию напряженность магнитного поля.

decim = 2;
FUSE = ahrsfilter('SampleRate',SampleRate,'DecimationFactor',decim);

Слейте показания IMU с помощью фильтра системы координат положения и курса (AHRS), а затем визуализируйте ориентацию корпуса датчика во времени. Ориентация колеблется в начале и стабилизируется приблизительно через 60 секунд.

orientation = FUSE(accelReadings,gyroReadings,magReadings);

orientationEulerAngles = eulerd(orientation,'ZYX','frame');
time = (0:decim:(numSamples-1))'/SampleRate;

figure(1)
plot(time,orientationEulerAngles(:,1), ...
     time,orientationEulerAngles(:,2), ...
     time,orientationEulerAngles(:,3))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
legend('z-axis','y-axis','x-axis')
title('Filtered IMU Data')

Имитация магнитного помех путем добавления переходного сильного магнитного поля к магнитному полю, записанному в magReadings. Визуализируйте заклинивание магнитного поля.

jamStrength = [10,5,2];
startStop = (50*SampleRate):(150*SampleRate);
jam = zeros(size(magReadings));
jam(startStop,:) = jamStrength.*ones(numel(startStop),3);

magReadings = magReadings + jam;

figure(2)
plot(time,magReadings(1:decim:end,:))
xlabel('Time (s)')
ylabel('Magnetic Field Strength (\mu T)')
title('Simulated Magnetic Field with Jamming')
legend('z-axis','y-axis','x-axis')

Снова запустите моделирование с помощью magReadings с магнитным заклиниванием. Постройте график результатов и обратите внимание на снижение производительности при оценке ориентации.

reset(FUSE)
orientation = FUSE(accelReadings,gyroReadings,magReadings);

orientationEulerAngles = eulerd(orientation,'ZYX','frame');

figure(3)
plot(time,orientationEulerAngles(:,1), ...
     time,orientationEulerAngles(:,2), ...
     time,orientationEulerAngles(:,3))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
legend('z-axis','y-axis','x-axis')
title('Filtered IMU Data with Magnetic Disturbance and Default Properties')

Магнитные помехи были неверно интерпретированы фильтром AHRS, и ориентация корпуса датчика была неверно оценена. Вы можете компенсировать заклинивание, увеличив MagneticDisturbanceNoise собственность. Увеличение MagneticDisturbanceNoise свойство увеличивает предполагаемый диапазон шума для магнитного возмущения, и весь сигнал магнитометра взвешивается меньше в лежащем в основе алгоритме слияния ahrsfilter.

Установите MagneticDisturbanceNoise кому 200 и запустите моделирование еще раз.

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

reset(FUSE)
FUSE.MagneticDisturbanceNoise = 20;

orientation = FUSE(accelReadings,gyroReadings,magReadings);

orientationEulerAngles = eulerd(orientation,'ZYX','frame');

figure(4)
plot(time,orientationEulerAngles(:,1), ...
     time,orientationEulerAngles(:,2), ...
     time,orientationEulerAngles(:,3))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
legend('z-axis','y-axis','x-axis')
title('Filtered IMU Data with Magnetic Disturbance and Modified Properties')

В этом примере используется ahrsfilter Система object™ плавить 9-осевые данные IMU от корпуса датчика, который встряхивается. Постройте график расстояния кватерниона между объектом и его конечным положением покоя для визуализации производительности и того, как быстро фильтр сходится в правильное положение покоя. Затем выполните настройку параметров ahrsfilter чтобы фильтр быстрее сходился в положение покоя «земля-истина».

Груз IMUReadingsShaken в текущую рабочую область. Эти данные записывали из IMU, который встряхивали, затем укладывали в положение покоя. Визуализация ускорения, магнитного поля и угловой скорости, регистрируемых датчиками.

load 'IMUReadingsShaken' accelReadings gyroReadings magReadings SampleRate
numSamples = size(accelReadings,1);
time = (0:(numSamples-1))'/SampleRate;

figure(1)
subplot(3,1,1)
plot(time,accelReadings)
title('Accelerometer Reading')
ylabel('Acceleration (m/s^2)')

subplot(3,1,2)
plot(time,magReadings)
title('Magnetometer Reading')
ylabel('Magnetic Field (\muT)')

subplot(3,1,3)
plot(time,gyroReadings)
title('Gyroscope Reading')
ylabel('Angular Velocity (rad/s)')
xlabel('Time (s)')

Создание ahrsfilter а затем сплавить данные IMU для определения ориентации. Ориентация возвращается как вектор кватернионов; преобразовать кватернионы в углы Эйлера в градусах. Визуализация ориентации корпуса датчика с течением времени путем построения графика углов Эйлера, необходимых на каждом шаге времени для поворота глобальной системы координат в соответствии с системой координат корпуса датчика.

fuse = ahrsfilter('SampleRate',SampleRate);
orientation = fuse(accelReadings,gyroReadings,magReadings);

orientationEulerAngles = eulerd(orientation,'ZYX','frame');

figure(2)
plot(time,orientationEulerAngles(:,1), ...
     time,orientationEulerAngles(:,2), ...
     time,orientationEulerAngles(:,3))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation over Time')
legend('Rotation around z-axis', ...
       'Rotation around y-axis', ...
       'Rotation around x-axis')

В записи IMU тряска прекращается приблизительно через шесть секунд. Определите ориентацию покоя, чтобы вы могли охарактеризовать, как быстро ahrsfilter сходится.

Чтобы определить ориентацию покоя, рассчитайте средние значения магнитного поля и ускорения за последние четыре секунды, а затем используйте ecompass функция предохранения данных.

Визуализация расстояния кватерниона от положения покоя с течением времени.

restingOrientation = ecompass(mean(accelReadings(6*SampleRate:end,:)), ...
                              mean(magReadings(6*SampleRate:end,:)));

figure(3)
plot(time,rad2deg(dist(restingOrientation,orientation)))
hold on
xlabel('Time (s)')
ylabel('Quaternion Distance (degrees)')

Изменение значения по умолчанию ahrsfilter свойства, чтобы фильтр быстрее сходился к силе тяжести. Увеличить GyroscopeDriftNoise кому 1e-2 и уменьшить LinearAccelerationNoise кому 1e-4. Это инструктирует ahrsfilter алгоритм для меньшего взвешивания данных гироскопа и больше данных акселерометра. Потому что accelerometer данные обеспечивают стабилизирующий и последовательный вектор гравитации, результирующая ориентация сходится быстрее.

Сбросьте фильтр, слейте данные и постройте график результатов.

fuse.LinearAccelerationNoise = 1e-4;
fuse.GyroscopeDriftNoise     = 1e-2;
reset(fuse)

orientation = fuse(accelReadings,gyroReadings,magReadings);

figure(3)
plot(time,rad2deg(dist(restingOrientation,orientation)))
legend('Default AHRS Filter','Tuned AHRS Filter')

Алгоритмы

развернуть все

Примечание.Следующий алгоритм применяется только к опорному кадру NED.

ahrsfilter использует девятиосную структуру фильтра Калмана, описанную в [1]. Алгоритм пытается отследить ошибки ориентации, смещения гироскопа, линейного ускорения и магнитного возмущения для вывода конечной ориентации и угловой скорости. Вместо непосредственного отслеживания ориентации косвенный фильтр Калмана моделирует процесс ошибок x с рекурсивным обновлением:

xk = [startkbkakdk] = Fk [startk 1bk 1ak − 1dk − 1] + wk

где xk - вектор 12 на 1, состоящий из:

  • startk -- вектор ошибки ориентации 3 на 1, в градусах, в момент времени k

  • bk -- вектор смещения нулевой угловой скорости гироскопа 3 на 1, в град/с, в момент времени k

  • ak -- вектор ошибки ускорения 3 на 1, измеренный в кадре датчика, в g, в момент времени k

  • dk -- вектор ошибки магнитного возмущения 3 на 1, измеренный в кадре датчика, в мкТ, в момент времени k

и где wk является вектором аддитивного шума 12 на 1, а Fk является моделью перехода состояния.

Поскольку xk определяется как процесс ошибки, априорная оценка всегда равна нулю, и поэтому модель перехода состояния Fk равна нулю. Это понимание приводит к следующему уменьшению стандартных уравнений Калмана:

Стандартные уравнения Калмана:

xk = Fkxk 1 + Pk = FkPk 1 + FkT + Qkyk = zk Hkxk Sk = Rk + HkPk HkTkk = Pk HkT (Sk) − 1xk + = xk − + Kkykpk

Уравнения Калмана, используемые в этом алгоритме:

xk = 0Pk = Qkyk = zkSk = Rk + HkPk HkTKk = Pk HkT (Sk) 1xk + = KkykPk + = Pk − − KkHkPk −

где:

  • xk − -- прогнозируемая (априорная) оценка состояния; процесс ошибки

  • Pk − -- предсказанная (априорная) оценка ковариации

  • yk -- инновации

  • Sk - инновационная ковариация

  • Kk -- Kalman gain

  • xk + -- обновленная (a posteriori) оценка состояния

  • Pk + -- обновленная (a posteriori) оценка ковариации

k представляет итерацию, верхний индекс + представляет апостериорную оценку, а верхний индекс представляет априорную оценку.

На рисунке и последующих шагах описывается итерация на основе одного кадра в алгоритме.

Перед первой итерацией accelReadings, gyroReadings, и magReadings входы секционированы в DecimationFactor-на-3 кадра. Для каждого блока алгоритм использует самые текущие показания акселерометра и магнитометра, соответствующие фрагменту показаний гироскопа.

Ссылки

[1] Слияние датчиков с открытым исходным кодом. https://github.com/memsindustrygroup/Open-Source-Sensor-Fusion/tree/master/docs

[2] Роетенберг, Д., Х.Ж. Луинге, К.Т.М. Батен и П.Х. Велтинк. «Компенсация магнитных возмущений улучшает инерционное и магнитное восприятие ориентации сегмента человеческого тела». Сделки IEEE по нейронным системам и инженерии реабилитации. Том 13. Выпуск 3, 2005, стр. 395-405.

Расширенные возможности

.
Представлен в R2018b