路线图生成
本教程介绍如何为 Nav2 路线服务器生成路线图(graph)。
请按照 https://www.qgis.org/en/site/forusers/download.html 安装 QGIS。
1- 创建新的 QGIS 项目
Section titled “1- 创建新的 QGIS 项目”打开 QGIS,选择 Project->New 创建新项目,再选择 Project -> Save As 保存项目。
选择 Project->Properties->CRS 设置坐标系,将坐标系设为 WGS 84 / Pseudo-Mercator,然后点击 OK。
注意:
WGS 84 / Pseudo-Mercator是少数可用的坐标系之一。 有关坐标系的更多信息,请参阅 https://docs.qgis.org/3.22/en/docs/gentle_gis_introduction/coordinate_reference_systems.html。

2- 设置坐标系
Section titled “2- 设置坐标系”默认情况下,导入的栅格图像原点位于左上角,x 轴向右、y 轴向上。 为了正确设置原点和分辨率,需要对栅格图像进行地理配准(georeference)。 地理配准需要选取三个控制点,每个控制点将像素位置映射到空间参考坐标。
例如,假设有一个 100 x 200 的栅格图像,分辨率为 0.05,原点在左下角。
第一个控制点选为 (0, -200)px -> (0, 0)m,其中 (0, -200)px 是像素坐标系中的左下角,(0, 0)m 是空间坐标系中的坐标——这也是 ROS 地图的常用约定。
第二个控制点选图像左上角,即原始 (0, 0)px,对应的空间坐标可按分辨率换算得到:(0, 0)px -> (0, 10)m(其中 10 m = 200 px * 0.05 m/px)。最后一个控制点是右下角:(100, -200)px -> (5, 0)m。
建议将地图原点设在图像左下角(即 map.yaml 中的 [0.0, 0.0, 0.0]),以简化上述流程。
要对图像进行地理配准,选择 Raster -> Georeferencer。在 Transformation Settings 中,将 Transformation type 设为 Linear,Target SRS 设为 WGS 84 / Pseudo-Mercator,并为 Output Raster 指定输出路径。

选择需要地理配准的栅格图像,点击 Add Point 并在图像上点击来放置控制点。
点击控制点表格可直接输入新值来修改坐标。确认控制点无误后,选择 Start Transformation 应用变换。

关闭窗口,将刚刚生成的地理配准栅格文件拖放到图层窗口中(默认为 tiff 文件)。

要验证变换是否正确,可在栅格图像上移动鼠标,查看窗口底部显示的坐标。
3- 添加节点
Section titled “3- 添加节点”栅格图层地理配准完成后,即可开始放置节点。
选择 Layer -> Create Layer -> New ShapeFile Layer。将 File name 设为 nodes,Geometry type 设为 Point,坐标系设为 WGS 84 / Pseudo-Mercator,然后点击 OK。

要让 id 字段自动递增,右键点击图层并选择 Properties -> Attribute Form。
展开 Fields 下拉菜单,选择 id,点击 Default value 字段旁的 Expression Dialog 图标。

在 Expression Dialog 中,选择 Import user expressions,导入 Nav2 Route 模块 scripts 目录下的 increment_node_id.json。展开 User expressions,双击 increment_node_id。
表达式会出现在左侧窗口中。点击 OK 保存并退出 Expression Dialog,再依次点击 Apply 和 OK 保存并退出 Attributes Form。
这样每添加一个节点,id 就会自动加一,第一个节点的 id 为 0。

点击节点图层,选择铅笔图标的 Toggle Editing 开始编辑图层。
选择 Add Point Feature,在主窗口中点击即可添加节点。
每次添加节点时会弹出带自动递增 id 的窗口,按 OK 继续放置。
完成后,取消选择 Toggle Editing 并保存更改。

注意:默认情况下,删除节点后 id 列表不会自动更新,如何处理由用户自行决定。新添加的节点会基于当前最大 id 继续递增,已有节点不会被自动重新编号,因此不会打乱你对图结构的既有认知。id 值可在节点放置后的弹窗中或通过
Attribute Table手动修改。要删除图层中的要素,右键点击图层并选择Open Attribute Table。 点击Target Multi Edit Mode,选中要删除的要素,然后点击垃圾桶图标。
4- 添加边
Section titled “4- 添加边”接下来创建边图层。选择 Layer -> Create Layer -> New ShapeFile Layer,将 File name 设为 edges,Geometry type 设为 LineString,坐标系设为 WGS 84 / Pseudo-Mercator,然后点击 OK。
要让 id 字段自动递增,按上述相同步骤操作,只需将 increment_node_id.json 替换为 increment_edge_id.json。
这样每添加一条新边,id 就会自动加一,第一条边的 id 为 10000。

要查看边的方向,右键点击边图层并选择 Properties,进入 Symbology -> Simple Line,将 Symbol layer type 改为 Arrow。
点击 Ok,即可看到每条线段的箭头。路线图中的所有边都是有方向的,如需双向连接,应反向再画一条。
点击边图层,选择铅笔图标的 Toggle Editing 开始编辑图层。
选择 Add Line Feature,在主窗口中点击两次来添加边(第一个点是起点,第二个点是终点)。添加完两个点后,在任意位置右键点击即可完成。
边的位置必须与节点位置完全匹配,因此如果捕捉(Snapping)尚未默认启用,可通过 Views->Toolbars->Snapping Toolbar 开启,并按下磁铁图标。
完成后,取消选择 Toggle Editing 并保存更改。

5- 将节点与边关联
Section titled “5- 将节点与边关联”节点和边图层准备好后,即可将节点 ID 与边 ID 关联起来。
选择 Database -> DB manager,展开 Virtual layers 和 Project layers。点击左上角的脚本图标打开 SQL 窗口,选择 Load File 加载 generate_start_and_end_id.sql。
该脚本位于 Nav2 Route 模块的 scripts 目录中。
执行该脚本后,勾选 Load as new layer 并点击 Load 加载新图层。该脚本通过匹配节点位置来关联线段的起点和终点。随后右键点击图层,选择 Export -> Save Feature As 将图层导出为 ShapeFile,格式类型选为 ESRI Shapefile,命名文件并确认坐标系为 WGS 84 / Pseudo-Mercator,然后点击 OK。

6- 导出为 GeoJSON
Section titled “6- 导出为 GeoJSON”接下来将节点和边图层导出为 GeoJSON 文件。在 Nav2 Route 模块的 scripts 目录中执行 export_shapefiles.py <prefix_of_file> <path_to_edges_shapefile> <path_to_nodes_shapefile>,该脚本会将节点和边的 Shapefile 转换为 GeoJSON 文件。
路线图已准备就绪,可供 Nav2 Route 使用!如需向图中添加节点或边,编辑图层后从第 5 步开始重新生成即可。如需调整图,请确保节点和边图层已开启 Editing,然后选择 Vertex Tool(all Layers) 并启用 Topological Editing,同样从第 5 步开始重新生成。