Накладывание моделируемых и фактических полетных данных

Этот пример показывает, как визуализировать моделируемый по сравнению с фактическими траекториями рейса с объектом Animation (Аэро. Анимация) при показе части функциональности объекта Animation. В этом примере можно использовать Аэро. Объект Animation, чтобы создать и сконфигурировать объект Animation, затем используйте тот объект создать, визуализировать, и управлять телами для траекторий рейса.

Создайте объект Animation

Этот код создает экземпляр объекта Aero.Animation.

h = Aero.Animation;

Установите свойства объекта Animation

Это кодовые наборы количество кадров в секунду. Это управляет уровнем, на котором кадры отображены в окне рисунка.

h.FramesPerSecond = 10;

Это кодовые наборы секунды данных анимации в секунду время, масштабируясь. Это свойство и свойство 'FramesPerSecond' определяют временной шаг симуляции. Настройки в этом примере приводят к временному шагу приблизительно 0,5 с. Уравнение (1/FramesPerSecond) *TimeScaling наряду с некоторыми дополнительными условиями, чтобы обработать для подвторой точности.

h.TimeScaling = 5;

Создайте и загрузите тела

Этот код загружает тела с помощью createBody для объекта Animation, h. Этот пример будет использовать эти тела, чтобы работать с и отобразить моделируемые и фактические траектории рейса. Первое тело является оранжевым и будет представлять моделируемые данные. Второе тело является синим и будет представлять фактические полетные данные.

idx1 = h.createBody('pa24-250_orange.ac','Ac3d');
idx2 = h.createBody('pa24-250_blue.ac','Ac3d');

Загрузите записанные данные для траекторий рейса

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

  • simdata файл содержит регистрируемые моделируемые данные. simdata настраивается как 6DoF массив, который является одним из форматов данных по умолчанию.

  • fltdata файл содержит фактические данные о летном испытании. В этом примере fltdata настраивается в пользовательском формате. Пример должен создать пользовательскую функцию чтения и установить параметр 'TimeSeriesSourceType' на 'Custom'.

Загружать simdata и fltdata файлы:

load simdata
load fltdata

Работать с пользовательскими данными о летном испытании, это кодовые наборы второе тело 'TimeSeriesReadFcn'. Пользовательская функция чтения расположена здесь: matlabroot/toolbox/aero/astdemos/CustomReadBodyTSData.m

h.Bodies{2}.TimeseriesReadFcn = @CustomReadBodyTSData;

Установите данные о timeseries тел.

h.Bodies{1}.TimeSeriesSource = simdata;
h.Bodies{2}.TimeSeriesSource = fltdata;
h.Bodies{2}.TimeSeriesSourceType = 'Custom';

Манипуляция с камерами

Этот код иллюстрирует, как можно управлять камерой для этих двух тел.

Свойство 'PositionFcn' объекта камеры управляет положением камеры относительно тел в анимации. Камера по умолчанию 'PositionFcn' следует за путем автомобиля преследования первого порядка. Поэтому это делает несколько шагов для камеры, чтобы расположить себя правильно в положение плоскости преследования. 'PositionFcn' по умолчанию расположен здесь: matlabroot/toolbox/aero/aero/doFirstOrderChaseCameraDynamics.m

Установите 'PositionFcn'.

h.Camera.PositionFcn = @doFirstOrderChaseCameraDynamics;

Отобразите конфигурации тела в фигуре

Этот код использует метод show, чтобы создать графический объект фигуры для объекта Animation.

h.show();

Используйте объект Animation, чтобы воспроизвести траектории рейса

Этот код использует метод play, чтобы анимировать тела на время данных о timeseries. Используя этот метод проиллюстрирует незначительные различия между моделируемым и полетными данными.

h.play();

Код может также использовать пользовательский, упрощенный 'PositionFcn', который является статическим положением на основе положения тел (т.е. никакая динамика). Упрощенный 'PositionFcn' расположен здесь: matlabroot/toolbox/aero/astdemos/staticCameraPosition.m

Установите новый 'PositionFcn'.

h.Camera.PositionFcn = @staticCameraPosition;

Запустите анимацию с новым 'PositionFcn'.

h.play();

Двигайте телами

Этот код иллюстрирует, как двигать телами к стартовой позиции (на основе данных о timeseries) и обновить положение камеры согласно новому 'PositionFcn'. Этот код использует updateBodies и updateCamera.

t = 0;
h.updateBodies(t);
h.updateCamera(t);

Измените местоположение тел

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

Получите текущие положения тела и вращения от объектов тела.

pos1 = h.Bodies{1}.Position;
rot1 = h.Bodies{1}.Rotation;
pos2 = h.Bodies{2}.Position;
rot2 = h.Bodies{2}.Rotation;

Отдельные тела с помощью moveBody. Этот код разделяет и меняет местоположение этих двух тел.

h.moveBody(1,pos1 + [0 0 -3],rot1);
h.moveBody(2,pos1 + [0 0  0],rot2);

Создайте прозрачность в первом теле

Этот код иллюстрирует, как создать прозрачность в первом теле. Код делает это путем изменения свойств исправления тела через 'PatchHandles'. (Для получения дополнительной информации о закрашенных фигурах в MATLAB® смотрите раздел Introduction to Patch Objects в документации MATLAB.)

Примечание: На некотором программном обеспечении использования платформ рендеринг OpenGL®, прозрачность может вызвать уменьшение в скорости анимации.

См. документацию opengl для получения дополнительной информации о OpenGL в MATLAB.

Чтобы создать прозрачность, код получает указатели закрашенной фигуры для первого тела.

patchHandles2 = h.Bodies{1}.PatchHandles;

Боритесь и альфа-значения ребра.

desiredFaceTransparency = .3;
desiredEdgeTransparency = 1;

Этот код получает текущую поверхность и альфа-данные о ребре и изменяет все значения на желаемые альфа-значения. В фигуре заметьте, что первое тело теперь имеет прозрачность.

for k = 1:size(patchHandles2,1)
    tempFaceAlpha = get(patchHandles2(k),'FaceVertexAlphaData');
    tempEdgeAlpha = get(patchHandles2(k),'EdgeAlpha');
	set(patchHandles2(k),...
        'FaceVertexAlphaData',repmat(desiredFaceTransparency,size(tempFaceAlpha)));
    set(patchHandles2(k),...
        'EdgeAlpha',repmat(desiredEdgeTransparency,size(tempEdgeAlpha)));
end

Измените цвет второго тела

Этот код иллюстрирует, как изменить телесный цвет цвет второго тела. Код делает это путем изменения свойств исправления тела через 'PatchHandles'.

patchHandles3 = h.Bodies{2}.PatchHandles;

Это кодовые наборы желаемый (красный) цвет шаблона.

desiredColor = [1 0 0];

Код может теперь получить текущие данные о цвете поверхности и изменить все значения на значения требуемого цвета. Отметьте следующие моменты на коде:

  • Условие if мешает окнам окрашиваться.

  • Свойство имени хранится в данных о геометрии тела (h. Тела {2}.Geometry. FaceVertexColorData (k) .name).

  • Код только изменяет индексы в patchHandles3 с дубликатами неокна в данных о геометрии тела.

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

for k = 1:size(patchHandles3,1)
    tempFaceColor = get(patchHandles3(k),'FaceVertexCData');
    tempName = h.Bodies{2}.Geometry.FaceVertexColorData(k).name;
    if ~contains(tempName,'Windshield') &&...
       ~contains(tempName,'front-windows') &&...
       ~contains(tempName,'rear-windows')
    set(patchHandles3(k),...
        'FaceVertexCData',repmat(desiredColor,[size(tempFaceColor,1),1]));
    end
end

Выключите посадочное устройство на втором теле

Следующий код выключает посадочное устройство для второго тела. Для этого это выключает видимость всех частей автомобиля, сопоставленных с посадочным устройством. Обратите внимание, что индексы в вектор patchHandles3 были определены из свойства имени в данных о геометрии. Другие источники данных не могут иметь эту информацию в наличии. В этих случаях необходимо будет знать, какие индексы соответствуют конкретным частям геометрии.

for k = [1:8,11:14,52:57]
    set(patchHandles3(k),'Visible','off')
end

Закройте и удалите объект Animation

Закрыть и удалить

h.delete();
%#ok<*REPMAT>