竹笋

首页 » 问答 » 环境 » 如果无人驾驶是未来,程序员该如何入门
TUhjnbcbe - 2022/7/7 16:34:00
郑华国 https://yiyuan.99.com.cn/bjzkbdfyy/yyzj/260588.html
作者|刘少山  

    编辑|小智  

戳阅读原文,收藏直播间地址注册,不错过每一次直播!

    许多技术方向的同学对人工智能既爱又畏惧,一方面觉得这是未来,另一方面又觉得很难而不敢触碰。懂工程的同学做算法时有很大的畏惧感,而专注算法的同学又常常容易陷入某个算法而缺乏工程落地能力。这次我以一个从业者角度来与大家聊一下如何入门无人驾驶/机器人行业,在实战中成长为算法,工程,产品贯通的AI全栈人才。  

注:封面配图为小Q座驾实拍图。

    为什么需要无人驾驶?  

首先我们探讨下无人驾驶能如何提高人类社会的效率。

第一是无人驾驶对环境的影响:每辆传统车每年平均排放5吨二氧化碳,以美国为例有2.5亿台车,每年二氧化碳排放就有12.5亿吨。而如果使用中央调度的无人新能源车,那么总排放量可以被降低到0.6亿吨,效果十分惊人。然后我们看看无人驾驶对安全的影响:人类驾驶员每驾驶万英里的里程,平均会发生4.2次意外,会产生大概万次车祸。如果我们能把无人驾驶每万英里的车祸率控制在1以内,那么总车祸数会被控制在万左右。现在每年全球车祸死亡人数超过百万,所以无人驾驶的普及可以每年在全球挽救几十万甚至上百万的生命。

最后我们了解下无人驾驶对经济的影响:由于减少碳排放,无人驾驶普及可以每年可减少0亿美金的经济损失。另外,每次车祸带来的经济损失平均为0美金,那么如果无人驾驶到达每万英里的车祸率控制在1以内的安全目标,每年也可以减少0亿美金的经济损失。两者相加,无人驾驶普及后每年至少可以减少亿美金的经济损失,这基本相当于瑞士的GDP,如果按全球国家GDP排行榜算可以排进前20左右。

    无人驾驶技术  

无人驾驶并不是单点的技术,而是多个技术的整合。无人驾驶的整体技术架构,大概可以分为三大模块:算法、系统以及云平台。

在车辆端,上层是算法模块,包括传感(如何更好的获取环境数据)、感知(如何更好的理解车辆周围环境,包括定位,物体识别,物体追踪)以及决策(在了解环境后如何更好的做出决策,包括路径规划,行为预测和障碍物躲避等)三个部分;下层则是操作系统和硬件平台。而在云端,则有一个无人驾驶的云平台,其上囊括了高精地图、模型训练、模拟计算以及数据存储等几块内容。

    一、定位(Localization)  

无人驾驶汽车行驶过程中最重要的是要知道自身处在什么位置上,只有这样才知道要怎么去往目的地。

    定位技术:GPS  

我们平常用的是多星GPS,可以接收伽利略或北斗的信号,做一个综合,然后得出一个相对精准的位置。但是多星GPS的定位精度大约能做到1-2米,这满足不了无人驾驶车道级定位的要求。所以,后续业内又开发出一种被称为RTK(Real-Time-Kinematic)的GPS,主要是依靠在地面布置基站,通过基站的信号去纠正卫星的信号,精度可以达到分米级别甚至更低。但缺点是需要布置基站,成本很高,还需要人维护。接下来,又出现一种称为PPP(精密单点定位)的GPS技术,基于全球卫星的联网系统,通过互联网发布卫星的纠正信号,这项技术大概在年会在全球进行部署。其好处在于不需要布置基站,无论在哪,都能得到一个比较精准的位置。

GPS是一个比较好的定位导航工具,但是更新率低是最大的问题。有的是1帧/秒的更新,有的是10帧/秒的更新,车辆高速行驶的状况下,这显然不够用。所以,一般情况下,我们会把GPS和IMU惯导系统结合起来。惯导系统能提供快速更新——0帧/秒,这弥补了GPS的更新率低的问题;而惯性导航所存在的“累计误差”问题,也可以通过GPS来弥补。

    2、定位技术:激光雷达(LiDAR)和高精地图(HDMap)  

激光雷达的好处是有一定的射程,能触及-米的距离,能很精准的得到空间中的点(3D点云)。将激光雷达的数据和高精地图的数据做一个匹配,可以将车辆定位上升到厘米级别。

但是激光雷达的成本高,而且是转动的形式,容易磨损,耐用性差。激光雷达很依赖另一个传感器——高精地图(传统意义上也不能称其为传感器),二者配合使用才能达到一个很好的定位效果。

具体到高精地图的制作上。在高精地图的最底层,是一个网格地图,网格地图是使用激光雷达扫描回来的,精度可达5厘米;网格地图之上,我们会做道路的标签,也就是最底层的referenceline;再加一些语义信息,精确到车道,标示出lanes;在车道之上,再做一些语义标签,比如限速、红绿灯这样的标志物。高精地图制作起来非常昂贵,因为需要激光雷达设备不断去扫描外部环境,从而得到相关的数据来支撑其制作。

    3、定位技术:视觉(VisualOdometry)  

传统的做法是用双目进行视觉导航,方法如下:左右两个图进来,首先做一个三角成像,就可以得出空间中深度点的信息,每一个特征点都有描述,然后再将前后两帧图像的特征点进行比对,得出其位移的信息,大概能定位到车辆移动的距离。后续技术的发展,实现了单目视觉进行导航的功能,但是图像信息更新率有限——30-60帧/秒之间。所以,为了更快速得到信息更新,还是要将IMU加上,就产生了Visualinertialodometry技术,可以得到很精准的位置更新。

    4、定位技术:轮速计  

这个就相对简单了,因为轮子周长固定,可以通过圈速来进行距离的测算,但是这个方式的累计误差会比较大,所以也存在很大的问题。

    5、定位技术:传感器融合  

但在实际的实践中,只依赖一种定位技术或传感器,显然无法实现良好的效果。天气、光照、磁场等等,都会干扰这些定位传感器的正常使用。

真正的解决方案是传感器融合:

通过IMU和轮速计,得到车辆初始的位置,而GPS则可以不断纠偏,把错误率控制在一定的范围,比如GPS是厘米级的,那么精度就能保证在厘米级别,同时再加上激光雷达和高精地图的匹配,得出一个最终的很精准的位置。

    二、感知(Perception)  

感知就是理解环境,要做感知,需要的是一个数据集。在无人驾驶行业,有一套通用的数据集——KITTI数据集,里面有不同的数据,包括双目视觉的数据、定位导航的数据等。

1、感知:物体检测(ObjectDetection)

传统方法主要是针对固定物体的检测。一般的方法是HOG(方向梯度直方图),然后再加一个SVM的分类器。而对于动态物体的检测,主要使用的是DPM模型的方法,先把手和脚识别出来,再进行组合。

2、感知:场景(Segmentation)

人行道是一个场景,道路是一个场景,在场景中对不同的物体进行分类,是一个很重要的问题。传统的方法是采用CRF(条件随机场),基本原理在于图像都是由像素点组成的,若两个像素点都比较像车,那就把二者连接起来,形成对车辆的识别。

另外,就是我们所说的光流(OpticalFlow),光流是针对2D图像来说的,如果说一个图片流到另外一个图片,都是2D的物体移动,那就用光流来做。如果是3D的物体流动,那我们就用场景流(SceneFlow),场景流在传统的方法就是使用的是SGBM,利用的是双目成像的技术,把左图和右图合起来提取出空间的点,用光流在上面做,就能把场景的流动分析出来。

3、感知:物体追踪(ObjectTracking)

这也是无人驾驶中一个比较重要的技术。如何预测行人下一个动作、怎么去跟踪这个行人,也有一系列问题。里面用到的是马尔可夫链的解决方案,这个技术叫做MDP,跟踪一个人,随时跟踪其下一个动作,预测其下一个动作。以上其实都是一些传统的感知方法,而这些年随着深度学习的不断进步,应用也非常广泛。

在物体识别方面,有两个非常有效的模型。

一个是FasterR-CNN,它会将兴趣点框出来,然后再进行物体识别,找到是不是你想要识别的物体;另一个是更为快速的SSD,也是将图中的物体识别出来。

而在场景分类方面,运用深度学习的方法则使用的是另一种模型,被称为PSPnet(语义分割)。这是金字塔型的场景分解模型,将一个场景不断地压缩,把类似的物体聚类,然后再做判断。

光流也可以利用深度学习的模型来做,把左右两图用同样的模型来提取特征,经过计算就能得出一个深度的信息。但是这个方式的计算量非常大。

    三、决策和控制(PlanningandControl)  

这是一个最基本的决策和控制的架构,但这个部分其实是无人驾驶中最难的部分。

最上方的感知系统可以感知行人的位置、速度及态势,然后将这些信息传送给预测模块,预测行人是往前还是往后,速度多快。而下方的定位数据流进来之后,全局的路径规划模块就会将这些路径传入到最核心的控制决策模块——其中包括行为决策、动作决策和反馈控制。最后,这些信号会传送给CAN-BUS,由车辆来执行。

交通预测其实可以分成两个问题:一个是分类问题,另一个是回归的问题。分类问题要了解的是行人到底是过马路还是不过马路,回归问题就更复杂一些,如果行人是过马路,那么针对其过马路的速度是多少,需要做一个预测。路径规划也是比较有趣的,因为这对无人车来说是一个比较特殊的问题,因为对于普通的车辆来说,只要知道这是哪条路就行了,而不需要知道这是哪一条车道。

因为每条路都有不同的车道,那我们把车道标出不同的节点,不同的节点连接在一起,就变成了一条车道。通过某种方式(Dijkstra和A*)找到最短车道,就能得到最优解。

有了全局的路径规划以后,我们就需要进行行为决策。因为道路场景非常复杂,可以分成几十个不同的场景——左右车道、丁字路口等等,需要做场景组合决策。

然后是动作的规划,包括加速、减速、转向等等,速度规划主要使用了ST-graph工具来做,路径规划主要是动态编程来实现。

而最后的反馈控制则是由车厂来做,而且很多车厂采取的方案是不一样的。实现反馈控制的一般有双轮模型和PID控制模型,后者实现起来比较顺畅。

    四、端系统(ClientSystem)  

任何一个复杂的系统都需要一个操作系统来辅助它实现功能,这样才不至于混乱。

如上图所示,在处理器中,其实运行了上文所述的各类算法,包括感知、定位、全局路径规划等算法。然后再实现对车辆本身的控制,包括动作控制、方向控制。

首先我们需要一个操作系统来管理这么多复杂的工作,现在大部分厂家用的都是ROS——机器人操作系统,当然都做了一些个性化设计。这是一个信息传递的系统,可以通过点对点的传输形式或是广播的形式来做信号传输的动作。

ROS本身有很多问题:

单一主节点,很容易整体崩溃。(解决方案:可以用Zookeeper机制来做,设置多个主节点。)通信非常低效。(解决方案:可以用共享内存的方法来做。)不是很安全,比如开一个恶意节点不断去损耗资源,很容易造成整体系统的崩溃。(解决方案:这个问题可以使用LinuxContainer的技术来解决。)硬件平台当然也是不可或缺的。其前端有很多传感器,信号传输进来后,有一个计算平台进行接收,处理完成后再通过CAN-BUS,把控制信号传给车辆控制系统。

以往很多时候,无人驾驶汽车上都放了两台计算机进行数据处理。这样带来的问题是功耗高,散热问题非常难以处理。未来,计算单元小型化会是很大的挑战。

一年前我们探索过一个好玩的课题,如果用一个手机平台,是否可以支撑起无人驾驶的作业?于是我们使用手机平台,实现了一些比较简单的无人驾驶功能,主要是用视觉来做。下图显示了一个面向基于视觉的无人驾驶驾驶的移动SoC系统组成。在这个移动SoC实现中,我们利用DSP处理传感器数据,如特征提取和光流;我们使用GPU完成深度学习任务,如目标识别;采用两个CPU线程完成定位任务以实现车辆实时定位;我们使用一个CPU线程实现实时路径规划;使用另一个CPU线程进行避障操作。如果CPU尚未被全占有,多个CPU线程则可以在同一CPU核心上运行。

令人惊讶的是,实验数据证明,无人驾驶系统在ARMSOC上运行的性能并不差。定位流水线每秒可处理25帧图像,图像生成速度为每秒30帧图像,这说明产生的图像大部分可以得到及时处理,不会产生大规模的丢帧。深度学习流水线每秒能够执行2到3个目标识别任务。规划和控制流水线目标是在6MS内完成路径规划。当使用ARM移动端SOC进行无人驾驶时,我们能够以5英里/小时的速度行驶车辆,并且不损失任何定位信息;同时,整个SOC平均功耗为11瓦。

移动SoC的硬件资源有限,能够支持有限范围内的无人驾驶系统确实是非常令人惊喜的发现。这说明如果增加更多的计算资源,硬件平台就能够处理更多的数据,并支持车辆以更快的速度行驶,最终满足产品级无人驾驶系统的需要。

    五、云平台(CloudInfrastructure)  

如今,很多人都

1
查看完整版本: 如果无人驾驶是未来,程序员该如何入门