SWAGGER 路线图生成
本教程介绍如何使用 NVIDIA 的 SWAGGER 为 Nav2 路线服务器生成路线图(graph)。
请按照 https://github.com/nvidia-isaac/SWAGGER/ 的 README 中的安装说明安装 SWAGGER。
1- 生成 SWAGGER 图
Section titled “1- 生成 SWAGGER 图”第一步是从地图的栅格图像生成 SWAGGER 图。运行 scripts 目录下的 generate_graph.py 脚本即可完成。
脚本会输出两个文件:graph.gml(图结构)和 graph.png(将图叠加在栅格图像上的可视化结果)。
python scripts/generate_graph.py \ --map-path <path_to_map.png> \ --resolution <meters_per_pixel> \ --safety-distance <meters> \ --output-dir <output_directory>分辨率应与生成栅格地图时 SLAM 会话所使用的值保持一致。 安全距离(safety distance)指生成图时与任意障碍物之间保持的最小距离。 运行完成后,输出结果应类似于下图:

该过程包含以下步骤:
- 将栅格图像与安全距离做卷积,生成安全掩码(safety mask)。
- 对安全掩码进行骨架化(skeletonizing),得到地图骨架。
- 在卷积后的障碍物周围添加边界节点。
- 在地图中心区域放置节点以填充空间。
- 将骨架节点、中心节点和边界节点连接成边,并裁剪掉无价值的边。
2- 转换为 GeoJSON
Section titled “2- 转换为 GeoJSON”要在 Nav2 Route Server 中使用此图,需要将其转换为 Route Server 可识别的格式。SWAGGER 图格式为 GML 文件,Nav2 Route 无法直接读取。
与其为 Route Server 新增一个专用的解析插件,不如使用转换脚本将 GML 文件转为 GeoJSON 格式。
该脚本位于 SWAGGER 的 integrations/nav2/tools 目录中,运行方式如下:
python integrations/nav2/tools/gml_to_geojson.py <path_to_graph.gml>输出文件 graph.geojson 将与输入 GML 文件位于同一目录。
转换过程会将图的关键信息写入 GeoJSON,并确保每条边都是双向的,以满足导航需求。
3- 与 Nav2 Route 配合使用
Section titled “3- 与 Nav2 Route 配合使用”至此,该文件已可直接供 Nav2 Route Server 使用。
通过 nav2_bringup 的 graph CLI 参数将其传入应用即可,也可在自定义启动文件或 Nav2 配置文件中指定路径。
为了演示,这里使用 SWAGGER 提供的大型仓库(Large Warehouse)地图,
该地图位于 SWAGGER 仓库的 maps 目录中。
运行以下命令生成图并转换为 GeoJSON:
python scripts/generate_graph.py \ --map-path maps/large_warehouse.png \ --resolution 0.05 \ --safety-distance 0.2 \ --output-dir graphs
python integrations/nav2/tools/gml_to_geojson.py graphs/graph.gml然后,为地图创建 large_warehouse.yaml 文件,以便地图服务器加载:
image: large_warehouse.pngmode: trinaryresolution: 0.05origin: [0.0, 0.0, 0]negate: 0occupied_thresh: 0.65free_thresh: 0.25在 Nav2 参数中更新 BT Navigator 的参数,为本演示指定基于图的导航器:
bt_navigator: ... default_nav_to_pose_bt_xml: $(find-pkg-share nav2_bt_navigator)/behavior_trees/navigate_on_route_graph_w_recovery.xml ...最后,启动 Nav2 的 Loopback 仿真。该仿真使用简单的后端运动学仿真器,适合研发和高级测试,无需为此地图单独搭建 Gazebo 或 Isaac Sim 仿真环境:
ros2 launch nav2_bringup tb4_loopback_simulation_launch.py map:=/path/to/your/map.yaml graph:=/path/to/your/graph.geojson
祝路线规划顺利!