摘要:克里斯·厄姆森带领自己团队研发的自动驾驶悍马汽车来角逐这次比赛的奖金。之后克里斯借鉴之前的研发经验和斯坦福的成功经验,成功研发出在城市比赛中夺冠的Boss自动驾驶汽车,进一步明确了自动驾驶三层软硬件架构的优越性。

标题:11公里!悍马自动驾驶汽车虽败犹荣,自动驾驶需注意哪些问题?

2004年,第一次汽车机器人自动驾驶比赛(DARPA无人车挑战赛)在莫哈韦沙漠拉开了战幕。人们对于汽车能否完成比赛并赢得百万美元奖金的预期大相径庭。当时的赛事经理声称,胜利者将在10小时内完成227公里的比赛。但有人却说,根本不会有一辆汽车完成比赛。

DARPA无人车挑战赛

克里斯·厄姆森带领自己团队研发的自动驾驶悍马汽车来角逐这次比赛的奖金。当时的媒体非常认同来自卡内基–梅隆大学的克里斯,原因在于卡内基梅隆大学的研究人员早在1991年,就把一辆原始的自动驾驶汽车开上了匹兹堡的街道。

但是意外的是,悍马行驶到11公里的时候,一个向左的急转弯使得悍马的“视线”一片空白,成为盲眼驾驶。悍马的成绩比当时其他参赛对手要好得多,但是它也只是走完了5%的路程。

你应该听说过,自动驾驶所需要的技术是机器学习,特别是深度学习以及强化学习等模型。但是当时是2004年,距离深度学习真正可靠识别图像还差大约10年时间。那么,这些早期的自动驾驶是如何实现的呢?又存在什么样的问题呢?

要想更加深入了解这项技术,我们首先需要明白计算机是如何控制硬件。通过了解计算机是如何控制硬件,也能够让我们更加明白如何能够造出自动驾驶汽车。计算机如何控制硬件

为了更好说明计算机是如何控制硬件,我们以控制汽车速度为例加以说明。计算机要想控制速度,就需要将计算机给的数字(例如“20”)转化为汽车的行驶速度。

但是,问题是汽车的发动机可是无法听懂速度为“20”是什么意思。并且即使你知道给发动机电压为200V的时候,汽车的行驶速度可能达到20km/h,但是你也不可能通过简单的调高或者调低电压就能够获得想要的行驶速度。

如果你想要1km/h的速度的时候,你不可能说把发动机的电压调到10V,因为10V的时候,发动机很有可能都不会转动。

离心调速器

离心调速器就是为了解决这个问题而发明出来的,其主要利用反馈来控制发动机的速度。离心发动机是带有两个金属球的“旋转装置”。当发动机的旋转速度过快的时候,离心调速器的旋转速度也更快,金属球被离心力向外拉动。

之后通过一系列的杠杆作用,导致阀门关闭发动机的燃料通路,进而使得发动机减速。过慢得增开燃料阀门,使发动机提速。通过控制发动机的燃料,来保证发动机的转速稳定。

但是这个离心调速器有一个缺点,就是只能让汽车保持单一速度运转。为此,现在的自动驾驶汽车则采用同样的反馈调节回路,但是回路使用电子速度计,而不是旋转装置来测量车轮速度与目标速度的差异。

当汽车开得过慢,这种反馈调节就会增大发动机的功率。开得过快的时候,就会降低发动机的功率。常用调节发动机功率的方法称为比例控制,也就是将对功率的调节就等于目标速度和当前速度的差值乘以固定的系数。

PID控制器

但是比例控制并不时常有效,如果汽车在逆风行驶或者是在爬坡行驶,那么汽车的行驶速度就比我们预期的速度要低。因此,需要对控制算法做一些修正。例如车速一直比较慢的时候,发动机的功率就稍微再提升一些。

最常见的控制算法都是有三条简单规则组成:(1)当系统期望速度与实际速度的偏差过大的时候,采用比例控制,加快调节,减少误差;(2)采用积分控制,消除稳态误差,提高无差度;(3)采用微分控制,预测偏差变化趋势,起到超前控制。

这三个规则是目前许多自动驾驶汽车都采用的控制器,称之为PID(比例–积分–微分)控制器。当时,悍马只使用它的PD(比例–微分)部分控制油门,而且形式略有不同。

这就是计算机对硬件控制的大致过程,但是光靠这些,汽车还是无法实现自动驾驶。因为还需要软件告诉汽车以多大的速度行驶、多大的转弯半径转弯。自动行驶11公里,悍马是如何做到的?

悍马并不是朝着某一个方向行驶25分钟,而是沿着一条规定目的地的道路上行驶。比赛前2个小时,组织者才向参赛者提供一幅带有GPS坐标的电子地图。

从理论上讲,只需要从地图的一个导航点到另一个导航点,并根据GPS坐标来调整车辆的坐标,就能完成比赛。但是,岩石、栅栏等都会阻碍汽车的行驶。为此,克里斯团队为悍马,利用54000平方米的卫星图像,绘制了一幅“世界上最美的地图”,从而悍马确定行驶过程中的障碍。

因此,当克里斯拿到官方电子地图之后,采用人工标注地图的方法,提前将预先计算好的最优路径发给悍马。但是从一个导航点到另一个导航点,悍马又是如何避开障碍?悍马汽车不可能听懂“找一条好路”这种指令。

栅格化地图

为了使得悍马能够更好搜索到最佳路线,克里斯团队在地图上给每个1米×1米的单元格设定“时间成本”(又称为,栅格化地图)。走复杂地形必然比走简单地形的时间成本高,并且对于一些缺乏GPS数据、危险地区等单元格设置“额外惩罚”。

因此,这时候的路径选择问题就变成了最小化时间成本的函数。

当时,悍马利用主流搜索算法——迪杰斯特拉算法(Dijkstra’s algorithm),来获取最佳的路径。迪杰斯特拉算法简单来说,就是从起点开始向外扩张搜索边界,每次循环时就向外扩展一小部分,直到达到最终的目的地。

这种算法的好处在于计算机能够沿着概率最优的道路进行搜索,因为计算机很有可能是先搜索出平坦的道路,然后再搜索出比较费劲的道路。

有了地图、规划路径之后,就需要在地图中能够找到悍马的位置,才能实现汽车的自主导航。但是光靠GPS数据肯定是不够,因为GPS数据测量并不是一直都是准确的,而且信号并不能持续保持。更重要的是,GPS数据并不能为机器人指明方向。

因此,对于没有GPS的情况下,实现悍马的自主导航显得尤为重要。因此,克里斯团队在悍马上安装了加速度计,用来测量悍马的三维加速度数据。利用这些三维加速度数据的累加,测量悍马的位置。并安装测量角度的陀螺仪,从而来追踪悍马的方位。

但是,当多个传感器数据源的时候,克里斯团队开始思考如何能够更好校正位置方位偏差,才能使得测量数据更加真实。于是,克里斯团队利用1960年发现的数学模型——卡尔曼滤波,将加速度计、陀螺仪以及GPS数据进行融合。

利用卡尔曼滤波器对传感器数据进行融合

卡尔曼滤波的核心思想是,我们永远无法知道物体的真实位置和速度,只能依靠一些不完美的传感器采样计算而得到。但是有些采样点会因传感器本身的硬件误差,导致出现一些“坏点”,从而影响实际的估算。

卡尔曼滤波器通过消除一些异常值,来提升平均值的可信度。当有足够多的数据的时候,卡尔曼滤波器就能将加速度计、陀螺仪、GPS数据以及车轮数据,估算出自动驾驶汽车的位置,而且卡尔曼滤波器的估算结果能够保持在厘米级别的误差。

即使有这样精确的位置,自动驾驶汽车还是能够撞到地图上的障碍以及地图上的位置物体。为此,克里斯团队为悍马装上了激光雷达作为悍马的“眼睛”。当激光雷达发现障碍之后,规定悍马向左或者向右紧急避让。

但是,悍马的“眼睛”非常简单。悍马的自动导航程序并没有根据它的“眼睛”所看到的东西实质性地调整路线,而只是按照预先规划好的路线走,并按照简单的规则左右转向以避开难走的路面。最终导致,悍马一头撞上岩石。设计一款自动驾驶汽车需要注意哪些问题?

第二次无人驾驶比赛在一年半之后,重新点燃。克里斯的悍马还是聚焦地图和导航,并且在之前的基础上,为悍马设计了应急处置系统,防止面对岩石的时候,动弹不得。最终,克里斯的悍马跌跌撞撞完成了比赛。但是克里斯的悍马并不是胜利者,排在悍马之前的斯坦福车队研发的斯坦利比悍马快10分钟完成了比赛。

为什么斯坦福车对能够在比赛中获得胜利?因为斯坦福车队意识到过于依赖地图和导航是存在问题的,特别是面对一些动态环境的时候。毕竟实际的比赛路线只是克里斯团队勘察路线的2%。不仅如此,斯坦福车队利用机器学习的方法来解决自动驾驶导航问题。

激光雷达

斯坦福车队利用让一个人安全驾驶斯坦利过程中激光雷达产生的数据,来调整障碍检测模型中的参数,也就是用数据来训练算法。从而,这种预测哪些路面可以安全行驶的方法,使得地形检测算法的精度提升了几个数量级。

比赛并不要求车辆在道路上行驶,但是在道路上行驶,可以避免大部分沙漠道路中的大部分障碍物。斯坦福车队通过寻找道路的边缘,尽可能地来约束斯坦利在道路上行驶。但是由于激光雷达的探测距离有限,因此,斯坦福车队通过安装彩色摄像机聚类分析哪里是道路。从而提高了斯坦利的道路探测范围,避免一些急转弯带来的意外事故。

但是,我们也能够发现,这些自动驾驶的汽车是专门为了比赛而设计出来,它们即使能够通过效果良好的算法来避开障碍物,都无法面对迎面而来的车流,也无法寻找车位、自动泊车以及换车道等情况。

那么,设计一款自动驾驶汽车需要注意哪些问题?

(1)建立合理的软硬件层级架构

自动驾驶汽车涉及到的软硬件环节非常多,不仅仅需要知道他们是如何连接,还需要知道各个算法之间相互遵循的协议。是否需要有一个集中控制中心来指挥一切?这些算法又将以何种结构组织起来?

自动驾驶的三层架构

斯坦利之所能够如此出色,正是由于将软硬件架构组织成硬件层、感知与环境建模层和推理层。感知与环境建模层与推理层专注于更高级别的任务,而并不去承担处理低层次传感器数据的任务。

反之,感知模块主要通过机器学习的方式,将原始的传感器数据转化成为可以被操作的信息,但是并不参与到任何高层次的决策规划。整个架构层级中并没有一个指挥中心来指挥管理,各个模块都是并行运行,每个模块都有工作,从而使得整个系统能够快速应对环境变化。

克里斯的团队为迎接之后的城市挑战赛,淘汰了之前的悍马,转向2007款雪佛兰塔霍汽车(命名为Boss)。Boss也同样采用类似的三层架构,但是为了更好的完成城市赛中的复杂任务,将高层的推理层又组成为三个层级:审议器、控制器以及定序器。

Boss的三层架构

Boss的审议器就是路径规划器,通常涉及缓慢仔细的规划。Boss的控制器就是运动控制器,其目的是执行简单的操作并对简单的传感器读数做出反应。审议器和控制器之间的是定序器,也即Boss中的大富豪棋盘,就是通过给控制器一系列指令,让自动驾驶汽车执行一系列来自审议器的高级任务。

建立合理的软硬件架构,才能保证自动驾驶汽车各个模块能够运行流畅且时效性更好,才能避免模块之间过多通话导致模块被锁死在对话中。

(2)建立有效的错误恢复机制

在研发自动驾驶众多事项中,研发团队必须为自动驾驶汽车编写很多软件。而且,编写这种软件也需要较大的人力、物力和财力。这项大规模的工作需要管理人们和各方之间的合作,以便这些程序员能够心情愉快地高效完成这项工作。

但是,即使是处于这样团队氛围的人员,还是会写出有一定缺陷的代码。

之前,Boss自动驾驶汽车中,定序器的设计原则就是“认知失效”。“认知失效”的系统可以用某种规则监测系统的失效。定序器不能只给控制器一个固定的命令序列,因为在执行整个序列之前,环境的状态可能会改变。

Boss自动驾驶汽车

在比赛过程中,Boss出现两次了“幻觉”,其原因在于其感知模块中存在一个问题。结果那天多开了4公里,对一场耗时约4小时的比赛来说,这只是小麻烦。虽然遇到了些小麻烦,但Boss还是领先斯坦福车队的赛车19分钟完赛。

一个冗余的错误恢复系统(大富豪棋盘)是Boss的架构中最重要的部分之一,其中更高层次的规划可以解决低层次规划或感知方面的问题,这让克里斯团队赢得了期待已久的大奖。

为什么要费心设计有时会失效的算法,而不是设计永不失效的算法呢?

首先,设计会出现认知失效的导航算法,要比设计永不失效的导航算法容易得多。其次,如果检测到失效,算法就可以采取纠正措施,从失效中恢复。因此,如果算法的失效属于认知失效,那么高失效率的算法就可以组合成一个整体失效率很低的算法。

(3)建立完善的物体检测分类机制

目前,机器学习已经成为自动驾驶领域中很重要的环节,以至于目前很多很人将高级规划算法和低级执行感知算法融合到一起。虽然大部分的智能算法都可以用于自动驾驶的规划决策层,但是大部分高级推理算法的思想都是人工智能很成熟很古老的思想,例如搜索和有限状态机。

自动驾驶物体检测分类

但是这些算法通常并不认为机器学习,因为机器学习主要是教机器如何从数据中学习,但是人工智能并不一定需要数据。相反,大部分自动驾驶算法中使用机器学习的场景大部分都位于感知与环境建模层。

自动驾驶重要的感知任务之一就是对传感器看到的物体进行分类。

Boss在比赛过程中,并没有尝试看清所有的东西。因为Boss处于人造城市环境中,所以移动的唯一物体就是汽车。而在真实城市环境中,自动驾驶汽车必须面对的是汽车、自行车、行人、电动车等。因此自动驾驶需要更好对物体分类建模,才能做好周边行为预判和驾驶决策。

自动驾驶汽车如何对它的传感器看到的物体进行分类?

基于深度学习的机器视觉算法在2012年前后出现了显著的进步,它可以使计算机像人类一样精确地对照片内容进行分类。在接下来的几年里,这些算法迅速发展,最终,英伟达等公司开发出了用于自动驾驶汽车视觉系统的定制硬件。结论

本文从2004年的DARPA无人车挑战赛出发,探讨早期自动驾驶是如何实现以及存在的现实问题。并详细说明计算机是如何控制硬件,为大家理解自动驾驶的技术奠定了技术基础。

之后,详细分析克里斯团队的悍马车队是如何完成11公里的比赛。此次比赛虽然是失败,但是为之后自动驾驶技术的发展积攒了宝贵经验。斯坦福车队在此基础上,明确自动驾驶不应该过于依赖地图和导航,并初步奠定了自动驾驶三层软硬件架构的雏形。

之后克里斯借鉴之前的研发经验和斯坦福的成功经验,成功研发出在城市比赛中夺冠的Boss自动驾驶汽车,进一步明确了自动驾驶三层软硬件架构的优越性。

但是,设计一个永不失效的系统要远远难于设计一个认知失效的系统。因此在设计自动驾驶汽车的时候需要建立完善的错误恢复机制。

未来,真实城市环境中的自动驾驶,重点需要考虑的是对复杂多变的环境进行分类建模,才能有效提高自动驾驶在真实城市道路上的可靠性。

你们怎么看待未来自动驾驶的发展?欢迎在留言板评论。

相关文章