在智能驾驶技术快速发展的今天,自适应巡航控制(ACC)系统已经成为现代汽车标配的高级驾驶辅助功能。不同于传统的定速巡航,ACC系统能够根据前方车辆动态自动调整车速,保持安全跟车距离。这个项目采用模型预测控制(MPC)算法来实现更智能、更平顺的自适应巡航控制,相比传统的PID控制方法,MPC能够更好地处理系统约束和多目标优化问题。
我曾在多个自动驾驶项目中实践过不同类型的ACC系统,发现MPC方法在应对复杂交通场景时表现尤为突出。它不仅能考虑当前状态,还能预测未来数秒内的车辆行为,提前做出更合理的控制决策。本文将详细解析这套系统的设计思路和实现细节,包括车辆动力学建模、控制器设计、仿真验证等关键环节。
基于MPC的ACC系统采用分层控制架构:
code复制[感知输入] → [MPC控制器] → [执行器控制] → [车辆响应]
↑ ↓
[驾驶员设置] ← [HMI交互]
在设计过程中,我们主要权衡了以下几个因素:
提示:实际项目中经常需要在控制性能和计算复杂度之间做trade-off。通过测试我们发现,5秒的预测时域配合0.1秒的控制时步能在保证实时性的同时获得良好的控制效果。
采用简化的单车模型来描述车辆纵向运动:
code复制ẋ = v
v̇ = a
ȧ = (u - a)/τ
其中:
使用前向欧拉法进行离散化(采样时间Ts=0.1s):
code复制x(k+1) = x(k) + v(k)*Ts
v(k+1) = v(k) + a(k)*Ts
a(k+1) = a(k) + (u(k)-a(k))/τ*Ts
我们在CarSim中建立了高保真车辆模型进行对比验证。测试数据显示,简化模型在30-120km/h速度范围内的误差小于5%,满足控制器设计需求。
MPC的核心是求解以下优化问题:
code复制min Σ [α(v-v_ref)² + β(a)² + γ(j)²]
s.t.
动力学约束
v_min ≤ v ≤ v_max
a_min ≤ a ≤ a_max
d ≥ d_safe
其中:
采用时距(time gap)策略计算安全距离:
code复制d_safe = t_gap * v + d0
典型参数:
通过引入松弛变量,将原问题转化为二次规划(QP)形式:
code复制min 1/2 zᵀHz + fᵀz
s.t. Az ≤ b
使用OSQP求解器进行高效求解,实测平均求解时间约25ms。
采用ROS2框架实现模块化设计:
python复制# MPC参数
N = 50 # 预测步长(5秒)
Ts = 0.1 # 采样时间
Q = np.diag([1.0, 0.1, 0.01]) # 状态权重
R = 0.1 # 控制量权重
# 车辆参数
tau = 0.5 # 动力系统延迟
a_max = 2.5 # 最大加速度(m/s²)
a_min = -3.0 # 最大减速度
cpp复制// MPC求解核心逻辑
void MPCSolver::solve(const State& x0, const Reference& ref) {
// 构建H矩阵
Eigen::MatrixXd H = /*...*/;
// 构建约束
Eigen::MatrixXd A = /*...*/;
Eigen::VectorXd lb = /*...*/;
// 调用QP求解器
OsqpEigen::Solver solver;
solver.settings()->setVerbosity(false);
solver.data()->setNumberOfVariables(num_vars);
solver.data()->setHessianMatrix(H);
/*...*/
// 获取最优解
Eigen::VectorXd sol = solver.getSolution();
}
测试场景:
性能指标:
| 场景 | 速度误差(m/s) | 最大jerk(m/s³) | 跟车距离误差(m) |
|---|---|---|---|
| 1 | 0.32 | 0.8 | 1.2 |
| 2 | 0.45 | 1.9 | 2.1 |
| 3 | 0.28 | 1.2 | - |
在实际车辆部署时,我们遇到了几个关键问题:
通过以下方法将计算时间从120ms降至35ms:
改善乘坐舒适性的关键参数调整:
python复制# 调整权重矩阵
Q_comfort = np.diag([0.5, 0.5, 0.2]) # 更注重减小加速度
R_comfort = 0.5 # 更平滑的控制变化
# 增加jerk约束
j_max = 1.5 # 原为2.0
针对特殊情况的处理策略:
可能原因:
典型解决方案:
处理步骤:
这套MPC框架经过适当修改还可用于:
在实际项目中,我发现MPC控制器对参数变化相对鲁棒,但需要仔细调校权重矩阵。一个实用的技巧是先用仿真确定参数范围,再通过实车测试微调。另外,保持代码模块化非常重要,这样当需要从ACC扩展到全速域巡航(FSRA)时,可以最小化修改量。