Apollo的代码结构
先看代码的一级目录:
cyber: 消息中间件,作为消息层的实时框架代替ros
Component
在自动驾驶系统中,模块(如感知、定位、控制系统等)在 Cyber RT 下以 Component 的形式存在。不同 Component 之间通过 Channel 进行通信。Component 概念不仅解耦了模块,还为将模块拆分为多个子模块提供了灵活性。
Channel
Channel 用于管理 Cyber RT 中的数据通信。用户可以发布/订阅同一个 Channel,实现 P2P 通信。
Task
Task 是 Cyber RT 中异步计算任务的抽象描述。
Node
Node 是 Cyber RT 的基本组成部分。每个模块都包含一个 Node 并通过 Node 进行通信。通过在节点中定义 Reader/Writer 或 Service/Client,模块可以具有不同类型的通信形式。
Reader/Writer
Reader/Writer 通常在 Node 内创建,作为 Cyber RT 中的主要消息传输接口。
Service/Client
除 Reader/Writer 外,Cyber RT 还提供了用于模块通信的 Service/Client 模式。它支持节点之间的双向通信。当对服务发出请求时,客户端节点将收到响应。
Parameter
参数服务在 Cyber RT 中提供了全局参数访问接口。它是基于 Service/Client 模式构建的。
服务发现
作为一个去中心化的框架,Cyber RT 没有用于服务注册的主/中心节点。所有节点都被平等对待,可以通过“服务发现”找到其他服务节点。使用 UDP 用来服务发现。
CRoutine
参考协程(Coroutine)的概念,Cyber RT 实现了 Coroutine 来优化线程使用和系统资源分配。
Scheduler
为了更好地支持自动驾驶场景,Cyber RT 提供了多种资源调度算法供开发者选择。
Message
Message 是 Cyber RT 中用于模块之间数据传输的数据单元。
Dag 文件
Dag 文件是模块拓扑关系的配置文件。您可以在 dag 文件中定义使用的 Component 和上游/下游通道。
Launch 文件
Launch 文件提供了一种启动模块的简单方法。通过在 launch 文件中定义一个或多个 dag 文件,可以同时启动多个模块。
Record 文件
Record 文件用于记录从 Cyber RT 中的 Channel 发送/接收的消息。回放 Record 文件可以帮助重现 Cyber RT 之前操作的行为。
docker: 容器相关,docker/scripts下两个常用启动docker的脚本: dev_start.sh 和dev_into.sh
docs: Apollo的文档,包括完整的英文文档和部分的中文文档
modules: Apollo各个模块的源代码,例如感知,规划,预测,控制等
third_party: 第三方的库
tools: 编译相关的配置文件
modules子目录:
audio: 音频模块,用来检测能否激活车辆紧急状态时的警报器声音,该模块主要输出警报器的开关状态,移动状态和警报器的相对位置。
bridge: 桥接模块,该模块采用socket提供了Apollo和外界模块交互的相关支持,包括sender和receiver模块。例如通过该模块可以实现Apollo和LGSVL模拟器的连接。
calibration: 标定模块,根据不同车型的传感器方案提供包含车身、摄像头、激光雷达、GNSS、感知、雷达、初始化等参数,该文件夹只有标定好的参数,并没有标定的工具和方法。
canbus: can总线模块,该模块接受并执行控制模块发出的指令,并收集底盘的状态作为反馈。
common: 公共的模块,包含通信、配置、滤波器、记录模块、数学、log系统、车辆状态,proto, 可视化等子模块。
contrib: apollo的有益贡献,包含和lgsv相关的protobuf包的信息、tcp和Cyber交互的桥接模块、自定位系统模块(elo: 利用高精地图的自定位模块。前向的摄像头会采集车道数据以实现更精确的定位,输出的位置信息包括车辆的x y z坐标,还有就是在百度高精度地图中的ID)、和端到端(e2e: 端到端深度学习,所谓e2e指的是由传感器的输入,直接决定车的行为,例如油门,刹车,方向等。也就是机器学习的算法直接学习人类司机的驾驶行为)子模块
control: 控制模块,控制模块根据规划的轨迹和车辆的当前状态,采用不同的控制算法来生成一个舒适的驾驶体验(这里个人理解就是结合舒适性的考虑输出底盘的油门、转向角和刹车的指令等)。控制模块可以再正常模式和导航模式下工作。
data: 数据模块,包含一些数据的proto定义以及一个smart_recorder工具,smart_recorder用来减少记录数据量的大小,可以有选择的记录所需要的数据。
dreamview: 可视化模块,dreamview是一个web程序,可以用来可视化车辆的状态信息,以及各个模块的输出。
driver: 驱动模块,包含摄像头、CAN总线、GNSS、激光雷达、麦克风、smarteye(???)等模块的驱动和proto配置文件,此外还包括了一个视频(???)子模块和一个image_decompress的工具。
guardian: 系统检测保护模块
localization: 定位模块,该模块通过两种方式提供定位服务,一种是结合GPS和IMU信息的RTK(Real Time Kinematic实时运动)方法,另一种是融合GPS、IMU和激光雷达信息的多传感器融合方法。
map: 地图模块,包括高精度地图、PNC地图(Planning and Control map)、和relative map(连接HD map/感知模块和规划模块的中间层)。此外还有一些相关的proto配置文件,数据和工具等。
monitor: 监视器模块,该模块包含系统层次的软件用来检查硬件状态和监控系统的健康状态的代码。
perception: 感知模块,该模块能够仅在一个detection component中检测并分类障碍物。
planning: 轨迹规划模块,Apollo6.0采用数据驱动的方法和基于学习的模型来解决轨迹规划问题。该模块将每个驾驶用例都视为不同的驾驶场景。Apollo引入了E2E模式和混合模式两种规划模式。prediction: 预测模块,该模块学习并预测所有感知模块所检测到的物体的行为,预测的数据输入为障碍物的基本感知信息,包括位置、朝向、速度和加速度。输出为物体的轨迹(带有概率信息)。
routing: 路由模块,该模块可以根据要求生成高等级的导航信息。该模块的输入是地图数据和路由指令(起点和终点位置),输出为路由导航信息。
storytelling: 全局的高级场景管理器,该模块用于帮助协调跨模块的操作。 为了让自动驾驶汽车在城市道路上安全运行,需要复杂的规划场景来确保安全驾驶。该模块输入为定位和高精度地图信息,输出为可以被其他模块订阅的"story"。
task_manager: 任务管理器,主要任务为似乎是routing相关(???)。
third_party_perception: 第三方感知模块,该模块用来管理第三方的传感器(例如Mobileye, Conti/Delphi雷达)来进行简单融合并得到感知的输出。主要是在apollo 2.5之前使用,据说apollo刚开始检测效果不好。
tools: 一些基于python编写并且兼容proto的模块。
transform: 坐标转换模块,类似于ros的tf2。
v2x: 车路协同。