Apollo自动驾驶系统中Planning(路径规划)模块的架构设计和核心逻辑

发布于:2025-07-08 ⋅ 阅读:(59) ⋅ 点赞:(0)

1. Apollo的Planning模块是什么?

Planning模块是自动驾驶系统的核心部分之一,负责根据当前车辆状态(位置、速度、周围环境等)生成一条安全、合法的行驶路径。简单来说,它决定了车辆“应该往哪里开”。


2. 核心结构:Scenario-Stage-Task

Apollo的Planning模块采用三层结构来处理不同的驾驶场景,分别是:

  • Scenario(场景)

    • 定义车辆当前所处的驾驶情境,例如:
      • Lane Follow(车道保持):车辆在正常道路上行驶。
      • Intersection(路口):车辆在无保护路口或有红绿灯的路口。
      • Pull Over(靠边停车):车辆需要靠边停车。
      • Emergency Stop(紧急停车):车辆遇到突发情况需要紧急停车。
    • 每个场景由配置文件定义,并通过ScenarioManager管理场景的切换。
  • Stage(阶段)

    • 每个场景下包含多个阶段(Stage),例如:
      • LaneFollowStage:车道保持阶段。
      • BareIntersectionUnprotectedStage:无保护路口阶段。
    • 阶段是场景中的具体执行步骤,每个阶段会注册并执行一系列任务(Task)。
  • Task(任务)

    • 每个阶段下包含多个任务,例如:
      • Decider(决策器):决定是否需要变道、避障等。
      • Optimizer(优化器):优化路径的平滑性、安全性。
    • 任务是具体的逻辑实现,负责生成路径或调整车辆行为。

3. 核心逻辑:状态机与配置文件

  • 状态机(Finite State Machine)

    • Apollo通过状态机动态切换场景和阶段。例如:
      • 车辆从正常行驶(LaneFollow)进入路口(Intersection)时,状态机会自动切换到路口场景。
      • 状态机的切换依赖于传感器数据(如地图信息、交通信号灯状态)和车辆状态(如速度、位置)。
  • 配置文件

    • 所有场景、阶段和任务的配置都存储在.proto文件中(例如planning_config.proto)。这些文件定义了:
      • 哪些场景可以切换到哪些场景。
      • 每个场景下包含哪些阶段。
      • 每个阶段下需要执行哪些任务。
    • 通过修改配置文件,可以灵活调整规划逻辑,而无需修改代码。

4. 示例:LaneFollow场景

以最常见的LaneFollow(车道保持)场景为例:

  1. 场景选择
    • 车辆在普通道路上行驶时,ScenarioManager会激活LaneFollowScenario
  2. 阶段执行
    • LaneFollow场景下只有一个阶段LaneFollowStage
  3. 任务执行
    • LaneFollowStage会依次执行以下任务:
      • ReferenceLineProvider:提供参考路径(车辆需要跟随的道路中心线)。
      • PathDecider:根据障碍物和地图信息,调整参考路径。
      • SpeedOptimizer:计算车辆的速度曲线(如加速、减速)。
      • TrajectoryOptimizer:综合路径和速度,生成最终的行驶轨迹。

5. 关键技术点

  • 模块化设计
    • 每个任务(Task)是独立的模块,可以单独开发和测试。例如,PathDecider只负责避障,而SpeedOptimizer只负责速度规划。
  • 可扩展性
    • 新增场景或任务时,只需在配置文件中添加定义,并实现对应的代码逻辑,无需修改现有模块。
  • 实时性
    • 所有任务通过线程池并发执行,确保在有限时间内完成规划。

6. 对小白的建议

如果你是刚接触自动驾驶或Apollo,可以从以下步骤入手:

  1. 理解基本概念
    • 先熟悉自动驾驶的基本流程(感知 → 决策 → 规划 → 控制)。
    • 了解Apollo的模块划分(如Planning、Control、Prediction等)。
  2. 学习场景切换逻辑
    • 通过ScenarioManager和状态机的示例,理解如何根据车辆状态切换不同场景。
  3. 实践配置文件
    • 修改planning_config.proto文件,观察不同配置对规划结果的影响。
  4. 阅读代码示例
    • 从简单的任务(如LaneFollowStage)入手,逐步理解代码结构。

网站公告

今日签到

点亮在社区的每一天
去签到