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)无故障误报;
  • 程序输出"全部验证通过"即表示测试通过。
前轮转角传感器故障诊断与容错处理流程 前轮转角传感器 δ_sensor 车速/方向盘转角 v, δ_sw 滑动窗口缓存 50个采样点 故障检测 卡死 | 偏置 | 噪声 阈值比较 运动学模型估计 δ_model = δ_sw / ratio 容错切换 故障→模型值 正常→传感器值 容错后转角 δ_output + 故障码 故障标志 → 切换控制 判定标准: 检测延迟 < 0.5s | 容错RMSE < 0.05rad | 无漏报/误报

关键设计说明

本案例的故障诊断基于信号统计特征与模型一致性校验的融合:卡死检测通过滑动窗口内的极差判断信号是否失去变化;偏置检测将传感器读数与运动学模型估计值比较,排除低速工况避免分母过小带来的误判;噪声检测利用窗口方差识别异常抖动。容错策略采用模型值直接替换,模型基于方向盘转角与转向比(15:1)的线性映射,在中高速工况下具有足够的估计精度。代码中窗口大小、阈值等参数均可通过构造函数调整,便于适配不同车型的转向特性。