随着自动驾驶技术的发展,一辆新车从被改装到上路需要经过的调试流程也有了许多提升。今天,我希望结合自己之前的调车经验来跟大家分享一下我们是如何将系统的各个模块逐步上车、调试、集成,进而将一辆“新手”车培养成“老司机”的。
▌自动驾驶简介
这是一段来自维基百科的关于自动驾驶的定义:自动驾驶汽车,又称无人驾驶汽车、电脑驾驶汽车或轮式移动机器人,为一种运输动力的无人地面载具。作为自动化载具,自动驾驶汽车不需要人类操作即能感测其环境及导航。
随着自动驾驶技术的发展,行业内涌现出了许多为了应对不同需求不同场景量身定制的自动驾驶汽车,这其中就包括中小型载人汽车,大型载人大巴以及大货车等等。那么怎么衡量一辆汽车的自动驾驶能力如何呢?有这样一张表:
这张表是由 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 被提出到代码实现基本需要经过以下流程:首先,在功能开发完成之后需要先在内部的模拟环境中充分测试,我们的模拟环境包含丰富的测试场景,这其中的测试场景有的来自于程序生成,有的来自于之前的真实路测。在完成仿真测试之后,需要进行实车路测,为了保证系统的平稳迭代和发布,我们会随着功能的稳定程度的提升一步步增加路测环境的复杂程度。在实车路测的全部数据都会被很好记录并被有效追踪,其中暴露出来的问题会被重新加入到仿真环境的测试样例中,直到现有版本通过所有测试,才可以进行下一次路测流程。只有当一个功能在之后的路测中被测试了足够长时间并且没有问题,我们才会将它作为稳定版本发布。
正是经过这样一步一步的迭代,让我们的车从最开始只能开直线、转弯、掉头,到最后能完成一些超车、加塞等高级的“老司机”动作。
▌成为“老司机”之后
考虑到自动驾驶的目标是用机器代替人的操作,在教会一辆车成为“老司机”之后理论上也可以教会一群车成为“老司机”,也就说,我们可以建立一支自动驾驶车队,而车队中的驾驶员开车一样驾轻就熟。建立这样的一个车队,对于整体解决方案的稳定性要求是很高的,它同时也带来了很多好处,除了数据采集速度成倍提升以外,可以同时在多辆车上测试不同的功能或者进行对照试验,算法的迭代效率也大大提升了。
另外,我们可以将教自动驾驶系统开小轿车的经验移植到公交车,大卡车上,就像人类驾驶员增持驾照一样,这同样是非常值得尝试的方向,也是我们在努力的方向。这就是今天的分享,谢谢大家。