Ориентация от показаний акселерометра и гироскопа
The imufilter
Система object™ предохраняет данные акселерометра и гироскопа для оценки ориентации устройства.
Для оценки ориентации устройства:
Создайте imufilter
Объекту и установите его свойства.
Вызывайте объект с аргументами, как будто это функция.
Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».
возвращает косвенный фильтр Калмана Системного объекта, FUSE
= imufilterFUSE
для слияния данных акселерометра и гироскопа для оценки ориентации устройства. Фильтр использует вектор состояния с девятью элементами, чтобы отследить ошибку в оценке ориентации, оценке смещения гироскопа и оценке линейного ускорения.
возвращает 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 Использование Системных объектов.
SampleRate
- Частота дискретизации данных входного датчика (Гц)100
(по умолчанию) | положительный конечный скалярСкорость дискретизации данных входного датчика в Гц, заданная как положительный конечный скаляр.
Настраиваемый: Нет
Типы данных: single
| double
| uint8
| uint16
| uint32
| uint64
| int8
| int16
| int32
| int64
DecimationFactor
- Коэффициент десятикратного уменьшения1
(по умолчанию) | положительный целочисленный скалярДесятикратное уменьшение коэффициент, которым можно уменьшить скорость дискретизации данных датчика входов, заданный как положительный целый скаляр.
Количество строк входов, accelReadings
и gyroReadings
, должен быть кратным коэффициенту десятикратного уменьшения.
Настраиваемый: Нет
Типы данных: single
| double
| uint8
| uint16
| uint32
| uint64
| int8
| int16
| int32
| int64
AccelerometerNoise
- Отклонение шума сигнала акселерометра ((м/с2)2)0.00019247
(по умолчанию) | положительный действительный скалярОтклонение шума сигнала акселерометра в (м/с2)2, заданный как положительный действительный скаляр.
Настраиваемый: Да
Типы данных: single
| double
| uint8
| uint16
| uint32
| uint64
| int8
| int16
| int32
| int64
GyroscopeNoise
- Отклонение шума сигнала гироскопа ((рад/с)2)9.1385e-5
(по умолчанию) | положительный действительный скалярОтклонение шума сигнала гироскопа в (рад/с)2, заданный как положительный действительный скаляр.
Настраиваемый: Да
Типы данных: single
| double
| uint8
| uint16
| uint32
| uint64
| int8
| int16
| int32
| int64
GyroscopeDriftNoise
- Отклонение смещения гироскопа ((рад/с)2)3.0462e-13
(по умолчанию) | положительный действительный скалярОтклонение дрейфа смещения гироскопа в (рад/с)2, заданный как положительный действительный скаляр.
Настраиваемый: Да
Типы данных: single
| double
| uint8
| uint16
| uint32
| uint64
| int8
| int16
| int32
| int64
LinearAccelerationNoise
- Отклонение линейного шума ускорения ((м/с2)2)0.0096236
(по умолчанию) | положительный действительный скалярОтклонение линейного шума ускорения в (м/с2)2, заданный как положительный действительный скаляр. Линейное ускорение моделируется как процесс lowpass отфильтрованного белого шума.
Настраиваемый: Да
Типы данных: single
| double
| uint8
| uint16
| uint32
| uint64
| int8
| int16
| int32
| int64
LinearAcclerationDecayFactor
- Коэффициент затухания для дрейфа линейного ускорения0.5
(по умолчанию) | скаляром в области значений [0,1]Коэффициент распада для дрейфа линейного ускорения, заданный как скаляр в области значений [0,1]. Если линейное ускорение изменяется быстро, задайте LinearAccelerationDecayFactor
к более низкому значению. Если линейное ускорение изменяется медленно, установите LinearAccelerationDecayFactor
к более высокому значению. Дрейф линейного ускорения моделируется как процесс белого шума с фильтрацией методом lowpass.
Настраиваемый: Да
Типы данных: single
| double
| uint8
| uint16
| uint32
| uint64
| int8
| int16
| int32
| int64
InitialProcessNoise
- Ковариационная матрица для технологического шумаКовариационная матрица для технологического шума, заданная как матрица 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
OrientationFormat
- Формат выходной ориентации'quaternion'
(по умолчанию) | 'Rotation matrix'
Выход выходной ориентации, заданный как 'quaternion'
или 'Rotation matrix'
. Размер выхода зависит от размера входа, N и выхода формата ориентации:
'quaternion'
-- Выход представляет собой N -by-1 quaternion
.
'Rotation matrix'
-- Выход является матрицей вращения N 3 на 3 байта.
Типы данных: char
| string
[
fuses accelerometer и показания гироскопа для вычисления ориентации и скорости вращения измерений. Алгоритм принимает, что устройство стационарно перед первым вызовом.orientation
,angularVelocity
] = FUSE(accelReadings
,gyroReadings
)
accelReadings
- Показания акселерометра в системе координат тела датчика (м/с2)Показания акселерометра в системе координат тела датчика в м/с2, заданный как матрица N -by-3. N - количество выборок и три столбца accelReadings
представление измерений [x
y z
]. Показания акселерометра приняты соответствующими скорости дискретизации, заданной свойством SampleRate.
Типы данных: single
| double
gyroReadings
- Показания гироскопа в системе координат тела датчика (рад/с)Показания гироскопа в системе координат тела датчика в рад/с, заданные как матрица N-на-3. N - количество выборок и три столбца gyroReadings
представление измерений [x
y z
]. Показания гироскопа приняты соответствующими скорости дискретизации, заданной свойством SampleRate.
Типы данных: single
| double
orientation
- Ориентация, которая вращает величины от глобальной системы координат к системе координат тела датчикаОриентация, которая может поворачивать величины из глобальной системы координат в систему координат тела, возвращаемую как кватернионы или массив. Размер и тип orientation
зависит от того, задано ли для свойства OrientationFormat значение 'quaternion'
или 'Rotation matrix'
:
'quaternion'
- выходы являются вектором кватернионов M-на-1 с таким же базовым типом данных, как и входы.
'Rotation matrix'
- выходы представляют собой массив M 3 на 3 байта с матрицами поворота того же типа, что и входы.
Количество входа отсчетов, N и свойство DecimationFactor определяют M.
Можно использовать orientation
в rotateframe
функция для поворота величин из глобальной системы координат в систему координат тела датчика.
Типы данных: quaternion
| single
| double
angularVelocity
- Скорость вращения в системе координат тела датчика (рад/с) Скорость вращения с смещением гироскопа, удаленным в системе координат тела датчика в рада/с, возвращается как массив M на 3. Количество входа отсчетов, N и свойство DecimationFactor определяют M.
Типы данных: single
| double
Чтобы использовать функцию объекта, задайте системный объект в качестве первого входного параметра. Например, чтобы освободить системные ресурсы системного объекта с именем obj
, используйте следующий синтаксис:
release(obj)
imufilter
tune | Настройка imufilter параметры для уменьшения ошибки расчета |
Загрузите 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)')
Моделируйте наклоняющийся БИНС, который содержит акселерометр и гироскоп, используя imuSensor
Системные object™. Используйте идеальные и реалистичные модели, чтобы сравнить результаты отслеживания ориентации с помощью imufilter
Системный объект.
Загрузите struct, описывающую основную истину движение и частоту дискретизации. Структура движения t описывает последовательные повороты:
рыскание: 120 степени за две секунды
тангаж: 60 степени более одной секунды
крен: 30 степени за полсекунды
крен: -30 степени за полсекунды
тангаж: -60 степени в течение одной секунды
рыскание: -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);
В цикле:
Симулируйте выход БИНС путем подачи движения основная истина к объекту датчика БИНС.
Фильтрация выхода БИНС с помощью объекта фильтра БИНС по умолчанию.
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(2) plot(time,angVelBody(:,2), ... time,gyroReadingsBody(:,2), ... time,angVelBodyRecovered(:,2)) title('Y-axis') ylabel('Angular Velocity (rad/s)')
figure(3) plot(time,angVelBody(:,3), ... time,gyroReadingsBody(:,3), ... time,angVelBodyRecovered(:,3)) title('Z-axis') ylabel('Angular Velocity (rad/s)') xlabel('Time (s)')
Примечание: Следующий алгоритм применяется только к опорной системе координат NED.
The imufilter
использует шестиосевую структуру фильтра Калмана, описанную в [1]. Алгоритм пытается отследить ошибки в ориентации, смещении гироскопа и линейном ускорении, чтобы вывести конечную ориентацию и скорость вращения. Вместо непосредственного отслеживания ориентации косвенный фильтр Калмана моделирует процесс ошибки, x, с рекурсивным обновлением:
где 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− - прогнозируемая (априори) оценка состояния; процесс ошибки
Pk− - предсказанная (априорная) оценка ковариации
yk -- инновации
Sk -- инновационная ковариация
Kk -- коэффициент усиления Калмана
xk+ - обновленная (апостериорная) оценка состояния
Pk+ - обновленная (a posteriori) оценка ковариации
k представляет итерацию, надстрочный индекс + представляет апостериорную оценку и надстрочный индекс − представляет априорную оценку.
Графические и последующие шаги описывают итерацию на основе одного кадра через алгоритм.
Перед первой итерацией accelReadings
и gyroReadings
входы chunked в системы координат 1 на 3 и DecimationFactor
-by-3 системы координат, соответственно. Алгоритм использует самые актуальные показания акселерометра, соответствующие фрагменту показаний гироскопа.
Пройдите по алгоритму для объяснения каждого этапа подробного обзора.
Алгоритм моделирует ускорение и угловое изменение как линейные процессы.
Ориентация для текущей системы координат предсказывается путем первой оценки углового изменения по сравнению с предыдущей системой координат:
где N - коэффициент десятикратного уменьшения, заданный DecimationFactor
свойство, и fs является частотой дискретизации, заданной SampleRate
свойство.
Угловое изменение преобразуется в кватернионы с помощью rotvec
quaternion
синтаксис конструкции:
Предыдущая оценка ориентации обновляется путем поворота ее на И Q:
Во время первой итерации оценка ориентации, q−, инициализируется ecompass
при предположении, что x -ось указывает на север.
Вектор гравитации интерпретируется как третий столбец кватерниона, q−, в матричном виде вращения:
См. ecompass
для объяснения того, почему третий столбец rPrior может быть интерпретирован как вектор гравитации.
Вторую оценку вектора гравитации производят путем вычитания из показаний акселерометра истекшей оценки линейного ускорения предыдущей итерации:
Модель ошибки является различием между оценкой гравитации из показаний акселерометра и оценкой гравитации из показаний гироскопа: .
Уравнения Калмана используют оценку тяжести, полученную из показаний гироскопа, g и наблюдения процесса ошибки, z, чтобы обновить усиление Калмана и промежуточные ковариационные матрицы. Коэффициент усиления Калмана применяется к сигналу ошибки, z, для вывода апостериорной оценки ошибки x+.
Модель наблюдения преобразует наблюдаемое состояние 1 на 3, g, в истинное состояние 3 на 9, H.
Модель наблюдения построена как:
где gx, gy и gz являются x -, y - и z - элементами вектора тяжести, оцененными из ориентации, соответственно. κ является константой, определяемой свойствами SampleRate и DecimationFactor: κ = DecimationFactor
/ SampleRate
.
Вывод модели наблюдения см. в разделах 7.3 и 7.4 документа [1].
Инновационная ковариация является матрицей 3 на 3, используемой для отслеживания изменчивости измерений. Инновационная ковариационная матрица вычисляется как:
где
H - матрица модели наблюдения
P− - предсказанная (априорная) оценка ковариации модели наблюдения, вычисленная в предыдущей итерации
R - ковариация шума модели наблюдения, рассчитанная как:
Следующие свойства определяют отклонение шума модели наблюдения:
κ -- (DecimationFactor/SampleRate)2
β -- GyroscopeDriftNoise
η -- GyroscopeNoise
λ -- AccelerometerNoise
Ковариация оценки ошибки является матрицей 9 на 9, используемой для отслеживания изменчивости состояния.
Ковариационная матрица оценки ошибки обновляется следующим образом:
где K - коэффициент усиления Калмана, H - матрица измерений и P− - ковариация оценки ошибки, вычисленная во время предыдущей итерации.
Ковариация оценки ошибки является матрицей 9 на 9, используемой для отслеживания изменчивости состояния. Априорная оценка ошибки, ковариация, P−, устанавливается в ковариацию шума процесса, Q, определенную во время предыдущей итерации. Q вычисляется как функция ковариации оценки апостериорной ошибки, P+. При вычислении Q условия перекрестной корреляции приняты незначительными по сравнению с терминами автокорреляции и равны нулю:
где
P+ - обновленная (a posteriori) оценка ошибки ковариация
β -- GyroscopeDriftNoise
η -- GyroscopeNoise
Для вывода терминов матрицы ошибок процесса смотрите раздел 10.1 документа [1].
Матрица усиления Калмана является матрицей 9 на 3, используемой для взвешивания нововведения. В этом алгоритме нововведение интерпретируется как процесс ошибки, z.
Матрица усиления Калмана построена как:
где
P- -- предсказанная ковариация ошибок
H -- модель наблюдения
S -- инновационная ковариация
Апостериорная оценка ошибки определяется путем объединения матрицы усиления Калмана с ошибкой в оценках вектора гравитации:
Оценка ориентации обновляется путем умножения предыдущей оценки на ошибку:
Линейная оценка ускорения обновляется путем распада линейной оценки ускорения из предыдущей итерации и вычитания ошибки:
где
Оценка смещения гироскопа обновлена, вычтя ошибку смещения гироскопа из смещения гироскопа от предыдущей итерации:
Чтобы оценить скорость вращения, система координат gyroReadings
усредняются, и вычисленное в предыдущей итерации смещение гироскопа вычитается:
где N - коэффициент десятикратного уменьшения, заданный DecimationFactor
свойство.
Оценка смещения гироскопа инициализируется в нули для первой итерации.
[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.
Указания и ограничения по применению:
Смотрите Системные объекты в Генерации кода MATLAB (MATLAB Coder).
ahrsfilter
| ecompass
| gpsSensor
| imuSensor
| quaternion
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.