Autoware Universe 感知模块详解 | 第一节 宏观认识Autoware Universe整体架构
在上一节中,我们系统性地介绍了AI Agentic Coding时代下,如何快速高效地理解自动驾驶开源框架,并以Autoware Universe为例,介绍了我们系统性学习开源框架的战略以及具体方法论。
本节将延续上一节的内容和工具,基于Autoware官方文档和源码结构,从整体架构的方面深入了解Autoware Universe。
首先,我们将基于官方架构框图直观展示Autoware的功能分布,理清各个模块及其关联。其次,利用Linux下源码树状结构(linux tree)展示项目代码的整体布局,做到对于模块化架构的感性认识和代码结构的统一。
通过本节内容,读者将具备对Autoware Universe整体架构的宏观认知,为后续感知模块结构与功能的深入学习和实际应用奠定坚实基础。
Autoware模块化架构及其关系
从更高的维度宏观地理解开源框架的整体架构对于代码的理解以及后续的二次开发都是大有裨益的。除了让我们可以对于系统有更深层的认识外,还会避免我们项目伊始无从下手,或者随便找个地方入手却不知何去何从的挫败感,这也符合刻意练习中的难易适中的原则。
毫无疑问,看官方文档的流程图无疑是理解整体架构最直观的方法。
拿上图为例,我们就可以直观地了解到自动驾驶系统不同模块及其依赖关系,对于感知和规划的模块,我们还可以更加清晰地了解到他们的细分模块以及其承载的不同任务。
Autoware Universe框架的自动驾驶过程通过多个模块协同工作实现,其主要模块及相互配合关系简述如下:
-
Sensing(传感器感知):负责收集和处理来自激光雷达、摄像头、毫米波雷达等传感器的原始数据,转换为系统可用的格式,为后续模块提供环境基础信息。
-
Map(地图):管理和加载高精度地图数据,包括矢量地图和点云地图,提供道路结构、交通标志和障碍物等静态和动态环境信息,支持定位和路径规划。
-
Localization(定位):利用GPS、IMU、激光雷达等传感器数据结合地图信息,计算车辆的精确位置和姿态,确保车辆在世界坐标系中的准确定位。
-
Perception(感知环境理解):基于感知模块的数据,识别和分类环境中的动态和静态对象(行人、车辆、交通标志等),并预测其动态轨迹,结果传递给规划模块。
-
Planning(规划):依据定位和感知结果,制定车辆的安全行驶路径和具体运动轨迹,包括宏观的路线规划和微观的车辆行为规划,考虑交通规则和动态障碍。
-
Control(控制):将规划模块生成的轨迹转化为具体车辆控制指令(如转向、油门、刹车),通过闭环控制实现车辆按规划路径行驶。
-
Vehicle Interface(车辆接口):作为软件与车辆硬件的桥梁,将控制指令发送至车辆执行机构,同时收集车辆状态反馈,保证整个控制闭环的执行。
Autoware自动驾驶系统工作原理解析
单单理解到各个模块的任务显然是不够的。在Autoware自动驾驶系统中,整个感知与决策过程可理解为先验信息与后验信息的融合与传递,形成对环境的精准认知和安全驾驶决策。
-
先验信息:绘制的点云地图与高精地图
系统通过预先构建的高精度地图(HD地图)和点云地图,提供了环境的静态先验信息。这些地图详细描述了道路结构、交通标志、车道边界以及固定障碍物等,为后续的定位与感知模块构建了坚实基础。 -
后验信息:传感器数据的实时感知
车辆搭载的激光雷达、摄像头、毫米波雷达等传感器实时采集环境信息,生成后验数据。传感模块(Sensing)对这些原始数据进行处理和解析,捕获车辆周围的动态变化和实时细节。 -
先验与后验信息融合成高精度定位信号
定位模块将先验地图信息和传感器的后验信息进行融合,实现车辆在地图中的高精度实时定位。这一定位信号为系统提供精确的当前位置,是后续感知和规划的关键输入。 -
感知模块:多维度环境理解
通过融合后的定位信号以及传感器数据,感知模块算法进一步识别和分割周围的动态与静态障碍物,进行物体追踪和行为预测。系统不仅能感知当前环境状态,还能预判障碍物未来的运动轨迹,构建完善的周围环境模型。 -
规划与控制模块:路径决策与执行
结合当前定位和感知到的环境信息,规划模块基于高精地图生成全局路径和局部路径,确保路线符合交通规则且避开障碍物。控制模块根据规划路径,通过横向和纵向控制策略,精准地驱动车辆按照规划轨迹行驶,实现安全稳定的自动驾驶。
通过上述步骤,Autoware实现了从定位融合、环境感知,到路径规划和车辆控制的闭环自动驾驶流程,保障车辆在复杂动态环境中的安全和高效行驶。
感性认识和代码的对应关系
上面我们通过官方文档的流程图,结合我的个人浅薄的理解,初步了解了Autoware自动驾驶框架的模块划分,并且从单一模块的功能和先验后验信息的融合传递的角度立体地对自动驾驶流程产生了感性的认识。如何将对代码框架的感性认识和代码一一对应起来就是我们本小节需要探讨的内容。
对于Autoware Universe这种骨灰级的自动驾驶开源框架来说,规范的代码架构和代码习惯是其开发者必然会遵守的原则,这对于我们学习并理解框架以及后续的二次开发来说都是非常重要的。而正是因为其良好的代码结构,也突显出Linux Tree工具对于优秀开源项目整体架构分析的优越性。
Linux Tree工具
一言以蔽之,Linux Tree命令通过递归列出目录及子目录的树状结构,直观展示文件与文件夹的层级关系,便于快速把握开源代码框架的整体组织和模块分布,提高代码架构分析效率。
下面直接给出Linux Tree的基本命令定义和示例:
Linux tree命令基本用法
tree [options][directory]
主要参数
-L level
限制目录显示层级为level,只展示指定深度的目录和文件,方便聚焦分析。
-a
显示所有文件和目录,包含隐藏文件。
-d
只显示目录,不显示文件。
示例
tree -L 2 # 显示当前目录及子目录的两层结构
tree -a -L 3 # 显示包含隐藏文件的三层目录结构
tree -d -L 1 # 只显示当前目录一级目录
当然,在AI Agentic Coding时代,记录上述操作已经不再成为必须,比如我们可以在windsurf中输入下面的提示词:Please inspect the codebase and use the Linux tree tool with proper depth to better illustrate the entire architecture of the codebase.
我们就可以得到对于autoware代码库非常直观的认识。
Autoware项目高层次组织
通过两层深度tree指令得到的目录结构展示了Autoware项目的高层次组织,涵盖开发环境配置、自动化脚本、样例地图、核心源码及扩展包,配合生成的构建、安装和日志文件,构成完整的自动驾驶软件生态。
High-Level Structure (Depth 2)
/home/user/autoware/
├── .devcontainer/ # Development container configurations
├── .github/ # GitHub workflows and templates
├── .webauto-ci/ # CI/CD configurations
├── ansible/ # Infrastructure automation
├── autoware_map/ # Sample maps and configurations
├── docker/ # Docker configurations and scripts
├── src/ # Main source code directory
│ ├── core/ # Core Autoware functionality
│ ├── launcher/ # Launch configurations
│ ├── middleware/ # Middleware components
│ ├── sensor_component/ # Sensor drivers and components
│ └── universe/ # Extended Autoware Universe packages
├── build/ # Build artifacts (generated)
├── install/ # Installation directory (generated)
├── log/ # Log files (generated)
└── [configuration files] # Various config files (.repos, .env, etc.)
Autoware核心源码模块划分
通过三层深度tree指令得到的目录详细展示了Autoware核心源码及扩展包的模块划分,涵盖从基础功能、传感器驱动,到高级感知、定位、规划和控制等各个自动驾驶关键子系统。
Core Architecture (Depth 3)
src/
├── core/
│ ├── autoware_adapi_msgs/ # API message definitions
│ ├── autoware_cmake/ # CMake utilities
│ ├── autoware_core/ # Main core functionality
│ │ ├── common/ # Shared utilities and libraries
│ │ ├── control/ # Vehicle control algorithms
│ │ ├── localization/ # Localization and positioning
│ │ ├── map/ # Map handling and processing
│ │ ├── perception/ # Basic perception components
│ │ ├── planning/ # Path and motion planning
│ │ ├── sensing/ # Sensor data processing
│ │ ├── system/ # System management
│ │ └── testing/ # Testing utilities
│ ├── autoware_internal_msgs/ # Internal message definitions
│ ├── autoware_lanelet2_extension/ # Lanelet2 extensions
│ ├── autoware_msgs/ # Standard message definitions
│ └── autoware_utils/ # Core utilities
├── launcher/
│ └── autoware_launch/ # Launch file configurations
├── middleware/
│ └── external/ # External middleware packages
├── sensor_component/
│ ├── external/ # External sensor packages
│ ├── ros2_socketcan/ # CAN bus communication
│ └── transport_drivers/ # Transport layer drivers
└── universe/
├── autoware_universe/ # Extended functionality
│ ├── common/ # Common universe utilities
│ ├── control/ # Advanced control algorithms
│ ├── evaluator/ # Performance evaluation tools
│ ├── localization/ # Advanced localization
│ ├── map/ # Advanced map processing
│ ├── perception/ # Advanced perception
│ ├── planning/ # Advanced planning algorithms
│ ├── sensing/ # Advanced sensing capabilities
│ ├── simulator/ # Simulation components
│ ├── system/ # System monitoring and diagnostics
│ ├── tools/ # Development and debugging tools
│ └── visualization/ # Visualization components
└── external/ # External universe package
从上面的源码架构可以看出,Autoware提供了从基础的core模块到功能更完善、更复杂的universe模块的渐进式架构。通过先建立对整体模块化架构的宏观理解,再由浅入深地分析感知模块的微观设计,我们能够系统化地掌握开发流程和核心技术,真正实现从入门到精通的跨越。接下来,让我们一同聚焦感知模块,开启更深入的技术探索之旅。