Apollo无人驾驶概览

Apollo 是一个开放的无人驾驶平台或者说是一个开放的无人驾驶 的生态系统。

Open Capability开放能力, Share Resource共享资源, Accelerated Innovation加速创新,Sustained Mutual Benefit合作共赢

无人驾驶硬件

  • GPS+IMU 全球定位+惯性测量
  • Camera 视觉传感器
  • Lidar 激光传感器
  • Millimeter Wave Radar 毫米波雷达
  • Ultrasonic Radar 超声波雷达
  • Vehicle Control Unit Signals VCU信号
  • Autonomous Vehicle Controller 无人驾驶控制器

Open Software Platform

自动驾驶系统最为重要的软件层。

这一层包含了最底层的RTOS(Real Time Operation System)和第二层的运行软件所需的框架环境(Runtime Framework),再到第上层的各个子模块(地图引擎、定位、感知、规划、控制、端到端、人机界面)。

Reference Hardware Platform

自动驾驶系统所依赖的硬件层。

这里不仅包含了控制器、GPS/IMU、HMI Device(其实就是显示器)和LiDAR,还有即将在18年1月开放的Camera、Radar、和Black Box(还猜不到这个黑盒的功能)。

Drive-by-wire Vehicle

线控的底层,不开放这个接口,就无法控制汽车。

1. 概括

Apollo源码主要是c++实现的,也有少量python,主要程序在apollo/modules目录中,共18个包,功能包17个:

其中每个模块的作用如下:

apollo/modules/calibration : 校准模块,使用前必须对系统进行校准和标定,包括激光雷达与摄像头、毫米波雷达与摄像头等。所谓校准就是要对齐激光雷达、摄像头以及毫米波雷达获得的信息,我们知道激光雷达可以获得详细的3D信息,但是不能获得颜色信息,摄像头可以获得颜色信息,但是无法获得深度等3D信息,毫米波雷达不能获得颜色信息,但是可以获得3D信息,三者获得的信息对齐后,就可以同时获得实际环境中的3D信息和颜色信息。

apollo/modules/canbus:汽车can总线控制模块。接收控制指令,同时给控制模块control发送车身状态信息。

apollo/modules/common:公共源码模块。包括如日志,工厂模式的实现,日志系统,监控模块,数学算法等。

apollo/modules/control:控制模块。基于决策规划的输出路径及车身的状态使用不同的控制算法来输出控制命令,如转向刹车,控制等。

apollo/modules/data:数据模块。收集、存储、处理收集到的各种数据的。

apollo/modules/dreamview:可视化模块。查看规划的轨迹及实时的转向刹车油门信息

apollo/modules/drivers:驱动模块。各种传感器驱动。

apollo/modules/e2e:end to end,端到端强化学习。

所谓e2e指的是由传感器的输入,直接决定车的行为,例如油门,刹车,方向等。也就是机器学习的算法直接学习人类司机的驾驶行为。这部分在代码中需要另外下载,学习的数据主要来源于传感器的原始数据,包括图像、激光雷达、雷达等。end-to-end输入以图像为主。 输出是车辆的控制决策指令,如方向盘角度、加速、刹车。 连接输入输出的是深度神经网络,即通过神经网络直接生成车辆控制指令对车辆进行横向控制和纵向控制,中间没有人工参与的逻辑程序。横向控制,主要是指通过方向盘控制车身横向移动,即方向盘角度。纵向控制,是指通过油门和刹车控制车身纵向的移动,即加速、刹车等。横向模型的输出没有采用方向盘角度,而是使用要行驶的曲率(即拐弯半径的倒数)。

apollo/modules/elo:利用高精地图的自定位模块。这部分的代码也是另外下载。前向的摄像头会采集车道数据以实现更精确的定位,输出的位置信息包括车辆的x y z坐标,还有就是在百度高精度地图中的ID。

apollo/modules/localization:定位模块。输入GPS和IMU信息输出自车定位信息

apollo/modules/map:高精地图模块。输出结构化地图信息,如车道线,十字路口等。

apollo/modules/monitor:监控模块。监控硬件状态,同时把状态发给交互界面。

apollo/modules/perception:感知模块。输入激光点云,高精地图,变换坐标,输出3D障碍物包括速度大小和方向。

apollo/modules/planning:局部决策规划模块。

apollo/modules/prediction:预测模块。输出感知的障碍物信息及自定位信息输出障碍物未来的轨迹。

apollo/modules/routing:全局规划模块。输入包括地图信息各起点终点地址,输出一个全局的导航信息。

apollo/modules/third_party_perception:第三方感知模块。

apollo/modules/tools:通用监控与可视化模块。

2. 分类

2.1 感知:

感知当前位置,速度,障碍物等等

– Apollo/modules/perception

三方感知器支持

– Apollo/modules/third_party_perception

2.2 预测:

对场景下一步的变化做出预测

– Apollo/modules/prediction

2.3 规划:

全局路径规划:通过起点终点计算行驶路径

– Apollo/modules/routing

规划当前轨道:通过感知,预测,路径规划等信息计算轨道

– Apollo/modules/planning

规划转换成命令:将轨道转换成控制汽车的命令(加速,制动,转向等)

– Apollo/modules/control

2.4 定位:

输入GPS和IMU信息输出自车定位位置信息

– Apollo/modules/localization

高精地图模块

– Apollo/modules/map

利用高精地图的自定位模块,利用前向的摄像头会采集车道数据以实现更精确的定位

– Apollo/modules/elo

2.5 交互:

可视化模块,用户交互信息

– Apollo/modules/dreamview

2.6 驱动

设备驱动

– Apollo/modules/drivers

监控模块

– Apollo/modules/monitor

汽车硬件交互

– Apollo/modules/canbus

2.7 工具程序

标注工具

–Apollo/modules/calibration

Apollo/modules/common

–通用公共工具

Apollo/modules/data

– 数据工具

Apollo/modules/tools

– Python工具

2.8 强化学习

Apollo/modules/e2e

3. 工作流程

自动驾驶系统先通过起点终点规划出全局路径(routing);然后在行驶过程中感知(perception)当前环境(识别车辆行人路况标志等),并预测下一步发展;然后把已知信息都传入规划模块(planning),规划出之后的轨道;控制模块(control)将轨道数据转换成对车辆的控制信号,通过汽车交互模块(canbus)控制汽车.

流程图如下:

工作流程图

无人驾驶五个核心部分:

  • 计算机视觉(Computer Vision)
  • 传感器融合(Sensor Fusion)
  • 定位(Localization)
  • 路径规划(Path Planning)
  • 控制(Control)

参考车辆:可通过电子控制的基础车辆;线控驾驶车辆;CAN,GPS

参考硬件:CAN,GPS,IMU,LiDAR,摄像头,雷达,IPC

开源软件架构:开放式软件层分为三个子层:实时操作系统、运行时框架、应用程序模块层。

RTOS:可确保在给定时间内完成特定任务,能够及时进行计算,分析并执行相应的操作。

运行时框架:是ROS的定制版 共享内存降低了需要访问不同模块时的数据复制需求,对于一对多的传输方案,共享内存支持一次写入,多次读取的模式。去中心化解决了单点故障问题。

Apollo使用Protobuf的接口语言替代原生ROS消息

Protobuf是一种结构化数据序列方法,这对于开发用于通过电线彼此通信或用于存储数据的程序非常有用,你可以将新字段添加到消息格式中,而不会破坏后向兼容性。

新的二进制文件可以解析过程中接受旧的消息格式

向ROS添加Protobuf格式有助于Apollo的长期发展

应用程序模块:MAP引擎,零定位、感知、规划、控制、端到端驾驶以及人机接口(HMI)。每个模块都有自己的算法库,模块之间的关系非常复杂。