共计 1613 个字符,预计需要花费 5 分钟才能阅读完成。
Apollo 自动驾驶红绿灯右转场景实战指南
背景与痛点
在城市道路中,红绿灯右转场景是自动驾驶系统面临的一个典型复杂场景。这种场景的特殊性主要体现在以下几个方面:

- 不同地区交通规则差异:有些地区允许红灯右转但需完全停车观察,有些则完全禁止
- 行人避让要求:右转时需特别关注人行横道上的行人
- 复杂视野遮挡:大型车辆可能遮挡信号灯视线
传统规则引擎在这种场景下存在明显局限性:
- 难以处理规则冲突(如允许红灯右转但检测到行人)
- 缺乏对实时环境的适应性
- 无法有效处理传感器噪声和不确定性
技术实现
1. 感知模块的信号灯识别
Apollo 使用多传感器融合来识别交通信号灯状态:
- 摄像头检测信号灯位置和颜色
- LiDAR 辅助定位信号灯三维位置
- 时间序列滤波消除瞬时误检测
# 信号灯状态判断示例
class TrafficLightDetector:
def __init__(self):
self.last_states = []
def update_state(self, current_state):
"""使用时间序列滤波稳定信号灯状态"""
self.last_states.append(current_state)
if len(self.last_states) > 5:
self.last_states.pop(0)
return mode(self.last_states) # 取最近 5 帧的众数
2. 高精地图的应用
高精地图在右转场景中提供关键静态信息:
- 右转车道边界
- 停止线位置
- 人行横道位置
- 允许红灯右转的特殊标记
3. 决策模块实现
Apollo 使用有限状态机 (FSM) 处理右转场景,主要状态包括:
- APPROACHING:接近路口
- WAITING_FOR_GREEN:等待绿灯
- YIELDING:让行行人 / 车辆
- TURNING:执行右转
// 右转状态机简化示例
enum RightTurnState {
APPROACHING,
WAITING_FOR_GREEN,
YIELDING,
TURNING
};
class RightTurnFSM {
public:
void Update(const PerceptionObstacles& obstacles,
const TrafficLight& traffic_light) {switch(current_state_) {
case APPROACHING:
if(IsCloseToStopLine()) {current_state_ = traffic_light.is_green ? TURNING : WAITING_FOR_GREEN;}
break;
// 其他状态处理...
}
}
};
性能与安全
计算延迟影响
- 感知模块延迟需控制在 100ms 以内
- 决策 - 控制闭环延迟应小于 200ms
- 使用预测模块提前预判行人移动趋势
环境鲁棒性
针对不同天气条件的优化策略:
- 雨天:增强图像对比度处理
- 雾天:增加 LiDAR 权重
- 逆光:使用 HDR 摄像头
- 夜间:依赖红外补光
避坑指南
常见配置错误
- 停止线位置偏移导致过早停车
- 信号灯 ROI 区域设置不当
- 未正确设置区域特殊交通规则
参数调优建议
- 停车距离阈值:通常设置为停止线前 1 -1.5 米
- 转向速度曲线:根据转弯半径动态调整
- 行人安全距离:保持至少 1 米缓冲
- 最小起步间隔:检测到行人后至少等待 2 秒
进阶思考
- 如何处理闪烁黄灯情况?应该视为绿灯还是需要特殊处理?
- 当高精地图与感知结果冲突时(如临时施工改变车道),如何安全处理?
- 在无保护右转场景(无专用右转灯),如何平衡通过效率和安全性?
模拟验证建议
推荐使用 LGSVL 模拟器验证右转场景:
- 创建包含多种信号灯配置的测试场景
- 添加不同密度的行人流量
- 模拟各种天气条件
- 收集通过成功率、舒适度等指标
结语
红绿灯右转场景是检验自动驾驶系统成熟度的重要测试案例。通过 Apollo 框架提供的多模块协同方案,开发者可以构建出既安全又高效的右转决策系统。实际部署时,建议先从简单场景开始测试,逐步增加复杂度,并特别注意不同地区的交通规则差异。希望本文能为您的自动驾驶开发提供实用参考。
正文完
