1. 课程导入

无人机从起飞到降落,每一秒都在产生数据。飞控以 50~400 Hz 的频率记录姿态、位置、速度、电机转速、电压电流,图传与遥控链路记录信号强度与丢包,任务载荷记录图像、点云与光谱。一架中型多旋翼单次 30 分钟飞行,原始日志往往达到数百 MB。这些数据如果只用于事后"看一眼曲线",价值极低;如果被系统化地采集、清洗、建模与分析,就能转化为故障预警、能耗优化、任务复盘与适航证据。本课程要讲的,正是把"飞行数据"变成"工程决策"的完整方法体系——无人机飞行数据智能分析工程。

一、学习目标:从数据到决策的四级能力

本课程不追求让每位学员都成为算法研究员,而是建立一条从数据到决策的完整能力链。学完后你应当具备四级能力:

  • 看得懂:能读懂 ArduPilot/PX4 的 bin、tlog、ulg 日志,理解字段含义、单位、采样率与坐标系。
  • 理得清:能对原始数据进行时间对齐、重采样、去噪、异常剔除与特征提取,形成可分析的数据集。
  • 算得准:能针对振动、电池衰减、姿态跟踪、航迹偏差等问题选择合适的统计、信号处理或机器学习方法。
  • 用得上:能把分析结果落到健康评估、故障诊断、能耗预测、任务复盘等具体工程场景,并给出可执行结论。
核心判断标准只有一条:分析结论能否改变一次飞行决策——是否提前更换电池、是否调整 PID、是否限制某段航线、是否触发返航。不能影响决策的分析,只是数据装饰。

二、核心概念:五个必须建立的心智模型

在动手写代码之前,先建立五个概念模型,它们贯穿全课程。

  1. 飞行数据是时间序列,不是表格。同一时刻的姿态、位置、电机、电压是耦合的,分析必须保持时间轴一致,跨传感器对齐是第一步。
  2. 采样率决定分析上限。用 10 Hz 的 GPS 数据去分析 100 Hz 的振动,物理上不可能,混叠会制造假故障。
  3. 坐标系是隐形陷阱。机体坐标系(FRD/FLU)、NED、ENU、地理坐标之间的转换错误,会让"航迹偏移"变成伪命题。
  4. 正常与异常的边界来自基线。没有健康基线,就无法定义异常;基线来自同机型、同载荷、同工况的历史统计。
  5. 智能分析 = 特征工程 + 模型 + 工程约束。模型精度再高,若推理延迟超过飞控周期,也无法上机实时使用。

三、整体框架:从原始日志到工程结论的数据流

本课程的整体框架可以概括为"采集—治理—分析—应用"四层数据流,下图给出各层的关键对象、典型工具与输出物,帮助你在后续章节中始终知道"当前处在哪一层"。

飞行数据智能分析四层数据流 ① 采集层 飞控日志 bin / ulg 遥控链路 tlog 载荷图像 / 点云 机载传感器遥测 输出:原始数据包 ② 治理层 时间对齐 / 重采样 去噪 / 异常剔除 坐标统一 / 单位换算 特征提取与标注 输出:分析数据集 ③ 分析层 统计分析 / 频谱分析 状态估计 / 卡尔曼滤波 机器学习 / 深度学习 健康评估 / 故障诊断 输出:指标与模型 ④ 应用层 故障预警 能耗优化 任务复盘 适航证据 输出:工程决策 模型迭代 / 基线更新反馈 贯穿全流程的关键要素 时间同步与坐标系 对齐是一切分析前提 采样率与频域边界 决定可分析频段 健康基线与阈值 异常判定的参照系 工程约束与实时性 决定能否上机部署 数据自左向右流动,结论自右向左反馈,形成闭环

四、典型应用场景与工具链

框架落到工程中,会表现为若干高频场景。下表列出本课程重点覆盖的场景、输入数据、核心方法与交付物,你可以把它当作学习地图。

应用场景 主要输入数据 核心方法 交付物
振动与机械健康 IMU 三轴加速度、电机转速 FFT、阶次分析、包络谱 振动频谱报告、轴承预警
电池衰减评估 电压、电流、剩余电量、温度 内阻估计、容量回归 健康度 SOH、更换建议
姿态跟踪性能 期望姿态、实际姿态、PID 输出 阶跃响应、频响辨识 PID 调参建议
航迹偏差分析 GPS、IMU、规划航线 坐标转换、误差统计 偏差热力图、航线修正
能耗与航时预测 电流、速度、风场、载荷 回归、时序预测 剩余航时估计
异常飞行检测 全量遥测时序 孤立森林、自编码器 异常片段与置信度

工具链方面,本课程以 Python 生态为主:pymavlink、pyulog、pandas、numpy、scipy、scikit-learn,可视化使用 matplotlib 与 plotly。一个最小的日志读取与字段查看示例如下:

from pyulog import ULog
import pandas as pd

ulog = ULog("flight_20240512.ulg")
for d in ulog.data_list:
    print(d.name, d.multi_id, len(d.data["timestamp"]))

# 提取姿态数据为 DataFrame
att = ulog.get_dataset("vehicle_attitude").data
df = pd.DataFrame({
    "t": att["timestamp"] / 1e6,      # 微秒转秒
    "roll": att["roll"],
    "pitch": att["pitch"],
    "yaw": att["yaw"],
})
print(df.describe())
建议从第一天起就建立"数据字典"习惯:为每个字段记录来源、单位、采样率、坐标系与物理含义。后续所有分析都依赖这份字典,它比任何模型都更能节省你的时间。

五、常见误区与复盘要点

初学者最容易在四个地方翻车,提前知道可以少走弯路。

  • 误区一:拿到数据直接建模。跳过时间对齐与坐标统一,模型学到的可能是采样偏差而非物理规律。
  • 误区二:用低频数据下高频结论。10 Hz 日志无法支撑 100 Hz 振动诊断,混叠会把 80 Hz 振动伪装成 20 Hz。
  • 误区三:把相关性当因果。电流升高与振动增大同时出现,可能是机动动作导致,而非电机故障。
  • 误区四:忽视工程约束。离线精度 99% 的模型,若单次推理 200 ms,就无法用于 400 Hz 飞控回路。
复盘时请固定回答三个问题:数据是否可信?方法是否匹配采样率与坐标系?结论能否转化为一次具体飞行决策?三问缺一,分析就不算完成。