exponenta event banner

imufilter

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

Описание

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

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

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

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

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

Создание

Описание

пример

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

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

пример

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

Пример: FUSE = imufilter('SampleRate',200,'GyroscopeNoise',1e-6) создает объект System, 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

Дисперсия шума сигнала акселерометра в (m/s2) 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

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

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

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

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

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

Типы данных: 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' - Вывод является матрицей ротации 3-by-3-by-N.

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

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

Описание

пример

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

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

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

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

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

Показания гироскопа в системе координат корпуса датчика в рад/с, заданные в виде матрицы N-by-3. N - количество выборок и три столбца gyroReadings представляют измерения [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Мелодия imufilter параметры для уменьшения ошибки оценки
stepЗапустить алгоритм объекта System
releaseДеблокирование ресурсов и разрешение изменений значений свойств объекта системы и входных признаков
resetСброс внутренних состояний объекта System

Примеры

свернуть все

Загрузить 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.

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

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

  1. рыскание: 120 градусов в течение двух секунд

  2. шаг: 60 градусов в течение одной секунды

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

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

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

  6. рыскание: -120 градусов в течение двух секунд

На последнем этапе структура движения объединяет 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. Моделирование выходного сигнала IMU путем подачи движения «земля-истина» на объект датчика IMU.

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

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 для отслеживания данных «земля-истина» при моделировании реалистичного IMU значительно уменьшается. Чтобы повысить производительность, измените свойства 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 со свойствами по умолчанию и не по умолчанию.

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)')

В этом примере показано, как удалить смещение гироскопа из IMU с помощью 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.

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

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

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

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

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

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

  • wk -- вектор аддитивного шума 9 на 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 входы секционированы в кадры 1 на 3 и DecimationFactor-на-3 кадра соответственно. Алгоритм использует самые последние показания акселерометра, соответствующие порции показаний гироскопа.

Ссылки

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

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

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

.

См. также

| | |

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