# Apollo开发者社区 #
《Robbie带你入门自动驾驶》免费课程→传送门
自动驾驶感知技术是自动驾驶系统中的重要组成部分,它负责从环境中获取信息,为车辆的决策和控制提供关键的数据支持。自动驾驶“感知”系列,将基于百度Apollo自动驾驶平台,介绍自动驾驶感知的原理、技术以及在实践中的应用,旨在帮助读者深入了解自动驾驶感知领域的发展现状和未来趋势。
Apollo自动驾驶平台是一个开源的、完整的、安全的自动驾驶解决方案,旨在帮助汽车行业及自动驾驶领域的合作伙伴快速搭建一套属于自己的自动驾驶系统。在Apollo平台中,Planning模块负责根据感知和定位模块提供的输入数据,为自动驾驶车辆生成合适的行驶轨迹。
1. Planning模块概述
Planning模块主要负责根据车辆当前位置、目标位置和地图信息,生成一条可行的路径。其核心功能包括路径规划、速度规划和轨迹生成。Planning模块通过接收其他模块的消息,如地图数据、车辆状态、障碍物信息等,来实现实时的路径规划和控制。
2. 目录结构与关键文件
Planning模块的目录结构如下:
modules/planning/
├── planning_base
├── common // 公共算法库
├── conf // 公共(全局)参数配置文件
├── constraint_checker // lattice算法使用的碰撞检查算法
├── dag // 模块启动文件(mainboard)
├── data // 模型文件
├── images // 图片
├── integration_tests // 集成单元测试
├── lattice // lattice算法库
├── launch // 模块启动文件(cyber_launch)
├── learning_based // 基于学习算法相关库
├── math // 基础数学库
├── navi // NaviPlanner相关Task
├── open_space // open_space相关算法库
├── planner // 几种planner的定义
├── proto // 公共(全局)参数配置结构定义
├── reference_line // 参考线以及参考线处理类
├── scenario_base // scenario和stage父类接口
├── task_base // task父类接口
├── testdata // 单元测试数据
├── tools // 工具类
├── traffic_rules_base // 交通规则父类接口
├── BUILD // 构建规则文件
├── cyberfile.xml // 包管理配置文件
├── navi_planning.cc // NaviPlanning相对地图导航模式源码
├── navi_planning.h // NaviPlanning相对地图导航模式头文件
├── on_lane_planning.cc // OnLanePlanning基于高精地图导航模式源码
├── on_lane_planning.h // OnLanePlanning基于高精地图导航模式头文件
├── planning_base.cc // planning模式父类源码
├── planning_base.h // planning模式父类头文件
├── planning_component.cc // planning组件外部接口类源码
├── planning_component.h // planning组件外部接口类头文件
└── README_cn.md // 说明文档
├── scenarios // 场景插件
├── tasks // 任务插件
├── traffic_rules // 交通规则插件
├── pnc_map // pnc_map插件
关键文件和目录的功能如下:
- `common`:包含一些公共的头文件和工具类,如状态估计、车辆控制等。
- `conf`:包含Planning模块的配置文件。
- `planning_base`:包含Planning模块的主要流程和入口package,包含planning模块的整体架构和流程。
- `scenario_base`、`task_base` 和 `traffic_rules_base`:分别包含场景、任务和交通规则的基类接口。
- `scenarios`、`tasks` 和 `traffic_rules`:分别包含场景插件、任务插件和交通规则插件。
- `planning_component.cc` 和 `planning_component.h`:Planning模块的入口,实现了模块的外部接口。
3. 关键算法与流程
Planning模块的运行流程如下:
1. 接收预测障碍物信息、交通灯信息、定位信息和车辆底盘信息。
2. 根据输入信息,生成参考线。
3. 运行场景(Scenario)和任务(Task)插件,生成轨迹。
4. 将生成的轨迹发送给控制模块。
在Planning模块中,采用了双层状态机的场景机制。顶层是Scenario状态机,底层是Stage状态机。在Top Layer中进行场景切换,根据周围的环境和地图信息,决定需要切换到哪个场景。在Bottom Layer中进行Stage的切换,如果上个Stage已经执行完成,继续执行下一个Stage。如果所有的Stage都执行完毕,认为当前Scenario也执行完毕。
4. 开发与实践
Planning模块支持通过修改配置参数、调用外部接口命令和扩展插件来进行开发和实践。开发者可以根据实际需求,修改配置文件中的参数,调整Planning模块的性能表现。此外,开发者还可以通过发送外部接口命令,实现对Planning模块的动态控制。例如,发送紧急靠边停车命令、切换到手动模式等。
为了满足特定场景的需求,开发者还可以扩展新的场景(Scenario)、任务(Task)和交通规则(Traffic Rule)插件。在开发新插件时,需要继承相应的基类,并实现特定的接口函数。例如,开发新的场景插件需要继承`apollo::planning::Scenario`基类,并实现`Init`、`IsTransferable`、`Enter`和`Exit`等函数。