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 складывает две НЕЗАВИСИМЫЕ погрешности.
- Продольная — интерполирующий лофт гуляет между станциями. Ею и
управляет раскладка (fuselage.js::fuselageStations). - Поперечная — замкнутый контур сечения строится
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.py → Cl_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 | 1° |
| tractor | low | 0 | 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 в дизайнере
В секции Фюзеляж добавлены два слайдера:
- Downthrust (−5° … +10°) — под строкой формы сечения
- Sidethrust (−5° … +5°)
Под слайдерами отображается подсказка с рекомендованными значениями:
Рек. downthrust: 2° · sidethrust: 1° ← зелёный, если значение в диапазоне
В блоке VLM-результатов появляется строка:
Cm тяги (T/W=1) 0.0124 ← жёлтый если > 0.02 (требует коррекции downthrust)
Типичный сценарий настройки
- Откройте проект в дизайнере, перейдите в секцию Фюзеляж
- Проверьте подсказку рекомендованных углов (зелёный = всё ок)
- Запустите расчёт AVL (кнопка "Рассчитать")
- В результатах посмотрите
Cm тяги (T/W=1):
-< 0.02→ зелёный, момент приемлемый
-> 0.02→ жёлтый, увеличьте downthrust на 1–2° - Повторите расчёт и убедитесь что
Cm тягиуменьшился
Связь с другими разделами
- AVL / VLM расчёт — drag budget и тяговая линия интегрированы в основной расчёт
- Оптимизатор геометрии — верификация AVL использует обновлённый CD_total
- Реализация:
web/services/avl/vlm_engine.py,web/services/stability_service.py,
web/services/geometry_optimizer.py