Настройте 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 вектора из скаляров в m2/s.
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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.