最近在学习Autoware.universe的Map模块,做个学习笔记,以便后续回顾
目录
2.1、autoware_map_height_fitter
2.2、autoware_map_projection_loader
autoware_vector_map_tf_generator的
3、Autoware.universe 中 Map 模块的输入/输出
一、Map模块
1、Map模块简介
Autoware依靠高清3D点云地图和驾驶环境的矢量地图(高精地图)来执行各种任务,如定位、路线规划、交通灯检测以及预测行人和其他车辆的轨迹。
2、Map模块依赖
Map模块应向系统的其余部分提供两种类型的信息:
-
作为矢量地图的道路语义信息
-
关于环境的几何信息,如点云图
矢量地图包含有关道路网络、车道几何形状和交通灯等信息的准确数据。它是路线规划、交通灯检测和预测其他车辆和行人轨迹所必需的因素。
3D点云图主要用于基于激光雷达的定位和Autoware中的部分感知功能。为了确定车辆的当前位置和方向,将从一个或多个激光雷达单元捕获的实时扫描与预先生成的3D点云图进行匹配定位。因此,精确的点云地图对于良好的定位结果至关重要。但是,如果车辆有一种具有足够精度的替代定位方法,例如使用基于摄像头的图像定位,这时,使用Autoware就可能不需要点云地图。
除了上述两种类型的地图外,Autoware还需要一个补充文件来指定世界系统中地图的坐标系。
3、Map模块架构
下图表述了Autoware中Map模块的架构:
地图模块包含以下几个组件:
-
点云地图加载:加载并发布点云图
-
矢量地图加载:加载并发布矢量地图
-
投影加载:加载并发布投影信息,用于在局部坐标(x,y,z)和世界坐标(纬度、经度、高度)之间进行转换
4、Map模块组件接口
Map模块的输入:
-
来自文件系统:
-
点云图及其元数据文件
-
矢量地图
-
投影信息
Map模块的输出:
-
输出到传感器模块
-
投影信息:用于将GNSS数据从世界坐标系转换为局部坐标系
-
-
输出到定位模块
-
点云图:用于基于激光雷达的定位
-
矢量地图:用于基于道路标记等的定位方法
-
-
输出到感知模块
-
点云图:通过比较激光雷达和点云图进行障碍物分割
-
矢量地图:用于车辆轨迹预测
-
-
输出到规划模块
-
矢量图:用于行为规划
-
-
输出到API层
-
投影信息:用于将定位结果从局部坐标系转换为世界坐标系
-
5、Map模块内容
5.1、点云地图
点云地图必须以文件形式提供,并满足以下要求:
-
点云地图必须投影在map_projection_loader中定义的同一坐标上,以便与lanelet2地图和其他在局部坐标和世界坐标之间转换的软件包保持一致。
-
它必须采用PCD(点云数据)文件格式,但可以是单个PCD文件或分为多个PCD文件。
-
地图中的每个点都必须包含X、Y和Z坐标。
-
可以可选地包括每个点的强度或RGB值。
-
它必须覆盖车辆的整个操作区域。还建议根据车辆上安装的传感器的检测范围,增加一个缓冲区。
-
其分辨率应至少为0.2米,以产生可靠的定位结果。
-
它可以在本地或世界坐标系中,但必须在世界坐标系中才能使用GNSS数据进行定位。
5.2、矢量地图
矢量地图必须以文件形式提供,并满足以下要求:
-
它必须采用Lanelet2格式,并根据Autoware的需要进行额外修改。
-
它必须包含车道、交通信号灯、停车线、人行横道、停车位和停车场的形状和位置等信息。
-
除道路的起点或终点外,地图中的每个巷道都必须正确连接到其前身、继任者、左邻和右邻。
-
地图中的每个小车道都必须包含交通规则信息,包括其限速、通行权、交通方向、相关交通信号灯、停车线和交通标志。
-
它必须覆盖车辆的整个操作区域。
5.3、投影信息
投影信息必须以文件形式提供,并满足以下要求:
-
它必须采用YAML格式,在当前的Autoware.Universe实现中提供给map_projection_loader。
-
文件必须包含以下信息:
-
用于在局部坐标和全局坐标之间进行转换的投影方法的名称
-
投影方法的参数(取决于投影方法)
-
二、节点介绍
1、节点概述
Autoware.universe中的Map模块,主要包括autoware_map_height_fitter、map_loader、util、autoware_map_projection_loader、autoware_map_tf_generator这5个节点,目录结构如下图:
2、节点信息
2.1、autoware_map_height_fitter
此库将给定点与点云地图的地面相匹配。映射加载操作由map_loader_name指定的节点的参数enable_partial_load切换。使用此库的节点必须使用多线程执行器。
参数如下:
Name | Type | Description | Default | Range |
map_loader_name | string | Node name of the map loader from which this map_height_fitter will retrieve its parameters | /map/pointcloud_map_loader | N/A |
target | string | Target map to fit (choose from 'pointcloud_map', 'vector_map') | pointcloud_map | N/A |
订阅的Topic如下:
Topic Name | Description |
~/pointcloud_map | The topic containing the whole pointcloud map (only used when enable_partial_load = false) |
服务如下:
Service Name | Description |
~/partial_map_load | The service to load the partial map |
2.2、autoware_map_projection_loader
autoware_map_project_loader负责发布map_projector_info,该信息定义了autoware在哪种坐标下运行。这是必要的信息,特别是当您想从全局坐标转换为局部坐标或反之时。如果map_projector_info_path 存在,则此节点将加载它并相应地发布地图投影信息。如果map_projector_info_path不存在,则节点假定当前正在使用MGRS投影类型,并加载lanelet2地图以提取MGRS网格。(*不建议这样使用lanelet2地图,请改为使用YAML文件)
地图投影信息文件规范:需要在map_path目录下提供一个YAML文件,即map_projector_info.YAML。关于pointcloud_map_metadata.yaml,请参考map_loader的readme文件。
sample-map-rosbag
├── lanelet2_map.osm
├── pointcloud_map.pcd
├── map_projector_info.yaml
└── pointcloud_map_metadata.yaml
从纬度和经度到XYZ坐标系有三种类型的转换,如下图所示
发布的Topic:
-
~/map_projector_info(tier4_map_msgs/MapProjectorInfo):此主题展示了地图投影仪信息的定义
参数:
Name | Type | Description | Default | Range |
map_projector_info_path | string | The path where map_projector_info.yaml is located | $(var map_projector_info_path) | N/A |
lanelet2_map_path | string | The path where the lanelet2 map file (.osm) is located | $(var lanelet2_map_path) | N/A |
2.3、autoware_map_tf_generator
此包中的节点广播查看器帧,以便在RViz中可视化地图。其中,没有模块需要此查看器框架,这仅用于可视化。以下是支持的计算查看器帧位置的方法:
-
pcd_map_tf_generator_node:输出pcd中所有点的几何中心。
-
vector_map_tf_generator_node:输出点图层中所有点的几何中心。
输入:
autoware_pcd_map_tf_generator的
Name | Type | Description |
|
| Subscribe pointcloud map to calculate position of |
autoware_vector_map_tf_generator的
Name | Type | Description |
|
| Subscribe vector map to calculate position of |
输出:
Name | Type | Description |
|
| Broadcast |
参数:
Name | Type | Description | Default | Range |
map_frame | string | The parent frame name of viewer frame | map | N/A |
viewer_frame | string | Name of | viewer | N/A |
2.4、map_loader
2.4.1、pointcloud_map_loader:
pointcloud_map_loloader以各种配置向其他Autoware节点提供点云映射。目前,它支持以下几种类型:
-
发布原始点云地图
-
发布降采样点云地图
-
通过ROS 2服务发送部分点云地图加载
-
通过ROS 2服务发送差分点云地图加载
-
点云地图.pdc文件可以是单个,也可以是多个,如果是多个就必须满足以下条件:
-
点云地图应投影在map_projection_loader中定义的同一坐标上,以便与lanelet2地图和其他在局部坐标和大地坐标之间转换的软件包保持一致。
-
它必须被平行于x轴和y轴的直线分割。系统不支持按对角线或曲线划分。
-
沿每个轴的分割大小应相等。
-
分割尺寸应为20m x 20m左右。特别是,应注意使用太大的分割尺寸(例如,超过100米)可能会对ndt_scan_matcher和autoware_compare_map_segmentation中的动态地图加载特征产生不利影响。
-
所有分割图不应相互重叠。
-
还应提供元数据文件。
元数据结构描述如下:
x_resolution: 20.0
y_resolution: 20.0
A.pcd: [1200, 2500] # -> 1200 < x < 1220, 2500 < y < 2520
B.pcd: [1220, 2500] # -> 1220 < x < 1240, 2500 < y < 2520
C.pcd: [1200, 2520] # -> 1200 < x < 1220, 2520 < y < 2540
D.pcd: [1240, 2520] # -> 1240 < x < 1260, 2520 < y < 2540
此节点的特点:
-
发布原始点云地图(ROS 2主题):节点发布从.pcd文件加载的原始点云地图。
-
发布降采样点云图(ROS 2主题):节点发布从.pcd文件加载的降采样点云地图。您可以通过更改leaf_size参数来指定下采样分辨率。
-
发布点云地图元数据(ROS 2主题):节点发布附有ID的点云元数据。元数据从.yaml文件加载。
-
发送部分点云地图(ROS 2服务):在这里,我们假设点云地图被划分为网格。给定来自客户端节点的查询,该节点会发送一组与查询区域重叠的点云地图。有关详细信息,可以查看GetPartialPointCloudMap.srv的说明。
-
发送差分点云图(ROS 2服务):在这里,我们假设点云地图被划分为网格。给定一个查询和一组地图ID,节点会发送一组与查询区域重叠且不包含在地图ID集中的点云地图。有关详细信息,可以查看GetDdifferentialPointCloudMap.srv的说明。
-
发送所选点云地图(ROS 2服务):在这里,我们假设点云地图被划分为网格。给定来自客户端节点的ID查询,该节点发送一组由查询指定的点云地图(每个地图都附有唯一的ID)。有关详细信息,请参阅GetSelectedPointCloudMap.srv的说明。
参数信息:
Name | Type | Description | Default | Range |
enable_whole_load | boolean | Enable raw pointcloud map publishing | True | N/A |
enable_downsampled_whole_load | boolean | Enable downsampled pointcloud map publishing | False | N/A |
enable_partial_load | boolean | Enable partial pointcloud map server | True | N/A |
enable_selected_load | boolean | Enable selected pointcloud map server | False | N/A |
leaf_size | float | Downsampling leaf size (only used when enable_downsampled_whole_load is set true) | 3.0 | N/A |
pcd_paths_or_directory | array | Path(s) to pointcloud map file or directory | [] | N/A |
pcd_metadata_path | string | Path to pointcloud metadata file | N/A |
接口信息:
-
output/pointcloud_map(sensor_msgs/msg/PointCloud2):原始点云地图
-
output/pointcloud_map_metadata(autoware_map_msgs/msg/PointCloudMapMetaData):点云地图的元数据
-
output/debug/downsampled_pointcloud_map(sensor_msgs/msg/PointCloud2):下采样点云映射
-
service/get_partial_pcd_map(autoware_map_msgs/srv/GetPartialPointCloudMap):部分点云图
-
service/get_differential_pcd_map(autoware_map_msgs/srv/GetDdifferentialPointCloudMap):差分点云图
-
service/get_selected_pcd_map(autoware_map_msgs/srv/GetSelectedPointCloudMap):选定的点云地图
-
点云地图文件(.pcd)
-
点云图元数据(.yaml)
2.4.2、lanelet2_map_loader
lanelet2_map_loader加载lanelet2文件,并将地图数据发布为autoware_map_msgs/LaneletMapBin消息。该节点将lan/lon坐标从map_projecton_loader投影到/map/map_projector_info中定义的任意坐标中。
运行节点:
-
ros2 run map_loader lanelet2_map_loader --ros-args -p lanelet2_map_path:=path/to/map.osm
订阅的Topic:
-
~input/map_m_msgs/MapProjectorInfo:Autoware的投影类型
发布的Topic:
-
~output/lanelet2_map(autoware_map_msgs/LaneletMapBin):加载的lanelet2-map的二进制数据
参数信息:
Name | Type | Description | Default | Range |
allow_unsupported_version | boolean | Flag to load unsupported format_version anyway. If true, just prints warning. | true | N/A |
center_line_resolution | float | Resolution of the Lanelet center line [m] | 5.0 | N/A |
use_waypoints | boolean | If true, | True | N/A |
lanelet2_map_path | string | The lanelet2 map path pointing to the .osm file | N/A |
use_waypoints决定如何处理中心线。此标志允许使用overwriteLaneletsCenterlineWithWaypoints函数,而不是overwriteLaneletsCenter函数。请详细查看autoware_lanelet2_extension包的文档。
2.4.3、lanelet2地图可视化
lanelet2_map_visiualization将autoware_map_msgs/LaneletMapBin消息可视化为visualization_msgs/MarkerArray。
运行方式:
-
ros2 run map_loader lanelet2_map_visualization
订阅的Topic:
-
~input/lanelet2_map(autoware_map_msgs/LaneletMapBin):lanelet2-map的二进制数据
发布的数据:
-
~output/lanelet2_map_marker(visualization_msgs/MarkerArray):RViz的可视化消息
三、输入/输出总结
1、SLAM算法生成点云地图的输入/输出
1.1、输入
录制的原始激光rosbag包,ROS2的rosbag包格式如下,包括一个.yaml文件和一个.db3文件
1.2、输出
经过SLAM算法的处理,最终生成的.pcd点云数据如下
2、Lanelet2生成高精地图的输入/输出
2.1、输入
基于Lanelet2格式的高精地图,输入的数据为上面的.pcd点云地图。
2.2、输出
在基于.pcd点云数据的轮廓进行制作和修改后,可以输出.osm格式的高精地图文件。
3、Autoware.universe 中 Map 模块的输入/输出
3.1、输入
Map模块的输入包括.pdc格式的点云地图,和.osm格式的高精地图,与之匹配的会有几个.yaml文件,文件目录结构如下:
3.2、输出
Map模块的输出是将读取到的地图数据下发给下游的各个模块,如定位、规控等模块。如图所示