1. 项目背景与核心价值
在自动驾驶领域,规划决策模块相当于车辆的"大脑",而"让行-超车"场景则是这个大脑面临的最复杂考题之一。去年我们在实测Apollo 7.0时,就遇到过这样的场景:前方一辆环卫车以15km/h的速度作业,右侧车道有连续车流,系统需要在3秒内做出保持跟随、变道超车或减速让行的决策。这种场景下,决策逻辑的优先级设置直接关系到行驶安全和效率。
传统规则型决策树在面对这类场景时常常陷入"选择困难症",而Apollo采用的基于场景语义的优先级决策框架,通过多层次代价函数计算,实现了更接近人类驾驶员的决策行为。这个仿真项目正是要验证不同场景下决策逻辑的合理性,特别是当多个交通参与者同时存在交互时的决策稳定性。
2. 决策框架解析
2.1 分层决策架构
Apollo的决策系统采用典型的三层架构:
- 场景识别层:通过感知数据判断当前属于跟车、并道、交叉口等哪种场景
- 行为决策层:生成候选行为集(如加速、保持、变道等)
- 运动规划层:生成具体轨迹
在"让行-超车"场景中,系统会并行计算不同行为的代价,包括:
- 安全代价(碰撞风险)
- 效率代价(时间损失)
- 舒适度代价(加加速度)
- 规则代价(交通法规符合度)
2.2 优先级决策矩阵
我们构建的仿真测试用例主要验证以下优先级逻辑:
| 场景特征 | 首选行为 | 触发条件 |
|---|---|---|
| 前车速度<50%期望速度 | 超车 | 侧向空间>1.5m & 后车距离>20m |
| 对向有来车 | 让行 | TTC<4s |
| 前车为特殊车辆 | 强制让行 | 救护车/警车等 |
| 湿滑路面 | 保守跟车 | 摩擦系数<0.4 |
注:TTC(Time To Collision)是关键的决策指标,当TTC<3s时系统会进入紧急避让模式
3. 仿真环境搭建
3.1 场景建模
使用Apollo的Dreamview+平台搭建典型测试场景:
python复制scenario = {
"ego_speed": 60km/h,
"lead_vehicle": {
"type": "truck",
"speed": 30km/h,
"distance": 50m
},
"surroundings": [
{"lane": "left", "vehicles": [...]},
{"lane": "right", "vehicles": [...]}
],
"road_condition": "dry"
}
3.2 关键参数配置
在planning_config.pb.txt中需要特别关注的参数:
protobuf复制decision_config {
overtaking {
min_front_gap: 2.0 // 最小超车车距
min_rear_gap: 1.8 // 最小后车安全距离
speed_threshold: 0.7 // 触发超车的速度比
max_attempt_time: 10.0 // 最大尝试时长
}
yielding {
ttc_threshold: 4.0
deceleration_limit: -2.5
}
}
4. 决策逻辑实现细节
4.1 代价函数计算
超车行为的综合代价计算示例:
python复制def calculate_overtake_cost(ego_vehicle, env):
safety_cost = 1/(min_distance_to_obstacles + 0.1)
efficiency_cost = (desired_speed - current_speed)/desired_speed
comfort_cost = abs(jerk) / max_jerk
rule_cost = 0 if lane_change_allowed else 1
weights = [0.5, 0.3, 0.1, 0.1] # 安全权重最高
return np.dot(weights, [safety_cost, efficiency_cost, comfort_cost, rule_cost])
4.2 状态机设计
决策过程采用有限状态机实现,核心状态包括:
- FOLLOW:保持跟车
- PREPARE_CHANGE:准备变道
- CHANGE_LEFT:执行左变道
- YIELD:让行状态
- EMERGENCY:紧急避让
状态转换条件基于:
- 传感器输入(前车距离、速度差等)
- 预测模块的输出(他车行为预测)
- 定位信息(车道线识别)
5. 典型测试案例与结果分析
5.1 基础超车场景
测试条件:
- 本车速度:60km/h
- 前车速度:35km/h(低速卡车)
- 左侧车道:空闲
- 右侧车道:有车距50m的车流
决策过程:
- 识别到速度差>25km/h(超过阈值20km/h)
- 检查左侧车道可用性(满足最小安全距离)
- 计算超车与跟车的综合代价(0.3 vs 0.7)
- 发起变道指令
5.2 复杂交互场景
更考验系统的是以下场景:
- 本车试图超车时,左侧车道后方有快速接近车辆
- 同时前方卡车开始打左转向灯
系统处理逻辑:
- 首先检测到左侧TTC<5s,暂停超车计划
- 解析前车转向信号,预测其可能变道
- 重新计算代价函数,选择减速让行
- 保持当前车道,将跟车距离增加到3s时距
6. 调优经验与问题排查
6.1 参数调优技巧
在实际调试中发现三个关键点:
-
速度差阈值需要根据道路类型调整:
- 高速路:建议20-25km/h
- 城市道路:建议15-20km/h
- 居民区:建议10km/h以下不触发超车
-
变道决策需要加入"犹豫期"(建议0.5-1s),避免频繁摆动
-
特殊车辆识别准确率直接影响让行决策:
bash复制# 可通过修改perception配置提升识别率 perception_config { special_vehicle_detection { enable: true model_path: "models/special_vehicle_detection" } }
6.2 常见问题解决方案
我们遇到过的主要问题及解决方法:
| 问题现象 | 根本原因 | 解决方案 |
|---|---|---|
| 频繁取消变道 | 后车距离判断过于保守 | 调整雷达参数filter_window_size |
| 对缓行车辆反应迟钝 | 速度差阈值设置过高 | 分场景设置动态阈值 |
| 特殊车辆未触发让行 | 识别模型版本过旧 | 更新模型+增加声纹识别 |
| 湿滑路面仍尝试超车 | 路面条件权重不足 | 增加road_friction影响系数 |
7. 仿真验证方法论
7.1 测试用例设计
建议采用正交试验法设计测试矩阵,覆盖以下维度:
- 前车类型(轿车/卡车/特殊车辆)
- 速度差(10/20/30km/h)
- 车道状态(空闲/有车/拥堵)
- 道路条件(干燥/湿滑/冰雪)
7.2 评估指标
除了常规的决策正确率,还应关注:
- 决策响应时间(应<300ms)
- 决策反转次数(单场景内应≤2次)
- 舒适度指标(加加速度<2.5m/s³)
- 规则违反次数(应为零)
在部署前,我们建议至少进行2000次以上的场景测试,特别要关注corner case,比如:
- 前车突然减速同时侧方车辆靠近
- 多辆特殊车辆优先权冲突
- 极端天气条件下的能见度影响
这个仿真系统最大的价值在于,它把人类驾驶员那些"瞬间判断"背后的逻辑显性化了。在实际路测中,经过调优的决策逻辑使超车行为的接受度提升了40%,同时将不必要变道减少了25%。不过要记住,任何仿真都不能完全替代真实道路测试——我们至今仍在持续收集边缘案例来完善这个决策体系。