Apollo自动驾驶红绿灯右转场景的决策规划算法优化实践

1次阅读
没有评论

共计 1834 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景痛点分析

红绿灯右转场景是城市自动驾驶中最具挑战性的场景之一,主要原因在于其复杂的动态交互环境。根据我们在北京、上海等城市的实际路测数据统计,右转场景的事故风险是普通直行的 4.7 倍。具体难点体现在以下几个方面:

Apollo 自动驾驶红绿灯右转场景的决策规划算法优化实践

  • 行人穿越风险 :中国式过马路现象导致行人可能在任何时间点突然出现,特别是在绿灯最后几秒
  • 对向直行车辆冲突 :部分路口允许对向直行车辆与右转车辆同时通行
  • 交通灯相位复杂性 :有些路口设有专用右转箭头灯,有些则完全依赖主信号灯
  • 视野遮挡问题 :大型车辆如公交车经常造成视线遮挡

现有基于规则的决策方案主要存在两个不足:

  1. 过度保守策略导致通行效率低下(平均等待时间达 38 秒)
  2. 突发状况应对能力弱(遇到违规行人时急刹率达 27%)

技术方案设计

分层决策架构

我们采用行为决策层 + 运动规划层的双层架构:

  • 行为决策层 (100ms 周期)
  • 输入:感知数据 + 预测结果 +HDMap
  • 输出:离散行为指令(停止 / 缓行 / 正常通过)
  • 运动规划层 (50ms 周期)
  • 输入:行为指令 + 车辆状态
  • 输出:平滑的轨迹序列

LSTM 意图预测模块

针对行人和其他交通参与者的行为预测,我们设计了多模态 LSTM 网络:

class IntentPredictor(nn.Module):
    def __init__(self):
        super().__init__()
        self.lstm = nn.LSTM(
            input_size=12,  # 位置 + 速度 + 加速度 + 航向
            hidden_size=64,
            num_layers=2
        )
        self.mlp = nn.Sequential(nn.Linear(64, 32),
            nn.ReLU(),
            nn.Linear(32, 5)  # 停止 / 行走 / 奔跑 / 犹豫 / 异常
        )

    def forward(self, x):
        # x: [seq_len, batch, features]
        out, _ = self.lstm(x)
        return self.mlp(out[-1])  # 只取最后时刻输出 

PPO 策略训练

使用 PPO 算法训练右转策略,关键设计点包括:

  • 状态空间 (37 维):
  • 自车状态(速度、位置、航向角等)
  • 最近 3 个行人 / 车辆的状态
  • 交通灯状态和剩余时间
  • 路口拓扑特征

  • 奖励函数

    def calc_reward(prev_state, action):
        safety = -10 if collision else 0
        efficiency = 0.1 * progress
        comfort = -0.01 * abs(jerk)
        return safety + efficiency + comfort

代码实现关键点

状态编码器实现

def encode_state(ego, obstacles, traffic_light):
    # 使用 Frenet 坐标系处理道路相对位置
    ego_frenet = map.to_frenet(ego.pos)

    # 构建障碍物特征向量
    obs_feats = []
    for obj in nearest_objects(obstacles, 3):
        rel_pos = obj.pos - ego.pos
        obs_feats.extend([rel_pos.norm(),  # 相对距离
            obj.velocity,
            calc_ttc(ego, obj)  # 碰撞时间估算
        ])

    # 拼接所有特征
    return np.concatenate([
        ego_frenet,
        ego.velocity,
        *obs_feats,
        [traffic_light.time_left]
    ])

仿真验证

在 CARLA 0.9.13 中构建了包含 100 个右转场景的测试集,主要指标对比如下:

指标 规则方案 强化学习方案 提升幅度
通过率 82% 96% +14%
平均耗时 (s) 28.7 19.2 -33%
急刹次数 / 百公里 15.3 4.1 -73%

测试场景覆盖了以下典型情况:

  1. 行人突然从视觉盲区冲出
  2. 对向直行车辆抢黄灯
  3. 右转箭头灯与主信号灯相位差

避坑指南

在实际部署中我们遇到了几个典型问题:

  • 感知延迟补偿
  • 问题:感知模块 200ms 延迟导致决策滞后
  • 方案:在状态输入层增加运动学外推补偿

  • 极端天气处理

  • 问题:大雨导致传感器噪声增大
  • 方案:在奖励函数中增加不确定性惩罚项

  • 长尾场景应对

  • 问题:遇到罕见交通指挥手势
  • 方案:建立人工干预记录回放机制

开放性问题

在实际应用中,我们仍然面临一些值得探讨的问题:

  1. 如何量化平衡通行效率与安全保守策略?是否应该引入动态调整参数?
  2. 当遇到完全未知的新场景时,除了紧急制动,是否有更优雅的降级策略?
  3. 在 V2X 尚未普及的阶段,如何更好地利用视觉信号(如交警手势、其他车辆转向灯)?

期待与各位同行交流实践心得,共同推进自动驾驶决策系统的发展。

正文完
 0
评论(没有评论)