Главная
 
...Среда, 25.12.2024, 09:06



Приветствую Вас Гость | RSS
Главная
Меню сайта

Категории раздела
Гражданские [102]
Военные [171]
Конструкторская деятельность [8]
Вертолёты [38]
Транспортные [11]
Люди [19]
Специальная авиация [19]
Авиационное вооружение [7]
Авиационные происшествия [23]
Космическая техника [7]
Авиа-анекдоты [1]
Навигация и самолётовождение [16]

Мини-чат
200

Наш опрос
Оцените мой сайт
Всего ответов: 52

Статистика

Онлайн всего: 9
Гостей: 9
Пользователей: 0


Основы аэродинамики JSBSim для авиасимулятора FlightGear
Основы аэродинамики JSBSim для авиасимулятора FlightGear
Описание: Приводится описание программы расчета аэродинамики JSBSim: базовые понятия, форматы конфигурационных файлов, примеры использования, инструментарий разработчика.
Автор: Юрий Никифоров aka yurik_nsk   Дата: 31.03.2008 13:26   Просмотров: 8095

Основы аэродинамики JSBSim для авиасимулятора FlightGear

1. Введение

JSBSim - это программа вычисления полетной динамики (Flight Dynamic Model, FDM). Программа написана на С++, и распространяется по лицензии GPL. Это open-source проект. Программа собирается любым современным компилятором под любую операционную систему - включая разные версии Windows, Linux, BSD, MacOS. JSBSim может работать как автономно, так и в составе авиасимулятора. Сайт проекта - jsbsim.sf.net

JSBSim рассчитывает движение классическим методом коэффициентов. Кроме расчета параметров движения, программа также дает возможность моделировать автопилоты, положения управляющих поверхностей, шасси и тд. JSBSim используется в образовательных, научно-исследовательских и производственных проектах. Это дефолтная динамика для авиасимулятора FlightGear. Автор - Jon S. Berndt, авиаинженер.

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

2. Силы, моменты, координаты

Давайте рассмотрим, как JSBSim моделирует движение. Допустим, в предельно упрощенном продольном канале (рис.1).

Рис. 1. Силы в продольном канале.

Рассмотрим самолет, на него действует сила тяжести Fg. приложенная к цт, и подъемная сила крыла Fl, приложенная к крылу. Перпендикулярно действует сила тяги двигателя Ft, и сила сопротивления Fd. Кроме этого, к стабилизатору приложена сила Fs, компенсирующая продольный момент, возникающий из-за того, что точка приложения подъемной силы не совпадает с центром тяжести.

Когда все эти силы уравновешены (их векторная сумма равна нулю), самолет движется прямолинейно с постоянной скоростью.

А вот как эти силы пересчитываются для моделирования в модуле динамики (рис.2)

Рис. 2. Силы и моменты в модуле динамики.

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

Моменты поворачивают самолет вокруг осей, так же, как силы смещают самолет вдоль осей. Таким образом, у нас появляется еще три степени свободы. В дополнении к движению по координатам X, Y, Z, самолет вращается вокруг X, Y, Z. Итого - шесть степеней свободы. Центром вращения самолета является его центр тяжести. А вот точка приложения сил и моментов - другая.

В динамике JSBSim все силы и моменты, имеющие аэродинамическую природу, считаются приложенными к одной точке - аэродинамическому центру самолета. Это аналог центра тяжести для сил гравитации и инерции.

В процессе полета, положение аэродинамического центра изменяется. Особенно интенсивно положение меняется при перехода через звуковой барьер. Динамика JSBSim рассчитывает этот эффект. Но для расчетов сил и моментов необходимо какое-то опорное значение, начальное положение аэродинамического центра. Такое положение задается с помощью аэродинамической опорной точки, Aero Reference Point, AERORP или ARP. Это важнейшая координата в файле динамики.

Как я понял, при создании динамических моделей, ARP должна ставиться в точке фокуса самолета. При этом положение фокуса самолета. из-за влияния стабилизатора, смещается относительно фокуса чистого профиля. Если для профиля положение фокуса соответствует около 25% САХ, то например для самолета Ту-154 фокус находится между 55 и 60% САХ.

Относительное положение ARP и центра тяжести - другая важная величина. От этого положения зависит устойчивость модели. Но координаты центра тяжести - тоже величина непостоянная. В полете, положение ЦТ меняется из-за выработки топлива, обледенения итд. Для определения начального положения ЦТ используется другая опорная точка, CG. Это координаты центра тяжести для пустого самолета. После запуска программы, координаты центра тяжести пересчитываются динамикой в зависимости от загрузки и залитого топлива, этот процесс называется триммированием модели.

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

Важно понимать, что динамика JSBSim рассчитывает движение точки - центра тяжести самолета. Но в сцене мы наблюдаем движение трехмерной модели. Как соотносятся между собой координаты модели и рассчитанные динамикой координаты ЦТ? Чтобы ответить на этот вопрос, необходимо рассмотреть основные системы координат JSBSim.

В JSBSim cуществуют две системы координат, Structural Frame и Body Frame, (рис.3)

Рис. 3. Системы координат JSBSim.

На самом деле, систем координат больше, но именно эти две непосредственно имеют отношение к созданию моделей. Body Frame - это СК, движущаяся совместно с моделью. Ноль СК находиттся в центре тяжести, ось U смотрит вперед, V - вправо, W - вниз. Динамика JSBSim в этой системе координат ввозвращает скорости и ускорения. Если посмотреть встроенным браузером свойств в раздел velocities или accelerations, можно увидеть много переменных с символами U, V, W. Это и есть параметры движения в координатах Body Frame - U соответствует движению вперед, V - вправо, W - вниз.

Если повернуть СК Body Frame вокруг оси V на 180', мы получим Structural Frame СК. Эта СК тоже движется вместе с моделью, но ее центр не соответствует центру тяжести. Ноль Structural Frame - некая условная опорная точка, условный ноль, datum. Почему условный? Дело в том, что динамике неважны абсолютные величины координат опорных точек- она принимает в расчет только их положение относительно друг друга. Поэтому datum может находиться в любом удобном для разработчика месте. Часто его располагают в крайней передней точке модели - носовом обтекателе, или обтекателе винта етс.

Все координаты в файле динамики отсчитываются именно от датума Structural Frame. В том числе и центр тяжести пустого самолета - а значит, и начальное положение Body Frame. В полете, по мере выработки топлива, относительное положение Structural Frame и Body Frame будет меняться.

Теперь мы можем разместить визуальную модель в сцене. Для этого нам потребуется позиционировать модель в координатах Structural Frame таким образом, чтобы совместить опорные точки. Какие? Как ни странно, основная проблема - точное совмещение шасси. Даже небольшой промах приводит к неестественному вращению машины на взлете, проваливание колес сквозь ВПП и другие дефекты.

Позиционирование модели производится с помощью опорной точки Visual Reference Point, VRP. Это смещение центра координат вашей визуальной модели. Если не задавался оффсет в xml-файле модели - нулевая координата в ac или 3ds-файле будет соответствовать смещению VRP в Structural Frame. Оси в этой СК направлены так: X - назад против движения модели, Y - вправо, Z - вверх. Все анимации, координаты приборов итд. используют систему координат визуальной модели, совпадающей по направлению осей с Structural Frame, но имеющих смещение - VRP.

Почему анимации используют систему координат, смещенную относительно Structural Frame, ведь в принципе модель можно сместить средствами 3D редактора? Имхо, дело в том, что для анимации важно точно (буквально до миллиметров) знать размеры и координаты объектов визуальной модели. Получить их можно, только измерив требуемые размеры с помощью 3D редактора. Но все эти размеры будут в СК 3D-редактора! Поэтому все анимации работают именно с этими координатами - это позволяет прямо проставлять размеры и координаты в xml-код. Нам нужно иметь возможность смещать всю модель одновременно, вместе с анимированными деталями плюс приборы. Каждый прибор - это отдельная модель. Чтобы при подстройке положения модели в СК Structural Frame, для правильного вращения и работы шасси, не пересчитывать каждый раз параметры анимаций и положения приборов, СК 3D-редактора загружается в симулятор без изменений, а вся подстройка делается с помощью единственного параметра - VRP.

Рис. 4. Опорные точки модели.

Для всех перечисленных точек (ARP, VRP, EYEPOINT, CG) важно не абсолютное значение координат, а их относительные величины, поэтому автор 3D-модели не обязан смещать ноль координат в своем файле в какое-то определенное место. Модель может быть правильно позиционирована только средствами JSBSim.

Кстати, ппочему-то только в Blender-е, система координат совпадает с Structural Frame. И 3DMax, и AC3D почему-то меняют местами оси Y и Z, что приводит к неудобствам при измерении координат для анимации...

3. Property Tree

Выше упоминался "встроенный браузер свойств". Что это такое? Если мы запустим авиасимулятор FlightGear, и откроем меню File->Browse Internal Properties, мы увидим в открывшемся окне что-то ннапоминающее корневую директорию жесткого диска. Узлы (Property Node) группируют переменные (property), так же как файлы группируются в директориях диска. В такой древовидной структуре сим держит свои внутренние переменные, и называется это Property Tree.

Динамика JSBSim имеет своё дерево свойств ( по-русски звучит это, конечно, сомнительно - но так уж принято переводить ). Точка монтирования - /fdm/jsbsim, и все внутренние переменные JSBSim лежат в этой ветке. Важное замечание. Динамика полностью изолирована в этой ветке, как если бы на директорию файловой системы UNIX была напущена злая команда chroot. О существовании других веток Property Tree динамика не знает - и это правильно, потому что таких веток может и не быть, если динамика запущена отдельным программным модулем, вне симулятора. Но иногда требуется доставлять даннные в вннутренние переменные динамики. Для этого предусмотрен специальный механизм описания интерфейсных свойств.

Давайтее рассмотрим структуру Property Tree JSBSim. Часть переменных используется для ввода управляющих сигналов и команд - это все живет в разделе fcs (flight control system). Например, переменная fcs/flap-cmd-norm - это команда управления закрылками. Cmd в ее названии означает, что это команда, симулятор управляет ею, меняет ее значение. Norm - значение команды нормировано в диапазоне 0:1. Для команд, имеющих по своей природе биполярные значения, нормировка производится в диапазоне -1:1. Оси джойстика транслируются симулятором в команды управления элеронами, рулем высоты, рулем направления именно в этом диапазоне. подобное соглашение об именах следует соблюдать, хотя имена свойств и могут быть произвольными.

Часть переменных JSBSim - это выходные значения, их потребителями могут являться как другие компоненты JSBSim, так и анимации. Например, fcs/flap-pos-deg - это переменная, где хранится положение закрылок в градусах. Пересчет из flap-cmd-norm в flap-pos-deg выполняется по правилу, описанному в кконфигурациооном файле модели, с учетом преддельных углов отклонения, врремени перекладки итд. Эту переменную можно использовать непосредственно в xml-анимации. Кроме того, эту переменную использует как входную та часть программного комплекса JSBSim, которая отвечает за расчет аэродинамики.

Кроме тех управляющих переменных, которые жестко вкомпилированы в JSBSim и доступны по умолчанию (элероны, руль высоты, рн, закрылки, интерцепторы, шасси) можно создавать любые другие перременные с помощью конфигурационного файла. Таким образом, можно моделировать любые сложные элементы конструкции самолета - переставные стабилизаторы, рампы, крылья с изменяемой стреловидностью итд, и учитывать их влияние на аэродинамику.

4. Средства разработки

В JSBSim, вся информация о модели хранится в конфигурационном файле. Это обычный текстовый файл, в формате xml. Работать с ним можно с помощью ттекстового редактора, желательно с подсветкой синтаксиса. Но для серьезной работы совершенно необходимо пользоваться специально разработанными инструментами.

Для создания и редактирования динамических моделей JSBSim разработан редактор JSBSim Commander, который можно взять на jsbsimcommander.sf.net. JSC тоже проект open-source, и тоже находится в процессе непрерывной разработки, как и JSBSim, и FlightGear в целом. JSC следует использовать devel-версии, на момент написания статьи релиз довольно сильно устарел и на некоторых платформах не работал.

JSC состоит из двух частей. Одна - это редактор динамики, вторая - визуализатор данных. Сама динамика JSBSim имеет встроенные средства записи в лог-файл требуемых параметров симуляции, и для анализа лог-файла и предназначена эта часть JSC.

Рис.5 JSBSim Commander, для редактирования открыта секция fileheader.

При создании и отладке динамических моделей желательно также использовать автономную версию JSBSim. Это обычная консольная программа на C++, которая не требует никаких допполнительных библиотек и в собранном виде занимает очень мало места. Однако это полноценная динамика - ее можно использовать как внешний инструмент расчета параметров движения, связав по сети с симулятором, причем необязательно FlightGear. Есть средства для связи JSBSim с Mathlab/Simulink. Но для нас важно то, что в автономную версию JSBSim встроена поддержка скриптов. Это позволяет на порядки увеличить скорость разработки. Записав в скрипт необходимые управляющие команды, можно выполнить испытательный полет, не запуская симулятор. Используя эти две ппрограммы - JSC и JSBSim, можно создавать динамические модели не используя симулятор вообще. При этом просчет пятиминутного полета выполняется за несколько секунд. Для анализа параметров полета лог-файл загружается в JSC, где есть встроенные средства визуализации, либо можно использовать Mathlab или Exel. Примеры скриптов и динамических моделей входят в дистрибутив JSBSim, скрипты наглядно показывают возможности модеелирования в автономной среде.

5. Конфигурационный файл модели

Давайте рассмотрим структуру главного конфигурационного файла модели. По соглашениям, принятым в FlightGear, имя файла динамики должно совпадать с именем модели (ннапример, для модели TU-154 файл динамики следует называть tu-154.xml). Несмотря на помощь Commander-a, иногда приходится работать непосредственно с xml - особенно в секции flight control - к сожалению, моя версия Commander-а напрочь отказалась создавать новые элементы, ппри том что существующие редактировала нормально. Издержки devel-версии и open-source в целом, увы... а может, следствие собственных кривых рук:)

Кроме того, не следует пытаться создавать файл динамики с нуля - для этой цели существует Аэроматика. Зайдите на сайт jsbsim.sf.net/aeromatic, и последовательно, шаг за шагом, создайте шаблон динамики на основе геометрических данных, веса, мощности и типа двигателя итд. Получившаяся динамика, конечно, не даст требуемые параметры движения модели - но послужит отправной точкой для дальнейшей работы.

Итак. Файл динамической модели JSBSim состоит из девяти секций: fileheader, metrics, mass_balance, ground_reactions, propulsion, flight_control, autopilot, aerodynamics, output. Формат каждой секции разный, в зависимости от того, какую задачу каждая секция решает. Секция autopilot иногда выносится в отдельный файл, чтобы можно было использовать автопилоты сторонних производителей. Пример такого отдельного автопилота есть в дистрибутиве автономной версии JSBSim, смотрите в качестве примера c172ap.xml.

Вот пример секции fileheader, скриншот JSBSim Commandera приведен на рис.1:

<code>
<fileheader>
<author> Yurik V. Nikiforoff and Aeromatic v 0.9 </author>
<filecreationdate> now </filecreationdate>
<description> Model a tu154b </description>
<version> 0.0 </version>
</fileheader>
</code>

Это чисто служебная информация. Commander позволяет заполнить эту область более содержательно - с всякими дополнительными полями итд. Поехали дальше.

<code>
<metrics>
<wingarea unit="M2"> 180 </wingarea>
<wingspan unit="M"> 37.55 </wingspan>
<chord unit="M"> 5.285 </chord>
<wing_incidence unit="DEG"> 0.05236 </wing_incidence>
<htailarea unit="M2"> 40.55 </htailarea>
<htailarm unit="M"> 30 </htailarm>
<vtailarea unit="M2"> 31.7 </vtailarea>
<vtailarm unit="M"> 21.64 </vtailarm>
<location name="AERORP" unit="M">
<x> 27.211 </x>
<y> 0 </y>
<z> 0 </z>
</location>
<location name="EYEPOINT" unit="M">
<x> 3.35 </x>
<y> -0.76 </y>
<z> 1.9 </z>
</location>
<location name="VRP" unit="M">
<x> 26 </x>
<y> 0 </y>
<z> 0 </z>
</location>
</metrics>
</code>

В секции metrics хранятся геометрические размеры и смещения опорных точек. Сверху вниз: расчетная площадь крыла, размах крыла, САХ, установочный угол крыла, площадь горизонтального оперения, плечо горизонтального оперения, площадь и плечо вертикального оперения, координаты ARP, EYEPOINT, VRP. EYEPOINT - это точка, где расположен наблюдатель, (пилот). Я не знаю точно, где учитывается эта точка, есть предположение, что в расчетах перегрузки на месте пилота - такая переменная есть в разделе accelerations. Назначение остальных точек уже обсуждалось. Отметим еще раз, что динамике важно их относительное положение - некий условный ноль координат (datum) может быть где угодно.

Значения htailarea, htailarm, vtailarea, vtailarm на самом деле не участвуют в аэродинамических расчетах вв той динамике, которую нам сварила Аэроматика. Эти величины учтены в соответтствующих коэффициентах, но напрямую не используются - помечены как deprecated. После того, как отработала Аэроматика, изменение этих величин на расчет параметров движения не влияет.

Обратите внимание, что все величины тут имеют единицу измереения. Аэроматика готовит динамику в английской системе мер, но если для элемента стоит тег unit - это значит, можно использовать и метрическую. Commander позволяет легко менять систему мер (хотя и не пересчитыывает значения автоматически) - вооружившись калькулятором, можно перевести всю динамику в привычные нам метры, килограммы, литры итд. Бывают косяки - wing_incidence, несмотря на тег DEG, кстати единственно возможный, все равно идет в расчеты в радианах. Возможно, к выходу статьи этот баг уже ппофиксят.

<code>
<mass_balance>
<ixx unit="KG*M2">1.3e+06</ixx>
<iyy unit="KG*M2">4.36916e+06</iyy>
<izz unit="KG*M2">5.92493e+06</izz>
<ixz unit="KG*M2">0</ixz>
<iyz unit="KG*M2">0</iyz>
<ixy unit="KG*M2">0</ixy>
<emptywt unit="KG">54000</emptywt>
<location name="CG" unit="M">
<x>26.68</x>
<y>0</y>
<z>1.8</z>
</location>
<pointmass name="cargo" >
<weight unit="KG">1000</weight>
<location name="POINTMASS" unit = "M">
<x> 15 </x>
<y> 0 </y>
<z> 1.8 </z>
</location>
</pointmass>
</mass_balance>
</code>

Следующая секция содержит информацию о массе пустого самолета. Шесть моментов инерции, три осевых (ixx, iyy, izz) и три центробежных (ixz, iyz, ixy). Центробежные моменты равны нулю, так их посчитала Аэроматика. О моментах инерции можно прочесть тут . Расчет каждого момента не точен и основан, как я догадываюсь, на упрощенных представлениях о распределении масс по объему самолета. Я игрался с этими значениями, и в общем-то, результаты соответствовали ожидаемым - например, уменьшение значения ixx приводило к уменьшению инерции по крену, машина начинала энергичнее реагировать на отклонения элеронов. В своем проекте я оставил моменты такими, как их рассчитала Аэроматика.

Далее. Пустой вес машины и положение центра тяжести. Взяты как есть из Лигума, по высоте я справочных данных не нашел и поднял ЦТ на 1.8 метра, расположив его по центру фюзеляжа.

Обратите внимание на элемент pointmass. Это, как легко можно догадаться, дополнительная масса. Приведенный пример показывает, как легко загрузить тонну в передний салон и потом получить проблемы на взлете и посадке с передней центровкой.

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

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

<code>
<ground_reactions>
<contact type="BOGEY" name="NOSE">
<location unit="M">
<x> 7.9 </x>
<y> 0 </y>
<z> -2 </z>
</location>
<static_friction> 0.8 </static_friction>
<dynamic_friction> 0.5 </dynamic_friction>
<rolling_friction> 0.02 </rolling_friction>
<spring_coeff unit="N/M"> 946000 </spring_coeff>
<damping_coeff unit="N/M/SEC"> 315360 </damping_coeff>
<max_steer unit="DEG"> 5 </max_steer>
<brake_group> NONE </brake_group>
<retractable> 1 </retractable>
</contact>
<contact type="BOGEY" name="LEFT_MAIN">
<location unit="M">
<x> 26.82 </x>
<y> -5.75 </y>
<z> -2 </z>
</location>
<static_friction> 0.8 </static_friction>
<dynamic_friction> 0.5 </dynamic_friction>
<rolling_friction> 0.02 </rolling_friction>
<spring_coeff unit="N/M"> 3.1536e+06 </spring_coeff>
<damping_coeff unit="N/M/SEC"> 630720 </damping_coeff>
<max_steer unit="DEG"> 0 </max_steer>
<brake_group> LEFT </brake_group>
<retractable> 1 </retractable>
</contact>
<contact type="BOGEY" name="RIGHT_MAIN">
<location unit="M">
<x> 26.82 </x>
<y> 5.75 </y>
<z> -2 </z>
</location>
<static_friction> 0.8 </static_friction>
<dynamic_friction> 0.5 </dynamic_friction>
<rolling_friction> 0.02 </rolling_friction>
<spring_coeff unit="N/M"> 3.1536e+06 </spring_coeff>
<damping_coeff unit="N/M/SEC"> 630720 </damping_coeff>
<max_steer unit="DEG"> 0 </max_steer>
<brake_group> RIGHT </brake_group>
<retractable> 1 </retractable>
</contact>
<contact type="STRUCTURE" name="LEFT_WING">
<location unit="M">
<x> 26.82 </x>
<y> -18.7 </y>
<z> -0.5 </z>
</location>
<static_friction> 0.8 </static_friction>
<dynamic_friction> 0.5 </dynamic_friction>
<rolling_friction> 0 </rolling_friction>
<spring_coeff unit="N/M"> 3e+06 </spring_coeff>
<damping_coeff unit="N/M/SEC"> 630720 </damping_coeff>
<max_steer unit="DEG"> 0 </max_steer>
<brake_group> NONE </brake_group>
<retractable> 0 </retractable>
</contact>
</ground_reactions>
</code>

В примере приведены шасси (BOGEY) - носовая стойка и две основные, и STRUCTURE - это просто контактные точки. В примере приведена только одна точка - законцовка левого крыла.

Для любой контактной точки задается параметры трения - static_friction и dynamic_friction, сопротивление качению - rolling_friction, параметры подвески: коэффициент упругости spring_coeff и коэффициент демпфирования, damping_coeff. Если колесо управляемое, можно указать максимальный угол разворота max_steer, если есть тормоза - можно указать, к какой группе относится это колесо (brake_group), по умолчанию есть две групппы торможения - правая и левая. Можно отметить стойку как убираемую (retractable). по умолчанию все стойки шасси по выпуску управляютсяя одной переменной fcs/gear-pos-norm. Стоек шасси и контактных точек может быть произвольное число.

В готовящемся к выходу релизе JSBSim 1.0 система моделирования шасси сильно расширена. Добавлены возможность индивидуального управления выпуском стоек, переключаемый угол max_steer и много других вкусностей.

В секции propulsion хранится информация о двигателях и топливных баках.

<code>
<propulsion>
<engine file="nk-8-2u">
<location unit="M">
<x> 34 </x>
<y> -3.13 </y>
<z> 1.78 </z>
</location>
<orient unit="DEG">
<roll> 0 </roll>
<pitch> 0 </pitch>
<yaw> 0 </yaw>
</orient>
<feed>0</feed>
<thruster file="direct">
<location unit="M">
<x> 37.27 </x>
<y> -3.03 </y>
<z> 1.7 </z>
</location>
<orient unit="DEG">
<roll> 0 </roll>
<pitch> -2 </pitch>
<yaw> 0 </yaw>
</orient>
</thruster>
</engine>
<tank type="FUEL">
<location unit="M">
<x> 25 </x>
<y> 0 </y>
<z> 0 </z>
</location>
<capacity unit="KG">3300</capacity>
<contents unit="KG">3300</contents>
</tank>
</propulsion>
</code>

Элемент engine ссылается на конфигурационный файл nk-8-2u.xml, который должен находится в директории TU154/Engine. Там же должен лежать и файл thruster-а - direct.xml. Оба эти файла генерит Аэроматика. Если бы мы делали модель, приводимую в движение винтом, то в качестве thruster-а у нас бы был конфигурационный файл винта, со своими характеристиками.

Динамика JSBSim позволяет моделировать различные типы двигателей - поршневые, турбореактивные, турбопропы, ракетные и даже электрические. Не все из них смоделированы достаточно детально - но например поршневой двигатель с винтом может доставить массу удовольствия тому, кто способен разобраться во всех тонкостях винто-моторной группы. Мне это еще предстоит - Ан-2 так и не доведен до ума в этой части. Вообще, по моторам и винтам в JSBSim нужно писать отдельную статью...

Вернемся к конфигу. В примере показан только один двигатель, его координаты отрицательны по Y, это двигатель N1. Двигателей может быть произвольное число, в одной модели можно применять двигатели разного типа. В секции engine, кроме координат двигателя (я так понимаю, что это координаты его центра тяжести), есть ещё его ориентация. Ориентация для турбоджета значения не имеет - направление вектора тяги задается ориентацией thruster-а. Для турбореактивного двигателя thruster всегда - direct, и это просто координаты и направление сопла. Обратите внимание, что двигатель дует на два градуса вверх от горизонтальной плоскости, что соответствует реальному направлению реактивной струи для Ту-154Б.

Турбореактивные двигатели в JSBSim могут иметь реверс - см. переменные propulsion/engine[N]/reverser-angle-rad. Если присвоить этой переменной значение 3.14, вектор тяги развернется на 180'. Отметим тут, что направление вектора тяги можно динамически менять раздельно для каждого двигателя, что открывает любопытные возможности для моделирования разных экспериментальных устройств, от лунных платформ до ракетных ранцев...

Топливо. Обратим внимание на тег feed элемента engine. Это номер топливного бака, откуда данный двигатель будет потреблять топливо. Двигатель может питаться от своего топливного бака, или все двигатели могут питаться от одного общего. Топливные баки описываются тегом tank, у каждого бака есть координаты его центра тяжести, емкость (в разных системах мер), также можно указать количество залитого топлива по умолчанию. Динамика при запуске симуляции пересчитает новое положение ЦТ, в зависимости от залитого топлива.

Баки доступны в property tree, их может быть произвольное количество, и их можно заполнятьперекачиватьсливать либо средствами JSBSim, либо Nasal, либо просто вручную, через браузер свойств. До появления динамических пойнтмасс с помощью дополнительных непотребляемых топливных баков можно было моделировать перераспределение массы самолета - например, при разных вариантах загрузки или при сбросе груза. Сейчас необходимость в фальшивых топливных баках отпала - следует использовать элемент pointmass в секции mass_balance.

Следующая секция flight_control описывает движение управляющих поверхностей и других движущихся частей самолета, влияющих на аэродинамику. Все переменные, относящиеся к данной секции, размещены в директории fcs и это наверное самая многочисленная группа переменных. Flight_control - это основной интерфейс динамики с внешним миром. Нужные команды передаются динамике извне путем изменения входных переменных другими частями программного комплекса авиасимулятора, или из скрипта, или по сети. В секции flight_control эти команды преобразуются в другие переменные, переменные положения, в соответствии с физическими особенностями движения той или иной поверхности. Эти новые переменные сами по себе не оказывают влияния на параметры движения модели, они являются входными значениями для функций аэродинамики в следующей секции.

Как было уже отмечено, переменные положения могут использоваться для анимации. Однако тут есть одна тонкость. При использовании встроенного режима повтора (reply), когда вы просматриваете, например, свою посадку, вы обнаружите, что анимации не работают как ожидается. Переменные FDM при реплее сохраняют свое последнее положение, т.к. повтор движений делается вне динамики, другими средствами FlightGear. Поэтому, если нужна анимация в режиме повтора - следует использовать копии свойств из других частей property tree, специально для этого предназначенных.

Как работает секция flighgt_control? Допустим, мы хотим смоделировать выпускающиеся закрылки. В самолете выпуск закрылков управляется с помощью рычага, ручки, многопозиционного переключателя итд. В симуляторе выпуск закрылков управляется с клавиатуры, либо с кнопки джойстика, либо с дополнительной оси джойстика или вообще из самодельного "железного кокпита" через любой возможный интерфейс, или с помощью команды из глобальной сети, если у нас мультиплей. Для части этих способов симулятор (не JSBSim!) содержит уже готовые средства конфигурирования команд - например, для клавиатуры и джойстика есть готовые подпрограммы, которые можно удобно использовать из xml-конфига или nasal. Но каким бы способом не управлялись закрылки, команда на выпуск или уборку - это присваивание значения (в идеале - нормированного) переменной в секции flight_control.

Допустим, наш самолет имеет четыре фиксированных положения закрылков - {0, 15, 28, 45} градусов. А нормированнная команда на выпуск принимает значения {0, 0.34, 0.67, 1.0}. Логика обработки событий клавиатуры/джойстика изменяет значение нормированной команды скачком, либо с небольшой задержкой, таким образом давая возможность использовать это значение в качестве входного для анимации ручки. Но закрылки выпускаются значительно медленнее. Для обеспечения связи между движением ручки управления (нормированной команды) и положения исполнительного механизма (переменной положения), служат средства секции flight_control.

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

Поскольку системы управления самолетом достаточно сложны, чтобы обеспечить некоторое логическое упорядочивание, в секции flight_control применяются именованные каналы. Каналы примерно соответствуют абзацам в тексте, и не являются обязательными. Можно не пользоваться разбиением на каналы, все переменные глобальны, но это не способствует восприятию кода.

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

Давайте смоделируем выпускаемые закрылки в динамике JSBSim. Выглядит это так:

<code>
<flight_control name="tu154b">

<channel name="Flaps">

<kinematic name="Flaps Control">
<input>fcs/flap-cmd-norm</input>
<traverse>
<setting>
<position>0</position>
<time>0</time>
</setting>
<setting>
<position>15</position>
<time>7</time>
</setting>
<setting>
<position>28</position>
<time>8</time>
</setting>
<setting>
<position>45</position>
<time>12</time>
</setting>
</traverse>
<output>fcs/flap-pos-deg</output>
</kinematic>

</channel>

</flight_control>
</code>

Здесь мы описали секцию flight_control, состоящую из единственного канала - Flaps. В этом канале используется единственный элемент kinematic, ему присвоено имя "Flaps Control". У этого элемента есть вход - fcs/flap-cmd-norm, и выход - fcs/flap-pos-deg. Таким образом, элемент преобразует положение ручки управления закрылками в угловое положение самих закрылков.

Каким образом это происходит? Взгляните на структуру элемента. Тег traverse ограничивает набор промежуточных точек перемещения поверхности (setting). Каждое промежуточное положение - это пара тегов position и time. Время здесь - это время, необходимое на перемещение поверхности между соседними положениями. В первом блоке setting время всегда нулевое. По умолчанию, первое положение соответствует нулевому значению входной переменной, последнее - единичному.

Давайте рассмотрим канал управления рулем высоты. Входными параметрами этого канала являются положение штурвальной колонки (fcs/elevator-cmd-norm, сюда сим транслирует ось джойстика) и триммер РВ (fcs/pitch-trim-cmd-norm, это можно рассматривать как модель МЭТ).

<code>
<channel name="Pitch">

<summer name="Pitch Trim Sum">
<input>fcs/elevator-cmd-norm</input>
<input>fcs/pitch-trim-cmd-norm</input>
<clipto>
<min>-1</min>
<max>1</max>
</clipto>
</summer>

<summer name="Pitch Absu Sum">
<input>fcs/pitch-trim-sum</input>
<input>fcs/absu-pitch</input>
<clipto>
<min>-1</min>
<max>1</max>
</clipto>
</summer>

<aerosurface_scale name="Elevator Control">
<input>fcs/pitch-absu-sum</input>
<range>
<min>-0.506</min>
<max>0.28</max>
</range>
<output>fcs/elevator-pos-rad</output>
</aerosurface_scale>

</channel>
</code>

Здесь мы видим два новых элемента - summer и aerosurface_scale. Первый из них - обычный сумматор, который может вычислять и разность - если одно из входных значений предварить минусом, например вот так: -fcs/pitch-trim-sum. Сумматор "Pitch Trim Sum" суммирует положение колонки и триммера, ограничивая выходное значение величиной -1:1 - обратите внимание на тег clipto. Второй сумматор, "Pitch Absu Sum", суммирует положение ШК+МЭТ и выходной сигнал АБСУ, являясь в какой-то мере моделью дифференциальной качалки агрегата РА-56.

Обратите внимание на именование сумматоров. Имя первого сумматора "Pitch Trim Sum" автоматически превратилось в переменную fcs/pitch-trim-sum, которая служит входным параметром второго сумматора. А можно было написать сразу: , расположив сумматор в другой "директории" property tree, в целях порядка и наглядности. В большинстве случаев, использование тега output необязательно - имя любого элемента является одновременно и переменной, где хранится его выходное значение.

На рис.6 приведен скриншот JSBSim Commandera, где в наглядном виде представлена структурная схема данного канала.

Рис.6 Канал управления рулем высоты в JSBSim Commander.

Элемент aerosurface_scale преобразует входное (по умолчанию нормированное) значение - в выходное, в заданном диапазоне, без временных задержек. В нашем случае, это можно рассматривать как модель идеальной рулевой машины. Значение -1 на входе преобразуется в величину -0.56, а значение 1 - в величину 0.28. Это в радианах, а в градусах это будет соответствует углам -30: +16.

Элемент aerosurface_scale может включать дополнительный тег zero_centered, и если он установлен в единицу - то ноль входного нормированного значения транслируется в середину выходного диапазона (рис.7).

Рис. 7. Работа элемента aerosurface_scale и трансляция нуля.

Можно также дополнительно масштабировать выходное значение элемента, использовать ненормированную входную величину, ограничивать выходное значение. Полный набор возможных тегов - как правило, одновременно все не используется:

<code>
<aerosurface_scale name="name">
<input> {[-]property name} </input>
<domain>
<min> {value} </min> <!-- If omitted, default is -1.0 ->
<max> {value} </max> <!-- If omitted, default is 1.0 ->
</domain>
<range>
<min> {value} </min> <!-- If omitted, default is 0 ->
<max> {value} </max> <!-- If omitted, default is 0 ->
</range>
<zero_centered< value </zero_centered>
[<clipto>
<min> {[-]property name | value} </min>
<max> {[-]property name | value} </max>
</clipto>]
[<gain> {property name | value} </gain>]
[<output> {property} </output>]
</aerosurface_scale>
</code>

Кратко рассмотрим другие способы масштабировать входную величину, примеры взяты из исходников JSBSim:

<code>
<pure_gain name="Roll AP Wing Leveler">
<input>fcs/attitude/sensor/phi-rad</input>
<gain>2.0</gain>
<clipto>
<min>-0.255</min>
<max>0.255</max>
</clipto>
</pure_gain>
</code>

Pure_gain - это масштабный коэффициент, можно так же использовать переменную в теге gain.

<code>
<scheduled_gain name="Scheduled Steer Pos Deg">
<input>fcs/steer-cmd-norm</input>
<table>
<independentVar>velocities/vg-fps</independentVar>
<tableData>
10.0 80.0
50.0 15.0
150.0 2.0
</tableData>
</table>
<gain>0.017</gain>
<output>fcs/steer-pos-rad</output>
</scheduled_gain>
</code>

Scheduled_gain - способ нелинейного преобразования входной величины. В приведенном примере, отклонение колеса зависит от скорости - чем выше скорость, тем меньш

Категория: Конструкторская деятельность | Добавил: Kurs (26.08.2009)
Просмотров: 941 | Рейтинг: 0.0/0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Вход на сайт

Поиск

Друзья сайта


Copyright MyCorp © 2024
Бесплатный конструктор сайтов - uCoz