不是的,这个理解有一半是对的,但另一半需要纠正。
栅格图和点云图确实用于全局路径规划 ,但它们也直接参与实时避障------只是参与的方式不同。
一、先说对的部分:全局路径规划确实靠地图
全局规划器(A*/Dijkstra)在地图坐标系下算一条从 A 到 B 的路线:
栅格地图:
░░░░░░░░░░░░░░░░░░░░░░░░
░░ ░░░░░░░░░░░░░░░░░░░░
░░ ░░░░░░░░░░░░░░░░░░░░
░░ ░░░░░░░░░░░░░░░░░░░░
░░░░░░░░░░░░░░░░░░░░░░░░
↑起点 ↑目标
全局规划器看这张图,算出"从起点到目标,避开黑色障碍格子"的一条路径。这一步确实只依赖地图,不依赖实时传感器。
二、但实时避障也用地图------是"动态更新"的版本
实时避障(局部规划器 DWB/TEB)需要同时知道:
- 哪里有静态障碍(墙、货架------来自地图)
- 哪里有动态障碍(行人、购物车------来自实时传感器)
它用的不是"纯地图",而是代价地图(Costmap)------代价地图 = 静态地图 + 实时传感器数据 + 膨胀层。
代价地图的三层结构
┌─────────────────────────────────────────────┐
│ 静态层 (Static Layer) │
│ ← 来自栅格地图,记录墙、货架等固定障碍 │
│ ← 全局路径规划用这个,局部避障也用这个 │
├─────────────────────────────────────────────┤
│ 障碍物层 (Obstacle Layer) │
│ ← 来自激光雷达/深度相机的实时数据 │
│ ← 记录行人、购物车等动态障碍 │
│ ← 几秒钟后如果障碍消失,这层会清除 │
├─────────────────────────────────────────────┤
│ 膨胀层 (Inflation Layer) │
│ ← 在障碍周围画一圈"危险区" │
│ ← 机器人靠近障碍时,代价随距离增加 │
│ ← 保证机器人不会贴着墙走 │
└─────────────────────────────────────────────┘
所以实时避障用的"代价地图" = 静态地图(来自栅格图)+ 实时传感器数据。
三、栅格图在实时避障中的具体作用
| 场景 | 栅格图的作用 |
|---|---|
| 机器人沿着全局路径走,前方突然出现一个行人 | 局部规划器用实时激光数据 绕开行人,但仍然参考栅格图确保绕行路线不撞到旁边的墙 |
| 行人走后,机器人需要回到全局路径上 | 局部规划器查栅格图,确认"回到这条路径上不会撞墙" |
| 机器人被挤到通道边缘 | 局部规划器用栅格图确认"这个方向有墙,不能再靠了" |
栅格图在实时避障中充当"安全底线"------不管你怎么躲行人,都不能穿墙。
四、点云图在实时避障中的具体作用
点云图(3D 点云)在实时避障中的作用取决于你有没有 3D 激光雷达:
| 传感器 | 在避障中的角色 |
|---|---|
| 2D 激光雷达 | 只扫一个平面(通常是机器人腰部高度),生成 2D 代价地图。看不到低矮障碍(如地上的箱子)和高处障碍(如悬挂的货架标签) |
| 3D 激光雷达 | 生成 3D 点云,投影到代价地图的多个高度层。能看到低矮障碍和高处障碍 |
| RealSense 深度相机 | 生成局部点云,补充激光雷达的盲区(近距离、低矮处) |
你的超市机器人用的是 RealSense D455(深度相机),它在避障中的作用是:
- 补充激光雷达的近距离盲区(激光雷达在 <0.1m 时可能失效)
- 检测低矮障碍(如掉在地上的商品、购物车轮子)
- 检测透明障碍(如玻璃门、透明包装------激光雷达可能穿透,但深度相机能检测到)
五、所以正确的理解是
| 地图/数据 | 全局路径规划 | 实时避障 | 角色 |
|---|---|---|---|
| 栅格地图 | ✅ 主要输入 | ✅ 静态安全底线 | 告诉机器人"墙和货架在哪,不能穿" |
| 点云地图 | ❌ 不用于全局规划 | ✅ 3D 障碍检测 | 补充激光雷达的盲区,检测低矮/高处/透明障碍 |
| 实时激光数据 | ❌ | ✅ 核心动态障碍输入 | 检测行人、购物车等临时障碍 |
| 实时深度相机数据 | ❌ | ✅ 近距离补充 | 检测激光盲区内的障碍 |
六、用一句话总结
栅格图和点云图不只是"建图时用的静态数据"------它们在机器人行走过程中持续参与实时避障。栅格图提供"不能穿墙"的安全底线,点云图(来自 3D 传感器)补充激光雷达的盲区。真正"不影响实时避障"的只有语义地图(货架 ID、商品位置这些高层信息),那是给任务规划用的,不是给避障用的。
你之前的理解把"地图"和"实时传感器"完全割裂了,实际上它们是融合在一起变成代价地图,同时服务于全局规划和局部避障的。
所以一张机器人的全局地图,实际是包含了栅格地图、点云地图、语义地图?
对,可以这样理解------但更准确的说法是:全局地图是一个"多层结构",栅格、点云、语义是其中的不同图层。
它们不是打包成一个文件,而是分开存储、分开加载,但在逻辑上共同构成机器人对环境的完整认知。
一、用"Photoshop 图层"来类比
想象你打开 Photoshop,看到的是这样:
┌─────────────────────────────────────────────┐
│ 图层 3:语义层(红色文字标签) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 货架A3 │ │ 货架B2 │ │ 收银台 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ 告诉你"这是什么" │
├─────────────────────────────────────────────┤
│ 图层 2:点云层(3D 几何细节) │
│ · · · · · · · · · · · · · · · · · · · │
│ · · · · · · · · · · · · · · · · · · · │
│ 告诉你"精确的长宽高和表面形状" │
├─────────────────────────────────────────────┤
│ 图层 1:栅格层(2D 占用网格) │
│ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
│ ░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
│ 告诉你"哪里能走、哪里不能走" │
└─────────────────────────────────────────────┘
你看到的最终效果是所有图层叠加在一起------机器人"脑海里的地图"就是这三层的融合。
二、它们在 ROS 里是怎么组织的?
不是打包成一个文件,而是多个独立的节点/话题:
| 地图类型 | ROS 中的存在形式 | 发布者 | 消费者 |
|---|---|---|---|
| 栅格地图 | /map 话题(OccupancyGrid 消息) |
map_server 或 SLAM | Nav2 全局规划器、代价地图 |
| 点云地图 | /map_cloud 话题(PointCloud2 消息)或 PCD 文件 |
SLAM(如 Cartographer) | 定位、3D 感知、AMCL |
| 语义地图 | 自定义服务/话题 或 数据库查询 | 你自己的货架注册节点 | 任务规划、缺货检测 |
它们都绑定在同一个 map 坐标系下 ,所以坐标是对齐的------货架 A3 在语义地图里的 (2.5, 1.2),在栅格地图和点云地图里也是同一个位置。
三、在超市补货机器人里,这三种地图怎么协同?
| 场景 | 栅格地图 | 点云地图 | 语义地图 |
|---|---|---|---|
| 机器人从充电站走到货架 A3 | ✅ 全局路径规划(避开墙和固定障碍) | ❌ 不需要 | ✅ 告诉规划器"目标位置是货架 A3 前方的停靠点" |
| 机器人停靠到货架前,扫描缺货 | ❌ 不需要 | ✅ 提供货架的精确 3D 几何(前排深度、层高) | ✅ 告诉系统"前排第 2 个槽位对应哪个 3D 区域" |
| 机械臂从货架取一瓶饮料 | ❌ 不需要 | ✅ 提供饮料瓶的精确 3D 位置和表面法向量 | ✅ 告诉系统"这是 COKE_330ML,应该抓哪个面" |
| 行人突然走到通道里 | ✅ 代价地图静态层(墙还在) | ❌ 点云地图是静态的,不包含行人 | ❌ 不包含行人 |
| 实时避障(绕开行人) | ✅ 静态安全底线 | ❌ 静态地图不更新 | ❌ 不参与 |
四、一个关键澄清:点云地图在导航中的角色
对于 2D 导航(你的底盘在地面行走),点云地图不是必须的。
- 2D 导航只需要栅格地图(2D 占用网格)+ 实时激光雷达数据
- 点云地图主要用于:
- 3D 定位(如 LOAM、LIO-SAM 这类激光 SLAM)
- 3D 感知(机械臂抓取时需要知道精确深度)
- 3D 避障(如果有悬空障碍,如货架突出的商品)
但在你的超市补货机器人里,点云地图是有用的------因为:
- 货架是 3D 结构(有多层、有深度)
- 机械臂需要 3D 信息来规划放置位姿
- 升降机构需要知道每层货架的精确高度
五、实际系统中的"全局地图"长什么样?
在你的超市机器人里,启动后加载的"全局地图"实际上是:
yaml
# 启动时加载的文件
map_server:
yaml_filename: "supermarket_map.yaml" # 栅格地图(PGM 图片 + YAML 元数据)
frame_id: "map"
# 同时加载的
pointcloud_map: "supermarket.pcd" # 点云地图文件
semantic_map: "shelf_registry.yaml" # 语义地图(货架 ID、槽位、SKU 绑定)
它们不是同一个文件,但在同一个 map 坐标系下对齐,逻辑上是一张完整的地图。
六、一句话总结
全局地图 = 栅格层(哪里能走)+ 点云层(精确 3D 几何)+ 语义层(这是什么、怎么用)。
它们分开存储、分开加载,但绑定在同一个
map坐标系下,共同构成机器人对超市环境的完整认知。底盘导航主要用栅格层,机械臂操作主要用点云层和语义层,任务规划主要用语义层。