AI-аналитика безопасности авиации
Авиационный инцидент редко случается из-за одной причины. ICAO описывает это как "цепочку Хайнриха": финальное событие — лишь верхушка пирамиды предшествующих аномалий. AI-система для анализа безопасности ловит звенья этой цепочки до того, как они замкнутся.
Источники данных и типы аномалий
Авиационная безопасность работает с несколькими потоками:
- FDR/QAR данные (Flight Data Recorder / Quick Access Recorder) — тысячи параметров с частотой 4-64 Гц: скорость, высота, режимы двигателей, отклонения рулей, ускорения
- ACARS сообщения — технические сообщения самолёт-земля, включая fault codes
- ATC переговоры — транскрипты переговоров с диспетчером (NLP)
- FOQA (Flight Operational Quality Assurance) — программы мониторинга качества полётов
- Данные техобслуживания — MRO записи, история отказов компонентов
Типовые аномалии для автоматического обнаружения:
| Тип аномалии | Параметры | Порог флага |
|---|---|---|
| Жёсткая посадка | Вертикальное ускорение при касании | >1.8g нормально, >2.6g — расследование |
| CFIT precursor | Скорость снижения + рельеф + GPWS активация | Патовое сочетание |
| Engine over-temperature | EGT/ITT в зависимости от режима N1 | Отклонение >15°C от envelope |
| Unstabilized approach | ILS deviation + speed + flap config на gate altitude | Любое несоответствие SOP |
| Tail strike risk | Pitch attitude при взлёте/посадке | >10° при скоростях <Vr |
Алгоритм анализа параметрических данных полёта
FOQA Event Detection через скользящие окна:
import numpy as np
import pandas as pd
from scipy.signal import savgol_filter
from typing import List, Dict
def detect_flight_exceedances(
fdr_df: pd.DataFrame,
aircraft_type: str,
phase_of_flight: str
) -> List[Dict]:
"""
fdr_df: DataFrame с временными рядами параметров полёта
Возвращает список событий-нарушений с временными метками.
"""
exceedances = []
# Сглаживание шума датчиков
fdr_df['vsi_smooth'] = savgol_filter(
fdr_df['vertical_speed_fpm'], window_length=11, polyorder=3
)
# Жёсткая посадка
if phase_of_flight == 'landing':
touchdown_mask = (
(fdr_df['radio_altitude_ft'] < 5) &
(fdr_df['radio_altitude_ft'].shift(1) >= 5)
)
touchdown_idx = fdr_df[touchdown_mask].index
for idx in touchdown_idx:
if idx in fdr_df.index:
nz = fdr_df.loc[idx, 'normal_acceleration_g']
if nz > 1.8:
severity = 'hard' if nz > 2.6 else 'firm'
exceedances.append({
'event_type': 'hard_landing',
'timestamp': fdr_df.loc[idx, 'timestamp'],
'value': round(nz, 3),
'threshold': 2.6,
'severity': severity,
'requires_inspection': nz > 2.6
})
# Нестабилизированный заход: скорость вне коридора на 500 ft
if phase_of_flight == 'approach':
gate_mask = (
(fdr_df['radio_altitude_ft'].between(480, 520)) &
(fdr_df['flap_position'] < 30) # не полный флап
)
gate_points = fdr_df[gate_mask]
for idx, row in gate_points.iterrows():
# Скорость должна быть Vapp ± 10 kt
vapp = row.get('vapp_kt', 145) # из FMS
if abs(row['ias_kt'] - vapp) > 10:
exceedances.append({
'event_type': 'unstabilized_approach_speed',
'timestamp': row['timestamp'],
'value': round(row['ias_kt'], 1),
'expected': vapp,
'deviation_kt': round(row['ias_kt'] - vapp, 1),
'severity': 'go_around_required'
})
return exceedances
def engine_health_anomaly(
engine_params: pd.DataFrame,
baseline_egt_delta: float = 0.0
) -> Dict:
"""
EGT Margin — разница между фактическим и предельным EGT.
Тренд снижения margin указывает на деградацию двигателя.
"""
# Нормализация на условия (OAT, давление, N1)
engine_params['egt_corrected'] = (
engine_params['egt_c'] - engine_params['oat_c'] * 0.95
- engine_params['altitude_ft'] * 0.002
)
# EGT margin trend за последние 50 циклов
recent_cycles = engine_params.tail(50)
x = np.arange(len(recent_cycles))
slope, intercept = np.polyfit(x, recent_cycles['egt_corrected'], 1)
# Тренд >0.5°C/цикл — признак деградации hot section
degradation_rate = slope # °C за цикл
return {
'egt_trend_per_cycle': round(degradation_rate, 3),
'current_margin_c': round(
engine_params['egt_limit_c'].iloc[-1] - engine_params['egt_corrected'].iloc[-1], 1
),
'alert': degradation_rate > 0.5,
'cycles_to_limit': (
int((engine_params['egt_limit_c'].iloc[-1] - engine_params['egt_corrected'].iloc[-1]) / degradation_rate)
if degradation_rate > 0 else None
)
}
NLP анализ ATC переговоров
Транскрипты переговоров — недооценённый источник предвестников. Типичные паттерны риска: нестандартные инструкции, переспрашивание clearance, переключение частот в критические фазы.
from transformers import pipeline
# Классификатор на дообученном авиационном корпусе
atc_safety_classifier = pipeline(
"text-classification",
model="aviation-safety/atc-risk-classifier-bert",
device=0
)
risk_patterns = [
"say again", # непонимание инструкции
"unable", # невозможность выполнения
"traffic alert", # TCAS
"go around", # уход на второй круг
"emergency",
"minimum fuel",
"expedite"
]
def analyze_atc_transcript(transcript: str) -> dict:
risk_keywords_found = [p for p in risk_patterns if p.lower() in transcript.lower()]
ml_result = atc_safety_classifier(transcript[:512])[0]
return {
'risk_keywords': risk_keywords_found,
'ml_risk_label': ml_result['label'],
'ml_risk_score': round(ml_result['score'], 3),
'requires_review': len(risk_keywords_found) > 0 or ml_result['label'] == 'HIGH_RISK'
}
Кейс: FOQA мониторинг парка из 24 воздушных судов
Авиакомпания-перевозчик, 24 самолёта B737NG/A320. До внедрения системы FOQA анализировали выборочно — 5% рейсов вручную. После автоматизации: 100% рейсов, 8 типов событий. За первые 3 месяца выявлено 340 нестабилизированных заходов (из них 38 — со значимыми отклонениями), 7 жёстких посадок выше порога инспекции, деградация EGT margin на двух двигателях предсказана за 60 циклов до плановой замены горячей секции. Система подняла один движок на внеплановое снятие — обнаружены трещины compressor blade.
Стек
| Слой | Технологии |
|---|---|
| Приём FDR/QAR | ARINC 717/767 парсеры, Python |
| Временные ряды | pandas, scipy, stumpy (matrix profile) |
| Аномалии двигателей | LSTM Autoencoder (PyTorch) |
| NLP переговоров | BERT fine-tuned на авиакорпусе |
| Хранение | TimescaleDB (временные ряды) |
| Дашборд | Grafana + кастомный React |
| Стандарты | ICAO Annex 6, EASA AMC20-29, IS-BAO |
Сроки: Базовый FOQA анализатор параметрических событий — 6-8 недель. Полный стек с NLP, предиктивным обслуживанием двигателей и дашбордом — 4-5 месяцев.







