自适应滑模观测器在Carsim/Simulink联合仿真中实现轮胎力估计

发布时间:2026/9/17 4:38:58
自适应滑模观测器在Carsim/Simulink联合仿真中实现轮胎力估计 大家在做Carsim联合仿真时有一个问题绕不开轮胎的纵向力和侧向力到底是多少我之前搞横向稳定性控制时这两个量直接进控制律但实车传感器根本给不出来Carsim内部虽然算了轮胎力外部接口选得不熟练时又碰不到这些信号结论只剩一个——用状态观测器估。当时我试过线性的龙贝格观测器也试过卡尔曼滤波最后真正能在复杂工况下稳住、而且调参逻辑比较直观的是自适应滑模观测器。这篇就把我这边能跑通的整套方案讲清楚从为什么非得走观测器路线、模型怎么建到滑模面和自适应律怎么设计再到Carsim与Simulink联合仿真把估计结果和真实值对比验证最后聊聊下游能拿来干什么。适合正在做车辆动力学控制、底盘域控算法验证、或者联合仿真课程设计的朋友参考。很多人会把滑膜观测器打成滑膜行业里正规叫法其实是滑模观测器Sliding Mode Observer。这个细节不影响理解但去搜资料和写论文时尽量保持一致下面统一用滑模。1. 为什么轮胎力是测不出来却必须在控制里用到的量1.1 直接测量几乎不现实先说结论当前量产车的传感器体系里没有直接量测轮胎六分力的成熟方案。轮胎纵向力和侧向力力的作用点是轮胎与地面的接地印迹中心旋转、泥水、高温、冲击负荷全都在这个位置。想在轮毂上装六分力传感器目前主要停留在试验车和赛车领域一台车传感器费用常常比车本身还贵而且装上之后对轮毂结构、簧下质量、耐久性都有影响量产阶段基本不会考虑。间接方案比如通过电机电流估算驱动扭矩再折算纵向力依赖于电机模型的准确性制动工况又完全行不通。所以工程上的通用做法是把轮胎力当作一个不能被直接测量的重要状态量用能测的运动量配合系统模型把它反推出来。常见的可以测的量有纵横向车速、横摆角速度、方向盘转角、轮速、加速度等。用这些数据通过观测器估计力是控制领域里的标准思路。1.2 用能测的运动量推算测不到的力观测器思路观测器做的事情一句话就能说清观察系统的输入输出利用模型关系重建内部状态。车辆运动方程里力和运动是绑在一起的。车在路面上怎么加速、怎么横摆本质上就是各个轮胎力及外力共同作用的结果。只要模型关系准确观测器就能根据可观测量不断修正对力的猜测值最终让猜测值收敛到真实值附近。拿一个最简化的纵向动力学方程来说m * Vx_dot Fx_total - F_res如果已知整车质量m、纵向加速度Vx_dot可以由轮速或者GPS推算减去已知阻力项F_res剩下的自然就是总纵向力Fx_total。问题在于测量噪声和模型误差会把这个减法放大得很夸张直接微分会得到一条噪声爆炸的曲线。观测器的作用就是在这个微分/积分关系里加入修正反馈让估计值既能跟踪真实变化却又不会跟着噪声一起疯。1.3 为什么选择滑模路线而不是卡尔曼滤波这里说一点我踩过的对比结论。卡尔曼滤波不管是普通KF还是扩展EKF在车辆状态估计里很流行它的逻辑是给模型不确定性一个协方差描述再结合测量噪声统计特性做最优融合。听起来很好实际用起来有痛点噪声协方差矩阵Q、R不好给给不对就容易发散或者过度平滑。车辆模型本身是非线性的EKF要做线性化在强非线性工况紧急转向、附着力突变下线性化误差会让估计偏差增大甚至发散。轮胎模型魔术公式、Dugoff等的参数本身就有很大的经验不确定性想让滤波器鲁棒需要调很多权重。滑模观测器的逻辑不一样它不追求最优而是追求在模型误差和扰动存在时输出误差仍然被强制拉到一个滑模面上。只要不确定性满足匹配条件且上界已知滑模项就能压制这些不确定性不需要挨个给噪声统计特性建精确模型。对工程控制来说少调一组协方差矩阵、多获得稳定的误差收敛性是很有吸引力的。代价也有滑模控制/观测带来抖振直接体现在估计力的曲线可能会出现高频毛刺。这个在后面会给出处理手段比如边界层sat函数替代sign函数以及等效控制的低通滤波提取两者配合能压住大部分毛刺。2. 建模起点一个够用且不复杂的车辆动力学模型2.1 三自由度模型纵向、侧向、横摆自适应滑模观测器要落地第一步是选一个既包含目标力、又足够简化的车辆模型。这里我推荐三自由度单车模型考虑了纵向运动、侧向运动、横摆运动忽略俯仰、侧倾以及左右轮载荷转移的详细差异这些当作模型不确定项交给滑模项吸收。定义整车坐标系下的状态Vx纵向车速m/sVy侧向车速m/sr横摆角速度rad/s整车参数参数说明测试参考值m整车质量1270 kgIz绕Z轴转动惯量1536 kg·m²a质心到前轴距离1.1 mb质心到后轴距离1.6 mL轴距ab2.7 m运动方程为m * (Vx_dot - r * Vy) Fx_total - F_resm * (Vy_dot r * Vx) Fy_f Fy_rIz * r_dot a * Fy_f - b * Fy_r三个方程左边都是运动量Vx、Vy、r及其导数右边是力。第一个方程里Fx_total是四个轮胎纵向力之和F_res是空气阻力和滚动阻力之和第二个和第三个方程里的Fy_f、Fy_r分别是前轴和后轴的侧向力。这里特别解释一下方程里出现的rVy和rVx是耦合项你会发现纵向方程里混有侧向速度、侧向方程里混有纵向速度这就是为什么车辆运动不能分解成两个独立的单方向问题。观测器设计时必须把这三状态当作整体处理否则工况一复杂就会出现误差耦合。2.2 轮胎模型的分工估计对象与建模对象的区别很多刚开始做观测器的朋友会在这里绕晕我要估计轮胎力那观测器里是不是必须先用Dugoff或魔术公式轮胎模型去计算力答案是不一定。可以把轮胎力当作待估计的未知输入观测器通过滑动模态反推它也可以把轮胎力当作状态变量用轮胎模型的解析关系作为状态演化约束。两种路线都存在。我采用的策略是纵向力通道把Fx_total当成一个未知扰动输入用滑模观测器直接从运动方程上重构出来不依赖轮胎-路面模型。侧向力通道Fy_f、Fy_r作为两个未知量出现在两个方程中利用横摆方程和侧向方程联立解出。这样轮胎模型魔术公式只在最后验证阶段或者离线标定阶段使用不作为观测器的必要依赖。这样做的优势很明显路面附着系数变化、胎压变化、轮胎磨损等导致轮胎模型失配时滑模观测器不会被带偏因为它没有要求轮胎模型多准确。如果你希望轮胎力估计更平滑、而且你恰好有不错的轮胎模型参数也可以把观测器升级成扩张状态形式把Fy_f、Fy_r增广为状态用自适应律更新。文末扩展部分我会再提这个方向。2.3 从Carsim可获取的信号清单联合仿真环境下Carsim相当于提供了一辆数字试验车。它内部有一套完整的车辆动力学仿真多体动力学加详细轮胎模型我们观测器要用的信号从Carsim的输出通道里选即可。常用输出量Carsim输出变量物理含义单位Vx车速纵向分量m/sVy车速侧向分量m/sAVz 或 YawRate横摆角速度rad/sSteer_L1前轮转角radFx_L1、Fx_R1等各轮纵向力用于对比NFy_L1、Fy_R1等各轮侧向力用于对比N特别注意Vx、VyCarsim内部不同版本的变量单位可能有差异。曾经我就被坑过一次Carsim某些输出通道默认给km/hSimulink侧直接按m/s参与计算估计的力幅值直接差3.6倍曲线形状倒是正常排查了半天才发现是单位问题。联合仿真阶段我最推荐的做法先做开环估计验证也就是Carsim内部的驾驶员模型自己开车Simulink只接收运动量信号运行观测器然后把观测器的估计力输出和Carsim输出的真实轮胎力放同一张图对比。这一步通了再做闭环控制把估计力反馈进控制器再控制Carsim输入。不要一上来就闭环排错难度会翻倍。3. 自适应滑模观测器的设计与调参细节3.1 设计框架从两个状态通道分别重构Fx和Fy整体观测器分为两条通道纵向通道用Vx的测量值构建滑模面通过等效控制重构Fx_total。侧向通道用Vy和r的测量值构建两个滑模面通过联立等效控制重构Fy_f和Fy_r。这样设计的理由是三自由度模型里纵向力主要影响Vx侧向力主要影响Vy和r通道间的耦合项作为已知项反馈到两边的重构公式中。虽然不能完全解耦但在可测状态全量已知的情况下工程实现是稳定的。3.2 纵向力重构一阶滑模面与低通等效注入纵向通道的观测器状态方程写为Vx_hat_dot r * Vy (Fx_hat - F_res)/m u_smc_x其中u_smc_x是滑模控制项取为u_smc_x -ρx * sign(Vx_hat - Vx)把观测方程和真实方程相减得到误差方程e_vx_dot (Fx_hat - Fx_total)/m u_smc_x当滑模运动建立后误差e_vx被压制到0等效原理告诉我们滑模项的平均值约等于未知输入和已知输入的综合u_smc_x_eq ≈ (Fx_total - Fx_hat)/m这里Fx_hat是观测器内部维持的一个慢变量实际重构方案有两个选择选择一直接把u_smc_x经低通滤波器输出再乘m作为Fx_total估计值。也就是Fx_hat_total m * LPF(u_smc_x)选择二给Fx_hat设计自适应更新律。比如Fx_hat_dot γx * sat(e_vx)我的实践中选择一配合一阶惯性滤波是最好调的。原因是Fx_hat作为慢变量时自适应增益γx大了易振荡、小了收敛慢而低通滤波加饱和特性更符合工程师的手感。一阶惯性滤波器G(s) 1/(τx*s 1)τx推荐从0.01s开始试如果估计曲线滞后明显降到0.005s如果曲线毛刺大升到0.02s。注意τx太大会带出相位滞后导致估计的动态过程变慢。3.3 侧向力重构从两个滑模面解耦出Fy_f/Fyr侧向通道有两个可测量Vy、r对应两个观测状态Vy_hat_dot (Fyf_hat Fyr_hat)/m - r*Vx u_smc_yr_hat_dot (aFyf_hat - bFyr_hat)/Iz u_smc_r分别取滑模面s_y Vy_hat - Vys_r r_hat - r滑模控制项u_smc_y -ρy * sat(s_y/φy)u_smc_r -ρr * sat(s_r/φr)通过低通滤波分别得到等效控制量u_eq_y LPF(u_smc_y)u_eq_r LPF(u_smc_r)在滑模运动阶段等效控制量应当抵消掉观测方程与真实方程的偏差u_eq_y ≈ -(Fyf_hat Fyr_hat - Fyf - Fyr)/mu_eq_r ≈ -(aFyf_hat - bFyr_hat - aFyf bFyr)/Iz如果把Fyf/Fyr本体当成慢变量把Fyf_hat/Fyr_hat看成一阶小偏差量我们可以近似解出实际侧向力的估计值。更工程化的做法是当我们只需要估计Fyf、Fyr本身而不是跟踪缓慢漂移时可以直接让Fyf_hat、Fyr_hat不参与方程改为用u_eq_y和u_eq_r直接解方程令总力X_sum Fyf Fyr横摆力矩Y_diff aFyf - bFyr由滑模等效控制得X_sum ≈ -m * u_eq_yY_diff ≈ -Iz * u_eq_r那么Fyf_hat (b * X_sum Y_diff)/(a b)Fyr_hat (a * X_sum - Y_diff)/(a b)对照一下物理意义X_sum是侧向力之和决定车体侧向加速度Y_diff是前后轴侧向力对质心的横摆力矩之差决定横摆角加速度。两个信息恰好可以唯一定位前后轴侧向力。这个代数解耦是侧向力重构里最简洁的做法。3.4 三个关键参数怎么整定参数整定是自适应滑模观测器从代码能跑到曲线能用的关键一步。主要整定三组参数滑模增益ρx、ρy、ρr过小误差不能被拉回滑模面估计值会缓慢漂移后面常表现为阶跃输入下估计力上升缓慢。过大滑模面快速建立但抖振幅值增大低通滤波负担加重曲线毛刺明显。我的参考起点ρx取5~10ρy取5~10ρr取10~20再根据曲线微调。注意单位是加速度量纲相关的所以不同状态的增益本身量级不同这不是故障。边界层厚度φx、φy、φrsat函数的线性段宽度sat函数替代sign函数在边界层内部是比例控制在边界层外部是Bang-Bang控制。φ取0.1~0.5之间太小则接近sign的抖振太大则滑模精度变差。我通常先用φ0.3起步观察稳态误差稳态误差大就减小φ抖振大就增大φ。这是一种直观的权衡。低通滤波时间常数τx、τy、τr等效控制提取的本质是低通滤波需要滤掉高频切换分量、保留低频等效分量。这组参数直接影响估计力的动态特性和延迟需要根据实际工况频率来选。双移线工况主能量在0.5~2Hz正弦转向工况可能到3Hz左右滤波截止频率建议在5~10Hz对应τ0.015~0.03s保证保留动态信息的同时滤除高频开关噪声。最后提醒如果估计出的轮胎力用于闭环控制器整套观测器的相位滞后会影响到控制增益边界。具体表现是你按照理想无延迟模型把控制器增益调高联调时发现系统不稳定出现极限环振荡这时候优先怀疑对象是观测器延迟而不是控制器本身。4. Carsim与Simulink联合仿真从配置到调试的完整过程4.1 Carsim车辆模型选择与仿真工况设置Carsim操作界面分为三块Vehicle Configuration、Procedure、Run Control。建模逻辑类似选择参数化车辆模板比如常见的C-Class hatchback、sedan等然后到Procedure里配置驾驶员模型和道路工况。做轮胎力观测器验证我不建议一开始就用极限工况比较推荐的工况组合基础工况稳态圆周加速比如车速从60km/h加速到100km/h方向盘转角固定。这个工况下纵向力和侧向力同时存在但变化相对平缓适合看观测器是否收敛、稳态精度如何。进阶工况双移线Double Lane ChangeISO 3888标准避障工况方向盘连续快速变化侧向力动态特性明显适合检验观测器动态跟踪能力。极限工况低附着路面μ0.3加正弦转向。这测试的是路面附着突变时观测器是否稳健。在Procedure里注意开始车速设置、换挡策略以及制动/油门控制方式。Carsim的驾驶员模型有内部闭环因为要跟踪设定车速和路径我们观测器不干预它纯粹的旁听式估计这样方便对比真值。4.2 接口配置输出通道、输入通道与单位坑Carsim与Simulink联合仿真接口是核心踩坑也多。具体操作点击Run Control页签在Interface类型里选择Simulink接着配置输入输出通道Import Channels / Export Channels。输出通道从Carsim到Simulink至少需要Vx、Vy、AVz方向盘转角或前轮转角如果要做真值对比把四条轮胎的Fx、Fy也勾上输出输入通道从Simulink回到Carsim这一阶段可以暂时不配或者只保留最少量。因为是旁听式验证不需要给Carsim发控制信号。我建议首次联调时留空输入通道减少变量。单位坑再强调一次Carsim部分版本在输出变量列表里显示的速度值带km/h单位但到Simulink接口里其实转换成了m/s还有转角单位可能是度而不是弧度。安全做法是勾选输出后在Simulink里先加Display或Scope模块把信号拉出来看量级和物理意义是否匹配再做观测器接入。生成到Simulink的通道是通过Run Control页签的Send to Simulink按钮打开/生成一个Simulink模型里面自带一个Carsim S-Function模块。这个模块的名字通常形如CS_XXX版本不同有差异双击进去可以看到输入输出端口定义。这一步成功后整个联合仿真框架是Simulink负责观测器算法Carsim负责车辆和道路动力学。4.3 Simulink中的S函数框架和核心代码骨架观测器算法我建议写成Matlab Function或者C Mex S-Function不建议用纯Simulink积分器搭建因为各种符号函数、滤波时间常数在纯模块化搭建下变得难以维护。以Matlab Function为例核心骨架如下function [Fx_hat, Fyf_hat, Fyr_hat] adaptiveSMO(Vx, Vy, r, F_res, params) % 可调参数结构 m params.m; Iz params.Iz; a params.a; b params.b; rho params.rho; phi params.phi; tau params.tau; dt params.dt; % 持久变量: 状态估计值和滤波值 persistent Vx_hat Vy_hat r_hat persistent int_sat_y int_sat_r int_sat_x if isempty(Vx_hat) Vx_hat Vx; Vy_hat Vy; r_hat r; int_sat_x 0; int_sat_y 0; int_sat_r 0; end % --- 纵向通道 --- e_x Vx_hat - Vx; u_smc_x -rho * sat(e_x / phi); Vx_hat_dot r * Vy u_smc_x - F_res/m; Vx_hat Vx_hat Vx_hat_dot * dt; % 低通滤波提取等效控制 int_sat_x int_sat_x dt * (u_smc_x - int_sat_x)/tau; Fx_hat m * int_sat_x; % --- 侧向通道 --- e_y Vy_hat - Vy; e_r r_hat - r; u_smc_y -rho * sat(e_y / phi); u_smc_r -rho * sat(e_r / phi); Vy_hat_dot (Fy_prev_sum)/m - r*Vx u_smc_y; Fy_prev_sum -m * int_sat_y; r_hat_dot u_smc_r; Fy_prev_diff -Iz * int_sat_r; Vy_hat Vy_hat Vy_hat_dot * dt; r_hat r_hat r_hat_dot * dt; int_sat_y int_sat_y dt * (u_smc_y - int_sat_y)/tau; int_sat_r int_sat_r dt * (u_smc_r - int_sat_r)/tau; X_sum -m * int_sat_y; Y_diff -Iz * int_sat_r; Fyf_hat (b*X_sum Y_diff) / (ab); Fyr_hat (a*X_sum - Y_diff) / (ab); end function u sat(v) if v 1 u 1; elseif v -1 u -1; else u v; end end上面代码是简化的示例思路重点展示滑模项生成、低通滤波等效控制、代数重构三块逻辑。实际工程里要注意几个点持久变量在Simulink里可以用persistent关键字但一定要处理好初始化否则第一帧会出错。仿真步长一致性问题Carsim S-Function模块通常有自己的通信步长观测器的运算步长建议和Carsim通信步长一致避免插值错位。如果Carsim通信步长1ms观测器也按1ms跑。如果在代码里直接使用sign代替sat曲线会非常毛糙后来换sat加低通后估计曲线就干净很多。这一点是经验之谈。另外Simulink里Matlab Function模块默认需要指定采样时间如果模型中其他模块是连续模块也在Module里把采样时间设为-1继承。如果你用C Mex S-FunctionmdlInitializeSizes里要设置继承采样时间然后在mdlUpdate/mdlOutputs里实现上述逻辑执行效率会更高但调试周期长。一般教学和方案验证阶段Matlab Function足够。4.4 联合仿真跑通后的验证曲线怎么看跑完仿真最直观的就是把估计的Fx_hat、Fyf_hat、Fyr_hat和Carsim输出的真值Carsim内部模型计算的结果放一起对比。正常的预期是稳态阶段估计值围绕真值小幅波动误差在5%~10%以内。因为滑模观测器有滑模面和低通滤波完全重合不现实小幅波动是正常的。动态阶段估计曲线会略滞后于真值滞后相位主要来自低通滤波时间常数。双移线工况下这种滞后如果不超过30ms对控制来说通常可接受。初始阶段第一段0.1秒左右可能有大误差。原因是观测器状态从初始值开始收敛需要时间。解决方法是把状态初始值设成Carsim仿真開始第一个时刻的测量值或者直接运行车辆模型几秒后再启动观测器。如果误差出现持续偏差而不是小幅波动排查顺序是先查单位再查滤波时间常数再查滑模增益是否足够压制模型不确定度。5. 估计结果的下游应用与扩展想法5.1 稳定性控制中的Fx/Fy反馈轮胎纵向力和侧向力的估计值最直接的下游应用是车辆稳定性控制。典型例子是直接横摆力矩控制DYC控制目标是把实际横摆角速度跟踪到驾驶员意图对应的参考值。传统方法用横摆角速度误差直接算附加横摆力矩再通过差动制动分配四个车轮的制动力。问题是制动力分配时如果不考虑轮胎当前侧向力裕度很容易在极限工况下导致某些车轮过度滑移。如果观测器能持续提供四个轮胎的Fx和Fy估计值就可以计算每个轮胎的附着利用率ηη_i sqrt(Fx_i² Fy_i²) / (μ * Fz_i)这个指标表示每个轮子在附着椭圆内到底用了多少余量。DYC控制器在分配制动力时优先选择附着利用率较低的车轮承担更多制动任务避免所有需求都压给附着裕度已很小的外侧前轮。这套逻辑在论文里常见真正落地时没有实时的Fx/Fy估计是做不起来的。5.2 路面附着系数识别与轮胎利用率路面附着系数是底盘控制里最重要的环境参数之一却也是无法直接测量的。利用观测器估计出的Fx和Fy可以间接识别μ。工程上有一种做法当把纵向力或侧向力估计值和轮荷Fz结合后可以得到当前路面利用附着系数μ_est sqrt(Fx² Fy²)/Fz在轮胎接近附着极限时这个比值会接近路面峰值附着系数。把μ_est做一个慢变化低通滤波配合是否正在接近附着极限的置信度判断就能估计当前路面μ。这个思路比单纯利用车辆质心减速度估算μ要精细得多因为它同时考虑了侧向力。5.3 这套算法的局限和后续升级方向这个自适应滑模观测器方案不是万能的存在几个明显局限有必要写在这里一是低速工况下信号弱、观测器收敛慢。车辆接近静止时Vx和Vy都很小侧向力本身也很小信噪比极差估计难度大。实际使用时建议只在车速高于某个阈值比如10km/h时激活观测器输出。二是路面附着突变场景。从高附着切换到低附着时模型里的未知输入变化很快如果滑模增益不够大或低通滤波太慢估计值需要一段时间才能跟上。当前处理办法是提高滑模增益但会牺牲稳态抖振表现。更优的办法是引入轮胎模型的预测项把状态人对附着突变的响应提前一步反映到观测方程里相当于给滑模观测器加前馈。三是侧偏角测量的可用性。三自由度模型需要Vy但量产车通常没有侧向车速传感器。如果拿不到Vy的实际测量值可以把Vy估计值也纳入观测器状态只用Vx和r做测量量这时系统可观测性变差滑模面设计也更复杂。我在仿真阶段直接用了Carsim输出的Vy主要是为了优先验证核心逻辑后续如果要做实车迁移需要把这条链子补上。后续升级方向我比较推荐两个一是把轮胎模型写成可切换的Dugoff/Magic Formula形式作为观测器的前馈项只在模型可信时生效模型失配时自动退化为纯滑模模式二是把整套算法改成嵌入式C代码部署到实时机或者快速控制原型设备上做硬件在环测试这一步会暴露很多仿真环境里看不到的时序问题。我自己的体会是自适应滑模观测器在车辆力估计这事上属于性价比很高的方案模型不要求多精细调参路径清晰鲁棒性好配合Carsim联合仿真又能快速看到量级和趋势的正确性。如果你按这套流程做到某一格卡住了比如Carsim输出通道变量名找不到、或者联合仿真仿真步长不匹配可以带着具体报错来问我。这些坑看起来小但每个都够人折腾半天。