Позируйте от IMU, GPS и монокулярной визуальной одометрии (MVO)
Объект ErrorStateIMUGPSFuser
реализует сплав датчика IMU, GPS и данных о монокулярной визуальной одометрии (MVO), чтобы оценить положение в ссылочном кадре NED. Фильтр использует вектор состояния с 17 элементами, чтобы отследить ориентацию quaternion
, скорость, положение, смещения датчика IMU и масштабный коэффициент MVO. Объект ErrorStateIMUGPSFuser
использует Фильтр Калмана состояния ошибки, чтобы оценить эти количества.
Создайте ErrorStateIMUGPSFuser
, чтобы плавить IMU, GPS и данные MVO с помощью insfilter
:
filt = insfilter('errorstate');
IMUSampleRate
— Частота дискретизации IMU (Гц)100
(значение по умолчанию) | положительная скалярная величинаЧастота дискретизации инерционного модуля измерения (IMU) в Гц, заданном как положительная скалярная величина.
Типы данных: single | double
ReferenceLocation
— Ссылочное местоположение (градус, градус, метры)[0 0 0]
(значение по умолчанию) | положительный вектор - строка с 3 элементамиСсылочное местоположение, заданное как вектор - строка с 3 элементами в геодезических координатах (широта, долгота и высота). Высота является высотой выше ссылочной модели эллипсоида, WGS84. Ссылочные модули местоположения являются [метрами степеней степеней].
Типы данных: single | double
GyroscopeNoise
— Мультипликативное отклонение шума процесса от гироскопа ((rad/s) 2)[1e-6 1e-6 1e-6]
(значение по умолчанию) | скаляр | вектор - строка с 3 элементамиМультипликативное отклонение шума процесса от гироскопа в (rad/s) 2, заданный как скалярный или вектор - строка с 3 элементами из положительных действительных конечных чисел.
Если GyroscopeNoise
задан как вектор - строка, элементы соответствуют шуму в x, y и осях z гироскопа, соответственно.
Если GyroscopeNoise
задан как скаляр, один элемент применяется к каждой оси.
Типы данных: single | double
GyroscopeBiasNoise
— Отклонение шума аддитивного процесса от смещения гироскопа ((rad/s) 2)[1e-9 1e-9 1e-9]
(значение по умолчанию) | скаляр | вектор - строка с 3 элементамиОтклонение шума аддитивного процесса от гироскопа смещает в (rad/s) 2, заданный как скалярный или вектор - строка с 3 элементами из положительных действительных конечных чисел.
Если GyroscopeBiasNoise
задан как вектор - строка, элементы соответствуют шуму в x, y и осях z гироскопа, соответственно.
Если GyroscopeBiasNoise
задан как скаляр, один элемент применяется к каждой оси
Типы данных: single | double
AccelerometerNoise
— Мультипликативное отклонение шума процесса от акселерометра ((m/s2) 2)[1e-4 1e-4 1e-4]
(значение по умолчанию) | скаляр | вектор - строка с 3 элементамиМультипликативное отклонение шума процесса от акселерометра в (m/s2) 2, заданный как скалярный или вектор - строка с 3 элементами из положительных действительных конечных чисел.
Если AccelerometerNoise
задан как вектор - строка, элементы соответствуют шуму в x, y и осях z акселерометра, соответственно.
Если AccelerometerNoise
задан как скаляр, один элемент применяется к каждой оси.
Типы данных: single | double
AccelerometerBiasNoise
— Отклонение шума аддитивного процесса от смещения акселерометра ((m/s2) 2)[1e-4 1e-4 1e-4]
(значение по умолчанию) | скаляр | вектор - строка с 3 элементамиОтклонение шума аддитивного процесса от акселерометра смещает в (m/s2) 2, заданный как скалярный или вектор - строка с 3 элементами из положительных вещественных чисел.
Если AccelerometerBiasNoise
задан как вектор - строка, элементы соответствуют шуму в x, y и осях z акселерометра, соответственно.
Если AccelerometerBiasNoise
задан как скаляр, один элемент применяется к каждой оси.
State
— Вектор состояния Фильтра Калмана[1;zeros(15,1);1]
(значение по умолчанию) | вектор-столбец с 17 элементамиВектор состояния расширенного Фильтра Калмана, заданного как вектор-столбец с 17 элементами. Значения состояния представляют:
Состояние | Модули | Индекс |
---|---|---|
Ориентация (части кватерниона) | Нет данных | 1:4 |
Положение (NED) | m | 5:7 |
Скорость (NED) | m/s | 8:10 |
Смещение гироскопа (XYZ) | rad/s | 11:13 |
Смещение акселерометра (XYZ) | m/s2 | 14:16 |
Визуальная шкала одометрии (XYZ) | Нет данных | 17 |
Начальное состояние по умолчанию соответствует объекту, в покое расположенному в [0 0 0]
в геодезических координатах LLA.
Типы данных: single | double
StateCovariance
— Ошибочная ковариация состояния для Фильтра Калманаones(16)
(значение по умолчанию) | 16 16 матрицаОшибочная ковариация состояния для Фильтра Калмана, заданного как 16 16 матрицами элемента вещественных чисел. Ошибочные значения ковариации состояния представляют:
Ковариация состояния | Строка/Индекс столбца |
---|---|
δ Вектор вращения (XYZ) | 1:3 |
δ Положение (NED) | 4:6 |
δ Скорость (NED) | 7:9 |
δ Смещение гироскопа (XYZ) | 10:12 |
δ Смещение акселерометра (XYZ) | 13:15 |
δ Визуальная шкала одометрии (XYZ) | 16 |
Обратите внимание на то, что, потому что это - Фильтр Калмана состояния ошибки, он отслеживает ошибки в состояниях. δ представляет ошибку в соответствующем состоянии.
Типы данных: single | double
predict | Обновите состояния с помощью данных о гироскопе и акселерометра |
fusegps | Правильные состояния с помощью данных о GPS |
fusemvo | Правильные состояния с помощью монокулярной визуальной одометрии |
correct | Правильные состояния с помощью прямых измерений состояния |
pose | Текущая ориентация и оценка положения |
reset | Сбросьте внутренние состояния |
stateinfo | Отобразите информацию о векторе состояния |
Загрузите записанные данные наземного транспортного средства после круговой траектории. Файл .mat
содержит IMU и измерения датчика GPS и наземную ориентацию истины и положение.
load('loggedGroundVehicleCircle.mat', ... 'imuFs','localOrigin', ... 'initialStateCovariance', ... 'accelData','gyroData', ... 'gpsFs','gpsLLA','Rpos','gpsVel','Rvel', ... 'trueOrient','truePos');
Создайте фильтр INS, чтобы плавить IMU и данные о GPS с помощью Фильтра Калмана состояния ошибки.
initialState = [compact(trueOrient(1)),truePos(1,:),-6.8e-3,2.5002,0,zeros(1,6),1].';
filt = insfilter('ErrorState');
filt.IMUSampleRate = imuFs;
filt.ReferenceLocation = localOrigin;
filt.State = initialState;
filt.StateCovariance = initialStateCovariance;
Предварительно выделите переменные для положения и ориентации. Выделите переменную для индексации в данные о GPS.
numIMUSamples = size(accelData,1);
estOrient = ones(numIMUSamples,1,'quaternion');
estPos = zeros(numIMUSamples,3);
gpsIdx = 1;
Плавьте акселерометр, гироскоп и данные о GPS. Внешний цикл предсказывает фильтр вперед на уровне самой быстрой частоты дискретизации (частота дискретизации IMU).
for idx = 1:numIMUSamples % Use predict to estimate the filter state based on the accelData and % gyroData arrays. predict(filt,accelData(idx,:),gyroData(idx,:)); % GPS data is collected at a lower sample rate than IMU data. Fuse GPS % data at the lower rate. if mod(idx, imuFs / gpsFs) == 0 % Correct the filter states based on the GPS data. fusegps(filt,gpsLLA(gpsIdx,:),Rpos,gpsVel(gpsIdx,:),Rvel); gpsIdx = gpsIdx + 1; end % Log the current pose estimate [estPos(idx,:), estOrient(idx,:)] = pose(filt); end
Вычислите ошибки RMS между известным истинным положением и ориентацией и выводом от фильтра состояния ошибки.
pErr = truePos - estPos; qErr = rad2deg(dist(estOrient,trueOrient)); pRMS = sqrt(mean(pErr.^2)); qRMS = sqrt(mean(qErr.^2)); fprintf('Position RMS Error\n'); fprintf('\tX: %.2f, Y: %.2f, Z: %.2f (meters)\n\n',pRMS(1),pRMS(2),pRMS(3)); fprintf('Quaternion Distance RMS Error\n'); fprintf('\t%.2f (degrees)\n\n',qRMS);
Position RMS Error X: 0.40, Y: 0.24, Z: 0.05 (meters) Quaternion Distance RMS Error 0.30 (degrees)
Визуализируйте истинное положение и предполагаемое положение.
plot(truePos(:,1),truePos(:,2),estPos(:,1),estPos(:,2),'r:','LineWidth',2) grid on axis square xlabel('N (m)') ylabel('E (m)') legend('Ground Truth','Estimation')
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.