什么是汽车自动驾驶,如何通俗易懂地理解其功能及原理?

>> 本问题已加入 人工智能 · 自动驾驶 圆桌中,欢迎关注圆桌参与更多讨论 <<
关注者
523
被浏览
183,160

42 个回答

从简到繁的介绍下自动驾驶的原理,老问新答,哪怕你看过很多自动驾驶软件的原理和设计,也同样可以从这个说明中获得未来演进的一些启发。

从自动驾驶的架构出发往往最能够理解自动驾驶的原理,大众对自动驾驶最浅显易懂的理解就是感知,决策,执行。所有机器人都是这样的架构。

  • 感知回答周围有什么的问题,类似人的眼睛,耳朵。通过摄像头,雷达,地图等手段获得周围障碍物和道路的信息。
  • 决策回答我要如何做的问题,类似大脑。通过分析感知得来的信息,生成路径和车速。
  • 执行则类似于手脚,将决策获得信息转化成刹车、油门和转向信号,控制车辆按照预期行驶。

接下来我们深入一层,问题开始有一些复杂

我们在日常生活中可能会直觉的认为,我每时每刻在根据当下眼睛看到信息决定我下一步的决策,但情况往往并不是如此。从眼睛到脑袋再到手脚总是存在一个时间的延迟,自动驾驶也是如此。但我们不曾感受到影响是因为大脑会自动处理“预测”这件事情。哪怕只有几毫秒,我们的决策也是根据对所见之物的预测来指导手脚运作的,这是我们维持正常机能的基础。因此我们会在自动驾驶决策之前增加预测这个模块。

感知过程同样内藏乾坤,仔细推敲也分为两个阶段“传感”和“感知”。“传感”获得的是传感器的原始数据比如图片,而“感知”是从图片里处理出的有用信息(诸如图里有几个人)。古语常说“眼见为实,耳听为虚”。“感知”的有用信息又可以继续分为自车感知与外部感知,人亦或是自动驾驶汽车在处理这两大类信息时往往有不同的策略。

  • 自车感知-由感受器官每时每刻获得的信息(包括摄像头,雷达,GPS等)
  • 外部感知-由外部智能体或过往记忆,收集处理后转告的信息(包括定位,地图,车联信息等),前提需要自车定位感知(GPS)的输入。

另外各类传感器经由算法处理后的障碍物,车道等信息往往存在矛盾。雷达看到了前方有一个障碍物而摄像头告诉你没有,这时候就需要增加“融合”模块。对不一致的信息作进一步的关联和判断。

这里我们也常常把“融合与预测”归纳为“世界模型”。这个词非常生动,无论你是唯物主义还是唯心主义。“世界”都不可能全部塞进你的脑子里,而指导我们工作生活的是“世界”的“模型”,也就是通过对我们出生后的所见所谓加以处理,在脑中逐步构建的对世界的理解,道家称之为“内景”。世界模型的核心职责就是通过“融合”来理解当下环境要素的属性和关系,并配合“先验的规律”作出“预测”为决策执行提供更从容的判断,这个时间跨度可以从几毫秒到几小时。

由于世界模型的加入,整个架构变得更加丰满,但这里还一个细节常常被忽略。也就是信息的流向。简单的理解,人是通过眼睛感知再到大脑处理最后交给手脚执行的单向过程,可实际的情况往往更加复杂。这里有两个典型的行为构成了一个完全相反的信息流,那就是“目标达成的预案”以及“注意力的转移”。

“目标达成的预案”如何理解?实际上思考的伊始并非感知而是“目标”。有目标才可以触发一个有意义的“感知-决策-执行”过程,比方说你希望开车去一个目的地,可能你知道有几个路线,而你最后会权衡拥堵情况选择其中一个线路。拥堵情况属于世界模型,而“到达目的地”属于决策。这是一个决策向世界模型传递的过程。

“注意力的转移”又如何理解?哪怕是一张图片,无论是人类还是机器都无法获取内部隐含的所有信息。从一个需求和上下文出发,我们往往会把注意力放在一个有限范围和有限的品类上。这些信息无法从图片本身获得,而是来源于“世界模型”和“目标”,是一个从决策到世界模型再向感知传递的过程。

我们补充一些必要的信息,重新整理下整个架构,它变成了如下的模样,是不是又复杂了一些。还没完我们继续看

自动驾驶算法和大脑一样,有一个对处理时间的要求。一般的周期在10ms-100ms之间,可以满足对环境变化的反应要求。但环境有时简单有时却非常复杂。很多算法模块无法达成这个时间要求。比如思考一遍人生的意义可能不是100ms可以搞定的事情,如果每走一步路都要思考一遍人生,对大脑一定是一种摧残。计算机也是如此,存在算力和运算速度的物理限制。解决方法就是引入分层框架。

这种分层机制越往上处理周期一般会缩短3-10倍,当然并不一定需要完整出现在实际框架当中,工程上根据板上资源以及算法使用情况可以灵活调整。基本上,感知是上行过程,根据注意力不断精细化特定要素,提供有“纵深和指向”的感知信息。决策是下行过程,根据不同层次的世界模型逐层从目标分解动作到每个执行单元。世界模型一般没有特定流向,用于构建不同粒度尺度的环境信息。

根据处理任务的复杂度,人员分工以及通讯环境也会进行适当的阉割与合并。比如低阶ADAS功能(ACC),算力较少,可以只设计一层。高阶ADAS功能(AutoPilot)一般会有两层的配置。而自动驾驶功能,复杂算法较多,三层的设计有时是必须的。在软件架构设计中,也存在同一层的世界模型与感知或是决策模块合并的情况。

各类自动驾驶公司或者行业标准都会发布自己的软件架构设计,但往往都是根据现状阉割后的结果,并不具有普适性,但为了方便大家理解,我还是把当下主流的功能模块代入进来,大家来看看对照关系,对理解原理更有帮助。

这里需要提前注意下,虽然这已经有点软件架构的意味,但仍然是一种对原理的描述,实际的软件架构设计相较于此还要更为复杂,这里并没有展开所有细节,而是把容易混淆的部分重点做了展开。下面我们重点梳理下。

环境感知-ALL IN深度学习

为了确保无人车对环境的理解和把握,无人驾驶系统的环境感知部分通常需要获取周围环境的大量信息,包括障碍物的位置,速度,前方车道的精确形状,标志牌的位置类型等。通常是通过融合激光雷达(Lidar),周视/环视相机(Camera),毫米波雷达(Millimeter Wave Radar)等多种传感器的数据来获取这些信息。

深度学习的发展,使得通过神经网络算法完成自动驾驶搭建成为全行业共识。感知模块的算法是整个深度学习化的“马前卒”。是最早完成转型的软件模块。具体算法不在这里展开,后续会讲。

定位地图与V2X-自车感知与外部感知之间的关联与差异

传统意义上理解,外部感知是以GPS定位信号为基础,将高精地图和车联网消息(V2X)等绝对坐标系下的信息转化到自车坐标系下,供车辆使用的感知源。和人使用的高德导航仪类似。配合原本就在自车坐标系下的“自车感知”信息综合为自动驾驶提供环境信息。

但实际的设计往往更为复杂,由于GPS不可靠,IMU需要持续修正,可量产的自动驾驶定位往往使用感知地图的匹配来精确获得精确的绝对位置,利用感知结果来修正IMU获得精确的相对位置,和GPS-IMU组成的INS系统形成冗余。因此“外部感知”所必须的定位信号,往往依赖于“自车感知”信息。

另外虽然地图严格意义上属于“世界模型”的组成部分,但受限于GPS的敏感性,在国内进行软件实施的过程中,会把定位模块和地图模块进行整合,并加偏所有GPS数据,确保没有敏感定位信息的外泄。

融合预测模块-核心关注两者的差异

融合的核心是解决两个问题,一个是时空同步问题,利用坐标系转换算法和软硬协同的时间同步算法,首先将激光雷达,相机和毫米波雷达等感知测量结果对齐到一个时空点上,确保整个环境感知原始数据的统一。另一个是解决关联(Association)与异常剔除的问题,处理不同传感器映射到同一个“世界模型”元素(一个人/一根车道等)的关联,并且剔除可能由于单一传感器误检导致的异常。但融合区别于预测的根本是其只处理过去以及当前时刻的信息,并不会对外来时刻做处理。

而预测会基于融合的结果做出对未来时刻的判断,这个未来的时刻从10ms-5分钟皆有。其中包括对信号灯的预测,对周围障碍物行驶路径的预测或者是对远处的过弯位置做出预测。不同周期的预测会给到对应周期的规划,做不同粒度的预判,从而为规划的调整提供更大的空间。

规划控制-层次化策略分解

规划是无人车为了某一目标而作出一些有目的性的决策的过程,对于无人驾驶车辆而言,这个目标通常是指从出发地到达目的地,同时避免障碍物,并且不断优化驾驶轨迹和行为以保证乘客的安全舒适。规划的结构总结就是根据不同粒度的环境融合信息,从外部目标出发进行逐层的评估与分解,最终传递到执行器,形成完整的一次决策。

细分来看,规划模块一般会分成三层:任务规划(Mission Planning),行为规划(Behavioral Planning)和动作规划(Motion Planning)三层,任务规划核心是基于路网和离散路径搜索算法获得全局路径被给出大尺度的任务类型,往往周期较长,行为规划是基于有限状态机判断在一个中周期上,车辆应该采取的具体行为(左换道,绕行避让,E-STOP)并设定一些边界参数和大致的路径范围。运动规划层往往会基于采样或是最优化的方法最终获得满足舒适性,安全性要求的唯一路径。最后交由控制模块通过前馈预测和反馈控制算法完成对唯一路径的跟随,并操纵制动,转向,油门,车身等执行器最终执行命令。

不知道各位看官姥爷理解到了第几层,但以上这些也只是自动驾驶原理的入门内容,当下自动驾驶的理论,算法和架构发展都非常快,虽然上述内容是比较本源的知识点,很长时间内不会过时。但新增的需求给自动驾驶的架构和原理都带来了很多全新的认知。其中有两个影响最大的课题值得讨论。

  1. 自动驾驶的系统安全问题,如何从逻辑上,流程上,系统/硬件/软件设计上得到保障,这些对自动驾驶的架构和原理有什么颠覆?
  2. 自动驾驶的逻辑算法核心仍然是基于工程师的设计和校调,为了应对更多更复杂的场景,我们需要机器自动化的对整个自动驾驶算法进行优化。这对于架构和原理又会产生什么颠覆性的影响?

回答这两个问题就不是一个回答可以承载的了,如果你对这类问题的深层机理和进展有兴趣,欢迎关注我或是我的专栏,一些已经回答了,还有一些仍在路上。希望对大家有帮助。

勉强答一波

其实是门仿生学吗

还记得我们怎么学会开车的吗?

无人驾驶的底层原理,其实就是让机器代替人来开车.
或者说,让机器能够先像人一样开车
之后在发挥它的规模化或者持续迭代的机器方面的优势

而,像人一样开车,听起来像句废话.
可是无人驾驶确实是用这个做切入口的.

我们平时的驾驶可能已经是 90%的时间在靠条件反射在开车.
甚至在我们下班回家的路上,都不知道自己为什么要在这个地方转弯,身体就很诚实的把车开过去了.
转过去发现是大众洗浴,然而此时家里领导在你车上…..

一般人在开车一段时间以后,都已经太熟悉怎么开车了,所以甚至在自己驾驶的时候,都不知道或者说不在意我们人体是怎么一个一顿操作,把车开起来,带自己回家的.

要不想想我们刚开始在驾校的幸福的时光:

刚开始我们坐进车里,并不知道自己的车有宽大,不断小心翼翼的通过各种手段来确认.甚至要在剐蹭了许多次之后,才能坐在车里光凭感觉就能把车停到离墙20cm,刚好够你挤出去.
这是我们对车的感知.

我们虽然看见了前面的到道路,看不全,看不远,看不到终点.甚至我们可能看到了,就只是看到了,对我们的驾驶没有任何参考.
这是我们驾驶的视野.

出了驾校,终于战战兢兢的开上路了.
约了某个小伙伴在某CBD下面的地铁出口聊一聊几个亿的生意,然后聊完去吃顿烧烤.开了导航,虽然显示了你自己的位置,但是你还是不清楚自己现在在哪,起步以后是往左往右往前往后.
然后你看了看周围的建筑,3 点钟方向有个小众洗浴.
这个小众洗浴好像是在地图中你自己小圆点的 6 点钟方向.
好了,还差三个钟,你就知道自己在哪了.
这是我们驾驶的定位.

输入某 CBD 地铁出口,导航给规划了几条线路.
你选择了一条,或者记住其中几个重要的路口,自己规划了一条稍微风景好一点或者认为可能车流少一点的路.
(不知道现在的司机有没有对超过50km以上陌生道路人肉规划线路的能力,我是没有.)
这是我们驾驶的线路规划和决策

好了,上路.
一路风驰电掣,遇神杀神,遇灯躲灯.
停完车后,发现自己带过出的两杯速溶咖啡忘了盖盖子了.还好,没有洒出来太多.还是提前5 分钟到了地铁口.
这是我们驾驶的控制.

嗯,就这样,我们到达目的地了.

  • 感知
  • 视野
  • 定位
  • 规划
  • 决策
  • 控制



就已经是无人驾驶的全部了,这就是无人驾驶的最简单的拓扑模型.

模型及其简单,只是人类太过复杂,执行非常困难.

极简运作模式

视野:真实的世界与马赛克

在驾驶时看到的世界,和平时走路的时候其实是差不多的.
只不过由于视线的起点变低了,而且由于车内很多遮挡,及车速比较高我们会快速的掠过很多场景.
会自然的比在走路的获取信息不太一样:

虽然每帧眼眶里的信息变少了,但是每秒里面的帧数变多了.



能不能很好的接受这些信息,很大一部来自于对这些信息的熟悉程度.
熟悉到这些场景变成你脑中的固有认知模式的时候,只需要看到一个白点,就联想到光胳膊了.
所幸,这些,在适应之后都还能应付.

有没有觉得,下班回家的路,只要稍微瞄一眼就已经发现那里发生变化.
那里新立了一块招牌,好像是众众洗浴.

再来看看车子眼里的世界是什么样的.
它们也是一样的,就像一个刚进社会的小伙子,它的眼睛(摄像头)会把这个新奇的世界的所有都拍下来.
然后把图像忠实的传递给处理单元.

摄像头主要看什么呢:有颜色,边缘,车道线,渐变色(艹,这个世界好复杂)
还有道路上其他车辆的边界框.(已经通过事前的神经网络训练)
神经网络是什么鬼?我也不是很清楚,阿尔法狗是他训练的,是个很厉害的训练师吧



车子看到世界的信息的质量,取决于摄像头的像素,倍率还有背后处理单元的处理能力.

我们看到的世界,它们看到的是数字和经过算法后的模型.

感知:要知己才能解彼

我们自己在驾驶时,对于车的感知更多是对于车辆大小的感知.
及自己的车后周围事物距离及运动的感知.

自己的前保险杠和前门正在插你队的出租车还有几厘米,它是在犹犹豫豫还是蛮横的插进来的.
能不能往前蹭蹭把位置卡住.



机器也是一样,通过各种各样的传感器.
告诉车辆,前面有没有车,车在怎么运动.车里有没有人,人在怎么运动.
不对不对,人不应该在车里,应该在车底,在拿个香槟.



定位:细节决定成败

只要我们对周围的环境有了深刻的理解,我们就可以用定位来精确的知道我们在这个世界的什么位置.

说得像讲人生道理,其实真的是这个原理.

人开车和机器开车都是一样,只有更清楚的知道自己周围的事物,才能反向来对自己定位.
其实大部分自己我们对自己预估的定位误差都是很大的.
周围事物所反射出来的你的定位,才是最真实的.
知道了环境,知道了别人,知道了和别人的差距,那就知道了自己在哪里了.这就是定位



对于无人驾驶的定位.
和我们平时导航时定位最大的区别就是对精度的要求.
导航 GPS 定位的精度只有1~2m,但是已经足够满足大致方向和大致位置的确认了.
剩下的,就可以交给我们愚蠢的人类来抠最后的那些小细节了.

但是在无人驾驶中,如果精度只是1~2m 级别的话,那将是灾难级的.你可以想象 1~2m 之内排成队的话,可以排多少个人,这不是灾难级的吗?

在无人驾驶中,没有人,所以最有的所有细节它都得自己来负责.
所以,对于定位的精度要求是厘米级的,这需要使用算法和高精度地图来达到,我们后面再说吧



规划和决策:条条都通罗马,那条比较省力呢

有了上面的基础,其实车子已经知道了:自己在哪,周围有什么,自己要去哪了.

这个之后,就是决定怎么去了.

宏观方面的:
这取决于去的路上有什么,和车子在路上的每一个时间片段里面可能会发生什么.
这些综合计算起来,哪条线路最有利.



开上路了以后,如果这条线路上的车流突然出现了和以前不太一样的情况,尤其是拥堵了的情况.
要能够实时对的线路进行重新规划.

但是这里面有一个悖论,就是如果大家都用了一样的算法进行重新规划线路,那么那条被重新规划的线路又变成一条新的拥挤线了.不知道现在有没有什么办法可以解决这个悖论

微观方面的:
前面有三台车,呈无规律队形无规律速度前进.
我应该是认怂按兵不动,还是一个一个解决,还是一次性把他们三个都给灭了.
风险有多大,时间会节省多少,哪个更重要.
好吧,我还是认怂按兵不动吧.



规划和决策大概就是.

结合现在,根据经验,和实时大数据预知未来并不断实时更新.

甚至,可能以后技术成熟,人类要求高了以后.
会有:哪条路风景好,哪条路井盖少,哪条路尾气少,哪条路美女多.

控制:先实现功能,再优化性能

这其实类似于更为微观的规划.
车辆的行驶在道路上的每一刻行动,都需要不断的对车辆不断的进行控制来实现自己的规划.
甚至在车辆直线定速行驶的时候,也需要根据风速和坡道等,对控制指令进行不断的调整.

而当车辆状态发生变化时:比如加速,减速,变道等.
事情会变得更复杂起来.

虽然实质上就是对车辆横向及纵向行驶方向变化的控制,说来很简单.
但这是最最影响乘坐体验的部分.



就像上图中的规划线路”黄线”和控制后的预测线路”绿线”.
如何使车辆尽量的贴合理想线路,同时又能做到让乘坐者无感,这一项可以研究很久很久的课题

这是目前我们人类能够对机器把持较长时间领先优势的地方.
如果让我们闭着眼睛去做一个人开的车和机器开的车,相信一下就能够区别出来.
尤其当一个老司机来开的时候,你不知道在繁忙的车流中什么时候踩的油门什么时候踩的刹车.
甚至变了3 条车道又变回来你也不知道.

可能你已经带着眼罩睡着了.



不过这,这对于实现无人驾驶来说,可能只是最后的优化环节.
反正现在基本的控制和执行都能实现,只不过开得像一个老司机一样还比较难.

最重要的还是先实现前面的视野/感知/定位/规划和决策吧.

预告

嗯,还是自己对无人驾驶极简模型的非常幼稚的理解.估计可能还会迎来一大波批评,希望这些批评或者探讨能够来得更加凶猛一点吧.

我相信,道理只会越辩越真.

或许你说我评车评得不专业,我会感觉到无地自容,掘地三尺把自己给埋了.
但对于自动驾驶来说,我是个初学者,甚至是旁观者,又有什么可以失去的呢不是?

下期,再来说说我学到的关于自动驾驶的最简单的硬件构成吧.

声明

本系列主要的灵感来自于百度和优达学城合作的自动驾驶的基础课程.
链接在下面:
apollo.auto/devcenter/d

还是希望你们如果看了这个系列的文章,对无人驾驶产生了一些学习的兴趣的话.
最好还是去学习一下原版的教程.

毕竟我写出来的只是我自己的理解,而且我也不是做无人驾驶专业的.
这只是我自己的学习笔记,希望不要对你们造成误导.

另 ,已经获得了开发者社区小助手的授权,可以将自己的笔记发表出来.

关注继续关注我的公众号:小林的杂七杂八
后台留言:阿波罗,获取我的完整版 PPT 学习笔记.
可以直接拿去做转训用哦.

另外,可以看看我对自动驾驶的一些很粗鄙的看法