基于分布式驱动电动汽车的车辆状态估计,采用的是无迹卡尔曼(ukf)观测器,可估计包括纵向速度,质心侧偏角,横摆角速度,以及四个车轮角速度七个状态 模型中第一个模块是四轮驱动电机;第二个模块是carsim输出的真实参数,包括汽车所受横向力,纵向力,驱动力矩等:第三个模块是基于dugoff计算轮胎力模块,该模块可以计算纵向力和横向力 第四个模块是关于ukf的车辆状态估计,可估计包括纵向速度,横摆角速度,质心侧偏角以及四个车轮角速度七个状态 模型和代码完全是由自己亲手编写,可供自己参考和学习 本模型是基于simulink与carsim联合仿真,ckf是由s function进行编写,提供相关文献

在电动汽车领域,车辆状态估计对于提升车辆性能和安全性至关重要。今天就来聊聊我基于分布式驱动电动汽车做的车辆状态估计研究,采用的是无迹卡尔曼(UKF)观测器,它可对纵向速度、质心侧偏角、横摆角速度以及四个车轮角速度这七个关键状态进行估计。

模型模块剖析

四轮驱动电机模块

这是整个系统动力输出的起始点,负责为车辆提供动力。在Simulink中,我们可以通过搭建相关的电机模型来模拟其输出特性。比如简单的直流电机模型,假设电机的电压方程为:$V = R\cdot I + L\cdot\frac{dI}{dt} + Ke\cdot\omega$,其中$V$是输入电压,$R$是电阻,$I$是电流,$L$是电感,$Ke$是反电动势常数,$\omega$是电机角速度。在Simulink里,可以通过使用各种模块搭建出这个方程的模型,实现对电机输出的模拟。

Carsim输出真实参数模块

Carsim可是个强大的工具,它能输出汽车所受横向力、纵向力、驱动力矩等真实参数。这就好比给我们的模型提供了一个可靠的“现实参考”。在实际应用中,我们可以通过接口将Carsim的数据引入到Simulink环境中。例如在Matlab脚本里,可以使用相关的函数来调用Carsim的数据,像这样:

% 假设已经配置好Carsim与Matlab的接口
data = callCarsimFunction(); % 这里的callCarsimFunction是自定义的获取Carsim数据的函数
lateralForce = data.lateralForce;
longitudinalForce = data.longitudinalForce;
drivingTorque = data.drivingTorque;

这些数据为后续模块的计算提供了基础。

基于Dugoff计算轮胎力模块

这个模块很关键,它能够计算轮胎的纵向力和横向力。Dugoff模型基于轮胎的滑移率等参数来计算轮胎力。在代码实现上,以纵向力计算为例,假设滑移率为$s$,垂直载荷为$F_z$,可以有类似这样的代码片段:

function Fx = calculateLongitudinalForce(s, F_z)
    % Dugoff模型中的一些参数
    mu0 = 1.0; % 峰值附着系数
    kappa = 0.1; % 与轮胎特性相关的参数
    Fx = mu0 * F_z * s / (1 + kappa * abs(s));
end

这里简单模拟了基于Dugoff模型计算纵向力的过程,横向力计算类似,但涉及到更复杂的侧向滑移相关参数。

UKF车辆状态估计模块

重头戏来了,这个模块利用UKF算法估计纵向速度、横摆角速度、质心侧偏角以及四个车轮角速度这七个状态。在Simulink中,我通过S - function来编写UKF算法。下面是简化版的UKF核心代码思路(以Matlab代码为例):

% UKF初始化
function ukfInit()
    % 状态向量初始化
    x = zeros(7, 1); % 7个状态:纵向速度、质心侧偏角、横摆角速度、四个车轮角速度
    % 协方差矩阵初始化
    P = eye(7); 
    % 过程噪声协方差
    Q = eye(7) * 0.01; 
    % 观测噪声协方差
    R = eye(7) * 0.1; 
end

% UKF预测步骤
function [x_pred, P_pred] = ukfPredict(x, P, Q)
    % 状态转移函数假设为简单线性,实际可能更复杂
    A = eye(7); 
    x_pred = A * x;
    P_pred = A * P * A' + Q;
end

% UKF更新步骤
function [x_update, P_update] = ukfUpdate(x_pred, P_pred, z, R)
    % 计算sigma点
    n = size(x_pred, 1);
    lambda = 3 - n;
    X = [x_pred repmat(x_pred, 1, 2 * n) + chol((lambda + n) * P_pred) * [-eye(n); eye(n)]];
    % 时间更新
    Y = zeros(size(X));
    for k = 1:2 * n + 1
        Y(:, k) = stateTransitionFunction(X(:, k)); % 状态转移函数
    end
    % 计算预测均值和协方差
    x_bar = sum(Y, 2) / (2 * n + 1);
    P_bar = zeros(n);
    for k = 1:2 * n + 1
        P_bar = P_bar + (Y(:, k) - x_bar) * (Y(:, k) - x_bar)' / (2 * n + 1);
    end
    P_bar = P_bar + Q;
    % 测量更新
    H = measurementFunctionJacobian(x_bar); % 测量函数雅可比矩阵
    S = H * P_bar * H' + R;
    K = P_bar * H' / S;
    x_update = x_bar + K * (z - measurementFunction(x_bar));
    P_update = (eye(n) - K * H) * P_bar;
end

这里的状态转移函数stateTransitionFunction和测量函数measurementFunction需要根据实际的车辆模型来具体定义,measurementFunctionJacobian是测量函数的雅可比矩阵计算函数。

联合仿真与总结

本模型基于Simulink与Carsim联合仿真,这种方式能很好地结合两者优势。Simulink方便搭建各种控制和估计模型,Carsim提供高精度的车辆动力学真实参数。整个模型和代码都是我亲手编写,一方面是为了深入理解车辆状态估计的原理和实现过程,另一方面也方便自己后续参考和学习。

基于分布式驱动电动汽车的车辆状态估计,采用的是无迹卡尔曼(ukf)观测器,可估计包括纵向速度,质心侧偏角,横摆角速度,以及四个车轮角速度七个状态 模型中第一个模块是四轮驱动电机;第二个模块是carsim输出的真实参数,包括汽车所受横向力,纵向力,驱动力矩等:第三个模块是基于dugoff计算轮胎力模块,该模块可以计算纵向力和横向力 第四个模块是关于ukf的车辆状态估计,可估计包括纵向速度,横摆角速度,质心侧偏角以及四个车轮角速度七个状态 模型和代码完全是由自己亲手编写,可供自己参考和学习 本模型是基于simulink与carsim联合仿真,ckf是由s function进行编写,提供相关文献

同时,研究过程中参考了不少相关文献,如[文献名称1]、[文献名称2]等,这些文献为UKF算法在车辆状态估计中的应用提供了理论基础和实践指导。希望我的这些分享能给对电动汽车车辆状态估计感兴趣的朋友一些启发。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐