Настройте insfilterMARG параметры, чтобы уменьшать ошибку расчета
настраивает свойства tunedMeasureNoise = tune(filter,measureNoise,sensorData,groundTruth)insfilterMARG объект фильтра, filter, и шумы измерения, чтобы уменьшать ошибку оценки состояния корневого среднеквадратического (RMS) между объединенными данными о датчике и основной истиной. Функция также возвращает настроенный шум измерения, tunedMeasureNoise. Функция использует значения свойств в фильтре и шуме измерения, обеспеченном в measureNoise структура как первоначальная оценка для алгоритма оптимизации.
задает настраивающуюся настройку на основе tunedMeasureNoise = tune(___,config)tunerconfig объект, config.
insfilterMARG оптимизировать оценку положенияЗагрузите записанные данные о датчике и достоверные данные.
load('insfilterMARGTuneData.mat');Составьте таблицы для данных о датчике и данных об истине.
sensorData = table(Accelerometer, Gyroscope, ...
Magnetometer, GPSPosition, GPSVelocity);
groundTruth = table(Orientation, Position);Создайте insfilterMARG объект фильтра, который имеет несколько шумовых свойств.
filter = insfilterMARG('State',initialState,... 'StateCovariance',initialStateCovariance,... 'AccelerometerBiasNoise',1e-7,... 'GyroscopeBiasNoise',1e-7,... 'MagnetometerBiasNoise',1e-7,... 'GeomagneticVectorNoise',1e-7);
Создайте объект настройки тюнера для фильтра. Установите максимальные итерации на восемь. Кроме того, установите настраиваемые параметры.
cfg = tunerconfig('insfilterMARG', 'MaxIterations', 8); cfg.TunableParameters = setdiff(cfg.TunableParameters, ... {'GeomagneticFieldVector', 'AccelerometerBiasNoise', ... 'GyroscopeBiasNoise', 'MagnetometerBiasNoise'});
Используйте функцию шума тюнера, чтобы получить набор начальных шумов датчика, используемых в фильтре.
measNoise = tunernoise('insfilterMARG')measNoise = struct with fields:
MagnetometerNoise: 1
GPSPositionNoise: 1
GPSVelocityNoise: 1
Настройте фильтр и получите настроенные параметры.
tunedParams = tune(filter, measNoise, sensorData, ...
groundTruth, cfg); Iteration Parameter Metric
_________ _________ ______
1 AccelerometerNoise 2.5701
1 GPSPositionNoise 2.5446
1 GPSVelocityNoise 2.5279
1 GeomagneticVectorNoise 2.5268
1 GyroscopeNoise 2.5268
1 MagnetometerNoise 2.5204
2 AccelerometerNoise 2.5203
2 GPSPositionNoise 2.4908
2 GPSVelocityNoise 2.4695
2 GeomagneticVectorNoise 2.4684
2 GyroscopeNoise 2.4684
2 MagnetometerNoise 2.4615
3 AccelerometerNoise 2.4615
3 GPSPositionNoise 2.4265
3 GPSVelocityNoise 2.4000
3 GeomagneticVectorNoise 2.3988
3 GyroscopeNoise 2.3988
3 MagnetometerNoise 2.3911
4 AccelerometerNoise 2.3911
4 GPSPositionNoise 2.3500
4 GPSVelocityNoise 2.3164
4 GeomagneticVectorNoise 2.3153
4 GyroscopeNoise 2.3153
4 MagnetometerNoise 2.3068
5 AccelerometerNoise 2.3068
5 GPSPositionNoise 2.2587
5 GPSVelocityNoise 2.2166
5 GeomagneticVectorNoise 2.2154
5 GyroscopeNoise 2.2154
5 MagnetometerNoise 2.2063
6 AccelerometerNoise 2.2063
6 GPSPositionNoise 2.1505
6 GPSVelocityNoise 2.0981
6 GeomagneticVectorNoise 2.0971
6 GyroscopeNoise 2.0971
6 MagnetometerNoise 2.0875
7 AccelerometerNoise 2.0874
7 GPSPositionNoise 2.0240
7 GPSVelocityNoise 1.9601
7 GeomagneticVectorNoise 1.9594
7 GyroscopeNoise 1.9594
7 MagnetometerNoise 1.9499
8 AccelerometerNoise 1.9499
8 GPSPositionNoise 1.8802
8 GPSVelocityNoise 1.8035
8 GeomagneticVectorNoise 1.8032
8 GyroscopeNoise 1.8032
8 MagnetometerNoise 1.7959
Объедините данные о датчике с помощью настроенного фильтра.
N = size(sensorData,1); qEstTuned = quaternion.zeros(N,1); posEstTuned = zeros(N,3); for ii=1:N predict(filter,Accelerometer(ii,:),Gyroscope(ii,:)); if all(~isnan(Magnetometer(ii,1))) fusemag(filter,Magnetometer(ii,:),... tunedParams.MagnetometerNoise); end if all(~isnan(GPSPosition(ii,1))) fusegps(filter,GPSPosition(ii,:),... tunedParams.GPSPositionNoise,GPSVelocity(ii,:),... tunedParams.GPSVelocityNoise); end [posEstTuned(ii,:),qEstTuned(ii,:)] = pose(filter); end
Вычислите ошибки RMS.
orientationErrorTuned = rad2deg(dist(qEstTuned,Orientation)); rmsOrientationErrorTuned = sqrt(mean(orientationErrorTuned.^2))
rmsOrientationErrorTuned = 0.8580
positionErrorTuned = sqrt(sum((posEstTuned - Position).^2,2)); rmsPositionErrorTuned = sqrt(mean(positionErrorTuned.^2))
rmsPositionErrorTuned = 1.7946
Визуализируйте результаты.
figure(); t = (0:N-1)./filter.IMUSampleRate; subplot(2,1,1) plot(t,positionErrorTuned,'b'); title("Tuned insfilterMARG" + newline + ... "Euclidean Distance Position Error") xlabel('Time (s)'); ylabel('Position Error (meters)') subplot(2,1,2) plot(t, orientationErrorTuned,'b'); title("Orientation Error") xlabel('Time (s)'); ylabel('Orientation Error (degrees)');

filter — Объект фильтраinfilterMARG объектОбъект фильтра в виде insfilterMARG объект.
measureNoise — Шум измеренияШум измерения в виде структуры. Функция использует вход шума измерения в качестве исходного предположения для настройки шума измерения. Структура должна содержать эти поля:
| Имя поля | Описание |
|---|---|
MagnetometerNoise | Отклонение шума магнитометра в виде скаляра в (μT) 2 |
GPSPositionNoise | Отклонение шума положения GPS в виде скаляра в m2 |
GPSVelocityNoise | Отклонение скоростного шума GPS в виде скаляра в (m/s) 2 |
sensorData — Данные о датчикеtableДанные о датчике в виде table. В каждой строке данные о датчике заданы как:
Accelerometer — Данные об акселерометре в виде 1 3 вектора из скаляров в m2/s.
Gyroscope — Данные о гироскопе в виде 1 3 вектора из скаляров в rad/s.
Magnetometer — Данные о магнитометре в виде 1 3 вектора из скаляров в μT.
GPSPosition — Данные о положении GPS в виде 1 3 вектора из скаляров в метрах.
GPSVelocity — Скоростные данные о GPS в виде 1 3 вектора из скаляров в m/s.
Если датчик GPS не производит полные измерения, задайте соответствующую запись для GPSPosition и/или GPSVelocity как NaN. Если вы устанавливаете Cost свойство входа настройки тюнера, config, к Custom, затем можно использовать другие типы данных для sensorData введите на основе своего выбора.
groundTruth данные Ground TruthtableДостоверные данные в виде table. В каждой строке таблица может опционально содержать любую из этих переменных:
Orientation — Ориентация от навигации структурирует к системе координат тела в виде quaternion или 3х3 матрица вращения.
Position — Положение в навигации структурирует в виде 1 3 вектор из скаляров в метрах.
Velocity — Скорость в навигации структурирует в виде 1 3 вектор из скаляров в m/s.
DeltaAngleBias — Угол Delta смещает в виде 1 3 вектор из скаляров в радианах.
DeltaVelocityBias — Скорость Delta смещает в виде 1 3 вектор из скаляров в m/s.
GeomagneticFieldVector — Геомагнитный вектор поля в навигации структурирует в виде 1 3 вектор из скаляров.
MagnetometerBias — Смещение магнитометра в системе координат тела в виде 1 3 вектора из скаляров в μT.
Функциональные процессы каждая строка sensorData и groundTruth таблицы последовательно, чтобы вычислить оценку состояния и ошибку RMS от основной истины. Переменные состояния, не существующие в groundTruth вход проигнорирован для сравнения. sensorData и groundTruth таблицы должны иметь одинаковое число строк.
Если вы устанавливаете Cost свойство входа настройки тюнера, config, к Custom, затем можно использовать другие типы данных для groundTruth введите на основе своего выбора.
config — Настройка тюнераtunerconfig объектНастройка тюнера в виде tunerconfig объект.
tunedMeasureNoise — Настроенный шум измеренияНастроенный шум измерения, возвращенный как структура. Структура содержит эти поля.
| Имя поля | Описание |
|---|---|
MagnetometerNoise | Отклонение шума магнитометра в виде скаляра в (μT) 2 |
GPSPositionNoise | Отклонение шума положения GPS в виде скаляра в m2 |
GPSVelocityNoise | Отклонение скоростного шума GPS в виде скаляра в (m/s) 2 |
[1] Abbeel, P., Коутс, A., Montemerlo, M., Ын, А.И. и Трун, S. Отличительное Обучение Фильтров Калмана. В Робототехнике: Наука и системы, Издание 2, стр 1, 2005.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.