解析百度Apollo自动驾驶平台
解析百度Apollo自动驾驶平台
发布时间:2024-04-11 18:25:36 来源:乐鱼华体会 作者:乐鱼官网app下载
乐鱼平台
  • 一级公路
    一级公路
  • 高速公路
    高速公路
在线订购
24小时免费咨询热线
产品详情

  最近对百度的自动驾驶平台Apollo项目做了一些了解。下面将我所了解到的一些信息分享给大家。

  阿波罗(Apollo)是百度发布的面向汽车行业及自动驾驶领域的合作伙伴提供的软件平台。发布时间是2017年4月19日,旨在向汽车行业及自动驾驶领域的合作伙伴提供一个开放、完整、安全的软件平台,帮助他们结合车辆和硬件系统,快速搭建一套属于自己的完整的自动驾驶系统。而将这个计划命名为“Apollo”计划,就是借用了阿波罗登月计划的含义。

  可以在这里感受一下Apollo的实车驾车体验:CES 2018 百度Apollo 2.0无人车美国桑尼维尔试乘。

  对于自动驾驶,SAE(Society of Automotive Engineers,美国汽车工程师学会) International于2014年发布了从全手动系统到全自动系统六个不同级别的分类系统,这6个级别的描述如下:

  :Apollo(阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。

  :Apollo开放平台,为你提供技术领先、覆盖广、高自动化的高精地图服务;全球唯一开放,拥有海量数据的仿真引擎;全球开放数据量第一,基于深度学习自动驾驶算法End-to-End。

  :Apollo开放平台,你可以更快地研发、测试和部署自动驾驶车辆。参与者越多,积累的行驶数据就越多。与封闭的系统相比,Apollo能以更快的速度成熟,让每个参与者得到更多的受益,同时Apollo平台也将在你的参与之下变得更好!

  编译完成之后,可以在电脑上通过该项目提供的Dreamview功能来熟悉环境,Dreamview通过浏览器访问,其界面看起来是这个样子:

  ROS全称是Robot Operating System。它包含了一套开源的软件库和工具,专门用来构建机器人应用。其官网地址在这里:。

  在一个ROS系统中,包含了一系列的独立节点(nodes)。这些节点之间,通过发布/订阅的消息模型进行通信。例如,某个传感器的驱动可以实现为一个节点,然后以发布消息的形式对外发送传感器数据。这些数据可以被多个其他节点接收,例如:过滤器,日志系统等等。

  ROS系统中的节点可能位于不同的主机上,例如:在一个Arduino设备上发布消息,一台笔记本电脑订阅这些消息,一个Android手机也监测这些消息。

  ROS系统中包含了一个主(Master)节点。主节点使得其他节点可以查询彼此以进行通讯。所有节点都需要在主节点上进行注册,然后就可以与其他节点通讯了。如下图所示:

  节点之间通过发布和订阅主题(Topics)进行通讯。例如,在某个机器人系统中,位于机器人上有一个相机模块可以获取图像数据。另外在机器人上有一个图像处理模块需要获取图像数据,与此同时还有另外一个位于个人PC上的模块也需要这些图像数据。那么,相机模块可以发布/image_data这个主题供其他两个模块来订阅。其结构如下图所示:

  自动驾驶车辆中包含了大量的传感器,这些传感器可能以非常高频的速度产生数据,所以整个系统对于数据传输效率要求很高。在ROS系统中,从数据的发布到订阅节点之间需要进行数据的拷贝。在数据量很大的情况下,很显然这会影响数据的传输效率。所以Apollo项目对于ROS第一个改造就是将通过共享内存来减少数据拷贝,以提升通信性能。如下图所示:

  前文我们提到,ROS系统中包含了一个通信的主节点,所有其他节点都要借助于这个节点来进行通信。所以,很显然的,假如这个节点发生了通信故障,就会影响整个系统的通信。并且,整个结构还缺乏异常恢复机制。

  所以Apollo项目对于ROS的第二个改造就是去除这种中心化的网络结构。Apollo使用RTPS(Real-Time Publish-Subscribe)服务发现协议实现完全的P2P网络拓扑。整个通信过程包含下面四个步骤:

  在ROS系统中,使用msg描述文件定义模块间的消息接口。但不幸的是,接口升级之后不同的版本的模块难以兼容。

  Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。它不依赖于语言和平台并且可扩展性极强。现阶段官方支持C++、JAVA、Python三种编程语言,但可以找到大量的几乎涵盖所有语言的第三方拓展包。

  Perception:感知模块识别自动车辆周围的世界。在Perception模块中有两个重要的子模块:障碍物检测和交通灯检测。

  Control:Control模块通过生成诸如节流阀,制动器和转向的控制命令来执行计划的时空轨迹。

  Localization:该模块利用各种信息来源,例如GPS,LiDAR和IMU来估计自动车辆所在的位置。

  每个模块都作为独立的基于CarOS的ROS节点运行。每个模块节点都会发布和订阅某些主题。订阅的主题用作数据输入,而发布的主题用作数据输出。

  阅读这些源发现,这些核心模块的类都继承自一个公共基类ApolloApp,相关结构如下图所示:

  在apollo_app.h这个头文件中,还包含了一个宏以方便每个模块声明main函数,相关代码如下:

  每个模块的根目录都包含了一个README.md文件,是对这个模块的说明。我们可以以此为入口来了解模块的实现。

  自动驾驶车辆通过前置摄像头和雷达与最近的车辆(closest in-path vehicle,简称CIPV)保持距离。子模块还预测障碍物运动和位置信息(例如,航向和速度)。Apollo 2.5支持高速公路上的高速自动驾驶,无需任何地图。深度网络算法已经学会处理图像数据。随着收集更多数据,深度网络的性能将随着时间的推移而提高。

  Perception模块需要根据输入信息快速的解析出两类信息,即:道路和物体。其中的深入网络基于YOLO算法。

  Apollo 2.5不支持高曲率,没有车道标志的道路,包括当地道路和交叉路口。感知模块基于使用具有有限数据的深度网络的视觉检测。因此,在发布更好的网络之前,驾驶员在驾驶时应小心谨慎,并始终准备好通过将车轮转向正确的方向来解除自主驾驶。

  而对于物体来说,又分为静态物体和动态物体。静态物体包括道路和交通灯等。动态物体包括机动车,自行车,行人,动物等。

  Perception模块在Init函数中会注册一系列类以完成模块启动后的正常工作,相关代码如下:

  代码中其实并不存在RegisterFactoryLidarProcessSubnode这个函数,该函数的定义其实是由宏完成的。相关代码如下:

  Prediction模块从Perception模块接受障碍物信息。该模块需要的信息包括位置,航向,速度,加速度,并产生具有障碍概率的预测轨迹。

  这里最重要的就是Prediction::RunOnce这个函数。这个函数中包含了Prediction模块的主要逻辑,它会在接收到一个新的障碍物消息时触发。

  第二类是Evaluator,用来针对指定的障碍物预测路线和速度。目前有三类Evaluator,包括:

  Prediction模块中第三类重要的子模块就是Predictor。它用来预测障碍物的轨迹。

  不同的障碍物运动的轨迹会不一样,因此实现中包含了很多个类型的Predictor,它们的结构如下图所示。

  目前,Apollo 2.5版本中的导航基于A*算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。该算法综合了Best-First Search和Dijkstra算法的优点:在进行启发式搜索提高算法效率的同时,可以保证找到一条最优路径(基于评估函数)。

  在A*算法计算的过程中,会尝试多条路径。一旦遇到障碍物,便将该路径上的点标记为不需要继续探索(图中的实心点)。继续以剩下的空心点为基础探索。最终求得最优路径。

  Planing模块根据定位信息,车辆状态(位置,速度,加速度,底盘),地图,路线,感知和预测,计算出安全和舒适的形式线路让执行。

  RTKReplayPlanner(自Apollo 1.0以来):RTK重放计划器首先在初始化时加载记录的轨迹,并根据当前系统时间和车辆位置发送适当的轨迹段。

  EMPlanner(自Apollo1.5以来。EM是Expectation Maximization的缩写):EM计划器,会根据地图,路线和障碍物计算驾驶决策和线路。基于动态规划(Dynamic programming,简称DP)的方法首先用于确定原始路径和速度曲线,然后使用基于二次规划(Quadratic programming,简称QP)的方法来进一步优化路径和速度曲线以获得平滑的轨迹。

  NaviPlanner:这是一个基于实时相对地图的计划器。它使用车辆的FLU(Front-Left-Up)坐标系来完成巡航,跟随,超车,接近,变道和停车任务。

  Planing模块在初始化的Init函数中,这里面会注册所有的计划器,然后根据配置文件中的配置确定当前所使用的计划器。目前,配置文件中配置的是EM计划器。

  在Planning::Plan函数中,更通过配置的计划器进行路线的计算,然后将结果对外发布。关键代码如下:

  控制模块根据计划和当前的汽车状态,使用不同的控制算法来生成舒适的驾驶体验。控制模块可以在正常模式和导航模式下工作。

  Control模块的主体逻辑也是通过Timer定时执行的。在定时触发的函数Control::OnTimer中,会生成命令然后派发出去:

  上文中我们也提到,目前的2.5版本仅仅是针对L2级自动驾驶的,而百度计划在2019年实现L3级自动驾驶,2021年实现L4级自动驾驶。可见,这个项目接下来的时间里将会非常高速的发展。


乐鱼平台 上一篇:世界十大豪华房车世界上最豪华的房 下一篇:【正新轮胎 巴士轮胎 客车】