Этот пример показывает, как использовать алгоритмы сплава с 9 осями и с 6 осями, чтобы вычислить ориентацию. Sensor Fusion and Tracking Toolbox™ включает несколько алгоритмов, чтобы вычислить ориентацию из инерционных модулей измерения модулей магнитно-угловой силы тяжести уровня (MARG) и (IMUs). Этот пример покрывает основы ориентации и как использовать эти алгоритмы.
Ориентация объекта описывает свое вращение относительно некоторой системы координат, иногда названной системой координаты вышестоящего элемента, в трех измерениях.
Sensor Fusion and Tracking Toolbox использует Северо-восток вниз (NED) в качестве фиксированной системы координаты вышестоящего элемента. NED иногда упоминается как глобальная система координат или ссылочный кадр. В ссылочном кадре NED Ось X указывает север, Ось Y указывает восток, и ось Z указывает вниз. Плоскость X-Y NED считается локальной плоскостью касательной Земли. В зависимости от алгоритма север может быть или магнитным северным или истинным севером. Алгоритмы в этом примере используют магнитный север.
Объект может считаться наличием его собственной системы координат, часто названной система координаты нижестоящего элемента или локальная координата. Эта система координаты нижестоящего элемента вращается с объектом относительно системы координаты вышестоящего элемента. Если нет никакого перевода, источников обоих перекрытий систем координат.
Количество ориентации, вычисленное в Sensor Fusion and Tracking Toolbox, является вращением, которое берет количества от родительского ссылочного кадра до дочернего ссылочного кадра. Вращение представлено матрицей вращения или кватернионом.
Для оценки ориентации обычно используются три типа датчиков: акселерометры, гироскопы и магнитометры. Акселерометры измеряют соответствующее ускорение. Гироскопы измеряют угловую скорость. Магнитометры измеряют локальное магнитное поле. Различные алгоритмы используются, чтобы плавить различные комбинации датчиков, чтобы оценить ориентацию.
Через большую часть этого примера используется тот же набор данных о датчике. Акселерометр, гироскоп и данные о датчике магнитометра были зарегистрированы, в то время как устройство вращало приблизительно три различных оси: сначала вокруг его локальной Оси Y, затем вокруг его оси Z, и наконец вокруг ее Оси X. Ось X устройства обычно указывалась на юг на время эксперимента.
ld = load('rpy_9axis.mat');
acc = ld.sensorData.Acceleration;
gyro = ld.sensorData.AngularVelocity;
mag = ld.sensorData.MagneticField;
viewer = HelperOrientationViewer;
Функция ecompass
плавит данные об акселерометре и магнитометре. Это - алгоритм без памяти, который не требует никакой настройки параметра, но алгоритм очень восприимчив к шуму датчика.
qe = ecompass(acc, mag); for ii=1:size(acc,1) viewer(qe(ii)); pause(0.01); end
Обратите внимание на то, что алгоритм ecompass
правильно находит местоположение севера. Однако, потому что функция без памяти, предполагаемое движение не сглаженно. Оценка существенно затронута шумом в акселерометре и магнитометре. Некоторые методы, представленные в Ориентации Фильтра Lowpass Используя Кватернион SLERP, могли использоваться, чтобы сглаживать движение.
Система imufilter
object™ плавит акселерометр и данные о гироскопе с помощью внутреннего Фильтра Калмана состояния ошибки. Фильтр способен к удалению шума смещения гироскопа, который дрейфует в зависимости от времени.
ifilt = imufilter('SampleRate', ld.Fs); for ii=1:size(acc,1) qimu = ifilt(acc(ii,:), gyro(ii,:)); viewer(qimu); pause(0.01); end
Несмотря на то, что алгоритм imufilter
производит значительно более сглаженную оценку движения, по сравнению с ecompass
, это правильно не оценивает направление севера. imufilter
не обрабатывает данные о магнитометре, таким образом, это просто принимает, что Ось X устройства первоначально указывает к северу. Оценка движения, данная imufilter
, относительно оцененной ориентации начальной буквы.
И заголовок ссылочной системы (AHRS) отношения состоит из 9 систем координат, которые используют акселерометр, гироскоп и магнитометр, чтобы вычислить ориентацию. Системный объект ahrsfilter
комбинирует лучший из предыдущих алгоритмов, чтобы произвести гладко изменяющуюся оценку ориентации устройства, правильно оценивая направление севера. Этот алгоритм также использует Фильтр Калмана состояния ошибки. В дополнение к удалению смещения гироскопа ahrsfilter
имеет некоторую способность обнаружить и отклонить умеренный магнитный затор.
ifilt = ahrsfilter('SampleRate', ld.Fs); for ii=1:size(acc,1) qahrs = ifilt(acc(ii,:), gyro(ii,:), mag(ii,:)); viewer(qahrs); pause(0.01); end
Настройка параметров ahrsfilter
и imufilter
, чтобы совпадать с определенными аппаратными датчиками может улучшать производительность. Среда датчика также важна, чтобы учесть. Параметры imufilter
являются подмножеством параметров ahrsfilter
. AccelerometerNoise
, GyroscopeNoise
, MagnetometerNoise
и GyroscopeDriftNoise
являются шумами измерения. Таблицы данных датчиков помогают определить те значения.
LinearAccelerationNoise
и LinearAccelerationDecayFactor
управляют ответом фильтра на линейное (переводное) ускорение. Сотрясение устройства является простым примером добавления линейного ускорения.
Рассмотрите, как imufilter
с LinearAccelerationNoise
9e-3 отвечает на дрожащую траекторию, по сравнению с одной с LinearAccelerationNoise
9e-4.
ld = load('shakingDevice.mat'); accel = ld.sensorData.Acceleration; gyro = ld.sensorData.AngularVelocity; viewer = HelperOrientationViewer; highVarFilt = imufilter('SampleRate', ld.Fs, ... 'LinearAccelerationNoise', 0.009); qHighLANoise = highVarFilt(accel, gyro); lowVarFilt = imufilter('SampleRate', ld.Fs, ... 'LinearAccelerationNoise', 0.0009); qLowLANoise = lowVarFilt(accel, gyro);
Один способ видеть эффект LinearAccelerationNoise
состоит в том, чтобы посмотреть на выходной вектор силы тяжести. Вектор силы тяжести является просто третьим столбцом матрицы вращения ориентации.
rmatHigh = rotmat(qHighLANoise, 'frame'); rmatLow = rotmat(qLowLANoise, 'frame'); gravDistHigh = sqrt(sum( (rmatHigh(:,3,:) - [0;0;1]).^2, 1)); gravDistLow = sqrt(sum( (rmatLow(:,3,:) - [0;0;1]).^2, 1)); figure; plot([squeeze(gravDistHigh), squeeze(gravDistLow)]); title('Euclidean Distance to Gravity'); legend('LinearAccelerationNoise = 0.009', ... 'LinearAccelerationNoise = 0.0009');
lowVarFilt
имеет низкий LinearAccelerationNoise
, таким образом, он ожидает быть в среде с низким линейным ускорением. Поэтому это более восприимчиво к линейному ускорению, как проиллюстрировано большими изменениями ранее в графике. Однако, потому что это ожидает быть в среде с низким линейным ускорением, более высокое доверие помещается в сигнал акселерометра. По сути, оценка ориентации сходится быстро назад к вертикали, если сотрясение закончилось. Обратное верно для highVarFilt
. Фильтр менее затронут путем сотрясения, но оценка ориентации занимает больше времени, чтобы сходиться к вертикали, когда сотрясение остановилось.
Свойство MagneticDisturbanceNoise
позволяет моделировать магнитные воздействия (негеомагнитные источники шума) почти таким же способом модели LinearAccelerationNoise
линейное ускорение.
Два свойства фактора затухания (MagneticDisturbanceDecayFactor
и LinearAccelerationDecayFactor
) моделируют уровень изменения шумов. Для медленно переменных источников шума, установленных эти параметры на значение ближе к 1. Для того, чтобы быстро отличаться, некоррелированые шумы, устанавливает эти параметры ближе на 0. Более низкий LinearAccelerationDecayFactor
позволяет оценке ориентации найти "вниз" более быстро. Более низкий MagneticDisturbanceDecayFactor
позволяет оценке ориентации найти север более быстро.
Очень большие, короткие магнитные воздействия отклоняются почти полностью ahrsfilter
. Рассмотрите импульс [0 250 0], единое время применялось при записи от стационарного датчика. Идеально, в оценке ориентации не должно быть никакого изменения.
ld = load('magJamming.mat'); hpulse = ahrsfilter('SampleRate', ld.Fs); len = 1:10000; qpulse = hpulse(ld.sensorData.Acceleration(len,:), ... ld.sensorData.AngularVelocity(len,:), ... ld.sensorData.MagneticField(len,:)); figure; timevec = 0:ld.Fs:(ld.Fs*numel(qpulse) - 1); plot( timevec, eulerd(qpulse, 'ZYX', 'frame') ); title(['Stationary Trajectory Orientation Euler Angles' newline ... 'Magnetic Jamming Response']); legend('Z-rotation', 'Y-rotation', 'X-rotation'); ylabel('Degrees'); xlabel('Seconds');
Обратите внимание на то, что фильтр почти полностью отклоняет этот магнитный импульс как интерференцию. Любая сила магнитного поля, больше, чем четыре раза ExpectedMagneticFieldStrength
, рассматривается создающим затор источником, и сигнал магнитометра проигнорирован для тех выборок.
Алгоритмы, представленные здесь, когда правильно настроено, включают оценку ориентации и устойчивы против экологических источников шума. Важно рассмотреть ситуации, в которых датчики используются и настраивают фильтры соответственно.