insSensor

Инерционная навигационная система и модель симуляции GNSS/GPS

Описание

The insSensor Система object™ моделирует устройство, которое запирает измерения от инерционной навигационной системы (INS) и глобальной навигационной спутниковой системы (GNSS), такой как GPS, и выводит сплавленные измерения.

Для вывода слитых измерений INS и GNSS:

  1. Создайте insSensor Объекту и установите его свойства.

  2. Вызывайте объект с аргументами, как будто это функция.

Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».

Создание

Описание

пример

INS = insSensor возвращает Системный объект, INS, который моделирует устройство, которое выводит измерения из INS и GNSS.

INS = insSensor(Name,Value) устанавливает свойства с помощью одной или нескольких пар "имя-значение". Неопределенные свойства имеют значения по умолчанию. Заключайте каждое имя свойства в кавычки.

Свойства

расширить все

Если не указано иное, свойства являются нетронутыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируются, когда вы вызываете их, и release функция разблокирует их.

Если свойство настраивается, можно изменить его значение в любой момент.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Использование Системных объектов.

Расположение датчика на платформе, в метрах, задается как трехэлементный реальный вектор вида [x y z]. Вектор определяет смещение источника датчика от источника платформы.

Настраиваемый: Да

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

Точность измерения крена тела датчика, в степенях, задается как неотрицательный действительный скаляр.

Roll - вращение вокруг оси x тела датчика. Шум от крена моделируется как процесс белого шума. RollAccuracy устанавливает стандартное отклонение шума измерения крена.

Настраиваемый: Да

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

Точность измерения тангажа тела датчика, в степенях, задается как неотрицательный действительный скаляр.

Pitch - вращение вокруг оси y тела датчика. Шум тангажа моделируется как процесс белого шума. PitchAccuracy задает стандартное отклонение шума измерения тангажа.

Настраиваемый: Да

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

Точность измерения рыскания тела датчика, в степенях, задается как неотрицательный действительный скаляр.

Yaw - вращение вокруг оси z тела датчика. Шум рыскание моделируется как процесс белого шума. YawAccuracy задает стандартное отклонение шума измерения рыскания.

Настраиваемый: Да

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

Точность измерения положения тела датчика, в метрах, задается как неотрицательный действительный скаляр или трехэлементный реальный вектор. Элементы вектора задают точность измерений x -, y - и z - положения, соответственно. Если вы задаете PositionAccuracy в качестве скалярного значения объект устанавливает точность всех трех положений на это значение.

Позиционный шум моделируется как процесс белого шума. PositionAccuracy задает стандартное отклонение шума измерения положения.

Настраиваемый: Да

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

Точность измерения скорости тела датчика, в метрах в секунду, задается как неотрицательная действительная скаляра.

Шум скорости моделируется как процесс белого шума. VelocityAccuracy задает стандартное отклонение шума измерения скорости.

Настраиваемый: Да

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

Точность измерения ускорения тела датчика, в метрах в секунду, задается как неотрицательный действительный скаляр.

Шум ускорения моделируется как процесс белого шума. AccelerationAccuracy задает стандартное отклонение шума измерения ускорения.

Настраиваемый: Да

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

Точность измерения скорости вращения тела датчика, в метрах в секунду, задается как неотрицательная действительная скаляра.

Скорость вращения моделируется как процесс белого шума. AngularVelocityAccuracy задает стандартное отклонение шума измерения ускорения.

Настраиваемый: Да

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

Включите вход времени симуляции, заданный как логическое 0 (false) или 1 (true). Установите это свойство на true для ввода времени симуляции при помощи simTime аргумент.

Настраиваемый: Нет

Типы данных: logical

Включите исправление GNSS, заданное как логическое 1 (true) или 0 (false). Установите это свойство на false симулирует потерю исправления приемника GNSS. Когда фиксация приемника теряется, измерения положения дрейфуют со скоростью, заданной PositionErrorFactor свойство.

Настраиваемый: Да

Зависимости

Чтобы включить это свойство, задайте TimeInput на true.

Типы данных: logical

Коэффициент ошибки положения без исправления GNSS, заданный как скаляр или вектор скаляров 1 на 3.

Когда HasGNSSFix для свойства задано значение falseошибка положения растет с квадратичной скоростью из-за постоянного смещения в акселерометре. Ошибка положения для позиционного компонента E (t) может быть выражена как E (t) = 1/2 α t2, где α - коэффициент ошибки положения для соответствующего компонента, и t - время, прошедшее с момента потери исправления GNSS. Во время выполнения объект вычисляет t на основе simTime вход. Вычисленные E (t) значения для компонентов x, y и z добавляются к соответствующим компонентам положения gTruth вход.

Настраиваемый: Да

Зависимости

Чтобы включить это свойство, задайте TimeInput на true и HasGNSSFix на false.

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

Источник случайных чисел, заданный как один из следующих опций:

  • 'Global stream' -- Сгенерируйте случайные числа, используя текущий глобальный поток случайных чисел.

  • 'mt19937ar with seed' -- Сгенерируйте случайные числа с помощью алгоритма mt19937ar с seed, заданным Seed свойство.

Типы данных: char | string

Начальное начальное число алгоритма генератора случайных чисел mt19937ar, заданное как неотрицательное целое число.

Зависимости

Чтобы включить это свойство, задайте RandomStream на 'mt19937ar with seed'.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Использование

Описание

пример

measurement = INS(gTruth) моделирует данные, полученные от считывания датчика INS и считывания датчика GNSS. Измерение выхода основано на инерционной основной истине состоянии тела датчика, gTruth.

пример

measurement = INS(gTruth,simTime) дополнительно задает время симуляции, simTime. Чтобы включить этот синтаксис, установите TimeInput свойство к true.

Входные параметры

расширить все

Инерционное наземное состояние тела датчика, в локальных Декартовых координатах, задается как структура, содержащая эти поля:

ОбластьОписание
'Position'

Положение, в метрах, определенных как реальная, конечная матрица <reservedrangesplaceholder4>-by-3 [<reservedrangesplaceholder3> <reservedrangesplaceholder2> <reservedrangesplaceholder1>] векторы. N - количество выборок в текущей системе координат.

'Velocity'

Скорость (v), в метрах в секунду, заданная как вещественная, конечная N -на-3 матрица вектора [v x v y v z]. N - количество выборок в текущей системе координат.

'Orientation'

Ориентация относительно локальной Декартовой системы координат, заданная как один из следующих опций:

  • N элемент quaternion объекты

  • 3 на 3-байт- N массив матриц поворота

  • N -на-3 матрица углов [x крена y тангажа z рыскания] в степенях

Каждый кватернион или матрица вращения является поворотом кадра от локальной Декартовой системы координат к текущей системе координат тела датчика. N - количество выборок в текущей системе координат.

'Acceleration'

Ускорение (a), в метрах в секунду за секунду, заданное как вещественная, конечная N -на-3 матрица векторов [a x a y a z]. N - количество выборок в текущей системе координат.

'AngularVelocity'

Скорость вращения (ω), в метрах в секунду в квадрате, заданная как вещественная, конечная N-на-3 матрица векторов [ω x ω y ω z]. N - количество выборок в текущей системе координат.

Значения полей должны иметь тип double или single.

The Position, Velocity, и Orientation поля обязательны для заполнения. Другие поля являются необязательными.

Пример: struct('Position',[0 0 0],'Velocity',[0 0 0],'Orientation',quaternion([1 0 0 0]))

Время симуляции, в секундах, задается как неотрицательный действительный скаляр.

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

Выходные аргументы

расширить все

Измерение движения тела датчика, в локальных Декартовых координатах, возвращается как структура, содержащая эти поля:

ОбластьОписание
'Position'

Положение, в метрах, определенных как реальная, конечная матрица <reservedrangesplaceholder4>-by-3 [<reservedrangesplaceholder3> <reservedrangesplaceholder2> <reservedrangesplaceholder1>] векторы. N - количество выборок в текущей системе координат.

'Velocity'

Скорость (v), в метрах в секунду, заданная как вещественная, конечная N -на-3 матрица вектора [v x v y v z]. N - количество выборок в текущей системе координат.

'Orientation'

Ориентация относительно локальной Декартовой системы координат, заданная как один из следующих опций:

  • N элемент quaternion объекты

  • 3 на 3-байт- N массив матриц поворота

  • N -на-3 матрица углов [x крена y тангажа z рыскания] в степенях

Каждый кватернион или матрица вращения является поворотом кадра от локальной Декартовой системы координат к текущей системе координат тела датчика. N - количество выборок в текущей системе координат.

'Acceleration'

Ускорение (a), в метрах в секунду за секунду, заданное как вещественная, конечная N -на-3 матрица векторов [a x a y a z]. N - количество выборок в текущей системе координат.

'AngularVelocity'

Скорость вращения (ω), в метрах в секунду в квадрате, заданная как вещественная, конечная N-на-3 матрица векторов [ω x ω y ω z]. N - количество выборок в текущей системе координат.

Возвращенные значения полей имеют тип double или single и имеют тот же тип, что и соответствующие значения полей в gTruth вход.

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

Чтобы использовать функцию объекта, задайте системный объект в качестве первого входного параметра. Например, чтобы освободить системные ресурсы системного объекта с именем obj, используйте следующий синтаксис:

release(obj)

расширить все

perturbationsВозмущение, заданное для объекта
perturbПрименить возмущения к объекту
stepЗапуск алгоритма системного объекта
cloneСоздайте повторяющийся системный объект
isLockedОпределите, используется ли системный объект
resetСброс внутренних состояний Системного объекта
releaseОтпустите ресурсы и допустите изменения в значениях свойств системного объекта и входных характеристиках

Примеры

свернуть все

Создайте структуру движения, которая задает стационарное положение на локальном северо-восточном нисходящем (NED) источнике. Поскольку платформа является стационарной, вам нужно задать только одну выборку. Предположим, что движение «земля-правда» дискретизируется в течение 10 секунд со скоростью дискретизации 100 Гц. Создайте insSensor по умолчанию Системные object™. Предварительно выделите переменные, чтобы сохранить выход из insSensor объект.

Fs = 100;
duration = 10;
numSamples = Fs*duration;

motion = struct( ...
    'Position',zeros(1,3), ...
    'Velocity',zeros(1,3), ...
    'Orientation',ones(1,1,'quaternion'));

INS = insSensor;

positionMeasurements = zeros(numSamples,3);
velocityMeasurements = zeros(numSamples,3);
orientationMeasurements = zeros(numSamples,1,'quaternion');

В цикле вызывайте INS со стационарной структурой движения для возврата измерений положения, скорости и ориентации в локальной системе координат NED. Логгирование измерений положения, скорости и ориентации.

for i = 1:numSamples
    
    measurements = INS(motion);
    
    positionMeasurements(i,:) = measurements.Position;
    velocityMeasurements(i,:) = measurements.Velocity;
    orientationMeasurements(i) = measurements.Orientation;
    
end

Преобразуйте ориентацию из кватернионов в углы Эйлера в целях визуализации. Постройте график измерений положения, скорости и ориентации с течением времени.

orientationMeasurements = eulerd(orientationMeasurements,'ZYX','frame');

t = (0:(numSamples-1))/Fs;

subplot(3,1,1)
plot(t,positionMeasurements)
title('Position')
xlabel('Time (s)')
ylabel('Position (m)')
legend('North','East','Down')

subplot(3,1,2)
plot(t,velocityMeasurements)
title('Velocity')
xlabel('Time (s)')
ylabel('Velocity (m/s)')
legend('North','East','Down')

subplot(3,1,3)
plot(t,orientationMeasurements)
title('Orientation')
xlabel('Time (s)')
ylabel('Rotation (degrees)')
legend('Roll', 'Pitch', 'Yaw')

Figure contains 3 axes. Axes 1 with title Position contains 3 objects of type line. These objects represent North, East, Down. Axes 2 with title Velocity contains 3 objects of type line. These objects represent North, East, Down. Axes 3 with title Orientation contains 3 objects of type line. These objects represent Roll, Pitch, Yaw.

Сгенерируйте измерения с датчика INS, который установлен на транспортном средстве в сценарии вождения. Постройте график измерений INS в зависимости от состояния основной истины транспортного средства и визуализируйте скорость и профиль ускорения транспортного средства.

Создайте сценарий вождения

Загрузите географические данные для маршрута в кампусе MathWorks Apple Hill в Натике, штат Массачусетс.

data = load('ahroute.mat');
latIn = data.latitude;
lonIn = data.longitude;

Преобразуйте координаты широты и долготы трассы в Декартовы координаты. Установите источник первой координаты в ведущем маршруте. Для простоты примите высоту 0 для маршрута.

alt = 0;
origin = [latIn(1),lonIn(1),alt];
[xEast,yNorth,zUp] = latlon2local(latIn,lonIn,alt,origin);

Создайте сценарий вождения. Установите источник преобразованной трассы в качестве географической опорной точки.

scenario = drivingScenario('GeoReference',origin);

Создайте дорогу на основе Декартовых координат трассы.

roadCenters = [xEast,yNorth,zUp];
road(scenario,roadCenters);

Создайте транспортное средство, которое следует по осевой линии дороги. Транспортное средство перемещается между 4 и 5 метрами в секунду (от 9 до 11 миль в час), замедляясь на кривых в дороге. Чтобы создать траекторию, используйте smoothTrajectory функция. Вычисленная траектория минимизирует рывок и избегает разрывов в ускорении, что является требованием для моделирования датчиков INS.

egoVehicle = vehicle(scenario,'ClassID',1);
egoPath = roadCenters;
egoSpeed = [5 5 5 4 4 4 5 4 4 4 4 5 5 5 5 5];
smoothTrajectory(egoVehicle,egoPath,egoSpeed);

Постройте график сценария и отобразите вид 3-D из-за автомобиля , оборудованного датчиком.

plot(scenario)
chasePlot(egoVehicle)

Создайте датчик INS

Создайте датчик INS, который принимает вход времен симуляции. Вводите шум в измерения датчика путем установки стандартного отклонения скорости и точности измерений 0,1 и 0,05 соответственно.

INS = insSensor('TimeInput',true, ...
                'VelocityAccuracy',0.1, ...
                'AccelerationAccuracy',0.05);

Визуализация измерений INS

Инициализируйте географический проигрыватель для отображения измерений INS и основной истины актёра. Сконфигурируйте проигрыватель, чтобы отобразить последние 10 позиций и установить уровень масштаба равным 17.

zoomLevel = 17;
player = geoplayer(latIn(1),lonIn(1),zoomLevel, ...
    'HistoryDepth',10,'HistoryStyle','line');

Предварительно выделите пространство для времен симуляции, измерений скорости и измерений ускорения, которые захватываются во время симуляции.

numWaypoints = length(latIn);
times = zeros(numWaypoints,1);
gTruthVelocities = zeros(numWaypoints,1);
gTruthAccelerations = zeros(numWaypoints,1);
sensorVelocities = zeros(numWaypoints,1);
sensorAccelerations = zeros(numWaypoints,1);

Симулируйте сценарий. Во время цикла симуляции получите основная истина состояние автомобиля , оборудованного датчиком и измерение INS этого состояния. Преобразуйте эти показания в географические координаты и в каждой путевой точке визуализируйте показания основной истины и INS на географическом проигрывателе. Также соберите данные о скорости и ускорении для графического изображения графиков скорости и ускорения.

nextWaypoint = 2;
while advance(scenario)

    % Obtain ground truth state of ego vehicle.
    gTruth = state(egoVehicle);

    % Obtain INS sensor measurement.
    measurement = INS(gTruth,scenario.SimulationTime);

    % Convert readings to geographic coordinates.
    [latOut,lonOut] = local2latlon(measurement.Position(1), ...
                                   measurement.Position(2), ...
                                   measurement.Position(3),origin);

    % Plot differences between ground truth locations and locations reported by sensor.
    reachedWaypoint = sum(abs(roadCenters(nextWaypoint,:) - gTruth.Position)) < 1;
    if reachedWaypoint
        plotPosition(player,latIn(nextWaypoint),lonIn(nextWaypoint),'TrackID',1)
        plotPosition(player,latOut,lonOut,'TrackID',2,'Label','INS')

        % Capture simulation times, velocities, and accelerations.
        times(nextWaypoint,1) = scenario.SimulationTime;
        gTruthVelocities(nextWaypoint,1) = gTruth.Velocity(2);
        gTruthAccelerations(nextWaypoint,1) = gTruth.Acceleration(2);
        sensorVelocities(nextWaypoint,1) = measurement.Velocity(2);
        sensorAccelerations(nextWaypoint,1) = measurement.Acceleration(2);

        nextWaypoint = nextWaypoint + 1;
    end

    if nextWaypoint > numWaypoints
        break
    end

end

Графический профиль скорости

Сравните продольную скорость транспортного средства по основной истине с измерениями скорости, захваченными датчиком INS.

Удалите нули из временных векторов и векторов скорости.

times(times == 0) = [];
gTruthVelocities(gTruthVelocities == 0) = [];
sensorVelocities(sensorVelocities == 0) = [];

figure
hold on
plot(times,gTruthVelocities)
plot(times,sensorVelocities)
title('Longitudinal Velocity Profile')
xlabel('Time (s)')
ylabel('Velocity (m/s)')
legend('Ground truth','INS')
hold off

Графический профиль ускорения графика

Сравните основную истину продольное ускорение транспортного средства по времени с измерениями ускорения, захваченными датчиком INS.

gTruthAccelerations(gTruthAccelerations == 0) = [];
sensorAccelerations(sensorAccelerations == 0) = [];

figure
hold on
plot(times,gTruthAccelerations)
plot(times,sensorAccelerations)
title('Longitudinal Acceleration Profile')
xlabel('Time (s)')
ylabel('Acceleration (m/s^2)')
legend('Ground truth','INS')
hold off

Совет

  • Чтобы получить состояние основной истины актёров в сценарии вождения, используйте state функция.

  • Датчик сообщает о измерениях в локальной Декартовой системе координат. Чтобы преобразовать эти измерения в географические положения для визуализации на карте, используйте local2latlon функция. Чтобы преобразовать эти данные назад в локальные координаты, используйте latlon2local функция.

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

.
Введенный в R2021a