
搞车辆底盘仿真的工程师对横摆角速度这个词应该再熟悉不过了。在Matlab/Simulink仿真环境下搭建汽车稳定控制系统最核心的任务就是让实际横摆角速度老老实实跟踪驾驶员意图对应的目标值。这篇文章想聊的是我在这类项目里从建模到调参完整走过一遍后的经验整理为什么横摆角速度是稳定控制的关键变量Simulink仿真框架怎么搭控制器怎么设计以及那些文档里不会写但实测必踩的坑。无论是正在做毕业设计的学生还是刚接触底盘域控测试的工程师应该都能在里边找到能直接落地的内容。1. 为什么稳定控制系统偏偏盯住横摆角速度1.1 横摆角速度的物理意义横摆角速度符号通常写作ω_r或γ表征的是车辆绕垂直轴z转动的角速度单位是rad/s。可以通俗地理解成你打方向时车头转得“猛不猛”。在车辆的平面运动里描述车辆姿态变化只需要两个量横向位置变化速率对应的质心侧偏角β以及绕垂直轴的转动角速度ω_r。如果ω_r和驾驶员期望的不一致最直观的结果就是车“推头”或者“甩尾”。ESP系统介入时正是通过对某一个车轮施加制动力产生一个附加横摆力矩ΔM把实际的ω_r纠正回来。换句话说横摆角速度直接反映了车辆对转向输入的响应速度。驾驶员转动方向盘车辆的横摆角速度变化越快转向就越“跟手”。但跟手并不一定安全尤其当路面附着系数很低时横摆角速度可能超过物理极限车辆随即失控。所以稳定控制系统盯住横摆角速度本质上是盯住“车辆是否转得过头了”。1.2 二自由度参考模型怎么来的车辆实际非常复杂但做控制设计时常用二自由度自行车模型。它把车辆简化为前后两个车轮忽略载荷转移、悬架运动等只保留横向运动和横摆运动两个自由度。核心方程如下m * v * (β ω_r) C_f * (δf - β - a * ω_r / v) C_r * (-β b * ω_r / v)I_z * ω_r a * C_f * (δf - β - a * ω_r / v) - b * C_r * (-β b * ω_r / v)其中m是整车质量v是纵向车速I_z是绕z轴的转动惯量a、b分别是质心到前、后轴的距离C_f、C_r是前后轮侧偏刚度δf是前轮转角。这个模型的输入是前轮转角δf输出是β和ω_r。在Simulink里可以用状态空间模块实现也可以直接搭积分模块。以横摆角速度为控制变量是因为参考模型的输出ω_ref可认为是“驾驶员想要多少横摆”而实际车辆由于轮胎非线性、路面附着不足实际ω_r跟不上控制器就要产生横摆力矩来补偿。这就是ESP/DYC直接横摆力矩控制的基本逻辑。做仿真时先把参考模型和被控对象都简化成二自由度能极大降低入门门槛同时保留稳定控制的核心矛盾。1.3 为什么还要看质心侧偏角只控制横摆角速度并不是万能。在极限工况如低附着路面急转向时可能出现“车头转向了但车身没跟着转”的危险状态这时候质心侧偏角β已经很大但ω_r可能仍然接近目标。所以实际工程中的稳定控制系统会同时监测β甚至在β过大时优先限制β。但在入门仿真里控制变量以横摆角速度为主加上β的约束判断已经能体现系统的核心逻辑。我记得第一次仿真时只盯横摆角速度曲线结果曲线漂亮得不行后来把β调出来看发现车辆已经明显侧滑了。从那时候起我再也不单独看一个变量横摆角速度和质心侧偏角一定同时监测。2. Matlab/Simulink仿真框架搭建步骤2.1 仿真环境与车辆参数准备我用的是Matlab R2020b版本新版本功能也差不多Simulink环境里需要几个基础模块Constant、Integrator、Gain、Sum、Saturation、Scope、To Workspace等。车辆参数一般用什么我给一组常用整车参数都是真实项目里能跑通的量级参数符号数值单位整车质量m1500kg横摆转动惯量I_z2500kg·m²质心到前轴距离a1.2m质心到后轴距离b1.4m前轴侧偏刚度C_f-80000N/rad后轴侧偏刚度C_r-120000N/rad轮距d1.55m注意侧偏刚度的正负号在不同的教材里不一样建模前必须统一坐标系。按照“侧偏力 侧偏刚度 × 侧偏角”的约定侧偏刚度取负值。这个细节我后面踩坑部分还会详细说。2.2 参考模型模块期望横摆角速度计算在Simulink中为了实时计算期望ω_ref我一般直接用二自由度模型的稳态公式ω_ref δf * v / (L * (1 K * v²))其中L a bK是稳定性因数K m / L² * (a / C_r - b / C_f)。这个公式来自车辆稳态转向特性。当K0为中性转向K0为不足转向K0为过多转向。大多数乘用车被设计成具有微弱不足转向特性所以K为正值。关键点ω_ref不能无限增长受路面附着条件限制上限由μg/v决定。一般取ω_ref_max μ * g / v也就是侧向加速度不超过μg。如果不加这个饱和限幅低附着路面仿真时由于ω_ref超过物理极限控制器会拼命输出仿真结果完全失真。我习惯用Saturation模块限制幅值并做一个平滑过渡避免突变。下面是我经常放在参考模型子系统里的MATLAB函数示例直接写成函数块的形式function omega_ref ref_yaw_rate(delta_f, v, mu, g, L, K) % 根据稳态转向公式计算期望横摆角速度 omega_ss delta_f * v / (L * (1 K * v^2)); omega_max mu * g / v; % 由路面附着限制的最大横摆角速度 omega_ref max(min(omega_ss, omega_max), -omega_max); end2.3 被控车辆动力学模型这里有两种选择一是直接用二自由度模型同时作为参考模型和被控对象这样控制起来比较容易二是搭建更复杂的包括魔术公式轮胎模型的整车模型。对于学生项目和工程预研我建议先用二自由度整车模型带轮胎非线性来验证控制逻辑再跑软件在环或Carsim。在Simulink中二自由度车辆模型直接按状态方程搭建注意输入δf和附加横摆力矩ΔM输出β和ω_r。如果使用魔术公式轮胎模型侧向力由轮胎侧偏角决定公式较复杂可以在一个子系统中用Fcn模块实现。但注意低附着路面要设置μ值比如μ0.2的冰雪路面魔术公式的侧偏刚度峰值会下降。实测中轮胎模型参数对结果影响极大调参前先标定。2.4 附加横摆力矩如何加入系统横摆角速度控制器的输出不是直接给车轮角度而是一个附加的横摆力矩ΔM单位N·m。这个力矩怎么加到车辆模型上很简单在车辆横摆运动方程中等式右侧增加一项ΔM / I_z。Simulink里就在原横摆方程求和模块的地方多加一个输入。如果被控对象用的是二自由度方程直接加如果是Carsim联合仿真就要通过接口把ΔM转换成四个车轮的制动力矩通常采用差动制动的分配方式。比如对前轴外侧车轮单独制动产生一个逆着转向方向的横摆力矩。3. 控制器设计让实际横摆角速度跟上目标3.1 控制目标的误差定义控制系统的核心是跟踪ω_ref。误差定义为e ω_r - ω_ref或者反过来输入给控制器输出ΔM。控制器结构有很多种最常见的是PID和滑模。这里我重点讲PID和滑模两条路。3.2 PID参数整定的实际体会PID在车辆稳定性控制中应用很广。仿真里P是比例增益I用于消除稳态误差D用于抑制超调。我试过的整定步骤先只给P逐步增大直到系统开始振荡然后取临界增益的0.6~0.8倍再加I一般很小太大容易引发低频振荡再加D用于减小超调。但注意在倒车或大侧偏角时横摆角速度信号的白噪声会被D放大可能造成控制器抖振。我一般会在D环节前加一阶低通滤波。给一组我常用的初始值P1000I50D0先不加。为什么P的量级是1000因为参考误差单位rad/s输出力矩N·m需要足够增益才能产生有效的横摆力矩。但具体值一定要基于你的车辆参数和附着条件重新调。3.3 滑模控制设计一种更稳的选择滑模控制设计思路是选取一个滑模面s e c * ∫e dt其中c0。控制律可以取趋近律s -k * sign(s)或者饱和函数sat(s/Φ)来削弱抖振。用李雅普诺夫函数V0.5s²有V s * s -k|s|只要k0系统就会收敛到滑模面。滑模的好处是对参数摄动不敏感但坏处是抖振。实际仿真中直接用sign函数控制力矩会高频切换导致结果毛刺很大。我习惯用饱和函数替代sign边界层厚度Φ取0.05~0.1。不过要注意边界层越大控制精度越差这个权衡要靠仿真试出来。3.4 ΔM到四轮制动力矩的分配策略附加横摆力矩分配到车轮上需要判断当前转向方向和控制方向。简单策略如果要产生向右的横摆力矩顺时针且车辆正在左转就对右前轮施加制动力反之对左前轮。制动压力产生的制动力可以近似F ΔM / (d/2)d为轮距然后分配到液压制动器。实际工程中还有基于轮胎负荷率的分配算法但在仿真阶段前轴单侧制动或后轴单侧制动已经能演示效果。注意制动力不能超过轮胎与地面的附着极限否则抱死因此要加制动力上限。4. 仿真工况设计与结果分析4.1 典型测试工况怎么选验证稳定控制系统主要用三种工况。一是阶跃转向方向盘转角瞬间打到一定角度然后维持考验系统对稳态目标的跟踪能力。二是正弦转向比如0.5Hz正弦扫频考验动态响应。三是双移线工况ISO 3888模拟紧急避障这是最接近实际危险驾驶的工况。在Simulink中方向盘转角可以用Signal Builder或时间表模块设置并作为车辆模型的前轮转角输入。注意转向传动比方向盘转角除以传动比才是前轮转角这个换算经常被忽略。4.2 评价指标判断控制效果的指标包括横摆角速度跟踪误差的绝对值积分IAE、峰值跟踪误差、质心侧偏角峰值、侧向位移轨迹是否贴合。还可以做一个“无控制”的对比组。比如在低附着路面μ0.3车速80km/h给定一个1Hz正弦转向无控制车辆横摆角速度明显滞后甚至发散而加入控制器后实线几乎贴着参考曲线。下面是我常用的一张结果整理格式工况无控制峰值误差有控制峰值误差β峰值阶跃转向 μ0.80.12 rad/s0.03 rad/s4°阶跃转向 μ0.30.35 rad/s0.06 rad/s8°正弦转向 μ0.30.28 rad/s0.05 rad/s7°4.3 仿真结果怎么看跑完后打开Scope重点看三组曲线参考ω_ref、实际ω_r、控制器输出ΔM。如果实际曲线始终跟随参考且ΔM没有来回剧烈波动基本合格。如果ΔM高频振荡说明滑模抖振没处理好或PID的D增益过大。另外车辆横摆角速度跟踪上去了还要看质心侧偏角有没有发散。我踩过的坑是只盯ω_r忽略了β结果曲线虽然完美但车辆侧滑得一塌糊涂这在仿真里看不出来实际试驾会出事。所以建议把β也显示出来设置一条预警线比如β超过10°就认为系统失效。5. 调参踩坑记录横摆角速度仿真的五个常见问题5.1 参考横摆角速度限幅没做控制器输出饱和第一次做低附着仿真时我直接用了稳态公式没加Saturation结果车辆模型输出横摆角速度疯狂发散。分析后发现在μ0.2的路面车速100km/h期望横摆角速度应该被限制在约μg/v 0.210/(27.8) ≈ 0.07 rad/s。如果不限幅控制器会试图输出一个根本不可能实现的横摆力矩导致积分项饱和。解决方式是加限幅模块同时把参考横摆角速度的斜率也限制一下模拟执行器响应延迟。5.2 侧偏刚度符号和坐标系不统一二自由度模型在很多教材里C_f、C_r取正值然后公式里有负号在另一些资料里直接取负。如果你是把两个参考混合使用很容易力道全反。我建议统一按照“侧偏力F_y C * 侧偏角α”来定义且C为负值然后Simulink里力矩等于力乘以力臂不要额外添加符号。要快速验证符号是否正确可以让前轮开一个小角度阶跃看稳态横摆角速度是否指向转弯方向。如果反了把C或公式的符号改过来。5.3 采样时间和求解器步长不匹配Simulink默认变步长求解器如果配置不当会出现波形失真的问题。我在做高频抖动的滑模控制时遇到过控制力矩毛刺太多后来检查发现仿真步长设成了固定0.01s但控制器内部还有连续状态导致高频振铃。建议固定步长至少取1kHz0.001s以上或者用变步长ode45并设置最大步长0.001s。如果模型比较大用离散定步长反而稳定但需要用Zero-Order Hold把连续信号采样。关键是与实际控制器运行频率一致仿真才可信。5.4 与Carsim联合仿真的协作通道问题在Simulink里自建车辆模型只是第一步后续一般会和Carsim联仿。联仿时Carsim输出车速、质心侧偏角、横摆角速度等Simulink控制器计算ΔM后再通过接口给Carsim。最容易出问题的是单位不一致Carsim里横摆角速度可能按deg/s输出Simulink里你用的rad/s直接连上去控制量会差57.3倍。我有个习惯每次联仿先只接通道不接控制对比Carsim自带的横摆角速度和Simulink测得的信号确认量纲一致后再闭环。另外力矩分配接口要确认Carsim的制动压力单位bar和我们计算出的制动力N之间的换算关系通常还需要除以制动效能因数。5.5 控制器启动瞬间的冲击如果参考输入突然从0跳变到某个值控制器输出会有很大冲击。一个简单的做法是给参考横摆角速度接一个速率限制器或者让控制器输出通过一个一阶惯性环节模拟执行机构延迟。这会让系统更接近真实也能避免仿真一开始就发散。最后说一个让我印象很深的细节有一次我为了把跟踪曲线调到完美把PID的P增益提得很高结果是模型因为数值刚性问题直接仿真失败。后来我意识到车辆稳定控制系统真正难的地方不是把误差压到零而是在路面附着极限边缘找到那个平衡点。横摆角速度作为控制变量看起来只是跟踪一条曲线实际上背后是轮胎物理特性和执行器响应速度的博弈。建议你自己在Simulink里多换几个附着系数、多跑几种转向工况把无控制与有控制的曲线叠加对比感受会非常直观。