Autoware.universe中的Map模块学习

最近在学习Autoware.universe的Map模块,做个学习笔记,以便后续回顾

目录

一、Map模块

1、Map模块简介

2、Map模块依赖

3、Map模块架构

4、Map模块组件接口

5、Map模块内容

5.1、点云地图

5.2、矢量(高精)地图

5.3、投影信息

二、节点介绍

1、节点概述

2、节点信息

2.1、autoware_map_height_fitter

2.2、autoware_map_projection_loader

2.3、autoware_map_tf_generator

autoware_vector_map_tf_generator的

2.4、map_loader

2.4.1、pointcloud_map_loader:

2.4.2、lanelet2_map_loader

2.4.3、lanelet2地图可视化

三、输入/输出总结

1、SLAM算法生成点云地图的输入/输出

1.1、输入

1.2、输出

2、Lanelet2生成高精地图的输入/输出

2.1、输入

2.2、输出

3、Autoware.universe 中 Map 模块的输入/输出

3.1、输入

3.2、输出


一、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

/map/pointcloud_map

sensor_msgs::msg::PointCloud2

Subscribe pointcloud map to calculate position of viewer frames

autoware_vector_map_tf_generator的

Name

Type

Description

/map/vector_map

autoware_map_msgs::msg::LaneletMapBin

Subscribe vector map to calculate position of viewer frames

输出:

Name

Type

Description

/tf_static

tf2_msgs/msg/TFMessage

Broadcast viewer frames

参数:

Name

Type

Description

Default

Range

map_frame

string

The parent frame name of viewer frame

map

N/A

viewer_frame

string

Name of viewer frame

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, centerline in the Lanelet2 map will be used as a waypoints tag.

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模块的输出是将读取到的地图数据下发给下游的各个模块,如定位、规控等模块。如图所示

### HAL_TIM_PeriodElapsedCallback 函数功能与用法 #### 1. 功能描述 `HAL_TIM_PeriodElapsedCallback` 是 STM32 HAL 库中的回调函数,用于处理定时器周期结束事件。当定时器的计数值达到设定的最大值并触发更新事件时,该回调函数会被调用[^1]。 此函数的主要作用是在中断服务程序中被自动调用,允许用户在不修改底层驱动的情况下实现自定义逻辑。它通常用来响应特定的时间间隔到达后的动作,例如刷新数据、切换状态或其他实时任务调度[^2]。 --- #### 2. 定义形式 以下是 `HAL_TIM_PeriodElapsedCallback` 的典型定义: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { // 用户可以在此处编写自己的代码来处理定时器周期溢出事件 } ``` - **参数说明** - `TIM_HandleTypeDef *htim`: 这是一个指向定时器句柄结构体的指针,包含了配置和运行状态的信息。通过这个句柄,可以在回调函数内部访问当前定时器的相关属性或重新设置其行为。 --- #### 3. 使用方法 为了使能这一回调机制,需完成以下几个步骤: 1. 初始化定时器:利用 `HAL_TIM_Base_Init` 或其他初始化接口完成硬件资源分配以及基础参数配置(如预分频系数、计数器周期等)。 2. 启动带中断模式的定时器:调用 `HAL_TIM_Base_Start_IT(htim)` 来开启定时器及其关联的中断请求。这一步会启用相应的中断线,并注册默认的中断服务例程(ISR)[^1]。 3. 实现回调函数:根据实际需求重写 `HAL_TIM_PeriodElapsedCallback` 方法的内容。每当发生一次完整的计数循环后,即进入下一轮计数前,都会跳转到此处执行指定的操作[^3]。 4. 清除标志位/中断挂起比特 (可选): 如果需要手动管理某些特殊类型的干扰信号,则可能还需要借助宏指令如 __HAL_TIM_CLEAR_IT() 对应位置零操作。 --- #### 示例代码片段 下面展示了一个简单的应用案例——每秒钟点亮 LED 一次: ```c #include "stm32f4xx_hal.h" // 假设已正确设置了 GPIO 和 TIM 句柄 htim2 uint8_t led_state = 0; void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if(htim->Instance == TIM2){ // 判断是否来自 TIM2 中断 if(led_state == 0){ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 打开LED led_state = 1; } else { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 关闭LED led_state = 0; } } } int main(void){ /* MCU Initialization */ // 配置GPIO PA5作为输出端口 // 设置 TIM2 参数 TIM_HandleTypeDef timHandle; timHandle.Instance = TIM2; timHandle.Init.Prescaler = 8399; // 设定预分频值使得频率接近1KHz timHandle.Init.CounterMode = TIM_COUNTERMODE_UP; timHandle.Init.Period = 9999; // 计数至最大值约等于一秒 timHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if(HAL_TIM_Base_Init(&timHandle) != HAL_OK){ Error_Handler(); } // 开启 IT 模式的定时器 HAL_TIM_Base_Start_IT(&timHandle); while(1); } ``` 上述例子展示了如何结合外部设备控制形成规律性的脉冲序列。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值