前端
自百度宣布开放Apollo自动驾驶平台以来,不少开发者很是期待能够深刻了解Apollo平台的开放内容,以便更充分高效的利用这个自动驾驶平台,研究并落地本身对于自动驾驶的诸多想法。git
为此,7月22日,由百度开发者中心主办、极客邦科技承办的73期百度技术沙龙设置Apollo主题,现场百度资深架构师从Apollo的开放能力、Apollo代码开放框架以及基于深度学习的End to End自动驾驶方案三个技术维度作了深度分享,以期帮助开发者深度了解百度Apollo开放内容和平台架构,设计并实现一套完整的驾驶方案。InfoQ整理了讲师演讲精彩内容,具体详情可查阅讲师演讲PPT深刻了解。github
百度资深数据平台专家杨凡作了开场演讲,他表示:“Apollo开放内容实质上分为两大部分:能力开放和资源开放,能力开放提供开发者实现车上自动驾驶的平台,资源开放提供开发者探索算法进化的平台,这两者相辅相成,缺一不可。”算法
Apollo1.0主要开放的是封闭场地循迹自动驾驶的框架,从上之下分别是服务层、软件平台层、参考硬件层以及参考汽车层,其中标蓝部分为具体开放模块。这一次开放的模块以下:docker
以上四层构成了百度Apollo自动驾驶平台的整个技术栈。目前开放的 Apollo1.0具备高效易拓展架构、当即可用硬件、一键启动更新和完备的开发工具四大特性。编程
Apollo1.0在资源上开放了三个关键数据集:2D红绿灯、3D障碍物以及Road Hackers。百度将这三部分数据开放至云端,以便用户高效研究运用。下图为Apollo数据开放平台的架构逻辑介绍。安全
用户经过云端Docker Repository,下载基于本地的VM + Docker的开发环境,编写训练和预测两部分算法,配置依赖环境。经过云端用户空间的可视化训练调试平台,将用户在本机建立的算法容器,在云端实现调度,展开训练评估调试。这样用户能够在整个云中的数据开放平台中,基于海量数据利用集群的CPU+GPU资源训练调试model,并在其中选取有效的model使用。性能优化
现场,杨凡亲自展现了Apollo平台的使用流程和使用方法,本文再也不此赘述,想要动手实践的读者能够移步至Apollo官网 apollo.auto,在“开发者”/“数据开放平台”页面有详细的使用介绍。bash
自动驾驶系统包括障碍物检测、红绿灯识别、驾驶行为决策、路径规划等系列复杂的功能模块,如何将这些独立而又相互依赖的模块集成在一块儿,构建成一个稳定的运行系统,是一个巨大的挑战。百度资深架构师何玮从百度为什么选用ROS系统、Apollo中ROS的改进实践、Apollo框架使用介绍三个角度分享了ROS在百度自动驾驶的探索和实践。微信
在百度为什么选用ROS系统的问题上,何玮给出解释,ROS是一个强大而灵活的机器人编程框架,同时也是学术界使用最普遍的框架,它具备三大特性:完整的开发工具包、灵活的计算调度模型以及丰富的调试工具,可以统一提供配置管理、部署运行、底层通讯等功能,让开发者将更多精力放在算法功能的研发上,快速构建系统原型,验证算法和功能。
ROS系统的优点显而易见,但其在Apollo平台的应用中也并不是一路顺风。百度在作研发调试到产品化的过程当中,遇到的很多情况,针对这些问题,百度从通讯功能优化、去中心化网络拓扑以及数据兼容性扩展三个方面作了定制化的改进。
一、通讯性能优化:共享内存
问题:自动驾驶系统为了可以感知复杂的道路场景并完成驾驶任务,须要多种传感器协同工做,以覆盖不一样场景、不一样路况的需求。而主流的多传感器融合方案至少会包含一个激光雷达和多个相机,如此大的数据量对通讯的性能有很大的挑战。
解决方案:百度采用的解决方案是共享内存,减小传输中的数据拷贝, 提高传输效率。
二、去中心化的网络拓扑:使用RTPS服务发现协议
问题:ROS并不是彻底的分布式框架,每一个ROS网络中须要有一个中心节点ROS Master,各个节点在初始化时会像Master注册拓扑信息并获取其余节点的信息。这种方式有两个缺点:一、Master做为系统的单点,一旦崩溃整个网络将不可用;二、Master缺少异常恢复机制,崩溃后没法经过监控重启等方式自动恢复。
解决方案:为了解决这个问题,百度在ROS在框架加入了基于RTPS协议的服务发现功能。整个网络拓扑再也不以master为中心构建,而是经过域的概念进行划分。当一个新的节点加入网络时,会经过RTPS协议向域内的全部其余节点发送广播信息,各个节点也会将本身的服务信息发送给新的节点,以代替Master的信息交换功能。
经过这种方式,可以使ROS网络的拓扑发现再也不依赖Master单点,提升了系统的鲁棒性。同时该修改彻底基于ROS底层的修改,对上层应用程序彻底透明,开发者也不须要对此功能有任何的代码适配工做。
三、数据兼容性扩展:用Protobuf替换Message
问题:ROS系统为了保证收发双方的消息格式一致,会对message定义作MD5校验,任何字段的增减或顺序调整都会使MD5变化,以保证系统的健壮性。然而这种严格的限制也引发了兼容性的问题,当接口升级后,不一样的模块之间再也不可以通讯,大大增长了模块版本之间的耦合。
解决方案:使用protobuf来替换ROS中的Message来做为消息定义的格式。protobuf自己有良好的兼容性支持,只须要在使用中定义好required字段,后续新增optional字段并不会对消息的解析形成影响。
随后,何玮简单介绍了Apollo框架的使用方法:
目前Apollo开源代码已上传至Github网站,具体连接为:github.com/apolloauto,感兴趣的码农们可前往查阅相关的工具和文档。
开发者想要基于Apollo平台设计一套完整的自动驾驶系统,前提须要了解百度的自动驾驶系统选择和方案详情,百度自动驾驶事业部资深架构师郁浩为你们分享了基于传统Rule Based与End to End自动驾驶方案的异同与优劣,以及Apollo平台在数据和模型上的实践。
郁浩表示,目前,业界和学术界主流仍是Rule based系统。Rule based从车辆、到传感器感知、World model、而后进行决策、控制、最后到车辆,造成了比较完整的闭环系统。不过,其在实际的应用上仍是有比较明显的瓶颈:系统复杂(人工设计)、高精地图成本高(须要广铺以及实时更新),计算性能(资源浪费)。而End-to-End方式可以很好的解决这些问题。下图为Rule based与End-to-End优劣对比。
经过对比,能够看到End-to-End方案虽然解决了Rule based在应用上的部分缺点,但其在基本功能实现上须要进一步的探索和实践。郁浩认为,这两种方案,均有各自的优劣势,在现阶段,没法彻底依靠某一种深度学习方案实现自动驾驶功能,Rule based和End-to-End在将来的趋势上必将是吸取对方的优势进行融合而绝非对立。
数据产生分通常两类,一类是真实数据,一类是模拟器数据。目前,关于中国国情的真实数据很是稀少,模拟器数据虽然能在必定的能况下起借鉴做用,但大多经过游戏渲染出来的,其渲染的纹理与真实场景的纹理千差万别,几乎没法用到真实的道路上。
百度在这方面投入甚高,每一年都会使用大量数据车实地采集几百万千米的数据进行分析。郁浩表示,本次开放的数据主要摘取了前向数据,包括Image、RTK-GPS以及IMU等,每个开源的数据文件对应一次采集任务。这里比较有意思的是,百度没有直接开源出精准坐标,而是根据坐标参数繁衍出1/R数据(,拐弯半径的倒数)和纵向指令。开发者能够里利用它与车厂合做,直接上路行驶。
百度在去年的时候使用的是简单的横向模型CNN以及纵向控制模型Convolutional-LSTM,今年,百度将这两者融合到一块儿,采用的横向+纵向的模式:LRCN,该模型须要关注点时序处理、横纵向关联关系、因果VS轨迹预测、Attention 机制、迁移等问题,即可以精准的预测出周围的环境。
郁浩最后总结道,自动驾驶的模型构建还在探索阶段,百度但愿与开发者和合做伙伴一块儿,经过资源和能力的开放,开发出一套真正智能、完整、安全的自动驾驶解决方案。