Simulink和Carsim联合仿真车辆状态估计 方法:卡尔曼滤波的EKF,UKF,CKF等 系统的输入量:前轮转角,纵向加速度,侧向加速度等(可以自由定义) 估计的状态量:横摆角速度,质心侧偏角,纵向车速,侧向车速 Carsim提供实车的数据,Simukink中搭建观测器,S函数写的滤波代码,易懂易调,联合仿真相比于纯Simulink模型的状态估计,联合仿真更具有说服力,所有模型均为本人硕士期间搭建,有完整的模型,注释,参数,说明文档,可提供各种细节,支持一手资料

直接上干货。搞车辆状态估计的老铁应该都清楚,联合仿真这玩意儿有多香——Carsim里跑着带魔术轮胎的八自由度整车模型,Simulink这边怼个自己写的状态观测器,左手实车数据右手估计算法,调参的时候不用对着仿真模型自嗨,这波操作稳得一批。

咱今天重点唠唠怎么用S函数手撕卡尔曼全家桶。先看输入输出:前轮转角直接从Carsim的方向盘转角换算,纵向加速度用IMU信号加个滑动窗口滤波,侧向加速度记得做坐标变换。要估的四个状态量里,质心侧偏角这货最难搞,毕竟没法直接测量,得靠横摆角速度和车速反推。

以UKF为例,核心代码就三块:

function [x_est, P] = UKF_predict(f, x, P, Q, dt)
    % 生成Sigma点
    [Xsigma, W] = scaled_sigma_points(x, P, alpha, beta, kappa);
    
    % 传播Sigma点
    Xpred = zeros(size(Xsigma));
    for i = 1:size(Xsigma,2)
        Xpred(:,i) = f(Xsigma(:,i), dt);  % 非线性状态方程
    end
    
    % 计算预测均值和协方差
    x_pred = Xpred * W(:);
    P_pred = Q;
    for i = 1:size(Xsigma,2)
        P_pred = P_pred + W(i)*(Xpred(:,i)-x_pred)*(Xpred(:,i)-x_pred)';
    end
end

这段预测步的关键在于sigma点的权重计算。参数alpha控制分布范围,beta针对非高斯特性优化,实测时beta=2对车辆模型最友好。注意动力学模型f()要单独封装,建议用.m文件别整匿名函数,方便调试。

观测更新部分有个坑:Carsim输出的横摆角速度自带高频噪声,得在观测方程里加低通滤波。我的处理方案是在S函数里嵌套了个二阶Butterworth:

function y = measurement_model(x)
    persistent prev_yaw_rate;
    if isempty(prev_yaw_rate)
        prev_yaw_rate = x(1);
    end
    
    % 二阶巴特沃斯滤波
    [b,a] = butter(2, 10/(1000/2));  % 10Hz截止频率
    current_yaw = filter(b, a, x(1)-prev_yaw_rate);
    prev_yaw_rate = x(1);
    
    y = [current_yaw; 
         x(2); 
         x(3)*cos(x(4)) - x(5)*sin(x(4));  % 纵向车速
         x(3)*sin(x(4)) + x(5)*cos(x(4))]; % 侧向车速
end

滤波截止频率别拍脑袋定,建议先跑个Carsim工况,把原始信号频谱分析一波。实测发现当车速超过80km/h时,横摆角频率成分主要分布在0-5Hz,这时候截止频率设10Hz能有效去毛刺又不损失动态。

Simulink和Carsim联合仿真车辆状态估计 方法:卡尔曼滤波的EKF,UKF,CKF等 系统的输入量:前轮转角,纵向加速度,侧向加速度等(可以自由定义) 估计的状态量:横摆角速度,质心侧偏角,纵向车速,侧向车速 Carsim提供实车的数据,Simukink中搭建观测器,S函数写的滤波代码,易懂易调,联合仿真相比于纯Simulink模型的状态估计,联合仿真更具有说服力,所有模型均为本人硕士期间搭建,有完整的模型,注释,参数,说明文档,可提供各种细节,支持一手资料

调参玄学时间到!Q矩阵和R矩阵的初始化千万别信教科书上的鬼话。我的祖传秘方是:先让Q=diag([0.1, 0.5, 0.3, 0.2]),R=diag([0.05, 0.1, 0.2, 0.2]),然后开着仿真边跑边调。重点看质心侧偏角的收敛速度——出现超调就加大Q(2,2),响应慢了就减小R(4,4)。

最后安利下CKF,这货用球面径向规则取代sigma点,在轮胎非线性区间的表现比UKF稳得多。特别是做漂移工况时,CKF的侧向车速估计误差能压到0.3m/s以内,而EKF已经开始鬼畜了。不过计算量大了约40%,实时性捉急的兄弟慎用。

模型验证阶段必须玩点骚操作:在Simulink里故意给前轮转角加个5Hz的正弦扰动,同时对比Carsim自带的车辆状态输出。这时候如果估计曲线和真值曲线的相位差超过20ms,建议回头检查动力学模型里的轮胎松弛长度参数是不是没设对。

整套模型在双移线工况下的实测数据说话:横向车速估计误差均值0.12m/s,横摆角速度滞后时间43ms。比纯Simulink仿真可信度高不止一个level——毕竟Carsim的轮胎模型是实车数据标定过的,比自己写的魔术公式不知道高到哪里去了。

需要参数配置文档的兄弟直接私,硕士期间踩过的坑都整理成调试备忘录了。特别是Carsim和Simulink的时钟同步问题,这个坑爹问题当年卡了我整整两周,解决方案绝对让你少掉500根头发。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐