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