Apollo2.0自动驾驶quickstart文件夹之Apollo_2.0_Software_Architecture.md

/****************Apollo源码分析****************************

Copyright 2018 The File Authors & zouyu. All Rights Reserved.
Contact with: 1746430162@qq.com 181663309504

源码主要是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 2.0软件架构

在Apollo 2.0供电的自动驾驶车辆上运行的核心软件模块包括:
-  **感知**  - 感知模块识别自主车辆周围的世界。在感知中有两个重要的子模块:障碍物检测和交通灯检测。
-  **预测**  - 预测模块预测未来感知障碍的运动轨迹。
-  **路由**  - 路由模块告诉自动车辆如何通过一系列车道或道路到达目的地。
-  **计划**  - 计划模块计划自主车辆采用的时空轨迹。
-  **控制**  - 控制模块通过生成油门,制动和转向等控制命令来执行规划的时空轨迹。
-  ** CanBus **  -  CanBus是将控制命令传递给车辆硬件的接口。它还将机箱信息传递给软件系统。
-  ** HD-Map **  - 此模块与库类似。它不是发布和订阅消息,而是经常用作查询引擎支持来提供关于道路的临时结构化信息。
-  **本地化**  - 本地化模块利用各种信息来源,如GPS,LiDAR和IMU来估计自动车辆所在的位置。

下图说明了这些模块的相互作用。

![图](https://github.com/ApolloAuto/apollo/blob/master/docs/specs/images/Apollo_2_0_Software_Arch.png)

每个模块都作为独立的基于CarOS的ROS节点运行。每个模块节点都会发布和订阅某些主题。订阅的主题用作数据输入,而已发布的主题用作数据输出。以下各节将详细介绍相互作用。

##感知

感知取决于原始传感器数据,例如LiDAR点云数据和相机数据。除了这些原始传感器数据输入之外,交通灯检测还取决于定位数据以及HD-Map。由于实时特别交通灯检测在计算上不可行,因此交通灯检测需要本地化以确定何时以及从何处开始检测通过相机捕获的图片的交通灯。

##预测

预测模块估计所有感知障碍的未来运动轨迹。输出预测消息包装知觉信息。如下所示,Prediction预订本地化和知觉障碍消息。

![图](https://github.com/ApolloAuto/apollo/blob/master/docs/specs/images/prediction.png)

当收到本地化更新时,预测模块更新其内部状态。当感知发出已发布的感知障碍信息时,触发实际预测。

##本地化

路由模块聚合各种数据以定位自主车辆。有两种类型的本地化模式:OnTimer和Multiple SensorFusion。

第一种本地化方法是基于RTK的,具有基于定时器的回调函数“OnTimer”,如下所示。

![图](https://github.com/ApolloAuto/apollo/blob/master/docs/specs/images/localization.png)

另一种定位方法是多传感器融合(MSF)方法,其中注册了一堆事件触发的回调函数,如下所示。

![图](https://github.com/ApolloAuto/apollo/blob/master/docs/specs/images/localization_2.png)

##路由

路由模块需要知道路由起点和路由终点,计算通道和道路。通常,路由起点是自动的车辆位置。重要的数据接口是一个名为“OnRoutingRequest”的事件触发函数,其中“RoutingResponse”计算和发布如下所示。

![图](https://github.com/ApolloAuto/apollo/blob/master/docs/specs/images/routing.png)

##规划

Apollo 2.0使用多个信息源来规划安全和无碰撞的轨迹,因此规划模块几乎与其他所有模块交互,

最初,计划模块采用预测输出。由于预测输出包裹了原始感知障碍物,因此计划模块订阅交通灯检测输出而不是感知障碍输出。

然后,计划模块将采用路由输出。在某些情况下,如果不能忠实地遵循当前路线,则规划模块可能通过发送路线请求来触发新的路线计算。

最后,计划模块需要知道位置(本地化:我在哪里)以及当前的自动车辆信息(机箱:我的状态)。计划模块也由固定频率触发,主数据接口是调用“RunOnce”函数的`OnTimer`回调函数。

![图](https://github.com/ApolloAuto/apollo/blob/master/docs/specs/images/planning_1.png)

数据依赖性,如底盘,本地化,交通信号灯和预测,都通过AdapterManager类进行管理。核心软件模块的管理类似。例如,本地化是通过`AdapterManager :: GetLocalization()`管理如下所示。![IMG](https://github.com/ApolloAuto/apollo/blob/master/docs/specs/images/planning_2.png)

## 控制

如计划模块中所述,控制将计划的轨迹作为输入,并生成传递给CanBus的控制命令。它有三个主要的数据接口:OnPad,OnMonitor和OnTimer。

![图](https://github.com/ApolloAuto/apollo/blob/master/docs/specs/images/control_1.png)

“OnPad”和“OnMonitor”是与基于PAD的人机界面和仿真的常规交互。主要的数据接口是`OnTimer`接口,它定期产生如下所示的实际控制命令。

![图](https://github.com/ApolloAuto/apollo/blob/master/docs/specs/images/control_2.png)

## CanBus

CanBus有两个数据接口,如下所示。

![图](https://github.com/ApolloAuto/apollo/blob/master/docs/specs/images/canbus_1.png)

第一个数据接口是一个基于计时器的发布器,其回调函数为OnTimer。如果启用,此数据接口会定期发布机箱信息以及机箱详细信息。

![图](https://github.com/ApolloAuto/apollo/blob/master/docs/specs/images/canbus_2.png)

第二个数据接口是一个基于事件的发布器,具有一个回调函数“OnControlCommand”,当CanBus模块接收到控制命令时触发该函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值