1. 项目概述
在自动驾驶领域,轨迹规划和控制一直是核心难题。最近我在研究紧急换道避撞场景时,发现人工势场法(APF)结合模型预测控制(MPC)的方案表现相当出色。通过在Carsim和Simulink中进行联合仿真,这套方案成功将跟踪误差控制在0.3米以内,完全满足自动驾驶对轨迹跟踪精度的要求。
这个项目的核心价值在于:
- 展示了人工势场法在动态避障中的实际应用效果
- 验证了MPC控制器对复杂轨迹的跟踪能力
- 提供了完整的Carsim-Simulink联合仿真实现方案
- 包含了可直接复用的代码和参数配置
2. 人工势场法原理与实现
2.1 势场法基本概念
人工势场法的核心思想是将车辆运动环境建模为势能场:
- 目标点产生引力场,吸引车辆向其移动
- 障碍物产生斥力场,排斥车辆远离危险区域
- 车辆在合力场作用下沿着势能下降方向运动
这种方法的优势在于计算效率高、实时性好,特别适合动态避障场景。
2.2 关键参数解析
在实现中,有几个关键参数需要特别注意:
matlab复制k_att = 0.5; % 引力增益系数
k_rep = 1.2; % 斥力增益系数
d_safe = 5; % 安全距离阈值
- 引力增益k_att决定车辆向目标点移动的"迫切程度"
- 斥力增益k_rep控制障碍物对车辆的影响强度
- 安全距离d_safe定义了斥力场的作用范围
提示:k_rep不宜设置过大,否则会导致轨迹抖动。建议从1.0开始逐步调大。
2.3 势场计算代码详解
势场计算的核心代码如下:
matlab复制function U = potential_field(ego_pos, target_pos, obs_pos)
% 目标引力计算
vec_att = target_pos - ego_pos;
U_att = 0.5 * k_att * norm(vec_att)^2;
% 障碍斥力计算
vec_rep = ego_pos - obs_pos;
dist_rep = norm(vec_rep);
if dist_rep < d_safe
U_rep = 0.5 * k_rep * (1/dist_rep - 1/d_safe)^2;
else
U_rep = 0;
end
U = U_att + U_rep;
end
这段代码实现了:
- 计算目标点引力势能(二次函数)
- 计算障碍物斥力势能(在安全距离内按反比平方关系计算)
- 将两者叠加得到总势能场
3. MPC控制器设计与实现
3.1 MPC基本原理
模型预测控制(MPC)通过以下步骤工作:
- 建立车辆动力学模型
- 在每个控制周期求解有限时域内的最优控制问题
- 只执行第一个控制量,下一周期重新优化
这种滚动优化机制使MPC具有很好的抗干扰能力。
3.2 控制器参数配置
MPC的关键参数配置如下:
matlab复制mpcobj.Weights.OutputVariables = [1.0 0.8]; % 横向误差权重 > 航向角误差权重
mpcobj.Weights.ManipulatedVariables = [0.3, 0.5]; % 转向权重 > 加速权重
mpcobj.PredictionHorizon = 20; % 预测时域
mpcobj.ControlHorizon = 5; % 控制时域
参数选择考虑:
- 横向误差权重较高确保轨迹跟踪精度
- 转向权重高于加速度,防止过度转向导致失稳
- 预测时域20步(约2秒)平衡了计算量和预测效果
3.3 代价函数设计
MPC的代价函数通常包括:
- 输出变量误差(位置、航向角等)
- 控制量变化率(转向角速度、加速度等)
- 终端代价(确保预测时域末状态稳定)
在我们的实现中,特别加强了横向位置跟踪的权重,这是提高避障精度的关键。
4. Carsim-Simulink联合仿真
4.1 仿真框架搭建
联合仿真的核心是建立Carsim和Simulink的数据交换机制:
- Carsim提供车辆动力学模型
- Simulink运行控制算法
- 通过S-function实现两者通信
注意:必须确保两者的仿真步长一致,建议设置为10ms,否则会导致控制延迟。
4.2 时钟同步问题解决
在实际调试中,我们遇到了严重的控制延迟问题,表现为:
- 车辆轨迹出现明显振荡
- 控制指令与车辆状态不同步
解决方法:
- 检查Carsim输出频率与Simulink采样时间
- 在S-function中显式设置通信步长为10ms
- 使用零阶保持器确保信号连续性
4.3 仿真结果分析
通过对比规划轨迹(蓝色虚线)和控制轨迹(红色实线)可以观察到:
- 势场法规划的轨迹能有效避开障碍物
- MPC控制器能紧密跟踪规划轨迹
- 最大跟踪误差小于0.3米
- 换道过程平稳,无剧烈转向
5. 高级技巧与优化
5.1 动态目标点偏移
为提高避障成功率,我们实现了动态目标点偏移:
- 检测相邻车道车辆速度
- 当相对速度低于阈值时,将目标点向相反方向偏移2米
- 这种"预瞄"策略使换道决策提前0.5秒
实现代码片段:
matlab复制if neighbor_speed < ego_speed * 0.8
target_offset = 2 * sign(lane_offset);
else
target_offset = 0;
end
adjusted_target = original_target + [0; target_offset];
5.2 参数调试经验
经过大量仿真测试,总结出以下调试经验:
- 先调势场法参数确保规划轨迹合理
- 再调MPC权重使跟踪误差最小
- 最后微调预测时域和控制时域
- 安全距离d_safe建议设为车速的1-1.5倍(单位:米)
5.3 常见问题排查
-
轨迹抖动严重:
- 检查斥力增益k_rep是否过大
- 确认MPC的转向权重设置合理
- 查看仿真步长是否一致
-
跟踪误差大:
- 增加MPC输出变量权重
- 延长预测时域
- 检查车辆模型参数准确性
-
避障不及时:
- 减小安全距离d_safe
- 增加引力增益k_att
- 考虑引入动态目标点偏移
6. 扩展应用与改进方向
当前方案已经可以很好地处理单车道的紧急避障场景。为进一步提升性能,可以考虑:
-
多障碍物场景扩展:
- 为每个障碍物计算独立的斥力场
- 引入障碍物优先级机制
-
势场法改进:
- 加入速度势场考虑相对速度
- 实现势场参数的在线自适应调整
-
控制策略优化:
- 结合强化学习训练更智能的规划器
- 尝试将势场法直接集成到MPC代价函数中
这套方案不仅适用于学术研究,也可以作为自动驾驶辅助功能的开发参考。在实际应用中,还需要考虑传感器噪声、通信延迟等现实因素,但核心的规划控制框架具有很好的扩展性。