参考视频:Apollo自动驾驶入门课程
开源软件架构
开放式软件层分为三个子层:实时操作系统、运行时框架和应用程序模块层
- 实时操作系统(RTOS)
可确保在给定时间内完成特定任务,“实时”是指无人车的操作系统能够及时进行计算,分析并执行相应的操作。以上是在汽车传感器收集到外界数据后的短时间内完成。
假设无人车的传感器检测到车辆前方移动的障碍物,短时间内,基于RTOS的Apollo软件模块,必须分析障碍物是行人,还是汽车或是其他东西。预测其未来的运动方向和速度,并确定减速还是停止,然后车辆必须执行该决定。
实时性能是确保系统稳定性和驾驶安全性的重要要求
Apollo RTOS是Ubuntu Linux操作系统与Apollo内核相互结合的成果
- 运行时框架
运行时框架Apollo的操作环境,是ROS的定制版,虽然是机器人操作系统,但他实际上是一个在Apollo RTOS上运行的软件框架。
ROS根据功能将自治系统划分为多个模块,每个模块负责接收、处理和发布自己的消息。由于这些模块相互独立,只能通过运行时框架进行通信,因此调整任何单一模块都很容易。所有这些功能使ROS成为理想的Apollo开发与集成框架。
为了使ROS适应无人车,Apollo团队改进了共享内存的功能和性能、去中心化和数据兼容性
(1)共享内存
共享内存降低了需要访问不同模块时的数据复制需求
对于一对多传输方案,共享内存支持"一次写入 多次读取"模式。例如,如果只收到一次点云,可以同步运行障碍物检测,定位和GUI工具,可以加快通信速度。
(2)去中心化
去中心化解决了单点故障的问题
现成的ROS由许多节点组成,每个节点都有自己的功能。例如,一个节点可能负责收集摄像头图像,另一个节点可能负责规划轨迹,而第三个节点可能负责将控制命令发送到CAN总线上的车辆。但是所有的节点都需要由单个ROS主节点来控制,如果这个主节点发生故障,整个系统都会失效。
解决方案:Apollo将所有的节点放在一个公共域中,通过这种去中心化方案,公共区域取代了原来的ROS主节点,因此消除了单点故障风险
(3)数据兼容性
对于无人车,由于项目本身的规模很大,数据兼容性至关重要,不同的ROS节点通过名为ROS消息接口语言相互通信
ROS消息需要使用通用接口语言,使每个节点都可以解读来自其他节点的消息数据。如果消息文件的格式与节点期望的格式稍有不同,通信就会失败。这可能导致严重的兼容性问题,例如,当一个接口升级,数据不兼容通常会导致系统故障,此外必须一次又一次地转换之前所记录的测试数据以适应新的消息格式。
解决方案:
Apollo使用了一种名为protobuf的接口语言替代原生ROS消息。Protobuf是一种结构化数据序列化方法,对于开发用于通过电线彼此通信或用于存储数据的程序非常有用。
可以将新字段添加到消息格式中,而不会破坏向后兼容性
- 应用程序模块
Apollo的软件平台具有各种模块,这些模块包括MAP引擎、定位、感知、规划、控制、端到端驾驶以及人机接口(或HMI),每个模块都有自己的算法库,模块之间的关系非常复杂。