4、传感器故障注入(一):IMU(加速度计/陀螺仪)故障注入——偏置、漂移、卡死、噪声增大

各位同学,今天咱们来聊聊飞控仿真里最核心的一环——IMU故障注入。

说实话,IMU这东西,我做了十年飞控,它出过的幺蛾子比任何传感器都多。加速度计和陀螺仪一旦抽风,飞控基本就瞎了。所以,学会怎么给IMU注入故障,是每个飞控工程师的必修课。

4.1 为什么要搞IMU故障注入?

你想想看,一架无人机在天上飞,IMU就是它的“内耳”和“平衡感”。一旦IMU数据不准,飞控就会做出错误判断。轻则姿态抖动,重则直接炸机。

我遇到过最离谱的一次,是某款飞控在低温环境下,陀螺仪零偏慢慢变大,飞控却浑然不知。结果飞机在空中慢慢自旋,最后失控坠毁。事后分析,就是缺了故障注入测试这一环。

所以,咱们得主动给IMU“下毒”,看看飞控能不能扛得住。

核心故障类型:偏置、漂移、卡死、噪声增大。这四种故障,基本覆盖了IMU 90%以上的真实失效模式。

4.2 四种故障的数学模型

做仿真,首先得把故障用数学描述清楚。我习惯用下面这套模型,简单直接。

4.2.1 偏置(Bias)

说白了,就是测量值整体加了一个固定值。比如加速度计在静止时,Z轴应该输出1g,结果变成了1.2g。

// 偏置注入
measured_acc = true_acc + bias_acc;
measured_gyro = true_gyro + bias_gyro;

偏置是最常见的故障。我见过不少廉价IMU,上电后零偏能飘到0.5度/秒,飞控要是没做在线校准,基本没法飞。

4.2.2 漂移(Drift)

漂移比偏置更阴险。它不是固定的,而是随时间慢慢变化。就像温水煮青蛙,飞控很难察觉。

// 漂移注入
drift_rate = 0.01; // 每秒增加0.01
measured_gyro = true_gyro + drift_rate * time;

嗯,这里要注意。漂移的速率不能设得太快,否则飞控的故障检测机制会立刻触发。我一般设成0.001到0.01之间,模拟真实的热漂移。

4.2.3 卡死(Stuck)

卡死就是传感器输出值突然不动了,一直保持某个值。这通常意味着硬件损坏或通信中断。

// 卡死注入
if (stuck_flag) {
    measured_acc = stuck_value; // 保持最后时刻的值
}

卡死是最致命的故障。我曾在测试中故意卡死陀螺仪的Z轴,结果飞控在1秒内就失去了航向,开始乱转。

4.2.4 噪声增大(Noise Increase)

噪声增大,就是测量值变得“毛躁”。飞控的滤波器如果设计得不好,会被噪声带偏。

// 噪声增大注入
noise_std = 0.1; // 正常噪声标准差
injected_noise_std = 0.5; // 注入后的噪声标准差
measured_acc = true_acc + gaussian_noise(0, injected_noise_std);

我习惯把噪声增大分成三档:轻度(2倍)、中度(5倍)、重度(10倍)。轻度噪声,好的滤波器还能扛住;重度噪声,基本只能靠硬件冗余了。

4.3 故障注入的时机与策略

光有数学模型还不够,什么时候注入、注入多久,都有讲究。

  • 起飞前注入:模拟传感器上电异常。比如偏置过大,看看飞控的初始化校准能不能识别出来。
  • 悬停时注入:模拟飞行中的突发故障。我最喜欢在悬停5秒后注入漂移,看看飞控的在线估计能不能跟上。
  • 机动飞行时注入:模拟大过载下的传感器失效。比如在急转弯时注入卡死,考验飞控的容错能力。
我的个人习惯:每次测试只注入一种故障,先摸清飞控对单一故障的响应。等单一故障都通过了,再搞组合故障注入。别一上来就搞复合故障,否则出了问题你根本不知道是哪个环节崩了。

4.4 仿真测试流程

下面这张图,是我做IMU故障注入测试的标准流程。你照着走,基本不会漏掉关键环节。

IMU故障注入测试流程 1. 配置故障参数 2. 启动仿真模型 3. 注入故障信号 4. 记录飞控响应 5. 分析数据曲线 6. 生成测试报告 故障未检出?返回步骤3调整参数 通过?

这个流程我用了好几年,核心思想就是:先注入,再观察,最后分析。别跳过任何一步。

4.5 实战:用Python注入加速度计偏置

光说不练假把式。下面我写个简单的Python脚本,演示怎么给加速度计注入偏置故障。

import numpy as np
import matplotlib.pyplot as plt

# 模拟真实加速度数据(假设飞机悬停,Z轴为1g)
time = np.linspace(0, 10, 1000)
true_acc = np.zeros((1000, 3))
true_acc[:, 2] = 1.0  # Z轴1g

# 注入偏置:X轴偏置0.2g,Y轴偏置-0.1g
bias = np.array([0.2, -0.1, 0.0])
measured_acc = true_acc + bias

# 绘制对比
plt.figure(figsize=(10, 6))
plt.plot(time, true_acc[:, 0], 'b--', label='真实X轴')
plt.plot(time, measured_acc[:, 0], 'r-', label='测量X轴(含偏置)')
plt.xlabel('时间 (s)')
plt.ylabel('加速度 (g)')
plt.title('加速度计偏置注入效果')
plt.legend()
plt.grid(True)
plt.show()

你看,代码很简单。但实际测试时,偏置值怎么选?我一般参考IMU数据手册里的零偏稳定性指标。比如手册说零偏稳定性是0.01g,那我注入的偏置至少是0.05g,看看飞控能不能容忍5倍于规格书的偏差。

4.6 避坑指南

做IMU故障注入,有几个坑我踩过,你们别重蹈覆辙。

我曾经犯过的错:
  • 故障注入太猛:一上来就注入10倍于正常值的偏置,结果飞控直接保护性停机。后来才明白,故障注入要循序渐进,先轻度、再中度、最后重度。
  • 忽略时间尺度:漂移故障的注入时间太短,飞控的滤波器还没反应过来就结束了。我后来规定,漂移注入至少持续5秒以上。
  • 忘记记录基准数据:有一次测试完,发现数据异常,但因为没有记录无故障时的基准数据,根本没法对比。现在我的测试脚本都会先跑一段无故障数据作为基线。

4.7 小结

IMU故障注入,说白了就是给飞控“找茬”。偏置、漂移、卡死、噪声增大,这四种故障模式,你都得练熟。

我个人建议,初学者先从偏置和噪声增大入手,这两个比较容易理解。等熟练了,再挑战漂移和卡死。记住,测试的目的不是把飞控搞崩溃,而是找到它的边界在哪里。

一个小技巧:做故障注入测试时,把飞控的日志记录频率调高到200Hz以上。这样故障注入前后的数据变化,你才能看得清清楚楚。100Hz的日志,有时候会漏掉关键细节。

专注资料整理