基于EKF的车辆状态观测器设计:从建模到实车验证
做车辆动力学控制和自动驾驶状态估计的同学应该都有过类似的体会横摆角速度能直接拿陀螺仪读数纵向车速可以用轮速加加速度融合唯独质心侧偏角这个东西量产车上既不会装光学测试仪器也不太可能靠高精度差分定位解决工程上几乎全靠状态观测器去估。我最近刚把一个基于扩展卡尔曼滤波EKF的车辆状态观测器从建模、仿真一路做到实车验证整个过程里最深的感受是——EKF本身并不难真正磨人的是车辆模型怎么简化、协方差怎么调、发散怎么排查。这篇文章把完整的设计思路和调试过程整理出来给正在搞底盘控制、主动安全或者自动驾驶状态估计的朋友做个参考。1. 为什么车辆状态不能全部靠传感器直接测1.1 质心侧偏角最贵也最难测的状态量质心侧偏角简单说就是车辆质心速度矢量方向和车身纵轴之间的夹角。这个角度直接反映了车辆在转弯时是不是已经进入了侧滑状态是电子稳定控制ESC计算横摆力矩的核心输入之一。没有准确的质心侧偏角车道保持系统在极限工况下的判断会出现偏差四轮独立驱动车辆的扭矩分配更是无从谈起。问题在于质心侧偏角没有便宜的量产传感器。实验室里常用光学式非接触速度传感器通过编码器检测地面纹理相对运动来计算速度矢量精度确实高但价格动辄数万元而且对安装环境敏感实时性也不够好。另一种方案是用差分GPS加惯性导航通过融合卫星定位和航位推算间接计算车辆速度方向但城市高架下、隧道内、地下车库这些信号遮挡场景直接失效且接收机更新频率通常只有10到20赫兹对底盘控制来说太慢了。所以量产车普遍的做法是利用已有的低成本传感器信号——方向盘转角、横摆角速度、纵向/横向加速度、轮速通过车辆动力学模型把质心侧偏角这类“测不到”的状态估计出来。这就是车辆状态观测器的核心价值。1.2 量产传感器配置的现实边界在开始搭观测器之前必须先弄清楚手头有哪些可用的传感器信号。以我常用的配置为例方向盘转角传感器带CAN接口输出分辨率约0.1度但有零点漂移和安装偏差六轴IMU输出横摆角速度r、纵向加速度ax、横向加速度ayMEMS器件噪声和温漂都不小四个轮速传感器常规ABS轮速可用来估算纵向车速vx部分方案还有纵向车速估计模块例如基于轮速和ax融合的输出。这些信号里横摆角速度r理论上可以直接测量但MEMS陀螺偏置会随时间缓慢变化横向加速度ay和纵向加速度ax中混有路面坡度、侧倾重力分量前轮转角δ由转向系统传动比换算得到和真实前轮转角之间也有误差。这些误差如果不建模、不补偿观测器估计质量会大打折扣。1.3 观测器的本质模型加测量修正而不是纯计算说到“观测器”很多刚接触的同学会有个误解以为就是拿动力学公式直接联立求解解出来就是估计值。实际上直接开环求解对模型误差极其敏感一个轮胎参数偏差就能让估计值在几秒内完全偏离真实值。状态观测器的标准思想是“预测加修正”先用车载模型基于上一时刻的状态估计和控制输入做一步预测再用当前传感器测量值修正预测结果。卡尔曼滤波器本质上是这类观测器在含噪声线性系统下的最优解它不只知道“当前状态是多少”还能给出“对这个估计的置信度”也就是协方差矩阵。扩展卡尔曼滤波则把这个框架推广到了非线性系统正好对得上车辆动力学这种强非线性问题。2. EKF在车辆状态估计里的角色把非线性问题改造成可解2.1 标准卡尔曼滤波的线性高斯困境标准卡尔曼滤波KF有两个基本假设系统动态和测量关系都是线性的过程噪声和测量噪声都服从高斯分布。在这两个假设下KF得到的后验状态估计是线性无偏最小方差估计理论上非常优美。可车辆动力学恰恰不满足线性假设。轮胎侧向力在小侧偏角范围可以近似看成线性但随着侧偏角增大轮胎进入非线性区侧向力逐渐饱和用常数线性关系描述轮胎力就会产生明显误差。更不用提高速紧急变道、低附着路面这些工况下强行套用线性模型状态预测从一开始就是错的。如果硬要用标准KF要么把模型过度简化成只适合小角度稳定工况的线性模型要么就得花大量精力做增益调度之类的外围补偿。与其绕弯子不如直接在非线性系统上做状态估计这正是EKF的定位。2.2 一阶泰勒展开EKF的核心操作EKF的思路非常直接在每个时刻把非线性状态方程和测量方程在当前状态估计附近做一阶泰勒展开用雅可比矩阵构建局部线性化模型然后再套用标准KF的预测-更新流程。完整流程分两步预测阶段先用上一时刻的后验状态估计x̂_{k-1}和当前控制输入u_{k-1}计算“先验状态估计”$$\hat{x}{k|k-1} f(\hat{x}{k-1|k-1}, u_{k-1})$$同时利用状态方程对状态的雅可比矩阵F向前传播误差协方差$$P_{k|k-1} F_k P_{k-1|k-1} F_k^T Q$$其中Q是过程噪声协方差矩阵用来表征模型误差和外部干扰带来的不确定性。更新阶段当传感器测量值z_k到达后计算卡尔曼增益$$K_k P_{k|k-1} H_k^T (H_k P_{k|k-1} H_k^T R_k)^{-1}$$然后融合测量差新息更新状态估计和协方差$$\hat{x}{k|k} \hat{x}{k|k-1} K_k (z_k - h(\hat{x}_{k|k-1}))$$$$P_{k|k} (I - K_k H_k) P_{k|k-1}$$其中H_k是测量函数对状态的雅可比矩阵R_k是测量噪声协方差矩阵。这里F_k和H_k的求取就替代了标准KF中的常数矩阵A和C所以EKF等于在“每拍重新线性化一次”。2.3 EKF的局限反而决定了工程边界EKF不是没有缺点的银弹。线性化误差在强非线性区域会被放大协方差传播本身也是近似的有时会出现滤波器发散。另外雅可比矩阵的推导很容易出错符号错了、量纲不对仿真第一步就是NaN。但工程上EKF仍然是最务实的选择。相比粒子滤波PF动辄上千个粒子、计算量成倍增加EKF计算开销很小在常见的嵌入式ECU上很容易实时跑。无迹卡尔曼滤波UKF比EKF在高阶非线性下更准但工程落地时需要额外做状态向量的Sigma点变换调参和debug复杂度也上升。对一个以横向动力学为主的车辆状态观测器来说EKF的精度和成本平衡最好。我最终方案也就固态在这里关键是把模型边界划清楚。3. 车辆状态观测器建模状态、输入、测量与雅可比矩阵3.1 状态量的选择为什么我用[vy, r]而不是[β, r]车辆横向动力学领域有两种等价描述状态的方式一种用质心侧偏角β和横摆角速度r做状态另一种用横向速度vy和横摆角速度r做状态。两者差一个纵向车速vx的换算关系β arctan(vy/vx)。我最终选的是[vy, r]这个组合原因是数值稳定性更好。β的定义里带着vx除法当车速很低时vy/vx会出现奇异β的数值变化剧烈EKF里的雅可比和协方差更新很容易被放大。而vy本身就是车辆质心的横向速度在低速、起步、停车工况下数值平滑对滤波器友好得多。实际使用中如果外部模块需要β我再换算输出即可。3.2 二自由度单轨模型与轮胎线性假设车辆状态观测器常用的动力学基础是二自由度单轨模型也叫自行车模型。它把所有前轮和后轮分别合成为一个等效轮忽略左右载荷转移、侧倾和垂向动力学。假设纵向车速vx缓慢变化把前轮转角δ作为输入得到如下状态方程质点横向动力学平衡方程 $$m(\dot{v_y} v_x r) F_{yf} F_{yr}$$横摆动力学平衡方程 $$I_z \dot{r} a F_{yf} - b F_{yr}$$其中m是整车质量Iz是绕垂向轴的转动惯量a是质心到前轴的距离b是质心到后轴的距离Fyf和Fyr分别是前轴和后轴的等效侧向力。在常规稳定工况下可以假设轮胎工作在线性区侧向力等于侧偏刚度乘以侧偏角$$F_{yf} -C_f \alpha_f, \quad F_{yr} -C_r \alpha_r$$前轮侧偏角包含前轮转角输入和运动学分量 $$\alpha_f \delta - \frac{v_y a r}{v_x}$$ $$\alpha_r \frac{b r - v_y}{v_x}$$注意符号约定侧偏角取使轮胎产生侧向力的方向为正这里用的是最常见的SAE坐标系约定。不同论文里符号可能相反模型联立之后一定要用典型工况的数据做开环对撞否则后面所有公式全部白费。把轮胎力代入动力学方程得到完整的连续时间状态方程$$\dot{v_y} \frac{-C_f(\delta - \frac{v_y a r}{v_x}) - C_r(\frac{v_y - b r}{v_x})}{m} - v_x r$$$$\dot{r} \frac{-a C_f(\delta - \frac{v_y a r}{v_x}) b C_r(\frac{v_y - b r}{v_x})}{I_z}$$这里我把负号和分母都写清楚了实际写代码时容易把符号搞混建议先做几个低速稳态转向的开环验证再进闭环。3.3 测量方程的构建横摆角速度加横向加速度量测部分我用了两个信号横摆角速度r和横向加速度ay。横摆角速度的测量方程最简单 $$z_1 r v_1$$横向加速度的测量方程要稍微绕一下。车辆质心处的真实横向加速度可由动力学方程反推等于比力项中的横向部分忽略路面坡度后 $$a_y \frac{F_{yf} F_{yr}}{m} v_1$$但这里有个坑IMU安装在车身上它测量的横向加速度是机体坐标系下的比力包含路面倾斜和车身侧倾带来的重力分量。如果直接拿IMU的ay当z2用模型里又没建侧倾状态估计结果就会出现系统偏差。我的处理方式是在测量该要前先对ay做预处理用一个常值偏置估计和低通滤波去掉明显的重力补偿项同时在R矩阵里给ay分配一个更大的噪声方差降低它对融合结果的权重。如果车辆配有高精度GPS或视觉速度感知模块侧向速度也可以作为外部辅助测量输入但在量产框架里容易受场景限制我只把它当作可选的异步匹配量使用。3.4 雅可比矩阵与离散化处理EKF的雅可比矩阵是整个实现里最需要小心的地方。状态方程F_jacobian是一个2x2矩阵对四个偏导数做推导得到$$\frac{\partial \dot{v_y}}{\partial v_y} -\frac{C_f C_r}{m v_x}$$$$\frac{\partial \dot{v_y}}{\partial r} \frac{a C_f - b C_r}{m v_x} - v_x$$$$\frac{\partial \dot{r}}{\partial v_y} \frac{a C_f b C_r}{I_z v_x}$$$$\frac{\partial \dot{r}}{\partial r} -\frac{a^2 C_f b^2 C_r}{I_z v_x}$$测量方程对状态的雅可比矩阵H_k则是一个2x2矩阵其中第一行是[0, 1]横摆角速度直接等于状态r第二行是$$H_{21} -\frac{C_f C_r}{m v_x}, \quad H_{22} \frac{a C_f - b C_r}{m v_x}$$这里只列了主结果实际推导过程很长强烈建议用符号求导工具做一遍验证再和手推结果对照。数值雅可比也不是不能用但每个时刻都需要重新计算多个扰动点计算量大步长选择也会直接影响稳定性只适合离线调试阶段快速验证。离散化我直接用了四阶Runge-KuttaRK4没有用简单的一阶欧拉。EKF预测阶段本来要对非线性微分方程积分一阶欧拉在0.01秒步长下遇到高频紧急转向很容易累积明显误差。RK4虽然每步要做四次函数求值但单步精度大幅提升对后续的协方差传播也有好处。对于大多数控制器主频在50到100Hz的方案来说RK4的计算开销完全可接受。4. 协方差矩阵设置和发散问题排查4.1 过程噪声Q和测量噪声R的初值从哪来协方差矩阵Q和R是整个EKF调参的重点没有唯一正确答案但可以从物理意义出发定初值。Q矩阵对角元素反映的是模型不确定度。车辆模型里轮胎侧偏刚度Cf、Cr和车辆质量m是有较大误差的路面附着变化也会体现在这里。我给的基础值是$$Q \begin{bmatrix} 0.05 0 \ 0 0.01 \end{bmatrix}$$单位对应vy的量纲是米每秒r的量纲是弧度每秒。这个量级意味着我对vy的预测置信度比r低事实也确实如此——横向速度主要依赖轮胎模型估算误差源比横摆角速度多。R矩阵对角元素反映传感器噪声。横摆角速度陀螺在正常工作范围内的噪声标准差大约在0.01 rad/s量级对应的R_11在0.0001左右。横向加速度的噪声更大经过预处理之后我给R_22取0.01到0.04。总体思路是测量越可信R越小卡尔曼增益里测量修正占比越高。这些初值只是起点最终要通过实际数据分析确定。采集一段静态和匀速直线行驶数据计算传感器信号的标准差再采集一段试验场动态数据看估计值和参考真值的误差来微调。4.2 一次发散故障的完整排查链路调试阶段我遇到过一次典型的发散问题整个过程很值得复盘。现象是低速直线工况下估计值正常一到双移线工况、高频率转向时vy估计在几个周期内就跳到离谱的值r估计倒是还算正常。最开始我以为是Q太小导致滤波器更新不够快把Q调大之后只能说稍有缓解问题没有根治而且直线工况的噪声明显放大。我按照以下链路逐个排查第一步检查离散化精度。先看状态方程在不同步长下的开环响应。用同一段真实输入驱动对比RK4和欧拉法的输出发现大幅转向时欧拉法在每一步都会引入明显误差而EKF协方差传播是基于这些状态的于是立刻把所有预测统一改成RK4发散幅度减小了一半。第二步检查测量方程符号。实车IMU的ay方向和模型里用的ay方向可能不一致。我把采集的转向输入和IMU输出做了相关性分析发现低速稳定圆周工况下ay应该和vy的变化方向匹配通过一组低速转向测试确认了正负号没问题。第三步检查轮胎模型边界。双移线工况中后轮侧偏角在峰值时刻已经超过8到10度线性轮胎模型在这个区域明显低估了轮胎力饱和现象实际车辆的后轴侧向力增长变缓但模型中还是按线性增长推算vy估计自然偏差越来越大。解决方案是在轮胎力计算中加入一个简化的非线性限制或者等价地在工况剧烈时把Q调大。我在轮胎模型上添加了Fiala型的侧向力饱和修正双移线工况的估计稳定性和精度都有明显改善。第四步检查信号时间戳对齐。这是最后发现的关键问题。前轮转角信号从CAN读取后有25到50毫秒的延迟而IMU信号是新的每次测量更新时转角还停留在上一个时刻导致预测的状态和控制输入不对齐。我把转角做了一个带时间戳的队列缓冲将转角插值到和测量同步的时刻再喂给滤波器发散问题才彻底解决。这个排查顺序非常关键按“模型离散化、量测一致性、非线性边界、数据时序”逐步排除比盲目调Q靠谱得多。4.3 侧偏刚度固定假设的坑低附着路面线性轮胎模型里两个最关键的参数是前轴和后轴等效侧偏刚度Cf和Cr。这两个参数不是轮胎本身的固定常数而是会随路面附着系数、垂向载荷、轮胎温度变化的等效值。干燥沥青路面上状态估计表现良好的滤波器到了冰雪或湿地路面轮胎侧偏刚度可能降到干燥路面的30%到50%如果滤波器里还维持干燥路面的参数模型预测会严重偏离估计出的质心侧偏角会明显偏大。解决思路目前工程上主要三条一是增益调度。预先标定几个典型路面附着干燥、湿滑、冰雪下的侧偏刚度参数通过路面附着估计器或车辆稳定性特征识别当前工况切换滤波器参数。二是把路面附着系数μ作为扩展状态一并估计。状态向量里增加一个μ维建立μ的缓慢时变模型然后在EKF更新中在线修正。这个做法系统自由度更高但可观测性变差需要精心设计激励条件我用的简化版只在高横向加速度工况才允许μ更新避免低激励下漂移。三是在观测器之外加一个侧偏刚度在线辨识或残差检测模块当检测到估计残差持续偏大时按固定步长修正刚度参数。这个方案实现简单适合初期快速验证。低附着工况的应对能力往往才是评价一个车辆状态观测器真正水平的地方。5. 仿真和实车验证中看到的真实差距5.1 仿真工况与误差统计我用的验证流程是先在高保真车辆动力学仿真环境里跑控制变量对比再上试验场验证。仿真的好处是可以拿到所有状态的“真值”用来做误差统计和协方差一致性检验。工况我选了三个匀速绕圆、双移线、正弦扫频。车速分别覆盖60公里每小时和120公里每小时两条主线。评价指标是估计值和参考真值的均方根误差RMSE以及峰值误差。干燥路面、中高车速下稳定的稳态工况里vy估计RMSE大约在0.08米每秒以内换算成质心侧偏角不到0.5度横摆角速度估计RMSE大概0.01 rad/s量级。这对大部分底盘控制策略来说完全够用。双移线工况在轮胎模型加上非线性饱和修正后vy峰值误差能够控制在0.2米每秒左右。5.2 实车与仿真的三个显著差异实车测试最大的感受是仿真里调得再顺上车一定还会出问题而且问题往往是小细节。第一个差异是陀螺偏置温漂。MEMS陀螺的零偏会随温度变化冷车启动和热车状态能差出0.01到0.03 rad/s。这个偏置直接进了r测量如果EKF里没有单独估计偏置状态稳态估计就会出现一个不可忽略的常数偏差。后来我在测量前对r做了一阶温漂补偿又在EKF更新时加了很小的自适应偏差修正才把这个问题压住。第二个差异是振动噪声。底盘上的IMU在工作时除了真实车辆运动还叠加了发动机怠速振动、路面颠簸激励横向加速度的高频噪声比仿真假设来得大得多。如果不做低通滤波或陷波处理这些高频分量会通过新息进入估计结果让vy噪声变大。我在测量链路中加了截止频率约20Hz的二阶低通滤波并且保持滤波器和控制器同频避免引入额外相位延迟。第三个差异是方向盘转角零位。转向管柱安装角度会有一个零点偏移如果标定不准确方向盘转角在小角度范围内输出的δ和真实前轮转角不一致EKF在直线行驶时就会出现微小的增稳修正直观表现是vy出现小幅振荡。最终选择在每次车辆直行时自动截获转角零位漂移用一段滚动窗口的平均值补偿。5.3 可观测性边界低速和静止工况任何基于模型的观测器都有可观测性问题EKF也不例外。yaw rate可以持续观测但质心侧偏角或横向速度在车辆直线匀速行驶、几乎不转动方向盘时模型预测基本占主导测量更新能做出的修正极少。一旦车辆进入低速静止状态状态方程里vx出现在分母上整个系统趋近于奇异任何小的数值噪声都会被放大。工程上的处理是当车速低于某个阈值例如5公里每小时时冻结横向状态的EKF协方差增长避免滤波器在这些几乎不可观测的工况下胡乱更新当低速状态恢复时再重新开始正常融合。也可以引入GPS或视觉速度方向作为低速辅助测量但那样会增加系统复杂度而且需要确保定位源在这些场景下的可用性。6. 项目落地的几条个人体会这个项目做下来我对车辆状态观测器的理解比刚开始时深了不少。几条体会拿出来分享建模从简单开始永远不要一上来就搞十二阶全维模型。二自由度单轨模型在大多数稳定工况下都够用先把EKF跑通再根据残差分析逐步加复杂度。模型越复杂参数不确定性越大调参难度爆炸式上升很多时候收益却是边际递减的。EKF落地重点其实不在滤波公式本身而在车辆模型和传感器误差的全链路处理。很多demo跑不起来不是卡尔曼增益算错了而是轮胎力符号反了、转角时间戳没对齐、陀螺偏置没补偿这类细节。调参工具链一定要趁早搭。我给观测器做了一个离线数据回放工具把实车采集的转角、IMU、轮速数据和估计真值画在一张图里调Q、R可以用Playback方式反复回放同一段数据。没有这个工具每次靠实车试感觉效率低而且很难定位问题。做观测器要给后续算法留接口。比如输出侧滑角、横向速度、横摆角速度的同时最好把估计置信度、协方差和信息残差也暴露出去后续做车辆稳定性控制或底盘融合时这些信息非常有用。最后一条小技巧状态方程里的vx建议用专门的车速估计模块输出不要直接用某个轮速。低速时轮速噪声较大如果vx抖得厉害EKF里所有依赖vx的雅可比矩阵也会跟着抖整个滤波器稳定性都会受影响。把这个上游信号先处理好后面能省很多事。