ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

低附着路面半挂汽车列车折叠失稳仿真与差动制动控制

低附着路面半挂汽车列车折叠失稳仿真与差动制动控制

我自己真正开始较真“半挂汽车列车横向稳定性控制”这个问题,是因为冬天在服务区门口亲眼看了一场折叠事故。一辆满载的半挂列车在匝道口的冰面上稍微带了点方向,挂车就开始左右甩,车头几乎被拽着转了180度,场面很吓人。从那以后,我花了两个多月时间,把整套控制方案搬进仿真环境反复验证,主题就压在低附着系数路面上——干燥沥青路面的问题相对温和,而雪面、冰面、雨后积水才是重卡最容易翻车和折叠的场景。

这篇文章把我做这个仿真探索的完整过程写出来,包括失控机理的拆解、TruckSim仿真环境怎么搭、差动制动控制器怎么设计、测试工况和评价指标怎么定,以及我踩过的那些文档里不会写的坑。如果你是做商用车底盘控制、动力学仿真的工程师,或者正在写相关课题的学生,这篇应该能帮你省下不少试错时间。

1. 低附着路面上半挂列车为什么“一转弯就折叠”:失控机理拆解

1.1 多了一个铰接点,多了一整个风险维度

半挂汽车列车和单体车最大的区别,就是牵引车和半挂车之间多了一个第五轮鞍座铰接点。这个铰接点带来了一个额外的自由度,也带来了一整套新的动力学耦合关系。

牵引车横摆时,鞍座位置的速度方向会跟着变化,直接改变挂车的侧偏角;而挂车产生的侧向力又会通过鞍座反作用于牵引车车尾。这个双向耦合在一个稳定的车速区间内是收敛的,但在轮胎附着力下降、挂车载荷转移等条件下,耦合回路的增益会快速上升,形成正反馈。

单体车失控往往是“甩尾”或者“推头”,而半挂列车最典型的失控是折叠——英文里叫jackknife,业内也翻译成“折刀”。牵引车和挂车之间的铰接角一旦突破临界值,整车就会像一把折叠刀一样折起来,彻底丧失控制能力。

1.2 低附着路面把安全余量压缩到了什么程度

低附着系数路面意味着轮胎和地面之间的附着极限大幅降低。干沥青路面的峰值附着系数通常在0.8到0.9,而压实雪面大约在0.3到0.4,纯冰面可能只有0.1到0.2。我之前做对比仿真时用的是μ=0.2的均匀冰雪路面,基本等价于压实冰面或者雪后初冻的路况。

附着系数下降带来两个核心问题。

第一,轮胎侧向力的线性区被急剧压缩。干路面上侧偏角到4度时侧向力还在上升,冰面上可能到2度就饱和了。也就是说,挂车能提供的修正侧向力极其有限,稍微超过饱和点,挂车就会整体侧滑。

第二,附着椭圆效应更严重。轮胎同时承担纵向力和侧向力时,合力不能超过附着极限。半挂列车在转向过程中如果还带着制动,纵向力已经占了一部分附着裕度,侧向力可用空间就更小了。这就是为什么很多折叠事故都发生在“边转边踩刹车”的场景里。

第三点容易被忽略的是载荷转移。满载半挂车质心高,紧急制动时挂车载荷向前转移,后轴垂直载荷下降,相当于轮胎侧偏刚度进一步减小。牵引车制动时前轴载荷增加,前轮侧偏能力增强,但挂车后轴侧偏能力减弱,前强后弱的组合正好促进折叠发生。

1.3 三种失稳模式与对应的控制目标

在实际仿真中,我把半挂列车低附着路面的失稳归纳成三种典型模式。

失稳模式特征变量典型触发工况主要危害
折叠(Jackknife)铰接角快速增大超过临界值紧急转向叠加制动、低附着路面车头甩动严重,甚至原地调头
挂车摆振(Trailer Sway)挂车横摆角速度持续振荡轻转向或侧风扰动、光滑路面占据多个车道,严重时触发侧翻
轨迹内切与甩尾挂车质心侧偏角过大弯道车速过高、对开路面挂车滑出车道或撞击护栏

针对这些模式,控制目标就很清楚了。首要目标是限制铰接角峰值,防止折叠;其次是让牵引车横摆角速度稳定跟踪参考值,保证整车响应可控;最后是抑制挂车摆振,不让小扰动演变成持续振荡。这套目标在后面设计控制器时会直接转化成滑模面的设计项。

2. 仿真环境搭建:TruckSim整车参数、魔术公式轮胎与低附着路面设置

2.1 为什么选TruckSim+Simulink联合仿真而不是纯自建模型

做这类控制验证,我见过不少人直接用一个三自由度单轨模型(牵引车横摆+挂车横摆+铰接角)来推公式,然后在这个模型上做控制,最后结果曲线都很漂亮。但说实话,简化模型忽略掉了轮胎非线性饱和、载荷转移、双胎并装、悬架侧倾这些对低附着稳定性影响极大的因素,拿来发论文可以,拿来判断“真车会不会折叠”不太够。

我采用的是高低搭配方案:控制器设计阶段用简化模型做理论分析和参考模型推导,验证阶段用TruckSim的高保真整车模型。TruckSim不用多说,商用车动力学仿真里很成熟的一套工具,自带完整的半挂列车模板、空气悬架、鞍座铰接、差速器和轮胎模型,还能跟Simulink通过S-Function接口做联合仿真。版本上我用的是TruckSim 2019配MATLAB R2020b,求解器统一设成固定步长1ms,后面会说到为什么必须固定步长。

2.2 整车参数怎么设才接近真实重卡

TruckSim自带的半挂列车模板是很好的起点,但默认参数偏“理想化”。我按常见满载工况调整了关键参数,具体数值参考了国内标准半挂列车的大致水平,如表所示。

参数项牵引车半挂车
整备/满载质量7500 kg22000 kg(满载组合约29.5t)
轴距3.6 m5.2 m(后三轴)
质心高度0.95 m1.5 m
质心纵向位置前轴后1.2 m挂车几何中心前1.8 m
轮胎前轴单胎,后轴双胎三轴双胎
鞍座位置牵引车后轴后方0.45 m挂车前端下缘

这里有两个参数特别影响低附着稳定性。一是挂车质心高度,它对载荷转移量影响很大,纯冰面上这个数值差0.2米,仿真结论可能就完全变了。二是鞍座相对牵引车后轴的位置,它直接决定了牵引车和挂车之间的横摆耦合强度和铰接角的运动学关系。没有精确参数时,宁可保留TruckSim默认结构,只是在质量参数上做修改,也不要拍脑袋乱填。

2.3 轮胎模型和低附着路面设置的三个细节

TruckSim默认用的是Pacejka魔术公式轮胎模型,侧向力表达式大概是Fy = D·sin(C·arctan(B·α - E·(B·α - arctan(B·α))))。其中D系数直接等于峰值附着系数乘以垂直载荷,B、C、E共同决定曲线形状。在干路面上这套默认标定没问题,但改到冰雪路面时有几个细节,我刚开始没注意,导致仿真结果失真严重。

第一个细节,不要只把路面全局摩擦系数改成0.2。TruckSim的路面参数里有轮胎-路面摩擦对滑移率和侧偏角的二维映射,如果只改一个常数μ值,轮胎模型内部数据还是干路面的曲线形态,仿真结果往往是“突然失去附着”,而不是渐进饱和,这跟真实冰雪路面不完全一致。我后来换用了TruckSim自带的冰雪路面数据集,或按低附着需求手动把D系数按μ比例缩小,同时适当调低C值让饱和来得更平缓。

第二个细节,低附着下轮胎的峰值附着系数对应的滑移率会移动。干燥路面上峰值附着一般在滑移率10%到15%,冰雪路面可能提前到5%左右。这一点会影响ABS和差动制动分配时对滑移率阈值的判断,后面分配器保护逻辑里会用到。

第三个细节,半挂车后轴的并装双胎在低附着下侧偏刚度下降更明显。双胎并装相当于两个轮胎的侧偏力叠加,但载荷分配并不均匀,冰雪路面上一侧轻微抱死,另一侧会瞬即过载。建模仿真时我建议保留双胎模型,不要把后轴简化成单胎。

2.4 联合仿真的接口清单与步长约定

TruckSim和Simulink联合仿真时,接口变量要自己配。我最终用的核心信号清单大致如下:

  • 输入到控制器的测量量:牵引车横摆角速度、挂车横摆角速度、铰接角、车速、质心侧偏角(TruckSim直接输出)、各轮轮速
  • 控制器输出到TruckSim的执行量:各轮制动缸压力(或制动压力增量)
  • 辅助观测量:鞍座横向力、挂车侧偏角、路面附着估计值

这里特别强调步长。TruckSim的S-Function在变步长模式下会带来不确定的时间延迟,低附着控制对延迟非常敏感,我一开始用变步长跑,结果控制器输出的附加横摆力矩在相邻步长之间来回跳,整车曲线全是毛刺。改成固定步长1ms之后,问题立刻消失。控制器的运行周期我放在了5ms,也就是200Hz,实测在μ=0.2的工况下比10ms周期稳很多。

3. 差动制动控制器设计:从参考模型到制动力分配的实现路径

3.1 差动制动、主动转向、挂车转向的取舍

横向稳定性控制的主流方案大概有差动制动(直接横摆力矩控制,DYC)、主动前轮转向(AFS)、挂车主动转向,以及几者之间的集成方案。我在项目设计阶段做了一轮对比,结论如下。

方案执行器基础优点主要短板低附着下适用性
差动制动各轮现有制动系统商用车已有EBS/ABS基础,工程落地最容易控制过程伴随车速下降很好,但需防抱死
主动前轮转向额外转向执行器响应快,不损失纵向车速低附着下前轴侧向力易饱和中等,单独用效果有限
挂车主动转向挂车轴转向机构直接抑制挂车侧偏和铰接角增长成本高,结构改动大效果好但工程化难度高
集成方案转向+制动性能上限最高控制逻辑复杂,协调难度大适合做学术探索

我最终选择差动制动为主线,原因很直接:半挂列车尤其是牵引车部分,几乎都标配了ABS/EBS,差动制动等于在现有硬件上增加一层控制逻辑,不需要新增执行机构。另外,低附着路面上,通过单侧制动产生附加横摆力矩,相当于直接利用纵向力差值来“拧”整车姿态,物理路径很直接。挂车主动转向虽然理论上对铰接角控制最友好,但这套系统在量产重卡上还非常少见,论文里看看可以,当作主线方案不太现实。

3.2 分层控制架构和参考模型的修正

控制架构我做了三层:上层是状态参考模型和控制目标计算,中层是滑模控制器计算期望附加横摆力矩,下层是制动力分配器把力矩转成各轮制动压力。

参考模型这一层有个特别容易踩的坑。用线性二自由度模型算期望横摆角速度时,公式是r_ref = vx / (L·(1+K·vx²)) · δ。这个公式基于干路面假设,算出来的目标值在低附着路面上经常是物理上根本达不到的。如果不做修正,控制器会拼命去追一个过大的目标横摆角速度,结果就是持续输出大制动力、持续饱和,整车反而更不稳定。

我加的修正很简单:按当前路面附着系数限幅,r_max = μg / vx。也就是说,期望横摆角速度的绝对值不允许超过当前附着条件能提供的上限。同时,铰接角也要参与参考模型修正:当铰接角超过设定的死区阈值(比如3度)时,适当降低期望横摆角速度,相当于主动放弃一点转向响应能力,换取不让铰接角继续增大。

质心侧偏角方面,初期处理比较简单,直接用TruckSim输出的β,省去观测器设计。但实际项目中如果你没有可靠的侧偏角信号,建议至少设计一个运动学估计器,β = arctan(vy/vx),低速下够用,高速低附着下会有一定误差,后续可以用卡尔曼滤波融合。

3.3 滑模控制器与制动力分配伪代码

为什么用滑模控制?因为低附着路面最大的特点是模型参数不确定性大——附着系数可能从0.2跳到0.8,轮胎侧偏刚度随载荷变化明显。滑模控制对被控对象参数变化有天然鲁棒性,尤其适合这类“路面条件不可预知”的场景。代价是容易抖动,后文会专门讲抖振的处理。

滑模面设计如下:

s = (r - r_ref) + λ1·(β - β_ref) + λ2·max(φ - φ_dead, 0)

其中r是牵引车横摆角速度,φ是铰接角,φ_dead是铰接角死区,λ1和λ2是权重系数。控制律采用带边界层的饱和趋近律:Mz = -η·sat(s/Φ),其中Φ是边界层厚度。

下面是控制器核心逻辑的伪代码,Matlab风格:

function Mz = yaw_stability_controller(r, r_ref, beta, beta_ref, phi, vx, mu_est) % 低附着下按附着系数限制目标横摆角速度 r_ref = min(abs(r_ref), mu_est * 9.81 / max(vx, 1.0)) * sign(r_ref); % 铰接角死区:小于3度不参与控制 phi_dead = 3.0 * pi / 180; phi_term = max(phi - phi_dead, 0); lambda1 = 1.5; lambda2 = 0.6; s = (r - r_ref) + lambda1 * (beta - beta_ref) + lambda2 * phi_term; eta = 100; % 趋近率增益 Phi = 0.02; % 边界层厚度 Mz = -eta * sat(s / Phi); % sat为饱和函数,替代sign end

制动力分配器把期望附加横摆力矩转化为左右侧制动力差值,再换算成制动压力:

function [P_left_delta, P_right_delta] = brake_force_allocator(Mz, Fz_est, mu_est) track_half = 0.9; % 半轮距,单位m wheel_r = 0.52; % 车轮滚动半径,单位m K_brake = 12000; % 制动效能因数,N·m/MPa量级 dF_left = max(-Mz, 0) / track_half; % 左侧制动产生顺时针横摆力矩 dF_right = max( Mz, 0) / track_half; % 低附着下单轮最大可产生纵向力 mu*Fz 限制 dF_left = min(dF_left, mu_est * Fz_est * 0.9); dF_right = min(dF_right, mu_est * Fz_est * 0.9); P_left_delta = dF_left / K_brake * wheel_r * 1e3; % MPa P_right_delta = dF_right / K_brake * wheel_r * 1e3; end

大概思路就是:如果期望附加横摆力矩为正(需要向左转向),给右侧车轮加压;反之给左侧加压。分配器本身要清楚每个车轮能产生多大的力,不能超限。

3.4 低附着下必须加的三层保护逻辑

这部分是实践里最关键的,论文里一般不会写这么细。

第一层保护是单轮滑移率保护。差动制动说白了是有选择地给某个车轮加制动压力,但如果在冰面上给的力超过轮胎-路面附着极限,轮子直接抱死,侧向力归零,车辆不仅得不到附加横摆力矩,反而提前失去稳定性。我在分配器里加了一条硬规则:当目标车轮滑移率超过0.25时,该轮不再参与差动制动,让位给ABS逻辑。这条保护可比任何软参数都管用。

第二层保护是压力变化率限制。制动压力不要瞬间拉满,尤其低附着路面,压力突变会引起车辆瞬态响应过激。我给压力增量设置了斜率上限,大约相当于从0加到最大压力的时间不低于150ms,这个数值需要根据仿真初步调整。

第三层保护是控制介入阈值。控制器不能时时刻刻都介入。我设定只有同时满足“横摆角速度跟踪误差超过阈值”和“铰接角变化率较大”两个条件时,才输出非零的控制力矩。持续介入会让半挂列车始终处于被“拧来拧去”的状态,驾驶员会觉得方向盘手感僵硬,且实际能耗很高。

4. 双移线、阶跃转向与对开路面:稳定性测试工况和评价指标怎么定

4.1 工况别只盯双移线

很多文章一上来就是双移线,好像一个ISO双移线就能把所有问题测出来。实际上,双移线是“综合大考”,它能触发失稳,但很难告诉你失稳的具体机制。我建议把工况分成四组,每一组针对一个特定的动力学问题。

工况车速转向输入路面附着主要考察内容
双移线70/80 km/h标准双移线轨迹μ=0.2综合避障能力、铰接角极限状态
阶跃转向60 km/h方向盘阶跃0.2 radμ=0.2瞬态响应、横摆角速度超调量、铰接角峰值
正弦扫频70 km/h0.05~2 Hz扫频μ=0.3挂车摆振模态频率、共振状态下控制器抑制效果
对开路面50 km/h直线行驶加轻微转向左侧μ=0.2,右侧μ=0.8附着不对称引起的横摆扰动抑制能力

对开路面这个工况非常狠。左侧车轮在冰面上,右侧车轮在干路面上,左右侧附着力严重不对称,车辆会不自觉地往低附着侧偏转。这个工况对差动制动控制器的鲁棒性要求极高,因为控制器必须先判断出当前路面附着差异,再把附加横摆力矩输出到正确的一侧,否则会越控越偏。

4.2 评价指标:铰接角、横摆跟踪误差与稳定域

评价控制效果不能只凭一句“没翻车”。我用来做定量对比的指标有这么几项:

  • 铰接角峰值 |φ|max:这是防止折叠最直接的指标。我设定的警戒线是15度,超过这个值基本进入折叠危险区。
  • 铰接角超限时间占比:统计仿真过程中铰接角超过15度的时间占比,占比越接近零越好。
  • 横摆角速度跟踪均方根误差(RMSE):衡量控制器能否让牵引车横摆响应忠实跟随参考模型。
  • 挂车质心侧偏角峰值:挂车侧偏角过大说明挂车整体在侧滑,这是轨迹内切和甩尾的前兆。
  • 路径横向偏差:对于双移线工况,测量挂车质心相对参考轨迹的最大横向偏差,评估控制是否牺牲了部分路径跟踪能力。
  • β-dot与β相图:把质心侧偏角变化率对质心侧偏角画成相轨迹,车辆稳定时相轨迹收敛在某个有限范围内;一旦发散,说明超出了稳定域。

我在项目里设了一个综合评价线:μ=0.2、车速80km/h的双移线工况下,无控制时铰接角峰值通常轻松超过15度,甚至直接折叠;加上差动制动控制后,目标是把铰接角峰值压到7度以内,横摆角速度RMSE至少下降40%,同时车速不能掉得太难看。

4.3 开环转向输入还是驾驶员模型?先选开环

又一个容易被新手忽略的坑:测试工况里的转向输入到底怎么给。

如果直接用驾驶员模型跟踪路径,车辆失稳后驾驶员模型会自己修正转向,也就是说它“帮助稳定”了一部分,控制器的真实效果会被遮掩。我在初期对比时发现,无控制组的驾驶员模型在双移线里居然也能勉强通过,但查看铰接角曲线发现已经接近极限——驾驶员模型在暗中救场。

所以我的建议是:第一轮先把转向输入写成开环固定的角度序列(一段预定义的方向盘转角随时间变化曲线),让车辆在无控制下真实地暴露失稳过程;第二轮再换成闭环驾驶员模型,验证控制器在“有人驾驶”场景下的配合效果。这样两轮数据对照,才能把控制器的边界看清楚。

5. 仿真结果、参数整定与那些文档里不会写的坑

5.1 有控制和无控制的典型结果对比

放一组我比较满意的代表性结果,前提是μ=0.2均匀冰雪路面、80km/h双移线、开环转向输入、半挂列车满载。无控制组的方向盘转角从第2秒开始施加第一个换道动作,到第3.5秒整车已经进入折叠前兆,铰接角在1.5秒内从-2度狂飙到15度以上,挂车质心侧偏角逼近12度,车辆基本失去控制。

加上差动制动控制器之后,同样的方向盘转角输入下,结果明显不同:

评价指标无控制差动制动控制
铰接角峰值18.7 °5.2 °
挂车质心侧偏角峰值12.3 °3.8 °
横摆角速度跟踪RMSE6.1 °/s2.3 °/s
控制器介入后车速降幅80→57 km/h80→64 km/h
挂车轨迹最大横向偏移超出车道边界车道内通过

注意这个车速降幅。差动制动控制的代价就是车速下降,因为控制过程本质上是利用纵向制动力差产生横摆力矩,必然会消耗一部分车速。这个代价在双移线这种紧急场景下完全可以接受——毕竟保命比保速度重要得多。但如果频繁介入,能耗和舒适性都顶不住,这也是我坚持设置控制介入阈值的原因。

5.2 滑模抖振、力矩饱和、单轮抱死:三个坎

第一个坎是抖振。滑模控制天生自带高频切换属性,我用sat函数替代sign函数之后抖振缓解了不少,但在低附着、高增益组合下仍然存在。现象是制动力分配指令每个仿真步长都在来回跳,TruckSim输出的横摆角速度曲线全是锯齿。后来我在控制器输出后加了一阶低通滤波器,截止频率约10Hz,同时把趋近率增益η从150降到100,才把锯齿压下去。注意低通滤波不能太狠,相位延迟会让控制效果明显变差,这一点要反复调。

第二个坎是力矩饱和。低附着下单个车轮能够提供的最大纵向力就是μ·Fz,控制器如果要求的力矩超过物理极限,分配出去的制动压力会直接让车轮抱死。我的分配器里加了两道约束:一道是单轮制动力限幅,另一道是全局期望横摆力矩上限。上限值我按μ·m·g·轮距/2来估算,留10%的裕度。这样控制器再“贪心”,执行器也不会超出物理能力。

第三个坎是单轮抱死与ABS冲突。差动制动和ABS都在管制动压力,两个逻辑可能打架——稳定性控制器希望左前轮加压,ABS检测到左前轮即将抱死又去泄压,压力来回震荡。我的解决方法是把优先级交出去:一旦某轮滑移率超过0.25,分配器对该轮停止输出,完全交给ABS处理。在现实EBS系统里,稳定性控制一般也是叠加在ABS之上的,安全优先级必须是ABS先保住车辆不抱死。

5.3 铰接角权重和挂车制动参与的教训

参数整定过程中有两个结论,是我花了不少时间才试出来的。

第一个是铰接角权重λ2不能太大。我一开始想着要防折叠,把λ2设到1.2,结果在双移线第二个弯道上,控制器为了压铰接角,拼命给牵引车一侧制动,牵引车横摆不过来,整车轨迹严重内偏,挂车差点切到内侧护栏。铰接角不能只是“越小越好”,物理上转弯时需要一定的铰接角才能实现正常跟随。我把λ2降到0.4~0.6,并加了3度死区,让控制器只在铰接角明显偏大时介入,效果立刻改善。

第二个是挂车制动参与的问题。我早期设计时希望挂车后轴也参与差动制动,觉得“多一个轴出力多一分稳定”。实际仿真完全不是这样:挂车后轴一旦产生纵向制动力,由于挂车质心和鞍座之间的杠杆效应,挂车会绕着鞍座转得更快,铰接角反而增长更快,折叠来的更早。后期我把挂车轴完全排除在常规分配之外,只在铰接角超过8度、接近折叠边缘时给挂车单侧一个很小的阻尼力矩,总共也就几百牛米。这个结论跟不少文献里的结论是一致的:低附着下半挂列车的差动制动应该以牵引车为主,挂车参与要非常谨慎。

5.4 仿真步长与求解器的隐性坑

最后说一个纯仿真层面的坑,但它直接决定了前五个坑的调试难度。

TruckSim和Simulink联合仿真如果用变步长求解器,S-Function模块的调用间隔不固定,相当于在控制通道里注入了随机时延。低附着控制系统对相位延迟极度敏感,我当时仿真曲线上一会儿稳一会儿发散,查了好久才发现是步长问题。改为固定步长1ms之后,所有现象都能稳定复现,问题定位才变得容易。

另外控制器的运行周期也要跟着路面条件走。干路面上控制周期10ms够用,但μ=0.2的冰面上,我用10ms周期跑出来的铰接角峰值比5ms周期高了不少。原因是低附着下系统失稳速率快,控制指令晚一拍的代价被放大了好几倍。所以如果你也在做低附着仿真,建议控制周期至少5ms,资金允许的话甚至可以到1ms。

我在这个项目里最大的体会是,低附着路面就是一个“放大器”,会把模型误差、参数过激、执行器延迟全部放大到可见的程度。仿真阶段把这些坑趟完,以后真上实车至少能少走一半弯路。下一步我计划把路面附着估计加进去,做一套自适应增益的控制器,再对比一轮挂车主动转向方案,希望到时候能把半挂列车在冰面上的控制边界再往外推一点。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进