3. 低附着系数路面ABS控制效果验证

低附着系数路面ABS控制效果验证 学习卡片

任务定义

在峰值附着系数为0.2的冰雪路面上,验证ABS控制算法能否将车轮滑移率维持在最佳滑移率附近,防止车轮抱死,并评估车辆横向稳定性(质心侧偏角与横摆角速度响应)。本案例采用单车轮模型配合整车纵向动力学简化模型,以阶跃制动工况为输入,通过仿真对比有无ABS时的车轮状态与车辆响应。

车辆与路面模型

采用四分之一车辆模型(单轮模型),车辆质量m=400kg(对应整车约1600kg),车轮转动惯量I_w=1.2kg·m²,车轮有效半径R=0.3m。路面峰值附着系数μ_max=0.2,最佳滑移率s_opt=0.12。轮胎模型采用Burckhardt公式:

μ(s) = c1·(1−e^(−c2·s)) − c3·s

其中冰雪路面参数c1=0.2,c2=30,c3=0.4,该参数下峰值附着系数约为0.2,对应滑移率约0.12。

ABS控制算法实现

采用门限值控制策略:当滑移率超过上限s_high=0.18时减小制动压力;当滑移率低于下限s_low=0.08时增大制动压力;在两者之间保持当前压力。制动压力执行器具有一阶惯性延迟,时间常数τ=0.01s。控制周期为1ms。


import numpy as np
import matplotlib.pyplot as plt

# 车辆与路面参数
m = 400.0        # 四分之一车辆质量 kg
I_w = 1.2        # 车轮转动惯量 kg·m^2
R = 0.3          # 车轮有效半径 m
g = 9.81
mu_max = 0.2     # 峰值附着系数
s_opt = 0.12     # 最佳滑移率

# Burckhardt 轮胎模型参数(冰雪路面)
c1, c2, c3 = 0.2, 30.0, 0.4

def tire_mu(s):
    """计算滑移率s对应的路面附着系数"""
    return c1 * (1.0 - np.exp(-c2 * s)) - c3 * s

# ABS 门限参数
s_high = 0.18
s_low = 0.08
tau_p = 0.01      # 制动压力执行器时间常数

# 仿真参数
dt = 0.001        # 1ms 控制周期
t_end = 3.0       # 仿真时长 3s
n_steps = int(t_end / dt)
t = np.linspace(0, t_end, n_steps)

# 制动输入:0.5s后施加阶跃制动压力(主缸压力)
p_master = 2.0e6  # 2 MPa 制动压力(对应较大制动力矩)
brake_start = 0.5

# 状态初始化
v = 20.0          # 初始车速 m/s (72 km/h)
w = v / R         # 初始轮速 rad/s
p_brake = 0.0     # 实际制动压力

# 存储结果
v_history = np.zeros(n_steps)
w_history = np.zeros(n_steps)
s_history = np.zeros(n_steps)
p_history = np.zeros(n_steps)
mu_history = np.zeros(n_steps)

# 制动效能因数:制动力矩 = K_brake * p_brake
K_brake = 0.0005  # N·m/Pa,2MPa时对应1000 N·m

# 无ABS对照组:直接施加主缸压力
v_noabs = 20.0
w_noabs = v_noabs / R
v_noabs_hist = np.zeros(n_steps)
w_noabs_hist = np.zeros(n_steps)
s_noabs_hist = np.zeros(n_steps)

# 仿真主循环
for i in range(n_steps):
    # 记录当前状态
    v_history[i] = v
    w_history[i] = w
    p_history[i] = p_brake
    
    # 计算当前滑移率
    if v > 0.1:
        s = (v - w * R) / v
    else:
        s = 0.0
    s = np.clip(s, 0.0, 1.0)
    s_history[i] = s
    
    # 轮胎力
    mu = tire_mu(s)
    mu_history[i] = mu
    F_x = mu * m * g  # 地面制动力
    
    # 车辆动力学
    a = -F_x / m
    if v <= 0:
        a = 0.0
    
    # 车轮动力学
    T_brake = K_brake * p_brake
    if v > 0.01:
        dw = (-T_brake + F_x * R) / I_w
    else:
        dw = 0.0
    
    # ABS 控制逻辑(门限值)
    if t[i] >= brake_start:
        if s > s_high:
            p_target = max(0.0, p_brake - 0.3e6)  # 减压
        elif s < s_low:
            p_target = min(p_master, p_brake + 0.3e6)  # 增压
        else:
            p_target = p_brake  # 保压
    else:
        p_target = 0.0
    
    # 执行器一阶延迟
    dp = (p_target - p_brake) / tau_p
    p_brake += dp * dt
    p_brake = np.clip(p_brake, 0.0, p_master)
    
    # 更新状态(欧拉积分)
    v += a * dt
    w += dw * dt
    v = max(0.0, v)
    w = max(0.0, w)
    
    # ---- 无ABS对照组 ----
    if t[i] >= brake_start:
        T_noabs = K_brake * p_master
    else:
        T_noabs = 0.0
    
    if v_noabs > 0.01:
        s_noabs = (v_noabs - w_noabs * R) / v_noabs
        s_noabs = np.clip(s_noabs, 0.0, 1.0)
        mu_noabs = tire_mu(s_noabs)
        F_noabs = mu_noabs * m * g
        a_noabs = -F_noabs / m
        dw_noabs = (-T_noabs + F_noabs * R) / I_w
    else:
        s_noabs = 0.0
        a_noabs = 0.0
        dw_noabs = 0.0
    
    v_noabs_hist[i] = v_noabs
    w_noabs_hist[i] = w_noabs
    s_noabs_hist[i] = s_noabs
    
    v_noabs += a_noabs * dt
    w_noabs += dw_noabs * dt
    v_noabs = max(0.0, v_noabs)
    w_noabs = max(0.0, w_noabs)

# 计算制动距离
brake_idx = int(brake_start / dt)
abs_stop_idx = np.where(v_history < 0.1)[0]
noabs_stop_idx = np.where(v_noabs_hist < 0.1)[0]

if len(abs_stop_idx) > 0:
    abs_stop_time = t[abs_stop_idx[0]]
    abs_dist = np.trapz(v_history[brake_idx:abs_stop_idx[0]], t[brake_idx:abs_stop_idx[0]])
else:
    abs_stop_time = t_end
    abs_dist = np.trapz(v_history[brake_idx:], t[brake_idx:])

if len(noabs_stop_idx) > 0:
    noabs_stop_time = t[noabs_stop_idx[0]]
    noabs_dist = np.trapz(v_noabs_hist[brake_idx:noabs_stop_idx[0]], t[brake_idx:noabs_stop_idx[0]])
else:
    noabs_stop_time = t_end
    noabs_dist = np.trapz(v_noabs_hist[brake_idx:], t[brake_idx:])

# 输出关键指标
print(f"ABS 制动距离: {abs_dist:.2f} m, 停车时间: {abs_stop_time:.2f} s")
print(f"无ABS制动距离: {noabs_dist:.2f} m, 停车时间: {noabs_stop_time:.2f} s")
print(f"ABS 最大滑移率: {np.max(s_history[brake_idx:]):.3f}")
print(f"无ABS最大滑移率: {np.max(s_noabs_hist[brake_idx:]):.3f}")

# 绘图
fig, axes = plt.subplots(3, 1, figsize=(10, 8))
axes[0].plot(t, v_history, 'b-', label='ABS车速')
axes[0].plot(t, v_noabs_hist, 'r--', label='无ABS车速')
axes[0].set_ylabel('车速 (m/s)')
axes[0].legend()
axes[0].grid(True)

axes[1].plot(t, s_history, 'b-', label='ABS滑移率')
axes[1].plot(t, s_noabs_hist, 'r--', label='无ABS滑移率')
axes[1].axhline(y=s_opt, color='g', linestyle=':', label='最佳滑移率')
axes[1].set_ylabel('滑移率')
axes[1].legend()
axes[1].grid(True)

axes[2].plot(t, p_history/1e6, 'b-', label='ABS制动压力')
axes[2].set_xlabel('时间 (s)')
axes[2].set_ylabel('制动压力 (MPa)')
axes[2].legend()
axes[2].grid(True)

plt.tight_layout()
plt.savefig('abs_ice_validation.png', dpi=150)
plt.show()

方向稳定性评估方法

方向稳定性通过以下间接指标评估:

  • 车轮抱死程度:滑移率是否长时间接近1.0(完全抱死)。若车轮抱死,车辆将失去侧向力能力,导致方向失稳。
  • 侧向力裕度:根据附着椭圆概念,纵向滑移率远离1.0时保留更多侧向附着力。以滑移率不超过0.2作为方向稳定性可接受的工程判据。
ABS控制效果验证流程与观测点 输入工况 车速20m/s 阶跃制动2MPa 路面模型 冰雪路面 μ_max=0.2 Burckhardt公式 ABS控制器 门限值控制 s_low=0.08 s_high=0.18 执行器 一阶延迟 τ=0.01s 车辆与车轮动力学 m=400kg, I_w=1.2kg·m², R=0.3m dv/dt = -F_x/m, dw/dt = (-T+F_x·R)/I_w 滑移率反馈 观测指标 车速/轮速/滑移率 制动距离/停车时间 验证判定标准 ✓ 有ABS时滑移率应保持在0.08~0.18范围内,不出现长时间s≈1.0的抱死状态 ✓ 无ABS对照组滑移率应快速升至1.0(车轮抱死),车辆失去方向稳定性 ✓ ABS制动距离应短于或接近无ABS(因冰雪路面最佳滑移率制动效率最高)

运行与验证

运行方式:将代码保存为abs_ice_validation.py,在安装了numpy和matplotlib的Python环境中执行python abs_ice_validation.py。

预期结果与判定标准:

  • 无ABS曲线:制动开始后滑移率迅速上升至接近1.0,车轮趋于抱死,车辆减速缓慢(因滑动摩擦系数低于峰值附着系数),制动距离明显偏长。
  • ABS曲线:滑移率在0.08~0.18门限内振荡,车轮保持滚动状态,利用峰值附着系数制动,制动距离应短于无ABS工况。
  • 方向稳定性:ABS工况下因车轮未抱死,保留侧向力裕度,车辆具备方向稳定性;无ABS工况因车轮抱死丧失侧向力,方向失稳。
  • 若观察到ABS工况滑移率超出门限范围或制动距离反而更长,需检查控制参数(增压/减压步长、门限值)是否合理。

注意:本案例采用单轮模型评估纵向制动性能与抱死状态,方向稳定性通过“车轮是否抱死”间接判定。如需直接评估横摆响应,需扩展为整车双轨模型,本案例不包含该部分。