深度解析Apollo2.0,“云+端”研发迭代模式实战

2018年3月31日,由百度主办,佐思产研、佐智汽车承办的《Hello Apollo,自动驾驶公开课》第三期——“Apollo2.0自动驾驶平台—技术解析与应用”在北京中关村创业大街车库咖啡成功举办,吸引了300多位来自车企、零部件厂商、软件公司、自动驾驶初创企业的开发者参加。

来自百度的资深工程师杨凡、万国伟及Apollo生态合作伙伴黄英君、李晓飞做了精彩的分享。从Apollo“云+端”开发模式及迭代代码的解析、到Apollo2.0定位技术及子模块功能使用、分布式计算平台解决方案,以及低速自动驾驶落地解决方案做了深入浅出的讲解和演示。开发者争相提问,现场气氛非常热烈。

Apollo已成为最流行的自动驾驶开发平台,运行平台搭建门槛从几万降低到5000元

长沙智能驾驶研究院公司产品部负责人黄英君老师将Apollo感知、决策、控制模块模块进行解耦,分布式集成运行在不同的计算平台和操作系统上,即在一个高可靠的双机备份低成本平台上运行决策与控制模块,在多个低成本高性能技术平台上运行感知模块,实现一个分布式可扩展的解决方案。

根据黄英君老师提供的低成本方案,只需5000元左右,就能搭建起Apollo的运行平台,降低了自动驾驶开发的门槛。

长沙智能驾驶研究院产品部负责人黄英君

智行者科技是一家清华背景的无人车初创企业,活动中联合创始人&技术研发部总监李晓飞分享了《低速自动驾驶专用车产品落地之智行者-Apollo合作案例》,在本次公开课上介绍了低速自动驾驶车开发面临的问题和挑战,特别介绍了如何利用Apollo在高精度地图和仿真平台,加快实现低速自动驾驶专用车的产品落地。

智行者科技联合创始人李晓飞

Apollo 2.0实战技术基础

我们特别分享百度自动驾驶事业部资深架构师杨凡老师的演讲,了解Apollo 2.0平台的实战经验,包括:车辆与循迹自动驾驶能力实战;障碍物识别和路径规划能力的实战;云端训练平台训练红绿灯感知能力;云端仿真能力完成验证的实战。

百度自动驾驶事业部资深架构师杨凡

杨凡:非常高兴有机会跟大家分享百度Apollo“云和端”的研发模式,接着帮助大家了解Apollo2.0演示方式的实战以及车辆与循迹自动驾驶能力的实战;之后是本次公开课的核心部分,障碍物识别和路径规划能力的实战;在此基础上介绍云端训练平台训练红绿灯感知能力,这是使用云端算法来加强自动驾驶能力的实战;最后简要介绍用云端仿真能力来完成验证实战。

现在的AI自动驾驶能力来自云端,所以在云端要采用大量的数据,进行标注和训练。以红绿灯为例,来解释AI的训练过程。一辆车在路上行驶,在安全方面严苛的要求,这种要求远远超过了对传统汽车一般性的要求。要完成一套自动驾驶系统的安全性测试,如果利用100辆车,7×24小时的跑,大概要一百年才能够测试完成。所以绝不是依靠真车来完成自动驾驶测试的,90%的测试工作需要在云端,通过仿真技术大规模的验证实车能力,才能保证它的安全。

正因为要保证自动驾驶的安全是一件长期而艰难的事情,是一个复杂的系统工程,所以百度自动驾驶采取了开放策略。百度在自动驾驶方面做了长时间的探索,做的越久,就越发敬畏自动驾驶和汽车产业。一辆车有上万个零件组成,自动驾驶更不是一个简单的产业环节,而是一个完整的产业链条,包括主机厂、零部件、通讯、感知、决策和控制系统等厂商。所以我们认为它是一个生态,大家在一个完整的生态环境中,找寻自己的位置,合作完成自动驾驶系统的开发。

所以百度提出了Apollo开放战略计划。百度把多年积累的自动驾驶研究成果开放给生态链,让大家可以共享技术和数据,在此基础上实现资源共享。使用的越多,分享的越多,大家收获的越多,在生态里实现共赢。

Apollo技术框架由4层构成。分别是:

Reference Vehicle Platform(参考车辆平台,指一辆能够受电子信号控制的车,我们管它叫线控车)

Reference Hardware Platform (参考硬件平台,包含计算单元、GPS/IMU、Camera、激光雷达、毫米波雷达、人机交互设备、BlackBox等硬件)

Open Software Platform (开放软件平台:包括实时操作系统、承载所有模块的框架层、高精地图与定位模块、感知模块、决策规划模块、控制模块)

Cloud Service Platform (云端服务平台:包括高精地图、模拟驾驶的仿真服务、数据平台、安全和OTA服务等)

Apollo 2.0最新开放的模块包括了Security、Camera、Radar和Black Box,这意味着Apollo平台开放了云端服务、服务平台、参考硬件平台以及参考车辆平台在内的四大模块。Apollo 2.0新开放的安全和OTA升级服务,只允许正确和被保护的数据进入车内,并进一步强化了自定位、感知、规划决策和云端方阵等能力。其中Black Box模块包括了软件和硬件系统,能够实现安全存储和大容量数据集传输,可以帮助我们及时发现异常情况,提升整个平台的安全可靠性。

硬件方面,增加两个前向摄像头(长焦+短焦)主要用于识别红绿灯,正前方保险杠上方新安装了毫米波雷达。在Apollo 2.0开放了Camera和Radar的模块后,整个平台具备传感器融合的初步能力,增强了对昼夜简单城市道路工况的适应能力。

在今年的春晚上,百度Apollo开放平台率百余辆车队上了港珠澳大桥,并在自动驾驶模式下完成“8”字交叉跑的高难度动作。

那么如何在短时间内完成在大桥的自动驾驶demo的适配?先看一下Apollo的目录结构,里面有Docs、Modules、Scripts等子目录。Modules是Apollo所有模块的位置;Scripts包括一些常用的操作工具脚本;Third-party涉及到一些官方库,Tools则包含一些工具。

在Modules中,可以看到Apollo的各个主要模块。

Apollo采用base class和class factory架构,具有新模块、新功能的拓展能力。每一个开发者或者生态合作伙伴都可以很容易的把自己的部分添加到Apollo的框架里,从而得到有特色的自动驾驶能力。

主要模块之间的关系如下图所示。

由HD-Map支持的Localization模块产生地图和定位信息,整个系统都高精地图和定位信息为基础;以此为基础,对周边环境感知,障碍物的感知,与地图结合可以做红绿灯识别感知;预测模块基于感知结果做障碍物的行为预测;Planning模块根据障碍物预测的结果和Routing模块的信息做路径和速度的Trajectory决策规划;Control模块根据Planning的结果通过CANBUS模块控制车辆行驶。

Apollo系统是基于ROS平台的。ROS是大家在机器人领域非常熟悉的平台,百度和ROS达成了深入合作来降低开发者的门槛。ROS的特点主要包括完整的开发工具包,完整的计算调度模型,还有众多的调试工具以及已有的软件系统等。为了增强ROS在自动驾驶方面的能力,Apollo做了多项定制优化,如果在真实车辆上测试自动驾驶,建议开发者使用Apollo平台提供的ROS版本。

ROS的通信是基于ROS Topic的,Apollo主要的ROS Topic如图所示。开发者可以使用ROS原生工具查看调试Apollo。

有了这些基础以后,如何一步一步构建自动驾驶?

我们先演示一下没有实际整车条件下,也可以了解和验证Apollo的离线演示方式。

至此,就可以在浏览器上看到Apollo的DreamView演示。

车辆与循迹驾驶能力实战

接下来介绍车辆与循迹驾驶能力实战,这个步骤可以验证线控车和软硬件集成的基础能力。如下图黄框中所示,车辆循迹主要依靠的就是定位能力和控制能力。

如我们Apollo架构中介绍的,车辆平台需要由车厂来完成线控改装。在车辆平台上需要完成硬件设备的安装以及工控机配置,具体的安装方式可见Apollo的安装指南。在车辆和硬件平台之上,Apollo提供相应的软件能力支持,比如制动、动力、转向控制以及一些信息交互。

开发者可以通过Vehicle接口来增加自己的车辆,参见:

https://github.com/ApolloAuto/apollo/blob/master/docs/howto/how_to_add_a_new_vehicle.md

实现新车控制器

实现新消息管理器

在工厂类中注册新车

更新配置文件: canbus/conf/canbus_conf.pb.txt

CANCard也有很多要求,对小车大车的控制是不一样的,需要不同的算法。整体模块具有可插拔、可灵活配置扩展的特性。

实现新CAN卡类CanClient

在工厂类CanClientFactory中注册新CAN卡

更新配置文件: canbus/proto/can_card_parameter.proto

接下来创建一个控制器,在control_config文件中为新控制器添加配置,注册新控制器。

在车辆的基础上,Apollo提供高精度的定位能力,主要是通过多个传感器的融合定位保证高精度。我们会有另外一个专题讲定位技术,这里就不多讲了。

以上这些都准备好后,就开始做循迹自动驾驶。首先是录制,在Dreamview中的目录Quick Record下,单击Setup以启动所有模块并执行硬件运行状况检查。如果硬件健康检查通过,单击 Start 按钮开始记录驱动程序轨迹。到达目的地后,点击Stop 按钮停止录制。

其次是执行,在Quick Play下,单击 Setup 启动所有模块并执行硬件运行状况检查。要确保驾驶员准备好了! 点击 Start按钮开始自动驾驶。到达目的地后,点击 Stop 按钮停止重放录制的轨迹。

在这一系列工作完成后,就完成了Apollo1.0的自动驾驶能力。可以看到,经过高精定位能力的输出,循迹自动驾驶可以完成非常精准的动作,两车可以非常精准的交错行驶。

障碍物感知和路径规划能力实战

在Apollo 2.0里面提供了什么样的自动驾驶能力? 如下图黄框所示,在定位和控制的基础上,添加了感知和决策规划控制,这样就可以完成车辆的自动驾驶闭环。

主流的传感器包括摄像头、雷达和激光雷达。每一种传感器都是既有长处也有短板。例如摄像头对于障碍物分类有很好的表现,但想对障碍物速度做准确判断,摄像头就很难做到了。

对于雷达(Radar)来说,在距离和速度判断上有优势,穿透力非常好,但对于障碍物的分类能力,就比较弱了。

激光雷达通过主动发射能量,依靠回波来检测,所以对于判断障碍物的远近,例如暗光条件下障碍物的状态有优势。但是激光雷达目前还非常昂贵。

所以,我们要把这些传感器融合在一起,发挥各自所长。

当使用多个传感器的时候会碰到标定问题。由于传感器都是高精传感器,安装操作很难做到特别精准。为了有效使用多个传感器,我们需要对车辆上的传感器完成标定。因为我们在车辆安装时,很难把安装做到极精密,通过标定就可以知道安装的具体误差,然后通过计算来补偿。

LiDAR GNSS标定参考

启动64线激光雷达以及组合惯导系统。Novatel组合惯导初次上电时需要校准。此时应将车在开阔地带进行直行、左右转弯等操作,直至惯导初始化完成。

确认传感器数据的topic均有输出。

标定的地点需要选择无高楼遮挡、地面平坦、四周有平整的建筑物并且可以进行8字轨迹行驶的地方。

bash lidar_calibration.sh start_record/stop_record

程序会检测所录制的bag中是否含有所需的所有topics。检测通过后,会将bag打包成 lidar_calib_data.tar.gz 文件,内容包括录制的rosbag以及对应的MD5校验和文件

https://console.bce.baidu.com/apollo/calibrator/index/list

mkdir -p modules/calibration/data/[CAR_ID]/

其他标定请参考:

https://github.com/ApolloAuto/apollo/blob/master/docs/quickstart/apollo_2_0_sensor_calibration_guide_cn.md

装好传感器以后要有感知系统,而感知又分很多种,如:障碍物识别、障碍物分类、语义分割、目标跟踪,我们是怎么做的呢?

在Apollo中,我们以3D障碍物检测为例,介绍感知的流程。基于LiDAR的3D障碍物感知,其好处是可以不分昼夜并连续检测;我们在框架中使用深度学习,这样就可以很精准识别一些传统规则并解决很多疑难问题;我们使用了NVIDIA GPU,这样可以把巨大运算负载放在GPU上完成,从而高效率的进行感知处理。

为了识别一个障碍物,主要步骤是通过高精地图配置一个ROI过滤器,过滤出我们认为有效的数据;接着把特征值计算出来,通过CNN来完成每个区域的Segmentation,这样就可以有效地识别出物体;通过MinBox,完成障碍物边框构建;最后通过HM对象跟踪就可以感知到障碍物的轨迹,计算速度。

做三维检测的时候需要处理激光点云,根据高精地图把我们感兴趣的部分过滤出来,激光点云做特征化后,导入CNN网络,通过边缘识别合成一个一个物体,最后就可以把物体在坐标系中表达出来。通过把不同帧上的物体串联在一起,可以完成对物体的追踪。有了不同帧上的物体轨迹,就可以知道它的位置,它的速度是多少。

在Apollo上有Lidar的检测,有毫米波的检测,还有基于图像的红绿灯的识别,这些东西如何融合到一起?多传感器融合,依赖于Perception fusion DAG框架。如下图所示,通过构造算法subnode,并且通过DAG描述连接到一起,开发者就可以完成定制的多传感器感知和融合。

如何规划一条有效的路径来自动驾驶?以EM为例,如下图所示,Planning Structure由ReferenceLine、HD-Map 、EM Planner的几部分构成。

通过DP路径算法,得到成本最低的可调路径。我们将求解过程离散化。好处是:受道路中心线影响低;成本函数形式不单一,适应复杂路况;天然适合并行化。解决了decision 的基于规则优化的痛点。另一方面,这一步DP算法的结果,但并不完美,不是最优解,衔接点处形式固定,即使平滑但路线较为僵硬,复杂情况处理不够平滑。

如下图,通过一样的DP逻辑,我们可以完成s,t坐标系下的DP规划。在此基础上,进一步做QP优化和迭代调整,就可以得到有效的Planning结果。

最后创建一个Planner:将新的Planner配置添加到modules/planning/conf/planning_config.pb.txt文件中;在module/planning/planning.cc中注册新的Planner。

“云+端”研发迭代新模式 Cloud + Vehicles

从上面的自动驾驶开发过程可以看到,百度Apollo采用了“云+端”研发迭代新模式,加速自动驾驶汽车研发效率。百度在自动驾驶研发中积累海量的数据,把这些积累的数据用云端的服务器集群高效地生成人工智能的模型,也就是车辆大脑。把汽车大脑更新到车辆上,车辆就被赋予了自动驾驶的能力。

自动驾驶数据可以分为四大类:自动驾驶车辆产生的数据首先是原始数据。主要是传感器数据、车辆自身数据、驾驶行为数据等。这些数据的特点是数据量极大、类型多样、以非结构化半结构化数据为主。无论对存储、传输、处理都构成比较大的挑战。

数据平台是百度支撑智能汽车的“云+端”研发迭代新模式的核心平台。由数据采集与传输,自动驾驶数据仓库,自动驾驶计算平台三个部分构成。首先是数据采集与传输部分。使用Data-Recorder会按Apollo数据规范产生,完整的、精确记录的数据包,可以完成问题复现,也同时完成数据积累。通过传输接口,可以将数据高效地传输到运营点和云集群中。

接着是自动驾驶数据仓库部分,会将全部海量数据成体系地组织在一起,快速搜索,灵活使用,为数据流水线和各业务应用提供数据支撑。

自动驾驶计算平台部分,基于云资源异构计算硬件提供超强算力,通过细粒度容器调度提供多种计算模型,来支撑起各业务应用。如训练平台、仿真平台、车辆标定平台等等。

为了在深度学习中使用数据,还需要大量标注数据。百度标记数据集中,主要有红绿灯数据集,障碍物数据集(2D、3D),语义分割数据集,自由空间数据集,行为预测数据集等等。

为了刻画自动驾驶行为,还需要将数据抽象成逻辑数据。主要是完美感知数据,环境抽象数据,车辆动力学模型等。

最后,我们还为仿真构建仿真数据,主要是参数模糊化数据,三维重建数据,互动行为数据等。

Apollo开放了6个标注数据集:

激光点云障碍物检测分类

提供三维点云标注数据,标注四类障碍物:行人、机动车、非机动车及其他,可用于障碍物检测和分类算法的研发和评测。

红绿灯检测

提供了常见竖式红绿灯的图像数据。采集时段为白天,采集天气覆盖晴天、阴天和雾天,分辨率为1080P。

Road Hackers

本数据集有两种主要类型数据,街景图像和车辆运动状态。街景图像提供车前图像,车辆运动状态数据则包括车辆的当前速度和轨迹曲率。

基于图像的障碍物检测分类

数据采集涵盖城市道路和高速场景,由人工标注出四大类障碍物:机动车、非机动车、行人及静态障碍物,可用于视觉障碍物检测识别算法的研发和评测。

障碍物轨迹预测

采样数据来源于多源传感器的综合抽象特征,每组数据提供62维车辆和道路相关信息,可用于障碍物行为预测算法的研发和评测。

场景解析

数据包括了上万帧的高分辨率RGB视频和与其对应的逐像素语义标注,同时,提供了具有语义分割测量级别的稠密点云、紧急情况的立体视频以及立体全景图像。

此外,我们还开放了ApolloScape数据集,目前规划到20万帧级别,在3月8日已经开放了第一批,有8万帧的数据集,是用相机以及激光雷达扫描的场景。

ApolloScape对整个学术界都会有比较大的帮助,已经公开的数据中无论是数据本身还是质量都有一些特色。我们还跟会在近期发布一些,希望大家也能参与到整个算法中来。

百度还通过Apollo训练平台为每一个数据集提供类配套的计算能力。训练平台的特色是:通过Docker+GPU集群,提供与车端的一致硬件计算能力。集成多种框架,提供完整的深度学习解决方案。通过交互式可视化结果分析,方便算法调试优化。

在自动驾驶的算法开发中,最大的痛点之一就是需要对海量数据集,反复尝试。通过将深度学习算法的研发流程(开发、训练、验证、调试)在云端实现,可以在充分利用云端大量计算资源的同时,将数据的流动仅在云端的服务器内完成,从而大幅提高算法研发效率。具体来说,首先开发者在本地开发机中基于Docker开发算法,并部署依赖环境。接着将开发好的环境推到云端的私有Docker Repository中。

接下来在平台上挑选数据集,发起训练任务。Apollo训练平台的云计算调度就会将任务调度到计算集群上执行。这个过程中,在云集群的内部,开发者的程序使用数据获取接口,获得自动驾驶数据仓库中的数据集。最终由业务管理框架将执行过程、评估的结果和Model返回给可视化平台,完成可视化的调试。

在云上训练出来算法,然后可以把算法运用到车上来,这相当于有无数辆车来跑,无数辆车在验证和优化算法。因为云有几十万台服务器,可支持众多车辆的验证。

同时在Apollo开放平台也有仿真器。下面是一个红绿灯检测的DEMO算法。

SSD: Single Shot MultiBox Detector

https://arxiv.org/abs/1512.02325

https://github.com/weiliu89/caffe/tree/ssd

每个朋友都可以上去注册一个帐号来体验整个流程,有各种各样的场景,可以看到自己的模型和代码在仿真器里跑起来。可以看到即使在下雨的状况下,红绿灯的识别也很好。

———————————————————

免责声明:

1.本文援引自互联网,旨在传递更多网络信息,仅代表作者本人观点,与本网站无关。

2.本文仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

发表评论
你可能也喜欢