雷锋网按:从6月开始,新智驾联合雷锋网(公众号:雷锋网)· AI慕课学院、网易云课堂企业版举办了智能驾驶系列讲座,邀请业界、学界顶尖专家一起分享关于自动驾驶现在与未来的多样见解。
7月19日,“未来汽车大讲堂”邀请到 PerceptIn 联合创始人刘少山分享了主题为《详解无人驾驶技术架构》的课程。
雷锋网新智驾对课程内容进行了不改变原意的编辑,完整视频回放请前往AI慕课学院官网查看。
无人驾驶并不是单点的技术,而是多个技术的整合。
首先,来看看无人驾驶的整体技术架构,大概可以分为三大模块:算法、系统以及云平台。
在车辆端,上层是算法模块,包括传感(如何更好的获取环境数据)、感知(如何更好的理解车辆周围环境,包括定位,物体识别,物体追踪)以及决策(在了解环境后如何更好的做出决策,包括路径规划,行为预测和障碍物躲避等)三个部分;下层则是操作系统和硬件平台。
而在云端,则有一个无人驾驶的云平台,其上囊括了高精地图、模型训练、模拟计算以及数据存储等几块内容。
一、定位(Localization)
无人驾驶汽车行驶过程中最重要的是要知道自身处在什么位置上,只有这样才知道要怎么去往目的地。接下来将主要阐述目前应用比较多的定位技术。
1、定位技术:GPS
我们平常用的是多星GPS,可以接收伽利略或北斗的信号,做一个综合,然后得出一个相对精准的位置。但是多星GPS的定位精度大约能做到1-2米,这满足不了无人驾驶车道级定位的要求。
所以,后续,业内又开发出一种被称为RTK(Real-Time-Kinematic)的GPS,主要是依靠在地面布置基站,通过基站的信号去纠正卫星的信号,精度可以达到分米级别甚至更低。但缺点是需要布置基站,成本很高,还需要人维护。
接下来,又出现一种称为PPP(精密单点定位)的GPS技术,基于全球卫星的联网系统,通过互联网发布卫星的纠正信号,这项技术大概在2018年会在全球进行部署。其好处在于不需要布置基站,无论在哪,都能得到一个比较精准的位置。
GPS是一个比较好的定位导航工具,但是其更新率低是最大的问题。有的是1帧/秒的更新,有的是10帧/秒的更新,车辆高速行驶的状况下,这显然不够用。
所以,一般情况下,我们会把GPS和IMU惯导系统结合起来。惯导系统能提供快速更新——1000帧/秒,这弥补了GPS的更新率低的问题;而惯性导航所存在的“累计误差”问题,也可以通过GPS来弥补。
2、定位技术:激光雷达(LiDAR)和高精地图(HD Map)
激光雷达的好处是有一定的射程,能触及100-200米的距离,能很精准的得到空间中的点(3D点云)。将激光雷达的数据和高精地图的数据做一个匹配,可以将车辆定位上升到厘米级别。
但是激光雷达的成本高,而且是转动的形式,容易磨损,耐用性很差。
激光雷达很依赖另一个传感器——高精地图(传统意义上也不能称其为传感器),二者配合使用才能达到一个很好的定位效果。
具体到高精地图的制作上。
在高精地图的最底层,是一个网格地图,网格地图是使用激光雷达扫描回来的,精度可达5厘米;网格地图之上,我们会做道路的标签,也就是最底层的reference line;再加一些语义信息,精确到车道,标示出lanes;在车道之上,再做一些语义标签,比如限速、红绿灯这样的标志物。
高精地图制作起来非常昂贵,因为需要激光雷达设备不断去扫描外部环境,从而得到相关的数据来支撑其制作。
3、定位技术:视觉(Visual Odometry)
传统的做法是用双目进行视觉导航,方法如下:
左右两个图进来,首先做一个三角成像,就可以得出空间中深度点的信息,每一个特征点都有描述,然后再将前后两帧图像的特征点进行比对,得出其位移的信息,大概能定位到车辆移动的距离。
后续技术的发展,实现了单目视觉进行导航的功能,但是图像信息更新率有限——30-60帧/秒之间。所以,为了更快速得到信息更新,还是要将IMU加上,就产生了Visual inertial odometry技术,可以得到很精准的位置更新。
4、定位技术:轮速计
这个就非常简单了,因为轮子周长固定,可以通过圈速来进行距离的测算,但是这个方式的累计误差会比较大,所以也存在很大的问题。
5、定位技术:传感器融合
但在实际的实践中,只依赖一种定位技术或传感器,显然无法实现良好的效果。天气、光照、磁场等等,都会干扰这些定位传感器的正常使用。
真正的解决方案是传感器融合:
通过IMU和轮速计,得到车辆初始的位置,而GPS则可以不断纠偏,把错误率控制在一定的范围,比如GPS是厘米级的,那么精度就能保证在厘米级别,同时再加上激光雷达和高精地图的匹配,得出一个最终的很精准的位置。
这套架构是主流的无人驾驶公司都在使用的,比如斯坦福大学的无人车、CMU的无人车、谷歌的无人车以及百度的无人车,都是这样的一个架构。
二、感知(Perception)
感知就是理解环境,要做感知,需要的是一个数据集。在无人驾驶行业,有一套通用的数据集——KITTI数据集,里面有不同的数据,包括双目视觉的数据、定位导航的数据等。
1、感知:物体检测(Object Detection)
传统方法主要是针对固定物体的检测。一般的方法是HOG(Histogram of Oriented Gradien,方向梯度直方图),然后再加一个SVM的分类器。而对于动态物体的检测,主要使用的是DPM模型的方法,先把手和脚识别出来,再进行组合。
2、感知:场景(Segmentation)
人行道是一个场景,道路是一个场景,在场景中对不同的物体进行分类,是一个很重要的问题。
传统的方法是采用CRF(Conditional Random Field,条件随机场),基本原理在于图像都是由像素点组成的,若两个像素点都比较像车,那就把二者连接起来,形成对车辆的识别。
另外,就是我们所说的光流(Optical Flow),光流是针对2D图像来说的,如果说一个图片流到另外一个图片,都是2D的物体移动,那就用光流来做。如果是3D的物体流动,那我们就用场景流(Scene Flow),场景流在传统的方法就是使用的是SGBM,利用的是双目成像的技术,把左图和右图合起来提取出空间的点,用光流在上面做,就能把场景的流动分析出来。
3、感知:物体追踪(Object Tracking)
这也是无人驾驶中一个比较重要的技术。如何预测行人下一个动作、怎么去跟踪这个行人,也有一系列问题。里面用到的是马尔可夫链的解决方案,这个技术叫做MDP,跟踪一个人,随时跟踪其下一个动作,预测其下一个动作。
以上其实都是一些传统的感知方法,而这些年随着深度学习的不断进步,应用也非常广泛。
在物体识别方面,有两个非常有效的模型。
一个是Faster R-CNN,它会将兴趣点框出来,然后再进行物体识别,找到是不是你想要识别的物体;另一个是更为快速的SSD,也是将图中的物体识别出来。
而在场景分类方面,运用深度学习的方法则使用的是另一种模型,被称为PSPnet(语义分割)。这是金字塔型的场景分解模型,将一个场景不断地压缩,把类似的物体聚类,然后再做判断。
光流也可以利用深度学习的模型来做,把左右两图用同样的模型来提取特征,经过计算就能得出一个深度的信息。但是这个方式的计算量非常大。
三、决策和控制(Planning and Control)
这是一个最基本的决策和控制的架构,但这个部分其实是无人驾驶中最难的部分。
最上方的感知系统可以感知行人的位置、速度及态势,然后将这些信息传送给预测模块,预测行人是往前还是往后,速度多快。而下方的定位数据流进来之后,全局的路径规划模块就会将这些路径传入到最核心的控制决策模块——其中包括行为决策、动作决策和反馈控制。最后,这些信号会传送给CAN-BUS,由车辆来执行。
交通预测其实可以分成两个问题:一个是分类问题,另一个是回归的问题。
分类问题要了解的是行人到底是过马路还是不过马路,回归问题就更复杂一些,如果行人是过马路,那么针对其过马路的速度是多少,需要做一个预测。
路径规划也是比较有趣的,因为这对无人车来说是一个比较特殊的问题,因为对于普通的车辆来说,只要知道这是哪条路就行了,而不需要知道这是哪一条车道。
因为每条路都有不同的车道,那我们把车道标出不同的节点,不同的节点连接在一起,就变成了一条车道。通过某种方式(Dijkstra和A*)找到最短车道,就能得到最优解。
有了全局的路径规划以后,我们就需要进行行为决策。因为道路场景非常复杂,可以分成几十个不同的场景——左右车道、丁字路口等等,需要做场景组合决策。
然后是动作的规划,包括加速、减速、转向等等,速度规划主要使用了ST-graph工具来做,路径规划主要是动态编程来实现。
而最后的反馈控制则是由车厂来做,而且很多车厂采取的方案是不一样的。实现反馈控制的一般有双轮模型和PID控制模型,后者实现起来比较顺畅。
四、端系统(Client System)
任何一个复杂的系统都需要一个操作系统来辅助它实现功能,这样才不至于混乱。
如上图所示,在处理器(Processor)中,其实运行了上文所述的各类算法,包括感知、定位、全局路径规划等算法。然后再实现对车辆本身的控制,包括动作控制、方向控制。
首先我们需要一个操作系统来管理这么多复杂的工作,现在大部分厂家用的都是ROS——机器人操作系统,当然都做了一些个性化设计。这是一个信息传递的系统,可以通过点对点的传输形式或是广播的形式来做信号传输的动作。
ROS本身有很多问题:
-
单一主节点,很容易整体崩溃。(解决方案:可以用Zookeeper机制来做,设置多个主节点。)
-
通信非常低效。(解决方案:可以用共享内存的方法来做。)
-
不是很安全,比如开一个恶意节点不断去损耗资源,很容易造成整体系统的崩溃。(解决方案:这个问题可以使用Linux Container的技术来解决。)
硬件平台当然也是不可或缺的。其前端有很多传感器,信号传输进来后,有一个计算平台进行接收,处理完成后再通过CAN-BUS,把控制信号传给车辆控制系统。
以往很多时候,无人驾驶汽车上都放了两台计算机进行数据处理。这样带来的问题是功耗高,散热问题非常难以处理。未来,计算单元小型化会是很大的挑战。
刘少山介绍,他们曾经使用手机平台,实现了一些比较简单的无人驾驶功能,主要是用视觉来做。
五、云平台(Cloud Infrastructure)
如今,很多投资人都关注无人驾驶的终端,而对于云平台没有给予足够的重视,实际上这块内容是非常重要的。
无人驾驶车辆每秒最多可以产生2GB的裸数据,怎样利用这大量的数据去帮助无人驾驶做得更好,怎么样去搭建一个云平台去更好地服务无人驾驶的作业,这是个很大的挑战。
云平台底层就是存储和计算。我们有一个开源的项目叫做Alluxio,基本上就把磁盘存储给管理起来了,这是一个分布式的存储管理器;在其上,我们运用了异构计算,不同的作业依赖的处理器也不一样,所以会有GPU、CPU和FPGA;当然,为一个处理器写一套单独的程序,太复杂了,所以在其上统一搭载了OpenCL,对程序进行统一管理;分布式计算也需要一个管理平台,我们采用了Spark平台——比较通用、功能很多。再在这个平台上搭建高精地图、模拟计算和模型计算等作业。
在计算层面,我们运用了Apache Yarn这个分布式系统管理器通过Spark把作业分发下去,每个Spark的节点都有多个容器(Container),容器上会跑一些 OpenCL 的 Kernel,OpenCL 可以跑在 GPU 上,也可以跑在FPGA上。这个平台的可扩展性非常强,模型训练所需的时间会随着GPU数量的增加而线性减少。
在谈谈云平台的具体应用。
首先是模拟计算。比如你新开发了一个程序,想要试试新的算法是不是好用,但是不可能每次都实车验证,因为成本高,而且覆盖的场景很少。
所以一般采用的是模拟计算的方式:游戏平台和真实数据回放,更多是采用后者的形式。
这里有一个问题,单机回放必须要回放实际的数据,比如谷歌无人车累计有8年的数据,那就要计算8年,这显然不可取。
所以这里采用了Spark Driver的系统,可以并行处理,把作业分发下去,通过Linux pipe把每一个ROS Node节点打出来做一个回放,数据再回收到Spark Driver里去。只要给的节点够多,几十分钟就可以验证一套算法。
第二个是高精地图的制作。这是个很复杂的工作,首先是裸数据,然后从裸数据得出一个点云的数据,点云和点云之间要做一个对齐,对齐之后要把反射率的数据填到里面,然后再加一些语义的信息等。用分布式平台来做高精地图的生产,最大的计算量部分集中在点云的生产和对齐上,用异构计算可以很好地完成这些作业。
第三个是模型训练。这里采用的是分布式训练,其实百度很早就在用这种方式,用的是Paddle,将其连上Spark,把作业分发出去。这里面也用到了Alluxio分布式存储管理器。
【参考文献及资料】
2. Creating Autonomous Vehicle Systems [Summary]
3. Creating Autonomous Vehicle Systems [Book]
4. CAAD: Computer Architecture for Autonomous Driving
5. Implementing a Cloud Platform for Autonomous Driving
更多精彩课程还在持续更新中,请前往AI慕课官网了解详情。
。
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/113991.html