Carsim与Simulink联合仿真下递推最小二乘法辨识轮胎侧偏刚度
最近在复现一篇基于Carsim和Simulink联合仿真的车辆参数辨识文档核心算法是递推最小二乘法RLS目标是在线估计轮胎侧偏刚度。这个方向在车辆动力学控制、底盘协调控制、自动驾驶模型预测控制里都很重要因为轮胎侧偏刚度直接决定了车辆的稳定边界和转向响应特性。复现过程比预想中费劲文档里的公式和Carsim的变量经常对不上号联合仿真的I/O配置里也藏着不少坑。这篇把完整的复现思路、推导过程、Simulink实现细节和调试经验整理出来给同样在啃这个方向的朋友做个参考。如果你刚接触Carsim与Simulink联合仿真或者正准备用递推最小二乘法做轮胎侧偏刚度估计模型这篇应该能帮你少走不少弯路。1. 环境准备Carsim与Simulink联合仿真先让信号流跑通1.1 版本兼容、路径和License最容易卡住的三件事我最初以为项目难点在算法本身结果第一步联合仿真环境就折腾了很久。Carsim和Matlab/Simulink的版本匹配问题非常现实Carsim 2021普遍搭配R2019b到R2021b的Matlab版本使用Matlab版本太新或太旧Carsim的Simulink接口库可能加载不出来或者生成的S-Function模块报错。所以我的建议是动手前先去Carsim安装目录下的Release Notes里确认它支持的Matlab版本范围不要图新装了个R2023a/R2024a回头发现Carsim接口库根本不识别。路径问题也容易踩。Carsim工程路径、Matlab工作目录、Simulink模型所在路径都必须保证纯英文、无空格、无特殊字符。很多人复现文档时把模型放在“D:\我的文档\车辆参数辨识”这种目录下Carsim通过S-Function加载动态库时就找不到文件弹出一堆莫名其妙的加载错误。再说License。网上搜Carsim安装问题时经常会遇到一个报错invalid host。这个大概率是License管理器里的主机信息和你当前机器不匹配比如网卡MAC地址变了、主机名改过或者License服务没有正确启动。我自己的情况是换了一块USB网卡后出现了这个问题把License绑定信息更新后就好了。注意这个问题跟破解没有关系正版授权同样会遇到排查方向就是主机标识和License服务的启动状态。这些环境问题看起来跟“算法复现”没关系但如果不处理干净后面所有工作都推进不下去。1.2 从Carsim引出哪些状态量输入输出通道配置联合仿真要跑通核心是搞清楚Carsim作为车辆动力学模型应该向Simulink输出哪些信号以及从Simulink接收哪些信号。在Carsim的Run Control界面里可以通过I/O通道配置来设定输入输出变量。对于RLS侧偏刚度估计我在模型中用到的关键输出如下Carsim输出通道常见名称物理含义默认单位建议换算Vx纵向车速km/hm/sVy侧向车速m/sm/sAy侧向加速度gm/s^2YawRate横摆角速度deg/srad/sSteer_L1前轮转角degradBeta质心侧偏角degrad如果你要闭环控制比如让Simulink生成转向角输入给Carsim那需要在Carsim的输入通道里配置一个转向角接口比如Steer_L1或Steer_SW方向盘转角。我复现的这篇文档里没有控制部分所以Carsim的转向输入由内部驾驶员模型提供Simulink只做状态观测和参数辨识。单位换算是最容易出问题的环节。Carsim很多通道的默认单位是km/h、deg/s、deg而RLS公式里需要全部使用国际单位。建议在Carsim的I/O配置界面直接把输出单位改成SI制m/s、rad/s、rad如果某些版本不好改就在Simulink里加Gain模块手动换算。这个细节我后面还会再提因为单位漏换算导致结果差几十倍的情况太常见了。1.3 S-Function接入和步长设置Carsim与Simulink联合仿真最常见的接入方式是在Carsim主界面点击“Send to Simulink”它会自动生成一个包含Carsim S-Function的Simulink模型。你在这个模型基础上添加自己的算法模块就行。Simulink仿真步长建议设置为固定步长Fixed-step步长取0.001s或0.0005s。Carsim内部积分步长通常为0.001s两者一致可以避免因步长不同引起的接口数据抖动。我在实际运行中用的是固定步长0.001sCarsim的仿真步长也设为0.001s整个模型运行稳定。还有一个细节如果使用解算器自动变步长S-Function的采样时间可能被拉长RLS的更新率不稳定后续P矩阵的收敛轨迹会变得很难看。所以做参数辨识类仿真固定步长是更稳妥的选择。2. 模型推导二自由度车辆模型如何变成RLS能用的回归方程2.1 线性轮胎假设与侧偏刚度的出现轮胎侧偏刚度是描述侧向力与侧偏角关系的参数。在侧偏角较小的线性区侧向力可以近似为侧偏角的线性函数F_y -C · α这里的C就是侧偏刚度单位N/rad负号表示侧向力的方向与侧偏角方向相反。在Carsim里默认的轮胎模型通常是非线性的但在小侧偏角范围内比如侧偏角不超过4°到5°线性近似的精度足够用于参数辨识复现。车辆动力学里最常用的简化模型是二自由度单轨模型也叫自行车模型。它把左右两个前轮合并成一个前轴左右后轮合并成一个后轴只考虑横向运动和横摆运动。两个关键方程分别是横向力平衡和横摆力矩平衡推导过程如下。横向力平衡方程忽略前轮转角带来的纵向力分量假设δ较小m · a_y F_yf F_yr代入线性轮胎模型m · a_y -C_f · α_f - C_r · α_r横摆力矩平衡方程I_z · γ̇ a · F_yf - b · F_yr代入后得到I_z · γ̇ -a · C_f · α_f b · C_r · α_r其中m是整车质量a是质心到前轴距离b是质心到后轴距离I_z是绕垂向轴的转动惯量γ是横摆角速度α_f和α_r分别是前后轴侧偏角。侧偏角可以由车辆运动状态推导α_f β (a · γ) / v_x - δα_r β - (b · γ) / v_x其中β是质心侧偏角δ是前轮转角v_x是纵向车速。这些量在Carsim的输出通道里都能找到。2.2 整理成矩阵回归形式目标、回归量和待估参数RLS适合解决“观测值Y与回归量φ成线性关系”的参数估计问题标准形式是Y φ^T · θ。上面两个车辆方程正好可以改写成这个形式。把横向力方程和横摆力矩方程联立起来写成矩阵形式[m·a_y; I_z·γ̇] [-α_f, -α_r; -a·α_f, b·α_r] · [C_f; C_r]令Y [m·a_y; I_z·γ̇]称为观测向量Φ [-α_f, -α_r; -a·α_f, b·α_r]称为回归矩阵θ [C_f; C_r]称为待估参数向量于是整个辨识问题被描述为Y Φ · θ这个形式非常干净。Carsim输出m、a、b、I_z这些车辆参数是已知常数可以在Carsim车辆配置里查a_y、γ、β、v_x、δ这些状态量可以从Carsim输出通道获取唯一未知的就是C_f和C_r两个侧偏刚度。2.3 可辨识性为什么激励不丰富时两个刚度会一起发散在实际仿真中我遇到过这样一个现象直线行驶时RLS估计出的C_f和C_r会突然跳到很大的值甚至变成正数看起来很不合理。原因在于可辨识性。当车辆直线行驶或者前轮转角恒定时回归矩阵Φ的两个列向量之间可能出现强相关信息矩阵的秩不足RLS只能沿着一个方向更新参数两个参数无法被唯一确定就会出现一个变大、另一个变小但组合起来依然满足观测方程的情况。解决办法是保证输入激励足够丰富。转向输入不能是恒定值最好包含多个频率成分。这也是为什么后面推荐正弦扫描工况而不是单纯的角阶跃工况。另外也可以给侧偏角计算加一个保护当车速过低或激励强度不足时暂停RLS更新避免P矩阵持续累积导致数值爆炸。3. Simulink中的RLS估计器实现从公式到可运行代码3.1 数据处理滤波、单位换算、噪声注入在把Carsim输出信号送入RLS模块之前需要做三件事单位统一、滤波、以及可选加噪声。单位统一在前面说过了这里再强调一次所有与角度相关的信号前轮转角、质心侧偏角、横摆角速度必须换算成rad或rad/s车速统一成m/s加速度统一成m/s²。如果Carsim输出的是km/h的Vx需要除以3.6deg转rad需要乘以π/180。滤波方面Carsim输出的信号是理想仿真信号没有传感器噪声但真实车辆上传感器信号一定带噪声所以在复现阶段建议主动加一点噪声来检验算法鲁棒性。我在Simulink里用Band-Limited White Noise模块给横向加速度a_y加了一个噪声强度约0.05 m/s²的白噪声然后在进入RLS之前加了一个二阶Butterworth低通滤波器截止频率设在10Hz左右。滤波器的截止频率不要设太低比如1Hz以下会导致信号相位延迟明显而RLS对输入信号的相位比较敏感滤波延迟会让回归量和观测值在时间上错位最终影响参数估计精度。我调试时的经验是截止频率取5到10Hz既能滤掉高频噪声又不会把0.1到2Hz的车辆动力学频段压得太狠。3.2 核心模块MATLAB Function里的递推代码RLS核心算法我用MATLAB Function模块实现。这个模块的好处是可以直接写矩阵运算代码非常紧凑。下面是完整的MATLAB Function代码function [Cf, Cr] rls_tire(Y1, Y2, phi11, phi12, phi21, phi22) % RLS估计轮胎前后轴侧偏刚度 % Y1: m*a_y % Y2: I_z*gamma_dot % phi11 -alpha_f, phi12 -alpha_r % phi21 -a*alpha_f, phi22 b*alpha_r persistent theta P if isempty(theta) theta [-80000; -60000]; % 初值: 前轴-80000 N/rad, 后轴-60000 N/rad P 1e6 * eye(2); % 初始协方差矩阵 end lambda 0.995; % 遗忘因子 Y [Y1; Y2]; Phi [phi11, phi12; phi21, phi22]; % 增益 K P * Phi / (lambda * eye(2) Phi * P * Phi); % 参数更新 theta theta K * (Y - Phi * theta); % 协方差更新 P (eye(2) - K * Phi) * P / lambda; Cf theta(1); Cr theta(2); end这段代码里有一个关键点MATLAB Function模块默认不支持动态改变矩阵维度但这里theta固定为2×1、P固定为2×2、Phi固定为2×2维度始终不变所以代码生成和仿真都不会出问题。遗忘因子lambda我直接写在代码里如果你想在外面调参可以把它作为额外的函数参数传入模块这样就不用反复改代码。不过要注意MATLAB Function模块的输入端口数量有限每增加一个参数就要多一个输入连接线模型会变乱。我的习惯是把lambda、P0这类常量放在代码里仿真过程中暂不修改等需要系统性扫参时再改成外部输入或者用Matlab脚本批量修改。3.3 观测窗口设置与Scope布局运行联合仿真前我建议先在Simulink模型里放几个Scope至少观察以下信号Carsim输出的纵向速度Vx和侧向加速度a_y确认信号量级是否合理计算得到的α_f和α_r确认侧偏角量级是否在合理范围一般应该在±0.1rad以内Cf和Cr的估计值确认收敛趋势残差Y - Φ·θ用于判断模型拟合质量Scope不要一次性堆太多否则模型会很乱。我通常按功能分成两个子系统信号预处理子系统放在传感器信号和RLS估计器之间结果监视子系统放在RLS输出部分这样模型结构清晰排查问题时一目了然。4. 遗忘因子、初始协方差与仿真工况三个决定收敛质量的旋钮4.1 遗忘因子λ怎么选记忆长度和跟踪能力的权衡遗忘因子λ是RLS最重要的调节参数之一它决定了过去数据的权重衰减速度。λ1时所有历史数据权重相同相当于普通最小二乘法适合参数不随时间变化的系统λ1时离当前时刻越远的数据权重越小算法能跟踪参数的变化但也会放大噪声的影响。我复现的文档里侧偏刚度本身不是一个恒定值它会随着车辆载荷转移、速度变化、轮胎温度变化而缓慢漂移所以用带遗忘因子的RLS更合理。λ的典型取值范围是0.95到0.999。λ到底取多少可以从有效记忆长度的角度来理解。有效记忆长度约等于1/(1-λ)。如果λ0.995有效记忆长度约200个采样点在1ms步长下相当于0.2秒内数据仍然有影响如果λ0.98有效记忆长度只有50个采样点参数更新会更“活跃”但估计方差会明显变大。我在做扫参实验时的结果是λ0.99到0.995这个区间估计曲线最平滑收敛速度也够快。λ小于0.97时Cf和Cr的估计值会有明显抖动尤其在转弯切换的瞬间。4.2 P0和θ0初值的影响与配置经验RLS的初始协方差P0表示对初始参数估计值的信任程度。P0越大说明初始参数越不确定初始增益矩阵K就越大算法会在头几步快速修正参数如果P0取得太小算法会认为初始参数很可靠导致收敛非常缓慢。我习惯把P0设成一个大对角阵比如1e6·I。这个量级在侧偏刚度量级为10^4到10^5 N/rad的情况下能保证初步收敛在零点几秒内完成。如果P0取到1e8甚至更大虽然收敛更快但一开始的增益过大会让参数估计值出现明显过冲反而不利于后续稳定。初始参数θ0可以取Carsim模型里的接近值也可以取文献中同类车型的典型值。轿车前轴侧偏刚度量级在-60000到-100000 N/rad后轴在-50000到-80000 N/rad。取一个接近真实值的初值可以加快收敛但就算初值偏差很大只要P0足够大RLS也会在几个正弦周期内追上来。4.3 三种激励工况对比角阶跃、正弦扫描、双移线工况选择直接决定辨识效果。我复现时对比了三种典型工况角阶跃工况前轮转角从0快速阶跃到一个固定值比如3°保持数秒。这种工况能让车辆进入稳态转向参数能快速收敛但持续激励不足回归矩阵两个列向量容易相关同时辨识两个参数时可能发散。更适合用单方程先辨识某一个参数。正弦扫描工况前轮转角按正弦变化且频率可以从0.1Hz扫到2Hz。这种工况信息丰富能持续激励车辆横向动力学是RLS辨识参数的理想工况。我在Carsim外部通过Simulink信号源生成扫描正弦信号作为前轮转角输入效果很好。双移线工况按照ISO 3888-1标准设置道路轨迹接近真实驾驶员避障操作激励成分更复杂更适合验证参数辨识结果在实际工况中的泛化能力但作为初始调参工况不够直观。我的建议是先用正弦扫描工况整定λ、P0等参数再用角阶跃工况验证最小实现最后用双移线工况做完整的泛化验证。三种工况在Carsim里的切换并不复杂基本上就是改前轮转角输入信号源的方式。5. 结果校验估计值准不准用三种方法互相印证5.1 对照Carsim内置轮胎刚度参数Carsim的车辆参数配置里通常能查到前轮和后轮的轮胎侧偏刚度信息。需要注意的是Carsim显示的值可能是单胎的也可能是整个车轴的而二自由度模型中的C_f、C_r是整个前轴/后轴的等效侧偏刚度。如果是单胎值需要乘以2才是轴刚度。我在一次对比时忽略了这一点前后轴估计结果跟Carsim里的参数差了接近一倍排查了半天才发现是单胎和整轴的差别。Carsim默认轮胎模型如果是非线性的它的等效侧偏刚度在工作点附近会变化。为了保证线性近似合理辨识工况中要让侧向加速度控制在0.3g左右甚至更低。这时候RLS估计出来的等效刚度应该和Carsim中轮胎特性线性段斜率比较接近偏差在10%到15%以内都算合理。5.2 回代二自由度模型比较动态响应参数估计值是否可靠最有力的验证方式是把估计出的C_f、C_r代回二自由度模型用相同的前轮转角输入做一次开环仿真然后对比二自由度模型的横摆角速度响应和Carsim输出的横摆角速度响应。二自由度模型的微分方程可以在Simulink里用几个积分模块搭建β̇ (-C_f·(β a·γ/v_x - δ) - C_r·(β - b·γ/v_x)) / (m·v_x) - γγ̇ (-a·C_f·(β a·γ/v_x - δ) b·C_r·(β - b·γ/v_x)) / I_z对比结果显示在正弦扫描工况下二自由度模型的横摆角速度与Carsim输出的横摆角速度吻合得很好峰值误差基本在5%以内。这说明RLS估计出的参数确实抓住了车辆横向动力学的主要特征。如果回代后发现横摆角速度响应的幅值对不上但趋势一致通常是侧偏刚度估计值整体偏大或偏小可以通过调整初值或者检查侧偏角计算是否正确来排查。5.3 残差分析误差到底出在哪个环节RLS的残差e Y - Φ·θ是判断模型拟合质量的重要指标。我在Simulink中把残差信号引出来观察如果残差是零均值的白噪声说明模型假设与数据基本一致如果残差有明显周期性说明回归量少了某个重要项或者Carsim车辆模型的响应存在未建模动态。我遇到的一个问题是在大转角工况下残差出现明显增大原因是轮胎进入了非线性区线性轮胎模型假设失效。把前轮转角幅值降低、让侧向加速度保持在0.3g以内后残差就恢复正常了。还有一个常见的误差来源是微分信号的噪声放大。I_z·γ̇里的γ̇需要通过横摆角速度求导得到而Carsim输出本身虽然平滑但叠加传感器噪声后求导会放大高频噪声。在这个信号上最好先加低通滤波或者在求导之后再加一次平滑。6. 复现文档时的高频问题与排查思路6.1 符号、单位和滤波引起的“对不上账”复现文档时最花时间的往往不是理论推导而是各种细节对不上账。我整理了几个高频问题。侧偏刚度符号不统一。有些教材把C定义为正数侧偏力F_y -C·α有些文献定义为负数F_y C·αC为负。复现时如果从不同文献抄公式很可能出现符号冲突。我的习惯是统一用正数C公式里显式保留负号这样写代码时不会混淆。单位不一致。Carsim的Vx默认可能是km/hYawRate默认是deg/s前轮转角默认是deg如果不换算直接代入公式结果会偏到天差地远。有一次我忘了把前轮转角从deg转成radRLS估计出来的刚度比真实值大了57倍排查了很久才发现是这个地方的问题。滤波器相位延迟。前面提到过滤波器截止频率太低会导致相位延迟观测值和回归量在时间上错位最终估计偏差。如果你发现参数估计值总是稳定地偏差某个比例可以检查一下滤波器的群延迟或者换截止频率更高的滤波器。6.2 NaN、漂移、低速工况数值稳定性问题与工程化处理RLS在仿真中还会遇到几个典型的数值问题。NaN或Inf。P矩阵在长时间缺乏有效激励的情况下可能发散导致参数更新后出现NaN或Inf。我遇到这个情况时第一反应是检查是不是有信号为零或者接近零的情况。比如车辆直线行驶时侧偏角α_f和α_r都接近0回归矩阵Φ接近零矩阵信息量不足P矩阵持续累积大值。工程化处理方式加一个使能逻辑只有当侧偏角绝对值大于某个阈值比如0.005rad或转向加速度大于阈值时才启用RLS更新。参数漂移到不合理区间。比如估计值从负数变成正数这通常意味着可辨识性不足或者遗忘因子太小。降低遗忘因子会让参数更容易受噪声影响而漂移所以如果参数在合理区间内小幅抖动可以把λ调大一点如果直接漂移大几十倍则要检查激励是否充足。低速工况的处理。侧偏角公式里有v_x在分母当车速接近0时α_f和α_r会趋于无穷大RLS必然发散。我的处理是加一个车速判断v_x低于某个值比如1m/s时强制暂停估计器输出上一次估计值。这些看似“工程琐碎”的细节恰恰是复现文档时最消耗时间的部分。文档里往往只写公式和结论不会告诉你低速时怎么保护、滤波怎么调、单位怎么换算而这些只能在实操中一点点摸索出来。整套流程从环境搭建到跑出可靠结果我前后大概花了两三天。最深的体会是车辆参数辨识本身不算难难的是保持“模型假设”和“仿真环境”之间的逻辑一致。二自由度模型只描述了线性区横向动力学Carsim则是完整的非线性车辆模型两者本来就有天然偏差。复现的时候不要追求估计值和Carsim内部参数完全相等重点应该是验证RLS算法能否在合理的激励条件下、合理的量级范围内把轮胎侧偏刚度辨识出来并用回代验证确认参数确实刻画了车辆响应。按照“先跑通正弦扫描、再验证角阶跃、最后做双移线泛化”的顺序推进整个过程会可控很多。如果你正在肝类似的联合仿真项目希望这篇能帮你把几个最容易卡住的环节提前避开。

相关新闻

最新新闻

日新闻

周新闻

月新闻