1. Apollo自动驾驶中的减速绕行与加速超车概述
在自动驾驶系统的决策规划模块中,减速绕行和加速超车是最能体现系统智能化的典型场景。百度Apollo平台通过分层状态机架构,将复杂的驾驶行为拆解为可配置的决策任务序列。当车辆前方出现低速障碍物时(如速度低于3m/s的慢速车),系统会触发借道绕行逻辑;而当检测到前车速度持续低于本车期望速度且满足超车条件时,则会启动加速超车流程。
这两个功能看似简单,实则涉及感知预测、决策规划、控制执行的完整闭环。以绕行为例,系统需要综合判断:
- 前车速度是否低于静态障碍物阈值(默认0.5m/s,可配置)
- 相邻车道是否有足够的安全空间(考虑车道宽度和障碍物横向缓冲)
- 绕行路径是否符合交通规则(如虚线允许变道)
- 执行过程中的动态风险评估(RSS安全模型)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 减速绕行的实现机制
2.1 静态障碍物判定逻辑
Apollo通过static_obstacle_speed_threshold参数(默认0.5m/s)界定静态障碍物。当检测到前车速度低于此阈值时,规划模块会将其归类为需要绕行的静态障碍物。在实际道路场景中,这个阈值通常需要调高到3m/s左右,以应对城市道路中的慢速车流。
关键判定代码位于IsWithinPathDeciderScopeObstacle函数:
cpp复制bool IsWithinPathDeciderScopeObstacle(const Obstacle& obstacle) {
if (obstacle.IsVirtual()) return false; // 排除虚拟障碍物
if (obstacle.IsIgnore()) return false; // 排除标记忽略的障碍物
return obstacle.speed() <= FLAGS_static_obstacle_speed_threshold;
}
2.2 绕行路径规划流程
当确定需要绕行后,系统会启动包含以下任务的决策链:
- LANE_CHANGE_DECIDER:评估是否允许变道
- PATH_BOUNDS_DECIDER:计算路径边界
- PIECEWISE_JERK_PATH_OPTIMIZER:生成平滑路径
- SPEED_DECIDER:确定绕行速度曲线
其中关键参数obstacle_lat_buffer(默认0.4米)控制绕行时与障碍物的横向安全距离。在狭窄路段,建议增大该值至1.5米以上:
bash复制# planning.conf修改示例
--static_obstacle_speed_threshold=3.0
--obstacle_lat_buffer=1.5
2.3 绕行失败处理策略
当出现以下情况时,系统会回退到跟车模式:
- 相邻车道有对向车流(通过
LaneBorrowDecider判断) - 路径优化失败(QP问题无解)
- 动态障碍物突然切入(RSS模型预警)
此时车辆会启动FOLLOW决策,保持安全跟车距离:
python复制# 跟车距离计算公式
safe_distance = max(
ego_speed * reaction_time + 0.5 * deceleration * reaction_time**2,
min_follow_distance
)
3. 加速超车的实现原理
3.1 超车条件检测
超车决策基于多维条件判断:
- 速度差检测:前车速度持续5秒低于本车期望速度的80%
- 车道合法性:当前车道线为虚线(通过HDMAP获取)
- 邻道空间评估:相邻车道前后50米无冲突障碍物
- 超车时间窗:预计超车时间小于最大允许值(通常8秒)
protobuf复制// 超车决策配置示例
overtaking_config {
min_speed_difference: 2.0 // 最小速度差(m/s)
min_overtaking_time: 3.0 // 最小超车时间(s)
max_overtaking_time: 8.0
lateral_clearance: 1.2 // 横向净空(m)
}
3.2 超车轨迹生成
超车轨迹采用分段加加速度优化(Piecewise Jerk Speed Optimizer),核心步骤包括:
- 在ST图中规划安全超车走廊
- 使用QP优化生成速度剖面
- 考虑纵向和横向的舒适性约束
python复制# 超车轨迹优化目标函数
cost = w1 * jerk + w2 * time + w3 * deviation
subject to:
s(t) >= safe_distance(leading_vehicle)
v(t) <= speed_limit
a(t) ∈ [a_min, a_max]
3.3 超车过程中的风险控制
Apollo采用RSS(Responsibility-Sensitive Safety)模型进行实时风险评估:
- 纵向安全:保持最小安全距离
d_min = v_ego * ρ + 0.5 * a_max * ρ^2 + (v_ego^2 - v_lead^2)/(2 * b_min) - 横向安全:确保最小侧向间隔
lat_gap > 0.5m + 0.1v - 应急策略:当风险系数超过阈值时,立即中止超车
4. 工程实践中的关键调优点
4.1 参数配置经验
在真实道路测试中,我们发现以下参数对性能影响显著:
| 参数名 | 默认值 | 推荐范围 | 影响维度 |
|---|---|---|---|
| static_obstacle_speed_threshold | 0.5m/s | 2.0-3.5m/s | 绕行触发灵敏度 |
| obstacle_lat_buffer | 0.4m | 1.0-2.0m | 绕行安全裕度 |
| min_overtaking_time | 3.0s | 4.0-6.0s | 超车动作保守性 |
| lateral_clearance | 0.8m | 1.2-1.5m | 超车横向安全距离 |
4.2 典型问题排查指南
问题1:频繁误触发绕行
- 检查感知模块的速度估计精度
- 验证
static_obstacle_speed_threshold是否匹配场景 - 确认障碍物分类是否正确(特别是摩托车/自行车)
问题2:超车动作不流畅
- 检查QP优化器的权重配置(jerk权重建议0.8-1.2)
- 验证ST图中的动态障碍物预测轨迹
- 调整速度规划的时间分辨率(建议0.1s)
4.3 特殊场景处理
施工区域绕行:
- 通过V2X或视觉识别施工标志
- 提前200米启动路径重规划
- 采用更保守的横向缓冲(建议≥2.0m)
雨天环境适应:
bash复制# 雨天参数调整示例
--static_obstacle_speed_threshold=2.5 # 降低阈值
--obstacle_lat_buffer=1.8 # 增大缓冲
--deceleration_limit=2.0 # 降低制动加速度
5. 系统架构设计解析
5.1 决策状态机设计
Apollo采用双层状态机架构:
code复制Top-Level FSM
├── LaneFollow
├── ChangeLane
└── OverTake
├── Prepare
├── Accelerate
└── Return
每个状态对应不同的任务组合,例如超车状态包含:
protobuf复制stage_type: OVERTAKE_STAGE
task_type: PATH_LANE_BORROW_DECIDER
task_type: SPEED_DECIDER
task_type: RSS_DECIDER
5.2 与感知预测的协同
决策模块通过以下接口获取环境信息:
- 障碍物属性:速度、加速度、预测轨迹
- 车道拓扑:车道线类型、连接关系
- 交通规则:限速、禁止超车区
cpp复制// 典型数据订阅
planning_->Subscribe<PredictionObstacles>(
"/prediction", &Planning::OnPrediction);
planning_->Subscribe<HDMap>(
"/map", &Planning::OnHDMap);
5.3 实时性能优化
为满足100ms决策周期要求,采用以下优化手段:
- 路径规划使用预计算的参考线
- 速度规划采用线性QP近似
- 并行执行不耦合的任务
- 热点函数SIMD指令优化
assembly复制// 典型热点函数(边界计算)的SIMD优化
vmovdqa ymm0, [rdi] ; 加载障碍物位置
vpminsd ymm1, ymm0, [rsi] ; 计算最小边界
