imufilter

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

Описание

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

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

  1. Создайте imufilter Объекту и установите его свойства.

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

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

Создание

Описание

пример

FUSE = imufilter возвращает косвенный фильтр Калмана Системного объекта, FUSEдля слияния данных акселерометра и гироскопа для оценки ориентации устройства. Фильтр использует вектор состояния с девятью элементами, чтобы отследить ошибку в оценке ориентации, оценке смещения гироскопа и оценке линейного ускорения.

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

пример

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

Пример: FUSE = imufilter('SampleRate',200,'GyroscopeNoise',1e-6) создает Системный объект, FUSEс частотой дискретизации 200 Гц и шумом гироскопа, установленным на 1e-6 радиан в секунду в квадрате.

Свойства

расширить все

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

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

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Использование Системных объектов.

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

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

Типы данных: single | double | uint8 | uint16 | uint32 | uint64 | int8 | int16 | int32 | int64

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

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

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

Типы данных: single | double | uint8 | uint16 | uint32 | uint64 | int8 | int16 | int32 | int64

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

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

Типы данных: single | double | uint8 | uint16 | uint32 | uint64 | int8 | int16 | int32 | int64

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

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

Типы данных: single | double | uint8 | uint16 | uint32 | uint64 | int8 | int16 | int32 | int64

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

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

Типы данных: single | double | uint8 | uint16 | uint32 | uint64 | int8 | int16 | int32 | int64

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

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

Типы данных: single | double | uint8 | uint16 | uint32 | uint64 | int8 | int16 | int32 | int64

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

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

Типы данных: single | double | uint8 | uint16 | uint32 | uint64 | int8 | int16 | int32 | int64

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

  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

  Columns 7 through 9

                   0                   0                   0
                   0                   0                   0
                   0                   0                   0
                   0                   0                   0
                   0                   0                   0
                   0                   0                   0
   0.009623610000000                   0                   0
                   0   0.009623610000000                   0
                   0                   0   0.009623610000000

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

Типы данных: single | double | uint8 | uint16 | uint32 | uint64 | int8 | int16 | int32 | int64

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

  • 'quaternion' -- Выход представляет собой N -by-1 quaternion.

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

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

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

Описание

пример

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

Входные параметры

расширить все

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

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

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

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

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

расширить все

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

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

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

Количество входа отсчетов, N и свойство DecimationFactor определяют M.

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

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

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

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

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

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

release(obj)

расширить все

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

Примеры

свернуть все

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

load 'rpy_9axis.mat' sensorData Fs

accelerometerReadings = sensorData.Acceleration;
gyroscopeReadings = sensorData.AngularVelocity;

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

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

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

q = fuse(accelerometerReadings,gyroscopeReadings);

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

imufilter слияние правильно оценивает изменение ориентации от предполагаемой северо-обращенной начальной ориентации. Однако ось X устройства указывала на юг при регистрации. Чтобы правильно оценить ориентацию относительно истинной начальной ориентации или относительно NED, используйте 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')
xlabel('Time (s)')
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.

Моделируйте наклоняющийся БИНС, который содержит акселерометр и гироскоп, используя imuSensor Системные object™. Используйте идеальные и реалистичные модели, чтобы сравнить результаты отслеживания ориентации с помощью imufilter Системный объект.

Загрузите struct, описывающую основную истину движение и частоту дискретизации. Структура движения t описывает последовательные повороты:

  1. рыскание: 120 степени за две секунды

  2. тангаж: 60 степени более одной секунды

  3. крен: 30 степени за полсекунды

  4. крен: -30 степени за полсекунды

  5. тангаж: -60 степени в течение одной секунды

  6. рыскание: -120 степени за две секунды

На последнем этапе struct движения объединяет 1-е, 2-е и 3-е повороты в вращение с одной осью. Ускорение, скорость вращения и ориентация заданы в локальной системе координат NED.

load y120p60r30.mat motion fs
accNED = motion.Acceleration;
angVelNED = motion.AngularVelocity;
orientationNED = motion.Orientation;

numSamples = size(motion.Orientation,1);
t = (0:(numSamples-1)).'/fs;

Создайте идеальный объект датчика IMU и объект фильтра IMU по умолчанию.

IMU = imuSensor('accel-gyro','SampleRate',fs);

aFilter = imufilter('SampleRate',fs);

В цикле:

  1. Симулируйте выход БИНС путем подачи движения основная истина к объекту датчика БИНС.

  2. Фильтрация выхода БИНС с помощью объекта фильтра БИНС по умолчанию.

orientation = zeros(numSamples,1,'quaternion');
for i = 1:numSamples

    [accelBody,gyroBody] = IMU(accNED(i,:),angVelNED(i,:),orientationNED(i,:));

    orientation(i) = aFilter(accelBody,gyroBody);

end
release(aFilter)

Постройте график ориентации с течением времени.

figure(1)
plot(t,eulerd(orientation,'ZYX','frame'))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation Estimation -- Ideal IMU Data, Default IMU Filter')
legend('Z-axis','Y-axis','X-axis')

Измените свойства своего imuSensor для моделирования реальных датчиков. Еще раз запустите цикл и постройте график оценки ориентации с течением времени.

IMU.Accelerometer = accelparams( ...
    'MeasurementRange',19.62, ...
    'Resolution',0.00059875, ...
    'ConstantBias',0.4905, ...
    'AxesMisalignment',2, ...
    'NoiseDensity',0.003924, ...
    'BiasInstability',0, ...
    'TemperatureBias', [0.34335 0.34335 0.5886], ...
    'TemperatureScaleFactor',0.02);
IMU.Gyroscope = gyroparams( ...
    'MeasurementRange',4.3633, ...
    'Resolution',0.00013323, ...
    'AxesMisalignment',2, ...
    'NoiseDensity',8.7266e-05, ...
    'TemperatureBias',0.34907, ...
    'TemperatureScaleFactor',0.02, ...
    'AccelerationBias',0.00017809, ...
    'ConstantBias',[0.3491,0.5,0]);

orientationDefault = zeros(numSamples,1,'quaternion');
for i = 1:numSamples

    [accelBody,gyroBody] = IMU(accNED(i,:),angVelNED(i,:),orientationNED(i,:));

    orientationDefault(i) = aFilter(accelBody,gyroBody);

end
release(aFilter)

figure(2)
plot(t,eulerd(orientationDefault,'ZYX','frame'))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation Estimation -- Realistic IMU Data, Default IMU Filter')
legend('Z-axis','Y-axis','X-axis')

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

aFilter.GyroscopeNoise          = 7.6154e-7;
aFilter.AccelerometerNoise      = 0.0015398;
aFilter.GyroscopeDriftNoise     = 3.0462e-12;
aFilter.LinearAccelerationNoise = 0.00096236;
aFilter.InitialProcessNoise     = aFilter.InitialProcessNoise*10;

orientationNondefault = zeros(numSamples,1,'quaternion');
for i = 1:numSamples
    [accelBody,gyroBody] = IMU(accNED(i,:),angVelNED(i,:),orientationNED(i,:));

    orientationNondefault(i) = aFilter(accelBody,gyroBody);
end
release(aFilter)

figure(3)
plot(t,eulerd(orientationNondefault,'ZYX','frame'))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation Estimation -- Realistic IMU Data, Nondefault IMU Filter')
legend('Z-axis','Y-axis','X-axis')

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

qDistDefault = rad2deg(dist(orientationNED,orientationDefault));
qDistNondefault = rad2deg(dist(orientationNED,orientationNondefault));

figure(4)
plot(t,[qDistDefault,qDistNondefault])
title('Quaternion Distance from True Orientation')
legend('Realistic IMU Data, Default IMU Filter', ...
       'Realistic IMU Data, Nondefault IMU Filter')
xlabel('Time (s)')
ylabel('Quaternion Distance (degrees)')

В этом примере показано, как удалить смещение гироскопа из БИНС с помощью imufilter.

Использование kinematicTrajectory для создания траектории с двумя частями. Первая часть имеет постоянную скорость вращения вокруг осей Y и Z. Вторая часть имеет изменяющуюся скорость вращения во всех трех осях.

duration = 60*8;
fs = 20;
numSamples = duration * fs;
rng('default') % Seed the RNG to reproduce noisy sensor measurements.

initialAngVel = [0,0.5,0.25];
finalAngVel = [-0.2,0.6,0.5];
constantAngVel = repmat(initialAngVel,floor(numSamples/2),1);
varyingAngVel = [linspace(initialAngVel(1), finalAngVel(1), ceil(numSamples/2)).', ...
    linspace(initialAngVel(2), finalAngVel(2), ceil(numSamples/2)).', ...
    linspace(initialAngVel(3), finalAngVel(3), ceil(numSamples/2)).'];

angVelBody = [constantAngVel; varyingAngVel];
accBody = zeros(numSamples,3);

traj = kinematicTrajectory('SampleRate',fs);

[~,qNED,~,accNED,angVelNED] = traj(accBody,angVelBody);

Создайте imuSensor Системные object™, IMUс неидеальным гироскопом. Функции IMU с ускорением «земля-правда», скоростью вращения и ориентацией.

IMU = imuSensor('accel-gyro', ...
    'Gyroscope',gyroparams('RandomWalk',0.003,'ConstantBias',0.3), ...
    'SampleRate',fs);

[accelReadings, gyroReadingsBody] = IMU(accNED,angVelNED,qNED);

Создайте imufilter Системный объект, fuse. Функции fuse с смоделированными показаниями акселерометра и показаниями гироскопа.

fuse = imufilter('SampleRate',fs, 'GyroscopeDriftNoise', 1e-6);

[~,angVelBodyRecovered] = fuse(accelReadings,gyroReadingsBody);

Постройте график скорости вращения «земля-правда», показаний гироскопа и восстановленной скорости вращения для каждой оси.

Скорость вращения, возвращенная из imufilter компенсирует эффект смещения гироскопа с течением времени и сходится к истинной скорости вращения.

time = (0:numSamples-1)'/fs;

figure(1)
plot(time,angVelBody(:,1), ...
     time,gyroReadingsBody(:,1), ...
     time,angVelBodyRecovered(:,1))
title('X-axis')
legend('True Angular Velocity', ...
       'Gyroscope Readings', ...
       'Recovered Angular Velocity')
ylabel('Angular Velocity (rad/s)')

Figure contains an axes. The axes with title X-axis contains 3 objects of type line. These objects represent True Angular Velocity, Gyroscope Readings, Recovered Angular Velocity.

figure(2)
plot(time,angVelBody(:,2), ...
     time,gyroReadingsBody(:,2), ...
     time,angVelBodyRecovered(:,2))
title('Y-axis')
ylabel('Angular Velocity (rad/s)')

Figure contains an axes. The axes with title Y-axis contains 3 objects of type line.

figure(3)
plot(time,angVelBody(:,3), ...
     time,gyroReadingsBody(:,3), ...
     time,angVelBodyRecovered(:,3))
title('Z-axis')
ylabel('Angular Velocity (rad/s)')
xlabel('Time (s)')

Figure contains an axes. The axes with title Z-axis contains 3 objects of type line.

Алгоритмы

расширить все

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

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

xk=[θkbkak]=Fk[θk1bk1ak1]+wk

где xk является вектором 9 на 1, состоящим из:

  • θk -- вектор ошибки ориентации 3 на 1, в степенях, в момент времени k

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

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

  • wk -- аддитивный вектор шума 9 на 1

  • Fk -- модель перехода состояния

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

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

xk=Fkxk1+Pk=FkPk1+FkT+Qkyk=zkHkxkSk=Rk+HkPkHkTKk=PkHkT(Sk)1xk+=xk+KkykPk+=PkKkHkPk

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

xk=0Pk=Qkyk=zkSk=Rk+HkPkHkTKk=PkHkT(Sk)1xk+=KkykPk+=PkKkHkPk

где

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

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

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

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

  • Kk -- коэффициент усиления Калмана

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

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

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

Графические и последующие шаги описывают итерацию на основе одного кадра через алгоритм.

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

Ссылки

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

[2] Roetenberg, D., H.J. Luinge, C.T.M. Бэтен и П.Х. Велтинк. Компенсация магнитных нарушений порядка улучшает инерционное и магнитное измерение ориентации сегмента тела человека. Транзакции IEEE по нейронным системам и реабилитационной инженерии. Том 13. Выпуск 3, 2005, с. 395-405.

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

.
Введенный в R2018b