AsyncMARGGPSFuser

Позируйте от асинхронного MARG и GPS

Описание

Объект AsyncMARGGPSFuser реализует сплав датчика MARG и данных о GPS, чтобы оценить положение в ссылочном кадре NED. MARG (магнитный, угловой уровень, сила тяжести) данные обычно выводятся от магнитометра, гироскопа и данных об акселерометре, соответственно. Фильтр использует вектор состояния с 28 элементами, чтобы отследить ориентацию quaternion, скорость, положение, смещения датчика MARG и геомагнитный вектор. Объект AsyncMARGGPSFuser использует непрерывно-дискретный расширенный Фильтр Калмана, чтобы оценить эти количества.

Создание

Создайте AsyncMARGGPSFuser, чтобы плавить асинхронный MARG и данные о GPS с помощью insfilter:

filt = insfilter('AsyncIMU');

Свойства

развернуть все

Ссылочное местоположение, заданное как трехэлементный вектор - строка в геодезических координатах (широта, долгота и высота). Высота является высотой выше ссылочной модели эллипсоида, WGS84. Ссылочные модули местоположения являются [метрами степеней степеней].

Типы данных: single | double

Аддитивное отклонение шума процесса кватерниона, заданное как скалярный или четырехэлементный вектор частей кватерниона.

Типы данных: single | double

Аддитивный угловой скоростной шум процесса в локальной системе координат NED в (rad/s) 2, заданный как скалярный или трехэлементный вектор - строка из положительных действительных конечных чисел.

  • Если AngularVelocityNoise является вектором - строкой, элементы соответствуют шуму в x, y и осях z локальной системы координат NED, соответственно.

  • Если AngularVelocityNoise является скаляром, один элемент применяется к каждой оси.

Типы данных: single | double

Аддитивный шум процесса положения в локальной системе координат NED в m2, заданном как скалярный или трехэлементный вектор - строка из положительных действительных конечных чисел.

  • Если PositionNoise является вектором - строкой, элементы соответствуют шуму в x, y и осях z локальной системы координат NED, соответственно.

  • Если PositionNoise является скаляром, один элемент применяется к каждой оси.

Типы данных: single | double

Аддитивный скоростной шум процесса в локальной системе координат NED в (m/s) 2, заданный как скалярный или трехэлементный вектор - строка из положительных действительных конечных чисел.

  • Если VelocityNoise является вектором - строкой, элементы соответствуют шуму в x, y и осях z локальной системы координат NED, соответственно.

  • Если VelocityNoise является скаляром, один элемент применяется к каждой оси.

Типы данных: single | double

Аддитивный ускоряющий шум процесса в (m/s2) 2, заданный как скалярный или трехэлементный вектор - строка из положительных действительных конечных чисел.

  • Если AccelerationNoise является вектором - строкой, элементы соответствуют шуму в x, y и осях z локальной системы координат NED, соответственно.

  • Если AccelerationNoise является скаляром, один элемент применяется к каждой оси.

Типы данных: single | double

Отклонение шума аддитивного процесса от гироскопа смещает в (rad/s) 2, заданный как скалярный или трехэлементный вектор - строка из положительных действительных конечных чисел.

  • Если GyroscopeBiasNoise является вектором - строкой, элементы соответствуют шуму в x, y и осях z гироскопа, соответственно.

  • Если GyroscopeBiasNoise является скаляром, один элемент применяется к каждой оси.

Типы данных: single | double

Отклонение шума аддитивного процесса от акселерометра смещает в (m/s2) 2, заданный как скалярный или трехэлементный вектор - строка из положительных вещественных чисел.

  • Если AccelerometerBiasNoise является вектором - строкой, элементы соответствуют шуму в x, y и осях z акселерометра, соответственно.

  • Если AccelerometerBiasNoise является скаляром, один элемент применяется к каждой оси.

Отклонение шума аддитивного процесса геомагнитного вектора в μT2, заданном как скалярный или трехэлементный вектор - строка из положительных вещественных чисел.

  • Если GeomagneticVectorNoise является вектором - строкой, элементы соответствуют шуму в x, y и осях z локальной системы координат NED, соответственно.

  • Если GeomagneticVectorNoise является скаляром, один элемент применяется к каждой оси.

Отклонение шума аддитивного процесса от магнитометра смещает в μT2, заданном как скалярный или трехэлементный вектор - строка из положительных вещественных чисел.

  • Если MagnetometerBiasNoise является вектором - строкой, элементы соответствуют шуму в x, y и осях z магнитометра, соответственно.

  • Если MagnetometerBiasNoise является скаляром, один элемент применяется к каждой оси.

Вектор состояния расширенного Фильтра Калмана. Значения состояния представляют:

СостояниеМодулиИндекс
Ориентация (части кватерниона)Нет данных1:4
Угловая скорость (XYZ)rad/s5:7
Положение (NED)m8:10
Скорость (NED)m/s11:13
Ускорение (NED)m/s214:16
Смещение акселерометра (XYZ)m/s217:19
Смещение гироскопа (XYZ)rad/s20:22
Геомагнитный полевой вектор (NED)μT23:25
Смещение магнитометра (XYZ)μT26:28

Начальное состояние по умолчанию соответствует объекту, в покое расположенному в [0 0 0] в геодезических координатах LLA.

Типы данных: single | double

Ошибочная ковариация состояния для расширенного Фильтра Калмана, заданного как 28 28 матрицами элемента вещественных чисел.

Типы данных: single | double

Функции объекта

predictОбновите состояния на основе модели движения
fuseaccelПравильные состояния с помощью данных об акселерометре
fusegyroПравильные состояния с помощью данных о гироскопе
fusemagПравильные состояния с помощью данных о магнитометре
fusegpsПравильные состояния с помощью данных о GPS
correctПравильные состояния с помощью прямых измерений состояния
poseТекущее положение, ориентация и оценка скорости
resetСбросьте внутренние состояния
stateinfoОтобразите информацию о векторе состояния

Примеры

свернуть все

Загрузите регистрируемые данные о датчике и наземное положение истины.

load('uavshort.mat','refloc','initstate','imuFs', ...
    'accel','gyro','mag','lla','gpsvel', ...
    'trueOrient','truePos')

Создайте фильтр INS, чтобы плавить асинхронный MARG и данные о GPS, чтобы оценить положение.

filt = insfilter('AsyncIMU');
filt.ReferenceLocation = refloc;
filt.State = [initstate(1:4);0;0;0;initstate(5:10);0;0;0;initstate(11:end)];

Задайте шумы измерения датчика. Шумы были определены от таблиц данных и экспериментирования.

Rmag  = 80;
Rvel  = 0.0464;
Racc  = 800;
Rgyro = 1e-4;
Rpos  = 34;

Предварительно выделите переменные для положения и ориентации. Выделите переменную для индексации в данные о GPS.

N = size(accel,1);
p = zeros(N,3);
q = zeros(N,1,'quaternion');

gpsIdx = 1;

Плавьте акселерометр, гироскоп, магнитометр и данные о GPS. Внешний цикл предсказывает, что фильтр передает один временной шаг и акселерометр предохранителей и данные о гироскопе на уровне частоты дискретизации IMU.

for ii = 1:N

    % Predict the filter forward one time step
    predict(filt,1./imuFs);

    % Fuse accelerometer and gyroscope readings
    fuseaccel(filt,accel(ii,:),Racc);
    fusegyro(filt,gyro(ii,:),Rgyro);

    % Fuse magnetometer at 1/2 the IMU rate
    if ~mod(ii, fix(imuFs/2))
        fusemag(filt,mag(ii,:),Rmag);
    end

    % Fuse GPS once per second
    if ~mod(ii,imuFs)
        fusegps(filt,lla(gpsIdx,:),Rpos,gpsvel(gpsIdx,:),Rvel);
        gpsIdx = gpsIdx + 1;
    end

    % Log the current pose estimate
    [p(ii,:),q(ii)] = pose(filt);

end

Вычислите ошибки RMS между известным истинным положением и ориентацией и выводом от асинхронного фильтра IMU.

posErr = truePos - p;
qErr = rad2deg(dist(trueOrient,q));

pRMS = sqrt(mean(posErr.^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.55, Y: 0.71, Z: 0.74 (meters)

Quaternion Distance RMS Error
	4.72 (degrees)

Визуализируйте истинное положение и предполагаемое положение.

plot3(truePos(:,1),truePos(:,2),truePos(:,3),'LineWidth',2)
hold on
plot3(p(:,1),p(:,2),p(:,3),'r:','LineWidth',2)
grid on
xlabel('N (m)')
ylabel('E (m)')
zlabel('D (m)')

Алгоритмы

развернуть все

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Смотрите также

Введенный в R2019a