行驶车辆状态估计,无迹卡尔曼滤波,扩展卡尔曼滤波(EKF/UKF) 软件使用:Matlab/S...
行驶车辆状态估计,无迹卡尔曼滤波,扩展卡尔曼滤波(EKF/UKF) 软件使用:Matlab/Simulink 适用场景:采用扩展卡尔曼滤波和无迹卡尔曼滤波EKF/UKF进行行驶车辆的“车速,质心侧偏角,横摆角速度估计”,可实现多种工况下车辆状态估计。 产品simulink源码包含如下模块: →工况: 阶跃工况 →整车模块:7自由度整车模型 →估计模块:无迹卡尔曼滤波,扩展卡尔曼滤波 →模型状况: 模型输入:方向盘转角delta,车辆纵向加速度ax 模型输出:横摆角速度wz,纵向车速vx,质心侧偏角β? 包含:simulink源码文件,详细建模说明文档,对应参考资料,售后提供关于产品任何问题,代码均为自己开发,感谢您的支持。 适用于需要或想学习整车动力学simulink建模,以及simulink状态估计算法建模的朋友。 模型运行完全OK(仅适用于MATLAB17版本及以上),
在秋名山跑山最怕啥?不是排水渠过弯翻车,是车辆状态传感器突然掉线——质心侧偏角β和横摆角速度wz这两个关键参数要是读不出来,分分钟让你体验物理引擎失控。这时候就需要老司机必备的车辆状态估计算法来救场了。
先来点硬核的:这个Simulink模型直接上7自由度整车架构。四个悬架上下运动+车身横摆/侧倾/俯仰,比驾校教练车还敏感。核心模块里藏着两个看家法宝——EKF和UKF这对滤波兄弟。估计有小伙伴要问:都是卡尔曼家的,凭啥要搞两套?
举个栗子,当方向盘转角delta突然打满(就像路上突然窜出小动物),传统EKF的雅可比矩阵这时候可能就有点懵圈。来看看UKF的骚操作:
% Sigma点生成代码片段 function [Xsigma] = sigma_points(x, P, gamma) n = length(x); Xsigma = zeros(n, 2*n+1); Xsigma(:,1) = x; U = chol(gamma*P); for k=1:n Xsigma(:,k+1) = x + U(:,k); Xsigma(:,k+n+1) = x - U(:,k); end end这段代码就像在状态空间里撒网捕鱼,用Sigma点把非线性系统的可能状态一网打尽。相比EKF的线性化近似,UKF这种暴力采样法在车辆剧烈运动时反而更靠谱。
行驶车辆状态估计,无迹卡尔曼滤波,扩展卡尔曼滤波(EKF/UKF) 软件使用:Matlab/Simulink 适用场景:采用扩展卡尔曼滤波和无迹卡尔曼滤波EKF/UKF进行行驶车辆的“车速,质心侧偏角,横摆角速度估计”,可实现多种工况下车辆状态估计。 产品simulink源码包含如下模块: →工况: 阶跃工况 →整车模块:7自由度整车模型 →估计模块:无迹卡尔曼滤波,扩展卡尔曼滤波 →模型状况: 模型输入:方向盘转角delta,车辆纵向加速度ax 模型输出:横摆角速度wz,纵向车速vx,质心侧偏角β? 包含:simulink源码文件,详细建模说明文档,对应参考资料,售后提供关于产品任何问题,代码均为自己开发,感谢您的支持。 适用于需要或想学习整车动力学simulink建模,以及simulink状态估计算法建模的朋友。 模型运行完全OK(仅适用于MATLAB17版本及以上),
实测数据更刺激:当纵向车速vx从30km/h突然提到80km/h,EKF估计的β角会有2度左右的相位滞后,而UKF基本能咬住真值曲线。不过代价是UKF的CPU占用率比EKF高出约18%——鱼和熊掌的问题总逃不掉。
模型里有个彩蛋设计:方向盘转角输入模块自带"手残模式",可以模拟新手司机抽搐式打方向。这时候观测器里的运动学方程就派上用场了:
% 横摆动力学方程简化版 function dx = yaw_dynamics(t, x, u) beta = x(1); wz = x(2); delta = u(1); ax = u(2); % 魔术公式轮胎模型简化 Fyf = 8000 * sin(1.5 * atan(delta - 0.02*beta)); Fyr = 6000 * sin(1.2 * atan(-0.035*beta)); dx = [ (Fyf + Fyr)/(m*vx) - wz; (a*Fyf - b*Fyr)/Iz ]; end这个微分方程组的数值稳定性直接决定滤波器会不会崩。建议仿真时把最大步长压到0.01秒以下,不然急变工况容易数值爆炸。
最后给个忠告:模型里的纵向车速估计模块对路面坡度特别敏感,要是哪天发现vx估计值飘得比秋名山海拔还高,记得检查是不是没加坡度传感器。毕竟现实中的车辆动力学,永远比仿真复杂那么亿点点。
