基于RLS与UKF的车辆侧偏刚度与路面附着系数在线估计方案 做底盘或者智能车控制的人应该都体会过两个参数反复折磨人的感觉轮胎侧偏刚度 (C_f)、(C_r)以及路面附着系数 (\mu)。侧偏刚度决定了一个弯道里车辆到底趋向推头还是甩尾附着系数则决定你在某个车速下敢不敢踩死制动、敢不敢给大转向。图纸上它们有“标准值”可轮胎在磨、载荷在变、路面在换固定参数在实车工况下永远是错的。所以项目里我搭了这样一套估计方案用RLS在线辨识前后轴的侧偏刚度用UKF估计地面附着系数再放到Carsim与Matlab/Simulink联合仿真环境里验证。对刚开始接触状态估计、或者准备做纵横向控制联调的朋友来说这套内容基本可以当作搭建第一版估计器的完整参考。1. 这套方案到底在解决什么问题1.1 侧偏刚度不是图纸上的一个定值侧偏刚度的物理含义是轮胎侧偏力对侧偏角在线性区内的变化率也就是侧偏力-侧偏角曲线在零附近的斜率。二自由度自行车模型里前轮侧向力 (F_{yf}-C_f \alpha_f)后轮侧向力 (F_{yr}-C_r \alpha_r)很多稳定性控制和状态估计算法都依赖这个线性关系。但实际工况里(C_f)、(C_r)受轮胎载荷转移、胎压波动、磨损程度以及路面条件影响变化范围可以到标称值的百分之二三十甚至更多。载荷转移导致前轴等效刚度与后轴等效刚度不再对称这直接改变车辆的不足转向梯度胎压降低会让刚度显著下降车辆响应变迟钝。标定出来的固定参数只能在特定工况下保持准确一旦车辆载荷变化或路面改变基于这些参数算出的横摆响应、期望方向盘转角和制动目标就会整体偏移。所以侧偏刚度必须要能在线更新。1.2 附着系数决定控制策略的上限地面附着系数 (\mu) 是轮胎与路面能够提供摩擦力的上限本质上决定了车辆的制动距离、过弯极限和稳定性控制介入时机。干燥沥青路面 (\mu) 可能接近0.85到0.9湿滑路面可能降到0.3到0.4冰雪路面甚至低于0.2。控制器如果假设高附着去计算最大允许加速度实际路面却是低附着结果就是车轮先抱死、横摆失稳控制介入再快也没有用。附着系数不是一个可以直接测量得到的量它只能通过车辆在轮胎力接近附着极限时的动力学响应来反推。换句话说只有当轮胎工作点进入非线性区、滑移率上升到一定程度时(\mu) 才变得可观测。这也决定了估计 (\mu) 不能只靠线性模型必须用能描述非线性段的轮胎模型和适配非线性系统的滤波器。1.3 为什么是RLS加UKF这样分工项目里没有把两个参数塞进同一个估计器而是拆成两条链路各有分工。侧偏刚度的辨识主要依赖线性区动力学车辆横摆与侧向加速度的关系在侧偏角不太大时可以用线性模型近似而RLS本身就是一个线性回归框架下的递推最小二乘估计器结构简单、算量小、收敛快非常适合在线辨识线性模型中的参数。附着系数估算则绕不开轮胎力饱和段非线性观测方程和状态方程相对强非线性如果用扩展卡尔曼滤波EKF需要对非线性函数求雅可比矩阵推导麻烦而且线性化误差大。UKF用一组Sigma点直接传播状态分布不需要求导对强非线性模型的适应能力更好工程上更容易调试。Carsim则负责提供一个高保真的车辆动力学仿真环境相当于把估计算法放到一辆“接近实车”的数字车上做闭环验证。2. RLS在线估计前后轮侧偏刚度的完整推演2.1 二自由度自行车模型怎么用侧偏刚度估计的基本前提是车辆横摆运动可以用自行车模型描述。忽略侧倾和纵向耦合整车侧向力平衡方程为[ m a_y F_{yf} F_{yr} ]整车绕质心的横摆力矩平衡方程为[ I_z \dot{r} a F_{yf} - b F_{yr} ]其中 (m) 是整车质量(I_z) 是横摆转动惯量(a) 是质心到前轴距离(b) 是质心到后轴距离(a_y) 是质心处侧向加速度(r) 是横摆角速度(\dot{r}) 是横摆角加速度。前轮和后轮的侧偏角分别表示为[ \alpha_f \beta \frac{a r}{V_x} - \delta ][ \alpha_r \beta - \frac{b r}{V_x} ](\beta) 是质心侧偏角(\delta) 是前轮转角(V_x) 是纵向车速。在Carsim联合仿真环境里(\beta)、(a_y)、(r)、(V_x) 都可以直接从模型输出拿到这是联合仿真的优势。如果未来要移植到实车(\beta) 通常需要用状态观测器估计这里先不展开。2.2 核心技巧把前后轴侧向力“虚拟传感”解算出来如果直接拿两个方程去同时辨识 (C_f) 和 (C_r)会得到一个多输入多输出回归问题观测矩阵的持续激励条件更严格而且两个参数容易互相耦合。我在项目里采用的做法是先利用侧向力平衡和横摆力矩平衡把前后轴侧向力解算出来。将两个方程联立可以解得[ F_{yf} \frac{I_z \dot{r} b m a_y}{a b} ][ F_{yr} \frac{-I_z \dot{r} a m a_y}{a b} ]这一步等于是把前后轴侧向力变成了可以由传感器信号反算出来的“虚拟测量值”。接下来每个轴各自建立独立的标量回归模型[ F_{yf} -C_f \alpha_f \quad \Rightarrow \quad y_f \phi_f C_f ][ F_{yr} -C_r \alpha_r \quad \Rightarrow \quad y_r \phi_r C_r ]前轴RLS的观测值 (y_fF_{yf})回归量 (\phi_f-\alpha_f)后轴RLS的观测值 (y_rF_{yr})回归量 (\phi_r-\alpha_r)。这样就避开了矩阵求逆和双参数耦合问题而且前后轴可以分别调整遗忘因子和收敛速度。信号来源用途(a_y)Carsim输出解算前后轴侧向力(r) 与 (\dot{r})Carsim输出/差分解算前后轴侧向力(\beta)Carsim输出计算侧偏角(V_x)Carsim输出计算侧偏角(\delta)控制器给Carsim的输入计算前轮侧偏角2.3 RLS递推公式与遗忘因子怎么调标量形式的RLS递推核心非常简单。设参数估计值为 (\hat{C})在线增益为 (K(k))协方差矩阵为 (P(k))遗忘因子为 (\lambda)每一步更新如下[ K(k) \frac{P(k-1) \phi(k)}{\lambda \phi(k) P(k-1) \phi(k)} ][ \hat{C}(k) \hat{C}(k-1) K(k) \left[ y(k) - \phi(k) \hat{C}(k-1) \right] ][ P(k) \frac{1}{\lambda} \left[ 1 - K(k) \phi(k) \right] P(k-1) ]实际写Matlab Function时循环体的核心就是这几句话function C_est RLS_Update(phi, y, C_prev, P_prev, lambda) K P_prev * phi / (lambda phi * P_prev * phi); e y - phi * C_prev; C_est C_prev K * e; % 协方差矩阵更新注意数值稳定性 P_new (1 - K * phi) * P_prev / lambda; P_new (P_new P_new) / 2; % 强制对称 end遗忘因子 (\lambda) 是最关键的参数。(\lambda1) 表示所有历史数据权重相同适合时不变系统(\lambda) 越小旧数据被遗忘得越快跟踪能力越强但对噪声越敏感。工程上 (\lambda) 一般取在0.95到0.995之间。我做干燥沥青路面辨识时常用0.98在路面突变工况下会降到0.95左右。0.95以下估计值抖动会明显加剧除非你明确需要极快跟踪速度否则不建议盲目调小。参数初值方面协方差 (P(0)) 可以设一个比较大的值比如 (P(0)1000)这表示对初始参数估计很不信任让RLS在开始时用大增益快速逼近真实值。(C) 的初始值随便给一个合理范围就行给错了也能在几百毫秒内拉回来。我习惯给到略小于标称值的位置比如前轴标称值 (80000\ \text{N/rad})初值给 (60000\ \text{N/rad})避免初值过大导致前期预测偏差太大。2.4 持续激励条件没有激励就没有辨识RLS不是万能的它有一个硬性前提输入信号必须满足持续激励条件。放在侧偏刚度辨识场景里就是车辆必须存在足够的横向动态。直线巡航状态下侧偏角接近零(\phi_f)、(\phi_r) 都很小信噪比极低RLS的增益虽然还在更新但参数几乎不可观测估计值就会在初值附近漂移。所以在Carsim工况里不能只跑一段匀速直线必须包含足以激发横向动力学的转向输入。我常用的三个验证工况是方向盘角阶跃输入幅值保持在侧向加速度0.2g到0.4g之间这个区间轮胎基本在线性区适合RLS模型假设单移线工况模拟变道动作持续激励效果好蛇形或正弦扫频转向频率从0.2Hz扫到1Hz可以覆盖车辆横摆响应的主要频段。需要特别注意不要用侧向加速度超过0.5g以上的极限转向工况去辨识线性区侧偏刚度。因为此时轮胎已经明显进入非线性段线性模型本身不成立辨识出来的等效刚度只是某个工作点的局部切线刚度而不是物理概念上的线性段刚度。联合仿真里这一点容易被忽略毕竟Carsim整车模型是完整的非线性模型你把输出数据喂给线性RLS它也能给你个数但那个数换一个工况就不对了。3. UKF估计地面附着系数的建模与调试3.1 为什么不是EKF而是UKF附着系数 (\mu) 是嵌在轮胎力模型中的参数它通过轮胎纵向力与滑移率之间的非线性关系影响车辆响应。这种关系在低滑移区近似线性但在附着极限附近会出现饱和甚至下降段整体强非线性。EKF的思路是在每个时刻对非线性函数做一阶泰勒展开本质是线性化逼近。轮胎模型的非线性很强时线性化误差会直接反映到状态均值和协方差的预测上导致滤波收敛不稳定。UKF的思路完全不同它通过无迹变换生成一组确定的Sigma点让这些点直接经过非线性函数传播然后从传播后的点集里重新统计均值和协方差。这样不需要计算雅可比矩阵对强非线性函数的逼近精度至少达到二阶工程实现上也更省心。项目里我一开始用的EKF平台干燥路面上表现还行换到湿滑路面工况就出现了估计值震荡后来切到UKF才稳下来。3.2 状态量与观测量怎么选UKF的状态向量可以选为[ x \begin{bmatrix} V_x V_y r \mu \end{bmatrix}^T ]其中 (V_x) 是纵向车速(V_y) 是侧向车速(r) 是横摆角速度(\mu) 是待估计的路面附着系数。(\mu) 的状态方程可以用随机游走模型描述即 (\mu(k1)\mu(k)w_\mu)(w_\mu) 是过程噪声。这样做本质上就是把 (\mu) 当成一个慢时变参数通过每次滤波不断修正。观测向量选择与传感器配置对应[ z \begin{bmatrix} a_x a_y r \end{bmatrix}^T ]纵向加速度 (a_x)、侧向加速度 (a_y) 和横摆角速度 (r) 在联合仿真里都从Carsim直接输出。公式里还需要用到前轮转角 (\delta)它作为已知输入量进模型如果需要估计四轮滑移率还需要把四个车轮转速加入状态或观测方程但第一版模型不建议贪多状态量越多越容易调乱。状态量物理含义初值建议(V_x)纵向车速Carsim输出初值(V_y)侧向车速0(r)横摆角速度0(\mu)路面附着系数0.8到1.0之间偏大给3.3 轮胎纵向力模型与可观测性附着系数需要靠轮胎力模型绑定。取简化的纵向力表达式[ F_x \mu F_z g(s) ](s) 是滑移率(g(s)) 可以取Burckhardt等形式的滑移曲线函数描述纵向力利用系数随滑移率的变化。车辆纵向动力学方程为[ m a_x F_{xf} F_{xr} ]其中每个车轮的纵向力都通过上式与 (\mu) 关联。这里 (F_z) 是各轮垂向载荷Carsim里可以直接给静态载荷近似或者从模型输出垂向力。有一个关键结论必须放在设计阶段想清楚(\mu) 并不是任何时刻都可观测的。当车辆在附着极限附近工作、轮胎滑移率已经进入非线性区时纵向力和滑移率之间的关系强烈依赖 (\mu)估计器才能把 (\mu) 和测量数据绑定起来在低滑移率工况下轮胎力还与 (g(s)) 的近线性段强相关(\mu) 即使变化对测量值的影响也非常有限UKF给出的 (\mu) 基本没有可信度。因此附着系数估计一定要配合纵向或横向激励工况比如全力制动、驱动打滑或者高侧向加速度转弯让轮胎工作点真正到达附着曲线的敏感区。3.4 Q矩阵和R矩阵的调试经验UKF对噪声协方差矩阵的敏感度很高这部分没有捷径只能通过蒙特卡洛式试凑加经验判断。我调参时习惯从物理量纲出发估算初值。过程噪声矩阵 (Q) 用于描述状态方程的可信程度其中 (\mu) 对应的过程噪声方差不能给太小否则 (\mu) 的更新会非常缓慢路面突变工况下根本追不上。实测下来 (\mu) 对应方差取 (0.0001) 到 (0.01) 之间比较合理路面突变前我用 (0.005)稳态估计噪声和跟踪速度相对均衡。测量噪声矩阵 (R) 对应传感器的信任程度。Carsim输出信号本身几乎没有噪声但如果直接给一个极小的 (R)UKF会高度信任测量值导致滤波结果完全跟随测量噪声波动变大。建议适当放大 (R)模拟真实传感器水平横摆角速度方差给 (0.0001) 到 (0.001)加速度方差给 (0.01) 到 (0.1)。这样估计结果会平滑很多而且收敛精度不会明显下降。另外一个容易踩的坑是初值协方差 (P_0) 与过程噪声不匹配。(P_0) 设置过大时滤波初期波动大叠加过大的过程噪声整个估计值会散。第一版建议 (P_0) 取对角线经验值状态量部分给到 (1) 到 (10)(\mu) 部分给到 (0.1)然后跑一段光滑路面工况观察收敛过程再逐步调整。4. Carsim与Matlab/Simulink联合仿真的落地过程4.1 整车模型与测试工况设置Carsim里我选用的是软件自带的D级乘用车模型整车参数在仿真界面里可以查到并导出方便和模型里的 (m)、(I_z)、(a)、(b) 对齐。截面尺寸、质心高度、悬架参数维持默认重点是确认质心到前轴距离和后轴距离这两个值必须和RLS模型以及UKF模型里的一致否则估计出来的刚度数值再漂亮也没有物理意义。工况设置按“先验证后加压”的顺序来。第一步用高附着路面验证算法能正确收敛路面摩擦系数设0.85方向盘输入用0.3g左右的角阶跃跑8到10秒看 (C_f)、(C_r) 是否稳定在合理区间第二步换成低附着路面0.3加制动和转向复合工况看UKF的 (\mu) 能不能从默认初值收敛到设定值附近第三步做路面突变前段0.8后段0.3看估计器实时跟踪能力。这个方法能快速暴露算法缺陷比一上来就搞复合工况好排错得多。4.2 输入输出通道配置Carsim和Simulink联合仿真的标准方式是在Carsim GUI中把车辆模型接口指向Simulink然后通过“Send to Simulink”生成一个包含车辆动力学模型的S-Function模块。我这次需要把RLS和UKF接入Carsim要输出以下信号到Simulink通道信号Carsim输出名称示例用途纵向车速Vx计算侧偏角、滑移率侧向车速Vy计算侧偏角侧向加速度Ay解算前后轴侧向力纵向加速度AxUKF观测横摆角速度Yaw RateRLS观测、UKF观测横摆角加速度Yaw Acceleration解算前后轴侧向力质心侧偏角Beta计算侧偏角可选四轮轮速Wheel Speed FL等计算滑移率Simulink需要反馈到Carsim的信号主要是前轮转角 (\delta)可以由方向盘转角除以转向传动比得到也可以直接给Carsim前轮转角通道。注意Carsim的输入输出通道名和序号在版本之间略有差异先确认模型文件里对应的通道名称避免总线信号接错。4.3 Simulink估计器模块如何搭整体数据流是Carsim S-Function输出车辆状态经过去总线、信号类型转换进入两个Matlab Function模块分别执行RLS和UKF估计结果再送进Scope、To Workspace或者传给上层控制器做闭环。RLS模块建议写成类函数形式用persistent变量保存上一步的 (P) 和 (C)。UKF模块结构相对大我建议把Sigma点生成、状态传播、观测更新拆成独立子函数放在同一个Matlab Function里或者在外部写成一个脚本通过MATLAB Function块调用。Simulink里不要直接用解释型代码跑大的循环编译成C代码后仿真速度会好很多。采样步长设置方面Carsim本身推荐固定步长联合仿真时Simulink求解器也要设置成定步长通常取0.001秒。RLS这种轻量算法完全可以跑1ms周期UKF如果状态量不多1ms周期也能接受。如果发现仿真过慢可以把UKF的计算周期放宽到5ms或10ms观测量用最近一次的值工程上允许这种降频处理。4.4 结果保存与可视化检查仿真做完千万不要只盯最终曲线一定要保留中间量来排查。我会把Carsim输出的 (\beta)、(\alpha_f)、(\alpha_r)、解算出的 (F_{yf})、(F_{yr})以及RLS的中间增益 (K)、协方差 (P) 全部存下来。协方差是很好的健康指标如果RLS收敛(P) 会被压低到很小值如果工况激励不足(P) 会停在某个水平上下浮动。UKF则要保存每次更新之前的预测残差序列残差如果始终在零附近随机分布说明滤波调得不错如果出现系统性偏置基本可以确定模型有结构误差不是调噪声能解决的。5. 实际调试中踩过的坑与排查速查表5.1 RLS估计值振荡或漂移表现是侧偏刚度在正常转弯工况下来回波动或者直线巡航时缓慢漂移。第一步检查遗忘因子0.95以下抖动概率很大先调到0.98。第二步检查激励窗口确认当前时间段内侧向加速度确实超过0.2g尽量避免把直线段数据喂进估计器。第三步看信号是否有高频噪声Carsim的输出信号没有噪声但自己写的差分环节会放大误差横摆角加速度 (\dot{r}) 对角速度信号做差分前要加低通滤波。5.2 UKF附着系数不收敛或收敛到错误值几乎是可观测性出了问题。检查车辆工况的滑移率是否进入非线性区如果全程都是小滑移率(\mu) 根本绑不住直接在工况里加一段全力制动或大油门驱动让某一个轴滑移率超过10%到15%。如果工况足够仍然不收敛检查轮胎模型归一化是否正确(F_z) 是否取了正确的动载荷特别是制动过程中垂向载荷转移很大用静态载荷替代时估计出来的 (\mu) 会有明显偏差。5.3 路面突变后UKF跟踪滞后路面从高附着突然变低附着时(\mu) 需要一定时间才能跟上这是正常的因为车辆必须重新进入敏感激励区。如果想加快跟踪有两个办法。一是把 (\mu) 的过程噪声方差适当调大比如从0.005调到0.02代价是稳态波动变大。二是采用自适应遗忘策略当预测残差持续偏大时暂时放大过程噪声等残差回落再恢复这个策略在网上公开资料里很多但具体阈值需要针对自己的工况标定。5.4 联合仿真接口报错与数据错位Carsim和Simulink版本不匹配或者接口库路径不对时启动仿真会直接报S-Function错误。先检查Carsim的Simulink接口是否在安装时正确注册再检查模型文件对应的车辆版本与接口版本是否一致。数据错位的问题更隐蔽有时候你看到的 (V_x) 并不是当前时刻的 (V_x)而是上一步的延迟尤其在使用变步长求解器时更容易出现。所以我坚持用固定步长并且所有模块单元延迟设置为1避免代数环和时序错位影响估计结果。5.5 快速排查清单现象可能原因检查方向RLS估计值振荡遗忘因子太小、激励不足调大 (\lambda)检查侧向加速度窗口RLS估计值不更新P阵已经收敛、输入信号无变化复位P阵或增加激励UKF不收敛滑移率未进入非线性区加入制动/驱动激励UKF稳态波动大R阵过小、Q阵过大调小Q、适当调大R路面突变响应慢(\mu) 过程噪声太小增大过程噪声或自适应调整联合仿真结果延迟步长设置不一致使用统一固定步长这几个坑几乎每个做在线估计的人都会碰到至少两三个。调估计器的过程本质上是理解车辆模型和信号质量的过程参数调得再花哨如果激励和测量信号不靠谱估计结果一样是垃圾。我个人做下来的最深体会是这套方案真正的难点不在RLS公式推导或者UKF的Sigma点生成而在于想清楚每个参数在什么条件下可观测。刚跑通联合仿真的时候我也无数次盯着波形的振荡发呆。后来养成了一个习惯每次加新工况之前先用手头数据画一遍 (\alpha_f)、(\alpha_r) 和 (a_y) 的关系图确认线性区范围再决定把数据喂给RLS还是直接丢弃。对 (\mu) 也是同样先看滑移率工作点低于临界值就直接给上一拍的结果不更新。加上这个前置判断之后整套估计器的鲁棒性提升非常明显后面的控制策略切换也就不那么被参数波动干扰了。