悬架
悬架的定义:
- 连接车轮与车身的**机构。支撑车身保持几何姿态+**缓冲路面冲击+传递车轮与路面间的力和力矩,保证轮胎抓地力,关乎操控稳定与安全
悬架设计的难点:“舒适性”与“操控性”的权衡
舒适性:需要“软”悬架,隔离路面振动
操控性:需要“硬”悬架,减少车身侧倾、俯仰,保持轮胎紧贴路面
注释:软悬架(刚度低)软悬架能够更好地吸收高频振动,如路面接缝或不平引起的冲击。它通过降低共振频率,减少车身振动对乘客的影响,从而提升乘坐舒适性。然而,过于柔软的悬架可能导致低频振动(如长波路面)的持续时间更长,可能引起乘客的不适感。
注释:硬悬架能够更快地抑制振动,减少车身的晃动,但在处理高频振动时可能不够柔和,导致更多的振动传递到车内,影响舒适性。
软悬架的共振频率较低,能够更好地适应高频振动,减少乘客感受到的振动强度。而硬悬架的共振频率较高,可能与人体敏感的频率范围(4~8Hz)重叠,导致不适感。
共振频率是指当一个系统受到外界周期性力的作用时,其固有频率与外界力的频率一致时所达到的频率。
高频振动通常指的是频率较高的振动,一般在几百赫兹以上。高频振动传递到车内时,可能会产生尖锐的噪声,影响车内环境的安静性。人体对高频振动的敏感度较低,但过高的高频振动仍可能引起不适。低频振动指的是频率较低的振动,通常在几十赫兹以下。低频振动对人体的影响更为显著,尤其是对内脏和整体身体的晃动,可能导致疲劳和不适。人体对低频振动特别敏感,因此在汽车设计中,减少低频振动是提升乘坐舒适性的关键。
悬架的核心部件
弹性元件(弹簧)
作用:支撑车身,储存/释放能量,决定悬架“软硬”基调
关键参数:刚度K – 刚度越大抵抗变形的能力越强,车身姿态越稳,但过滤小振动能力越差
减震器
作用:消耗弹簧储存的能量,抑制车身振荡。
关键参数:阻尼系数
导向机构-连杆与摆臂
- 作用:决定车轮跳动的轨迹(外倾角、前束角等变化规律)
关键状态量与性能指标
簧载质量:车身
非簧载质量:车轮、制动系统等
悬架行程:车轮与车身的相对位移。防止“打顶”(撞到上限位块)和“托底”(撞到下限位块)是控制的基本约束
车身姿态:俯仰角pitch、侧倾角roll、垂向加速度heave
轮胎动载荷:轮胎与地面间垂直方向的动态力
悬架的分类
**被动悬架:**弹簧(刚度K固定)和减振器(阻尼C固定)的参数在车辆出厂后无法改变
**半主动悬架:**阻尼系数(C)可以实时主动调节,但弹簧刚度(K)依然固定。系统不能向车身注入能量,主流的技术方案是:
CDC(连续阻尼控制)减振器:通过电磁阀改变油液通路孔径,实现阻尼无级调节
MR(磁流变)减振器:通过改变磁场,使内部的磁流变液粘度瞬间变化,从而改变阻尼
空气悬架:
使用空气弹簧(内部是压缩空气)替代传统的金属螺旋弹簧。通常需要与可调阻尼减振器(如CDC)结合使用。
可调刚度:通过充放气改变空气弹簧内的气压,从而改变其等效刚度。气压高则硬,气压低则软。
可调车高:通过整体充放气,改变悬架行程的初始位置,实现车身的升高或降低。
**主动悬架:**配备独立的力作动器(如液压、电磁)能向系统注入能量,理论上能完全控制车身运动
- 可以做到在刹车时主动抵抗“点头”,转弯时主动抵抗“侧倾”,过坎时主动抬起车轮抵消冲击。性能天花板是所有悬架中最高的。
整车平顺性的7自由度模型:
车身的垂直heave、俯仰pitch、侧倾roll
4个车轮有4个垂直度的自由度
单质量车身微分振动方程
公式:
m _ 2 d 2 z d t 2 + c ( d z d t − d q d t ) + k ( z − q ) = 0 m\_{2} \frac{d^2 z}{dt^2} + c \left( \frac{dz}{dt} - \frac{dq}{dt} \right) + k(z - q) = 0m_2dt2d2z+c(dtdz−dtdq)+k(z−q)=0→m _ 2 d 2 z d t 2 + c d z d t + k z = c d q d t + k q m\_{2} \frac{d^2 z}{dt^2} + c \frac{dz}{dt} + kz = c \frac{dq}{dt} + kqm_2dt2d2z+cdtdz+kz=cdtdq+kq
m _ 2 z ¨ + c ( z ˙ − q ˙ ) + k ( z − q ) = 0 m\_2 \ddot{z} + c(\dot{z} - \dot{q}) + k(z - q) = 0m_2z¨+c(z˙−q˙)+k(z−q)=0→m _ 2 z ¨ + c z ˙ + k z = c q ˙ + k q m\_2 \ddot{z} + c \dot{z} + kz = c \dot{q} + kqm_2z¨+cz˙+kz=cq˙+kq
m _ 2 m\_{2}m_2:簧上质量(Kg)-由悬架支撑的车身部分的质量。在单质量模型中,它代表分配到该悬架上的车身质量(如1/4车身质量)
z : z:z:车身垂直位移(m)-车身质量块相对于静止平衡位置的垂直位移(绝对位移),通常以向上为正方向
c cc:悬架阻尼系数(N·m/s):减振器的阻尼特性。阻尼越大,振动衰减越快,但过大会导致悬架变硬
k kk:悬架弹簧刚度(N/m):悬架弹簧的软硬程度。刚度越大,产生单位变形所需的力越大,悬架越“硬”
q qq:路面相对于理想平滑路面的垂直位移(绝对位移)。是系统的主要激励源,通常以向上为正
z ¨ \ddot{z}z¨:车身加速度
q ˙ \dot{q}q˙:路面的相对速度
示意图
公式推导:
m _ 2 z ¨ m\_2 \ddot{z}m_2z¨:质量 × 加速度 = 惯性力(牛顿第二定律 F=ma)
− k ( z − q ) -k(z-q)−k(z−q):弹簧力
− c ( z − q ) -c(z-q)−c(z−q):阻尼力与相对速度有关
举例子:
- 时间点1:车轮刚要上凸起
路面 q 开始上升,车身 z 还没动
z - q 变小 → 弹簧被压缩 → 弹簧力向上(推车身)
dz/dt - dq/dt 为负(路面向上比车身快)→ 阻尼力向上
- 时间点2:车轮在凸起顶端
路面 q 开始下降,车身 z 被弹簧推着还在向上
z - q 变大 → 弹簧被拉伸 → 弹簧力向下(拉车身)
dz/dt - dq/dt 为正(车身向上比路面快)→ 阻尼力向下
- 整个过程中,弹簧和阻尼器共同作用,消耗能量,让车身振动尽快平息。
代码模拟
importnumpyasnpimportmatplotlib.pyplotasplt# 参数m=300# kgk=20000# N/mc=2000# N·s/m# 时间设置dt=0.001# 时间步长t=np.arange(0,5,dt)# 5秒# 路面激励:一个简单的凸起q=np.zeros_like(t)q[(t>=1)&(t<=1.2)]=0.05*np.sin(np.pi*(t[(t>=1)&(t<=1.2)]-1)/0.2)# 初始化z=np.zeros_like(t)# 车身位移dz=np.zeros_like(t)# 车身速度# 数值积分(欧拉法)foriinrange(1,len(t)):# 计算加速度ddz=(-k*(z[i-1]-q[i-1])-c*(dz[i-1]-(q[i]-q[i-1])/dt))/m# 更新速度和位移dz[i]=dz[i-1]+ddz*dt z[i]=z[i-1]+dz[i]*dt# 绘图plt.figure(figsize=(12,8))plt.subplot(3,1,1)plt.plot(t,q,label='路面位移 q(t)')plt.ylabel('位移 (m)')plt.legend()plt.title('路面激励与车身响应')plt.subplot(3,1,2)plt.plot(t,z,label='车身位移 z(t)',color='orange')plt.ylabel('位移 (m)')plt.legend()plt.subplot(3,1,3)plt.plot(t,dz,label='车身速度 dz/dt',color='green')plt.xlabel('时间 (s)')plt.ylabel('速度 (m/s)')plt.legend()plt.tight_layout()plt.show()双质量系统振动微分方程
公式:m _ 2 z ¨ _ 2 + c ( z ˙ _ 2 − z ˙ _ 1 ) + k ( z _ 2 − z _ 1 ) = 0 m _ 1 z ¨ _ 1 + c ( z ˙ _ 1 − z ˙ _ 2 ) + k ( z _ 1 − z _ 2 ) + k _ t ( z _ 1 − q ) = 0 m\_2 \ddot{z}\_2 + c(\dot{z}\_2 - \dot{z}\_1) + k(z\_2 - z\_1) = 0 \\ m\_1 \ddot{z}\_1 + c(\dot{z}\_1 - \dot{z}\_2) + k(z\_1 - z\_2) + k\_t(z\_1 - q) = 0m_2z¨_2+c(z˙_2−z˙_1)+k(z_2−z_1)=0m_1z¨_1+c(z˙_1−z˙_2)+k(z_1−z_2)+k_t(z_1−q)=0
公式矩阵化:
M Z ¨ + C Z ˙ + K Z = F _ q \mathbf{M} \ddot{\mathbf{Z}} + \mathbf{C} \dot{\mathbf{Z}} + \mathbf{K} \mathbf{Z} = \mathbf{F}\_qMZ¨+CZ˙+KZ=F_q
位移向量:KaTeX parse error: Undefined control sequence: \[ at position 14: \mathbf{Z} = \̲[̲z\_2, z\_1\]^T
质量矩阵:M = [ m _ 2 0 0 m _ 1 ] \mathbf{M} = \begin{bmatrix} m\_2 & 0 \\ 0 & m\_1 \end{bmatrix}M=[m_200m_1]
阻尼刚度:C = [ c − c − c c ] \mathbf{C} = \begin{bmatrix} c & -c \\ -c & c \end{bmatrix}C=[c−c−cc]
刚度矩阵:K = [ k − k − k k + k _ t ] \mathbf{K} = \begin{bmatrix} k & -k \\ -k & k + k\_t \end{bmatrix}K=[k−k−kk+k_t]
输入向量:F _ q = [ 0 k _ t q ] \mathbf{F}\_q = \begin{bmatrix} 0 \\ k\_t q \end{bmatrix}F_q=[0k_tq]
m _ 2 m\_2m_2:簧上质量(悬挂质量)–包括车身、负载等由悬架支撑的质量
z _ 2 z\_2z_2:簧上质量的垂直位移,绝对坐标,向上为正
m _ 1 m\_1m_1:簧下质量(非悬挂质量)-- 包括车轮、车轴、制动盘等随车轮跳动的质量
z _ 1 z\_1z_1:簧下质量的垂直位移,绝对坐标,向上为正
q qq:路面不平度位移,,绝对坐标,向上为正 ,是系统的输入激励
c cc:悬架阻尼系数(N·m/s):减振器的阻尼特性。阻尼越大,振动衰减越快,但过大会导致悬架变硬
k kk:悬架弹簧刚度(N/m):悬架弹簧的软硬程度。刚度越大,产生单位变形所需的力越大,悬架越“硬”
k _ 1 k\_{1}k_1:轮胎垂直刚度(N/m)
示意图:
公式推导:m _ 2 z ¨ _ 2 + c ( z ˙ _ 2 − z ˙ _ 1 ) + k ( z _ 2 − z _ 1 ) = 0 m\_2 \ddot{z}\_2 + c(\dot{z}\_2 - \dot{z}\_1) + k(z\_2 - z\_1) = 0m_2z¨_2+c(z˙_2−z˙_1)+k(z_2−z_1)=0
m _ 2 m\_2m_2受到的弹簧力:− k ( z _ 2 − z _ 1 ) -k(z\_2 - z\_1)−k(z_2−z_1)
m _ 2 m\_2m_2受到的阻尼力:− c ( z ˙ _ 2 − z ˙ _ 1 ) -c(\dot{z}\_2 - \dot{z}\_1)−c(z˙_2−z˙_1)
m _ 2 m\_2m_2的牛顿第二定律:m _ 2 z ¨ m\_{2}\ddot{z}m_2z¨=− k ( z _ 2 − z _ 1 ) − c ( z ˙ _ 2 − z ˙ _ 1 ) -k(z\_2 - z\_1)-c(\dot{z}\_2 - \dot{z}\_1)−k(z_2−z_1)−c(z˙_2−z˙_1)
公式推导:m _ 1 z ¨ _ 1 + c ( z ˙ _ 1 − z ˙ _ 2 ) + k ( z _ 1 − z _ 2 ) + k _ t ( z _ 1 − q ) = 0 m\_1 \ddot{z}\_1 + c(\dot{z}\_1 - \dot{z}\_2) + k(z\_1 - z\_2) + k\_t(z\_1 - q) = 0m_1z¨_1+c(z˙_1−z˙_2)+k(z_1−z_2)+k_t(z_1−q)=0
m _ 1 m\_{1}m_1受到的弹簧力:k ( z _ 2 − z _ 1 ) k(z\_2 - z\_1)k(z_2−z_1)
m _ 1 m\_{1}m_1受到的弹簧力:k ( z _ 1 − q ) k(z\_1 - q)k(z_1−q)
m _ 1 m\_{1}m_1受到的阻尼力:c ( z ˙ _ 2 − z ˙ _ 1 ) c(\dot{z}\_2 - \dot{z}\_1)c(z˙_2−z˙_1)
- 注释:z ˙ _ 2 > z ˙ _ 1 \dot{z}\_2 > \dot{z}\_1z˙_2>z˙_1时,m _ 1 m\_{1}m_1相对于m _ 2 m\_{2}m_2向下运动,阻尼力向上
m _ 1 m\_1m_1的牛顿第二定律:m _ 1 z ¨ = k ( z _ 2 − z _ 1 ) + k ( z _ 1 − q ) + c ( z ˙ _ 2 − z ˙ _ 1 ) m\_{1}\ddot{z}=k(z\_2 - z\_1)+k(z\_1 - q)+c(\dot{z}\_2 - \dot{z}\_1)m_1z¨=k(z_2−z_1)+k(z_1−q)+c(z˙_2−z˙_1)
公式解析:
簧上控制簧上的加速度z _ 2 ¨ \ddot{z\_2}z_2¨提高舒适性 → 半主动悬架中调节c cc最小化z _ 2 ¨ \ddot{z\_2}z_2¨
簧下最小化轮胎动载荷波动 → 半主动悬架中调节c cc最小化KaTeX parse error: Undefined control sequence: \* at position 7: k\_{t}\̲*̲var(z\_1 - q)
约束:∣ z _ 2 − z _ 1 ∣ ≤ 最大行程 |z\_2 - z\_1|≤最大行程∣z_2−z_1∣≤最大行程
天棚算法:以簧上质量速度z _ 2 ¨ \ddot{z\_2}z_2¨为反馈,调节c cc使系统仿佛悬挂在“天空”一样,极大提升舒适性
地棚算法:以簧上质量速度z _ 1 ¨ \ddot{z\_1}z_1¨为反馈,优化轮胎接地性
混合控制:平衡舒适与操控
MPC:利用该模型预测未来状态,求解最优阻尼力序列
代码举例:
代码流程:
系统参数的定义
计算系统的固有频率和阻尼比
设置仿真时间、补偿与生成路面激励
被动悬架计算:初始化状态→计算相对位移与相对速度 → 计算簧上簧下加速度 → 性能指标计算
半主动悬架计算:初始化状态→计算相对位移与相对速度→计算期望阻尼→计算簧上簧下加速度→性能指标计算
指标解读
RMS加速度:越小越好,代表舒适性
最大悬架行程:越小越好,避免机械撞击
轮胎载荷变化:越小越好,代表操控稳定性
阻尼系数变化:显示控制算法的决策过程
路面常见的激励类型
bump:凸块或单次冲击,模拟路面上一个孤立的、瞬态的凸起或凹陷,例如减速带、路面修补后的接缝、小坑洼等。常见形状:半正弦波、三角形、矩形凸起
sine:正弦波路面,模拟具有固定波长和振幅的周期性波形路面,例如老化的水泥路接缝、洗衣板路、有规律起伏的越野路面
random:随机路面,模拟真实世界中最常见的、不规则的路面不平度,例如普通的沥青公路、乡村土路等。其不平度统计特性符合一定的功率谱密度标准。
step:阶跃,模拟路面的突然高度变化,例如路缘石、深坑的边缘、铁轨等,是一种极端的bump
importnumpyasnpimportmatplotlib.pyplotasplt plt.rcParams['font.sans-serif']=['SimHei']fromscipyimportsignalclassQuarterCarModel:""" 1/4车辆二自由度悬架模型 用于仿真和分析悬架系统的动态响应 """def__init__(self,m_s=320,m_u=40,k_s=22000,k_t=200000,c_min=1000,c_max=5000):""" 初始化模型参数 参数: m_s: 簧上质量 (kg) - 车身质量 m_u: 簧下质量 (kg) - 车轮质量 k_s: 悬架刚度 (N/m) k_t: 轮胎刚度 (N/m) c_min: 最小阻尼系数 (N·s/m) c_max: 最大阻尼系数 (N·s/m) """self.m_s=m_s# 簧上质量self.m_u=m_u# 簧下质量self.k_s=k_s# 悬架刚度self.k_t=k_t# 轮胎刚度self.c_min=c_min# 最小阻尼self.c_max=c_max# 最大阻尼# 计算系统的固有特性self.calc_natural_properties()defcalc_natural_properties(self):"""计算系统的固有频率和阻尼比"""# 簧上质量固有频率 (车身模态)self.omega_s=np.sqrt(self.k_s/self.m_s)# rad/sself.f_s=self.omega_s/(2*np.pi)# Hz# 簧下质量固有频率 (车轮跳动模态)self.omega_u=np.sqrt((self.k_s+self.k_t)/self.m_u)# rad/sself.f_u=self.omega_u/(2*np.pi)# Hz# 阻尼比 (使用平均阻尼)c_avg=(self.c_min+self.c_max)/2self.zeta_s=c_avg/(2*np.sqrt(self.k_s*self.m_s))# 车身模态阻尼比self.zeta_u=c_avg/(2*np.sqrt((self.k_s+self.k_t)*self.m_u))# 车轮模态阻尼比print(f"系统固有频率: 车身模态={self.f_s:.2f}Hz, 车轮模态={self.f_u:.2f}Hz")print(f"平均阻尼比: 车身模态={self.zeta_s:.3f}, 车轮模态={self.zeta_u:.3f}")defpassive_suspension(self,t,road_profile,c_value):""" 被动悬架仿真(固定阻尼) 参数: t: 时间向量 road_profile: 路面输入 c_value: 固定阻尼系数 返回: 包含各种响应的字典 """dt=t[1]-t[0]# 时间步长n=len(t)# 初始化状态变量z_s=np.zeros(n)# 簧上质量位移z_u=np.zeros(n)# 簧下质量位移v_s=np.zeros(n)# 簧上质量速度v_u=np.zeros(n)# 簧下质量速度a_s=np.zeros(n)# 簧上质量加速度# 初始条件(静止状态)z_s[0]=0z_u[0]=0v_s[0]=0v_u[0]=0# 数值积分(前向欧拉法,简单但稳定)foriinrange(n-1):# 计算相对位移和相对速度z_rel=z_s[i]-z_u[i]# 悬架动行程v_rel=v_s[i]-v_u[i]# 悬架相对速度# 计算加速度(牛顿第二定律)# 簧上质量加速度a_s[i]=(-self.k_s*z_rel-c_value*v_rel)/self.m_s# 簧下质量加速度a_u=(self.k_s*z_rel+c_value*v_rel-self.k_t*(z_u[i]-road_profile[i]))/self.m_u# 更新速度和位移v_s[i+1]=v_s[i]+a_s[i]*dt v_u[i+1]=v_u[i]+a_u*dt z_s[i+1]=z_s[i]+v_s[i+1]*dt z_u[i+1]=z_u[i]+v_u[i+1]*dt# 计算最后一个点的加速度z_rel_last=z_s[-1]-z_u[-1]v_rel_last=v_s[-1]-v_u[-1]a_s[-1]=(-self.k_s*z_rel_last-c_value*v_rel_last)/self.m_s# 计算性能指标rms_acceleration=np.sqrt(np.mean(a_s**2))# 加速度RMS值(舒适性指标)max_suspension_travel=np.max(np.abs(z_s-z_u))# 最大悬架动行程tire_load_variation=np.std(self.k_t*(z_u-road_profile))# 轮胎动载荷变化(操控性指标)return{'time':t,'road':road_profile,'sprung_displacement':z_s,# 簧上质量位移'unsprung_displacement':z_u,# 簧下质量位移'sprung_acceleration':a_s,# 簧上质量加速度'suspension_travel':z_s-z_u,# 悬架动行程'tire_deflection':z_u-road_profile,# 轮胎变形量'rms_acceleration':rms_acceleration,'max_suspension_travel':max_suspension_travel,'tire_load_variation':tire_load_variation,'damping_coefficient':np.ones(n)*c_value}defskyhook_control(self,v_s,v_rel):""" 天钩控制算法 参数: v_s: 簧上质量绝对速度 v_rel: 悬架相对速度 返回: 理想的阻尼系数 """# 天钩控制增益(需要调参)c_sky=3000# 天钩阻尼系数# 理想的天钩阻尼力: F_sky = -c_sky * v_s# 实际的阻尼力: F_damper = -c_actual * v_rel# 令两者相等: c_actual = c_sky * v_s / v_rel# 避免除以零ifabs(v_rel)<0.001:returnself.c_minifv_s*v_rel<=0elseself.c_max# 计算理想阻尼系数c_desired=c_sky*v_s/v_rel# 确保阻尼系数非负且在规定范围内c_clipped=np.clip(c_desired,self.c_min,self.c_max)returnc_clippeddefgroundhook_control(self,v_u,v_rel):""" 地钩控制算法 参数: v_u: 簧下质量绝对速度 v_rel: 悬架相对速度 返回: 理想的阻尼系数 """# 地钩控制增益c_ground=3000# 理想的地钩阻尼力: F_ground = -c_ground * v_u# 实际的阻尼力: F_damper = -c_actual * v_rel# 令两者相等: c_actual = c_ground * v_u / v_relifabs(v_rel)<0.001:returnself.c_minifv_u*v_rel<=0elseself.c_max c_desired=c_ground*v_u/v_rel c_clipped=np.clip(c_desired,self.c_min,self.c_max)returnc_clippeddefhybrid_control(self,v_s,v_u,v_rel,alpha=0.7):""" 混合控制(天钩+地钩) 参数: v_s: 簧上质量速度 v_u: 簧下质量速度 v_rel: 相对速度 alpha: 天钩权重 (0~1),地钩权重为1-alpha 返回: 理想的阻尼系数 """# 分别计算天钩和地钩的理想阻尼系数c_sky=self.skyhook_control(v_s,v_rel)c_ground=self.groundhook_control(v_u,v_rel)# 加权混合c_desired=alpha*c_sky+(1-alpha)*c_ground# 确保在合理范围内c_clipped=np.clip(c_desired,self.c_min,self.c_max)returnc_clippeddefsemi_active_suspension(self,t,road_profile,control_type='skyhook',control_param=None):""" 半主动悬架仿真 参数: t: 时间向量 road_profile: 路面输入 control_type: 控制类型 ('skyhook', 'groundhook', 'hybrid') control_param: 控制参数(混合控制的alpha值) 返回: 包含各种响应的字典 """dt=t[1]-t[0]n=len(t)# 初始化状态变量z_s=np.zeros(n)# 簧上质量位移z_u=np.zeros(n)# 簧下质量位移v_s=np.zeros(n)# 簧上质量速度v_u=np.zeros(n)# 簧下质量速度a_s=np.zeros(n)# 簧上质量加速度c_array=np.zeros(n)# 阻尼系数变化# 初始条件z_s[0]=0z_u[0]=0v_s[0]=0v_u[0]=0c_array[0]=self.c_min# 混合控制参数alpha=control_paramifcontrol_paramisnotNoneelse0.7# 数值积分foriinrange(n-1):# 计算相对位移和相对速度z_rel=z_s[i]-z_u[i]v_rel=v_s[i]-v_u[i]# 根据控制策略计算阻尼系数ifcontrol_type=='skyhook':c_array[i]=self.skyhook_control(v_s[i],v_rel)elifcontrol_type=='groundhook':c_array[i]=self.groundhook_control(v_u[i],v_rel)elifcontrol_type=='hybrid':c_array[i]=self.hybrid_control(v_s[i],v_u[i],v_rel,alpha)else:raiseValueError(f"未知的控制类型:{control_type}")# 计算加速度a_s[i]=(-self.k_s*z_rel-c_array[i]*v_rel)/self.m_s a_u=(self.k_s*z_rel+c_array[i]*v_rel-self.k_t*(z_u[i]-road_profile[i]))/self.m_u# 更新状态v_s[i+1]=v_s[i]+a_s[i]*dt v_u[i+1]=v_u[i]+a_u*dt z_s[i+1]=z_s[i]+v_s[i+1]*dt z_u[i+1]=z_u[i]+v_u[i+1]*dt# 计算最后一个点z_rel_last=z_s[-1]-z_u[-1]v_rel_last=v_s[-1]-v_u[-1]# 最后一点的阻尼系数ifcontrol_type=='skyhook':c_array[-1]=self.skyhook_control(v_s[-1],v_rel_last)elifcontrol_type=='groundhook':c_array[-1]=self.groundhook_control(v_u[-1],v_rel_last)elifcontrol_type=='hybrid':c_array[-1]=self.hybrid_control(v_s[-1],v_u[-1],v_rel_last,alpha)a_s[-1]=(-self.k_s*z_rel_last-c_array[-1]*v_rel_last)/self.m_s# 计算性能指标rms_acceleration=np.sqrt(np.mean(a_s**2))max_suspension_travel=np.max(np.abs(z_s-z_u))tire_load_variation=np.std(self.k_t*(z_u-road_profile))return{'time':t,'road':road_profile,'sprung_displacement':z_s,'unsprung_displacement':z_u,'sprung_acceleration':a_s,'suspension_travel':z_s-z_u,'tire_deflection':z_u-road_profile,'rms_acceleration':rms_acceleration,'max_suspension_travel':max_suspension_travel,'tire_load_variation':tire_load_variation,'damping_coefficient':c_array,'control_type':control_type}defgenerate_road_profile(self,t,profile_type='bump',amplitude=0.05,frequency=1.0):""" 生成路面激励 参数: t: 时间向量 profile_type: 路面类型 ('bump', 'sine', 'random', 'step') amplitude: 激励幅值 (m) frequency: 激励频率 (Hz,仅对正弦波有效) 返回: 路面位移向量 """ifprofile_type=='bump':# 单凸起路面(常用测试工况)road=np.zeros_like(t)bump_time=1.0# 凸起发生的时间bump_duration=0.2# 凸起持续时间# 创建半正弦凸起mask=(t>=bump_time)&(t<=bump_time+bump_duration)road[mask]=amplitude*np.sin(np.pi*(t[mask]-bump_time)/bump_duration)elifprofile_type=='sine':# 正弦波路面road=amplitude*np.sin(2*np.pi*frequency*t)elifprofile_type=='step':# 阶跃输入(模拟过台阶)road=np.zeros_like(t)step_time=1.0road[t>=step_time]=amplitudeelifprofile_type=='random':# 随机路面(更真实的工况)# 使用低通滤波器生成有色噪声np.random.seed(42)# 固定随机种子以便重复实验white_noise=np.random.randn(len(t))b,a=signal.butter(2,0.1)# 低通滤波器road=signal.filtfilt(b,a,white_noise)*amplitudeelse:raiseValueError(f"未知的路面类型:{profile_type}")returnroaddefplot_comparison(results_passive,results_semi,title_suffix=""):""" 绘制被动悬架和半主动悬架的对比图 """fig=plt.figure(figsize=(16,12))# 1. 路面输入ax1=plt.subplot(4,2,1)ax1.plot(results_passive['time'],results_passive['road'],'k-',linewidth=2,label='路面输入')ax1.set_ylabel('位移 (m)')ax1.set_title(f'路面激励{title_suffix}')ax1.grid(True,alpha=0.3)ax1.legend()# 2. 车身加速度对比ax2=plt.subplot(4,2,2)ax2.plot(results_passive['time'],results_passive['sprung_acceleration'],'b-',label=f"被动 (RMS={results_passive['rms_acceleration']:.3f}m/s²)")ax2.plot(results_semi['time'],results_semi['sprung_acceleration'],'r-',label=f"半主动 (RMS={results_semi['rms_acceleration']:.3f}m/s²)")ax2.set_ylabel('加速度 (m/s²)')ax2.set_title('车身加速度对比 (舒适性指标)')ax2.grid(True,alpha=0.3)ax2.legend()# 3. 悬架动行程对比ax3=plt.subplot(4,2,3)ax3.plot(results_passive['time'],results_passive['suspension_travel'],'b-',label=f"被动 (最大={results_passive['max_suspension_travel']*100:.1f}cm)")ax3.plot(results_semi['time'],results_semi['suspension_travel'],'r-',label=f"半主动 (最大={results_semi['max_suspension_travel']*100:.1f}cm)")ax3.set_ylabel('位移 (m)')ax3.set_title('悬架动行程对比 (机械约束)')ax3.grid(True,alpha=0.3)ax3.legend()# 4. 轮胎变形量对比ax4=plt.subplot(4,2,4)ax4.plot(results_passive['time'],results_passive['tire_deflection'],'b-',label=f"被动 (标准差={results_passive['tire_load_variation']/1000:.2f}kN)")ax4.plot(results_semi['time'],results_semi['tire_deflection'],'r-',label=f"半主动 (标准差={results_semi['tire_load_variation']/1000:.2f}kN)")ax4.set_ylabel('位移 (m)')ax4.set_title('轮胎变形量对比 (操控性指标)')ax4.grid(True,alpha=0.3)ax4.legend()# 5. 车身位移对比ax5=plt.subplot(4,2,5)ax5.plot(results_passive['time'],results_passive['sprung_displacement'],'b-',label='被动')ax5.plot(results_semi['time'],results_semi['sprung_displacement'],'r-',label='半主动')ax5.set_xlabel('时间 (s)')ax5.set_ylabel('位移 (m)')ax5.set_title('车身位移对比')ax5.grid(True,alpha=0.3)ax5.legend()# 6. 车轮位移对比ax6=plt.subplot(4,2,6)ax6.plot(results_passive['time'],results_passive['unsprung_displacement'],'b-',label='被动')ax6.plot(results_semi['time'],results_semi['unsprung_displacement'],'r-',label='半主动')ax6.set_xlabel('时间 (s)')ax6.set_ylabel('位移 (m)')ax6.set_title('车轮位移对比')ax6.grid(True,alpha=0.3)ax6.legend()# 7. 阻尼系数变化ax7=plt.subplot(4,2,7)ax7.plot(results_passive['time'],results_passive['damping_coefficient'],'b-',label=f"被动 (固定={results_passive['damping_coefficient'][0]:.0f}N·s/m)")ax7.plot(results_semi['time'],results_semi['damping_coefficient'],'r-',label=f"半主动 ({results_semi.get('control_type','自适应')})")ax7.set_xlabel('时间 (s)')ax7.set_ylabel('阻尼系数 (N·s/m)')ax7.set_title('阻尼系数变化')ax7.grid(True,alpha=0.3)ax7.legend()# 8. 性能指标总结ax8=plt.subplot(4,2,8)metrics=['舒适性\n(RMS加速度)','悬架行程\n(最大值)','轮胎载荷\n(标准差)']passive_vals=[results_passive['rms_acceleration'],results_passive['max_suspension_travel'],results_passive['tire_load_variation']/1000]semi_vals=[results_semi['rms_acceleration'],results_semi['max_suspension_travel'],results_semi['tire_load_variation']/1000]x=np.arange(len(metrics))width=0.35ax8.bar(x-width/2,passive_vals,width,label='被动悬架',color='blue',alpha=0.7)ax8.bar(x+width/2,semi_vals,width,label='半主动悬架',color='red',alpha=0.7)ax8.set_xlabel('性能指标')ax8.set_ylabel('数值')ax8.set_title('性能指标对比')ax8.set_xticks(x)ax8.set_xticklabels(metrics)ax8.grid(True,alpha=0.3,axis='y')ax8.legend()plt.suptitle(f'1/4车辆悬架模型仿真 -{title_suffix}',fontsize=16,y=1.02)plt.tight_layout()plt.show()defmain():""" 主函数:运行悬架模型仿真和对比 """# 1. 创建悬架模型实例print("="*60)print("1/4车辆二自由度悬架模型仿真")print("="*60)# 使用电动车典型参数model=QuarterCarModel(m_s=400,# 电动车簧上质量更大(电池重)m_u=45,# 簧下质量k_s=25000,# 悬架刚度k_t=220000,# 轮胎刚度c_min=800,# 最小阻尼c_max=6000# 最大阻尼)# 2. 设置仿真时间dt=0.001# 时间步长 (1ms)t_max=5.0# 总仿真时间t=np.arange(0,t_max,dt)# 3. 生成路面激励road_profile=model.generate_road_profile(t,profile_type='step',# 尝试 'bump', 'sine', 'random', 'step'amplitude=0.05,# 5cm凸起frequency=1.0)# 4. 仿真被动悬架(固定阻尼)print("\n仿真被动悬架...")c_passive=2000# 固定阻尼系数results_passive=model.passive_suspension(t,road_profile,c_passive)# 5. 仿真半主动悬架(天钩控制)print("仿真半主动悬架(天钩控制)...")results_semi=model.semi_active_suspension(t,road_profile,control_type='hybrid'# 尝试 'skyhook', 'groundhook', 'hybrid')# 6. 打印性能对比print("\n"+"="*60)print("性能对比结果:")print("="*60)print(f"{'指标':<20}{'被动悬架':<15}{'半主动悬架':<15}{'改善率':<10}")print("-"*60)# 计算各项指标的改善率acc_improvement=(results_passive['rms_acceleration']-results_semi['rms_acceleration'])/results_passive['rms_acceleration']*100travel_improvement=(results_passive['max_suspension_travel']-results_semi['max_suspension_travel'])/results_passive['max_suspension_travel']*100tire_improvement=(results_passive['tire_load_variation']-results_semi['tire_load_variation'])/results_passive['tire_load_variation']*100print(f"{'RMS加速度(m/s²)':<20}{results_passive['rms_acceleration']:<15.3f}{results_semi['rms_acceleration']:<15.3f}{acc_improvement:>8.1f}%")print(f"{'最大悬架行程(cm)':<20}{results_passive['max_suspension_travel']*100:<15.1f}{results_semi['max_suspension_travel']*100:<15.1f}{travel_improvement:>8.1f}%")print(f"{'轮胎载荷标准差(kN)':<20}{results_passive['tire_load_variation']/1000:<15.2f}{results_semi['tire_load_variation']/1000:<15.2f}{tire_improvement:>8.1f}%")# 7. 绘制对比图plot_comparison(results_passive,results_semi,title_suffix="凸起路面 - 天钩控制")# 8. 额外分析:不同控制策略对比print("\n"+"="*60)print("不同控制策略对比:")print("="*60)control_strategies=['skyhook','groundhook','hybrid']results_all={}forstrategyincontrol_strategies:ifstrategy=='hybrid':results=model.semi_active_suspension(t,road_profile,control_type=strategy,control_param=0.7)else:results=model.semi_active_suspension(t,road_profile,control_type=strategy)results_all[strategy]=resultsprint(f"{strategy:>10}: RMS加速度={results['rms_acceleration']:.3f}m/s², "f"最大行程={results['max_suspension_travel']*100:.1f}cm, "f"轮胎载荷标准差={results['tire_load_variation']/1000:.2f}kN")# 9. 绘制不同控制策略的阻尼系数变化plt.figure(figsize=(12,4))fori,strategyinenumerate(control_strategies):plt.subplot(1,3,i+1)plt.plot(t,results_all[strategy]['damping_coefficient'],'r-')plt.fill_between(t,model.c_min,model.c_max,alpha=0.1,color='gray')plt.xlabel('时间 (s)')plt.ylabel('阻尼系数 (N·s/m)')plt.title(f'{strategy}控制策略')plt.grid(True,alpha=0.3)plt.ylim([model.c_min-500,model.c_max+500])plt.suptitle('不同控制策略的阻尼系数变化',fontsize=14,y=1.05)plt.tight_layout()plt.show()returnmodel,results_passive,results_semi,results_allif__name__=="__main__":# 运行主程序model,results_passive,results_semi,results_all=main()print("\n"+"="*60)print("仿真完成!")print("="*60)天棚算法Skyhook
算法简介:用于汽车半主动悬挂系统的控制算法,旨在减轻路面颠簸对车身的影响。其核心思想是通过调节减振器的阻尼力,使车身保持相对稳定,从而提高乘坐舒适性和车辆操控性。
核心思想:想象在车身与固定不动的天空之间连接一个阻尼器,这个"天棚阻尼器"只对车身的绝对运动产生阻尼力,而不受车轮运动的影响。(理想天棚系统中,阻尼器连接车身和固定的天空,这意味着阻尼力只与车身的绝对速度有关,可以最有效地抑制车身的振动,而不受车轮运动的影响)
公式:
让实际系统的车身动力学与理想系统一致,即让两个系统的车身方程等价:
注释:减振器做不到负的阻尼系数,那只能提供最小阻尼了。如果能达到0,当然最好了,但任何一种液压阻尼可调减振器,阻尼系数都不可能做到0,是有下边界。
当算法请求阻尼系数为正的时候,需要限制在最小最大边界
C _ s k y C\_{sky}C_sky的值怎么确定呢?目前是依据经验值
图解:
当车身和车轮反向运动时,控制系统需施加大阻尼快速衰减振动
- 注释:车轮已经过了减速带最高点,开始向下运动 (v₁ < 0),但车身由于惯性还在向上运动 (v₂ > 0),此时悬架被拉伸,需要大阻尼抑制反弹
当车身和车轮同向运动时,若车身速率大于车轮速率,控制系统需要施加大阻尼衰减车身振动
- 注释:提升舒适性:直接针对车身加速度(舒适性指标)进行控制
当车身和车轮同向运动时,若车身速率小于车轮速率,控制系统需降低阻尼,小阻尼减少车轮振动传递至车身
- 例如,v1>V2且方向向上,此时m2的阻尼力方向为正向,大小为− c ( z ˙ _ 2 − z ˙ _ 1 ) -c(\dot{z}\_2 - \dot{z}\_1)−c(z˙_2−z˙_1),这个力通过悬架推着车身向上加速,我们减小阻尼可以减小这个里的大小