4. 深度计跳变引起高度通道发散的故障排查
故障现象与排查思路
某水下航行器在定深航行阶段,组合导航高度通道出现缓慢发散:深度显示值在约 12 s 内从 50.2 m 漂移到 56 m 以上,同时高度通道卡尔曼滤波的新息(残差)持续偏大。回放原始日志发现,深度计输出在某一时刻出现约 3.5 m 的阶跃跳变,随后又缓慢回落,而惯性高度解算本身并无对应变化。这说明发散并非惯导漂移,而是深度计异常跳变被滤波通道放大所致。
排查的核心是把"跳变来源"与"滤波响应"分开看:先用数据回放确认跳变是单点毛刺、阶跃还是斜坡;再用残差序列判断滤波器是否已把异常量当作真实观测吸收;最后通过限幅与故障检测逻辑阻断异常观测进入高度通道。
数据回放与残差定位
回放时按以下顺序核对,避免把滤波发散误判为传感器故障:
- 对齐时间戳:将深度计原始帧、惯导高度解算、组合导航输出按同一时基对齐,确认跳变发生时刻与高度通道开始发散的时刻是否一致(本例相差约 0.2 s,属同一事件)。
- 计算新息序列:新息
ν = z_depth − h_pred,其中h_pred为滤波器一步预测高度。正常航行时 |ν| 应在 3σ 内(本例 σ≈0.8 m)。跳变时刻 ν 突增至约 3.4 m,明显越界。 - 区分跳变形态:单点毛刺表现为单帧越界后立即恢复;阶跃表现为持续多帧的偏置;斜坡表现为新息缓慢单调增大。本例为持续约 12 s 的阶跃,指向深度计本身或压力接口异常,而非瞬时干扰。
- 交叉验证:用惯导高度与深度计做差,若差值曲线与跳变曲线同形,则确认异常来自深度计侧;若惯导侧也有对应变化,则需怀疑高度通道状态估计本身。
限幅与故障检测逻辑设计
定位到阶跃来源后,在深度观测进入滤波前增加两级保护:
// 深度观测预处理(示例参数,按实际量程与噪声水平调整)
const double MAX_STEP = 1.0; // 单周期最大允许变化量 (m)
const double SIGMA = 0.8; // 新息标准差估计 (m)
const double GATE_K = 3.0; // 3σ 门限
const int FAULT_CNT = 3; // 连续越界帧数判故障
double depth_prev = 50.2; // 上一有效深度
int over_cnt = 0;
bool depth_fault = false;
double preprocess_depth(double z_raw, double h_pred) {
// 1) 限幅:抑制阶跃跳变
double z = z_raw;
if (fabs(z - depth_prev) > MAX_STEP) {
z = depth_prev + (z > depth_prev ? MAX_STEP : -MAX_STEP);
}
// 2) 新息门限检测
double nu = z - h_pred;
if (fabs(nu) > GATE_K * SIGMA) {
if (++over_cnt >= FAULT_CNT) depth_fault = true;
} else {
over_cnt = 0;
}
// 3) 故障时隔离观测,仅用惯性高度保持
if (depth_fault) return h_pred;
depth_prev = z;
return z;
}
限幅的作用是防止单帧大跳变直接污染状态估计;故障检测的作用是在跳变持续存在时主动隔离观测,避免滤波器把异常值当作真实深度逐步吸收。两者配合后,高度通道在跳变期间由惯性高度保持,跳变消失且连续 3 帧新息恢复正常后可解除隔离。
限幅阈值不宜过小:若航行器存在真实快速变深(如紧急下潜),过小的 MAX_STEP 会把真实机动误判为故障。建议按最大设计下潜速率 × 滤波周期再留 1.5~2 倍余量确定。
验证与判读
| 检查项 | 正常判据 | 本例回放结果 |
|---|---|---|
| 跳变期间新息 | 被限幅后 |ν| ≤ 3σ | 限幅后最大 2.1 m,未触发隔离 |
| 高度通道输出 | 不发散,偏差 < 1 m | 深度保持 50.2±0.6 m |
| 故障标记 | 持续阶跃时置位 | 第 3 帧越界后置位,回落 3 帧后清除 |
| 隔离期间高度源 | 切换为惯性高度 | 切换平滑,无二次跳变 |
验证时还应做一次反向测试:人为注入 2 m 单帧毛刺,确认限幅生效但故障标记不置位(因未连续越界),以此区分"抑制"与"隔离"两级逻辑的边界。