Настройка 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 | Отклонение шума магнитометра, заданная как скаляр в (мкТ)2 |
GPSPositionNoise | Отклонение шума положения GPS, заданная как скаляр в m2 |
GPSVelocityNoise | Отклонение шума скорости GPS, заданная как скаляр в (м/с)2 |
sensorData
- Данные о датчикеtable
Данные о датчике, заданные как table
. В каждой строке данные о датчике задаются как:
Accelerometer
- Данные акселерометра, заданные как вектор скаляров 1 на 3 в m2/ с .
Gyroscope
- Данные гироскопа, заданные как вектор 1 на 3 скаляров в рад/с.
Magnetometer
- Данные магнитометра, заданные как вектор 1 на 3 скаляров в мкТ.
GPSPosition
- данные положения GPS, заданные как вектор 1 на 3 скаляров в метрах.
GPSVelocity
- данные скорости GPS, заданные как вектор 1 на 3 скаляров в м/с.
Если GPS-датчик не производит полных измерений, задайте соответствующую запись для GPSPosition
и/или GPSVelocity
как NaN
. Если вы задаете Cost
свойство входа строения тюнера, config
, в Custom
, затем можно использовать другие типы данных для sensorData
вход, основанный на вашем выборе.
groundTruth
- Достоверные данныеtable
Достоверные данные, заданные как table
. В каждой строке таблица может опционально содержать любую из следующих переменных:
Orientation
- Ориентация от навигационной системы координат к каркасу кузова, заданная как quaternion
или матрица вращения 3 на 3.
Position
- Положение в навигационной системе координат, заданное как вектор 1 на 3 скаляров в метрах.
Velocity
- Скорость в навигационной системе координат, заданная как вектор 1 на 3 скаляров в м/с.
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 |
GPSPositionNoise | Отклонение шума положения GPS, заданная как скаляр в m2 |
GPSVelocityNoise | Отклонение шума скорости GPS, заданная как скаляр в (м/с)2 |
[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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.