Apollo作为自动驾驶平台,学习者如何从硬件、软件等方面快速入门。同时,课程还会介绍Apollo的部署安装以及仿真平台的使用。
一、Apollo自动驾驶架构介绍
我们还记得,自动驾驶硬件架构:一般采用激光雷达作为主要感知传感器,同时结合摄像头、GPS/IMU、毫米波雷达、超声波雷达等,一NVIDIA Drive PX2或者Xavier作为主要计算平台,在工业PC机上运行各种算法模块,通过线控技术控制车辆行驶。
底层车辆平台执行Apollo无人驾驶平台的车辆控制指令。为了能够运行Apollo生成的指令,车辆必须是线控的,例如可以接受一定的指令,比如换挡、加减速、转向,完成对应的操作。
传感器层主要是集成各种传感器对汽车周围环境进行感知,包括GPS、IMU、相机、激光雷达、毫米波雷达、超声波雷达等。无人驾驶系统对算力的要求非常高,所以在Apollo上安装一台高性能工控机(IPC)机。
Apollo 中GPS/IMU主要是用于自定位。相机的功能主要是做红绿灯识别。主传感器激光雷达主要用来感知车辆周围环境。在百度内部使用了Velodyne 64线激光雷达和国产禾赛的Pandora。Apollo 3.0时,我们开放了更多的激光雷达型号,例如16线速腾聚创(Robosense)、16线镭神科技等等。毫米波雷达主要用来做远距离的跟车、障碍物的检测等。超声波雷达主要用来做五米范围之内的障碍物的检测;HMI是对车辆发指令的一些设备,例如平板。Blackbox是百度开放的一个商业化硬件,它记录一些内部数据,例如关键时刻的执行操作,类似于飞机上的黑匣子。在Apollo 3.0,我们发布了一些硬件开发平台,成为Sensor Unit(ASU)。
核心软件层又可以细分为三层:最下面的是RTOS实时操作系统,在Apollo中,我们使用打补丁的方式来实现实时的效果。中间层是Runtime Framework。这一层,我们用的是ROS,主要是为上层的模块提供数据层支持。最上面一层是Apollo各个功能模块实现部分,包括地图引擎、定位、感知、规划、监管、控制、端到端以及HMI等。
最上层的云服务层提供了高精度地图服务、模拟仿真、D阿塔、 Platform、安全和更新、DuerOS等。
对于高精度地图,在中国,个人并不具备制定高精度地图的资历和能力,因为政府对地图的绘制有极其严格的限制力度。所以Apollo便将高精度地图通过云服务的方式对外开放。
二、Apollo平台的快速入门
本节主要分享Apollo的快速入门方法,包括编译、高精度地图和实时相对地图、一些调试工具以及新加入的计算单元和模块。
下图是大家对于无人驾驶方面比较感兴趣的地方进行的统计如下:
Docker是一种容器的技术,它在是Linux内核的基础上做了一些轻量级和隔离机制的优化,让环境更小,部署起来更快。
利用Docker可以使整个工程的安装更加简单。Docker镜像通常是一个配置好的运行环境,包括依赖的第三方库等,使得用户不需要对环境编译做过多复杂的操作。
例如,在Release版本中,Apollo各个模块是一个已经编译好的二进制文件,可以直接运行;如果是开发版本,通常已经加载了所需的第三方库,用户只需要执行对应的编译指令。
要完成自己硬件的集成,需要遵循以下三步:
第一步是原始的UDP(User Data Packet,用户数据包)。
第二步是做一个ROS Driver 方法,把驱动编译到Apollo里面
第三步是把数据发布出来
如何使用不同于参考硬件的传感器?
我们举出以下两个例子,如下所示:
第一个例子是如何用一个新型号的Camera,假设是USB接口的相机。如下图所示:最下层是相机硬件;往上一层是一个标准的底层驱动,即Video for Linux driver;再上一层是一个ROS Driver,最上层是Apollo可以接收到的内容。要使用该相机,主要的工作是底层硬件的解析,使得Apollo可以接收到相应的数据。
第二个例子就是激光雷达。它的工作流程大致为:硬件通常基于内核Socket的方式把数据传输到PC,PC端做一些数据处理之后发布的对应消息类型。对于激光雷达而言,发布的是Pointcloud 消息类型,该消息将被最上层的Apollo感知模块接收如下所示:右侧给出了ROS Driver如何解析UDP数据包的过程。
编译安装Apollo的步骤大致分为三个阶段
第一个阶段是在Ubuntu环境下进行操作,包括下载Apollo源码,安装Docker。Docker的安装方式有在线和离线两种方式,大家可以根据网络选取合适的安装方式。
第二阶段是进入Docker,拉取Apollo镜像,并以此创建容器。
第三阶段是进入容器,编译源码
编译结束以后可以做RTK循迹测试。RTK循迹测试就是把车辆底盘发出的这些主题和定位输出进行融合。
下图是一个高精度地图,其右侧是相对地图,实时相对地图是车辆通过传感器来感知车身周围环境,可以帮助开放者更友好、方便运行Apollo。
Apollo提供了一些非常有用的工具,帮助开发者提供效率,如下所示:
此外还提供了DBC文件转换工具、Teleop、主题监控工具、配置工具等。DBC转换工具解析车辆DBC文件,生成对应的Protobuf。Teleop工具可以通过键盘控制的方式实现车辆的信号发布。
主题监控工具可以同时需要监听多个ROS topic。Configuration工具明确标识出来修改了哪些字段。另外,Apollo还提供了面向Rosbag的一些工具,包括分析规划模块、驱动以及统计信息等,如图所示。
交通模拟工具可以通过脚本的方式控制地图的红绿灯变化情况,对车辆进行测试,如图所示:
该模块是整个Apollo项目可视化的一个模块,基于该模块,开发者可以在没有车和传感器的情况下使用Apollo各个软件模块。
分三步:
第一步:安装基础环境
第二步:拉取Docker镜像并创建容器
第三步:进入容器编译源码
1.首先是安装git,因为Apollo代码是托管在github平台上,所以需要git工具,然后使用git将Apollo源码克隆到本地。
2.下载源码后,还要安装Docker环境,可以使用Apollo提供的脚本安装,也可以在官网安装。
3.环境安装完成后,运用官方提供的脚本拉去Apollo Docker镜像文件,运行dev_start.sh-C命令。其中-C选项表示使用中国服务器进行加速。在拉取成功之后,该脚本会基于镜像创建一个容器Container。
4.接下来是对Apollo的操作,如果没有编译,需要先使用apollo.sh脚本进行编译。它有很多编译选项,默认的是Build和OP。还可以选择面向GPU编译。RS是对RB速腾聚创的激光雷达进行编译,USB Camera是对Camera的编译,这几种编译方式所涉及的类不同,所以使用的编译方式也不尽相同。
5.编译完成之后,需要对Apollo各个模块进行调试,我们会在每个版本发布的时候给出对应的Rosbag数据包,方便去做验证。比如说Apollo 1.0提供了一个循迹数据包,2.0时发布了一个激光点云的数据包。
6.我们可以启动bootstrap.sh脚本,对Apollo的bag进行回放,看一下效果。这是一个引导脚本,它做了以下事情,启动进程守护工具Supervisor,假如有进程出现不可预知的异常,这些进程通常会挂掉,经过配置后Supervisor可以保证在进程挂掉后,会将该进程拉进来。然后启动Roscore、voice_dectore和Dreamviewer。
7.对于Apollo平台,很多的模块都被启动,交由Supervisor进程进行监控,包括Can Bus、 激光雷达、控制模块、GPS、Mobileeye、NG等模块。
8.在运行完bootstrap.sh脚本之后,在浏览器地址栏输入localhost:8888查看Demo的演示效果。Demo加载bag对应的数据,包括车辆的数据、障碍物数据、绿色障碍物ID、速度、形态。车在运行过程中需要查看的不仅仅是仿真出来的场景,还要看一些跟Planner、控制相关的信息。
仿真平台的使用方式大概分为以下几个步骤,如下图所示:
四、Azure仿真平台使用
Azure是一种灵活和支持互操作的平台,它可以被用来创建云中运行的应用或者通过基于云的特性来加强现有应用。它开放式的架构给开发者提供了Web应用、互联设备的应用、个人电脑、服务器、或者提供最优在线复杂解决方案的选择。
图中左侧的Build用来做持续集成,由于有很多的开发者会提交自己对Apollo修改后的代码,我们不可能每次都把代码下到本地进行验证。为了简化验证,团队会把已经编辑好的测试运例来测试开发者提交的代码是否正确,以此来判断开发者的代码对目前的Master的分支有影响。Build提供了对开发者代码验证的一种渠道。
Simulation主要用来验证代码的鲁棒性。Apollo团队在微软的Azure仿真平台上部署了很多场景,拿最新的代码去做这些场景下进行验证和测试,看相应模块在这些场景的
执行情况,最终得到代码的鲁棒性报告。该平台的地址是azure.apollo.auto。在该仿真平台运行自己的代码是不需要进行本地编译的,其使用流程如下所示:
首先是克隆Apollo在Github上的代码
然后再本地对相应的模块进行修改,例如Planning。
将代码提交到自己再Github的Apollo仓库中,可以是Master分支也可以是新建的分支
最后再微软Azure仿真平台选择目标场景对更新后的代码进行验证
运行之后会拿到一个报告,表示修改的代码再不同场景下的执行情况。如下图所示:
其中第一列的Scenario是一些场景,在仿真平台中,我们会把一段很长的路切割成很多的场景,比如有左转、左转有行人、有行人横插等。后面几列是对应场景的状态描述,Run Status表示场景的运行状态,如果后面的指标有一个失败,那么Run Status就是失败的。具体衡量的指标有:
碰撞检测、速度校验、On Road检测、Red-Light检测(是否有闯红灯的情况)、ARW检测(是否成功到达目的地)、Hard Break(急刹车)、加速度(它是影响体感的一个指标)。
本次对仿真平台的学习就到这里了,有什么不懂得地方可以一起探讨哦。