Инерционная навигация и имитационная модель GPS
insSensor Система object™ вывод данных моделей от инерционной навигации и GPS.
К выходу модели от инерционной навигации и GPS:
Создайте insSensor объект и набор его свойства.
Вызовите объект с аргументами, как будто это была функция.
Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты? MATLAB.
Если в противном случае не обозначено, свойства являются ненастраиваемыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируют, когда вы вызываете их и release функция разблокировала их.
Если свойство является настраиваемым, можно изменить его значение в любое время.
Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты (MATLAB).
RollAccuracy — Точность измерения списка (градус) (значение по умолчанию) | неотрицательный действительный скалярТочность измерения списка корпуса датчика в градусах, заданный как неотрицательный действительный скаляр.
Список задан как вращение вокруг x - ось корпуса датчика. Шум списка моделируется как белый шумовой процесс. RollAccuracy устанавливает стандартное отклонение, в градусах, шума измерения списка.
Настраиваемый: да
Типы данных: single | double
PitchAccuracy — Точность измерения подачи (градус) (значение по умолчанию) | неотрицательный действительный скалярТочность измерения подачи корпуса датчика в градусах, заданный как неотрицательный действительный скаляр.
Подача задана как вращение вокруг y - ось корпуса датчика. Шум подачи моделируется как белый шумовой процесс. PitchAccuracy задает стандартное отклонение, в градусах, шума измерения подачи.
Настраиваемый: да
Типы данных: single | double
YawAccuracy — Точность измерения отклонения от курса (градус) (значение по умолчанию) | неотрицательный действительный скалярТочность измерения отклонения от курса корпуса датчика в градусах, заданный как неотрицательный действительный скаляр.
Отклонение от курса задано как вращение вокруг z - ось корпуса датчика. Шум отклонения от курса моделируется как белый шумовой процесс. YawAccuracy задает стандартное отклонение, в градусах, шума измерения отклонения от курса.
Настраиваемый: да
Типы данных: single | double
PositionAccuracy — Точность измерения положения (m) (значение по умолчанию) | неотрицательный действительный скалярТочность измерения положения корпуса датчика в метрах, заданных как неотрицательный действительный скаляр.
Шум положения моделируется как белый шумовой процесс. PositionAccuracy задает стандартное отклонение, в метрах, шума измерения положения.
Настраиваемый: да
Типы данных: single | double
VelocityAccuracy — Точность скоростного измерения (m/s) (значение по умолчанию) | неотрицательный действительный скалярТочность скоростного измерения корпуса датчика в метрах в секунду, заданный как неотрицательный действительный скаляр.
Скоростной шум моделируется как белый шумовой процесс. VelocityAccuracy задает стандартное отклонение, в метрах в секунду, скоростного шума измерения.
Настраиваемый: да
Типы данных: single | double
RandomStream — Источник случайных чисел'Global stream' (значение по умолчанию) | 'mt19937ar with seed'Источник случайных чисел, заданный как вектор символов:
'Global stream' – Случайные числа сгенерированы с помощью текущего глобального потока случайных чисел.
'mt19937ar with seed' – Случайные числа сгенерированы с помощью mt19937ar алгоритма с seed, заданным Seed свойство.
Типы данных: char | string
Seed — Начальный seed (значение по умолчанию) | неотрицательный целочисленный скалярНачальный seed mt19937ar алгоритма генератора случайных чисел, заданного как действительный, неотрицательный целочисленный скаляр.
Чтобы включить это свойство, установите RandomStream к 'mt19937ar with seed'.
Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
моделирует данные, полученные от инерционной навигации и чтения GPS. Измерение основано на входном сигнале, measurement = INS(motion)motion.
motion — Движение корпуса датчика основной истины в локальном NEDmotion struct со следующими полями:
'Position' – Положение корпуса датчика в локальной системе координат NED, заданной как действительный конечный N-by-3 массив в метрах. N является количеством выборок в текущей системе координат.
'Velocity' – Скорость корпуса датчика в локальной системе координат NED, заданной как действительный конечный N-by-3 массив в метрах в секунду. N является количеством выборок в текущей системе координат.
'Orientation' – Ориентация корпуса датчика относительно локальной системы координат NED, заданной как quaternion
N- вектор-столбец элемента или один или двойные 3 3 N матрицей вращения. Каждая матрица кватерниона или вращения является вращением системы координат от локальной системы координат NED до системы координат корпуса датчика тока. N является количеством выборок в текущей системе координат.
Пример: motion = struct('Position',[0,0,0],'Velocity',[0,0,0],'Orientation',quaternion([1,0,0,0]))
measurement — Измерение движения корпуса датчика в локальном NEDmeasurement struct со следующими полями:
'Position' – Измерение положения корпуса датчика в локальной системе координат NED, заданной как действительный конечный N-by-3 массив в метрах. N является количеством выборок в текущей системе координат.
'Velocity' – Скоростное измерение корпуса датчика в локальной системе координат NED, заданной как действительный конечный N-by-3 массив в метрах в секунду. N является количеством выборок в текущей системе координат.
'Orientation' – Измерение ориентации корпуса датчика относительно локальной системы координат NED, заданной как кватернион N - вектор-столбец элемента или один или двойные 3 3 N матрицей вращения. Каждая матрица кватерниона или вращения является вращением системы координат от локальной системы координат NED до системы координат корпуса датчика тока. N является количеством выборок в текущей системе координат.
Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj, используйте этот синтаксис:
release(obj)
Создайте struct движения, который задает стационарное положение в локальном начале координат 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 со стационарным struct движения, чтобы возвратить положение, скорость и измерения ориентации в локальной системе координат 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')

Сгенерируйте измерения INS с помощью insSensor Система object™. Используйте waypointTrajectory сгенерировать путь основной истины. Используйте trackingScenario организовывать симуляцию и визуализировать движение.
Задайте траекторию основной истины как путь восьмерки в Северо-восточной плоскости. Используйте частоту дискретизации на 50 Гц и 5 второй длительности.
Fs = 50; duration = 5; numSamples = Fs*duration; t = (0:(numSamples-1)).'/Fs; a = 2; x = a.*sqrt(2).*cos(t) ./ (sin(t).^2 + 1); y = sin(t) .* x; z = zeros(numSamples,1); waypoints = [x,y,z]; path = waypointTrajectory('Waypoints',waypoints,'TimeOfArrival',t);
Создайте insSensor Системный объект к модели, получающей данные о INS. Установите PositionAccuracy к 0.1.
ins = insSensor('PositionAccuracy',0.1);Создайте сценарий отслеживания с единой платформой, движение которой задано path.
scenario = trackingScenario('UpdateRate',Fs);
quadcopter = platform(scenario);
quadcopter.Trajectory = path;Создайте театральный график визуализировать основную истину quadcopter движение и quadcopter измерения движения смоделированы insSensor.
tp = theaterPlot('XLimits',[-3, 3],'YLimits', [-3, 3]); quadPlotter = platformPlotter(tp, ... 'DisplayName', 'Ground-Truth Motion', ... 'Marker', 's', ... 'MarkerFaceColor','blue'); insPlotter = detectionPlotter(tp, ... 'DisplayName','INS Measurement', ... 'Marker','d', ... 'MarkerFaceColor','red');
![]()
В цикле усовершенствуйте сценарий, пока это не будет завершено. Для каждого временного шага получите текущую выборку движения, измерения модели INS для движения, и затем постройте результат.
while advance(scenario) motion = platformPoses(scenario,'quaternion'); insMeas = ins(motion); plotPlatform(quadPlotter,motion.Position); plotDetection(insPlotter,insMeas.Position); pause(1/scenario.UpdateRate) end
![]()
Сгенерируйте измерения INS с помощью insSensor Система object™. Используйте waypointTrajectory сгенерировать путь основной истины.
Задайте ориентацию основной истины, которая начинается с оси X корпуса датчика, выровненной с Севером, и заканчивается осью X корпуса датчика, выровненной с Востоком. Задайте waypoints для траектории дуги и вектор времени прибытия для соответствующего waypoints. Используйте частоту дискретизации на 100 Гц. Создайте waypointTrajectory Системный объект с waypoint ограничениями и набор SamplesPerFrame так, чтобы целая траектория была выведена с одним вызовом.
eulerAngles = [0,0,0; ... 0,0,0; ... 90,0,0; ... 90,0,0]; orientation = quaternion(eulerAngles,'eulerd','ZYX','frame'); r = 20; waypoints = [0,0,0; ... 100,0,0; ... 100+r,r,0; ... 100+r,100+r,0]; toa = [0,10,10+(2*pi*r/4),20+(2*pi*r/4)]; Fs = 100; numSamples = floor(Fs*toa(end)); path = waypointTrajectory('Waypoints',waypoints, ... 'TimeOfArrival',toa, ... 'Orientation',orientation, ... 'SampleRate',Fs, ... 'SamplesPerFrame',numSamples);
Создайте insSensor Системный объект к модели, получающей данные о INS. Установите PositionAccuracy к 0.1.
ins = insSensor('PositionAccuracy',0.1);Вызовите waypoint объект траектории, path, сгенерировать движение основной истины. Вызовите средство моделирования INS, ins, с движением основной истины сгенерировать измерения INS.
[motion.Position,motion.Orientation,motion.Velocity] = path(); insMeas = ins(motion);
Преобразуйте ориентацию, возвращенную ins к Углам Эйлера в градусах в целях визуализации. Стройте полный путь и ориентацию в зависимости от времени.
orientationMeasurementEuler = eulerd(insMeas.Orientation,'ZYX','frame'); subplot(2,1,1) plot(insMeas.Position(:,1),insMeas.Position(:,2)); title('Path') xlabel('North (m)') ylabel('East (m)') subplot(2,1,2) t = (0:(numSamples-1)).'/Fs; plot(t,orientationMeasurementEuler(:,1), ... t,orientationMeasurementEuler(:,2), ... t,orientationMeasurementEuler(:,3)); title('Orientation') legend('Yaw','Pitch','Roll') xlabel('Time (s)') ylabel('Rotation (degrees)')

Указания и ограничения по применению:
Смотрите системные объекты в Генерации кода MATLAB (MATLAB Coder).
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.