共计 1597 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点:为什么红绿灯右转如此复杂
红绿灯右转场景是城市自动驾驶中最具挑战性的场景之一,主要原因在于其多维度冲突点的集中出现:

- 行人穿越风险 :右转时 A 柱盲区与横向人行道的行人形成观测死角
- 对向车流干扰 :部分情况下需要跨越对向直行车道(如无专用右转灯时)
- 信号灯语义复杂 :箭头灯、满屏灯、倒计时显示的组合判断
- 道路拓扑多变 :不同国家的右转规则差异(如中国允许红灯右转但需让行)
传统基于规则的算法在此场景下容易产生以下问题:
- 过度保守导致通行效率低下
- 对突发闯入物体反应不足
- 信号灯误识别引发危险行为
技术方案:Apollo 的三大核心模块
感知模块优化
Apollo 采用多传感器融合方案解决红绿灯识别问题:
- 视觉为主 :基于 YOLOv5 改进的交通灯检测网络(TLD-Net)
- 增加时序上下文模块处理闪烁问题
- 采用注意力机制消除阳光反射干扰
- LIDAR 辅助 :点云聚类排除非灯类发光体
- V2X 冗余 :通过 RSU 获取信号灯相位信息
动态物体检测关键参数:
# 行人检测参数配置示例(Python)pedestrian_config = {
"min_confidence": 0.85, # 高于常规物体检测阈值
"tracking_age": 5, # 要求连续 5 帧稳定检测
"prediction_horizon": 2.0 # 预测 2 秒内的运动轨迹
}
决策规划模块
采用分层有限状态机(HFSM)设计,核心状态包括:
- APPROACHING:接近路口时提前 200 米启动场景识别
- WAIT_FOR_GAP:检测可穿越间隙的综合判断条件:
- 对向车速度 < 5m/ s 且距离 > 15m
- 行人运动方向背离车道
- CREEPING:以 0.3m/ s 低速试探前进
- TURNING:生成满足舒适度的曲率连续路径
状态转换代码片段(C++):
// 状态转移条件判断示例
bool CanEnterTurningState(const ScenarioContext& context) {
return context.traffic_light == GREEN_ARROW ||
(context.traffic_light == RED &&
context.oncoming_vehicles.empty() &&
context.pedestrians.empty());
}
控制模块
采用 MPC(模型预测控制)实现平滑转向:
- 代价函数设计 :
- 横向误差权重:0.6
- 航向角误差权重:0.3
- 加速度变化率权重:0.1
- 特殊处理 :
- 右转时内侧轮速差补偿
- 方向盘转角速率限制(<90°/s)
性能优化实战
实测中发现三个关键性能瓶颈及解决方案:
- 红绿灯识别延迟 :
- 问题:视觉处理耗时 >150ms
-
优化:采用 GPU 加速的 INT8 量化模型
-
规划计算抖动 :
- 问题:频繁重规划导致控制指令不连续
-
优化:增加 0.2 秒的决策保持窗口
-
控制指令震荡 :
- 问题:MPC 求解器数值不稳定
- 优化:添加 QP 问题的正则化项
开发者避坑指南
- 信号灯状态管理
- 错误做法:直接使用单帧检测结果
-
正确方案:建立灯态时序验证机(至少 3 帧一致)
-
行人意图预测
- 错误做法:仅依赖当前位置判断
-
正确方案:结合头部朝向和步态分析
-
控制参数调优
- 错误做法:固定转向速率参数
-
正确方案:根据转弯半径动态调整(半径 <5m 时降速 30%)
-
异常处理
- 错误做法:依赖单一传感器
-
正确方案:设置多级降级策略(如 V2X 失效时切换纯视觉)
-
测试验证
- 错误做法:仅用仿真测试
- 正确方案:构建典型 corner case 场景库(如闯红灯行人)
扩展思考
本方案的核心方法论可迁移到以下场景:
- 无保护左转
- 环岛进入决策
- 匝道合流
建议开发者重点关注两个方向:
- 预测模块增强 :引入行人手机使用检测等新特征
- 协同感知 :利用车联网实现群体决策
实际部署时需要特别注意本地化适配,例如:
- 北美地区需处理 stop sign 后的右转规则
- 日本需考虑行人优先程度更高的路权划分
通过持续的场景数据闭环(Data Flywheel),可以不断提升该场景的通过率和舒适度。建议每周回放 bad case 并更新模型参数,逐步覆盖更多长尾场景。
正文完
