3. 方向盘扭矩传感器信号采集与预处理
任务定义
线控转向系统中,前轮转角传感器是反馈闭环的关键元件。本案例实现一个针对前轮转角传感器的故障诊断与容错模块:实时读取传感器测量值,检测卡死(信号恒定)、偏置(信号偏移)和噪声过大(方差超限)三类典型故障;当故障发生时,利用车辆运动学模型(基于车速与方向盘转角)估算前轮转角作为容错值,并输出故障标志与容错切换后的转角信号。
故障诊断与容错实现
import numpy as np
from collections import deque
class SteeringAngleFDI:
def __init__(self, dt=0.01, window_size=50, steer_ratio=15.0):
self.dt = dt
self.window_size = window_size
self.steer_ratio = steer_ratio # 方向盘转角 / 前轮转角
self.buffer = deque(maxlen=window_size)
self.prev_value = None
self.fault_type = 0 # 0:正常 1:卡死 2:偏置 3:噪声过大
self.fault_detected = False
self.estimated_angle = 0.0
def _check_stuck(self, value):
"""卡死检测:连续窗口内信号变化量小于阈值"""
if len(self.buffer) < self.window_size:
return False
arr = np.array(self.buffer)
return (np.max(arr) - np.min(arr)) < 0.02 # 变化量小于0.02rad
def _check_bias(self, value, vehicle_speed, steering_wheel_angle):
"""偏置检测:与模型估计值偏差超过阈值"""
if vehicle_speed < 0.5: # 低速时不进行偏置判断
return False
model_angle = steering_wheel_angle / self.steer_ratio
return abs(value - model_angle) > 0.15 # 偏差超过0.15rad
def _check_noise(self, value):
"""噪声检测:窗口内方差超过阈值"""
if len(self.buffer) < self.window_size:
return False
arr = np.array(self.buffer)
return np.var(arr) > 0.01 # 方差超过0.01 rad^2
def estimate_from_model(self, vehicle_speed, steering_wheel_angle):
"""基于运动学模型的容错估计"""
if vehicle_speed < 0.5:
# 低速时使用方向盘转角映射
return steering_wheel_angle / self.steer_ratio
else:
# 中高速时考虑不足转向梯度
# 此处简化为线性映射,实际可加入K系数
return steering_wheel_angle / self.steer_ratio
def process(self, sensor_value, vehicle_speed, steering_wheel_angle):
"""
处理单个采样周期
返回: (容错后的前轮转角, 故障类型, 是否发生故障)
"""
self.buffer.append(sensor_value)
# 1. 故障检测
stuck = self._check_stuck(sensor_value)
bias = self._check_bias(sensor_value, vehicle_speed, steering_wheel_angle)
noise = self._check_noise(sensor_value)
if stuck:
self.fault_type = 1
self.fault_detected = True
elif bias:
self.fault_type = 2
self.fault_detected = True
elif noise:
self.fault_type = 3
self.fault_detected = True
else:
self.fault_type = 0
self.fault_detected = False
# 2. 容错处理
if self.fault_detected:
# 故障时使用模型估计值
self.estimated_angle = self.estimate_from_model(
vehicle_speed, steering_wheel_angle)
output_angle = self.estimated_angle
else:
# 正常时直接使用传感器值
output_angle = sensor_value
self.estimated_angle = sensor_value
self.prev_value = sensor_value
return output_angle, self.fault_type, self.fault_detected
测试用例与验证
def run_test_case():
fdi = SteeringAngleFDI(dt=0.01, window_size=50, steer_ratio=15.0)
# 模拟数据:前2秒正常,之后注入卡死故障
t = np.arange(0, 5, 0.01)
true_angle = 0.3 * np.sin(2 * np.pi * 0.5 * t) # 真实前轮转角
sensor_readings = true_angle.copy()
# 注入卡死故障:从2秒开始传感器输出恒定值
fault_start_idx = int(2.0 / 0.01)
sensor_readings[fault_start_idx:] = 0.25 # 卡死在0.25rad
vehicle_speed = 10.0 # m/s,约36km/h
steering_wheel_angle = true_angle * 15.0 # 方向盘转角
outputs = []
fault_flags = []
for i in range(len(t)):
out_angle, ftype, fdetected = fdi.process(
sensor_readings[i], vehicle_speed, steering_wheel_angle[i])
outputs.append(out_angle)
fault_flags.append(ftype)
# 验证点1:故障检测延迟
detection_idx = next(i for i, f in enumerate(fault_flags) if f != 0)
detection_time = t[detection_idx]
print(f"故障注入时间: 2.00s, 检测到时间: {detection_time:.2f}s")
print(f"检测延迟: {detection_time - 2.0:.3f}s")
# 验证点2:容错输出与真实值误差
fault_outputs = np.array(outputs[fault_start_idx:])
true_segment = true_angle[fault_start_idx:]
rmse = np.sqrt(np.mean((fault_outputs - true_segment) ** 2))
print(f"容错后RMSE: {rmse:.4f} rad")
# 验证点3:故障类型识别正确
print(f"检测到的故障类型: {fault_flags[detection_idx]} (1=卡死)")
assert fault_flags[detection_idx] == 1, "故障类型识别错误"
# 验证点4:正常段无故障误报
normal_flags = fault_flags[:fault_start_idx]
assert all(f == 0 for f in normal_flags), "正常段存在误报"
print("正常段无误报: 通过")
print(f"容错后RMSE: {rmse:.4f} rad (阈值0.05rad)")
assert rmse < 0.05, "容错精度不足"
print("全部验证通过")
if __name__ == "__main__":
run_test_case()
运行方式与判定标准
运行环境:Python 3.7+,NumPy库。
执行方法:将上述两段代码保存为 steering_fdi.py,在终端运行 python steering_fdi.py。
预期输出与判定:
- 故障注入时间为2.00s,检测延迟应小于0.5s(即检测时间在2.00~2.50s之间);
- 容错后RMSE应小于0.05rad,表明容错值能有效跟踪真实转角;
- 故障类型识别为1(卡死),且正常段(0~2s)无故障误报;
- 程序输出"全部验证通过"即表示测试通过。
关键设计说明
本案例的故障诊断基于信号统计特征与模型一致性校验的融合:卡死检测通过滑动窗口内的极差判断信号是否失去变化;偏置检测将传感器读数与运动学模型估计值比较,排除低速工况避免分母过小带来的误判;噪声检测利用窗口方差识别异常抖动。容错策略采用模型值直接替换,模型基于方向盘转角与转向比(15:1)的线性映射,在中高速工况下具有足够的估计精度。代码中窗口大小、阈值等参数均可通过构造函数调整,便于适配不同车型的转向特性。