Привет друзья. Написано уже половина романа, статьи о интересных моментах процессах тоже готовятся. А сейчас я хочу рассказать о том, как я для реалистичности технических деталей романа пришлось разработать целый экраноплан. Да, именно забытые и не очень хорошо показавшие себя технологии на стыке авиации и судостроительства.
По сюжету романа нужна была такая машина, которая может двигаться ниже зоны действия радаров, незаметно, пользуясь складками местности. Обычные самолеты и вертолеты в принципе могут, но сильно прижаться к земле, чтобы идти в 1-3 метрах от поверхности земли им не под силу. Это зона действия только для экранопланов.
Давайте для начала разберемся с основными недостатками существующих экранопланов.
Чувствительность к состоянию поверхности. Экраноплан живет за счет экранного эффекта — роста давления под крылом при приближении к поверхности. Но что, если эта поверхность перестает быть зеркально гладкой? Любая значительная волна превращает полет в опасное «прыгание»
Балансировка, продольная устойчивость машины. Центр давления на крыле при изменении высоты полета смещается. Если нос чуть приподнимается, экранный эффект ослабевает, машина «проседает», и если автоматика или пилот не компенсируют это мгновенно — неизбежен удар о воду или «кобрирование» (резкий взмыв вверх с последующим сваливанием).
Переходные режимы. Требуется колоссальная избыточная мощность двигателей, которая в крейсерском режиме становится «балластом». Это делает экранопланы крайне неэкономичными по сравнению с обычными самолетами или судами на подводных крыльях
Это главные недостатки, которые реально не делают их интересными и для эксплуатации, и для конструкторов. Но если задуматься - а можно ли эти недостатки победить на существующем уровне развития технологий? Ида, в принципе это возможно. Ниже решения, которые мы проработали с нейросетями.
Проблема: Продольная неустойчивость («скачки» по тангажу)
Решение: Схема «Утка» с активным канардом. Переднее горизонтальное оперение работает в возмущенном потоке первым, а ИИ-контроллер меняет его угол атаки сотни раз в секунду, демпфируя колебания еще до того, как их почувствует основной корпус.
Проблема: Тяжелый взлет («горб» сопротивления)
Решение: Распределенная электрическая тяга (DEP). Вместо двух монструозных двигателей — каскад электромоторов по передней кромке. На взлете они создают мощный статический поддув под крыло, буквально выталкивая машину из воды на воздушную подушку без лишнего разбега.
Проблема: Боязнь волнения и турбулентности
Решение: Управление пограничным слоем (BLI). Использование части вентиляторов DEP для активного отсоса или выдува воздуха с поверхности крыла. Это позволяет мгновенно менять подъемную силу без движения механических закрылков, «сглаживая» удары воздушных потоков от волн.
Дополнительно: Ошибки пилотирования на сверхмалых высотах
Решение: Сенсорный стек (Лидар + Нейросеть). Лидар сканирует профиль воды на километр вперед, а нейросеть (обученная на моем «правильном скрипте») заранее вычисляет траекторию обхода препятствий, делая полет безопаснее, чем на обычном лайнере. К слову полного доверия нейросетям тут не должно быть. Нейросеть рисует маршрут, но физика в лице жесткого алгоритма ставит на нем печать «Одобрено». Если ИИ предлагает маневр, нарушающий законы аэродинамики, управление перехватывает классический PID-регулятор и просто удерживает горизонт.
В общем на основании таких технических возможностей современной (и в некоторых случаях еще лабораторной, находящейся в испытаниях) науки и техники мы разработали характеристики планера с полными ТТХ машины.
Статус: Проектная документация, в разработке, на стадии тестирования
Назначение документа: Техническое описание экспериментального экраноплана с гибридной силовой установкой и системами активного управления
|
Параметр |
Значение |
|---|---|
|
Тип аппарата |
Экраноплан (ground effect vehicle) |
|
Класс |
Многоцелевой транспортный |
|
Силовая установка |
Гибридная: 1 × ТРДД + 24 × электродвигателя КВ-24 |
|
Режимы полёта |
Экранный (3–5 м), переходный, самолётный, висение (до 180 с) |
|
Конструкционный стандарт |
Композитный планер с интегрированными системами |
|
Параметр |
Значение |
|---|---|
|
Длина фюзеляжа |
11 200 мм |
|
Ширина фюзеляжа (макс.) |
2 600 мм |
|
Высота фюзеляжа (макс.) |
2 200 мм |
|
Высота на шасси |
3 500 мм |
|
X (мм) |
Ширина (мм) |
Высота (мм) |
Смещение центра (мм) |
|---|---|---|---|
|
0 |
200 |
400 |
200 |
|
2 000 |
1 600 |
2 400 |
1 000 |
|
5 500 |
2 600 |
2 200 |
1 000 |
|
9 000 |
1 800 |
1 800 |
800 |
|
11 200 |
600 |
800 |
400 |
|
Параметр |
Значение |
|---|---|
|
Профиль |
NACA 4412 (модифицированный) |
|
Размах |
13 000 мм |
|
Площадь |
50 м² |
|
Угол обратной стреловидности |
5° |
Сечения крыла:
|
X (мм) |
Y (мм) |
Z (мм) |
Хорда (мм) |
Относительная толщина |
|---|---|---|---|---|
|
3 500 |
600 |
900 |
4 800 |
14% |
|
3 300 |
2 800 |
930 |
4 200 |
13% |
|
3 050 |
4 500 |
970 |
3 600 |
12% |
|
2 650 |
6 500 |
1 050 |
2 800 |
10% |
На законцовках крыла установлены вертикальные (с небольшим наклоном) законцовки — эндплейты, выполняющие функцию дополнительного оперения и снижения индуктивного сопротивления.
|
Параметр |
Значение |
|---|---|
|
Высота законцовки |
1 100 мм |
|
Наклон |
8° назад, 3° наружу |
|
Хорда у основания |
2 800 мм |
|
Хорда у вершины |
1 624 мм |
|
Относительная толщина |
10% (осн.) / 8.8% (верш.) |
|
Параметр |
Значение |
|---|---|
|
Профиль |
NACA 4412 |
|
Размах |
2 400 мм |
|
Корневая хорда |
1 800 мм |
|
Концевая хорда |
1 260 мм |
|
Угол установки |
0.5° (относительно горизонтали) |
|
Положение (X) |
800 мм |
|
Параметр |
Значение |
|---|---|
|
Профиль |
NACA 4412 |
|
Размах |
2 400 мм |
|
Хорда |
540 мм |
|
Положение (X) |
2 060 мм |
Два V-образных киля, интегрированных в хвостовую часть фюзеляжа.
Сечения левого киля (отрицательные Y):
|
X (мм) |
Y (мм) |
Z (мм) |
Хорда (мм) |
|---|---|---|---|
|
9 000 |
-1 100 |
1 700 |
2 200 |
|
9 600 |
-800 |
1 700 |
1 600 |
|
10 200 |
-500 |
1 700 |
1 000 |
|
10 750 |
-225 |
1 700 |
450 |
Вершина киля:
|
Параметр |
Значение |
|---|---|
|
X |
10 300 мм |
|
Y |
±1 850 мм |
|
Z |
3 500 мм |
|
Хорда |
600 мм |
Промежуточные сечения: 25%, 50%, 75% высоты для обеспечения плавности формы.
На вершинах килей установлен Т-образный стабилизатор.
|
Параметр |
Значение |
|---|---|
|
Корневая хорда |
1 400 мм |
|
Концевая хорда |
620 мм |
|
Размах |
2 200 мм |
|
Вынос вперёд |
420 мм |
|
Профиль |
NACA 4412 |
|
Параметр |
Значение |
|---|---|
|
Длина |
4 500 мм |
|
Ширина |
2 100 мм |
|
Высота |
1 700 мм |
|
Объём |
16 м³ |
|
Грузовой люк |
Аппарель в хвостовой части |
|
Грузоподъёмное устройство |
«Ловчая Лапа» (раздвижной пол, лебёдка, траверса) |
24 электродвигателя с тянущими винтами расположены в задней кромке крыла,
по 12 на каждой консоли.
|
Параметр |
Значение |
|---|---|
|
Диаметр наружного кожуха |
320 мм |
|
Диаметр вентилятора |
290 мм |
|
Длина кожуха |
600 мм |
|
Угол наклона оси |
15° вниз |
|
Материал |
Композитный |
|
Привод |
Электродвигатель |
Гибридная: один маршевый турбовентиляторный двигатель + распределённая электрическая тяга (24 вентилятора КВ-24) + система кратковременного форсажа на перекиси водорода.
|
Параметр |
Значение |
|---|---|
|
Тип |
Турбовентиляторный двухконтурный (ТРДД) |
|
Модель |
ТВ7-117СМ-Ф (форсированный) |
|
Производитель |
АО «ОДК-Климов» |
Характеристики:
|
Режим |
Тяга (кгс) |
Расход топлива (кг/ч) |
Температура газов (°C) |
|---|---|---|---|
|
Крейсерский (50%) |
1 800 |
450–550 |
950 |
|
Повышенный (70%) |
2 500 |
700 |
1 050 |
|
Взлётный (100%) |
3 600 |
950 |
1 150 |
|
Форсаж (с HTP) |
6 000 |
2 200 |
1 400 |
|
Параметр |
Значение |
|---|---|
|
Расположение (X) |
3 000–4 000 мм |
|
Расположение (Z) |
Верхняя часть фюзеляжа |
|
Диаметр |
600 мм |
|
Тип |
Регулируемый, с защитными створками |
|
Параметр |
Значение |
|---|---|
|
Расположение (X) |
10 500–11 000 мм |
|
Форма |
Прямоугольная, 400 × 200 мм |
|
Регулировка |
Подвижные створки для изменения вектора тяги |
|
Параметр |
Значение |
|---|---|
|
Генератор |
Высокооборотный синхронный, 1.8 МВт, 115/400 Гц, масса 550 кг |
|
Аккумуляторы |
Литий-воздушные (Li-air), 250 кВт·ч, удельная энергия 500 Вт·ч/кг, масса 500 кг |
|
Вид |
Масса (кг) |
Объём (л) |
Назначение |
|---|---|---|---|
|
Керосин JP-8 |
2 000 |
2 500 |
Основное топливо для ТРДД |
|
HTP (98%) |
400 |
330 |
50% — система управления, 50% — форсаж висения |
|
Элемент |
Масса (кг) |
|---|---|
|
Фюзеляж (композит) |
1 200 |
|
Крыло (с наплывами) |
1 800 |
|
Оперение (V-кили + Т-стаб + канард) |
600 |
|
Система КВ-24 (24 вентилятора) |
1 500 |
|
Системы управления |
800 |
|
Маршевый двигатель с системами |
1 550 |
|
Система HTP |
230 |
|
Прочие системы |
420 |
|
ИТОГО OEW |
8 100 |
|
Параметр |
Масса (кг) |
|---|---|
|
OEW |
8 100 |
|
Керосин (2 000 кг) |
2 000 |
|
HTP (400 кг) |
400 |
|
Экипаж (2 чел) |
200 |
|
Масса без груза |
10 700 |
|
Полезная нагрузка (макс.) |
1 000 |
|
ИТОГО MTOW |
11 700 |
|
Параметр |
Значение |
|---|---|
|
Крейсерская скорость (экран) |
260–300 км/ч |
|
Максимальная скорость |
420 км/ч |
|
Дальность (с нагрузкой 1 000 кг) |
1 850 км |
|
Практический потолок |
3 500 м |
|
Потолок висения |
1 500 м |
|
Длина разбега/пробега |
50–70 м |
|
Длительность висения (штатный) |
120 с |
|
Длительность висения (макс.) |
180 с |
Комплекс малозаметности «ПОКРОВ-М2» — плазменные ячейки в передних кромках.
Система «Рефлекс-М» — импульсное управление на HTP.
Бортовой комплекс «УЛЕЙ-М» — ИИ управления, координация группы, управление роем дронов.
Защита от ЭМИ «ФАРАД-М» — пассивное и активное подавление.
|
Параметр |
Значение |
|---|---|
|
Назначенный ресурс |
5 500 лётных часов / 18 лет |
|
Стоимость единицы (серийная) |
≈ 4.2 млрд руб. |
|
Годовая стоимость эксплуатации |
≈ 800 млн руб. |
Но сделать паспорт машины это одно. Как же она будет выглядеть?
Хотя и уверенно работаю в CAD системах, но мне было лень по этим ТТХ строить модель машины. Во первых я смутно представлял его внешний вид и что именно стоит делать. Во вторых это займет много времени. Я ведь считаю затраты времени не только на само моделирование, но и поиск тех же профилей NACA для крыла.
Но DeepSeek сам подсказал решение. FreeCAD имеет собственную консоль на Python, нейросети делают скрипт - запускаю его и модель строится сама. Звучит красиво. На практике вышло не очень легко, но это тоже опыт.
Нейросети ошибались, ломали модель, крылья создавались вдалеке от фюзеляжа. По итогу несколько часов работы сначала в DeepSeek, потом в Gemini, с доработкой в Claude и получилась вполне вменяемая модель, которую частично уже сейчас даже можно проверить и на аэродинамику.
При всем этом, по внешнему виду, модель получилась вполне летабельной.
Попозже я попробую изучить и аэродинамику модели. Уж очень интересно, что покажет анализ.
Для этого буду использовать FreeCAD с верстаком CfdOF (Computational Fluid Dynamics for OpenFOAM).
Самое сложное было — заставить ИИ понять, что вентиляторы КВ-24 должны быть интегрированы в заднюю кромку, а не просто висеть в воздухе. В итоге, после десятка требований дотянуть их до крыла, FreeCAD выдал геометрию, которую вы видите на рендерах. Она выглядит футуристично, но при этом функционально — каждый элемент здесь оправдан расчетами. Однако пока вентиляторы не полноценны для CFD анализа, так как просто воткнуты в крыло. Возможно будут править вручную или продолжу пытать себя и нейросети.
Мог ли я просто написать в романе: «Они сели в быстрый экраноплан и полетели»? Конечно. Но когда у тебя в руках есть ТТХ, когда ты знаешь, что на скорости 150 км/ч твоя машина ест 120 литров топлива и «чувствует» экран на высоте до 1.5 метров, сцена меняется.
1. Сюжет, продиктованный физикой, а не фантазией Я хотел максимально реалистичных действий. В моей книге нет «двигателей на мане», которые работают столько, сколько нужно автору. Есть жесткие цифры:
Топливный лимит: Если на скорости 150 км/ч машина ест 120 литров в час, а в баках осталось на два часа лета — герои не долетят до цели магическим образом. Им нужна дозаправка, им нужно искать решение, рисковать. Сюжет подгоняется под реальность, а не наоборот.
Эргономика страдания: Ограничения по тоннажу и объему грузового отсека экраноплана "Тень" — это не просто строчки в таблице. Это значит, что десант сидит в тесноте, плечом к плечу, в душном отсеке, где каждый лишний килограмм оборудования может сорвать взлет. Герои не катаются на стерильном звездолете будущего — они выживают в тесной, ревущей и сложной машине. Это дает ту самую глубину сопереживания, которую невозможно выдумать.
2. Наследие Жюля Верна Вспомните «Наутилус» капитана Немо или «Альбатрос» Робура-Завоевателя. Жюль Верн не просто говорил «они поплыли под водой». Он давал конкретные размеры, описывал конструкцию двигателей, балластных цистерн и внутреннее устройство. Результат? Читатель верил в эти аппараты настолько, что десятилетия спустя инженеры получали реальные патенты, основываясь на описаниях из его романов. Я верю, что достоверность в деталях — это то, что отличает «чтиво на вечер» от мира, в который хочется вернуться.
3. ИИ как соавтор-инженер Именно здесь нейросети стали незаменимы. Когда я говорил: «Мне нужно перевезти 1 тонну груза на 2000 км, рассчитай потребную мощность», — ИИ не просто выдавал цифру, он заставлял меня пересматривать компоновку фюзеляжа. Это был диалог с «виртуальным КБ», где физика была главным цензором.
Работа над экранопланом "Тень" для романа в итоге переросла из литературного упражнения в полноценный технический концепт. Как инженер, я пришел к следующим выводам:
Неожиданный итог! Традиционные экранопланы страдали от узкого эксплуатационного диапазона. Использование распределенной электрической тяги (DEP) в связке с канардом (это небольшое предварительное крыло у носа самолета или экраноплана) полностью меняет уравнение. Мы доказали (пусть пока только в умах нейросетей), что активное управление пограничным слоем позволяет демпфировать продольные колебания, которые раньше делали полет на экране опасным аттракционом. Возможно это даст развитие старой недоделанной технологии в будущем.
Инструментарий: ИИ как исполнительный механизм Нейросети для меня не «творцы», а интерфейс к CAD-системам. DeepSeek/Claude/Gemini/ChatGPT выполняли роль младших конструкторов: писали Python-скрипты для FreeCAD, рассчитывали координаты профилей NACA и генерировали элементы. Учитывая, что именно с FreeCAD я не разбирался и не могу в нем работать - это было интересно. Вручную я бы скорее все делал в Компас-3D.
Реализм как метод тестирования Я решил написать именно такой роман, который сам бы хотел прочитать: без «голливудских сказок», на основе чего-то реально ощутимого, во что я сам мог бы поверить как профессионал. Здесь физика диктует сценарий: если конструкция не позволяет выполнить задачу по сюжету — это не проблема сюжета, которую можно исправить парой строк. Это технический сигнал к тому, чтобы вернуться к чертежам и пересмотреть саму конструкцию. Либо необходимо изменить проведение самой операции так, чтобы можно было полагаться на существующие возможности. Сюжет здесь не оправдание для магии, а суровая проверка инженерной гипотезы.
Нет плохих идей, есть несовершенство технологий. Экранопланы не взлетели в XX веке не из-за порочности идеи, а из-за отсутствия систем управления и материалов, которые есть у нас сейчас. Сегодня, используя связку из ИИ, Python и современных систем автоматизированного проектирования, один инженер может реанимировать целые классы техники, показав новый взгляд на осуществление этих конструкций.
При всех описанных в статье преимуществах важно помнить главное- нейросети не являются специалистами. Они могут помочь, как например мне в создании более-менее реалистичного, хоть и футуристичного мира. Но реальное создание конструкций и аппаратов должно вестись под руководством опытных специалистов в этой сфере!
На текущий момент мы имеем готовую геометрию, ТТХ и понимание принципов управления. Следующий логический шаг — полноценный CFD-анализ в OpenFOAM. Нужно подтвердить расчетные коэффициенты подъемной силы при взаимодействии с экраном на разных скоростях. И этим я займусь в ближайшем будущем.
Заканчивая этот обзор, я хотел бы задать пару вопросов читателям Хабра, чьи профессиональные компетенции и личный опыт мне очень интересны:
Насколько, по вашему мнению, допустим «технический реализм» в художественной литературе? Стоит ли авторам уходить в такие детали, как расчеты профилей крыла и расхода топлива, если это усложняет текст? Или именно такая «честная» инженерия и делает вымышленный мир по-настоящему живым и убедительным?
Как вы считаете, какие возможности текущий уровень развития техники (ИИ, аддитивные технологии, новые композиты) может дать старым технологиям и «забытым» изобретениям? Я на своем примере увидел, как связка из LLM и CAD-систем способна вдохнуть новую жизнь в концепт экраноплана. Есть ли у вас идеи или примеры того, что ещё стоит «реанимировать» с помощью современных инженерных инструментов?
Если Вам интересно, я прикладываю скрипт для построения модели экраноплана. Для CFD он еще не готов в полной мере, поэтому я думаю его еще не раз изменю, но запустить его в FreeCAD и посмотреть саму модель возможно.
Процесс проектирования продолжается параллельно с написанием глав. Если среди читателей есть специалисты по аэродинамике, буду благодарен за критику ТТХ — в моем мире физика важнее авторского произвола
Скрытый текстimport FreeCAD as App
import Part
import math
from FreeCAD import Base
import os
doc = App.newDocument("TEN_M_V7")
FUSFRAMES = [
(0, 200, 400, 200),
(2000, 1600, 2400, 1000),
(5500, 2600, 2200, 1000),
(9000, 1800, 1800, 800),
(11200, 600, 800, 400),
]
def fus_z_top(x):
for i in range(len(_FUS_FRAMES)-1):
x1,w1,h1,o1 = FUSFRAMES[i]
x2,w2,h2,o2 = FUSFRAMES[i+1]
if x1 <= x <= x2:
t = (x-x1)/(x2-x1)
h = h1 + (h2-h1)*t
o = o1 + (o2-o1)*t
return o + h/2
return FUSFRAMES[-1][3] + FUSFRAMES[-1][2]/2
def fus_y_max(x):
for i in range(len(FUS_FRAMES)-1): x1,w1,,_ = FUS_FRAMES[i] x2,w2,,_ = FUSFRAMES[i+1]
if x1 <= x <= x2:
t = (x-x1)/(x2-x1)
w = w1 + (w2-w1)*t
return w/2
return FUSFRAMES[-1][1]/2
def naca4(t, chord, n=80):
pts = []
for i in range(n+1):
x = i/float(n)
yt = 5t(0.2969math.sqrt(x)-0.1260x-0.3516x**2+0.2843x3-0.1015*x4)
pts.append(Base.Vector(xchord, 0, ytchord))
for i in range(n,-1,-1):
x = i/float(n)
yt = 5t(0.2969math.sqrt(x)-0.1260x-0.3516x**2+0.2843x3-0.1015*x4)
pts.append(Base.Vector(xchord, 0, -ytchord))
pts.append(pts[0])
return Part.Wire(Part.makePolygon(pts))
wing_data = [
(3500, 600, 900, 4800, 0.14),
(3300, 2800, 930, 4200, 0.13),
(3050, 4500, 970, 3600, 0.12),
(2650, 6500, 1050, 2800, 0.10),
]
tip_x, tip_y, tip_z = 2650, 6500, 1050
tip_chord, tip_t = 2800, 0.10
sects = []
for x,y,z,c,t in wing_data:
p = naca4(t, c)
p.translate(Base.Vector(x, y, z))
sects.append(p)
wingL = Part.makeLoft(sects, True, False)
def create_endplate(tip_x, tip_y, tip_z, chord, t, depth):
taper = 0.58
sweep = math.tan(math.radians(8)) depth
cant = math.tan(math.radians(3)) depth
root = naca4(t, chord) root.translate(Base.Vector(tip_x, tip_y, tip_z)) vtip = naca4(t*0.88, chord*taper) vtip.translate(Base.Vector(tip_x+sweep, tip_y+cant, tip_z-depth)) ep = Part.makeLoft([root, vtip], True, False) # Нижняя запирающая пластина pl = chord*0.48 pt = 90 ep = ep.fuse(Part.makeBox(pl, pt, 65, Base.Vector(tip_x + chord*0.26, tip_y+cant-pt/2, tip_z-depth-32))).removeSplitter() return ep
wingletL = create_endplate(tip_x, tip_y, tip_z, tip_chord, tip_t, 1100)
wingL = wingL.fuse(wingletL).removeSplitter()
wingR = wingL.mirror(Base.Vector(0,0,0), Base.Vector(0,1,0))
def create_canard():
root = naca4(0.12, 1800)
root.translate(Base.Vector(800,0,700))
tL = naca4(0.12, 1260)
tL.translate(Base.Vector(800,-1200,700))
tR = naca4(0.12, 1260)
tR.translate(Base.Vector(800,1200,700))
s = Part.makeLoft([tL, root, tR], True, False)
s.rotate(Base.Vector(800,0,700), Base.Vector(0,1,0), 0.5)
return s
def create_elevator():
l = naca4(0.12, 540)
l.translate(Base.Vector(2060,-1200,700))
r = naca4(0.12, 540)
r.translate(Base.Vector(2060,1200,700))
return Part.makeLoft([l, r], True, False)
def create_vstab(side):
TE_x = 11200
root_stations = [(9000,2200),(9600,1600),(10200,1000),(10750,450)]
loft_sects = []
for x_le, chord in root_stations: z = fus_z_top(x_le) y = side * fus_y_max(x_le) sec = naca4(0.12, chord) sec.rotate(Base.Vector(0,0,0), Base.Vector(1,0,0), 90) sec.translate(Base.Vector(x_le,y,z)) loft_sects.append(sec) print(f"Корень {side}: x={x_le}, y={y:.1f}, z={z:.1f}, chord={chord}") # Вершина киля h = 1800 tilt = 22 last_x, last_chord = root_stations[-1] last_z = fus_z_top(last_x) last_y = side * fus_y_max(last_x) x_tip = 10300 y_tip = side*(abs(last_y) + math.tan(math.radians(tilt))*h) z_tip = last_z + h chord_tip = 600 # Добавляем промежуточные сечения для плавного Loft for f in [0.25,0.5,0.75]: xi = last_x + f*(x_tip-last_x) yi = last_y + f*(y_tip-last_y) zi = last_z + f*(z_tip-last_z) ci = chord_tip + (last_chord - chord_tip)*(1-f) s = naca4(0.12, ci) s.rotate(Base.Vector(0,0,0), Base.Vector(1,0,0), 90) s.translate(Base.Vector(xi, yi, zi)) loft_sects.append(s) tip_sec = naca4(0.12, chord_tip) tip_sec.rotate(Base.Vector(0,0,0), Base.Vector(1,0,0), 90) tip_sec.translate(Base.Vector(x_tip, y_tip, z_tip)) loft_sects.append(tip_sec) print(f"Вершина {side}: x={x_tip}, y={y_tip:.1f}, z={z_tip:.1f}, chord={chord_tip}") fin = Part.makeLoft(loft_sects, True, False) return fin, (x_tip, y_tip, z_tip)
def create_hstab(x_tip, z_tip):
cr, ct = 1400, 620
sh, sw = 2200, 420
root = naca4(0.12, cr)
root.translate(Base.Vector(x_tip,0,z_tip))
tL = naca4(0.12, ct)
tL.translate(Base.Vector(x_tip+sw,-sh,z_tip))
tR = naca4(0.12, ct)
tR.translate(Base.Vector(x_tip+sw, sh,z_tip))
return Part.makeLoft([tL, root, tR], True, False)
def frame(x, w, h, offset):
pts=[]
for i in range(61):
a = 2math.pii/60
pts.append(Base.Vector(x,(w/2)*math.cos(a), offset+(h/2)*math.sin(a)))
pts.append(pts[0])
return Part.Face(Part.makePolygon(pts))
frames = [frame(x,w,h,o) for x,w,h,o in FUSFRAMES]
fuselage = Part.makeLoft(frames, True, False)
kielL, (x_tk, y_tk, z_tk) = create_vstab(-1)
kielR, = createvstab(1)
fuselage = fuselage.fuse([kielL,kielR]).removeSplitter()
hstab = create_hstab(x_tk, z_tk)
canard = create_canard()
elevator = create_elevator()
def te_x(y):
data=[(600,8300),(2800,7500),(4500,6650),(6500,5450)]
y=abs(y)
for i in range(len(data)-1):
y1,x1=data[i]; y2,x2=data[i+1]
if y1<=y<=y2:
return x1+(y-y1)*(x2-x1)/(y2-y1)
return 5450
fans=[]
for i in range(12):
cy = 1600 + i*(5800-1600)/11
cx = te_x(cy)-400
pos = Base.Vector(cx,cy,1080)
outer = Part.makeCylinder(160,600,pos,Base.Vector(1,0,0))
inner = Part.makeCylinder(145,610,pos,Base.Vector(1,0,0))
fan = outer.cut(inner)
fan.rotate(pos, Base.Vector(0,1,0), 15)
fans.append(fan)
fansL = Part.makeCompound(fans)
fansR = fansL.mirror(Base.Vector(0,0,0), Base.Vector(0,1,0))
all_aero = [fuselage, wingL, wingR, canard, elevator, hstab]
bb_xmin = min(s.BoundBox.XMin for s in all_aero)
bb_xmax = max(s.BoundBox.XMax for s in all_aero)
bb_ymin = min(s.BoundBox.YMin for s in all_aero)
bb_ymax = max(s.BoundBox.YMax for s in all_aero)
bb_zmin = min(s.BoundBox.ZMin for s in all_aero)
bb_zmax = max(s.BoundBox.ZMax for s in all_aero)
domain = Part.makeBox((bb_xmax-bb_xmin)+5000+20000,
(bb_ymax-bb_ymin)+2*10000,
(bb_zmax-bb_zmin)+10000+1500,
Base.Vector(bb_xmin-5000, bb_ymin-10000, bb_zmin-1500))
fluid_domain = domain.cut(all_aero + [fansL, fansR])
out = "C:/Temp"
os.makedirs(out, exist_ok=True)
Part.export([fluid_domain], out+"/TEN_M_V7_fluid_domain.step")
print("\nSTEP:", out+"/TEN_M_V7_fluid_domain.step")
def show(shape,name,color,transp=0):
o = doc.addObject("Part::Feature", name)
o.Shape = shape
o.ViewObject.ShapeColor = color
o.ViewObject.Transparency = transp
return o
show(fuselage,"Body",(0.30,0.30,0.35))
show(wingL,"Wing_L",(0.75,0.75,0.75))
show(wingR,"Wing_R",(0.75,0.75,0.75))
show(fansL,"Fans_L",(0.10,0.10,0.10))
show(fansR,"Fans_R",(0.10,0.10,0.10))
show(canard,"Canard",(0.70,0.70,0.70))
show(elevator,"Elevator",(0.50,0.50,0.50))
show(hstab,"HStab_T",(0.65,0.65,0.65))
show(fluid_domain,"FluidDomain",(0.20,0.50,0.80),88)
doc.recompute()
print("\nTEN_M_V7: ГОТОВО. Киль построен без узелков!")
Возможно даже кто-то подскажет пути его совершенствования.
Источник


