编辑推荐: |
本文主要介绍了AutowareArchitectureProposal设计和代码结构梳理相关知识。希望对你的学习有帮助。
本文来自于CSDN,由火龙果软件Linda编辑,推荐。 |
|
最近看了下autoware最新架构的情况,在此做个笔记简单记录一下。
1.系统总体架构
先贴一张AutowareArchitectureProposal的总体架构设计图,通过这张图来感受一下系统的整体架构,看看系统中各个模块之间的联系。
2.AutowareArchitectureProposal的由来简介
1)为什么会有AutowareArchitectureProposal这个架构?
过去的autoware.ai存在下面两个显著的问题:
A.没有非常清晰具体的架构设计;
B.存在一些技术问题,比如模块之间存在紧耦合的关系,模块之间功能划分不够明确。
2)新架构的几个目标
A.定义一个层次分明的架构;
B.阐述清楚每个模块的角色功能;
C.简化模块之间的接口:
使得autoware内部之间的处理更加透明;
模块之间依赖性降低,使得开发人员联合开发更加简单;
用户可以轻松的使用自己的软件来替换autoware中的模块。
3)新架构的几个非功能需求
A.架构对于新算法是可扩展的,不需要改变接口就可以加入;
B.架构对于不同国家新的交通规则能够扩展适用;
C.每个模块的角色(功能)和接口必须清晰的定义;
3.AutowareArchitectureProposal各个模块简单介绍
1)Map
地图负责为系统提供自动驾驶车辆行驶中的静态环境信息。分为两类:
点云地图:提供环境相关的几何信息,点云信息通常由lidar来提供;
向量地图:提供道路相关的语义信息,autoware中使用lanelet格式的向量地图;
A.Map模块的设计如下图所示
B.Map模块代码结构
Map模块的代码主要分为以下两部分:
地图加载:
lanelet2_map_loader节点:负责读取lanelet2格式的向量地图文件,从中解析出车道、人行横道、红绿灯、停车区域等信息,并将其转为lanelet中可视化组件类型的消息发给Rviz进行可视化显示;
pointcloud_map_loader节点:负责读取PCD格式的点云地图文件,将其解析成PointCloud2类型的消息供其他订阅者使用;
坐标转换:map_tf_generator:接收点云地图的PointCloud消息后,对其解析并计算坐标转换;
2)Sensing
A.Sensing模块设计
对自动驾驶来说,车辆需要感知自身状态和周围环境。Sensing模块通过多个传感器收集环境信息,并将环境信息提供给其他模块使用。Sensing模块作为硬件和ROS系统之间的接口,负责把传感器原始数据转换为系统中其他模块可以使用的ROS消息。
Sensing模块的架构设计如下:
从这张图可以看出,Sensing模块主要分为Driver和Preprocessor两部分。Driver直接和硬件进行通信,所获得的传感器信息再交给Preprocessor进行进一步处理,处理完的消息被系统中其他模块订阅。需求功能描述如下图:
B.Sensing模块代码结构
Sensing模块在编码的时候使用了ROS中的nodelet技术用于提高节点之间通过topic通讯的效率,nodelet常用于数据量比较大的场景。nodelet基于插件的原理,在一个进程中的多个节点之间通过共享指针来拷贝数据,提升了通讯效率。
代码架构基本上和设计文档保持一致,分为driver和preprocessor两部分。
LiDAR:lidar_driver解析lidar原始的packet数据,并将其作为velodyne_packets消息发送到ROS中;preprocessor部分订阅velodyne_packets消息,对其进行噪音过滤、补充必要信息等操作后作为点云数据消息提供给其他模块使用。
GNSS:GNSS模块通过串口接入GNSS硬件设备,在driver中对U-Blox中的消息进行订阅,并通过串口向设备中写入数据;GNSS模块的预处理部分对从GNSS硬件设备中driver接收的消息进行预处理,提供给其他模块使用。
IMU:IMU代码分为driver和preprocessor两部分,在driver中解析陀螺仪和加速度计的原始信息解析完的结果发给preprocessor中进行二次处理,并根据系统的需要将IMU消息发布到ROS系统中。
3)Localization
A.Localization模块设计
自动驾驶车辆在地图中的实时位置由定位模块来提供,该模块通过其他传感器的感知信息综合来计算当前车辆所处的位置。
Localization模块设计如下图所示:
B.Localization模块代码结构
定位模块代码结构和设计中的描述保持一致。如下图所示:
在代码中为为pose_estimator、twist_estimator和pose_twist_fusion_filter三部分:
pose_estimator订阅lidar的实时点云信息并使用NDT(正态分布)算法和点云地图进行配准、订阅GNSS的姿态信息并投影到地图当中,以此来估计车辆的位姿;
pose_twist订阅IMU消息,通过角速度来计算车辆当前的twist;
pose_twist_fusion_filter中对pose_estimator和twist_estimator中的车辆pose和twist进一步处理,获得车辆的定位信息。
4)Perception
A.Perception模块设计
Perception模块的核心任务是识别车辆周围的物体和红绿灯,为路径规划提供有效信息。对该模块的功能设计梳理如下:
B.Perception模块代码结构
Perception模块的代码和总体架构设计保持一致,如下图所示,也分为物体识别和红绿灯识别两部分。
Perception模块目标检测,分为检测、跟踪和预测三个部分:
检测:使用YOLO3模型对Camera图像进行检测分类,分为以下类型:汽车、客车、行人、货车、自行车、摩托车和未知;也对lidar输入的点云进行动态物体识别;
并对图像检测结果和lidar点云识别结果进行融合,融合结果用于物体形状和位姿估计;
跟踪:订阅检测模块中检测到的物体信息,实时发布检测到的车辆、行人、自行车的位置和位姿等信息;
预测:根据检测到的汽车、客车和货车的位姿结合高精地图对车辆的运行轨迹进行估计;
Perception模块红绿灯检测:
红绿灯检测分为基于地图的初步检测、进一步精细检测和对识别结果进行分类三部分。订阅地图消息、相机图像信息和行驶路线消息,使用YOLO3模型检测图像中的红绿灯和其状态,并判断红绿灯是否在相应的行驶路线的地图中出现。
5)Planning
A.Planning模块设计
Planning模块是对车辆从当前的起始位置到目的地位置之间可达路径的规划。该模块的总体设计如下图所示:
总体上分为任务规划(Mission planning)和场景选择(Scenario selector)两部分。
任务规划(Mission planning)根据静态地图(static map)计算从起始位置到目的地位置之间的完整路线,路线由一系列的车道序列组成,车辆沿着这些车道线行驶可以到达目的地。这里还没有考虑障碍物、临时道路维修等动态的情况。再将计算结果通过消息的形式传给场景选择模块。
场景选择(Scenario selector)根据车辆当前所处的位置选择合适的场景规划。例如:当前车辆在道路上,则选择在道路上的路径规划;当前车辆在停车区域,则选择停车场景的路径规划。目前场景选择部分只有停车和在道路上行驶两个场景,根据需求也可以添加其他场景,比如高速路场景下的路径规划、紧急情况下的路径规划等。在添加新功能时,是需要新的场景还是需要对现有场景进行增强,这可能会引起争议,我们还需要更多的调查来设置“场景”模块的定义。
具体的每个场景的作用是根据路线(route)信息计算轨迹(trajectory)信息,它只在场景选择器模块选择模块时进行规划。也就是说如果系统中没有加入某个场景(例如高速路场景)的话,是不会进入到具体的场景轨迹规划的。这一部分就需要考虑动态地图中的障碍物和环境变化了。
这部分的设计梳理如下:
B.Planning模块代码结构
Planning模块mission planning部分:对订阅的目的地位姿判断有效(在车道内或者停车区域内)的情况下,规划从起始地到目的地之间的路线并进行发布,该消息被场景规划scenario
planning部分订阅;
Planning模块scenario planning部分:场景选择(scenario setector)和场景(包括lane
driving、parking)两部分。
scenario setector:根据车辆当前的位置和订阅的高精地图(lanelet格式的向量地图)信息判断当前的车辆是行驶过程中(是否在车道中)还是处于停车区域,根据不同的场景会进行不同场景的路径规划;
lane driving:lane driving分为行为规划和运动规划。行为规划包括规划路径上的车速变换、车道变换和转向信号判断;运动规划包括遇到障碍物的时候是停下来还是避开障碍物,如果停下来的话需要将停止点的坐标插入到规划路径的点序列当中,如果是避开障碍物的话需要重新规划路径;
parking:parking分为代价地图创建和无障碍区域的路径规划。代价地图创建部分根据订阅的lanelet2格式的向量地图解析生成代价地图,代价地图采用网格形式,每个网格值为0-255,分为有障碍物、无障碍物和未知区域三种状态;无障碍区域的路径规划根据代价地图和车辆的当前位姿和目的地位姿,使用Astar搜索算法进行路径规划,并随时根据障碍物的情况进行重新规划。
6)Control
Control模块设计:控制模块的作用是输出控制信号,使得车辆在符合车辆动力学要求的情况下按照规划的路径行驶。输出包括速度、加速度和转向信息。Autoware新架构对该部分的设计梳理如下:
autoware系统代码值得反复去梳理,尤其是对于自己所从事的某个模块,掌握了系统的设计和代码流程对于日后工作好处良多。
|