Настройте ahrs10filter параметры, чтобы уменьшать ошибку расчета
настраивает свойства tunedMeasureNoise = tune(filter,measureNoise,sensorData,groundTruth)ahrs10filter объект фильтра, filter, и шумы измерения, чтобы уменьшать ошибку оценки состояния корневого среднеквадратического (RMS) между объединенными данными о датчике и основной истиной. Функция также возвращает настроенный шум измерения, tunedMeasureNoise. Функция использует значения свойств в фильтре и шуме измерения, обеспеченном в measureNoise структура как первоначальная оценка для алгоритма оптимизации.
задает настраивающуюся настройку на основе tunedMeasureNoise = tune(___,config)tunerconfig объект, config.
Загрузите записанные данные о датчике и достоверные данные.
load('ahrs10filterTuneData.mat');Составьте таблицы для данных о датчике и данных об истине.
sensorData = table(Accelerometer,Gyroscope,...
Magnetometer,Altimeter);
groundTruth = table(Orientation, Altitude);Создайте ahrs10filter объект фильтра.
filter = ahrs10filter('State', initialState, ... 'StateCovariance', initialStateCovariance);
Создайте объект настройки тюнера для фильтра. Установите максимальные итерации на десять и установите объективный предел к 0,001.
cfg = tunerconfig('ahrs10filter','MaxIterations',10,... 'ObjectiveLimit',1e-3);
Используйте функцию шума тюнера, чтобы получить набор начальных шумов датчика, используемых в фильтре.
measNoise = tunernoise('ahrs10filter')measNoise = struct with fields:
MagnetometerNoise: 1
AltimeterNoise: 1
Настройте фильтр и получите настроенные параметры.
tunedNoise = tune(filter, measNoise, sensorData, ...
groundTruth, cfg); Iteration Parameter Metric
_________ _________ ______
1 AccelerometerNoise 0.0526
1 GyroscopeNoise 0.0526
1 MagnetometerNoise 0.0523
1 AltimeterNoise 0.0515
1 AccelerometerBiasNoise 0.0510
1 GyroscopeBiasNoise 0.0510
1 GeomagneticVectorNoise 0.0510
1 MagnetometerBiasNoise 0.0508
2 AccelerometerNoise 0.0508
2 GyroscopeNoise 0.0508
2 MagnetometerNoise 0.0504
2 AltimeterNoise 0.0494
2 AccelerometerBiasNoise 0.0490
2 GyroscopeBiasNoise 0.0490
2 GeomagneticVectorNoise 0.0490
2 MagnetometerBiasNoise 0.0487
3 AccelerometerNoise 0.0487
3 GyroscopeNoise 0.0487
3 MagnetometerNoise 0.0482
3 AltimeterNoise 0.0472
3 AccelerometerBiasNoise 0.0467
3 GyroscopeBiasNoise 0.0467
3 GeomagneticVectorNoise 0.0467
3 MagnetometerBiasNoise 0.0463
4 AccelerometerNoise 0.0463
4 GyroscopeNoise 0.0463
4 MagnetometerNoise 0.0456
4 AltimeterNoise 0.0446
4 AccelerometerBiasNoise 0.0442
4 GyroscopeBiasNoise 0.0442
4 GeomagneticVectorNoise 0.0442
4 MagnetometerBiasNoise 0.0437
5 AccelerometerNoise 0.0437
5 GyroscopeNoise 0.0437
5 MagnetometerNoise 0.0428
5 AltimeterNoise 0.0417
5 AccelerometerBiasNoise 0.0413
5 GyroscopeBiasNoise 0.0413
5 GeomagneticVectorNoise 0.0413
5 MagnetometerBiasNoise 0.0408
6 AccelerometerNoise 0.0408
6 GyroscopeNoise 0.0408
6 MagnetometerNoise 0.0397
6 AltimeterNoise 0.0385
6 AccelerometerBiasNoise 0.0381
6 GyroscopeBiasNoise 0.0381
6 GeomagneticVectorNoise 0.0381
6 MagnetometerBiasNoise 0.0375
7 AccelerometerNoise 0.0375
7 GyroscopeNoise 0.0375
7 MagnetometerNoise 0.0363
7 AltimeterNoise 0.0351
7 AccelerometerBiasNoise 0.0347
7 GyroscopeBiasNoise 0.0347
7 GeomagneticVectorNoise 0.0347
7 MagnetometerBiasNoise 0.0342
8 AccelerometerNoise 0.0342
8 GyroscopeNoise 0.0342
8 MagnetometerNoise 0.0331
8 AltimeterNoise 0.0319
8 AccelerometerBiasNoise 0.0316
8 GyroscopeBiasNoise 0.0316
8 GeomagneticVectorNoise 0.0316
8 MagnetometerBiasNoise 0.0313
9 AccelerometerNoise 0.0313
9 GyroscopeNoise 0.0313
9 MagnetometerNoise 0.0313
9 AltimeterNoise 0.0301
9 AccelerometerBiasNoise 0.0298
9 GyroscopeBiasNoise 0.0298
9 GeomagneticVectorNoise 0.0298
9 MagnetometerBiasNoise 0.0296
10 AccelerometerNoise 0.0296
10 GyroscopeNoise 0.0296
10 MagnetometerNoise 0.0296
10 AltimeterNoise 0.0285
10 AccelerometerBiasNoise 0.0283
10 GyroscopeBiasNoise 0.0283
10 GeomagneticVectorNoise 0.0283
10 MagnetometerBiasNoise 0.0282
Объедините данные о датчике с помощью настроенного фильтра.
N = size(sensorData,1); qEstTuned = quaternion.zeros(N,1); altEstTuned = zeros(N,1); for ii=1:N predict(filter,Accelerometer(ii,:),Gyroscope(ii,:)); if all(~isnan(Magnetometer(ii,1))) fusemag(filter, Magnetometer(ii,:),tunedNoise.MagnetometerNoise); end if ~isnan(Altimeter(ii)) fusealtimeter(filter, Altimeter(ii),tunedNoise.AltimeterNoise); end [altEstTuned(ii), qEstTuned(ii)] = pose(filter); end
Вычислите ошибки RMS.
orientationErrorTuned = rad2deg(dist(qEstTuned, Orientation)); rmsOrientationErrorTuned = sqrt(mean(orientationErrorTuned.^2))
rmsOrientationErrorTuned = 2.2899
positionErrorTuned = altEstTuned - Altitude; rmsPositionErrorTuned = sqrt(mean( positionErrorTuned.^2))
rmsPositionErrorTuned = 0.0199
Визуализируйте результаты.
figure; t = (0:N-1)./ filter.IMUSampleRate; subplot(2,1,1) plot(t, positionErrorTuned, 'b'); title("Tuned ahrs10filter" + newline + ... "Altitude 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 — Объект фильтраahrs10filter объектОбъект фильтра в виде ahrs10filter объект.
measureNoise — Шум измеренияШум измерения в виде структуры. Функция использует вход шума измерения в качестве исходного предположения для настройки шума измерения. Структура должна содержать эти поля:
| Имя поля | Описание |
|---|---|
MagnetometerNoise | Отклонение шума магнитометра в виде скаляра в (μT)2 |
AltimeterNoise | Отклонение шума высотомера в виде скаляра в m2 |
sensorData — Данные о датчикеtableДанные о датчике в виде table. В каждой строке данные о датчике заданы как:
Accelerometer — Данные об акселерометре в виде 1 3 вектора из скаляров в m2S.
Gyroscope— Данные о гироскопе в виде 1 3 вектора из скаляров в rad/s.
Magnetometer — Данные о магнитометре в виде 1 3 вектора из скаляров в μT.
Altimeter — Данные о высотомере в виде скаляра в метрах.
Если магнитометр не производит измерения, задайте соответствующую запись как NaN. Если вы устанавливаете Cost свойство входа настройки тюнера, config, к Custom, затем можно использовать другие типы данных для sensorData введите на основе своего выбора.
groundTruth данные Ground TruthtableДостоверные данные в виде table. В каждой строке таблица может опционально содержать любую из этих переменных:
Orientation — Ориентация от навигации структурирует к системе координат тела в виде quaternion или 3х3 матрица вращения.
Altitude — Высота в виде скаляра в метрах.
VertialVelocity — Скорость в вертикальном направлении в виде скаляра в 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 |
AltimeterNoise | Отклонение шума высотомера в виде скаляра в m2 |
[1] Abbeel, P., Коутс, A., Montemerlo, M., Ын, А.И. и Трун, S. Отличительное Обучение Фильтров Калмана. В Робототехнике: Наука и системы, Издание 2, стр 1, 2005.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.