1. 首页
  2. 自习室
  3. PerceptIn刘少山:无人驾驶学习路线

PerceptIn刘少山:无人驾驶学习路线

 

PerceptIn 成立了一年多了,一直专注于打磨机器人与无人驾驶核心技术,但是一个技术,特别是一个新兴技术,落地为产品需要大量算法,工程,产品贯通的 AI 全栈人才。

最近一年招聘中发现,许多技术方向的同学对人工智能既爱又畏惧,一方面觉得这是未来,另一方面又觉得很难而不敢触碰。懂工程的同学做算法时有很大的畏惧感,而专注算法的同学又常常容易陷入某个算法而缺乏工程落地能力。

这次我以一个从业者角度来与大家聊一下如何入门无人驾驶/机器人行业,也希望大家多了解 PerceptIn,加入 PerceptIn 大家庭,在实战中成长为算法,工程,产品贯通的 AI 全栈人才。

为什么需要无人驾驶?

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

第一是无人驾驶对环境的影响:每辆传统车每年平均排放 5 吨的二氧化碳,以美国为例有 2.5 亿台车,每年二氧化碳排放就有 12.5 亿吨。而如果使用中央调度的无人驾驶新能源车,那么总排放量可以被降低到 0.6 亿吨,效果十分惊人。

然后我们看看无人驾驶对安全的影响:人类驾驶员每驾驶 100 万英里的里程,平均会发生 4.2 次意外,全球每年会产生大约 1300 万次事故。如果我们能把无人驾驶每 100 万英里的事故率控制在 1 次以内,那么总事故数会被控制在 300 万左右。现在每年全球车祸死亡人数超过百万,所以无人驾驶的普及可以每年在全球挽救几十万甚至上百万的生命。

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

无人驾驶技术

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

在车辆端,上层是算法模块,包括三个部分:

传感:如何更好的获取环境数据;
感知:如何更好的理解车辆周围环境,包括定位,物体识别,物体追踪;
决策:在了解环境后如何更好的做出决策,包括路径规划,行为预测和障碍物躲避等;

下层则是操作系统和硬件平台。而在云端,则有一个无人驾驶的云平台,其上包括了高精地图、模型训练、模拟计算以及数据存储等几块内容。

一. 定位(Localization)

无人驾驶汽车行驶过程中最重要的是要知道自身处在什么位置上,只有这样才知道要怎么去往目的地。接下来将主要阐述目前应用比较多的定位技术。

  1. 定位技术:GPS

    我们平常用的是多星 GPS,可以接收伽利略或北斗的信号,做一个综合,然后得出一个相对精准的位置。但是多星 GPS 的定位精度大约能做到 1-2 米,这满足不了无人驾驶车道级定位的要求。

所以,后续,业内又开发出一种被称为 RTK(Real-Time-Kinematic)的 GPS,主要是依靠在地面布置基站,通过基站的信号去纠正卫星的信号,精度可以达到分米级别甚至更高。但缺点是需要布置基站,成本很高,还需要人维护。

接下来,又出现一种称为 PPP(精密单点定位)的 GPS 技术,基于全球卫星的联网系统,通过互联网发布卫星的纠正信号,这项技术大概在 2018 年会在全球进行部署。其好处在于不需要布置基站,无论在哪,都能得到一个比较精准的位置。

GPS 是一个比较好的定位导航工具,但是其更新率低是最大的问题。有的是 1 帧/秒的更新,有的是 10 帧/秒的更新,车辆高速行驶的状况下,这显然不够用。所以,一般情况下,我们会把 GPS 和 IMU 惯导系统结合起来。

惯导系统能提供快速更新——1000 帧/秒,这弥补了 GPS 更新率低的问题;而惯性导航所存在的「累计误差」问题,也可以通过 GPS 来弥补。

  1. 定位技术:激光雷达(LiDAR)和高精地图(HD Map)

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

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

具体到高精地图的制作上:
在高精地图的最底层,是一个网格地图,网格地图是使用激光雷达扫描回来的,精度可达 5 厘米;
网格地图之上,我们会做道路的标签,也就是最底层的 reference line;再加一些语义信息,精确到车道,标示出 lanes;
在车道之上,再做一些语义标签,比如限速、红绿灯这样的标志物。

高精地图制作起来非常昂贵,因为需要激光雷达设备不断去扫描外部环境,从而得到相关的数据来支撑其制作。

  1. 定位技术:视觉(Visual Odometry)

    传统的做法是用双目进行视觉导航,方法如下:

左右两个图进来,首先做一个三角成像,就可以得出空间中深度点的信息;
每一个特征点都有描述,然后再将前后两帧图像的特征点进行比对,得出其位移的信息,大概能定位到车辆移动的距离。

后续技术的发展,实现了单目视觉进行导航的功能,但是图像信息更新率有限——30-60 帧/秒之间。所以,为了更快速得到信息更新,还是要将 IMU 加上,就产生了 Visual inertial odometry 技术,可以得到很精准的位置更新。

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

  1. 定位技术:传感器融合

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

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

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

二. 感知(Perception)

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

1. 感知:物体检测(Object Detection)

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

  1. 感知:场景(Segmentation)

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

    另外,就是我们所说的光流(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)

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

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

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

ROS 本身有很多问题:

单一主节点,很容易整体崩溃(解决方案:可以用 Zookeeper 机制来做,设置多个主节点);
通信非常低效(解决方案:可以用共享内存的方法来做);
不是很安全,比如开一个恶意节点不断去损耗资源,很容易造成整体系统的崩溃(解决方案:这个问题可以使用 Linux Container 的技术来解决)

硬件平台当然也是不可或缺的。其前端有很多传感器,信号传输进来后,有一个计算平台进行接收,处理完成后再通过 CAN-BUS,把控制信号传给车辆控制系统。

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

一年前我们探索过一个好玩的课题,如果用一个手机平台,是否可以支撑起无人驾驶的作业?于是我们使用手机平台,实现了一些比较简单的无人驾驶功能,主要是用视觉来做。上图显示了一个面向基于视觉的无人驾驶驾驶的移动 SoC 系统组成。在这个移动 SoC 实现中:

我们利用 DSP 处理传感器数据,如特征提取和光流;
我们使用 GPU 完成深度学习任务,如目标识别;采用两个 CPU 线程完成定位任务以实现车辆实时定位;
我们使用一个 CPU 线程实现实时路径规划;
使用另一个 CPU 线程进行避障操作。如果 CPU 尚未被全占有,多个 CPU 线程则可以在同一 CPU 核心上运行。

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

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


相关推荐
发表评论
访客的头像
请先 登录 再评论,若不是会员请先 注册
留言列表

    还没有留言,还不快点抢沙发?