OPT · Авто-дигитайзер номограмм
SmartSky OPT рассчитывает взлётно-посадочные характеристики ATR 72/42 по оцифрованным графикам из AFM/FCOM. Раньше это делалось вручную (DigitizeMe + правка JSON) — три стадии человеческого фактора. Здесь ИИ предлагает, а детерминированный слой проверяет каждую координату по реальным чернилам чарта.
Проблема: ручная оцифровка
3 стадии человеческого фактораКалибровка осей
Оператор кликает углы графика и вводит значения. Ошибка здесь масштабирует и сдвигает все точки систематически.
Клик по кривым
Точки ставятся вручную вдоль каждой кривой. Плотность — на глаз; на изгибах появляется кусочно-линейная погрешность.
Правка JSON
Ручное редактирование в редакторе: округление, переименование, клампинг. Здесь и рождаются опечатки-сдвиги разряда.
Результат: расхождения с эталонной методикой ATR SPS и опечатки, попадающие в боевое приложение. Цель — убрать человеческий фактор и измерять точность относительно печатного чарта (он и есть certified ground-truth).
Векторный пайплайн
нативная геометрия из PDFКлючевой рычаг: примерно половина чартов в AFM/FCOM — векторные. Вместо распознавания пикселей вытягиваем нативные path-объекты прямо из PDF (pypdfium2 C-API), и кривые ложатся пиксель-в-пиксель на печатные чернила. Разделение «семейство кривых / сетка / текст» — почти бесплатное по структуре path. Калибровка осей — из текстового слоя PDF (тики), без OCR и без человека.


Displaced OAT-фан — самый трудный артефакт
взят: 99.8% на чернилахРастровая панель температуры (OAT) нарисована повёрнутой, 11 кривых высоты сходятся в пучок — её не брали ни column-sweep, ни контур, ни полярная развёртка, ни коммерческий векторизатор. Решение: одним вызовом VLM (gpt-5.5) читаем 11 меток высот и якоря концов каждой кривой → затем динамическое программирование трассирует кривую между якорями по чернилам. Итог — медиана расстояния до чернил = 0 px на всех 11 кривых, E2E displaced-панели 6.93% → 1.99%.


End-to-end через движок
порт Geometry/Cardano на PythonДвижок расчёта (Bézier + формула Кардано, цепочка панелей карпета) портирован на Python (engine.py) и сверяется с боевыми JSON приложения на сетке из тысяч комбинаций входов. Наложение извлечённых кривых на печатный чарт — визуальная проверка перед метрикой.


Поиск багов в проде
18 опечаток оцифровки · 15 чартовПобочный, но ценный результат: тот же детектор находит опечатки оцифровки в боевых данных приложения — сдвиг разряда или запятой при ручной правке JSON. Метод — выброс «по индексу среди соседних кривых» (leave-one-out) + нарушение монотонности X, перекрёстно подтверждённый авто-извлечением и выходом за пределы оси чарта. Список (ATR72 + ATR42) оформлен в аргументированный отчёт.
| Чарт (страница) | Секция / кривая | Текущее | Должно быть | Тип |
|---|---|---|---|---|
| TakeOff/Main/TODDry | temp / 6000 · pt3 x | 269 | 26.9 | decimal |
| Landing/Main/ALDDryDelayed | wind / 20 · pt0 y | 18000 | 1800 | ×10 |
| Landing/Main/ALDDryNormal | weight / 6 · pt4 y | 7250 | 725 | ×10 + dup-x |
| Landing/LDTA/LDTAGoodToMedium | temp / 6000 · pt1 x | −87 | −8.7 | decimal |
| TakeOff/Obstacle/RemoteObstaclesIcing | weight / 2240 · pt3 x | 1000 | 10000 | digit drop |
| ATR42 · TakeOff/RotationSpeedNormalCond | weight / 1 · x | 1200 | 12000 | digit drop |
… показаны 6 из 18 · полный отчёт: Ошибки_оцифровки_ATR.pdf (RU, с аргументацией по каждому)
Валидация по QRH — замена недостающего SPS
Эталонного экспорта SPS у нас нет. Зато QRH (ATR 72-500) содержит численные таблицы — их распарсили в lookup и сверили с выходом движка независимо от прода: