Apollo自动驾驶系统中Planning(路径规划)模块的架构设计和核心逻辑
1. Apollo的Planning模块是什么?
Planning模块是自动驾驶系统的核心部分之一,负责根据当前车辆状态(位置、速度、周围环境等)生成一条安全、合法的行驶路径。简单来说,它决定了车辆“应该往哪里开”。
2. 核心结构:Scenario-Stage-Task
Apollo的Planning模块采用三层结构来处理不同的驾驶场景,分别是:
-
Scenario(场景)
- 定义车辆当前所处的驾驶情境,例如:
- Lane Follow(车道保持):车辆在正常道路上行驶。
- Intersection(路口):车辆在无保护路口或有红绿灯的路口。
- Pull Over(靠边停车):车辆需要靠边停车。
- Emergency Stop(紧急停车):车辆遇到突发情况需要紧急停车。
- 每个场景由配置文件定义,并通过
ScenarioManager
管理场景的切换。
- 定义车辆当前所处的驾驶情境,例如:
-
Stage(阶段)
- 每个场景下包含多个阶段(Stage),例如:
- LaneFollowStage:车道保持阶段。
- BareIntersectionUnprotectedStage:无保护路口阶段。
- 阶段是场景中的具体执行步骤,每个阶段会注册并执行一系列任务(Task)。
- 每个场景下包含多个阶段(Stage),例如:
-
Task(任务)
- 每个阶段下包含多个任务,例如:
- Decider(决策器):决定是否需要变道、避障等。
- Optimizer(优化器):优化路径的平滑性、安全性。
- 任务是具体的逻辑实现,负责生成路径或调整车辆行为。
- 每个阶段下包含多个任务,例如:
3. 核心逻辑:状态机与配置文件
-
状态机(Finite State Machine)
- Apollo通过状态机动态切换场景和阶段。例如:
- 车辆从正常行驶(LaneFollow)进入路口(Intersection)时,状态机会自动切换到路口场景。
- 状态机的切换依赖于传感器数据(如地图信息、交通信号灯状态)和车辆状态(如速度、位置)。
- Apollo通过状态机动态切换场景和阶段。例如:
-
配置文件
- 所有场景、阶段和任务的配置都存储在
.proto
文件中(例如planning_config.proto
)。这些文件定义了:- 哪些场景可以切换到哪些场景。
- 每个场景下包含哪些阶段。
- 每个阶段下需要执行哪些任务。
- 通过修改配置文件,可以灵活调整规划逻辑,而无需修改代码。
- 所有场景、阶段和任务的配置都存储在
4. 示例:LaneFollow场景
以最常见的LaneFollow(车道保持)场景为例:
- 场景选择
- 车辆在普通道路上行驶时,
ScenarioManager
会激活LaneFollowScenario
。
- 车辆在普通道路上行驶时,
- 阶段执行
- LaneFollow场景下只有一个阶段
LaneFollowStage
。
- LaneFollow场景下只有一个阶段
- 任务执行
- LaneFollowStage会依次执行以下任务:
- ReferenceLineProvider:提供参考路径(车辆需要跟随的道路中心线)。
- PathDecider:根据障碍物和地图信息,调整参考路径。
- SpeedOptimizer:计算车辆的速度曲线(如加速、减速)。
- TrajectoryOptimizer:综合路径和速度,生成最终的行驶轨迹。
- LaneFollowStage会依次执行以下任务:
5. 关键技术点
- 模块化设计
- 每个任务(Task)是独立的模块,可以单独开发和测试。例如,PathDecider只负责避障,而SpeedOptimizer只负责速度规划。
- 可扩展性
- 新增场景或任务时,只需在配置文件中添加定义,并实现对应的代码逻辑,无需修改现有模块。
- 实时性
- 所有任务通过线程池并发执行,确保在有限时间内完成规划。
6. 对小白的建议
如果你是刚接触自动驾驶或Apollo,可以从以下步骤入手:
- 理解基本概念
- 先熟悉自动驾驶的基本流程(感知 → 决策 → 规划 → 控制)。
- 了解Apollo的模块划分(如Planning、Control、Prediction等)。
- 学习场景切换逻辑
- 通过
ScenarioManager
和状态机的示例,理解如何根据车辆状态切换不同场景。
- 通过
- 实践配置文件
- 修改
planning_config.proto
文件,观察不同配置对规划结果的影响。
- 修改
- 阅读代码示例
- 从简单的任务(如
LaneFollowStage
)入手,逐步理解代码结构。
- 从简单的任务(如