4、传感器故障注入(一):IMU(加速度计/陀螺仪)故障注入——偏置、漂移、卡死、噪声增大
各位同学,今天咱们来聊聊飞控仿真里最核心的一环——IMU故障注入。
说实话,IMU这东西,我做了十年飞控,它出过的幺蛾子比任何传感器都多。加速度计和陀螺仪一旦抽风,飞控基本就瞎了。所以,学会怎么给IMU注入故障,是每个飞控工程师的必修课。
4.1 为什么要搞IMU故障注入?
你想想看,一架无人机在天上飞,IMU就是它的“内耳”和“平衡感”。一旦IMU数据不准,飞控就会做出错误判断。轻则姿态抖动,重则直接炸机。
我遇到过最离谱的一次,是某款飞控在低温环境下,陀螺仪零偏慢慢变大,飞控却浑然不知。结果飞机在空中慢慢自旋,最后失控坠毁。事后分析,就是缺了故障注入测试这一环。
所以,咱们得主动给IMU“下毒”,看看飞控能不能扛得住。
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故障注入测试的标准流程。你照着走,基本不会漏掉关键环节。
这个流程我用了好几年,核心思想就是:先注入,再观察,最后分析。别跳过任何一步。
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故障注入,说白了就是给飞控“找茬”。偏置、漂移、卡死、噪声增大,这四种故障模式,你都得练熟。
我个人建议,初学者先从偏置和噪声增大入手,这两个比较容易理解。等熟练了,再挑战漂移和卡死。记住,测试的目的不是把飞控搞崩溃,而是找到它的边界在哪里。