Проверка физики и параметров крыльев (модуль wing-physics-check)
Ветка feature/wing-physics-check, копия ~/deltaplan-wing-physics-check (от main 3820bda). Журнал — docs/archive/plan/wing-physics-check-progress.md, контракты — docs/contracts/wing-physics-check.md.
Повод
Отзыв пилота (версия 1.0.0): «6 м/с — сдувает, при 3 м/с не набрать высоту. Пробовала на всех, кроме жесткокрылов». То есть на мягких крыльях при ветре 6 м/с аппарат сносит назад (не держится против ветра), при 3 м/с не удаётся набрать высоту (динамик/термики).
Ожидание из реальности: триммер ~31–39 км/ч (учебные ~30, спортивные ~37), Vmax 55–100 км/ч; против ветра 6 м/с (21,6 км/ч) аппарат идёт уверенно, на отданной ручке — с запасом; парение в динамике при 3 м/с на хорошем склоне — пограничное, но реальное, при 5–6 м/с — обычное.
Решения (задание главной сессии, не обсуждаются)
- Физика прежде «нравится»: параметры — из паспортов/DHV/физики; отзыв — проверка, не подгонка.
- В
mainне вливать: итог — шлюз главной сессии (что не так с файл:строка и числами до/после, что исправлено, таблица замеров, открытые вопросы, как проверить пилоту). - Зона модуля: аэродинамика и параметры крыльев (поляры, скорости, нагрузка), модель ветра у склона (профиль, обтекание, динамический подъём), термики — в части «можно ли набрать».
- Не наша зона: ввод/управление/старт (
scripts/game/input_controller.gd,scripts/core/control_input.gd,scripts/flight/ground_run.gd,scripts/game/launch_nose.gd,configs/controls.json) — координаторfeature/control-fix. Пересечения — описать, не править.
Дополнение пилота о старте (01.10, через главную сессию)
Реальный старт: 0 м/с — долгий разбег, но взлететь можно на любом крыле (сейчас советские и учебные не взлетают); 3 м/с — почти так же, спортивные легко; 6 м/с — простой быстрый старт; 10 м/с — почти вертикальный. Управление на земле — зона feature/control-fix (им передано). Для модуля — проверка Vmin/CL_max крыльев (особенно советских и учебных) против паспортов и встречного ветра у земли на высоте крыла (1,5–4 м) на старте: скорость отрыва ≈ Vmin − встречный ветер, бег пилота ~4–6 м/с. Сверка с паспортами, не подгонка. Добавлено в WPC-1 (раздел «Отрыв на старте», К4 v2) и WPC-2 (ветер 10 м/с, высоты 1–5 м над стартом и полосой разбега).
Что уже известно (до исполнителей, 01.10)
- Параметры крыльев (
configs/wings/*.json, 48 шт., жёстких нет): трим 28,5–38,8 км/ч, «на себя» 55–101 км/ч, мин. снижение 0,78–1,35 м/с, качество 6,2–16 — по порядку величины реальны. - Ветер в меню = U10 (10 м над рельефом) на старте (
configs/atmosphere.json→wind.reference_height_m); выше — степенной профиль над местным рельефом, α = 0,24 × r(класс устойчивости) до z_sat (6 м/с — 415 м), плюс множитель высоты над стартом 1 + 0,6·Δh/км (scripts/atmosphere/wind_model.gd:129–148). Нейтрально: 6 м/с на 10 м → ≈ 10,4 м/с на 100 м над рельефом — порядка трима. Над гребнем в реальности профиль сплющен (ускорение у поверхности, Jackson–Hunt), а здесь степенной профиль отсчитывается от местной земли — кандидат в причину «сдувает». - В игре с GPU — среднее поле воздуха (решатель,
air_model.enabled = auto); headless — аналитика. Как U10 меню переходит во втекающий профиль поля и сколько ветра поле даёт на старте и выше — неизвестно (WPC-2). - Знак и система координат ветра в модели полёта проверены тестом
tests/flight/test_air.gd::test_headwind_groundspeed(v_air = velocity − wind).
Задачи
Волна 1 (параллельно)
WPC-1 — Паспорта против модели (dp-researcher). По каждому мягкому крылу: из конфига и установившегося полёта модели (FlightModel, headless) — сваливание, трим, «на себя», мин. снижение и его скорость, макс. качество и его скорость, снижение на 80 км/ч — при эталонной массе и при массе пилота по умолчанию (configs/pilot.json, 85 кг, с ограничением диапазоном); сравнение с tools/research/data/wing_passports/ (wings_merged.json, polars_points.json, DHV) и литературой. Проверить, что модель выходит на заявленные trim/full_pull (трапеция ±1) и что плотность на высоте старта учтена.
Файлы: tools/research/wing_physics_check/wings_audit.*, вывод .../out/wings_audit.csv (контракт К4). Не трогать configs/wings/.
Приёмка: таблица по 48 крыльям (модель / паспорт / расхождение %), список крыльев с расхождением > 10 % по триму, Vmax, мин. снижению или качеству с причиной; команда воспроизведения; ≤ 1 ч счёта.
WPC-2 — Ветер у склона (dp-researcher). На всех стартах всех мест (configs/locations/*.json) при 3 и 6 м/с «в старт»: горизонтальный ветер и вертикальный поток на 2, 10, 30, 50, 100, 200, 300 м над стартом и над точками 50/150/300 м вперёд по ветру от старта (над склоном), в режимах аналитика и поле (GPU, как в игре; дневной час старта по умолчанию). Проверить: что значит «ветер 6 м/с» (на какой высоте и где выполняется), ускорение на гребне против литературы (Askervein, Jackson–Hunt, Taylor & Lee 1984), градиент над гребнем, динамический подъём (порядок U·sinθ) против правил пилотов, применение к аппарату (знак, система, относительная скорость). GPU — под flock /tmp/heat_ca_gpu.lock.
Файлы: tools/research/wing_physics_check/wind_audit.*, вывод .../out/wind_profile.csv (К5). Модель воздуха не править.
Приёмка: таблица профилей по стартам (аналитика/поле), сравнение с литературой с числами, вывод «завышен/занижен/в норме» с файл:строка для каждой найденной причины; команда воспроизведения.
WPC-3 — Пачка полётов против ветра и в динамике (dp-engineer). Инструмент tools/flight/wind_penetration_run.gd (+ .tscn): один скрипт, одна пачка, csv по строке на запуск, продолжение с места. Для каждого мягкого крыла × ветер {3, 6} м/с × трапеция {0 трим, −0,5, −1 полностью на себя} × высота {30, 100, 200} м над стартом: старт в воздухе над стартом лицом в ветер, 60 с без управления креном (курс держать регулятором, как бот), путевая скорость против ветра (м/с), воздушная скорость, вертикальная скорость, ветер в точке; плюс серия «динамик»: бот-восьмёрка вдоль гребня (как tests/atmosphere/test_ridge_starts.gd) 3 мин на триме, средний вариометр и набор. Места/старты — по 1 старту каждого места (список в задании), режимы аналитика и поле (GPU, под замком). Масса пилота — 85 кг (по умолчанию).
Файлы: tools/flight/wind_penetration_run.*, итог tools/flight/wind_penetration_table.py, данные — tools/research/wing_physics_check/out/penetration.csv (К6). Модель не править.
Приёмка: csv на все точки плана, сводная таблица (крыло × ветер × трапеция → путевая на 30/100/200 м, знак), время прогона; команда воспроизведения.
Сужение (01.10, решение пользователя через главную сессию)
Пилот уточнил: главная проблема — управление на старте (на Славутиче при 6 м/с нос высоко, мышью и S не притянуть; раньше было нормально) — зона feature/control-fix. Модулю: доделать идущие проверки паспортов и замеры поляр/ветра (WPC-1, WPC-2; WPC-3 — аналитика по всем крыльям, поле — по 1 крылу на группу), широкий пересмотр параметров не начинать; вернуться с отчётом («с физикой всё в порядке» — если так по числам). Волны 2–3 ниже — только по отдельному решению на шлюзе.
Решения пользователя по шлюзу 1 (01.10, через главную сессию; не обсуждаются)
- Ветер в поле — подстроить приток под ветер у старта (вариант 1). Делает НЕ этот модуль: координатор
feature/air-start(копия~/deltaplan-air-start) — завышение ветра в поле и турбулентность поля у земли (CF-1); ему переданы данные WPC-2. Сплющивание профиля аналитики (вариант 2) не выбрано. Модель воздуха здесь не правим. - Конфиги крыльев править по паспортам (паспорта — эталон): сваливание, Vmax учебных, снижение мачтовых — к паспортам; Vmax спортивных — DHV при VG 0 (свободная VG, 74–90 км/ч), VG в игре нет. Исполнитель, тест «конфиг соответствует паспорту ± допуск», CHANGELOG — задача WPC-4.
- Atlas
launch.alpha_neutral_deg16° при срыве 12,6° — поправить по физике в WPC-4; control-fix сообщить через главную сессию в отчёте. - WPC-3 довести и принять; числа поля в WPC-3 — «до исправления air-start»; повторный прогон поля (WPC-9) — после готовности air-start.
Решения пользователя по шлюзу 2 (01.10, через главную сессию; не обсуждаются)
- «ca.»-скорости производителя (крайние CL_max 1,13…2,91, мин. снижение 0,69–0,74 у ww_t2c, ww_sport3, bautek_astir/kite) — оставить, паспорт — эталон; вернуться, если пилоту эти крылья покажутся нереальными.
- aeros_discus: трим — середина паспортного диапазона 33–35 км/ч (34 км/ч при массе паспорта 126 кг → 34,4 при эталонной 129 кг), через генератор fit_passports.py (воспроизводимость бит в бит) и фикстуру целей.
- Слияние
feature/wing-physics-checkв main одобрено — вливает главная сессия. WPC-9 (повтор поля после air-start) остаётся открытым.
Волна 2
WPC-4 — конфиги крыльев по паспортам (dp-engineer). Для всех крыльев с паспортными числами (WPC-1, tools/research/wing_physics_check/out/wings_audit.csv, К4 v2): сваливание (первая точка поляры, CL_max), трим, Vmax (full_pull_speed_kmh; DHV VG 0, иначе производитель), мин. снижение и его скорость, качество — к паспорту при эталонной массе, поляра — физически согласованная (CL→CD гладкая, без подгонки отдельных точек мимо физики); reference.*, _doc с источником. Генератор tools/research/data/wing_passports/make_new_wings.py — по возможности он (паспорт вместо подобия), иначе отдельный скрипт; конфиги регенерировать. Инвариант К1 v2: launch.alpha_neutral_deg ≤ α_срыва − 3° у всех крыльев (atlas — по физике). Регрессионный тест tests/flight/test_wing_passports.gd: установившийся полёт FlightModel против паспортных целей (фикстура из WPC-1) ± допуск; К1 v2 в контрактном тесте. CHANGELOG «В работе».
Приёмка: тест проходит; расхождения модель/паспорт ≤ допуска (сваливание, трим, Vmax ±7 %, мин. снижение и его скорость ±10 %, качество ±10 %) у всех крыльев с паспортом, исключения — списком с причиной; затронутые тесты полёта (--filter=tests/flight, test_wings, test_polar, test_takeoff, test_ridge_starts) — зелёные или падения объяснены; против 6 м/с на триме путевая > 0 у всех мягких крыльев (пересчёт WPC-1 penetration_est); команда воспроизведения.
Волна 2 (прочее, после разбора волны 1)
Исправления у причины — формулируются по итогам WPC-1..3 (каждое — своя задача dp-engineer с регрессионным тестом: «6 м/с у старта на триме мягкое крыло идёт вперёд относительно земли ≥ X», «3 м/с на хорошем склоне — средний вариометр в полосе динамика ≥ Y» — числа из физики/литературы, не из отзыва). Если причина в модели воздуха (общая с модулем air-model) — шлюз: варианты и рекомендация.
Волна 3
WPC-9 — повтор пачки WPC-3 после исправлений, таблица до/после, шлюз главной сессии.
Риски
- Поле воздуха считается только на GPU (окно, не headless) — замеры поля медленнее; оценить по 1–2 точкам.
- Причина может быть в управлении (трапеция не уходит «на себя» мышью — зона control-fix): тогда это пересечение, описать.
- Правка профиля ветра затронет калибровку модели воздуха (Б1/AM-09, Askervein) — только через шлюз.