4. 主动悬架控制策略初步设计

任务定义

本案例针对1/4车主动悬架模型,设计并实现一个位置式PID控制器,以改善车身垂向加速度响应。控制目标为:在路面阶跃激励下,使车身垂向加速度的稳态值趋近于零,同时将悬架动行程控制在机械限位(±0.08 m)以内。控制器输出为主动作动器力,作用于簧载质量与簧下质量之间。

被控对象模型

采用简化的1/4车二自由度主动悬架模型,动力学方程为:

m_s·ẍ_s = -k_s·(x_s - x_u) - c_s·(ẋ_s - ẋ_u) + F_a
m_u·ẍ_u =  k_s·(x_s - x_u) + c_s·(ẋ_s - ẋ_u) - k_t·(x_u - x_r) - F_a

其中:m_s=320 kg(簧载质量),m_u=45 kg(簧下质量),k_s=22000 N/m(悬架刚度),c_s=1200 N·s/m(阻尼系数),k_t=230000 N/m(轮胎刚度)。状态向量取[x_s, ẋ_s, x_u, ẋ_u],路面输入x_r为0.05 m阶跃。

控制器设计

以车身垂向加速度为反馈量,采用位置式PID控制律:

F_a(t) = K_p·e(t) + K_i·∫e(τ)dτ + K_d·de(t)/dt
e(t) = 0 - ẍ_s(t)   (目标加速度为0)

经参数整定,选取K_p=850,K_i=120,K_d=45。控制器输出限幅为±3000 N,防止作动器饱和。仿真时长为5 s,采样步长1 ms。

代码实现

以下Python代码完整实现上述模型与PID控制闭环仿真:

import numpy as np
import matplotlib.pyplot as plt

# 模型参数
m_s = 320.0
m_u = 45.0
k_s = 22000.0
c_s = 1200.0
k_t = 230000.0

# PID参数
Kp, Ki, Kd = 850.0, 120.0, 45.0
F_max = 3000.0

# 仿真参数
dt = 0.001
t_end = 5.0
t = np.arange(0, t_end, dt)
n = len(t)

# 状态初始化: [x_s, v_s, x_u, v_u]
state = np.array([0.0, 0.0, 0.0, 0.0])
x_r = 0.05  # 路面阶跃

# 存储输出
x_s_hist = np.zeros(n)
acc_hist = np.zeros(n)
F_hist = np.zeros(n)
susp_hist = np.zeros(n)

# PID状态变量
integral = 0.0
prev_error = 0.0

def vehicle_dynamics(state, F_a, x_r):
    x_s, v_s, x_u, v_u = state
    dx_s = v_s
    dv_s = (-k_s*(x_s - x_u) - c_s*(v_s - v_u) + F_a) / m_s
    dx_u = v_u
    dv_u = (k_s*(x_s - x_u) + c_s*(v_s - v_u) - k_t*(x_u - x_r) - F_a) / m_u
    return np.array([dx_s, dv_s, dx_u, dv_u])

for i in range(n):
    x_s, v_s, x_u, v_u = state
    acc = (-k_s*(x_s - x_u) - c_s*(v_s - v_u)) / m_s  # 无作动器时的被动加速度分量
    # 实际车身加速度(含作动器影响)
    acc_total = (-k_s*(x_s - x_u) - c_s*(v_s - v_u) + F_hist[i-1] if i > 0 else 0.0) / m_s
    
    # 计算误差(目标加速度为0)
    error = 0.0 - acc_total
    
    # 位置式PID
    integral += error * dt
    derivative = (error - prev_error) / dt
    F_a = Kp*error + Ki*integral + Kd*derivative
    
    # 输出限幅
    F_a = np.clip(F_a, -F_max, F_max)
    
    # 更新历史
    x_s_hist[i] = x_s
    acc_hist[i] = acc_total
    F_hist[i] = F_a
    susp_hist[i] = x_s - x_u
    
    # 使用当前F_a计算实际加速度(用于下一步)
    if i == 0:
        acc_total = (-k_s*(x_s - x_u) - c_s*(v_s - v_u) + F_a) / m_s
        acc_hist[i] = acc_total
        error = -acc_total
        integral = error * dt
        derivative = 0.0
        F_a = Kp*error + Ki*integral + Kd*derivative
        F_a = np.clip(F_a, -F_max, F_max)
        F_hist[i] = F_a
    
    # 状态更新(RK4)
    k1 = vehicle_dynamics(state, F_a, x_r)
    k2 = vehicle_dynamics(state + 0.5*dt*k1, F_a, x_r)
    k3 = vehicle_dynamics(state + 0.5*dt*k2, F_a, x_r)
    k4 = vehicle_dynamics(state + dt*k3, F_a, x_r)
    state = state + (dt/6.0)*(k1 + 2*k2 + 2*k3 + k4)
    
    prev_error = error

# 输出关键指标
steady_acc = np.mean(np.abs(acc_hist[int(0.8*n):]))  # 后20%时间平均加速度
max_susp = np.max(np.abs(susp_hist))
print(f"稳态平均|加速度|: {steady_acc:.4f} m/s²")
print(f"最大悬架动行程: {max_susp:.4f} m")

# 绘图
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(10, 8))
ax1.plot(t, acc_hist, 'b-', linewidth=0.8)
ax1.set_ylabel('车身加速度 (m/s²)')
ax1.grid(True)
ax2.plot(t, susp_hist, 'r-', linewidth=0.8)
ax2.axhline(0.08, color='k', linestyle='--', linewidth=0.5)
ax2.axhline(-0.08, color='k', linestyle='--', linewidth=0.5)
ax2.set_ylabel('悬架动行程 (m)')
ax2.grid(True)
ax3.plot(t, F_hist, 'g-', linewidth=0.8)
ax3.set_ylabel('作动器力 (N)')
ax3.set_xlabel('时间 (s)')
ax3.grid(True)
plt.tight_layout()
plt.savefig('pid_active_suspension.png', dpi=100)
plt.show()

验证方法

运行上述代码后,观察以下三点以判定控制器是否满足设计目标:

  1. 车身垂向加速度曲线在阶跃激励后约1~2 s内衰减至接近零,稳态平均值应小于0.5 m/s²;
  2. 悬架动行程曲线全程保持在±0.08 m虚线边界内,最大值不超过0.08 m;
  3. 作动器力输出始终处于±3000 N限幅范围内,无持续饱和现象。

若三项条件同时满足,则PID主动悬架控制器设计有效;否则需调整PID参数或检查模型数值稳定性。

PID主动悬架控制闭环仿真结构 路面阶跃 x_r = 0.05 m 1/4车二自由度 m_s, m_u, k_s, c_s, k_t 状态: x_s, v_s, x_u, v_u 加速度 ẍ_s − 目标=0 e(t) PID控制器 Kp=850 Ki=120 Kd=45 限幅 ±3000 N 作动器力 F_a 验证观测 稳态|acc| < 0.5 m/s² |动行程| < 0.08 m 信号流说明 路面位移输入 → 车辆模型 车身加速度反馈 → 误差计算 误差信号 → PID控制器 控制力输出 → 车辆模型(闭环)