1. 自适应巡航控制(ACC)系统概述
自适应巡航控制(Adaptive Cruise Control,简称ACC)是现代汽车智能驾驶系统中的核心功能之一。与传统的定速巡航不同,ACC能够根据前方车辆的速度自动调整本车速度,保持安全跟车距离。我最近完成的一个ACC项目采用了分层控制架构:上层控制器使用模型预测控制(MPC)算法进行决策规划,下层控制器则采用标定法执行具体控制指令。
这个系统的独特之处在于接入了Carsin平台中的GPS数据,基于大地坐标系设计MPC控制器。这种设计不仅能够实现基本的跟车功能,还为后续扩展规划层(如自动超车)奠定了基础。在开发过程中,我们重点对三种典型工况进行了仿真测试:稳态跟随、前车切入和切出场景。
提示:大地坐标系下的MPC设计需要考虑地球曲率对位置计算的影响,这在长距离跟车场景中尤为重要。
2. 系统架构与核心算法
2.1 分层控制架构设计
我们的ACC系统采用典型的分层控制架构,这种设计借鉴了工业控制领域的成熟经验:
-
上层控制器(决策层):
- 使用MPC算法进行运动规划
- 输入:本车状态、前车状态、道路信息
- 输出:期望加速度/减速度指令
- 采样周期:100ms
-
下层控制器(执行层):
- 采用标定法将上层指令转化为具体执行信号
- 处理节气门开度、制动压力等底层控制
- 采样周期:10ms
这种分层设计的关键优势在于:
- 上层可以专注于决策优化,不受底层执行细节干扰
- 下层可以快速响应,确保控制指令的及时执行
- 各层可以独立开发和测试,提高开发效率
2.2 MPC算法核心实现
MPC控制器的核心是以下优化问题的求解:
min J = ∑(xₖ - x_ref)ᵀQ(xₖ - x_ref) + uₖᵀRuₖ
s.t. xₖ₊₁ = Axₖ + Buₖ
u_min ≤ uₖ ≤ u_max
其中关键参数的选择依据:
- 状态权重矩阵Q:主要考虑跟车距离误差和速度误差的权重分配
- 控制权重矩阵R:防止加速度指令变化过于剧烈
- 预测时域N:通常选择8-10步,对应0.8-1秒的预测范围
在实际代码实现中,我们使用Python的NumPy库进行矩阵运算:
python复制def mpc_controller(current_state, reference):
# 初始化预测状态和控制序列
x_pred = np.zeros((state_dim, N+1))
u_pred = np.zeros((control_dim, N))
# 当前状态
x_pred[:,0] = current_state
# 滚动优化
for k in range(N):
# 状态预测
x_pred[:,k+1] = A @ x_pred[:,k] + B @ u_pred[:,k]
# 构建优化问题
cost = (x_pred[:,k+1]-reference).T @ Q @ (x_pred[:,k+1]-reference)
+ u_pred[:,k].T @ R @ u_pred[:,k]
# 求解最优控制(简化示例,实际使用QP求解器)
u_pred[:,k] = np.linalg.inv(B.T@Q@B + R) @ B.T @ Q @ (reference - A@x_pred[:,k])
return u_pred[:,0]
3. 大地坐标系下的系统集成
3.1 GPS数据接入与处理
我们通过Carsin平台接入GPS数据,主要获取以下信息:
- 经纬度坐标(WGS84坐标系)
- 海拔高度
- 速度向量
- 航向角
这些数据需要转换为大地坐标系下的位置和速度信息。转换过程主要涉及:
- 将WGS84坐标转换为ECEF(地心地固坐标系)
- 根据局部参考点转换为ENU(东-北-天)坐标系
- 计算两车相对位置和速度
matlab复制% MATLAB示例:GPS坐标转换
function [enu_pos, enu_vel] = gps2enu(lat, lon, alt, v_n, v_e)
% 参考点(通常设为路径起点)
ref_lat = 39.9042; % 北京纬度
ref_lon = 116.4074; % 北京经度
ref_alt = 50; % 海拔50米
% 转换为ENU坐标系
[enu_pos(1), enu_pos(2), enu_pos(3)] = geodetic2enu(lat, lon, alt, ...
ref_lat, ref_lon, ref_alt, wgs84Ellipsoid);
% 速度转换
enu_vel = [v_e; v_n; 0]; % 假设垂直速度为零
end
3.2 坐标系对齐与数据同步
在多传感器系统中,时间同步和坐标系对齐是关键挑战。我们的解决方案:
-
时间同步:
- 使用PTP(精确时间协议)同步各ECU时钟
- GPS提供UTC时间作为基准
- 最大时间偏差控制在10ms以内
-
坐标系对齐:
- 所有传感器数据统一转换到车辆坐标系
- 定期校准传感器安装位置和角度偏差
- 使用卡尔曼滤波处理传感器噪声
4. 典型工况仿真与测试
4.1 稳态跟随工况
这是ACC系统最基本的工况,测试系统在稳定车流中的表现。我们关注以下指标:
- 跟车距离误差(±0.5m内为优秀)
- 速度跟踪误差(±0.2m/s内为优秀)
- 乘坐舒适性(加速度变化率<1.5m/s³)
仿真结果显示,在80km/h速度下:
- 平均距离误差:0.3m
- 最大距离误差:0.8m(当前车突然减速时)
- 加速度变化平稳,无明显顿挫感
4.2 前车切入工况
模拟相邻车道车辆突然切入本车前方的情况,这是考验系统响应速度的关键场景。
测试参数:
- 切入车速度:比本车快5km/h
- 切入角度:3-5度
- 初始距离:切入后车距15m
系统表现:
- 识别延迟:约0.3秒(包括传感器处理时间)
- 制动响应时间:0.5秒内开始减速
- 稳定时间:约3秒恢复到安全跟车距离
4.3 前车切出工况
当前车变道离开时,系统需要平稳加速到设定巡航速度。
关键算法逻辑:
- 检测前车切出(基于视觉和雷达融合)
- 逐步提高目标速度到设定值
- 加速度限制在0.1g以内保证舒适性
实测加速度曲线显示:
- 加速过程平稳,无明显推背感
- 速度超调量<0.5km/h
- 达到目标速度时间约8秒(从60加速到80km/h)
5. 系统优化与实践经验
5.1 MPC参数调优技巧
经过大量测试,我们总结了以下MPC参数设置经验:
-
预测时域选择:
- 城市工况:建议N=8(0.8秒)
- 高速工况:建议N=10-12(1-1.2秒)
-
权重矩阵配置:
python复制# 城市跟车(强调距离控制) Q = np.diag([1.0, 0.5]) # 距离误差权重1.0,速度误差权重0.5 R = np.array([[0.1]]) # 控制量权重 # 高速巡航(强调速度跟踪) Q = np.diag([0.7, 1.0]) # 距离误差权重0.7,速度误差权重1.0 R = np.array([[0.05]]) # 控制量权重 -
约束条件设置:
- 最大加速度:0.15g(1.47m/s²)
- 最大减速度:-0.3g(-2.94m/s²)
- 加速度变化率:±1.0m/s³
5.2 实际部署中的挑战
在实车测试中,我们遇到了几个关键问题及解决方案:
-
传感器噪声处理:
- 问题:雷达在雨天误报率高
- 方案:增加基于历史数据的可信度评估
- 实现:当连续3帧检测到同一目标才确认为有效
-
通信延迟补偿:
c复制// 示例:预测补偿算法 float compensate_delay(float current_value, float rate, float delay) { return current_value + rate * delay; } -
极端工况处理:
- 前车急刹(减速度>0.5g)时,触发AEB系统接管
- GPS信号丢失时,切换至基于IMU的航位推算
- 系统每隔100ms进行自检,发现异常立即报警
5.3 性能优化技巧
-
代码级优化:
- 使用Eigen库替代原生矩阵运算(速度提升3-5倍)
- 预分配内存避免实时分配
- 使用定点数运算替代浮点数(在低端ECU上)
-
算法级优化:
- 热启动QP求解器(利用上一周期解作为初始值)
- 简化车辆模型(高速工况可使用单质量模型)
- 异步更新策略(非关键参数可降低更新频率)
-
系统级优化:
- 关键路径单独分配CPU核心
- 总线通信采用时间触发机制
- 设置多级看门狗确保系统可靠性
6. 扩展功能实现
6.1 自动超车功能设计
在基础ACC上增加规划层,实现自动超车的技术路线:
-
超车决策逻辑:
python复制def overtaking_decision(ego_car, front_car, left_lane): # 超车触发条件 if (front_car.speed < ego_car.speed - 5 and # 前车速度慢 left_lane.is_available and # 左侧车道可用 ego_car.distance_to_front < 50): # 跟车距离近 return True return False -
轨迹规划算法:
- 采用三次样条曲线生成平滑路径
- 考虑横向加速度限制(通常<0.2g)
- 预留安全边际(侧向距离>1.5m)
-
执行控制流程:
- 确认超车条件满足
- 启动转向灯(提前3秒)
- 执行车道变更
- 加速超越
- 确认安全后返回原车道
6.2 弯道速度自适应
基于高精地图和GPS数据,实现弯道速度自动调整:
-
曲率计算:
matlab复制function speed = curve_speed_adjustment(curvature) % 根据道路曲率计算建议速度 lateral_acc_limit = 0.15 * 9.8; % 0.15g speed = sqrt(lateral_acc_limit / abs(curvature)); speed = min(speed, 120/3.6); % 不超过120km/h end -
控制策略:
- 提前100米开始减速
- 入弯保持恒定速度
- 出弯逐步加速
-
人机交互设计:
- HMI显示建议速度和实际速度
- 提供手动覆盖选项
- 系统记录驾驶员操作习惯用于个性化调整
7. 开发工具与测试方法
7.1 工具链配置
我们的开发环境采用以下工具组合:
-
建模与仿真:
- MATLAB/Simulink(算法原型开发)
- CarSim(车辆动力学仿真)
- PreScan(场景仿真)
-
代码实现:
- Python(算法验证)
- C++(量产代码)
- ROS(原型系统集成)
-
测试验证:
- CANoe(总线测试)
- LabVIEW(HIL测试)
- Jenkins(持续集成)
7.2 测试用例设计
完整的ACC测试应包含以下场景类型:
-
功能测试:
- 稳态跟随(不同速度段)
- 前车加减速(多种加速度组合)
- 切入切出(不同角度和速度差)
-
边界测试:
- 最小跟车距离(通常2秒时距)
- 最高工作速度(系统设计上限)
- 极端天气条件(雨雪天传感器性能)
-
故障注入测试:
- 传感器失效模拟
- 通信中断测试
- ECU重启恢复验证
7.3 实车测试注意事项
基于我们的项目经验,分享几个关键实践:
-
安全措施:
- 测试车明显标识
- 备用制动系统
- 紧急停止开关
- 跟车保持安全距离
-
数据记录:
- 同步记录所有传感器数据
- 标记关键事件时间点
- 保存系统状态和诊断信息
-
团队协作:
- 明确测试指挥链
- 统一通信协议(无线电频道)
- 预先演练应急流程
在实际项目中,我们发现早晨和傍晚的光照条件对视觉系统影响最大,建议在这些时段安排专门的测试项目。同时,不同路面材质(沥青、水泥)也会影响雷达的反射特性,需要在多种路面上进行测试验证。