随着自动驾驶技术的发展,一辆新车从被改装到上路需要经过的调试流程也有了许多提升。今天,我希望结合自己之前的调车经验来跟大家分享一下我们是如何将系统的各个模块逐步上车、调试、集成,进而将一辆“新手”车培养成“老司机”的。

自动驾驶简介

这是一段来自维基百科的关于自动驾驶的定义:自动驾驶汽车,又称无人驾驶汽车、电脑驾驶汽车或轮式移动机器人,为一种运输动力的无人地面载具。作为自动化载具,自动驾驶汽车不需要人类操作即能感测其环境及导航。

随着自动驾驶技术的发展,行业内涌现出了许多为了应对不同需求不同场景量身定制的自动驾驶汽车,这其中就包括中小型载人汽车,大型载人大巴以及大货车等等。那么怎么衡量一辆汽车的自动驾驶能力如何呢?有这样一张表:

这张表是由 SAE(国际自动机工程师学会,是横跨航空航天、汽车、商用车工程行业领域的顶级标准制定者,起着监督确保产品及服务安全、质量及有效的角色。)提出的。SAE 自动驾驶分级标准第一版J3016于2014年1月发布,最新的一次修订版发布于2018年10月,标准中 SAE 将自动驾驶技术分为 L0-L5 共六个等级:L0 代表没有自动驾驶加入的传统人类驾驶,而 L1-L5 则随自动驾驶的技术配置进行了分级:分别为辅助驾驶、部分自动驾驶、条件自动驾驶、高度自动驾驶、完全自动驾驶。

今天主要讲的是如何把一辆 L0 的汽车,通过我们的改装,让它具有 L4 和 L5 的能力,也就是我们今天所说的“老司机”。

新手上路

如何教人开车与如何调试自动驾驶车辆有很多共通之处。

这是一个比较经典的自动驾驶车载系统框图,真实的环境经由传感器系统被传递到感知模块,感知模块会基于收集到的原始数据和定位结果,给出对周围环境的感知和预判,然后规划模块结合感知输出结果和当前掌握的地图信息,对底层车辆下发精准的控制指令,而达到控制车的目的,这是一个完整的自动驾驶流程。那么这样一个层层依赖的车载系统是如何一步步在一辆车上被搭建起来的呢?我们可以用一个新手去参加驾校培训的例子来类比:

① 需要有车。“巧妇难为无米之炊”,不管是参加驾校培训,还是调试自动驾驶车第一步都是需要有车,只不过参加驾校培训,车辆是由驾校提供的。

② 需要有过硬的“身体”素质。通过体检是能够参加驾校培训的必备条件,而对应于自动驾驶系统来说就是,我们需要:

  • 足够强大的计算平台

  • 足够精准的地图和定位模块

  • 足够高级的感知模块

③ 在具备了基本素质之后,就可以正式参加驾校培训了,我们将在教练的指导下通过不断的练习来掌握如何控制车辆前进后退,完成倒车急转等动作,这些驾驶技能的提升,对应于自动驾驶系统中的控制和规划模块。接下来我会对每个模块做对应的介绍。

1. 线控改装

线控,即不通过传统机械结构去连接方向盘和前轮,而通过导线,说得通俗点,就相当于你用一台模拟方向盘/游戏手柄玩赛车游戏。

那么,什么样的车适合被改装进而用来做自动驾驶呢?简单讲,不同的改装方案决定了可选择的车辆范畴,一个极端的例子是如果选择采用在驾驶位上放一个仿真机器人来实现自动驾驶车辆的话,所有人类可以驾驶的车辆都可以选择。当然因为在现有技术条件下,这个改装方案在系统响应和安全性上有比较大的问题,我们今天要的讨论是通过改装一些“底子”本身比较好的车辆来实现线控。

什么是“好的底子”?事实上,随着汽车辅助驾驶技术的发展,许多配备有高级辅助驾驶功能的汽车已经完成了底层线控的改造:

  • ACC 能够通过自动控制车辆的油门刹车来保证车辆与前车始终保持一个安全距离;

  • LKA 能够通过自动控制方向盘保证车辆始终行驶在车道内;

  • Valet Parking 自动泊车系统能够在无人干预的情况下完成自动寻找车位停车入库的操作。

这些功能都是通过车辆底层控制协议来控制车辆的机械结构,我们只要想办法获得这些协议,就可以通过调用响应的接口达到我们的目的。由于这种改装方案对于原车的改动最小,响应的安全性也更高,目前被主流自动驾驶公司广泛接受。右边两张图是 Pony.ai 申请北京路测牌照选用的两款车,而选择的原因也正是因为他们有比较好的改装基础。

在拿到一辆改装完成的车之后第一步,就是对线控能力做测试:

  • 功能测试:是指车辆是否能够按照约定的协议在自动和手动之间自由转换,是否能够完成基本的加减速、方向盘,制动控制是否正常;

  • 性能测试:主要考察车辆的响应/执行时间,反馈时间。就是说我们在对车辆下达指令之后,车辆经过多长时间机械层开始有响应,过了多长时间车辆会给上层反馈它完成了这个指令。因为这个指标与安全性非常相关,也是最受车出厂自身配置限制的一个指标。比如,一辆豪华小轿车和一辆普通大卡车的响应时间肯定是完全不一样的,大卡车的响应或者反馈时间会比小轿车长将近 100ms,这时如果做自动驾驶的大卡车,就必须采取偏保守的规划策略。

2. 地图及计算平台

地图决定了自动驾驶能行驶的区域,通常来说地图采集会是选好车辆之后的第一步,拿我们去驾校学习举例的话,这就是我们熟悉场地的过程,我们需要仔细检查场地里有多少路口,S 形弯道从哪里开始,坡道的坡度多少,红绿灯的大概位置在哪里,做到这些都了然于胸了再去上车实际操作。

高精度地图的细节在上一次讲座已经有所介绍,这里不做介绍。

高精地图和定位在自动驾驶的应用

接下来重点是搭建车上计算平台,主要包含:稳定的供电系统,通信系统,存储系统和计算系统,在设计时要在保证可靠性和高性能的同时兼顾其灵活性,需要系统的软件与硬件有很好的协作。计算平台的好坏是所有车上系统的基础,计算平台的性能高低与车辆行驶的最终效果直接相关,决定了整个自动驾驶系统的上限。

3. 传感器与定位

标好地图和搭建完计算平台之后,就可以基于现在的情况进行传感器的选型。自动驾驶领域常见的传感器包括激光雷达,毫米波雷达和摄像头等,能够提供这些传感器的供应商也非常多,各家公司会基于自身需求做不同的考量,而考量的标准包括:传感器的成本/功耗/性能以及视野。

传感器的安装是感知和定位的基础,不同传感器由于自身特性对于安装朝向/方式会有不同的要求,比如有的需要与车体刚性连接,而有的需要有比较好的减震保护。

安装后要做的第一件事就是标定,简单讲标定包括内参标定和外参标定,内参标定是为了去掉一些传感器自身内部数据的一些误差,而外参是为了让自动驾驶系统明白各个传感器被安装在什么位置,以便做数据融合和进一步的感知。

定位模块的作用是提供车辆的运动状态,包括车辆的位置,速度以及朝向等,关于定位在接下来的 talk 中会有同事详细介绍,这里不展开了。

自动驾驶复杂环境下高精度定位技术

4. 感知系统

在把传感器上车安装好之后,就可以进行原始数据的采集。这时会开着装好传感器的车到将来要进行测试的区域不断的测试,这时是纯人工操作,目的是采集足够多的道路数据,为感知做准备。数据采集之后会用于模型训练和算法迭代,每一版模型生成并通过评估之后都会在相关的感知模块进行上车测试,通过不断的迭代感知系统就可以拥有障碍物和简单交通标志的识别能力。关于感知系统需要面对的一些问题以及思考会有其他两位同事在接下来的分享中为大家介绍。

自动驾驶多传感器感知的探索

传统方法和深度学习结合的感知策略探索

讲到这儿,我们的车有了基本的感知能力,虽然我们还没有控制车辆,但是已经可以对于车辆周围的危险进行一些基本的警示,这就是目前一些车辆 L0 级别功能的思路,包括 PDC(我们俗称的倒车雷达),FCW(前方碰撞预警系统),LDW(车道偏离预警系统)。当然,这些系统并不要求有高精度地图以及线控。

5. 控制系统

接下来就是要调控制,车辆控制分为纵向和横向两方面(纵向控制是为了通过油门和刹车来控制车轮转速,而横向控制是通过方向盘来控制车辆行驶方向)。在控制系统上车的初期我们也会按照先纵向后横向的方式去调试,场地一般都是在封闭道路上。在车辆通过横纵向独立测试之后我们会进行集成测试,先由人手动开一个任意轨迹,然后将其中经过的一些位置点记录下来当作控制模块的 input,通过不断调试让车辆能够自动沿着记录下来的轨迹行驶。这时,我们的车拥有了模仿能力。如果还拿学驾照比喻,此时我们已经可以完成教练演示过的操作,也就是说我们可以去考科目二了。

这就是 L1 和 L2 的思路,他们的共同点是没有强大的规划模块,但是基本完成了对感知系统和控制模块的掌握。

6. 规划系统

真实的路况远远比直线加速和简单循迹复杂,为了实现车辆真正的自动驾驶,我们还需要拥有足够强大的规划系统。简单讲,规划系统的作用就是基于当前车辆周围环境决定车辆接下来怎么走。这有点像驾校考试的科目三,教练会给学员下指令变道还是掉头,决定什么时候应该将车辆加速到 50km/h,这在实际自动驾驶车的调试过程中也是类似的,只不过我们会充当教练的角色,而我们的自动驾驶系统就是学员。

一些配备了一些 L3 级别辅助驾驶功能的汽车拥有了类似的简单的规划能力,比如自动泊车系统。车辆配备的功能可以完成的规划/决策越复杂,他的自动驾驶级别也就相应越高。

通过了前面的测试,也就可以说我们的系统考过了科目三,可以持证上路了。上图左边是我们常见的驾驶证,右边是北京颁发的自动驾驶路测牌照。但取得驾驶证/测试牌照与会开车并不等价,生活中大家周围都会有一些持证十多年但是从未开上过公开道路的“资深”司机,这说明如果要进一步提升能力成长为驾轻就熟的“老司机”,仍然需要不断地练习。

7. 驾驶技能迭代

这是 Pony.ai 内部功能开发的一个基本流程,一个新功能从 idea 被提出到代码实现基本需要经过以下流程:首先,在功能开发完成之后需要先在内部的模拟环境中充分测试,我们的模拟环境包含丰富的测试场景,这其中的测试场景有的来自于程序生成,有的来自于之前的真实路测。在完成仿真测试之后,需要进行实车路测,为了保证系统的平稳迭代和发布,我们会随着功能的稳定程度的提升一步步增加路测环境的复杂程度。在实车路测的全部数据都会被很好记录并被有效追踪,其中暴露出来的问题会被重新加入到仿真环境的测试样例中,直到现有版本通过所有测试,才可以进行下一次路测流程。只有当一个功能在之后的路测中被测试了足够长时间并且没有问题,我们才会将它作为稳定版本发布。

正是经过这样一步一步的迭代,让我们的车从最开始只能开直线、转弯、掉头,到最后能完成一些超车、加塞等高级的“老司机”动作。

成为“老司机”之后

考虑到自动驾驶的目标是用机器代替人的操作,在教会一辆车成为“老司机”之后理论上也可以教会一群车成为“老司机”,也就说,我们可以建立一支自动驾驶车队,而车队中的驾驶员开车一样驾轻就熟。建立这样的一个车队,对于整体解决方案的稳定性要求是很高的,它同时也带来了很多好处,除了数据采集速度成倍提升以外,可以同时在多辆车上测试不同的功能或者进行对照试验,算法的迭代效率也大大提升了。

另外,我们可以将教自动驾驶系统开小轿车的经验移植到公交车,大卡车上,就像人类驾驶员增持驾照一样,这同样是非常值得尝试的方向,也是我们在努力的方向。这就是今天的分享,谢谢大家。

zz“老司机”成长之路:自动驾驶车辆调试实践的更多相关文章

  1. 基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化

    基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化 Optimizing NVIDIA TensorRT Conversion for Real-time Inference on Auto ...

  2. zz高精地图和定位在自动驾驶的应用

    本次分享聚焦于高精地图在自动驾驶中的应用,主要分为以下两部分: 1. 高精地图 High Definition Map 拓扑地图 Topological Map / Road Graph 3D栅格地图 ...

  3. zz自动驾驶多传感器感知的探索1

    Pony.ai 在多传感器感知上积累了很多的经验,尤其是今年年初在卡车上开始了新的尝试.我们有不同的传感器配置,以及不同的场景,对多传感器融合的一些新的挑战,有了更深刻的认识,今天把这些经验,总结一下 ...

  4. zz自动驾驶多传感器感知的探索

    案例教学,把“问题”讲清楚了,赞 Pony.ai 在多传感器感知上积累了很多的经验,尤其是今年年初在卡车上开始了新的尝试.我们有不同的传感器配置,以及不同的场景,对多传感器融合的一些新的挑战,有了更深 ...

  5. Uber自动驾驶卡车正式运营,是否会给卡车司机彻底“宣判死刑”?

    随着科技的快速迭进和嬗变,大众的生活也在被全面革新和改变.不过有些改变是显性的,比如PC和智能手机的出现.有些改变却是隐性的,比如太空科技.云计算等.而在当下,又一个看似与大众生活紧密相关,但一般人却 ...

  6. zzL4自动驾驶中感知系统遇到的挑战及解决方案

    本次分享的大纲: Perception Introduction Sensor Setup & Sensor Fusion Perception Onboard System Percepti ...

  7. L3级自动驾驶

    L3级自动驾驶 2020年开年 3月9日,工信部在其官网公示了<汽车驾驶自动化分级>推荐性国家标准报批稿,并拟于2021年1月1日开始实施. 按照中国自身标准制定的自动驾驶分级标准,在千呼 ...

  8. Google Waymo 2017自动驾驶安全技术报告(一)

    2017年10月Google Waymo向美国交通部提交了一份43页的安全报告,报告中详细说明了Waymo如何装备和训练自动驾驶车辆,从而避免驾驶中的一般和意外情况发生.这份报告对Waymo的自动驾驶 ...

  9. Google Waymo自动驾驶安全技术报告(二)

    Waymo的技术在公开道路上.封闭测试场.仿真器进行了广泛的测试,所以可以保证自动驾驶系统的每一部分在其ODD内都有强大.可靠.安全的处理能力. Waymo的自动驾驶系统由三个相互独立.严格测试的子系 ...

随机推荐

  1. LeetCode 200. 岛屿数量

    习题地址 https://leetcode-cn.com/problems/number-of-islands/ 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水 ...

  2. os 和 sys 的模块使用方法和模块

    os  的模块  方法 os.remove()删除文件 os.rename()重命名文件 os.walk()生成目录树下的所有文件名 os.chdir()改变目录 os.mkdir/maked ...

  3. Socket抽象层

    目录 一.Socket抽象层 一.Socket抽象层 我们知道两个进程如果需要进行通讯最基本的一个前提是能够唯一标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一 ...

  4. Linux 下编写一个 PHP 扩展

        假设需求 开发一个叫做 helloWord 的扩展. 扩展里有一个函数,helloWord(). echo helloWord('Tom'); //返回:Hello World: Tom 本地 ...

  5. 编译安装最新版nettle和gnutls

    编译安装最新版gnutls的时候,总是会出libnettle 3.4.1 was not found的报错信息. 即使编译安装了nettle的最新版3.5之后,依然会报该错. 原因是gnutls编译的 ...

  6. opencv Mat基础

    Mat Mat由两部分构成 matrix header pointer to the matrix containing the pixel values Mat is basically a cla ...

  7. C# copy files from source directory to destination file and rename repeated files and does not override

    static void CopyFiles() { string sourceDir = @"D:\C\ll"; string destDir = @"D:\LL&quo ...

  8. java基础(29):JDBC、DBUtils

    1. JDBC 1.1 JDBC概述 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问 ...

  9. PHP面试题2019年奇虎360面试题及答案解析

    一.单选题(共29题,每题5分) 1.以下代码 a.php 输出的结果是? a.php 的代码如下: b.php的代码如下: A.foo in a B.什么也不输出 C.报错 D.foo in b 参 ...

  10. java核心技术第五篇之事务和MVC模式

    第一部分:事务1.事务的简介: 1.1 在一组操作中(比如增加操作,修改操作),只有增加和修改操作都成功之后,这两个操作才能真正的成功. ,如果这两个操作中,有一个失败了,这两个操作都失败了. 1.2 ...