1. 项目概述
最近完成了一个基于CarSim和Simulink联合仿真的智能车辆换道超车系统,特别针对弯道工况进行了优化。这个项目实现了从换道决策、路径规划到轨迹跟踪的完整闭环控制,并且在自定义弯道环境中表现出色。系统核心包含以下几个关键模块:
- 换道决策模块:基于状态机的智能触发机制
- 路径规划模块:采用五次多项式曲线生成算法
- 轨迹跟踪模块:模型预测控制(MPC)实现精准跟踪
- 可视化系统:CarSim内置的轨迹可视化功能
这个系统的独特之处在于专门针对弯道工况进行了优化,解决了传统直线道路算法在弯道中容易失效的问题。通过实际测试,在半径80米的弯道上可以实现横向跟踪误差小于10厘米的精准控制。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 整体框架
系统采用CarSim作为车辆动力学仿真平台,Simulink作为控制算法开发环境,两者通过联合仿真接口实时交互数据。这种架构既保证了车辆动力学仿真的真实性,又提供了灵活的控制算法开发环境。
主要数据流包括:
- CarSim输出车辆状态信息(位置、速度、加速度等)
- Simulink处理传感器数据并做出控制决策
- 控制指令(转向、油门、刹车)返回CarSim
2.2 模块划分
系统主要分为三个核心模块:
-
环境感知与决策模块
- 前车距离检测
- 相对速度计算
- 超车条件判断
-
路径规划模块
- 参考路径生成
- 五次多项式轨迹规划
- 曲率连续处理
-
轨迹跟踪模块
- MPC控制器设计
- 轮胎力反馈补偿
- 执行器控制
3. 换道决策实现
3.1 状态机设计
换道决策采用有限状态机(FSM)实现,主要包含以下几个状态:
- 车道保持状态:默认状态,车辆沿当前车道行驶
- 超车准备状态:检测到可超车条件时进入
- 超车执行状态:实际执行换道动作
- 超车完成状态:完成超车后返回原车道
状态转换条件基于以下参数:
- 自车速度(v_ego)
- 前车速度(v_front)
- 两车距离(d_front)
3.2 关键判断逻辑
核心判断代码如下:
matlab复制if (v_ego > v_front * 1.2) && (d_front < 50)
overtake_flag = 1;
else
overtake_flag = 0;
end
这个判断条件有几个关键点:
- 速度差阈值设为20%,确保有足够的超车能力
- 距离阈值50米,保证安全距离
- 两个条件同时满足才触发超车
实际调试中发现,在弯道工况下,这些阈值需要根据曲率动态调整。急弯时需要更保守的参数设置。
4. 路径规划算法
4.1 五次多项式轨迹生成
在弯道场景下,传统的三次多项式轨迹在曲率连续性上表现不佳,容易导致车辆抖动。采用五次多项式可以更好地控制轨迹的曲率变化。
横向位移生成代码:
matlab复制coeffs = polyfit([0, T], [0, 0, 0, lat_dis, 0, 0], 5);
t = 0:0.1:T;
lat_traj = polyval(coeffs, t);
这里设置了起点和终点的位置、速度和加速度约束,确保轨迹平滑。
4.2 时间参数自适应
在弯道中,固定的时间参数T会导致问题:
- 急弯时可能轨迹过于激进
- 缓弯时又过于保守
解决方案是让T根据弯道曲率动态调整:
matlab复制T = base_T * (1 + kappa * adjust_factor);
其中kappa是道路曲率,adjust_factor是调节系数。
5. 轨迹跟踪控制
5.1 MPC控制器设计
MPC控制器的核心优势是能够考虑道路的未来曲率变化,提前做出控制决策。基本流程如下:
- 建立车辆动力学模型
- 设计目标函数(跟踪误差最小)
- 添加各种约束条件(执行器限制、稳定性等)
- 在线求解优化问题
5.2 弯道特殊处理
在弯道工况下需要特别考虑:
- 轮胎非线性特性:通过CarSim实时获取轮胎力反馈
- 曲率约束:将道路曲率作为MPC的约束条件
- 速度适应:根据曲率动态调整参考速度
核心优化循环:
matlab复制while iter < max_iter
% 获取当前道路曲率
curvature_constr = get_curvature_from_carsim();
[A, b] = generate_curvature_constraints(curvature_constr);
% 求解QP问题
[U, cost] = quadprog(H, f, A, b, [], [], lb, ub);
% 应用第一控制量
apply_steering(U(1));
end
6. 联合仿真实现
6.1 CarSim配置
关键配置步骤:
- 在VehicleSim模块中设置正确的车辆参数
- 配置输出信号(车辆状态、轮胎力等)
- 设置仿真步长为Simulink的整数倍
- 启用Trajectory Layer可视化
6.2 Simulink接口
主要注意事项:
- 确保采样时间同步
- 信号数据类型匹配
- 添加适当的延迟补偿
- 设计完善的异常处理机制
调试时发现的一个关键点:CarSim的仿真步长必须设为Simulink的整数倍,否则会出现信号错乱导致车辆控制异常。
7. 道路环境自定义
7.1 弯道生成
在CarSim的Road Builder中可以使用参数化方法生成各种弯道:
-
正弦函数生成S弯:
math复制y = A*sin(2πx/λ)通过调整振幅A和波长λ控制弯道难度
-
圆弧弯道:
- 指定半径和圆心角
- 可设置过渡缓和曲线
7.2 场景切换
设计了一个场景切换模块,可以一键切换:
- 直线道路
- 单弯道
- 连续S弯
- 组合弯道
便于全面测试系统性能。
8. 调试与优化
8.1 可视化工具
开发了几个实用的可视化工具:
- 轨迹对比图:显示规划路径和实际轨迹
- 误差分析图:跟踪误差随时间变化
- 曲率-速度图:分析MPC的速度调节策略
使用示例:
matlab复制plot_results(log_data);
8.2 参数调优
发现几个关键参数需要精细调节:
- MPC预测时域:与车速相关
- 权重矩阵:平衡跟踪精度和舒适性
- 执行器限制:避免过度控制
调优建议:
- 从保守参数开始
- 逐步放宽限制
- 记录每次修改的影响
9. 实测结果分析
经过多次测试,系统表现出以下特性:
-
直线工况:
- 横向误差 < 5cm
- 速度跟踪误差 < 0.5m/s
-
弯道工况(半径80m):
- 横向误差 < 10cm
- 最大侧向加速度 < 0.3g
- 舒适性指标满足ISO标准
-
换道过程:
- 完成时间约3-5秒
- 最大横向加速度 < 0.2g
- 无明显抖动或超调
10. 经验总结
在实际开发过程中积累了一些宝贵经验:
- 弯道参数调节:不同曲率需要不同的控制参数,最好实现自适应调节
- 实时性优化:MPC的求解速度是关键,需要合理简化模型
- 可视化调试:好的可视化工具能极大提高调试效率
- 安全限制:一定要设置合理的执行器限制,避免失控
一个特别有用的技巧:在初期测试时,可以先将方向盘转角限制设置为较小值,逐步放开,这样能避免因控制算法问题导致的剧烈动作。
