☰
滑模控制在车队纵向控制中的应用:Matlab与CarSim联合仿真
2026/10/20 7:52:21 网站建设 项目流程

做车队纵向控制仿真,绕不开两个东西:控制律设计和车辆动力学平台。控制律我推荐滑模控制,整定思路清晰、对参数摄动不敏感;车辆模型我常用CarSim,比纯Simulink数学模型多出轮胎、制动、转向等非线性细节,更接近实车响应。Matlab负责把滑模控制器写成可运行代码,CarSim负责把每一辆车的纵向动力学算出来,两者通过Simulink组成闭环,这就是“车队纵向控制之滑模控制在Matlab与CarSim中的实现”要解决的问题。这套方案的核心价值在于:既能验证多车编队下的间距保持与速度跟踪效果,又能把控制器算法从理想仿真平滑迁移到硬件在环甚至是实车测试流程,适合做智能驾驶控制算法、车辆纵向动力学、网联车队方向的研究生和工程师参考。

我自己在这个方向上断断续续调了大半年,踩过不少坑,包括仿真发散、接口对不上、抖动严重、车队误差逐级放大等。这篇就按我的实际操作顺序,把从控制律设计到联合仿真联调的完整过程写清楚,关键参数和踩坑经验都会直接给出。

1. 车队纵向控制到底在做什么

车队纵向控制,通俗讲就是让一排车在道路上自动排成一列行驶。头车由驾驶员或者上层决策系统控制,后面的车不靠人踩油门刹车,而是通过传感器或通信获取前车信息,自动计算油门和制动,让车间距保持在安全范围内,同时车速跟着前车平稳变化。

听起来简单,真正做起来有三个点比较麻烦。

第一是间距定义。不能把车距固定成一个绝对值,车速越快,需要的安全距离就越大,否则高速上车距太近容易追尾。所以工程上普遍采用恒定车头时距策略,也就是期望间距等于当前车速乘以一个固定时间间隔,再加一个静止间距。这相当于把间距要求变成了跟车速相关的动态目标。

第二是控制的实时性。车队里每一辆车都在运动,前车加速、减速,信息传递到后车再形成控制动作,中间有时间延迟。控制律必须在延迟和扰动存在的情况下,依然保证间距误差收敛,而不是越追越偏。

第三是串行稳定性。单辆车跟得住前车,不代表车队里十辆车都跟得住。误差从车头向车尾传递时,如果每辆车都稍微放大一点,到队尾就成剧烈振荡,这在学术上叫“误差逐级放大”,也叫串行不稳定。好的车队控制律,必须让误差沿车队向后传播时幅值不增大,最好还能逐渐衰减。

这三个要求叠在一起,线性PID控制器在某些工况下也能用,但遇到前车急加减速、路面坡度变化、车辆载重不同这类情况,PID参数就很容易失效。滑模控制就有一个天然优势:它对匹配不确定性不敏感,设计好滑模面之后,系统状态会被“拉”到滑模面上运动,外部扰动在一定范围内不会影响最终收敛性。这也是我在多个控制器之间选择滑模控制的最直接原因。

适合看这篇内容的人,我认为有两类。一类是刚接触车队控制,需要快速搭一套能跑的仿真环境,验证控制算法的可行性;另一类是已经有基础仿真,想把球形模型换成CarSim这种高保真车辆模型,看看算法在更真实动力学下的表现。

2. 滑模控制与间距策略:先想清楚再写代码

2.1 间距策略:固定间距和恒定车头时距怎么选

车队纵向控制里,间距策略直接决定控制目标。固定间距策略要求所有车保持一个绝对距离,比如始终距离前车5米。这种策略在低速园区、泊车场景里常用,因为速度低、反应时间短;但在高速公路上,固定间距5米太危险,而且当前车急刹时,后车根本没有足够时间反应。

恒定车头时距策略则把期望间距写成:

d_des = h * v + d0

其中h是车头时距,单位是秒,一般取0.8到1.5秒;v是本车速度;d0是静止时两车之间的最小间距,通常取2到5米。h取1秒的意思就是:本车速度多少米每秒,期望间距就保持多少米。车速30m/s时期望间距就是30米,车速10m/s时就是10米。

实际项目里我默认用CTH策略,因为它把安全距离和车速绑定,控制目标更合理,而且滑模控制器的误差定义可以直接在这个策略上展开。如果你做的是特定场景如高速收费站排队、园区低速接驳,再换成固定间距策略也不迟。

2.2 滑模控制律推导:用最直接的方式建立控制量

先说明我用的车辆纵向模型。实车油门、刹车响应不是瞬时的,期望加速度u经过执行器后,实际加速度a会按一阶惯性特性趋近:

dot(a) = (1 / tau) * (u - a)

tau是执行器时间常数,通常0.3到0.5秒。CarSim里没有直接给出这个tau,它通过发动机、制动器、轮胎接触力算真实加速度,但控制律设计时可以先用这个模型近似,等接入CarSim后再用反馈补偿误差。这个处理方式业内很常见,本质上是“模型不够,控制鲁棒性来凑”,而滑模控制恰好擅长干这个。

定义第i辆车与前车之间的实际间距为d_i,期望间距为d_des,间距误差:

e_i = d_i - d_des

e_i大于0说明离得太远,小于0说明离得太近。

对e_i求一阶导,结合CTH策略和运动学关系,可以得到误差动态。滑模控制的第一步是设计滑模面,我选用:

s_i = dot(e_i) + lambda * e_i

lambda是滑模面系数,决定了误差收敛速度。lambda越大,误差收敛越快,但同时会把噪声放大,一般取0.8到2.0之间。

第二步是设计趋近律。最常用的是等速趋近:

dot(s_i) = -eta * sat(s_i / delta)

eta决定系统状态接近滑模面的速度,delta是边界层厚度,用于抑制高频抖振。sat是饱和函数,当s_i绝对值小于delta时,用线性比例替代符号函数,避免控制量在滑模面附近来回切换,产生高频抖动。

第三步是解出控制量。把模型代入,令滑模面导数等于趋近律,就能解出期望加速度u_i的表达式。这里我直接给出工程上常用的形式:

u_i = a_i + (tau / h) * ( a_prev - a_i + lambda * (v_prev - v_i - h * a_i) + eta * sat(s_i / delta) )

其中a_prev是前车加速度,v_prev是前车速度,a_i和v_i是本车加速度和速度。这个式子里的前车信息既可以通过V2V通信获取,也可以用车载雷达和加速度传感器估计。公式第一项a_i是基础补偿,第二项是前车状态前馈,最后一项是滑模趋近项,负责消除误差。

实际跟车场景中前车加速度经常带噪声,我建议你别直接用原始测量值,先经过一阶低通滤波,再把滤波后的a_prev送进控制器,否则滑模面的导数会被噪声干扰,输出加速度也跟着抖。

2.3 为什么用边界层饱和函数而不是符号函数

滑模控制的经典理论里,趋近律用的是符号函数sign(s),理论上收敛性强,鲁棒性好。但工程实现时,sign(s)会让控制量在滑模面两侧高速切换,加上执行器延迟、传感器噪声、离散仿真步长,会引出高频抖振。抖振不只是控制量曲线不好看,更严重的问题是会让CarSim里的刹车模型频繁动作,仿真速度变慢,甚至数值发散。

替换成sat(s/delta)后,只要滑模面变量落在边界层内部,控制量就线性变化,不再跳变。抖振大幅降低,代价是稳态误差略微增大。delta太小,抖振消除不了;delta太大,滑模控制退化成线性反馈,失去鲁棒性。我通常从delta=0.05起步,看到加速度曲线有高频毛刺就适当增大,毛刺消失后停下来,不再继续加大。

3. Matlab与CarSim联合仿真架构与环境准备

3.1 联合仿真比纯Simulink模型强在哪

用纯Simulink搭整车模型,最省事的方法是直接写纵向动力学方程,比如质量乘以加速度等于驱动力减阻力。问题是真实车辆不是这么简单:轮胎滑移率变化会改变地面附着力,发动机扭矩响应有延迟,制动器有滞后,路面附着系数还会突变。把这些写成方程,模型会越来越大,而且参数标定极其繁琐。

CarSim把这些都封装好了。它在后台解算整车多体动力学,包括悬架、轮胎、转向系统、制动系统,对外只暴露少量输入输出接口。控制算法只需要给CarSim期望加速度或踏板开度,CarSim就能算出一辆“车”真实跑出来的车速、位移、加速度。这就是联合仿真的核心架构:Matlab/Simulink做上层控制算法,CarSim做底层被控车辆。

我做过一个对比实验:同一套滑模控制器,一个接一阶惯性模型,一个接CarSim模型,跟踪同一个前车加减速工况。纯模型仿真里间距误差收敛得漂亮,曲线光滑;接入CarSim之后,间距误差多了明显的波动,加速度毛刺也比模型仿真大。这说明CarSim带来的非线性动态让控制器经受了更真实的考验。如果你打算以后做实车验证,尽早换成CarSim联合仿真能少走很多弯路。

3.2 环境准备与接口配置的四个关键点

先用表格列一下我常用的环境组合:

项目推荐选择
MATLAB版本2018b及以上,64位
CarSim版本2019或2020,对应MATLAB版本兼容
编译器Microsoft Visual C++ 对应版本
Simulink求解器固定步长,ode4,步长0.001~0.01s

版本兼容性是我踩过最多次的坑。CarSim生成S-Function时依赖MATLAB的编译器配置,如果MATLAB里没有提前装好匹配的Visual Studio版本,运行mex命令会直接报错“未找到支持的编译器”。装好之后在MATLAB命令行执行mex -setup,确认编译器已经被识别,再进行后续操作。

接口配置上,四个关键点务必注意:

  1. CarSim的输入输出通道数量和顺序必须和Simulink模型对应。我习惯把CarSim输出顺序设为本车车速、本车加速度、本车纵坐标、本车横坐标,输入设为一个期望加速度。顺序一旦搞错,控制器拿到的信号全是乱的,而且运行时不一定报错,非常隐蔽。

  2. 仿真步长要固定。滑模控制器里有饱和函数和误差微分,用变步长求解器时,步长忽大忽小,控制量容易在边界处跳动。固定步长0.001秒最稳,CarSim跑起来慢点,但结果可信。如果验证串行稳定性需要跑几十秒车队工况,可以用0.01秒先粗调参数,最后再用小步长复现。

  3. 文件路径不能有中文和空格。CarSim输出模型和MATLAB工作目录如果有中文,S-Function的初始化经常失败,报错信息还不直观,我一开始根本没往路径上想,浪费了大半天。

  4. CarSim内部驾驶员模型要关闭。联合仿真时,CarSim自带的速度跟踪驾驶员会同时控制油门刹车,你给的外部期望加速度也控制油门刹车,两套控制打架,车辆响应会很奇怪,忽快忽慢。正确做法是在CarSim的驾驶设置里,把驾驶员功能关掉,只用Simulink来的输入控制车辆纵向运动。

4. 滑模控制器在Simulink里的落地实现

4.1 控制器代码:用MATLAB Function直接实现

我习惯用Simulink里的MATLAB Function模块写控制律,不单独建子系统,原因很简单:滑模控制公式不复杂,用代码表达更直观,而且改参数只需维护一个结构体。控制器输入是误差e、误差导数edot、前车加速度a_prev、本车速度v、本车加速度a,输出是期望加速度a_des。模型示例如下:

function a_des = sliding_controller(e, edot, a_prev, v, a, params) % 滑模控制器 lambda = params.lambda; eta = params.eta; delta = params.delta; h = params.h; tau = params.tau; % 滑模面 s = edot + lambda * e; % 饱和函数 if s > delta sat = 1; elseif s < -delta sat = -1; else sat = s / delta; end % 控制律 a_des = a + (tau / h) * (... a_prev - a + ... lambda * (edot) + ... eta * sat ... ); end

注意控制律里的edot在理论上等于v_prev - v - h*a,这是由CTH策略推导出来的。实际Simulink里我会同时保留两种来源做交叉验证:理论计算值用于控制律,实测差分值用于结果监控。这样做的好处是,如果CarSim输出噪声太大导致edot不准确,你能直接从曲线对比中发现,而不是被控制器带偏。

params结构体统一在MATLAB脚本里初始化,比如:

params.lambda = 1.2; params.eta = 2.5; params.delta = 0.05; params.h = 1.2; params.tau = 0.4;

还要加一个离散化处理。MATLAB Function在固定步长仿真里每个时间步执行一次,如果直接用连续微分,实际运行中会有数值噪声。我习惯在模块输入端加一阶低通滤波,时间常数取0.02到0.05秒,既保留信号变化趋势,又滤掉高频毛刺。

4.2 车队信号路由与状态获取

车队仿真里,每辆车本身是一个独立CarSim模型,控制器需要知道前车状态。最简单做法是让每辆车都输出位置、速度、加速度,然后在Simulink里做位置相减得实际间距:

d_i = pos_prev - pos_i d_des = h * v_i + d0 e_i = d_i - d_des

这里的纵坐标方向需要统一。默认情况下CarSim输出的是车辆自身的绝对坐标,坐标原点和方向在每次仿真里是一致的,所以可以做差。如果方向反了,间距误差的符号会反,控制器会把车越拉越近。我第一次联调时就碰到这种情况,现象是编队里后车不断加速追前车,吓得我赶紧把方向盘控制之外的所有逻辑都查了一遍,最后发现是坐标方向理解错了。

加速度信号也建议做处理。CarSim直接输出的加速度带有不少高频分量,尤其是刹车初始阶段和换挡过程,直接用会导致滑模面剧烈波动。我通常在读取加速度信号后加一个截止频率5Hz左右的低通滤波器,这样控制量平滑很多,代价是响应会滞后一点点。以滑模控制的鲁棒性,这几十毫秒的滞后完全能接受。

车队里每辆车的控制器参数可以相同,但注意前车信息只允许来自正前方那辆车,不要跨车取信号。用总线传递信号时,记得先做selector再按顺序连接,多车编队信号线很容易接错位置。我在四车编队时,因为总线分配顺序和车辆编号不一致,出现过第二车去跟随第三车的情况,调式了半小时才发现在路由环节顺序写反了。

5. CarSim与Simulink联调全流程

5.1 CarSim整车模型配置要点

在CarSim里选择车型时,我一般直接选B级车或者C级车默认模型,不改悬架轮胎参数,因为纵向控制主要关心驱动制动响应,横向参数影响不大。需要改的是以下几个方面:

初始速度设成和头车一致,这样从一开始间距误差就是0附近,控制器启动时不会出现瞬间大阶跃。如果初始速度不一致,控制器一上来就输出很大的加速度,仿真初期曲线很难看,也不利于观察稳态性能。路面附着系数用默认干燥沥青路面,先验证理想工况,等控制器调稳定了再改低附着系数路面测试鲁棒性。

挡位设置我通常是自动挡。CarSim的自动变速器逻辑已经内置,你控制的是期望加速度,不需要手动换挡。如果是纯电动车模型,没有换挡问题,控制更直接。发动机模型内部有一个很关键的地方:当外部期望加速度为负值时,CarSim会自动协调油门和制动,这个逻辑在联合仿真时一定要确认开启,否则车辆只会收油门而不会踩刹车,减速度完全靠阻力和坡度,和前车距离会越拉越大。

CarSim模型输出配置里,把纵向速度、纵向加速度、纵向坐标选出来。不要一次选太多信号,Simulink侧接口多容易乱,而且每个新增通道都会增加仿真时间。等控制器跑稳了,需要研究乘坐舒适性时,再把纵向加加速度等信号加进去。

5.2 Simulink闭环联调的操作顺序

第一步,在CarSim主界面把模型配置保存成新的数据集,然后点击“Send to Simulink”或者“Generate S-Function”,生成CarSim S-Function模块。这种模块本质上是一个封装好的Simulink自定义模块,底层调用CarSim动态库接口。

第二步,打开Simulink模型,把CarSim S-Function模块拖进来,双击进去设置输入输出通道。通道数量和顺序必须跟CarSim里配置一致。这一步最容易犯错的地方是:CarSim模块默认参数是上一次仿真遗留的值,如果换了一个数据集,通道配置变了但没点刷新,模块参数还是旧的,导致信号错位。

第三步,把控制器模块和CarSim模块连起来。完整闭环信号流是:

CarSim输出本车速度、加速度、坐标到Simulink,Simulink里根据前车坐标和本车坐标算实际间距,再结合本车速度算出期望间距,两者相减得到误差,误差经过滑模控制器计算出期望加速度,期望加速度送进CarSim模块作为输入。前车的速度、加速度在前一个车辆子系统里输出,通过数据总线传到本车控制器。

第四步,设置仿真时间和求解器。我先用10秒验证单车跟踪,工况设计为:前车初始速度25m/s,2秒后开始以2m/s²减速到15m/s,保持5秒再加速回25m/s。这个简单工况能同时考察匀速跟踪、减速跟车、加速恢复三种动态。控制器参数初值用上一节里那组,Simulink固定步长0.001秒,仿真开始前在MATLAB工作区运行参数初始化脚本,确保params结构体存在。

第五步,运行仿真,看结果。仿真结束时,如果MATLAB命令行没有报错,但曲线明显发散了,优先检查步长和控制器符号,不要第一时间怀疑CarSim模型。

扩展多车编队时,我建议先在单车上验证控制器能跟踪前车,然后把单辆车的子系统复制成多份,逐一改车辆编号和信号路由。四车编队用到的CarSim模型数量多,仿真时间会比单车慢很多,我通常会先用0.01步长粗跑一遍,观察串行稳定性趋势,确认整体收敛后用0.001步长精算。

6. 仿真结果怎么看:从间距误差到串行稳定性

6.1 三张关键曲线

联合仿真跑完,最先看的是间距误差曲线。横轴时间,纵轴每辆车相对前车的间距误差。理想曲线应该在零轴附近收敛,前车加减速时出现短暂的峰值后快速回零。如果误差曲线稳态偏离零,说明控制律里缺少消除静态误差的手段,可以检查前车加速度前馈是否接对了,以及低通滤波器是否引起滞后。

第二张看速度曲线。所有车速度应该大致重合,前后车速度差不能过大。前车减速时,后车跟随减速的曲线如果出现明显超调,说明lambda太大;如果响应太慢、速度拖尾,说明eta太小或者滤波时间常数太大。

第三张看期望加速度和实际加速度对比。期望加速度能反映控制律的“激进程度”,实际加速度反映车辆的响应结果。如果期望加速度频繁在正负之间切换,或者高频抖振明显,先调delta再调eta。如果期望加速度数值很大,超过CarSim执行器的物理极限,需要限制输出幅值,一般限制在-3m/s²到3m/s²之间,对应日常驾驶的舒适性和安全性边界。

车队编队后还要额外看一串误差曲线。将第二辆车、第三辆车、第四辆车的误差画在一张图里,从前往后观察峰值变化。如果误差幅值沿车队方向递增,说明串行不稳定,需要调整控制参数或者间距策略。串行稳定性分析常用传递函数方法,但在仿真实操里,曲线峰值有没有逐级放大是最直观的判据。

6.2 一组调参实测与记录

我用四车编队跑了一个前车减速工况,记录了几组参数的实验结果:

参数组合现象
lambda=0.8, eta=1.5, delta=0.05误差收敛偏慢,减速工况最大间距误差0.9m,恢复时间长
lambda=1.5, eta=3.0, delta=0.05收敛变快,最大误差降到0.5m,但期望加速度出现小幅高频抖动
lambda=1.2, eta=2.5, delta=0.08最大误差0.6m,加速度曲线平滑,编队误差沿车队方向略有衰减
lambda=1.5, eta=3.0, delta=0.15曲线非常平滑,但跟随滞后明显,减速时后车间距被拉大较多

最后我选择第三组参数作为基准。这个选择经验是:不要盲目追求最小间距误差,因为误差小往往意味着控制量大、舒适性差。实际车队控制里,间距误差小于1米已经完全可以接受,重要的是不能有抖动和串行发散。

另一个调参心得来自tau。tau在控制律里是前馈补偿项,理论上应该和执行器响应的实际时间常数一致。但CarSim里不存在一个直接可测的tau,我试过0.3、0.4、0.5三档,差别主要体现在大加速度变化时刻:tau偏小时控制器前馈偏激进,车辆实际来不及响应,误差峰值反而变大。最终取0.4,和CarSim默认车辆模型的响应特性比较匹配。

还有一次典型问题是四车编队中最后两辆车间距持续偏大。排查后发现,CarSim输出信号经过路由器时,第三车的加速度被错误地接到了第二车的控制器里,导致第二车收到的是第三车的前车信息,整个后段车队信息链错乱。改回正确路由后,误差立即回到正常水平。信号路由正确性是联合仿真里最不起眼却最致命的问题。

7. 高频问题与避坑实录

我把实际操作中遇到的问题汇总成了一张速查表,基本都是花过时间排查的:

现象常见原因对策
仿真几秒后发散,车速冲上极高值步长太大、趋近律增益过大、误差符号反向步长调到0.001s,eta先降到1.0再逐步增大,检查实际间距正负号
加速度曲线高频抖振边界层delta太小、前车加速度噪声未滤波delta从0.05往0.15调,前车加速度加低通滤波
后车间距持续过大且不收敛前车加速度前馈没接上或滤波过度滞后确认a_prev信号路由,滤波截止频率提高到10Hz
CarSim模块报S-Function初始化失败版本不匹配、mex编译器未配置、路径含中文mex -setup重新配置编译器,路径改为英文无空格
车辆响应忽快忽慢CarSim内部驾驶员模型没关闭进入驾驶设置,关闭速度控制,只保留外部输入
间距误差收敛到非零稳态滤波器稳态误差或期望间距公式里d0遗漏检查d0是否代入,滤波器改用无偏形式
多车编队中某辆车信号错乱总线信号顺序和车辆编号不一致逐段检查Selector输出顺序,用Display模块实时观察信号
减速时误差峰值过大前车未来加速度未知,滞后明显加入通信预测或者提高eta,同时对期望加速度限制下限

前三个问题属于参数调试范畴,解决起来比较顺手。后几个问题属于系统工程范畴,尤其S-Function初始化和信号路由,不是看公式能解决的,只能靠检查配置和多次测试积累经验。

几个额外的经验:

  1. 保存一份“能跑通的最小模型”。单车跟车、一个CarSim加一个控制器,所有参数固定,先确认这一套模型随时能跑出正常结果。任何改动在副本上做,改坏了能立刻回到基线,不用从头排查。

  2. CarSim和MATLAB版本匹配是最大的环境风险。换电脑或者换版本后,第一步先跑示例模型,不要直接跑自己的车队模型,否则容易把环境问题和模型问题混在一起,增加排查难度。

  3. 滑模控制的离散时间实现里,每增加一组低通滤波,就相当于在控制回路里加了一个延迟源。滤波器不能乱加,每个滤波器都要明确目的:是为了滤传感器噪声,还是为了抑制抖振。没有目的的滤波器不如不加。

  4. 期望加速度上下限一定要做饱和。CarSim里的执行器有物理边界,你给一个10m/s²的期望加速度,车辆不会真的产生10m/s²,但数值上可能出现不合理的响应。限制在-4到4m/s²之间更贴近实车物理约束,在仿真结果解读时也能避免被虚假的控制量迷惑。

  5. 前车工况文件建议单独制作一个标准测试用例:先匀速、再小幅减速、再急减速、再加速恢复。一套工况反复跑,所有控制器方案都在同一基准上比较,调参记录才有参考价值。不然每次换工况调参,参数之间不可比,很难形成有效经验。

我个人在实际操作中的体会是,滑模控制器本身只占整个项目的一小部分,真正花时间的是环境配置和联合仿真联调。控制律公式半小时能写完,但让CarSim和Simulink稳定跑通一个四车编队,可能需要三天。这不是说算法不重要,而是说在工程仿真里,集成能力和排错能力往往决定了研究成果能不能落地。如果你也在做类似的车队控制仿真,我建议从单车跟踪开始,先让一辆车稳定跟上给定的速度曲线,再扩展成多车编队。每一步都确认输出信号正确、曲线符合物理直觉,再往前走。这样踩坑面会被控制在一个很小的范围内,整体进度反而最快。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询