8.2 故障注入原理
8.2.1 故障注入结构
- 故障注入结构如下图所示,故障生成UI只产生故障生成器的参数,并通过
UDP
协议发送给模型中的故障生成器,故障生成器接收到这些参数后便会产生响应的故障参数并传递给多旋翼模型。同时故障生成UI还具有故障收集的功能,模型会将飞行器状态信息发送给故障生成UI,故障生成UI将这些数据保存在文本文件中用于故障评估和分析。
8.2.2 故障导入方式
故障生成器与Simulink
模型交互的三种方式,如下表所示。
| 交互方式 | 可能问题 |
| --- | --- |
| 故障生成器实时运行,把数据实时发送给模型。发送数据包括参数是否更新,以及更新后的参数的具体值。 | 故障生成器与模型运行不同步,通信传输延迟 |
| 故障生成器与模型一起运行,故障配置软件只是发送故障的参数给模型。 | |
| 故障生成器离线产生整个仿真周期的模型参数,这些带有时间序列的模型参数作为输入驱动仿真模型运行。 | 故障生成器不能与模型交互,参数占用内存空间大。|
目前采用第二种方式。
8.2.3 故障分类
故障大体上可以分为两类,一类是通信故障,一类是数据故障。其中通信故障包括传感器供电异常、通信中断、GPS 搜星失败,传感器供电异常,传感器通信终断。故障生成器给一个故障触发信号。数据故障包括 IMU 数据冲激、IMU随机游走方差增大、转动惯量变化、磁力计尺度因子和常值偏移变化、磁场干扰、激光数据跳变、GPS 上电数据未收敛。为便于故障生成器设计,将上述故障整理成下表的形式。
最终这些故障都会被以数学表达式的形式在模型中体现,如表所示的陀螺仪故障和电机故障。故障经过数学模型建模之后,故障类型可以抽象成随机常值故障和初始值随机的线性变化两种,触发的方式采用在指定的时间触发指定的时长。
8.2.4 故障统一表现形式
- x 为可能出现故障的参数,x 的整个作用周期分为正常阶段和故障阶段,故障阶段的 x 值由故障函数决定。常见的故障如突变,渐变,见下图。
- 如故障函数用一次函数表示,即:
f(t) = x0(t0) + v*dt
。那么对每个异常区间需要的参数为:故障参数的初始值x0,i
,异常作用时间点Ti
,异常作用的时间dti
,异常参数的变化率vi
。M 函数如下
需要手动输入故障参数的初始值,异常作用时间点,异常作用的时间,异常参数的变化率。function y = param_gen(time_sim, timestamp, x, x_init, Ti, v, dt) %time_sim: 系统仿真总时间 %timestamp:时间戳 %x: 正常值 %x_init: 故障的初始值 %Ti: 故障发生的时刻 %v:故障参数的变化速率 %dt: 故障持续时间 persistent timestart if isempty(timestart) timestart = timestamp; end runtime = timestamp - timestart; N = length(x_init); if N ==1 ti_dt = dt; else for i = 1 : N if i ==N ti_dt = time_sim - Ti(N); else ti_dt = Ti(i + 1) - Ti(i); end if ti_dt < dt(i) fprintf('ti_dt: %.2f dt(%f): %.2f\n', ti_dt, i, dt(i)) error('dt error') end end end n = find(runtime <=Ti,1,'first'); if n ==1 %first one y = x; elseif isempty(n) %last one if runtime <= Ti(N) +dt(N) y = x_init(N) + (runtime - Ti(N))*v(N); else y = x; end else if runtime > Ti(n -1) +dt(n -1) y = x; else y = x_init(n -1) + (runtime - Ti(n -1))*v(n - 1); end end end
例. 手动生成一个三段故障
x = 1; %正常值
x_init = [1 1.2 0.2]; %故障初始值
ti = [0.2 0.5 0.9]; %故障作用时间点
v = [0.5 0 0.1]; %故障变化速率
dt = [0.2 0.25 0.08]; %故障作用时间
y = param_gen(runtime, x, x_init, ti, v, dt,
结果如图
8.2.5 故障生成UI
故障生成 UI 界面如图所示,主要包括三个部分。①是主体部分,用于实施修改故障参数值;②用于保存故障参数值并加载已有故障参数;③用于接收飞行器状态,便于故障评估。
8.2.6 故障生成器Simulink模型
详细例程见:
PX4PSP\RflySimAPIs\FaultInjectionAPI\RflySimDLL\MulticopterModel.slx
打开此例程如下图所示,其是由一个UDP接受模块、电池模块、电机模块、力和力矩模块、环境模块、传感器模块等主要模块组成。
关于具体的UDP发送细节,目前的Rflysim
支持 UDP 输入为 20 位float
型数据以及 8 位 int32
型数据。每个传感器的的故障单个发送,类型由 8 位 int32
型数据发送,具体数据值由 20位 float
型数据发送。