2. 转向盘转角传感器信号处理

任务定义

转向盘转角传感器(SAS)输出信号通常叠加有测量噪声与轻微抖动,直接影响线控转向系统的路感反馈精度与稳定性控制。本案例设计一个一维卡尔曼滤波器,对含噪的转向盘转角测量值进行实时滤波,输出平滑的转角估计值,并给出可执行的验证方法。

卡尔曼滤波模型

针对单变量转角信号,建立如下离散线性系统模型:

  • 状态方程:xk = xk-1 + wk-1,其中过程噪声 w ~ N(0, Q)
  • 观测方程:zk = xk + vk,其中测量噪声 v ~ N(0, R)

采用匀速转角假设(即转角在相邻采样周期内近似不变),通过卡尔曼滤波递推公式实时估计真实转角。滤波器参数 Q(过程噪声协方差)与 R(测量噪声协方差)需根据传感器特性设定:Q 反映转角真实变化的剧烈程度,R 反映传感器噪声水平。

代码实现


import numpy as np
import matplotlib.pyplot as plt

class KalmanFilter1D:
    """一维卡尔曼滤波器,用于转向盘转角信号平滑"""
    def __init__(self, Q=0.01, R=1.0):
        self.Q = Q          # 过程噪声协方差
        self.R = R          # 测量噪声协方差
        self.x = 0.0        # 状态估计值(转角)
        self.P = 1.0        # 误差协方差

    def update(self, z):
        """输入测量值z,返回滤波后的转角估计"""
        # 预测步骤
        x_pred = self.x
        P_pred = self.P + self.Q

        # 更新步骤
        K = P_pred / (P_pred + self.R)          # 卡尔曼增益
        self.x = x_pred + K * (z - x_pred)      # 状态更新
        self.P = (1 - K) * P_pred               # 协方差更新
        return self.x

def generate_noisy_signal(true_angles, noise_std=2.0, seed=42):
    """生成含高斯噪声的转角测量信号"""
    rng = np.random.default_rng(seed)
    noise = rng.normal(0, noise_std, size=len(true_angles))
    return true_angles + noise

if __name__ == "__main__":
    # 生成仿真数据:模拟转向盘正弦摆动 + 阶跃变化
    t = np.linspace(0, 10, 500)
    true_angle = 90 * np.sin(0.5 * t) + 30 * (t > 5)   # 真实转角

    # 添加测量噪声(标准差2°)
    measured = generate_noisy_signal(true_angle, noise_std=2.0)

    # 初始化卡尔曼滤波器
    kf = KalmanFilter1D(Q=0.01, R=4.0)   # R=σ²=4

    # 逐点滤波
    filtered = []
    for z in measured:
        est = kf.update(z)
        filtered.append(est)

    # 计算滤波前后误差(与真实值对比)
    meas_error = np.mean((measured - true_angle) ** 2)
    filt_error = np.mean((np.array(filtered) - true_angle) ** 2)

    print(f"测量信号均方误差: {meas_error:.4f} deg²")
    print(f"滤波信号均方误差: {filt_error:.4f} deg²")

    # 绘图对比
    plt.figure(figsize=(10, 5))
    plt.plot(t, true_angle, 'k-', linewidth=2, label='真实转角')
    plt.plot(t, measured, 'r.', markersize=2, alpha=0.5, label='含噪测量')
    plt.plot(t, filtered, 'b-', linewidth=1.5, label='卡尔曼滤波输出')
    plt.xlabel('时间 (s)')
    plt.ylabel('转向盘转角 (deg)')
    plt.legend()
    plt.grid(True)
    plt.title('转向盘转角卡尔曼滤波效果')
    plt.savefig('steering_angle_kalman.png', dpi=100)
    plt.show()

落地与运行方式

本案例代码为独立Python脚本,依赖NumPy和Matplotlib库。运行前需安装依赖:


pip install numpy matplotlib

将上述代码保存为 steering_kalman.py,在终端执行:


python steering_kalman.py

验证方法与判定标准

运行脚本后,控制台输出两组均方误差(MSE)数值,并弹出对比图。判定滤波有效的标准为:

  • 滤波后MSE显著小于测量MSE(通常降低50%以上);
  • 图中蓝色滤波曲线明显比红色测量点平滑,且能跟随黑色真实转角曲线的趋势变化,无显著滞后或发散。

由于代码中设置了随机种子(seed=42),每次运行结果可复现。上述MSE数值为确定性输出,可直接用于验证。

卡尔曼滤波信号处理流程 转向盘转角 传感器 (SAS) 测量噪声 v ~ N(0, R) + 测量值 z_k 卡尔曼滤波器 预测: x⁻=x, P⁻=P+Q 更新: K, x, P Q=0.01, R=4.0 滤波输出 x̂_k (平滑转角) 下游应用 路感控制 / 稳定性