Apollo学习

Cha1: 自动驾驶概述

自动驾驶的等级共有六个等级:

  • L0: 基本等级,驾驶者是唯一决策者
  • L1:Driver Assistance, 车辆为驾驶员提供转向或加速支持,如cruise control
  • L2: Partical Automation, 车辆负责部分驾驶功能,如Automatic Cruise control, Automatic Lane Keeping, 但驾驶员始终保持对系统的控制
  • L3: Conditional Automation, 车辆自主驾驶,但驾驶员必须准备在必要时间随时接管。
  • L4: No Human Interference,(Without Steering Wheel, Throttle or Brake but restricted in Geofence) 在该等级中驾驶的所有功能由车辆接管,并且并不期望驾驶员的介入。该等级的车辆可能根本没有方向盘和任何驾驶员控制装置, 但车辆的行驶会被限制在某些区域(地理围栏),在地理围栏外车辆不能自主操作,或者根本无法操作
  • L5: Full Automation, 车辆可在任何可驾驶区域自主运行,并且该等级下车辆的自主驾驶水平大于或等于人类驾驶员的水平

自动驾驶等级

Cha2: 高精度地图(HD map)

简介:
高精度地图包含大量的辅助信息,如道路网的精确三维表征(交叉路口布局,路标位置),语义信息(信号灯,速度限制, 车道)等,高精度地图的精度可达到厘米级。高精度地图可用于定位,感知和规划等过程中。
定位:
高精度地图可以同于定位,车辆通过传感器感知的周围环境进行自定位,即根据所感知的环境信息找到自身在地图上所处位置。其流程为首先通过传感器采集数据(图像,三维点云等),然后对数据进行预处理(消除不准确和低质量数据),坐标转换(统一坐标系),数据融合, 最后根据数据融合的数据和地狱进行匹配。
感知:
高精度地图和帮助无人驾驶车进行感知,用于克服传感器硬件,天气,亮度等条件对传感器感知能力的限制,除此之外高精地图可以用来缩小传感器检测范围,即为传感器提供ROI,其优点是可以提高检测精度和速度,同时也节约了计算能力。
规划:
高精度地图可以帮助车辆寻找合适的行车空间,用于路线规划;同时也可以告知车辆其他车辆可能出现的位置。在具有速度限制,障碍物的区域,高精度地图也可以为车辆的减速,变道等操作提供依据。

Apollo高精度地图

Apollo的高精度地图采用OpenDRIVE标准,该标准格式可以像API一样方便调用,Apollo对该制图标准进行了改进,即Apollo OpenDRIVE.两种标准比较见下图。
Apollo高精度地图道路元素
两种标准对比
Apollo高精度地图的准确性要求比较高,因此需要调查车队对地图进行不断的更新,其构建过程如下图。除了高精度地图以外,Apollo还提供了俯瞰图和3D点云地图。
地图构建过程

Cha3: 定位

定位是让无人车确定自身位置的方法,常用的定位的方法有:GNSS RTK, 惯性导航,Lidar定位和视觉定位。定位所需要的输入有:GPS, IMU, LiDAR等。
GNSS RTK:
GNSS RTK定位的基础是三角测量,如下图所示,在平面上确定一个点的位置需要三个地标,在空间中则需要一个额外的地标来确定海拔。因此GPS需要至少4颗卫星才能进行定位。
三角测量原理
GPS是全球定位系统,是美国开发的定位系统名称。但该类系统的通用名称叫做全球导航卫星系统(GNSS)。GPS系统有三部分组成:

  • 卫星:大约30颗,距地约两万公里
  • 控制站:监控和控制卫星,验证GPS精度
  • GPS接收器: 不直接检测距离,而是检测信号飞行时间,计算方法如下下图。为保证精度,每颗卫星都有原子钟以保证时间的准确性
    GPS定位进一步减小误差的方法是实时运动定位(RTK), 通过卫星和基站的误差进行修正,通过误差可以将误差限制在10cm内。因此GPS定位系统的精度可以信赖,但收遮挡和区域的影响,并且更新频率很低(10Hz)。
    GPS结构
    距离计算方法
    RTK原理

惯性导航:
基本原理是初中物理(v, a, t),加速度采用三轴加速度计进行测量,并且借助陀螺仪的(3D Gyro)将加速度从Ego坐标系转换到全局坐标系。加速度计+陀螺仪=IMU,IMU工作频率很高,实时性强,但误差会随着时间而积累。
LiDAR定位:
LiDAR定位的方法是通过点云匹配,滤波等算法实现的。点云匹配算法(迭代最近点/ICP)的思想是:假设需要对两次点云扫描的数据进行匹配,首先建立两次扫描的匹配点对,然后将每对点之间的距离误差相加来计算平均距离误差,接下来的目标是通过点云的平移和旋转来最小化平均距离误差,从而可以找到传感器扫描和地图之间的匹配,最终将传感器扫描到的车辆位置转换为全球地图上的精确位置。滤波算法通过过滤冗余信息来在地图上找到最可能的车辆位置。Apollo采用直方图滤波算法(误差平方和算法/SSD),该方法首先将传感器扫描的点云滑过地图上的每个位置,在每个位置计算扫描的点与高精度地图对应点之间的误差或距离,然后对误差的平方求和,得到的结果越小,则扫描结果与地图的匹配越好。此外还有卡尔曼滤波算法,该算法根据过去的状态和新的传感器测量结果预测当前的状态,即使用了预测更新周期。
LiDAR的优点在于稳健性(robust),但其难点是构建高精度地图并使其保持最新(瞬态元素太多?)。

视觉定位:
视觉定位的优点是:图像数据类型获取成本较低,并且摄像头传感器种类繁多,价格便宜; 但通过图像很难实现精准定位,因此经常与其他传感器数据相结合来准确定位车辆(如:3D map + Image)。比如采用粒子滤波来确定汽车检测到的树对应地图上的哪棵树(如下图)。同样可以使用粒子滤波的原理确定车辆在车道线上的位置。
粒子滤波视觉定位
粒子滤波过程

Apollo定位
Apollo使用基于GPS, IMU和Lidar的多传感器融合定位系统,利用不同传感器的特性和优势,提高了定位的稳定性和准确性。数据融合的框架是卡尔曼滤波。
数据融合框架

Cha4: 感知

在自动驾驶控制系统的架构当中,自动驾驶车辆的感知系统是车辆路径规划的主要依据之一。感知系统最主要采用的传感器是Camera和Lidar。Camera图像的形式为RGB或者灰度,可以提供颜色,形状和纹理等信息; Lidar图像提供环境的点云特征,其原理是Lidar中激光束的反射,所收集的信息形成点云,每个点代表反射回传感器的激光束。点云数据中包含距离,高度以及表面和纹理信息。最终,感知模块的输出有四周车辆的三维识别框; 所检测的车辆的速度,角速度,方向; 地面标识,车道线等。 这里要注意的是感知模块的输出不是传感器的原始信息。在感知层面上,自动驾驶车辆主要有四个核心任务:

  • Detection: 检测,确定物体的具体位置
  • Classification: 分类,明确对象类别
  • Tracking: 跟踪,随着时间的推移观察移动物体
  • Segmentation: 分割,即语义分割,将图像的每个像素与语义类别相匹配

Pipeline of Classification

机器学习
机器学习是一种方法论,采用模型来对传感器的数据进行处理,模型需要学习过程,根据其学习的方法可分为:

  • supervised Learning: 需要有标注的数据进行训练
  • Unsupervised Learning: 采用无标注的数据进行训练
  • Semi-supervised Learning: 半监督,两者结合
  • Reinforcement Learning: 强化学习,允许模型采用不同的方法解决问题,并衡量哪一种方法更加成功。

反向传播算法
反向传播算法的过程由前馈误差测定,和反向传播三个部分组成。

卷积神经网络
标准的神经网络在处理图像分类问题的时候,需要首先采用平滑化操作(Flatten)将二维的图像变成一维的向量,即将所有的图像展开为一维像素序列,但这种方法的问题是会丢失图像的空间信息。CNN通过卷积操作来维持输入像素之间的空间关系来解决这一个问题。 如下图的CNN结构,在每一层上CNN采用不同的卷积算子来提取不同的图像特征如边缘,部件,色彩等,最终通过学习过程来找出哪些特征是重要的。
CNN检测原理

目标检测与分类
检测算法有两种流派:

  • Two stage model: RCNN, fast FCNN, Faster RCNN
  • One stage model: YOLO, SSD

跟踪
在检测出目标后,需要对目标进行跟踪,Tracking的意义在于可以解决在视频流中物体的遮挡问题,并且可保留识别码。知乎:工程实践中,目标检测为何要加目标追踪?
分割
语义分割设计对图像的每个像素进行分类,在自动驾驶中用于寻找通行空间。算法上语义分割依赖于全卷积网络(FCN)。不同于CNN,FCN采用卷积层来替代传统CNN结果的平滑层(flat layers)。在FCN中,输入图像经过多次卷积后得到的输出图像将比输入图像小,为了进行像素分割操作,可网络的中间输出采用上采样处理,使得最终输出的大小与原始图像大小相匹配。如下图,网络的前半部分被称为编码器,后半部分为解码器
FCN网络(Encoder + Decoder)

Apollo感知
对于三维对象的检测,Apollo的感知系统采用ROI来重点关注相关对象,Apollo将ROI fliter应用于点云和图像数据,用来缩小搜索范围并加快感知。其检测网络的结构如下图,检测网络的输出用于构建对象的Bounding box。紧接着采用检测和跟踪结合的算法来在时间步中检测单个对象。Apollo采用高精度地图来确定前方是否有信号灯,采用YOLO来检测车道线和动态目标。在通过YOLO网络检测后,在线检测模块会并入来自其他传感器的数据对车道线预测进行调整,车道线最终被放入Virtual Lane的数据结构中。同时来自其他传感器的数据也会对YOLO网络所检测到的动态对象进行调整,以获得每个对象的类别,位置,速度和前进方向。车道预测结果和动态对象检测结果最终均被传递到规划和控制模块。
Detection Network

pipeline of Apollo

传感器数据比较
传感器性能比较

Radar和Lidar补充知识
在汽车系统中雷达主要应用于自适应巡航控制、盲点警告、碰撞浸膏和碰撞预防等系统中。尽管雷达技术已经成熟,它仍在不断进步,作用不断提升。其他传感器测量速度的方法是计算两次读数之间的差距,而雷达则通过多普勒效应来直接测量速度。多普勒效应对传感器融合至关重要。因为它可以把速度作为独立的测量参数,从而提升了融合算法的收敛速度。雷达还可以生成环境的雷达地图,进而实现定位。因为雷达波在坚硬表面会回弹。因此,它可以直接测量对象距离,无需在视线范围内也可以。雷达可以看到其他车辆底部。并发现可能会被阻挡的建筑物和对象。在车上的所有传感器中,雷达是至不容易受雨雾影响的。而且视野宽阔,可达150度,距离可达200多米。与激光雷达和摄像头相比,雷达分辨率较低,尤其是在垂直方向,分辨率非常有限。分辨率低意味着来自静态物体的反射可能产生问题。例如,街道上检修孔盖或汽水罐,可能产生很高的雷达反射率,但他们并不大。我们将其称为雷达杂波。因此,当前的车载雷达通常会忽视静态物体。

激光雷达是激光探测与测量的简称,而雷达则谁无线电探测与测量的简称。雷达使用无线电波,而激光雷达则使用红激光束来确定传感器和附近对象的距离。目前的激光雷达大多使用 900 纳米光波长度的光源。但部分激光雷达使用的光波长度更长,在雨雾中性能更好。当前的激光雷达使用旋转座架发射激光,扫描周边环境。激光室脉冲式的,脉冲被对象反射,然后返回一个点云,来代表这些物体。激光雷达的空间分辨率远远高于雷达。因为激光束越聚焦,垂直方向的扫描层数量就越多,因此每层的激光雷达的密度也越高。目前,激光雷达还不能直接测量对象的速度,必须使用两次或多次扫描之间的位置差来确定。激光雷达受天气和传感器清洁程度影响也很大,因此需要保持清洁。它们块头也比其他传感器更大,因此也很难安装,除非你只想在车顶安装一个大的激光扫描器。

感知融合策略
Apollo采用Lidar和Radar来检测障碍物,用于融合输出的主要算法为卡尔曼滤波。

Cha6: 规划

轨迹规划的目标是生成免碰撞和舒适的可执行的轨迹,该轨迹有一系列的点组成,每个点都有一个关联速度,以及一个时间戳(tamestap)用来表示何时到达该点。路线规划使用了三个输入:地图,当前在地图上的位置,目的地。在搜索可行路径之前,采用了基于图形搜索方法。首先将地图重新格式化为图形(graph)。graph由节点(node)和边缘(edge)组成。节点代表路段,边缘代表路段之间的连接。轨迹规划不仅需要再地图上规划路线,还需要根据环境以及周围的车辆行人等进行低等级高精度的轨迹生成。所生成的轨迹具有三个维度,空间上的两个维度和一个时间维度。现实世界的规划问题具有多种约束,如考虑车辆道路条件的限制,法律法规,乘客的舒适感,速度限制,在轨迹的终点车辆是否和道路中心线平行对齐等。在具体实现方法采用优化理论,通过最小化损失函数来找到最适合的路径。在路径规划中,笛卡尔坐标系并不适合解决这种问题,Frenet 坐标系描述了汽车相对于道路的位置,在 Frenet 框架中,s 代表沿道路的距离称为纵坐标,d表示与纵向线的位移称为横坐标。
Frenet坐标
路径-速度解耦规划(EM规划)
路径-速度解耦规划包括两步: 路径规划和速度规划。在路径规划中,首先生成候选曲线,使用成本函数对候选路径进行评估,需考虑的因素包括: 平滑度、安全性、与车道中心的偏离程度等。速度规划需要的是一系列与路径相关联的速度序列。
路径规划: 具体实施步骤上,首先将路段分割成单元格,对这些单元格中的点进行随机采样。通过从每个单元格中取一个点并将点连接,创建了候选路径,通过重复此过程可以构建多个候选路径。使用成本函数对这些路径进行评估并选择成本最低的路径,成本函数可能考虑以下因素:与车道中心的偏离、与障碍物的距离、速度和曲率的变化、对车辆的压力等因素。
路径规划

速度规划: 速度规划即需要选择与路径相关联的速度曲线。通过ST图可以帮助设计和选择速度曲线。在这里需要将ST图离散为多个单元格,每个单元格内速度保持不变,通过该方法可简化速度曲线的构建并维持曲线的近似度。在 ST 图中可以将障碍物可表达为在特定时间段内阻挡道路的矩形。为避免碰撞,速度曲线不得与此矩形相交,使用优化引擎为该图选择最佳的速度曲线。优化算法通过复杂的数学运算来搜索,受到各种限制的低成本解决方案,这些限制可能包括:法律,速度、与障碍物的距离、汽车的性能等。

ST图
优化: 为了将离散解决方案转换为平滑轨迹,可使用“二次规划”技术。二次规划将平滑的非线性曲线与这些分段式线性段拟合。

Lattice规划
Lattice规划,通过使用Frenet坐标可以将环境投射到纵轴和横轴上,目标是生成三维轨迹: 纵向维度、横向维度、时间维度。在具体处理上,可以将三维问题分解成两个单独的二维问题,即轨迹的纵向分量(ST轨迹)和横向分量(SL轨迹)。

ST轨迹的终止状态有三种:

  • ** 巡航:** 巡航意味着车辆将在完成规划步骤后定速行驶,实际上在对图上的点进行采样,在图中横轴代表时间,纵轴代表速度。对于该图上的点,这意味着汽车将进入巡航状态,在时间 t 以 s 点的速度巡航,对于这种模式,所有最终状态的加速度均为零。

  • 巡航

  • ** 跟随: ** 在这种情况下要对位置和时间状态进行采样,并尝试在时间t出现在某辆车后面,在跟随车辆时,需要与前方的车保持安全距离,这时速度和加速度将取决于要跟随的车辆,这意味着在这种模式下,速度和加速度都会进行修正。

  • 跟随

  • ** 停止: ** 对于这种模式只需对汽车何时何地停止进行抽样,这里速度和加速度会被修正为0。

  • 停止

SL的终止状态:
无论车辆进入怎样的终止状态,车辆都应该稳定地与车道中心线对齐。因此只需要在小区域内,对横向终止位置进行采样。具体来说采样的是道路上相邻车道中心线周围的位置,为了确保稳定性。汽车驶向的终止状态应该与车道中心一致,在路径规划中,车辆的最终状态应与车道对齐并直线行驶而结束,即车的朝向和位置的一阶和二阶导数都应该为零。这意味着车辆既不是横向移动的那是一阶导数,也不是横向加速那是二阶导数,这意味着车辆正沿着车道直行。

拟合多项式与评估
如何连接初始状态和结束状态?

拟合多项式与评估

Cha7 控制

控制是驱使车辆前行的策略,对于汽车而言,最基本的控制输入为转向、加速、制动。控制器使用一系列路径点来接收轨迹,其目标是使用可行的控制输入,最大限度地降低与目标轨迹的偏差,最大限度地提高乘客的舒适度。可用于实现这些目标的三种控制策略比例积分微分控制(PID)、线性二次调节器(LQR)、模型预测控(MPC)。

PID
PID是一种线性控制算法,不适用于复杂系统,对无人驾驶车,需要应用不同的 PID 控制器来控制转向和加速,这意味着很难将横向和纵向控制结合起来。并且PID控制器依赖于实时误差测量,意味着受到测量延迟的限制。

LQR
LQR是基于模型的控制器,使用车辆状态来最小化误差。Apollo 使用 LQR 进行横向控制,横向控制包含四个参数:横向误差、横向误差的变化率、朝向误差、朝向的变化率。用集合x表示 ,x可捕获车辆的状态。车辆有三个控制输入:转向、加速、制动,用集合u表示。
x,u
在线性控制时,其控制器模型如下图。x_dot是导数或x向量的变化率。
linear Quadrator regulator
该等式是线性的,因为用△x来改变x时,并用△u来改变u,x点的变化也会让这个等式成立。
linear Quadrator regulator
控制的目标是为了让误差最小化同时尽可能少地使用控制输入,由于使用这些会有成本。为了尽量减少这些因素,可以保持误差的运行总和和控制输入的运行总和。当汽车往右偏转得特别厉害之际,添加到误差总和中,当控制输入将汽车往左侧转时,从控制输入总和中减去一点。然而这种方法会导致问题,因为右侧的正误差只需将左侧的负误差消除即可,对控制输入​​来说也是如此。相反可以让x乘以u,这样负值也会产生正平方,称这些为二次项。为这些项分配权重并将它们加在一起,最优的u应该加倍减总和,在数学中将这个值称为成本函数。经常写出加权二次项的总和,这里Q和R代表x和u的权重集合, X和Ut是转置矩阵,意味着它们几乎与x和u相同,只是重新排列 以便矩阵乘法。x乘以Xt,u乘以Ut,实质上是将每个矩阵乘以它自己。最小化成本函数是一个复杂的过程,但通常可以依靠数值计算器找到解决方案。在Apollo中,LQR控制器被表达为:u=-Kx。求解的目标就是找到一个最优的K。

成本函数

MPC
模型预测是一种复杂的控制器,最初用于工业领域。也是一种基于模型的控制器。MPC是一种多变量的控制算法,采用程序的内在动态模型,过去的控制信号,针对滚动预测域的最佳化成本函数J来计算最优化的控制信号。它由预测模型,反馈校正,滚动优化和参考轨迹四个部分组成。对于其预测能力,预测越深入,控制器就越精确,不过需要的时间也越长。所以需要在准确度与快速获取结果之间做出取舍,获取结果的速度越快,越能快速地将控制输入应用到实际车辆中。
微信截图_20200306105245.png
MPC优劣对比:MPC考虑了车辆模型,因此比PID控制更精确,也适用于不同的成本函数。另一方面与PID控制相比,模型预测控制相对更复杂、更缓慢、更难以实现。在实践中无人驾驶车的控制可扩展性的重要程度,通常意味着值得为MPC投入实现成本,所以MPC成为了一个非常重要的无人驾驶车控制器。