百度自动驾驶系统Apollo源码分析
Apollo(阿波罗)是百度今年发布的汽车自动驾驶系统,它是不是可以无人驾驶?安全性又如何保证?下面我们就来看看自动驾驶指的是什么,以及它是如何实现的.
自动驾驶评级
先来看看什么是自动驾驶,2014年,SAE International(国际汽车工程师协会)制订了一套自动驾驶汽车分级标准,其对自动化的描述分为5个等级。
自动驾驶评级
从辅助驾驶到全自动驾驶,都属于自动驾驶,只是级别不同,现在有很多车已经配置了定速巡航,自动泊车,这是从L1走向L2阶段;而L3是说人可以不进行主动驾驶,但需要时刻保持注意力;据说Google的Waymo自动驾驶系统已达到L4水平,它能在特定地理区域和条件下,完成整个动态驾驶任务.大家离L5还都有一段很长的路要走.百度的目标是2019年量产L3的汽车.
同样是自动,但是程度不同,具体要看:设计运行范围(operational design domain,简称ODD),它包括地理位置、道路类型、速度范围、天气、时间、国家和地方性交通法律法规等等.
硬件
下面来看看自动驾驶的汽车和普通汽车有什么不同,如图所示,自动驾驶汽车一般都包含:视频系统(摄像头), 传感器(雷达,激光雷达,GPS…), 它们用于建立场景和捕捉前后左右的距离,速度, 判断自已位置,同时车辆内部通过CAN总线监测车辆本身的情况, 并控制速度, 转向, 制动等等.当然还需要软件算法.
硬件
软件
软件收集硬件传来的视频和传感器数据, 进行数据处理并做出决策.其中包括: 感知当前的状态(车辆, 行人, 交通标志,动态,静态), 预测之后的状态, 以及做下一步的规划(整体线路,当前决策), 这有点像下棋.
出于安全性的考虑,大多数时候汽车不能上街测试,因此自动驾驶的开发过程中一般都使用虚拟系统,虚拟车辆在虚拟街道上运行的时候,还可以模拟其它车辆,行人,以及各种出错和违规的状态,模拟可能遇到的多种情况,以及车辆间的交互,它创建了增强学习的条件.使算法更快速地成长起来.
模拟环境
安装Apollo系统
Apollo是个开源的软件系统,可从git上下载源码,下面来看看具体的下载编译方法.
$ git clone https://github.com/ApolloAuto/apollo
下载后,apollo目录下有安装说明README_cn.md,按此说明安装即可
$ cd docker/scripts/
$ ./install_docker.sh
此时如果报错找不到docker-engine,可用命令$ wget -qO- https://get.docker.com/ | sh手动安装docker,您可以把Docker理解成轻量的虚拟机,虚拟出单独的环境.运行一些特殊的程序,并把它和机器上其它程序隔离开.
$ sudo ./dev_start.sh
此处会下载docker的镜像文件,16G数据下载到/var/lib/docker目录下,建议根分区留足空间,或者将该目录软链接到其它分区,做链接时需要暂时把docker服务停掉 $service docker stop/start
$ sudo ./dev_into.sh
此时就进入了docker,可以编译了
$ bash apollo.sh build
编译时请耐心等待,我的机器速度还可以,编了两个多小时,编译过程中在$HOME/.cache/.bazel中产生大约5G数据.
$ bash scripts/hmi.sh
启动人机交互界面,此时在浏览器中打开http://localhost:8887,即可看到apollo界面了.
Apollo源码分析
源码主要是c++实现的,也有少量python,git下载几百兆,其实代码不太多,主要是地图和数据了大量空间,主要程序在apollo/modules目录中,我们把它分成以下几部分(具体说明见各目录下的modules):
- 感知:感知当前位置,速度,障碍物等等
Apollo/modules/perception - 预测:对场景下一步的变化做出预测
Apollo/modules/prediction - 规划:
(1) 全局路径规划:通过起点终点计算行驶路径
Apollo/modules/routing
(2) 规划当前轨道:通过感知,预测,路径规划等信息计算轨道
Apollo/modules/planning
(3) 规划转换成命令:将轨道转换成控制汽车的命令(加速,制动,转向等)
Apollo/modules/control - 其它
(1) 输入输出
i. Apollo/modules/drivers 设备驱动
ii. Apollo/modules/localization 位置信息
iii. Apollo/modules/monitor 监控模块
iv. Apollo/modules/canbus 与汽车硬件交互
v. Apollo/modules/map 地图数据
vi. Apollo/modules/third_party_perception 三方感知器支持
(2) 交互
i. Apollo/modules/dreamview 可视化模块
ii. Apollo/modules/hmi 把汽车当前状态显示给用户
(3) 工具
i. Apollo/modules/calibration 标注工具
ii. Apollo/modules/common 支持其它模块的公共工具
iii. Apollo/modules/data 数据工具
iv. Apollo/modules/tools 一些Python工具
(4) 其它
i. Apollo/modules/elo 高精度定位系统,无源码,但有文档
ii. Apollo/modules/e2e 收集传感器数据给PX2,ROS
自动驾驶系统先通过起点终点规划出整体路径(routing);然后在行驶过程中感知(perception)当前环境(识别车辆行人路况标志等),并预测下一步发展;然后把已知信息都传入规划模块(planning),规划出之后的轨道;控制模块(control)将轨道数据转换成对车辆的控制信号,通过汽车交互模块(canbus)控制汽车.
我觉得这里面算法技术含量最高的是感知perception和规划planning,具体请见代码.
Apollo开发者支持
点开Apollo网站的开发者界面 http://apollo.auto/opendata_cn.html 选择"立即进入",即可看到给开发者提供的数据和测试资源. 确实有点超乎我的想像,尤其是仿真平台,有了它,没有车的情况下,也能做很多工作.而且文档也挺全的.(上传测试好像需要上传docker的img,看起来比较大,这个我也没仔细研究,也可能是看错了)
总结
自动驾驶发展到今天,离不开整体智能领域的发展,比如图像识别,各种高精度的传感器,地图数据,算法的进步都是自动驾驶的基础,并且仍在不断进步.而该领域的技术,之后也会被迁移到其它领域,比如机器人的三维场景定位,行为判断等等.
目前虽然离完全脱离人类操作还有一段距离,但自动驾驶中的各种技术越来越多地在新型汽车上得到应用,这个领域还是挺值得学习和期待的.
参考
- 你怎么看待百度自动驾驶Apollo 1.5版本?
https://www.zhihu.com/question/65638509/answer/236251671 - Apollo自动驾驶框架试玩
http://www.cnblogs.com/hackcat/archive/2017/07/06/7126042.html - 全网唯一完整译文 | Waymo无人车报告:通往自动驾驶之路
https://www.leiphone.com/news/201710/JknkYopJ14gVMSyK.html