自动驾驶规划模块的三大场景解析从Apollo 9.0看工程实践自动驾驶系统的规划模块常被视为黑箱般神秘但当我们拆解Apollo 9.0的架构设计会发现其核心逻辑建立在清晰的场景划分基础上。不同于学术论文中的理想化模型工业级解决方案必须处理现实道路的复杂多变——这正是场景化设计的价值所在。1. 场景化设计的工程哲学现代自动驾驶系统面对的最大挑战不是算法复杂度而是场景的无限可能性。城市十字路口的突发状况、高速公路的连续变道、狭窄停车场的精准操控每种场景都需要不同的决策逻辑和运动规划策略。Apollo 9.0通过三种基础规划模式OnLane/Navi/OpenSpace实现了分而治之的工程智慧。场景划分的黄金准则结构化程度道路边界是否明确车道线清晰度动态复杂度交通参与者密度与行为可预测性空间约束可行驶区域的自由度二维平面vs三维空间速度区间低速10km/h、中速10-60km/h、高速60km/h提示优秀的场景划分应当使每个子场景内的规划问题具备同质性避免在单一规划器中处理差异过大的情况。传统单规划器架构在应对多场景时常见的问题包括参数调优顾此失彼如泊车场景需要高精度但低速高速巡航则需要长视距状态机复杂度指数增长各种特殊条件的if-else嵌套安全验证难以全覆盖不同场景的corner case差异大Apollo的解决方案是通过PlanningBase抽象类定义统一接口再由各场景规划器实现具体逻辑。这种设计既保证了系统扩展性又能针对特定场景进行深度优化。2. OnLanePlanning城市道路的博弈艺术作为处理城市道路的主力规划器OnLanePlanning面临的是典型的不完全信息动态博弈环境。其核心任务是在结构化道路上实现安全、舒适且符合交规的轨迹生成同时应对各种突发状况。2.1 参考线生成机制城市道路规划的第一步是构建高质量的参考线Reference Line这个过程远比想象中复杂// Apollo中参考线生成的简化流程 ReferenceLineProvider::GenerateReferenceLines( const RoutingResponse routing, const VehicleState state) { // 1. 从HDMap获取原始车道中心线 auto raw_reference_lines hdmap_-GetRouteSegments(routing); // 2. 平滑处理使用二次规划算法 SmoothReferenceLine(raw_reference_lines); // 3. 速度区间划分 AddSpeedProfile(raw_reference_lines); // 4. 交通规则映射 ApplyTrafficRules(raw_reference_lines); }参考线质量的影响因素指标城市道路要求高速公路要求横向误差0.1m0.3m曲率连续性三阶可导二阶可导更新频率10Hz5Hz预测视距50-100m150-300m2.2 决策-规划协同架构OnLanePlanning采用分层处理架构这是应对城市复杂场景的关键场景识别层Scenario通过有限状态机识别当前场景跟车、变道、路口等每个场景有独立的stage流程决策优化层Task路径边界生成PathBoundsDecider动态障碍物处理SpeedBoundsDecider交通规则应用TrafficRule运动规划层Planner基于Frenet框架的ST/SL规划多项式曲线拟合轨迹质量评估# 简化的决策规划流程示例 def run_cycle(scenario, obstacles): # 场景阶段处理 current_stage scenario.get_current_stage() decision current_stage.execute(obstacles) # 生成路径边界 path_bounds path_decider.run(decision) # 速度规划 speed_profile speed_decider.run(path_bounds) # 轨迹生成与优化 trajectory planner.plan(path_bounds, speed_profile) return trajectory3. NaviPlanning高速公路的效率优化高速公路场景看似简单实则对规划器的长时距预测和能耗优化提出了极高要求。NaviPlanning通过独特的轻决策重规划架构实现了在100km/h速度下的可靠表现。3.1 高速场景的特性处理与城市道路相比高速公路规划有显著差异决策简化基本规避了交叉路口、行人等复杂元素运动预测其他车辆行为更易预测基本保持车道优化目标舒适性 精准度能耗效率成为重要指标典型的高速公路规划流程长期参考线生成考虑整个route动态障碍物投影到SL坐标系ST图构建8-12秒时间窗口最优速度曲线求解轨迹后处理平滑度优化3.2 节能规划策略NaviPlanning引入了多项节能优化技术速度保持算法尽量减少不必要的加减速坡度补偿利用高精地图提前预知上下坡空气阻力建模速度与能耗的非线性关系计算// 能耗优化示例代码 double CalculateOptimalSpeed(const VehicleState state, const RoadCondition road) { // 基础能耗模型 double power k1 * state.speed() k2 * pow(state.speed(), 3); // 坡度补偿 power mass * g * sin(road.grade()); // 寻找能耗最低的巡航速度 return FindMinima(power, 80, 120); // 80-120km/h区间 }4. OpenSpacePlanning狭小空间的舞蹈家自主泊车和狭窄道路场景彻底颠覆了传统规划假设OpenSpacePlanning采用完全不同的规划范式。4.1 混合状态空间搜索开放空间规划的核心挑战是没有明确的车道约束障碍物分布不规则可能需要多段前进/后退如直角泊车Apollo的解决方案结合了多种技术混合A*算法考虑车辆运动学约束支持前进/后退切换引入Reeds-Shepp曲线凸优化后处理使用OSQP求解器进行平滑优化曲率连续性约束避免局部最小值# 开放空间规划示例 def plan_parking(start, goal, obstacles): # 混合A*搜索 coarse_path hybrid_a_star.search(start, goal) # 轨迹优化 optimized qp_optimizer.run( coarse_path, constraints[ CurvatureConstraint(max0.2), ObstacleClearance(min0.3) ]) return optimized4.2 全向运动控制与传统规划不同开放空间可能需要非对称油门/刹车控制方向盘全打满操作厘米级定位精度要求泊车场景典型参数参数值规划频率5Hz位置误差阈值0.05m最大转向角速度90°/s终点对齐精度3°5. 场景切换的平滑之道实际驾驶中场景边界往往是模糊的如高速公路出口区域。Apollo通过精心设计的切换机制确保过渡平稳。5.1 状态转移管理场景切换需要考虑轨迹拼接的连续性位置、速度、加速度规划器内部状态迁移如重置历史数据控制器的参数自适应典型切换场景处理高速公路→城市道路提前1km开始降低规划速度城市道路→开放空间触发低速精确模式异常情况回退到安全停止轨迹5.2 多规划器协作架构Apollo 9.0的创新之处在于各规划器可并行运行仲裁模块根据场景置信度选择最佳输出共享基础服务如参考线提供、障碍物预测// 简化的仲裁逻辑 Trajectory Arbiter::SelectBestTrajectory( const vectorCandidateTrajectory inputs) { // 场景置信度评估 auto scene_scores scene_evaluator_.Evaluate(inputs); // 安全检查 auto safe_trajs safety_checker_.Filter(inputs); // 选择最优 return optimizer_.Select(scene_scores, safe_trajs); }在自动驾驶系统开发中理解这些场景差异和对应的解决方案远比掌握某个具体算法更重要。当面对新的场景需求时如矿区、港口等特殊环境Apollo的这种场景化架构可以快速扩展新的规划模块而不必推翻整个系统设计。
自动驾驶规划没那么玄乎:用Apollo 9.0的三种规划模式(OnLane/Navi/OpenSpace)讲清楚场景划分
自动驾驶规划模块的三大场景解析从Apollo 9.0看工程实践自动驾驶系统的规划模块常被视为黑箱般神秘但当我们拆解Apollo 9.0的架构设计会发现其核心逻辑建立在清晰的场景划分基础上。不同于学术论文中的理想化模型工业级解决方案必须处理现实道路的复杂多变——这正是场景化设计的价值所在。1. 场景化设计的工程哲学现代自动驾驶系统面对的最大挑战不是算法复杂度而是场景的无限可能性。城市十字路口的突发状况、高速公路的连续变道、狭窄停车场的精准操控每种场景都需要不同的决策逻辑和运动规划策略。Apollo 9.0通过三种基础规划模式OnLane/Navi/OpenSpace实现了分而治之的工程智慧。场景划分的黄金准则结构化程度道路边界是否明确车道线清晰度动态复杂度交通参与者密度与行为可预测性空间约束可行驶区域的自由度二维平面vs三维空间速度区间低速10km/h、中速10-60km/h、高速60km/h提示优秀的场景划分应当使每个子场景内的规划问题具备同质性避免在单一规划器中处理差异过大的情况。传统单规划器架构在应对多场景时常见的问题包括参数调优顾此失彼如泊车场景需要高精度但低速高速巡航则需要长视距状态机复杂度指数增长各种特殊条件的if-else嵌套安全验证难以全覆盖不同场景的corner case差异大Apollo的解决方案是通过PlanningBase抽象类定义统一接口再由各场景规划器实现具体逻辑。这种设计既保证了系统扩展性又能针对特定场景进行深度优化。2. OnLanePlanning城市道路的博弈艺术作为处理城市道路的主力规划器OnLanePlanning面临的是典型的不完全信息动态博弈环境。其核心任务是在结构化道路上实现安全、舒适且符合交规的轨迹生成同时应对各种突发状况。2.1 参考线生成机制城市道路规划的第一步是构建高质量的参考线Reference Line这个过程远比想象中复杂// Apollo中参考线生成的简化流程 ReferenceLineProvider::GenerateReferenceLines( const RoutingResponse routing, const VehicleState state) { // 1. 从HDMap获取原始车道中心线 auto raw_reference_lines hdmap_-GetRouteSegments(routing); // 2. 平滑处理使用二次规划算法 SmoothReferenceLine(raw_reference_lines); // 3. 速度区间划分 AddSpeedProfile(raw_reference_lines); // 4. 交通规则映射 ApplyTrafficRules(raw_reference_lines); }参考线质量的影响因素指标城市道路要求高速公路要求横向误差0.1m0.3m曲率连续性三阶可导二阶可导更新频率10Hz5Hz预测视距50-100m150-300m2.2 决策-规划协同架构OnLanePlanning采用分层处理架构这是应对城市复杂场景的关键场景识别层Scenario通过有限状态机识别当前场景跟车、变道、路口等每个场景有独立的stage流程决策优化层Task路径边界生成PathBoundsDecider动态障碍物处理SpeedBoundsDecider交通规则应用TrafficRule运动规划层Planner基于Frenet框架的ST/SL规划多项式曲线拟合轨迹质量评估# 简化的决策规划流程示例 def run_cycle(scenario, obstacles): # 场景阶段处理 current_stage scenario.get_current_stage() decision current_stage.execute(obstacles) # 生成路径边界 path_bounds path_decider.run(decision) # 速度规划 speed_profile speed_decider.run(path_bounds) # 轨迹生成与优化 trajectory planner.plan(path_bounds, speed_profile) return trajectory3. NaviPlanning高速公路的效率优化高速公路场景看似简单实则对规划器的长时距预测和能耗优化提出了极高要求。NaviPlanning通过独特的轻决策重规划架构实现了在100km/h速度下的可靠表现。3.1 高速场景的特性处理与城市道路相比高速公路规划有显著差异决策简化基本规避了交叉路口、行人等复杂元素运动预测其他车辆行为更易预测基本保持车道优化目标舒适性 精准度能耗效率成为重要指标典型的高速公路规划流程长期参考线生成考虑整个route动态障碍物投影到SL坐标系ST图构建8-12秒时间窗口最优速度曲线求解轨迹后处理平滑度优化3.2 节能规划策略NaviPlanning引入了多项节能优化技术速度保持算法尽量减少不必要的加减速坡度补偿利用高精地图提前预知上下坡空气阻力建模速度与能耗的非线性关系计算// 能耗优化示例代码 double CalculateOptimalSpeed(const VehicleState state, const RoadCondition road) { // 基础能耗模型 double power k1 * state.speed() k2 * pow(state.speed(), 3); // 坡度补偿 power mass * g * sin(road.grade()); // 寻找能耗最低的巡航速度 return FindMinima(power, 80, 120); // 80-120km/h区间 }4. OpenSpacePlanning狭小空间的舞蹈家自主泊车和狭窄道路场景彻底颠覆了传统规划假设OpenSpacePlanning采用完全不同的规划范式。4.1 混合状态空间搜索开放空间规划的核心挑战是没有明确的车道约束障碍物分布不规则可能需要多段前进/后退如直角泊车Apollo的解决方案结合了多种技术混合A*算法考虑车辆运动学约束支持前进/后退切换引入Reeds-Shepp曲线凸优化后处理使用OSQP求解器进行平滑优化曲率连续性约束避免局部最小值# 开放空间规划示例 def plan_parking(start, goal, obstacles): # 混合A*搜索 coarse_path hybrid_a_star.search(start, goal) # 轨迹优化 optimized qp_optimizer.run( coarse_path, constraints[ CurvatureConstraint(max0.2), ObstacleClearance(min0.3) ]) return optimized4.2 全向运动控制与传统规划不同开放空间可能需要非对称油门/刹车控制方向盘全打满操作厘米级定位精度要求泊车场景典型参数参数值规划频率5Hz位置误差阈值0.05m最大转向角速度90°/s终点对齐精度3°5. 场景切换的平滑之道实际驾驶中场景边界往往是模糊的如高速公路出口区域。Apollo通过精心设计的切换机制确保过渡平稳。5.1 状态转移管理场景切换需要考虑轨迹拼接的连续性位置、速度、加速度规划器内部状态迁移如重置历史数据控制器的参数自适应典型切换场景处理高速公路→城市道路提前1km开始降低规划速度城市道路→开放空间触发低速精确模式异常情况回退到安全停止轨迹5.2 多规划器协作架构Apollo 9.0的创新之处在于各规划器可并行运行仲裁模块根据场景置信度选择最佳输出共享基础服务如参考线提供、障碍物预测// 简化的仲裁逻辑 Trajectory Arbiter::SelectBestTrajectory( const vectorCandidateTrajectory inputs) { // 场景置信度评估 auto scene_scores scene_evaluator_.Evaluate(inputs); // 安全检查 auto safe_trajs safety_checker_.Filter(inputs); // 选择最优 return optimizer_.Select(scene_scores, safe_trajs); }在自动驾驶系统开发中理解这些场景差异和对应的解决方案远比掌握某个具体算法更重要。当面对新的场景需求时如矿区、港口等特殊环境Apollo的这种场景化架构可以快速扩展新的规划模块而不必推翻整个系统设计。