当前位置: 首页 > news >正文

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)。
  • 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)入手,逐步理解代码结构。
http://www.dtcms.com/a/267505.html

相关文章:

  • leetcode86.分隔链表
  • 1. 两数之和 (leetcode)
  • 【网络】Linux 内核优化实战 - net.ipv4.tcp_timestamps
  • 【Docker基础】Docker数据卷管理:docker volume prune及其参数详解
  • CSS 文字浮雕效果:巧用 text-shadow 实现 3D 立体文字
  • 一体化步进伺服电机在无人机扫地机器人中的应用案例
  • 隐马尔可夫模型:语音识别系统的时序解码引擎
  • 写传播和写策略
  • 【Linux】常用基本指令
  • 量化交易中的隐藏模式识别:基于潜在高斯混合模型的机会挖掘
  • 130.【C语言】数据结构之基数排序
  • Typora + PicGo + Gitee图床——图片自动上传详细教程
  • 手机无网离线使用FunASR识别SIM卡语音通话内容
  • Integer缓冲区
  • 大模型算法面试笔记——Bert
  • 【QT】事件(鼠标、按键、定时器、窗口)
  • Visual Studio 2022 MFC Dialog 添加Toolbar及Tips提示
  • Linux命令大全:按功能分类详解(附表格速查)
  • 故障诊断 | CNN-GRU-Attention故障诊断
  • 模块二:C++核心能力进阶(5篇)第四篇《C++对象模型:虚函数表与继承体系内存布局》
  • PJSIP 中的 TCP 传输配置指南
  • Linux内核深度解析:IPv4策略路由的核心实现与fib_rules.c源码剖析
  • 介绍Flutter
  • 06.自动化测试概念
  • 极简 Docker Compose + Nginx + Certbot 自动化 HTTPS 部署指南
  • 深度学习4(浅层神经网络)
  • Python之--基本知识
  • 马来西亚华韵海外华侨联合会宣布李子昂先生荣升名誉理事
  • HarmonyOS学习2---工程目录UIAbility
  • mysql 图形化界面工具 DataGrip 安装与配置