Настройте insfilterAsync
параметры, чтобы уменьшать ошибку расчета
настраивает свойства tunedMeasureNoise
= tune(filter
,measureNoise
,sensorData
,groundTruth
)insfilterAsync
объект фильтра, filter
, и шумы измерения, чтобы уменьшать ошибку оценки состояния корневого среднеквадратического (RMS) между объединенными данными о датчике и основной истиной. Функция также возвращает настроенный шум измерения, tunedMeasureNoise
. Функция использует значения свойств в фильтре и шуме измерения, обеспеченном в measureNoise
структура как первоначальная оценка для алгоритма оптимизации.
задает настраивающуюся настройку на основе tunedMeasureNoise
= tune(___,config
)tunerconfig
объект, config
.
insfilterAsync
оптимизировать оценку положенияЗагрузите записанные данные о датчике и достоверные данные.
load('insfilterAsyncTuneData.mat');
Создайте расписания для данных о датчике и данных об истине.
sensorData = timetable(Accelerometer, Gyroscope, ... Magnetometer, GPSPosition, GPSVelocity, 'SampleRate', 100); groundTruth = timetable(Orientation, Position, ... 'SampleRate', 100);
Создайте insfilterAsync
объект фильтра, который имеет несколько шумовых свойств.
filter = insfilterAsync('State', initialState, ... 'StateCovariance', initialStateCovariance, ... 'AccelerometerBiasNoise', 1e-7, ... 'GyroscopeBiasNoise', 1e-7, ... 'MagnetometerBiasNoise', 1e-7, ... 'GeomagneticVectorNoise', 1e-7);
Создайте объект настройки тюнера для фильтра. Установите максимальные итерации на два. Кроме того, установите настраиваемые параметры как незаданные свойства.
config = tunerconfig('insfilterAsync','MaxIterations',8); config.TunableParameters = setdiff(config.TunableParameters, ... {'GeomagneticVectorNoise', 'AccelerometerBiasNoise', ... 'GyroscopeBiasNoise', 'MagnetometerBiasNoise'}); config.TunableParameters
ans = 1×10 string
"AccelerationNoise" "AccelerometerNoise" "AngularVelocityNoise" "GPSPositionNoise" "GPSVelocityNoise" "GyroscopeNoise" "MagnetometerNoise" "PositionNoise" "QuaternionNoise" "VelocityNoise"
Используйте функцию шума тюнера, чтобы получить набор начальных шумов датчика, используемых в фильтре.
measNoise = tunernoise('insfilterAsync')
measNoise = struct with fields:
AccelerometerNoise: 1
GyroscopeNoise: 1
MagnetometerNoise: 1
GPSPositionNoise: 1
GPSVelocityNoise: 1
Настройте фильтр и получите настроенные параметры.
tunedParams = tune(filter,measNoise,sensorData,groundTruth,config);
Iteration Parameter Metric _________ _________ ______ 1 AccelerationNoise 2.1345 1 AccelerometerNoise 2.1264 1 AngularVelocityNoise 1.9659 1 GPSPositionNoise 1.9341 1 GPSVelocityNoise 1.8420 1 GyroscopeNoise 1.7589 1 MagnetometerNoise 1.7362 1 PositionNoise 1.7362 1 QuaternionNoise 1.7218 1 VelocityNoise 1.7218 2 AccelerationNoise 1.7190 2 AccelerometerNoise 1.7170 2 AngularVelocityNoise 1.6045 2 GPSPositionNoise 1.5948 2 GPSVelocityNoise 1.5323 2 GyroscopeNoise 1.4803 2 MagnetometerNoise 1.4703 2 PositionNoise 1.4703 2 QuaternionNoise 1.4632 2 VelocityNoise 1.4632 3 AccelerationNoise 1.4596 3 AccelerometerNoise 1.4548 3 AngularVelocityNoise 1.3923 3 GPSPositionNoise 1.3810 3 GPSVelocityNoise 1.3322 3 GyroscopeNoise 1.2998 3 MagnetometerNoise 1.2976 3 PositionNoise 1.2976 3 QuaternionNoise 1.2943 3 VelocityNoise 1.2943 4 AccelerationNoise 1.2906 4 AccelerometerNoise 1.2836 4 AngularVelocityNoise 1.2491 4 GPSPositionNoise 1.2258 4 GPSVelocityNoise 1.1880 4 GyroscopeNoise 1.1701 4 MagnetometerNoise 1.1698 4 PositionNoise 1.1698 4 QuaternionNoise 1.1688 4 VelocityNoise 1.1688 5 AccelerationNoise 1.1650 5 AccelerometerNoise 1.1569 5 AngularVelocityNoise 1.1454 5 GPSPositionNoise 1.1100 5 GPSVelocityNoise 1.0778 5 GyroscopeNoise 1.0709 5 MagnetometerNoise 1.0675 5 PositionNoise 1.0675 5 QuaternionNoise 1.0669 5 VelocityNoise 1.0669 6 AccelerationNoise 1.0634 6 AccelerometerNoise 1.0549 6 AngularVelocityNoise 1.0549 6 GPSPositionNoise 1.0180 6 GPSVelocityNoise 0.9866 6 GyroscopeNoise 0.9810 6 MagnetometerNoise 0.9775 6 PositionNoise 0.9775 6 QuaternionNoise 0.9768 6 VelocityNoise 0.9768 7 AccelerationNoise 0.9735 7 AccelerometerNoise 0.9652 7 AngularVelocityNoise 0.9652 7 GPSPositionNoise 0.9283 7 GPSVelocityNoise 0.8997 7 GyroscopeNoise 0.8947 7 MagnetometerNoise 0.8920 7 PositionNoise 0.8920 7 QuaternionNoise 0.8912 7 VelocityNoise 0.8912 8 AccelerationNoise 0.8885 8 AccelerometerNoise 0.8811 8 AngularVelocityNoise 0.8807 8 GPSPositionNoise 0.8479 8 GPSVelocityNoise 0.8238 8 GyroscopeNoise 0.8165 8 MagnetometerNoise 0.8165 8 PositionNoise 0.8165 8 QuaternionNoise 0.8159 8 VelocityNoise 0.8159
Объедините данные о датчике с помощью настроенного фильтра.
dt = seconds(diff(groundTruth.Time)); N = size(sensorData,1); qEst = quaternion.zeros(N,1); posEst = zeros(N,3); % Iterate the filter for prediction and correction using sensor data. for ii=1:N if ii ~= 1 predict(filter, dt(ii-1)); end if all(~isnan(Accelerometer(ii,:))) fuseaccel(filter,Accelerometer(ii,:), ... tunedParams.AccelerometerNoise); end if all(~isnan(Gyroscope(ii,:))) fusegyro(filter, Gyroscope(ii,:), ... tunedParams.GyroscopeNoise); end 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 [posEst(ii,:), qEst(ii,:)] = pose(filter); end
Вычислите ошибки RMS.
orientationError = rad2deg(dist(qEst, Orientation)); rmsorientationError = sqrt(mean(orientationError.^2))
rmsorientationError = 2.7801
positionError = sqrt(sum((posEst - Position).^2, 2)); rmspositionError = sqrt(mean( positionError.^2))
rmspositionError = 0.5966
Визуализируйте результаты.
figure(); t = (0:N-1)./ groundTruth.Properties.SampleRate; subplot(2,1,1) plot(t, positionError, 'b'); title("Tuned insfilterAsync" + newline + "Euclidean Distance Position Error") xlabel('Time (s)'); ylabel('Position Error (meters)') subplot(2,1,2) plot(t, orientationError, 'b'); title("Orientation Error") xlabel('Time (s)'); ylabel('Orientation Error (degrees)');
filter
— Объект фильтраinfilterAsync
объектОбъект фильтра в виде insfilterAsync
объект.
measureNoise
— Шум измеренияШум измерения в виде структуры. Функция использует вход шума измерения в качестве исходного предположения для настройки шума измерения. Структура должна содержать эти поля:
Имя поля | Описание |
---|---|
AccelerometerNoise | Отклонение шума акселерометра в виде скаляра в (m2/s) |
GyroscopeNoise | Отклонение шума гироскопа в виде скаляра в (rad/s) 2 |
MagnetometerNoise | Отклонение шума магнитометра в виде скаляра в (μT) 2 |
GPSPositionNoise | Отклонение шума положения GPS в виде скаляра в m2 |
GPSVelocityNoise | Отклонение скоростного шума GPS в виде скаляра в (m/s) 2 |
sensorData
— Данные о датчикеduration
Данные о датчике в виде timetable
. В каждой строке, время и данные о датчике задан как:
Time
— Время, в которое данные получены в виде скаляра в секундах.
Accelerometer
— Данные об акселерометре в виде 1 3 вектора из скаляров в m2/s.
Gyroscope
— Данные о гироскопе в виде 1 3 вектора из скаляров в rad/s.
Magnetometer
— Данные о магнитометре в виде 1 3 вектора из скаляров в μT.
GPSPosition
— Данные о положении GPS в виде 1 3 вектора из скаляров в метрах.
GPSVelocity
— Скоростные данные о GPS в виде 1 3 вектора из скаляров в m/s.
Если датчик не производит измерения, задайте соответствующую запись как NaN
. Если вы устанавливаете Cost
свойство входа настройки тюнера, config
, к Custom
, затем можно использовать другие типы данных для sensorData
введите на основе своего выбора.
groundTruth
данные Ground Truthduration
Достоверные данные в виде timetable
. В каждой строке таблица может опционально содержать любую из этих переменных:
Orientation
— Ориентация от навигации структурирует к системе координат тела в виде quaternion
или 3х3 матрица вращения.
AngularVelocity
— Скорость вращения в системе координат тела в виде 1 3 вектора из скаляров в rad/s.
Position
— Положение в навигации структурирует в виде 1 3 вектор из скаляров в метрах.
Velocity
— Скорость в навигации структурирует в виде 1 3 вектор из скаляров в m/s.
Acceleration
— Ускорение в навигации структурирует в виде 1 3 вектор из скаляров в m2/s.
AccelerometerBias
— Угол дельты акселерометра смещает в системе координат тела в виде 1 3 вектор из скаляров в m2/s.
GyroscopeBias
— Угол дельты гироскопа смещает в системе координат тела в виде 1 3 вектор из скаляров в rad/s.
GeomagneticFieldVector
— Геомагнитный полевой вектор в навигации структурирует в виде 1 3 вектор из скаляров.
MagnetometerBias
— Смещение магнитометра в системе координат тела в виде 1 3 вектора из скаляров в μT.
Функциональные процессы каждая строка sensorData
и groundTruth
таблицы последовательно, чтобы вычислить оценку состояния и ошибку RMS от основной истины. Переменные состояния, не существующие в groundTruth
вход проигнорирован для сравнения. sensorData
и groundTruth
таблицы должны иметь те же временные шаги.
Если вы устанавливаете Cost
свойство входа настройки тюнера, config
, к Custom
, затем можно использовать другие типы данных для groundTruth
введите на основе своего выбора.
config
— Настройка тюнераtunerconfig
объектНастройка тюнера в виде tunerconfig
объект.
tunedMeasureNoise
— Настроенный шум измеренияНастроенный шум измерения, возвращенный как структура. Структура содержит эти поля.
Имя поля | Описание |
---|---|
AccelerometerNoise | Отклонение шума акселерометра в виде скаляра в (m2/s) 2 |
GyroscopeNoise | Отклонение шума гироскопа в виде скаляра в (rad/s) 2 |
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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.