在移动机器人路径规划项目中,地图的表达形式对规划算法的效率与可行性起着决定性作用。本文将介绍两种核心地图结构 —— GeometricMapOccupancyMap,并结合代码逻辑说明它们与四叉树(QuadTree)在路径规划中的协作方式。


一、OccupancyMap 占用地图

OccupancyMap 是通过图像(通常是.png地图或实时图像)生成的像素级地图,用于表示每个区域是否可通行。 占用地图

占用网格图将空间离散化为任意分辨率的正方形,为每个正方形分配一个二进制值0/1标志被占用或者空闲 占用地图

一旦将空间表示为图,就有经典的最短路径图算法可以保证在给定无限的计算时间和资源的情况下找到最短路径。

功能概述

  • 接收一张地图图像 map_image,支持 RGB 或灰度图;
  • 将图像转为灰度图后,基于 occupancy_threshold 生成二值图(黑=障碍,白=可通行); occupancygridmap

二值图

  • 可返回背景图、灰度图或二值图;
  • 支持从图像提取边界与障碍的几何信息(返回 boundary_coordsobstacle_list)。 边界提取

典型代码片段

occupancy_map = OccupancyMap(map_image)
boundary_coords, obstacle_list = occupancy_map.get_geometric_map()

在项目中的作用

  • 提供最原始的环境表达方式
  • 可以作为输入转为 GeometricMap
  • 支持动态更新:如结合摄像头识别障碍,实时构建地图

二、GeometricMap 几何地图

GeometricMap 用于几何表达方式表示边界和障碍,以便生成高精度的导航地图(用于后续凸包、安全走廊、参考路径的构建)。

GeometricMap 是“几何表达形式的地图”,用于:

元素 表示内容 示例
boundary 整个地图的边界轮廓 外围矩形 / 不规则多边形
obstacles 障碍物的几何形状 车、箱子、墙,表示为多边形
inflator(可选) 将障碍物形状向外膨胀 提供安全冗余

它不是图像地图,而是 多边形表达的结构地图

例如:

boundary = [(0,0), (10,0), (10,10), (0,10)]
obstacle_list = [[(2,2), (3,2), (3,3), (2,3)]]

map = GeometricMap(boundary, obstacle_list)

这里就表达了一个 10x10 的区域,里面有一个 1x1 的方形障碍物。

用途

  • 用于路径规划器:几何形式的障碍输入更适合用于生成走廊、凸包、多边形避障规划
  • 用于转换为栅格地图:可导出为 OccupancyMap(图像)
  • 适合构造复杂结构地图:比如 U 型障碍、多边形围栏等

功能概述

  • 输入边界多边形和障碍物多边形(world坐标)
  • 可选 inflator 进行障碍膨胀,扩展为更保守的安全区
  • 支持可视化与 occupancy map 导出(像素图)

典型代码片段

map = GeometricMap(boundary_coords, obstacle_list)
occupancy_img = map.get_occupancy_map(rescale=100)

在项目中的作用

  • 构建清晰的边界和障碍表示(适合高层路径规划)
  • 膨胀处理使机器人具备安全冗余
  • QuadTree 构造提供清晰边界 + 二维栅格(通过导出的 occupancy map)

三、与 QuadTree 的衔接逻辑

输入阶段:

  1. 使用 GeometricMap.get_occupancy_map() 输出像素图(RGB)
  2. 将其作为 QuadTree(value_matrix) 的输入,作为障碍标记基础

空间划分阶段:

  • QuadTree 将 occupancy map 分割为多个网格块(TreeNode)
  • 根据 occupancy 判断某区域是否继续分割 / 标记为自由空间 / 被障碍占用

后续路径规划阶段:

  • 提取 QuadTree 的空闲节点并生成 ConvexHull 区域
  • 结合 MPC、RL 等模块生成路径

四、总结

类型 OccupancyMap GeometricMap
输入 图像(RGB/Gray) 边界点 + 障碍点
表示 二值图像 几何多边形
输出 灰度图、二值图、障碍边界 生成图像占用图、绘图支持
与 QuadTree 关系 用作输入栅格图 生成清晰边界并转为栅格图

如需搭建属于自己的地图结构链条,建议先用 GeometricMap 构建规划地图,再通过 get_occupancy_map 输出用于空间划分与避障。该流程适用于静态地图构建、高精地图导入、自主路径学习等多种场景。

下篇博客我们将介绍如何基于这些地图结构搭建完整的 Quadtree + ConvexHull 区域生成逻辑。