1. 项目概述与背景
在电动汽车和自动驾驶技术快速发展的今天,车辆动力学参数的实时准确估计变得尤为重要。四轮侧偏刚度作为影响车辆操纵稳定性的关键参数,其准确估计对于分布式驱动电动汽车的控制器设计至关重要。传统方法往往依赖于离线测试或简化模型,难以满足实时控制的需求。
本项目构建了一个基于Simulink与CarSim联合仿真的分布式驱动电动汽车四轮侧偏刚度估计系统,采用容积卡尔曼滤波(CKF)算法进行实时估计。与常规方法相比,这套方案具有三个显著优势:
- 实现了四轮侧偏刚度的独立估计,充分考虑了分布式驱动电动汽车各轮独立驱动的特性
- 通过CarSim提供高精度的车辆动力学仿真数据,保证了估计模型的输入质量
- 采用CKF算法处理非线性系统估计问题,相比传统EKF具有更高的估计精度
2. 系统架构设计
2.1 整体框架
系统采用模块化设计,主要包含三个核心模块:
- 四轮驱动电机模块:模拟分布式驱动电动汽车的四轮独立驱动特性
- CarSim接口模块:输出车辆运动状态参数和轮胎受力数据
- CKF估计模块:基于S函数实现的容积卡尔曼滤波器,进行四轮侧偏刚度估计
mermaid复制graph TD
A[四轮驱动电机模块] --> C[CKF估计模块]
B[CarSim接口模块] --> C
C --> D[侧偏刚度估计结果]
2.2 模块功能详解
2.2.1 四轮驱动电机模块
该模块模拟了分布式驱动电动汽车的动力系统特性,主要包括:
- 四个轮毂电机的独立转矩控制
- 电机动态特性建模(响应延迟、转矩限制等)
- 基于驾驶员输入(油门/刹车)的转矩分配策略
2.2.2 CarSim接口模块
CarSim提供了高精度的车辆动力学仿真环境,输出参数包括:
- 车辆运动状态:横摆角速度、侧向加速度等
- 轮胎受力:纵向力、侧向力、垂向力
- 环境参数:路面附着系数、坡度等
2.2.3 CKF估计模块
核心估计算法采用容积卡尔曼滤波,主要特点:
- 通过确定性采样点逼近非线性系统的统计特性
- 相比EKF无需计算雅可比矩阵,实现更简单
- 对强非线性系统具有更好的估计效果
3. 关键技术实现
3.1 车辆动力学建模
采用经典的二自由度自行车模型作为基础,并扩展为四轮独立模型:
code复制m(v̇y + vxγ) = Fyfl + Fyfr + Fyrl + Fyrr
Izγ̇ = a(Fyfl + Fyfr) - b(Fyrl + Fyrr) + ΔM
其中:
- m:车辆质量
- vx,vy:纵向、侧向速度
- γ:横摆角速度
- Fyij:各轮侧向力
- ΔM:直接横摆力矩(分布式驱动特有)
3.2 轮胎模型选择
采用改进的Dugoff轮胎模型,平衡计算复杂度和精度:
code复制Fy = -Cα·tanα·f(λ)
f(λ) = {
(2-λ)λ, if λ < 1
1, if λ ≥ 1
}
λ = μFz(1-εv√(s²+tan²α))/(2√(Css)²+(Cαtanα)²)
3.3 CKF算法实现
容积卡尔曼滤波的具体实现步骤如下:
-
初始化:
- 设置状态向量x=[Cαfl, Cαfr, Cαrl, Cαrr]^T
- 确定过程噪声Q和观测噪声R的协方差矩阵
-
时间更新:
- 计算容积点:ξi = S·γi + x̂
- 传播容积点:χi* = f(ξi)
- 计算预测状态和协方差
-
量测更新:
- 重新计算容积点
- 传播观测容积点:Zi = h(χi)
- 计算预测观测和协方差
- 更新卡尔曼增益和状态估计
4. Simulink-CarSim联合仿真实现
4.1 接口配置
-
CarSim配置:
- 选择适合的车辆模型参数
- 设置输出信号:轮速、轮胎力、车辆运动状态等
- 配置仿真步长(建议0.001-0.005s)
-
Simulink配置:
- 通过S-Function Builder配置CarSim接口模块
- 设置解算器类型为定步长(与CarSim一致)
- 配置数据记录和可视化模块
4.2 S函数实现CKF
核心代码结构如下:
c复制#define S_FUNCTION_NAME CKF_Estimator
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"
#include "math.h"
/* 定义状态向量维度 */
#define NUM_STATES 4
#define NUM_MEASURES 6
static void mdlInitializeSizes(SimStruct *S) {
ssSetNumSFcnParams(S, 0);
if (ssGetNumSFcnParams(S) != 0) return;
ssSetNumContStates(S, 0);
ssSetNumDiscStates(S, NUM_STATES);
/* 设置输入端口 */
if (!ssSetNumInputPorts(S, 1)) return;
ssSetInputPortWidth(S, 0, NUM_MEASURES);
/* 设置输出端口 */
if (!ssSetNumOutputPorts(S, 1)) return;
ssSetOutputPortWidth(S, 0, NUM_STATES);
ssSetNumSampleTimes(S, 1);
}
static void mdlInitializeSampleTimes(SimStruct *S) {
ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);
ssSetOffsetTime(S, 0, 0.0);
}
static void mdlOutputs(SimStruct *S, int_T tid) {
/* 获取输入输出指针 */
InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);
real_T *y = ssGetOutputPortRealSignal(S,0);
/* CKF算法实现 */
// ... 省略具体实现代码 ...
}
static void mdlTerminate(SimStruct *S) {}
#ifdef MATLAB_MEX_FILE
#include "simulink.c"
#else
#include "cg_sfun.h"
#endif
5. 仿真结果与分析
5.1 典型工况测试
选择双移线工况进行测试,结果对比如下:
| 时间(s) | 前左轮估计值(N/rad) | 前左轮参考值(N/rad) | 误差(%) |
|---|---|---|---|
| 1.0 | 54321 | 55000 | 1.23 |
| 2.5 | 53890 | 54500 | 1.12 |
| 4.0 | 52670 | 53000 | 0.62 |
5.2 性能指标
- 估计收敛时间:<0.5s
- 稳态估计误差:<2%
- 计算耗时:<0.1ms/step(Intel i7-10750H)
6. 应用与优化建议
6.1 实际应用场景
- 自动驾驶横向控制参数自适应
- 电子稳定程序(ESP)的轮胎状态监测
- 车辆动力学参数的在线辨识
6.2 优化方向
-
算法层面:
- 引入自适应噪声协方差调整
- 考虑轮胎刚度与垂向载荷的耦合关系
-
工程实现:
- 代码自动生成(Embedded Coder)
- 多速率处理(关键状态快速估计)
-
功能扩展:
- 联合估计纵向刚度
- 路面附着系数估计
注意事项:
- CarSim和Simulink的仿真步长必须严格一致
- 初始状态协方差矩阵需要合理设置
- 轮胎模型参数应与实际车辆匹配
7. 常见问题与解决方法
7.1 估计结果发散
可能原因:
- 过程噪声协方差设置不当
- 轮胎模型参数不准确
- 车辆质量参数误差过大
解决方案:
- 调整Q矩阵对角线元素
- 校准轮胎模型参数
- 检查车辆参数配置
7.2 仿真运行速度慢
优化措施:
- 减少不必要的信号输出
- 使用定步长求解器
- 适当增大仿真步长(保证精度前提下)
7.3 接口通信异常
排查步骤:
- 检查CarSim S-Function配置
- 验证信号名称匹配
- 确认单位系统一致
8. 关键参数配置参考
8.1 CKF参数设置
| 参数名称 | 典型值 | 说明 |
|---|---|---|
| 过程噪声协方差Q | diag([1,1,1,1]) | 状态噪声协方差 |
| 观测噪声协方差R | diag([10,10,10,10,5,5]) | 测量噪声协方差 |
| 初始状态协方差P0 | diag([1e4,1e4,1e4,1e4]) | 初始估计不确定性 |
8.2 车辆参数示例
| 参数 | 值 | 单位 |
|---|---|---|
| 整车质量 | 1500 | kg |
| 轴距 | 2.7 | m |
| 轮胎滚动半径 | 0.35 | m |
| 横摆惯量 | 2500 | kg·m² |
在实际项目中,这些参数应根据具体车型进行调整。建议先通过CarSim的参数化扫描功能,确定各参数对估计结果的敏感度,再进行针对性优化。