怎么让汽车自个跑起来

给文章取了个口语化的标题,怎么让汽车自个跑起来,其实我是想谈谈无人驾驶的那些事。第一次看到汽车这样一个庞然大物,在完全没有人为干预的情况下,自己动起来,完成路径规划,避障,超车,重规划等任务,到达指定目的地的时候,我有觉得无人驾驶是件非常炫酷的事。曾经有过一段时间参与到无人驾驶技术的研究和学习,我就把我对无人驾驶的一些浅薄见解做个分享罢,咱主要就聊聊无人车的核心系统架构。

无人驾驶系统的核心可以简单的概述为三个部分:感知,规划以及控制。感知主要是通过各类传感器获取环境信息,用于指导无人车行驶。规划则是利用感知到的环境信息,生成具体的车辆行驶决策,如速度,方向等。而控制就是对决策的执行。

怎么让汽车自个跑起来

 

1.感知

感知,即环境感知,就是无人车对环境的理解和把握。无人车通常是通过激光雷达,相机、毫米波雷达,以及GPS和惯导,来获取周围环境的大量信息,具体来说包括:障碍物的位置,速度以及可能的行为,可行驶的区域,交通规则等等。下图是网上找的一张各类传感器的示意图,与大部分无人车的传感器安装位置基本相符。

怎么让汽车自个跑起来

 

1.1 激光雷达

车辆正中间顶上那个圆柱体就是无人车最重要的一个传感器:激光雷达。之所以说它最重要,是因为无人车的环境感知主要是依靠它,相比其他传感器,它能从环境从获取的信息也最多。激光雷达是以发射激光束探测目标位置的雷达系统,具有探测范围广,精度高等特点,但这玩意是通过发射光束进行探测,因此易受环境的影响,你往它身前一站,你身后的环境它就没法感知了,因此在雨雪雾霾天,沙尘暴等恶劣天气下没法正常工作,因此,我们在做军用无人车研究时,战场环境下,烟雾路段通行时,就没法依靠激光雷达了,得靠毫米波雷达,这个后文再说。激光雷达分单线和多线,所谓单线激光雷达,就是只具备一个激光发射器和接收器,经过电极的旋转,投射到前面障碍物是一条线,只能检测同一个高度的障碍物,不能测量整体轮廓,单线激光雷达多应用于扫地机器人。而多线激光雷达就是在垂直方向上具有多个发射器和接收器,可以计算物体的高度信息,并对周围坏境进行3D建模。由于激光雷达可以获取物体的高度信息,所以在检测高低障碍时优势明显,如图路边的树枝,高阶马路牙子,包括行人,车辆的检测都非常靠谱,没它,无人车,动起来很难。单靠车顶一个激光雷达是会存在盲区的,比如车身左右车门位置,以及前后保险杠位置,都是车顶激光雷达无法感知到的区域,通常的做法是在汽车B柱车顶位置,左右各安装一个16线的激光雷达,用来检测左右盲区,车前安装一个4线激光雷达,检测前保险杠位置盲区,这样才能做到眼观六路,耳听八方。

前些年,雷达的价格非常昂贵,也是整车最贵的一类传感器,但也是无人驾驶必备的传感器,无人车车顶一般会安装一个64线的激光雷达,市售价需要60多万,其高昂的价格,束缚了自动驾驶的实现和量产。但是近两年,随着博世、华为、大疆等巨头的入场,将激光雷达推向更低的价格和车规级,可以预见的是,必然会加速自动驾驶的发展。

1.2 相机

因为激光雷达的高昂成本,有公司试图通过计算机视觉来完成无人车的环境感知任务,但要达到L3级别的自动驾驶,不用激光雷达几乎不可能。单靠激光雷达来做环境感知也不太靠谱,需要利用视觉系统来对激光雷达感知做更好的补充。无人驾驶一般会装载多个相机,可见光相机200万像素和500万像素各一个,以及一个红外相机,相机的安装位置通常在车顶激光雷达的下方,该位置视野广,不易受遮挡。通常来说,200万像素的相机用来检测车道线和道边,使得车辆能够在规定区域内行驶,同时在红绿灯路口,需要检测出停止线,遇到红灯在停止线之前对车辆进行制动。500万像素的相机主要用作交通信号灯和交通标识的检测,因为这类目标往往较小,在更高像素的图片下识别效果会更好。对于可见光相机,有个比较明显的缺陷需要指出,它超级容易受天气环境的影响,顺光、逆光条件下的成像效果也会有很大的差异,这对我们的检测算法就要有更高的要求,如果在夜晚……依靠视觉做目标识别也不是完全做不到,只是相对稍难些。

要逃脱光照因素的影响,红外相机就要出场啦。红外相机是通过温差成像的,所以即使是在夜晚,也能有检测效果,但我们更多会用它来做水坑检测,之前做实验,还特意挖坑放水来试试它的检测效果。另外红外相机也会用来做车前的障碍物检测,虽然它检测出的障碍物,一般在最终决策的时候权重都较低,但有种场景下会很依赖它,那就是烟雾路段,沙尘暴等恶劣天气下的通行,此时激光雷达,可见光相机都没法正常工作。

1.3 毫米波雷达

无人车通常会在车前保险杠的位置安装一个毫米波雷达,所谓的毫米波雷达,就是指工作频段在毫米波频段的雷达,测距原理跟一般雷达一样,也就是把无线电波(雷达波)发出去,然后接收回波,根据收发之间的时间差测得目标的位置数据。毫米波一般会用来检测动障碍,即运动着的障碍物,根据多普勒效应,毫米波雷达的频率变化,与本车及跟踪目标的相对速度是紧密相关的,根据反射回来的毫米波频率的变化,可以得知前方实时跟踪的障碍物目标和本车相比的相对运动速度。因此,在做超车动作时,可通过毫米波测算前车的速度,来规划本车速度来达到超车的目的。

此外,前面也有提到,在烟雾路通行时,会利用毫米波雷达检测障碍,是因为毫米波穿透雾,烟,灰尘的能力强,在肉眼不可见的情况下,它自岿然不动。

1.4 GPS和惯导

在无人车感知层面,定位的重要性不言而喻,无人车需要知道自己相对于环境的一个确切位置,这里的定位不能存在超过10cm的误差,试想一下,如果我们的无人车定位误差在30厘米,那么这将是一辆非常危险的无人车(无论是对行人还是乘客而言),因为无人驾驶的规划和控制层并不知道它存在30厘米的误差,它们仍然按照定位精准的前提来做出决策和控制,那么对某些情况作出的决策就是错的,从而造成事故。

目前使用最广泛的无人车定位方法当属融合全球定位系统(Global Positioning System,GPS)和惯性导航系统(Inertial Navigation System)定位方法,其中,GPS的定位精度在数十米到厘米级别之间,我们对经纬度的数值取值一般会达到小数点后11位,高精度的GPS传感器价格也会相对昂贵。在地下停车场,或者周围均为高楼的市区等环境,容易产生GPS信号丢失的情况,这个时候惯性导航能在一定行驶范围内保持定位精度,但如果车辆在长距离接受不到GPS信号灯的情况下,车辆就很容易出现定位失误了。

要达到一个厘米级别的定位精度,需要在车辆行驶的百公里范围内架设基准站(当然可能不同的产品距离远近可能不一样,不太了解),基站需要选择不受遮挡的高建筑物屋顶。GPS接收器也会选择一个不易受遮挡的位置,如车顶或者后备箱车盖位置,惯导通常会尽可能安装整个车身的中心位置(比如后排座位下面),因为我们所有的感知模块所获得的环境信息,都会转换到同一个坐标系下,需要以惯导的安装位置为坐标原点,车辆中心点的位置最佳。

以上介绍了感知模块用到的主要传感器,下面就简要介绍下一些会用到的感知算法。

1.5 感知算法

我们都知道图片的基本单位是像素,而激光雷达的感知信息叫点云。通过激光雷达做环境感知,主要是对点云数据做分割和聚类两个重要操作,当然另外还有一些操作,如切片、过滤等,主要是用来去除部分无用点云数据。点云分割的目的在于将不同的物体进行区域切分,即分理处哪些是路面、哪些是不可碰撞的物体,以便于下一步的点云聚类。点云分割后,无论是障碍物还是路面,或者其他环境信息,点云数据依旧是离散的点。而点云聚类就是把除地面外的不同物体的点云分别组合聚集起来,形成多个点集,那么每一个点集就可以代表一个障碍物以及它的大小范围。(需要注意的是,点云聚类需要在点云分割的基础上得到,否者执行点云聚类算法时会因为地面的点云,将所有点云连接起来变成一个点集。)

点云的分割算法,在无人驾驶场景下,就我所知道的,有个基于点云位置的点云数据分割算法,这类分割算法特点在于直接对点云图中数据点进行计算分析,代表性算法如RANSAC算法(Random Sample Consensus随机样本一致性),是一种检测数据中异常值的方法(对于地面点云,障碍物点云即为异常值)。在用于点云分割时,需要制定点云的分割特征,例如自动驾驶中属于地面的点云,在车体周围,属于道路的点云将近似构成一个平面,那么点云的分割特征为水平面。RANSAC算法核心点在于:在这个点云集中,道路上的点云中任选3点即可确定一个平面的数学模型,所有在这个平面模型一定误差范围内的点云都属于道路的一部分,其余点云则属于障碍物,在PCL库中有该算法的实现。

点云聚类算法,对于聚类算法,我们首先想到可能是K-Means算法,但该算法需要事先确定聚类个数而且对孤立点和噪声点相对敏感,在无人驾驶领域实现不是很现实。我们可能会用到DBSCAN算法,DBSCAN算法是一种基于密度的空间聚类算法,与K-Means算法不同,它不需要确定聚类的数量,而是基于数据推测聚类的数目,它能够针对任意形状产生聚类。 该算法将具有足够密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合。

再聊聊计算机视觉相关的算法,那就有得说了,随着深度学习的大火,这几年,应该是两三年前,计算机视觉相关的论文可以说是达到井喷的状态,从以RCNN为代表的基于Region Proposal的深度学习目标检测算法(RCNN,SPP-NET,Fast-RCNN,Faster-RCNN等),到以YOLO为代表的基于回归方法的深度学习目标检测算法(YOLO,SSD等),其实计算机视觉已经达到相对成熟的地步,我们的车辆也有试着用yolov3做目标识别,效果还行。但由于受硬件条件限制,仍旧多采用传统模式识别的算法较多,如模板匹配等等。

另外,地图辅助类定位算法也是广泛使用的一个无人车定位算法,同步定位与地图构建(Simultaneous Localization And Mapping,SLAM)是这类算法的代表,SLAM的目标即构建地图的同时使用该地图进行定位,SLAM通过利用已经观测到的环境特征确定当前车辆的位置已经当前观测特征的位置。SLAM虽然是机器人定位领域的研究热点,但是在实际无人车开发过程中使用SLAM定位却存在问题,不同于机器人,无人车的运动是长距离的,大开放环境的。在长距离的运动中,随着距离的增大,SLAM定位的偏差也会逐渐增大,从而造成定位失败。在实践中,一种有效的无人车定位方法是改变原来SLAM中的扫描匹配类算法,具体来说,我们不再在定位的同时制图,而是事先使用传感器如激光雷达对区域构建点云地图,通过程序和人工的处理将一部分“语义”添加到地图中(例如车道线的具体标注,路网,红绿灯的位置,当前路段的交通规则等等),这个包含了语义的地图就是我们无人驾驶车的高精度地图(HD Map)。在实际定位的时候,使用当前激光雷达的扫描和事先构建的高精度地图进行点云匹配,确定我们的无人车在地图中的具体位置。

好,到这咱们的感知模块基本算是唠完了,下面再说说规划模块

2. 融合模块

其实在感知和规划模块中间还有一个非常重要的模块,那就是融合模块,这个模块的作用主要是把多个传感器的感知结果做个融合汇总。有两个要做的事情得先处理好,坐标对齐和时间对齐,首先要保证每个感知模块的结果是在同一坐标系下,如果不在同一坐标系下就需要做坐标转换。然后就是感知结果必须是同一时刻,这个通常做法是,每个感知模块都会接受惯导发过来的惯导号,当各模块感知结果的惯导号相同时,我们就认为它们是同一时刻的感知结果。把坐标和时间对齐之后,就会有另外两件事要做,一是帧间融合,比如道边检测,激光雷达说道边在A位置,而可见光检测是在B位置,这个时候红外还冒出来,你们说的都不对,应该在C位置,这时候融合模块就得根据具体场景采取不同的融合策略。另外一件事是多帧融合,所谓多帧融合,就是感知模块这一帧传过来的数据说前面有障碍,下一帧又没有了,下下帧又有了,这一会有一会没有也是不行的,那样车会行驶得一顿一顿的,所以要做个多帧融合的处理,做障碍保持,或者噪声过滤等。

3. 规划

我们的规划会有全局规划和局部规划两个模块,全局规划就是利用地图信息,找出一条从起点到终点,经过必经点的最佳路径,它为局部规划做导引。而局部规划则是根据当前位置,利用感知模块的感知信息生成当前条件下的行驶决策,如需不需要避障,需不需要超车等等。

3.1 局部规划

局部规划会接受融合模块的感知信息,一般会是一个栅格图,或者可以理解为一个坐标系,无人车作为这坐标系的原点,在各个象限内会有标识各种环境信息,障碍物,道边,车道线,另外还有交通规则等等。然后局部规划生成出一条车辆可以行驶的轨迹线,它包括一系列的轨迹点,车辆的航向角,车辆的建议行驶速度等。车辆的行驶轨迹线算法可以简单说成是取道边中点,或者车道线中点,这样避障问题也可以转换成一个归边的问题,只需根据障碍物的位置,调整道边的位置,就能达到调整车辆的行驶轨迹线的目的。轨迹线是由点构成,所以在由点拟合成线的时候要尽可能平滑,还要考虑当前车速,车辆能够接受的最大转向角等等多方面因素。当然规划算法远不止如此,我也就对我所了解的一个非常简单的算法在谈,关于无人驾驶运动规划的算法研究不胜枚举。

3.2全局规划

我们一般称全局规划为地图模块,直白一点说,就是你告诉无人车你要从哪到哪,然后它就根据地图信息,规划出一条可以行驶的最优路径,先走芳村大道,然后再过珠江隧道……其实关于全局规划,有个比较有意思的算法可以说一下:蚁群算法。说是跟蚂蚁找食物有点类似的一个算法,蚂蚁在行走时会释放一种称为“信息素”的物质,用来标识自己的行走路径。在寻找食物的过程中,根据信息素的浓度选择行走的方向,并最终到达食物所在的地方。信息素会随着时间的推移而逐渐挥发。在一开始的时候,由于地面上没有信息素,因此蚂蚁们的行走路径是随机的。蚂蚁们在行走的过程中会不断释放信息素,标识自己的行走路径。随着时间的推移,有若干只蚂蚁找到了食物,此时便存在若干条从洞穴到食物的路径。由于蚂蚁的行为轨迹是随机分布的,因此在单位时间内,短路径上的蚂蚁数量比长路径上的蚂蚁数量要多,从而蚂蚁留下的信息素浓度也就越高,这为后面的蚂蚁们提供了强有力的方向指引,越来越多的蚂蚁聚集到最短的路径上去。无人车的全局规划就会用到这个算法,但我不是很了解,哪天有时间可以查查相关文献资料。

4.控制

通过前面的感知,融合,规划等步骤之后,咱终于有了一个指导无人车行进的决策,这个时候就要把决策交由我们的控制模块,让车辆按照指令动起来。无人车的控制系统基本都是采用线控的方式,线控底盘是无人车的基础,专业术语来说就是将经由交互后的操控信号,通过传感器采集变成电信号后,进行控制处理来控制目标机构。简单可以理解为可以使用编程技术来控制车辆底盘。线控底盘最重要是线控刹车, 线控油门, 线控转向,线控档位4个部分,另外还会有灯光,喇叭等等的指控。之前在长沙在做实验的时候,发现百度大多改装林肯的汽车作为无人车,一打听说是林肯mkz能更好的支持上面所说的线控技术。

5.其他

到这,只要车辆有油,车就能自动跑起来了,但其实另外有个极其重要的模块没说到,那就是通信模块,我们所有模块之间的信息交互,必然离不开通信,如果车辆计算机采用的是ROS系统的话,也就不需要自己写通信模块了,因为ROS系统自身就提供节点间的通信功能。还有就是无人车一般有一个监视仿真系统,便于监控各个模块的运行状态,能更好的进行实验。另外无人车内的计算机要具备稳定性,各种接线口不会因为车辆颠簸而造成松动,既要具备通风散热的条件,也得避免当出现交通事故时受到撞击。所有传感器的安装也是如此,既要保证其所感知的区域不受遮挡,也要避免受到撞击。

怎么让汽车自个跑起来

 

最后放上两张无人车的图片,科技改变未来,我相信未来是一个很有意思的世界。

作者:陈淅灿