4. 惯性导航数据跳变的容错滤波处置

故障现象与判据

ROV在定深定向作业时,惯性导航组合(INS/DVL)输出的位置突然出现阶跃式跳变。典型表现为:DVL对底速度仍连续,但INS推算位置在1~2个控制周期内偏移数米,且与超短基线(USBL)声学定位、深度计、罗经航向出现明显不一致。此时不能直接采信INS位置,也不能立即中止作业,而应先做冗余交叉验证,判断是INS自身漂移、DVL失锁、USBL野值,还是推进器/机械臂动作引起的短时扰动。

判据可量化为:位置跳变量 Δp 超过阈值(例如 2.0 m/周期),同时检查三路冗余源的一致性残差。若DVL速度与INS速度残差小、USBL与INS位置残差大,则倾向INS积分异常;若DVL速度本身出现离群点,则优先怀疑DVL;若USBL残差大但DVL与INS一致,则可能是USBL多径或声学野值。

惯性导航跳变:冗余交叉验证 → 故障源判定 → 备用组合切换 INS 惯性导航 位置/速度/姿态 DVL 多普勒计程仪 对底速度 USBL 超短基线 绝对位置 深度计 + 罗经 深度/航向 冗余交叉验证 残差 r_INS-DVL 残差 r_INS-USBL 残差 r_DVL-USBL 跳变量 Δp 与阈值比较 航向/深度一致性 Δp > 2.0 m/周期 → 触发 INS 积分漂移 DVL一致 / USBL偏离 DVL 失锁/野值 速度残差离群 USBL 声学野值 多径/遮挡 短时扰动 机械臂/推进器动作 容错处置 隔离故障源 切换备用组合 DVL+USBL+深度 重置INS位置 降速/悬停复核 定位精度恢复 切换原则:先冻结INS位置更新,保留姿态与速度;用DVL对底速度+USBL绝对位置+深度/航向构成备用组合。 复核条件:连续3个周期残差回到阈值内,且USBL与DVL推算位置偏差 < 0.5 m,方可恢复INS主用。

容错滤波与备用组合切换

识别出故障源后,处置核心是“冻结—隔离—重构—复核”。首先冻结INS位置通道的更新,保留其姿态与角速度输出,避免跳变继续污染控制回路;随后根据判定结果隔离故障源。若判定为INS积分漂移,则用DVL对底速度积分配合USBL绝对位置做松组合,深度计与罗经提供约束;若判定为DVL失锁,则临时以USBL+INS姿态航位推算为主,并降低水平推进器增益;若为USBL野值,则对USBL做滑窗中值滤波并剔除离群点。

滤波层面可采用简化的一维卡尔曼或滑动中值+限幅组合:对位置残差设置门限,超限时用预测值替代观测值,避免阶跃直接进入控制器。下面给出一个可运行的位置跳变检测与备用组合切换的Python示例,输入为教学示例数据,输出为每周期采用的导航源与滤波后位置。

import numpy as np

# 教学示例数据:每周期 [INS位置x, INS位置y, DVL速度x, DVL速度y, USBL位置x, USBL位置y]
# 单位:m, m/s;dt = 0.5 s
dt = 0.5
data = np.array([
    [0.0, 0.0, 0.10, 0.02, 0.05, -0.01],
    [0.05, 0.01, 0.10, 0.02, 0.10, 0.00],
    [0.10, 0.02, 0.10, 0.02, 0.15, 0.01],
    [5.20, 0.03, 0.10, 0.02, 0.20, 0.02],   # INS 跳变
    [5.25, 0.04, 0.10, 0.02, 0.25, 0.03],
    [5.30, 0.05, 0.10, 0.02, 0.30, 0.04],
])

JUMP_TH = 2.0      # 位置跳变阈值 m/周期
RES_TH  = 0.8      # 残差一致性阈值 m

def detect_and_switch(data, dt):
    pos_est = data[0, 0:2].copy()
    prev_ins = data[0, 0:2].copy()
    results = []
    for k in range(1, len(data)):
        ins = data[k, 0:2]
        dvl_v = data[k, 2:4]
        usbl = data[k, 4:6]

        dp = np.linalg.norm(ins - prev_ins)
        pred = pos_est + dvl_v * dt
        r_ins_usbl = np.linalg.norm(ins - usbl)
        r_pred_usbl = np.linalg.norm(pred - usbl)

        if dp > JUMP_TH and r_ins_usbl > RES_TH and r_pred_usbl < RES_TH:
            source = "INS跳变→备用组合"
            pos_est = pred + 0.3 * (usbl - pred)   # 松组合修正
        elif dp > JUMP_TH:
            source = "跳变待复核→限幅"
            pos_est = pred
        else:
            source = "INS主用"
            pos_est = ins

        prev_ins = ins.copy()
        results.append((k, round(dp, 2), source, np.round(pos_est, 2)))
    return results

for r in detect_and_switch(data, dt):
    print(f"周期{r[0]} 跳变量={r[1]}m 采用={r[2]} 滤波位置={r[3]}")

示例输出(由给定输入直接推出):周期3跳变量约5.1 m,超过阈值且INS-USBL残差大、DVL预测-USBL残差小,判定为INS跳变,切换至备用组合;周期4、5继续用DVL速度积分并以USBL做松组合修正,位置平滑过渡,不再出现阶跃。实际作业中应结合ROV控制周期与USBL更新率调整门限,避免把正常机动误判为跳变。

切换备用组合后,建议将ROV置于悬停或低速定深状态,先观察3~5个控制周期,确认位置残差收敛再恢复作业;若USBL本身不可信,应优先依赖DVL+深度+航向的航位推算,并缩短复核间隔。
不要仅凭单次跳变就永久禁用INS;若跳变由机械臂动作或推进器瞬态引起,应在扰动结束后重新引入INS并做残差复核,防止误隔离导致长航时精度下降。