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° за швидкостей |
Алгоритм аналізу параметричних даних польоту
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 місяців.







