Not translated yet — page language: Russian

Drag Budget и тяговая линия

Обновлено: 2026-08-13 drag сопротивление downthrust sidethrust

Drag Budget и Тяговая линия

Разделы: Drag Budget · Тяговая линия · Отображение в дизайнере


Drag Budget (AD-40)

Что это?

Drag budget — разбивка полного аэродинамического сопротивления по источникам:

Компонент Описание
Индуктивное (CD_ind) Порождается подъёмной силой; зависит от AR и CL
Профильное (CD_profile) Трение и давление на профиле крыла (из Xfoil/NeuralFoil)
Паразитное (cd0_parasite) Фюзеляж, мотогондолы, шасси, интерференция — считается drag budget'ом

До AD-40 AVL считал только индуктивное сопротивление, что занижало общий drag и завышало расчётное L/D.


Метод расчёта

Используется Component Buildup Method (Raymer / Hoerner):

d_экв = √(4·S_мид/π)                 # эквивалентный диаметр по МИДЕЛЮ (AD-1343)
f = fus_length / d_экв               # удлинение (fineness ratio)
FF = 1 + 60/f³ + f/400               # form factor
Re_fus = V × fus_length / ν          # число Рейнольдса
Cf = 0.455 / (log10(Re_fus))^2.58    # турбулентный Cf (Schlichting)
Swet = ∮ по станциям обвода          # смоченная площадь ПО РЕАЛЬНОМУ обводу (AD-1343)
cd0_fus = Cf × FF × Swet / S_ref

Геометрия корпуса входит в расчёт (AD-1343, стадия S07). До этого тикета
смоченная площадь бралась как π·d·L·0.75 — цилиндр по ШИРИНЕ сечения с
поправкой «на обтекаемость», а удлинение считалось по той же ширине. Из-за
этого СЕМЬ параметров корпуса не влияли на сопротивление вообще: форма сечения
(пять форм канона AD-403), отношение высоты к ширине, длина и полнота обводов
носа и хвоста, позиция максимального сечения. Пользователь перестраивал корпус,
а CD, качество L/D и потребная тяга не двигались — класс дефектов AD-1036
(«нарисовано одно, посчитано другое»).

Теперь обе величины считаются по ТОМУ ЖЕ обводу, по которому строится тело
(web/services/avl/fuselage_geometry.py — серверное зеркало клиентского
fuselage.js):

  • смоченная площадь — сумма боковых поверхностей усечённых конусов между
    станциями, ΔS = ½·(P₁+P₂)·√(Δx²+Δr²), где P — периметр РЕАЛЬНОГО контура
    сечения, а Δr — приращение эквивалентного радиуса P/2π. Множителя 0.75
    больше нет: сужение носа и хвоста проинтегрировано, а не заменено константой;
  • мидель (площадь самого большого сечения) даёт эквивалентный диаметр для
    удлинения. Ширина для этого не годится: высокий узкий корпус при той же
    ширине имеет вдвое больший мидель, то есть он толще, а не такой же.

Чего этот тикет НЕ сделал. Габарит полного сечения по-прежнему ОДИН на всю
длину (fuselageDiameter × fuselageAspect). Пользовательские сечения по
станциям — решение основателя по стадии S07 — вынесены отдельным тикетом:
каждое такое сечение добавляет узел в раскладку станций лофта (fuselage.js,
AD-1234), а та к произвольным узлам не устойчива. Замер на реальном OCCT-WASM:
на борте «тупой короткий нос + сечение на 0.37 длины» обшивка отходила от
заданного обвода на 4.75 мм при пороге 4 мм, а попытка сгустить сетку вокруг
сечения ухудшила отклонение до 1805 мм в хвосте. Пока раскладка не выведена
заново под произвольные изломы, сечения нельзя вводить ни в геометрию, ни в
расчёт: посчитанный корпус разошёлся бы с построенным.

Порог 4 мм считает ДВЕ погрешности, а не одну (AD-1427)

Числа абзаца выше («4.75 мм при пороге 4 мм») приписывали раскладке станций
ВЕСЬ измеренный миллиметраж. Замер показал, что это неверно: метрика
kernel_fuselage_surface.test.js складывает две НЕЗАВИСИМЫЕ погрешности.

  1. Продольная — интерполирующий лофт гуляет между станциями. Ею и
    управляет раскладка (fuselage.js::fuselageStations).
  2. Поперечная — замкнутый контур сечения строится
    drawPointsInterpolation по 32 точкам, то есть СПЛАЙНОМ, и излом
    образующей контура он скругляет. К раскладке станций отношения не имеет.

Контроль, отделяющий вторую от первой (тот же приём, каким AD-1234 отделил
машинерию лофта от интерполяции меняющегося сечения): тело с ПОСТОЯННЫМ
сечением на строго равномерной сетке станций — вклад раскладки там нулевой
тождественно. Замер (реальный OCCT-WASM, длина 1.5 м, aspect 0.54, 41
станция), максимум по диаметрам 0.10 / 0.18 / 0.25 м:

Форма сечения Отклонение на ЦИЛИНДРЕ (было, AD-1427) Стало (AD-1447)
circle, ellipse, rounded_rect, rounded_square 0.00 мм 0.00 мм
d_shape (плоское дно) 1.73 / 2.25 / 2.40 мм 0.00 / 0.00 / 0.00 мм

То есть на борте с плоским дном до 60 % бюджета 4 мм тратилось ещё до того,
как раскладка станций скажет хоть слово
, и росло с габаритом корпуса.

Излом плоского дна больше не скругляется (AD-1447)

Поперечная погрешность из таблицы выше не следовала из физики — она следовала
из способа построения. Контур сечения приезжал в ядро списком точек, а ядро
проводило через них ОДИН замкнутый сплайн: сплайн гладок по построению и
тангенциальный разрыв повторить не может. У четырёх форм канона AD-403 это
ничего не стоило (их образующая гладкая), а у d_shape линия перехода к
плоскому дну — настоящий излом, и он скруглялся.

Починка не меняет ни таблицу форм (AD-403), ни раскладку станций (AD-1234):
станция дополнительно несёт ИНДЕКСЫ ИЗЛОМОВ своего контура
(fuselage.js::sectionCorners — единственный владелец ответа «где ломается
образующая», рядом с самой таблицей форм), а ядро строит контур кусочно: свой
интерполирующий сплайн на каждую гладкую дугу, стык дуг — острый
(kernel.core.js::fuselageSectionSketch). Форма без изломов отдаёт пустой
список и строится ровно как раньше, ОДНИМ сплайном.

Замеры до/после на одном и том же стенде (реальный OCCT-WASM, те же
параметры тесселяции):

Что До После
Вклад КОНТУРА d_shape на цилиндре (⌀ 0.10 / 0.18 / 0.25 м) 1.73 / 2.25 / 2.40 мм 0.00 / 0.00 / 0.00 мм
Знак этого отклонения (⌀ 0.25 м): наплыв / подрез у линии дна +2.40 / −1.12 мм 0.00 / 0.00 мм
Отклонение обшивки на борте «длинное плечо, плоское дно» (полная метрика) 1.37 мм 1.06 мм
Вершин в меше того же борта 10 468 7 493
Вершин в меше цилиндра d_shape (⌀ 0.10 / 0.18 / 0.25 м) 51 879 / 61 568 / 51 191 192 / 220 / 228
Остальные четыре формы (все шесть профилей матрицы) 1.06–1.75 мм те же числа, побайтово

Взрывной рост меша — следствие того же дефекта: скруглённый излом даёт узкую
область ложной кривизны, и OCCT дробил там поверхность на десятки тысяч
треугольников. Теперь меш корпуса с плоским дном той же величины, что у
остальных форм.

Следствие для ПРИЁМКИ. Строка d_shape в матрице
kernel_fuselage_surface.test.js снова меряет раскладку станций ЦЕЛИКОМ, а не
её остатком. Контроль «сколько миллиметров даёт ФОРМА СЕЧЕНИЯ» оставлен и
краснеет на возврате дефекта: пять форм обязаны давать ноль, а ШЕСТАЯ точка
матрицы — тот же d_shape, собранный БЕЗ пометок излома, — обязана давать
видимый не ноль (иначе нули доказывали бы не исправность контура, а слепоту
метрики).

Что осталось скруглённым и почему. Экспорт СКРИПТА ДЛЯ FUSION
(fusion_script.js) кладёт станцию одним замкнутым sketchFittedSplines
то есть в Fusion излом плоского дна по-прежнему скругляется. Это тот же
дефект, но чинится он не здесь: разбиение станции на несколько сплайнов
меняет условие замкнутости профиля Fusion (лофт берёт sk.profiles.item(0)),
и проверить это без самого Fusion нечем. Тела, которые выпускает Skyforge
(превью, STEP/STL), собираются ядром и починку получили.

Раскладка под произвольные изломы: что замерено и почему не влито (AD-1427)

Раскладка выведена заново и проверена на реальном ядре, но в прод НЕ
влита — ниже и вывод, и причина, чтобы следующий заход не повторял путь.

Действующая раскладка (AD-1234) к произвольным узлам не просто «не устойчива»
— она устойчива только в СВОЕЙ настроечной точке. Замеры на реальном
OCCT-WASM: добавление одного узла на 0.37 длины даёт 1563 мм на профиле «тупой
короткий нос» и 27.6 мм на «острых носе и хвосте»; а на борте основателя БЕЗ
единого сечения смена STATION_SEGMENTS с 20 на 28 даёт 3715 мм. Значит
STATION_SEGMENTS = 20 — удачное значение, а не свойство алгоритма.

Выведенный кандидат: узлы равномерны по длине ОБРАЗУЮЩЕЙ (кривой
«длина × радиус», а не по длине корпуса), обязательные узлы на изломах стоят
ТОЧНО, между соседними изломами шаг равномерен по дуге; сглаживания
градации и дробления кончиков нет вовсе
. Обе выброшенные части — те самые,
об которые споткнулся предыдущий заход: включение градации с пределом 2 даёт
131 станцию и 4.40 мм, с пределом 1.5 — 178 станций и 126 мм.

Проверка (реальное ядро) Действующая Кандидат
6 профилей × 5 наборов сечений (сечение = узел) до 1563 мм ≤ 1.85 мм
то же, сечение МЕНЯЕТ обвод (гладкая вклейка) ≤ 2.16 мм
240 случайных допустимых бортов без d_shape max 3.85 мм, ни одного > 4 мм
продольный вылет тела за крайние станции 0.00–5.5 мм 0.00 мм
fuse на экспорте, борт основателя 5.3 с (29 станций) 7.3 с (41 станция)

Три условия, без которых кандидат НЕ держится, — их обязан унаследовать любой
следующий заход:

  • уплотнение НЕ монотонно: мельче не значит лучше. Шаг у кончика вдвое
    мельче даёт 763 мм, а 56 узлов вместо 40 — 68.96 мм. Любая правка меряется
    на всех трёх классах сразу (без сечений, сечение у носа, сечение в хвосте),
    иначе улучшение одного маскирует деградацию другого;
  • безопасная полоса плотности начинается с 36 узлов: на 30 и 32 из 180
    случайных бортов вылезают 3 и 5 нарушений порога (до 7.91 мм). Считать 30
    «почти тем же» нельзя;
  • сечения требуют ПРОДУКТОВОГО ограничения на расстановку: два сечения в
    0.021 длины друг от друга с перепадом 1.16 → 0.64 дают канавку, которую
    гладкий лофт не воспроизводит в принципе (68.96 мм). При минимальном зазоре
    0.08 длины между контрольными точками обвода нарушений нет.

Почему не влито. Сегодня раскладку меняет только цена: сечений в модели
ещё нет, все существующие борта укладываются в 1.06–1.75 мм, а кандидат стоит
+38 % времени fuse на экспорте (41 станция против 29). Платить эту цену
имеет смысл ОДНИМ движением с вводом сечений — тогда у неё появляется то, что
она покупает. До тех пор в проде остаётся раскладка AD-1234.

Что изменилось у пользователя (замер на дефолтном борте v2: длина 1.0 м,
ширина сечения 0.10 м, S_ref 0.264 м², 15 м/с):

Величина Было Стало
Смоченная площадь фюзеляжа 0.2356 м² 0.2833 м² (+20.2 %)
cd0_fus 0.00433 0.00521 (+20.3 %)

Вслед за cd0_fus растёт и cd0_total, падает качество L/D и растёт
потребная тяга. cd0_interference (стык крыло-фюзеляж) при этом НЕ меняется:
после AD-1404 он считается по формуле Хёрнера от корневой хорды и относительной
толщины профиля, а не как доля сопротивления фюзеляжа.

Рост закономерен: 0.75 было грубой поправкой, а фактический интеграл обвода при
дефолтных полнотах даёт ≈0.89 длины полного сечения плюс наклон образующей у
концов. RESULT_ALGO_VERSION поднят до 11 — при том же входе ответ решателя
другой, и записи кэша прежней версии находиться не должны.

Посчитано по тому телу, которое выпускается (AD-1439)

Все числа выше опираются на предположение «построенное тело совпадает с набором
станций». До AD-1439 оно было непроверенным: сверялся ОБВОД (кривая rFrac в
узлах клиентской раскладки), а не площадь и не сам солид. Теперь у корпуса —
цепочка из двух звеньев, как у гондолы (AD-1428), с выведенными допусками:

Звено Что с чем Допуск Факт замера
расчёт ↔ станции лофта (tests/test_designer_v2_fuselage_wetted.py) fuselage_wetted_area против суммы усечённых конусов по станциям клиента 2 % (контур 128 против 32 точек + сетка 240 против 25–31 узла) +0.27…+0.89 %
станции ↔ собранный OCCT-солид (kernel_fuselage_wetted.test.js) площадь measureArea выпущенной детали против той же суммы 2 % на разрешённых обводах, 15 % на неразрешённом −1.03…+0.66 % и 4.0…13.8 %

Оба звена прогоняются по ШЕСТИ бортам × ПЯТЬ форм сечения, матрицы обеих
сторон одинаковы намеренно. Прежняя формула π·d·L·0.75 ни один из допусков не
проходит (расхождение с телом 4…78 %), плоская сумма без наклона образующей —
тоже (до 19.9 %); это отдельные тесты, а не примечание.

Классы допусков различает УДЛИНЕНИЕ корпуса (длина к большему габариту
сечения): у борта длиннее четырёх своих габаритов — а это вся линейка каталога
(7–11) — разгон сечения разрешён сеткой станций; короче — весь разгон
приходится на 2–3 узла, и интерполирующий сплайн выпучивается между ними ровно
как у самой тупой гондолы.

Находка AD-1439, которую допуски НЕ маскируют. На краю доменов ползунков
лофт не «выпучивается на проценты», а разваливается: борт длиной 0.6 м с
сечением 0.075 × 0.15 м (fuselageAspect 2.0) и обоими обводами по 0.05 при
полноте 1.0 строится с превышением заказанного максимального сечения на 23–33 %,
а его площадь расходится со станциями на 17–74 % (все пять форм). Соседний угол
(те же габариты, maxSectionFrac 0.5) не проходит splitForPrint вовсе —
«boolean cut did not yield a valid solid», деталь дробится на 13–34 сегмента при
столе 5 м. Это дефект раскладки/лофта класса AD-1234, а не свойство
дискретизации: в пространстве станций такие борта неотличимы от соседних, дающих
0.5 %. Матрица сверки сознательно стоит на допустимых бортах, а не на этом углу.

Мотогондолы (AD-1373, AD-1428):

f_нац = длина / диаметр               # удлинение гондолы
FF_нац = 1 + 0.35 / f_нац            # form factor ГОНДОЛЫ, не тела
Re_нац = V × длина / ν               # Re по длине ГОНДОЛЫ (свой погранслой)
Cf = 0.455 / (log10(Re_нац))^2.58
Swet_нац = ∮ по станциям обвода       # смоченная площадь ВЫПУСКАЕМОГО тела (AD-1428)
cd0_nacelles = Cf × FF_нац × 1.3 × Swet_нац × N / S_ref

Гондола — не цилиндр (AD-1428). До этого тикета смоченная поверхность
бралась формулой π × d × l, то есть цилиндром на всю длину. Тело же, которое
пользователь получает в STEP/STL, строится ТЕМ ЖЕ примитивом, что фюзеляж
(fuselage.js::nacelleStations зовёт fuselageStations с фиксированным
профилем сужения и круглым сечением), — у него есть нос и хвост. Расхождение
меняет ЗНАК по удлинению, поэтому «поправить коэффициентом» его нельзя:

Гондола (длина × диаметр) Удлинение Цилиндр π·d·l Реальный обвод Ошибка цилиндра
0.30 × 0.02 (самая тонкая) 15.0 0.01885 м² 0.01706 м² +10 %
0.14 × 0.05 (дефолт) 2.8 0.02199 м² 0.02153 м² +2 %
0.06 × 0.12 (самая тупая) 0.5 0.02262 м² 0.03866 м² −41 %

Теперь площадь считает тот же интегратор обвода, что у фюзеляжа
(avl/fuselage_geometry.nacelle_wetted_area), а сходимость с ВЫПУЩЕННЫМ телом
сторожит цепочка из двух звеньев с названными допусками: расчёт ↔ станции лофта
(1 %, tests/test_designer_v2_nacelle_drag.py) и станции ↔ собранный OCCT-солид
(5 % на пологих обводах, 15 % на самом крутом —
tests/js/designer_v2/kernel_nacelle.test.js). Прежняя формула
цилиндра оба допуска НЕ проходит, и это отдельный тест, а не примечание.

Коэффициенты у гондолы СВОИ, и это не формальность:

  • форм-фактор берётся для гондолы/внешнего груза (1 + 0.35/f), а не для
    длинного обтекаемого тела (1 + 60/f³ + f/400, как у фюзеляжа): гондола
    короткая и тупая, и на удлинении 0.5 «телесная» формула дала бы FF = 481
    вместо 1.7 — сопротивление в сотни раз больше;
  • 1.3 — множитель интерференции по Raymer для гондолы, установленной
    НЕПОСРЕДСТВЕННО на фюзеляж или крыло (оба расположения v2 — прямой монтаж).
    В cd0_interference ниже гондолы поэтому НЕ входят: это был бы двойной счёт;
  • N — число РЕАЛЬНО построенных гондол, а не значение слайдера «моторов»:
    у носового расположения гондола всегда ОДНА, сколько бы моторов ни стояло на
    ползунке. Правило одно на клиент и сервер (geometry.js::nacelleCount
    designer_v2_analysis.nacelle_count), сверка — tests/test_designer_v2_nacelle_drag.py.

Моторы выключены → N = 0, слагаемое ровно 0.0, весь бюджет как раньше.
На подъёмную силу и устойчивость гондолы не влияют — в решатель как несущие
поверхности они не попадают.

Гондолы СТРОЯТСЯ в выпускаемой геометрии (тот же STEP/STL, что и планер, —
отдельными телами): борт с моторами и без дают разное число тел, разный габарит
и разный объём. Считает и строит их ОДНО ядро (kernel.core.js); CAD-сервиса
(cad/) на пути выпуска v2 нет — он обслуживает только v1-дизайнер, и второго
определения формы гондолы в проекте не заводится.

Шасси, стыки, щели, выступающие элементы (AD-1404):

# Шасси — по МИДЕЛЮ, а не по смоченной поверхности: стойка и колесо
# плохо обтекаемы, поток отрывается сразу за миделем
cd0_gear = (n_ст·Cd_ст·d_ст·l_ст + n_кол·Cd_кол·d_кол·w_кол) / S_ref
#   Cd стойки  1.2  открытой / 0.10 в обтекателе
#   Cd колеса  0.25 открытого / 0.15 в обтекателе
# Убирающееся шасси в крейсере в потоке не стоит → слагаемого нет

# Стык крыло-фюзеляж — формула Хёрнера, на ОДИН стык (их два)
cd0_interference = 2·max(0.8·(t/c)³ − 3·10⁻⁴, 0)·c_корн² / S_ref
# Зализ снимает надбавку целиком (Raymer: «низкоплан с хорошим зализом» Q=1.0)

# Щели навески управляющих поверхностей — по проходному сечению щели
cd0_gaps = Σ 0.05·w·L / S_ref          # w — ширина щели, L — линия навески

# Выступающие наружу элементы — по миделю каждого
cd0_excrescence = Σ Cd_i·A_i / S_ref

Выпущенная механизация (AD-1367):

# Прирост от ВЫПУСКА закрылка (Raymer, гл. 12) — величина уже безразмерна,
# на S_ref делить не нужно: доля площади стоит прямо в формуле
cd0_flaps = 0.0144·(c_f/c)·(S_flapped/S_ref)·(δ − 10°)
#   δ — угол выпуска: 0° убрано / 15° взлётное / 40° посадочное
#   до 10° закрылок работает как отклонённый руль, срыва за ним ещё нет

cd0_total = cd0_fus + cd0_tail + cd0_nacelles + cd0_gear
          + cd0_interference + cd0_gaps + cd0_flaps + cd0_excrescence

Закрылка на борте нет ЛИБО он убран → слагаемое ровно 0.0, весь бюджет
побитово как до тикета. ⚠ Это вторая половина пары: тот же выпуск даёт
прирост подъёмной силы (avl/high_lift.pyCl_max → скорость сваливания),
и показывать одно без другого нельзя — иначе механизация выглядит бесплатной.

До AD-1404 на месте первых двух строк стояли константы cd0_gear = 0.015 и
cd0_other = 0.001: ни длина стойки, ни диаметр колеса, ни наличие обтекателей
или зализов, ни состав управления не меняли ни одного числа. Источник всех
коэффициентов — Коэффициенты бюджета
сопротивления
.


Перечень тел и особенностей — почему он существует в коде

drag_budget.DRAG_BUDGET_INVENTORY — список тел, создающих сопротивление, и
строк бюджета, которыми они закрыты. Он появился в AD-1404 после трёх
тикетов подряд, чинивших один и тот же дефект (мотогондолы AD-1373, оперение
AD-1378, стойки/зализы/щели AD-1404): критерий «в разложении присутствуют все
физически существующие тела» непроверяем, пока нет перечня, с которым сверяться.

Правило: новое тело в геометрии добавляет позицию в перечень тем же
движением.
Позиция обязана иметь либо строку бюджета, либо явное обоснование,
почему вклад не считается и чем это уточняется; сверку в обе стороны держит
tests/test_drag_budget_inventory.py.

Сегодня без слагаемого закрыты три позиции — шероховатость поверхности (нет
стадии «способ изготовления»), торцевые щели рулей и профильное сопротивление
самого крыла (считается отдельно, см. ниже).

cd0_total — это НЕ полный CD0 борта. Профильное сопротивление крыла в
него не входит по определению: его даёт поляра профиля в рабочей точке и
складывает vlm_engine отдельным слагаемым. Типовой диапазон «CD0 борта класса
RC = 0.02…0.04» относится к сумме cd0_total + CD_profile; сравнивать с ним
один только паразитный подтотал нельзя.

Полный CD0 борта и проверка правдоподобия (AD-1423)

Величина, к которой диапазон применим, заведена ЯВНО и под своим именем:

cd0_airframe = cd0_total + CD_profile      # drag_budget.airframe_cd0

По ней (и только по ней) идёт проверка правдоподобия по классу — критерий
выхода стадии S13 эталонной схемы: CD0 вне 0.02…0.04 у RC-модели это признак
незакрытого перечня тел, а не выдающейся аэродинамики.
drag_budget.airframe_cd0_plausibility отвечает кодом below / ok / above
(или None — величины нет), подпись рисует клиент
(verdicts.js::cd0PlausibilityVerdict), поэтому калибровка
(CD0_AIRFRAME_PLAUSIBLE_MIN/MAX) живёт в одном месте — здесь.

Зачем понадобилось разводить имена (замер 2026-08-01, дефолтный борт v2):

Величина Значение Вердикт
cd0_total (подтотал тел) 0.0110 below — «перечень не закрыт»
CD_profile (крыло) 0.0132
cd0_airframe (полный) 0.0242 ok

Критерий, применённый к подтоталу, обвинял бы в недосчёте ИСПРАВНЫЙ борт и
пропускал бы грязный (у борта с неубирающимся шасси подтотал 0.0319 — ещё «ok»,
полный 0.0451 — уже above). Гард на подмену репера —
tests/test_drag_budget_cd0_airframe.py.


Параметры в AvlGeometry

Поле Тип По умолчанию Описание
fus_length float 0.9 м Длина фюзеляжа
fus_diameter float 0.0 Диаметр; 0 → авто как fus_length/6
has_fixed_gear bool False Шасси НЕУБИРАЮЩЕЕСЯ (стоит в потоке)
gear_strut_count / gear_strut_length / gear_strut_diameter float 0 Стойки: число (ЭКВИВАЛЕНТНОЕ по миделю, может быть дробным), длина, толщина
gear_wheel_count / gear_wheel_diameter / gear_wheel_width float 0 Колёса: число (эквивалентное), диаметр, ширина
gear_faired bool False Стойки и колёса в обтекателях
has_wing_fillet / has_tail_fillet bool False Зализы стыков
wing_thickness_ratio float 0.0 t/c корневого профиля; 0 → стык не считается
control_gaps tuple () Пары (длина линии навески, ширина щели)
protrusions tuple () Пары (мидель, Cd) выступающих элементов
nacelle_count int 0 Число построенных мотогондол (0/1/2)
nacelle_length float 0.0 м Длина гондолы
nacelle_diameter float 0.0 м Диаметр гондолы
flap_chord_frac float 0.0 Хорда закрылка в долях местной хорды крыла (AD-1367)
flap_area_frac float 0.0 S_flapped/S_ref — доля опорной площади под полосой закрылка
flap_deflection_deg float 0.0 Угол выпуска в ТЕКУЩЕЙ конфигурации отчёта

Шасси заполняется с AD-1410: редактор даёт ВЫБОР ВАРИАНТА
(DesignerV2Params.landingGear), а designer_v2_landing_gear.gear_drag_inputs
переводит его в поля выше — размеры опор считаются по размаху и миделю
фюзеляжа. Убирающееся шасси отдаёт has_fixed_gear=False: ноль ПО ФИЗИКЕ, а не
из-за незаполненного входа. Зализов в редакторе по-прежнему нет — это
названное допущение, а не забытая позиция. Щели навески и толщина профиля
собираются из уже существующих параметров борта.

Мидель шасси — это ЛОБОВАЯ ПРОЕКЦИЯ ВЫПУСКАЕМЫХ ТЕЛ, и это проверяется
(AD-1438). До тикета шасси считалось, но в геометрии ядра его не было вовсе:
пользователь получал STEP/STL без стоек и колёс, сопротивление которых уже
входило в число на экране. Теперь ядро v2 строит их цилиндрами
(geometry.js::buildLandingGear), а d_ст·l_ст и d_кол·w_кол формулы выше —
в точности лобовая проекция такого цилиндра, то есть поправки на форму здесь
нет и быть не может (в отличие от гондолы AD-1428, где расхождение обвода с
цилиндром меняло знак по удлинению). Сходимость держит цепочка из двух звеньев:
проекция описанных тел против аргументов слагаемого
(tests/test_designer_v2_landing_gear.py::TestReleasedGearMatchesDragMidel,
допуск 1e-9 — контур выбирается числом точек, кратным четырём, поэтому габарит
сечения равен диаметру точно) и объём СОБРАННОГО OCCT-солида против того же
цилиндра (tests/js/designer_v2/kernel_gear.test.js, допуск
1 % — кривизна интерполирующего контура, замер 0.17…0.37 %).

Чего выпуск не строит и говорит об этом прямо: ниши и механизм
УБИРАЮЩЕГОСЯ шасси (его тел в потоке нет — слагаемое равно нулю по физике) и
форму ОБТЕКАТЕЛЕЙ (они меняют коэффициент, а не мидель, поэтому выпущенные
стойки остаются голыми цилиндрами). Обе оговорки видны в интерфейсе заметкой на
стадии «Производство» (landing_gear.js::gearReleaseGapKey), а не подразумеваются.

Дробные счётчики опор — не опечатка. Когда опоры разного размера
(хвостовое колесо, носовая стойка), набор сводится к эквивалентному числу опор
ОСНОВНОГО размера по миделю: n_экв = Σ n·ratio². Сопротивление линейно по
числу опор, поэтому результат РОВНО тот же, что у поштучного обхода, — и второго
способа суммировать тела заводить не пришлось.

Результаты в AvlResult

Поле Описание
cd0_fus Паразитное сопротивление фюзеляжа
cd0_tail Паразитное сопротивление оперения
cd0_nacelles Паразитное сопротивление мотогондол
cd0_gear Стойки и колёса неубирающегося шасси
cd0_interference Стык крыло-фюзеляж (зализ обнуляет)
cd0_gaps Щели навески управляющих поверхностей
cd0_flaps Выпущенная механизация (0.0 у убранной и у борта без неё)
cd0_excrescence Выступающие наружу элементы
cd0_parasite ПОДТОТАЛ тел и особенностей (БЕЗ профильного крыла)
cd_wing_profile Профильное сопротивление САМОГО крыла в рабочей точке (AD-1423)
cd0_airframe ПОЛНЫЙ CD0 борта = cd0_parasite + cd_wing_profile (AD-1423)
CD_total = CD_ind + cd0_airframe (те же слагаемые складываются ОДИН раз — AD-1423)

Сценарии использования

1. Оценить влияние шасси (AD-1404 — по размерам, а не константой):

retractable = AvlGeometry(fus_length=1.0, has_fixed_gear=False)
fixed = AvlGeometry(
    fus_length=1.0, has_fixed_gear=True,
    gear_strut_count=2, gear_strut_length=0.12, gear_strut_diameter=0.006,
    gear_wheel_count=2, gear_wheel_diameter=0.06, gear_wheel_width=0.02,
)
faired = replace(fixed, gear_faired=True)
# на дефолтной геометрии: 0 → 0.0088 → 0.0018
# то есть открытое шасси таких размеров почти УДВАИВАЕТ паразитный бюджет,
# а обтекатели возвращают четыре пятых потери

has_fixed_gear=True без размеров — это ValueError, а не ноль: позиция
перечня без слагаемого и без обоснования означает, что бюджет не сошёлся.
Молчаливый ноль здесь и был бы тем занижением, ради которого заведён AD-1404.

2. Длинный/толстый фюзеляж vs обтекаемый:

# Толстый: f=4 → FF=1.95 (высокий), cd0_fus большой
# Обтекаемый: f=8 → FF=1.13, cd0_fus в 2× меньше

3. Оценить цену мотогондол:

geo_none = AvlGeometry(fus_length=1.0, nacelle_count=0)
geo_pair = AvlGeometry(fus_length=1.0, nacelle_count=2,
                       nacelle_length=0.14, nacelle_diameter=0.05)
# пара гондол дефолтного размера добавляет ~30% к паразитному бюджету
# → CD_total выше, L/D и потребная тяга меняются соответственно

4. Оценить цену щелей рулей (AD-1404):

# Стадия «Управляющие поверхности» выключена → вырезов нет → щелей нет
# Включена → элерон + РВ + РН дают на дефолтном борте ~0.00054,
# то есть около 5% паразитного бюджета

5. Проверить разбивку в дизайнере:
После расчёта AVL в блоке результатов появятся строки:

CD             0.041234
  ↳ фюзеляж    0.00847
  ↳ гондолы    0.00238
  ↳ оперение   0.00487
  ↳ щели       0.00054
  ↳ интерф.    0.00040

Типичные значения для RC самолётов

Параметр Малый (0.5 м) Средний (1.5 м) Большой (3 м)
cd0_fus 0.012–0.018 0.006–0.010 0.003–0.006
CD_total (крейс.) 0.04–0.07 0.02–0.04 0.015–0.03

cd0_gear в этой таблице больше нет: после AD-1404 у него нет «типичного»
значения — он считается по размерам стоек и колёс конкретного борта и меняется
в разы между открытым шасси и шасси в обтекателях.


Тяговая линия (AD-41)

Что это?

Когда ось мотора не проходит через центр тяжести (CG), тяга создаёт момент тангажа:

M_pitch = T × dz × cos(θ_d) - T × dx × sin(θ_d)
Cm_thrust = M_pitch / (q × S × MAC)
  • dz — вертикальное смещение тяговой линии от CG (м; + = выше CG → нос вверх)
  • dx — горизонтальное плечо (для pusher: мотор позади CG)
  • θ_d — угол downthrust (°; + = мотор смотрит вниз → компенсирует нос вверх)

Что такое Downthrust и Sidethrust

        ↑ Thrust line
        |  θ_d
  ──────o───────→  Mотор наклонён вниз (downthrust)
       CG

Downthrust (0–3° для тягача, 2–5° для pusher):
- Компенсирует кабрирующий момент при тяге выше CG
- Устраняет изменение триммирования при добавлении газа

Sidethrust (0–2° вправо для тягача):
- Компенсирует P-factor (реакционный момент правовращающего винта)
- Без него самолёт тянет влево на полном газу


Расчёт рекомендации

Сервис recommend_downthrust() автоматически оценивает dz из конфигурации:

Мотор Крыло Типичное dz/d Рекомендуемый downthrust
tractor high/parasol +0.8–1.2 2–3°
tractor mid +0.3
tractor low 0
pusher любое −0.2–0.6 3–5°
wing_twin high +0.5 1.5°

Параметры в AvlGeometry и Project

Поле Описание
motor_position tractor / pusher / wing_twin
wing_position high / mid / low / parasol
downthrust_deg Угол downthrust (°)
sidethrust_deg Угол sidethrust (°)

В AvlResult:
- Cm_thrust — момент от тяги при T/W=1 (информационно; + = кабрирующий)


UI в дизайнере

В секции Фюзеляж добавлены два слайдера:

  1. Downthrust (−5° … +10°) — под строкой формы сечения
  2. Sidethrust (−5° … +5°)

Под слайдерами отображается подсказка с рекомендованными значениями:

Рек. downthrust: 2° · sidethrust: 1°   ← зелёный, если значение в диапазоне

В блоке VLM-результатов появляется строка:

Cm тяги (T/W=1)    0.0124   ← жёлтый если > 0.02 (требует коррекции downthrust)

Типичный сценарий настройки

  1. Откройте проект в дизайнере, перейдите в секцию Фюзеляж
  2. Проверьте подсказку рекомендованных углов (зелёный = всё ок)
  3. Запустите расчёт AVL (кнопка "Рассчитать")
  4. В результатах посмотрите Cm тяги (T/W=1):
    - < 0.02 → зелёный, момент приемлемый
    - > 0.02 → жёлтый, увеличьте downthrust на 1–2°
  5. Повторите расчёт и убедитесь что Cm тяги уменьшился

Связь с другими разделами

  • AVL / VLM расчёт — drag budget и тяговая линия интегрированы в основной расчёт
  • Оптимизатор геометрии — верификация AVL использует обновлённый CD_total
  • Реализация: web/services/avl/vlm_engine.py, web/services/stability_service.py,
    web/services/geometry_optimizer.py