3. 前轮转角传感器故障诊断
任务定义
本案例针对SBW线控转向系统中前轮转角传感器可能发生的故障,设计并实现基于残差的故障检测与隔离(FDI)算法。系统包含两个前轮转角传感器(主传感器与冗余传感器),目标是通过比较两传感器测量值与基于车辆动力学模型的估计值,生成残差信号,从而检测传感器是否发生故障,并隔离出具体故障传感器。仿真验证将模拟正常工况、主传感器故障和冗余传感器故障三种场景,验证算法的检测与隔离能力。
系统模型与残差生成
前轮转角传感器测量模型可表示为:
θ_m1 = θ_actual + f1 + n1(主传感器)
θ_m2 = θ_actual + f2 + n2(冗余传感器)
其中θ_actual为实际前轮转角,f为故障信号(正常时为0),n为测量噪声。基于车辆二自由度动力学模型,前轮转角可通过横摆角速度γ和侧向加速度a_y进行估计:
θ_est = (m·a_y·L_f) / (C_f·(L_f+L_r)) + (I_z·γ̇) / (C_f·(L_f+L_r)) + (L_f·γ) / v_x
其中m为整车质量,L_f、L_r为质心到前后轴距离,C_f为前轮侧偏刚度,I_z为横摆转动惯量,v_x为纵向车速。残差定义为:
r1 = θ_m1 - θ_est,r2 = θ_m2 - θ_est,r12 = θ_m1 - θ_m2
故障检测与隔离逻辑
设定阈值τ(考虑噪声和模型不确定性)。当|r1|>τ且|r2|≤τ时,判定主传感器故障;当|r2|>τ且|r1|≤τ时,判定冗余传感器故障;当|r1|>τ且|r2|>τ时,需结合r12判断——若|r12|≤2τ,则可能是实际转角突变(非传感器故障),否则判定两传感器同时故障。正常工况下所有残差均小于阈值。
Python仿真实现
import numpy as np
import matplotlib.pyplot as plt
# 车辆参数
m = 1500.0 # 整车质量 kg
L_f = 1.2 # 质心到前轴距离 m
L_r = 1.4 # 质心到后轴距离 m
C_f = 80000.0 # 前轮侧偏刚度 N/rad
I_z = 2500.0 # 横摆转动惯量 kg·m^2
v_x = 20.0 # 纵向车速 m/s
# 仿真参数
dt = 0.01
t_end = 10.0
t = np.arange(0, t_end, dt)
n = len(t)
# 实际前轮转角(正弦输入)
theta_actual = 0.1 * np.sin(0.5 * t)
# 计算横摆角速度和侧向加速度(简化车辆模型响应)
gamma = (v_x / (L_f + L_r)) * theta_actual # 稳态横摆角速度
gamma_dot = np.gradient(gamma, dt) # 横摆角加速度
a_y = v_x * gamma # 侧向加速度
# 基于模型的转角估计
theta_est = (m * a_y * L_f) / (C_f * (L_f + L_r)) + \
(I_z * gamma_dot) / (C_f * (L_f + L_r)) + \
(L_f * gamma) / v_x
# 传感器测量生成
np.random.seed(42)
noise_std = 0.002 # 噪声标准差 rad
n1 = np.random.normal(0, noise_std, n)
n2 = np.random.normal(0, noise_std, n)
# 故障注入(3~5秒主传感器故障,7~9秒冗余传感器故障)
f1 = np.zeros(n)
f2 = np.zeros(n)
f1[(t >= 3) & (t <= 5)] = 0.03 # 主传感器偏置故障
f2[(t >= 7) & (t <= 9)] = -0.025 # 冗余传感器偏置故障
theta_m1 = theta_actual + f1 + n1
theta_m2 = theta_actual + f2 + n2
# 残差计算
r1 = theta_m1 - theta_est
r2 = theta_m2 - theta_est
r12 = theta_m1 - theta_m2
# 故障检测与隔离
tau = 0.008 # 阈值 rad
fault_status = np.zeros(n, dtype=int) # 0:正常 1:主传感器故障 2:冗余传感器故障 3:双传感器故障
for i in range(n):
if abs(r1[i]) > tau and abs(r2[i]) <= tau:
fault_status[i] = 1
elif abs(r2[i]) > tau and abs(r1[i]) <= tau:
fault_status[i] = 2
elif abs(r1[i]) > tau and abs(r2[i]) > tau:
if abs(r12[i]) <= 2 * tau:
fault_status[i] = 0 # 实际转角突变
else:
fault_status[i] = 3
else:
fault_status[i] = 0
# 输出诊断结果
print("=== 故障诊断结果 ===")
for start_time in [0, 3, 7]:
idx = int(start_time / dt)
status = fault_status[idx]
status_name = ["正常", "主传感器故障", "冗余传感器故障", "双传感器故障"][status]
print(f"t={start_time}s 时刻诊断状态: {status_name}")
# 绘图
fig, axes = plt.subplots(3, 1, figsize=(10, 8))
axes[0].plot(t, r1, label='r1 (主传感器残差)')
axes[0].plot(t, r2, label='r2 (冗余传感器残差)')
axes[0].axhline(y=tau, color='r', linestyle='--', label='阈值 ±τ')
axes[0].axhline(y=-tau, color='r', linestyle='--')
axes[0].set_ylabel('残差 (rad)')
axes[0].legend()
axes[0].grid(True)
axes[1].plot(t, theta_m1, label='主传感器')
axes[1].plot(t, theta_m2, label='冗余传感器')
axes[1].plot(t, theta_actual, 'k--', label='实际转角')
axes[1].set_ylabel('转角 (rad)')
axes[1].legend()
axes[1].grid(True)
axes[2].plot(t, fault_status)
axes[2].set_yticks([0, 1, 2, 3])
axes[2].set_yticklabels(['正常', '主故障', '冗余故障', '双故障'])
axes[2].set_ylabel('诊断状态')
axes[2].set_xlabel('时间 (s)')
axes[2].grid(True)
plt.tight_layout()
plt.savefig('fault_diagnosis_result.png', dpi=100)
plt.show()
运行与验证
运行方式:将上述代码保存为fault_diagnosis.py,在安装了NumPy和Matplotlib的Python环境中执行python fault_diagnosis.py。
验证方法:观察控制台输出的三个时刻诊断状态,以及生成的fault_diagnosis_result.png图像。图像中第一子图显示残差曲线与阈值线,第二子图显示传感器测量值与实际值对比,第三子图显示诊断状态随时间变化。
判定标准:
- t=0s时输出“正常”,残差曲线在阈值范围内;
- t=3s时输出“主传感器故障”,此时r1超过阈值而r2正常;
- t=7s时输出“冗余传感器故障”,此时r2超过阈值而r1正常;
- 第三子图在3~5秒区间显示状态1,在7~9秒区间显示状态2,其余时间显示状态0。
预期输出
根据代码逻辑和注入的故障,可确定性推出以下预期输出:
=== 故障诊断结果 ===
t=0s 时刻诊断状态: 正常
t=3s 时刻诊断状态: 主传感器故障
t=7s 时刻诊断状态: 冗余传感器故障
仿真图像中,残差子图在3~5秒期间r1明显超过阈值线,在7~9秒期间r2明显超过阈值线;诊断状态子图在对应时间段显示相应故障代码。该算法通过解析冗余与模型冗余相结合的方式,实现了对前轮转角传感器故障的有效检测与隔离。