Инерционная навигация и имитационная модель GPS
insSensor
Система object™ вывод данных моделей от инерционной навигации и GPS.
К выходу модели от инерционной навигации и GPS:
Создайте insSensor
объект и набор его свойства.
Вызовите объект с аргументами, как будто это была функция.
Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты?.
Если в противном случае не обозначено, свойства являются ненастраиваемыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируют, когда вы вызываете их, и release
функция разблокировала их.
Если свойство является настраиваемым, можно изменить его значение в любое время.
Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в 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)
insSensor
perturbations | Возмущение задано на объекте |
perturb | Примените возмущения, чтобы возразить |
Создайте 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.