Apollo的代码结构
先看代码的一级目录:
cyber: 消息中间件,作为消息层的实时框架代替ros
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: 车路协同。