在城区道路遇到突然窜出的行人,或是高速公路上前车急刹时,人类驾驶员的平均反应时间约为1.5秒。而现代AES(Automatic Emergency Steering)系统能在300毫秒内完成障碍识别、路径规划和转向控制的全过程,相当于人类眨眼速度的1/3。这套系统本质上是在为车辆构建一套基于多传感器融合的"条件反射"神经体系。
核心工作原理可以分解为三个层次:
关键提示:AES系统与AEB(自动紧急制动)形成互补关系,当横向空间充足时优先采用转向避障,可避免因紧急制动导致的追尾风险。
安全距离模型是触发转向决策的核心算法,其计算需要考虑自车速度、目标速度、路面附着系数等多重因素。我们采用的动态TTC算法如下:
matlab复制function safe_distance = calcSafeDist(ego_speed, obstacle_speed, mu)
% 输入参数:
% ego_speed - 自车速度(m/s)
% obstacle_speed - 障碍物速度(m/s)
% mu - 路面摩擦系数
TTC_base = 2.5; % 基础碰撞时间阈值(s)
if mu < 0.3
TTC_threshold = TTC_base * (1 + 0.5*(0.3 - mu)); % 低附着力补偿
else
TTC_threshold = TTC_base;
end
relative_speed = ego_speed - obstacle_speed;
safe_distance = max(ego_speed*TTC_threshold, 3) + 0.5*relative_speed^2/(4*mu);
end
这个算法的工程智慧体现在:
ego_speed*TTC_threshold 保证最低反应时间AES系统采用五状态机实现安全决策:
| 状态 | 触发条件 | 系统响应 |
|---|---|---|
| 监控 | TTC > 4s | 持续监测 |
| 预警 | 3s < TTC ≤ 4s | 触觉警示 |
| 准备 | 2s < TTC ≤ 3s | 预加压转向系统 |
| 激活 | 1s < TTC ≤ 2s | 介入转向控制 |
| 紧急 | TTC ≤ 1s | 全力避障+制动 |
实际调试中发现,状态切换需要添加50ms的迟滞区间,避免在阈值附近频繁跳变导致系统震荡。
在确定需要转向避障后,系统需要在100-200ms内生成符合车辆动力学约束的平滑轨迹。五次多项式因其良好的平滑特性成为首选方案:
cpp复制class QuinticPoly {
public:
void calcCoeff(double start[3], double end[3], double T) {
// 初始条件约束
a0 = start[0]; // 初始位置
a1 = start[1]; // 初始速度
a2 = start[2]/2.0; // 初始加速度
// 构建矩阵方程 Ax=B
Eigen::Matrix3d A;
A << pow(T,3), pow(T,4), pow(T,5),
3*pow(T,2), 4*pow(T,3), 5*pow(T,4),
6*T, 12*pow(T,2), 20*pow(T,3);
Eigen::Vector3d B(
end[0]-a0-a1*T-a2*T*T, // 位置差
end[1]-a1-2*a2*T, // 速度差
end[2]-2*a2 // 加速度差
);
// QR分解求解
Eigen::Vector3d x = A.colPivHouseholderQr().solve(B);
a3 = x(0); a4 = x(1); a5 = x(2);
// 五次项限幅
if(fabs(a5) > 0.8) {
a5 = (a5 > 0) ? 0.8 : -0.8;
// 重新计算a3,a4保持端点约束
}
}
private:
double a0, a1, a2, a3, a4, a5;
};
实际应用中有几个关键经验:
对于不规则障碍物,需要构建安全走廊(Safe Corridor)。我们采用基于RRT*的改进算法:
实测表明,这种方法在80km/h下对突然出现的0.5m高障碍物(模拟儿童)的避障成功率达99.2%。
传统纯跟踪(Pure Pursuit)算法简单高效,但在高速场景存在明显缺陷:
python复制def pure_pursuit_control(current_pose, path, L):
# 寻找最近点
nearest_idx = find_nearest_point(current_pose, path)
# 计算前视距离(速度自适应)
lookahead_dist = max(3.0, 0.3 * current_pose.v)
# 寻找目标点
target_idx = nearest_idx
while target_idx < len(path)-1:
dist = distance(current_pose, path[target_idx])
if dist >= lookahead_dist:
break
target_idx += 1
# 计算曲率
alpha = atan2(path[target_idx].y - current_pose.y,
path[target_idx].x - current_pose.x) - current_pose.yaw
delta = atan2(2.0 * L * sin(alpha), lookahead_dist)
return delta
主要改进点:
MPC(Model Predictive Control)在复杂场景下表现更优,核心是代价函数设计:
python复制def mpc_cost(z, *args):
x = z[:N] # 预测状态x
y = z[N:2*N] # 预测状态y
delta = z[2*N:3*N] # 转向角序列
ref_path = args[0] # 参考路径
cost = 0
for t in range(N):
# 路径跟踪误差
cost += 10*(x[t] - ref_path[t].x)**2
cost += 10*(y[t] - ref_path[t].y)**2
# 控制量惩罚
cost += 5*delta[t]**2
# 控制变化率惩罚
if t > 0:
cost += 80*(delta[t]-delta[t-1])**2
# 舒适度约束
if t > 1:
cost += 120*((delta[t]-delta[t-1])-(delta[t-1]-delta[t-2]))**2
# 终端状态约束
cost += 50*(x[-1] - ref_path[-1].x)**2
cost += 50*(y[-1] - ref_path[-1].y)**2
return cost
权重系数设置经验:
实测数据对比:
| 指标 | 纯跟踪算法 | MPC算法 | 提升幅度 |
|---|---|---|---|
| 横向误差RMS | 0.32m | 0.18m | 43.8% |
| 方向盘抖动 | 2.1deg/s | 0.8deg/s | 61.9% |
| 计算耗时 | 8ms | 35ms | -337.5% |
在搭建联合仿真环境时,有几个关键接口需要注意:
车辆动力学参数同步:
执行器延迟建模:
simulink复制EPS_delay = 0.05 + 0.002*abs(SteeringAngle); % 转向角越大延迟越大
传感器噪声注入:
在低附着力路面发现转向过度问题时,需要调整多个参数:
轮胎松弛长度补偿:
matlab复制if mu < 0.3
relaxation_len = 0.5 + 1.2*(0.6 - mu);
else
relaxation_len = 0.5;
end
MPC预测模型调整:
转向角速度限制:
c复制#define MAX_STEER_RATE (mu > 0.3 ? 500 : 300) // deg/s
经过200+次HIL测试和50+次实车验证,系统在以下场景表现:
| 测试场景 | 速度范围 | 成功率 | 最大横向加速度 |
|---|---|---|---|
| 静止障碍物 | 30-80km/h | 100% | 0.28g |
| 横穿行人(0.5m高) | 30-60km/h | 98.7% | 0.25g |
| 前车急刹 | 50-100km/h | 99.5% | 0.30g |
未来优化方向: