2. 环境建模基础

做路径规划这么多年,我越来越觉得一个道理:地图选不对,算法全白费。你想想看,再好的A*算法、再牛的DWA,如果地图本身就没建好,那机器人要么撞墙,要么原地转圈。

今天咱们就来聊聊环境建模这件事。说白了,就是怎么把真实世界翻译成机器人能看懂的语言。我习惯把地图分成三类:栅格地图、代价地图、拓扑地图。每种都有它的脾气,选对了事半功倍。

一、栅格地图:最朴素的表达方式

栅格地图,也叫占据网格地图。它的思路特别简单——把空间切成一个个小格子,每个格子标记为"有障碍"或"无障碍"。

我在做扫地机器人项目时,用的就是这种地图。激光雷达扫一圈,把障碍物位置投影到网格上,黑色格子代表墙,白色格子代表可通行区域。嗯,就是这么直白。

核心参数:

  • 分辨率:每个格子代表的实际尺寸。比如0.05m/格,就是5厘米一格
  • 占据概率:不是简单的0或1,而是用概率表示"这个格子有障碍的可能性"
  • 更新策略:每次传感器读数都会更新格子的概率值

举个例子,假设我们有一个10m×10m的房间,用0.1m分辨率建图:

# 伪代码:栅格地图初始化
grid_width = 100   # 10m / 0.1m = 100格
grid_height = 100
occupancy_grid = [[0.5] * grid_width for _ in range(grid_height)]

# 激光扫描到障碍物时
def update_grid(x, y, hit=True):
    grid_x = int(x / 0.1)
    grid_y = int(y / 0.1)
    if hit:
        occupancy_grid[grid_y][grid_x] += 0.3  # 增加占据概率
    else:
        occupancy_grid[grid_y][grid_x] -= 0.2  # 减少占据概率
    # 限制在[0, 1]范围内
    occupancy_grid[grid_y][grid_x] = max(0, min(1, occupancy_grid[grid_y][grid_x]))

我的经验:分辨率不是越高越好。0.05m对于室内导航已经够用,再高反而增加计算量。我曾经试过0.01m分辨率,结果一个100平米的房间建了100万格,路径规划慢得让人抓狂。

二、代价地图:给每个格子打分

栅格地图只告诉你"能不能走",但代价地图告诉你"好不好走"。说白了,就是给每个格子赋予一个代价值。

为什么会需要这个?你想想看,机器人经过地毯和经过瓷砖地面,代价能一样吗?靠近墙边走和走中间,风险能一样吗?

代价地图通常由三层叠加而成:

图层 来源 作用
静态层 预先建好的栅格地图 表示固定障碍物
障碍物层 实时传感器数据 表示动态障碍物
膨胀层 算法生成 把障碍物"胖一圈",防止碰撞

膨胀层这个设计,我特别喜欢。它其实是在说:别贴着障碍物走,留点安全余量。膨胀半径一般设为机器人半径的1.2倍,这样规划出来的路径,机器人走起来才踏实。

避坑指南:我曾经在仓库AGV项目里,把膨胀半径设得太小,结果机器人贴着货架走,稍微有点定位误差就撞上了。后来改成机器人半径的1.5倍,再也没出过问题。记住:安全第一,效率第二。

三、拓扑地图:只关心"怎么走"

拓扑地图的思路完全不同。它不关心具体坐标,只关心节点之间的连接关系。就像地铁线路图,你不需要知道站台的具体经纬度,只需要知道哪站换乘。

拓扑地图的核心要素:

  • 节点:关键位置,比如房间门口、走廊拐角
  • 边:节点之间的可通行路径
  • 权重:边的长度或通行代价

我做过一个酒店送物机器人项目,就是用拓扑地图。每个房间门口是一个节点,走廊交叉口是一个节点,电梯口是一个节点。机器人只需要知道"从301房间到电梯,走走廊右转",根本不需要知道精确坐标。

# 拓扑地图示例
topo_map = {
    'nodes': ['room_301', 'corridor_A', 'elevator', 'lobby'],
    'edges': [
        ('room_301', 'corridor_A', 5.0),   # 距离5米
        ('corridor_A', 'elevator', 12.0),  # 距离12米
        ('elevator', 'lobby', 8.0)         # 距离8米
    ]
}

# 路径规划:从room_301到lobby
# 结果:room_301 -> corridor_A -> elevator -> lobby
# 总距离:5 + 12 + 8 = 25米

我的建议:拓扑地图特别适合结构化环境,比如办公楼、医院、酒店。但如果环境经常变化(比如仓库货架位置常变),拓扑地图维护起来就麻烦了。这时候还是栅格地图更靠谱。

四、三种地图怎么选?

说实话,没有绝对的好坏,只有合不合适。我一般这样选:

  • 室内导航、扫地机器人:栅格地图为主,代价地图辅助
  • 仓储物流、工厂AGV:拓扑地图为主,栅格地图做局部避障
  • 自动驾驶、室外巡检:三种地图混合使用

嗯,这里要注意:实际项目中往往是混合使用。比如我的一个医院物流机器人,全局规划用拓扑地图(知道要去哪个科室),局部规划用代价地图(避开走廊里的行人)。

五、本章知识体系

下面这张图,是我自己总结的环境建模知识框架,你看一眼就能明白三种地图的关系:

环境建模知识体系 环境建模 栅格地图 代价地图 拓扑地图 分辨率:0.05~0.1m 占据概率更新 适合:室内导航 静态层+障碍物层+膨胀层 代价值:0~255 适合:动态避障 节点+边+权重 不依赖精确坐标 适合:结构化环境 实际项目:三种地图混合使用,取长补短

好了,这一章的内容就到这里。环境建模是路径规划的基石,地基打不牢,后面盖什么楼都白搭。下一章咱们聊聊全局路径规划算法,到时候你会回来感谢今天认真学地图的自己。

本章要点回顾:

  • 栅格地图:把空间离散化,适合精确导航
  • 代价地图:给格子打分,考虑通行代价和安全性
  • 拓扑地图:只关心连接关系,适合大范围规划
  • 选型原则:看环境特点、看任务需求、看计算资源

可可精品资料库