3. 任务数据预处理

无人机集群在完成一次编队飞行或区域侦察任务后,各机载飞控、导航模块、任务载荷会分别记录自己的日志。这些日志汇总到地面站时,往往呈现出"多源、异步、异构"的特点:不同机型采样率不同,GPS 与 IMU 时间戳基准不同,个别架次存在丢包或传感器异常。若直接把这些原始数据送入航迹分析或任务评估模型,得到的结论很可能被脏数据带偏。因此,任务数据预处理是集群数据分析链条中不可跳过的一环,它要解决的核心问题可以概括为四件事:补全缺失、抑制噪声、对齐时间、统一坐标,最后再通过一次完整的数据清洗把结果固化下来。

缺失值处理:先判断"为什么缺",再决定"怎么补"

集群日志中的缺失通常分三类。第一类是随机丢包,例如某架无人机的遥测链路短暂中断,导致连续几帧位置数据为空;第二类是传感器失效,如磁力计受干扰后输出恒定值或空值;第三类是结构性缺失,例如某架次根本没有挂载红外载荷,对应字段整列为空。三类缺失的处理策略完全不同:随机丢包适合插值,传感器失效需要标记为无效而非强行填补,结构性缺失则应整列剔除或单独建模。

以位置数据为例,假设某机在 t=12.0s 到 t=12.4s 之间丢失了 5 帧 GPS 经纬度,采样周期为 0.1s。对于这种短时、连续、变化平滑的缺失,线性插值即可满足要求:

# 示例:对单机经纬度做线性插值(pandas)
df = df.set_index('timestamp').sort_index()
df[['lat', 'lon', 'alt']] = df[['lat', 'lon', 'alt']].interpolate(
    method='linear', limit=5, limit_direction='both')
# limit=5 表示最多连续插补 5 帧,超过则保留 NaN 并标记为无效段
df['gap_flag'] = df['lat'].isna().astype(int)

这里的关键参数是 limit。如果缺失跨度超过 5 帧(0.5s),在高速机动场景下线性插值会明显偏离真实航迹,此时更稳妥的做法是保留空值并打上 gap_flag,让后续分析模块自行决定是否跳过该段。对于高度这类变化较慢的量,也可以采用前向填充 ffill,但必须同时记录填充标记,避免把"补出来的值"当成实测值使用。

噪声过滤:区分高频抖动与真实机动

无人机的位置、速度、姿态数据普遍带有高频噪声,来源包括 GPS 多路径效应、IMU 零偏、气流扰动等。噪声过滤的难点不在于"滤掉波动",而在于不能把真实的机动动作一起滤掉。一架无人机在 1s 内完成 30° 转向,这是真实机动;而位置在 0.1s 内跳动 2m,则更可能是噪声。

工程上常用两类方法。其一是滑动平均,实现简单,适合对实时性要求高、机动不剧烈的场景:

# 示例:5 帧滑动平均,窗口对应 0.5s
df['lat_smooth'] = df['lat'].rolling(window=5, center=True, min_periods=1).mean()

其二是低通滤波,如一阶巴特沃斯或卡尔曼滤波,能更好地保留机动响应。以速度信号为例,若采样率 10Hz,截止频率设为 1Hz,则一阶低通离散形式为:

alpha = dt / (RC + dt)          # dt=0.1s, RC=1/(2*pi*fc)
v_filt[k] = alpha * v[k] + (1 - alpha) * v_filt[k-1]

选择截止频率时,应参考任务中无人机的最大机动频率。若编队飞行以平稳巡航为主,1Hz 足够;若包含快速避障,则需提高到 2~3Hz,否则会把真实加速度削平。过滤后建议对比原始与滤波曲线的残差,若残差在机动段明显增大,说明截止频率偏低,需要回调。

时间同步:把"各说各话"的时钟拉到同一基准

集群中每架无人机都有自己的本地时钟,GPS 秒脉冲、飞控晶振、载荷触发时刻之间可能存在几十毫秒到数秒的偏差。时间同步的目标是把所有记录统一到同一时间基准,通常选择 GPS 时间或地面站接收时间作为主时钟。

同步分两步。第一步是时钟偏差估计:利用各机 GPS 时间戳与本地时间戳的差值,拟合出偏移量和漂移率。第二步是时间重采样:把不同采样率的序列统一到同一时间网格上,例如统一为 10Hz。对于位置这类连续量,重采样用插值;对于事件标记(如"开始拍照"),则用最近邻匹配,避免插值产生不存在的事件时刻。

# 示例:将各机数据统一到 10Hz 公共时间轴
t_common = np.arange(t_start, t_end, 0.1)
df_sync = df.set_index('gps_time').reindex(
    df.index.union(t_common)).interpolate().reindex(t_common)

同步完成后,务必检查同一时刻各机之间的相对位置是否连续。如果某架无人机在同步后出现"瞬移",多半是时钟偏差估计错误或插值跨越了缺失段,需要回到上一步重新处理。

坐标对齐:从各自经纬高到统一局部坐标系

各机 GPS 给出的是 WGS-84 经纬高,而编队间距、相对速度等分析更适合在局部平面坐标系中进行。常用做法是选取任务区域中心作为原点,建立东-北-天(ENU)局部坐标系:X 轴指向东,Y 轴指向北,Z 轴指向天。这样,任意一点的 ENU 坐标可由其经纬高与原点经纬高换算得到。

需要特别注意的是航向角的参照约定。本文及后续图示统一采用:航向角以正北为 0°,顺时针为正,范围 0°~360°。若原始日志使用"以正东为 0°、逆时针为正"的约定,必须先转换再进入后续分析,否则编队朝向分析会整体旋转 90°。

# 示例:经纬高转 ENU(简化平面近似)
dx = (lon - lon0) * 111320 * cos(radians(lat0))   # 东向
dy = (lat - lat0) * 110540                         # 北向
dz = alt - alt0                                    # 天向

坐标对齐后,还应检查各机轨迹是否落在合理范围内。例如编队间距设计为 50m,若对齐后出现 500m 的异常间距,通常是某架无人机的经纬度单位或符号出错,需要逐架核对原始字段。

数据清洗实战:一次完整的处理闭环

把上述步骤串起来,一次典型的集群任务数据清洗流程如下:先按架次分组,剔除结构性缺失字段;再对位置、速度做缺失标记与短段插值;随后进行噪声过滤并对比残差;接着估计各机时钟偏差,统一重采样到 10Hz;最后转换到 ENU 坐标系,输出带质量标记的清洗数据集。整个过程中,每一步都应保留中间结果和标记字段,便于回溯。

集群任务数据预处理流程与质量标记 原始多源日志 飞控 / GPS / IMU 载荷事件记录 ① 缺失值处理 短段插值 limit≤5 长段保留 + gap_flag ② 噪声过滤 滑动平均 / 低通 截止频率 1~3Hz ③ 时间同步 偏差估计 + 重采样 统一 10Hz 时间轴 ④ 坐标对齐 WGS-84 → ENU 航向:北为0° 顺时针 ⑤ 数据清洗输出 质量标记字段 清洗数据集 质量校验 间距 / 连续性检查 异常回溯重处理 校验不通过则回溯 关键参数与判断依据 插值上限 limit=5 帧(0.5s):超过则保留空值并标记 gap_flag,避免高速机动段失真 低通截止频率 1~3Hz:平稳巡航取 1Hz,快速避障取 2~3Hz,以残差在机动段是否突增为回调依据 时间同步:以 GPS 时间为主时钟,位置量插值重采样,事件标记用最近邻匹配 坐标对齐:ENU 局部坐标系,航向角以正北为 0°、顺时针为正,全文统一

清洗完成后,建议输出一份质量摘要,记录每架次的有效帧比例、插值帧数、滤波前后残差均值、时钟偏差估计值以及坐标转换后的最大间距。这些指标既是本次清洗的验收依据,也是后续航迹分析、任务评估的输入质量说明。只有把预处理做扎实,集群任务数据分析的结论才站得住脚。