Настройка 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 | Отклонение шума магнитометра, заданная как скаляр в (мкТ)2 |
AltimeterNoise | Отклонение шума альтиметра, заданная как скаляр в m2 |
sensorData - Данные о датчикеtableДанные о датчике, заданные как table. В каждой строке данные о датчике задаются как:
Accelerometer - Данные акселерометра, заданные как вектор скаляров 1 на 3 в m2/ с .
Gyroscope- Данные гироскопа, заданные как вектор 1 на 3 скаляров в рад/с.
Magnetometer - Данные магнитометра, заданные как вектор 1 на 3 скаляров в мкТ.
Altimeter - Данные альтиметра, заданные как скаляр в метрах.
Если магнитометр не производит измерения, задайте соответствующую запись следующим NaN. Если вы задаете Cost свойство входа строения тюнера, config, в Custom, тогда можно использовать другие типы данных для sensorData вход, основанный на вашем выборе.
groundTruth - Достоверные данныеtableДостоверные данные, заданные как table. В каждой строке таблица может опционально содержать любую из следующих переменных:
Orientation - Ориентация от навигационной системы координат к каркасу кузова, заданная как quaternion или матрица вращения 3 на 3.
Altitude - Высота над уровнем моря, заданная в виде скаляра в метрах.
VertialVelocity - Скорость в вертикальном направлении, заданная как скаляр в м/с.
DeltaAngleBias - Смещение угла дельты, заданное как вектор 1 на 3 скаляров в радианах.
DeltaVelocityBias - Смещение скорости дельты, заданное как вектор 1 на 3 скаляров в м/с.
GeomagneticFieldVector - Вектор геомагнитного поля в навигационной системе координат, заданный как вектор скаляров 1 на 3.
MagnetometerBias - Смещение магнитометра в каркасе кузова, заданное как вектор 1 на 3 скаляров в мкТ.
Функция обрабатывает каждую строку sensorData и groundTruth таблицы для вычисления оценки состояния и ошибки RMS из основной истины. Переменные состояния, отсутствующие в groundTruth входы для сравнения игнорируются. The sensorData и groundTruth таблицы должны иметь одинаковое число строк.
Если вы задаете Cost свойство входа строения тюнера, config, в Custom, тогда можно использовать другие типы данных для groundTruth вход, основанный на вашем выборе.
config - Настройка тюнераtunerconfig объектСтроение тюнера, заданный как tunerconfig объект.
tunedMeasureNoise - Настроенный шум измеренияНастроенный шум измерения, возвращенный как структура. Структура содержит эти поля.
| Имя поля | Описание |
|---|---|
MagnetometerNoise | Отклонение шума магнитометра, заданная как скаляр в (мкТ)2 |
AltimeterNoise | Отклонение шума альтиметра, заданная как скаляр в m2 |
[1] Abbeel, P., Coates, A., Montemerlo, M., Ng, A.Y. and Thrun, S. Discriminative Training of Фильтры Калмана. In Robotics: Science and systems, Vol. 2, pp. 1, 2005.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.